1、动态翻译效果展示
展示中可以实现主界面和子界面包括弹窗的中英文动态翻译。
2、创建翻译ts文件
首先,在程序中要翻译的文字,要用tr()函数包含起来,这个函数是表明改字符串是需要翻译的。
其次,在工程的pro文件里添加生成ts的代码,如下
TRANSLATIONS = English.ts \
Chinese.ts
这个代码表示要生成两个ts文件,也就是翻译对应的文件。
然后点击工具 → 外部 → Qt预言家 → 更新翻译(lupdate)来生成ts文件
可以在工程目录下,新生成的其他文件下有English.ts和Chinese.ts两个文件。
3、使用Linguist进行翻译 并添加到资源文件#
打开Qt Linguist,打开刚刚生成的两个ts文件,这样就可以看到需要去翻译的字符串了
打开ts文件后,先填入中文和英文的翻译,然后点击3的问号进行确认,翻译完所有字符串后,点击4中的发布,生成English.qm和Chinese.qm两个文件。
将上述生成的qm文件作为资源文件添加到工程中。
4、changeEvent函数实现动态翻译
重写changeEvent函数,检查语言变换和更新,此步骤要配合main函数中注册安装翻译器使用。
void Widget::changeEvent(QEvent *event)
{
if (event->type() == QEvent::LanguageChange)
{
ui->retranslateUi(this);
if(tranIndex == 0){
ui->pushButton_3->setText("English");
}
else
{
ui->pushButton_3->setText("中文");
}
}
else
{
QWidget::changeEvent(event);
}
}
在main文件中设置初始的语言,并安装翻译器
QTranslator translator;
translator.load(":/translation/Chinese.qm");
a.installTranslator(&translator);
5、详细代码
main.cpp
#include "widget.h"
#include <QTranslator>
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator translator;
translator.load(":/translation/Chinese.qm");
a.installTranslator(&translator);
Widget w;
w.setTranslator(&translator);
w.setTranSet();
w.show();
return a.exec();
}
widget.cpp
#pragma execution_character_set("utf-8")
#include "widget.h"
#include "ui_widget.h"
#include "form.h"
#include <QMessageBox>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
Form *form = new Form();
form->show();
}
void Widget::on_pushButton_3_clicked()
{
if(tranIndex == 0){
m_translator->load(":/translation/English.qm");
tranIndex = 1;
ui->pushButton_3->setText("中文");
}
else{
m_translator->load(":/translation/Chinese.qm");
tranIndex = 0;
ui->pushButton_3->setText("English");
}
ui->pushButton_3->setText("语言");
}
void Widget::on_pushButton_2_clicked()
{
QMessageBox::information(NULL, tr("提示"), tr("是否删除该孔模型?"),QMessageBox::Yes | QMessageBox::Cancel,QMessageBox::Yes);
}
void Widget::changeEvent(QEvent *event)
{
if (event->type() == QEvent::LanguageChange)
{
ui->retranslateUi(this);
if(tranIndex == 0){
ui->pushButton_3->setText("English");
}
else
{
ui->pushButton_3->setText("中文");
}
}
else
{
QWidget::changeEvent(event);
}
}
>widget.h
void Widget::setTranslator(QTranslator *translator)
{
this->m_translator = translator;
}
void Widget::setTranSet()
{
if(tranIndex == 0){
ui->pushButton_3->setText("English");
}
else{
ui->pushButton_3->setText("中文");
}
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTranslator>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void setTranslator(QTranslator *translator);
void setTranSet();
private slots:
void on_pushButton_clicked();
void on_pushButton_3_clicked();
void on_pushButton_2_clicked();
protected:
void changeEvent(QEvent *event);
private:
Ui::Widget *ui;
QTranslator *m_translator;
int tranIndex = 0;
};
#endif // WIDGET_H
6、总结
动态翻译主要是要重写changeEvent事件,以便实时获取语言变更和更新。源代码附在最后,以便后续学习使用。
transTest 动态翻译源代码,开源仓库欢迎点赞收藏