Qt中构建多语言程序

Qt中构建多语言程序

今天我们来测试一下在Qt 的Widget程序中构建多语言程序。

第一步

在界面上添加几个控件用来测试,一个ComboBox控件用来切换语言,如下图:

第二步

在项目文件中加上需要支持的语言文件。如下图:

C++ 复制代码
TRANSLATIONS += \
translations\zh_CN.ts\
translations\zh_TW.ts\
translations\en_US.ts\
translations\ko_KR.ts

我这里添加了四种语言,中文、繁体、英语、韩语。

第三步

使用Qt自带的命令行工具,输入命令:

c++ 复制代码
lupdate QMuliLangTest.pro          # qmake 项目

此时在项目目录下的translations文件夹生成zh_cn.ts、zh_TW.ts、en_US.ts、ko_KR.ts文件。如下图:

第四步

找到QtCreator 目录下的Linguist.exe文件。然后打开第三步生成的.ts文件,如下图:

将对应的文本翻译成相对应的语言。

再次使用Qt自带的命令行工具,输入命令:

c++ 复制代码
lrelease QMuliLangTest.pro         # 一次性全部 .ts→.qm

然后在之前的translations文件夹下,会生成.qm文件,如图:

第五步

编写代码,加载生成的.qm文件。

Main.cpp

C++ 复制代码
#include "mainwindow.h"
#include <QApplication>
#include <QCoreApplication>
#include <QSettings>
#include <QTranslator>
#include "global.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QString strExeDir = QCoreApplication::applicationDirPath();
    QSettings settings(strExeDir + "\\config.ini",QSettings::IniFormat,nullptr);
    settings.beginGroup("LANG");
    int nIndex =  settings.value("Lang").toInt();
    settings.endGroup();

    QLangID::instance().setLangId(nIndex);

    QString strLangFile;
    switch(nIndex)
    {
    case 0:
        strLangFile = "\\language\\zh_CN.qm";
        break;
    case 1:
        strLangFile = "\\language\\zh_TW.qm";
        break;
    case 2:
        strLangFile = "\\language\\en_US.qm";
        break;
    case 3:
        strLangFile = "\\language\\ko_KR.qm";
        break;
    }

    QTranslator trans;
    trans.load(strExeDir + strLangFile);
    qApp->installTranslator(&trans);

    MainWindow w;
    w.show();
    return a.exec();
}

global.h

C++ 复制代码
#ifndef GLOBAL_H
#define GLOBAL_H

class QLangID
{
public:
    static QLangID& instance()
    {
        static QLangID langID;
        return langID;
    }

    int getLangId()
    {
        return m_nLangID;
    }

    void setLangId(int nID)
    {
       m_nLangID = nID;
    }

private:
    // 禁止外部构造
    QLangID() = default;
    QLangID(const QLangID&) = delete;
    int m_nLangID;
};


#endif // GLOBAL_H

MainWindow.cpp

c++ 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QCoreApplication>
#include <QTranslator>
#include <QSettings>
#include "global.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->label->setText(tr("语言选择"));
    ui->groupBox->setTitle(tr("多语言测试"));
    ui->pushButton->setText(tr("按钮1"));
    ui->label_2->setText(tr("文本1"));
    ui->label_3->setText(tr("文本2"));

    ui->comboBox->setCurrentIndex(QLangID::instance().getLangId());

}

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

void MainWindow::on_comboBox_currentIndexChanged(int index)
{
    QString strExeDir = QCoreApplication::applicationDirPath();
    QString strLangFile;
    switch(index)
    {
    case 0:
        strLangFile = "\\language\\zh_CN.qm";
        break;
    case 1:
        strLangFile = "\\language\\zh_TW.qm";
        break;
    case 2:
        strLangFile = "\\language\\en_US.qm";
        break;
    case 3:
        strLangFile = "\\language\\ko_KR.qm";
        break;
    }

    static QTranslator* pTrans = nullptr;
    if(pTrans)
        qApp->removeTranslator(pTrans);
    pTrans = new QTranslator(this);
    pTrans->load(strExeDir + strLangFile);
    qApp->installTranslator(pTrans);
    ui->retranslateUi(this);

    QSettings settings(strExeDir + "\\config.ini",QSettings::IniFormat,this);
    settings.beginGroup("LANG");
    settings.setValue("Lang",index);
    settings.endGroup();
}

我这里使用QSettings类写配置文件,记录上一次选择的语言,然后在程序再次运行时,读取上一次设置的语言,然后应用到程序中。代码最终的运行效果如下:

到这里,我们简单实现了QtWidget程序的多语言界面。后续再添加菜单等组件的语言功能。

小结:

1.使用QCoreApplication::installTranslator()函数安装语言文件、QCoreApplication::removeTranslator()函数卸载语言文件。

2.QSettings类的简单使用读写配置文件。

3.使用单例模式构建一个简单的全局对象。用来出来从配置文件中读取的语言选项。

相关推荐
sycmancia12 小时前
Qt——文本打印与光标定位
开发语言·qt
qq_4017004117 小时前
Qt 多线程编程
开发语言·qt
Hua-Jay18 小时前
OpenCV联合C++/Qt 学习笔记(二十五)----加载深度神经网络模型及深度神经网络模型的使用
c++·笔记·qt·opencv·学习·计算机视觉·dnn
小牛蛋18 小时前
vcpkg 管理 PCL + VTK + Qt 开发三维点云可视化软件
开发语言·qt
小许同学记录成长20 小时前
Qt 自研测控软件-配置测试项
开发语言·qt
郝学胜-神的一滴20 小时前
CMake 011:跨平台动态库编译
开发语言·c++·嵌入式硬件·qt·程序人生·cmake·liunx
ai安歌20 小时前
鸿蒙PC:Qt适配OpenHarmony实战【昼刻】:用 Qt Quick 做一个可运行的鸿蒙时钟应用
qt·华为·harmonyos
小短腿的代码世界2 天前
Qt国际化深度解析:从源码到企业级多语言实践
java·数据库·qt
宠..2 天前
QComboBox 方法大全
开发语言·qt
郝学胜-神的一滴2 天前
Qt 高级开发 011: 跨线程信号槽实战
开发语言·c++·qt·程序人生·开源软件·用户界面