BasicCAT 使用手册¶
简介¶
BasicCAT是一款开源的计算机辅助翻译软件,旨在为译员提供简单实用的翻译工具。取名BasicCAT,一是因为它简单易用,二是因为它使用Basic语言编写,普通人花上一段时间学习后也能掌握,从而在BasicCAT源代码的基础上修改出适合自己需要的软件。
软件具有以下功能:
- 翻译记忆
- 术语管理
- 语言检查
- 划词取义
- 快速填充
- 自动更正
- 交互式机器翻译
- 导出Word供外部审校
- 导出双语段落对照文件
- 导出带备注的Markdown文件
- 句段分割与合并
- 调用多种在线词典
- 常见机器翻译服务的API调用
- 支持利用翻译记忆与机器翻译进行全文预翻译
- 支持常见源文件格式:txt, idml, xliff, gettext po
- 支持翻译记忆标准TMX、术语管理标准TBX和句段分割标准SRX
- 支持在线共享翻译记忆与术语
- 使用Git进行版本控制与团队协作
快速入门¶
新建项目¶
菜单栏点击File->New,选择建立英译汉(en to zh)、汉译英(zh to en)项目或者其它语言对的项目,会自动生成翻译记忆库和术语库等项目文件。

选择其它语言对时你也可以自己输入所需的遵循ISO639标准的语言代码,具体说明见此。

新建项目后要进一步操作需要先保存项目。
添加文件¶
打开项目后在左侧会显示一列项目,可以操作项目文件、翻译记忆、术语库,查看统计信息和预览。

我们在Project Files上右键,可以添加文件或者添加文件夹。

添加文件后点击文件名,可以打开该文件进行翻译,并进入下图的界面。每个功能分区都已在图中标出。在原文右边的编辑框中输入文字即可开始翻译,一个片段完成后按回车切换到下一片段。

翻译记忆¶
片段翻译完成后按回车,该条翻译的内容就会自动加入翻译记忆库。在遇到相似的片段时,便会在下方显示。点击该条结果即可将译文填充进译文输入框。

翻译记忆的匹配率可以点击菜单栏Project->Project Settings进行设置。匹配率须在0.5到1.0之间。

添加外部翻译记忆¶
BasicCAT的翻译记忆库分为项目记忆库和外部记忆库。项目记忆库存储项目文件的翻译记忆,而外部记忆库显示外部导入的翻译记忆。
点击菜单栏Project->Project Settings,选中TM一栏设置可以进行外部翻译记忆的管理。
支持导入TMX格式和Tab分割的txt文件,txt文件要求原文在前,译文在后,以tab进行分割。添加文件时会显示一个预览窗口,便于检验导入的内容是否正确。


模糊匹配到外部记忆库的片段时,会在下方显示,并显示来自哪个记忆库文件。翻译记忆中的原文、当前要翻译的原文和翻译记忆中的译文会在差异显示区显示。

术语管理¶
在翻译过程中遇到术语,可以在原文和译文中选中对应的文本,然后点击术语区的Add Term添加术语。BasicCAT利用opennlp自然语言处理工具对词型进行还原,避免保存的是词语的复数形式而匹配不到词语的单数形式等问题。

在显示的术语条目上右键,可以查看更多信息和修改历史。

注意
考虑到导入的外部术语库可能有上万条内容,为了优化匹配的速度,采用的HashMap的算法,只能对要翻译的原文进行词型还原。所以平时添加术语最好还是添加原形,方便导入其它项目。
术语的导入和翻译记忆的导入类似,支持的文件类型是TBX和Tab分割的TXT文件。
术语的管理界面也和翻译记忆的类似,不同之处在于术语可以添加标签和备注进行管理。

片段操作¶
BasicCAT利用SRX分割标准对原文进行分割。片段多为一个句子或者一个单独成段的短语。
片段合并与分割¶
遇到下图这样的人名分割错误的情况,我们可以点击原文的末尾,然后按Delete键进行句段合并操作。

