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

多语言切换实例效果

在这里插入图片描述

添加翻译源

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

在pro中添加:

TRANSLATIONS += Translate_EN.ts \
               Translate_CH.ts

选择:工具->外部->Qt 语言家->更新翻译,则会生成对应的 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("这是需要测试的文本"));
}

猜你喜欢

转载自blog.csdn.net/houxian1103/article/details/131214395