在Qt的项目开发过程中,有时软件要翻译成多语言版本,这就涉及到国际化方面的操作。虽然Qt对这方面集成了很多工具,操作起来比较方便,本文还是总结一下国际化的方法和步骤,用以备忘和参考。

我们通常在写程序时,为了正常显示中文,一般会直接用到类QTextCodectr()函数,其实这只是一种临时的做法,方便我们快速完成程序、显示效果。当要真正发布一个程序时,最好的方式是在程序中使用英文字符串,再使用国际化工具进行翻译

1.软件国际化的方法

在Qt中,所有的输入部件和文本绘制方式对对所有支持的语言都提供了内置支持,Qt内置的字体引擎可以在同一时间正确而精细地绘制不同的文本。在Qt项目开发过程中,我们可以使用Qt Linguist工具来完成应用程序的翻译工作。

在Qt中编写代码时,要对需要显示的字符串调用tr()函数,完成代码编辑后,对这个应用程序的翻译主要分三个步骤:

CMD: 此处代指 Qt Creator [工具] -> [外部] -> [Qt 语言家]

  • CMD中运行lupdate工具,从源代码中提取要翻译的文本,这里会生成一个.ts文件,此文件格式是xml格式;
  • Qt Linguist中打开.ts文件,并完成翻译工作;
  • CMD中运动lrelease工具,从.ts文件中生成一个.qm文件,它是一个二进制文件,用于程序运行时使用。

其中,.ts文件和.qm文件都是平台无关的 。

2.具体实例实现步骤

  • 新建Qt Gui应用,项目名称为myI18N,类名为MainWindow,基类保持QMainWindow不变。
  • 建立完项目后,点击mainwindow.ui文件进入设计模式,先添加一个&File菜单,再为其添加一个&New子菜单并设置快捷键为Ctrl+N,然后往界面上拖入一个Push Button
  • 下面我们再使用代码添加几个标签,打开mainwindow.cpp文件,添加头文件#include <QLabel>,然后在构造函数中添加代码:
  1. label = new QLabel(this);
  2. label->setText(tr("helllo QT"));
  3. label->move(100,50);
  4. label2 = new QLabel(this);
  5. label2->setText(tr("password","mainwindow"));
  6. label2->move(100,80);
  7. label3 = new QLabel(this);
  8. int id = 123;
  9. QString name = "wusanlang";
  10. label3->setText(tr("ID is %1, Name is %2").arg(id).arg(name));
  11. label3->resize(180,20);
  12. label3->move(100,120);

这里值得注意的是tr()函数是不止一个参数的,其原型为:

  1. QString QObject::tr(const char *sourceText, const char *disambiguation = Q_NULLPTR, int n = -1)

第一个参数sourceText就是要显示的字符串,tr()函数会返回sourceText的译文;

第二个参数disambiguation是消除歧义字符串,比如这里的password,如果一个程序中需要输入多个不同的密码,那么在没有上下文的情况下,就很难确定这个password到底指哪个密码。这个参数一般使用类名或者部件名,比如这里使用了mainwindow,就说明这个password是在mainwindow上的;

第三个参数n表明是否使用了复数,因为英文单词中复数一般要在单词末尾加“s”,比如“1 message”,复数时为“2 messages”。遇到这种情况,就可以使用这个参数,它可以根据数值来判断是否需要添加“s”。

  • 程序运行结果如下图所示。

源程序编写完成后,我们在.pro文件中指定生成.ts文件的名字,即在文件中添加语句:

  1. TRANSLATIONS = myI18N_zh_CN.ts //文件名可以随意,但要注意区分
  • CMD中执行lupdate.exe程序,生成.ts文件。
  • 这时使用Qt Linguist 打开.ts文件进行翻译 ,翻译完成后保存。
  • 翻译完成后,使用lrelease.exe程序,生成.qm文件。
  • 在项目程序中,添加.qm文件来改变程序的语言。

在使用qm文件时,要用到QTranslator类,其使用方法为:

  1. int main(int argc, char *argv[])
  2. {
  3. QApplication a(argc, argv); //全局对象指针是宏qApp
  4. QTranslator translator;
  5. translator.load("../myI18N_zh_CN.qm");
  6. a.installTranslator(&translator);
  7. MainWindow w;
  8. w.show();
  9. return a.exec();
  10. }

本测试项目中,我自己制作了,通过点击按钮来实现中英文的切换,其按钮槽函数为实现如下:

  1. void MainWindow::on_pushButton_clicked()
  2. {
  3. QTranslator translator;
  4. if(m_bTranslator) //翻译成中文
  5. {
  6. translator.load("../myI18N_zh_CN.qm");
  7. qApp->installTranslator(&translator);
  8. ui->retranslateUi(this);
  9. //自己添加非ui控件的动态翻译
  10. label->setText(QApplication::translate("MainWindow", "helllo QT", Q_NULLPTR));
  11. label2->setText(QApplication::translate("MainWindow", "password", Q_NULLPTR));
  12. label3->setText(QApplication::translate("MainWindow", "ID is %1, Name is %2", Q_NULLPTR));
  13. }
  14. else
  15. {
  16. qApp->removeTranslator(&translator);
  17. ui->retranslateUi(this);
  18. //自己添加的非ui控件的动态翻译
  19. label->setText(QApplication::translate("MainWindow", "hello QT", Q_NULLPTR));
  20. label2->setText(QApplication::translate("MainWindow", "password", Q_NULLPTR));
  21. label3->setText(QApplication::translate("MainWindow", "ID is %1, Name is %2", Q_NULLPTR));
  22. }
  23. m_bTranslator = !m_bTranslator;
  24. }

