基于文本ID的翻译

文本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-frontBack
  4. 在开发版本的界面中看到的工程英文文本用 //% 注释标记。如果您不包含它,文本ID将在用户界面中显示。这在您有带有参数的文本时尤其重要。在 //% 注释中需要包含字符串中的参数指示符。例如,//% "文件数量: %1"
  5. 为翻译者提供额外信息的 //: 注释在纯文本系统中是可选的。然而,在基于文本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的值设置为项目主.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
...

© 2024 Qt公司有限公司。包含在内的文档贡献是各自所有者的版权。提供的文档是根据自由软件基金会上发表的GNU自由文档许可证版本1.3的条款许可的。Qt和相应的标志是芬兰的Qt公司的商标,/或其他国家的全球商标。所有其他商标都是其各自所有者的财产。