资源描述
按一下以編輯母片標題樣式,按一下以編輯母片,第二層,第三層,第四層,第五層,#,第,14,章,Qt 5,多国语言国际化,14.1,基本概念,14.2,【实例】,1,2025/4/28 周一,14.1,基本概念,14.1.1,国际化支持的实现,(,1,)使用,QString,对象表示所有用户可见的文本。由于,QString,内部使用,Unicode,编码实现,所以它可以用于表示所有需要向用户呈现的文本。当然,对于仅程序员可见的文本并不需要都变为,QString,对象,可利用,Qt,提供的,QCString,或原始的“,char*,”。,(,2,)使用,tr(),函数获取所有需要翻译的文本。在,Qt,的翻译机制下,,QObject:tr(),函数可以帮程序员取得翻译之后的文本。对于从,QObject,继承而来的类,,QObject:tr(),函数最终由,QMetaObject:tr(),实现。在某些时候,如果无法使用,QObject:tr(),函数,则还可以直接调用,QCoreApplication:translate(),取得翻译之后的字符串。,2,2025/4/28 周一,14.1.1,国际化支持的实现,(,3,)使用,QString:arg(),组织动态文本。有些时候,一段文本需要由一些静态文本和动态变量组合起来,如常见的情况“,printf(The value of i is:%d,i),”。对于这种动态文本的翻译,由于语言习惯的问题,如果简单地采用这种连接字符串的方法,则可能会带来一些问题,如下面的字符串用于表示任务的完成情况:,QString m=tr(Mission status:)+x+tr(of)+y+tr(are completed);,(,4,)利用,QTranslator:load(),和,QCoreApplication:installTranslator(),读取对应的翻译之后的资源文件。翻译工作者将提供包含有翻译之后的字符串的资源文件“,*.qm,”,程序员还需要做的是定义,QTranslator,对象,并使用,load(),函数读取相应的“,.qm,”文件,利用,QCoreApplication:installTranslator(),函数安装,QTranslator,对象。,3,2025/4/28 周一,14.1.2,翻译工作:“,*.qm,”文件的生成,(,1,)利用,lupdate,工具从源代码中扫描并提取需要翻译的字符串,生成“,.ts,”文件。类似编译时用到的,qmake,,运行,lupdate,时也需要指定一个“,.pro,”的文件,这个“,.pro,”文件可以单独创建,也可以利用编译时用到的“,.pro,”文件,只需定义好变量,TRANSLATIONS,即可,具体用法可以参见本书后面的小例子。,(,2,)利用,linguist,工具来协助完成翻译工作,即打开前面用,lupdate,生成的“,.ts,”文件,对其中的字符串逐条进行翻译并保存。由于“,.ts,”文件采用了,XML,格式,所以也可以使用其他编辑器来打开“,.ts,”文件并翻译。,(,3,)利用,lrelease,工具处理翻译好的“,.ts,”文件,生成格式更为紧凑的“,.qm,”文件。这便是翻译工作者最终需要提供的资源文件,它所占的空间比“,.ts,”文件小,但基本不具有可读性,只有,QTranslator,能够正确地识别它。,4,2025/4/28 周一,14.2,【实例】,14.2.1,简单测试,【例】,(简单),(,CH1401,)多国语言国际化。,操作步骤如下。,(,1,)新建一个,GUI,工程“,TestHello.pro,”,在,UI,界面上添加两个按钮,并分别将文本修改为,hello,、,china,,如图,14.1,所示。,5,2025/4/28 周一,14.2.1,简单测试,(,2,)修改“,TestHello.pro,”文件,添加如下代码:,TRANSLATIONS=TestHello.ts,(,3,)编译。记住,一定要先编译,假如没有编译就进行下面的步骤,生成的“,.ts,”文件只是一个仅有标题栏的框架。,(,4,)编译完成后,选择“开始”“所有程序”“,Qt 5.8.0,”“,5.8,”“,MinGW 5.3.0(32-bit),”“,Qt 5.8 for Desktop(MinGW 5.3.0 32 bit),”菜单项,打开命令行窗口,进入“,TestHello.pro,”工程目录,执行命令:,lupdate TestHello.pro,在工程下生成一个“,.ts,”文件,假如没有编译,将提示“,Found 1 source text,”。若已经编译,就将提示“,Found 3 source text(s),”,如图,14.2,所示。,6,2025/4/28 周一,14.2.1,简单测试,(,5,)选择“开始”“所有程序”“,Qt 5.8.0,”“,5.8,”“,MinGW 5.3.0(32-bit),”“,Linguist,”菜单项,运行,Qt,自带工具,Linguist,(,Qt,语言家),其主界面如图,14.3,。,7,2025/4/28 周一,14.2.1,简单测试,在主界面上选择“文件”“打开”命令,选择“,TestHello.ts,”文件,单击“打开”按钮,根据需要设置源语言和目标语言,此处为默认状态:源语言为任意国家语言,目标语言为,China,的,Chinese,,如图,14.4,所示。,8,2025/4/28 周一,14.2.1,简单测试,(,6,)在第二栏中选择要翻译的字符串,在下面两行中输入对应的翻译文字,单击上面的,按钮,如图,14.5,所示。,9,2025/4/28 周一,14.2.1,简单测试,(,7,)选择“文件”“发布”菜单项,或者在命令行中输入“,lrelease TestHello.pro,”,生成“,TestHello.qm,”文件,如图,14.6,所示。,10,2025/4/28 周一,14.2.1,简单测试,(,8,)修改源代码,其中,加黑语句为需要添加的部分。,具体代码如下:,#include,int main(int argc,char*argv),QApplication a(argc,argv);,QTranslator*translator=new QTranslator;,translator-load(D:/Qt/CH14/CH1401/TestHello/TestHello.qm);,a.installTranslator(translator);,MainWindow w;,w.show();,return a.exec();,11,2025/4/28 周一,14.2.1,简单测试,(,9,)运行程序,效果如图,14.7,所示。,12,2025/4/28 周一,14.2.2,选择语言翻译文字,【例】,(简单),(,CH1402,)用一个下拉菜单来选择语言,并且下面有一个需要翻译文字的标签。,实现,步骤如下。,(,1,)在头文件“LangSwitch.h”中定义类LangSwitch,创建用户界面。,#include,#include,#include,class LangSwitch:public QWidget,Q_OBJECT,public:,LangSwitch(QWidget*parent=0);,LangSwitch();,private slots:,void changeLang(int index);/(a),private:,void createScreen();/(b),void changeTr(const QString,void refreshLabel();,QComboBox*combo;/,界面中可以看见的下拉菜单,QLabel*label;/,界面中可以看见的标签,;,13,2025/4/28 周一,14.2.2,选择语言翻译文字,(2)源文件“LangSwitch.cpp”中的具体实现代码如下:,#include langswitch.h,#include,#include,#include,LangSwitch:LangSwitch(QWidget*parent),:QWidget(parent),createScreen();,LangSwitch:LangSwitch(),14,2025/4/28 周一,14.2.2,选择语言翻译文字,createScreen()函数用于创建基本的界面,其具体实现代码如下:,void LangSwitch: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(currentIndexChanged(int),this,SLOT(changeLang(int);/(b),15,2025/4/28 周一,14.2.2,选择语言翻译文字,refreshLabel()函数的具体实现如下:,void LangSwitch:refreshLabel(),label-setText(tr(TXT_HELLO_WORLD,Hello World);/(a),changeLang()函数改变语言的具体代码如下:,void LangSwitch:changeLang(int index),QString langCode=combo-itemData(index).toString();/(a),changeTr(langCode);/,读取相应的“,.qm,”文件,refreshLabel();/,刷新标签上的文字,16,2025/4/28 周一,14.2.2,选择语言翻译文字,函数,changeTr(),读取对应的“,.qm,”文件,并调用,installTranslator(),方法安装,QTranslator,对象,其具体实现代码如下:,void 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/CH14/CH1402/LangSwitch/)+qmFilename),qApp-installTranslator(translator);,17,2025/4/28 周一,14.2.2,选择语言翻译文字,(,3,)提取需要翻译的字符串并翻译,生成“,.qm,”文件(这个工作通常由专门的工作组负责),具体操作如下。,修改“,langswitch.pro,”文件,即在后面加上,TRANSLATIONS,的定义(加黑部分代码)。修改完的“,langswitch.pro,”文件的具体内容如下:,TARGET=LangSwitch,TEMPLATE=app,SOURCES+=main.cpp,langswitch.cpp,HEADERS +=langswitch.h,TRANSLATIONS=lang_en.ts,lang_zh.ts,lang_la.ts,此时运行结果如图,14.8,所示。,18,2025/4/28 周一,14.2.2,选择语言翻译文字,利用lupdate工具提取需要翻译的字符串,运行命令及结果如图,14.9,所示。,19,2025/4/28 周一,14.2.2,选择语言翻译文字,(,a,)利用,L,inguist翻译这几个“.ts”文件。直接利用,Qt,的Linguist工具打开需要翻译的“.ts”文件,就可以进行字符串的翻译,这里三个版本的字符串分别译为“,Hello World,”(,English,)、“你好,世界”(,Chinese,)和“,Orbis,te saluto,”(,Latin,),翻译完成后保存退出,如图,14.10,所示。,20,2025/4/28 周一,14.2.2,选择语言翻译文字,(,b,)生成各个“,.ts,”文件相应的“.qm”文件。这个工作可以利用lrelease来完成,其用法与,lupdate,工具相同,只是改用命令“lrelease LangSwitch.pro”,命令的运行情况如图14.11所示。,21,2025/4/28 周一,14.2.2,选择语言翻译文字,上述所有准备工作完成后,便可运行程序,效果如图,14.12,所示。,22,2025/4/28 周一,
展开阅读全文