首页 文章

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

提问于
浏览
2

我需要根据两个字母的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#文化)

4 回答

  • 0

    来自CultureInfo(string) constructor文件;

    有关预定义文化名称的列表,请参阅本地语言支持(NLS)API参考

    也来自CultureInfo.TwoLetterISOLanguageName Property

    当前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 .

  • 3

    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;
         }
    }
    

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

    cy-GB威尔士语(英国)en-GB英语(英国)gd-GB苏格兰盖尔语(英国)

    因此 GetCultureFromTwoLetterCountryCode("GB") 将返回 "cy-GB" 文化,这可能对威尔士而言不是苏格兰 .

    您可以忽略这些异常或创建自己的cultureinfo数据库,并为每个国家/地区仅存储一种文化 . 那将是最好的解决方案 .

  • 1

    如果.net支持,您应该能够使用不变文化 .

    例如 . 这有效:

    var culture = new CultureInfo("EN");
    

    当你've noted, there doesn'似乎完全支持所有国家代码时,这是因为它所采用的两个字符是 Neutral Culture .

    您可以通过以下方式获取所有支持的文化列表:

    CultureInfo.GetCultures(CultureTypes.AllCultures);
    

    特别是中性的:

    CultureInfo.GetCultures(CultureTypes.NeutralCultures);
    

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

    在转换Country Codes to Cultures时还有其他高投票答案,我不打算在这里欺骗 .

  • 0

    我认为你们的地区与文化混淆了吗?

    RegionInfo r = new RegionInfo(“US”);

    MessageBox.Show(r.DisplayName);

    这将返回“美国”

相关问题