Qt国际化之tr() 动态翻译

目录

1,效果演示

2,第一步:将需要翻译的文本用:tr()函数封装

3,第二步:创建,并翻译:*.ts 文件,用翻译后的 *.ts 文件生成 *.qm文件

4,第三步:重写changeEvent函数

5,第四步:安装翻译器

6,代码


 参考博客:https://blog.csdn.net/liang19890820/article/details/50276673


1,效果演示

Qt国际化之tr() 动态翻译_第1张图片

2,第一步:将需要翻译的文本用:tr()函数封装

例如:

labelInfo = new QLabel(tr("人生苦短,我用 Qt!"), this);

3,第二步:创建,并翻译:*.ts 文件,用翻译后的 *.ts 文件生成 *.qm文件

(01):在工程文件:*.pro中添加以下代码:(根据自己需求,可以添加多个 *.ts 文件)

TRANSLATIONS += language_zh.ts \
                language_en.ts

 (02):生成 ts 文件:Qt Creator:工具 → 外部 → Qt预言家 → 更新翻译(lupdate)。

Qt国际化之tr() 动态翻译_第2张图片

之后可以在工程栏中看到生成的 language_zh.ts 、language_en.ts 两个文件。如图:(如果没有在工程栏中显示,可以关闭工程后重新打开)。

Qt国际化之tr() 动态翻译_第3张图片

(03):翻译 ts 文件:在工程栏中右击 language_zh.ts 、language_en.ts → 用...打开 → Qt Linguist. 打开、翻译,完成后保存。(直接启动Qt Linguist软件,打开并翻译ts文件也可以)。

Qt国际化之tr() 动态翻译_第4张图片

(04):生成 qm 文件:Qt Creator:工具 → 外部 → Qt预言家 → 发布翻译(lrelease)。

Qt国际化之tr() 动态翻译_第5张图片

 (05):将生成的 qm 文件添加到资源文件。(如果不使用资源文件的方式,可以直接使用路径方式加载 qm 文件)

4,第三步:重写changeEvent函数

重写窗口的事件处理函数:void changeEvent(QEvent *event),接收并处理:QEvent::LanguageChange 事件。

void MyDialog::changeEvent(QEvent *event)
{
    if(event->type() == QEvent::LanguageChange){
        this->setWindowTitle(tr("子窗口"));
        label->setText(tr("标签"));
        checkBox->setText(tr("复选框"));
        pushButton->setText(tr("按钮"));
    }
    else{
        QWidget::changeEvent(event);
    }
}

5,第四步:安装翻译器

通常在 main 函数中进行。

...
    QTranslator translator;
    translator.load(":/language_zh.qm");
    a.installTranslator(&translator);  //安装翻译器
...

6,代码

main.cpp 

#include "mainwindow.h"
#include 
#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTranslator translator;
    translator.load(":/language_zh.qm");
    a.installTranslator(&translator);  //安装翻译器

    MainWindow w;
    w.setTranslator(&translator);  //保存翻译器指针,用于动态翻译
    w.show();
    return a.exec();
}

mainwindow.h 、mainwindow.cpp

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 
#include 
#include 
#include 

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 *translator);
    void createDialog();

protected:
    void changeEvent(QEvent *event);

private:
    void translateUI();
    void switchLanguage();

private:
    Ui::MainWindow *ui;
    QTranslator *m_translator;

    QLabel *labelInfo;
    QPushButton *btnCreateWindow;
    QRadioButton *radioBtnZH;
    QRadioButton *radioBtnEN;
};
#endif // MAINWINDOW_H

 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 
#include 
#include 
#include "mydialog.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->resize(300, 240);
    this->setWindowTitle(tr("主窗口"));

    labelInfo = new QLabel(tr("人生苦短,我用 Qt!"), this);
    labelInfo->setAlignment(Qt::AlignHCenter);
    labelInfo->setGeometry(20, 60, 260, 25);

    radioBtnZH = new QRadioButton(tr("中文"), this);
    radioBtnZH->setChecked(true);
    radioBtnZH->setGeometry(20, 120, 80, 25);

    radioBtnEN = new QRadioButton(tr("英文"), this);
    radioBtnEN->setGeometry(100, 120, 80, 25);

    btnCreateWindow = new QPushButton(tr("新建一个窗口"), this);
    btnCreateWindow->setGeometry(180, 120, 100, 25);

    connect(radioBtnZH, &QRadioButton::clicked, this, &MainWindow::switchLanguage);
    connect(radioBtnEN, &QRadioButton::clicked, this, &MainWindow::switchLanguage);
    connect(btnCreateWindow, &QPushButton::clicked, this, &MainWindow::createDialog);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::setTranslator(QTranslator *translator)
{
    this->m_translator = translator;
}

void MainWindow::createDialog()
{
    MyDialog *dlg = new MyDialog;
    dlg->move(this->x()-dlg->width()-3, this->y());
    dlg->show();
}

void MainWindow::changeEvent(QEvent *event)
{
    if(event->type() == QEvent::LanguageChange)
        this->translateUI();
    else
        QWidget::changeEvent(event);
}

void MainWindow::translateUI()
{
    this->setWindowTitle(tr("主窗口"));
    labelInfo->setText(tr("人生苦短,我用 Qt!"));
    radioBtnZH->setText(tr("中文"));
    radioBtnEN->setText(tr("英文"));
    btnCreateWindow->setText(tr("新建一个窗口"));
}

void MainWindow::switchLanguage()
{
    if(radioBtnZH->isChecked())
        m_translator->load(":/language_zh.qm");
    else if(radioBtnEN->isChecked())
        m_translator->load(":/language_en.qm");
    else
        m_translator->load(":/language_zh.qm");
}

mydialog.h 、mydialog.cpp

#ifndef MYDIALOG_H
#define MYDIALOG_H

#include 
#include 
#include 
#include 

class MyDialog : public QDialog
{
    Q_OBJECT
public:
    MyDialog();

protected:
    void changeEvent(QEvent *event);
private:
    QLabel *label;
    QCheckBox *checkBox;
    QPushButton *pushButton;
};

#endif // MYDIALOG_H
#include "mydialog.h"
#include 
#include 

MyDialog::MyDialog()
{
    this->resize(200, 100);
    this->setAttribute(Qt::WA_DeleteOnClose);
    this->setWindowTitle(tr("子窗口"));

    label = new QLabel(tr("标签"), this);
    label->setGeometry(20, 10, 120, 25);

    checkBox = new QCheckBox(tr("复选框"), this);
    checkBox->setGeometry(20, 40, 120, 25);

    pushButton = new QPushButton(tr("按钮"), this);
    pushButton->setGeometry(20, 70, 120, 25);
}

void MyDialog::changeEvent(QEvent *event)
{
    if(event->type() == QEvent::LanguageChange){
        this->setWindowTitle(tr("子窗口"));
        label->setText(tr("标签"));
        checkBox->setText(tr("复选框"));
        pushButton->setText(tr("按钮"));
    }
    else{
        QWidget::changeEvent(event);
    }
}

 

你可能感兴趣的:(Qt/PyQt,qt)