2016-01-13 37 views
2

我需要基於兩個字母的ISO-3166國家代碼如何繪製兩個字母的ISO-3166國家代碼文化在C#

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

本地化我的C#DateTime對象是有辦法去做吧?

我只能使用5個字符的國家代表施加特定文化(EN-US,NL-NL等..)

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

即使是滿射映射將是確定的(即多個國家的代碼映射到單個C#文化)

+0

我不清楚你的問題。你不能使用CultureInfo(「NL」)嗎?看起來像這個構造函數使用[國家語言支持(NLS)API參考](https://msdn.microsoft.com/en-us/goglobal/bb896001.aspx),我不是%100確定它具有哪種ISO標準。 –

+0

所以基本上CultureInfo接受原生的ISO-3166國家代碼?如果我運行var cultureinfo = new System.Globalization.CultureInfo(「US」);我得到一個「not supported」異常 –

+0

++(或者它可能有自己的標準?)順便說一句,'NL'和'nl-NL'具有相同的'TwoLetterISOLanguageName'和'ThreeLetterISOLanguageName'屬性。但是,對於像EE 3166-1 alpha-2代碼那樣的所有情況,情況並非如此。 –

回答

3

CultureInfo(string) constructor文檔;

對於預定義區域性名稱的列表,請參閱National Language Support (NLS) API Reference

而且從CultureInfo.TwoLetterISOLanguageName Property

ISO 639-1兩個字母代碼當前CultureInfo的語言。

沒有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,即雙字母代碼。
0

如果受到.net支持,您應該能夠使用不變的文化。

例如這工作:

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還有其他高票表決答案,我不打算在這裏受騙。

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威爾士(英國)

EN-GB英語(英國)

GD-GB蘇格蘭蓋爾語(英國)

所以GetCultureFromTwoLetterCountryCode("GB")將返回"cy-GB"文化,這可能是確定爲威爾士但不適用於蘇格蘭。

您可以忽略這些異常情況或創建自己的cultureinfo數據庫,並且只爲每個國家/地區存儲一種文化。這將是最好的解決方案。

相關問題