本文提及如何使用QT和QT Linguist来实现翻译,如果你对所谓动态翻译感兴趣,请移步到其他文章。笔者也推荐一本叫《精通QT4 GUI 编程》的书,里面第18章有提及动态的(既不用关闭程序实现“一点即换”)翻译。
网上有许多关于QT国际化的文章。这里也简单讲述一次.
1、qm文件和ts文件。
ts文件是程序员是用的翻译文件。你有几种方法可以得到这样的文件。
(1) 针对整个项目:在项目文件中加入TRANSLATION += abc.ts(abc是自定的文件名)。那么你可以使用Qt自带的控制台,输入命令lupdate myPro.pro(myPro是自定的项目名称)。Qt就会为你在项目文件的同一目录下生成一个abc.ts文件。输入命令时要么当前目录就是pro文件所在目录,要就在pro文件名前带上绝对或相对路径。
当你lupdate你的pro文件是,Qt会将ui文件中所有的可见字符以及你在程序用使用tr括起来所有字符放入到ts文件中。
(2) 针对单个文件,这只适用于一些特定场景或者个人使用习惯。当你往项目里头添加了新的带有需要翻译文本的文件后,你完全可以直接再次lupdate一次整个项目,Qt不会覆盖你在abc.ts中已经做好的任何翻译。 当然你也可以lupdate单个文件,命令和上一个是一样的 : lupdate 文件的绝对路径或相对路径 -ts 要生成的ts文件名和文件路径,例如:
lupdate ../app/test.cpp -ts ./testTs.ts
那么Qt就是在你指定的路径下生成你指定的文件名的ts文件。
qm文件是程序能识别的二进制的翻译文件。通过发布一个ts文件来产生。命令很简单:lrelease abc.ts。 那么Qt 会为你在abc.ts的同名目录下生成一个同名的qm文件。qm文件是QTranslator应该读入的文件,关于QTranslator,就移步到Qt的帮助手册吧。
下图是Qt自带的控制台。
2、处理ts文件
处理ts文件当然也有多种方法。你可以使用Qt Linguist打开,也可以使用任何支持XML文本格式的工具打开。个人比较喜欢使用notepad++ 来处理ts文件而不是Qt Linguist(别笑我低端)。
如下是Qt Linguist中打开ts文件的样子 , 黄色的框是你的文件列表,点选文件后会在红色的框内显示所有tr括起来的语句或者是ui中的可见字符串。绿色框是当前翻译中的文本和翻译后的文本。黑色框是文本在代码中的具体位置,帮助你精确翻译,但是这部分常常不可用。那些文件名和源语句前的钩钩只是用来标记完成度的,完成就打成绿色的钩,自己打,但是不影响翻译的。
个人更喜欢用notepad++,顺便一提吧。如下是notepad++打开ts的样子,刚好是一个完整的context。标签是一个文件所有需翻译文本集合的开始标志。标签指明了文件中的类名称。是一条需翻译语句的开始标记。是语句在文件中的行数,因此可能在同一个中出现多次。需翻译的语句,要精确,连空格个数不一样都不能匹配。是翻译后的语句,这个标签一个开始是 ,好像是这样的,表示语句没有翻译好,当你在notepad++中确实完成翻译后记得将type部分删掉,带有这个unfinished标志的语句是即使翻译好也不会被写入qm文件中的。
最后,你需要一个年轻貌美的女同事,既熟悉英文,又温柔体贴。而且不会在你忘得不可开交但剩下30%翻译任务的时候也不肯帮你一把。祝你好运,coder。
3、我的工程使用了Qt的控件,但是Qt的控件中字符都是英文的……
不要紧,到你的Qt安装目录下搜一下.ts文件,你会发现其实Qt已经为我们准备好了非常多的ts文件。刚刚这个问题中,我们就找到qt_zh_CN.ts文件,这是一个有qt控件简体中文翻译的文件。你完全可以把这个文件放到你的工程中去(你不会跟计较那几百k的空间吧!?),然后通过文本工具,往这个文件中添加 , 例如你可以将你的项目的ts文件直接拷贝到qt_zh_CN.ts文件的最后面(为了好找) ,然后lrelease这个qt_zh_CN.ts文件。你就会发现Qt控件中的英文也变成中文了,而且还添加了你自己的部分。
4、我想为我的工程添加繁体翻译
方法同上,不过这次你要找的文件叫qt_ch_TW.ts(Qt在这就做得不对了哈!什么TaiWan 和 China的,都一个地方),这个文件有Qt所有控件的繁体中文翻译。你甚至可以讲qt_zh_CN.ts的内容拷贝到word中,然后简转繁,再覆盖原来的ts文件来完成这个任务。不论怎样,完成繁体翻译吧骚年!
5、关于动态语言切换
个人对这个没有什么认识。但是我只提一个问题:动态翻译是否在你的工程中非有不可? 如果不是,就稍稍偷个懒吧。我的建议有两个,一个比较傻瓜。1.在用户安装你的应用的过程中(安装包),让用户选定一个语言,安装完成后不可以改变。相信这个不会影响用户的使用体验,因为没有人会装B到明明英文不好却是要用英文安装,安装后又作贱地想换回中文的(你?)。 2.在应用中给用户一个设置选项,让用户可以选择语言,但是选择语言后提示需要重启本应用。这个办法比较傻瓜。在用户重启你的应用时,你就有机会让你的QTranslator重新load一个不同的qm文件,这样就可以完成语言切换。个人偏向第一种方法,也稍稍省点心吧,别让自己太容易暴毙吧coder。
6、QTranslator的一些问题
一个QApplication会有一个translator。translator可以remove,也可以install。下面是笔者一个简单的程序来设置语言:
1).先定义我的qm文件的路径先
2).根据系统的QLocale判断应该load哪个qm文件
那个optionManager是用来读注册表的。这个跟应用本身有关。
3). 准备一个接口,然App在启动时load好qm文件。
这样大概就是使用过程了。其他的话聪明的你应该可以理解的了。
7、 哪个QLocale::Language表示中文繁体啊??
这个问题问题得好啊。在Qt的QLocale中的Language枚举中是没有中文繁体的。那怎么办?我这里给有一个不是建议的建议,那就认为,这台机子不是英文和中文的话,就是中文繁体(中文指中文简体)。用一个估计少见的Language表示中文繁体,写注册表时,遇到就这个Language项,就认为是中文繁体。load的时候就用繁体的qm。好了,就说到这个程度,这样的损招再说的话那些老鸟又要表示不屑了。
8、请使用命令行获得.qm文件,而不是QT Linguist的”发布为"或者“另外发布为”~!!
这里很可能是我的机器问题。但是那天工作时遇到的问题确实就在于此。如果你用QT Linguist的发布功能,你可能会和我一样发现很多句子都不能翻译,但是你检查你的ts文件时却没有问题。如果有人看到了这里,并且有机会实践,请帮忙看看情况是不是真的如此。如果可以的话请给我留个言。或者直接向Qt 提BUG。
Enjoy your Qt。