Qt5 實現(xiàn)多國語言
引言
- 目的:自用/筆記
- 時間:2018-02-13 01:13
- 平臺: Windows 7
- 項目:將英語界面添加德語和土耳其語翻譯
步驟
使用默認語言寫出整個工程,這里使用英語作為缺省語言
-
標記期望譯為多國語言的字符串,在代碼中把相關(guān)字符使用tr()替換
例如在代碼中,把界面上的"Select Output Image" 期望轉(zhuǎn)換為多國語言,只需要將代碼中的字符替換為 tr(”Select Output Image")
QFileDialog::getSaveFileName(this,"SelectOutputImage",QDir::currentPath(),"*.jpg;;*.png);
QFileDialog::getSaveFileName(this,tr("SelectOutputImage"),QDir::currentPath(),"*.jpg;;*.png);
//這行代碼功能是選擇存儲路徑,getSaveFileName函數(shù)第二個參數(shù)是文件選擇導(dǎo)航器界面的標題欄,我們希望他參與多國語言翻譯,所以使用tr函數(shù)將其"標記"
-
把翻譯文件添加到工程文件(.PRO文件)中,添加該語句:
TRANSLATIONS = translation_de.ts translation_tr.ts
ts文件是Qt用以實現(xiàn)多國語言的一個中間文件,再此聲明一下
de代表德國語,tr代表土耳其語(這是個很好的命名習(xí)慣,可讀性高而且后期還要使用這個文件名繼續(xù)生成其他文件)
-
使用Qt的 lupdate 工具生成TS文件
此步驟就是生成第3步中向工程聲明的兩個ts文件,其原理是遍歷源代碼和 UI 文件尋找可翻譯的文本并創(chuàng)建ts文件。翻譯人員使用Qt提供的Linguist工具就可以翻譯這些文本
lupdate 位于Qt安裝目錄的bin文件夾,如:C:\Qt|Qt5.9.1\msvc2015\bin
方法一: 直接在Qt中運行l(wèi)update,工具->外部->Qt語言家->lupdate
-
方法二:使用命令行工具
使用CD指令切換到項目目錄,也就是有.pro文件的那個目錄
輸入C:\Qt\Qt5.9.1\msvc2015/bin/lupdate.exe *.pro執(zhí)行l(wèi)update
運行結(jié)束后,工程路徑下就會有兩個ts文件
運行l(wèi)inguist 并加載剛剛生成的兩個ts文件,翻譯好保存
創(chuàng)建QM文件。創(chuàng)建ts文件方法相同(直接IDE中運行或命令行運行),把lupdate替換為lrelease即可
把QM文件添加到工程的resources中
Qt中負責(zé)多國語言的是QTranslator類,所以要向mainWindow.h中添加包含文件
本例中需要翻譯出兩國語言,故聲明兩個QTranslator 對象作為MainWindow的私有成員
#include <QTranslaotr>
QTranslator *turkishTranslator;
QTranslator *germanTranslator;
-
在構(gòu)造函數(shù)中添加以下代碼,以便啟動軟件時自動加載翻譯文件
turkishTranslator = new QTranslator(this); turkishTranslator ->load(":/translations/translation_tr.qm"); germanTranslator = new QTranslator(this); germanTranslator ->load(":/translations/translation_de.qm"); //承于QObject在父對象銷毀時會自動去銷毀子對象。(父類被銷毀時,子類也被銷毀) 在界面中創(chuàng)建語言設(shè)定菜單右鍵單擊接界面,點選創(chuàng)建菜單欄,命名為Language,然后創(chuàng)建子項:
- English
- German
- Turkish
創(chuàng)建完成后,在底部的Action Editor中就會顯示三個入口,這些入口是創(chuàng)建菜單時自動生成的
-
右鍵單擊Turkish后選擇轉(zhuǎn)到槽,觸發(fā)類型:triggered()
x向生成的函數(shù)中添加如下代碼
void MainWindow::on_actionTurkish_triggered() { qApp -> installTranslator(turkishTranslator); } -
同理,向German的槽中添加如下代碼
void MainWindow::on_actionTurkish_triggered() { qApp -> installTranslator(germanTranslator); } -
對actionEnglish執(zhí)行同樣的操作。與之前不同,由于工程本身就是用英語寫的,所以要想顯示英語,只需移除turkishTranslator 和 germanTranslator即可,代碼如下
void MianWindow::on_actionEnglish_triggered() { qApp -> removeTranslator(turkishTranslator); qApp -> removeTranslator(germanTranslator); } -
為保證界面翻譯成功運行,我們需要重寫changeEvent,在mianWindow.h中添加如下代碼
void changeEvent(QEvent *event); -
在mainWindow.cpp文件中添加如下代碼:
void MainWindow::changeEvent(QEvent *event) { if(event -> type() == QEvent::LanguageChange) { } }?