是否可以在包含本地化字符串的WPF ResourceDictionary(.resx)中设置多个值(每种语言一个)?

时间:2013-01-31 16:45:07

标签: wpf localization internationalization resourcedictionary

在阅读了非常好的Globalization tutorial for WPF in CodeProject之后,我计划在我自己的项目中应用相同的技术。

本教程展示了如何为某些默认语言创建包含命名字符串的Strings.resx,并建议对整个.resx文件进行DUPLICATE,在文件名中添加一些本地化代码,并将字符串转换为目标语言。

这样,Strings.resx将包含一个名为name_entry_label的寄存器,其值为Write your nameStrings.pt-BR.resx中同名的寄存器的值为Escreva seu nome ,等等任何其他语言。

我发现的问题是:如果您在其中一个资源文件中添加了一个寄存器,则其他资源不会更新。它们要求手动控制条目,这是愚蠢,重复和容易出错。

在我看来,最合乎逻辑的方法是拥有一个表资源字典,每个名称每列包含一个值,每列对应一个给定的语言。另一种方式是每个resx文件将是“主”文件的视图,这将使视图保持同步。不过,我不知道是否有可能获得任何这些行为。

非常感谢有关如何获得所描述行为的任何帮助(记录始终在不同的语言资源之间保持同步),感谢阅读。

3 个答案:

答案 0 :(得分:2)

您可以执行以下操作之一:

获取像TortoiseMerge(随TortoiseSVN一起提供)的合并工具,将每种语言的resx文件与主文件(例如中性语言的resx文件)进行比较,并使用该工具在本地化文件中创建缺少的条目。然后,您可以在VS resx编辑器中编辑本地化文件以添加正确的翻译。

或者:如果TortoiseMerge不能完成这项工作,请编写一个小程序,使用XPath查找主resx中的资源元素,将它们映射到不同语言文件中的对应元素,然后复制丢失的资源元素。这样,您甚至可以清空文本,以便稍后编辑您需要编辑的条目。由于resx文件的命名约定非常严格,您可以将其作为批处理程序并将其作为工具菜单中的外部工具添加到VS.

或者:创建一个主XML文件,其中包含每个条目的元素和每种语言的子元素,因此原始术语及其翻译被分组在一起。然后,使用XSLT为每种语言创建resx文件。

或者:创建一个表,其中包含数据库中键,语言和翻译的列,并使用SQL为本地化语言中的缺失键创建空条目,然后从表中生成resx文件。您甚至可以直接使用这样的表进行本地化,而根本不使用resx文件。

无论如何,我强烈建议不要使用每种语言一列的设计:我们已经在我们的一个应用程序中以这种方式完成了它,它会回来并且因为我们想要添加更多语言而咬我们。我可能会选择带有同步resx条目的批处理程序的选项,这似乎是编程工作和易用性之间的最佳折衷。

答案 1 :(得分:1)

我遵循相同的教程,我遇到了同样的问题...如果您查看解决方案资源管理器,打开Strings.resx的节点,您将找到一个名为Strings.Designer.cs的自动生成的类。

这只是一个静态类,有一些简单的方法可以选择从你要求公共name_entry_label时获取正确字符串的位置。

我的想法:我将当前语言保存为设置,因此它适用于我的所有应用。我可以使用所有已翻译的字符串创建自定义静态类,并在检索正确的字符串之前使这些字符串检查设置中的文化。类似的东西:

public static string WriteYourName_Label
{ 
    get
        {
          switch(currentLanguage) //currentLanguage should be the definition in the Settings (a string for me), a private field in the static class that gets the culture and returns something useful

             case en-US: return "Write your name";
             case es-ES: return "Escriba su nombre";
             default: return "Escreva seu nome"; //portuguese by default
         }
}

优点:您在一个文件中拥有所有不同的语言,并且每个翻译都在另一个文件旁边(不在单独的文件中)。

问题:你松开了漂亮的“表格”编辑器,这只是代码。如果你添加一种新语言,你必须为你的所有字符串创建一个新的案例(这不是一个问题,因为你无论如何都必须创建一个新的资源字典。)

我还没有实现它所以我不能谈论性能(这是一个内部一切的静态类,应该更好),但我没有找到其他好的解决方案(与在一个地方拥有一切相比并不那么简单) )。乍看之下,所有“手动”看起来都像是一场噩梦,但是对于我来说,拥有几张不相关的桌子的选择更加可怕。

我真的希望有人发布一个比我好得多的答案,我会很高兴。祝你好运!

答案 2 :(得分:1)

为了提高可见性,我将在此处发布hbarck的链接:

resx Manager Tool at CodePlex

这是一个非常轻量级和简单易用的应用程序,它使用项目的resx文件创建XML,并将它们放在一个漂亮的Excel文件中,每个语言都在一列中,每个子项目的文件都有一个表格。

警告:在Excel中打开文件时,请对“仍然打开”对话框说“是”。保存时说NO“转换?”对话框(保留Excel XML 2003格式,否则您很难将翻译恢复到项目中)。

有关说明,请参阅CodePlex上的文档。如果您有任何问题,请不要向我哭泣,我只是发布链接:-P

希望这也有助于其他人!