类CultureInfo
提供了两种创建方式:
- 通过工厂方法CreateSpecificCulture(字符串)
- 通过带有字符串参数的构造函数
MSDN文档对这两种方法略有不同,提到了构造函数的一些"Windows区域性"。但这真的重要吗?
我应该选择其中一个而不是另一个吗
注意:如果这很重要的话,我使用的是.NET 3.5版本,我想这样使用它:
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
如该回答中所述。
工厂方法在创建区域性信息失败时有一个回退。
因此,如果您使用特定的区域性,如"en-XX",则无法创建区域性信息实例,将引发异常,并使用中性区域性"en"重试将成功。
以下是工厂方法的来源
public static CultureInfo CreateSpecificCulture(string name)
{
CultureInfo info;
try
{
info = new CultureInfo(name);
}
catch (ArgumentException)
{
info = null;
for (int i = 0; i < name.Length; i++)
{
if ('-' == name[i])
{
try
{
info = new CultureInfo(name.Substring(0, i));
break;
}
catch (ArgumentException)
{
throw;
}
}
}
if (info == null)
{
throw;
}
}
if (!info.IsNeutralCulture)
{
return info;
}
return new CultureInfo(info.m_cultureData.SSPECIFICCULTURE);
}
所以我更喜欢工厂的方法。
这个线程已经得到了回答,但我发现了CreateSpecificCulture API的一个独特发现,有时可能并不那么明显。所以我认为这条线索是我发现的一个合适的地方。我在这方面花了几天时间,所以我只想分享我的经验,如果这能为其他人节省几个小时或几天的时间的话。
在使用API时,如果只传递区域性名称,如pt
(对于葡萄牙语)或de
(对于德语),则此API将返回与区域设置相对应的特定区域性,该区域设置被称为该区域性的默认区域设置。现在,这个地方可能不像我被卡住的地方听起来那么明显。对于德语来说,de-DE
看起来很明显,它是德国所说的德语。对于意大利语来说,it-IT
看起来很明显,它是在意大利使用的意大利语。
同样,pt-PT
对于在葡萄牙使用的葡萄牙语来说是显而易见的。不幸的是,情况并非如此。基于不确定确切原因(可能是人口、原籍国、民族语言等),当您尝试从区域性id创建特定区域性时,有一个全球标准化,根据该标准化来决定给定区域性的默认区域设置(在本例中为pt
)。微软在以下链接中记录了整个列表:
http://msdn.microsoft.com/en-us/goglobal/bb896001.aspx
如果您想知道给定区域性或语言的默认国家/地区设置,请与上面链接中的最后一列(语言名称缩写)代码匹配。
对于葡萄牙语,不变文化的语言名称缩写"葡萄牙语"与"葡萄牙语(巴西)"匹配,后者是PTB。葡萄牙语(葡萄牙)有一个不同的代码PTG
。因此,在本例中,葡萄牙语(巴西)是葡萄牙语的默认语言环境
如果您的应用程序逻辑或需求以任何方式依赖于这个API的这种行为,那么您必须谨慎。这种行为在基于web的应用程序中变得更加重要,因为市场上的所有浏览器在查看多语言网站的本地化版本时都会遵循这些准则,并在http请求标头中发送适当的信息。
尽管如此,我仍在寻找将特定国家设置为任何文化的默认地区的原因,而在葡萄牙语的情况下,这听起来并不那么明显。欢迎提供任何信息或评论。
工厂方法和构造函数之间还有另一个值得注意的区别:构造函数提供了一个额外的可选布尔值,其默认值设置为true。
如果您真的需要一个>"plain"<cultureinfo,因为:如果您请求的特定区域性(例如de-DE
)没有"布尔设置为false",则您将始终获得一个区域性设置,该设置可能具有意外设置,具体取决于用户如何通过控制面板更改此区域性。
工厂方法不支持此布尔值!!!
关于何时希望此布尔值为:
- true:您正在为UI生成输出-此输出应根据用户通过控制面板选择的特定区域性设置
- false:您想要解析数据(例如来自XML),并且您知道特定的XML区域性设置(例如逗号形式的十进制分隔符)。在这种情况下,您将需要一个
plain de-DE
-区域性,以确保特殊的控制面板设置不会干扰