在给Moto E6做抓屏软件的时候想练习一下多国语言的实现,QT版本是2.3.8。关于“QT国际化”网上已经有很多介绍了。
我这里说说我遇到的编码问题,我的程序源代码文件,注意是.cpp/.h文件的编码是GBK的,这个很重要,因为如果是UTF-8编码的或许不会有这样的问题。没办法,我的IDE的编辑器对U码不支持。按照一般的步骤进行,首先在源代码里建立一个QTranslator Language(0),然后Language.load("zh-cn",".")你的qm文件,再就是转载语言对象 app.installTranslator( &Language),在需要进行多国语言的字符串的地方使用tr()。使用lupdate提取.ts文件,这里你的.pro文件里必须有 TRANSLATIONS条目,里面的值是你对于的.ts的文件名。然后就可以打开ts文件使用编辑器进行翻译了。最后使用lrelease生产.qm文件,放到你的程序目录对应Language.load("zh-cn",".")。但是在做中文包的时候发现乱码了。
就这个问题,困扰了我很久。其实应该是这样解决的,要知道.ts文件其实就是一个标准的XML文件,除了QT自己的标签外你最好也要遵循XML的规则。默认使用lupdate提取的文件格式一般都是这样的:
<!DOCTYPE TS><TS> <context> <name>CapDialog</name> …… <message> <source>About...</source> <translation type="unfinished">关于...</translation> </message> </context> </TS>
但是这个文件并没有指定XML的版本、字符集以及TS的版本、语言等信息,这也是造成上面问题的主要原因。
我们添加一些信息到.ts文件里面
<?xml version="1.0" encoding="gbk"?> <!DOCTYPE TS><TS version="1.1" language="zh_CN"> <context> <name>CapDialog</name> …… <message> <source>About...</source> <translation type="unfinished">关于...</translation> </message> </context> </TS>
这样再进行lrelease命令生成qm文件就不会出现乱码了。

