Qt5多國語言國際化_第1頁
Qt5多國語言國際化_第2頁
Qt5多國語言國際化_第3頁
Qt5多國語言國際化_第4頁
Qt5多國語言國際化_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第14章Qt5多國語言國際化

14.1基本概念14.2【實(shí)例】2021/6/27114.1基本概念14.1.1國際化支持的實(shí)現(xiàn)(1)使用QString對(duì)象表示所有用戶可見的文本。由于QString內(nèi)部使用Unicode編碼實(shí)現(xiàn),所以它可以用于表示所有需要向用戶呈現(xiàn)的文本。當(dāng)然,對(duì)于僅程序員可見的文本并不需要都變?yōu)镼String對(duì)象,可利用Qt提供的QCString或原始的“char*”。(2)使用tr()函數(shù)獲取所有需要翻譯的文本。在Qt的翻譯機(jī)制下,QObject::tr()函數(shù)可以幫程序員取得翻譯之后的文本。對(duì)于從QObject繼承而來的類,QObject::tr()函數(shù)最終由QMetaObject::tr()實(shí)現(xiàn)。在某些時(shí)候,如果無法使用QObject::tr()函數(shù),則還可以直接調(diào)用QCoreApplication::translate()取得翻譯之后的字符串。2021/6/27214.1.1國際化支持的實(shí)現(xiàn)(3)使用QString::arg()組織動(dòng)態(tài)文本。有些時(shí)候,一段文本需要由一些靜態(tài)文本和動(dòng)態(tài)變量組合起來,如常見的情況“printf("Thevalueofiis:%d",i)”。對(duì)于這種動(dòng)態(tài)文本的翻譯,由于語言習(xí)慣的問題,如果簡(jiǎn)單地采用這種連接字符串的方法,則可能會(huì)帶來一些問題,如下面的字符串用于表示任務(wù)的完成情況:QStringm=tr("Missionstatus:")+x+tr("of")+y+tr("arecompleted");(4)利用QTranslator::load()和QCoreApplication::installTranslator()讀取對(duì)應(yīng)的翻譯之后的資源文件。翻譯工作者將提供包含有翻譯之后的字符串的資源文件“*.qm”,程序員還需要做的是定義QTranslator對(duì)象,并使用load()函數(shù)讀取相應(yīng)的“.qm”文件,利用QCoreApplication::installTranslator()函數(shù)安裝QTranslator對(duì)象。2021/6/27314.1.2翻譯工作:“*.qm”文件的生成(1)利用lupdate工具從源代碼中掃描并提取需要翻譯的字符串,生成“.ts”文件。類似編譯時(shí)用到的qmake,運(yùn)行l(wèi)update時(shí)也需要指定一個(gè)“.pro”的文件,這個(gè)“.pro”文件可以單獨(dú)創(chuàng)建,也可以利用編譯時(shí)用到的“.pro”文件,只需定義好變量TRANSLATIONS即可,具體用法可以參見本書后面的小例子。(2)利用linguist工具來協(xié)助完成翻譯工作,即打開前面用lupdate生成的“.ts”文件,對(duì)其中的字符串逐條進(jìn)行翻譯并保存。由于“.ts”文件采用了XML格式,所以也可以使用其他編輯器來打開“.ts”文件并翻譯。(3)利用lrelease工具處理翻譯好的“.ts”文件,生成格式更為緊湊的“.qm”文件。這便是翻譯工作者最終需要提供的資源文件,它所占的空間比“.ts”文件小,但基本不具有可讀性,只有QTranslator能夠正確地識(shí)別它。2021/6/27414.2【實(shí)例】14.2.1簡(jiǎn)單測(cè)試【例】(簡(jiǎn)單)(CH1401)多國語言國際化。操作步驟如下。(1)新建一個(gè)GUI工程“TestH”,在UI界面上添加兩個(gè)按鈕,并分別將文本修改為hello、china,如圖14.1所示。2021/6/27514.2.1簡(jiǎn)單測(cè)試(2)修改“TestH”文件,添加如下代碼:TRANSLATIONS=TestHello.ts(3)編譯。記住,一定要先編譯,假如沒有編譯就進(jìn)行下面的步驟,生成的“.ts”文件只是一個(gè)僅有標(biāo)題欄的框架。(4)編譯完成后,選擇“開始”→“所有程序”→“Qt5.8.0”→“5.8”→“MinGW5.3.0(32-bit)”→“Qt5.8forDesktop(MinGW5.3.032bit)”菜單項(xiàng),打開命令行窗口,進(jìn)入“TestH”工程目錄,執(zhí)行命令:lupdateTestH在工程下生成一個(gè)“.ts”文件,假如沒有編譯,將提示“Found1sourcetext”。若已經(jīng)編譯,就將提示“Found3sourcetext(s)”,如圖14.2所示。2021/6/27614.2.1簡(jiǎn)單測(cè)試(5)選擇“開始”→“所有程序”→“Qt5.8.0”→“5.8”→“MinGW5.3.0(32-bit)”→“Linguist”菜單項(xiàng),運(yùn)行Qt自帶工具Linguist(Qt語言家),其主界面如圖14.3。2021/6/27714.2.1簡(jiǎn)單測(cè)試在主界面上選擇“文件”→“打開”命令,選擇“TestHello.ts”文件,單擊“打開”按鈕,根據(jù)需要設(shè)置源語言和目標(biāo)語言,此處為默認(rèn)狀態(tài):源語言為任意國家語言,目標(biāo)語言為China的Chinese,如圖14.4所示。2021/6/27814.2.1簡(jiǎn)單測(cè)試(6)在第二欄中選擇要翻譯的字符串,在下面兩行中輸入對(duì)應(yīng)的翻譯文字,單擊上面的按鈕,如圖14.5所示。2021/6/27914.2.1簡(jiǎn)單測(cè)試(7)選擇“文件”→“發(fā)布”菜單項(xiàng),或者在命令行中輸入“l(fā)releaseTestH”,生成“TestHello.qm”文件,如圖14.6所示。2021/6/271014.2.1簡(jiǎn)單測(cè)試(8)修改源代碼,其中,加黑語句為需要添加的部分。具體代碼如下:#include<QTranslator>intmain(intargc,char*argv[]){ QApplicationa(argc,argv);

