从国家/地区名称或RegionInfo对象获取CultureInfo对象

给定一个特定的国家代码,例如“CH”,我如何获得CultureInfo对象? 特定国家/地区代码是动态的(在运行时更改)。 我只有国家代码,我想知道是否可以从国家代码创建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指出的那样(见下面的评论)。

您是否尝试创建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/它显示所有文化。

当然这是一个丑陋的事情,因为一个国家(包括你的榜样"CH"瑞士)可以有多种语言。

不过,我会为你提供两种难看的方法。 第一:

 static IEnumerable 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:阿尔萨斯(瑞士)
它-CH:意大利语(瑞士)
 rm-CH:罗曼什(瑞士)
 wae-CH:Walser(瑞士) 

我将为您提供的第二种方法:

 // 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)