你好同好解析文化信息
我與返回有關音頻流文件中的一些信息的API,更特別是在它的三個字母的ISO名稱的音頻語言工作(ISO 639-2)表示。
我想解析這個信息到一個新的CultureInfo對象中,但是沒有構造函數需要三個字母的代碼。我當然可以寫一個巨大的選擇語句(切換爲你的C#人員),但我認爲首先問一個更好的方法會更具成本效益。 所以,我運氣不好,還是有一種祕密的方式來創建一個CultureInfo對象使用三個字母的名字?
你好同好解析文化信息
我與返回有關音頻流文件中的一些信息的API,更特別是在它的三個字母的ISO名稱的音頻語言工作(ISO 639-2)表示。
我想解析這個信息到一個新的CultureInfo對象中,但是沒有構造函數需要三個字母的代碼。我當然可以寫一個巨大的選擇語句(切換爲你的C#人員),但我認爲首先問一個更好的方法會更具成本效益。 所以,我運氣不好,還是有一種祕密的方式來創建一個CultureInfo對象使用三個字母的名字?
編輯:對不起,我已經使用了錯誤的性質:
public static CultureInfo FromISOName(string name)
{
return CultureInfo
.GetCultures(CultureTypes.NeutralCultures)
.FirstOrDefault(c => c.ThreeLetterISOLanguageName == name);
}
然而,仍有複製列表和「待測試」的支持。
關閉,但沒有雪茄。 :( 當同一種語言有多個字母代碼時,它會失敗(例如:荷蘭語使用「dut」和「nld」,框架無法識別「dut」) 顯然,Microsoft選擇包含每個語言只有一個字母代碼,非常不幸 – 2012-03-23 15:23:53
我將這個標記爲答案,因爲它與目前的ISO 639-2代碼的框架實現是最接近的 – 2012-03-23 16:28:29
我發現只有21種語言既有書目編碼又有術語代碼,在兩者之間進行轉換並不費力,這種方法在轉換後可以正常工作。 – 2012-03-23 16:45:08
沒有內置任何東西可以幫助解析。
而不是選擇,您可以創建一個Dictionary(Of string, CultureInfo)
來映射從一個到另一個。這更像是一個易用的建議。
我會去巴拉茲解決方案,但它會更好地使用CultureTypes.NeutralCultures,因爲你似乎不關心區域/國家的數據。
它總是會返回一個單一的CultureInfo無需FirstOrDefault
這肯定會解決我提出的問題。 – 2012-03-23 15:24:12
這裏是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;
}
我不認爲這是在相反的方向走的好方法。例如,** eng **的範圍可以從** en-029 **到** en-ZW **。如果你閱讀** eng **,你會如何期待這種行爲? – 2012-03-23 15:00:09