如果句段属于不同的文件或者翻译单元,将不能进行合并。word中的不同段落,indesign中不同的story文件都属于这种情况。

BasicCAT对不需要显示的格式标签进行了隐藏处理,如果合并的片段带标签,也会进行提示。此时可以选择继续进行合并,但可能会显示出较为复杂的标签。

遇到下图这样需要在分号处进行分割的片段,将光标定位到分号后,按Enter键进行分割。

忽略片段¶
英译汉时常碰到前一片段和后一片段意思有重复,只需翻译后一片段的情况。这时可以忽略前一片段。这样,生成译文时会自动忽略这一片段。可以通过点击菜单Edit->Mark the current segment as neglected进行设置。
设置忽略的片段的编辑区会变成灰色不可用状态。

添加备注¶
翻译中碰到较难的句子,可以进行备注,记录为什么这样翻。点击菜单栏Edit->Show/Edit notes of the current segment进行查看或修改操作。

含有备注的片段的译文编辑框会显示一圈绿色。

进阶操作¶
机器翻译¶
BasicCAT预置了以下12种机器翻译引擎的API的支持:
调用结果如下图。

您需要申请翻译API以实现调用,每个机器翻译申请的链接已经附在上面的列表中,其中MyMemory只需要配置一个email地址即可使用。划词检索和自动完成功能需要至少配置一个机器翻译才能使用。
点击菜单Options->Preferences进入设置界面,选择Machine Translation进行翻译API的配置。


机器翻译的API服务都有使用限制,百度和微软每个月200万词免费额度;MyMemory每天10000词;Yandex每天1百万词,每月不超1千万词。其它需要付费使用,小牛和有道注册时会附赠百万词的额度。
预翻译¶
预翻译指利用翻译记忆或者机器翻译预先对全文进行翻译。点击菜单Project->Pre-translate打开对话框,选择使用翻译记忆或者机器翻译进行预翻译。可以设置翻译记忆的最低匹配率和选择使用哪个机器翻译引擎。


划词取义¶
利用机器翻译和在线词典API,BasicCAT提供划词检索功能。在原文中选中需要检索的部分,可以显示机器翻译或者在线词典的内容。需要在设置中勾选这一功能,并配置至少一个机器翻译。

点击出现的下拉框中的项目可以把结果添加到译文输入框。
在线词典¶
因为离线词典往往具有版权问题,所以BasicCAT选择了集成在线词典。
在原文中选中一个单词后,点击菜单Edit->Show online dictionary dropdown,或者使用快捷键Ctrl+D,会出现包含一串在线词典名字的下拉列表。点击后会打开一个浏览窗口。



选中想输入的释义后,按Add Selected可以填充进译文输入框。按Open in browser可以使用本地浏览器访问该页面。
你可以通过修改项目文件夹下的config文件夹里的dictList.txt添加其它在线词典。
语言检查¶
BasicCAT利用 Language Tool 作为语言检查的后端。Language Tool是一款开源的拼写和语法检查器。
在一个片段翻译完成,按下回车切换到下一片段后,会对上一片段进行检查。如果有错误,会在下方的功能区进行提示,并在输入框位置显示一个备选正确内容的下拉列表。点击功能区的replacement项目或者下拉列表的项目可以替换译文中的错误为正确的内容。

