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

Sam*_*aik 3 .net c# visual-studio windows-8.1 windows-10

我最近从一台装有Windows 10 VS 2017的计算机转移到了一台装有Windows 8.1 VS 2017的计算机。我正在使用一段类似这样的代码。 Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(locale);

在这里,locale值是en-EN。当此CultureNotFoundException消息引发异常时,我感到惊讶。

en-EN是无效的区域性标识符。

令我感到诧异,因为,同样的代码localeen-EN在Windows 10的作品。

我已经检查了一些解决方案。Windows 8.1是否不支持某些语言环境?可以添加缺少的语言环境吗?或者,这是与操作系统完全无关的问题。任何帮助表示赞赏!

Gyö*_*zeg 5

是的,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");
Run Code Online (Sandbox Code Playgroud)