Пользовательская нейтральная культура не отображается в выпадающем списке 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)", поэтому я, возможно, все еще не совсем правильно создаю собственную нейтральную культуру, но это проясняет часть загадки.

Другие вопросы по тегам