在代码中无需文本翻译QT应用程序

时间:2011-12-12 16:03:10

标签: qt translation

有没有办法将QT应用翻译成不同的语言,而无需直接在源中定义文本?我想将文本与源文件分开。这将导致所有语言的某种资源文件,包括默认语言(例如英语)。

3 个答案:

答案 0 :(得分:0)

您可以使用QT_TRANSLATE_NOOP系列宏来执行您想要的操作。这些只是将某些文本标记为“需要翻译”以便lupdate选择它,但您可以通过代码中的变量常量来引用这些翻译的值。所以...

const char *kHelloWorld = QT_TRANSLATE_NOOP("SomeScope", "Hello world");

后来......

return qApp->translate("SomeScope", kHelloWorld);

这仍然在您的源代码中,但至少删除了一步。理论上你可以在一个完全不同的Qt项目中拥有QT_TRANSLATE_NOOP内容,但是你需要在你的真实项目中使用一些方式来了解你应该翻译的内容。 (你仍然需要char *常量某处。)

如果没有源文件中的英文文本,你想要完成什么?这可能有助于人们提供更合适的答案。

修改

根据您在下面关于预期用途的评论

好的,这正是正常的Qt翻译过程所做的。运行lupdate会创建这些XML文件(它们的扩展名为.ts)。翻译人员可以在非常易于使用的Qt语言学家中打开它们。它们被翻译,然后发送回给你(程序员),在那里你运行lrelease来创建你将随应用程序一起提供的二进制翻译文件。翻译在运行时解析 ,因此无需重新编译。

如果您想让用户执行此操作,您可以:

  • 使用空(未翻译).ts文件和lrelease程序发送您的应用程序。
  • 提供有关如何使用Qt Linguist进行翻译的说明。 (他们可以使用文本编辑器直接修改Xml,但使用Linguist会更容易。)
  • 说明如何运行lrelease以及删除二进制翻译文件的位置,以便您的应用程序将其拉入。

在最后一步,理论上你可以提供一个很好的类似向导的应用程序来隐藏实现细节。

答案 1 :(得分:0)

您将无法从XML(.ts)文件中保留英语(或您的源语言,不一定是英语)源,因为lupdate会在每次运行时将其放在那里。但是,只要所选语言存在翻译,源文本将被忽略。如果没有翻译文本,则默认为源文本。这很有用,因为您可以保证在翻译中获得某种文本,但是您的测试团队应该确保翻译存在。我编写了一个python脚本来自动检查翻译文件,因为我们有9种语言,每次翻译有近1k个字符串。为了测试这个,我们使用一个非常简单的sed脚本来创建伪loc源代码串,因此如果缺少翻译,伪loc文本就会非常明显。

关于编辑.ts文件的过程,我们将翻译归档到各个翻译人员,为他们的语言提供.ts文件,通常使用QT语言学家的教学时间约为一小时。如果译员在现场并希望立即在我们的设备上看到他们的翻译,我写了一个自动运行脚本,将生成的.qm文件放在嵌入式文件系统中的正确位置,然后重新启动应用程序以显示新的翻译。如果它们不在现场,我们将通过上面提到的python脚本运行它们以检查许多不同的问题,然后只需检查.ts文件,以便下次构建它。

HTH

答案 2 :(得分:0)

我们将做的是: *包括以前默认语言的翻译。使用此* .ts文件自动生成其他* .ts文件。这是必需的,因为我们将翻译保持在QT环境之外,因为它们与其他与QT无关的项目匹配。

然后只需要确保此翻译包含正确的值。

将来我们可以在默认翻译中代表Text的代码中定义ID。就像将TXT_ID_ABOUT翻译为“关于”。