Qt的翻译系统

Qt的翻译系统


程序开发过程中,经常会遇到这种情况:界面上的语言需要用多种语言显示。通过一个按钮或者下拉菜单上的选项可以更改语言——并且是动态的更改语言,比如从中文到英文,或者英文到中文。

Gemfield在本文中就通过一个简单的demo来示范下这个过程。
首先,得把这个环境准备好。Gemfield本程序最终会运行在SYSZUXpad上,但没有关系,你可以只在电脑上试验。PC上得有个QtSdk的环境。Gemfield本文的示例是中英文之间的切换。程序界面默认是中文。下面开始我们的工作:

第一、    新建一个工程,比如名字叫作GemfieldTranslator。工程有以下的文件:mainframe.h、mainframe.cpp、mainframe.ui、main.cpp。等会儿还要添加个资源文件。

第二、    Mainframe.ui界面上随便拖动几个控件,填上中文。如下图所示(图片暂缺)

第三、    出现字符串的地方可不光是ui界面,源文件里也可能出现。为了展示这部分内容,在mainframe.ui上放置一个空的label,然后在mainframe.cpp里用setText(tr(“我爱gemfield”))这样的方式让其显示字符。

第四、    Gemfield还需要稍微修改一下GemfieldTranslator.pro文件,以便说明这个工程想要支持的语言。本例中,界面默认是中文,在运行期间可以动态的切换到英文。所以我们需要添加一个english.ts,名字随便起。如下:

TRANSLATIONS = english.ts

像english.ts这样的文件通常都有一个.ts扩展名。它们使用简单的XML格式,ts这个名字代表“翻译源”(translation source)。

第五、    这个时候我们就可以在命令行(windows在Qt Command Prompt,或者MADDE TERMINAL里面,视版本情况而定)中切换到GemfieldTranslator.pro所在的目录,并且执行

lupdate – verbose GemfieldTranslator.pro

这里的verbose选项告诉lupdate命令要提供更详尽的反馈信息。

在这个过程中,GemfieldTranslator工程源文件中所有由tr()包含的字符串都会出现在english.ts文件中。而在ui中的字符串因为被包含到了QApplication::translate中而输出到english.ts文件中。这也是为什么在源文件中出现字符串都推荐使用tr()的原因。

第六、    下面就该Qt Linguist登场了。这个中文意思为“语言学家”的工具负责组织起真正的翻译。在Linguist中打开english.ts文件。整个界面上分为三部分:左、右上、右下。

1、对于左边部分,显示的是一个树状视图。这些顶层项是要翻译的字符串的上下文,比如mainframe。每一个上下文都有两个或者更多的子项。每一个子项都会占用三列,第一列显示一个done标记(翻译完成后点击这里成为一个对勾),第二列显示的是要翻译的字符串,第三列显示的是你的翻译内容。
2、右上区域部分是当前要翻译的字符串以及它的翻译,这里就是要添加翻译和编辑翻译的地方。
3、右下部分是一个由Qt Linguist自动提供的建议列表。
当翻译工作完成后,我们就可以点击File——Release(发布)来生成qm文件(其调用的是lrelease工具):english.qm。qm意思是Qt Message, 文件是二进制文件。所以更紧凑、效率更高,程序的翻译需要的正是qm文件。

如果想为所有的ts文件重新生成qm文件,可以采用下面的方法来使用lrelease工具:
lrelease  -verbose GemfieldTranslator.pro

第七、    新建一个资源文件:trans.qrc,并将其包含到GemfieldTranslator.pro工程中,资源文件添加上english.qm。

第八、    在mainframe.cpp中添加如下代码:
************************************************************
void Mainframe::on_pushButton_clicked()
{
QTranslator translator;
if(trans_flag){
translator.load(“:/english.qm”);
QCoreApplication::installTranslator(&translator);
trans_flag = false;
}else
trans_flag = true;//一个bool型标记。
retranslateUi(this);//这个函数是由uic生成的,在ui_mainframe.h中。
reTranslate();//label->setText(tr(“我爱你,gemfield”))这样的代码要统一放在这个函数里。
}
*************************************************************

最终GemfieldTranslator就实现了在程序中通过点击按钮动态的更改语言了。

备注: 本文属于gemfield的CivilNet Blog(http://civilnet.cn/gemfield)【Qt乐园】版块;bug提交至gemfield@civilnet.cn;资料发布及讨论区:http://civilnet.cn/qt;转载此文时,请保证包括【备注】在内的文章的完整性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值