Qt多语言/多语种详细开发教程

Qt作为跨平台的开发工具,早已应用到各行各业的软件开发中。

今天讲讲,Qt开发的正序怎么做多语言开发。就是说,你设置中文,就中文显示;设置英语就英文显示,设置繁体就繁体显示,设置发育就显示法语等。

开发环境(其实多语种这块根环境没太大关系):win10,Qt.5.12.10

下文例子已经上传Qt语言家实现多语言切换

一.先用QtCreator创建一个简单的桌面程序

1.工程就随便命名"LanguageTest",其他默认。

2.在设计师界面,移除掉菜单栏和状态栏等乱七八糟的,编译一下,确保初始的工程正常。

3.现在我添加两个QLabel标签label1,和label2用于显示文字,两个按钮bt_CN和bt_EN用于语言切换。

4.工程文件.pro添加语言配置

cpp 复制代码
#语言包,ts语言文件放置在工程目录下的"translate"文件夹中
TRANSLATIONS += \
    translate/LanguageTest_cn.ts \
    translate/LanguageTest_en.ts

4.使用Qt语言家生成ts语言文件

在QtCreator的菜单栏中,点击 "工具"->"外部"->"Qt语言家"->"更新翻译",会在"translate"文件夹中生成中文和英语的的两个ts,文件。

5.使用Qt的Linguist工具来编辑语言库

根据你程序以后运行的环境(下图中可以看到Linguist工具有好几个,32位的,64位的,MSVC的,MinGW的),选择对应环境的Linguist工具打开。

打开语言家工具后,点击"文件"->"打开",找到测试程序工程目录下的"translate"文件夹,将两个ts文件都选中。

出现弹框,选择好源语言和目标语言

6.编辑多语言

在Qt语言家中,按照翻译给你的文档,将对应的源文本翻译成各个语种。

完成后点击"文件"->"保存全部"->"发布全部",会发现在"translate"文件夹中又生成了两个qm文件。qm文件就是后续程序发布时要附带的真正的语言包文件。

7.程序中加载qm语言包

(1).工程的main.cpp中自己顶一个函数添加语言的加载

cpp 复制代码
#include "mainwindow.h"

#include <QApplication>

#include <QTranslator>
#include <QFileInfo>

bool loadLanguageTranslator(QTranslator *trans)
{
    QString strLanguageValue;
    int nLanguage = 0;
    bool ret;
    QString strLanguagePath;
    switch (nLanguage) {
    case 0:
    default:
        // chinese
        strLanguagePath = QCoreApplication::applicationDirPath() + "/translate/" + "LanguageTest_cn.qm";
        break;
    case 1:
        // English
        strLanguagePath = QCoreApplication::applicationDirPath() + "/translate/" + "LanguageTest_en.qm";
        break;
    }
    ret = trans->load(strLanguagePath);
    if (ret)
    {
        qApp->installTranslator(trans);
        return true;
    }
    else
    {
        //出错
        return false;
    }
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    //载入语言包
    QTranslator trans;
    bool ret = loadLanguageTranslator(&trans);
    if (!ret)
    {
        //出错
    }
    w.show();
    return a.exec();
}

你可以将"nLanguage "卸载配置文件中读取,这样你程序开启时,设置的"nLanguage "如果是0,就会自动显示为中文,如果是1就会自动显示为英文。

(2),在程序中添加即时切换

上面的代码智能在程序开启的时候转换语言,现在对两个按钮bt_CN和bt_EN操作,用于语言切换功能让程序再不关闭的情况下随时切换语言便显示切换效果。

这就需要修改上面的代码,需要先给各个窗体页面加上语言切换事件;再在"MainWindow"中添加设置语言转换函数,再通过按钮进行切换加载,详细看代码:

cpp 复制代码
//MainWindow.h头文件添加
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTranslator>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

    void setTranslator(QTranslator *trans);

    void onLanguageTrans(int index);

protected:
    //刷新语言
    void changeEvent(QEvent *event);


private slots:
    void on_bt_CN_clicked();

    void on_bt_EN_clicked();

private:
    Ui::MainWindow *ui;

    //语言包
    QTranslator *m_pTranslator = nullptr;

};
#endif // MAINWINDOW_H


//源文件添加
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTranslator>

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

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

void MainWindow::setTranslator(QTranslator *trans)
{
    m_pTranslator = trans;
}

//刷新语言
void MainWindow::changeEvent(QEvent *event)
{
    switch (event->type()) {
    case QEvent::LanguageChange:
    {
        ui->retranslateUi(this);
        break;
    }
    default:
        QWidget::changeEvent(event);
    }
}

void MainWindow::on_bt_CN_clicked()
{
    //刷新语言
    onLanguageTrans(0);
    ui->retranslateUi(this);
}

void MainWindow::on_bt_EN_clicked()
{
    //刷新语言
    onLanguageTrans(1);
    ui->retranslateUi(this);
}


void MainWindow::onLanguageTrans(int index)
{

    QTranslator* pTrans = m_pTranslator;

    qApp->removeTranslator(pTrans);

    QString strPath;

    QString strLanguagePath;
    switch (index) {
    case 0:
    default:
        // chinese
        strLanguagePath = QCoreApplication::applicationDirPath() + "/translate/" + "LanguageTest_cn.qm";
        break;
    case 1:
        // English
        strLanguagePath = QCoreApplication::applicationDirPath() + "/translate/" + "LanguageTest_en.qm";
        break;
    }
    int ret = pTrans->load(strLanguagePath);
    if (ret)
    {
        qApp->installTranslator(pTrans);
        setTranslator(pTrans);
    }
    else
    {
        //出错
    }
}

这样修改好之后,编译完成。再将"translate"文件夹及其内部生成的两个qm文件,拷贝到程序的生成目录。

通过按钮切换,及事件响应,就会即时变换语种。


8.代码中的文字切换

如果遇到代码中要翻译的语种怎么办?

使用tr()将文字包裹起来,在语言家中就会自动被识别出来

至此,多语种转换完成。

相关推荐
yueqingll6 分钟前
020、二级Java选择题综合知识点(持续更新版)
java·开发语言
Cedric_Anik13 分钟前
MYSQL数据库基础篇——DDL
数据库·mysql
文牧之13 分钟前
PostgreSQL的walsender和walreceiver进程介绍
运维·数据库·postgresql
爬山算法15 分钟前
Oracle(121)如何进行数据文件的恢复?
数据库·oracle
咔咔学姐kk18 分钟前
2024最新版,人大赵鑫老师《大语言模型》新书pdf分享
数据库·人工智能·语言模型·自然语言处理·pdf·知识图谱·产品经理
计算机学姐23 分钟前
基于python+django+vue的在线学习资源推送系统
开发语言·vue.js·python·学习·django·pip·web3.py
A洛26 分钟前
Cloudflare Pages 部署 Next.js 应用教程
开发语言·github·nextjs·cloudflare·cloudflarepages
lly20240630 分钟前
Rust 函数
开发语言
许野平33 分钟前
Rust:深入浅出说一说 Error 类型
java·开发语言·rust·error
jingling55538 分钟前
后端开发刷题 | 数字字符串转化成IP地址
java·开发语言·javascript·算法