linux的Qt怎么国际化,Linux系统 QT5.5.1国际化

之前做的QT项目都是单一语言,现在需要上大项目了,就要求支持国际化语言,这里写了一个测试程序,记录一下。

说明:

1.qt采用5.5.1。

2.这里的国际化实现了启动前和热机状态两种选择语言的方式;

3.热机状态切换语言,支持多窗口传递,支持全局窗口(初始化一次不释放)和临时窗口(每次显示器需要初始化)。

一、国际化需要的准备

1.在变成过程中所有需要国际化的字符串都必须以tr("string")形式书写,这是qt检测国际化字符串的标识,如:

this->ui->btnClose->setText(tr("close"));,字符串“close”必须包含在tr()中,

2.必须安装有linguist, lupdate, lrelease工具,如果没有安装这些工具,可在终端中输入命令安装:

sudo apt-get install qt4-dev-tools

3.为了方便开启这些工具,我将他们放在了Qt creator里了,如下图,以后打开工具只需要再qtcreator的“工具-》外部-》Linguist“菜单下打开了。

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

二、创建工程

创建名称为testPro的工程,主界面元素如下:

说明:

1.下拉框是选择语言用的;

2.四个Label是简单显示用;

3.左边的PushButton是弹出全局窗口用的;右边的PushButton是弹出临时窗口用的。

0818b9ca8b590ca3270a3433284dd417.png

弹出窗口界面如下:

说明:close按钮用于关闭窗口同时显示文字,Label显示文字。

0818b9ca8b590ca3270a3433284dd417.png

三、具体代码

1.创建国际化文件

1)如前所述,将所有的字符串都改为tr("string")形式;

2)打开testPro.pro文件,在文件最后添加如下语句

TRANSLATIONS += testProLanguage_zh_CN.ts \

testProLanguage_EN.ts这是指名两个语言文件,后缀名必须为.ts,名字随意(这里为了便于区分,取名如上)。

3)从“工具》外部》Linguist》“菜单下选择lupdate,进行翻译字符串的检测,我这里已经翻译完成,显示检测到15个字符串已经翻译

执行完此步之后会在工程文件夹中生成两个.ts文件,即:testProLanguage_zh_CN.ts 和  testProLanguage_EN.ts

0818b9ca8b590ca3270a3433284dd417.png

4)如果显示没有翻译完成,则从“工具》外部》Linguist》”菜单下选择“预言家(Linguist)”工具,显示如下图所示:

注:如果没有打开自己需要的文件,可以在工具打开之后点击“打开”按钮选择相应的.st文件

打开文件后,在译文框中写入对应语言的字符串即可。

0818b9ca8b590ca3270a3433284dd417.png

5)翻译完成需要发布,这里有两种方法:

a.点击4)中窗口(linguist工具)的“文件》发布全部“菜单,进行发布;

b.点击qtcreator中的“工具》外部》Linguist》”菜单下的“发布翻译(lrelease)”,进行发布。

发布完成后会在工程文件夹中生成两个后缀名为.qm的翻译文件,即:testProLanguage_zh_CN.qm 和  testProLanguage_EN.qm文件

至此,国际化文件创建成功!

2.开机选择语言

这部分修改比较简单,只需要在main.c文件的main函数中添加语言的加载语句即可,完整代码如下:

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

{

QApplication a(argc, argv);

QTranslator *trans = new QTranslator(&a);

trans->load("../testPro/testProLanguage_zh_CN.qm");

a.installTranslator(trans);

MainWindow w;

w.show();

return a.exec();

}说明:需要包含头文件QTranslator。

3.热机状态切换语言

热机状态需要切换整个工程中界面的显示语言,即主视图和子视图。这里子视图分为两种情况,其一是临时子窗口,这种窗口每次显示都需要初始化,用完即delete。另外一种是全局的试图,这种视图往往初始化一次即可,每次显示完成不需要注销。

当修改语言完成后,临时视图初始化即可自动根据当前语言加载,而全局视图则需要以通知的形式,重新刷新一下界面的显示内容。

用于切换语言的combobox响应如下:

void MainWindow::on_comboBoxLanguage_activated(int index)

{

// 输出信息

qDebug() << "activated index:" << index;

// 更新语言

static QTranslator *translator;

if(NULL != translator)

{

qApp->removeTranslator(translator);

delete translator;

translator = NULL;

}

translator = new QTranslator;

switch(index)

{

case 0:

// English

translator->load("../testPro/testProLanguage_EN.qm");

break;

case 1:

// 中文

translator->load("../testPro/testProLanguage_zh_CN.qm");

break;

}

qApp->installTranslator(translator);

this->mainWindow_freshUi();

}

当选择下拉框修改显示语言时,会触发comboBox控件的activated响应(这里不用currentIndexChanged(int)函数,是因为这个函数会在初始化的时候自动调用,而activated只在修改下拉列表选项时触发)。

这里的mainWindow_freshUi函数是进行界面元素刷新用的,具体代码如下:

void MainWindow::mainWindow_freshUi()

{

// 初始化Title

this->setWindowTitle(tr("test language"));

// 初始化字符串

this->ui->labelName->setText(tr("Name"));

this->ui->labelNameStr->setText(tr("test name"));

this->ui->labelPasswd->setText(tr("Password"));

this->ui->labelPasswdStr->setText(tr("Hello world!"));

this->ui->btnPopWindow->setText(tr("Pop Window"));

this->ui->btnPopWindow2->setText(tr("Pop tmp Window"));

}

当调用qApp->installTranslator函数时(qApp是内部指针变量,不需另外初始化),会触发系统内部的事件通知(changeEvent),通知类型为QEvent::LanguageChange,因此只需要在全局视图的实现文件中添加changeEvent(QEvent*)函数,如下:

void PopWindow::changeEvent(QEvent *e)

{

//QWidget::changeEvent(e);

switch(e->type())

{

case QEvent::LanguageChange:

qDebug() << "popwindow LanguageChange";

this->popWindow_freshUi();

break;

default:

break;

}

}

这里的popWindow_freshUi与前面的mainWindow_freshUi类似,是界面元素的重新加载作用,如下:

void PopWindow::popWindow_freshUi()

{

this->setWindowTitle(tr("new Window"));

this->ui->btnClose->setText(tr("close"));

this->ui->labelState->setText(tr("Pop success!"));

}

至此,完成了代码的书写,下面看一下效果。

1)开机自动显示中文,点击弹框和临时弹框都显示中文。

0818b9ca8b590ca3270a3433284dd417.png

2)下拉列表选择English,界面切换为英文,点击弹框按钮显示亦为英文,效果如下图

0818b9ca8b590ca3270a3433284dd417.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值