gpt4 book ai didi

c# - MVVM light 和运行时本地化更改

转载 作者:太空宇宙 更新时间:2023-11-03 23:18:02 30 4
gpt4 key购买 nike

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

我虽然一开始是关于在 App.xaml.cs 中使用 LocalizationChanged 事件在每个 View 中连接的全局属性,但这至少违反了 MVVM 的两个规则:代码隐藏中没有代码并将 View 类耦合在一起,因为它们将依赖于 App 类(对它们进行单元测试会更难)

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

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

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

最佳答案

我花了数周时间对此进行研究,得出的结论是 resx 文件不是 WPF/MVVM 的最佳解决方案。我找到的最佳解决方案是使用 a custom markup extension它允许您像这样声明 XAML:

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

这提供了许多好处:

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

关于c# - MVVM light 和运行时本地化更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36595646/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com