QT 多语言动态切换设计说明

背景说明

项目使用visual studio 2008 + qt 4.7.3 开发,所有的ts文件都同时存放在指定文件夹,通过批命令生成一个.qm文件。

1      概述

软件需要支持中文、英文切换。当软件切换到不同语言时,软件界面对应的文字说明、提示信息等都需要切换到对应的语言。

2      设计说明

QT提供自带的类Qtranslator支持输出文字的国际化。这个类对象包含一系列的翻译文件。Qtranslator提供功能翻译文件中查找对应的目标文字。这些翻译文件需要使用Qt 自带的工具QT Linguist进行创建、编辑、编译等。

需要通过Translator::load(translatorFileName)加载翻译文件,然后通过使用QcoreApplication::installTranslator()安装文件。

    QT Linguist可以自动地帮我们提取出文件中需要翻译的词条,这些词条必须使用tr()Qobject::tr()显示的标识出来。

     整个过程如下:

3      翻译

3.1     创建

1.        右键单击要翻译的工程,出现如下菜单:

选择“Create newTranslation file…”。

2.        在弹出的对话框中,选择对应的语言。这样就生成了对应的.TS文件。位于对应的项目文件下面。

3.2     编辑

.ts的文件,需要使用QTLinguist进行编辑。有两种方式打开文件。

一种是,启动QT Linguist工具,然后,工具中选择需要进行编辑的文件。另一种是,在项目工程下,直接单击.ts的翻译文件。

打开文件后,QT Linguist工具会显示从代码中提取的tr()词条(注:若翻译的词条有更新,需要手动先更新文件。详见下文)。如图所示:

在上图中的engilishtranslation里面输入“SC”翻译后的字符串。完成该词条后,点击词条前的问号图标,则变成。此时”SC”已经翻译很好了。

逐条翻译其他条目后,保存。

 

3.3     编译

首先,将翻译的.ts文件剪切到\LanguageTS文件夹下。然后在项目中,删除对应的.TS文件(因为该文件已找不到了)。删除完成后,还需要将转移到\LanguageTS文件夹下的.TS文件,重新添加到项目中。

然后,编写bat文件。将ts文件加入到bat文件中,使用lrelease.exe工具编译ts文件。

D:\Qt\4.7.3\bin\为qt安装的目录,请自行修改:(^为windows命令的换行)

D:\Qt\4.7.3\bin\lrelease.exe apppublic_en.ts^

                                    controller_en.ts^

                                  。。。(这里继续填写项目中的ts文件)

         -qm en.qm

最后,执行bat文件。执行bat文件后,会生成对应的.qm文件,这个文件即是可供程序使用的翻译后的文件。把这个文件拷贝到LocalDebug\Languages里,即可。

 

3.4     加载

软件启动时,需要根据配置文件中设置的语言,自动加载相应的翻译文件。并且,加载过程需要在显示对话框前完成。所以,在main()函数中实现。

具体过程如下: 

1.先读取配置文件中的参数;

    2.根据用户的设置,判断需要加载的文件的路径以及文件名称;

    3.加载翻译文件Translator::load(translatorFileName);

    4.加载成功,则使用QCoreApplication::installTranslator(translator)安装翻译文件。

3.5     更新

当程序中增加了新的词条后,需要更新翻译文件。

首先,更新词条的提取。在项目工程下,选择对应原.TS文件。单击该文件,在弹出的列表下选择lupdate;

其次,翻译新的词条。更新完成后,选择该文件,并打开。对未翻译的词条进行翻译,并保存;

最后,编译成新的.qm文件并将其拷贝到LocalDebug\Languages的文件下。

4      动态切换

为实现多窗口的动态切换,主要包括以下两点:

1.  当用户更改了语言设置,使用  qApp->installTranslator(translator)安装用户选择的翻译文件。

2.  对于当前已创建的窗口,需要更新刷新当前的文字显示。当使用QcoreApplication::installTranslator()安装一个新的翻译文件时,程序会自动发送一个QEvent::LanguageChange的事件通知。所以,可通过重写函数void QWidget::changeEvent(QEvent*event)捕捉到该通知,然后刷新对应的UI文字显示。代码如下:

void QWidget::changeEvent(QEvent*event)

{

    if (event->type() == QEvent::LanguageChange)

    {

       ui->retranslateUi(this);

    }else

       QWidget::changeEvent(event);

}

注:通过QT设计器,创建的UI,其界面的刷新可以使用retranslateUi()函数;但如果是通过代码创建的,则需要另外再写一个类似于retranslateUi函数的刷新的文字的函数。

5      注意事项

需要注意的是,使用QT的多语言翻译机制时,QT仅提取代码中所有有“QObject::tr(“ssss”)”的标识的语句。而对未使用tr标识的语句,无法提取。所以,在编写代码时,对需要翻译的词条,均需要添加tr()。

目前,软件中需要使用多语言的地方有以下几个方面:

1.        按钮等控件的文字说明

2.        展示给用户的提示信息

5.1     按钮等控件文字说明

在创建UI控件时,非QT Creator设计器生成的按钮文字说明、标题等,需要手动添加tr。如:

原来代码:

修改后代码:

 

5.2     展示给用户的提示信息

5.2.1            信息提示框显示的提示信息

原来代码:

sAlarm = _T("#Assay beingused by reagent,you can not delete. ");

修改后代码:

sAlarm  =  QStringTTStr(QObject::tr("#Assay being used by reagent,you can not delete.."));

5.2.2            报警信息

原来代码:

AddAlarm(eAlarmLevel_Warn, _T("WorkListhas no test"),_T("test requestmanager"));

修改后代码:

AddAlarm(eAlarmLevel_Warn,QStringTTStr(QObject::tr("WorkList has no test"), QStringTTStr(QObject::tr("test request manager"));

 

综上所述,在UI层,创建按钮等控件时,其文字说明前都需要使用tr();而在业务层创建的字符串等需要翻译的词条时,需要先使用QOBject::tr(),然后再将该字符串转化为TString。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值