Язык en-EN является недопустимым идентификатором культуры - PullRequest
0 голосов
/ 12 июня 2018

Я недавно перешел с компьютера, на котором была Windows 10 с VS 2017, на компьютер, на котором была Windows 8.1 с VS 2017. Я работал с фрагментом кода, который имел такую ​​строку. Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(locale);

Здесь значение locale равно en-EN.Меня удивило удивление, когда это вызвало исключение CultureNotFoundException с сообщением.

en-EN - недопустимый идентификатор культуры.

Удивительно для меня, потому что,тот же код с locale, что и en-EN, работает в Windows 10.

Я проверил несколько решений.Windows 8.1 не поддерживает несколько локалей?Можно ли добавить недостающие локали?Или это проблема, которая совершенно не связана с ОС.Любая помощь приветствуется!

1 Ответ

0 голосов
/ 12 июня 2018

Да, 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");
...