Локализация приложений WPF на основе MVVM

Что было бы хорошим aproach для локализации ссылки WPF на основе MVVM, которая может изменить свой язык во время выполнения? Конечно, я мог бы создать строковое свойство в ViewModel для каждой строки, которая отображается где-то в представлении, но это кажется мне довольно утомительным. Существует ли общий подход / наилучшая практика для этого?

6 ответов


WPF имеет большую поддержку для локализации. Возможно, вы можете использовать это? К сожалению, я думаю, что изменение языка пользовательского интерфейса во время выполнения несколько сложно, и вам, вероятно, нужно придумать свою собственную схему.

кроме того, поскольку view-model является агностиком пользовательского интерфейса, я не думаю, что сохранение строк пользовательского интерфейса в view-model является хорошим решением. Они принадлежат воззрению.


здесь отличная статья о локализации WPF. Он имеет дело с техникой локализации, поддерживаемой Microsoft, и несколькими альтернативными

Я бы не рекомендовал "официальное" решение для локализации... это действительно боль в использовании, она изменяет XAML (добавляет атрибуты x:Uid к каждому элементу, который может быть локализован), и нет хороших инструментов от MS, чтобы сделать его простым решением. Старая добрая локализация resx намного проще в использовании и интегрируется довольно хорошо с WPF с помощью всего нескольких трюков (а именно, расширений разметки и/или вложенных свойств). Кроме того, вы можете легко изменить язык интерфейса во время выполнения благодаря привязке системы.


вместо строк пользовательского интерфейса в модели представления их можно хранить в ресурсах сборки и получать к ним доступ непосредственно из XAML с помощью x:Static:

<TextBlock Text="{x:Static props:Resources.MyLabel}"/>

на props пространство имен должно ссылаться наProperties пространство имен:

xmlns:props="clr-namespace:My.Assembly.Properties"

Пользовательское расширение разметки можно использовать для поиска локализованных значений и их обновления при изменении культуры пользовательского интерфейса.

вот пример как это может работать:

<Label x:Name="lblResxHelloWorldMarkupExtension1Value" 
Content="{res:Res Id=HelloWorld,Default=Hello#}" 
Margin="{res:Res Id=HelloWorldMargin,Default=10}" 
Width="{res:Res Id=HelloWorldWidth, 
ResourceSet=WpfClickOnce.MyFormRes, Default=50}" />

этот пример взят из превосходного руководства по локализации WPF, написанного Риком Штралем и Микеле Леру Бустаманте здесь:http://wpflocalization.codeplex.com/. Загрузите руководство с этого сайта, где этот метод подробно описан в форме документа и с помощью пример приложения.

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


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

LocalizationLibrary:http://localizationlibrary.codeplex.com/