Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP

摘要:
解决办法一是显式地调用QObject的函数:w.setWindowTitle;或者,你可以使用QCoreApplication的translate()函数。如果你想要翻译函数外部的字符串,你需要使用两个宏QT_TR_NOOP()和QT_TRANSLATE_NOOP()。它们的使用方法如下:QStringFriendlyConversation::greeting{staticconstchar*greeting_strings[]={QT_TR_NOOP,QT_TR_NOOP};returntr;}staticconstchar*greeting_strings[]={QT_TRANSLATE_NOOP,QT_TRANSLATE_NOOP};QStringFriendlyConversation::greeting{returntr;}QStringglobal_greeting{returnqApp-˃translate;}好了,以上就是我们用到的大部分函数和宏。Qt实际上是提供了内置字符串的翻译qm文件的。我们需要在Qt安装目录下的translations文件夹下找到qt_zh_CN.qm,然后同前面一样,将它复制到exe所在目录。

文章来源:http://devbean.blog.51cto.com/448512/245063/

在代码中,我们使用tr()将需要翻译的字符串标记出来。lupdate工具就是提取出tr()函数中的相关字符串。tr()函数是QObject类的一个static函数,其签名如下:
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张staticQString tr(constchar*sourceText,constchar*comment = 0,intn = -1);
虽然我们只传了一个参数,但是实际上tr()函数是接受3个参数的。第一个参数是我们需要翻译的文字,如果使用qm文件有对应的字符串,则使用对应的字符串进行替换,否则将显示sourceText参数指定的字符串。第二个参数是一个注释,用于解释前面的sourceText的含义,比如table一词既可以当做桌子翻译,又可以当成表格翻译,这时你就需要提供这个注释。或许你会问,使用翻译工具的时候不是有源代码吗?问题是,有可能人家不使用这个翻译工具,而使用别的工具,这样就不能保证会有这个源代码的预览;并且,你的程序不一定必须要发布源代码的;翻译人员往往只得到我们导出的ts文件,如果你加上注释,就可以方便翻译人员进行翻译。最后一个参数n用于指定字符串是否为复数。我们知道,很多语言,比如英语,很多名词的单复数形式是不相同的,为了解决这个问题,Qt在tr()函数中提供了一个参数n。请看如下代码:
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张intn = messages.count();
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张showMessage(tr("%n message(s) saved", "", n));
对于n的值的不同,Qt会翻译成不同的文字,例如:
n翻译结果
00 message saved
11 message saved
22 messages saved
55 messages saved
tr()函数是QObject的函数,如果你的类不是继承自QObject,就不能直接使用tr()函数。比如我们在main()函数中希望增加一句设置MainWindow的title的代码:
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张w.setWindowTitle(tr("MyApp"));
直接这样写是无法通过编译的,因为main()函数是全局函数,所以这个tr()是找不到的。解决办法一是显式地调用QObject的函数:
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张w.setWindowTitle(QObject::tr("MyApp"));
或者,你可以使用QCoreApplication的translate()函数。你一定还记得,我们的main()函数的第一句总是QApplication app;,其实,QApplication就是QCoreApplication的子类。所以,我们也能这样去写:
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张w.setWindowTitle(app.translate("MyApp"));
由于在Qt程序中,QCoreApplication是一个单例类,因此,Qt提供了一个宏qApp,用于很方便的访问QCoreApplication的这个单例。所以,在其他文件中,我们也可以直接调用qApp.translate()来替换tr(),不过这并没有必要。
如果你的翻译文本中包含了需要动态显示的数据,比如我们上次代码中的
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张QMessageBox::information(NULL, tr("Path"), tr("You selected %1").arg(path));
这句你当然可以写成
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张QMessageBox::information(NULL, tr("Path"),"You selected "+ path);
但这种连接字符串的方式就不能够使用tr()函数了!因此,如果你需要像C语言的printf()函数这种能够格式化输出并且需要翻译时,你必须使用我们例子中的%1加arg()函数!
如果你想要翻译函数外部的字符串,你需要使用两个宏QT_TR_NOOP()和QT_TRANSLATE_NOOP()。前者是用来翻译一个字符串,后者可以翻译多个字符串。它们的使用方法如下:
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张QString FriendlyConversation::greeting(inttype)
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张{
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张staticconstchar*greeting_strings[] = {
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张 QT_TR_NOOP("Hello"),
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张 QT_TR_NOOP("Goodbye")
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张 };
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张returntr(greeting_strings[type]);
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张}
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张staticconstchar*greeting_strings[] = {
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张 QT_TRANSLATE_NOOP("FriendlyConversation","Hello"),
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张 QT_TRANSLATE_NOOP("FriendlyConversation","Goodbye")
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张};
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张QString FriendlyConversation::greeting(inttype)
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张{
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张returntr(greeting_strings[type]);
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张}
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张QString global_greeting(inttype)
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张{
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张returnqApp->translate("FriendlyConversation",
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张greeting_strings[type]);
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张}
好了,以上就是我们用到的大部分函数和宏。除此之外,如果我们运行前面的例子就会发现,实际上我们只是翻译了菜单等内容,打开文件对话框并没有被翻译。原因是我们没有给出国际化的信息。那么,怎么才能让Qt翻译这些内建的文字呢?我们要在main()函数中添加几句:
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张intmain(intargc,char*argv[])
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张{
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张QApplication a(argc, argv);
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张QTranslator qtTranslator;
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张qtTranslator.load("myapp.qm");
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张a.installTranslator(&qtTranslator);
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张QTranslator qtTranslator2;
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张qtTranslator2.load("qt_zh_CN.qm");
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张a.installTranslator(&qtTranslator2);
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张MainWindow w;
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张w.resize(800, 600);
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张w.show();
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张returna.exec();
Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP第1张}
我们又增加了一个QTranslator对象。Qt实际上是提供了内置字符串的翻译qm文件的。我们需要在Qt安装目录下的translations文件夹下找到qt_zh_CN.qm,然后同前面一样,将它复制到exe所在目录。现在再运行一下程序:哈哈已经完全变成中文了吧!
http://blog.csdn.net/libaineu2004/article/details/40189327

