Qt 本地化(翻译)

翻译流程大致是这样的:首先源代码产生 ts 文件,然后送给 Qt Linguist(Qt 语言家)这个 Qt 自带的小工具进行处理产生 qm 翻译文件,最后源代码里加载这个 qm 翻译文件。

凡是你要进行翻译的文本都要用 tr() 函数来包裹。这个 tr() 是 QObject 类的一个函数,用它包裹的文本会被 Qt Linguist(Qt 语言家)捕捉到从而进行翻译工作。或者你也可以这样理解,用 tr() 包裹的文本会添加到 ts 文件中。关于 ts 文件在下文会说到。例如我们的示例工程就是这样写的:

QMessageBox msgBox;
msgBox.setWindowTitle(tr("HelloWorld"));

QML 的翻译是用 qsTr() 来代替 tr() 函数。Design(设计师)中的的文本默认是可翻译的,不用担心是否会被捕捉到。

生成 ts 文件

在. pro 文件中添加如下代码:

TRANSLATIONS = \
language.zh_CN.ts

注意 ts 文件名,标明区域语言对运行时加载何种语言会很有用。如果要生成多个 ts 文件,只需要在行末加 , 在下一行添加 ts 文件名即可。Qt Linguist 会根据 ts 文件名自动设置区域。ts 文件的命名方式下文再介绍。

在 Qt Creator 的菜单栏中依次点击 Tools->External->Linguist->Update Translations(lupdate),就会在源代码文件所在的目录生成 ts 文件。

翻译并生成 qm 文件

在工具栏中找到 Linguist,打开 ts 文件并逐条翻译后保存,ts 文件制作完毕,接下来就是 qm 文件的生成。

qm 文件生成可以直接在 Qt Linguist 里点击 File->Release,或者在 Qt Creator 中点击 Tools->External->Linguist->Release Translations(lrelease) 都可以。

至此,qm 文件生成完毕。

源代码中加载翻译文件

加载翻译文件的代码很简单,需要注意的是要在创建窗口前加载翻译文件。

#include "MainWindow.h"
#include <QApplication>
#include <QTranslator> int main(int argc, char *argv[])
{
QApplication a(argc, argv); QTranslator qtTranslator;
QString dir = a.applicationDirPath() + "/" + "translations"; if (qtTranslator.load(QLocale(), "language", ".", dir, ".qm"))
{
a.installTranslator(&qtTranslator);
} MainWindow w;
w.show(); return a.exec();
}

基本流程就是新建 QTranslator 对象,通过 load 函数加载 qm 文件,然后将 QTranslator 对象添加到 QApplication 对象中。这里我把翻译文件放在子目录 translations 中,如果检测到系统是大陆地区的简体中文的话则加载翻译文件,否则不加载。其中的重点就是 load 函数,让我们来看看 load 函数的用法。

bool QTranslator::load(const QLocale &locale, const QString &filename, const QString &prefix = QString(), const QString &directory = QString(),const QString &suffix = QString())

Loads filename + prefix + ui language name + suffix (".qm" if the suffix is not specified), which may be an absolute file name or relative to directory. Returns true if the translation is successfully loaded; otherwise returns false.

The previous contents of this translator object are discarded.

If the file name does not exist, other file names are tried in the following order:

  1. File name without suffix appended.
  2. File name with ui language part after a "_" character stripped and suffix.
  3. File name with ui language part stripped without suffix appended.
  4. File name with ui language part stripped further, etc.

For example, an application running in the locale with the following ui languages - "es", "fr-CA", "de" might call load(QLocale(), "foo", ".", "/opt/foolib", ".qm"). load() would replace '-' (dash) with '_' (underscore) in the ui language and then try to open the first existing readable file from this list:

  1. /opt/foolib/foo.es.qm
  2. /opt/foolib/foo.es
  3. /opt/foolib/foo.fr_CA.qm
  4. /opt/foolib/foo.fr_CA
  5. /opt/foolib/foo.de.qm
  6. /opt/foolib/foo.de
  7. /opt/foolib/foo.fr.qm
  8. /opt/foolib/foo.fr
  9. /opt/foolib/foo.qm
  10. /opt/foolib/foo.
  11. /opt/foolib/foo

On operating systems where file system is case sensitive, QTranslator also tries to load a lower-cased version of the locale name.

This function was introduced in Qt 4.8.

第一个参数是获取系统的区域环境代码;第二个参数是文件名,不包括所在的目录;第三个参数是语言区域代码的前缀(分隔符);第四个参数是文件所在的目录,注意这里用的是绝对路径,相对路径我没有试过;第五个参数是文件后缀,一般为. qm。

一般的语言区域代码由两部分组成:语言 - 区域。例如上文中的 fr_CA,fr 表示法语,CA 表示加拿大,加起来就是加拿大法语。也就是一种语言会有多个地区的区别。再举个中文的例子:

  • zh-CN 简体中文,中华人民共和国
  • zh-HK 繁体中文,香港特别行政区
  • zh-MO 繁体中文,澳门特别行政区
  • zh-SG 简体中文,新加坡
  • zh-TW 繁体中文,台湾

一个完整的翻译文件名由:文件名 + 分隔符 + 语言区域代码 + 后缀组成。以上文中的引用部分为例,如果有多个翻译文件或者文件名不完整缺失的话:

  • 按照检测到的语言区域顺序优先读取文件。
  • 如果文件名相同,优先加载有后缀的文件。
  • 如果没有符合语言区域代码的文件,则放弃匹配区域,加载符合的语言的文件。
  • 如果连语言都不符合,则加载不包含语言区域代码的文件。

