【发布时间】:2012-01-16 18:43:39
【问题描述】:
有没有一种方法可以将 QT 应用程序翻译成不同的语言,而无需直接在源代码中定义文本?我想将文本与源代码分开。这将导致所有语言的某种资源文件,包括默认语言(例如英语)。
【问题讨论】:
标签: qt translation
有没有一种方法可以将 QT 应用程序翻译成不同的语言,而无需直接在源代码中定义文本?我想将文本与源代码分开。这将导致所有语言的某种资源文件,包括默认语言(例如英语)。
【问题讨论】:
标签: qt translation
您也许可以使用QT_TRANSLATE_NOOP 系列宏来做您想做的事。这些只是将某些文本标记为“需要翻译”,以便lupdate 将其提取出来,但您可以通过代码中的变量常量来引用这些翻译后的值。所以...
const char *kHelloWorld = QT_TRANSLATE_NOOP("SomeScope", "Hello world");
稍后...
return qApp->translate("SomeScope", kHelloWorld);
这仍然在您的源代码中的某个地方,但它至少被删除了一个步骤。理论上,您可以在一个完全不同的 Qt 项目中拥有 QT_TRANSLATE_NOOP 的东西,但是您需要在您的实际项目中以 some 方式知道您应该翻译什么。 (您仍然需要 char* 常量某处。)
您想通过在源代码中不包含英文文本来准确完成什么?这可能有助于人们提供更合适的答案。
编辑
根据您在下面关于预期用途的评论
好的,那么这正是正常的 Qt 翻译过程所做的。运行 lupdate 会创建这些 XML 文件(它们具有 .ts 扩展名)。它们可以由翻译人员在非常易于使用的 Qt Linguist 中打开。它们被翻译,然后发回给您(程序员),您在其中运行lrelease 以创建您将随应用程序一起提供的二进制翻译文件。翻译在运行时解析,因此无需重新编译。
如果您想让用户这样做,您可以:
.ts 文件和lrelease 程序发送您的应用程序。lrelease 以及将二进制翻译文件放在何处以便您的应用程序将它们拉入。在这最后一步,理论上您可以提供一个很好的类似向导的应用程序,它隐藏了实现细节。
【讨论】:
您将无法将英语(或您的源语言,不一定是英语)源代码从 XML (.ts) 文件中删除,因为每次运行时 lupdate 都会将它放在那里。但是,只要存在所选语言的翻译,源文本就会被忽略。如果没有翻译文本,它将默认为源文本。这很有用,因为您可以保证在您的翻译中获得某种文本,但您的测试团队将确保翻译存在。我编写了一个 python 脚本来自动检查翻译文件,因为我们有 9 种语言和每个翻译近 1k 个字符串。为了测试这一点,我们使用了一个非常简单的 sed 脚本来创建伪本地源字符串,因此如果缺少翻译,伪本地文本将非常明显。
关于编辑 .ts 文件的过程,我们将翻译外包给各个翻译人员,为他们提供适合他们语言的 .ts 文件,并且通常会花费大约一个小时的时间来指导他们使用 QT Linguist。如果翻译人员在现场并想立即在我们的设备上查看他们的翻译,我编写了一个自动运行脚本,将生成的 .qm 文件放置在我们嵌入式文件系统中的正确位置,然后重新启动应用程序以显示新的翻译。如果它们不在现场,我们将通过上述 python 脚本运行它们以检查许多不同的问题,然后只需签入 .ts 文件,以便下次构建。
HTH
【讨论】:
我们要做的是: * 包括以前默认语言的翻译。使用此 *.ts 文件自动生成其他 *.ts 文件。这是必需的,因为我们将翻译保留在 QT 环境之外,因为它们与其他与 QT 无关的项目相匹配。
然后只需要确保这个翻译包含正确的值。
将来我们可以在代码中定义 ID,在默认翻译中代表 Text。比如将 TXT_ID_ABOUT 翻译成“关于”。
【讨论】: