QT国际化示例, 检测系统语言,设置适合语言,按键切换显示语言

时间:2021-11-11 15:18:16

1.效果如下图,开启就自动检测系统语言,选择系统语言显示,

UI有控件设置,在中文和英文之间切换。。

QT国际化示例, 检测系统语言,设置适合语言,按键切换显示语言

 

2. 源码

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QtGui>

class Dialog : public QDialog
{
Q_OBJECT

public:
Dialog(QWidget *parent = 0);
~Dialog();
void translateLanguage();

private:
QLabel *label1;
QLabel *label2;
QComboBox *combox;
QTranslator *translator;

private slots:
void comboxChange();

};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include <QDebug>

Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
QVBoxLayout *vLayout = new QVBoxLayout;
label1 = new QLabel;
label2 = new QLabel;
translator = new QTranslator;

qApp->installTranslator(translator); //安装翻译器

combox = new QComboBox();
QStringList list;
list << "English" << "Chinese";
combox->addItems(list);

this->translateLanguage();
vLayout->addWidget(label1);
vLayout->addWidget(label2);
vLayout->addWidget(combox);
setLayout(vLayout);

connect(combox, SIGNAL(currentIndexChanged(int)), this, SLOT(comboxChange()));
}

void Dialog::translateLanguage()
{
label1->setText(tr("test I18N"));
label2->setText(tr("hello world"));
}

void Dialog::comboxChange()
{
qDebug() << combox->currentText();

if(combox->currentText() == "Chinese")
{
translator->load(QString(":/qm/myI18N_zh_CN.qm")); //选择翻译文件
this->translateLanguage();
}
else
{
translator->load(QString(":/qm/myI18N_zh_EN.qm"));
this->translateLanguage();
}
}

Dialog::~Dialog()
{
}

main.cpp

#include "dialog.h"
#include <QApplication>
#include <QTranslator>

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

QTextCodec *codec = QTextCodec::codecForName("System");
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForCStrings(codec);

QTranslator translator;
QLocale locale;
if( locale.language() == QLocale::English ) //获取系统语言环境
{
qDebug() << "English system" ;
translator.load(QString(":/qm/myI18N_zh_EN.qm")); //选择翻译文件
a.installTranslator(&translator);
}
else if( locale.language() == QLocale::Chinese )
{
qDebug() << "中文系统";
translator.load(QString(":/qm/myI18N_zh_CN.qm"));
a.installTranslator(&translator);
}

Dialog w;
w.resize(200,200);
w.show();

return a.exec();
}

QRC.qrc

<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>qm/myI18N_zh_EN.qm</file>
<file>qm/myI18N_zh_CN.qm</file>
</qresource>
</RCC>



 3. 由上可知,国际化的关键是怎么生成 myI18N_zh_CN.qm myI18N_zh_EN.qm 这样的翻译文件??

步骤一: 将UI控件设置好,需要变换语言的控件,统一在translateLanguage()内设置tr("...."),用英文设置。

步骤二:在工程pro文件中加入一行  TRANSLATIONS = myI18N_zh_EN.ts,保存文件。

步骤三:点击工程pro文件打开终端,

QT国际化示例, 检测系统语言,设置适合语言,按键切换显示语言

输入命令 $ lupdate I18N.pro   ,后面接的工程pro文件名,执行完后可以发现生成一个 *.ts文件,

打开可以发现这是xml文档,里面标记有所有tr("...")的内容。

QT国际化示例, 检测系统语言,设置适合语言,按键切换显示语言

步骤四:用QT Linguist打开生成的 myI18N_zh_EN.ts文件,选择要翻译成的目标语言

QT国际化示例, 检测系统语言,设置适合语言,按键切换显示语言

如图翻译每个tr("..."),并保存,再去查看myI18N_zh_EN.ts即可发现,里面已有翻译标记。

QT国际化示例, 检测系统语言,设置适合语言,按键切换显示语言

步骤五:在终端窗口输入 $lrelease I18N.pro 命令, 完成后发现生成所需的二进制文件myI18N_zh_EN.qm。

如果还要翻译为其他语言,可重复上面的动作,生成不同的 *.qm文件即可。。。

*.qm文件也可以导入到资源文件QRC.qrc,编译到程序内部。

*.qm文件生成后,即可按上面程序一样使用,进行语言显示切换。。。