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

650次阅读

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()

 

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

Qt国际化之tr()

 

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

Qt国际化之tr()

 

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

Qt国际化之tr()

 

 (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 <QApplication>

#include <QTranslator>


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 <QMainWindow>

#include <QTranslator>

#include <QLabel>

#include <QPushButton>

#include <QRadioButton>




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 <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QRadioButton>
#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 <QDialog>
#include <QLabel>
#include <QCheckBox>
#include <QPushButton>




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 <QEvent>

#include <QLabel>



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);

    }

}
yiywain
版权声明:本文于2021-11-18转载自Qt国际化之tr() 动态翻译,共计4926字。
转载提示:此文章非本站原创文章,若需转载请联系原作者获得转载授权。