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

Qt学习之路(33): 国际化(上)

阅读更多
版权声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://devbean.blog.51cto.com/448512/244689
2D绘图部分基本告一段落,还在想下面的部分要写什么,本来计划先说下view-model的相关问题,但是前面看到有朋友问关于国际化的问题,所以现在先来说说Qt的国际化吧!
Qt中的国际化的方法有很多,常用的有使用QTextCodec类和使用tr()函数。前者将编码名称写到代码里面,除非你使用Unicode 编码,否则国际化依然是一个问题;后者就不会有这个问题,并且这也是Qt推荐的做法。因此,我们主要来说使用tr()函数的方法进行应用程序的国际化。
我们先来看一个很简单的MainWindow。为了清楚起见,这里只给出了cpp文件的内容:
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QMenuBar *menuBar = new QMenuBar(this );
QMenu *fileMenu = new QMenu(tr("&File" ), menuBar);
QAction *newFile = new QAction(tr("&New..." ), fileMenu);
fileMenu->addAction(newFile);
QAction *openFile = new QAction(tr("&Open..." ), fileMenu);
fileMenu->addAction(openFile);
menuBar->addMenu(fileMenu);
setMenuBar(menuBar);

connect(openFile, SIGNAL(triggered()), this , SLOT(fileOpen()));
}

MainWindow::~MainWindow()
{

}

void MainWindow::fileOpen()
{
QFileDialog *fileDialog = new QFileDialog(this );
fileDialog->setWindowTitle(tr("Open File" ));
fileDialog->setDirectory("." );
if (fileDialog->exec() == QDialog::Accepted) {
QString path = fileDialog->selectedFiles()[0];
QMessageBox::information(NULL, tr("Path" ), tr("You selected\n%1" ).arg(path));
} else {
QMessageBox::information(NULL, tr("Path" ), tr("You didn't select any files." ));
}
}
这是一个很简单的类,运行结果想必大家也都非常清楚:就是一个主窗口,上面有一个菜单栏,一个File菜单,里面有两个菜单项:
之所以把运行图贴出来,是为了大家能够看清,在代码中的&符号实际在界面中显示成为一条下划线,标记出这个菜单或者菜单项的快捷键。按照代码,当我们点击了Open时,会弹出一个打开文件的对话框:
这里的slot里面的代码在前文中已经详细介绍过。也许你会问,为什么要用这种麻烦的写法呢?因为我们曾经说过,使用static函数实际上是直接调用系统的对话框,而这种构造函数法是Qt自己绘制的。这对我们后面的国际化是有一定的影响的。
好了,都已经准备好了,下面开始进行国际化。所谓国际化,实际上不仅仅是把界面中的各种文字翻译成另外的语言,还有一些工作是要进行书写方式、 货币等的转换。比如,阿拉伯书写时从右向左的,这些在国际化工作中必须完成。但是在这里,我们只进行最简单的工作,就是把界面的文字翻译成中文。
首先,我们需要在pro文件中增加一行:
TRANSLATIONS += myapp.ts
myapp.ts是我们需要创建的翻译文件。这个文件的名字是任意的,不过后缀名需要是ts。然后我们打开命令提示符,进入到工程所在目录,比如我的是E:\My Documents\Workspace\Qt\MyApp,也就是pro文件所在的文件夹,然后输入命令
lupdate MyApp.pro
,如果你出现的是命令不存在,请注意将Qt的bin目录添加到环境变量中。此时,如果更新的数目,说明ts文件创建成功:
最后一行是说,找到7个需要翻译的原文字,0个已经存在。也就是说,这个文件是新建的。这时你会在工程目录下找到这个myapp.ts文件。也 许你会奇怪,为什么这里还会说已存在的数目呢?因为Qt这个工具很智能的能够识别出已经存在的文字和修改或新增的文字,这样在以后的工作中就不需要一遍遍 重复翻译以前的文字了。这也就是为什么这个工具的名字是“lupdate”的原因,因为它是“update”,而不仅仅是生成。
如果你有兴趣的话,可以用记事本打开这个ts文件,这个文件实际上是一个XML文件,结构很清晰。不过,我们要使用专业的翻译工具进行翻译。 Qt提供了一个工具,Qt Linguist,你可以在开始菜单的Qt项下面的Tools中找到。用它可以打开我们的ts文件,然后进行我们的翻译工作:
完全翻译完成后保存文件,然后在文件菜单下有个“发布”。点击这个按钮,工程目录下会有一个myapp.qm文件,这就是我们翻译得到的文件。Qt的qm文件实际上是二进制格式的,因此它经过了高度的优化,体积很小。
下面我们要修改main()函数,使之加载这个qm文件:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator qtTranslator;
qtTranslator.load("myapp.qm" );
a.installTranslator(&qtTranslator);
MainWindow w;
w.resize(800, 600);
w.show();
return a.exec();
}
注意,QTranslator类实际是在QtCore下面的。代码还是很清晰:创建一个QTranslator对象,然后加载qm文件,然后将这个对象安装到QApplication类。好了,现在大功告成,重新编译后运行下程序吧!
咦?怎么还是英文的?哪里有错误了呢?这里往往令人疑惑,其实,这是由于我们使用load()函数加载qm文件时使用的是相对路径,这样直接 load(“myapp.qm”),其实会在当前编译后的exe所在目录下寻找这个qm文件,所以,只要我们把qm文件同exe放在同一目录下,再次运 行:
现在,这个界面已经是中文了吧!其实,这一小细节已经说明,qm文件其实是动态加载到exe文件中的,而不是直接编译进去的。这一点为我们进行动态切换语言提供了基础。

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

