前言
爲了支持國際化最關鍵的地方是製作多國語言包,然後再實現動態切換。QT裏面既可以採用命令行也可以採用Qt Creator的界面操作來生成,這裏我們利用Qt Creator來生成多國語言包。
基本流程是
- 生成ts文件;
- 生成qm文件;
- 最後通過QTranslator類來加載qm文件,實現多語言包的切換。
注意:爲了更全面地實現多語言包,在程序中所有涉及到界面中的按鈕或者菜單中的文字顯示,都必須使用 QObject::tr("…") 的方式將顯示的內容包裹起來,這樣做的原因是:只有添加了QObject::tr()的標記,生成ts文件的時候程序纔會認爲被QObject::tr()包裹的地方是需要製作多語言的,從而在ts中預留出位置。
1. 生成ts文件
1.1 在pro文件中添加
TRANSLATIONS = languages/lang_English.ts \
languages/lang_Chinese.ts
在pro文件中,加入說明,其中“lang_English.ts”與“llang_Chinses.ts”爲設置語言文件的名稱,這裏使用中文與英語兩種語言,當你需要其他更多的語言時,添加多個語言文檔即可。
注:languages文件夾需事先創建。
1.2 語言文字在程序中說明
爲了Qt識別你在程序中需要語言準換的文字,需要將需要轉換的文字使用QObject::tr(“…”) 進行標記,否則程序中並不能對其進行識別。例如:
qDebug()<<tr("Output Info: ")<<tr("Language - English");
而在ui窗口直接進行添加一些插件中的語言,一般默認可以識別進行翻譯的。如果我們想將其關掉,可以選擇插件的屬性,將toolTip中“可翻譯的”直接取消勾選即可。
1.3 生成ts文件
執行【工具】–>【外部】–>【Qt語言家】–>【更新翻譯(lupdate)】,如下圖所示,執行完成後languages目錄下會自動生成lang_English.ts和lang_Chinese.ts文件。
1.4 修改ts文件
利用Qt中自帶的Linguist打開剛剛生成的st文件,根據相應的語言,進行語言轉換。
lang_Chinese.ts
lang_English.ts
2 生成qm文件
ts文件翻譯結束以後,點擊保存,然後在Qt Creator中,使用:工具->外部->Qt預言家->部署翻譯(lrelease),就會生成需要的qm文件。
3 加載qm語言包
將生成的qm文件複製到發佈版本中相應的位置,然後在程序中加載
void MainWindow::loadLanguage(const QString langflag)
{
if(langflag.isEmpty())
return;
QString langqmfilepath;
if(langflag.compare("en") == 0)
{
langqmfilepath = qApp->applicationDirPath() + QString("/languages/lang_English.qm");
}
else if(langflag.compare("zh") == 0)
{
langqmfilepath = qApp->applicationDirPath() + QString("/languages/lang_Chinese.qm");
}
if(QFile(langqmfilepath).exists())
{
m_translator->load(langqmfilepath);
qApp->installTranslator(m_translator);
}
else
qDebug()<<"[houqd] authclient language file does not exists ...";
//重新刷新界面
ui->retranslateUi(this);
}
其中,m_translator即爲QTranslator實例,在類的構造函數中賦值:m_translator = new QTranslator;實現過程很簡單,就是取得語言包的絕對路徑,然後利用QTranslator來加載它,再利用qApp->installTranslator(m_translator)來安裝,最後還應該將顯示界面重新顯示一次進行更新。
主界面可以直接藉助ui->retranslateUi(this)進行重新設置界面顯示,但是這個只能更新當前頁面,其餘浮動頁面並不能直接顯示出來。需要按照以下格式將每一個需要顯示的頁面添加相應的程序。
示例
myDialog.h
void changeEvent(QEvent *event);
myDialog.cpp
void myDialog::changeEvent(QEvent *event)
{
QDialog::changeEvent(event);
switch (event->type())
{
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
示例參見:https://gitee.com/null_712_5588/CSDNBlogDemo/tree/master/QtLanguageSwitchTest