Qt中构建多语言程序
今天我们来测试一下在Qt 的Widget程序中构建多语言程序。
第一步
在界面上添加几个控件用来测试,一个ComboBox控件用来切换语言,如下图:

第二步
在项目文件中加上需要支持的语言文件。如下图:

C++
TRANSLATIONS += \
translations\zh_CN.ts\
translations\zh_TW.ts\
translations\en_US.ts\
translations\ko_KR.ts
我这里添加了四种语言,中文、繁体、英语、韩语。
第三步
使用Qt自带的命令行工具,输入命令:
c++
lupdate QMuliLangTest.pro # qmake 项目
此时在项目目录下的translations文件夹生成zh_cn.ts、zh_TW.ts、en_US.ts、ko_KR.ts文件。如下图:

第四步
找到QtCreator 目录下的Linguist.exe文件。然后打开第三步生成的.ts文件,如下图:

将对应的文本翻译成相对应的语言。
再次使用Qt自带的命令行工具,输入命令:
c++
lrelease QMuliLangTest.pro # 一次性全部 .ts→.qm
然后在之前的translations文件夹下,会生成.qm文件,如图:

第五步
编写代码,加载生成的.qm文件。
Main.cpp
C++
#include "mainwindow.h"
#include <QApplication>
#include <QCoreApplication>
#include <QSettings>
#include <QTranslator>
#include "global.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QString strExeDir = QCoreApplication::applicationDirPath();
QSettings settings(strExeDir + "\\config.ini",QSettings::IniFormat,nullptr);
settings.beginGroup("LANG");
int nIndex = settings.value("Lang").toInt();
settings.endGroup();
QLangID::instance().setLangId(nIndex);
QString strLangFile;
switch(nIndex)
{
case 0:
strLangFile = "\\language\\zh_CN.qm";
break;
case 1:
strLangFile = "\\language\\zh_TW.qm";
break;
case 2:
strLangFile = "\\language\\en_US.qm";
break;
case 3:
strLangFile = "\\language\\ko_KR.qm";
break;
}
QTranslator trans;
trans.load(strExeDir + strLangFile);
qApp->installTranslator(&trans);
MainWindow w;
w.show();
return a.exec();
}
global.h
C++
#ifndef GLOBAL_H
#define GLOBAL_H
class QLangID
{
public:
static QLangID& instance()
{
static QLangID langID;
return langID;
}
int getLangId()
{
return m_nLangID;
}
void setLangId(int nID)
{
m_nLangID = nID;
}
private:
// 禁止外部构造
QLangID() = default;
QLangID(const QLangID&) = delete;
int m_nLangID;
};
#endif // GLOBAL_H
MainWindow.cpp
c++
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QCoreApplication>
#include <QTranslator>
#include <QSettings>
#include "global.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->label->setText(tr("语言选择"));
ui->groupBox->setTitle(tr("多语言测试"));
ui->pushButton->setText(tr("按钮1"));
ui->label_2->setText(tr("文本1"));
ui->label_3->setText(tr("文本2"));
ui->comboBox->setCurrentIndex(QLangID::instance().getLangId());
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_comboBox_currentIndexChanged(int index)
{
QString strExeDir = QCoreApplication::applicationDirPath();
QString strLangFile;
switch(index)
{
case 0:
strLangFile = "\\language\\zh_CN.qm";
break;
case 1:
strLangFile = "\\language\\zh_TW.qm";
break;
case 2:
strLangFile = "\\language\\en_US.qm";
break;
case 3:
strLangFile = "\\language\\ko_KR.qm";
break;
}
static QTranslator* pTrans = nullptr;
if(pTrans)
qApp->removeTranslator(pTrans);
pTrans = new QTranslator(this);
pTrans->load(strExeDir + strLangFile);
qApp->installTranslator(pTrans);
ui->retranslateUi(this);
QSettings settings(strExeDir + "\\config.ini",QSettings::IniFormat,this);
settings.beginGroup("LANG");
settings.setValue("Lang",index);
settings.endGroup();
}
我这里使用QSettings类写配置文件,记录上一次选择的语言,然后在程序再次运行时,读取上一次设置的语言,然后应用到程序中。代码最终的运行效果如下:

到这里,我们简单实现了QtWidget程序的多语言界面。后续再添加菜单等组件的语言功能。
小结:
1.使用QCoreApplication::installTranslator()函数安装语言文件、QCoreApplication::removeTranslator()函数卸载语言文件。
2.QSettings类的简单使用读写配置文件。
3.使用单例模式构建一个简单的全局对象。用来出来从配置文件中读取的语言选项。