[Qt教程] 第46篇 进阶(六) 国际化

[Qt教程] 第46篇
进阶(六) 国际化

楼主

 发表于 2013-10-7 09:23:45 | 查看:
109| 回复: 0


国际化

版权声明


该文章原创于Qter开源社区

导语


第2篇中讲述如何显示中文时,曾提到使用QTextCodec和tr()的方式直接显示中文,其实这只是一种临时的方法,方便我们快速完成程序,显示效果。当真正要发布一个程序时,最好的方式是在程序中使用英文字符串,而后使用国际化工具进行翻译。

国际化的英文表述为Internationalization,通常简写为I18N(首尾字母加中间的字符数),一个应用程序的国际化就是使该应用程序可以让其他国家的用户使用的过程。Qt支持现在使用的大多数语言,特别是:

1.所有东亚语言(汉语、日语和朝鲜语)

2.所有西方语言(使用拉丁字母)

3.阿拉伯语

4.西里尔语言(俄语和乌克兰语等)

5.希腊语

6.希伯来语

7.泰语和老挝语

8.所有在Unicode5.1中不需要特殊处理的脚本

       在Qt中,所有的输入部件和文本绘制方式对Qt所支持的所有语言都提供了内置的支持。Qt内置的字体引擎可以在同一时间正确而且精细的绘制不同的文本,这些文本可以包含来自众多不同书写系统的字符。

      

        在Qt中可以使用Qt
Linguist工具来很容易的完成应用程序的翻译工作,在Qt中编写代码时要对需要显示的字符串调用tr()函数,完成代码编写后,对这个应用程序的翻译主要包含三步:

1.运行lupdate工具从C++源代码中提取要翻译的文本,这时会生成一个.ts文件,这个文件是XML格式的;

2.在Qt Linguist中打开.ts文件,并完成翻译工作;

3.运行lrelease工具从.ts文件中获得.qm文件,它是一个二进制文件。这里的.ts文件是供翻译人员使用的,而在程序运行时只需要使用.qm文件,这两个文件都是与平台无关的。

环境:Windows Xp + Qt 4.8.5+QtCreator2.8.0

目录


一、编写源码

二、更改项目文件

三、使用lupdate生成.ts文件

四、使用QtLinguist完成翻译

五、使用lrelease生成.qm文件

六、使用.qm文件

正文


一、编写源码

1.新建Qt Gui应用,项目名称为“myI18N”,类名为“MainWindow”,基类保持QMainWindow不变。

2.建立完项目后,点击mainwindow.ui文件进入设计模式,先添加一个“&File”菜单,再为其添加一个“&New”子菜单并设置快捷键为Ctrl+N(不会操作,查看这里),然后往界面上拖入一个Push
Button。

3.下面我们再使用代码添加几个标签,打开mainwindow.cpp文件,添加头文件#include <QLabel>,然后在构造函数中添加代码:

QLabel *label
= new QLabel(this);

label->setText(tr("hello Qt!"));

label->move(100,50);

QLabel *label2
= new QLabel(this);

label2->setText(tr("password","mainwindow"));

label2->move(100,80);

QLabel *label3
= new QLabel(this);

int id
= 123;

QString name
= "yafei";

label3->setText(tr("ID is %1,Name is %2").arg(id).arg(name));

label3->resize(150,12);

label3->move(100,120);

这里向界面上添加了三个标签,因为这三个标签中的内容都是用户可见的,所以需要调用tr()函数。在label2中调用tr()函数时,还使用了第二个参数,其实tr()函数一共有三个参数,它的原型如下:

QString QObject::tr( const char * sourceText, const char * disambiguation = 0, int n = -1 )[static]

       第一个参数sourceText就是要显示的字符串,tr()函数会返回sourceText的译文;第二个参数disambiguation是消除歧义字符串,比如这里的password,如果一个程序中需要输入多个不同的密码,那么在没有上下文的情况下,就很难确定这个password到底指哪个密码。这个参数一般使用类名或者部件名,比如这里使用了mainwindow,就说明这个password是在mainwindow上的;第三个参数n表明是否使用了复数,因为英文单词中复数一般要在单词末尾加“s”,比如“1
message”,复数时为“2 messages”。遇到这种情况,就可以使用这个参数,它可以根据数值来判断是否需要添加“s”。

4.运行程序效果如下图所示。

二、更改项目文件

我们要在项目文件中指定生成的.ts文件,每一种翻译语言对应一个.ts文件。打开myI18N.pro文件,在最后面添加如下一行代码:

TRANSLATIONS = myI18N_zh_CN.ts

       这表明后面生成的.ts文件的文件名为“myI18N_zh_CN.ts”,对于.ts的名称可以随意编写,不过一般是以区域代码来结尾,这样可以更好的区分,例如这里使用了“zh_CN”来表示简体中文。最后需要先按下Ctrl+S保存该文件。

