谁是赢家?语言文件中的冲突与战争
酒石酸菌
2018年07月06日 21:17

前段时间,很多玩家汇报了这样一个有趣的问题,明明好端端的铁矿石,加上了汉化资源包却变成了“针铁叶矿”,很多玩家还以为这一块是翻译出了错。

为了能让他们更加深入地了解到内部的原因,我将详细介绍下问题的来源,同时顺道鞭打几个模组作者一遍。由于本人水平有限,可能部分地方存在错误或者不准确,还请多批评指教。


1. 语言文件究竟是如何加载的?

多语言支持并不是一件复杂的事情,如果来自多个玩家的人同时访问一台服务器,你如何为每个玩家显示正确的语言呢?

Minecraft 采用了一种极为简单的方式,在服务端,只记录语言中的 key。这就像是每个人的身份证号码一样,理论上不会重复。不同语言的玩家客户端存储不同的对照表,进入服务器后,通过读取服务端发来的 key,在客户端显示出对应的语言。

这样,我们开心的完成了不同玩家的不同语言显示。美国的小哥采集的 Apple,在中国小哥电脑前就能够正常显示为“苹果”,因为它们的 key 是一样而又独特的。

事情看起来如此美好,一切都是完美的,然而,打破规则的模组作者来了。在我过去对六百多个模组的监控中,重复的 key 有 172 条,其中一半居然是三个及以上模组重复,甚至出现了如下情况:

Armorplus (一个添加了很多护甲的模组),血魔法,血魔法附属血魔兵工厂,以及原版同时抢占了  这一条 key。你可以想象,如果一个玩家装上这三个模组,在输入完毕  指令后的结果,他会茫然地看着屏幕上打印出不正确的提示语,全然不知在计算机背后四条重复的 key 早已打了三次架。


2. 问题出在哪?

如果你是一个模组作者,你在构建方块或者物品的时候,一定会这样书写:

上面是注册物品 ID,下面就是注册物品的语言文件 key。

物品 ID 也是类似于语言文件 key 一样存在的东西,如果两个物品占用了同一个物品 ID,游戏就会发生错误,这是比语言文件严重地多的情况。所幸的是我们的 Forge 在读取了物品注册这一段后,会主动的为其主动添加上模组 ID 作为前缀,这使得重复几率大大降低。

然而下方的语言文件注册可就惨多了。比如说物品,统一的加上诸如  前缀和  后缀,而最为关键的模组 ID 居然被选择性无视了。

我们可爱的 Forge 随后会逐个逐个将模组的语言文件 Key 读取一遍,存成一张大的对照表,遵循着后来居上的原则,后来的总是会覆盖掉先前的。这样,一场语言文件的厮杀就完毕了。谁是赢者尚不明朗,但是我们可怜而又无助的原版 Minecraft 注定成为这场战争的牺牲品。


3. 那都有谁干了这些事?

由于涉及到模组数量异常庞大,这里取出前三甲:

第一名

Futurepack,飞向未来,一个独具创意的科技向模组,被戏称为科技版的神秘时代。总共有 18 处重复,所幸约有一半是常见金属,工具的名称重复,影响不大。

第二名

神秘时代,是的,在上一篇文章中我提到了它触犯了区块加载的陷阱,在这一篇文章是如此巧合又触发了另一个陷阱。神秘时代触发的重复非常之杂,影响较大。比如原版的屏障就与该模组的守护之光相重复。

神秘时代总计涉及到了 15 处重复。

极为有趣的是,在 1.10.2 版本的神秘时代 6 中,原作者为每个词条都添加了  名称,那时候没有一条重复内容。然而 1.12.2 作者却鬼使神差地删去了所有的  名称,神秘时代一下成为重复率第二高的模组。

第三名

Primal Core 模组,也翻译成原始核心。如果你玩过 sevtech 整合,前期发展基本是都是这个模组,它涉及了 10 处重复。


4. 我该怎么做?你打算怎么做?

作为模组作者想要化解这个问题是如此简单,只需要在注册语言文件 key 的时候加上自己的模组 id 即可。

但作为汉化者的我却无能为力,因为读取 key 全都涉及模组本身的内容,除非我动用一些特殊方式修改源代码,但这会带来巨大的工作量,以及不必要的性能牺牲。

向原作者反馈是个好方法,只不过这里有100多个模组的重复,我不认为这些作者能够在短时间内协调解决。

如果你发现了类似的错误,请去轰炸原作者。

目前所有的重复部分已经公开,请移步 https://cfpa.team/TransQualityControl/ 的重名 key 检查部分进行查询。