如何将 YU-RIS 视觉小说翻译成英语
RuneTranslate 把 YU-RIS(raiL-soft)视觉小说翻译成英语和 30 多种语言 —— 用纯 TypeScript 读取 .ypf 包和编译过的 YSTB 脚本、恢复每个脚本的 XOR 密钥,并把译好的脚本松散导出。尽力而为。
RuneTranslate 能读取又一个长期让粉丝译者碰壁的引擎:YU-RIS,由 raiL-soft 打造的 Windows 脚本引擎,支撑着数百部同人及商业日语视觉小说。如果你曾打开过一个 YU-RIS 游戏文件夹,发现一个塞满 .ypf 归档的 pac/ 目录,和一个里面没有任何可读内容的 ysbin.ypf,然后放弃了 —— 那就是这个引擎。RuneTranslate 会检测它、用纯 TypeScript 打开那些包、从编译过的脚本中读出对话,并导出游戏自己就能加载的译好副本。
先说实话:YU-RIS 支持是刚构建好的,尚未在许多真实游戏上验证过。所以如果你把 RuneTranslate 指向一个 YU-RIS 游戏,而它检测不到、打不开,或导出了游戏无法加载的东西,请告诉我们 —— 文末有更多说明。
YU-RIS 引擎究竟是什么
YU-RIS(有时写作 ゆーりす)是由 raiL-soft 打造的日语视觉小说脚本引擎。一个成品游戏是一个 Windows .exe 加一组 .ypf 包归档 —— 通常在一个 pac/ 文件夹里 —— 承载美术、音频和脚本。剧本被编译成一种叫 YSTB 的二进制格式,作为 ysbin.ypf 内部的 .ybn 文件存储(内部路径类似 ysbin/yst00000.ybn)。正是那种"打包归档里的编译剧本"组合,让这个引擎庞大的旧作库一直无法被普通机器翻译工具触及。
YU-RIS 游戏为何一直如此难翻译
与像 Ren'Py 那样源代码驱动的引擎相比,YU-RIS 把它的文本藏在好几层之后:
- 一切都在 `.ypf` 包里。 脚本不是松散的 —— 它们被打进 YU-RIS 自己的容器里,文件名经过混淆,条目经过 zlib 压缩。没有该格式的读取器,就没有东西可编辑。
- 剧本是编译过的,不是文本。 一个
.ybn是一个二进制YSTB容器,分为四段(指令流、参数描述符表、字符串表、行号)。日语住在字符串表里,由描述符引用。 - 脚本经过 XOR 加密。 每个
YSTB的四段都用一个每个游戏各不相同的 4 字节密钥打乱。你必须先把它恢复出来,任何文本才可读。 - 并非每个字符串都是对话。 字符串表里还有变量名、资源路径,以及脚本用来比较的表达式操作数 —— 翻译了一个,流程就会悄无声息地坏掉。
净效应是:即便是流利的读者,也必须先拆开一个专有归档、解析一个编译过的二进制、解密 XOR,再把对话从引擎内部字符串中区分出来 —— 然后才有一行被翻译。这正是 RuneTranslate 替你做的工作。
RuneTranslate 现在能做什么
RuneTranslate 用纯 TypeScript 处理整条流水线 —— 没有外部工具、没有 Python 附属程序、无需安装任何东西:
- 直接读取 `.ypf` 包。 它自行打开归档、解压条目,并恢复被混淆的文件名 —— 无需 GARbro。已经自己拆好了游戏?一个松散的
.ybn脚本ysbin/文件夹也会被检测到。 - 解析编译过的 `YSTB` 脚本并解开加密。 它自动从参数描述符表中恢复每个脚本的 4 字节 XOR 密钥、解码 Shift-JIS 字符串表,并按脚本文件分组列出每一条日语行。
- 能区分对话与机器逻辑。 变量名、资源路径和表达式操作数会被呈现出来,但默认排除为红色的选择加入行,所以你绝不会翻译一个故事逻辑用来比较的字符串。
- 保留内联控制码。 反斜杠码(换行、颜色、注音)和方括号标记会在翻译服务看到之前被屏蔽为数字占位符,然后被精确还原。
- 导出时不重新打包。 它会重建每个译好的脚本 —— 打补丁修正字符串表偏移,让更长或更短的译文能放下,并重新施加 XOR 密钥 —— 然后把
.ybn松散地写在它原来的归档路径上。YU-RIS 会优先用松散文件而非打包的副本,于是游戏直接读取你的译文 —— 这与我们的 Kirikiri 和 Artemis 流程是同一种松散文件覆盖。
日译英是最佳场景,但你可以针对 30 多种语言。
你需要准备什么
- Windows 版 RuneTranslate —— 免费;每一种引擎和翻译服务都已解锁(免费档位是速度受限,而非功能受限)。
- 一个 YU-RIS 游戏文件夹 —— 含有游戏
yu-ris.exe及其.ypf包的目录(通常在pac/里,脚本在ysbin.ypf中)。 - 一个目标语言 —— 英语、西班牙语、法语、德语、中文,以及 30 多种其他语言。
- 一个翻译服务。免费的 Google Translate 开箱即用;DeepL 有免费档位;OpenAI、Anthropic、一个本地模型,以及任意 OpenAI 兼容 API 都需要自备密钥。YU-RIS 游戏对话量很大,所以 LLM 或 DeepL 读起来最好。
第 1 步:打开游戏文件夹
启动 RuneTranslate,点击 新建项目,把它指向 YU-RIS 游戏目录。检测会自动运行 —— 当它看到一个 .ypf 包(或一个松散的 .ybn 脚本 ysbin/ 文件夹)时,就把项目识别为 YU-RIS。你的原始游戏文件夹永远不会被修改。
第 2 步:脚本是如何被读取的
RuneTranslate 会打开 .ypf 包,从 ysbin.ypf 里取出编译过的 YSTB 脚本,恢复每个脚本的 XOR 密钥,并解码 Shift-JIS 字符串表 —— 在编辑器里按文件分组列出每一条日语行。引擎的内部字符串(变量名、资源路径、表达式操作数)会显示但默认排除,而内联控制码会被屏蔽为数字占位符,让翻译服务永远不会弄乱它们。
第 3 步:翻译
选一个翻译服务并运行。LLM(OpenAI / Anthropic)最适合角色声线和语气,DeepL 对旁白又快又干净,而免费的 Google Translate 对短菜单字符串和选项够用。事先给你的角色阵容建好术语表,让名字渲染得一模一样 —— 参见 术语表 101。完成后,用 AI 润色器 做可选的一遍处理,它会在上下文中重读每一行,收紧 MT 往往留下的生硬、直译的措辞。
第 4 步:导出即刻可运行的副本
点击 导出。RuneTranslate 会写出一个游戏的译好副本,把每个重建的 .ybn 松散地放在它原来的归档路径上,与未改动的 .ypf 包并排。不重新打包 —— YU-RIS 会优先加载松散脚本而非打包的原件,于是游戏直接读取你的译文。运行它,它就用你的目标语言游玩。
已知的局限
- YU-RIS 字符串是 Shift-JIS(cp932)。 英语和其他可用 cp932 表示的目标语言能干净地导出。cp932 之外的目标语言 —— 扩展西里尔、韩语、繁体中文 —— 需要一个尚未自动化的游戏字体/编码技巧。
- 松散文件覆盖是预期的加载路径,在大多数 YU-RIS 游戏上都能用,因为引擎偏好松散脚本而非打包副本。在少数不遵守这一点的作品上,导出可能需要调整 —— 这正是我们仍在确认的真实游戏行为。
- 烘焙进图像美术里的文本 —— 一个作为位图绘制的标题画面或菜单按钮 —— 是像素,不是脚本文本。那种情况请参见 图片文字翻译。
- 确切的归档和脚本变体在不同版本之间可能不同。请始终在你的具体副本上验证。
它是全新的 —— 告诉我们哪里坏了
值得重复:YU-RIS 支持是一个全新加入,尚未在许多真实游戏上测试过。.ypf 读取器、YSTB 解析器和密钥恢复都已构建并经过单元测试,但这个引擎有多年、每个工作室各异、我们并未全部见过的变体。所以如果你把 RuneTranslate 指向一个 YU-RIS 游戏,而它检测不到、打不开归档、什么也提取不出,或导出了游戏无法加载的东西,请在我们的 Discord 上报告 —— 游戏名和它的打包方式能帮我们最快地加固它。
下载 RuneTranslate,把它指向你一直想读的那个 YU-RIS VN,试一试。想看另一个基于归档的 VN 引擎,接着读 Artemis 教程。

