如何将两个字母的ISO-3166国家代码映射到C#中的Culture
本文关键字:代码 国家 ISO-3166 映射 Culture 中的 两个 | 更新日期: 2023-09-27 18:30:11
我需要基于两个字母的ISO-3166国家代码来本地化我的C#DateTime对象
https://en.wikipedia.org/wiki/ISO_3166-2
有办法做到吗?
我只能使用5个字符的国家/地区表示(en-US、nl-nl等)应用给定的文化。
System.Globalization.CultureInfo cultureinfo =
new System.Globalization.CultureInfo("nl-NL");
DateTime dt = DateTime.Parse(date, cultureinfo);
即使是满射映射也可以(即多个国家/地区代码映射到单个C#文化)
来自CultureInfo(string)
构造函数文档;
有关预定义区域性名称的列表,请参见国家语言支持(NLS)API参考
同样来自CultureInfo.TwoLetterISOLanguageName
属性
当前CultureInfo语言的ISO 639-1双字母代码。
没有定义US
,但有en
(如果真的必须使用两个字母的名称)可以使用。所有这些都在标准中定义。
var cultureInfo = new CultureInfo("en");
所有这两个字母的代码都是有效的,除了iv
是针对InvariantCulture
的,所以我们可以忽略它。我写了一个简单的代码来检查它。
foreach (var culture in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
try
{
var c = new CultureInfo(culture.TwoLetterISOLanguageName);
}
catch (Exception)
{
Console.WriteLine(culture.TwoLetterISOLanguageName); // Only prints "iv"
}
}
如何创建自己的映射?我建议遵循以下步骤;
- 在ISO-3166和ISO 639-1标准中查找不同的两个字母代码
- 创建您自己的
KeyValuePair<string, string>
结构,该结构包含作为第一个代码的ISO-3166双字母代码和作为第二个代码的ISO 639-1双字母代码 - 如果您的两个字母ISO-3166两个字母的代码在此构造函数中失败,请检查它的映射两个字母代码,并尝试使用该双字母代码创建
CultureInfo
如果.net.支持,您应该能够使用不变区域性
例如,这种方法有效:
var culture = new CultureInfo("EN");
正如您所指出的,似乎并没有完全支持所有国家/地区代码,这是因为它使用的两个字符是中立文化。
您可以通过以下途径获得所有支持的文化的列表:
CultureInfo.GetCultures(CultureTypes.AllCultures);
特别是带有的中性
CultureInfo.GetCultures(CultureTypes.NeutralCultures);
var culture = new CultureInfo("US");
不起作用的原因是美国的中性文化是EN。(具体培养基为en-US
)。
关于将国家代码转换为文化,还有其他高投票率的答案,我不会在这里上当。
CultureInfo.Name的最后一部分是国家的ISO-3166代码,所以这就是我最终的解决方案
public static CultureInfo GetCultureFromTwoLetterCountryCode(string twoLetterISOCountryCode)
{
try
{
return CultureInfo.GetCultures(CultureTypes.AllCultures
& ~CultureTypes.NeutralCultures)
.Where(m => m.Name.EndsWith("-"+twoLetterISOCountryCode))
.FirstOrDefault();
}
catch
{
return null;
}
}
唯一的问题是,有些国家有不止一种文化,比如英国,所以你不能只使用ISO-3166代码、来选择正确的文化
cy GB威尔士(英国)
en-GB英语(英国)
gd GB苏格兰盖尔语(英国)
因此,GetCultureFromTwoLetterCountryCode("GB")
将回归"cy-GB"
文化,这可能对威尔士有利,但对苏格兰不利。
您可以忽略这些类型的例外,或者创建自己的文化信息数据库,并为每个国家只存储一个文化。这将是最好的解决方案。
我认为你混淆了地区和文化?
RegionInfo r = new RegionInfo("US");
MessageBox.Show(r.DisplayName);
这将返回";美国";