2012-03-23 6 views
6

Ciao compagni appassionatiParsing informazioni cultura in .NET

Sto lavorando con un API che restituisce un po 'di informazioni sui flussi audio in un file, più precisamente la lingua audio nella sua tre lettere nome ISO (ISO 639-2) Rappresentazione .

Vorrei analizzare queste informazioni in un nuovo oggetto CultureInfo, ma non esiste un costruttore che accetta un codice di tre lettere. Ovviamente potrei scrivere un'enorme dichiarazione di selezione (cambiare per voi persone C#), ma ho pensato che sarebbe stato più economico chiedere prima un modo migliore. Quindi sono sfortunato o esiste un modo segreto per creare un oggetto CultureInfo utilizzando tre nomi di lettere?

+0

Io non credo che ci sia un buon modo per andare nella direzione opposta. Ad esempio, ** eng ** può variare da ** en-029 ** a ** en-ZW **. Come ti aspetteresti che questo si comporti leggendo ** eng **? –

risposta

5

EDIT: mi dispiace, ho usato la proprietà sbagliata:

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

Tuttavia, ci sono duplicati ancora nella lista e nessun supporto per "dut".

+0

Chiudi, ma senza sigaro. :( Fallisce quando c'è più di un codice lettera per la stessa lingua (esempio: sia "dut" che "nld" sono usati per l'olandese, il framework non riconosce "dut".) Apparentemente Microsoft ha scelto di includere solo un codice lettera per lingua, molto sfortunato –

+0

contrassegnerò questo come la risposta in quanto è il più vicino che otterrà con l'attuale implementazione di framework dei codici ISO 639-2 –

+0

Ho scoperto che ci sono solo 21 lingue che avere sia un codice bibliografico che un codice terminologico: non è troppo difficile convertire tra i due e questo metodo funziona bene dopo la conversione –

0

Non c'è niente di costruito che possa aiutare con tale analisi.

Invece di una selezione, è possibile creare un Dictionary(Of string, CultureInfo) da mappare da uno all'altro. Questo è più come un suggerimento sulla facilità d'uso.

2

Vorrei andare per la soluzione di Balazs, ma sarebbe meglio nel tuo caso utilizzare CultureTypes.NeutralCultures in quanto non ti sembra interessare i dati di regione/paese.

Sarebbe sempre restituire un singolo CultureInfo senza bisogno di FirstOrDefault

+0

Questo risolverà sicuramente il problema che ho sollevato. –

0

Ecco un metodo di estensione per la classe Silverlight System.Globalization.CultureInfo, che ottiene il 639-2 codice di tre lettere ISO per la lingua della corrente System.Globalization.CultureInfo oggetto . Utilizza ISO-639-2 table, che viene recuperato tramite il metodo personalizzato Utils.GetResourceStream().

L'implementazione si basa anche su un numero personalizzato 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