2012-03-23 17 views
6
entusiastas compañeros

Holade análisis en .NET

Estoy trabajando con una API que devuelve algo de información sobre los flujos de audio en un archivo, más específicamente el idioma de audio en su nombre de tres letras ISO (ISO 639-2) Representación .

Me gustaría analizar esta información en un nuevo objeto CultureInfo, pero no hay un constructor que tome un código de tres letras. Por supuesto, podría escribir una enorme declaración selecta (cambio para usted C# personas), pero pensé que sería más rentable preguntar primero por una mejor manera. Entonces, ¿no tengo suerte o hay una forma secreta de crear un objeto CultureInfo con tres letras?

+0

No creo que hay una buena manera de ir en la dirección opuesta. Por ejemplo, ** eng ** puede tener un rango de ** en-029 ** a ** en-ZW **. ¿Cómo espera que esto se comporte si lee ** eng **? –

Respuesta

5

Edit: Lo siento, he utilizado la propiedad equivocada:

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

Sin embargo, todavía hay duplicados en la lista y no hay soporte para "dut".

+0

Cerrar, pero no cigarro. :( Falla cuando hay más de un código de letra para el mismo idioma (ejemplo: tanto "dut" como "nld" se usan para holandés, el framework no reconoce "dut"). Aparentemente Microsoft eligió incluir solo un código de letra por idioma, muy desafortunado. –

+0

Voy a marcar esto como la respuesta, ya que es lo más cercano que obtendrá con la implementación del marco actual de los códigos ISO 639-2. –

+0

Descubrí que solo hay 21 idiomas que tener un código bibliográfico y un código terminológico. No es demasiado esfuerzo convertir entre los dos y este método funciona bien después de la conversión. –

0

No hay nada incorporado que ayude con dicho análisis sintáctico.

En lugar de un seleccionar, puede crear un Dictionary(Of string, CultureInfo) para asignar de uno a otro. Esto es más como una sugerencia de facilidad de uso.

2

Iría por la solución de Balazs, pero sería mejor en su caso usar CultureTypes.NeutralCultures ya que no parece estar preocupado por los datos de la región/país.

Siempre volvería una sola CultureInfo sin necesidad de FirstOrDefault

+0

Eso sin duda resolvería el problema que mencioné. –

0

Aquí es un método de extensión para la clase Silverlight System.Globalization.CultureInfo, que obtiene el 639-2 código de tres letras ISO del idioma de la corriente System.Globalization.CultureInfo objeto . Utiliza ISO-639-2 table, que se recupera a través del método personalizado Utils.GetResourceStream().

La implementación también se basa en un dispositivo personalizado 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