要使用语言检查,你可以选择直接使用LanguageTool的API(默认地址:https://languagetool.org/api/v2/check),或者下载LanguageTool后在本地运行。
下载后解压至任意位置,然后打开BasicCAT,点击菜单Tools->Server Launcher,打开服务启动器的窗口,选择存放languagetool-server.jar这一文件的文件夹。然后点击Start LanguageTool Server的按钮后可以在本地运行LanguageTool的离线服务。

可以用浏览器访问 http://127.0.0.1:8081/v2/check?text=a%20example&language=en-US 来判断服务是否运行。
除此之外,你还要设置启用语言检查。点击菜单Options->Preferences,进入Language Check页面,勾选启用语言检查。

你还可以设置每次以下拉列表形式给出建议的最大数量,以免有的时候显示的建议太多。
自动完成(交互式机器翻译)¶
自动完成对原文进行分词,并利用斯坦福自然语言处理工具进行句法分析,提取短语,所得的片段利用机器翻译进行翻译,如果在翻译过程中输入的字是某个片段的开头,那这一片段的译文会以下拉列表的形式供用户选择是否使用。

对于汉译英,还可以用于快速输入英文单词。

要使用自动完成,需要下载斯坦福自然语言处理软件。
官网地址:https://stanfordnlp.github.io/CoreNLP/index.html
百度网盘(备用):https://pan.baidu.com/s/1LNW4IDw8Viz6RURmzqxI9Q
需要下载corenlp和中文的模型文件。下载完成后解压corenlp-full的zip文件到任意位置,把中文模型文件放入解压的目录,然后点菜单Tools->Server Launcher,选择文件夹位置后点Start CoreNLP Server按钮启动。
可以用浏览器访问 http://127.0.0.1:9000 来判断服务是否运行。
和Language Tool一样,还需要设置启用自动完成。点击菜单Options->Preferences,进入Autocomplete页面,勾选启用自动完成。
如果想使用运行在远程服务器的corenlp,可以通过修改链接来调用。
你还可以设置每次以下拉列表形式给出建议的最大数量,以免有的时候显示的建议太多。
快速填充¶
翻译过程中我们常常需要输入特殊的符号,或者需要多次输入同一串文本。BasicCAT支持定义快速填充项目,在翻译时使用快捷键Ctrl+Q或者点击菜单Edit->Show quickfill dropdown来显示快捷输入用的下拉列表。如果匹配到术语,也可以设置包含进去。

快速填充的设置需要点击菜单Project->Project Settings,切换到Quickfill栏目。

自动更正¶
自动更正是借鉴自Word的一项功能,可以检测输入的内容,对内容进行修正。比如英译汉时需要输入中文的标点符号,可以设置错误地输入英文标点符号时自动更正为中文标点。我们也可以用它来快速输入内容。比如rst是restructuredText的缩写,设置自动更正后,每次输入rst,内容就会自动变成restructuredText。

点击菜单Project->Project Settings,切换到AutoCorrect栏目进行设置。

导出Word以供审校¶
BasicCAT支持导出翻译的内容至Word中,利用Word的审校功能进行审校。
在所需导出的文件上右键,点击Export to->docx for review,可以导出docx文件。


完成审校后,可以从Word文件将修改结果导回。在文件名上右键,点击Import form review。

你可以一条一条地重新确认,也可以直接用审校的内容替换原来的翻译。

翻译各种格式的文件¶
纯文本文件¶
txt纯文本文件没有额外的标签信息,所有片段都支持合并与拆分。
IDML文件¶
IDML是Adobe InDesign使用的基于XML的文件格式。最新版的InDesign生成的文件要想给老版本的InDesign打开,往往便要使用IDML格式。一般InDesign的文件都保存为indd。indd是专有格式,不能被第三方软件进行解析,所以要翻译InDesign文件需要先将其转换为IDML文件。
IDML其实是一个zip压缩文件,里面的文件结构如下:
.
├── META-INF
│ ├── container.xml
│ └── metadata.xml
├── MasterSpreads
│ └── MasterSpread_udd.xml
├── Resources
│ ├── Fonts.xml
│ ├── Graphic.xml
│ ├── Preferences.xml
│ └── Styles.xml
├── Spreads
│ ├── Spread_uc8.xml
│ ├── Spread_uce.xml
│ └── Spread_ucf.xml
├── Stories
│ ├── Story_u106.xml
│ ├── Story_u11d.xml
│ ├── Story_u134.xml
│ ├── Story_u151.xml
│ └── Story_ued.xml
├── XML
│ ├── BackingStory.xml
│ └── Tags.xml
├── designmap.xml
└── mimetype
我们要关注的主要是designmap.xml文件、Spreads文件夹、Stories文件夹和Resources文件夹的内容。
designmap.xml是整个文件的大纲,spread文件是每个页面的结构,story文件则是spread里文本框存储的文本。Fonts.xml保存了字体信息,Styles.xml保存了样式信息。
BasicCAT分别读取designmap.xml文件和Spreads文件,获得story文件在原文中的显示顺序,然后对其文本进行提取。
下面是一个Story文件的内容:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<idPkg:Story xmlns:idPkg="http://ns.adobe.com/AdobeInDesign/idml/1.0/packaging" DOMVersion="13.0">
<Story Self="u19caf" AppliedTOCStyle="n" UserText="true" IsEndnoteStory="false" TrackChanges="false" StoryTitle="$ID/" AppliedNamedGrid="n">
<StoryPreference OpticalMarginAlignment="false" OpticalMarginSize="12" FrameType="TextFrameType" StoryOrientation="Horizontal" StoryDirection="LeftToRightDirection" />
<InCopyExportOption IncludeGraphicProxies="true" IncludeAllResources="false" />
<ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/Intro Copy">
<CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]">
<Content>“No capes!” That’s what Edna says in the first film when Mr. Incredible wants a cape on his new Supersuit. She knows that capes can be dangerous for Supers. A cape caused one Super to get pulled into a jet turbine, and another was sucked into a spinning </Content>
</CharacterStyleRange>
<CharacterStyleRange AppliedCharacterStyle="CharacterStyle/Intro Copy Bold">
<Content>vortex</Content>
</CharacterStyleRange>
<CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]">
<Content>. Capes could cause other problems, too. Let’s see what they are.</Content>
</CharacterStyleRange>
<CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]" FillColor="Color/Black" FontStyle="300" PointSize="12">
<Properties>
<Leading type="unit">20</Leading>
</Properties>
<Br />
</CharacterStyleRange>
</ParagraphStyleRange>
<ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/Body Copy">
<CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]" />
</ParagraphStyleRange>
</Story>
</idPkg:Story>
段落信息保存在ParagraphStyleRange这个标签里,一个ParagraphStyleRange标签可以包含很多CharacterStyleRange标签,里面是具体的文本。IDML文件中的样式分为全局样式和本地样式,全局样式存储在styles.xml文件中,story文件通过AppliedParagraphStyle和AppliedCharacterStyle保存对应的全局样式名,而本地样式被定义在属性和Properties元素里,比如PointSize、FontStyle等。
上面的story文件,BasicCAT将其转换为以下带标签的文本。
<p16><c0>“No capes!” That’s what Edna says in the first film when Mr. Incredible wants a cape on his new Supersuit. She knows that capes can be dangerous for Supers. A cape caused one Super to get pulled into a jet turbine, and another was sucked into a spinning </c0>
<c3>vortex</c3>
<c0>. Capes could cause other problems, too. Let’s see what they are.</c0>
<c0 id="3">
</c0>
</p16>
<p3><c0></c0>
</p3>
上例中 p16
, c0
中的数字对应的styles.xml文件中某个全局样式的顺序。而 <c0 id="3">
中的id属性则是story中characterstylerange的顺序,用于生成目标文件时读取本地样式。c0对应的是默认的没有特殊格式的样式,所以BasicCAT在显示的原文中对其进行隐藏。另外段落标签和文本内容为非文本的标签也可以进行隐藏。
最终,上述内容在BasicCAT中是这样显示的:

