Разбор трехбуквенных названий языков в качестве информации о культуре - PullRequest
6 голосов
/ 23 марта 2012

Я работаю с API, который возвращает некоторую информацию о аудиопотоках в файле, более конкретно, аудио язык в его трехбуквенном представлении имени ISO ( ISO 639-2 ).

Я хотел бы проанализировать эту информацию в новом CultureInfo объекте, но нет конструктора, который принимает трехбуквенный код. Я, конечно, мог бы написать огромное заявление о выборе (переключиться на вас, людей из C #), но я подумал, что было бы более выгодно сначала найти лучший способ. Так мне не повезло или есть секретный способ создания объекта CultureInfo с использованием трех буквенных имен?

Ответы [ 4 ]

5 голосов
/ 23 марта 2012

РЕДАКТИРОВАТЬ: извините, я использовал неправильное свойство:

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

Тем не менее, в списке все еще есть дубликаты и не поддерживается "dut".

2 голосов
/ 23 марта 2012

Я бы выбрал решение Balazs, но в вашем случае было бы лучше использовать CultureTypes.NeutralCultures, так как вы, похоже, не интересуетесь данными региона / страны.

Он всегда будет возвращать один CultureInfo без необходимости FirstOrDefault

0 голосов
/ 14 августа 2013

Вот метод расширения для класса Silverlight System.Globalization.CultureInfo, который получает трехбуквенный код ISO 639-2 для языка текущего объекта System.Globalization.CultureInfo.Используется таблица ISO-639-2 , полученная с помощью пользовательского метода Utils.GetResourceStream().

Реализация также опирается на пользовательский метод String.NthIndexOf() .

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

0 голосов
/ 23 марта 2012

Ничего встроенного не поможет при таком разборе.

Вместо выбора вы можете создать Dictionary(Of string, CultureInfo) для сопоставления одного с другим. Это скорее для удобства использования.

...