MVVM 灯光和运行时本地化更改

Pio*_*trK 2 c# wpf localization mvvm mvvm-light

在 MVVM Light WPF 应用程序中实现运行时本地化更改功能的正确方法是什么?我正在使用基于资源的本地化(.resx 文件),我希望几乎可以随时更改语言环境。

我虽然在第一次约在做全局属性App.xaml.csLocalizationChanged每个查看有线了事件,但这种违反MVVM至少两个规则:没有在后台代码和耦合View类在一起,因为他们会在App类中依赖(这将更难对它们进行单元测试)

另一个想法是创建ILocalizableModel将由LocalizableModel类实现的全局接口(在运行时通过 mvvm light magic 注入),然后提供接口来注册LocalizationChanged事件和设置新本地化的方式(可能还有一些其他功能,例如枚举可用的本地化)。该事件将在 ViewModel 类中触发并请求它们更新所有属性。这还有另一个问题:某些视图数据(如列表)必须重新创建才能更新。在 ViewModel 中处理强特定于视图的代码似乎也有点扭曲。

另一个想法是在模型中使用观察者模式或自动属性。

但是什么是“正确”的 MVVM 方法呢?

Mar*_*man 5

我花了数周时间对此进行研究,得出的结论是 resx 文件不是 WPF/MVVM 的最佳解决方案。我发现的最佳解决方案是使用自定义标记扩展,它允许您像这样声明 XAML:

<TextBlock Text="{Translate 'Hello World!'}" />
Run Code Online (Sandbox Code Playgroud)

这提供了许多好处:

  1. 您仍然可以用您的母语编写 XAML,原始字符串构成用于索引本地化表的键。
  2. 您可以编写一个简单的实用程序来解析所有 XAML 并将关键字符串提取到一个表中,然后您可以将其提供给您的翻译人员(此外,在您等待正确的翻译时很容易粘贴到 Google 翻译中)。
  3. 您可以即时更改当前语言,所有绑定都会立即更新。