Локализация WPF-приложений на основе MVVM - PullRequest
8 голосов
/ 25 августа 2009

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

Ответы [ 6 ]

9 голосов
/ 26 августа 2009

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

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

9 голосов
/ 25 августа 2009

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

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

6 голосов
/ 25 августа 2009

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

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

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

xmlns:props="clr-namespace:My.Assembly.Properties"
1 голос
/ 07 декабря 2010

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

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

1 голос
/ 11 июня 2010

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

Вот пример того, как это может работать:

<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/. Загрузите руководство с этого сайта, где этот метод подробно описан в форме документа и с примером приложения .

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

0 голосов
/ 25 августа 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...