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

5

我最近从一台安装有Windows 10和VS 2017的电脑切换到了一台安装有Windows 8.1和VS 2017的电脑。

我正在处理一个代码段,其中有这样一行代码:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(locale);

这里的 locale 值为 en-EN。当我运行这段代码时,却收到了一个意外的错误信息,即 CultureNotFoundException 异常。

en-EN 是一个无效的区域设置标识符。

这对我来说非常令人惊讶,因为同样带有 en-EN 的代码在 Windows 10 上是可以正常工作的。

我已经尝试了几种解决方案。Windows 8.1 不支持一些区域设置吗?缺失的区域设置能否被添加?还是这个问题完全与操作系统无关?谢谢您的帮助!


相关 https://stackoverflow.com/a/43115074/1132334 - Cee McSharpface
是的@dlatikay。谢谢! - Sameer Shaik
1个回答

6

是的,en-EN 真的是一个无效的区域标识符。但是,在 Windows 10 中,处理无效标识符的行为有所改变

您基本上有两个选项:

  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");

谢谢@taffer。这回答了我的问题。此外,+1给链接和选项。 :) - Sameer Shaik
戴上我的吹毛求疵的帽子,我想指出England不等于Great Britain - awj
@awj:是的,这就是为什么在这个例子中,英格兰的注册文化是一个专门从en-GB派生出来的(请注意,en-GB被设置为新注册的文化的“Parent”文化)。 - György Kőszeg
啊,我现在明白了。抱歉。 - awj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接