第46篇 进阶(六) 国际化

导语

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

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

  • 所有东亚语言(汉语、日语和朝鲜语)
  • 所有西方语言(使用拉丁字母)
  • 阿拉伯语
  • 西里尔语言(俄语和乌克兰语等)
  • 希腊语
  • 希伯来语
  • 泰语和老挝语
  • 所有在Unicode5.1中不需要特殊处理的脚本

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

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

  • 运行lupdate工具从C++源代码中提取要翻译的文本,这时会生成一个.ts文件,这个文件是XML格式的;
  • 在Qt Linguist中打开.ts文件,并完成翻译工作;
  • 运行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章的相关内容。

涉及到的源码

results matching ""

    No results matching ""