序言
本文并非高深的技术文章,只是将一个.Net 程序的完整汉化过程做了说明,文中用到的主要工具有 Radialix 、 SDL Passolo 2009 、 DotNet Helper 、 Beyond Compare 以及 EditPlus 等,探讨了以上工具的综合运用。
示例软件
Subtitle Edit 是一个开源免费的字幕处理软件,开发语言为C#,虽然作者提供了源代码下载,但一则可能是系统环境原因,所供源码包本人未能成功编译;另外感觉汉化源代码还不如通过反编译汉化来的方便。
Radialix 初步汉化
不得不说 Radialix 真得很牛X,尽管其稳定性有待改善,但对汉化人员仍提供了很大的支援。Radialix 可以直接读取 .Net 程序的资源。 新建一个 Subtitle Edit 本地化方案:
可以勾选"提取非标资源"并在目标设置中选择"创建本地化文件"。
翻译标准资源没有多少技巧。需要说明的是,在 Radialix 中对窗体控件的调整,有时显示的大小与位置并不一定与目标文件的相一致:
当出现此问题时,可以先选中该控件,并切换到资源标签进行检查:
这时我们需要做的是,在资源标签内的翻译部分直接修改出预期的数值,而不必考虑工具栏上显示的数值。
利用 Radialix 翻译非标资源,与翻译标准的字符串资源一样,只是非标资源的初始状态为只读,需要进行切换,可利用鼠标右键菜单或快捷键 Ctrl+K:
Radialix 还带有 Google 和微软强大的联机翻译引擎,对于软件中的词句,机器翻译给出译文的准确度有时高得惊人:
但不能简单地利用机器翻译来进行软件汉化,用户肯定会抱怨你的行为,甚至不会再去看你的其他作品。
翻译完毕所有词句,就可以编译生成目标文件,快捷键为 Ctrl+F9。如果用 Radialix 汉化的是其他软件且运气较好,到这一步基本就结束了。但对本例来说这只是个开始,原因是要么你生成目标文件时会报错,要么是所编译出来的文件有功能缺失。看到这里你肯定会抱怨前面岂不是白忙了,不过还是请你耐心往下看,因为本文中 Radialix 只作为辅助工具。
接下来我们从 Radialix 中导出翻译词典,采用术语文件格式(*.glo),为后续工作做准备:
由于前面我已对每个翻译语句做了复查验证(快捷键 Ctrl+Q),所以在向导中只导出已验证的翻译即可。剩下的就交给其他软件来处理了。
DotNet Helper
反编译
DotNet Helper 是汉化新世纪会员 tracky 开发的支持编译/反编译 .Net 的工具,界面直观操作方便,免去了输入命令行的麻烦。拖放要反编译的程序文件到 DotNet Helper 上:
本例中编译 Subtitle Edit 的 Framework 的版本就是 2.0 的,且没有加密混淆等问题,所以无需多余设置,直接点击反编译按钮即可。生成的文件很多,但我们主要处理的是扩展名为 .il 的文件。
另外再啰嗦一下,如果你使用的是 XP 以前的系统,至此你应该确定系统已安装了.NET Framework 2.0 以上的版本,否则请去官方下载安装: http://www.microsoft.com/downloads/details.aspx?FamilyID=zh-cn
Passolo
处理 .il 文件
Passolo 配合强大的资源解析器可以处理各种特殊格式的文件。为了使 Passolo 能够正确提取 .il 文件中的字符串,我们需要对其进行设置。以空白工作空间方式启动 Passolo,点击工具菜单选择插件选项,弹出插件管理对话框,如下图:
在解析器标签中选择加载文本文件解析器,再点击右侧设置按钮,弹出文本解析器规则定义对话框:
世纪提供了.Net il 文件的解析规则,但不能解析上图中双行字符串,我们稍作修改即可解决。 点击这里 下载规则文件进行导入。
设置完毕,现在我们可以在 Passolo 中建立新方案,来正式处理先前反编译出的 .il 文件了。在添加源文件时,如果 Passolo 不能正确调用.Net il 解析规则,就需要手动指定:
方案创建好,开始着手翻译。我们首先要加载从 Radialix 导出的术语文件(.glo),在 Passolo 工具菜单下点击术语表选项,弹出术语表对话框:
添加好术语,Passolo 中的操作比较轻松,只需在对应的翻译行上按快捷键 F8 (可以复选多行同时操作)就可以了。
有一点要说明的是,类似 Passolo 这种智能化的工具,会帮你自动翻译重复项,多数情况下是好事,但在本例中要注意:Subtitle Edit 存在字幕格式转换,一些标记、颜色、字体属性如 Bold 等,是不可翻译的,要根据上下文判断词所在位置,是界面还是字幕格式。最后将翻译好的方案生成目标文件。
编译与“非标”处理
再次回到 DotNet Helper 中,为了方便操作,我们更改扩展名为 .res 的文件,使其与从 Passolo 中生成的目标文件名一致,如:SE.res 和 SE.il。拖放 SE.il 文件到 DotNet Helper 上进行编译,成功编译会闪现一个窗口,若眼力好可以看到单词 successfully:
编译失败也闪现一个窗口,有着很醒目的 ***** 号:
遇到错误不怕,编译器会提示错误所在的位置(对应 .il 文件),上图中出错的原因是我正运行着先前编译好的程序,导致新编译输出的程序文件无法对其覆盖。要查看错误信息,可以先用 DotNet Helper 生成批处理文件,然后在命令行中运行即可。
现在我们来运行编译好的程序检查一下,发现很多按钮字符显示不全;在创建/添加行以及视觉同步面板中有未翻译的字符串:"< ½ sec" 和"&½ second back"按钮。为了查明原因,可使用文本编辑器打开 SE.il 文件,这里我用的软件是 EditPlus。为了方便查看,先对其进行设置,点击 EditPlus 工具菜单选择"首选项",弹出参数选择对话框:
设置完毕就可看到语法高亮显示了。接下来我们查找"< ½ sec" 和"&½ second back"字符串,没有结果;继续搜索它们"附近"的字符串,如"< 3 秒":
可以看出控件名称与字符串是一一对应的,很明显最下面红色框选的部分就是"< ½ sec" ,只要将其替换为"< ½ 秒"即可。不过我们最好去修改由 DotNet Helper 反编译出源 .il 文件的相应部分,因为 Passolo 生成新的目标文件时,我们还要重复上面的操作,不如直接将源文件中相应部分更改为 Passolo 可提取的字符串形式,交给 Passolo 处理。
[提示一下:更改了源 .il 文件,需在 Passolo 方案中对源文件(英语)和目标文件(中文)进行创建/更新字符串操作,这样才能保证 Passolo 能提取已更改的字符串]
经过上述处理,进行二次编译,我们再来检查一下是否仍有未翻译的“非标字符串”,果然还有两处:一处是在行间跳转对话框;一处是在导入二进制字幕文件选择语言流的对话框。与先前不同的是这两处都是对话框而非单个的字符串,但是由 Radialix 编译生成的汉化文件,没有此问题。为了知道区别所在,用 DotNet Helper 将 Radialix 编译生成的汉化文件反编译到其他目录,复制其中的 .il 和 .res 文件到由英文原版反编译的目录中。也就是说我们移植了 Radialix 汉化版中 .il 文件与原英文版中的 .resources 和 .xml 文件构成了一个新的 .Net 资源集:
编译上图中的”SE – 汉化版.il”,得到的程序依然存在这两处未翻译的对话框。现在可以推测“非标字符串”不在 .il 文件中,而是在 .resources 文件中。启动 Radialix 创建本地化项目,源文件是 SubtitleCreator.ChooseLanguage.resources,立刻就看到了“非标字符串”:
翻译完毕,用生成的目标文件替换源文件,再次对 SE.il 文件进行编译,可以看到对话框已翻译了。同样的方式处理 Nikse.SubtitleEdit.Forms.GoToLine.resources 文件。
控件调整与测试
控件大小与位置的调整数不少,所以放在最后。调整前还必须再次确认程序没有任何功能缺失问题,例如有个独立的单词“Dictionaries”,我将其翻译为词典,结果导致 Subtitle Edit 的拼写检查功能丢失,出现这种问题要如何排错呢?
学过编程的都知道有个二分法,可以借用到这里进行排错:在 Passolo 中对翻译状态列排序,使已翻译的行集中到一起,从上到下选择大概一半已翻译的行,然后按快捷键 Ctrl+U 取消翻译,不要再做其他任何附加动作,立刻生成目标文件,编译输出可执行文件进行验证,这时就只有两种情况:一种是仍有错误,说明在 Passolo 中所选行没问题,那么我们可以先撤消取消翻译操作,再选择另一半已翻译行的一半重复刚才的操作;另一种是没错误,说明在 Passolo 中所选行包含了不可翻译的部分,那么我们只需在所选行中再选出一半继续进行验证……重复以上操作几次很快就能找到错误所在位置。Radialix 中更方便,只需对容易出错的非标部分进行只读属性列排序,然后选择一半数量的非只读属性行再按快捷键 Ctrl+K 切换只读属性,后面的验证操作就都一样了。
现在开始调整控件的大小与位置。先来看一下 .il 文件中是如何描述的:
上图也是经过处理的,实际数据并未靠得那么近,不过只要注意画红线的部分就容易辨识了。另外以 0x 开头的数据是十六进制的,借助 Win 7 系统自带的计算器可以轻松地进行十进制和十六进制之间的转换。
可以分两步调整图中的数值:第一步是粗调,将前面用 Radialix 汉化输出的文件反编译得到的"SE – 汉化版.il"与 Passolo 生成的目标文件"SE.il"进行比较,只更改数值部分,我们通常借助 Beyond Compare 来完成(现在手上没有"SE – 汉化版.il"文件,所以只能用"SE.il"与英文源 .il 文件的比较图来充数);
接下来是精调,对于未达到预期效果的控件,可以用 EditPlus 打开 SE.il 文件进行手动调节。虽然麻烦但还是有参照的:打开先前的 Radialix 本地化方案,选中要参照调整的控件,切换到资源标签,就能看到控件的名称以及位置和大小等数据,这样改起来也相当快。
更新维护
更新汉化相对来说简单多了,打开先前的 Radialix 本地化方案,更改源文件为新版程序,然后按快捷键 F5 更新资源,我们就可以立刻知道新版程序有哪些变化:
接下来的操作都雷同就不细说了。
至此我们完成了一个 .Net 程序的汉化。发布之前还是要尽可能地多测试,避免将重大错误呈现给用户。由于 Subtitle Edit 本为开源免费的绿色软件,所以加壳、打包等不属本文的讨论范围。以上是本人目前掌握的 .Net 程序汉化的一种折中方案,也许将来新版 Radialix 能彻底改变这种复杂的方式,或是诞生新工具给出更好的解决方案。希望朋友们也能分享自己经验,更希望耐心看完本文的你能够有所收获。