本地化基于MVVM的WPF应用程序

9

如何在运行时更改语言的情况下本地化基于MVVM的WPF应用程序?当然,我可以为ViewModel中显示在View中的每个字符串创建一个字符串属性,但这似乎对我来说太繁琐了。是否有一种常见的方法/最佳实践来解决此问题?

6个回答

11

这里有一篇关于WPF本地化的优秀文章。它涉及到了微软支持的本地化技术以及一些替代方案。

我不建议使用“官方”的本地化解决方案...它真的很难用,会修改你的XAML(为每个可本地化的元素添加x:Uid属性),而且微软没有好的工具使其成为一个易于使用的解决方案。传统的resx本地化更容易使用,并且通过一些技巧(即标记扩展和/或附加属性)与WPF集成得非常好。此外,由于绑定系统的存在,您可以轻松地在运行时更改界面语言。


这篇Rick Strahl的文章很不错,确实讲得很好。实际上,绑定系统并没有本地支持当前UI线程的文化,但是这篇文章告诉你如何解决这个问题以及其他一些问题。不错的选择。 - Anderson Imes

9

WPF有很好的本地化支持,也许您可以利用它?不幸的是,我认为在运行时更改用户界面语言有些困难,您可能需要自己想出方案。

此外,由于视图模型与UI无关,我认为将用户界面字符串存储在视图模型中不是一个好的解决方案。这些属于视图。


3
考虑到视图模型是视图的模型,我个人认为这是放置本地化的完美位置。这也将使得来自同一视图模型的本地化Silverlight和WPF UI成为可能。 - Pete Davis
7
我不同意Pete Davis的观点。本地化属于视图,而非视图模型。视图模型不应该担心视图想要如何呈现。本地化只是视图以替代语言呈现自己的一种方式。 - myermian

6

不要将用户界面字符串存储在视图模型中,而应该将它们存储在程序集的资源中,并使用 x:Static 直接从 XAML 中访问它们:

<TextBlock Text="{x:Static props:Resources.MyLabel}"/>

props 命名空间应该指向您程序集的 Properties 命名空间:

xmlns:props="clr-namespace:My.Assembly.Properties"

请确保您的资源访问修饰符为Public,而不是Internal。 - midspace

1

您可以使用自定义标记扩展来查找本地化值,并在 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}" />

这个例子是从Rick Strahl和Michele Leroux Bustamante在这里编写的优秀的WPF本地化指南中选取的:http://wpflocalization.codeplex.com/。您可以从该网站下载指南,了解这种技术的详细说明以及一个示例应用程序。
这种方法的另一个好处是它可以在设计师中使用。

1

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接