在进行客户开发时,通常需要考虑多语言的场景,而这个Qt已经提供了成熟的多语言方案,也就是QtLinguist,但是网上很多时针对qmake的资料,下面就对其在CMake实际使用流程进行介绍。
在使用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"));
生成文件这里若使用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()包裹的字段,再进行对应字段的翻译即可,如下所示:
完成.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放入资源文件中,再调用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()
{
}