WPF资源:单个控件的显式本地化
本文关键字:本地化 控件 资源 单个 WPF | 更新日期: 2023-09-27 18:18:09
是否可以显式控制控件的区域性,以便设置从哪些资源(.resx)/区域性中检索其值?
假设全局应用程序文化为"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}" />
...
我该怎么做呢?
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}"/>