Qt实现多国语言动态切换

概要

Qt中实现多语言的动态切换主要分为以下步骤:
一、生成ts文件
二、生成qm文件
三、利用QTransltor来加载语言包
四、实现多语言切换简单例子

一、生成ts文件

1、在生成ts文件之前,要保证你的工程当中需要实现语言切换的字符串用函数tr包含,例如

ui->textLabel->setText(tr("English version"));

因为只有添加了tr()函数,生成ts文件的时候程序才会认为用到tr()函数的字符串的地方是需要制作多语言的,从而在ts中预留出位置。如果没有用tr()函数,则这个字符串不会出现在ts文件中,从而不能实现多国语言的切换。而在ui文件中的字符串,系统会默认用tr()函数修饰字符串。所以生成的ts文件中,包含ui文件中的所有字符串。

2、在工程的.pro文件中加上

TRANSLATIONS += Language_zh_CN.ts \  /*  其中 Language_zh_CN  Language_en_CN 为生成文件的名字 */ 
                Language_en_CN.ts

3、在QtCreator中 打开 (工具->外部->linguist->更新翻译(lupdate)

这里写图片描述

此时就会在工程目录下生成了,Language_zh_CN.ts和Language_en_CN.ts文件

二、生成qm文件

1、qm文件就是多国语言包文件,在Qt中就是通过加载这种文件来动态切换语言,一个ts文件对应一个qm文件。要生成qm文件需要用到linguist工具,在linux下打开这个工具

/opt/QtCreator/5.5/gcc/bin/linguist // 这是在我linux中linguist工具存放的位置

2、打开linguist,并选择打开第一步中生成的ts文件,界面如下
这里写图片描述

其中用粉色笔圈起来的就是在工程中tr()函数修饰起来的字符串,和ui文件中出现的 字符串。点击相应的字符串项,在目标语言处填入相对应语言的字符串即可。当所有的字符串都修改完成后就保存退出。这时候ts文件就修改完成了,可以马上生成qm文件了。

3、回到QtCreator中,打开 ( 工具 -> 外部 -> linguist -> 发布翻译(irelease) )

这里写图片描述

这时候就能在工程目录下生成qm文件了,每一种语言都是这样处理,生成对应的qm文件。

三、利用QTransltor来加载语言包

利用QTransltor来加载语言包很简单,就是对QTransltor类的使用。使用代码如下

 g_QTranslator = new QTranslator(g_App);
 g_QTranslator->load(":/language/Language_en_CN.qm");
 g_App->installTranslator(g_QTranslator);

这样就完成了对语言包的加载了,其中 g_QTranslator->load(":/language/Language_en_CN.qm");
为qm文件的资源路径,我把qm文件放在工程的资源目录下了。

四、实现多语言切换的简单例子

效果图如下,只有中文和英文的简单切换,也可以再多几种语言,只要有相对于的qm文件就可以了。

这里写图片描述

/* common.h*/
#ifndef COMMON_H
#define COMMON_H

#include <QTranslator>
#include <QApplication>

extern QApplication *g_App;
extern QTranslator *g_QTranslator;

#endif // COMMON_H
/* main.cpp */
#include "languagetest.h"
#include "common.h"

QApplication *g_App;
QTranslator  *g_QTranslator;

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


    g_App = new QApplication(argc,argv);

    g_QTranslator = new QTranslator(g_App);
    g_QTranslator->load(":/language/Language_en_CN.qm");
    g_App->installTranslator(g_QTranslator);

    LanguageTest w;
    w.show();

    return g_App->exec();
}

/* languagetest.h*/

#ifndef LANGUAGETEST_H
#define LANGUAGETEST_H

#include <QWidget>

namespace Ui {
class LanguageTest;
}

class LanguageTest : public QWidget
{
    Q_OBJECT

public:
    explicit LanguageTest(QWidget *parent = 0);
    ~LanguageTest();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::LanguageTest *ui;
};

#endif // LANGUAGETEST_H
/*languagetest.cpp*/

#include "languagetest.h"
#include "ui_languagetest.h"
#include "common.h"
LanguageTest::LanguageTest(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::LanguageTest)
{
    ui->setupUi(this);
}

LanguageTest::~LanguageTest()
{
    delete ui;
}

void LanguageTest::on_pushButton_clicked()
{
    g_QTranslator->load(QString(":/language/Language_zh_CN"));  // 加载中文
    g_App->installTranslator(g_QTranslator);               

    ui->retranslateUi(this);
}

void LanguageTest::on_pushButton_2_clicked()
{
    g_QTranslator->load(QString(":/language/Language_en_CN")); // 加载英文
    g_App->installTranslator(g_QTranslator);

    ui->retranslateUi(this);
}

至此,多国语言动态切换的简单例子就完成了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值