基于文本 ID 的翻译
文本 ID 翻译机制是一种用于国际化和本地化的工业级系统。应用程序中的每个文本都有一个唯一的标识符(文本 ID),您可以在源代码中使用它来代替文本。这使得管理大量翻译文本变得更加容易。
使用文本 ID 进行国际化
使用文本 ID 代替纯文本时,应用程序国际化的一般方法相同,但细节略有不同:
- 基于文本 ID 的翻译系统的函数和宏与纯文本系统不同。你可以使用 qsTrId() 函数代替 qsTr(),使用QT_TRID_NOOP() 宏代替QT_TR_NOOP() 和QT_TRID_N_NOOP() 宏代替QT_TR_N_NOOP()) 。
- 使用文本 ID 作为用户界面字符串,而不是纯文本字符串。例如
qsTrId("id-back-not-front")
- 不能用文本 ID 指定上下文参数,因此拼写相同但含义不同的单词需要单独的文本 ID。例如,
qsTrId("id-back-backstep")
可区分Back-step Back和id-back-not-front
Back。 - 由于基于文本 ID 的翻译不允许使用上下文名称,因此Qt Linguist 列出了文件中的 ID,但没有上下文名称。
- 您在开发版用户界面中看到的工程英语文本用
//%
注释表示。如果不包含该注释,用户界面中将显示文本 ID。这一点在包含参数的文本中尤为重要。//%
注释需要包含字符串中的参数指示符。例如//% "Number of files: %1"
- 在纯文本系统中,为译员提供额外信息的
//:
注释是可选的。但是,在基于文本 ID 的系统中,这些额外信息就变得非常重要,因为如果没有这些信息,就只有文本 ID,译员可能无法在没有进一步上下文的情况下进行合理的翻译。您可以使用长的描述性文本 ID,也可以不使用注释,但注释通常更容易理解。
下面的并排代码片段比较了基于文本 ID 的翻译和基于纯文本的翻译:
基于文本 ID | 基于纯文本 |
---|---|
Text { id: backTxt; //: The back of the object, not the front //% "Back" //~ Context Not related to back-stepping text: qsTrId("id-back-not-front"); } | Text { id: backTxt; //: The back of the object, not the front //~ Context Not related to back-stepping text: qsTr("Back","Not front") } |
使用文本 ID 进行本地化
使用文本 ID 进行本地化的过程与纯文本大致相同。
使用lupdate工具生成添加翻译的 TS 文件。翻译文件中的源值将是文本 ID 而非纯文本,因此您需要描述性文本 ID 或良好的附加注释,或两者兼而有之,以确保翻译准确无误。
上述基于文本 ID 的用户界面文本示例会在 .ts 文件中产生以下内容:
<message id="id-back-not-front"> <source>Back</source> <extracomment>The back of the object, not the front</extracomment> <translation type="unfinished"></translation> <extra-Context>Not related to back-stepping</extra-Context> </message>
如果给定文本没有可用的译文(通常在开发后期才会出现这种情况),用户界面中将显示文本 ID 而不是正确的文本。为了使应用程序在测试时更可用,您可以让lrelease
使用工程英语源文本(来自//%
注释)作为翻译文本,并用一些指示符(如感叹号 (!) )标记,这样您就可以看到尚未翻译的文本。
分组基于 ID 的翻译
您可以为每个基于 ID 的翻译指定一个标签,以便将大型项目中基于 ID 的条目组织成更小的组。要为基于 ID 的条目分配标签,请添加//@
注释,命名标签,例如在 C++ 中:
//% "Open file" //@ FileOperations qtTrId("msg.open");
或在 QML 中:
//% "Open file" //@ FileOperations qsTrId("msg.open");
打开 TS 文件时 Qt Linguist中打开 TS 文件时,具有相同标签的基于 ID 的条目会被分组在一起,这与按上下文分组的基于文本的条目类似。任何没有标签的条目都显示在<unnamed label>
下。
注意: 标签名称对查找或唯一性没有影响:ID 保持全局唯一,仍可通过qtTrId("msgid")
加载,无需引用标签。标签仅用于改进翻译器的导航,不会改变运行时的行为。
CMake 配置
使用 CMake 构建时,.ts 文件应使用前缀qml_
。例如,qml_en.ts
。在 CMakeLists.txt 文件中,添加qt_add_translations函数,将 *.ts 文件列为TS_FILES
的值,并将 RESOURCE_PREFIX 设置为项目 main.qml 文件的 URI,后跟 /i18n:
qt_add_translations(${CMAKE_PROJECT_NAME} TS_FILES i18n/qml_de_DE.ts i18n/qml_en_US.ts RESOURCE_PREFIX Main/i18n )
与 qmake 配合使用
对于针对大量本地语言的项目,你可以删除 .pro 文件中的 TRANSLATIONS 信息,而用一个单独的脚本来管理翻译。脚本可以为每个目标调用lrelease
和lupdate
。
更新脚本可以这样编写:
lupdate -recursive <project-dir> -ts <project-dir>/i18n/myapp-text_en_GB.ts lupdate -recursive <project-dir> -ts <project-dir>/i18n/myapp-text_en_US.ts ...
生成最终 .qm 文件的脚本可以这样编写:
lrelease <project-dir>/i18n/myapp-text_en_GB.ts lrelease <project-dir>/i18n/myapp-text_en_US.ts ...
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.