分享到:
评论

相关推荐

    Qt国际化教程

    Qt国际化教程

    QT5开发学习资料和实战项目.rar

    该资料详细讲解了以下内容: 1:Qt5的介绍 2:Qt5开发及实例 3:Qt5布局管理 4:Qt5基本对话框 5:Qt5主窗体 6:Qt5图形与图画 ...14:Qt5多国语言国际化 15:Qt5单元测试框架 每个章节都配了详细的例子程序

    Qt学习资料,提供了各个章节的ppt、代码

    Qt学习资料,提供了各个章节的ppt、代码,供初学者学习,具体如下 第1章 Qt概述 第2章 Qt 5模板库、工具 第3章 Qt 5布局管理 第4章 Qt 5基本对话框 第5章 Qt 5主窗体 第6章 Qt 5图形与图片 第7章 Qt 5图形视图框架 ...

    QT国际化(动态翻译)

    QT国际化(动态翻译),需要做qt的多语言版本软件时候可以参考,从别人转载的,方便自己备份,也方便大家学习,共同进步,不喜勿喷!

    QT中文参考手册(QT help)

    关于Qt Qt的版本 常见问题解答 Window系统特性注释 如何购买Qt 安装 如何学习Qt 教程一, 教程二 实例 循序渐进实例 ...国际化(i18n) 调试技术 Qt中的线程支持 Qt插件 窗口部件快照

    C++_GUI_Programming_with_Qt_4_CH

    第一部分:QT基础 第一章.开始学习 第二章.创建对话框 第三章....第四章....第五章....第二部分:中级QT ... 第十七章:国际化 第十八章:多线程 第十九章:制作插件 第二十章:基于平台的特性 第二十一章:嵌入式程序

    QT经典中文手册.chm

    国际化(i18n) 调试技术 Qt中的线程支持 Qt插件 窗口部件快照 Trolltech 工具 附录 关于Trolltech公司 如何报告bug 邮件列表信息 所有的工具 Qt设计器 Qt语言学家 Qt助手 qmake 标准快捷键 Q公共...

    Qt Quick核心编程

    值得一提的是,《Qt Quick核心编程》覆盖了Android开发的多个主题,如拍照、定位、录音、国际化、可伸缩界面等,也是使用Qt Quick进行移动开发不可错过的。, 《Qt Quick核心编程》的读者对象为:希望学习一门高效的...

    24小时学通qt编程

    第五部分——改善程序性能,介绍Qt程序的国际化、移植、调试等问题,以及怎样使用构造程序简单快捷地创建图形界面。附录部分给出了每章测验题答案和常用的Qt类描述。全书分为24个学时,每一学时内容均以前一学时为...

    精通qt4编程(源代码)

    \第20章 国际化 468 \20.1 Unicode与字符编码 468 \20.1.1 Unicode 468 \20.1.2 汉字编码 469 \20.1.3 编码转换 469 \20.2 Qt Linguist 471 \20.2.1 发布管理器 472 \20.2.2 翻译器 474 \20.2.3 加载翻译文件 476 \...

    24小时学通qt编程(PDF)

    改善程序性能,介绍Qt程序的国际化、移植、调试等问题,以及怎样使用构造程序简单快捷地创建图形界面。附录部分给出了每章测验题答案和常用的Qt类描述。全书分为24个学时,每一学时内容均以前一学时为基础。

    精通Qt4编程(第二版)源代码

    \第20章 国际化 468 \20.1 Unicode与字符编码 468 \20.1.1 Unicode 468 \20.1.2 汉字编码 469 \20.1.3 编码转换 469 \20.2 Qt Linguist 471 \20.2.1 发布管理器 472 \20.2.2 翻译器 474 \20.2.3 加载翻译...

    Qt Quick核心编程.安晓辉(带详细书签) PDF

    值得一提的是,《Qt Quick核心编程》覆盖了Android开发的多个主题,如拍照、定位、录音、国际化、可伸缩界面等,也是使用Qt Quick进行移动开发不可错过的。, 《Qt Quick核心编程》的读者对象为:希望学习一门高效的...

    C++ GUI Qt 4编程 第二版 [清晰带详细书签]

    第二和第三部分主要讲解Qt的中高级编程,包括布局管理、事件处理、二维/三维图形、拖放、项视图类、容器类、输入/输出、数据库、多线程、网络、XML、国际化、嵌入式编程等内容;第四部分为附录内容,分别介绍了Qt的...

    用qt写的登录模块

    用qt写的登录模块 实现了国际化 有语言包 纯代码 非常适合初学者学习

    QT中文教程

    国际化(i18n) 调试技术 Qt中的线程支持 Qt插件 窗口部件快照 Trolltech 工具 附录 关于Trolltech公司 如何报告bug 邮件列表信息 所有的工具 Qt设计器 Qt语言学家 Qt助手 qmake 标准快捷键 Q公共...

Global site tag (gtag.js) - Google Analytics