网站轮播图,酒店建筑设计网站,推广是干嘛的,西安单位网站建设开源一套Trados Sdlxliff 对比工具
在Trados翻译过程中经常对需要进行版本控制和对比#xff0c;例如对比不同设置下生成的sdlxliff文件#xff0c;对比不同的机器翻译结果以及对比机器翻译和人工翻译#xff0c;对比翻译和审校等等。
当然SDL官方也提供了对比工具 https:…开源一套Trados Sdlxliff 对比工具
在Trados翻译过程中经常对需要进行版本控制和对比例如对比不同设置下生成的sdlxliff文件对比不同的机器翻译结果以及对比机器翻译和人工翻译对比翻译和审校等等。
当然SDL官方也提供了对比工具 https://appstore.rws.com/Plugin/43?tabreleases 但官方的这种是基于TradosAPI的比较笨重可定制化程度不高因此还是单独又制作了一个sdlxliff对比工具 https://github.com/Dark-20001/CompareSdlxliff/
这个和官方工具不同官方使用Trados内置API来做因此2017201920212022各个版本都不一样要下载对应的版本所以此版本按照xliff文件标准来执行独立运行不依赖于Trados.
程序不是XML直接读取sdlxliff因为sdlxliff会以base64编码形式讲小于25MB的文件编入sdlxliff这部分其实意义不大所以我跳过这个部分。sdlxliff这么多年也应该改进一下了这种基于xml的文件结构经常出现问题越来越多的软件企业使用zip格式二次封装文件这样能够将不同独立的组件部分嵌入部分进行分离例如docxxlsx
string line1 xlifflines.First();
Liststring base64lines new Liststring();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 cc1; 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
IEnumerableXElement 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;开两个文件得到两组数据类型如下
DictionaryGuid, string keyValuePairs new DictionaryGuid, string();然后进行比较这里没有引入自定义类型使用Dictionary效率更高 匹配成功的分别存入paired1paired2并且ID相同匹配不上的存入unpaired 这样即使两文件差异较大也能存留记录
DictionaryGuid, string keyValuePairs1 ReadSdlxliff(file1, mtOnly, isTarget);
DictionaryGuid, string keyValuePairs2 ReadSdlxliff(file2, mtOnly, isTarget);DictionaryGuid, string paired1 new DictionaryGuid, string();
DictionaryGuid, string paired2 new DictionaryGuid, string();
DictionaryGuid, string unpaired new DictionaryGuid, string();//match
foreach (KeyValuePairGuid, string unit1 in keyValuePairs1)
{IEnumerableKeyValuePairGuid,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 (KeyValuePairGuid, string unit1 in paired1)
{StringBuilder cb new StringBuilder();Liststring list1 new Liststring();Liststring list2 new Liststring();list1.Add(unit1.Value);list2.Add(paired2[unit1.Key]);ListComparisonTextUnit 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 classremoved);cb.Append(u.Text);cb.Append(/span);changeRate.Removed u.Text.Length;changeRate.RemovedCount;break;case ComparisonTextUnitType.New:cb.Append(span classadded);cb.Append(u.Text);cb.Append(/span);changeRate.Added u.Text.Length;changeRate.AddedCount;break;default:break;}}}剩下就是输出报告并且在比较之前可以增加根据TranslationUnit属性状态做一些筛选
最后项目地址 https://github.com/Dark-20001/CompareSdlxliff