C# 从国家/地区名称或地区信息对象获取CultureInfo对象

C# 从国家/地区名称或地区信息对象获取CultureInfo对象,c#,asp.net,culture,region,C#,Asp.net,Culture,Region,给定特定的国家代码,例如“CH”,如何获取CultureInfo对象?特定国家/地区代码是动态的(在运行时更改)。 我只有国家代码,我想知道是否可以从国家代码创建CultureInfo对象。我得到的确切文化并不重要(fr-CH/de-CH) 我正在尝试这样做: CultureInfo c = CultureInfo.CreateSpecificCulture("CH"); RegionInfo r= new RegionInfo("CH"); CultureInfo c = CultureIn

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

我正在尝试这样做:

CultureInfo c = CultureInfo.CreateSpecificCulture("CH");
RegionInfo r= new RegionInfo("CH");
CultureInfo c = CultureInfo.CreateSpecificCulture(r);
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)
是否可以从RegionInfo对象创建区域性? 那么它看起来是这样的:

CultureInfo c = CultureInfo.CreateSpecificCulture("CH");
RegionInfo r= new RegionInfo("CH");
CultureInfo c = CultureInfo.CreateSpecificCulture(r);
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)

显然,前面的示例没有编译,它们只是给出了我想要实现的目标的想法。

您正在尝试创建CultureInfo对象吗?像这样:

CultureInfo c = CultureInfo.CreateSpecificCulture("CH");
RegionInfo r= new RegionInfo("CH");
CultureInfo c = CultureInfo.CreateSpecificCulture(r);
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)

可能此链接对显示所有文化都很有用。

如果您只有国家代码,您可以使用类似的方式获取与该国家相关的所有文化信息:

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

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

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

尽管如此,我还是会给你两个丑陋的方法。第一个:

static IEnumerable<CultureInfo> FindCandidateCultures(RegionInfo region)
{
  return CultureInfo.GetCultures(CultureTypes.SpecificCultures)
    .Where(x => (new RegionInfo(x.Name)).GeoId == region.GeoId);
}
我将为您提供的第二种方法:

// 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
的内部表示,我们永远不知道它是否会与将来的版本中断。但它确实给了你一种选择特定文化的方法。在我的机器上,从
newregioninfo(“CH”)
,你可以得到
it CH:意大利语(瑞士)

你希望加拿大或比利时的文化是什么?你在寻找什么?对于我们,你可以得到
chrus en US es US US和haw US
:切洛基语、英语、西班牙语、夏威夷语只有国家代码,我想知道是否可以仅从国家代码创建CultureInfo对象。但它必须是动态的。我可以使用HKCU\Control Panel\International\Geo-Nation value获取
CultureInfo
吗?有用的
iso2=“US”代码:
var cultureInfo=cultureInfo.GetCultures(CultureTypes.AllCultures).Where(c=>c.Name.EndsWith(iso2)).ToList();foreach(System.Globalization.CultureInfo-cultureList中的culture){Response.Write(“
culture for“+iso2+”:“+culture.DisplayName+”***“+culture.NativeName+”+“+culture.TwoLetterISOLanguageName+”-“+culture.ThreeLetterISOLanguageName+“-”+culture.DateTimeFormat.FullDateTimePattern);}
这个问题应该得到一个丑陋的答案(我刚刚发布了另一个答案),但是:当我在海地尝试你的代码时,国家代码
“HT”
,我得到的一种文化是
“zh-CHT”
,这是中国(传统)的遗产,在当地被称为中文(繁體) 舊版.@JeppeStigNielsen将上面的代码更改为
EndsWith(“-CH”)
,这将是一个技巧,或者你可以想到另一个边缘情况?我认为如果你这样做,不会有任何例子。即使一些中性文化中包含连字符,例如
“sr Cyrl”
、塞尔维亚语(西里尔语)(未指定国家)或
“mn Mong”“
,蒙古语(传统蒙古语)(未指定国家/地区),第二部分指定了书写系统,因为该语言可以用不同的脚本书写,在这种情况下,第二部分将有两个以上的字母。这非常脆弱。不要依赖字符串存在性检查,你会在某个地方出错。