我们需要创建一个我们的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将创建相应的资源文件。在运行时,资源会按预期自动选择(使用回退)。
中性文化(ja-Acme)存在一个问题:虽然可以创建自定义文化,但它不会在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;
}
}
答案 0 :(得分:0)
事实证明,自定义中性文化确实在Visual Studio中显示,但它是日语,而不是英语,所以不是我在寻找它的地方。相反,它位于列表的底部:
Visual Studio显示了CultureInfo的DisplayName属性,我的自定义中性文化的DisplayName是日语。为什么呢?
我找到了答案here。这是关键句:
因此,补充自定义文化的DisplayName就是 与原生名称相同。
原生名称仍缺少"(Acme)"后缀,所以我可能仍然没有正确地创建自定义中性文化,但这清除了部分神秘。