Qt作为跨平台的开发工具,早已应用到各行各业的软件开发中。
今天讲讲,Qt开发的正序怎么做多语言开发。就是说,你设置中文,就中文显示;设置英语就英文显示,设置繁体就繁体显示,设置发育就显示法语等。
开发环境(其实多语种这块根环境没太大关系):win10,Qt.5.12.10
下文例子已经上传Qt语言家实现多语言切换
一.先用QtCreator创建一个简单的桌面程序
1.工程就随便命名“LanguageTest”,其他默认。
2.在设计师界面,移除掉菜单栏和状态栏等乱七八糟的,编译一下,确保初始的工程正常。
3.现在我添加两个QLabel标签label1,和label2用于显示文字,两个按钮bt_CN和bt_EN用于语言切换。
4.工程文件.pro添加语言配置
#语言包,ts语言文件放置在工程目录下的“translate”文件夹中
TRANSLATIONS += \
translate/LanguageTest_cn.ts \
translate/LanguageTest_en.ts
4.使用Qt语言家生成ts语言文件
在QtCreator的菜单栏中,点击 “工具”->“外部”->“Qt语言家”->“更新翻译”,会在“translate”文件夹中生成中文和英语的的两个ts,文件。
5.使用Qt的Linguist工具来编辑语言库
根据你程序以后运行的环境(下图中可以看到Linguist工具有好几个,32位的,64位的,MSVC的,MinGW的),选择对应环境的Linguist工具打开。
打开语言家工具后,点击“文件”->“打开”,找到测试程序工程目录下的“translate”文件夹,将两个ts文件都选中。
出现弹框,选择好源语言和目标语言
6.编辑多语言
在Qt语言家中,按照翻译给你的文档,将对应的源文本翻译成各个语种。
完成后点击“文件”->“保存全部”->“发布全部”,会发现在“translate”文件夹中又生成了两个qm文件。qm文件就是后续程序发布时要附带的真正的语言包文件。
7.程序中加载qm语言包
(1).工程的main.cpp中自己顶一个函数添加语言的加载
#include "mainwindow.h"
#include <QApplication>
#include <QTranslator>
#include <QFileInfo>
bool loadLanguageTranslator(QTranslator *trans)
{
QString strLanguageValue;
int nLanguage = 0;
bool ret;
QString strLanguagePath;
switch (nLanguage) {
case 0:
default:
// chinese
strLanguagePath = QCoreApplication::applicationDirPath() + "/translate/" + "LanguageTest_cn.qm";
break;
case 1:
// English
strLanguagePath = QCoreApplication::applicationDirPath() + "/translate/" + "LanguageTest_en.qm";
break;
}
ret = trans->load(strLanguagePath);
if (ret)
{
qApp->installTranslator(trans);
return true;
}
else
{
//出错
return false;
}
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
//载入语言包
QTranslator trans;
bool ret = loadLanguageTranslator(&trans);
if (!ret)
{
//出错
}
w.show();
return a.exec();
}
你可以将"nLanguage "卸载配置文件中读取,这样你程序开启时,设置的"nLanguage "如果是0,就会自动显示为中文,如果是1就会自动显示为英文。
(2),在程序中添加即时切换
上面的代码智能在程序开启的时候转换语言,现在对两个按钮bt_CN和bt_EN操作,用于语言切换功能让程序再不关闭的情况下随时切换语言便显示切换效果。
这就需要修改上面的代码,需要先给各个窗体页面加上语言切换事件;再在“MainWindow”中添加设置语言转换函数,再通过按钮进行切换加载,详细看代码:
//MainWindow.h头文件添加
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTranslator>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void setTranslator(QTranslator *trans);
void onLanguageTrans(int index);
protected:
//刷新语言
void changeEvent(QEvent *event);
private slots:
void on_bt_CN_clicked();
void on_bt_EN_clicked();
private:
Ui::MainWindow *ui;
//语言包
QTranslator *m_pTranslator = nullptr;
};
#endif // MAINWINDOW_H
//源文件添加
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTranslator>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::setTranslator(QTranslator *trans)
{
m_pTranslator = trans;
}
//刷新语言
void MainWindow::changeEvent(QEvent *event)
{
switch (event->type()) {
case QEvent::LanguageChange:
{
ui->retranslateUi(this);
break;
}
default:
QWidget::changeEvent(event);
}
}
void MainWindow::on_bt_CN_clicked()
{
//刷新语言
onLanguageTrans(0);
ui->retranslateUi(this);
}
void MainWindow::on_bt_EN_clicked()
{
//刷新语言
onLanguageTrans(1);
ui->retranslateUi(this);
}
void MainWindow::onLanguageTrans(int index)
{
QTranslator* pTrans = m_pTranslator;
qApp->removeTranslator(pTrans);
QString strPath;
QString strLanguagePath;
switch (index) {
case 0:
default:
// chinese
strLanguagePath = QCoreApplication::applicationDirPath() + "/translate/" + "LanguageTest_cn.qm";
break;
case 1:
// English
strLanguagePath = QCoreApplication::applicationDirPath() + "/translate/" + "LanguageTest_en.qm";
break;
}
int ret = pTrans->load(strLanguagePath);
if (ret)
{
qApp->installTranslator(pTrans);
setTranslator(pTrans);
}
else
{
//出错
}
}
这样修改好之后,编译完成。再将“translate”文件夹及其内部生成的两个qm文件,拷贝到程序的生成目录。
通过按钮切换,及事件响应,就会即时变换语种。
8.代码中的文字切换
如果遇到代码中要翻译的语种怎么办?
使用tr()将文字包裹起来,在语言家中就会自动被识别出来
至此,多语种转换完成。