三、使用lupdate生成.ts文件

       可以通过工具->外部->Qt语言家->更新翻译lupdate菜单项来完成该操作。这时会在概要信息处显示如下信息:

启动外部工具'C:/Qt/4.8.5/bin/lupdate.exe'E:/myI18N/myI18N.pro

C:/Qt/4.8.5/mkspecs/features/device_config.prf(13):Querying unknown property CROSS_COMPILE

Updating 'myI18N_zh_CN.ts'...

Found 8 source text(s) (8 new and 0 already existing)

'C:/Qt/4.8.5/bin/lupdate.exe'完成

完成后可以在源码目录看到生成的myI18N_zh_CN.ts文件。

四、使用Qt Linguist完成翻译

这一步一般是翻译人员来做的,就是在Qt Linguist中打开.ts文件,然后对字符串逐个进行翻译。我们在系统的开始菜单中启动Linguist(也可以直接在命令行输入“linguist”启动它;或者在Qt安装目录的tools目录下找到并启动它),然后点击界面左上角的“打开”图标,在弹出的文件对话框中进入项目目录,打开“myI18N_zh_CN”文件,这时整个界面如下图所示。

下面来翻译程序。在翻译区域可以看到现在已经是要翻译成汉语,这是因为我们的.ts文件名中包含了中文的区域代码。如果这里没有正确显示要翻译成的语言,那么可以使用“编辑”→“翻译文件设置”菜单来更改。下面首先对“MainWindow”进行翻译,这里翻译为“应用程序主窗口”,然后按下Ctrl+Return(即回车键)完成翻译并开始翻译第二个字符串。按照这种方法完成所有字符串的翻译工作,如下表所示。

  

原文本

  

翻译文本

MainWindow

应用程序主窗口

PushButton

按钮

&File

文件(&F)

&New

新建(&N)

Ctrl+N

Ctrl+N

hello Qt!

你好 Qt!

password

密码

ID is %1,Name is  %2

账号是%1,名字是%2

       翻译完成后按下Ctrl+S保存更改,然后退出Qt Linguist。

五、使用lrelease生成.qm文件

可以通过工具->外部->Qt语言家->发布翻译lrelease菜单项来完成该操作。这时会在概要信息处显示如下信息:

启动外部工具'C:/Qt/4.8.5/bin/lrelease.exe'E:/myI18N/myI18N.pro

Updating 'E:/myI18N/myI18N_zh_CN.qm'...

Generated 8 translation(s) (8 finished and 0unfinished)

C:/Qt/4.8.5/mkspecs/features/device_config.prf(13):Querying unknown property CROSS_COMPILE

'C:/Qt/4.8.5/bin/lrelease.exe'完成

       这时在源码目录会看到myI18N_zh_CN.qm文件。

六、使用.qm文件

下面在项目中添加代码使用.qm文件来更改界面的语言。进入main.cpp文件,添加头文件#include <QTranslator>,然后在QApplication a(argc, argv);代码下添加如下代码:

QTranslator translator;

translator.load("../myI18N/myI18N_zh_CN.qm");

a.installTranslator(&translator);

       这里先加载了.qm文件(使用了相对路径),然后为QApplication对象安装了翻译。运行程序,效果下图所示。

结语


这一节简单介绍了一个使用Qt语言家实现国际化的例子,可以看到翻译一个程序其实是很简单的。Qt中还可以设置自动判断语言环境、动态进行语言更改等功能,详细内容可以参考帮助文档Internationalizationwith
Qt或者参考《Qt
Creator快速入门》
第9章的相关内容。



涉及到的源码:  myI18N.rar (2.75
KB, 下载次数: 1) 
时间: 2024-09-06 12:29:39

[Qt教程] 第46篇 进阶(六) 国际化的相关文章

[Qt教程] 第43篇 进阶(三)对象树与拥有权

[Qt教程] 第43篇 进阶(三)对象树与拥有权 楼主  发表于 2013-9-12 16:39:33 | 查看: 255| 回复: 1 对象树与拥有权 版权声明 该文章原创于Qter开源社区 导语 学习完前面的内容,大家对应用Qt编程应该已经有了一个大概的印象.后面的内容我们将介绍Qt中的一些核心机制,它们是构成Qt的基础,包括对象模型.信号和槽.对象树与拥有权等.在前面使用Qt编程时,大家对一些内容可能存在疑惑,学习完下面的知识,可以帮助大家更好的使用Qt进行编程. 环境:Windows X

[Qt教程] 第47篇 进阶(七) 定制Qt帮助系统

