`
izuoyan
  • 浏览: 9224091 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Qt学习之路(34): 国际化(下)

阅读更多
版权声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。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程序的国际化翻译部分就结束啦!

本文出自 “豆子空间 ” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/245063

分享到:
评论

相关推荐

    QT学习之路2-2020整理版(更新到94章)(pdf)

    《QT学习之路2-2020整理版》是一份详尽的QT开发教程,涵盖了从基础到进阶的多个方面。这份资料基于豆子大佬的博客内容进行整理,不仅包含原有的79章,还增加了豆子在2016年3月11日后更新的15章内容,共计94章,旨在...

    Qt学习之路源码

    "Qt学习之路源码"这个资源提供了一部分与Qt编程相关的源代码,旨在帮助学习者节省手动输入书中示例代码的时间,从而更专注于理解概念和机制。 Qt库由C++编写,它提供了丰富的API,支持事件处理、图形用户界面设计、...

    QT学习之路2+QT5教程+范例

    QT学习之路2+QT5教程+范例这个资料集合,显然是为了帮助初学者快速掌握QT开发技能,通过实例来深化理解。 首先,让我们关注《QT5教程 完整版.pdf》。这份文档应该详尽地介绍了QT5的各个方面,包括QT5的基础概念、...

    Qt学习之路2带目标可注释版pdf

    **Qt学习之路2带目标可注释版pdf** Qt是一个跨平台的应用程序开发框架,主要应用于桌面和移动设备,由The Qt Company维护,并且广泛支持C++和QML语言。这个资源,"Qt学习之路2带目标可注释版pdf",显然是一本专注于...

    Qt 学习之路:DZY

    ### Qt学习之路:核心知识点概览 #### 一、前言 - **Qt简介**:Qt是一个跨平台的C++图形用户界面应用程序开发框架。它不仅支持Windows、macOS、Linux等主流操作系统,还能用于开发嵌入式系统、移动设备应用(如...

    Qt学习之路.pdf

    ### Qt学习之路知识点总结 #### 一、基础知识与入门 - **Hello, World!** - **知识点**:Qt环境搭建、第一个Qt程序编写、基本的窗口显示。 - **重要性**:作为Qt初学者的第一课,通过简单的示例程序帮助理解Qt的...

    QT学习之路

    标题《QT学习之路》指明了文档的主要内容,即向读者介绍如何学习Qt这一跨平台的C++图形用户界面应用程序开发框架。Qt是一个功能强大的工具,能够用来开发具有图形用户界面的应用程序,并且支持多种操作系统平台,如...

    Qt+学习之路+2

    - **背景**: 本文档是基于作者之前的一个系列教程——《Qt学习之路》的更新版本,旨在适应Qt的新版本和发展趋势。 - **目的**: 更新和完善原有教程内容,使其更适合Qt 4.x和即将到来的Qt 5的学习需求。 - **定位**: ...

    QT学习网站daquanQT学习网站

    9. **QT国际化与本地化**:QT支持多语言环境,可以轻松实现应用的国际化。 10. **QT嵌入式开发**:QT可以应用于嵌入式系统,如智能家电、汽车信息娱乐系统等。 在"QT学习网站.txt"文件中,可能包含了各种QT学习...

    Qt学习之路2--目录完整版

    《Qt学习之路》是针对Qt框架的一本详细教程,它以Qt4为基础,旨在帮助新手逐步掌握这个强大的跨平台应用程序开发工具。Qt是一个C++库,提供了丰富的API,用于构建图形用户界面(GUI)和非GUI应用程序。在本文中,...

    QT学习之路2

    QT学习之路2,正如其标题所示,是针对初学者的一系列QT基础知识的学习资料,旨在帮助新手快速上手并掌握QT开发的基本技能。 QT框架提供了丰富的API,使得开发者能够创建出功能强大的桌面、移动以及嵌入式应用。它的...

    QT学习之路(全).pdf

    ### Qt学习之路知识点详解 #### 一、Qt简介与特性 **标题与描述解析:** - **标题**:“QT学习之路(全).pdf” - **描述**:介绍Qt作为一个著名的C++库,不仅限于GUI功能,还提供了一系列丰富的工具和服务。 **...

    Qt国际化教程

    ### Qt国际化教程详解 在开发跨国家或地区的应用程序时,软件的多语言支持变得尤为重要,以适应不同用户的语言习惯。Qt作为一个广泛使用的跨平台应用程序框架,提供了强大的国际化(i18n)支持,使得开发者能够轻松...

    QT.rar_QT学习资料_site:www.pudn.com

    这个“QT.rar”压缩包显然包含了与QT学习相关的资料,特别适合初学者和学生来提升他们的QT编程技能。 QT的核心特性包括: 1. **跨平台性**:QT支持Windows、Linux、macOS、Android、iOS等多个操作系统,使得开发者...

    QT学习入门及开发实例

    通过"QT学习入门"和"QT5开发及实例"的学习,开发者不仅可以掌握QT的基础知识,还能进一步提升在QT5框架下的应用开发能力,为构建高质量、跨平台的应用程序打下坚实基础。结合PDF说明和代码调试,学习效果将更为显著...

    qt学习视频3

    QT学习视频3主要聚焦于C++与QT的联合开发,这一部分的学习内容是QT学习旅程中的重要阶段。QT是一个强大的跨平台应用开发框架,由Qt Company维护,广泛应用于桌面、移动以及嵌入式设备的软件开发。C++是QT的主要编程...

    Qt学习之路---尤其适用Qt初学者

    ### Qt学习之路——尤其适用Qt初学者 #### 前言 Qt是一个强大的跨平台应用程序开发框架,广泛应用于桌面和嵌入式系统。对于初学者而言,掌握Qt的基础及其核心特性至关重要。本书《Qt学习之路》是专为Qt初学者准备的...

Global site tag (gtag.js) - Google Analytics