[Qt学习笔记]Qt实现界面和程序中的动态翻译

1、动态翻译效果展示

transTest
展示中可以实现主界面和子界面包括弹窗的中英文动态翻译。

2、创建翻译ts文件

首先,在程序中要翻译的文字,要用tr()函数包含起来,这个函数是表明改字符串是需要翻译的。
其次,在工程的pro文件里添加生成ts的代码,如下

TRANSLATIONS = English.ts \
               Chinese.ts

这个代码表示要生成两个ts文件,也就是翻译对应的文件。
然后点击工具 → 外部 → Qt预言家 → 更新翻译(lupdate)来生成ts文件
生成ts.png
可以在工程目录下,新生成的其他文件下有English.ts和Chinese.ts两个文件。

3、使用Linguist进行翻译 并添加到资源文件#

打开Qt Linguist,打开刚刚生成的两个ts文件,这样就可以看到需要去翻译的字符串了
打开ts.PNG
打开ts文件后,先填入中文和英文的翻译,然后点击3的问号进行确认,翻译完所有字符串后,点击4中的发布,生成English.qm和Chinese.qm两个文件。
翻译.PNG
将上述生成的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 动态翻译源代码,开源仓库欢迎点赞收藏

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值