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

Ben*_*Ben 15 c# asp.net culture region

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

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

CultureInfo c = CultureInfo.CreateSpecificCulture("CH");
Run Code Online (Sandbox Code Playgroud)

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

RegionInfo r= new RegionInfo("CH");
CultureInfo c = CultureInfo.CreateSpecificCulture(r);
Run Code Online (Sandbox Code Playgroud)

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

And*_*tel 25

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

var cultureInfos = CultureInfo.GetCultures(CultureTypes.AllCultures)
                              .Where(c => c.Name.EndsWith("-CH"));
Run Code Online (Sandbox Code Playgroud)

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


Jep*_*sen 6

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

尽管如此,我还是会向你提供两种丑陋的方法。第一:

static IEnumerable<CultureInfo> FindCandidateCultures(RegionInfo region)
{
  return CultureInfo.GetCultures(CultureTypes.SpecificCultures)
    .Where(x => (new RegionInfo(x.Name)).GeoId == region.GeoId);
}
Run Code Online (Sandbox Code Playgroud)

当用于您的特定示例时,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);
}
Run Code Online (Sandbox Code Playgroud)

很明显,它使用 的内部表示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));
Run Code Online (Sandbox Code Playgroud)

或者(如果您使用可为空的引用类型)带有很多!

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)!);
Run Code Online (Sandbox Code Playgroud)


Fab*_*Luz 5

您是否正在尝试创建 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)
Run Code Online (Sandbox Code Playgroud)

也许此链接可能有用http://www.csharp-examples.net/culture-names/它显示所有文化。