免责声明:文章转载自《Qt多国语言QT_TR_NOOP和QT_TRANSLATE_NOOP》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇RK3288 GMAC整理text-align=center 失效原因下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

微软Skype实时口译增加中文

直击现场   在机器翻译技术上,微软的 Skype 业务也算是行业内名列前茅。日前其实时口语翻译技术再次跃升一个台阶,新增了对中文(普通话)的翻译支持。   据美国科技新闻网站 TheVerge 报道,此前,Skype 已经实现了不同语种的人们在语音聊天时,提供实时的口语翻译。Skype 初期支持了英语和西班牙语。而在最新的语言更新中,新增了中文普通话和...

java学习总结--1.起源

           javaoo已经学完一段时间了,感觉这些知识没有通过系统的归总,忘记是很容易的。为了不浪费这段学习时间,并且为了以后自己的温故而知新,故抽空出来将javaoo以自己的方式总结一下(不求优美,但求完整)。     尊重原创,转载请注明,哈哈哈。随意啦  一、初识java   1.java起源     网上都是以1995年5月23日sun...

解读 JavaScript 之引擎、运行时和堆栈调用

https://www.oschina.net/translate/how-does-javascript-actually-work-part-1 随着 JavaScript 变得越来越流行,很多团队在他们的堆栈中实现诸多层级的支持 - 前端、后端、混合应用程序、嵌入式设备等等。 本文是该系列文章的第一篇,旨在深入研究 JavaScript 及其实际...

神经机器翻译(NMT)相关资料整理

作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明。谢谢! 1 简介 自2013年提出了神经机器翻译系统之后,神经机器翻译系统取得了很大的进展。最近几年相关的论文,开源系统也是层出不穷。本文主要梳理了神经机器翻译入门、进阶所需要阅读的资料和论文,并提供了相关链接以及简单的介绍,以及总...

prototype1.6.0官方文档翻译(一)

Prototype framework 定义类和继承 在prototype的早期版本中, 这个框架来为类创建基本支持: Class.create() 方法。 直到现在,只有以这种方式定义类的功能,称为方法构造函数自动初始化: initialize。 Prototype 1.6.0 现在支持类模块继承, 相比较之前的版本有了很大提高;你可以比 之前...

WPF 多语言解决方案

1、首先安装Multilingual App Toolkit 2、新建项目,在VS中点击"工具" -> "Multilingual App Toolkit" -> "启用选定内容" 如果出现上述Issue, 打开项目AssemblyInfo.cs文件,加入如下代码片段,然后重复Step 2. [assembly: NeutralRes...