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

时间:2011-12-15 12:57:48

标签: c# wpf localization

是否可以明确控制控件的文化,以便设置哪些资源(.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}" />
   ...

我将如何做到这一点?

1 个答案:

答案 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}"/>
相关问题