2012-08-08 1 views
2

Je vais traiter avec un flux qui me donne des codes de pays à deux lettres conformes à la norme ISO 3166-1 alpha-2. Ainsi, par exemple, le Royaume-Uni a le code GB. Ma question est, est-il un moyen de revenir facilement "Royaume-Uni" en fournissant "GB" comme entrée dans une classe ou une fonction .NET? En d'autres termes, cette traduction est-elle fournie par .NET quelque part?ISO 3166-1 alpha-2 à la traduction du nom de pays .NET

Répondre

1

Type de. .NET utilise des "cultures", qui peuvent être identifiées de manière unique par une combinaison de langage (utilisant des identifiants à deux lettres ISO 639) et de région (utilisant ISO 3166). Donc, si vous connaissez la langue et la région, vous pouvez obtenir un nom descriptif:

var cultureInfo = new CultureInfo("en-gb"); 

var cultureName = cultureInfo.EnglishName; //"English (Great Britain)" 

//your answer is now the text between the parentheses 
var countryName = cultureName.Split('(',')')[1]; 

Comprendre que, dans ces cultures, la région est secondaire à la langue; il y a une culture pour toutes les langues supportées par ce système, mais pas nécessairement pour tous les pays utilisant cette langue. Cela signifie deux choses; d'abord, vous devez connaître la langue (par exemple, la Suisse et la Belgique ont deux langues officielles, l'allemand et le français, et l'Inde et les Pays-Bas en ont 4), et un code ISO peut ne pas exister dans la liste de culture pour la langue que vous attendez, si la combinaison de langue et de région utilise des symboles et des notations assez proches d'une autre culture plus connue qu'il n'est pas nécessaire de différencier (il n'y a par exemple pas de culture "en-CA" pour l'anglais - parlant le Canada parce qu'il serait identique à «en-US», il y a cependant un «fr-CA» parce que la culture francophone du Canada est très différente de la plupart des autres régions francophones).

L'autre solution ne serait pas intégrée en tant que telle, mais ne serait pas très difficile; trouver ou vous faire une liste des codes ISO et le nom complet du pays dans les deux tabulations format délimité ou délimité par des virgules, et slurp le fichier dans un Dictionary<string, string> pour traduire en temps constant:

var isoDict = new Dictionary<string, string>(); 

using(var stream = File.Open("isoCodes.csv")) 
{ 
    using(var reader = new TextReader(stream)) 
    { 
     string currentLine; 
     do 
     { 
     currentLine = reader.ReadLine(); 
     if(currentLine == null) break; 

     //assumes no headers, no format/data errors and 
     //a line format of "cc, Country Name\n"; 
     //ALWAYS "trust but verify" that the data is sane 
     var parts = currentLine.Split(','); 
     isoDict.Add(parts[0].Trim(), parts[1].Trim()); 
     } while(currentLine != null); 
    } 
} 
+0

Une version JSON du fichier csv dans votre exemple est disponible à http://country.io/names.json –