在多语言软件开发中,除了考虑语言差异外,有时还需要考虑性别差异,尤其是在非英语语言中更为常见,例如希伯来语。通过自定义资源管理器或提供者类,可以为每种需要的语言创建“女性”文化,这是一种简化的方法。以下是创建自定义文化的步骤:
对于每种需要的语言,创建一个自定义的“女性”文化,作为原始文化的克隆。例如,以下代码创建了一个名为'he-IL-f'的自定义文化,它是'he-IL'的克隆。在您的机器上安装该文化。可以通过查看“C:\Windows\Globalization”文件夹来验证安装是否成功。
CultureAndRegionInfoBuilder cib = new CultureAndRegionInfoBuilder("he-IL-f", CultureAndRegionModifiers.None);
CultureInfo ci = new CultureInfo("he-IL");
cib.LoadDataFromCultureInfo(ci);
RegionInfo ri = new RegionInfo("IL");
cib.LoadDataFromRegionInfo(ri);
cib.Parent = ci;
CultureAndRegionInfoBuilder.Unregister("he-IL-f");
cib.Register();
上述代码需要管理员权限才能执行,因此在Vista系统中,需要以管理员身份运行exe。新文化的回退文化将是原始文化,这就是为什么有这行代码:
cib.Parent = ci;
这使只需要在“女性”RESX文件中输入需要更改的字符串。
在“女性”RESX文件中,只需要插入与“男性”版本不同的字符串。
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。您可以通过在运行exe后检查“C:\Windows\Globalization”文件夹来验证这一点。
请注意,法语文化是在没有这行代码的情况下注册的:
cib.Parent = ci;
这意味着它不是回退到fr-FR,而是回退到默认文化(在例子中是en-US)。这在使用全局资源‘Talya’(页面底部)时得到了演示:它的默认英文是‘talya’,在he-IL和fr-FR文化中被覆盖,但在它们的女性版本中没有被覆盖。