其中c3标签对文字进行了加粗。英文字体一般有很多字重,比如特细、细、常规、粗等,而中文字体一般只有一种常规体。平时在Word里可以设置汉字的加粗是通过软件算法实现的,而IDML中是通过设置字重来实现的。所以,为了保证英译汉时,标签的效果在生成的译文中也有效,BasicCAT采用具有7种字重的思源宋体作为中文的显示字体,并将英文的字重转换为对应的思源宋体的字重。其对应关系如下:
- 100->ExtraLight
- 200->ExtraLight
- 300->Light
- 400->Regular
- 500->Medium
- 600->SemiBold
- 700->Bold
- 800->Heavy
- 900->Heavy
- Normal->Regular
- Black->Heavy
所以,为了在生成的idml文件中显示中文,需要安装思源宋体。
idml中的标签不是必须翻译的,如果不翻,BasicCAT会自动补充c0标签,保证译文不被忽略。
XLIFF文件¶
XLIFF是处理提取出来的待翻译文本的一种XML格式。CAT软件利用这一格式存储从docx、html、idml等格式文件提取出来的文本,翻译完成后再利用这一格式文件生成目标文件。
XLIFF是OASIS组织制定的标准,可以作为一种中间格式,在不同的翻译软件之间使用。
XLIFF利用继承自opentag的抽象占位符标签和继承自tmx的封装标签来表示特殊样式。
比如对于This is bold,在xliff中有两种表示方法。
占位符标签:
<trans-unit id="1">
<source>This is <g id="1">bold</g>.</source>
</trans-unit>
封装标签:
<trans-unit id="1">
<source>This is <bpt id="1">\b</bpt>bold<ept id="1">\b0</ept>.</source>
</trans-unit>
抽象占位符标签的好处是针对不同格式,抽象出来的内容可以一样。比如html、rtf中表示加粗,html是 <b>
,而rtf中是 \b
,抽象之后都变成了g标签,而且显示的内容更少。但是抽象之后,原文标签中的含义也被隐去了。
在BasicCAT中翻译xliff中带格式的内容时,会显示各种标签内容。标签内容如果不翻,生成的译文中会自动在结尾处补上缺失的标签,但有可能导致译文内容缺损。
注意
标签内容如果不翻,生成的译文中会自动在结尾处补上缺失的标签,但有可能导致译文内容缺损。
以下是教程idml部分的范例文件用okapi提取出来的xliff文件的内容:
<?xml version="1.0" encoding="UTF-8"?>
<xliff version='1.2'
xmlns='urn:oasis:names:tc:xliff:document:1.2'>
<file original="Stories/Story_u19caf.xml" source-language="en-US" target-language="zh-CN" datatype="xml">
<body>
<trans-unit id="NB085C0FA-tu1" xml:space="preserve">
<source xml:lang="en-US"><g id="1">“No capes!” That’s what Edna says in the first film when Mr. Incredible wants a cape on his new Supersuit. She knows that capes can be dangerous for Supers. A cape caused one Super to get pulled into a jet turbine, and another was sucked into a spinning </g><g id="2">vortex</g><g id="3">. Capes could cause other problems, too. Let’s see what they are.</g></source>
<target xml:lang="zh-CN"><g id="1">“No capes!” That’s what Edna says in the first film when Mr. Incredible wants a cape on his new Supersuit. She knows that capes can be dangerous for Supers. A cape caused one Super to get pulled into a jet turbine, and another was sucked into a spinning </g><g id="2">vortex</g><g id="3">. Capes could cause other problems, too. Let’s see what they are.</g></target>
</trans-unit>
</body>
</file>
</xliff>
上述内容在BasicCAT中是这样显示的,对片段中开头结尾处的成对标签或单个标签进行了隐藏:

