WPF использует англоязычный культурный ресурс, даже когда UICulture - арабский - PullRequest
2 голосов
/ 12 марта 2019

Я недавно поигрался с WPF и хочу знать, как использовать ресурсы английской культуры, даже если культура приложения настроена на другую культуру, скажем, арабскую.

Я определил два файла ресурсов, содержащих ключ HelloWorld.в папке Resources.

  • AppResources.resx (имеет HelloWorld = Hello World!)
  • AppResources.ar.resx (имеетHelloWorld = مرحبا بالعالم)

HomePage.xaml

Сначала я объявил пространство имен файла ресурсов как res

 xmlns:res="clr-namespace:Demo.Core.Resources;assembly=Demo.Core"

, а затемиспользовал его на этикетке, чтобы показать Hello World!

<Label Content="{x:Static res:AppResources.HelloWorld}"/>

Я установил арабский язык в качестве культуры приложения

CultureInfo cultureInfo = new CultureInfo("ar");
Resources.AppResources.Culture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;

Я хочу показатьАнглийский Hello World!Но он показывает привет арабский мир (مرحبا بالعالم)

Это потому, что я установил культуру CurrentUICulture & AppResources на арабский.Есть ли способ с этими настройками, я мог бы по-прежнему использовать английские строки, определенные в файле AppResources.resx, как это в XAML?По сути, я хочу игнорировать настройку культуры и использовать английский ресурс непосредственно в XAML.Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Эта тема C #: Как получить строку ресурса из определенной культуры , кажется, дает ответ на то, что вы ищете. В основном это сводится к звонку Resources.ResourceManager.GetString("foo", new CultureInfo("en-US")); Если вам нужно использовать его непосредственно из XAML, напишите MarkupExtension, которое при наличии ключа ресурса возвращает необходимые локализованные строки

[MarkupExtensionReturnType(typeof(string))]
public class EnglishLocExtension : MarkupExtension 
{
  public string Key {get; set;}
  public EnglishLocExtension(string key)
  { 
     Key = key; 
  }
  public override object ProvideValue(IServiceProvider provider) 
  { // your lookup to resources 
  }
}

Я бы предпочел этот подход, потому что он более приятный. Xaml:

<Label Content={EnglishLoc key}/>
2 голосов
/ 12 марта 2019

Вы можете использовать класс ResourceManager для программного получения ресурса в указанной культуре:

ResourceManager rm = new ResourceManager(typeof(AppResources));
lbl.Content = rm.GetString("HelloWorld", CultureInfo.InvariantCulture);

Вы можете использовать создать конвертер, который выполняет перевод для вас:

public class ResourceConverter : IValueConverter
{
    private static readonly ResourceManager s_rm = new ResourceManager(typeof(AppResources));
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string key = value as string;
        if (key != null)
            return s_rm.GetString(key, culture);

        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

И используйте его в своей разметке XAML следующим образом:

<Label Content="{Binding Source=HelloWorld, 
    Converter={StaticResource ResourceConverter}, 
    ConverterCulture=en-US}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...