
GalTransl
支持GPT-4/Claude/Deepseek/Sakura等大语言模型的Galgame自动化翻译解决方案
GalTransl是一套将数个基础功能上的微小创新与对GPT提示工程(Prompt Engineering)的深度利用相结合的Galgame自动化翻译工具,用于制作内嵌式翻译补丁。现在提供桌面端图形界面,无需命令行操作即可完成翻译全流程。
GalTransl的核心是一组自动化翻译脚本,解决了使用ChatGPT自动化翻译Gal过程中已知的大部分问题,并提高了整体的翻译质量。同时,通过与其他项目的组合,打通了制作补丁的完整流程,一定程度降低了上手门槛。对此感兴趣的朋友可以通过本项目更容易的构建具有一定质量的机翻补丁,并(或许)可以尝试在此框架的基础上高效的构建更高质量的汉化补丁。
❗❗使用本工具翻译并在未做全文校对/润色的前提下发布时,请在最显眼的位置标注"GPT翻译/AI翻译补丁",而不是"个人汉化"或"AI汉化"补丁。
GalTransl Desktop.exe 即可使用,无需安装Python或任何依赖。桌面端会自动启动后端服务。安装、更新依赖.bat,或手动执行 pip install -r requirements.txt以下步骤适用于 Windows。从源码运行桌面端时,请先 clone 或下载本仓库源码,并在仓库根目录(包含 run_desktop_dev.bat 的目录)打开终端。
首次准备环境
python、node、npm 已加入 PATH。python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
npm.cmd --prefix desktop ci
日常启动
双击仓库根目录的 run_desktop_dev.bat,或在终端执行:
.\run_desktop_dev.bat
启动脚本会自动激活仓库中的 .venv,并识别默认安装在 %USERPROFILE%\.cargo\bin 下的 Cargo。脚本会分别打开 Python 后端和前端开发控制台:
使用注意
.venv 和依赖只需首次创建、安装。更新源码后,如果依赖有变化,重新执行上面的 Python 依赖安装命令和 npm.cmd --prefix desktop ci。ModuleNotFoundError,检查是否已将依赖安装到仓库的 .venv 中;启动脚本不会自动安装 Python 依赖。12333 和 1420 端口未被其他实例占用。退出时在后端、前端两个开发控制台分别按 Ctrl+C 停止服务,再关闭控制台;只关闭桌面窗口不会停止单独运行的 Python 后端。| 名称 | 说明 |
|---|---|
| GARbro | 引擎工具:神一样的解包工具。下载 |
| KirikiriTools | 引擎工具:Krkr、krkrz 提取、注入工具 |
| UniversalInjectorFramework | 引擎工具:sjis隧道、sjis替换模式通用注入框架 |
| VNTextProxy | 引擎工具:sjis隧道模式通用注入框架 |
| GalTransl_DumpInjector | 脚本工具:VNTextPatch的图形化界面,综合脚本文本提取导入工具 |
| SExtractor | 脚本工具:综合脚本文本提取导入工具 |
| msg-tool | 脚本工具:综合脚本文本提取导入工具 |
| DBTXT2Json_jp | 脚本工具:双行文本与json_jp互转脚本 |
| EmEditor | 文本工具:神一样的文本编辑器,主语用于修缓存文件。 |
| VSCode | 文本工具:神一样的文本编辑器,主语用于修缓存文件。 |
| KeywordGacha | 文本工具:使用 OpenAI 兼容接口自动生词语表 |
做一个gal内嵌翻译补丁的大致流程是:
我会分成以上4个模块分步讲解,这个段落为了让没做过的朋友也能有机会上手,会写的更照顾小白一些。
(点击展开详细说明)
或者,参考资源包后缀表,比较资源包的后缀。
剧情脚本一般在一些有明显关键字的资源包,或在资源包中明显关键字的目录内,例如:scene、scenario、message、script等字样。并且脚本通常是由许多明显分章节、分人物,有的还分出了剧情和hs(例如带_h),通常多翻找几个资源包就能找到。
或者,参考Dir-A佬的教程
特别的,针对新的krkrz引擎,GARbro已经无法打开资源包,可以用KrkrzExtract项目,将游戏拖到exe上启动。然后下一个全cg存档,直接把所有剧情ctrl一遍,也可以获取到脚本文件。
VNTextPatch是使用cmd操作的,为了降低上手难度,我搓了一个图形化的界面,你可以在项目的useful_tools/GalTransl_DumpInjector内找到,点击GalTransl_DumpInjector.exe运行。
现在,你只需要选择日文脚本目录,然后选择保存提取的日文json的目录,这里一般将日文脚本放到叫script_jp的文件夹,再新建一个gt_input目录,用于存储提取出的脚本:
需要注意GalTransl全程是使用name-message格式的JSON输入、处理和输出的。JSON是什么
提取出来的json文件可以用emeditor打开,一般是这个样子的:
[
{
"name": "咲來",
"message": "「ってか、白鷺学園だったらあたしと一緒じゃん。\r\nセンパイだったんですねー」"
}
]
其中,每个{object(对象)}是一句话,message是消息内容,如果object还带了name,说明是对话。不过可能并不是所有类型的脚本都可以带name提取,当可以正确提取name时,GalTransl的翻译质量会更好。
PS. GalTransl只支持指定格式的json文件输入,但并不是说GalTransl就与VNTextPatch工具绑定了,也可以使用SExtractor工具,现在也支持导出GalTransl需要的name-message格式JSON
GalTransl Desktop.exe 启动桌面端。桌面端会自动启动后端服务,无需手动操作。启动后的基本流程:
桌面端支持同时打开多个项目、深色模式、自定义背景等功能,具体可在"设置"页面调整。
sampleProject中,将config.inc.yaml重命名为config.yaml,将日文json文件放入gt_input文件夹,编辑config.yaml配置翻译后端:# 翻译后端相关设置
backendSpecific:
OpenAI-Compatible: # (ForGal/ForNovel/GenDic)OpenAI API兼容接口通用
tokens:
- token: sk-example-key1
endpoint: https://api.deepseek.com # 请求地址,加不加v1都可以
modelName: deepseek-chat
- token: sk-example-key2
endpoint: https://openrouter.ai/api/v1/chat/completions # /chat/completions结尾则不自动补v1
modelName: deepseek/deepseek-chat-v3-0324:free
stream: true # 支持为单个token设置流式请求
但要注意这里获取的key填入的同时要修改endpoint地址,一般在对应平台的说明里能找到:
- token: sk-example-key1
endpoint: https://api.siliconflow.cn # 请求地址,加不加v1都可以
修改好项目设置后,确保你已经安装了需要的依赖(见环境准备),然后双击run_GalTransl_terminal.bat,输入项目路径即可开始翻译。
但是,不建议就这样开始翻译了,请至少要先学会GPT字典的使用,或者选择GenDic来生成一个人名字典,为你要翻译的gal设定好各角色的人名字典,这样才能保证基本的翻译质量。
翻译完成后,记得修修缓存,因为大模型经常会犯错。GalTransl会自动查找一些常见问题并记录于缓存中。可以对缓存进行修正,并重新运行程序来基于缓存重新生成结果json,见自动化找错章节和翻译缓存章节
注:
构建好中文脚本后,下一步就是想办法让游戏读取。首先目前主流引擎基本都是支持免封包读取的,可以继续参考Dir-A佬的教程,看看你要搞的引擎支不支持免封包读取。
特别的,针对krkr/krkrz引擎,可以使用arcusmaximus大佬的KirikiriTools工具,下载里面的version.dll,丢到游戏目录里,然后在游戏目录里新建一个"unencrypted"文件夹,将脚本直接丢进去(不用新建二级目录),就可以让krkr读取
在这一章首先需要了解一下unicode、sjis(shift jis)、gbk编码的基础知识,为了偷懒在这里我还是放Dir-A佬的文章,如果你对这块不了解的话,先去读一下。
如果你在做的引擎支持unicode编码,例如krkr、Artemis引擎等,一般就可以直接玩了。但如果引擎是使用sjis编码的话,直接打开会是乱码,这时候需要通过2种路线尝试使其可以正常显示中文:
路线1:使用GBK编码注入脚本,然后修改引擎程序使其支持GBK编码
路线2:仍然使用jis编码注入脚本,但通过jis隧道或jis替换(推荐)2种方式,结合通用注入dll在运行过程中通过动态替换来显示中文
GalTransl提取注入工具的VNTextPatch模式注入脚本时默认是以sjis或unicode(utf8)编码注入的,这取决于引擎类型。
使用路线1
(注:这个模式现在有bug,有的引擎会卡死)在注入前勾选"GBK编码注入",在这个模式下所有GBK编码不支持的字符将被替换成空白,例如音符♪
然后需要ollydbg或windbg工具,在这里下载,用于修改引擎。
最后还是去看Dir-A佬的教程,里面有教如何下断点、修改,完全没接触过逆向的话这可能很难,但没办法,照着视频多试试。
使用路线2
在注入脚本时先什么都不勾选,如果有提示"sjis_ext.bin包含文字:xxx"的话,说明程序是以sjis编码注入的,并把这些不支持显示的字符放到script_cn目录内的sjis_ext.bin里供sjis隧道模式调用了。
jis隧道:仍然来自arcusmaximus大佬的VNTranslationTools项目中的VNTextProxy组件。VNTextPatch在将文本注入回脚本时,会将sjis编码不支持的字符临时替换为sjis编码中未定义的字符,VNTextProxy通过DLL劫持技术HOOK游戏,并在遇到这些字符时再把它还原回去。
当使用sjis隧道模式时,将script_cn内的sjis_ext.bin文件移动到游戏目录内,然后将useful_tools\VNTextProxy内的所有dll逐个丢到游戏目录内(一般推荐先试version.dll,或使用PEID/DIE等工具查输入表),运行游戏,看有没有哪个dll可以正确的hook游戏并让不显示的文本可以正常显示(不正常的话那些地方会是空的)。不正常的话,删掉这个DLL,换下一个。详细设置见此
jis替换:来自AtomCrafty大佬的UniversalInjectorFramework(通用注入框架)项目,也是通过DLL劫持技术HOOK游戏,并可以将某个字符根据设置替换成指定的另一个字符,不限编码。我建立了一套替换字典,按一些规则梳理了jis编码内不支持的简中汉字与jis支持的日文汉字的映射关系,可以满足99.99%常用简体中文汉字的正常显示(见hanzi2kanji_table.txt),并将替换功能写在了GalTransl提取注入工具内(新:现在SExtractor也支持替换,并且更好用)。在替换后结合UniversalInjectorFramework的动态Hook替换功能在游戏中将这些日文汉字替换回简中文字,实现游戏的正常显示。
当使用sjis替换模式时,可以先运行一遍GalTransl提取注入工具的注入文本,获取游戏不支持的文字列表(注入后会提示"sjis_ext.bin包含文字:xxx"),然后,勾选"sjis替换模式注入",把这些文字复制到右边的文本框内,再点击注入。注入后会获得一个sjis替换模式配置。
打开useful_tools/UniversalInjectorFramework文件夹,里面也是很多dll,也是逐个尝试,一般推荐先试winmm.dll,把目录内的uif_config.json一并复制到游戏目录,然后编辑这个json,按GalTransl提取注入工具提供的配置填写source_characters和target_characters。
然后运行游戏,如果游戏可以正常运行,并且弹出了一个像这样的控制台:
那多半就搞定了。如果不正常的话,删掉这个DLL,尝试换下一个。
注:UniversalInjectorFramework也支持sjis隧道模式,可以设置tunnel_decoder为True然后在mapping里填入sjis_ext.bin包含文字。
注:UniversalInjectorFramework的控制台窗口可以隐藏,详细配置文件设置见此
介绍GPT字典、缓存、普通字典、找问题等功能。
(点击展开详细说明)
GPT字典系统是使用GalTransl翻译时想提高质量的关键功能,通过补充设定的方式大幅提高翻译质量,是GPT翻译区别于传统机翻的核心。适用于gpt35、gpt4、newbing。
在程序目录中,Dict文件夹内有"通用GPT字典.txt",在项目文件夹内可以新建"项目GPT字典.txt",一般人名定义写进项目字典,通用提高翻译质量的词汇写进通用字典。
日文[Tab]中文[Tab]解释(可不写),注意中间的连接符为TABフラン 芙兰 name, lady, teacher
笠間 笠间 笠間 陽菜乃’s lastname, girl
陽菜乃 阳菜乃 笠間 陽菜乃's firstname, girl
张三 张三 player's name, boy
$str20 $str20 player's codename, boy
这几条字典都是定义角色用的:
日文[Tab]中文[Tab]解释(可不写),注意中间的连接符为TAB大家さん 房东
あたし 我/人家 use '人家' when being cute
在程序目录中,Dict文件夹内有"通用GPT字典.txt",在sampleProject文件夹内会有"项目GPT字典.txt",一般人名定义写进项目字典,通用提高翻译质量的词汇写进通用字典。
只有当本次发送给GPT的人名和句子中有这个词,这个词的解释才会被送进本轮的对话中。
但不要什么词都往里加,什么都往里加只会害了你,推荐只写各角色的设定和总是会翻错的词。
运行时字典会动态的展示在每一次请求里:

