专栏首页jiajia_dengQt Quick 项目实现根据操作系统语言自动显示指定翻译

Qt Quick 项目实现根据操作系统语言自动显示指定翻译

Qt 提供了一整套的翻译引擎,讲你需要翻译的内容使用 qsTr(“”) 包括起来就可以通过工具来扫描这些待翻译的内容。我们用 Qt 创建的 Empty 项目来做演示,创建完成后,main.qml 中只有如下代码:

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
}

其中 Hello World 文字就使用 qsTr() 括起来了,我们首先需要做的就是让 Qt 翻译工具可以扫描到这些带翻译的文件。

将待翻译文件添加到扫描列表

在 Qt 项目的 pro 文件中添加如下内容:

# 告诉 Qt 翻译处理工具扫描所有当前目录下的 qml 文件
lupdate_only {
    SOURCES  += *.qml
}


# 你要生成几种语言的模板文件,这里指示生成两种,一种英文、一种中文
TRANSLATIONS = app_zh_cn.ts \
               app_en_us.ts

如如上注释,lupdate_only 要告诉 Qt 翻译工具你要扫描所有目录下的 qml 文件,TRANSLATIONS 指示要生成几种语言的翻译模板。

生成 .ts 中间文件

点击 Qt Creaetor 菜单栏的工具->外部->Qt语言专家->更新翻译(lupdate),生成中间的 .ts 文件。

此时看下面概要信息生成了如下内容:

到项目目录下就能看到这两个中间待翻译的 .ts 文件了:

开始翻译

到你的 Qt 安装目录下找到 Qt5.12.3\5.12.3\msvc2017\bin\linguist.exe 文件,不同的编译器路径可能不一样,自己仔细找一下。打开 linguist.exe 将我们要翻译的文件拖进去,比如我要翻译刚刚生成的 app_zh_cn.ts 文件。选择你要翻译的内容,然后在下面输入翻译的文字,最后点击上面的绿色勾确认翻译。

完成后记得保存文件(切记切记)

生成目标二进制文件

在翻译中间文件完成后,返回 Qt Creator,还是点击 工具->外部->Qt语言专家->发布翻译(lrelease),此时你会看到生成了两个后缀为 .qm 的文件:

这就是最终的目标翻译文件了,接下来就是加载翻译了。

加载翻译

打开 main.cpp 文件,在实例化 app 对象后面加入如下代码(别忘了 include QTranslator):

QTranslator translator;
if (translator.load(QLocale(), QLatin1String("app"), QLatin1String("_"), QGuiApplication::applicationDirPath())) {
    app.installTranslator(&translator);
}

translator.load() 的参数说明如下(也可以参考 Qt 官网:https://doc.qt.io/qt-5/qtranslator.html#load-1):

  • 第一个参数指定当前系统语言,使用 QLocale 就可以获取到。
  • 第二个参数设置当前翻译文件的前缀名字,我们名字前缀是 app。
  • 第三个参数设置前缀名字和实际语言中间的分割符号。
  • 第四个参数指定翻译文件的位置,就是程序当前目录。

最终组成的就是 前缀+分隔符号+系统语言+.qm。这样编译出来的程序就可以根据系统语言自动切换翻译文件了。讲我们刚刚生成的两个 .qm 文件复制到 exe 所在目录:

然后运行程序,在 Windows 10 中文系统中最终运行效果如下:

相关

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 解决 VS2012/2013/2015 下载帮助文档速度慢

    用过 VS2012 以上版本的人心里肯定清楚,想通过 Help Viewer 去下载帮助文档,那速度简直无法忍受,选择几个项目一晚上甚至几天都下载不完。很多人被...

    我与梦想有个约会
  • Qt for iOS 应用使用自定义动态库 Framework

    本文内容适合当你想使用 Qt 调用 xcode 开发的动态库 framework 做 iOS 应用的场景,文中涉及到原始动态库 framework 文件的配置,...

    我与梦想有个约会
  • ES6 学习笔记之新的语法特性

    本文记录一些与 ES5 不同的语法特性,因为只记录了我比较关心的内容,所以记录的可能不全面。

    我与梦想有个约会
  • Linux内核UDP收包为什么效率低?能做什么优化?

    现在很多人都在诟病Linux内核协议栈收包效率低,不管他们是真的懂还是一点都不懂只是听别人说的,反正就是在一味地怼Linux内核协议栈,他们的武器貌似只有DPD...

    IT大咖说
  • 时空壶田力:用耳机打破语言的屏障 | 镁客请讲

    置身于全球化的时代,在千万个家庭中,孩子吃的奶粉来自新西兰,丈夫开的车产自德国,妻子新买的口红来自法国......距离不再是难以跨域的现实;地域之间的界线也越来...

    镁客网
  • PKUseg在货运领域的评测

    给大家的建议就是,如果大家赶时间求稳定适应范围需要非常广的时候,目前来说jieba是非常好的选择,如果说在面临一些精细化领域的特殊需求的时候,可以用PKUseg...

    sladesal
  • [代码审计]DVWA代码审计档案

    漏洞详情:暴力破解漏洞即我们平时所说的口令爆破(或跑字典),是采用大量的密 码进行批量猜解密码的一种恶意登录方式

    天钧
  • tensorflow: 畅玩tensorboard图表(SCALARS)

    这篇博客建立在你已经会使用tensorboard的基础上。如果你还不会记录数据并使用tensorboard,请移步我之前的另一篇博客:tensorflow: t...

    JNingWei
  • # 实现原理

    用户1175783
  • # 实现原理

    用户1175783

扫码关注云+社区

领取腾讯云代金券