每个人都希望全世界的人都能够使用自己的软件,但是语言是一个障碍。因此一个能够提供不同语言翻译的程序必然能够让更多的人使用。Qt为此已经预先给我们做了很多的工作,让我们能够方便快捷的实现应用程序的国际化,将我们的软件翻译为不同的语言。那么怎么做才能够让程序国际化呢?
工具/原料
一个安装有Qt集成开发环境的Windows或Linux
一、建立英文界面演示程序
1、首先我们来建立一个英文界面的应用程序,程序只是具有英文界面,不含其他任何功能。程序以学生信息为例,界面中的文本框仅作演示,其他没有任何作用。建立项目时窗体的类名是MyMainWindow,基类是QWidget。界面上的各个label的内容都是要翻译的。界面如下:
2、我们在编辑界面的时候要注意一个地方。实际上对于窗体标题、标签内容以及按钮的内容是一样的,你在编辑时系统也是默认的。但是我们需要知道这个东西。这就是windowTitle、label的text以及PushButton的text,属性下面有个“可翻译的”复选框,默认是选中的,保持默认即可。
3、我们棵褶佐峨还要在窗体类的构造函数中添加一行代码,用于动态的在按钮上面的那个Label中显示一些内容。ui->lab髫潋啜缅el_8->setText(tr("This is just a demo app"));然后,我们来运行下程序看看。全英文的界面,包括窗口标题。##################################################特别注意:代码中所有需要翻译的字符串,都必须用tr函数阔起来。##################################################
二、生成翻译源文件(Translation source)
1、打开Qt配置好的命令提示符,并切换到项目目录。
2、输入命令:lupdate Trans_demo.pro -ts transsrc.ts然后可以看到在项目目录下生成了一个ts的文件。
3、我们用记事本打开该文件看看。可以发现,生成的其实就是一个xml文件。
三、使用Linguist进行翻译
1、对ts文件的翻译当然不是在文本文档中,是使用Qt提供的工具Linguist。好了,我们打开Linguist看看。
2、然后在Linguist中打开我们刚才生成的transsrc.ts文件。在弹出的设置对话框的源语言中我们选择English。然后确定即可。
3、我们可以看到打开翻译源文件的Linguist的样子,整个程序包括 上下文 窗口,字符串 窗口,短语和表单 窗口,翻译窗口 ,短语和猜测 窗口以及警告 窗口。
4、上下文窗口会包括我们所有有需要翻译内容的类的名字,不一定是只是窗口类,也可以包括我们自定义的类。但是自定义类的字符串翻译与窗口类字符串的翻译处理上有所差别,这里我们不进行探讨。上下文窗口的项那一列,显示了该上下文需要翻译的字符串数量以及已经翻译完成的数量。字符串窗口列出的是当前选择的上下文中的所有需要翻译的字符串。短语和表单窗口会根据你选择的字符串的位置,显示窗口或先关的代码。翻译窗口就是对字符串进行翻译的地方。短语和猜测窗口是根据你已经翻译的内容,对相同的字符串进行翻译猜测。警告窗口显示警告信息。这里我们来看看短语和表单窗口。我们可以看到,随着我们选择的字符串的变化,短语和表单 窗口也在变。
5、好的,我们开始翻译。点击字符串窗口的 StudentInfomation 字符串。然后在翻译窗口进行翻译。
6、在翻译完成一个字符串后,不是直接点击下一个字符串就可以的,我们需要点击工具栏上的那稍僚敉视个绿色勾号按钮才行。在点击绿勾前,我们可以看到StudentInfomation钱的问号由蓝色变为了赴抻肛滂黄色。意思是,字符串我们已经翻译完成,并且通过了Qt的验证测试,只是没有确认接受。好的,点击绿勾。然后,可以看到StudentInfomation前的黄色问号变为了绿色勾,上下文窗口中的项变为了1/11。字符串窗口自动定位到了下一个字符串,翻译窗口也定位到了下一字符串。
7、按照第六步的做法,我们将其他的字符串全部翻译。图片中可以看到Work的前面不是一个绿色的勾,而是一个黄色的。意思是,翻译者已经接受确定了这个翻译,但是该翻译未完全通过Qt的验证测试。这是因为我少打了那个:号。只需要在翻译中加上这个:号即可。即使不加也没有影响,不过我还是给加上了。
8、所有翻译完毕后,也就是所有的问号都变成了绿勾后。我们就可以生成程序可用的文件了。点击 文件-发布,可以看到项目目录下生成了一个transsrc.qm文件,这是一个二进制的文件。好了,到此时我们的翻译工作顺利完成。
四、语言转换的实现
1、在软件中要实现不同语言的转换,只需要使用QTranslator类即可。我们首先将transsrc.qm改名为language_zh.q罪焐芡拂m,然后将其拷贝与可执行文件放置在同一目录。这里我放置在debug目录下。好的,先在main函数中添加如下代码:QTranslator trans;if(trans.load("../language_zh.qm")) a.installTranslator(&trans);注意别忘了#include <QTranslator>然后运行看看效果。可以看到界面已经全部变成了中文。但是要注意:trans的创建,必须得在主窗口对象之前。
2、上面的代码是在main脑栲葱蛸函数中进行转换的,但是如何能够实现即时转换呢。我们先将main中的代码注释掉。然后进入按钮Switch to chinese的槽函数中。输入以下代码:QTranslator trans; if(trans.load(qApp->applicationDirPath()+"/language_zh.qm")) qApp->installTranslator(&trans);ui->retranslateUi(this);只是比上面的多了一行代码。我们来运行看看。我运行了两次,对比下点击按钮前后有什么不同。是的,动态显示的内容并没有被翻译显示在界面上面。那么这是为什么呢?问题在retranslateUi这个函数上。这个函数在Assistant中找不到,但是它却可以在你的编译目录下的用户界面编译后的代码中找到,我的是在ui_mymainwindow.h中。它只是实现了界面的重新翻译。但是我们的动态显示的内容是在窗体的构造函数中,重新翻译并不会重新构建窗体,所以内容不会被显示。
3、好了,到此为止我们的问题已经解决。要想长久保证语言的转换,需要我们将相关设置保存在外部文件,否则软件重新运行肯定还会还原为英文。这样第一种方法可以实现软件的重启更改显示语言。