概要
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);
}
至此,多国语言动态切换的简单例子就完成了。