2012-03-23 141 views
6

你好同好解析文化信息

我與返回有關音頻流文件中的一些信息的API,更特別是在它的三個字母的ISO名稱的音頻語言工作(ISO 639-2)表示。

我想解析這個信息到一個新的CultureInfo對象中,但是沒有構造函數需要三個字母的代碼。我當然可以寫一個巨大的選擇語句(切換爲你的C#人員),但我認爲首先問一個更好的方法會更具成本效益。 所以,我運氣不好,還是有一種祕密的方式來創建一個CultureInfo對象使用三個字母的名字?

+0

我不認爲這是在相反的方向走的好方法。例如,** eng **的範圍可以從** en-029 **到** en-ZW **。如果你閱讀** eng **,你會如何期待這種行爲? – 2012-03-23 15:00:09

回答

5

編輯:對不起,我已經使用了錯誤的性質:

public static CultureInfo FromISOName(string name) 
{ 
    return CultureInfo 
     .GetCultures(CultureTypes.NeutralCultures) 
     .FirstOrDefault(c => c.ThreeLetterISOLanguageName == name); 
} 

然而,仍有複製列表和「待測試」的支持。

+0

關閉,但沒有雪茄。 :( 當同一種語言有多個字母代碼時,它會失敗(例如:荷蘭語使用「dut」和「nld」,框架無法識別「dut」) 顯然,Microsoft選擇包含每個語言只有一個字母代碼,非常不幸 – 2012-03-23 15:23:53

+0

我將這個標記爲答案,因爲它與目前的ISO 639-2代碼的框架實現是最接近的 – 2012-03-23 16:28:29

+0

我發現只有21種語言既有書目編碼又有術語代碼,在兩者之間進行轉換並不費力,這種方法在轉換後可以正常工作。 – 2012-03-23 16:45:08

0

沒有內置任何東西可以幫助解析。

而不是選擇,您可以創建一個Dictionary(Of string, CultureInfo)來映射從一個到另一個。這更像是一個易用的建議。

2

我會去巴拉茲解決方案,但它會更好地使用CultureTypes.NeutralCultures,因爲你似乎不關心區域/國家的數據。

它總是會返回一個單一的CultureInfo無需FirstOrDefault

+0

這肯定會解決我提出的問題。 – 2012-03-23 15:24:12

0

這裏是Silverlight的System.Globalization.CultureInfo類的擴展方法,是可以獲得ISO 639-2的三字母代碼當前System.Globalization.CultureInfo對象的語言。它使用ISO-639-2 table,即通過Utils.GetResourceStream()自定義方法檢索。

該實現還依賴於自定義String.NthIndexOf() method

public static string ThreeLetterISOLanguageName(this CultureInfo cultureInfo) 
{ 
    const string separator = "|"; 

    using (var reader = new StreamReader(Utils.GetResourceStream("ISO-639-2_utf-8.txt"))) 
    { 
     while (!reader.EndOfStream) 
     { 
      string line = reader.ReadLine(); 
      //two-letter ISO code is in the third column, i.e. after the second separator character 
      string twoLetterISOCode = line.Substring(line.NthIndexOf(separator, 1) + separator.Length, 2); 
      if (!twoLetterISOCode.Equals(cultureInfo.TwoLetterISOLanguageName)) continue; 
      return line.Substring(0, 3); 
     } 
    } 

    return null; 
} 

Full Gist