如何在运行时更改语言的情况下本地化基于MVVM的WPF应用程序?当然,我可以为ViewModel中显示在View中的每个字符串创建一个字符串属性,但这似乎对我来说太繁琐了。是否有一种常见的方法/最佳实践来解决此问题?
如何在运行时更改语言的情况下本地化基于MVVM的WPF应用程序?当然,我可以为ViewModel中显示在View中的每个字符串创建一个字符串属性,但这似乎对我来说太繁琐了。是否有一种常见的方法/最佳实践来解决此问题?
这里有一篇关于WPF本地化的优秀文章。它涉及到了微软支持的本地化技术以及一些替代方案。
我不建议使用“官方”的本地化解决方案...它真的很难用,会修改你的XAML(为每个可本地化的元素添加x:Uid属性),而且微软没有好的工具使其成为一个易于使用的解决方案。传统的resx本地化更容易使用,并且通过一些技巧(即标记扩展和/或附加属性)与WPF集成得非常好。此外,由于绑定系统的存在,您可以轻松地在运行时更改界面语言。
WPF有很好的本地化支持,也许您可以利用它?不幸的是,我认为在运行时更改用户界面语言有些困难,您可能需要自己想出方案。
此外,由于视图模型与UI无关,我认为将用户界面字符串存储在视图模型中不是一个好的解决方案。这些属于视图。
不要将用户界面字符串存储在视图模型中,而应该将它们存储在程序集的资源中,并使用 x:Static
直接从 XAML 中访问它们:
<TextBlock Text="{x:Static props:Resources.MyLabel}"/>
props
命名空间应该指向您程序集的 Properties
命名空间:
xmlns:props="clr-namespace:My.Assembly.Properties"
您可以使用自定义标记扩展来查找本地化值,并在 UI 文化更改时更新它们。
以下是一个示例,说明如何实现此功能:
<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}" />
如果你对这个主题感兴趣,可以看看我在CodePlex上正在开发的库。
LocalizationLibrary: http://localizationlibrary.codeplex.com/