• Qt 国际化翻译


    简介

    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_Translate_D.gif

    添加翻译源

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

    在pro中添加:

    TRANSLATIONS += Translate_EN.ts \
                   Translate_CH.ts
    

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

    Qt_Translate_A.png


    翻译

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

    Qt_Translate_B.png


    发布翻译

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

    Qt_Translate_C.png


    源码分析

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

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

    代码下载

    GitHub 下载地址:https://github.com/confidentFeng/QtAppProject


  • 相关阅读:
    遇到swiper高度问题
    overflow
    transition过渡规定慢速开始,然后变快,然后慢速结束的过渡效果(cubic-bezier(0.25,0.1,0.25,1))。
    【记录一个问题】thinkpad x1笔记本,安装ubuntu 16后,拔掉U盘,总是启动到windows,无法启动到ubuntu
    【记录一个问题】笔记本ThinkPad X1-Extreme安装ubuntu 18后,更新nvidia显卡驱动后出现显示问题,无法再登录
    golang gin框架中实现一个简单的不是特别精确的秒级限流器
    【解决了一个小问题】golang中引用一个路径较长的库,导致goland中出现"module contains a go.mod file, so major version must be compatible: should be v0 or v1, not v2"
    【解决了一个小问题】golang samara的kafka客户端中使用错误版本号导致初始化失败
    【解决了一个小问题】golang xorm中使用where id in (xxx),没办法使用参数替换
    【记录一个问题】golangci-lint.exe中,盘符大写就会执行出错
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/16564866.html
Copyright © 2020-2023  润新知