QT应用编程: QT国际化支持(软件界面实现多国语言切换)

一、环境介绍

操作系统介绍:win10 64位

QT版本: 5.12.6

二、功能介绍、演示

如果开发的软件需要给其他国家的客户使用,软件界面上的文字就需要根据不同的国家进行翻译,方便别人使用,QT支持语言翻译,只需要提前制作好语言翻译文件,加载即可。

 

 

 

三、新建一个简单的工程进行测试

3.1 设计一个UI界面

在设计UI界面的时候,可以确定下控件的文本是否支持翻译。

3.2 cpp代码

为了方便测试效果,界面加了一个弹窗按钮。程序代码里的文本如果需要翻译,需要使用tr包起来。

编译运行测试一下。

3.3  修改xxx.pro工程文件 

TRANSLATIONS += tr_Chinese.ts tr_English.ts tr_Japanese.ts

这里是指定对应语言生成的ts文件名称, 名称可以随意命名(语言.ts),自己看得懂就行。  

我这里是指定了中文、英文、日文三种语言,如果需要支持其他国家语言,自己增加即可,文件的名称其实无所谓,但是写清楚一点也方便自己区分。

3.4 生成ts文件

选择工具栏里的,更新翻译选项,会在当前工程目录下生成刚在在pro工程文件里指定的3个文件。

其实打开windows命令行终端也可以自己调用生命令生成。

语法:
lupdate.exe <工程文件名称>

 这个lupdate.exe程序是在QT编译器对应的安装目录下。

3.5  翻译ts文件

接下来就需要自己翻译ts文件,根据不同国家的语言进行修改翻译。

3.5.1   可以直接使用文本文件打开ts文件进行翻译即可。把需要翻译字段,根据不同国家的语言进行修改。

翻译完毕之后,点击工具栏里的发布按钮,就可以生成对应的qm文件。

 相当于在命令行执行了命令:  lrelease.exe  <工程文件名称>

3.5.2  如果想要看到更加直观的效果,也可以使用QT自带的Qt Linguist 工具进行编辑翻译

打开需要翻译的文件,进行逐个翻译。

全部翻译完毕之后,可以看一下翻译之后的效果。

搞定之后,点击保存,再点击发布。

发布之后,会在ts文件的同级目录下生成一个对应qm文件。

接下来将剩余的ts文件按照上面的方式全部翻译,发布即可。

3.6  将生成的qm文件加载到资源文件中

为了方便程序调用,将生成的qm文件添加到QT的资源文件里。

3.7 编写切换语言的代码

想要完成语言的实时切换,需要完成3个步骤:

1. 编写语言切换接口

/*
工程: LanguageSwitching
日期: 2021-02-23
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 设置语言翻译
*/
void MainWindow::ChangeCurLanguage(QString strLang)
{
    //卸载原来的语言
    QApplication::removeTranslator(&m_qtTs);
    if (strLang == "Chinese")
    {
        QString qtQmName = QString(":/tr_Chinese.qm");
        m_qtTs.load(qtQmName);
    }
    else if (strLang == "English")
    {
        QString qtQmName = QString(":/tr_English.qm");
        m_qtTs.load(qtQmName);
    }
    else if (strLang == "Japanese")
    {
        QString qtQmName = QString(":/tr_Japanese.qm");
        m_qtTs.load(qtQmName);
    }

    //安装新的语言
    QApplication::installTranslator(&m_qtTs);
}

2. 捕获语言改变事件

/*
工程: LanguageSwitching
日期: 2021-02-23
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 捕获语言改变事件
*/
void MainWindow::changeEvent(QEvent *e)
{
    switch (e->type())
    {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

3.  调用接口切换语言

ChangeCurLanguage("Chinese");
ChangeCurLanguage("English");
ChangeCurLanguage("Japanese");

3.8  整个工程的完整代码示例

3.8.1 .h文件代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMessageBox>
#include <QTranslator>
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    QTranslator	m_qtTs; //QT国际化应用--翻译语言
    void ChangeCurLanguage(QString strLang);
    void changeEvent(QEvent *e);
private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_4_clicked();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

3.8.2 .cpp代码

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle(tr("QT国际化支持"));
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    //程序代码里需要翻译的地方,需要使用tr包起来
    //文本的编码必须是UTF-8格式,防止乱码
    QMessageBox::about(this,tr("提示信息"),tr("纯文本对话框演示!"));
}


/*
工程: LanguageSwitching
日期: 2021-02-23
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 设置语言翻译
*/
void MainWindow::ChangeCurLanguage(QString strLang)
{
    //卸载原来的语言
    QApplication::removeTranslator(&m_qtTs);
    if (strLang == "Chinese")
    {
        QString qtQmName = QString(":/tr_Chinese.qm");
        m_qtTs.load(qtQmName);
    }
    else if (strLang == "English")
    {
        QString qtQmName = QString(":/tr_English.qm");
        m_qtTs.load(qtQmName);
    }
    else if (strLang == "Japanese")
    {
        QString qtQmName = QString(":/tr_Japanese.qm");
        m_qtTs.load(qtQmName);
    }

    //安装新的语言
    QApplication::installTranslator(&m_qtTs);
}

/*
工程: LanguageSwitching
日期: 2021-02-23
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 捕获语言改变事件
*/
void MainWindow::changeEvent(QEvent *e)
{
    switch (e->type())
    {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}


/*
工程: LanguageSwitching
日期: 2021-02-23
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 简体中文
*/
void MainWindow::on_pushButton_2_clicked()
{
    ChangeCurLanguage("Chinese");
}

/*
工程: LanguageSwitching
日期: 2021-02-23
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 英语
*/
void MainWindow::on_pushButton_3_clicked()
{
   ChangeCurLanguage("English");
}

/*
工程: LanguageSwitching
日期: 2021-02-23
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 日本语
*/
void MainWindow::on_pushButton_4_clicked()
{
   ChangeCurLanguage("Japanese");
}

下面公众号有全套C语言、C++、QT、单片机的基础教程,欢迎关注。

猜你喜欢

转载自blog.csdn.net/xiaolong1126626497/article/details/113970945
今日推荐