解析三个字母的语言名称作为文化信息

时间:2012-03-23 14:36:18

标签: .net vb.net parsing cultureinfo

我正在使用一个API来返回文件中有关音频流的一些信息,更具体地说是三字母ISO名称(ISO 639-2)表示中的音频语言。

我想将这些信息解析为一个新的CultureInfo对象,但没有构造函数采用三个字母的代码。我当然可以写一个巨大的选择声明(切换给你C#人),但我认为首先要求更好的方法更具成本效益。 我是不是运气好,还是有秘密的方法来创建一个使用三个字母名称的CultureInfo对象?

4 个答案:

答案 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;
}

Full Gist