1、第第15章章 Qt 5多国语言国际化多国语言国际化基本概念基本概念0101国际化支持的实现国际化支持的实现国际化支持的实现国际化支持的实现(1)使用QString对象表示所有用户可见的文本。由于QString内部使用Unicode编码实现,所以它可以用于表示所有需要向用户呈现的文本。当然,对于仅程序员可见的文本并不需要都变为QString对象,可利用Qt提供的QCString或原始的“char*”。(2)使用tr()函数获取所有需要翻译的文本。在Qt的翻译机制下,QObject:tr()函数可以帮助程序员取得翻译之后的文本。对于从QObject继承而来的类,QObject:tr()函数最终由Q
2、MetaObject:tr()实现。在某些时候,如果无法使用QObject:tr()函数,则可以直接调用QCoreApplication:translate()取得翻译之后的字符串。(3)使用QString:arg()方法组织动态文本。有些时候,一段文本需要由一些静态文本和动态变量组合起来,如常见的情况“printf(The value of i is:%d,i)”。对于这种动态文本的翻译,由于语言习惯的问题,如果简单地采用这种连接字符串的方法,则可能会带来一些问题,如下面的字符串用于表示任务的完成情况:QString m=tr(Mission status:)+x+tr(of)+y+tr(a
3、re completed);其中,其中,x和y是动态的变量,三个字符串被x和y分隔开,它们能够被很好地编译,因为“x of y”是英语中分数的表示方法,如4 of 5是分数4/5,在不同的语言中,分子和分母的位置可能是颠倒的,在这种情况下,数字4和5的位置在翻译时无法被正确地放置。由此可见,孤立地翻译被分隔开的字符串是不行的,改进的办法是使用QString:arg()方法:QString m=tr(Mission status:%1 of%2 are completed).arg(x).arg(y);(4)利用QTranslator:load()和QCoreApplication:instal
4、lTranslator()函数读取对应的翻译之后的资源文件。翻译工作者将提供包含翻译之后的字符串的资源文件“*.qm”,程序员还需要做的是定义QTranslator对象,并使用load()函数读取相应的“.qm”文件,利用QCoreApplication:installTranslator()函数安装QTranslator对象。0202翻译工作:翻译工作:“*.qm”文件的生成文件的生成翻译工作:翻译工作:“*.qm”文件的生成文件的生成对于翻译工作者,主要是利用Qt提供的工具lupdate、linguist和lrelease(它们都可以在Qt安装目录的“bin”文件夹下找到)协助翻译工作并生
5、成最后需要的“.qm”文件,它包括以下内容。(1)利用lupdate工具从源代码中扫描并提取需要翻译的字符串,生成“.ts”文件。类似编译时用到的qmake,运行lupdate时也需要指定一个“.pro”的文件,可以单独创建这个“.pro”文件,也可以利用编译时用到的“.pro”文件,只需定义好变量TRANSLATIONS即可。(2)利用linguist工具来协助完成翻译工作,即打开前面用lupdate生成的“.ts”文件,对其中的字符串逐条进行翻译并保存。由于“.ts”文件采用了XML格式,所以也可以使用其他编辑器来打开“.ts”文件并翻译。(3)利用lrelease工具处理翻译好的“.ts
6、”文件,生成格式更为紧凑的“.qm”文件。这便是翻译工作者最终需要提供的资源文件,它所占的空间比“.ts”文件小,但基本不具有可读性,只有QTranslator能够正确地识别它。第第15章章 Qt 5多国语言国际化多国语言国际化【实例】语言国际化应用【实例】语言国际化应用0101简简 单单 测测 试试简单测试简单测试【例】【例】(简单)(CH1501)多国语言国际化。操作步骤如下。(1)新建一个GUI工程“TestHello.pro”,在UI界面上添加两个按钮,并分别将文本修改为hello、china,如图15.1所示。(2)修改“TestHello.pro”文件,添加如下代码:TRANSLA
7、TIONS=TestHello.ts(3)编译。记住,一定要先编译,如果没有编译就进行下面的步骤,则生成的“.ts”文件只是一个仅有标题栏的框架。简单测试简单测试(4)编译完成后,选择“开始”“所有程序”“Qt 5.11.1”“5.11.1”“MinGW 5.3.0(32-bit)”“Qt 5.11.1 for Desktop(MinGW 5.3.0 32 bit)”菜单项,打开命令行窗口,进入“TestHello.pro”工程目录,执行命令:lupdate TestHello.pro在工程下生成一个“.ts”文件,如果没有编译,则提示“Found 1 source text”。若已经编译,则
8、提示“Found 3 source text(s)”,如图15.2所示。简单测试简单测试(5)选择“开始”“所有程序”“Qt 5.11.1”“5.11.1”“MinGW 5.3.0(32-bit)”“Linguist”菜单项,运行Qt自带工具linguist(Qt 语言家),其主界面如图15.3所示。简单测试简单测试在主界面上选择“文件”“打开”菜单项,选择“TestHello.ts”文件,单击“打开”按钮,根据需要设置源语言和目标语言,此处为默认状态:源语言为任意国家语言,目标语言为China的Chinese,如图15.4所示。简单测试简单测试(6)在第二栏中选择要翻译的字符串,在下面两行中
9、输入对应的翻译文字,单击上面的 按钮,如图15.5所示。当翻译全部完成(这里,“MainWindow”译为“主窗口”;“hello”译为“你好”;“China”译为“中国”)后,保存退出。简单测试简单测试(7)选择“文件”“发布”菜单项,或者在命令行中输入“lrelease TestHello.pro”,生成“TestHello.qm”文件,如图15.6所示。简单测试简单测试(8)修改源代码,其中,加黑语句为需要添加的部分。具体代码如下:#includeint main(int argc,char*argv)QApplication a(argc,argv);QTranslator*trans
10、lator=new QTranslator;translator-load(D:/Qt/CH15/CH1501/TestHello/TestHello.qm);a.installTranslator(translator);MainWindow w;w.show();return a.exec();简单测试简单测试(9)运行程序,效果如图15.7所示。可以看到,此时窗体的标题和按钮文本都变为中文,说明翻译转换成功!0202选择语言翻译文字选择语言翻译文字选择语言翻译文字选择语言翻译文字【例】【例】(简单)(CH1502)用一个下拉菜单来选择语言,并且下面有一个需要翻译文字的标签。操作步骤如下。
11、(1)在头文件“LangSwitch.h”中定义LangSwitch类,创建用户界面。#include#include#include class LangSwitch:public QWidget Q_OBJECTpublic:LangSwitch(QWidget*parent=0);LangSwitch();private slots:void changeLang(int index);/(a)private:void createScreen();/(b)void changeTr(const QString&langCode);void refreshLabel();QComboBo
12、x*combo;/在界面中可以看见的下拉菜单 QLabel*label;/在界面中可以看见的标签;选择语言翻译文字选择语言翻译文字(2)源文件“LangSwitch.cpp”中的具体实现代码如下:#include langswitch.h#include#include#include LangSwitch:LangSwitch(QWidget*parent):QWidget(parent)createScreen();LangSwitch:LangSwitch()选择语言翻译文字选择语言翻译文字createScreen()函数用于创建基本的界面,其具体实现代码如下:void LangSwit
13、ch:createScreen()combo=new QComboBox;combo-addItem(English,en);/(a)combo-addItem(Chinese,zh);combo-addItem(Latin,la);label=new QLabel;refreshLabel();/设置标签的内容 QVBoxLayout*layout=new QVBoxLayout;layout-addWidget(combo,1);layout-addWidget(label,5);setLayout(layout);connect(combo,SIGNAL(currentIndexChan
14、ged(int),this,SLOT(changeLang(int);/(b)选择语言翻译文字选择语言翻译文字其中,其中,(a)combo-addItem(English,en)、combo-addItem(Chinese,zh)和和combo-addItem(Latin,la):将三个语言选项(英文、中文和拉丁文)添加到下拉菜单中,并设置三个选项的值分别为“en”、“zh”和“la”(这是ISO标准中语言的简写形式)。(b)changeLang(int):改变语言。refreshLabel()函数的具体实现如下:void LangSwitch:refreshLabel()label-setT
15、ext(tr(TXT_HELLO_WORLD,Hello World);/(a)其中,其中,(a)label-setText(tr(TXT_HELLO_WORLD,Hello World):tr()函数前一个参数是提取翻译串时用到的ID,后一个则起提供注释的作用,并且在找不到翻译串时,注释串会被采用。例如,语言设置为中文时,如果以TXT_HELLO_WORLD为ID的串在对应的“.qm”文件中找不到翻译后的字符串,则将采用后一个参数,即显示为英文。选择语言翻译文字选择语言翻译文字changeLang()函数改变语言的具体代码如下:void LangSwitch:changeLang(int i
16、ndex)QString langCode=combo-itemData(index).toString();/(a)changeTr(langCode);/读取相应的“.qm”文件 refreshLabel();/刷新标签上的文字其中,其中,(a)QString langCode=combo-itemData(index).toString():从所选的菜单项中取得对应语言的值(“en”、“zh”和“la”)。选择语言翻译文字选择语言翻译文字changeTr()函数读取对应的“.qm”文件,并调用installTranslator()方法安装QTranslator对象,其具体实现代码如下:v
17、oid LangSwitch:changeTr(const QString&langCode)static QTranslator*translator;/(a)if(translator!=NULL)qApp-removeTranslator(translator);delete translator;translator=NULL;translator=new QTranslator;QString qmFilename=lang_+langCode;/(b)if(translator-load(QString(D:/Qt/CH15/CH1502/LangSwitch/)+qmFilena
18、me)qApp-installTranslator(translator);其中,其中,(a)static QTranslator*translator:由于需要动态改变语言,所以如果已经安装了QTranslator对象,则首先需要调用removeTranslator()函数移除原来的QTranslator对象,再安装新的对象。因此,定义了一个static的QTranslator对象以方便移除和重新安装。(b)QString qmFilename=lang_+langCode:将“.qm”文件的路径设定在项目“D:Qt CH15CH1502LangSwitch”路径下,分别命名为lang_en
19、.qm、lang_zh.qm和lang_la.qm。选择语言翻译文字选择语言翻译文字(3)提取需要翻译的字符串并翻译,生成“.qm”文件(这个工作通常由专门的工作组负责),具体操作如下。修改“langswitch.pro”文件,即在后面加上TRANSLATIONS的定义(加黑部分代码)。修改完的“langswitch.pro”文件的具体内容如下:TARGET=LangSwitchTEMPLATE=appSOURCES+=main.cpp langswitch.cppHEADERS +=langswitch.hTRANSLATIONS=lang_en.ts lang_zh.ts lang_la.
20、ts此时,运行结果如图15.8所示。选择语言翻译文字选择语言翻译文字 利用lupdate工具提取需要翻译的字符串,执行lupdate命令及结果如图15.9所示。此时,得到了lang_en.ts、lang_zh.ts和lang_la.ts共三个文件。但是,因为ID为TXT_HELLO_WORLD的字符串尚未被翻译,所以需要完成如下工作。选择语言翻译文字选择语言翻译文字(a)利用linguist工具翻译这几个“.ts”文件。直接利用Qt的linguist工具打开需要翻译的“.ts”文件,就可以进行字符串的翻译,这里三个版本的字符串分别译为“Hello World”(English)、“你好,世界”(Chinese)和“Orbis,te saluto”(Latin),翻译完成后保存退出,如图15.10所示。选择语言翻译文字选择语言翻译文字(b)生成各个“.ts”文件相应的“.qm”文件。这个工作可以利用lrelease工具来完成,其用法与lupdate工具相同,只是改用命令“lrelease LangSwitch.pro”,执行lrelease命令如图15.11所示。上述所有准备工作完成后,便可运行程序,不同版本的界面如图15.12所示。