QTranslator*translator=newQTranslator;

translator->load("D:/Qt/CH14/CH1401/TestHello/TestHello.qm");

a.installTranslator(translator); MainWindoww; w.show(); returna.exec();}2021/6/271114.2.1簡(jiǎn)單測(cè)試(9)運(yùn)行程序,效果如圖14.7所示。2021/6/271214.2.2選擇語言翻譯文字【例】(簡(jiǎn)單)(CH1402)用一個(gè)下拉菜單來選擇語言,并且下面有一個(gè)需要翻譯文字的標(biāo)簽。實(shí)現(xiàn)步驟如下。(1)在頭文件“LangSwitch.h”中定義類LangSwitch,創(chuàng)建用戶界面。#include<QWidget>#include<QComboBox>#include<QLabel>classLangSwitch:publicQWidget{Q_OBJECTpublic:LangSwitch(QWidget*parent=0);~LangSwitch();privateslots:voidchangeLang(intindex); //(a)private:voidcreateScreen(); //(b)voidchangeTr(constQString&langCode);voidrefreshLabel();QComboBox*combo; //界面中可以看見的下拉菜單QLabel*label; //界面中可以看見的標(biāo)簽};2021/6/271314.2.2選擇語言翻譯文字(2)源文件“LangSwitch.cpp”中的具體實(shí)現(xiàn)代碼如下:#include"langswitch.h"#include<QVBoxLayout>#include<QTranslator>#include<QApplication>LangSwitch::LangSwitch(QWidget*parent):QWidget(parent){createScreen();}LangSwitch::~LangSwitch(){}2021/6/271414.2.2選擇語言翻譯文字createScreen()函數(shù)用于創(chuàng)建基本的界面,其具體實(shí)現(xiàn)代碼如下:voidLangSwitch::createScreen(){combo=newQComboBox;combo->addItem("English","en"); //(a)combo->addItem("Chinese","zh");combo->addItem("Latin","la");label=newQLabel;refreshLabel(); //設(shè)置標(biāo)簽的內(nèi)容QVBoxLayout*layout=newQVBoxLayout;layout->addWidget(combo,1);layout->addWidget(label,5);setLayout(layout);connect(combo,SIGNAL(currentIndexChanged(int)),this,SLOT(changeLang(int))); //(b)}2021/6/271514.2.2選擇語言翻譯文字refreshLabel()函數(shù)的具體實(shí)現(xiàn)如下:voidLangSwitch::refreshLabel(){label->setText(tr("TXT_HELLO_WORLD","HelloWorld")); //(a)}changeLang()函數(shù)改變語言的具體代碼如下:voidLangSwitch::changeLang(intindex){QStringlangCode=combo->itemData(index).toString(); //(a)changeTr(langCode); //讀取相應(yīng)的“.qm”文件

refreshLabel(); //刷新標(biāo)簽上的文字}2021/6/271614.2.2選擇語言翻譯文字函數(shù)changeTr()讀取對(duì)應(yīng)的“.qm”文件,并調(diào)用installTranslator()方法安裝QTranslator對(duì)象,其具體實(shí)現(xiàn)代碼如下:voidLangSwitch::changeTr(constQString&langCode){staticQTranslator*translator; //(a)if(translator!=NULL){ qApp->removeTranslator(translator); deletetranslator; translator=NULL;}translator=newQTranslator;QStringqmFilename="lang_"+langCode; //(b)if(translator->load(QString("D:/Qt/CH14/CH1402/LangSwitch/")+

qmFilename)){ qApp->installTranslator(translator);}}2021/6/271714.2.2選擇語言翻譯文字(3)提取需要翻譯的字符串并翻譯,生成“.qm”文件(這個(gè)工作通常由專門的工作組負(fù)責(zé)),具體操作如下。①修改“”文件,即在后面加上TRANSLATIONS的定義(加黑部分代碼)。修改完的“”文件的具體內(nèi)容如下:TARGET=LangSwitchTEMPLATE=appSOURCES+=main.cpp\langswitch.cppHEADERS+=langswitch.hTRANSLATIONS=lang_en.ts\

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論