当然,这样做很不好看,因为一个国家(包括你的例子“CH”瑞士)可能有多种语言。不过,我会提供两种不太美观的方法。第一种:
static IEnumerable<CultureInfo> FindCandidateCultures(RegionInfo region)
{
return CultureInfo.GetCultures(CultureTypes.SpecificCultures)
.Where(x => (new RegionInfo(x.Name)).GeoId == region.GeoId);
}
当使用
new RegionInfo("CH")
时,在我的.NET Framework和Windows版本上会得到以下结果:
de-CH: 德语(瑞士)
fr-CH: 法语(瑞士)
gsw-CH: 阿尔萨斯语(瑞士)
it-CH: 意大利语(瑞士)
rm-CH: 罗曼什语(瑞士)
wae-CH: 瓦尔瑟语(瑞士)
编辑:更高版本还包括以下两种语言:
en-CH: 英语(瑞士)
pt-CH: 葡萄牙语(瑞士)
我将提供给您的第二种方法:
// ugly reflection, this can break any day!
static CultureInfo ConvertToCulture(RegionInfo region)
{
var data = typeof(RegionInfo).GetField("m_cultureData", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(region);
var name = (string)(data.GetType().GetProperty("SNAME", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(data));
return CultureInfo.GetCultureInfo(name);
}
显然,它使用
mscorlib.dll
的内部表示方式,我们永远不知道它是否会在未来版本中失效。但它确实为您提供了一种选择特定区域设置的方法。在我的计算机上,从
new RegionInfo("CH")
,您可以得到
it-CH: Italian (Switzerland)
。
编辑:毫不奇怪,.NET的某些版本中第二种方法已经改变。类似这样的东西:
var data = typeof(RegionInfo).GetField("_cultureData", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(region);
var name = (string)(data.GetType().GetProperty("CultureName", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(data));
或者(如果您使用可空引用类型)使用许多!
:
var data = typeof(RegionInfo).GetField("_cultureData", BindingFlags.NonPublic | BindingFlags.Instance)
!.GetValue(region);
var name = (string)(data!.GetType().GetProperty("CultureName", BindingFlags.NonPublic | BindingFlags.Instance)
!.GetValue(data)!);
chr-US en-US es-US和haw-US
:_切罗基语,英语,西班牙语,夏威夷语_。 - Kiquenet