如何将两个字母的ISO-3166国家代码映射到C#中的Culture

本文关键字:代码 国家 ISO-3166 映射 Culture 中的 两个 | 更新日期: 2023-09-27 18:30:11

我需要基于两个字母的ISO-3166国家代码来本地化我的C#DateTime对象

https://en.wikipedia.org/wiki/ISO_3166-2

有办法做到吗?

我只能使用5个字符的国家/地区表示(en-US、nl-nl等)应用给定的文化。

System.Globalization.CultureInfo cultureinfo =
        new System.Globalization.CultureInfo("nl-NL");
DateTime dt = DateTime.Parse(date, cultureinfo);

即使是满射映射也可以(即多个国家/地区代码映射到单个C#文化)

如何将两个字母的ISO-3166国家代码映射到C#中的Culture

来自CultureInfo(string)构造函数文档;

有关预定义区域性名称的列表,请参见国家语言支持(NLS)API参考

同样来自CultureInfo.TwoLetterISOLanguageName属性

当前CultureInfo语言的ISO 639-1双字母代码。

没有定义US,但有en(如果真的必须使用两个字母的名称)可以使用。所有这些都在标准中定义。

var cultureInfo = new CultureInfo("en");

所有这两个字母的代码都是有效的,除了iv是针对InvariantCulture的,所以我们可以忽略它。我写了一个简单的代码来检查它。

foreach (var culture in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
     try
     {
          var c = new CultureInfo(culture.TwoLetterISOLanguageName);
     }
     catch (Exception)
     {
          Console.WriteLine(culture.TwoLetterISOLanguageName); // Only prints "iv"
     }
}

如何创建自己的映射?我建议遵循以下步骤;

  • 在ISO-3166和ISO 639-1标准中查找不同的两个字母代码
  • 创建您自己的KeyValuePair<string, string>结构,该结构包含作为第一个代码的ISO-3166双字母代码和作为第二个代码的ISO 639-1双字母代码
  • 如果您的两个字母ISO-3166两个字母的代码在此构造函数中失败,请检查它的映射两个字母代码,并尝试使用双字母代码创建CultureInfo

如果.net.支持,您应该能够使用不变区域性

例如,这种方法有效:

var culture = new CultureInfo("EN");

正如您所指出的,似乎并没有完全支持所有国家/地区代码,这是因为它使用的两个字符是中立文化

您可以通过以下途径获得所有支持的文化的列表:

CultureInfo.GetCultures(CultureTypes.AllCultures);

特别是带有的中性

CultureInfo.GetCultures(CultureTypes.NeutralCultures);

var culture = new CultureInfo("US");不起作用的原因是美国的中性文化是EN。(具体培养基为en-US)。

关于将国家代码转换为文化,还有其他高投票率的答案,我不会在这里上当。

CultureInfo.Name的最后一部分是国家的ISO-3166代码,所以这就是我最终的解决方案

public static CultureInfo GetCultureFromTwoLetterCountryCode(string twoLetterISOCountryCode)
{
    try
    {
        return CultureInfo.GetCultures(CultureTypes.AllCultures 
                                           & ~CultureTypes.NeutralCultures)
                  .Where(m => m.Name.EndsWith("-"+twoLetterISOCountryCode))
                  .FirstOrDefault();
     }
     catch
     {
         return null;
     }
}

唯一的问题是,有些国家有不止一种文化,比如英国,所以你不能只使用ISO-3166代码、来选择正确的文化

cy GB威尔士(英国)

en-GB英语(英国)

gd GB苏格兰盖尔语(英国)

因此,GetCultureFromTwoLetterCountryCode("GB")将回归"cy-GB"文化,这可能对威尔士有利,但对苏格兰不利。

您可以忽略这些类型的例外,或者创建自己的文化信息数据库,并为每个国家只存储一个文化。这将是最好的解决方案。

我认为你混淆了地区和文化?

RegionInfo r = new RegionInfo("US");
MessageBox.Show(r.DisplayName);

这将返回";美国";