【汉化】【技术分享】基于16进制编辑器的游戏内剧情文本汉化及优化

更新时间: 阅读数:4.6K+
最前排

长文预警,稍微包含一点汇编知识,本人文笔吊差,大家凑合看看。


是否为二级目录:
      8月11日,CD佬发布了“如何自己使用官方内置文件做汉化包”的教程,看完后本人受益匪浅,终于不用笨笨的拿个网易有道词典拍照翻译了,便自己做了一版汉化包自用。但是官方内置汉化懂得都懂,不光有些内容并未进行汉化,而且各种角色名翻译及其生草(黑龙:???),翻译语句不顺更是常态。于是本人便想对官方汉化包进行优化,这样使用起来也更舒适。
      首先在此简单介绍一下LO的汉化包。LO汉化文件包括两个部分,分别是文件夹localization中的 __data文件, 它是游戏UI界面汉化;以及table_localization_tc中的 __data文件,它是游戏内所有文本汉化(这两文件名相同)。其中游戏UI界面汉化只要用excel就可以自己轻松优化修改,各位现在使用的大多都是优化后的UI界面。不过,影响我们游玩体验最严重的游戏文本汉化用上述办法却无法进行优化,所以这段时间本人一直都在断断续续的研究如何优化文本。终于,找到一种有效的游戏内文本优化方法,在此分享给大家。

ps:这个真忍不了.....

ps:修改后
是否为二级目录:
      先简述一下为什么文本翻译文件无法用notepad等软件修改,个人猜测是因为游戏加载时要读取的文本文件中,只要有一条翻译的固定格式被破坏,游戏就会卡在加载界面。即以错误的方式修改文本翻译会导致table_localization_tc中的__data文件完整性被破坏,这样游戏就无法打开。
      既然用正常的方法没办法修改文本翻译,那就来吧,直接从计算机文件的源头——二进制形式出发,用16进制文本编辑软件修改文本。

      注:本文演示过程使用的是LO日服PC端,安卓端同理,只要将对应文件复制到电脑上操作即可。

是否为二级目录:
      注:本人使用的16进制编辑器为HxD,同时用到了**工具UABE,文章中所有使用到的工具都会放在末尾处供大家参考下载。

      首先用UABE解压C:\Users\你的用户名\AppData\LocalLow\Unity\PiG Corporation_LastOrigin_R\table_localization_tc中的__data文件,解压后存哪都行。(用UABE打开__data就会有此选项)


用16进制编辑器打开解压后__data文件,结果如下图所示:
ps:看着就头皮发麻

     理论上来说,只要找到游戏内对应文本,然后在16进制编辑器中修改即可。但是一码归一码,看着上面这玩意,仅仅知道这些还是无从下手,首先我们得看懂这个文件在说些啥。
     利用AssetBundleExtractor(UABE)对该文件进行**,可以导出一个文本文件:

打开该文本文件,可以看到如下形式的数据:

看着上图的文件格式,可以推测100010000X这些序号后面的文字即为游戏文本(虽然显示为乱码)。用notepad打开上述文件,选择utf-8格式编码,便可以将乱码转换为中文:

分析总结可得到__data文件的格式如下:首先是文件头,然后是所有翻译文本,最后是文件尾。并且翻译文本都是以:

序号+乱码+文本内容+乱码

的形式存储的,得到这个结论后再回到HxD编辑器打开的文件,逐条分析翻译文本,可以总结出每条翻译的详细结构,以1000100002号文本为例:


左边的16进制可decode成为右边的文本翻译(虽然显示为乱码),选中内容的结构如下:

  • 31 30 30 30 31 30 30 30 30 32   ——>  序号1000100002;

  • 06 09 00 00 ——>  无具体含义,起分隔符作用;

  • 00 27 ——>  表示可识别文本的字节数为0x0027个,0x0027转换为10进制即为39,也就是第1000100002号文本翻译所占的字节数为39个;

  • E5 87 9D E5 9B BA E6 B1 BD E6 B2 B9 E5 B0 8E E5 BD 88 EF BC 9A E9 A1 8D E5 A4 96 E7 81 AB E7 84 B0 E5 82 B7 E5 AE B3 ——>这个就是要找的文本翻译内容了,而且字节数确实也是39个,由上面notepad识别可知,该文件采用的是UTF-8编码,所以将这些字节以UTF-8形式解码便可以得到:
