2015-10-07 5 views
0

В моем WPF appliation, у меня есть свойство, определяемое следующим образомлокализуют сообщения об ошибках DataAnnotation как в культуре

[Required(AllowEmptyStrings =false, ErrorMessageResourceName ="Msg1", ErrorMessageResourceType =typeof(*<AssemblyName>*.Resources.*<ResourceFileName>*))] 
public string Name 
{ 
    get 
    { 
     return _name; 
    } 

    set 
    { 
     if (_name == value) 
     { 
      return; 
     } 
     _name = value; 
    } 
} 

Я мои сообщения об ошибках определены в отдельной сборке, которая имеет файл ресурсов для различных культур например Ресурсы.resx, Resources.en-GB.Resx, Resources.fr-FR.Resx, Resources.en-US.Resx и т. Д.

С приведенным выше кодом я могу получить сообщение об ошибке из файл ресурсов по умолчанию в моей спутниковой сборке, но я не вижу никаких условий для поиска строкового ресурса из файла ресурсов, специфичного для культуры. Я имею в виду, если мой CurrentUICluture установлен как английский (Соединенное Королевство), тогда я хочу получить значение ресурса из файла «Resources.en-GB.Resx» вместо файла по умолчанию (то есть Resource.Resx).

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

Что я хочу, так это то, как сделать культуру механизма поиска ресурсов осведомленной.

Спасибо,

ответ

0

Наконец я получил исправление для моей проблемы с this link

В моем приложении, я садился культурой в момент запуска приложения на добавив следующий код в файл app.xaml.cs.

protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 
     InitializeCultures(); 
    } 

    private static void InitializeCultures() 
    { 
     var culture = ConfigurationManager.AppSettings.Get("Culture"); 
     if (!String.IsNullOrEmpty(culture)) 
     { 
      Thread.CurrentThread.CurrentCulture = new CultureInfo(culture); 
     } 

     var UICulture = ConfigurationManager.AppSettings.Get("UICulture"); 
     if (!String.IsNullOrEmpty(UICulture)) 
     { 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo(UICulture); 
     } 
    } 

Однако проблема в том, что если я первоначально установил Культуру, не все потоки будут использовать ту же самую культуру, что и я. Таким образом, поток, который читал значение ресурса для меня, по-прежнему использовал культуру по умолчанию, и это привело к тому, что чтение строки ресурсов всегда происходило из файла ресурсов культуры по умолчанию, а не из файла ресурсов для конкретной культуры.

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

  1. CultureInfo.DefaultThreadCurrentCulture
  2. CultureInfo.DefaultThreadCurrentUICulture

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

После того, как культура установлена ​​правильно, чтение значений ресурсов по сути становится культурой и считывает значения ресурсов из файлов ресурсов, специфичных для культуры.

Так Ниже приводится обновленная версия метода InitializeCulture:

private static void InitializeCultures() 
    { 
     var culture = ConfigurationManager.AppSettings.Get("Culture"); 
     if (!String.IsNullOrEmpty(culture)) 
     { 
      Thread.CurrentThread.CurrentCulture = CultureInfo.DefaultThreadCurrentCulture = new CultureInfo(culture); 
     } 

     var UICulture = ConfigurationManager.AppSettings.Get("UICulture"); 
     if (!String.IsNullOrEmpty(UICulture)) 
     { 
      Thread.CurrentThread.CurrentUICulture = CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo(UICulture); 
     } 
    } 

P.S. Существует одно предупреждение об использовании этого исправления в веб-приложении. Pls читал об этом по оригинальной ссылке.

Надеюсь, что это поможет ...

0

Если вы хотите, чтобы ваш сайт культуры известно, вам необходимо изменить атрибут глобализации в web.config под system.web элемента:

<globalization fileEncoding="utf-8" requestEncoding="utf-8" culture="auto" uiCulture="auto" enableClientBasedCulture="true" /> 

Затем он будет искать ресурсы на основе предпочтительных языковых настроек браузера.

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

<globalization fileEncoding="utf-8" requestEncoding="utf-8" responseEncoding="" culture="en-US" uiCulture="en-US" /> 
+0

Спасибо за ваш ответ. Но мое приложение WPF, а не веб-приложение. Любой ключ, как заставить его работать в приложении WPF? – user2185592

+0

Ах, извините, я пропустил, что вы упомянули об этом в своем оригинальном посте. Я не вижу никаких проблем с кодом, который вы предоставили. возможно, этот ответ SO поможет: http://stackoverflow.com/a/14163432/4270650 –

 Смежные вопросы

  • Нет связанных вопросов^_^