WPF MVVM本地化c#,运行时

本文关键字:运行时 本地化 MVVM WPF | 更新日期: 2023-09-27 18:08:12

我是MVVM WPF初学者,所以我正在搜索最轻和最简单的WPF MVVM本地化解决方案,这也将在运行时工作-当程序运行时发生变化。条件是我不能使用任何nuget(或类似的)-所以只是我的代码

我在谷歌上找到了几个不错的例子:链接1链接2

如果有其他人,请提供链接。我正在寻找解决方案,在那里我可以以后添加语言而不改变代码 -所以添加Resources.xx.resx稍后到文件夹。

如有任何问题请提问。对不起,这个问题没有意义。我正在寻找用户的任何经验,任何已经达到的解决方案。

WPF MVVM本地化c#,运行时

有很多方法可以实现这一点,但是我最喜欢的方法之一是使用ResourceDictionary来声明语言资源,当然,这只适用于UI。

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:System="clr-namespace:System;assembly=mscorlib">
    ...
    <System:String x:Key="Test">Hello World</System:String>
    ...
</ResourceDictionary>
这里的技巧是为每种语言使用多个资源字典,因此您可能有另一个用于法语的资源字典。
<System:String x:Key="Test">Bonjour le monde</System:String>

注意,x:Key属性都是相同的,这将允许您使用MergedDictionaries在运行时更改资源引用。

无论如何,这里有一个使用它的例子:

<TextBlock Text="{DynamicResource Test}" ... />

您必须在App.xaml文件中使用MergedDictionaries,然后在需要时删除/添加适当的语言。有关如何做到这一点的更多信息,请参阅这里。

另外,不要忘记一些语言更喜欢它们的控件从右到左。阿拉伯语就是一个很好的例子。在这种情况下,我建议您也为此声明一个资源,像这样:
<FlowDirection x:Key="FlowDirection">RightToLeft</FlowDirection>

你的窗口可以像这样引用这个资源:

<Window ...
    FlowDirection="{DynamicResource FlowDirection}">

就像我说的,还有其他实现本地化的方法,您当然应该查看文档。

我更喜欢使用RESX文件进行WPF本地化。它支持xaml本地化,可以很容易地用于代码隐藏,包括视图模型。Resx文件是WinForms的标准解决方案,WPF Infralution也允许在wfp中使用它。

只写:

public class ViewModel
{
    public string MyString
    {
        get { return Resources.myString; }
    }
}

它将返回与当前CultureInfo一致的字符串。如果没有找到本地化文件或没有这样的资源,将使用默认的resx文件。

希望能有所帮助

我使用带有自定义名称空间的自定义标记扩展,它允许我这样编写XAML:

<Label Content="{Translate 'First Name:'}" />

我还有一个实用程序,它从我的XAML中提取这些绑定的所有出现情况,并将其放入一个电子表格中供翻译人员使用,还有一个实用程序将翻译结果转换为XML文件。每种语言的XML然后被添加到一个语言包中,这是一个MEF插件;每个文件都被添加到一个自定义的ResourceDictionary中,这个ResourceDictionary用[Export]属性进行了装饰,允许我们在应用程序发布后发布更新和/或新的语言包。