在GalTransl中,常规字典是分为"译前字典"与"译后字典"的。译前字典是在翻译前对日文的a to b替换处理,译后字典是对译后中文的a to b替换处理。
译前字典多用于一些口齿不清的矫正情况,以及多个词代表同个意思的话,可以用译前字典先统一,减少GPT字典的输入。
译后字典就是比较常见的字典,在译后将某个词替换成另一个词,但是此处我改进了一个叫"条件字典"的东西。条件字典实际上就是在替换前增加了一步判断,用于避免误替换、过度替换等情况。
每行格式为pre_jp/post_jp[tab]判断词[tab]查找词[tab]替换词
[or]或[and]关键字连接,多个[or]连接代表"有一个条件满足就进入替换",多个[and]连接代表"条件都满足才进入替换"。开始翻译后,可以在transl_cache目录内找到翻译缓存。
翻译缓存与json_jp是一一对应的,在翻译过程中,翻译结果会优先写进缓存里,当一个文件被翻译完成后,才会出现在json_cn里。
首先,总结一些要点:
下面是翻译缓存的典型样例:
{
"index": 4,
"name": "",
"pre_jp": "欠品していたコーヒー豆を受け取ったまでは良かったが、\r\n帰り道を歩いていると汗が吹き出してくる。",
"post_jp": "欠品していたコーヒー豆を受け取ったまでは良かったが、\r\n帰り道を歩いていると汗が吹き出してくる。",
"pre_zh": "领取了缺货的咖啡豆还好,\r\n但是走在回去的路上就汗流浃背了。",
"proofread_zh": "领了缺货的咖啡豆倒是没问题,\r\n可是走在回去的路上,汗水就冒了出来。",
"trans_by": "NewBing",
"proofread_by": "NewBing",
},
解释一下每个字段的含义:
基本参数:
index 序号
name 人名
pre_jp 原始日文
post_jp 处理后日文。一般来讲,post_jp = pre_jp 去除对话框 + 译前字典替换。你会代码的话也可以在此处加入自己的处理
pre_zh 原始中文
proofread_zh 校对的中文
(没有post_zh,post_zh在结果文件夹里。)
trans_by 翻译引擎/翻译者
proofread_by 校对引擎/校对者
problem 存储问题。见下方自动化找错。
post_zh_preview 用于预览json_cn,但对它的修改并不会应用到json_cn,要修改pre_jp/proofread_zh
简单讲下如何用Emeditor修缓存:选中一个文件,先右键-Emeditor打开,然后把transl_cache内所有文件全选拖进去。
这时候标签可能会占很大位置,右键标签-自定义标签页,将"标签不合适时"改成"无",这样标签就只会在一行了(需要使用Emeditor专业版)。
接着ctrl+f搜索,搜索你感兴趣的关键字(如problem、doub_content),勾选"搜索组群中所有文档",即可快速在所有文件中搜索,或点提取快速预览所有的问题。
VSCode也是非常好的修缓存工具,只要使用VsCode打开缓存文件夹,然后全局搜索如problem,就可以快速定位所有问题
在确定需要修改的内容后,直接修改对应句子的pre_zh,或proofread_zh,然后重新跑一遍Galtransl,很快就会生成新的json_cn
GalTransl根据长期对翻译结果的观察建立了一套根据规则自动找问题的系统。
# 自动问题分析配置,在-前面加#号可以禁用
problemAnalyze:
problemList: # 要发现的问题清单
- 词频过高 # 重复大于20次
- 标点错漏 # 标点符号多加或漏加
- 残留日文 # 日文平假名片假名残留
- 丢失换行 # 缺少换行符,一般没事
- 多加换行 # 换行符比原句多,可能导致溢出屏幕
- 比日文长 # 比日文长1.3倍以上
- 字典使用 # 没有按GPT字典要求翻译
- 语言不通 # 疑似没有被翻译成目标语言,翻译为中文时检查是否包含非GBK字符
#- 引入英文 # 本来没有英文,译文引入了英文
#- 比日文长严格 # 严格查找,不能比日文长
目前支持找以上问题,有的项目被#号注释,可以取消来开启,或手动加上#号关闭对应问题的查找。
找到问题后会存在翻译缓存里,见翻译缓存章节,使用Emeditor批量提取problem关键字就可以看到目前所有的问题了,并通过修改缓存的pre_jp来修正问题。
(新) 现在还可以通过在config.yaml中配置retranslKey来批量重翻某个问题,例如 retranslKey: "残留日文"
桌面端通过图形界面管理翻译后端配置(左侧"后端配置"页面),无需手动编辑YAML。项目级配置可在"配置编辑"页面修改。
命令行版本的详细设置项可以直接阅读 config.yaml 配置文件注释,目前已经比较详细。
Python
39.3%
Cython
28.7%
TypeScript
16.8%
CSS
9.5%
XSLT
4.7%

