Qt国际化之翻译(VS2013+Qt5.4.1)

来源:互联网 发布:linux mv 覆盖目录 编辑:程序博客网 时间:2024/06/06 15:52

代码里写的是中文,乱码问题是在源文件最前面加#pragma execution_character_set(“utf-8”)解决的。

要出英文版,了解了下,做法是,把要翻译的文字用tr()包起来,VS装了Qt插件后,项目右键有Create new Tranlation File,生成.ts文件,生成过有增改代码的话,项目右键lupdate一下,用Qt语言家打开,配上英语,改好后,项目右键lrelease发布为.qm文件,然后 就是QTranslator qtTranslator;
qtTranslator.load(*.qm);app.installTranslator(&qtTranslator);。

然而过程并不顺利。

首先乱码问题。找了个中文加了tr(),Create了.ts后,Qt Linguist打开竟然是乱码。想到应是编码问题,虽然对字符集、编码方式早有理论储备,然而问题面前还得靠实践。各种试验后,发现utf-8带bom的编码能兼顾VS里显示和Qt语言家里的显示。如何转换呢,网上说,VS里编码使用的是操作系统代码页,中国就默认编码GB2312,而且VS并不能改默认,有个插件ForceUTF8 (with BOM),测试了下,看起来只有新编辑的文本里出现了中文才会保存为utf-8+bom的编码。并不能满足我转换大量代码的需求。VS的高级保存选项也不能批量,最后找到了UltraCodingSwitch,批量转换了下。

然后是找中文。代码里的中文基本都没加tr(),一个个扒工作量太大。于是想到能不能用正则表达式,据说,基本汉字的Unicode编码范围是4E00-9FA5,一番折腾后弄出来了个不怎么健壮的正则表达式:

1. 去掉原来有tr()的
查找内容:([\( =])(QObject::|)tr\(("[^"]*[\u4E00-\u9FA5]+[^"]*")\)
替换为:$1$3
2. 统一加上tr()
查找内容:("[^"]*[\u4E00-\u9FA5]+[^"]*")
替换为:tr($1)

设置下查找文件类型,.ui文件不需要替换排除掉,替换后没发现有遗留的中文,但还是得人工过一遍,主要是把一些无家可归的tr收编为QObject::tr,或者给所在非QObject子类加QT_TR_NOOP()宏,这个自行了解,还有就是纠正一些乱七八糟让人怀疑科学的替换结果,比如最后包含的#include”PubFun.h”会变成#include “PubFun.htr(“,有些”“会被替换为”tr(“,还有一些嵌套引号的需要调一下。

这样生成/更新.ts后,中文就归在所在类里,方便分析翻译,但语言家界面里是写汉语译文,这个在语言家 编辑=》翻译文件设置… 改下源语言和目标语言就可以,这个变更除了感觉界面上看着不别扭之外,并没发现有什么用,.ts文件多嫌设置麻烦时可以设置一个,其他的以文本打开,替换一下开头的内容:

<TS version="2.1" language="zh_CN">
<TS version="2.1" language="en" sourcelanguage="zh_CN">

.ts和.ui一样,也是xml格式的,这样最后改好时可以合并一下.ts,只发布一个.qm,显得更专业一点。。

其他,只加tr(),.ts里是把字符串归入所在类的,当然也可以改为QObject::tr()指定让它归入QObject来统一一些字符串,或者归入其他类方便管理。

1 0