Локализация приложений 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/
вот несколько статей, которые могут представлять интерес:
локализация приложений WPF с помощью Locbaml