Ресурсы WPF: явная локализация отдельных элементов управления - PullRequest
1 голос
/ 15 декабря 2011

Можно ли явно управлять культурой элементов управления, чтобы указать, из каких ресурсов (.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}" />
   ...

Как мне это сделать?

1 Ответ

3 голосов
/ 15 декабря 2011

Класс 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}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...