<b>Qt学习之路(34):国际化(下)</b>[VC/C++编程]
本文“<b>Qt学习之路(34):国际化(下)</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
上次说了国际化的历程,目前来看一下具体的国际化的相关代码.
在代码中,我们利用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 selectedn%1").arg(path));
这句你当然可以写成
QMessageBox::information(NULL, tr("Path"), "You selectedn" + path);
但这种衔接字符串的方法就不可以利用tr()函数了!因此,假如你需求像C语言的printf()函数这种可以格局化输出并且需求翻译时,你必须利用我们例子中的%1加arg()函数!
以上是“<b>Qt学习之路(34):国际化(下)</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |