原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://devbean.blog.51cto.com/448512/245063
上次说了国际化的过程,现在来看一下具体的国际化的相关代码。
 
在代码中,我们使用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()函数!
 
如果你想要翻译函数外部的字符串,你需要使用两个宏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()函数中添加几句:
 
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程序的国际化翻译部分就结束啦!

Qt学习之路(34): 国际化(下)的更多相关文章

  1. Qt学习之路

      Qt学习之路_14(简易音乐播放器)   Qt学习之路_13(简易俄罗斯方块)   Qt学习之路_12(简易数据管理系统)   Qt学习之路_11(简易多文档编辑器)   Qt学习之路_10(Qt ...

  2. Qt 学习之路 2(34):贪吃蛇游戏(4)

    Qt 学习之路 2(34):贪吃蛇游戏(4) 豆子 2012年12月30日 Qt 学习之路 2 73条评论 这将是我们这个稍大一些的示例程序的最后一部分.在本章中,我们将完成GameControlle ...

  3. Qt 学习之路 2(8):添加动作

    Home / Qt 学习之路 2 / Qt 学习之路 2(8):添加动作       [在WINDOWS10 QTCREATOR MENU添加无效]   Qt 学习之路 2(8):添加动作  豆子   ...

  4. Qt 学习之路 2(5):自定义信号槽

    Home / Qt 学习之路 2 / Qt 学习之路 2(5):自定义信号槽 Qt 学习之路 2(5):自定义信号槽  豆子  2012年8月24日  Qt 学习之路 2  131条评论 上一节我们详 ...

  5. Qt 学习之路 2(72):线程和事件循环

    Qt 学习之路 2(72):线程和事件循环 <理解不清晰,不透彻>  --  有需求的话还需要进行专题学习  豆子  2013年11月24日  Qt 学习之路 2  34条评论 前面一章我 ...

  6. Qt 学习之路 2(67):访问网络(3)

    Qt 学习之路 2(67):访问网络(3) 豆子 2013年11月5日 Qt 学习之路 2 16条评论 上一章我们了解了如何使用我们设计的NetWorker类实现我们所需要的网络操作.本章我们将继续完 ...

  7. Qt 学习之路 2(66):访问网络(2)

    Home / Qt 学习之路 2 / Qt 学习之路 2(66):访问网络(2) Qt 学习之路 2(66):访问网络(2)  豆子  2013年10月31日  Qt 学习之路 2  27条评论 上一 ...

  8. Qt 学习之路 2(62):保存 XML

    Home / Qt 学习之路 2 / Qt 学习之路 2(62):保存 XML Qt 学习之路 2(62):保存 XML  豆子  2013年8月26日  Qt 学习之路 2  9条评论 前面几章我们 ...

  9. Qt 学习之路 2(53):自定义拖放数据

    Qt 学习之路 2(53):自定义拖放数据 豆子  2013年5月26日  Qt 学习之路 2  13条评论上一章中,我们的例子使用系统提供的拖放对象QMimeData进行拖放数据的存储.比如使用QM ...

随机推荐

  1. BZOJ 1003: [ZJOI2006]物流运输trans DP+最短路

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...

  2. SecureCRT 绝佳配色方案, 保护你的眼睛

    http://blog.csdn.net/zklth/article/details/8937905   关键词:SecureCRT配色, SecureCRT设置颜色, Linux终端配色,Linux ...

  3. TortoiseSVN下载,安装,配置,常用操作 svn教程

    一. 首先在百度搜索并下载 TortoiseSVN 推荐从官网下载,软件分为32位和64位版本,下载时请根据自己的系统位数进行下载:

  4. ASP.NET中定制自己的委托和事件参数类

    本文笔记选自<庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术>一书 一般在实际开发中,对于事件不需要传递数据信息时,像上面的KingTextBox控件的事件,在引发事件时传递的 ...

  5. 基于WCF大型分布式系统的架构设计

    在大型系统中应用中,一个架构设计较好的应用系统,其总体功能肯定是由很多个功能模块所组成的,而每一个功能模块所需要的数据对应到数据库中就是一个或多个表.而在架构设计中,各个功能模块相互之间的交互点 越统 ...

  6. ORACLE与.NET类型对应关系(转)

    ORACLE与.NET类型对应关系 想来这个是最重要的事情了,因为多数情况下,我们使用dbhelper来调用数据库的时候,是因为如下三个地方导致错误: 1.错误的sql语句:末尾多了分号,少了部分关键 ...

  7. Folk博客程序——可以运行于node环境和asp环境的博客系统

    Folk是一个轻量.便携,同时又很强大且可高度定制的内容发布平台.Folk的目标是:让您可以轻松地与世界分享您的点滴. Folk使用世界流行的javascript语言开发,因此可以同时运行于node和 ...

  8. 搜狗一道java题目 关于对象 synchronized 关键字作用在 int, integer

      第一次见到这个题目,我觉得自己没学到java,太浅了,其实这个问题没有考synchronized关键字,只是考什么是对象? 1.在java编程思想的第二章有一句话; 一切都是对象,很可惜int,c ...

  9. WE-1202 (JGX-X5 v1.3)刷openwrt

    当前固件版本显示 固件版本 RippleOS硬件型号 RippleTek WE-1202CPU型号是 MT7620N路由主板上面丝印是 JGX-X5  v1.3 买的时候选择的RippleOS固件,后 ...

  10. Kruskal算法构造最小生成树

    Kruskal算法来构造最小生成树,我总结了分为以下步骤: (1)建图,构造Kruskal边集,边集元素应该包括该边的起始顶点.终止顶点.权值: (2)将边集按权值从小到大的顺序进行排序: (3)从小 ...