Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Visual Studio Winform语言组合框中不显示自定义非特定区域性_C#_Winforms_Localization_Cultureinfo_Regioninfo - Fatal编程技术网

C# Visual Studio Winform语言组合框中不显示自定义非特定区域性

C# Visual Studio Winform语言组合框中不显示自定义非特定区域性,c#,winforms,localization,cultureinfo,regioninfo,C#,Winforms,Localization,Cultureinfo,Regioninfo,我们需要创建WinForms应用程序的OEM版本,该版本的资源字符串(OEM品牌)与基本(en-US)版本不同。此应用程序已针对中立日本文化(ja)进行本地化 我正试图以我找到的一篇文章为蓝本,使用自定义文化来实现这一点。我创造了两种文化:en-US-Acme和ja-Acme。我们的想法是,对于OEM英文版和日文版,我们会在启动时适当设置CurrentUICulture。Net将自动提取正确的资源:首先查找OEM的资源文件(en US Acme或ja Acme),如果找不到,则返回默认资源文件(

我们需要创建WinForms应用程序的OEM版本,该版本的资源字符串(OEM品牌)与基本(en-US)版本不同。此应用程序已针对中立日本文化(ja)进行本地化

我正试图以我找到的一篇文章为蓝本,使用自定义文化来实现这一点。我创造了两种文化:en-US-Acme和ja-Acme。我们的想法是,对于OEM英文版和日文版,我们会在启动时适当设置CurrentUICulture。Net将自动提取正确的资源:首先查找OEM的资源文件(en US Acme或ja Acme),如果找不到,则返回默认资源文件(en US或ja)

我已经编写了一个小的概念验证应用程序来尝试这一点,它非常适合特定的文化(en US Acme)。创建区域性后,我可以设置窗体的Language属性以使用它,VisualStudio将创建相应的资源文件。在运行时,将按预期自动选择资源(使用回退)

但是,中性区域性(ja Acme)存在一个问题:尽管可以创建自定义区域性,但它不会在Visual Studio中显示为一个选项:

下面是我根据上述文章改编的创建自定义区域性的代码。虽然代码可以正常工作,但我不能完全确定我是否正确创建了自定义的中立文化

所以有两个问题:

  • 这是创建自定义中立文化的正确方法吗
  • 为什么我的定制中立文化没有出现在VisualStudio中
我开始认为visualstudio不支持定制中立的区域性,我必须使用定制特定的区域性(jajpacme)。我还没有测试过这个,但是我认为回退(到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;
    }
}

事实证明,在VisualStudio中确实显示了定制中立的文化,但它是日语,而不是英语,所以我找不到它。相反,它位于列表的底部:

Visual Studio正在显示CultureInfo的DisplayName属性,我的自定义非特定区域性的DisplayName是日语。为什么?

我找到了答案。这是关键的一句话:

因此,补充自定义区域性的DisplayName是 与本地名称相同

本地名称仍然缺少“(Acme)”后缀,因此我可能仍然没有完全正确地创建自定义中性文化,但这澄清了部分谜团