区域设置 en-EN 是无效的文化标识符

The locale en-EN is an invalid culture identifier

我最近从一台装有 Windows 10 和 VS 2017 的计算机转移到一台装有 Windows 8.1 和 VS 2017 的计算机。 我正在处理一段代码,它有这样一行。 Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(locale);

此处,locale值为en-EN。当这引发 CultureNotFoundException 异常并显示一条消息时,我感到很惊讶。

en-EN is an invalid culture identifier.

令我惊讶的是,localeen-EN 相同的代码在 Windows 10.

中有效

我已经检查了一些解决方案。 Windows 8.1 是否不支持某些语言环境?可以添加缺少的语言环境吗? 或者,这是一个与 OS 完全无关的问题。感谢您的帮助!

是的,en-EN 确实是一个无效的文化标识符。但是,在Windows 10 处理无效标识符的行为changed a bit.

你基本上有两个选择:

  1. 使用有效的标识符。对于英国的英语,您应该使用 en-GB
  2. 如果您想要的英格兰文化与 en-GB 不同,请注册一种新文化。

这是注册新文化的方法:

文化具有层次结构,其中根始终是 CultureInfo.InvariantCulture。按照惯例,区域性名称反映了这种层次结构。因此,例如,en-GB 是一种区域特定(英国)文化,它派生自 en,这是一种区域独立的英语文化,其父级是不变的文化。

如果你想创建一种源自 en-GB 的英格兰特定文化,那么你应该将其命名为 en-GB-England

var parent = CultureInfo.GetCultureInfo("en-GB");
var builder = new CultureAndRegionInfoBuilder("en-GB-England", CultureAndRegionModifiers.None);
builder.LoadDataFromCultureInfo(parent);
builder.LoadDataFromRegionInfo(new RegionInfo(parent.Name));
builder.Parent = parent;
builder.CultureEnglishName = "English (Great Britain, England)";
builder.CultureNativeName = builder.CultureEnglishName;

try
{
    builder.Register();
}
catch (UnauthorizedAccessException e)
{
    // You must run this code with Administrator rights
     throw;
}
catch (InvalidOperationException e) when (e.Message.Contains("already exists"))
{
    // culture is already registered
}

var enEN = CultureInfo.GetCultureInfo("en-GB-England");