为啥不是所有国家都出现在 CultureInfo.GetCultures() 中?
Posted
技术标签:
【中文标题】为啥不是所有国家都出现在 CultureInfo.GetCultures() 中?【英文标题】:Why not all countries are presented in CultureInfo.GetCultures()?为什么不是所有国家都出现在 CultureInfo.GetCultures() 中? 【发布时间】:2011-03-09 13:00:33 【问题描述】:我正在使用此标准代码来填充国家/地区列表:
static void Main(string[] args)
List cultureList = new List();
CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures & ~CultureTypes.NeutralCultures);
foreach (CultureInfo culture in cultures)
try
RegionInfo region = new RegionInfo(culture.LCID);
if (!(cultureList.Contains(region.EnglishName)))
cultureList.Add(region.EnglishName);
Console.WriteLine(region.EnglishName);
catch (ArgumentException ex)
// just ignore this
continue;
我看到有些国家错过了。只是想知道这种情况的原因是什么?
【问题讨论】:
sashaeve,一个具体的例子会很好。 IIRC 它也取决于 Windows 版本/版本。 @Henk Holterman:我没有找到加纳、科特迪瓦、喀麦隆和其他一些国家。 [在尝试时缺少来自 CultureInfo 的国家和地点](***.com/questions/2920274/…) 直到 vista 发布之前,格陵兰岛也不在其中! :) 【参考方案1】:你没有得到所有的文化:
CultureTypes.AllCultures & ~CultureTypes.NeutralCultures
【讨论】:
Oded,在问题的上下文中你错了。中立文化不代表一个国家,而只是一种语言,而且它们的使用非常有限(主要用于本地化资源或从中获取特定文化)。 @Lucero - 他正在对NeutralCultures
进行按位补码。
这是正确的,因为他确实不想要结果中的中性文化:Console.WriteLine(CultureTypes.AllCultures & ~CultureTypes.NeutralCultures);
返回SpecificCultures, InstalledWin32Cultures
,其中应包括所有特定文化(例如,具有国家/地区的文化)。 【参考方案2】:
我会使用 CultureTypes.SpecificCultures,但它不能回答您的问题。
为什么世界上只有一部分国家?好吧,他们有很多。必须有人维护它们,而且确实要花钱。我认为这就是为什么微软决定只支持最“流行”的。
顺便说一句。您可以创建自己的 CultureInfo。另外,我还没有尝试过,但是您可以通过在构造函数中传递其 ISO 代码来创建 RegionInfo 实例。不过,我不确定如果没有匹配的 CultureInfo 会发生什么。
【讨论】:
【参考方案3】:答案是:设计
CultureInfo.GetCultures
并非旨在成为世界上所有文化的完整和权威列表。它仅旨在让您了解可以在计算机上找到的文化。
CultureInfo documentation 说:
请记住,文化名称和标识符仅代表一个 可以在特定计算机上找到的文化子集。视窗 版本或服务包可以更改可用的文化。 应用程序使用 CultureAndRegionInfoBuilder 添加自定义文化 班级。用户使用 Microsoft 区域设置添加自己的自定义文化 生成器工具。 Microsoft Locale Builder 是用托管代码编写的 使用 CultureAndRegionInfoBuilder 类。
注意事项
MSDN 上可能有用的链接:
预定义 RegionInfo 列表:http://msdn.microsoft.com/en-us/library/system.globalization.regioninfo(VS.80).aspx 如何创建自定义文化:http://msdn.microsoft.com/en-us/library/ms172469(VS.80).aspx顺便说一句,你可以用一个简单的 LINQ '命令'来缩短你的代码:
var regionInfos = CultureInfo.GetCultures(CultureTypes.SpecificCultures)
.Select(c => new RegionInfo(c.LCID))
.Distinct()
.ToList();
【讨论】:
以上是关于为啥不是所有国家都出现在 CultureInfo.GetCultures() 中?的主要内容,如果未能解决你的问题,请参考以下文章