一、环境介绍
操作系统介绍:win10 64位
QT版本: 5.12.6
二、功能介绍、演示
如果开发的软件需要给其他国家的客户使用,软件界面上的文字就需要根据不同的国家进行翻译,方便别人使用,QT支持语言翻译,只需要提前制作好语言翻译文件,加载即可。
三、新建一个简单的工程进行测试
3.1 设计一个UI界面
在设计UI界面的时候,可以确定下控件的文本是否支持翻译。
3.2 cpp代码
为了方便测试效果,界面加了一个弹窗按钮。程序代码里的文本如果需要翻译,需要使用tr包起来。
编译运行测试一下。
3.3 修改xxx.pro工程文件
TRANSLATIONS += tr_Chinese.ts tr_English.ts tr_Japanese.ts
这里是指定对应语言生成的ts文件名称, 名称可以随意命名(语言.ts),自己看得懂就行。
我这里是指定了中文、英文、日文三种语言,如果需要支持其他国家语言,自己增加即可,文件的名称其实无所谓,但是写清楚一点也方便自己区分。
3.4 生成ts文件
选择工具栏里的,更新翻译选项,会在当前工程目录下生成刚在在pro工程文件里指定的3个文件。
其实打开windows命令行终端也可以自己调用生命令生成。
语法:
lupdate.exe <工程文件名称>
这个lupdate.exe程序是在QT编译器对应的安装目录下。
3.5 翻译ts文件
接下来就需要自己翻译ts文件,根据不同国家的语言进行修改翻译。
3.5.1 可以直接使用文本文件打开ts文件进行翻译即可。把需要翻译字段,根据不同国家的语言进行修改。
翻译完毕之后,点击工具栏里的发布按钮,就可以生成对应的qm文件。
相当于在命令行执行了命令: lrelease.exe <工程文件名称>
3.5.2 如果想要看到更加直观的效果,也可以使用QT自带的Qt Linguist 工具进行编辑翻译
打开需要翻译的文件,进行逐个翻译。
全部翻译完毕之后,可以看一下翻译之后的效果。
搞定之后,点击保存,再点击发布。
发布之后,会在ts文件的同级目录下生成一个对应qm文件。
接下来将剩余的ts文件按照上面的方式全部翻译,发布即可。
3.6 将生成的qm文件加载到资源文件中
为了方便程序调用,将生成的qm文件添加到QT的资源文件里。
3.7 编写切换语言的代码
想要完成语言的实时切换,需要完成3个步骤:
1. 编写语言切换接口
/*
工程: LanguageSwitching
日期: 2021-02-23
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 设置语言翻译
*/
void MainWindow::ChangeCurLanguage(QString strLang)
{
//卸载原来的语言
QApplication::removeTranslator(&m_qtTs);
if (strLang == "Chinese")
{
QString qtQmName = QString(":/tr_Chinese.qm");
m_qtTs.load(qtQmName);
}
else if (strLang == "English")
{
QString qtQmName = QString(":/tr_English.qm");
m_qtTs.load(qtQmName);
}
else if (strLang == "Japanese")
{
QString qtQmName = QString(":/tr_Japanese.qm");
m_qtTs.load(qtQmName);
}
//安装新的语言
QApplication::installTranslator(&m_qtTs);
}
2. 捕获语言改变事件
/*
工程: LanguageSwitching
日期: 2021-02-23
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 捕获语言改变事件
*/
void MainWindow::changeEvent(QEvent *e)
{
switch (e->type())
{
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
3. 调用接口切换语言
ChangeCurLanguage("Chinese");
ChangeCurLanguage("English");
ChangeCurLanguage("Japanese");
3.8 整个工程的完整代码示例
3.8.1 .h文件代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMessageBox>
#include <QTranslator>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
QTranslator m_qtTs; //QT国际化应用--翻译语言
void ChangeCurLanguage(QString strLang);
void changeEvent(QEvent *e);
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
void on_pushButton_4_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
3.8.2 .cpp代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setWindowTitle(tr("QT国际化支持"));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
//程序代码里需要翻译的地方,需要使用tr包起来
//文本的编码必须是UTF-8格式,防止乱码
QMessageBox::about(this,tr("提示信息"),tr("纯文本对话框演示!"));
}
/*
工程: LanguageSwitching
日期: 2021-02-23
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 设置语言翻译
*/
void MainWindow::ChangeCurLanguage(QString strLang)
{
//卸载原来的语言
QApplication::removeTranslator(&m_qtTs);
if (strLang == "Chinese")
{
QString qtQmName = QString(":/tr_Chinese.qm");
m_qtTs.load(qtQmName);
}
else if (strLang == "English")
{
QString qtQmName = QString(":/tr_English.qm");
m_qtTs.load(qtQmName);
}
else if (strLang == "Japanese")
{
QString qtQmName = QString(":/tr_Japanese.qm");
m_qtTs.load(qtQmName);
}
//安装新的语言
QApplication::installTranslator(&m_qtTs);
}
/*
工程: LanguageSwitching
日期: 2021-02-23
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 捕获语言改变事件
*/
void MainWindow::changeEvent(QEvent *e)
{
switch (e->type())
{
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
/*
工程: LanguageSwitching
日期: 2021-02-23
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 简体中文
*/
void MainWindow::on_pushButton_2_clicked()
{
ChangeCurLanguage("Chinese");
}
/*
工程: LanguageSwitching
日期: 2021-02-23
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 英语
*/
void MainWindow::on_pushButton_3_clicked()
{
ChangeCurLanguage("English");
}
/*
工程: LanguageSwitching
日期: 2021-02-23
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 日本语
*/
void MainWindow::on_pushButton_4_clicked()
{
ChangeCurLanguage("Japanese");
}
下面公众号有全套C语言、C++、QT、单片机的基础教程,欢迎关注。