您的位置:首页 > 编程语言 > Qt开发

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

2018-02-24 14:37 766 查看

背景说明

项目使用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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息