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. Linux文件系统检查错误

    我们的Linux系统在无法启动时候,通常需要进入单用户模式下进行修改一些配置文件,或调整一些参数方可.但是在进入单用户模式后,我们的/文件系统是只读模式,无法进行修改,那么这个时候我们就需要用到一条命 ...

  2. [零基础学JAVA]Java SE面向对象部分.面向对象基础(01)

    在对象的内存分配上与c++有区别: C++:#include <iostream>#include <string> class Person{    private:     ...

  3. Vue-Quill-Editor插件插入图片的改进

    最近在做一个Vue-Clie小项目,使用到了Vue-Quill-Editor这个基于Vue的富文本编辑器插件.这个插件跟Vue契合良好,使用起来比其他的诸如百度UEditor要方便很多,但是存在一个小 ...

  4. hdu-2620 Ice Rain---数论(取模运算规律)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2620 题目大意: 给出n和k求: 解题思路: kmodi=k-i*[k/i] ,所以=nk-(1*[ ...

  5. Kali-linux目录加密

    在Kali中提供了一个目录加密工具TrueCrypt.该工具是一款开源的绿色加密卷加密软件,不需要生成任何文件即可在硬盘上建立虚拟磁盘.用户可以按照盘符进行访问,所以虚拟磁盘上的文件都被自动加密,访问 ...

  6. 20145238-荆玉茗 《网络对抗技术》-Web安全基础实践

    Web安全基础实践 实践过程记录 实验准备: 输入命令java -jar webgoat-container-7.0.1-war-exec.jar,一直等待等待直到出现 在浏览器中打开localhos ...

  7. HDU 2021 发工资咯:)(最水贪心)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2021 发工资咯:) Time Limit: 2000/1000 MS (Java/Others)    ...

  8. Mobile IP

    Mobile IP Proliferation(增生) of mobile devices: PDAs, laptops, smart phones, - As user moves, point-o ...

  9. JQuery手写一个简单的分页

    效果图: 大概思路:使用ul进行初始布局,每一次点击事件改变li里的值.完整的代码在gitup上:https://github.com/anxizhihai/Paging.gitcss部分: html ...

  10. 爬虫之Beautifulsoup及xpath

    1.BeautifulSoup (以 Python 风格的方式来对 HTML 或 XML 进行迭代,搜索和修改) 1.1 介绍 Beautiful Soup提供一些简单的.python式的函数用来处理 ...