Qt国际化的方法

目录

  • 引言
  • 使用流程
    • tr()
    • 生成.ts文件
    • 翻译
    • 生成.qm文件
    • 加载.qm文件
  • 完整代码

引言

在进行客户开发时,通常需要考虑多语言的场景,而这个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可以通过脚本实现,如下所示:

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()包裹的字段,再进行对应字段的翻译即可,如下所示:
Qt国际化的方法_第1张图片

生成.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 

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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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()
{

}

你可能感兴趣的:(qt,c++,开发语言)