Qt5 编译 Qt Creator 源码中的 linguist 模块

文章目录

    • 下载 Qt Creator 源码
    • 手动翻译多语言
    • 自动翻译多语言

下载 Qt Creator 源码

Github: https://github.com/qt/qttools
笔记打算用 Qt 5.12.12 来编译 qt creator-linguist
所以笔者下载的是 tag - 5.12.12 ,解压后如下,先删除多余的文件,后续还要删除更多文件方便清晰的查看源码.
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
添加 header.pri

##指定 QtUiTools/private 所在目录.
INCLUDEPATH += D:/Qt/5.12.12/5.12.12/msvc2017_64/include/QtUiTools
INCLUDEPATH += D:/Qt/5.12.12/5.12.12/msvc2017_64/include/QtUiTools/5.12.12/QtUiTools

在这里插入图片描述

手动翻译多语言

在 .pro 中增加多语言, 在 Qt Creator 生成

TRANSLATIONS += $$PWD/bin/release/msvc_x64/appInfo/setting/Ch/Ch.ts #英文->中文
TRANSLATIONS += $$PWD/bin/release/msvc_x64/appInfo/setting/ChT/ChT.ts #英文->中文繁体
TRANSLATIONS += $$PWD/bin/release/msvc_x64/appInfo/setting/Japanese/Japanese.ts #英文->日语
TRANSLATIONS += $$PWD/bin/release/msvc_x64/appInfo/setting/Russian/Russian.ts #英文->俄语
TRANSLATIONS += $$PWD/bin/release/msvc_x64/appInfo/setting/German/German.ts #英文->德语
TRANSLATIONS += $$PWD/bin/release/msvc_x64/appInfo/setting/French/French.ts #英文->法语
TRANSLATIONS += $$PWD/bin/release/msvc_x64/appInfo/setting/Italian/Italian.ts #英文->意大利语
TRANSLATIONS += $$PWD/bin/release/msvc_x64/appInfo/setting/Polish/Polish.ts #英文->波兰语
TRANSLATIONS += $$PWD/bin/release/msvc_x64/appInfo/setting/Thai/Thai.ts #英文->泰语
TRANSLATIONS += $$PWD/bin/release/msvc_x64/appInfo/setting/Hindi/Hindi.ts #英文->印地语
TRANSLATIONS += $$PWD/bin/release/msvc_x64/appInfo/setting/Indonesian/Indonesian.ts #英文->印尼语
TRANSLATIONS += $$PWD/bin/release/msvc_x64/appInfo/setting/Spanish/Spanish.ts #英文->西班牙语
TRANSLATIONS += $$PWD/bin/release/msvc_x64/appInfo/setting/Portuguese/Portuguese.ts #英文->葡萄牙语
TRANSLATIONS += $$PWD/bin/release/msvc_x64/appInfo/setting/Korean/Korean.ts #英文->朝鲜语
TRANSLATIONS += $$PWD/bin/release/msvc_x64/appInfo/setting/Vietnamese/Vietnamese.ts #英文->越南语

在这里插入图片描述
更新翻译: 更新.ts 文件
发布翻译: 把 .ts 文件生成 .qm 文件,最终利用 QTranslator 类完成界面上显示的翻译.
文件->打开 .ts 文件
在这里插入图片描述

自动翻译多语言

在这里插入图片描述

.ts 格式, 表示未翻译
在这里插入图片描述
直接翻译.ts 文件的核心代码