GalTransl
支持GPT-4/Claude/Deepseek/Sakura等大语言模型的Galgame自动化翻译解决方案
GalTransl是一套将数个基础功能上的微小创新与对GPT提示工程(Prompt Engineering)的深度利用相结合的Galgame自动化翻译工具,用于制作内嵌式翻译补丁。现在提供桌面端图形界面,无需命令行操作即可完成翻译全流程。
GalTransl的核心是一组自动化翻译脚本,解决了使用ChatGPT自动化翻译Gal过程中已知的大部分问题,并提高了整体的翻译质量。同时,通过与其他项目的组合,打通了制作补丁的完整流程,一定程度降低了上手门槛。对此感兴趣的朋友可以通过本项目更容易的构建具有一定质量的机翻补丁,并(或许)可以尝试在此框架的基础上高效的构建更高质量的汉化补丁。
❗❗使用本工具翻译并在未做全文校对/润色的前提下发布时,请在最显眼的位置标注"GPT翻译/AI翻译补丁",而不是"个人汉化"或"AI汉化"补丁。
GalTransl Desktop.exe 即可使用,无需安装Python或任何依赖。桌面端会自动启动后端服务。安装、更新依赖.bat,或手动执行 pip install -r requirements.txt以下步骤适用于 Windows。从源码运行桌面端时,请先 clone 或下载本仓库源码,并在仓库根目录(包含 run_desktop_dev.bat 的目录)打开终端。
首次准备环境
python、node、npm 已加入 PATH。python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
npm.cmd --prefix desktop ci
日常启动
双击仓库根目录的 run_desktop_dev.bat,或在终端执行:
.\run_desktop_dev.bat
启动脚本会自动激活仓库中的 .venv,并识别默认安装在 %USERPROFILE%\.cargo\bin 下的 Cargo。脚本会分别打开 Python 后端和前端开发控制台:
使用注意
.venv 和依赖只需首次创建、安装。更新源码后,如果依赖有变化,重新执行上面的 Python 依赖安装命令和 npm.cmd --prefix desktop ci。ModuleNotFoundError,检查是否已将依赖安装到仓库的 .venv 中;启动脚本不会自动安装 Python 依赖。12333 和 1420 端口未被其他实例占用。退出时在后端、前端两个开发控制台分别按 Ctrl+C 停止服务,再关闭控制台;只关闭桌面窗口不会停止单独运行的 Python 后端。| 名称 | 说明 |
|---|---|
| GARbro | 引擎工具:神一样的解包工具。下载 |
| KirikiriTools | 引擎工具:Krkr、krkrz 提取、注入工具 |
| UniversalInjectorFramework | 引擎工具:sjis隧道、sjis替换模式通用注入框架 |
| VNTextProxy | 引擎工具:sjis隧道模式通用注入框架 |
| GalTransl_DumpInjector | 脚本工具:VNTextPatch的图形化界面,综合脚本文本提取导入工具 |
| SExtractor | 脚本工具:综合脚本文本提取导入工具 |
| msg-tool | 脚本工具:综合脚本文本提取导入工具 |
| DBTXT2Json_jp | 脚本工具:双行文本与json_jp互转脚本 |
| EmEditor | 文本工具:神一样的文本编辑器,主语用于修缓存文件。 |
| VSCode | 文本工具:神一样的文本编辑器,主语用于修缓存文件。 |
| KeywordGacha | 文本工具:使用 OpenAI 兼容接口自动生词语表 |
做一个gal内嵌翻译补丁的大致流程是:
我会分成以上4个模块分步讲解,这个段落为了让没做过的朋友也能有机会上手,会写的更照顾小白一些。
(点击展开详细说明)
或者,参考资源包后缀表,比较资源包的后缀。
剧情脚本一般在一些有明显关键字的资源包,或在资源包中明显关键字的目录内,例如:scene、scenario、message、script等字样。并且脚本通常是由许多明显分章节、分人物,有的还分出了剧情和hs(例如带_h),通常多翻找几个资源包就能找到。
或者,参考Dir-A佬的教程
特别的,针对新的krkrz引擎,GARbro已经无法打开资源包,可以用KrkrzExtract项目,将游戏拖到exe上启动。然后下一个全cg存档,直接把所有剧情ctrl一遍,也可以获取到脚本文件。
VNTextPatch是使用cmd操作的,为了降低上手难度,我搓了一个图形化的界面,你可以在项目的useful_tools/GalTransl_DumpInjector内找到,点击GalTransl_DumpInjector.exe运行。
现在,你只需要选择日文脚本目录,然后选择保存提取的日文json的目录,这里一般将日文脚本放到叫script_jp的文件夹,再新建一个gt_input目录,用于存储提取出的脚本:
需要注意GalTransl全程是使用name-message格式的JSON输入、处理和输出的。JSON是什么
提取出来的json文件可以用emeditor打开,一般是这个样子的:
[
{
"name": "咲來",
"message": "「ってか、白鷺学園だったらあたしと一緒じゃん。\r\nセンパイだったんですねー」"
}
]
其中,每个{object(对象)}是一句话,message是消息内容,如果object还带了name,说明是对话。不过可能并不是所有类型的脚本都可以带name提取,当可以正确提取name时,GalTransl的翻译质量会更好。
PS. GalTransl只支持指定格式的json文件输入,但并不是说GalTransl就与VNTextPatch工具绑定了,也可以使用SExtractor工具,现在也支持导出GalTransl需要的name-message格式JSON
GalTransl Desktop.exe 启动桌面端。桌面端会自动启动后端服务,无需手动操作。启动后的基本流程:
桌面端支持同时打开多个项目、深色模式、自定义背景等功能,具体可在"设置"页面调整。
sampleProject中,将config.inc.yaml重命名为config.yaml,将日文json文件放入gt_input文件夹,编辑config.yaml配置翻译后端:# 翻译后端相关设置
backendSpecific:
OpenAI-Compatible: # (ForGal/ForNovel/GenDic)OpenAI API兼容接口通用
tokens:
- token: sk-example-key1
endpoint: https://api.deepseek.com # 请求地址,加不加v1都可以
modelName: deepseek-chat
- token: sk-example-key2
endpoint: https://openrouter.ai/api/v1/chat/completions # /chat/completions结尾则不自动补v1
modelName: deepseek/deepseek-chat-v3-0324:free
stream: true # 支持为单个token设置流式请求
但要注意这里获取的key填入的同时要修改endpoint地址,一般在对应平台的说明里能找到:
- token: sk-example-key1
endpoint: https://api.siliconflow.cn # 请求地址,加不加v1都可以
修改好项目设置后,确保你已经安装了需要的依赖(见环境准备),然后双击run_GalTransl_terminal.bat,输入项目路径即可开始翻译。
但是,不建议就这样开始翻译了,请至少要先学会GPT字典的使用,或者选择GenDic来生成一个人名字典,为你要翻译的gal设定好各角色的人名字典,这样才能保证基本的翻译质量。
翻译完成后,记得修修缓存,因为大模型经常会犯错。GalTransl会自动查找一些常见问题并记录于缓存中。可以对缓存进行修正,并重新运行程序来基于缓存重新生成结果json,见自动化找错章节和翻译缓存章节
注:
构建好中文脚本后,下一步就是想办法让游戏读取。首先目前主流引擎基本都是支持免封包读取的,可以继续参考Dir-A佬的教程,看看你要搞的引擎支不支持免封包读取。
特别的,针对krkr/krkrz引擎,可以使用arcusmaximus大佬的KirikiriTools工具,下载里面的version.dll,丢到游戏目录里,然后在游戏目录里新建一个"unencrypted"文件夹,将脚本直接丢进去(不用新建二级目录),就可以让krkr读取
在这一章首先需要了解一下unicode、sjis(shift jis)、gbk编码的基础知识,为了偷懒在这里我还是放Dir-A佬的文章,如果你对这块不了解的话,先去读一下。
如果你在做的引擎支持unicode编码,例如krkr、Artemis引擎等,一般就可以直接玩了。但如果引擎是使用sjis编码的话,直接打开会是乱码,这时候需要通过2种路线尝试使其可以正常显示中文:
路线1:使用GBK编码注入脚本,然后修改引擎程序使其支持GBK编码
路线2:仍然使用jis编码注入脚本,但通过jis隧道或jis替换(推荐)2种方式,结合通用注入dll在运行过程中通过动态替换来显示中文
GalTransl提取注入工具的VNTextPatch模式注入脚本时默认是以sjis或unicode(utf8)编码注入的,这取决于引擎类型。
使用路线1
(注:这个模式现在有bug,有的引擎会卡死)在注入前勾选"GBK编码注入",在这个模式下所有GBK编码不支持的字符将被替换成空白,例如音符♪
然后需要ollydbg或windbg工具,在这里下载,用于修改引擎。
最后还是去看Dir-A佬的教程,里面有教如何下断点、修改,完全没接触过逆向的话这可能很难,但没办法,照着视频多试试。
使用路线2
在注入脚本时先什么都不勾选,如果有提示"sjis_ext.bin包含文字:xxx"的话,说明程序是以sjis编码注入的,并把这些不支持显示的字符放到script_cn目录内的sjis_ext.bin里供sjis隧道模式调用了。
jis隧道:仍然来自arcusmaximus大佬的VNTranslationTools项目中的VNTextProxy组件。VNTextPatch在将文本注入回脚本时,会将sjis编码不支持的字符临时替换为sjis编码中未定义的字符,VNTextProxy通过DLL劫持技术HOOK游戏,并在遇到这些字符时再把它还原回去。
当使用sjis隧道模式时,将script_cn内的sjis_ext.bin文件移动到游戏目录内,然后将useful_tools\VNTextProxy内的所有dll逐个丢到游戏目录内(一般推荐先试version.dll,或使用PEID/DIE等工具查输入表),运行游戏,看有没有哪个dll可以正确的hook游戏并让不显示的文本可以正常显示(不正常的话那些地方会是空的)。不正常的话,删掉这个DLL,换下一个。详细设置见此
jis替换:来自AtomCrafty大佬的UniversalInjectorFramework(通用注入框架)项目,也是通过DLL劫持技术HOOK游戏,并可以将某个字符根据设置替换成指定的另一个字符,不限编码。我建立了一套替换字典,按一些规则梳理了jis编码内不支持的简中汉字与jis支持的日文汉字的映射关系,可以满足99.99%常用简体中文汉字的正常显示(见hanzi2kanji_table.txt),并将替换功能写在了GalTransl提取注入工具内(新:现在SExtractor也支持替换,并且更好用)。在替换后结合UniversalInjectorFramework的动态Hook替换功能在游戏中将这些日文汉字替换回简中文字,实现游戏的正常显示。
当使用sjis替换模式时,可以先运行一遍GalTransl提取注入工具的注入文本,获取游戏不支持的文字列表(注入后会提示"sjis_ext.bin包含文字:xxx"),然后,勾选"sjis替换模式注入",把这些文字复制到右边的文本框内,再点击注入。注入后会获得一个sjis替换模式配置。
打开useful_tools/UniversalInjectorFramework文件夹,里面也是很多dll,也是逐个尝试,一般推荐先试winmm.dll,把目录内的uif_config.json一并复制到游戏目录,然后编辑这个json,按GalTransl提取注入工具提供的配置填写source_characters和target_characters。
然后运行游戏,如果游戏可以正常运行,并且弹出了一个像这样的控制台:
那多半就搞定了。如果不正常的话,删掉这个DLL,尝试换下一个。
注:UniversalInjectorFramework也支持sjis隧道模式,可以设置tunnel_decoder为True然后在mapping里填入sjis_ext.bin包含文字。
注:UniversalInjectorFramework的控制台窗口可以隐藏,详细配置文件设置见此
介绍GPT字典、缓存、普通字典、找问题等功能。
(点击展开详细说明)
GPT字典系统是使用GalTransl翻译时想提高质量的关键功能,通过补充设定的方式大幅提高翻译质量,是GPT翻译区别于传统机翻的核心。适用于gpt35、gpt4、newbing。
在程序目录中,Dict文件夹内有"通用GPT字典.txt",在项目文件夹内可以新建"项目GPT字典.txt",一般人名定义写进项目字典,通用提高翻译质量的词汇写进通用字典。
日文[Tab]中文[Tab]解释(可不写),注意中间的连接符为TABフラン 芙兰 name, lady, teacher
笠間 笠间 笠間 陽菜乃’s lastname, girl
陽菜乃 阳菜乃 笠間 陽菜乃's firstname, girl
张三 张三 player's name, boy
$str20 $str20 player's codename, boy
这几条字典都是定义角色用的:
日文[Tab]中文[Tab]解释(可不写),注意中间的连接符为TAB大家さん 房东
あたし 我/人家 use '人家' when being cute
在程序目录中,Dict文件夹内有"通用GPT字典.txt",在sampleProject文件夹内会有"项目GPT字典.txt",一般人名定义写进项目字典,通用提高翻译质量的词汇写进通用字典。
只有当本次发送给GPT的人名和句子中有这个词,这个词的解释才会被送进本轮的对话中。
但不要什么词都往里加,什么都往里加只会害了你,推荐只写各角色的设定和总是会翻错的词。
运行时字典会动态的展示在每一次请求里:

