2012-03-23 6 views
6

Привет коллеги энтузиастовСинтаксической информация культуры в .NET

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

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

+0

Я не думаю, что это хороший способ, чтобы идти в противоположном направлении. Например, ** eng ** может находиться в диапазоне от ** en-029 ** до ** en-ZW **. Как вы ожидаете, что это будет вести себя, если вы прочтете ** eng **? –

ответ

5

EDIT: извините, я использовал неправильное свойство:

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

Однако, есть еще дублирует в списке и без поддержки «ИУ».

+0

Закрыть, но нет сигары. :( Он не работает, если для одного и того же языка имеется более одного буквенного кода (например, оба «dut» и «nld» используются для голландского языка, структура не распознает «dut»). Очевидно, Microsoft предпочла включить только один буквенный код на язык, очень неудачный. –

+0

Я буду отмечать это как ответ, поскольку он ближе всего к текущей реализации кода ISO 639-2. –

+0

Я обнаружил, что есть только 21 язык, который имеют как библиографический код, так и код терминологии. Не слишком много усилий для преобразования между ними, и этот метод отлично работает после преобразования. –

0

В этом синтаксическом анализе ничего не создано.

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

2

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

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

+0

Это наверняка решит проблему, которую я затронул. –

0

Вот метод расширения для класса Silverlight System.Globalization.CultureInfo, который получает 639-2 три-буквенный код ISO для языка текущего 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