简介

Qt Linguist 提供了一套加速应用程序翻译和国际化的工具。Qt 使用单一的源码树和单一的应用程序二进制包就可同时支持多个语言和书写系统。

使用 QTranslator 来加载生成的 qm 文件,就可以让程序显示指定的语言。

// 国际化翻译
QString language = "CH"; // 默认为中文,后期可以使用ini方式保存语言选项
QTranslator translator;
translator.load(QString(":/Translate_") + language);
a.installTranslator(&translator);

要进行多语言的切换,需要执行以下步骤:

  • 对用户可见的文本信息全部使用 tr() 进行封装

  • 提供用户可以用来切换语言的一种方法。

  • 对于每一个窗口部件或者对话框,重写 changeEvent 事件,当事件类型为QEvent::LanguageChange时,翻译文本进行重新调用(为了简单我把它放在一个单独的函数translateUI()中)。

多语言切换实例效果

添加翻译源

为了方便,这里只介绍中、英文之间的切换。

在pro中添加:

TRANSLATIONS += Translate_EN.ts \
Translate_CH.ts

选择:工具->外部->Qt 语言家->更新翻译,则会生成对应的 ts 文件。

翻译

使用Qt Linguist打开要翻译的ts文件,对翻译源进行相应语言的翻译。

发布翻译

选择:文件->发布,就会生成对应的 qm 文件。

源码分析

我们来看一个简单的示例:主界面可根据选择不同语言下拉选项实现语言的动态切换!

main.cpp:

#include "Translate.h"

#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv); // 国际化翻译
QString language = "CH"; // 默认为中文,后期可以使用ini方式保存语言选项
QTranslator translator;
translator.load(QString(":/Translate_") + language);
a.installTranslator(&translator); Translate w;
w.setTranslator(&translator);
w.show(); return a.exec();
}

Translate.h:

#ifndef TRANSLATE_H
#define TRANSLATE_H #include <QWidget>
#include <QTranslator>
#include <QLabel>
#include <QComboBox>
#include <QVBoxLayout>
#include <QEvent>
#include <QApplication>
#include <QDebug> class Translate : public QWidget
{
Q_OBJECT public:
Translate(QWidget *parent = nullptr);
void setTranslator(QTranslator* translator); // 设置翻译对象 protected:
void changeEvent(QEvent *event); // 改变事件 private:
void translateUI(); // 统一设置需要被翻译的文本 QLabel *m_pLabText;
QComboBox *m_pComboBox;
QTranslator *m_translator; // 国际化翻译对象
};
#endif // TRANSLATE_H

Translate.cpp

#include "Translate.h"

Translate::Translate(QWidget *parent)
: QWidget(parent)
{
// 初始化界面
this->setFixedSize(400, 200); // 初始化控件
m_pLabText = new QLabel;
m_pComboBox = new QComboBox;
m_pComboBox->addItem("Chinese");
m_pComboBox->addItem("English"); // 主布局
QVBoxLayout *m_pLayoutMain = new QVBoxLayout(this);
m_pLayoutMain->addStretch();
m_pLayoutMain->addWidget(m_pLabText, 0, Qt::AlignCenter);
m_pLayoutMain->addSpacing(20);
m_pLayoutMain->addWidget(m_pComboBox, 0, Qt::AlignCenter);
m_pLayoutMain->addStretch();
m_pLayoutMain->setMargin(0); // 连接信号槽
connect(m_pComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=](int index) {
QString language_qm;
if(index == 0)
language_qm = QString(":/Translate_CH.qm");
else
language_qm = QString(":/Translate_EN.qm"); m_translator->load(language_qm);
qApp->installTranslator(m_translator); // 安装翻译器
}); // 统一设置需要被翻译的文本
translateUI();
} // 设置翻译对象
void Translate::setTranslator(QTranslator* translator)
{
m_translator = translator;
} // 改变事件:调用installTranslator后,系统会给窗体发送信号触发changeEvent事件
void Translate::changeEvent(QEvent *event)
{
switch (event->type())
{
case QEvent::LanguageChange:
translateUI();
break;
default:
QWidget::changeEvent(event);
}
} // 统一设置需要被翻译的文本
void Translate::translateUI()
{
m_pLabText->setText(tr("这是需要测试的文本"));
}

FloatWidget.cpp

#include "HelperWidget.h"