正是翻译内容。(顺便一提,UTF-8编码中汉字对应着三个字节)

  • 01 ——>  文本结束的标识,无具体含义;

  • F6 FF FF FF FC FF FF FF ——>  好像是本段文本的地址指针,不确定

  • 06 0B 00 00 ——>  无具体含义,起分隔符作用;

  • 00 0A ——>  换行符

分析完毕。

是否为二级目录:

      知道__data的具体结构后就好办了,现在咱们理论上可以修改游戏内的一切文本,那就直接上手改吧,就以永恒酱的角色名为例,永恒在官方自带翻译中被直译为伊特尼提,emmmm,总之习惯了永恒称呼后挺别扭的。本次修改目标,将游戏内的所有伊特尼提替换为永恒

  • 第一步:将替换字符串与被替换字符串编码为16进制形式

既然要在16进制编辑器中修改文本,那肯定要将要替换的字符串转换为16进制形式,去度娘上随便找个字符集编码查询,将伊特尼提以UTF-8形式编码:
得到16进制编码 E4BC8AE789B9E5B0BCE68F90 ;
同理编码永恒,得到 E6B0B8E68192 ;

  • 第二步:分析字符串

如果直接进行字节替换,从“伊特尼提”到“永恒”,这两者字数不同,这样替换后字节数就会改变,也会导致__data文件完整性被破坏,所以要将文本翻译中的可识别字节数一并修改,其中“伊特尼提”的字节个数为12,“永恒”的字节个数为6,故要将0x0C改成0x06(16进制形式)

  • 第三步:替换字符串

在HxD中用快捷键Ctrl+R调出替换页面,将上面两个字符串分别填入进去,数据类型选择十六进制,点击全部替换即可:


提示替换成功:

然后依次替换每个更改的翻译文本的可识别字节数即可。由于我是用代码实现的,这里不太好演示。。

是否为二级目录:

保存__data文件,接下来就和CD佬汉化攻略中提到的一样了。不过这里以lo日服pc端fanza版为例进行演示(因为电脑比较好截图)

1. 打开AssetBundleExtractor(UABE)点开<文件>然后<打开>,选择咱们刚刚修改完毕的文件-->Info--->然后选择 Table_Localization_tc.bin-->plugins-->export to .txt-->保存.txt文件;

2. 打开UABE-->点开文件-->然后打开,选择选择C:\Users\你的用户名\AppData\LocalLow\Unity\PiG Corporation_LastOrigin_R\table_loclization_ja文件夹中的__data文件然后**(文件名可以随意命名)
Info--->然后选择 Table_Localization_ja.bin->plugins-->import from .txt-->选取1里table_loclization_tc文件夹中保存的那个.txt文件-->然后保存__data文件
(粗略的复制了CD佬的攻略,详细的可以去看CD佬攻略中国际友人的演示视频)

3. 开游戏验证一哈,看看永恒酱:

都没问题,大功告成\^o^/,学废了,学废了。

是否为二级目录:


      1. 正如上文提到的那样,文本替换后如果字节数就变少了,就会导致__data文件完整性被破坏,同样如果字节数变多了也不行/(ㄒoㄒ)/~~,所以每个修改后的翻译文本的可识别字节数一定要和后面的文本对应上,不然游戏就会卡登录界面进不去(我一般都是卡在6%或直接弹窗劝退)

      2. 使用汉化的本质是改文件,风险同魔改,属于灰色地带,请了解风险后酌情使用(你用别的付费汉化也会有这个风险)

      3. 本人分享优化方案仅为技术交流和为无偿汉化出份力,请随意使用但勿作商用。

是否为二级目录:

尽管有着种种限制,不过对于游戏角色名翻译的优化已经够了,在下根据LO日服wiki中Ashu等大佬翻译的角色名对游戏内的生草翻译进行的优化,大概有80多项,基本涵盖了所有生草翻译,优化后汉化包的详细情况请点击这。(适用于日服PC端,安卓端)(有点bug明天再发)

目前暂时就想到这么多,关于如何高效修改游戏内翻译,个人建议写个python小程序批量操作,以后有机会再跟各位分享。

