基于文本ID的翻译
文本ID翻译机制是国际化本地化的工业强度系统。应用程序中的每个文本都有一个唯一的标识符(文本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将在用户界面中显示。这在您有带有参数的文本时尤其重要。在//%
注释中需要包含字符串中的参数指示符。例如,//% "文件数量: %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>
当使用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信息,而是使用单独的脚本管理翻译。该脚本可以为每个期望的目标调用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 -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公司的商标,/或其他国家的全球商标。所有其他商标都是其各自所有者的财产。