Qt国际化
Qt对软件国际化提供了很好的支持,专门提供了相关的工具进行不同语言的翻译,对于有国际化需求的软件来说,让开发国际版程序变的容易很多。下面是qt国际化需要用到的工具:
工具 |
作用 |
输入 |
输出 |
Lupdate |
从C++源代码中提取要翻译的文本 |
C++工程 |
.ts文件 |
Linguist |
打开.ts文件,引导开发人员完成翻译工作,并保存到.ts文件 |
.ts文件 |
.ts文件 |
lrelease |
更加.ts文件中原文与译文的对于关系,生成.qm文件,程序运行时根据.qm文件实现动态翻译 |
ts文件 |
.qm文件 |
1. 实现步骤
a) 创建Qt工具,编写代码,代码中需要显示的文本都用tr()函数处理
b) 使用lupdate工具提取翻译文本,生成.ts文件
c) 使用Linguist完成翻译工作
d) 使用lrelease生成.qm文件
e) 修改代码,加载.qm文件
2. Lupdate工具使用
首先在.pro文件中添加要生成的翻译文件,例如:TRANSLATIONS = myTest_zh_CN.ts。
文件myTest_zh_CN.ts即为后面执行lupdate生成的文件,文件名可以随便写,但是最好根据工程名及目标翻译语言定义文件名,例如上面的文件名,myTest为工程名,后面的zh_CN代表中文_中国。
然后打开命令行,切换到当前工程目录下,执行命令:lupdate myTest.pro,命令执行成功后会工程目录下生成myTest_zh_CN.ts文件。
3. Linguist工具使用
首先打开linguist工具,选择打开myTest_zh_CN.ts文件,界面如下:
4. Lrelease工具使用
完成上面的翻译工作后,打开命令行,切换到当前工程目录,执行命令:lrelease myTest.pro. pro即可生成.qm文件。
5. 代码加载
进人main.cpp文件,添加头文件#include <QTranslator>,然后在“QApplication a(argc, argv);”代码下添加如下代码:
QTranslator translator;
translator.load("myTest_zh_CN.qm", qApp->applicationDirPath());
qApp->installTranslator(&translator);
6. 扩展
上面讲述的内容是Qt国际化的通用做法,网上提到qt国际化大多都是按这样说的。下面的内容是对qt国际化的一些扩展,网上资料比较少。
Ø Qt自动生成的文本翻译
对于Qt自动生成的文本,例如工具栏上按钮文字,菜单文本等,Qt为我们提前提供了.qm文件,在Qt安装目录西的translations文件加中。例如下面是中文系统相关的.qm文件
Ø 一个工程可以添加多个.qm文件只需定义多个QTranslator对象即可。
Ø 动态库与静态库中文本翻译问题
不论动态库或者静态库,需要在主工程的main函数中,按照添加多个.qm文件的方法,load库(动态库或静态库)自己的.qm文件。
Ø Lupdate手动指定翻译文件
这里要说的是,不需要再qt工程文件(.pro)文件中定义翻译文件名,可以利用lupdate工具生成.ts文件,命令如下:
lupdate -codecfortr utf-8 myTest.pro -ts myTest.ts
Ø 不使用linguist翻译
我们可以直接打开.ts文件编辑,完成翻译工作,可以不需要借助linguist。Lupdate生成的.ts文件是xml文件,我们可以利用可以编辑xml的编辑器直接编辑.ts文件,例如下面如下:
<source>Services</source>为待翻译文本
<translation>服务</translation>为翻译后的文本,根据格式翻译保存即可。
1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE TS> 3 <TS version="2.0" language="zh"> 4 <context> 5 <name>MAC_APPLICATION_MENU</name> 6 <message> 7 <location filename="../src/gui/kernel/qapplication.cpp" line="+2316"/> 8 <source>Services</source> 9 <translation>服务</translation> 10 </message> 11 <message> 12 <location line="+1"/> 13 <source>Hide Others</source> 14 <translation>隐藏其他</translation> 15 </message> 16 <message> 17 <location line="+1"/> 18 <source>Show All</source> 19 <translation>全部显示</translation> 20 </message> 21 <message> 22 <location line="+1"/> 23 <source>About %1</source> 24 <translation>关于 %1</translation> 25 </message> 26 </context>