博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt学习之路(34): 国际化(下)
阅读量:6205 次
发布时间:2019-06-21

本文共 2889 字,大约阅读时间需要 9 分钟。

上次说了国际化的过程,现在来看一下具体的国际化的相关代码。
 
在代码中,我们使用tr()将需要翻译的字符串标记出来。lupdate工具就是提取出tr()函数中的相关字符串。tr()函数是QObject类的一个static函数,其签名如下:
 
InBlock.gif
static QString tr(
const 
char *sourceText, 
const 
char *comment = 0, 
int n = -1);
 
虽然我们只传了一个参数,但是实际上tr()函数是接受3个参数的。第一个参数是我们需要翻译的文字,如果使用qm文件有对应的字符串,则使用对应的字符串进行替换,否则将显示sourceText参数指定的字符串。第二个参数是一个注释,用于解释前面的sourceText的含义,比如table一词既可以当做桌子翻译,又可以当成表格翻译,这时你就需要提供这个注释。或许你会问,使用翻译工具的时候不是有源代码吗?问题是,有可能人家不使用这个翻译工具,而使用别的工具,这样就不能保证会有这个源代码的预览;并且,你的程序不一定必须要发布源代码的;翻译人员往往只得到我们导出的ts文件,如果你加上注释,就可以方便翻译人员进行翻译。最后一个参数n用于指定字符串是否为复数。我们知道,很多语言,比如英语,很多名词的单复数形式是不相同的,为了解决这个问题,Qt在tr()函数中提供了一个参数n。请看如下代码:
 
InBlock.gif
int n = messages.count(); 

InBlock.gifshowMessage(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的代码:
 
InBlock.gifw.setWindowTitle(tr(
"MyApp"));
 
直接这样写是无法通过编译的,因为main()函数是全局函数,所以这个tr()是找不到的。解决办法一是显式地调用QObject的函数:
 
InBlock.gifw.setWindowTitle(QObject::tr(
"MyApp"));
 
或者,你可以使用QCoreApplication的translate()函数。你一定还记得,我们的main()函数的第一句总是QApplication app;,其实,QApplication就是QCoreApplication的子类。所以,我们也能这样去写:
 
InBlock.gifw.setWindowTitle(app.translate(
"MyApp"));
 
由于在Qt程序中,QCoreApplication是一个单例类,因此,Qt提供了一个宏qApp,用于很方便的访问QCoreApplication的这个单例。所以,在其他文件中,我们也可以直接调用qApp.translate()来替换tr(),不过这并没有必要。
 
如果你的翻译文本中包含了需要动态显示的数据,比如我们上次代码中的
 
InBlock.gifQMessageBox::information(NULL, tr(
"Path"), tr(
"You selected\n%1").arg(path));
 
这句你当然可以写成
 
InBlock.gifQMessageBox::information(NULL, tr(
"Path"), 
"You selected\n" + path);
 
但这种连接字符串的方式就
不能够使用tr()函数了!因此,如果你需要像C语言的printf()函数这种能够格式化输出并且需要翻译时,你必须使用我们例子中的%1加arg()函数!
 
如果你想要翻译函数外部的字符串,你需要使用两个宏QT_TR_NOOP()和QT_TRANSLATE_NOOP()。前者是用来翻译一个字符串,后者可以翻译多个字符串。它们的使用方法如下:
 
InBlock.gifQString FriendlyConversation::greeting(
int type) 

InBlock.gif { 

InBlock.gif         
static 
const 
char *greeting_strings[] = { 

InBlock.gif                 QT_TR_NOOP(
"Hello"), 

InBlock.gif                 QT_TR_NOOP(
"Goodbye"

InBlock.gif         }; 

InBlock.gif         
return tr(greeting_strings[type]); 

InBlock.gif }
 
InBlock.gif
static 
const 
char *greeting_strings[] = { 

InBlock.gif         QT_TRANSLATE_NOOP(
"FriendlyConversation"
"Hello"), 

InBlock.gif         QT_TRANSLATE_NOOP(
"FriendlyConversation"
"Goodbye"

InBlock.gif }; 

InBlock.gif 

InBlock.gif QString FriendlyConversation::greeting(
int type) 

InBlock.gif { 

InBlock.gif         
return tr(greeting_strings[type]); 

InBlock.gif } 

InBlock.gif 

InBlock.gif QString global_greeting(
int type) 

InBlock.gif { 

InBlock.gif         
return qApp->translate(
"FriendlyConversation"

InBlock.gif                                                        greeting_strings[type]); 

InBlock.gif }
 
好了,以上就是我们用到的大部分函数和宏。除此之外,如果我们运行前面的例子就会发现,实际上我们只是翻译了菜单等内容,打开文件对话框并没有被翻译。原因是我们没有给出国际化的信息。那么,怎么才能让Qt翻译这些内建的文字呢?我们要在main()函数中添加几句:
 
InBlock.gif
int main(
int argc, 
char *argv[]) 

InBlock.gif

InBlock.gif        QApplication a(argc, argv); 

InBlock.gif        QTranslator qtTranslator; 

InBlock.gif        qtTranslator.load(
"myapp.qm"); 

InBlock.gif        a.installTranslator(&qtTranslator); 

InBlock.gif        QTranslator qtTranslator2; 

InBlock.gif        qtTranslator2.load(
"qt_zh_CN.qm"); 

InBlock.gif        a.installTranslator(&qtTranslator2); 

InBlock.gif        MainWindow w; 

InBlock.gif        w.resize(800, 600); 

InBlock.gif        w.show(); 

InBlock.gif        
return a.exec(); 

InBlock.gif}
 
我们又增加了一个QTranslator对象。Qt实际上是提供了内置字符串的翻译qm文件的。我们需要在Qt安装目录下的translations文件夹下找到qt_zh_CN.qm,然后同前面一样,将它复制到exe所在目录。现在再运行一下程序:哈哈已经完全变成中文了吧!
 
至此,我们的Qt程序的国际化翻译部分就结束啦!
本文转自 FinderCheng 51CTO博客,原文链接:
http://blog.51cto.com/devbean/245063

转载地址:http://oihca.baihongyu.com/

你可能感兴趣的文章
linux下共享文件夹(windows可访问,linux也可访问)
查看>>
JavaScript-基础入门.0014.JavaScript内置对象
查看>>
Python+Flask.0010.FLASK即插视图之自定义视图类及修饰器
查看>>
javax.validation.ValidationException: Unable to find a default provider
查看>>
从网络获取数据显示到TableViewCell容易犯的错
查看>>
解析su,su -,sudo的区别
查看>>
C language day1
查看>>
php中获取系统信息的方法
查看>>
excel密码忘记了怎么办
查看>>
PureMvc学习笔记
查看>>
vxlan 资料及其在 neutron中的应用
查看>>
Gradle复制文件/目录方法
查看>>
Linux shell 脚本SDK 打包实践, 收集assets和apk, 上传FTP
查看>>
Andoid开发中生成二维码
查看>>
python 学习资源收集汇总
查看>>
BrowserSync开发利器
查看>>
Bootstrap 排版
查看>>
eclipse编译hadoop插件
查看>>
SVN服务器搭建和使用(一)
查看>>
Docker监控方案(TIG)的研究与实践之Influxdb
查看>>