魂游 MOD 翻译工具文档

文档是为 MOD 翻译者准备的,内部包含了较多的技术和使用细节,如果您只是想简单地机翻一个 MOD,那么您可以到此结束,请直接去看这个视频即可。

1. 软件概念和使用

这一节将会从软件的原理、工作流等对软件进行基本介绍。

1.1 工作流

下图展示了软件的基本工作流。

简单来说,软件首先通过对照中英数据库的方式找到所有的新文本,紧接着基于额外的术语表对新文本做预处理(可选),然后将预处理后的中英夹杂的新文本导出为 Excel 或者 txt 格式。最后,软件将翻译者通过谷歌或人工翻译的方式翻译完成的新文本和之前产生的旧文本(已翻译)合并为新的语言文件并写入磁盘。

 

1.2 文本和 ID

为了方便标新文本的导入导出以及新旧文本的合并工作,软件在内部处理时候会为每一条文本分配一条唯一的 ID(即导出的 Excel 和 txt 的每一行的第一列),因此,在翻译导出文本时候请勿修改 ID

1.3 中英对照数据库

中英对照数据库是软件提供的第一级翻译,即基于文本(包括段落和行)的对照和替换功能。具体来说,中英对照数据库是一个键值对集合,键是英文文本,值是对应的中文文本翻译。在翻译某个 mod 时,软件会遍历 mod 中的每一条英文文本,并在中英对照数据库中查询是否存在对应的翻译,如果存在则将改条标记为已翻译,不存在则标记为未翻译并导出。

软件提供了默认的原版数据库和自定义数据库的生成功能。如果你的翻译目标是全新的 mod,则使用软件提供的原版数据库即可,而如果你的需求是将旧版 MOD 的已有翻译合并到新版本中,那么你需要基于旧版本 MOD 的已有英文和中文文本生成自定义对照数据库。软件在启动时会自动识别db目录下的所有对照数据库文件(即json),因此在使用自定义数据库时请将生成的对照数据库放置与 db 目录,并在导出未翻译文本时选中对应的数据库。

1.4 术语表

1.4.1 简介

术语表是软件提供的第二级翻译,它是在导出的未翻译文本的基础上进行的。它的主要作用是对未翻译文本中的术语进行指定翻译。比如为了防止机翻人名地名时出现错误可以提前在术语表中填入对应的翻译,然后在导出未翻译文本时软件会自动将其中的英文文本替换为中文(替换规则会在下文中详述)。例如,有一条文本:

如果不使用术语表直接导出然后使用谷歌翻译后得到的中文文本很可能是:

而在使用术语表的情况下可以强制使导出的文本变成:

在上述情况下进行导出返回使用谷歌翻译得到的中文文本很可能是:

1.4.2 使用方法

要使用这一功能,首先得定义术语表,即术语的中英文对照。术语表也是json格式的文本文件,其格式如下所示:

如上表所示,术语表内的术语一共分为两类,普通短语(phases)以及正则(regex)。

普通短语会基于边界替一个句子中的连续的单词序列。例如定义术语"Hello world": "你好世界",那么对于句子He say: Hello world is a simple sentence.会被正常替换为He say: 你好世界 is a simple sentence.。而对于HelloworldHHello worldHello worlderHello the world等均不会被替换。此外,如果有多个正确的匹配,软件会优先匹配较长的,比如对于句子Roderika's knight,术语表中对Roderika以及Roderika's均定义了术语,那么无论这两个术语在词汇表中的排序如何,软件均会优先匹配较长的一个,即Roderika's

正则即简单的基于正则的匹配,可以基于正则表达式对句子中的部分词汇做替换。不同正则之间按照其在词汇表内的顺序进行匹配。由于正则表达式的教程不属于本文档中的内容,因此此处不再赘述,有兴趣的可以前往https://regexlearn.com/zh-cn学习。

最后,对于一个词汇表,普通短语的匹配规则永远都比正则更高

在实际使用时可以同时使用多张术语表,此时,位于列表前面的术语表具有更高的优先级

1.4.3 性能和局限性

在进行术语表替换时,由于未翻译文本中的每个句子都要与每一条术语进行匹配和替换,因此术语表会带来较多的性能开销,在实际使用时如果术语太多(几千条)软件会无响应一段时间.因此,请控制术语表内术语的数量,最好只有人名地名以及极高频词汇才使用术语表定义。

另外,对于机翻人员,免费文档翻译引擎在处理中英混杂的文本时往往达不到较好的效果,翻译后的中文文本中也偶尔包含一些未翻译完全的英文文本,经作者的筛选,谷歌翻译已经是效果相对最好的的免费翻译引擎了。

综上所述,术语表功能请理性使用,过量使用可能会造成软件导出过慢以及机翻质量不佳等问题。

 

技术细节

文本的切分和编号

对于 FS 游戏中的语言文件(.msgbnd.dcx 文件),其内部是树状组织的,一条完整的文本可以由类型_ID来表示,其中类型是 ASCII 字符串,如 WeaponName,WeaponCaption 等。ID 是一串长数字,标识了该条文本在其类型内的 ID。例如,"石剑钥匙"这一物品的文本描述为:

其文本类型是GoodsCaption,文本 ID 是 8000。

因此,翻译软件会根据这一索引为每一条文本设置基本的 UID。另外,为了尽量利用原版文本,软件还会在每条文本内部进行进一步的切分,即为每条文本内的每一个段落和每一行分配各自的 ID。还是以上述文本为例,下表列出了每一句话的 ID。

段落(句子)文本内 ID
参考剑的外型设计的石制钥匙。1
能解开小恶魔像的封印。
使用后会插在雕像上,从置物包消失。
2
能解开小恶魔像的封印。21
使用后会插在雕像上,从置物包消失。22
建议慎选使用时机。3

段落被分配的 ID 永远是 1~9 之间的一个数字,而段落内每句话被分配的 ID 永远是 11~99 中间的一个数字(所有索引以 1 开头,不含整除 10 的数字),因此软件无法处理超过 9 段话的文本以及超过 9 行的句子。

句子的文本内 ID 和文本 ID"类型_ID"一同构成了文本的唯一 ID。

正则表达式的构建

TODO