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

时间:2016-01-13 11:16:18

标签: c# .net datetime timezone culture

我需要根据两个字母的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 :(得分:3)

来自CultureInfo(string) constructor文档;

  

有关预定义文化名称的列表,请参阅National Language Support (NLS) API Reference

同样来自CultureInfo.TwoLetterISOLanguageName Property

  

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

没有定义for subview in self.view.subviews { if (subview is CustomPin) { print(subview) subview.removeFromSuperview() } } ,但有US(如果你真的必须使用两个字母名称),你可以使用它。所有这些都在 标准中定义。

en

所有这两个字母的代码都有效,var cultureInfo = new CultureInfo("en"); 除外InvariantCulture,因此我们可以忽略它。我写了一个简单的代码来检查它。

iv

如何创建自己的地图?我建议按照这些步骤进行操作;

  • 在ISO-3166和ISO 639-1标准中查找不同的双字母代码。
  • 创建您自己的KeyValuePair<string, string>结构,其中包含ISO-3166双字母代码作为第一个,ISO 639-1双字母代码作为第二个。
  • 如果您的双字母ISO-3166双字母代码在此构造函数中失败,请检查其映射的双字母代码并尝试使用创建foreach (var culture in CultureInfo.GetCultures(CultureTypes.AllCultures)) { try { var c = new CultureInfo(culture.TwoLetterISOLanguageName); } catch (Exception) { Console.WriteLine(culture.TwoLetterISOLanguageName); // Only prints "iv" } } 双字母代码。

答案 1 :(得分:1)

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 Welsh(英国)

     

en-GB English(United Kingdom)

     

gd-GB Scottish Gaelic(英国)

所以GetCultureFromTwoLetterCountryCode("GB")会返回"cy-GB"文化,这对威尔士来说可能没问题,但苏格兰没有。

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

答案 2 :(得分:0)

如果.net。

支持,您应该可以使用不变文化

E.g。这有效:

var culture = new CultureInfo("EN");

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

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

CultureInfo.GetCultures(CultureTypes.AllCultures);

特别是中性的:

CultureInfo.GetCultures(CultureTypes.NeutralCultures);

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

转换Country Codes to Cultures还有其他很高的投票答案,我不会在这里进行欺骗。

答案 3 :(得分:0)

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

RegionInfo r = new RegionInfo(“US”);

MessageBox.Show(r.DisplayName);

这将返回“美国”