ASP.NET 中实现性别相关的本地化





5.00/5 (1投票)
实现依赖于注册用户性别的本地化(ASP.NET)。
引言
前段时间,我需要实现依赖于注册用户性别的本地化,这对于英语以外的语言(例如,我的母语希伯来语)来说显然更为重要。 在尝试编写我自己的自定义 ResourceManager/Provider 类之后,我决定遵循一个更简单的方法的建议 - 为每种需要的语言创建我自己的自定义区域性。
步骤 1 - 创建您自己的自定义区域性
对于每种需要的语言,创建一个自定义的“女性”区域性作为原始区域性的克隆。 例如,以下代码创建一个名为 'he-IL-f' 的自定义区域性,它是 'he-IL' 的克隆。 在您的机器上安装该区域性。 您可以通过运行 exe 后查看 “C:\Windows\Globalization” 文件夹来验证安装是否成功。
CultureAndRegionInfoBuilder cib =
new CultureAndRegionInfoBuilder("he-IL-f", CultureAndRegionModifiers.None);
// Populate the new CultureAndRegionInfoBuilder object with culture information.
CultureInfo ci = new CultureInfo("he-IL");
cib.LoadDataFromCultureInfo(ci);
// Populate the new CultureAndRegionInfoBuilder object with region information.
RegionInfo ri = new RegionInfo("IL");
cib.LoadDataFromRegionInfo(ri);
cib.Parent = ci;
//CultureAndRegionInfoBuilder.Unregister("he-IL-f");
cib.Register();
* 上面的代码需要管理员权限才能执行,因此如果在 Vista 中,请“以管理员身份”运行 exe。
新区域性的回退区域性将是原始区域性 - 这就是我们有这行的原因
cib.Parent = ci;
这使我们能够仅在“女性”RESX 文件中输入需要更改的字符串。
步骤 2 - 创建相应的名称的 RESX 文件
请注意,在“女性”RESX 文件中,您只需要插入那些与其“男性”版本不同的字符串。
步骤 3 - 设置线程的 UICulture 属性
protected override void InitializeCulture()
{
string culture = "";
if (Request.Form["DropDownListCulture"] != null)
{
string gender = Request.Form["DropDownListGender"];
bool isFemale = (gender == "Female");
culture = Request.Form["DropDownListCulture"];
dir = (culture == "he-IL") ? "rtl" : "ltr";
if (isFemale)
{
culture += "-f";
}
}
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
base.InitializeCulture();
}
在我的示例中,我使用页面的 InitializeCulture
事件来执行逻辑。 在更复杂的系统中,我们可能希望将此逻辑移动到更集中的位置(可能在应用程序级别的某个事件中)。 我从表单接收两个参数 - 语言和性别。 当然,在实际应用程序中,我们将拥有每个用户的信息,并在登录时自动使用它。
使用代码 / 关注点
- 在提供的源代码中,我们注册了三个自定义区域性:en-US-f、he-IL-f 和 fr-FR-f。
- 请注意,法国区域性是在没有以下代码行的情况下注册的:
cib.Parent = ci;
。
您可以通过在运行 exe 后检查 “C:\Windows\Globalization” 文件夹来验证这一点。
这意味着它不是回退到 fr-FR,而是回退到默认区域性(在我们的例子中是 en-US)。
这在使用全局资源 ‘Talya’(在页面底部)时得到了证明:它在英语中的默认值是 ‘talya’,并且它在 he-IL 和 fr-FR 区域性中被覆盖,但在它们的女性版本中没有。
当使用 he-IL-f 区域性查看时,它会回退到希伯来语资源 ‘טליה’。 但是,当使用 fr-FR-f 区域性查看时,它没有回退到 ‘talya (法语)’,而是回退到英语 ‘talya’。 这是因为我们没有将法国女性区域性的父区域性设置为法国区域性。