【问题标题】: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 的国家和地点](stackoverflow.com/questions/2920274/…)
  • 直到 vista 发布之前,格陵兰岛也不在其中! :)

标签: c# .net cultureinfo


【解决方案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 上可能有用的链接:

    顺便说一句,你可以用一个简单的 LINQ '命令'来缩短你的代码:

    var regionInfos = CultureInfo.GetCultures(CultureTypes.SpecificCultures)
      .Select(c => new RegionInfo(c.LCID))
      .Distinct()
      .ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多