自定义中性文化不会在Visual Studio Winform语言组合框中显示

时间:2013-11-06 23:01:39

标签: c# winforms localization cultureinfo regioninfo

我们需要创建一个我们的WinForms应用程序的OEM版本,它将具有一些不同于基本(en-US)版本的资源字符串(OEM品牌)。此应用程序已针对中性日本文化(ja)进行了本地化。

我正在尝试使用自定义文化来完成此操作,模仿我发现的here文章。我创造了两种文化:en-US-Acme和ja-Acme。我们的想法是,对于OEM英语版和日语版,我们会在适当的启动时设置CurrentUICulture。然后.Net将自动提取正确的资源:首先查看OEM的资源文件(en-US-Acme或ja-Acme),如果没有找到,则返回默认资源文件(en-US或ja)。 / p>

我写了一个小概念验证应用程序来试试这个,它对特定的文化(en-US-Acme)很有用。创建文化后,我可以设置表单的Language属性以使用它,Visual Studio将创建相应的资源文件。在运行时,资源会按预期自动选择(使用回退)。

enter image description here

中性文化(ja-Acme)存在一个问题:虽然可以创建自定义文化,但它不会在Visual Studio中显示为选择:

enter image description here

我创建自定义文化的代码,改编自上面提到的文章,如下所示。虽然代码有效,但我并不完全确定我是否正确地创建了自定义中性文化。

所以有两个问题:

  • 这是创建自定义中性文化的正确方法吗?
  • 为什么我的自定义中性文化不会出现在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 个答案:

答案 0 :(得分:0)

事实证明,自定义中性文化确实在Visual Studio中显示,但它是日语,而不是英语,所以不是我在寻找它的地方。相反,它位于列表的底部:

enter image description here

Visual Studio显示了CultureInfo的DisplayName属性,我的自定义中性文化的DisplayName是日语。为什么呢?

我找到了答案here。这是关键句:

  

因此,补充自定义文化的DisplayName就是   与原生名称相同。

原生名称仍缺少"(Acme)"后缀,所以我可能仍然没有正确地创建自定义中性文化,但这清除了部分神秘。