上文提到了Qt的国际化支持方案,这里对这一方案进行简要的说明。
使用Qt的国际化支持和翻译机制功能来实现中文的显示,中文字库的支持还是必需的,然后就是使用的Qte库必须包含了翻译特性,不能将翻译特性给裁剪掉,即在qconfig-xxx.h配置文件中不能定义有如下的宏:
#define QT_NO_TRANSLATION
此外还需要使用Qt配套提供的QT Linguist语言工具来辅助实现翻译工作的完成。
Qt Linguist提供的工具
- linguist 用来进行语言翻译的辅助图形界面工具,方便地进行语言的翻译,可提高翻译效率但非必须
- lupdate 用来检查源文件并生成待翻译的TS格式文件的工具,它检查源文件使用了tr函数的地方
- lrelease 用来将XML格式的TS翻译文件转换成QT使用的二进制格式的文件工具,以TS文件为输入
这三个工具的使用会涉及到两种格式的文件,即上面提到的TS文件和qm文件:
- TS文件:是一个XML格式的文件,由lupdate工具以所有源文件为输入自动生成,之后需要进行人工的语言翻译工作;该工作既可以使用linguist工具来完成,也可以直接进行对文件使用文本编辑器来完成。一个TS文件的简单示例为: translation内的中文为人工翻译的,lupdate生成的初始文件该处为空。
<!DOCTYPE TS><TS>
<context>
<name>AlarmIOSet</name>
<message>
<source>Alarm IO Settings</source>
<translation>报警IO设置</translation>
</message>
</context>
国际化支持与翻译实现步骤
- 在应用程序中对所有需要外部展示的字符串使用翻译函数: QObject::tr()或者QApplication::translate()函数。
- 在项目的工程构建文件中,QT自身使用的.pro项目文件中添加TRANSLATIONS目标,你需要多少种语言翻译就添加多少个,每种语言会生成一个翻译文件。如:
- 在应用程序的main函数中安装翻译器和翻译文件,大概的代码为:
- 使用lupdate工具以项目管理文件如show.pro为输入生成相应的TS文件
- 对TS文件进行翻译,使用linguist工具或者直接编辑
- 使用lrelease工具以翻译好的TS文件作为输入生成相应的qm文件,就是在main函数中翻译器加载的文件
- 如果翻译文件使用的编码和源文件的不一致,可能还需要对翻译指定相应的编解码器,即使用类似以下的语句:
- 如果之后又在源文件中进行了代码修改和添加,只需要重复步骤4—6就可以了,lupdate工具只会更新当前的TS文件,即把源文件中新增的待翻译文本加入TS,而不会覆盖之前的翻译。
TRANSLATIONS = show_zh.ts \
show_fr.ts
int main(int argc, char *argv[])
{
QApplication app(argc, argv, QApplication::GuiServer);
QTranslator translator(0);
translator.load("show-zh.qm",".");
app.installTranslator(&translator);
//QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QTextCodec* codec = QTextCodec::codecForName("UTF-8");
app.setFont(QFont("wenquanyi",22,87,FALSE,QFont::Unicode));
app.setDefaultCodec(codec);
UserLogin *user_login = new UserLogin(0,"User Login", WIN_FLAGS);
app.setMainWidget(user_login);
return app.exec();
}
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
这样,就完成了显示内容的国际化支持实现,也就可以实现中文的显示,显然该方案更具有扩展性。在源代码中可以只使用英文来完成所有的编写,然后翻译工作留给翻译文件来完成。
来源:oschina
链接:https://my.oschina.net/u/195885/blog/120678