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

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) {
    //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

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

这里写图片描述

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

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

那是因为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)
    {
        //刷新UI
        this->ui->retranslateUi(this);
        if(!isCH)
        {
            this->ui->comboBox->setCurrentIndex(1);
        }
    }
}

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

这里写图片描述

需要源码的可以加群:690351511

猜你喜欢

转载自blog.csdn.net/qq_26787115/article/details/80226060
今日推荐