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.rhkb.cn/news/304390.html

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

相关文章

【Vue】Vue3中的OptionsAPI与CompositionAPI

文章目录 OptionsAPICompositionAPI对比总结 OptionsAPI 中文名:选项式API通过定义methods,computed,watch,data等属性方法&#xff0c;处理页面逻辑。以下是OptionsAPI代码结构 实例代码: <script lang"ts">// js或者tsimport { defineComponent } from vu…

【学习】软件测试需求分析要从哪些方面入手

软件测试需求分析是软件测试过程中非常重要的一个环节&#xff0c;它是为了明确软件测试的目标、范围、资源和时间等要素&#xff0c;以确保软件测试的有效性和全面性。本文将从以下几个方面对软件测试需求分析进行详细的阐述&#xff1a; 一、软件测试目标 软件测试目标是指…

读所罗门的密码笔记16_直通心智

1. 直通心智 1.1. 如今&#xff0c;科学家已经可以诱发触觉、压觉、痛觉和大约250种其他感觉 1.1.1. DARPA支持的触觉技术第一次让一位受伤的人能够用假肢和手指感知到被触碰的物体 1.1.2. 可以建立人工系统&#xff0c;来替换和弥补受损大脑的部分区域 1.1.3. 神经科学家能…

Nginx日志格式化和追踪

背景 Nginx是一款功能强大的Web服务器&#xff0c;对于网络环境中的日志记录和配置至关重要。定制化Nginx日志格式可以帮助管理员更好地监控服务器性能、分析用户行为并做出相应优化。在本文中&#xff0c;我们将深入探讨Nginx日志格式的高级定制化策略&#xff0c;包括理解基…

词频统计程序

使用Hadoop MapReduce处理文本文件&#xff0c;Mapper负责将文本分割为单词&#xff0c;然后Reducer对每个单词进行计数&#xff0c;最后将结果写入输出文件。 // 定义WordCount公共类 public class WordCount {// 主入口方法&#xff0c;处理命令行参数public static void m…

循环神经网络RNN

循环神经网络RNN是一种人工神经网络&#xff0c;旨在处理时间序列、语音和自然语言等序列数据。将RNN 想象成传送带&#xff0c;一次处理一个元素的信息&#xff0c;从而 "记住 "前一个元素的信息&#xff0c;对下一个元素做出预测。   想象一下&#xff0c;我们有…

【多线程】Thread的常见属性 | 终止线程 | 等待线程 | 休眠线程 | 线程安全

文章目录 一、Thread的方法Thread的常见属性后台线程&#xff08;守护线程&#xff09;设置后台线程是否存活 启动线程终止\打断一个线程1.创建标志位2.调用 interrupt() 方法 等待一个线程 join()t.join&#xff08;&#xff09;的工作过程&#xff1a; 休眠一个进程sleep 二、…

ppt从零基础到高手【办公】

第一章&#xff1a;文字排版篇01演示文稿内容基密02文字操作规范03文字排版处理04复习&作业解析第二章&#xff1a;图形图片图表篇05图形化表达06图片艺术化07轻松玩转图表08高效工具&母版统一管理09复习&作业解析10轻松一刻-文字图形小技巧速学第三章&#xff1a;…

vue模版字符串解析成vue模版对象

模版字符串 this.code <template><div style"width:100% ; height: 100% ;">{{resultData[0].name}}</div> </template> <script> export default {data() {return {resultData: [{ name: 图幅, value: 20 },]}},mounted(){},method…

JVM虚拟机(二)类加载器、双亲委派模型、类装载的执行过程

目录 一、类加载器1.1 什么是类加载器&#xff1f;1.2 类加载器的分类 二、双亲委派模型2.1 什么是双亲委派模型&#xff1f;1&#xff09; 示例一&#xff1a;加载自己创建的类2&#xff09;示例二&#xff1a;加载JDK原有的类 2.2 JVM 为什么采用双亲委派模型&#xff1f; 三…

第14届java A组蓝桥杯做题记录

A题 特殊日期 package Java14省赛.Java研究生组;import java.time.Year; //特殊判断一下2月份&#xff0c;leaf 为true 1 import java.util.*;import 蓝桥杯.dfs_n皇后; public class 特殊日期 {static int sum(int d){int res 0;while(d > 0){res d % 10;d / 10;}return…

备战蓝桥杯Day40 - 第11届python组真题 - C跑步锻炼

一、题目描述 二、思路 1、使用datetime库中的方法可以很好的解决这个问题。 2、定义起始时间和结束时间&#xff0c;判断是否是周一或者是1号&#xff0c;结果res加上相应的里程数。 3、最后输出 res 即为本题答案。 三、代码实现 import datetimestart datetime.date(2…

NzN的数据结构--选择排序

接上文&#xff0c;本章我们来介绍选择排序。先三连后看才是好习惯~~~ 目录 一、基本思想 二、直接选择排序 三、堆排序 一、基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待…

前端工程化理解 (2024 面试题)

最好介绍远古世界最好随性一点&#xff0c;不要太刻板 &#xff0c;不然像背书 什么是前端工程化&#xff1f; - 知乎 前端工程化的历史 互联网初期&#xff0c;09 年以前&#xff0c;页面只需要展示一些列表、表格、文章内容以及简单图片即可&#xff0c;其目的是为了传送信…

SHOPFA:APP定制开发的哪种二开项目容易交付,哪些不可以接?

在商城系统开发领域&#xff0c;定制开发与二次开发&#xff08;二开&#xff09;是两种截然不同的项目类型。它们之间的主要差异体现在项目起点、灵活性、成本、时间以及风险等多个方面。 一、项目起点 商城定制开发通常是从零开始&#xff0c;根据客户的实际需求&#xff0c…

电介质材料(四)——复合电介质材料

本篇为西安交通大学本科课程《电气材料基础》的笔记。 本篇为这一单元的第四篇笔记&#xff0c;上一篇传送门。 复合电介质材料 是由多种成分共同组成&#xff0c;例如油纸复合绝缘、云母层压板、环氧浸渍玻璃纤维布等。即便是没有添加的材料&#xff0c;材料也会存在杂质和…

华为ensp中PPP(点对点协议)中的CHAP认证 原理和配置命令

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月11日6点00分 PPP协议&#xff08;Point-to-Point Protocol&#xff09;是点到点协议&#xff0c;是一种常用的串行链路层协议&#xff0c;用于在两个节点之间建立点…

地表蒸散发遥感产品信息提取验证与融合

原文链接&#xff1a;地表蒸散发遥感产品信息提取验证与融合https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247600962&idx4&sncb995f8ac85c3c0759da82a15520c118&chksmfa820aa5cdf583b306988fbb5795c6370dab52a2fde5cfa5a8566dd7ba2864cb651c9230c6f3&…

企业级开源路由系统VyOS-构建和使用

介绍 VyOS是一个基于Linux的企业级路由器操作系统&#xff0c;被许多公司和个人用来驱动物理网络设备&#xff0c;如路由器和防火墙。它有一个统一的命令行界面来管理其所有的网络相关功能&#xff08;和Juniper Junos操作很像&#xff09;。VyOS使用Debian GNU/Linux作为其基…

xss基础

第一关&#xff1a; html部分标签可以解析js <script>alert (1)</script> 第二关&#xff1a; 可以看到value用双引号闭合了&#xff0c;使用上一关的payload没用&#xff0c;尝试一下闭合这个input 所以使用双引号和>闭合后再加入上一关的payload 11"…