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}" />
   ...

我该怎么做呢?

WPF资源:单个控件的显式本地化

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}"/>