环境
系统: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
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
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,然后添加一个前缀"/",再把步骤8生成的两个.qm文件添加进来,如下图所示:
注意:添加完成后要执行一次qmake,否则会导致资源文件无法识别和加载的现象。
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文件中复制到相应加载路径下(在实际开发中经常会忘了这个步骤),导致没有翻译或翻译不准确;
把翻译信息暴露给用户,可能会被用户修改(不可抗因素,可以忽略)。