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

本地化基于MVVM的WPF应用程序,wpf,mvvm,localization,Wpf,Mvvm,Localization,对基于MVVM的WPF联盟进行本地化的好方法是什么,它可以在运行时更改其语言?当然,我可以在ViewModel中为视图中某个位置显示的每个字符串创建一个字符串属性,但这对我来说似乎相当乏味。是否有一种通用的方法/最佳实践?。也许你可以利用这一点?不幸的是,我认为在运行时更改用户界面语言有些困难,您可能需要提出自己的方案 此外,由于视图模型与UI无关,我认为在视图模型中存储用户界面字符串不是一个好的解决方案。这些字符串属于视图。您可以将它们存储在程序集的资源中,并使用x:Static: <T

对基于MVVM的WPF联盟进行本地化的好方法是什么,它可以在运行时更改其语言?当然,我可以在ViewModel中为视图中某个位置显示的每个字符串创建一个字符串属性,但这对我来说似乎相当乏味。是否有一种通用的方法/最佳实践?

。也许你可以利用这一点?不幸的是,我认为在运行时更改用户界面语言有些困难,您可能需要提出自己的方案


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

您可以将它们存储在程序集的资源中,并使用
x:Static
:

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

以下是几篇可能会引起兴趣的文章:

这里有一个例子。它涉及微软支持的本地化技术和一些替代技术


我不推荐本地化的“官方”解决方案。。。使用它真的很痛苦,它修改了XAML(为每个可以本地化的元素添加x:Uid属性),而且MS没有好的工具使它成为一个简单的解决方案。好的旧resx本地化更易于使用,只需一些技巧(即标记扩展和/或附加属性)就可以很好地与WPF集成。此外,由于绑定系统,您可以在运行时轻松更改界面语言。

您可以使用自定义标记扩展来查找本地化值,并在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本地化指南:。从该站点下载指南,该站点以文档形式详细描述了该技术,并提供了一个示例应用程序


这种方法的另一个很好的优点是它在设计器中工作。

如果您几乎对这个主题感兴趣,您可以看看我在codeplex上开发的库


本地化库:

考虑到视图模型是视图的模型,我个人认为这是放置本地化的最佳位置。这也将允许来自同一视图模型的本地化silverlight和WPF UI。我不同意Pete Davis的观点。本地化属于视图,而不是视图模型。视图模型不必担心视图希望如何显示自己。而且,本地化只是视图以其他语言呈现的一种方式。这个不错。实际上,绑定系统本身并不遵循当前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}" />