非常感谢您看到了这里,这是在下第一次写攻略(应该算吧?)相关内容,上文全部为个人的浅薄理解,如果有任何原则性上的错误和意见还请各位在评论区指正,谢谢大家,一切为了CNLO\^o^/

《东北爱丽丝》

是否为二级目录:


CD佬汉化攻略:https://www.gamekee.com/lo/164709.html

UABE下载:https://github.com/SeriousCache/UABE/releases

HxD下载:https://mh-nexus.de/en/hxd/

以及Ashu等各位大佬的角色名翻译,感谢






0
0
0
0
0
赞赏赞赏
评论(25)

Ashu

管理员

2022/09/13日

这几天稍微摸索了一下,总结一些经验。 首先对于同一编码的文本,不同语言之间只有可读字节符号和内容本文有区别,前后的其他字节都完全一致。 第二,对于某条文本在文件内的位置改变并无任何影响。 根据以上两点,其实文本只要汉化过一次就行,官方更新后只要把新增的文本复制到旧文件就行。 然后就是批量替换的一些小心得。 修改前后字节数相同的直接换就行。 像法力要修正成AP我用的是全角英文,全角英文字母的字节数和汉字一样。 对于长的要修正成短的,我的方法是用一些特殊字符,也就是有些字符有大小,但是和空格不一样不会在游戏里有任何显示。 对于短的想要修正成长的那就只能去修改可读字数了。 如果早些时候我可能还会考虑精翻,但现在看了下十多万行文本我想还是算了。
#25
2 0
大蛋儿回复Ashu感谢大佬的分享😀,而且即使是替换角色名也会有上百万的数据量需要处理,手工的话不可能,代码实现的话也不简单😂

2022/09/13日

0 0
共2条回复

现实闻钢笔

2022/09/13日

其实我有一个和lo关系不大的疑问,仅仅是疑问,不需要联网的单机游戏中,使用rsa加密方式,需要把私公钥均封入dll中吧,再以其他方式加密私钥。那读取运行内存,取得游戏读取**私钥的过程,不就能逆向出私钥从而**整个游戏了。不封入私钥,又不能联网,游戏该怎么自行**资源。还是说游戏能直接读取加密过的资源? 然后是和帖子有关的疑问,不能使用notepad修改文本,会不会是因为单纯修改了文本而没有改十六进制,直接使用notepad打开使用UTF-8会显示特殊字符的情况就不是单纯的文本文件吧?文本前面的特殊字符就是验证文本字符数的。游戏验证资源完整性,那改了就肯定验证不通过才是,因为整体代码已经变了,md5验证更是,改一个字符,md5都变,除非改md5值。或者说是验证签名,可notepad修改文本也不会更改签名呀。。
#24
9 0
戏言玩家回复现实闻钢笔我现在就是用notepad++改的游戏文件,只要把对应地址里面的代表字节数量的那个值改了就行,notepad++自带ascii和16进制的转码插件,这个事情是可行的,和MD5没有关系

2022/09/13日

0 0
共9条回复

戏言玩家

2022/09/13日

仔细拜读了大佬的作品,感觉获益良多,因为我最近也有在做这个的打算,对两个事情想问一下: 1.想咨询一下被划掉的“由于我是用代码实现的,这里不太好演示。。”很感兴趣想知道如何实现。 2.对于长文本的位置 后面的字数的换算方式是什么,短一点的文本可以直接看出来,但是长一点的会用两个格子的地址来表示比如E4 06 这样是多少字节呢,看文本查字数是678,但是这个数字对应的地址我是不会弄了。 感谢大佬的分享
#23
7 0
戏言玩家查字数是226 换算成字节是678

2022/09/13日

0 0
共7条回复

戏言玩家

2022/09/13日

大佬太牛逼了,终于看到这么厉害的帖子了,我来学习一下,太佩服了
#22
0 0

Ashu

管理员

2022/09/10日

其实我很好奇官方到底是怎么翻的,有些地方翻译的又挺正常,有些地方又翻译得连机翻都不如。给人的感觉就是在摆烂。或者说他敷衍可能更合适点。
#21
2 0
大蛋儿回复Ashu确实,翻角色名的时候肯定在摆烂😂

2022/09/10日

0 0
共2条回复
3
0
25
分享