Qt进修之路(34):国际化(下)
副标题#e#
上次说了国际化的进程,此刻来看一下详细的国际化的相关代码。
在代码中,我们利用tr()将需要翻译的字符串标志出来。lupdate东西就是提取出tr()函数中的相关字符串。tr()函数是QObject类的一个static函数,其签名如下:
static QString tr(const char *sourceText, const char *comment = 0, int n = -1);
固然我们只传了一个参数,可是实际上tr()函数是接管3个参数的。第一个参数是我们需要翻译的文字,假如利用qm文件有对应的字符串,则利用对应的字符串举办替换,不然将显示sourceText参数指定的字符串。第二个参数是一个注释,用于表明前面的sourceText的寄义,好比 table一词既可以当做桌子翻译,又可以当成表格翻译,这时你就需要提供这个注释。或者你会问,利用翻译东西的时候不是有源代码吗?问题是,有大概人家不利用这个翻译东西,而利用此外东西,这样就不能担保会有这个源代码的预览;而且,你的措施不必然必需要宣布源代码的;翻译人员往往只获得我们导出的ts 文件,假如你加上注释,就可以利便翻译人员举办翻译。最后一个参数n用于指定字符串是否为复数。我们知道,许多语言,好比英语,许多名词的单复数形式是不沟通的,为了办理这个问题,Qt在tr()函数中提供了一个参数n。请看如下代码:
int n = messages.count();
showMessage(tr("%n message(s) saved", "", n));
对付n的值的差异,Qt会翻译成差异的文字,譬喻:
n | 翻译功效 |
0 | 0 message saved |
1 | 1 message saved |
2 | 2 messages saved |
5 | 5 messages saved |
tr()函数是QObject的函数,假如你的类不是担任自QObject,就不能直接利用tr()函数。好比我们在main()函数中但愿增加一句配置MainWindow的title的代码:
w.setWindowTitle(tr("MyApp"));
直接这样写是无法通过编译的,因为main()函数是全局函数,所以这个tr()是找不到的。办理步伐一是显式地挪用QObject的函数:
w.setWindowTitle(QObject::tr("MyApp"));
可能,你可以利用QCoreApplication的translate()函数。你必然还记得,我们的main()函数的第一句老是 QApplication app;,其实,QApplication就是QCoreApplication的子类。所以,我们也能这样去写:
w.setWindowTitle(app.translate("MyApp"));
由于在Qt措施中,QCoreApplication是一个单例类,因此,Qt提供了一个宏qApp,用于很利便的会见 QCoreApplication的这个单例。所以,在其他文件中,我们也可以直接挪用qApp.translate()来替换tr(),不外这并没有须要。
假如你的翻译文本中包括了需要动态显示的数据,好比我们上次代码中的
QMessageBox::information(NULL, tr("Path"), tr("You selected\n%1").arg(path));
这句你虽然可以写成
QMessageBox::information(NULL, tr("Path"), "You selected\n" + path);
但这种毗连字符串的方法就不可以或许利用tr()函数了!因此,假如你需要像C语言的printf()函数这种可以或许名目化输出而且需要翻译时,你必需利用我们例子中的%1加arg()函数!
#p#副标题#e#
假如你想要翻译函数外部的字符串,你需要利用两个宏QT_TR_NOOP()和QT_TRANSLATE_NOOP()。前者是用来翻译一个字符串,后者可以翻译多个字符串。它们的利用要领如下:
QString FriendlyConversation::greeting(int type)
{
static const char *greeting_strings[] = {
QT_TR_NOOP("Hello"),
QT_TR_NOOP("Goodbye")
};
return tr(greeting_strings[type]);
}
static const char *greeting_strings[] = {
QT_TRANSLATE_NOOP("FriendlyConversation", "Hello"),
QT_TRANSLATE_NOOP("FriendlyConversation", "Goodbye")
};
QString FriendlyConversation::greeting(int type)
{
return tr(greeting_strings[type]);
}
QString global_greeting(int type)
{
return qApp->translate("FriendlyConversation",
greeting_strings[type]);
}
好了,以上就是我们用到的大部门函数和宏。除此之外,假如我们运行前面的例子就会发明,实际上我们只是翻译了菜单等内容,打开文件对话框并没有被翻译。原因是我们没有给出国际化的信息。那么,怎么才气让Qt翻译这些内建的文字呢?我们要在main()函数中添加几句:
#p#分页标题#e#
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator qtTranslator;
qtTranslator.load("myapp.qm");
a.installTranslator(&qtTranslator);
QTranslator qtTranslator2;
qtTranslator2.load("qt_zh_CN.qm");
a.installTranslator(&qtTranslator2);
MainWindow w;
w.resize(800, 600);
w.show();
return a.exec();
}
我们又增加了一个QTranslator工具。Qt实际上是提供了内置字符串的翻译qm文件的。我们需要在Qt安装目次下的 translations文件夹下找到qt_zh_CN.qm,然后同前面一样,将它复制到exe地址目次。此刻再运行一下措施:哈哈已经完全酿成中文了吧!
至此,我们的Qt措施的国际化翻译部门就竣事啦!
出处:http://devbean.blog.51cto.com/448512/245063