QT提供了多语言支持,通过它自带的例子,我们可以很简明地了解如何使用QT提供的工具和类库实现便捷的多语言翻译工作。
第一步 打开 Hello tr() Example 项目
在 “欢迎” 页面打开 Hello tr() Example 项目
第二步 配置 Kit
注意:打开例子之后,直接编译运行是不行的,因为我们没有进行过翻译工作。而例子源代码中有这样的代码:
if (!translator.load("hellotr_la")) { return 1; }
当加载翻译文件失败时,程序直接返回了,什么反应都没有的。
如果你想试一下的话,可以把 return 1; 这行去掉,这样就算没有成功加载到翻译文件,程序也不会直接返回,而是继续执行,当然,程序显示的语言就是源代码中写的语言,这个例子中是英语 “Hello world!”。
第三步 生成 .ts 翻译文件
首先需要用 lupdate 工具帮助我们生成一个翻译文件,lupdate 文件会帮助我们自动将源代码中所有需要翻译的字符串(那些 tr() 包裹的字符串)都找出来,列成一个清单;这样在后面我们就可以使用另一工具逐个对这些字符串进行翻译了。
第四步 修改 .ts 翻译文件,对字符串进行翻译
现在,我们可以看到一个新的文件 hellotr_la.ts,这个就是 lupdate 帮我们生成的翻译文件,当然现在里面都是等待翻译的字符串。为了简单起见,我没有去改例子的 .pro 文件,所以我们生成的翻译文件后缀是 la 即拉丁语翻译。想要生成多种语言,可以修改 .pro 文件
TRANSLATIONS = hellotr_la.ts hellotr_cn.ts
修改成这样,再 lupdate ,就会生成两个 .ts 翻译文件。
用 Qt Linguist 工具可以打开 hellotr_la.ts 文件进行文字翻译。
第五步 设置翻译文件语言
每个 .ts 文件打开之后,可以设置它的目标语言,为了简单起见,我直接把 hellotr_la.ts 设置成了简体中文(因为我不会拉丁文)。
然后,对里面需要翻译的字符串逐个进行翻译,这个例子中我们只有一个字符串需要翻译,就是“Hello world!”。Qt Linguist 同时也显示这个字符串的来历,它来自哪一行源代码,以方便准确地进行翻译。我们把 “Hello world!” 翻译成 “世界我来了!”,然后保存 .ts 文件。
第六步 发布 .qm 翻译文件
翻译之后的 .ts 文件还不能为程序所用,运行一下 lrelease,发布成 .qm 文件才能被程序识别。
第七步 把 .qm 文件放到当前工作目录下(即 QDir::currentPath() )
根据手册,“translator.load()” 默认会到当前工作目录下搜索 .qm 文件,所以我们还需要把 .qm 文件复制到工作目录下面(也就是用户启动程序时的目录),QT creator 中运行程序时,工作目录并不是 debug 或者 release 目录,而是它们的上一级目录。
第八步 编译运行程序,即显示翻译的语言
大功告成。