Пользовательская нейтральная культура не отображается в выпадающем списке Visual Studio Winform Language
Нам нужно создать OEM-версию нашего приложения WinForms, которая будет иметь несколько других строк ресурсов (OEM-брендинг), чем базовая (en-US) версия. Это приложение уже локализовано для нейтральной японской культуры (JA).
Я пытаюсь использовать пользовательские культуры для достижения этой цели по образцу статьи, которую я нашел здесь. Я создал две культуры: en-US-Acme и ja-Acme. Идея состоит в том, что для английской и японской версий OEM мы установили CurrentUICulture во время запуска соответствующим образом. Затем.Net автоматически извлекает правильный ресурс: сначала ищет в файле ресурсов OEM-производителя (en-US-Acme или ja-Acme), а если не найден, возвращается к файлу ресурса по умолчанию (en-US или ja).
Я написал небольшое приложение для проверки концепции, и оно отлично работает для конкретной культуры (en-US-Acme). Как только моя культура создана, я могу установить свойство языка формы, чтобы использовать его, и Visual Studio создает соответствующий файл ресурсов. Во время выполнения ресурсы автоматически выбираются (с резервным режимом), как и ожидалось.
Однако существует проблема для нейтральной культуры (ja-Acme): хотя пользовательская культура может быть создана, она не отображается в качестве выбора в Visual Studio:
Мой код для создания пользовательских культур, адаптированный из упомянутой выше статьи, показан ниже. Я не совсем уверен, что правильно создаю пользовательские нейтральные культуры, хотя код работает.
Итак, два вопроса:
- Это правильный способ создать собственную нейтральную культуру?
- Почему моя обычная нейтральная культура не отображается в Visual Studio?
Я начинаю думать, что пользовательские нейтральные культуры просто не поддерживаются Visual Studio, и что вместо этого мне придется использовать пользовательскую специфическую культуру (ja-JP-Acme). Я еще не проверял это, но я думаю, что запасной вариант (к ja) все равно будет работать так, как мне нужно.
var customCultures = CultureInfo.GetCultures( CultureTypes.UserCustomCulture );
if ( customCultures.Any( c => c.Name == "en-US-Acme" ) ) {
CultureAndRegionInfoBuilder.Unregister( "en-US-Acme" );
}
var builder = CultureAndRegionInfoBuilderHelper.CreateChildCultureAndRegionInfoBuilder( new CultureInfo( "en-US" ), "Acme", "(Acme)" );
builder.Register();
if ( customCultures.Any( c => c.Name == "ja-Acme" ) ) {
CultureAndRegionInfoBuilder.Unregister( "ja-Acme" );
}
builder = CultureAndRegionInfoBuilderHelper.CreateChildCultureAndRegionInfoBuilder( new CultureInfo( "ja" ), "Acme", "(Acme)" );
builder.Register();
//...
internal class CultureAndRegionInfoBuilderHelper {
public static CultureAndRegionInfoBuilder CreateChildCultureAndRegionInfoBuilder( CultureInfo parentCultureInfo, string childNameSuffix, string childDescriptiveSuffix ) {
var cultureName = parentCultureInfo.Name + "-" + childNameSuffix;
RegionInfo parentRegionInfo;
CultureAndRegionModifiers flags;
// Set region info and flags based on whether the parent culture is neutral or not.
if ( parentCultureInfo.IsNeutralCulture ) {
parentRegionInfo = null;
flags = CultureAndRegionModifiers.Neutral;
}
else {
parentRegionInfo = new RegionInfo( parentCultureInfo.Name );
flags = CultureAndRegionModifiers.None;
}
var builder = new CultureAndRegionInfoBuilder( cultureName, flags );
// load the culture and region data from the parent
builder.LoadDataFromCultureInfo( parentCultureInfo );
if ( parentRegionInfo != null ) {
builder.LoadDataFromRegionInfo( parentRegionInfo );
}
builder.Parent = parentCultureInfo;
var descriptiveSuffix = " " + childDescriptiveSuffix;
builder.CultureEnglishName += descriptiveSuffix;
builder.CultureNativeName += descriptiveSuffix;
if ( parentRegionInfo != null ) {
builder.RegionEnglishName += descriptiveSuffix;
builder.RegionNativeName += descriptiveSuffix;
}
return builder;
}
}
1 ответ
Оказывается, что пользовательская нейтральная культура действительно показана в Visual Studio, но она есть на японском, а не на английском, и поэтому не была там, где я ее искал. Вместо этого это было в нижней части списка:
Visual Studio показывает свойство DisplayName CultureInfo, а DisplayName моей пользовательской нейтральной культуры написано на японском языке. Зачем?
Я нашел свой ответ здесь. Это ключевое предложение:
Следовательно, DisplayName дополнительной пользовательской культуры совпадает с собственным именем.
В нативном названии по-прежнему отсутствует суффикс "(Acme)", поэтому я, возможно, все еще не совсем правильно создаю собственную нейтральную культуру, но это проясняет часть загадки.