galgame吧 关注:1,805,587贴子:26,899,448

回复:【教程向】浅谈汉化入门基本思路与实操

只看楼主收藏回复

## L20
接下来开始尝试汉化一些文本,后面的部分就是一些非常容易的固定的把式套路了(但也很重要!),没有需要分析的地方前面我们提到,由于shift-jis不支持大部分汉字的显示,所以我们使用GBK编码来编写一些汉化文本,这里修改snky01.ps3:

注意这里的汉化文本要比原文短,这一般是可以做到的,因为中文的平均信息熵高,如果长度超过的话,要修改机器码来重新校验长度,需要一点计算和操作,要尽量避免。进游戏看看:

发现文本已经改变,但是除了兼容的英文,其他的符号和汉字都是乱码。原因很简单,前面已经分析过,这是由于用jis的解码格式解GBK编码导致的。要修正很简单,再主模块cmvs搜索:createfont(这是一个非常常用的图像渲染win api,请熟记!)并打上断点:

进入游戏后停在createfonta内部,这时候按enter回到调用fonta的地方:

看到红圈圈出的地方了吗?这是典型的CreateFontA结构,push就是传递参数,push 0x80,push 0x00...这些相当于CreateFontA(0,0,0,0,0,0,0x80,...)
这是CreateFontA完整的函数签名:
```C
HFONT CreateFontA(
int nHeight, // 字体高度
int nWidth, // 字体宽度
int nEscapement, // 文本行倾斜角度
int nOrientation, // 字符倾斜角度
int fnWeight, // 字体粗细
DWORD fdwItalic, // 是否斜体
DWORD fdwUnderline, // 是否下划线
DWORD fdwStrikeOut, // 是否删除线
DWORD fdwCharSet, // 字符集
DWORD fdwOutputPrecision, // 输出精度
DWORD fdwClipPrecision, // 裁剪精度
DWORD fdwQuality, // 渲染质量
DWORD fdwPitchAndFamily, // 字体系列
LPCSTR lpszFace // 字体名称);
```
那么我们要改的是哪部分呢?
就是push 0x80部分,0x80这个常数是硬编码在gdi32中的一个数字,这是shift-jis的编号,而我们的gbk对应的编号是0x86,我们按空格把80->86即可。
这边再看一眼蓝圈圈住的部分,这个就是就是一个栈帧,一个栈帧就代表一次函数调用,在x64dbg中会用一个一个黑色的线夹住,顶部的叫esp,底部的叫ebp,中间包裹的都是函数的参数,比如我蓝色箭头指向的就是前面传入的0x80参数。

像这样重复多改几次,因为游戏中不止一处调用CreateFontA,历史对话等等都要调用,都是一样的操作,反正记住都改80-86就好。然后改完后再进入游戏,发现还是显示不对

这是为什么呢?


