1

在阅读了 CodeProject 中非常好的WPF 全球化教程之后,我计划在我自己的项目中应用相同的技术。

本教程展示了如何为某些默认语言创建Strings.resx包含命名字符串,并建议复制整个.resx文件,在文件名中添加一些本地化代码,并将字符串翻译成目标语言。

这样,Strings.resx将包含一个名为name_entry_labelvalue的寄存器Write your name,并且同名的寄存器 inStrings.pt-BR.resx将具有 value Escreva seu nome,依此类推,适用于任何其他语言。

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

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

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

4

3 回答 3

2

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

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

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

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

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

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

于 2013-01-31T18:45:32.980 回答
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
         }
}

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

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

我还没有实现它,所以我不能谈论性能(它是一个包含所有内容的静态类,应该会更好),但我没有找到其他好的解决方案(与将所有东西放在一个地方相比并不那么简单)。乍一看,“手动”完成这一切似乎是一场噩梦,但拥有几个不相关的表的替代方案对我来说更加可怕。

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

于 2013-01-31T17:46:15.253 回答
1

只是为了提高知名度,我将在此处发布 hbarck 的链接:

CodePlex 的 resx 管理器工具

这是一个非常轻量级和直接的应用程序,可以使用项目的 resx 文件创建 XML,并将它们放入一个漂亮的 Excel 文件中,每种语言都放在一个列中,并为每个子项目的文件提供一个工作表。

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

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

希望这对其他人也有帮助!

于 2013-01-31T23:49:47.717 回答