2012-08-08 181 views
2

我将处理一个提供符合ISO 3166-1 alpha-2标准的两个字母国家代码的提要。例如,英国的代码为GB。我的问题是,在提供“GB”作为.NET类或函数的输入时,是否有某种方法可以轻松找回“英国”?换句话说,这是由.NET提供的翻译吗?ISO 3166-1 alpha-2到国家/地区名称翻译.NET

回答

1

的种类。 .NET使用“文化”,它可以通过语言(使用ISO 639双字母标识符)和区域(使用ISO 3166)的组合来唯一标识。所以,如果你知道这两种语言和区域,你可以得到一个描述性的名称:

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]; 

了解到,在这些文化,区域是次要的语言;这个系统支持的每一种语言都有一种文化,但不一定每个使用该语言的国家都有这种文化。这意味着两件事;首先,你必须知道(因为瑞士和比利时有两种官方语言,德语和法语,印度和荷兰各有4种),其次,ISO代码可能不存在于文化列表中对于你所期望的语言来说,如果语言和地区的组合使用符号和符号足够接近另一个更加知名的文化,那就没有必要区分(例如,没有用于英语的“en-CA”文化说加拿大是因为它与“en-US”相同;然而有一个“fr-CA”,因为加拿大的法语文化与其他大多数法语地区差别很大)。

另一种解决方案将不会内置这样,但不会是非常困难的;发现或让自己的ISO代码,并在任何制表符分隔或逗号分隔格式的全国名的名单,并发出声音文件到Dictionary<string, string>在固定时间来翻译:

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

的一个JSON版本您的示例中的csv文件位于http://country.io/names.json – 2014-09-05 02:03:14

相关问题