第46篇 进阶(六) 国际化

news2024/11/23 3:59:30

导语

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/87330.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

四、函数基础、函数种类、形实参和映射关系

四、函数基础、函数种类、形实参和映射关系 编程基本原则&#xff1a;高内聚、低耦合。 我总结&#xff1a; 模块自身&#xff0c;要求高内聚&#xff1a;模块中代码相关性变强&#xff0c;代码紧密联系程度变高&#xff0c;希望它能独立完成一个功能。模块之间&#xff0c;…

【20221213】【每日一题】零钱兑换II

给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带符号整数。 …

新课程导学杂志新课程导学杂志社新课程导学编辑部2022年第30期目录

前沿《新课程导学》投稿&#xff1a;cn7kantougao163.com 贵州四条线路入选“稻花香里说丰年”全国乡村旅游精品线路 邓小青; 1 基地 梯云村落&#xff0c;晒秋人家——用绚烂色调谱写秋意之诗 邓小青; 2-9 分享 走进“那”文化回归稻香梦聆听丰收声——2022年顶蛳…

Redis 7 新特性之 自定义Functions

Redis 7 新特性之 自定义Functions Redis Functions&#xff08;函数&#xff09;是用于管理服务端执行代码的API。在Redis 7中出现&#xff0c;旨在取代之前版本的EVAL函数&#xff0c;是Redis 7新特性之一。 Eval 脚本的缺点 Redis 7之前的版本通过Eval执行脚本&#xff0…

流媒体协议介绍(RTP/RTCP/RTSP/RTMP/MMS/HLS/HTTP/ HTTP-FLV(HDL) /SDP)

流媒体协议介绍&#xff08;RTP/RTCP/RTSP/RTMP/MMS/HLS/HTTP/ HTTP-FLV(HDL) /SDP&#xff09; 一、RTP&#xff1a;实时传输协议&#xff08;Real-time Transport Protocol&#xff09; RTP是一种基于包的传输协议&#xff0c;它用来传输实时数据。在网络上传输数据包的延迟…

艾美捷CD8α体内抗体参数说明化学性质

CD8a&#xff08;Ly 2.2&#xff09;存在于大多数胸腺细胞和包括大多数T抑制/细胞毒性细胞的成熟T淋巴细胞亚群的表面。CD8通过与T细胞受体复合物和蛋白酪氨酸激酶lck的结合参与T细胞活化。 艾美捷CD8α体内抗体基本参数&#xff1a; 中文名称&#xff1a;抗小鼠CD8a体内抗体-…

Kafka极客 - 15 重设消费者位移 Offset

文章目录1. 为什么要重设消费者组位移&#xff1f;2. 重设位移策略3. 消费者 API 方式设置4. 命令行方式设置1. 为什么要重设消费者组位移&#xff1f; 我们知道&#xff0c;Kafka 和传统的消息引擎在设计上是有很大区别的&#xff0c;其中一个比较显著的区别就是&#xff0c;…

怎么看xray发了那些数据包

怎么看xray发了那些数据包。版本说明&#xff1a;Xray 下载地址&#xff1a;https://github.com/chaitin/xray/releases 使用环境&#xff1a;windows、linux、macos皆可 工具说明&#xff1a;Xray扫描器是一款功能强大的安全评估工具。支持主动、被动多种扫描方式&#xff…

UNIAPP实战项目笔记51 登录用户名和密码输入框的数据验证功能

UNIAPP实战项目笔记51 登录账号用户名和密码输入框的数据验证功能 实际案例图片 账号验证 密码验证 登录成功跳转 显示登录和注册页面布局 账号密码的验证功能和登录验证提交 具体内容图片自己替换哈&#xff0c;随便找了个图片的做示例 具体位置见目录结构 完善布局页面和样式…

基于PHP和MySQL的新闻发布系统

关于世界杯⚽️ 国际足联世界杯&#xff08;FIFA World Cup&#xff09;&#xff0c;简称“世界杯”&#xff0c;是由全世界国家级别球队参与&#xff0c;象征足球界最高荣誉&#xff0c;并具有最大知名度和影响力的足球赛事。世界杯全球电视转播观众超过35亿 。世界杯每四年举…

【设计模式】简单工厂模式描述总结

简单工厂模式 定义&#xff1a;定义一个创建对象的接口&#xff0c;让子类决定实例化哪一个类。 类型&#xff1a;创建型模式 介绍&#xff1a; 在简单工厂模式中定义一个抽象产品类&#xff0c;抽象产品类声明公共的特性及属性&#xff0c;具体产品类继承抽象产品类后去实…

Educational Codeforces Round 121 (Rated for Div. 2) C. Monsters And Spells

翻译&#xff1a; Monocarp又在玩电脑游戏了。他是个巫师学徒&#xff0c;只会一个咒语。幸运的是&#xff0c;这个法术可以伤害怪物。 他目前所在的关卡包含&#x1d45b;个怪物。他们中的&#x1d456;-th在关卡开始后&#x1d458;&#x1d456;秒出现&#xff0c;并拥有ℎ…

Java石头剪刀布

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;JAVA开发者…

【iMessage苹果源码家庭推】tils扩大软件安装大概释放事变是由程序员筑造的,很轻易发生MemoryLeak控制

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

[附源码]计算机毕业设计的小区宠物管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

小侃设计模式(十七)-中介者模式

1.概述 中介者模式&#xff08;Mediator Pattern&#xff09;是用来降低多个对象和类之间的通信复杂性&#xff0c;这种模式提供了一个中介类&#xff0c;来封装一组对象之间的交互&#xff0c;它将对象之间的交互委派给中介对象交互&#xff0c;避免了对象之间的直接交互。中…

Vue2基础总结

知识点学了太多还是需要总结复习&#xff0c;否则后面会因为零碎的知识点而感到繁杂&#xff0c;那么今天我来总结一下vue相关的知识点&#xff0c;新学习vue的朋友也可以把这当做一个细致总结&#xff1a; 1.Vue是什么&#xff08;重点&#xff09;&#xff1a; 对于Vue的总…

创建 Vue3.0 工程

1.使用 vue-cli 创建 官方文档 : https://cli.vuejs.org/zh/guide/creating-a-project.html#vue-create // 查看vue/cli版本&#xff0c;确保vue/cli版本在4.5.以上 vue --version vue -V// 安装或者升级你的vue/cli、 覆盖安装最新版本; npm install -g vue/cli//1.创建…

C++初阶 stack和queue的模拟实现

作者&#xff1a;小萌新 专栏&#xff1a;C初阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;模拟实现STL库中的stack和queue 考试周结束咯 狠狠的学&#xff01; stack和queue的模拟实现容器适配器Stack模拟实现接口函数一览代码…

艾美捷西妥昔单抗Cetuximab化学性质和文献参考

西妥昔单抗&#xff08;抗EGFR&#xff09;是表皮生长因子受体&#xff08;EGFR&#xff09;的抑制剂。 艾美捷西妥昔单抗Cetuximab 品名&#xff1a;西妥昔单抗&#xff0c;抑制剂 完整名称&#xff1a;西妥昔单抗&#xff08;抗EGFR&#xff09; 同义词名称&#xff1a;C2…