2009-08-25 3 views
8

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

ответ

9

WPF has a lot of support for localization. Возможно, вы можете использовать это? К сожалению, я думаю, что изменение языка интерфейса пользователя во время выполнения несколько сложно, и вам, вероятно, придется придумать свою собственную схему.

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

+3

Учитывая, что View-модель представляет собой модель с видом, я лично считаю, что это идеальное место для размещения локализации.Это также позволит локализовать Silverlight и WPF UI из одной и той же модели представления. –

+5

Я должен не согласиться с Питом Дэвисом. Локализация принадлежит представлению, а не модели представления. Модель представления не должна беспокоиться о том, как представление хочет представить себя. И локализация - это просто способ представления представления на альтернативных языках. –

6

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

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

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

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

Просто убедитесь, что ваш доступ к ресурсам изменен, является общедоступным, а не внутренним. – midspace

9

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

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

+0

+1 для статьи Рика Страхоля. Это хорошо. На самом деле система привязки не привязана к существующей культуре потока пользовательского интерфейса, но в этой статье рассказывается, как устранить эту проблему среди прочего. Хороший выбор. –

+0

+1 очень полезный ответ. Спасибо за статью – gyurisc

1

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

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

<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 Локализация Руководство авторством Рик Strahl и Мишель Леру Бустаманте здесь: http://wpflocalization.codeplex.com/. Загрузите руководство с этого сайта, где этот метод подробно описан в форме документа и с образцом приложения.

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

1

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

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

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