MVVM light и изменение локализации во время выполнения

Как правильно реализовать функцию изменения локализации во время выполнения в приложении MVFM Light WPF? Я использую локализацию на основе ресурсов (файлы.resx) и хочу иметь возможность менять локаль практически в любой момент.

Я хотя сначала о создании глобальной собственности в App.xaml.cs с LocalizationChanged событие связано в каждом представлении, но это нарушает как минимум два правила MVVM: отсутствие кода в выделенном коде и связывание класса представления вместе, поскольку они будут зависеть от класса приложения (их будет сложнее тестировать)

Другая идея заключалась в создании глобального интерфейса ILocalizableModel который будет реализован LocalizableModel класс (вводится во время выполнения с помощью mvvm light magic), который затем предоставляет интерфейс для регистрации LocalizationChangedсобытие и способ установить новую локализацию (и, возможно, некоторые другие функции, такие как перечисление доступных локализаций). Событие будет запускаться в классах ViewModel и запрашивать их обновить все свойства. Это имеет еще одну проблему: некоторые данные View (например, списки) не могут быть обновлены без их воссоздания. И строгое обращение с кодом, специфичным для View, во ViewModel также кажется немного запутанной идеей.

Другая идея заключается в использовании шаблона Observator или свойства auto, связанного с Model.

Но каков "правильный", MVVM способ сделать это?

1 ответ

Решение

Я потратил много недель на изучение этого и пришел к выводу, что файл resx - не лучшее решение для WPF/MVVM. Лучшим решением, которое я нашел, было использование пользовательского расширения разметки, которое позволяет вам объявить свой XAML следующим образом:

<TextBlock Text="{Translate 'Hello World!'}" />

Это обеспечивает ряд преимуществ:

  1. Вы все еще можете написать XAML на своем родном языке, оригинальные строки образуют ключи, используемые для индексации ваших таблиц локализации.
  2. Вы можете написать простую утилиту для анализа всего XAML и извлечения ключевых строк в единую таблицу, которую вы затем можете предоставить своим переводчикам (плюс это легко вставить в Google Translate, пока вы ждете правильных переводов).
  3. Вы можете изменить текущий язык на лету, и все привязки будут обновлены немедленно.
Другие вопросы по тегам