找回密码
 立即注册
收起左侧

第46篇 进阶(六) 国际化

11
回复
16115
查看
[复制链接]
累计签到:883 天
连续签到:2 天
来源: 2013-10-7 09:23:45 显示全部楼层 |阅读模式
国际化


版权声明

该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处!




导语


第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章的相关内容。




涉及到的源码:




上一篇:   

下一篇:   

返回:系列教程目录    





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2013-12-9 19:02:37 显示全部楼层
顶一个,这个里面的内容,后期项目可能会用到
回复 支持 反对

使用道具 举报

累计签到:1 天
连续签到:1 天
2014-3-6 16:44:08 显示全部楼层
学习了,好教程,楼主幸苦啦!
回复 支持 反对

使用道具 举报

累计签到:1 天
连续签到:1 天
2014-8-13 23:25:00 显示全部楼层
8错8错8错8错8错8错8错8错8错8错8错8错
回复 支持 反对

使用道具 举报

累计签到:18 天
连续签到:1 天
2016-7-16 10:27:43 显示全部楼层
为什么我的还是英文呢。没有变成中文呢
回复 支持 反对

使用道具 举报

累计签到:884 天
连续签到:2 天
2016-7-22 10:57:19 显示全部楼层
dong 发表于 2016-7-16 10:27
为什么我的还是英文呢。没有变成中文呢

是不是相对路径配置的有问题,从包含源文件的那个文件夹写起即可!
回复 支持 反对

使用道具 举报

累计签到:5 天
连续签到:1 天
2016-8-4 10:40:16 显示全部楼层
centos 6.3  
安装qt 5.6   linguist中 open 一个文件的时候
界面退出 控制台显示错误
GVFS-RemoteVolumeMonitor-WARNING **: cannot connect to the session bus
回复 支持 反对

使用道具 举报

累计签到:580 天
连续签到:3 天
2016-9-13 08:46:21 显示全部楼层
本帖最后由 hebbely 于 2016-9-13 08:49 编辑

楼主辛苦了

这种机制,假如加入一个下拉框,选择语言,运行程序后,可以动态切换语言的吗?
回复 支持 反对

使用道具 举报

累计签到:596 天
连续签到:1 天
2016-10-20 15:27:59 显示全部楼层
本帖最后由 shasidaran 于 2016-10-20 15:29 编辑

开发环境,Qt5.7-MSVC,IDE仍是Qt Creator

使用lupdate工具,只能提取UI中的字符,代码中的提取不了是什么原因,
  1. "D:\Qt5.7.0\5.7\msvc2013_64\bin\lupdate.exe" finished
  2. Starting external tool "D:\Qt5.7.0\5.7\msvc2013_64\bin\lupdate.exe" F:/Cpp_Workspace/myTS/myTS/myTS.pro
  3. Updating 'myI18N_zh_CN.ts'...
  4.     Found 5 source text(s) (0 new and 5 already existing)
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

点评

问题已解决,全是单位文件的加密软件惹得祸!导致lupdate识别不到源代码中的tr() 浪费半下午时间!!  详情 回复 发表于 2016-10-20 17:52
回复 支持 反对

使用道具 举报

累计签到:596 天
连续签到:1 天
2016-10-20 17:52:15 显示全部楼层
shasidaran 发表于 2016-10-20 15:27
开发环境,Qt5.7-MSVC,IDE仍是Qt Creator

使用lupdate工具,只能提取UI中的字符,代码中的提取不了是什么 ...

问题已解决,全是单位文件的加密软件惹得祸!导致lupdate识别不到源代码中的tr()
浪费半下午时间!!
回复 支持 反对

使用道具 举报

尚未签到

2017-8-21 11:56:00 显示全部楼层
为什么我的 也是英文 路径是对的啊
回复 支持 反对

使用道具 举报

累计签到:16 天
连续签到:1 天
2019-6-12 11:54:52 显示全部楼层
学习一下,正好用的到!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册