----------------------------------------------------------------
成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供營(yíng)山網(wǎng)站建設(shè)、營(yíng)山做網(wǎng)站、營(yíng)山網(wǎng)站設(shè)計(jì)、營(yíng)山網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、營(yíng)山企業(yè)網(wǎng)站模板建站服務(wù),10余年營(yíng)山做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。----------------------------------------------------------------
網(wǎng)頁版課程源碼 提取碼:1uy7
--------------------------------------------------------------
引言
----------------------------------------------------------------
如果我們開發(fā)的產(chǎn)品是提供給國(guó)外用戶的,這就涉及到中英文問題。比如:如果需要把產(chǎn)品給國(guó)外用戶使用,就可能使用英文界面;如果提供給國(guó)內(nèi)用戶,就需要使用中文界面。這就帶來一個(gè)問題,一套界面兩種語言。這該怎么辦呢?別急,Qt提供了國(guó)際化方案來解決這個(gè)問題。
正文
----------------------------------------------------------------
Qt的方案稱作國(guó)際化。其實(shí)也很簡(jiǎn)單:把所有需要翻譯的文本放到類中,然后需要提供一個(gè)中英文對(duì)照的翻譯文件(.qm),最后在程序啟動(dòng)時(shí)加載這個(gè)翻譯文件就可以了。
我們看一下詳細(xì)步驟:
1)? 在ui或代碼中使用英文。
2)? 在提供翻譯的類中使Q_OBJECT。
3)? pro中添加TRANSLATIONS
4)? 使用lupdate命令,提取待翻譯內(nèi)容到.ts文件。
5)? 添加中英文對(duì)照翻譯,并用linguist導(dǎo)出為翻譯文件(.qm文件)。
6)? 程序啟動(dòng)時(shí)加載.qm文件。
下面,我們分步驟詳細(xì)介紹。
Step 1, 在ui或代碼中使用英文
首先,我們?cè)诶L制ui文件時(shí)或者是在編碼時(shí)使用英文。在編程時(shí)需要調(diào)用所在類的tr()接口。
1.??? | m_pLabel2->setText(tr(“this is translated ? by source code”)); |
tr()接口是QObject類提供的,所以這個(gè)類要從QObject派生。如果待翻譯的文本串所在的類不是從QObject派生,那么請(qǐng)使用從QObject派生的類來調(diào)用tr()接口。具體方法在后續(xù)章節(jié)介紹,這里我們先介紹最基本的用法。
Step 2, 在提供翻譯的類中使Q_OBJECT
如果需要我們的類提供翻譯功能,除了讓他從QObject派生,還需要使用Q_OBJECT宏。
???假設(shè)我們的類名為CDialog,那么需要在類定義開頭添加Q_OBJECT宏:
?
代碼清單03-01-01
1.?? ? ? 2.?? ? ? 3.?? ? ? 4.?? ? ? 5.?? ? ? 6.?? ? ? 7.?? ? ? 8.?? ? ? | class CDialog : public QDialog{ Q_OBJECT public: CDialog(QWidget* ? pParent); ~CDialog(); private: Ui::CDialog ui; }; |
如果不添加Q_OBJECT宏,使用lupdate命令抽取ts文件時(shí)將會(huì)報(bào)錯(cuò):
lupdate ks03_01.pro3_01 dialog.cpp:7: ? Class 'CDialog' lacks Q_OBJECT macro Updating 'ks03_01.ts'... |
上述錯(cuò)誤信息的含義是:類CDialog缺少Q(mào)_OBJECT宏。
Step 3, pro中添加TRANSLATTIONS
??? 在ks03_01.pro中添加如下內(nèi)容:
1.?? ? ? | TRANSLATIONS ? += ks03_01.ts |
ks03_01.ts是利用lupdate命令抽取的ts文件名。當(dāng)然也可以帶路徑:
1.?? ? ? | TRANSLATIONS += $$TRAIN_SRC_PATH /translations/ks03_01.ts |
表示將抽取得到的ts文件放到項(xiàng)目的src/translations子目錄下,抽取的文件名為ks03_01.ts。
?
Step 4, 使用lupdate命令,提取待翻譯內(nèi)容到.ts文件
執(zhí)行l(wèi)update命令,讀取pro中的配置并且讀取源代碼文件,將待翻譯內(nèi)容抽取到ts文件:
lupdate ? ks03_01.pro |
請(qǐng)注意,務(wù)必在ks03_01.pro中配置TRANSLATIONS配置項(xiàng),否則上述命令將執(zhí)行失敗。而且待翻譯類必須使用Q_OBJECT宏。
Step 5,? 添加中英文對(duì)照翻譯,并用linguist導(dǎo)出為翻譯文件
抽取完ts文件后,使用linguist界面打開ts文件,手工添加翻譯內(nèi)容,然后導(dǎo)出為qm二進(jìn)制文件。
添加翻譯時(shí),請(qǐng)將翻譯后的文本寫在:”Translation to 簡(jiǎn)體中文(中國(guó))”下面的文本編輯框內(nèi)(如圖03_01_01)。
圖03_01_01
請(qǐng)注意,對(duì)標(biāo)點(diǎn)符號(hào)也要一一翻譯。
完成一個(gè)翻譯項(xiàng)后,請(qǐng)將”源文”前面的問號(hào)(圖03_01_02中虛線位置)改為“√”(鼠標(biāo)左鍵單擊)。
圖03_01_02
您也可以查看左側(cè)“上下文”框中的內(nèi)容,檢查是否還有未翻譯的項(xiàng)目(前面帶“?”,翻譯完成后的應(yīng)該帶”√”)。
完成所有翻譯后,請(qǐng)將ts文件發(fā)布為.qm文件。方法是選擇菜單中的“另外發(fā)布為”。然后選擇發(fā)布目錄即可。
比如,我們可以將.qm文件發(fā)布到 $$(PRJROOT)/system/lang目錄下。
Step 6,? 程序啟動(dòng)時(shí)加載.qm文件
我們?cè)趍ain()函數(shù)或其他合適的位置加載qm文件。
1,包含所需的頭文件
1.?? ? ? 2.?? ? ? 3.?? ? ? | #include ? <QApplication> #include ? <QTranslator>? // 國(guó)際化 #include ? <QLibraryInfo> // 國(guó)際化 |
2,加載Qt自身的翻譯文件
Qt自身也提供了一個(gè)翻譯文件,用來實(shí)現(xiàn)Qt提供的類的翻譯功能。
代碼清單03-01-02
1.?? ? ? 2.?? ? ? 3.?? ? ? 4.?? ? ? 5.?? ? ? 6.?? ? ? 7.?? ? ? 8.?? ? ? 9.?? ? ? 10.? | // 安裝qt自帶的中文翻譯 const QString localSysName ???? = ? QLocale::system().name();// 獲取本機(jī)系統(tǒng)的語言環(huán)境 QScopedPointer<QTranslator> ? qtTranslator(new QTranslator(QCoreApplication::instance())); if ? (qtTranslator->load(QStringLiteral("qt_") + localSysName, QLibraryInfo::location(QLibraryInfo::TranslationsPath))) { QCoreApplication::installTranslator(qtTranslator.take()); } |
3,加載項(xiàng)目自己的翻譯文件
代碼清單03-01-03
1.?? ? ? 2.?? ? ? 3.?? ? ? 4.?? ? ? 5.?? ? ? 6.?? ? ? 7.?? ? ? 8.?? 9.? ?? 10.? | QString strPath = ? qgetenv("TRAINDEVHOME");? // 獲取環(huán)境變量所指向的路徑 strPath += "/system/lang";?????? // ? $TRAINDEVHOME/system/lang/ks03_01.qm QScopedPointer<QTranslator> ? gpTranslator(new QTranslator(QCoreApplication::instance())); if (gpTranslator->load("ks03_01.qm", ? strPath)) { QCoreApplication::installTranslator(gpTranslator.take()); } |
?
請(qǐng)注意:
我們可以在自己的ts文件中編寫Qt類的翻譯內(nèi)容哦。比如QMessageBox的“OK”"Cancel"按鈕,我們都可以通過這種方式處理為顯示中文的按鈕。如果我們從designer種拖出QDialogButtonBox(帶OK、Cancel)按鈕,那么翻譯時(shí)需要注意,在ts文件中手工添加如下內(nèi)容:
代碼清單03-01-04
1.?? ? ? 2.?? ? ? 3.?? ? ? 4.?? ? ? 5.?? ? ? 6.?? ? ? 7.?? ? ? 8.?? ? ? 9.?? ? ? 10.? ?? 11.? ?? 12.? ?? 13.? ?? 14.? ? 15.? | <context> <name>QPlatformTheme</name> <message> <location filename="../src/widgets/qdialogbuttonbox.cpp" ? line="+42"/> <location line="+18"/> <source>OK</source> <translation>確定</translation> </message> <message> <location line="+54"/> <source>Cancel</source> <translation>取消</translation> </message> </context> |
???這時(shí)因?yàn)樵赒t的源代碼里,為QDialogButtonBox的按鈕進(jìn)行翻譯時(shí),實(shí)際使用了QPlatformTheme,見Qt代碼:
QCoreApplication ::translate ("QPlatformTheme" , "OK" )
實(shí)際上,這可以作為Qt的補(bǔ)丁。所以,我們最好將其作為Qt自身的翻譯的一個(gè)補(bǔ)充,將上述ts文件的內(nèi)容專門保存一個(gè)公共的ts文件,供各項(xiàng)目使用。
結(jié)語
----------------------------------------------------------------
國(guó)際化在Qt軟件開發(fā)過程中是非常重要的組成部分。即使您目前的代碼沒有推向國(guó)外市場(chǎng),我也建議您養(yǎng)成使用國(guó)際化方案進(jìn)行編程的習(xí)慣。因?yàn)檫@樣使您對(duì)于國(guó)際化編程會(huì)比較熟練,而且會(huì)形成一種標(biāo)準(zhǔn)化的編程格局,相信對(duì)您今后的發(fā)展也是有利的。
----------------------------------------------------------------
《Qt入門與提高-GUI產(chǎn)品開發(fā)》目錄
上一節(jié):KS02-06 一勞永逸:引入pri體系
下一節(jié):
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
本文名稱:KS03-01怎樣實(shí)現(xiàn)國(guó)際化-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://vcdvsql.cn/article30/dshspo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站建設(shè)、域名注冊(cè)、自適應(yīng)網(wǎng)站、網(wǎng)站導(dǎo)航、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容