[逆向]对基于I2 Localization本地化插件的u3d游戏汉化的探索
最近接触了一款冷门的英文游戏Untrusted,类型为社交推理(狼人杀),苦于文字量极大、英文水平一般,遂研究汉化,有了一些初步的成果。

这里是游戏的主菜单,可以看到左下角支持的语言是英语和意大利语,此外,还有需要在steam启动选项里调整的俄语。

下面是摸索汉化的过程
刚开始接触汉化时完全没有头绪,去b站浅显地找了一下教程:
[Unity3D-游戏汉化教程]第1期:Mono脚本 Assembly-CSharp_哔哩哔哩_bilibili
这俩还不错,看后有了一点思路,基本就是用解包工具进行逆向、翻译、最后打包。特别是第二个,讲了应对好几种不同情况下的汉化方法。但几种方法都不适用于我手头的这款游戏,后面自己摸索出了汉化的方法。
下面按照顺序讲一下实践操作:
1.寻找暴露在外部的语言文件

游戏根目录结构如上图,Mono...文件夹保存了一些工具,_Data文件夹中是游戏的数据,两个exe是unity的程序入口即游戏启动文件,剩下那个dll包括了unity引擎代码和引擎的证书。
为了进行汉化,需要访问保存游戏文件的_Data文件夹:

最上面的Managed保存了大量dll文件,几乎包括了所有的脚本;Resources则包含了纹理、默认字体、材质、shader等资源;Plugins没研究过,猜测和Steam的联动有关,我们自己做游戏好像不会出现这个。
剩下那些杂七杂八的文件则是不同的场景资源。
根据以往的经验,尝试寻找暴露在外部的.json语言文件,可惜没有。
2.dnSpy
dnSpy是著名的逆向软件,用来拆包查看代码。
至此,打算先看看Managed里面保存的脚本,因为很多小体量游戏会把文本以字符串的形式保存在脚本中。

图没截完,共有82个dll文件,首先用dnSpy拆一下最重要的Assembly-CSharp.dll,看看里面的脚本:

先用肉眼粗略扫一遍脚本,东西非常多,脚本中没有发现明显的字符串,又搜索language、translation、translator等关键字,发现了这个:

里面仍然没有所需内容,又顺藤摸瓜找到了这个:

通过在搜索引擎搜索LocalizationManager,发现它和一款叫做I2 Localization的Unity本地化插件有关,它能够很方便地管理多语言,在打包时会把语言文件储存在_Data文件夹的.assets文件中。
3.AssetBundleExtractor
AssetBundleExtractor是一个资源文件查找器,能够查找资源文件中的特定文件,例如我们需要的语言文件。
使用AssetBundleExtractor对多个.assets文件进行解包,将文件按照大小顺序排列,发现了本地化文件的踪迹:确认了它保存在resources.assets中。

因为事先知道游戏只支持英语、俄语和意大利语,所以一眼就看出ru、it、en是语言文件。
利用AssetBundleExtractor的导出功能(右下角的Plugins),获得了txt格式的en语言文件。事实上它是以json的方式运作的:

这json文件是不是很熟悉?当时很兴奋,研究了一整天,终于有了成果。经过机翻和人工的润色,成了下面的文件:

最后用AssetBundleExtractor把文本导回原来的resources.assets里面(差点忘记备份),启动游戏,汉化成功!

因为untrusted是个社交推理类游戏,可能涉及游戏中的字符串检测,在教程中教导玩家在公屏打字的环节会卡住,导致游戏无法进行下去(大悲
但如果只看替换文本效果的话,这次汉化无疑是成功的。
虽然没能玩到游戏很遗憾,但希望能给想学习汉化的同学们一些经验。