是否可以明确控制控件的文化,以便设置哪些资源(.resx)/ culture从中检索其值?
让我们说全球应用文化是“en-US”但我想要一些控件在“sv-SE”中。在我的项目中,我有一个resource.resx
和一个resource.sv-se.resx
文件。它适用于切换整个应用程序的文化/语言,但我无法弄清楚如何在每个控件级别上控制它。我希望设置Language="sv-SE"
已经足够了,但TextBlock仍然从英语资源文件中获取其价值。
<Windows
xmlns:resx="clr-namespace:MyApplication.Localization"
...
>
<TextBlock x:Name="TextInEnglish" Text="{x:Static resx:Resources.MyText}" />
<TextBlock x:Name="TextInSwedish" Language="sv-SE" Text="{x:Static resx:Resources.MyText}" />
...
我将如何做到这一点?
答案 0 :(得分:3)
ResourceManager
类不考虑Language
属性,它只使用CurrentUICulture
。但您可以创建一个标记扩展,您可以在其中指定文化:
public class LocalizedResourceExtension : MarkupExtension
{
[ConstructorArgument("resourceKey")]
public string ResourceKey { get; set; }
public CultureInfo Culture { get; set; }
public LocalizedResourceExtension()
{
}
public LocalizedResourceExtension(string resourceKey)
{
this.ResourceKey = resourceKey;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (string.IsNullOrEmpty(ResourceKey))
throw new InvalidOperationException("ResourceKey must be set");
return Properties.Resources.ResourceManager.GetObject(
ResourceKey,
Culture ?? CultureInfo.CurrentUICulture);
}
}
您可以在代码中使用它:
<TextBlock x:Name="TextInEnglish" Text="{loc:LocalizedResource MyText}" />
<TextBlock x:Name="TextInSwedish" Text="{loc:LocalizedResource MyText, Culture=sv-SE}"/>