做競拍網(wǎng)站合法嗎營銷培訓(xùn)視頻課程免費
qt中實現(xiàn)多語言功能
原理:
其本質(zhì)就是生成ts文件,然后使用Linguist軟件手工翻譯,再生成qm文件,最后在主程序的開始加載不同的qm文件,實現(xiàn)多語言。
步驟:
修改程序文件
在pro文件中加入說明
TRANSLATIONS = lang_English.ts \
???????????????lang_Chinses.ts
目的就在在后面執(zhí)行更新翻譯(lupdate)命令在該目錄位置生成.ts文件。前提條件是:該目錄必須存在,上面的寫法就是會在輸出目錄上生成lang_English.ts和lang_Chinses.ts。
語言文字在程序中說明
為了Qt識別你在程序中需要語言準換的文字,需要將需要轉(zhuǎn)換的文字使用QObject::tr(“…”) 進行標記,否則程序中并不能對其進行識別。如
?label->setText(tr( "Hello World"));
生成ts文件
在Qt的菜單欄之中選擇:工具->外部->Qt預(yù)言家->更新翻譯(lupdate)。這樣在pro設(shè)置的TRANSLATIONS 目錄下生成ts文件
Linguist翻譯ts文件
Windows系統(tǒng)的msvc
點擊電腦開始菜單,在出現(xiàn)的應(yīng)用程序列表欄找到Qt安裝文件夾,找到Linguist,選擇適合自己的Linguist工具,雙擊打開。
linux系統(tǒng)
直接到qt的安裝目錄找到Linguist軟件,如我的qt安裝目錄是/opt/Qt5.12.2/5.12.2/gcc_64/bin
打開Linguist后,點擊文件->打開,在文件選擇框中選擇項目生成的ts文件,點擊打開。會在Linguist中展示需要翻譯的字符串,與類名。
在下方的翻譯區(qū)進行手動翻譯,第二欄是翻譯的注釋內(nèi)容,可以不寫注釋。翻譯完一項之后,用Ctrl+Enter會自動跳到下一個待翻譯的字符串上,翻譯完一個字符串之后,上圖字符串列表前面的問號圖標會變?yōu)橐粋€綠色的對號。
備注:這里可以設(shè)置你想翻譯成的語言。點擊編輯-》翻譯文本設(shè)置,會彈出一個對話框。在目標語言中選擇需要的語言和國家/地區(qū)。
生成qm文件
ts文件翻譯結(jié)束以后,點擊保存。
然后在Qt Creator中,使用:工具->外部->Qt預(yù)言家->部署翻譯(lrelease),就會生成需要的qm文件或者在Linguist中點擊文件->發(fā)布。這樣在和.ts文件同一目錄下會生成.qm文件。
加載qm語言包
生成qm文件之后,在main.cpp文件中添加下面的代碼,加載qm文件。一般將代碼添加到QApplication a(argc, argv);下一行。
#include "dialog.h"#include <QApplication>#include <QTranslator>int main(int argc, char *argv[]){QApplication a(argc, argv);QTranslator translator;QString runPath = QCoreApplication::applicationDirPath();QString ?qmFilename = runPath + "/english_eg.qm";bool bret = translator.load(qmFilename);a.installTranslator(&translator);Dialog w;w.show();return a.exec();}
也可以通過點擊按鈕進行語言包切換設(shè)計。
void Dialog::on_pushButton_clicked(){QString qmFilename;static QTranslator translator;QString runPath = QCoreApplication::applicationDirPath(); ??????//獲取文件運行路徑qmFilename = runPath + "/english_eg.qm";if (translator.load(qmFilename)){qApp->installTranslator(&translator);}ui->retranslateUi(this);//對整個ui界面所有控件都進行語言切換}
- 重新設(shè)置界面顯示
當實現(xiàn)“qApp->installTranslator(translator)”以后,還應(yīng)該將顯示界面重新顯示一次進行更新。主界面可以直接借助步驟5中ui->retranslateUi(this)進行重新設(shè)置界面顯示,但是這個只能更新當前頁面,其余頁面并不能直接顯示出來,。需要對每個widget 對象重寫虛函數(shù)virtual void changeEvent(QEvent *);
void Dialog::changeEvent(QEvent *e){QDialog::changeEvent(e);switch (e->type()){case QEvent::LanguageChange:ui->retranslateUi(this);break;default:break;}}
注釋:
ui->retranslateUi(this);內(nèi)部相當界面所有控件都調(diào)用setText。如下
ui->pushButton_2->setText(QApplication::translate(0,"中文", nullptr));
QApplication::translate函數(shù)的參數(shù):第一個參數(shù)中0代表全局范圍,第二個參數(shù)代表要轉(zhuǎn)換語言的字符文本,即ts文件中的source資源。
所以關(guān)鍵是QApplication::translate函數(shù)。
TS文件格式
1、文件頭部信息。指定了翻譯文件的版本(2.1),目標語言(zh_CN,即中文)等信息。
2、劃分的作用域名字。
3、每個待翻譯的字符串都有一個 message 元素,其中l(wèi)ocation元素指定了源代碼中字符串的位置;source 元素包含了原始的文本;translation元素用于存儲翻譯后的文本。
其中,location沒有也可以,只是QT語言家打開.ts文件時定位不到字符串位置而已,主要還是source 元素和translation元素,source元素相當于字符串的id,翻譯家通過source在lang_zh_CN.ts找中文文本,在lang_en.ts找英文文本。
如下面自定義的ts文件
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE TS><TS version="2.1" language="en_US"><context><message><source>測試</source><translation>test</translation></message><message><source>中文</source><translation>chinese</translation></message><message><source>英文</source><translation>english</translation></message></context></TS>
代碼實現(xiàn)語言切換
????if(nLanguage == Enum_Language::Lang_en){QString strLanguageFile = g_strRunPath + "/language/lang_en.qm";QFile file(strLanguageFile);bool bExist = file.exists();if(!bExist){return ;}static QTranslator translator;if (translator.load(strLanguageFile)){qApp->installTranslator(&translator);QString strMessage?=”英文”;const char* cStrMsg = strMessage.toStdString().c_str();strMessage = QApplication::translate(0,cStrMsg, nullptr);}}