在GalTransl中,常规字典是分为"译前字典"与"译后字典"的。译前字典是在翻译前对日文的a to b替换处理,译后字典是对译后中文的a to b替换处理。
译前字典多用于一些口齿不清的矫正情况,以及多个词代表同个意思的话,可以用译前字典先统一,减少GPT字典的输入。
译后字典就是比较常见的字典,在译后将某个词替换成另一个词,但是此处我改进了一个叫"条件字典"的东西。条件字典实际上就是在替换前增加了一步判断,用于避免误替换、过度替换等情况。
每行格式为pre_jp/post_jp[tab]判断词[tab]查找词[tab]替换词
[or]或[and]关键字连接,多个[or]连接代表"有一个条件满足就进入替换",多个[and]连接代表"条件都满足才进入替换"。开始翻译后,可以在transl_cache目录内找到翻译缓存。
翻译缓存与json_jp是一一对应的,在翻译过程中,翻译结果会优先写进缓存里,当一个文件被翻译完成后,才会出现在json_cn里。
首先,总结一些要点:
下面是翻译缓存的典型样例:
{
"index": 4,
"name": "",
"pre_jp": "欠品していたコーヒー豆を受け取ったまでは良かったが、\r\n帰り道を歩いていると汗が吹き出してくる。",
"post_jp": "欠品していたコーヒー豆を受け取ったまでは良かったが、\r\n帰り道を歩いていると汗が吹き出してくる。",
"pre_zh": "领取了缺货的咖啡豆还好,\r\n但是走在回去的路上就汗流浃背了。",
"proofread_zh": "领了缺货的咖啡豆倒是没问题,\r\n可是走在回去的路上,汗水就冒了出来。",
"trans_by": "NewBing",
"proofread_by": "NewBing",
},
解释一下每个字段的含义:
基本参数:
index 序号
name 人名
pre_jp 原始日文
post_jp 处理后日文。一般来讲,post_jp = pre_jp 去除对话框 + 译前字典替换。你会代码的话也可以在此处加入自己的处理
pre_zh 原始中文
proofread_zh 校对的中文
(没有post_zh,post_zh在结果文件夹里。)
trans_by 翻译引擎/翻译者
proofread_by 校对引擎/校对者
problem 存储问题。见下方自动化找错。
post_zh_preview 用于预览json_cn,但对它的修改并不会应用到json_cn,要修改pre_jp/proofread_zh
简单讲下如何用Emeditor修缓存:选中一个文件,先右键-Emeditor打开,然后把transl_cache内所有文件全选拖进去。
这时候标签可能会占很大位置,右键标签-自定义标签页,将"标签不合适时"改成"无",这样标签就只会在一行了(需要使用Emeditor专业版)。
接着ctrl+f搜索,搜索你感兴趣的关键字(如problem、doub_content),勾选"搜索组群中所有文档",即可快速在所有文件中搜索,或点提取快速预览所有的问题。
VSCode也是非常好的修缓存工具,只要使用VsCode打开缓存文件夹,然后全局搜索如problem,就可以快速定位所有问题
在确定需要修改的内容后,直接修改对应句子的pre_zh,或proofread_zh,然后重新跑一遍Galtransl,很快就会生成新的json_cn
GalTransl根据长期对翻译结果的观察建立了一套根据规则自动找问题的系统。
# 自动问题分析配置,在-前面加#号可以禁用
problemAnalyze:
problemList: # 要发现的问题清单
- 词频过高 # 重复大于20次
- 标点错漏 # 标点符号多加或漏加
- 残留日文 # 日文平假名片假名残留
- 丢失换行 # 缺少换行符,一般没事
- 多加换行 # 换行符比原句多,可能导致溢出屏幕
- 比日文长 # 比日文长1.3倍以上
- 字典使用 # 没有按GPT字典要求翻译
- 语言不通 # 疑似没有被翻译成目标语言,翻译为中文时检查是否包含非GBK字符
#- 引入英文 # 本来没有英文,译文引入了英文
#- 比日文长严格 # 严格查找,不能比日文长
目前支持找以上问题,有的项目被#号注释,可以取消来开启,或手动加上#号关闭对应问题的查找。
找到问题后会存在翻译缓存里,见翻译缓存章节,使用Emeditor批量提取problem关键字就可以看到目前所有的问题了,并通过修改缓存的pre_jp来修正问题。
(新) 现在还可以通过在config.yaml中配置retranslKey来批量重翻某个问题,例如 retranslKey: "残留日文"
桌面端通过图形界面管理翻译后端配置(左侧"后端配置"页面),无需手动编辑YAML。项目级配置可在"配置编辑"页面修改。
命令行版本的详细设置项可以直接阅读 config.yaml 配置文件注释,目前已经比较详细。
Python
39.3%
Cython
28.7%
TypeScript
16.8%
CSS
9.5%
XSLT
4.7%