PO文件¶
PO是和xliff类似的一种格式,最初是GNU用来本地化C语言程序的。
以下是教程idml部分的范例文件用okapi提取出来的po文件的内容:
msgctxt "okpCtx:sd=197:tu=NB085C0FA-tu1"
msgid "<g1>“No capes!” That’s what Edna says in the first film when Mr. Incredible wants a cape on his new Supersuit. She knows that capes can be dangerous for Supers. A cape caused one Super to get pulled into a jet turbine, and another was sucked into a spinning </g1><g2>vortex</g2><g3>. Capes could cause other problems, too. Let’s see what they are.</g3>"
msgstr ""
msgctxt后面是上下文信息,msgid存储原文内容,msgstr存储译文内容。okapi生成的PO也使用了标签来表示特殊样式。
上述内容在BasicCAT中是这样显示的,和xliff一样,对片段中的开头结尾处的成对标签或单个标签进行了隐藏:

PDF文件¶
PDF文件是较难处理的格式,可以用Word、ABBYY、Solid Document Converter等工具将其转换为Word,但原来的格式往往不能得到很好的保留。用Adobe Acrobat可以修改文字,但有诸多限制。
PDF文件往往是由另一种格式的文件生成的,比如docx、idml等,如果能找到源文件是最好的。如果要求保留格式却又没有源文件,只能翻译后试着重新排版。
在出版社翻译InDesign文件,一般交给译员一个PDF文档,译员将译文排版成一个Word,然后交给排版人员在InDesign中进行替换。这时,我们需要做的就是提取PDF的文字进行翻译。
BasicCAT自带了PDF转文字的工具,可以通过菜单栏Tools->PDF2TXT打开。如果PDF的文字可以提取,那可以直接提取出来。如果不行,便使用开源的OCR软件tesseract进行识别。
工具支持添加页码信息,还可以针对InDesign生成的对页进行处理。