IP属地:吉林78楼2025-05-11 13:01
收起回复
    ## L21
    你或许已经观察到,第二次显示有很多????,而不像第一次那么多乱码原因在于编码校验范围出错。
    什么是编码校验范围?就是编码的边界。因为shift-jis不会使用所有0000-FFFF编码,
    只会使用0x81-0x9F | 0xE0-0xEF(第一字节) + 0x40-0x7E | 0x80-0xFC(第二字节)这两个范围的字符,
    而GBK使用:0x81-0xFE(第一字节) + 0x40-0x7E | 0x80-0xFE(第二字节)
    如果你是你会怎么写逻辑校验jis?
    是不是会写
    ```C
    if((ch > 0x81 & ch < 0x9F) || (ch > 0xE0 && ch < 0xEF)){
    render(...);
    }else{
    render_default(); //如果走这个逻辑,就会出错,渲染出默认替换字符□/?/�
    }
    ```
    你想走第一个逻辑,是不是把9F->FE就行了?不管是shift-jis,还是jis0208这个编码,你只要知道这个道理就都随便改了。所以我们在主模块查找9F这个常量,断一下有跑到的地方直接改就可以了FE就可以了


    改完之后再进游戏:

    文本汉化成功


    IP属地:吉林79楼2025-05-11 13:05
    回复
      2025-12-30 18:59:43
      广告
      不感兴趣
      开通SVIP免广告
      ## L22
      其实到了这里,如果是自己玩的话,你已经可以宣称自己(在程序上)焊下这部作品了。
      但是如果是正经汉化,或者说你那天成为某个组的主程,你不可以只焊一个文本就说自己汉化成功了,这不行,也不对。
      需要特别申明:替换图片,UI,字体这些步骤都是【必不可少】的,甚至还有游戏中的部分演出,也有可能不走Textbox的逻辑,这些都是边测试边去修改的。
      当然你如果说这游戏太贼混淆手段太多,弄个文本就弄没半条命了,直接就这样也不失为一种选择。
      然后也是类似的思路把图片给替换:

      替换图片这步不比替换文本来的简单,一样要分析不少东西。
      我自己是以及做过的,但是这篇帖子已经太长,迄止1.5w字,我想我要介绍的东西:汉化基本流程,工具链,调试器的使用,基本跟踪技巧,以及一些必要的常识到这里也都介绍的差不多了,想必你要汉化的也不太可能是这部游戏,所以我就略过这步,到此为止。
      后面也还有一些程序要做的杂活,比如把文本提取出来,你用正则也好,还是什么其他手段,把文本弄成json之类的格式拿去焊就行了,这个非常简单,应该不用展示吧?
      应该不用。
      大概。
      概。
      好吧,还是展示一下,就是大概写这么一个脚本,把文本中的分隔符or机器码洗干净,处理成一个json:


      大概就是这么一个效果,然后这些就随你拿捏了,给人翻译完后同样写一个脚本拼回去就行。


      IP属地:吉林80楼2025-05-11 14:11
      回复
        ## DLC
        那么,那些日文要怎么处理呢?
        事先申明,步骤仅出于技术展示,没有含有任何唆教或鼓励或什么其他目的,你自己怎么弄是你的个人行为,弄出了事可万万不要把为师给供出来,说是我教你怎么A翻怎么机的,没有啊都没有。
        首先我们需要一张4090。如果没有的话在autodl上创建一个账号,我们要租用算力来完成这件事,我的深度学习实验都是在这个平台上完成的。
        价格的话2-3/h,处理游戏文本几块就能搞定(由此观之,焊化十有八九还得倒贴钱,哈哈哈)。
        实例选择这个版本就行吗,注意一定要用4090,其他的卡不行:

        介绍一下SakuraLLM:这是一个基于Qwen-7B大模型微调后的一个gal特化模型,由更上层Gal批制作。

        具体使用文档在这里,已经讲的很清楚了,我就不赘述了:
        https://books.fishhawk.top/forum/65719bf16843e12bd3a4dc98!

        反正你只要了解【jupyter】+ 【ssh】这个应该是没有什么门槛的。
        在pwoershell上键入形如,建立一个ssh转发server:
        ssh -N -L 6006:127.0.0.1:6006 -p 23xx2 root@connect.nxx1.seexxcloud.comssh
        密码要手动输入,不可粘贴:

        然后就可以在6006端口访问到LLM了

        然后就是刚才给你做的json处理成这种prompt模块,当成参数传给大模型,然后就...
        就...就自己熟悉一下吧,要自己动手的到这步肯定也不用我说接下来怎么弄了,我主要还是提示一下有这么个东西存在,平一下信息差。
        Fin.


        IP属地:吉林81楼2025-05-11 14:58
        回复
          太棒了,狠狠的收藏加精


          IP属地:广东来自Android客户端83楼2025-05-12 08:21
          回复
            神贴,感谢大佬分享


            IP属地:广东来自Android客户端84楼2025-05-12 10:10
            回复
              大佬nb


              IP属地:陕西85楼2025-05-12 14:02
              回复
                帮顶


                IP属地:广东来自Android客户端87楼2025-05-12 21:43
                回复
                  2025-12-30 18:53:43
                  广告
                  不感兴趣
                  开通SVIP免广告


                  IP属地:海南来自Android客户端88楼2025-05-12 22:33
                  收起回复
                    学到了不少,智齿


                    IP属地:山东来自Android客户端89楼2025-05-13 15:32
                    回复
                      大佬


                      IP属地:广东来自Android客户端90楼2025-05-13 16:11
                      回复
                        LZNB,很有价值


                        IP属地:吉林来自iPhone客户端91楼2025-05-20 14:02
                        回复
                          有兴趣把markdown发github吗


                          IP属地:吉林来自iPhone客户端92楼2025-05-20 14:03
                          收起回复
                            支持大佬


                            IP属地:辽宁来自Android客户端94楼2025-05-24 02:02
                            回复
                              2025-12-30 18:47:43
                              广告
                              不感兴趣
                              开通SVIP免广告
                              大佬们这种能汉化吗


                              IP属地:湖南来自Android客户端95楼2025-07-05 21:47
                              回复