Qt 本地化(翻译)
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
trueif the translation is successfully loaded; otherwise returnsfalse.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:
- File name without suffix appended.
- File name with ui language part after a "_" character stripped and suffix.
- File name with ui language part stripped without suffix appended.
- 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:
- /opt/foolib/foo.es.qm
- /opt/foolib/foo.es
- /opt/foolib/foo.fr_CA.qm
- /opt/foolib/foo.fr_CA
- /opt/foolib/foo.de.qm
- /opt/foolib/foo.de
- /opt/foolib/foo.fr.qm
- /opt/foolib/foo.fr
- /opt/foolib/foo.qm
- /opt/foolib/foo.
- /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 本地化(翻译)的更多相关文章
- qt creator翻译流程
一,下载qt creator软件包,最好是5.3, 本人是Win7,64位电脑,下载的是qt-opensource-windows-x86-mingw482_opengl-5.3.0.ex ...
- QT语言翻译
QT中多语言的实现方式: 1.代码中tr运用 2.使用工具生成ts文件 3.翻译ts文件 4.生成qm文件 5.程序加载 以下内容程序加载时放入即可. QString appPath = QCoreA ...
- Qt 国际化翻译
简介 Qt Linguist 提供了一套加速应用程序翻译和国际化的工具.Qt 使用单一的源码树和单一的应用程序二进制包就可同时支持多个语言和书写系统. 使用 QTranslator 来加载生成的 qm ...
- Qt的翻译文件QTranslator不能使用问题总结(原)
笔者今天在自己工程中使用翻译文件,发现没有起作用,反复查找,发现是用宏定义了命名空间,生成.ts文件时,不会加上命名空间,所以生成的.qm文件在实际使用时,会无法找到对应的语句. 如果将宏定义的命名空 ...
- Qt Quick的国际化和本地化
国际化您的应用程序 以下部分描述了国际化QML源代码的各个方面.如果您对应用程序中的所有用户界面组件都遵循这些指南,则可以针对不同语言和本地文化约定(例如日期和数字的格式化方式)本地化应用程序的各个方 ...
- Qt Installer Framework翻译(7-2)
包文件夹 安装程序包含的组件,要么是内嵌的,要么可以从远程存储库加载.在这两种情况下,都需要为组件使用一种安装程序可以读取的文件格式和结构. 包文件夹结构 将所有组件放在相同的根文件夹中,即包文件夹. ...
- 2.7、Android Studio使用翻译编辑器本地化UI
如果你的应用支持多语言,你需要合理的管理你的翻译的string资源.Android Studio 提供了翻译编辑器来使查看和管理翻译的资源更加容易. 关于翻译编辑器 翻译后的资源在你的项目里保存在不同 ...
- Qt Linguist介绍
简介 Qt提供了一款优秀的支持Qt C++和Qt Quick应用程序的翻译工具.发布者.翻译者和开发者可以使用这款工具来完成他们的任务. 发布者:承担了全面发布应用程序的责任.通常,他们协调开发者和翻 ...
- 关于Qt
什么是Qt Qt是一个针对桌面.嵌入式.移动设备的一个跨平台的应用程序开发框架,支持的平台包括Linux.OS X.Windows.VxWorks.QNX.Android.iOS.BlackBerry ...
随机推荐
- Elasticsearch.yml
cluster.name: elasticsearch配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集 ...
- rolllup巧用
--构造环境drop table dept purge;drop table emp purge;create table dept as select * from scott.dept;creat ...
- 修改virtual box中ubuntu lubuntu 的分辨率
Step1 先用xrandr命令查看能够支持的分辨率 Step2 xrandr --output VGA-1 --size 1280x800 Step3 重启电脑
- 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.5.调优实战
高性能硬件上的程序部署策略 在高性能硬件上部署程序,目前主要有两种方式: 通过64位JDK来使用大内存. -- 缺点:GC停顿时间长 使用若干个32位虚拟机建立逻辑集群来利用硬件资源. -- 思 ...
- web 应用程序转化为多租户 SaaS 解决方案
web 应用程序转化为多租户 SaaS 解决方案 https://www.ibm.com/developerworks/cn/cloud/library/cl-multitenantsaas/inde ...
- Tomcat组件启动流程图
看到一张关于Tomcat组件启动流程图,觉得还可以,收藏.
- Androidannotation使用之@Rest获取资源及用户登录验证(一)
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/NUPTboyZHB/article/details/24384713 简介: 上一篇博文简单的介绍了 ...
- [19/04/03-星期三] IO技术_其它流(RandomAccessFile 随机访问流,SequenceInputStream 合并流)
一.RandomAccessFile 随机访问流 [版本1] /* *RandomAccessFile 所谓随机读取就是 指定位置开始或指定位置结束 的读取写入文件 * 实现文件的拆分与合并 模拟下载 ...
- MS12-020蓝屏攻击
MS12-020远程桌面协议RDP拒绝访问漏洞 条件:受害者必须开放RDP协议 开放了3389端口 或者端口改了,知道对方RDP开放的对应端口. 过程:MSF利用 MSF显示为seems down说明 ...
- h5做的app和原生app的区别
之所以说h5做的app和原生app的区别,是因为一位博友的问题: 随着 h5 的普及,是不是不再需要开发 app ? 我的回答是要分业务需求,分场合而定. 比如现在的微信小程序这么流行,甚至也取代了不 ...