将Qt中非源代码文件的字符串翻译

10
我有一个使用XML文件的Qt项目。这些XML文件包含可读的文本,应该使用Qt工具(lupdate,lrelease,QtLinguist)进行翻译。
问题是是否可以通过使用QT_TR_NOOP()宏及其相关功能,在不复制XML文件中字符串到源代码文件的情况下,通过lupdate生成.ts文件中的条目?或者说,一般来说,如何为Qt项目中的非源代码文件翻译字符串?

如果lupdate能够接受字符串/上下文对而不仅仅是文件,那就太好了;这样一来,我们就可以将这些内容包含在构建系统中。 - Joey
我找到了一种更简单的方法来做这件事。请查看我的答案:https://dev59.com/YIfca4cB1Zd3GeqPgkf4#28168782 - Ispas Claudiu
2个回答

7
我们曾经遇到过同样的问题:XML文件包含人类可读字符串。
我们的解决方案是确保XML文件中的人类可读字符串易于提取(我们将它们放在LABEL属性中),然后开发了一个小工具,该工具会解析XML文件、提取字符串、生成上下文(通过从XML文件中提取数据),最后生成一个CPP头文件,其中包含一系列QT_TR_NOOP()
这个文件被添加到我们的项目文件(.pro)中,然后由lupdate使用。
这个解决方案对我们来说很好,但我们必须特别注意两件事:
  • 每次XML文件内容更改时都要运行此工具。
  • 确保XML文件采用UTF-8编码。

  • 那听起来像一个通用的解决方案,也适用于非 XML 文件。我会考虑类似的东西,谢谢! - Sascha
    1
    如果您将此工具发布到Github上,这会使得答案对其他人更有用。 - sashoalm

    3
    只要.qm文件有相应的翻译/上下文匹配,您就可以使用tr()在运行时翻译任何内容。它是否被lupdate提取并不重要。
    我不知道如何使lupdate从任意XML中提取字符串,但这并不意味着您不能使用linguist。
    .ts文件也是XML;将您的XML转换为.ts文件应该很容易,只需创建一个XSLT即可。如果您想针对标准而不仅仅是Qt,则lupdate(和linguist)也可以处理XLIFF文件。
    您可以拥有多个.ts文件(在设置时调用QTranslator::load多次即可)。
    如果您真的想让所有内容都在一个文件中供翻译人员使用,请确保您使用的上下文名称不会与源代码中使用的名称重复,这样就不会与许多应用程序为每个具有GUI的DLL加载.qm文件的方式有任何不同(从Qt的角度来看)。

    XSLT的想法很好,谢谢!然而,我的项目实际上更加复杂,用户可以集成包含不同用户定义模式的XML文件的插件。现在,如何将XSLT转换为可读和不可读的内容?(我不确定是否可以/应该要求用户为每个XML文件提供自己的XSLT...) - Sascha
    如果您对模式一无所知,那么您希望lupdate如何知道要抓取什么?您可以提取所有非空格文本内容,甚至所有属性内容和文本节点,但这似乎很可能会产生大量垃圾供翻译人员筛选。也许让用户在元素上添加一个特殊属性,指定此文本的上下文,并仅提取这些元素的文本?类似于//*[@tr:context]/text()将选择这样的节点。 - puetzk
    是的,我在考虑使用某种约定。你的建议很有道理。 - Sascha

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