Qt有一套机制可以将程序中用户可见的文字翻译为某一国家或地区的语言。这套机制主要涉及到了三个工具:lupdate、lrelease及Linguist。两个函数:tr()函数及qsTr()函数。以及QTranslator类。接下来说一下他们各自的功能及使用方法。
一、国际化工具的功能及使用方法
1、lupdate的功能及使用方法
lupdate用于生成和更新.ts文件。(.ts文件是一个xml文件。它包含了程序中所有需要翻译的短语)。lupdate工具在首次运行时会生成.ts文件,并程序中用tr()或qsTr()函数包裹的短语输出到.ts文件中。在后续运行时,lupdate工具会根据程序中的修改,更新.ts文件中的内容。
lupdate工具需要采用命令行方式运行(lupdate在Qt安装目录的bin文件夹中)。可以采用如下命令运行lupdate工具:
lupdate application.pro
采用这种方式运行lupdate,lupdate会对.pro文件中列出的所有源文件、头文件 以及资源文件进行检索,并根据.pro文件中TRANSLATIONS变量列出的文件名称生成.ts文件。
.pro文件应该在SOURCES 、 HEADERS及RESOURCE变量中列出工程中所有文件。并在TRANSLATIONS变量中列出所有.ts文件名称。例如如下.pro文件所示:
HEADERS = main-dlg.h \
options-dlg.h
SOURCES = main-dlg.cpp \
options-dlg.cpp \
main.cpp
FORMS = search-dlg.ui
TRANSLATIONS = superapp_dk.ts \
superapp_fi.ts \
superapp_no.ts \
superapp_se.ts
对以上.pro文件运行lupdate工具,会生成4个.ts文件。这4个文件与.pro文件在同一个目录中。
2、Linguist的功能及使用方法
用lupdate工具生成的.ts文件是没有翻译内容的。具体的翻译内容需要使用Linguist工具进行输入。Linguist工具是一个可视化编辑工具,它可以打开.ts文件,并对其进行编辑。(Linguist也在Qt安装目录下的bin文件夹内)。Linguist工具界面如下图所示:
在左侧上下文界面中列出了所有上下文(上下文会在后面小结中介绍),字符串界面会列出当前上下文中需要翻译的所有字符串。在翻译界面中可以输入对应的翻译文字。编辑好后点击确认按钮完成编辑。工具会在字符串界面对应字符串左侧显示不同颜色的对勾。绿色对勾表示没有问题,其他颜色的对勾表示输入有误。都编辑好后,点击保存完成编辑。
此外,按照Qt官方文档中说明,需要对地区信息进行设置。如果按照标准格式命名.ts文件,工具会自动识别翻译文件地区信息。否则需要手动指定。
3、lrelease工具的功能及使用方法
.ts文件无法直接被Qt程序使用。Qt程序使用的翻译文件格式为.qm文件。.qm文件是一个支持快速检索的二进制文件。通过lrelease工具可以将.ts文件转为.qm文件。
lrelease工具也在Qt安装目录下的bin文件夹内。lrelease工具也需要采用命令行方式运行。运行方式如下所示:
lrelease.exe main_en.ts languages\main_fr.ts
运行以上命令会生成main_en.qm及main_fr.qm文件。生成的文件与.ts文件在相同目录中。
二、tr()函数qsTr()函数的功能
在C++程序中调用tr()函数或者在qml程序中调用qsTr()函数,会调用应用程序中安装的翻译对象(QTranslator类的对象)对字符串进行翻译,并返回对应的翻译字符串。每个包含Q_OBJECT宏的类都具有自己的tr()函数。调用tr()函数时,tr()函数所属的对象的类名就是tr()函数包裹短语的上下文。调用qsTr()函数时,qsTr()函数所属的component的名称就是qsTr()函数包裹短语的上下文。
三、QTranslator类的创建及安装
通过调用QTranslator类的load()函数可以对.qm文件进行加载。通过调用QCoreApplication::installTranslator()函数可以对QTranslator对象进行安装。QCoreApplication子类对象可以安装多个translator。调用tr()函数或qsTr()函数时,采用反序方式进行查询。也就是说最早安装的translator最后被查询,最晚安装的translator最先被查询。示例代码如下所示:
translatorP=new QTranslator();
assert(translatorP);
if(!translatorP)
return false;
if(!translatorP->load(":/translations/TestPlayer_zh_CN.qm"))
return false;
app.installTranslator(translatorP);
在这里需要注意的是,需要在创建窗体之前,或者说在调用tr()函数及qsTr()函数之前对translator对象进行安装。
有些程序需要在运行期间对显示文字进行翻译。对这种情况处理方式也比较简单,首先安装对应的translator对象,之后依次调用tr()函数或qsTr()函数对显示文字进行刷新。每当安装了一个新的translator对象时,QCoreApplication子类对象会发送一个changeEvent事件,QWidget子类可以在event handler中对事件进行处理(调用tr()函数)。