三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Galgame翻译工具YUKI实测:从下载到多引擎对照,15分钟跑通全流程

Galgame翻译工具YUKI实测:从下载到多引擎对照,15分钟跑通全流程

Galgame翻译工具YUKI实测:从下载到多引擎对照,15分钟跑通全流程

【免费下载链接】YUKIYUKI Galgame Translator项目地址: https://gitcode.com/gh_mirrors/yu/YUKI

深夜十一点,你终于打开那部心心念念的日文 Galgame,可看了十分钟,一半台词要靠连蒙带猜。逐句切出去查词典太破坏节奏,网页翻译又跟不上游戏速度——此刻你需要的,是一个能"当场"读出台词的助手。Galgame翻译工具 YUKI 就是这样一款开源软件:它从正在运行的游戏进程里直接提取文本,在游戏窗口上方弹出原文与译文对照,从下载到看到第一句翻译,15 分钟足够。

上图是它的实际工作画面:上方窗口把同一句日文台词并列展示有道、沪江、谷歌、JBeijing 四份译文,下方是正在运行的游戏本体。这种"对照式"翻译,正是 YUKI 区别于一键机翻工具的地方——它不替你选答案,而是把多个来源摆在桌面上让你自己判断。

先弄懂它怎么"偷听"游戏台词

也许你会问:翻译器怎么知道游戏此刻显示的是哪句话?答案藏在文本钩取(Text Hooking)技术里。YUKI 的后端基于 Textractor,程序附带的lib/textractor/目录下就有TextractorCLI.exetexthook.dll。当游戏使用标准文本渲染方式时,YUKI 通过注入代码截获游戏写入内存的字符串,再交给翻译管线处理。

文本从钩取到显示,中间要经过一条完整处理链,相关源码在 src/main/middlewares/:

  • FilterMiddleware:过滤重复、无意义的噪声文本
  • TextMergerMiddleware:把被游戏拆成碎片的半句台词拼回完整句子
  • MeCabMiddleware:调用 MeCab 对日文分词,为词典查词做准备
  • TextModifierMiddleware:按规则修正文本,比如去掉叠字
  • PublishMiddleware:把最终结果发布给渲染窗口显示

这套设计解释了 YUKI 的两个特点:界面由 Electron 驱动,比老牌 VNR 的 Python 2 界面流畅得多;文本提取直接调用 Windows API,不经过浏览器壳,兼容性更可控,还能免特殊码支持更多游戏。

从下载到跑起来,两条路线任选

路线一适合只想用的人:到项目 Release 页面下载最新版 ZIP 压缩包,解压即用,无需安装步骤,所需运行库会在首次启动时自动补齐。

路线二适合想尝鲜或二次开发的人,在装有 Node.js 与 yarn 的机器上执行:

git clone https://gitcode.com/gh_mirrors/yu/YUKI cd YUKI yarn yarn dev
  • git clone:把源码拉到本地
  • yarn:安装全部依赖
  • yarn dev:以开发模式启动,改完代码即时生效

两个小提醒:游戏建议以窗口化运行,全屏模式下浮动窗口可能被遮住;启动游戏后,记得在 YUKI 里选中对应进程并挂上钩子。

三个配置项,决定翻译体验的上限

YUKI 的"控制台"是程序根目录下的config/文件夹,核心是config/config.json。初次启动时程序自动生成一份完整默认配置;只要文件已存在就不会被覆盖,所以升级版本后,把旧config/目录整体拷进新目录,即可恢复原有设置。

多引擎对照的开关,藏在 onlineApis 数组里

"onlineApis": [ { "enable": true, "external": true, "jsFile": "config\\qqApi.js", "name": "腾讯" }, { "enable": true, "method": "POST", "name": "谷歌", "url": "https://translate.google.cn/m" }, { "enable": false, "external": true, "jsFile": "config\\azureApi.js", "name": "Azure" } ]

把某个引擎的enable改为true,重启后它就参与翻译。想对比译文的语境贴合度,就同时开两三个;某个引擎当天抽风,直接关掉,互不影响。

修改配置的三条纪律

  1. 改 JSON 后必须重启 YUKI 才生效;但config/下的 JS 文件保存后会自动重载
  2. 不要删除配置项,程序某些模块不检查缺失字段,删了可能直接报错
  3. JSON 不支持注释,字符串必须用双引号,路径里的反斜杠要写成\\

字段的完整说明见 docs/ConfigFiles_CN.md。此外,localeChangers里可配置 Locale Emulator、Ntleas 等转区工具,避免非日文系统下游戏乱码。

断网时,它靠什么继续翻译

如果当天网络状况不佳,YUKI 还有两条离线通道。一是 JBeijing 本地词典,程序会加载lib/dict/jb/目录下的词典文件;二是灵格斯词典(如njcd.db),两者分别通过config.json中的translators.jBeijingdictionaries.lingoes指定路径。再配合 MeCab 分词,离线状态下也能给出词级释义。

离线翻译的质量虽不及在线引擎,但胜在即时且稳定——剧情卡在关键句时,至少能知道每个词在说什么。

进阶玩法:把翻译引擎换成你自己的

config/目录下的qqApi.jsbaiduApi.jsazureApi.js等文件,是 YUKI 的"可编程翻译 API"机制。很多在线翻译接口要求计算 sign、timestamp 之类的签名参数,纯 JSON 配置算不出来,于是 YUKI 允许你用 JavaScript 写完整的请求逻辑,程序在运行时直接调用。

以 config/qqApi.js 为例,它的工作流大致是:先访问翻译首页获取会话 Cookie,再解析页面里的qtvqtk两个动态参数,随后带着它们 POST 请求翻译接口、解析响应并交给callback回调。想接一个文档里没有的新引擎,照这个文件的结构改写 URL、参数与响应解析即可。

这种把 API 与主程序解耦的设计还有个隐藏好处:即便未来项目停止更新,翻译接口失效时你只需修改config/里的 JS 文件,不必动主程序源码。

常见问题速查:先看这里,别急着重装

翻译窗口一直不出现?检查游戏是否全屏运行;也可以点翻译窗口右上角的锁形"置顶"按钮,在置顶/不置顶间切换,解决窗口互相遮挡的问题。

游戏文本提取不到?确认游戏使用标准文本渲染方式;部分特殊引擎需要调整钩子参数,可在翻译器窗口的 Hook 设置页面微调。

某个引擎总是报错?百度和沪江对单设备日均调用有限制,建议放慢推进速度、换用其开放平台接口,或直接禁用该引擎。若看到ERR: TypeError: Cannot read property 'target' of undefined,多半是彩云 API 故障,把onlineApis中 name 为"彩云"那一项的enable改为false即可。

翻译结果出现叠字?在 text.json 中把deduplicate设为true

更多排查思路收录在 docs/FAQ_CN.md。

下一步:照着这份清单走一遍

  1. 下载绿色版 ZIP(或按上文命令从源码构建)
  2. 打开config/config.json,启用 2–3 个翻译引擎
  3. 以窗口化启动游戏,在 YUKI 中选择进程并挂上钩子
  4. 对照多引擎译文,留下最贴合语境的那一个
  5. 有进阶需求,再研究config/下的 JS 文件,写自己的外部 API

YUKI 以 GPLv3 许可证开源,源码、配置、文档全部开放,也正因如此,它允许你把它调教成完全符合自己习惯的形状。语言不该是享受故事的障碍——15 分钟,足够让这句话变成现实。🎮

【免费下载链接】YUKIYUKI Galgame Translator项目地址: https://gitcode.com/gh_mirrors/yu/YUKI

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

← 返回列表