HelperWidget::HelperWidget(QWidget *parent) : QWidget(parent)
{
/* 界面初始化 */
this->setFixedSize(500, 200);
this->setWindowFlags(Qt::FramelessWindowHint);
this->setObjectName("FloatWidget");
setAttribute(Qt::WA_StyledBackground); // 不继承父窗口样式 m_pLabName = new QLabel;
m_pLabIp = new QLabel;
m_pBtnGet = new QPushButton;
m_pBtnPush = new QPushButton;
m_pBtnVideo = new QPushButton;
m_pLabSet = new QLabel;
m_pLabName->setText(tr("运维平台主屏"));
m_pLabIp->setText("192.168.1.71");
m_pBtnGet->setText("接管");
m_pBtnPush->setText("推送");
m_pBtnVideo->setText("视频");
m_pLabSet->setText("设置");
m_pLabSet->installEventFilter(this); // 悬浮小窗口-窗口部件初始化
m_pWidgetFloatSet = new QWidget;
m_pBtnUser = new QPushButton;
m_pBtnMatrix = new QPushButton;
m_pBtnShortCut = new QPushButton;
m_pWidgetFloatSet->setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
m_pWidgetFloatSet->installEventFilter(this);
m_pBtnUser->setText("用户权限");
m_pBtnMatrix->setText("矩阵");
m_pBtnShortCut->setText("快捷键");
QVBoxLayout *pVLayoutSet = new QVBoxLayout(m_pWidgetFloatSet);
pVLayoutSet->addWidget(m_pBtnUser);
pVLayoutSet->addWidget(m_pBtnMatrix);
pVLayoutSet->addWidget(m_pBtnShortCut); QHBoxLayout *pHLayoutBtn = new QHBoxLayout;
pHLayoutBtn->addWidget(m_pBtnGet);
pHLayoutBtn->addWidget(m_pBtnPush);
pHLayoutBtn->addWidget(m_pBtnVideo);
pHLayoutBtn->addWidget(m_pLabSet); QVBoxLayout *pVLayoutMain = new QVBoxLayout(this);
pVLayoutMain->addWidget(m_pLabName);
pVLayoutMain->addWidget(m_pLabIp);
pVLayoutMain->addLayout(pHLayoutBtn);
pVLayoutMain->addSpacing(60); // 信号槽链接
connect(m_pBtnGet, &QPushButton::clicked, [=]() {
emit sigBtnClickedGet();
});
connect(m_pBtnPush, &QPushButton::clicked, [=]() {
emit sigBtnClickedPush();
});
connect(m_pBtnVideo, &QPushButton::clicked, [=]() {
emit sigBtnClickedVideo();
}); // 在eventFilter中处理显隐则导致鼠标进入不了悬浮窗就会隐藏,所以用定时器去做
m_pTimerFloat = new QTimer;
m_pTimerFloat->setInterval(100);
connect(m_pTimerFloat, &QTimer::timeout, [=]() {
if ((m_pWidgetFloatSet != nullptr) && (m_pWidgetFloatSet->isVisible()))
{
// 判断鼠标是否游离到了悬浮窗之外,如果游离出去了,那么隐藏窗口
QPoint currentPos = QCursor::pos();
QRect floatWidgetRect = m_pWidgetFloatSet->rect();
QRect rect(m_pWidgetFloatSet->pos().x(), m_pWidgetFloatSet->pos().y(), floatWidgetRect.width(), floatWidgetRect.height());
if (!rect.contains(currentPos)){
m_pWidgetFloatSet->hide();
m_pTimerFloat->stop();
}
}
});
} // 事件过滤器(实现悬浮小窗口)
bool HelperWidget::eventFilter(QObject *obj, QEvent *event)
{
if (obj == m_pLabSet)
{
if (event->type() == QEvent::Enter)
{
QPoint oWidgetPoint = this->mapToGlobal(m_pLabSet->pos());
m_pWidgetFloatSet->setGeometry(oWidgetPoint.x(), oWidgetPoint.y() + m_pLabSet->height(), 80, 80);
m_pWidgetFloatSet->show(); m_pTimerFloat->stop();
return true;
}
else if (event->type() == QEvent::Leave) //如果是其他事件,可以进行进一步的处理
{
m_pTimerFloat->start();
return false;
}
else
return false;
}
else if (obj == m_pWidgetFloatSet)
{
if (event->type() == QEvent::Leave)
{
m_pWidgetFloatSet->hide();
return false;
}
else
return false;
}
else
return QWidget::eventFilter(obj, event);
}

