撰写了文章 发布于 2020-03-16 01:25:29
【抛砖引玉】如何在不支持中文ID的游戏中用上中文名?——以《战舰世界》为例,傻子也能看懂的指南
众所周知,有些游戏出于种种原因,明明客户端支持中文等各国语言,却只让你起英文名。
比如战舰世界World of Warships。这破游里所有人都只能用英文字母、数字和极为有限的特殊符号起ID,就连制作方白毛子自家的西里尔字母都不给用。过分。
/可以看到,游戏界面支持中文,但是ID一律只有英文。
这是借用自朋友的局内截图,他使用的是简中客户端。
图上所有ID已经进行去隐私化处理。
但在沙雕网友千奇百怪的脑洞下,没有什么事情是不可能的。经过先行者大佬们的尝试,我们成功总结出了一个办法,能在游戏中显示出独一无二的中文昵称:
通过将ID设置为客户端GUI本地化字段位的对应字符串,来让游戏GUI将ID错判为字符串而将其“翻译”为目前客户端语言下的相应本地化字段来显示,也就是在中文客户端下显示出中文。
从而达到这样的效果。
/港口界面左上角ID显示为中文,通常情况下这是不可能的。
/公会聊天界面ID同样显示为中文。
原理
我们知道,一个游戏若要对多个语言进行本地化支持,客户端中势必有针对不同语言的语言文件。对其进行调用有多种方式,其中一种是在游戏中的各处文字位置填写一个字符串作为字段的“编号”,而游戏内显示的每个字段其实都是客户端通过调用这个位置预填写的字符串在语言文件中对应的字段而得到的。这样,再由各翻译组制作不同语言版本的语言文件,就可以实现同一版客户端适应不同的语言环境。
这也是为什么很多汉化程序在落后于游戏版本时会导致游戏界面出现乱码的原因:汉化程序修改了客户端自带的语言文件,而替换进的旧语言文件却不存在新版本增加的一些字符串的对应字段,因此在游戏中就直接显示为字符串本身或者各种各样的错误码了。
而对于战舰世界而言,它的GUI大量使用这种方式进行显示,游戏里几乎所有可见的字段背后都是字符串。因此,我们可以尝试找出客户端中的语言文件,来读取其中保存的字符串和本地化字段的对应关系,选择好想要改成的字段后,再去官网花2500金币将ID改为它对应的字符串就完成了(改个名还要几十块人民币,WG是真的坑)。
/点击战舰世界官网右上角ID按钮,在弹出菜单中点击“账号管理”按钮。
/进入Wargaming账号管理页面,点击红框内“更改”按钮按照提示更改ID即可。
/修改完成后,玩家资料页面上,ID直接显示为英文字符串。
这是因为字符串-字段翻译只在客户端中执行,网页上是不存在这一说的。
并且可以合理推测的是,这个方法很可能是通用的,理论上使用类似原理进行GUI字段调用并有中文支持的游戏都可能可以用这个方法改出中文名字。因此,对它进行研究同样有一定的总结通解意义。至于如何获得语言文件、挑选一个喜欢的名字,下面给出一个较为详细的实行方案。
实现步骤
需要准备的软件:①GNU-Gettext ②Poedit
我已把所有所需文件和得到的结果全部上传至网盘,各位如果遇到原下载源速度缓慢的情况可以直接从网盘下载。网盘内提供的Gettext版本为0.14.4,Poedit版本为2.3.5890,均确保可用。我没有测试GNU官网中更新版本的Gettext(最新版本为0.20.1),但它应当依然可用。简中版文件名为global.mo与global.po,繁中版为global_tw.mo与global_tw.po,文件所属客户端版本为0.9.2.0。
链接:https://pan.baidu.com/s/1qFlqn39vSFenM41vpCqjyQ 密码:msvi
以下是具体步骤。
首先,我们需要找到游戏内的语言文件所在位置。以繁中版战舰世界为例,该文件位于
\World_of_Warships\res\texts\zh_tw\LC_MESSAGES
名为global.mo。可以发现它是一个已编译的二进制文件。
(顺带一提,现在繁中客户端里似乎还同时附带了简中语言文件,位于
\World_of_Warships\res\texts\zh\LC_MESSAGES
同样名为global.mo。使用简中客户端的朋友需要使用这个文件。)
找到它之后,将其拷贝到一个方便的位置,比如C盘或者D盘的根目录。
然后我们需要对它进行反编译。前往
https://www.gnu.org/software/gettext/gettext.html
下载前述需要准备的程序①GNU-Gettext。点击红框处即可进入下载页面,最新版本为0.20.1。
/GNU官网Gettext页面
下载完成之后,打开命令提示符,使用cd命令切换至软件安装路径下的bin文件夹。32位版本一般默认为
cd C:\Program Files (x86) \GnuWin32\bin\
而64位版本为
cd C:\Program Files\GnuWin32\bin\
你也可以直接前往该路径检查里面是否有msgunfmt.exe这个程序。如果没有,检查你安装的程序版本及位置路径。
切换完成后,执行反编译命令
msgunfmt.exe D:\global.mo -o D:\global.po
其中D:\应修改为你放置语言文件global.mo的路径。
执行完这一步后,你应该会发现global.mo旁边多了一个叫global.po的ASCII码文件,该文件即为我们需要得到的包含了字符串与本地化字段对应关系的语言文件。
之后,前往
下载前述需要准备的程序②Poedit。用它即可打开global.po。
打开之后会是这样的界面。可以明确地看到字符串和字段的对应关系。
/Poedit界面。
接下来,按Ctrl+F打开搜索页面,寻找你想要的字段吧。复制界面下方“源文本”框中显示的它对应的字符串,按照上面讲过的方法前往官网改名,进入游戏即可看到效果。
需要特别注意的是,战舰世界仅支持24位以内的ID,超过24位的ID将会被截取到前24位。因此,只能选取对应字符串长度小于24位的字段进行修改。
/Poedit搜索框。可按Ctrl+F调出。注意它区分简繁体。
效果及已知问题
目前,这个方法得到的中文ID似乎只能在局外界面显示,局内各处依然显示的是字符串本身,效果不是特别好。猜测可能是由于局内ID前存在公会名称TAG变量致使系统不能将其认定为字符串所导致。
/局内阵容HUD上的ID是个特例,它显示为中文。
值得注意的是,此处的ID前不存在公会TAG。
图片由朋友提供,他使用简中客户端。
有意思的是,由于官方公会系统服务器于3月15日出现的bug,许多玩家的公会TAG连同公会福利一起消失了。笔者在不幸中招的同时,却意外地发现,现在局内也可以显示出中文ID了。
/局内阵容界面ID也能显示为中文了,此前它只能显示为英文字符串。
这侧面印证了上述猜想。也就是说,可能需要不加入公会,才能较好在各处都显示出中文ID。
然而,令人不甚满意的是,聊天框内ID依然显示英文字符串,并且存在文字颜色错误的问题。
战舰世界的局内聊天界面中以颜**分消息频道,绿色为友军消息,白色为全屏消息,黄色为组队消息。这里我并没有和任何人组队,文字颜色却一直显示为黄色,不论切频为友军还是全屏都是如此。而且,一般情况下图内的快捷消息“祝好运及航行顺利”及“朝目标集中火力”是不可能在组队频道中发送的。
/局内聊天界面中ID依然显示为英文,且消息颜色显示存在问题。
推测这可能是并没有实际退会、或是由于这个字符串ID本身而导致的bug。前者可能需要通过退会来测试,而如果是后者,则该问题目前没办法解决,只能视为此方法的一个负面影响。
结语
前面提到,这个方法本质是利用了客户端GUI调用本地化字段的逻辑漏洞,因此其他游戏可能同样可以使用此方法(例如《APEX Legends》?)。这篇文章只是抛砖引玉,希望其他游戏的玩家们可以举一反三、广泛地在自己爱好的游戏中进行测试,大家一起来讨论、总结。毕竟,能在一片英文ID中顶着一个独一无二的中文ID,真的还挺好玩。
目录