QT的多国语言做的还算是比较好的,我们来看下如何去做
大致的可以分为如下几个步骤
1.update生成ts文件2.使用QT语言家生成qm文件3.加载语言包
我们先来看下如何生成ts文件,实际上这个很简单,我们有两种办法,首先是用IDE自己去编译,我们需要在pro文件中增加配置信息
TRANSLATIONS = Tranlate_EN.ts\Tranlate_CH.ts
这里声明支持两个国家的语言,CH和EN,我们点击工具-外部-Qt预言家-更新翻译
即可,当然,如果你喜欢用命令行,可以在项目的根目录中
lupdate -verbose xx.pro
,我们使用的是IDE的方式,我觉得方便一些,然后可以看到控制台输出
提示的是找到五个文件,现在回到我们的项目根目录就可以看到这两个文件了
紧接着第二步就是具体的翻译了,我们打开预言家Linguist
我们直接来翻译英文
翻译完成后点击File - 发布,就可以在项目根目录看到qm文件了
现在就可以在我们的代码中使用了
这里我绘制一个UI
可以看到很简单的UI,就是切换下语言即可,那我们的代码中应该如何去写?
QTranslator * translator;
头文件中只要声明一个QTranslator 指针对象即可,注意要new
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);translator = new QTranslator(this);}MainWindow::~MainWindow(){delete translator;delete ui;}//切换语言void MainWindow::on_comboBox_activated(int index){qDebug() << QString::number(index);switch (index) {//Chinesecase 0:translator->load("Tranlate_CH.qm");qDebug() << "安装中文";break;//Englishcase 1:translator->load("Tranlate_EN.qm");qDebug() << "安装英文";break;}qApp->installTranslator(this->translator);//刷新UIthis->ui->retranslateUi(this);}
在这份代码里,我们会跟你用户切换的语言来load对应的语言qm文件,最后会通过installTranslator去安装这个语言包并且刷新UI
这样我们就可以看到效果了
但是这里实际上会发现几个问题的
首先就是你切换不了语言?
那是因为qm文件你找不到,你需要拷贝到你的build目录
然后就是语言选项他始终在简体中文,这是因为retranslateUi导致的
void retranslateUi(QMainWindow *MainWindow){MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0));label_4->setText(QApplication::translate("MainWindow", "\350\257\255\350\250\200\357\274\232", 0));comboBox->clear();comboBox->insertItems(0, QStringList()<< QApplication::translate("MainWindow", "\347\256\200\344\275\223\344\270\255\346\226\207", 0)<< QApplication::translate("MainWindow", "English", 0));tv_title->setText(QApplication::translate("MainWindow", "\346\210\221\346\230\257\346\240\207\351\242\230", 0));tv_content->setText(QApplication::translate("MainWindow", "\346\210\221\346\230\257\345\206\205\345\256\271", 0));tv_version->setText(QApplication::translate("MainWindow", "\346\210\221\346\230\257\347\211\210\346\234\254\345\217\267", 0));} // retranslateUi
通过源码我们可以看到
comboBox->clear();comboBox->insertItems(0, QStringList()
只要刷新了UI,他就会重置为0下标,这样就导致了始终是简体中文的bug了,我们如何去解决?
思路就是监听语言切换,判断是否是英文来设置下标,看代码
void MainWindow::changeEvent(QEvent* e){if(e->type() == QEvent::LanguageChange){//刷新UIthis->ui->retranslateUi(this);if(!isCH){this->ui->comboBox->setCurrentIndex(1);}}}
如果你切换了语言我就刷新UI并且判断下语言类型设置对应的下标,这样就可以完美实现了