bool LinguistDlg::translateTsFileUnfinished(const QString & strSrc,const QString & strDest,const QString &sourceLanguage,const QString &targetLanguage)
{QDomDocument doc;QString errorMsg;int errorLine = 0;int errorColumn = 0;{QFile iFile(strSrc);if(!iFile.open(QIODevice::ReadOnly)){setLastError(tr("Open file failed:%1").arg(iFile.errorString()));return false;}QByteArray baContent = iFile.readAll();bool bPase = doc.setContent(baContent,&errorMsg,&errorLine,&errorColumn);if(!bPase){setLastError(tr("Parser failed:[line:%1 column:%2]:%3").arg(errorLine).arg(errorColumn).arg(errorMsg));return false;}iFile.close();}QVariantMap map;map["source_language"] = sourceLanguage;map["target_language"] = targetLanguage;SCDebug<<"sourceLanguage:"<<sourceLanguage;SCDebug<<"targetLanguage:"<<targetLanguage;//自定义术语表,这里把 %1 ~ %9 不让飞书翻译.QVariantList glossary;for(int k=0; k<10; ++k){QVariantMap cMap;cMap.insert("from",QString("%%1").arg(k));cMap.insert("to",QString("%%1").arg(k));glossary.append(cMap);}//!!!Fix <message numerus=yes>标记为数字,如果不为数字则报错.map["glossary"] = glossary;QDomElement elemntTS = doc.elementsByTagName("TS").at(0).toElement();QDomNodeList nlContexts = elemntTS.elementsByTagName("context");int maxValue = nlContexts.count();for(int i=0;i<nlContexts.count(); i++){UiClass::init()->showWaittingWidget(tr("Translating...(%1/%2)").arg(i).arg(maxValue),this);QDomNode nodeContext = nlContexts.at(i);QDomNodeList nlMessages = nodeContext.toElement().elementsByTagName("message");for(int j=0;j<nlMessages.count(); ++j){QDomNode nodeMessage = nlMessages.at(j);QDomElement elementTranslation = nodeMessage.firstChildElement("translation");QString type = elementTranslation.attribute("type");if ("unfinished" == type){//未翻译的//nodeMessage.removeChild(elementTranslation);QDomElement elementSource = nodeMessage.firstChildElement("source");QDomElement elementLocation = nodeMessage.firstChildElement("location");map["text"] = elementSource.text();if(!_httpApiTr.translate(map)){SCWarning<<"Error:elementLocation:"<<elementLocation.attribute("filename")<<map["text"].toString();continue;}auto translate_text = map.value("translate_text").toString();//这里一定要先删除旧的再追加新的,否则无效.elementTranslation.removeAttribute("type");elementTranslation.removeChild(elementTranslation.firstChild());auto nodeText = doc.createTextNode(translate_text);elementTranslation.appendChild(nodeText);//SCDebug<<"Sucess:elementLocation:"<<elementLocation.attribute("filename")<<map["text"].toString()<<translate_text;}}}{QFile iFileWrite(strDest);if( !iFileWrite.open(QIODevice::WriteOnly)){setLastError(tr("Open file failed:%1").arg(iFileWrite.errorString()));return false;}iFileWrite.write(doc.toByteArray());iFileWrite.close();}return true;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/806228.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue + element plus:ResizeObserver loop completed with undelivered notifications

ResizeObserver loop completed with undelivered notifications. 解释&#xff1a; 这个错误通常表示ResizeObserver无法在一个浏览器帧中传递所有的通知&#xff0c;因为它们需要的处理时间比帧的剩余时间更长。这通常发生在被观察元素的尺寸变化导致了一连串的回调函数被调…

ElasticSearch 的 DisMaxQueryBuilder 的理解

DisMaxQueryBuilder的定义&#xff1a; A query that generates the union of documents produced by its sub-queries, and that scores each document with the maximum score for that document as produced by any sub-query, plus a tie breaking increment for any addit…

爬虫相关的简单操作

爬虫&#xff1a;一种程序&#xff0c;从网站上爬取各种各样的数据&#xff0c;包括图片、视频、音乐、文档等 一、爬哪一个网址&#xff1f; 怎么找到一个视频的网址&#xff1a; 1、在浏览器右上角菜单--更多工具--开发者工具 2、选中网络&#xff08;network&#xff09…

51单片机 DS1302

DS1302 实现流程 将提供的ds1302底层参考程序拷贝到工程下 注意在ds1302.c中可能硬件引脚没有定义&#xff0c;注意去看一下。还有头文件什么的在ds1302中记得加上 参考代码&#xff1a; #include "reg52.h" #include "ds1302.h"unsigned char Write_…

Java 数据类型和变量

基本类型 整数类型&#xff1a;byte short int long&#xff0c;分别占 1、2、4、8 个字节&#xff1b; 在给 long 类型变量赋值时&#xff0c;如果超过了 int 的表示范围&#xff0c;需要在常量后面加大写 L 或小写字母 l&#xff0c;例如&#xff1a;long value 3425352515…

深度解析SPARK的基本概念

关联阅读博客文章&#xff1a; 深入理解MapReduce&#xff1a;从Map到Reduce的工作原理解析 引言&#xff1a; 在当今大数据时代&#xff0c;数据处理和分析成为了企业发展的重要驱动力。Apache Spark作为一个快速、通用的大数据处理引擎&#xff0c;受到了广泛的关注和应用。…

使用QT 开发不规则窗体

使用QT 开发不规则窗体 不规则窗体贴图法的不规则窗体创建UI模板创建一个父类创建业务窗体main函数直接调用user_dialog创建QSS文件 完整的QT工程 不规则窗体 QT中开发不规则窗体有两种方法&#xff1a;&#xff08;1&#xff09;第一种方法&#xff0c;使用QWidget::setMask函…

缓存相关知识总结

一、缓存的作用和分类 缓存可以减少数据库的访问压力&#xff0c;提升整个网站的数据访问速度&#xff0c;改善数据库的写入性能。缓存可以分为两种&#xff1a; 缓存在应用服务器上的本地缓存&#xff1a;访问速度快&#xff0c;但受应用服务器内存限制 缓存在专门的分布式缓存…

【网络安全技术】——网络安全设备(学习笔记)

&#x1f4d6; 前言&#xff1a;网络防火墙&#xff08;简称为“防火墙”&#xff09;是计算机网络安全管理中应用最早和技术发展最快的安全产品之一。随着互联应用的迅猛发展&#xff0c;各种安全问题和安全隐患日渐突出。防火墙及相关安全技术能够最大可能地解决各类安全问题…

官网下载IDE插件并导入IDE

官网下载IDEA插件并导入IDEA 1. 下载插件2. 导入插件 1. 下载插件 地址&#xff1a;https://plugins.jetbrains.com/plugin/21068-codearts-snap/versions 说明&#xff1a;本次演示以IDEA软件为例 操作&#xff1a; 等待下载完成 2. 导入插件 点击File->setting->Pl…

Oracle数据库imp文件导入失败提示:“不是有效的导出文件, 标头验证失败”解决方法

导入数据库时&#xff0c;直接提示不是有效的导出文件&#xff0c;标头验证失败 原因&#xff1a;这是因为导出的imp文件和你当前导入的数据库版本不一致造成的&#xff0c;例如&#xff1a;导出文件版本号12.0.1 导入数据库的版本号11.0.2&#xff0c;会报这个错误。 解决办法…

【GIS学习笔记】ArcGIS/QGIS如何修改字段名称、调整字段顺序?

在先前的ArcGIS学习中&#xff0c;了解到字段名称是不能修改的&#xff0c;只能用新建一个字段赋值过去再删除原字段这种方法实现&#xff0c;字段顺序的调整如果通过拖拽也是不能持久的&#xff0c;需要用导出一个新数据这种方法进行保存&#xff0c;可参考以下链接&#xff1…

Swift中的数据类型

在Swift中&#xff0c;常见的数据类型包括&#xff1a; 整数类型&#xff08;Int&#xff09;&#xff1a;表示整数值&#xff0c;可以是正数、负数或零。例如&#xff1a;-10、0、100。浮点数类型&#xff08;Double和Float&#xff09;&#xff1a;表示带有小数的数值。Doub…

Node.js模块URL的使用

引入 URL 模块 要使用 URL 模块&#xff0c;首先需要在代码中引入它。可以使用以下代码将 URL 模块导入到你的脚本中&#xff1a; const url require(url);实例代码 const urlrequire(url); var apihttp://www.baidu.com?nameshixiaobin&age20; console.log(url.parse(…

RUM 最佳实践-交互延迟的探索与发现

FID 在互联网高速发展的时代&#xff0c;用户体验已成为企业竞争的关键所在。网页性能作为用户体验的重要组成部分&#xff0c;直接影响着用户的满意度和工作效率。First Input Delay&#xff08;FID&#xff09;作为衡量网页性能的重要指标&#xff0c;越来越受到业界关注。今…

迷宫 — — 蓝桥杯(动态规划)

迷宫 题目&#xff1a; 输入样例&#xff1a; 3 1 1 1 2 3 4 5 6 7 8 9 2 2 1 3 1 R输出样例&#xff1a; 21思路&#xff1a; 题目大意&#xff1a;给定一个n x m的平面网格&#xff0c;并且每一个格子都有一定的代价&#xff0c;并且设有障碍物和陷阱&#xff0c;障碍物的意…

Redux和Redux Toolkit

Redux 概念&#xff1a;redux是react最常用的集中状态管理工具&#xff0c;类似于Vue中的Pinia(vuex)&#xff0c;可以独立于框架运行作用&#xff1a;通过集中管理的方式管理应用的状态 Redux快速体验 不和任何框架绑定&#xff0c;不使用任何构建工具&#xff0c;使用纯Re…

MySQL-创建和管理表:基础知识、创建和管理数据库、创建表、修改表、重命名表、删除表、清空表、拓展

创建和管理表 1. 基础知识1.1 一条数据存储的过程1.2 标识符命名规则1.3 MySQL中的数据类型 2. 创建和管理数据库2.1 创建数据库2.2 使用数据库2.3 修改数据库2.4 删除数据库 3. 创建表3.1 创建方式13.2 创建方式23.3 查看数据表结构 4. 修改表4.1 追加一个列4.2 修改一个列4.3…

mac电脑安装软件报错:无法检查更新,请检查你的互联网连接

1、点菜单栏搜索图标&#xff0c;输入&#xff1a;终端 &#xff0c;找到后&#xff0c;点击打开 2、输入以下命令&#xff1a;&#xff08;复制粘贴进去&#xff09;回车安装 /usr/sbin/softwareupdate --install-rosetta --agree-to-license 3、提示【Install of Rosetta …

flask 访问404

当你的项目有自己的蓝图&#xff0c;有添加自己的前缀&#xff0c;也注册了蓝图。 在访问的路由那里也使用了自己的蓝图&#xff0c;如下图 然后你访问的地址也没问题&#xff0c;但是不管怎么样访问就是返回404&#xff0c;这个时候不要怀疑你上面的哪里配置错误&#xff0c;…