给定特定的国家/地区代码,例如“CH”,如何获取 CultureInfo 对象?特定的国家/地区代码是动态的(在运行时更改)。 我只有国家/地区代码,我想知道是否可以从 just 国家/地区代码创建 CultureInfo 对象。我得到哪种文化并不重要(fr-CH/de-CH)。
我正在尝试做这样的事情:
CultureInfo c = CultureInfo.CreateSpecificCulture("CH");
是否可以从 RegionInfo 对象创建文化? 然后它看起来像这样:
RegionInfo r = new RegionInfo("CH");
CultureInfo c = CultureInfo.CreateSpecificCulture(r);
显然前面的示例无法编译,它们只是给出了我想要实现的目标的想法。
如果您只有国家/地区代码,您可以使用类似的方法来获取与该国家/地区相关的所有文化信息:
var cultureInfos = CultureInfo.GetCultures(CultureTypes.AllCultures)
.Where(c => c.Name.EndsWith("-CH"));
编辑:在
-
之前添加 CH
以防止出现边缘情况,正如 @JeppeStigNielsen 所指出的(请参阅下面的评论)。
当然这是一件丑陋的事情,因为一个国家(包括你的例子
"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:Walser(瑞士)
编辑:更高版本给出了上述内容,加上这两个:
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)!);
您是否想创建一个 CultureInfo 对象?像这样:
CultureInfo c = new CultureInfo("de-CH"); //culture for German (Switzerland)
CultureInfo c = new CultureInfo("fr-CH"); //culure for French (Switzerland)
CultureInfo c = new CultureInfo("it-CH"); //culture for Italian (Switzerland)
也许这个链接很有用http://www.csharp-examples.net/culture-names/它显示了所有文化。