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

falq053o  于 2022-11-19  发布在  .NET
关注(0)|答案(3)|浏览(105)

给定一个特定的国家a地区代码,例如“CH”,我如何获得CultureInfo对象?特定的国家a地区代码是动态的(在运行时更改)。我只有国家a地区代码,我想知道是否可以从国家a地区代码创建CultureInfo对象。我获得哪个确切的文化(fr-CH/de-CH)并不重要。
我试着这样做:

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

是否可以从RegionInfo对象创建一个区域性?然后,它将如下所示:

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

很明显,前面的例子并没有编译,它们只是给予了一个我试图实现的想法。

vmdwslir

vmdwslir1#

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

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

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

ffvjumwh

ffvjumwh2#

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

0s0u357o

0s0u357o3#

当然,这是一件丑陋的事情,因为一个国家(包括你的例子"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)
  • 编辑:* 一个较新的版本提供了以上,加上这两个:
en-CH: English (Switzerland)
pt-CH: Portuguese (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)

  • 编辑:* 第二种方法在某些. 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)!);

相关问题