基于文本 ID 的翻译

文本 ID 翻译机制是一种用于国际化和本地化的工业级系统。应用程序中的每个文本都有一个唯一的标识符(文本 ID),您可以在源代码中使用它来代替文本。这使得管理大量翻译文本变得更加容易。

注意: 您必须在一个应用程序中只使用基于纯文本或基于文本 ID 的功能。如果混合使用,最终将导致要翻译的文本不完整。

使用文本 ID 进行国际化

使用文本 ID 代替纯文本时,应用程序国际化的一般方法相同,但细节略有不同:

  1. 基于文本 ID 的翻译系统的函数和宏与纯文本系统不同。您可以使用qsTrId() 函数代替 qsTr(),使用QT_TRID_NOOP() 宏代替QT_TR_NOOP() 和QT_TRID_N_NOOP() 宏代替QT_TR_N_NOOP()) 。
  2. 使用文本 ID 作为用户界面字符串,而不是纯文本字符串。例如qsTrId("id-back-not-front")
  3. 不能用文本 ID 指定上下文参数,因此拼写相同但含义不同的单词需要单独的文本 ID。例如,qsTrId("id-back-backstep") 可区分Back-step Backid-back-not-front Back
  4. 由于基于文本 ID 的翻译不允许使用上下文名称,因此Qt Linguist 列出了文件中的 ID,但没有上下文名称。
  5. 您在开发版用户界面中看到的工程英语文本用//% 注释表示。如果不包含该注释,用户界面中将显示文本 ID。这一点在包含参数的文本中尤为重要。//% 注释需要包含字符串中的参数指示符。例如//% "Number of files: %1"
  6. 在纯文本系统中,为译员提供额外信息的//: 注释是可选的。但是,在基于文本 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>

使用lrelease 时,需要指定翻译文本的键基于文本 ID,而不是纯文本。如果在代码中使用qsTr() 将字符串标记为可翻译字符串,则不会设置id 属性,lrelease 也会忽略这些字符串。

但是,如果给定文本没有可用的翻译(通常在开发后期才会出现这种情况),那么用户界面上显示的将是文本 ID,而不是正确的文本。为了使应用程序在测试时更可用,您可以让lrelease 使用工程英语源文本(来自//% 注释)作为翻译文本,并用一些指示符(如感叹号 (!) )标记,这样您就可以看到尚未翻译的文本。

CMake 配置

使用 CMake 构建时,.ts 文件应使用前缀qml_ 。例如,qml_en.ts 。在 CMakeLists.txt 文件中,添加qt_add_translations函数,将 *.ts 文件列为TS_FILES 的值,将 RESOURCE_PREFIX 设为项目 main.qml 文件的 URI,后跟 /i18n,并将LRELEASE_OPTIONS 设为-idbased

qt_add_translations(${CMAKE_PROJECT_NAME}
    TS_FILES i18n/qml_de_DE.ts i18n/qml_en_US.ts
    RESOURCE_PREFIX Main/i18n
    LRELEASE_OPTIONS -idbased
)

与 qmake 配合使用

对于针对大量本地语言的项目,你可以删除 .pro 文件中的 TRANSLATIONS 信息,而用一个单独的脚本来管理翻译。脚本可以为每个目标调用lreleaselupdate

更新脚本可以这样编写:

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 -idbased <project-dir>/i18n/myapp-text_en_GB.ts
lrelease -idbased <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.