开源一套Trados Sdlxliff 对比工具
开源一套Trados Sdlxliff 对比工具
在Trados翻译过程中经常对需要进行版本控制和对比,例如对比不同设置下生成的sdlxliff文件,对比不同的机器翻译结果以及对比机器翻译和人工翻译,对比翻译和审校等等。
当然SDL官方也提供了对比工具
https://appstore.rws.com/Plugin/43?tab=releases
但官方的这种是基于TradosAPI的比较笨重,可定制化程度不高,因此还是单独又制作了一个sdlxliff对比工具:
https://github.com/Dark-20001/CompareSdlxliff/
这个和官方工具不同,官方使用Trados内置API来做因此2017,2019,2021,2022各个版本都不一样要下载对应的版本,所以此版本按照xliff文件标准来执行,独立运行,不依赖于Trados.
程序不是XML直接读取sdlxliff,因为sdlxliff会以base64编码形式讲小于25MB的文件编入sdlxliff这部分其实意义不大,所以我跳过这个部分。(sdlxliff这么多年也应该改进一下了,这种基于xml的文件结构经常出现问题,越来越多的软件企业使用zip格式二次封装文件,这样能够将不同独立的组件部分,嵌入部分进行分离,例如docx,xlsx)
string line1 = xlifflines.First();
List<string> base64lines = new List<string>();int s = line1.IndexOf(bmark);if (s != -1)
{string lineb = line1.Substring(s + 29);base64lines.Add(lineb);line1 = line1.Substring(0, s + 29);xlifflinesClean.Add(line1);int cc = 1;for (int i = 1; i < xlifflines.Count; i++){if (xlifflines[i].StartsWith(bmarkStop)){xlifflinesClean.Add(xlifflines[i]);cc = i;break;}else{base64lines.Add((string)xlifflines[i]);}}for (int i = cc+1; i < xlifflines.Count; i++){xlifflinesClean.Add(xlifflines[i]);}}
之后在进行xml解析
doc = XDocument.Parse(String.Join("\r\n", xlifflinesClean));
doc = XDocument.Parse(string.Join("\r\n",xlifflines));
解析之后就是常规操作,提取TranslationUnits和ID
IEnumerable<XElement> transunits = doc.Descendants(XName.Get("trans-unit", xnxliff));
string tuid = transunit.Attribute("id").Value;
由于文件是带有XML命名空间的,这里要提前声明,这样对比Xml.Linq确实方便
string xnsdl = "http://sdl.com/FileTypes/SdlXliff/1.0";
string xnxliff = "urn:oasis:names:tc:xliff:document:1.2";
开两个文件得到两组数据,类型如下
Dictionary<Guid, string> keyValuePairs = new Dictionary<Guid, string>();
然后进行比较,这里没有引入自定义类型,使用Dictionary,效率更高
匹配成功的分别存入paired1,paired2并且ID相同,匹配不上的存入unpaired
这样即使两文件差异较大也能存留记录
Dictionary<Guid, string> keyValuePairs1 = ReadSdlxliff(file1, mtOnly, isTarget);
Dictionary<Guid, string> keyValuePairs2 = ReadSdlxliff(file2, mtOnly, isTarget);Dictionary<Guid, string> paired1 = new Dictionary<Guid, string>();
Dictionary<Guid, string> paired2 = new Dictionary<Guid, string>();
Dictionary<Guid, string> unpaired = new Dictionary<Guid, string>();//match
foreach (KeyValuePair<Guid, string> unit1 in keyValuePairs1)
{IEnumerable<KeyValuePair<Guid,string>> selectedUnits = from unit in keyValuePairs2 where unit.Key == unit1.Key select unit;if (selectedUnits.Count() > 0){paired1.Add(unit1.Key, unit1.Value);paired2.Add(unit1.Key, selectedUnits.First().Value);}else{unpaired.Add(unit1.Key,unit1.Value);}
}
开始比较,使用了异地第三方开源的库,支持按字符和按单词的两种文本比较
public enum ComparisonType
{Words,Characters
}
foreach (KeyValuePair<Guid, string> unit1 in paired1)
{StringBuilder cb = new StringBuilder();List<string> list1 = new List<string>();List<string> list2 = new List<string>();list1.Add(unit1.Value);list2.Add(paired2[unit1.Key]);List<ComparisonTextUnit> comparisonTextUnits = comparer.GetComparisonTextUnits(list1, list2, comparisonType);foreach (ComparisonTextUnit u in comparisonTextUnits){switch (u.ComparisonTextUnitType){case ComparisonTextUnitType.Identical:cb.Append(u.Text);break;case ComparisonTextUnitType.Removed:cb.Append("<span class='removed'>");cb.Append(u.Text);cb.Append("</span>");changeRate.Removed += u.Text.Length;changeRate.RemovedCount++;break;case ComparisonTextUnitType.New:cb.Append("<span class='added'>");cb.Append(u.Text);cb.Append("</span>");changeRate.Added += u.Text.Length;changeRate.AddedCount++;break;default:break;}}}
剩下就是输出报告,并且在比较之前可以增加根据TranslationUnit属性,状态做一些筛选
最后项目地址:
https://github.com/Dark-20001/CompareSdlxliff
相关文章:
开源一套Trados Sdlxliff 对比工具
开源一套Trados Sdlxliff 对比工具 在Trados翻译过程中经常对需要进行版本控制和对比,例如对比不同设置下生成的sdlxliff文件,对比不同的机器翻译结果以及对比机器翻译和人工翻译,对比翻译和审校等等。 当然SDL官方也提供了对比工具 https:…...
百度网盘 url 正则表达式
匹配 https://pan.baidu.com/s/1NmVIJiI2Ot8MkI-vxxNPTg?pwdxxxx https://pan.baidu.com/s/[a-zA-Z0-9\-]*(\?pwd[a-zA-Z0-9]{4})?该正则表达式匹配以 https:// 开头,后面跟着 pan.baidu.com/s/ 或 yun.baidu.com/s/,最后跟着一串由大小写字母、数字…...
【stable diffusion】ComfyUI扩展安装以及”127.0.0.1拒绝了我们的连接请求“解决记录
目录 扩展安装”127.0.0.1拒绝了我们的连接请求“解决记录操作1操作2操作3操作4总结扩展安装 虽然大家都推荐将扩展包直接放到extension文件夹的方式,但我还是推荐直接在sd webui的扩展处下载,酱紫比较好维护一点,我个人感觉。 按照上图顺序点击会出现”URLError: <url…...
OceanBase 列存中多列过滤性能解析
今天有同事问我,列存大宽表场景下,如果在多个列上有等值过滤条件,OceanBase 的性能是不是无法满足要求? Hi 晓楚,帮评估个OTS替换场景 大概1亿大宽表,查询姿势就是任意字段的组合,进行等值查询g…...
嵌入式实验---实验二 中断功能实验
一、实验目的 1、掌握STM32F103中断程序设计流程; 2、熟悉STM32固件库的基本使用。 二、实验原理 1、在上一章的实验基础上,添加一个按键和一个LED; 2、使用中断的方式实现以下两个功能: (1)KEY1按键…...
在 Visual Studio 2022 (Visual C++ 17) 中使用 Visual Leak Detector
在 Visual C 2022 中使用 Visual Leak Detector 1 问题描述1.1 内存泄漏的困扰和解决之道1.2 内存泄漏检测工具的选择1.3 VLD的现状 2 安装和设置VLD的环境变量2.1 安装VLD文件2.2 VLD安装后的目录和文件说明2.2.1 include子目录说明2.2.2 lib子目录说明2.2.2.1 目录整理 2.2.3…...
基于IDEA的Maven(properties属性配置)
(property :财产)properties:它的复数。 同样也是基于上篇博客进行学习。(具体的全部项目代码和结构可以去查看上篇...) <properties><!--当前jdk版本 , 这一步可以完全省略--><maven.com…...
边缘计算(Edge Computing)_关键概念/优势/应用场景
边缘计算(Edge Computing)是一种计算范式,它将数据处理和分析从传统的集中式数据中心和云计算平台移至更接近数据生成源头的位置(即“边缘”),例如物联网设备、传感器、路由器或其他边缘设备。边缘计算旨在…...
idea关联gitlab仓库,访问报错
1、登录方式 idea中集成了gitlab的最新版的插件后,登录强制使用token登录,不能使用账号密码登录。 2、版本问题报错 安装了插件后,如果本地部署的gitlab版本低,则直接导致gitlab生成的token也无法登录,操作会报错&am…...
【Hive】new HiveConf()时加载的配置浅析
简单看下源码: org.apache.hadoop.hive.conf.HiveConf HiveConf中有静态代码块,内容就是调用findConfigFile方法,尝试读取hive-default.xml,hive-site.xml,hivemetastore-site.xml,hiveserver2-site.xml。…...
Glide 缓存机制研究及同命名图片的替换回显
背景: 相册-图片后处理场景,需要先展示一张原图,同时后台对图片进行算法优化,完成优化之后无缝替换原图展示,同时保证后续都展示算法优化后的图片 图片加载采用 Glide 库实现 画重点: 相册场景ÿ…...
一键简易桌签(带背景)-Word插件-大珩助手
问题整理: 如何Word中设计简易桌签?如何设置带背景图的桌签? Word大珩助手是一款功能丰富的Office Word插件,旨在提高用户在处理文档时的效率。它具有多种实用的功能,能够帮助用户轻松修改、优化和管理Word文件&…...
如何解决centos停止维护后更换Debian11平替?
再有9天时间centos7.x就将停止维护,最近很多人已经再更换系统了!有推荐alibabacloud,opencloud,debian,ubuntu,centos-stream,tencentos,anolis,rockey,almal,oracle,arch,Fedora,opensuse 很多人不知道选什么,这里就主要介绍一下 如果你是使用宝塔面板 并且想要无缝衔…...
服务器雪崩的应对策略之----熔断机制
熔断机制(Circuit Breaker)是一种保护系统稳定性的重要手段。它的主要目的是防止系统在依赖的服务出现问题时,继续发送请求,从而保护系统免受进一步的影响。熔断机制通过监控请求的成功和失败率,在检测到故障率超过预设…...
RestClient操作索引库和文档
导入依赖: <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.12.1</version></dependency>导入依赖成功之后就可以开始我们的测…...
【设计模式深度剖析】【11】【行为型】【解释器模式】| 以算术表达式求值为例加深理解
👈️上一篇:状态模式 设计模式-专栏👈️ 文章目录 解释器模式定义英文原话直译 解释器模式中的角色1. 抽象表达式(AbstractExpression)2. 终端表达式(TerminalExpression)3. 非终端表达式(Non…...
MySQL8,Navicat能登陆成功,密码却忘记了
执行成功的图: 以下为步骤:本文一共8个简单步骤。 环境:mysql8、window10、navicat11 1、打开本地电脑window10的命令窗(俗称黑窗口),windowR 2、输入regegit,回车,打开注册表 3、…...
游戏中的寻路算法研究
1)Unity NavMesh研究 思考:毫无疑问,unity中自带的navmesh寻路是比较健全的,无奈在服务器中无法使用,这样子我们没办法做怪的导航,但是可以先体验下都有哪些api,并且可以可视化的看效果。 1)打开导航网格…...
【AWS SMB】关于AWS 中小型企业 (SMB) 能力介绍及注意事项
文章目录 前言一、什么是 SMB?📢二、如何识别中小企业的需求三、中小企业营销活动的类型四、AWS 合作伙伴可获得的其他 AWS 机会4.1 AWS IQ4.2 APN 客户参与 (ACE) 计划 前言 AWS 中小型企业 (SMB) 能力合作伙伴专注于帮助中小型…...
中年之恋:重返青春的旅程
第一章:重逢 在一个普通的周末,李明参加了一次由老同学组织的聚会,尽管他对此并不抱有太大的兴趣,但出于礼貌还是选择了出席。聚会在一家风格复古的咖啡馆里举行,暖黄色的灯光与木质的装饰让人不自觉地放缓了脚步。在…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程
鸿蒙电脑版操作系统来了,很多小伙伴想体验鸿蒙电脑版操作系统,可惜,鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机,来体验大家心心念念的鸿蒙系统啦!注意:虚拟…...
向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...
