首页 > 其他分享 >Qt 多语言实现

Qt 多语言实现

时间:2023-06-17 22:38:44浏览次数:30  
标签:翻译 include Qt language 实现 translator Translate qm 语言


简介

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

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

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

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

  • 对用户可见的文本信息全部使用 tr() 进行封装
  • 提供用户可以用来切换语言的一种方法。
  • 对于每一个窗口部件或者对话框,重写 changeEvent
    事件,当事件类型为QEvent::LanguageChange时,翻译文本进行重新调用(为了简单我把它放在一个单独的函数translateUI()中)。

多语言切换实例效果

Qt 多语言实现_qt

添加翻译源

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

在pro中添加:

TRANSLATIONS += Translate_EN.ts \
               Translate_CH.ts

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

Qt 多语言实现_java_02

翻译

Qt 多语言实现_Qt_03

发布翻译

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

Qt 多语言实现_Qt_04

源码分析

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

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("这是需要测试的文本"));
}


标签:翻译,include,Qt,language,实现,translator,Translate,qm,语言
From: https://blog.51cto.com/u_15461374/6506383

相关文章

  • C语言的几种缺陷及其规避方法
    一、C语言的几种缺陷C语言作为一种老牌编程语言,在其诞生时代的背景下是十分先进的,为编程领域的发展做出了重要贡献。但是,随着计算机体系结构、软硬件环境的不断演进,C语言所存在的一些缺点也逐渐凸显出来。以下是C语言的一些缺陷:容易出现指针错误:C语言中广泛使用指针,而指针访问出错......
  • java 如何实现控制台打印sql语句
    springboot项目打印sql语句2019.9.27首先我们看一下效果现在直接上代码:logback-spring.xml文件<configuration><!--%m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】,,,--><!--appender是configuration的子节点,是负责......
  • 哈工大体系结构lab3 —— 流水线处理器的verilog实现
    流水线处理器的verilog实现个人认为我码风还算可以,如果我的代码有写的错误/值得改进之处,欢迎指出!!base版本设计图如下,WB阶段有一个MUX没画,因为没地方了(懒了)哈哈最后版本跟我最开始写出来的框架有些许变化,如果你看到了让你不知所以然的代码,大概率是修锅的时候造的。。CPU.v`timesc......
  • Go语言学习总结
    1.跳出/执行下一次循环。{标签名}:fortrue{...fortrue{...break/continue{标签名}//默认不加标签,则跳出最近一层循环。加了标签可以跳出标签定义处所在循环}}2.map的使用注意项。因为map是指针,作为参数传递时,在函数内部对map作的修改......
  • nginx反向代理实现不同域名映射到同一台服务器的相同端口
    在实际应用中,我们经常会遇到多个域名需要映射到同一台服务器的相同端口的情况,这时可以使用nginx反向代理来实现。以实现将www.example.com和www.test.com都映射到127.0.0.1的80端口为例,具体步骤如下:修改hosts文件在本地hosts文件中添加以下两行:127.0.0.1www.example.com127.0.0.1......
  • Lua 中如何实现继承
    本文主要参考了菜鸟教程中的Lua面向对象,再加上自己学习过程的中思考,特此记录,如果文中有不对的地方,请不吝赐教。这里就不在介绍面向对象的基本思想了,主要讲一讲Lua中如何实现继承,包括单继承和多继承。1、如何定义一个类我们知道,对象由属性和方法组成。Lua中最基本的结构......
  • C语言-数据存储详解
     C语言类型内置类型整型家族char//字符数据类型1个字节unsignedcharsignedcharshort//短整型4个字节unsignedshort[int]signedshort[int]int//整型4个字节 unsignedint  signedint long//长整型8个字节unsignedlong[int] signedlong[int]longlong//更长......
  • 联合变更代码实现
    【参考】https://blog.csdn.net/qq_40859492/article/details/124428555【主要原理】1)写EntryConfChangeV22)apply时,进入联合共识阶段,用Cold_new决策,创建一个空EntryConfChangeV2日志Entry3)apply空日志时,结束联合共识【疑问】......
  • PySide6(Qt for Python) QTableWidget表头边框线问题
    这个问题是在Windows10平台下特有问题。网络上有很多QtC++的解决方案。但是没有特定的PySide6的解决方案(以下是参考的QtC++的解决方案)。链接:https://blog.csdn.net/qq_22642239/article/details/122863344问题描述C++的解决方案是设置纵横表头的样式表:horizontalHeader,v......
  • “子绝父相”能实现元素覆盖么?
    当将父元素设置position:relative;,子元素设置position:absolute;时,能实现子元素覆盖在父元素上面。<head><style>.box1{position:relative;background-color:greenyellow;height:50px;width:50px;......