SDLX是SDL公司早期的一款本地化翻译工具,在2006年至2011年左右比较流行,SDL将SDLX和Trados合并打包在一起作为Translation Suite整体发布,同时SDLX还多年作为SDL 企业级系统TMS(Translation Manage System)的默认编辑器。SDLX是我个人比较喜欢的本地化翻译工具之一。
SDLX 分为三个版本:
版本 | 价格 | 说明 |
---|---|---|
Lite版 (简易版) | 免费 | Lite版功能有限,不能建立和转换文件,仅能编辑和保存双语文件ITD(仅限于Elite) |
Pro版(专业版) | 在Translation Suite中附带 | 专业版是最常见的版本提供了丰富的功能包括制作双语文件ITD,专业版的文件只能在专业版中编辑,不能在Lite版使用 |
ELite版(精英版) | 需单独许可 | TMS生成的ITD默认为Elite版本,只有带有Elite标记的ITD双语文件才能被Lite版本编辑 |
ITD是SDLX的双语文件格式,同时SDLX完全兼容Trados TTX文件,打开后是这样
不同于基于XML的TTX文件类型,ITD是二进制的文件类型,不能用记事本打开查看,ITD本质上来说是两个文件一个otf,存储的是翻译语言资源,另一个是skl文件skeleton,记录了文件的结构信息。
不仅双语文件格式不同,SDLX的翻译记忆库和术语库文件格式也和Trados完全不同,SDLX使用MDB,本地Access数据库格式作为翻译记忆库,通知支持本地或远程SQL Server作为翻译记忆库数据存储,专业版就可以使用SQL Server,而对比其他产品以及现代产品SQL Server的使用通常要达到企业及应用才行,投入也是相当多的
SDLX使用C++编写,代码和接口不公开,因此不太容易调用,只能通过一些逆向的方法解决。知道后来我遇到了SDLX软件的作者才了解到更多的信息。
调用SDLX需要使用SDLX提供的一些Interop,比如Interop.S42ITDLib.dll
https://download.csdn.net/download/dark_2001/12354777
S42ITDLib
S42代表SDLX和版本
ITDLib提供了ITD文件的操作
以下列代码为例:
首先引用Interop.S42ITDLib.dll
,命名空间加入
using S42ITDLib;
然后实例化对象
S42ITDObjClass SDLXITD = new S42ITDObjClass();
通过OpenITD和SaveITD的方法打开和关闭文件
SDLXITD.OpenITD(filename);
//todo
SDLXITD.SaveITD(filename);
不仅可以操作ITD文件还可以操作TTX文件:
SDLXITD.OpenTTX(filename);
SDLXITD.SaveTTX(filename);
打开ITD文件后可以通过GetSegmentCount方法获取一共有多少和Segment
int segCount = 0;
SDLXITD.GetSegmentCount(out segCount);
然后遍历获取Segment, Segment编号从1开始,不是0
for (int i = 0; i < segCount; i++)
{
SEG_INFO segInfo;
SDLXITD.GetSegmentInfoEx(i + 1, out segInfo);
}
Segment信息存在于SEG_INFO 对象中,常用的包括:
string source = segInfo.bstrSource
int score = segInfo.nScore
int confirmed = segInfo.bConfirmed
int MachineTranslated = segInfo.bMachineTranslated
int FormatPaintIgnored = segInfo.bFormatPaintIgnored
int FormatPaintRequired = segInfo.bFormatPaintRequired
int Locked = segInfo.bLocked
SDLX不适用boolean布尔值,以数字代替,非零为真,零为假
修改segment属性后通过
SDLXITD.UpdateSegmentEx(ref segInfo);
进行更新
SDLX 还提供了一个查找和替换的方法SDLXITD.SearchReplace:
SEARCH_REPLACE_INFO srInfo = new SEARCH_REPLACE_INFO();
srInfo.bMatchCase = 1;
srInfo.bstrLogFile = "";
srInfo.bWholeWord = 0;
srInfo.nOperation = 2;//0|1|2-replace
srInfo.nSearchLocation = 2; //0|1|2-target
srInfo.bstrReplace = "x";
srInfo.bstrFind = "a";
SDLXITD.SearchReplace(ref srInfo);
个人的一些具体例子已开源在
https://github.com/Dark-20001/SDLX