26

C# 系统/全球化命名空间中是否有一组常量或枚举包含有效的文化名称?

我正在寻找一些东西,这样我就不必输入“en-GB”等。

4

2 回答 2

22

是的,有,GetCultures

System.Globalization.CultureInfo.GetCultures(System.Globalization.CultureTypes.SpecificCultures)

这会返回一个对象数组CultureInfo,所以如果你想要字符串名称,你可以使用类似的东西:

IEnumerable<CultureInfo> cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
string[] names = cultures.Select(c => c.Name).ToArray();

请注意“文化类型”枚举(来自 MSDN 链接)。我想最有用的是NeutralCulturesSpecificCultures

  • NeutralCultures 与语言相关但不特定于国家/地区的文化。.NET Framework 区域性的名称由派生自 ISO 639-1 的小写两字母代码组成。例如:“en”(英文)是一种中性文化。自定义文化可以有任何用户指定的名称,而不仅仅是两个字母的代码。不变区域性包含在指定此值的 CultureInfo.GetCultures 方法返回的区域性数组中。
  • SpecificCultures特定于国家/地区的文化。这些区域性的名称遵循 RFC 4646(Windows Vista 和更高版本)。格式为“-”,其中是从 ISO 639-1 派生的小写双字母代码,是从 ISO 3166 派生的大写双字母代码。例如,英语(美国)的“en-US”是特定的文化。自定义文化可以具有任何用户指定的名称,而不仅仅是符合标准的名称。
  • InstalledWin32Cultures 安装在 Windows 操作系统中的所有文化。请注意,并非 .NET Framework 支持的所有区域性都安装在操作系统中。
  • AllCultures .NET Framework 附带的所有文化,包括中性和特定文化、安装在 Windows 操作系统中的文化以及用户创建的自定义文化。
  • UserCustomCulture用户创建的自定义文化。
  • ReplacementCultures 用户创建的自定义文化,用于替换 .NET Framework 附带的文化。
于 2012-09-27T02:26:33.697 回答
12

不,没有。可用文化列表是特定于系统的——您甚至可以使用CultureAndRegionInfoBuilder注册新的自定义文化。

因此,如果您想要这个,您必须为您感兴趣的常见文化子集创建自己的枚举或常量,例如:

public static class KnownCulture
{
    public readonly String EnglishUS = "en-US";
    public readonly String EnglishGB = "en-GB";
    ... etc ...
}

或者

public enum KnownLCID
{
    EnglishUS = 0x409,
    EnglishGB = 0x809,
    ...
}

This is analogous to the KnownColor enumeration: it's not possible to create an enumeration for all possible colors, but it can make sense to have an enumeration for frequently used ones.

I wouldn't expect Microsoft to provide an equivalent KnownCulture enumeration out of the box, as it's rather sensitive (why is my culture not included?).

于 2012-09-27T09:01:35.193 回答