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. 高精度定时器实现 z

    1背景Permalink .NET Framework 提供了四种定时器,然而其精度都不高(一般情况下 15ms 左右),难以满足一些场景下的需求. 在进行媒体播放.绘制动画.性能分析以及和硬件交互时 ...

  2. python全栈学习笔记(一)网络基础之网络协议篇

    阅读目录 一.操作系统基础 二.网络通信原理 2.1 互联网的本质就是一系列的网络协议 2.2 osi七层协议 2.3 tcp/ip五层模型讲解 2.3.1 物理层 2.3.2 数据链路层 2.3.3 ...

  3. NODE-环境变量的配置(踩坑总结)

    初学Node.js,从官网下载了node.js的Windows Installer,安装完成后,通过控制台输入node命令,发现提示说“node"不是内部或外部命令,这通常是由于没有设置环境 ...

  4. 使用log4j让日志写入数据库

    之前做的一个项目有这么个要求,在日志管理系统里,需要将某些日志信息存储到数据库里,供用户.管理员查看分析.因此我就花了点时间搞了一下这一功能,各位请看. 摘要:我们知道log4j能提供强大的可配置的记 ...

  5. Kill占用指定端口的进程的方法

    (1)查询占用指定端口进程的PID 打开cmd命令行,输入netstat -ano|findstr 8080(指定端口号) 最后一列即为占用该端口的进程的PID (2)KILL指定PID的进程 紧接着 ...

  6. Spring Framework5.0 学习(3)—— spring配置文件的三种形式

    Spring Framework  是 IOC (Inversion of Control  控制反转)原则的实践. IoC is also known as dependency injection ...

  7. BZOJ2194:快速傅立叶之二(FFT)

    Description 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5. a,b中的元素均为小于等于100的非 ...

  8. caffe 学习(3)——Layer Catalogue

    layer是建模和计算的基本单元. caffe的目录包含各种state-of-the-art model的layers. 为了创建一个caffe model,我们需要定义模型架构在一个protocol ...

  9. byte转换字符串(string)+字符串转换byte

    C# 中字符串string和字节数组byte[]的转换 //string转byte[]: byte[] byteArray = System.Text.Encoding.Default.GetByte ...

  10. 阿里云云服务器Windows Server 2012 R2无法安装IIS等组件的解决办法

    Windows Server2012 R2数据中心版 不管安装什么组件,都显示存储空间不足,无法应用命令,错误代码0x80070008. 最终确认是服务器配置过低的原因,因为这个型号是低级别的配置,1 ...