Qt学习之路(34):国际化(下)
上次说了国际化的过程,现在来看一下具体的国际化的相关代码。 在代码中,我们使用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。请看如下代码:
对于n的值的不同,Qt会翻译成不同的文字,例如:
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()函数! 如果你想要翻译函数外部的字符串,你需要使用两个宏QT_TR_NOOP()和QT_TRANSLATE_NOOP()。前者是用来翻译一个字符串,后者可以翻译多个字符串。它们的使用方法如下:
|
||||||||||
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |