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

时间:2012-01-19 12:58:03

标签: c# asp.net culture region

给定特定的国家/地区代码,例如“CH”,我如何获得CultureInfo对象?特定的国家/地区代码是动态的(在运行时更改)。 我只有国家/地区代码,我想知道是否可以从只是国家/地区代码创建CultureInfo对象。我得到的确切文化无关紧要(fr-CH / de-CH)。

我正在尝试做这样的事情:

CultureInfo c = CultureInfo.CreateSpecificCulture("CH");

是否可以从RegionInfo对象创建文化? 然后它看起来像这样:

RegionInfo r= new RegionInfo("CH");
CultureInfo c = CultureInfo.CreateSpecificCulture(r);

显然前面的例子没有编译,他们只是想知道我想要实现的目标。

3 个答案:

答案 0 :(得分:25)

如果您只有国家/地区代码,则可以使用以下内容获取与该国家/地区相关联的所有文化信息:

var cultureInfos = CultureInfo.GetCultures(CultureTypes.AllCultures)
                              .Where(c => c.Name.EndsWith("-CH"));

编辑:在-之前添加CH以防止边缘情况,正如@JeppeStigNielsen所指出的那样(见下面的评论)。

答案 1 :(得分:4)

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

答案 2 :(得分:3)

当然这是一个丑陋的事情,因为一个国家(包括你的例子"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: German (Switzerland)
fr-CH: French (Switzerland)
gsw-CH: Alsatian (Switzerland)
it-CH: Italian (Switzerland)
rm-CH: Romansh (Switzerland)
wae-CH: Walser (Switzerland)

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

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