最后一步

以 Release 方式运行代码后,将生成的 exe 文件放到一个新文件夹中,然后打开 Linguist(语言家)下面的命令行工具 Qt5.12.1,切换到 .exe 文件所在路径,运行

windeployqt 文件名. exe

windeployqt 会自动把运行 exe 文件需要的动态链接库(dll)复制过来,同时生成的还有 translations 文件夹,这个文件夹是用来存放翻译文件的。我们把里面的自动生成的翻译文件删掉,然后把 language.zh_CN.qm 复制到里面。这样就大功告成,软件在大陆内以简体中文显示,在其他地方以英文显示(源代码里是英文)。

参考文章

Qt 本地化(翻译)的更多相关文章

  1. qt creator翻译流程

    一,下载qt creator软件包,最好是5.3,       本人是Win7,64位电脑,下载的是qt-opensource-windows-x86-mingw482_opengl-5.3.0.ex ...

  2. QT语言翻译

    QT中多语言的实现方式: 1.代码中tr运用 2.使用工具生成ts文件 3.翻译ts文件 4.生成qm文件 5.程序加载 以下内容程序加载时放入即可. QString appPath = QCoreA ...

  3. Qt 国际化翻译

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

  4. Qt的翻译文件QTranslator不能使用问题总结(原)

    笔者今天在自己工程中使用翻译文件,发现没有起作用,反复查找,发现是用宏定义了命名空间,生成.ts文件时,不会加上命名空间,所以生成的.qm文件在实际使用时,会无法找到对应的语句. 如果将宏定义的命名空 ...

  5. Qt Quick的国际化和本地化

    国际化您的应用程序 以下部分描述了国际化QML源代码的各个方面.如果您对应用程序中的所有用户界面组件都遵循这些指南,则可以针对不同语言和本地文化约定(例如日期和数字的格式化方式)本地化应用程序的各个方 ...

  6. Qt Installer Framework翻译(7-2)

    包文件夹 安装程序包含的组件,要么是内嵌的,要么可以从远程存储库加载.在这两种情况下,都需要为组件使用一种安装程序可以读取的文件格式和结构. 包文件夹结构 将所有组件放在相同的根文件夹中,即包文件夹. ...

  7. 2.7、Android Studio使用翻译编辑器本地化UI

    如果你的应用支持多语言,你需要合理的管理你的翻译的string资源.Android Studio 提供了翻译编辑器来使查看和管理翻译的资源更加容易. 关于翻译编辑器 翻译后的资源在你的项目里保存在不同 ...

  8. Qt Linguist介绍

    简介 Qt提供了一款优秀的支持Qt C++和Qt Quick应用程序的翻译工具.发布者.翻译者和开发者可以使用这款工具来完成他们的任务. 发布者:承担了全面发布应用程序的责任.通常,他们协调开发者和翻 ...

  9. 关于Qt

    什么是Qt Qt是一个针对桌面.嵌入式.移动设备的一个跨平台的应用程序开发框架,支持的平台包括Linux.OS X.Windows.VxWorks.QNX.Android.iOS.BlackBerry ...

随机推荐

  1. DevExpress之ChartControl实现时间轴实例 z

    using System; using System.Data; using System.Windows.Forms; using DevExpress.XtraCharts; namespace ...

  2. jquery之---$.each详细

    jQuery.each()函数用于遍历指定的对象和数组,并以对象的每个属性(或数组的每个成员)作为上下文来遍历执行指定的函数. 语法 静态函数$.each()的语法如下:$.each( object, ...

  3. websphere部署中文乱码问题

    WebSphere上面的java虚拟机存在默认编码方式,默认为ISO-8859-1. 在JAVA虚拟机的定制属性页面上,添加如下内容: 1.修改服务器编码类型: (1)前台修改方法: 服务器-> ...

  4. Hibernate多对多关联关系

    今天遇到一个问题:有一个的类Reckoning,一个类AccountItem.这两个类之间的关系时多对多的关联关系. 一开始是由AccountItem来维护关联关系的,也就是Reckoning.hbm ...

  5. 用eclipse pydev 创建一个新py文件时 文件的coding设置问题

    问题: 当安装好eclipse和pydev后,创建一个project, 创建一个新的py文件,文件头都会自带中文时间.这样在编译的时候会报错. 解决办法之一: 通过设置,可以使新建的文件的文件头自动带 ...

  6. BZOJ5301:[CQOI2018]异或序列(莫队)

    Description 已知一个长度为 n 的整数数列 a[1],a[2],…,a[n] ,给定查询参数 l.r ,问在 [l,r] 区间内,有多少连续子 序列满足异或和等于 k . 也就是说,对于所 ...

  7. Thread-Specific-Storage for C/C++

    引用出处:https://www.cse.wustl.edu/~schmidt/PDF/TSS-pattern.pdf 摘要: 理论上多线程会提高程序性能,但实际上,由于在获取和释放锁的开销,多线程经 ...

  8. iPhone 耳机在PC电脑上使用方法

    把主声道(Master)从正中间调整到最左或者最右就行了

  9. Qgis 里的Python脚本介绍

    QGIS 入门演示之<用 QGIS 画矢量交通路线图> 脚本编程之准备知识<Python 教程> QGIS API QGIS插件库 运行QGIS脚本,对于桌面应用来讲有4种方式 ...

  10. RabbitMQ之五种消息模型

    首先什么是MQ MQ全称是Message Queue,即消息对列!消息队列是典型的:生产者.消费者模型.生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息.因为消息的生产和消费都是异步的,而 ...