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.hqwc.cn/news/615109.html

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

相关文章

软件杯 深度学习卫星遥感图像检测与识别 -opencv python 目标检测

文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **深度学习卫星遥感图像检测与识别 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐…

动力学-坐标系

文章目录 1 转动坐标系2 运动坐标系3 刚体运动参数• 拉格朗日建立机器人动力学方程需用齐次变换矩阵,计算效率低。优点是可以写成状态方程的形式,便于运用控制方法。 • 牛顿—欧拉动力学方程可得到一组正向和反向递推方程,显著优点是可把驱动力矩的计算时间缩短到可实时控…

Java | Leetcode Java题解之第20题有效的括号

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isValid(String s) {int n s.length();if (n % 2 1) {return false;}Map<Character, Character> pairs new HashMap<Character, Character>() {{put(), ();put(], [);put(}, {);}};Deque<…

【JVM】如何解决内存泄漏问题

什么是内存泄漏&#xff0c;如何解决内存泄漏问题&#xff1f; ⚫ 内存泄漏&#xff08;memory leak&#xff09;&#xff1a;在Java中如果不再使用一个对象&#xff0c;但是该对象依然在GC ROOT的引用链上&#xff0c;这 个对象就不会被垃圾回收器回收&#xff0c;这种情况就…

Project Euler_Problem 193_Few Repeated Digits_欧拉筛+容斥公式

原题目&#xff1a; 题目大意&#xff1a; 解题思路&#xff1a; 代码&#xff1a; void serch(ll I,ll sum,ll used) {ll i, j, l, x,y;for (i 1; i < I; i) {if (sum * D[i] > N)break;x sum * D[i];y N / x;if (used % 2 0) {ans1 ans1 - y;}else {ans1 ans1 y…

凡泰极客亮相2024 亚马逊云科技出海全球化论坛,为企业数字化出海赋能

随着「不出海&#xff0c;即出局」登上热搜榜单&#xff0c;企业出海已成燎原之势&#xff0c;3月29日&#xff0c;2024 亚马逊云科技出海全球化论坛在深圳成功举办&#xff0c;凡泰极客创始人梁启鸿受邀出席&#xff0c;并以 「App 2.0&#xff1a;以SuperApp构建智能数字生态…

jsoncpp 编译和使用

原文链接&#xff1a; jsoncpp的编译和使用 jsoncpp 编译出库文件 1.从github仓库下载 2.下载 cmake 工具 3.生成VS项目 4.编译得到需要的库文件 jsoncpp 的使用 查看原文

关闭 SPI 会导致 WRPERR 错误的问题分析

1. 引言 在 STM32 的应用中&#xff0c;SPI 算是用的比较多的外设了&#xff0c;也是单片机最常见外设之一。客户说它执行了关闭 SPI 的代码&#xff0c;竟然会导致 Flash 中的 WRPERR 标志置位&#xff0c;致使应用碰到一些问题。这就奇怪了&#xff0c;SPI 和内部 Flash 看起…

生成式AI对UiPath来说是机遇还是挑战?

企业争相通过技术革新来领跑市场&#xff0c;机器人流程自动化&#xff08;RPA&#xff09;技术更是将企业的效率和成本控制推向了新的高度。但当人工智能&#xff08;AI&#xff09;的最新进展——生成式AI登上舞台时&#xff0c;它不仅带来了变革的可能&#xff0c;还提出了一…

前端大屏项目适配方法

要在F11全屏模式下查看 方法一&#xff0c;rem font-size 动态设置HTML根字体大小 和 body 字体大小&#xff08;lib_flexible.js&#xff09; 将设计稿的宽&#xff08;1920&#xff09;平均分成 24 等份&#xff0c; 每一份为 80px。HTML字体大小就设置为 80 px&#xff…

组合预测 | Matlab实现ICEEMDAN-SMA-SVM基于改进完备集合经验模态分解-黏菌优化算法-支持向量机的时间序列预测

组合预测 | Matlab实现ICEEMDAN-SMA-SVM基于改进完备集合经验模态分解-黏菌优化算法-支持向量机的时间序列预测 目录 组合预测 | Matlab实现ICEEMDAN-SMA-SVM基于改进完备集合经验模态分解-黏菌优化算法-支持向量机的时间序列预测预测效果基本介绍程序设计参考资料预测效果 基本…

浅说深度优先搜索(上)——递归

好久没有讲算法了&#xff0c;今天我们就来谈谈“初学者”的第二个坑&#xff0c;深度优先搜索&#xff0c;其实也就是递归。 写在最前 相信很多人都和我一样刚开始的时候完全不知道怎么下手&#xff0c;甚至可以说是毫无头绪&#xff0c;那么我们来理一理递归到底要怎么写。…