Qt 国际化翻译的更多相关文章

  1. QT国际化 一 (lupdate/linguits/lrelease)

    QT国际化(lupdate/linguits/lrelease) 本文由乌合之众瞎写http://www.cnblogs.com/oloroso/ qt国际化其实就是qt中字符串的字符集编码的设置.当 ...

  2. 【Qt】Qt国际化【转】

    简介 Qt国际化属于Qt高级中的一部分,本想着放到后面来说,上节刚好介绍了Qt Linguist,趁热打铁就一起了解下. 对于绝大多数的应用程序,在刚启动时,需要加载默认的语言(或最后一次设置的语言) ...

  3. Qt国际化详细介绍,中文乱码以及解决方案

    Qt国际化的一般步骤 运行 lupdate,从应用程序的代码中提取所有界面上的可见字符.        这些可见字符必须被 tr() .QCoreApplication::translate().Qt ...

  4. QT国际化(中英转换)

    转载:https://blog.csdn.net/u012528526/article/details/54707233 QT国际化(中英转换) 我们都知道在安卓中,想做国际化很简单,只需要建立对应的 ...

  5. Ios国际化翻译工具

    IOS Translation Tool(IOS国际化翻译工具) 介绍 当IOS项目国际化的时候,手工去翻译每一个字符串是一件非常痛苦的事情.尤其是当项目中存在N多种语言.而且又很难保证,手工翻译的准 ...

  6. 给iview项目加一个i18n国际化翻译

    看了上一篇博客吗?我们就根据那一篇博客来,用里面的项目,进行我们接下来国际化翻译项目. 我们安装vue-i18n和js-cookie npm install vue-i18n npm install ...

  7. Qt国际化(Q_DECLARE_TR_FUNCTIONS() 宏给非Qt类添加翻译支持,以前没见过QTextEncoder和QTextDecoder和QLibraryInfo::location()和QEvent::LanguageChange)

    Internationalization with Qt 应用程序的国际化就是使得程序能在国际间可用而不仅仅是在本国可用的过程. Relevant Qt Classes andAPIs 以下的类支持Q ...

  8. qt 国际化(翻译时会触发changeEvent)

    1. 修改工程文件 .pro ,加入翻译源文件 hello_world.ts: TRANSLATIONS += \        Resource/translations/hello_world.t ...

  9. 6. QT国际化 translate QT语言家 翻译

    main. QTranslator *qtTranslator = new QTranslator(); if (IsChinese()) { qtTranslator->load(" ...

随机推荐

  1. 上半年最中意的 GitHub 更新「GitHub 热点速览 v.22.21」

    2022 年的热点速览加入 GitHub 产品动态之后,这次的图片显示是最得我意的,因为可以提升图片查看人的看片体验.而 GitHub 社区方面,GitHub 官方发布了部分开源项目的新版本.与此同时 ...

  2. 关于『进击的Markdown』:第五弹

    关于『进击的Markdown』:第五弹 建议缩放90%食用 路漫漫其修远兮,吾将上下而求索.  我们要接受Mermaid的考验了呢  Markdown 语法真香(一如既往地安利) ( 进击吧!Mark ...

  3. CabloyJS也有工作流引擎了,是你想要的吗?

    前言 众所周知,NodeJS作为后端开发语言和运行环境,样样都好,就差一个NodeJS工作流引擎.CabloyJS 4.0重点开发了NodeJS工作流引擎,并作为内置的基础核心模块,近一步拓展了Nod ...

  4. Tensor的组合与分块

    >>> a = torch.Tensor([[1,2],[3,4]])>>> atensor([[1., 2.], [3., 4.]]) >>> ...

  5. 基于web3D展示技术的煤矿巷道3D可视化系统

    地下开采离不开巷道工程.煤矿的生产.运输.排水.通风等各个环节都少不了巷道的支持.在煤矿智能化建设被提上日程的今天,巷道工程的智能化.可视化建设也成了行业趋势.尤其是复杂的井下作业环境,人员信息安全问 ...

  6. RocketMQ事务消息机制

    1.half消息对消费者不可见,用于确定MQ服务正常. 2.MQ响应half消息. 3.生产者执行本地事务. 4.生产者发送具体消息+本地事务状态,MQ根据本地事务状态执行Commit或者Rollba ...

  7. expect自动应答

    expect脚本 1. expect简介 expect是一个用来处理交互的命令.借助Expect,我们可以将交互过程写在一个脚本上,使之自动化完成. expect(自动应答) 基于TCL(Tool C ...

  8. UiPath文本操作Set Text的介绍和使用

    一.Set Text的介绍 向输入框/文本框写入文本的一种操作 二.Set Text在UiPath中的使用 1.打开设计器,在设计库中新建一个Sequence,为序列命名及设置Sequence存放的路 ...

  9. MySQL case when then 用法

    下面演示一下MYSQL中的CASE WHEN THEN的用法. 一. SELECT MENU_NAME, YXBZ, case YXBZ when 'Y' then '开放' when 'N' the ...

  10. Python 用configparser读写ini文件

    一.configparser 简介Python用于读写ini文件的一个官方标准库.具体详见官网链接 二.configparser 部分方法介绍 方法 描述 read(filenames) filesn ...