我正在使用一个API来返回文件中有关音频流的一些信息,更具体地说是三字母ISO名称(ISO 639-2)表示中的音频语言。
我想将这些信息解析为一个新的CultureInfo对象,但没有构造函数采用三个字母的代码。我当然可以写一个巨大的选择声明(切换给你C#人),但我认为首先要求更好的方法更具成本效益。 我是不是运气好,还是有秘密的方法来创建一个使用三个字母名称的CultureInfo对象?
答案 0 :(得分:5)
public static CultureInfo FromISOName(string name)
{
return CultureInfo
.GetCultures(CultureTypes.NeutralCultures)
.FirstOrDefault(c => c.ThreeLetterISOLanguageName == name);
}
但是,列表中仍然存在重复项,并且不支持“dut”。
答案 1 :(得分:2)
我会选择Balazs解决方案,但在您的情况下使用CultureTypes.NeutralCultures会更好,因为您似乎并不关心区域/国家/地区数据。
它总是返回一个CultureInfo而不需要FirstOrDefault
答案 2 :(得分:0)
没有任何内置功能可以帮助解决此问题。
您可以创建Dictionary(Of string, CultureInfo)
来映射,而不是选择。这更像是一个易用的建议。
答案 3 :(得分:0)
这是Silverlight System.Globalization.CultureInfo
类的扩展方法,它获取当前System.Globalization.CultureInfo
对象语言的ISO 639-2三字母代码。它使用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;
}