QT在QML下实现多国语言翻译

在某些情况下,我们使用QT开发的界面需要完成多国语言的翻译工作。QT在这方面其实已经给出了支持,本文主要讲述在使用QML编写界面的情况下如何实现多国语言的翻译。

若要实现QT多国语言翻译,必须要搞清楚两个文件: xx.ts和xx.qm文件。xx.ts是翻译的源文件,这个文件其实是一个xml文件,里面写的是源语言和对应的翻译语言。xx.qm文件是最终的发布文件,也是应用程序运行时需要加载的外部文件。下面看一下两种文件的内容:

xx.ts可以使用ultraEdit打开,注意不要转换为DOC格式....,可以看到如下:

xx.ts格式

其中,每一对<context></context>之间为一个.qml或.cpp所包含的所有字符串。两个messag之间为一个翻译区,包含源语言文字和翻译后语言文字。<source>为源语言(此处为英语),<translation type="vanished"> 为要翻译的语言(此处为西班牙语)。若需要增加新的翻译语句,只需要在增加一对<message>xxxx</message>,最简单的方法是复制一对<message>xxxx</message>之间的内容,然后修改源字符串内容和修改后字符串内容。

xx.qm文件为二进制文件,此处不再展示。

下面重点讲一下使用QT完成翻译工作的步骤:

1. QML中所有要翻译的字符串地方需要使用qsTr(字符串),Widget中应该使用tr(字符串)。只要这样才能被QT的翻译工具所识别。 

2. 使用命令lupdate生成.ts文件。lupdate会扫描程序中用qsTr()和tr()所指定的字符串,并写入到相应的.ts文件中。此处需注意:使用QTCreator自带的工具-外部-QT语言家-更新翻译功能可能不好用,无法正确的生成完备的.ts文件。(可以下载最新的QT版本试试)。建议使用命令行lupdate命令来实现。windows下的lupdate命令一般位于mingw下(使用QTCreator自带的工具-外部-QT语言家-更新翻译可以找到lupdate所在的路径)。命令使用方式如下:

Linux下: 使用./lupdate test.pro -ts cn.ts, 则会扫描整个工程,并把对应的字符串写入cn.ts文件中。

windows下,使用lupdate test1.qml test2.qml test3.qml -ts cn.ts,则会扫描test1.qml,test2.qml,test3.qml,将三个源文件中的字符串写入cn.ts文件中。windows下对pro文件可能不识别,此时需要对每一个.qml文件单独操作,lupdate默认可以追加填写cn.ts文件。

lupdate, test.pro 与 test1.qml的路径必须要正确,否则找不到对应的命令或文件。

3. 手动进行翻译。第2步操作只是将程序中待翻译的字符串全部汇集到一个xx.ts文件中。还需要对xx.ts中的每一个字符串进行手动翻译。毕竟自动翻译的功能太过强大,目前尚不具备条件。此处有两种方法:

     (1)  使用QT的自带的工具进行翻译。使用QT的工具:Linguist。此工具可以打开ts文件,进行逐一翻译。如下图所示:源文是程序中扫描到的字符串,译文是需要自己手动翻译后填写翻译的结果。此处需逐一将待翻译的内容翻译完成并填写至译文处并进行保存。

      

    (2) 使用ultraEdit打开xx.ts文件(注意不要转换格式),填写所有的<translation type="vanished"></translation>之间的内容。

4. 生成qm文件:使用命令行 lrelease cn.ts -qm cn.qm。或者直接使用QTCreator的工具-QT语言家-lrease进行发布生成。会自动在当前程序路径下生成cn.qm文件。

5. 在QT工程的Pro文件中增加TRANSLATIONS += cn.ts。 cn.ts只是示例,你可以改成你自己的.ts文件名。

6. 在main函数中使用如下语句进行加载,注意此时加载的是外部cn.qm文件,如下所示:   

           QTranslator tsor;
            tsor.load("cn.qm");
            app.installTranslator(&tsor);

注意事项:

必须在main函数中的load qml文件之前加载翻译文件cn.qm,否则无法进行翻译。如果qml界面已经运行起来,然后需要翻译。除了重新加载翻译文件外,需重新加载qml文件,否则无法完成翻译。

7. 发布可执行程序时,记得将xx.ts与xx.qm一并与可执行程序发布,否则程序找不到对应的文件,无法完成翻译工作。另外,建议使用绝对路径查找xx.qm文件,因为你设置自启动程序时,依靠当前路径是找不到cn.qm的。

猜你喜欢

转载自blog.csdn.net/Davidsdu/article/details/84925558