C# Visual Studio Winform语言组合框中不显示自定义非特定区域性
我们需要创建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中显示为一个选项: 下面是我根据上述文章改编的创建自定义区域性的代码。虽然代码可以正常工作,但我不能完全确定我是否正确创建了自定义的中立文化 所以有两个问题: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),如果找不到,则返回默认资源文件(
- 这是创建自定义中立文化的正确方法吗
- 为什么我的定制中立文化没有出现在VisualStudio中
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)”后缀,因此我可能仍然没有完全正确地创建自定义中性文化,但这澄清了部分谜团