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

news/2024/10/18 2:34:22/

目录

1,效果演示

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

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

4,第三步:重写changeEvent函数

5,第四步:安装翻译器

6,代码


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


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

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

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

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

 (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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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();elseQWidget::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");elsem_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);}
}

 


http://www.ppmy.cn/news/533596.html

相关文章

QString tr占位符

本节介绍 QString 的常见使用&#xff0c;包含 C 基本类型和 QString 的互相转换、QString 涉及的运算符、QString 子串查询和操作、利用 QTextStream 对 QString 做输入输出操作等&#xff0c;最后通过一个示例集成测试函数&#xff0c;展示 QString 用法。本节内容较多&#…

TR069协议

TR069协议 TR069协议简述 简单来说&#xff0c;TR069协议就是ACS&#xff08;自动配置服务器Automatic Configuration Serve&#xff09;和CPE&#xff08;用户终端设备Customer Premise Equipment&#xff09;之间沟通的通讯协议用下面一张图来表示&#xff1a;图中的CWMP指的…

html5中的td tr,html5 表格标签 table tr td

最重要的三个 属性: boarder 边框粗细 style 可配合css 使用 行标签 table row 有表就可以建行 单元格标签 table data 有行就可以建数据 属性: colspan data占用格子, 或者可以理解为这个单元格要合并多少个横向的单元格. rowspan 纵向占用格子… t…

C300 OLT OMCI下发VOIP和TR069 配置指导

1、配置业务所需的一些配置&#xff1a;如自定义ONU-type&#xff0c;vlan-profile&#xff0c;VOIP-profile等 gpon ##创建VOIP-profileonu profile sip INT-VOIP proxy **IP或者URL域名形式写入** …

表格标签的常用属性

表格标签的常用属性 <table></table>&#xff1a;表格 <tr></tr>&#xff1a;行 <td></td>&#xff1a;列 td要写在tr里面 <tr><td></td> </tr> 常用属性&#xff1a; border---指定边框 width---宽度 …

【系统开发】尚硅谷 - 谷粒商城项目笔记(十一):K8S

文章目录 K8s简介架构原理核心概念控制平面组件&#xff08;Control Plane Components&#xff09;kube-apiserveretcdkube-schedulerkube-controller-managercloud-controller-manager Node 组件kubeletkube-proxy容器运行时&#xff08;Container Runtime&#xff09; 插件&a…

td和th区别

Table往往是由一个表格名称再加上一行或多行的表格内容所构成块状结构。表格的每一行 内又由一个或多个表项单元组成&#xff0c;并且表项单元还可以按照行或列的方式结合在一起&#xff0c;成 为一个大的表项单元。 下面我们先来看一个Table实例&#xff1a; <TABLE BORDER…

Windows页面置换算法与文件操作

实验一 一、实验内容或题目&#xff1a; 随机产生页面访问序列&#xff0c;并实现LRU, FIFO, OPT三种算法进行缺页比较 二、实验目的与要求&#xff1a; 1、编写程序&#xff0c;随机产生页面访问序列&#xff0c;并实现LRU, FIFO, OPT三种算法进行缺页比较。 2、理解三种算…