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!'}" />
Это обеспечивает ряд преимуществ:
- Вы все еще можете написать XAML на своем родном языке, оригинальные строки образуют ключи, используемые для индексации ваших таблиц локализации.
- Вы можете написать простую утилиту для анализа всего XAML и извлечения ключевых строк в единую таблицу, которую вы затем можете предоставить своим переводчикам (плюс это легко вставить в Google Translate, пока вы ждете правильных переводов).
- Вы можете изменить текущий язык на лету, и все привязки будут обновлены немедленно.