Qt国际化的方法

引言

在进行客户端开发时,通常需要考虑多语言的场景,而这个Qt已经提供了成熟的多语言方案,也就是QtLinguist,但是网上很多时针对qmake的资料,下面就对其在CMake实际使用流程进行介绍。
在这里插入图片描述

使用流程

tr()

在使用Qt的多语言前,需要对代码进行处理,将需要翻译的字符串通过tr()包裹起来,告知程序哪些是需要翻译的字符串,如下所示:

auto label = new QLabel(tr("Hello, Qt Linguist"), this);
auto btn = new QPushButton(tr("Avada Kedavra"), this);
auto text_edit = new QTextEdit(this);
text_edit->setText(tr("Winter Is Coming"));

生成.ts文件

生成文件这里若使用qmake可通过QtCreator快捷生成,若使用CMake可以通过.bat脚本实现,如下所示:

set lupdate=C:/Qt/Qt5.15.2/5.15.2/msvc2015_64/bin/lupdate.exe
%lupdate% ../ -no-obsolete -ts test_en.ts
%lupdate% ../ -no-obsolete -ts test_zh_CN.ts
%lupdate% ../ -no-obsolete -ts test_ja.ts
pause

翻译

使用Linguist打开.ts文件,会显示出用tr()包裹的字段,再进行对应字段的翻译即可,如下所示:
在这里插入图片描述

生成.qm文件

完成.ts文件的翻译之后,需要生成.qm文件,这个是程序能够识别的二进制文件,同样可以使用脚本,如下所示:

set lrelease=C:/Qt/Qt5.15.2/5.15.2/msvc2015_64/bin/lrelease.exe
%lrelease% test_zh_CN.ts -qm test_zh_CN.qm
%lrelease% test_en.ts -qm test_en.qm
%lrelease% test_ja.ts -qm test_ja.qm
pause

加载.qm文件

首先需要将.qm放入资源文件中,再调用QApplication::installTranslator()加载到应用程序中,如下所示:

// 加载语言文件
QTranslator translator;
QString path = QString(":/example7_linguist/translation/test_%1.qm").arg(current_language);
if (translator.load(path)){
    QApplication::installTranslator(&translator);
}

完整代码

#ifndef EXAMPLEWIDGET7_HPP
#define EXAMPLEWIDGET7_HPP

#include <QWidget>

class QComboBox;
class QSettings;
class ExampleWidget7 : public QWidget
{
    Q_OBJECT
public:
    explicit ExampleWidget7(QWidget *parent = nullptr);

signals:
    void toReboot();

private:
    void InitLanguage();

private:
    QComboBox *language_combox_;
    QSettings *settings_;
};

#endif // EXAMPLEWIDGET1_HPP

#include "example_widget7.hpp"

#include <QLabel>
#include <QComboBox>
#include <QPushButton>
#include <QTextEdit>
#include <QVBoxLayout>
#include <QApplication>
#include <QTranslator>
#include <QSettings>
#include <QMessageBox>

ExampleWidget7::ExampleWidget7(QWidget *parent)
    : QWidget{parent}
{
    // 读配置文件
    settings_ = new QSettings("language_settings.ini", QSettings::IniFormat);
    QString current_language = settings_->value("preference/language").toString();
    if(current_language.isEmpty()){
       current_language = "en";
    }

    // 加载语言文件
    QTranslator translator;
    QString path = QString(":/example7_linguist/translation/test_%1.qm").arg(current_language);
    if (translator.load(path)){
        QApplication::installTranslator(&translator);
    }

    language_combox_ = new QComboBox(this);
    language_combox_->addItem("English", "en");
    language_combox_->addItem("Simplified Chinese", "zh_CN");
    language_combox_->addItem("Japanese", "ja");
    language_combox_->setCurrentIndex(language_combox_->findData(current_language));
    connect(language_combox_, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [this]{
        settings_->setValue("preference/language", language_combox_->currentData());
        QMessageBox::information(this, "Info", "You must restart appliction to switch to the new language.");
        emit toReboot();
    });

    auto label = new QLabel(tr("Hello, Qt Linguist"), this);

    auto btn = new QPushButton(tr("Avada Kedavra"), this);

    auto text_edit = new QTextEdit(this);
    text_edit->setText(tr("Winter Is Coming"));

    // 布局
    auto language_layout = new QHBoxLayout;
    language_layout->addWidget(new QLabel(tr("Language") + ": ", this));
    language_layout->addWidget(language_combox_);

    auto main_layout = new QVBoxLayout(this);
    main_layout->addLayout(language_layout);
    main_layout->addWidget(label);
    main_layout->addWidget(btn);
    main_layout->addWidget(text_edit);
}

void ExampleWidget7::InitLanguage()
{

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arui丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值