QT国际化示例, 检测系统语言,设置适合语言,按键切换显示语言
1.效果如下图,开启就自动检测系统语言,选择系统语言显示,
UI有控件设置,在中文和英文之间切换。。
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文件打开终端,
输入命令 $ lupdate I18N.pro ,后面接的工程pro文件名,执行完后可以发现生成一个 *.ts文件,
打开可以发现这是xml文档,里面标记有所有tr("...")的内容。
步骤四:用QT Linguist打开生成的 myI18N_zh_EN.ts文件,选择要翻译成的目标语言
如图翻译每个tr("..."),并保存,再去查看myI18N_zh_EN.ts即可发现,里面已有翻译标记。
步骤五:在终端窗口输入 $lrelease I18N.pro 命令, 完成后发现生成所需的二进制文件myI18N_zh_EN.qm。
如果还要翻译为其他语言,可重复上面的动作,生成不同的 *.qm文件即可。。。
*.qm文件也可以导入到资源文件QRC.qrc,编译到程序内部。
*.qm文件生成后,即可按上面程序一样使用,进行语言显示切换。。。