PDF中的文字是没有段落信息的,所以默认提取出来的每行文字后面都有回车,PDF2TXT提供一个reflow功能,可以自动去除多余的回车。
关于tesseract的安装,Windows可以 在此 下载一份程序,运行PDF2TXT时会提示设置tesseract的路径,选择即可。
Linux和macOS(homebrew)用户可以直接安装tesseract-ocr这个包,并下载对应语言的模型文件。
利用Okapi翻译其它格式文件¶
Okapi 是一套开源跨平台的翻译组件。有用于检查译文质量的checkmate、修改句段分割规则的Ratel,还有用于执行各种翻译与本地化任务的Rainbow。
要翻译其它格式文件,我们主要需要使用Rainbow。
- 从源文件生成xliff或者po文件
打开Rainbow,把要翻译的源文件拖拽进去。

进行原文和译文、文件编码等设置。

点击菜单Utilities->Translation Kit Creation,选择要生成xliff、po还是其它中间格式,选择生成的目标位置(默认为源文件所在目录)。

点击执行后,在目标位置会生成一个pack1文件夹,里面的work文件夹存放了生成的xliff等格式文件。
- 从生成的项目导出目标文件
翻译完成后,把xliff等格式文件放回work文件夹。然后添加manifest.rkm到Rainbow中。

点击菜单Utilities->Translation Kit Post-processing,可以生成目标文件。
在此 查看Okapi支持的文件格式。
BasicCAT从1.5版开始集成了Okapi Tikal,可以自动将其它格式文件转换为XLIFF文件,并自动根据翻译好的XLIFF文件生成目标文件。不过,如果你需要修改Okapi处理某种格式时使用的参数,仍然需要使用Rainbow。
团队协作¶
共享翻译记忆、术语¶
利用BasicCAT的服务器端程序,可以架设用于共享翻译记忆和术语的服务。该程序可以在BasicCAT的下载页面获取。
客户端需要进行相关设置,设置完成后即可实时共享翻译记忆与术语。

服务器程序运行的方法(需要安装java8以上版本):
$ nohup java -jar CloudKVS_Server.jar &
你可以修改程序所在目录下key.txt来添加一个访问密钥。密钥目前只支持单行内容。
基于Git进行团队协作¶
BasicCAT可以在本地生成git仓库,添加remote uri和账号密码后即可把本地的记录上传到远程,并与其它用户进行协作。每次请求git push时,程序会自动从远程仓库获取最新的变动,并更新本地文件,然后将本地的修改进行上传。BasicCAT会根据片段修改的时间自动解决冲突,基本不会发生冲突的情况。
需要在项目设置里设置远程仓库地址并选择是否每次执行保存操作时把修改上传到远程仓库。你需要在偏好设置里先设置好git账户。

你也可以通过菜单手动进行git的相关操作。

基于Git的协作并不同步翻译记忆与术语,只同步工作文件。