Использование CultureAndRegionInfoBuilder для регистрации новых культур в старых версиях Windows - PullRequest
1 голос
/ 12 марта 2019

tl; dr: Можно ли определить и зарегистрировать en-BS как культуру в Windows Server 2012 R2?

Я пытаюсь ввести международные валютные опции для некоторых программ, над которыми я работаю. Этот процесс сам по себе не был сложным. Я использую код культуры, например «en-US», чтобы получить объект CultureInfo , и использую NumberFormat из объекта CultureInfo для форматирования валюты. Большой! У нас есть клиенты на Багамах, поэтому среди валют, которые мы рассчитываем поддержать, есть багамский доллар, который происходит из культуры en-BS.

Это очень хорошо работало на протяжении всей разработки. Но после того, как мы развернули эту функцию, попытка получить CultureInfo для en-BS вернулась со следующей ошибкой.

Культура не поддерживается.
Имя параметра: имя
en-BS - недопустимый идентификатор культуры.

Исследуя эту ошибку, я узнал, что культура определяется не .NET, а скорее ОС. Windows 10 изначально поддерживает en-BS. Отличные новости для моей среды разработки! Windows Server 2012 R2 не поддерживает en-BS. Плохие новости для нашей производственной среды.

Так что теперь, похоже, мне нужно использовать CultureAndRegionInfoBuilder . Это не самое удобное решение, но я могу заставить его работать. Я ничего не знаю о культурных нюансах багамских долларов, поэтому все, что я хочу сделать, это взять информацию, определенную в Windows 10, и зарегистрировать ее на наших серверах 2012 R2. Поскольку я не могу просто загрузить en-BS CultureInfo с помощью кода на старых серверах, я подумал, что лучше всего будет сериализовать CultureInfo в файл на моей машине для разработки и десериализовать этот файл на старых серверах, чтобы затем использовать с CultureAndRegionInfoBuilder.

const string identifier = "en-BS";

string cultureFile = String.Format("{0}-Culture.txt", identifier);
string regionFile = String.Format("{0}-Region.txt", identifier);

IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(cultureFile, FileMode.Open, FileAccess.Read, FileShare.Read);
CultureInfo cultureObject = (CultureInfo)formatter.Deserialize(stream);
stream.Close();

stream = new FileStream(regionFile, FileMode.Open, FileAccess.Read, FileShare.Read);
RegionInfo regionObject = (RegionInfo)formatter.Deserialize(stream);
stream.Close();

CultureAndRegionInfoBuilder builder = new CultureAndRegionInfoBuilder(identifier, CultureAndRegionModifiers.None);
builder.LoadDataFromCultureInfo(cultureObject);
builder.LoadDataFromRegionInfo(regionObject);
builder.Register();

Это не самый элегантный код, который я когда-либо писал, но он прост и должен быть достаточно хорош для того, что я собираюсь запустить один раз, а затем заархивировать навсегда. К сожалению, когда я пытаюсь десериализовать объект CultureInfo из файла, он снова сталкивается с той же самой ошибкой «en-BS - недопустимый идентификатор культуры», как будто он активно отклоняет любую культуру с таким именем.

Я в растерянности. Можно ли вообще зарегистрировать en-BS или любую другую неподдерживаемую культуру на сервере 2012 R2?

...