QT的多国语言做的还算是比较好的,我们来看下如何去做

大致的可以分为如下几个步骤

  • 1.update生成ts文件
  • 2.使用QT语言家生成qm文件
  • 3.加载语言包

我们先来看下如何生成ts文件,实际上这个很简单,我们有两种办法,首先是用IDE自己去编译,我们需要在pro文件中增加配置信息

TRANSLATIONS = Tranlate_EN.ts\
Tranlate_CH.ts

这里声明支持两个国家的语言,CH和EN,我们点击工具-外部-Qt预言家-更新翻译

QT开发(九)—— Qt实现应用内动态切换语言,使用Qt语言家编译字体包_qt

即可,当然,如果你喜欢用命令行,可以在项目的根目录中

lupdate -verbose xx.pro

,我们使用的是IDE的方式,我觉得方便一些,然后可以看到控制台输出

QT开发(九)—— Qt实现应用内动态切换语言,使用Qt语言家编译字体包_应用_02

提示的是找到五个文件,现在回到我们的项目根目录就可以看到这两个文件了

QT开发(九)—— Qt实现应用内动态切换语言,使用Qt语言家编译字体包_语言_03

紧接着第二步就是具体的翻译了,我们打开预言家Linguist

QT开发(九)—— Qt实现应用内动态切换语言,使用Qt语言家编译字体包_应用_04

我们直接来翻译英文

翻译完成后点击File - 发布,就可以在项目根目录看到qm文件了

QT开发(九)—— Qt实现应用内动态切换语言,使用Qt语言家编译字体包_qt_05

现在就可以在我们的代码中使用了

这里我绘制一个UI

QT开发(九)—— Qt实现应用内动态切换语言,使用Qt语言家编译字体包_qt_06

可以看到很简单的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) {
//Chinese
case 0:
translator->load("Tranlate_CH.qm");
qDebug() << "安装中文";
break;
//English
case 1:
translator->load("Tranlate_EN.qm");
qDebug() << "安装英文";
break;
}
qApp->installTranslator(this->translator);
//刷新UI
this->ui->retranslateUi(this);
}

在这份代码里,我们会跟你用户切换的语言来load对应的语言qm文件,最后会通过installTranslator去安装这个语言包并且刷新UI

这样我们就可以看到效果了

QT开发(九)—— Qt实现应用内动态切换语言,使用Qt语言家编译字体包_语言_07

但是这里实际上会发现几个问题的

首先就是你切换不了语言?

那是因为qm文件你找不到,你需要拷贝到你的build目录

QT开发(九)—— Qt实现应用内动态切换语言,使用Qt语言家编译字体包_语言_08

然后就是语言选项他始终在简体中文,这是因为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)
{
//刷新UI
this->ui->retranslateUi(this);
if(!isCH)
{
this->ui->comboBox->setCurrentIndex(1);
}
}
}

如果你切换了语言我就刷新UI并且判断下语言类型设置对应的下标,这样就可以完美实现了

QT开发(九)—— Qt实现应用内动态切换语言,使用Qt语言家编译字体包_qt_09

需要源码的可以加群:690351511

点击下载