[Qt教程] 第47篇 进阶(七) 定制Qt帮助系统 楼主  发表于 2013-10-7 09:32:39 | 查看: 93| 回复: 0 定制Qt帮助系统 版权声明 该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处! 导语        一个完善的应用程序应该提供尽可能丰富的帮助信息.在Qt中可以使用工具提示.状态提示以及"What's This"等简单的帮助提示,也可以使用QtAssistant来提供强大的在线帮助.如果要进行详细的

[Qt教程] 第48篇 进阶(八) 3D绘图简介

[Qt教程] 第48篇 进阶(八) 3D绘图简介 楼主  发表于 2013-10-7 09:44:37 | 查看: 184| 回复: 0 3D绘图简介 版权声明 该文章原创于作者yafeilinux,转载请注明出处! 导语 OpenGL是一个跨平台的用来渲染3D图形的标准API.在Qt中提供了QtOpenGL模块,从而很轻松地实现了在Qt应用程序中使用OpenGL,这主要是在QGLWidget类中完成的.因为3D绘图涉及到了专业方面的内容,我们下面只是讲解最简单的使用,向大家演示在Qt中如何显示

[Qt教程] 第44篇 进阶(四)信号和槽

[Qt教程] 第44篇 进阶(四)信号和槽 楼主  发表于 2013-9-12 16:48:59 | 查看: 298| 回复: 0 信号和槽 版权声明 该文章原创于Qter开源社区 导语 在前面的内容中已经多次用到过信号和槽了,这一节我们将详细讲解信号和槽的机制和使用方式.大家可以在帮助中查看Signals& Slots关键字. 环境:Windows Xp + Qt 4.8.5+QtCreator2.8.0 目录 一.信号和槽机制 二.信号和槽的自动关联 三.信号和槽的高级应用 正文 一.信号和

[Qt教程] 第45篇 进阶(五)Qt样式表

[Qt教程] 第45篇 进阶(五)Qt样式表 楼主  发表于 2013-9-13 15:43:55 | 查看: 329| 回复: 1 Qt样式表 版权声明 该文章原创于Qter开源社区 导语 一个完善的应用程序不仅应该有实用的功能,还要有一个漂亮的外观,这样才能使应用程序更加友善,更加吸引用户.作为一个跨平台的UI开发框架,Qt提供了强大而灵活的界面外观设计机制. Qt样式表是一个可以自定义部件外观的十分强大的机制.Qt样式表的概念.术语和语法都受到了HTML的层叠样式表(Cascading S

[Qt教程] 第49篇 进阶(九) 多媒体应用简介

[Qt教程] 第49篇 进阶(九) 多媒体应用简介 楼主  发表于 2013-10-7 09:50:36 | 查看: 267| 回复: 2 多媒体应用简介 版权声明 该文章原创于作者yafeilinux,转载请注明出处! 导语      Qt对于音频视频的播放和控制等多媒体应用提供了强大的支持.要想使计算机发出响声,最简单的方法是调用QApplication::beep()静态函数:而对于简单的声音播放,可以使用 QSound类:对于简单的动画播放,可以使用QMovie类:要想对音频视频实现更多

[Qt教程] 第26篇 数据库(六)SQL关系表格模型QSqlRelationalTableModel

[Qt教程] 第26篇 数据库(六)SQL关系表格模型QSqlRelationalTableModel 楼主  发表于 2013-5-21 20:54:13 | 查看: 677| 回复: 6 SQL关系表格模型QSqlRelationalTableModel 版权声明 该文章原创于作者yafeilinux,转载请注明出处! 导语        QSqlRelationalTableModel继承自QSqlTableModel,并且对其进行了扩展,提供了对外键的支持.一个外键就是一个表中的一个属性

[Qt教程] 第36篇 网络(六)UDP

[Qt教程] 第36篇 网络(六)UDP 楼主  发表于 2013-9-5 11:38:50 | 查看: 241| 回复: 0 UDP 版权声明 该文章原创作者yafeilinux,转载请注明出处! 导语 这一节讲述UDP编程的知识.UDP(UserDatagram Protocol即用户数据报协议)是一个轻量级的,不可靠的,面向数据报的无连接协议.对于UDP我们不再进行过多介绍,如果你对UDP不是很了解,而且不知道它有什么用,那么这里就举个简单的例子:我们现在几乎每个人都使用的腾讯QQ,其聊天

[Qt教程] 第16篇 2D绘图(六)坐标系统

[Qt教程] 第16篇 2D绘图(六)坐标系统 楼主  发表于 2013-5-2 20:08:12 | 查看: 738| 回复: 0 坐标系统 版权声明 该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处! 导语 前面一节我们讲解了图片的显示,其中很多地方都用到了坐标的变化.这一节我们将讲解Qt的坐标系统,分为两部分来讲解:第一部分主要讲解前面一节的那几个函数,它们分别是translate()平移变换.scale()比例变换.rotate()旋转变