Qt国际化翻译并不难,本文主要总结归纳一下,以便备忘和后期参考。

【QT Tools】软件多语言国际化翻译的方法与步骤的更多相关文章

  1. jquery/vue/react前端多语言国际化翻译方案指南

    ❝ 本文章共3470字,预计阅读时间5-10分钟. ❞ 国际化-前言 每个开发者能希望编写的程序可以让全世界的用户使用,它要求从产品中抽离所有地域语言,国家/地区和文化相关的元素.换种说法,「应用程序 ...

  2. 使用 PySide2 开发 Maya 插件系列三:qt语言国际化(internationalization)

    使用 PySide2 开发 Maya 插件系列三:qt语言国际化(internationalization) 前言: 这是 qt for python 的语言国际化,基于 UI 的,python 也有 ...

  3. (三)Qt语言国际化

    Vs 2010+ Qt5 实现语言国际化 创建一个工程,cpp代码如下: 1.创建工程 #include "languageinternationalized.h" #includ ...

  4. Qt 国际化翻译

    简介 Qt Linguist 提供了一套加速应用程序翻译和国际化的工具.Qt 使用单一的源码树和单一的应用程序二进制包就可同时支持多个语言和书写系统. 使用 QTranslator 来加载生成的 qm ...

  5. Zend_Frameowrk中进行多语言国际化的相关的配置和使用

    在使用Zend_Framework建立网站,若网站在以后的使用中面向国际,这时就需要实现网站的多语言国际化问题.使用Zend_Framework开发的网站需要进行多语言的开发时,就需要用到了Zend_ ...

  6. Qt学习之路(34): 国际化(下)

      原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://devbean.blog.51cto.com/448512/245063 上次 ...

  7. Ios国际化翻译工具

    IOS Translation Tool(IOS国际化翻译工具) 介绍 当IOS项目国际化的时候,手工去翻译每一个字符串是一件非常痛苦的事情.尤其是当项目中存在N多种语言.而且又很难保证,手工翻译的准 ...

  8. win10+anaconda环境下pyqt5+qt tools+eric6.18安装及汉化过程

    最近需要用python编写一个小程序的界面,选择了pyqt5+eric6的配套组合,安装过程中遇到一些坑,特此记录.参考书籍是电子工业出版社的<PyQt5快速开发与实战>. 因为我使用an ...

  9. 给iview项目加一个i18n国际化翻译

    看了上一篇博客吗?我们就根据那一篇博客来,用里面的项目,进行我们接下来国际化翻译项目. 我们安装vue-i18n和js-cookie npm install vue-i18n npm install ...

  10. 用Qt写软件系列三:一个简单的系统工具(上)

    导言 继上篇<用Qt写软件系列二:QIECookieViewer>之后,有一段时间没有更新博客了.这次要写的是一个简单的系统工具,需求来自一个内部项目.功能其实很简单,就是查看当前当前系统 ...

随机推荐

  1. C++ MiniZip实现目录压缩与解压

    Zlib是一个开源的数据压缩库,提供了一种通用的数据压缩和解压缩算法.它最初由Jean-Loup Gailly和Mark Adler开发,旨在成为一个高效.轻量级的压缩库,其被广泛应用于许多领域,包括 ...

  2. SQL 语言标准简介

    版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 一.简介 结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是 ...

  3. 【Android】实现连接SQLite并尝试进行增删改查

  4. Gradle构建微服务项目

    先说一下初衷把:为啥突然要用Gradle,公司后期自研项目都使用Gradle构建...... 1.下载安装 这个就不说了,网上大家搜索一下,配置一下环境变量即可 2.Groovy的一些语法Gradle ...

  5. 【scikit-learn基础】--『预处理』之 分类编码

    数据的预处理是数据分析,或者机器学习训练前的重要步骤.通过数据预处理,可以 提高数据质量,处理数据的缺失值.异常值和重复值等问题,增加数据的准确性和可靠性 整合不同数据,数据的来源和结构可能多种多样, ...

  6. MinIO客户端之rm

    MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc rm 删除指定的对象. 准备待删除的对象,查看对象,命令如下: ./mc ls local1/bkt2/ 控 ...

  7. Pikachu漏洞靶场 XSS(跨站脚本攻击)

    XSS 关于xss的我也是一知半解,所以只放出payload来. 反射型xss(get) 修改maxlength属性之后提交如下内容: <script>alert(/xss/);</ ...

  8. 【K8S系列】如何高效查看 k8s日志

    序言 你只管努力,其他交给时间,时间会证明一切. 文章标记颜色说明: 黄色:重要标题 红色:用来标记结论 绿色:用来标记一级论点 蓝色:用来标记二级论点 Kubernetes (k8s) 是一个容器编 ...

  9. 一行代码解决Three.js中只能在一侧看到物体的问题

    项目场景:   因为该项目比较复杂庞大,在此就简单介绍一下:   通过Three.js创建若干个物体进行了组装,从而形成了一个类似眼球模拟模型的项目,用户可以通过拖动鼠标来达到控制视角(摄像机)的目的 ...

  10. Luogu1419 区间问题 二分 单调优化

    原题链接 题意 给定一段长度为1e5的序列A,并且给我们一个范围 \([S, T]\), 要求我们求出一段长度在这个范围内的连续子序列,并且要使这个连续子序列的平均值最大,输出这个平均值. 思路 一开 ...