環境
系統:Windows10 64位 家庭版
Qt版本:5.6.0 msvc2013 32位
編譯器:Visual Studio 2013 專業版
目的
在Qt程序中生成多語言處理所必需的.qm文件,然後添加到工程中並在程序中使用。
示例步驟
1.新建一個Qt Widgets工程,這裏我取名爲Linguist,並添加一個名爲LinguistWidget的類,如下圖所示:
2.在LinguistWidget中添加一個QPushButton,用來切換語言和顯示,關鍵代碼如下所示:
LinguistWidget.h文件
#ifndef LINGUISTWIDGET_H
#define LINGUISTWIDGET_H
#include <QWidget>
class QPushButton;
class LinguistWidget : public QWidget
{
Q_OBJECT
public:
LinguistWidget(QWidget *parent = 0);
~LinguistWidget();
protected:
void retranslateUi();
private:
QPushButton* m_pBtnChangeLanguage = Q_NULLPTR;
};
#endif // LINGUISTWIDGET_H
LinguistWidget.cpp文件
#include "LinguistWidget.h"
#include <QPushButton>
LinguistWidget::LinguistWidget(QWidget *parent)
: QWidget(parent)
{
m_pBtnChangeLanguage = new QPushButton(this);
retranslateUi();
}
LinguistWidget::~LinguistWidget()
{
}
void LinguistWidget::retranslateUi()
{
m_pBtnChangeLanguage->setText(tr("Change Language")); //這裏要用tr包起來,不然語言家無法識別
}
3.在工程目錄下新建一個文件夾名叫language(這些名字隨便取,但是要和下面的宏一致),用來存放ts文件,如下圖所示:
4.在.pro文件中,添加宏:
TRANSLATIONS += language/langEnglish.ts \
language/langChinese.ts
然後執行qmake,再執行Qt Creator菜單欄中的"工具—>外部—>Qt語言家—>更新翻譯(update)“完成後,工程目錄下的language文件夾裏會有兩個文件,分別是langChinese.ts和langEnglish.ts,如下圖所示:
5.在開始菜單中打開如下圖所示的Linguist程序:
6.在Liguist程序中打開步驟2生成的langChinese.ts和langEnglish.ts文件,在打開文件時會彈出語言設置窗口,在窗口中爲相應的文件選擇相應的目標語言,如下兩圖所示,然後選擇OK:
7.在彈出的語言翻譯界面中,爲中文添加適當的翻譯(因爲源語言就是英文,所以英文這裏不做翻譯),如下圖所示:8.再執行菜單欄中的"文件—>發佈全部”,此時在工程目錄下的language文件夾下會生成兩個文件:langChinese.qm和langEnglish.qm文件,這就是Qt工程最終用的翻譯文件,如下圖所示:
9.回到Qt工程,添加一個資源文件,這裏我取名爲Resource(我一開始取名爲src,但是後面取資源文件時無法識別,真是個奇怪的現象),然後添加一個前綴"/",再把步驟8生成的兩個.qm文件添加進來,如下圖所示:
10.爲步驟2中添加的QPushButton添加一個槽函數,用來切換語言,關鍵代碼如下:
connect(m_pBtnChangeLanguage, &QPushButton::clicked, this, [=]{
m_bDisplayChinese = !m_bDisplayChinese;
if (m_bDisplayChinese)
{
m_pTranslator->load(":/language/langChinese.qm");
} else {
m_pTranslator->load(":/language/langEnglish.qm");
}
qApp->installTranslator(m_pTranslator);
retranslateUi();
});
11.界面一開始如下圖:
單擊一下按鍵變成:
分析:.qm文件放在資源文件中加載和在程序外部加載優劣分析
在資源文件中加載(個人偏向這個):
優點:
- 在程序發佈時不用把最新的.qm文件拷貝到加載路徑中,降低了修改翻譯時界面沒有翻譯或翻譯不準確的風險;
- 不會把翻譯的信息暴露給用戶;
缺點:
- 資源文件會編譯時可執行程序,所以會導致可執行程序的體積變大(但是.qm文件一般很小,這個缺點可以忽略不計);
- 當只修改翻譯不修改源碼時也必須重新編譯可執行程序。
在程序外部加載:
優點:
- 當只修改翻譯不修改源碼時不用重新編譯可執行程序,只要替換修改後的.qm文件;
- 不會影響可執行程序的大小;
缺點:
- 程序發佈時,要把最新.qm文件中複製到相應加載路徑下(在實際開發中經常會忘了這個步驟),導致沒有翻譯或翻譯不準確;
- 把翻譯信息暴露給用戶,可能會被用戶修改(不可抗因素,可以忽略)。