How to translate YU-RIS visual novels to English
RuneTranslate translates YU-RIS (raiL-soft) visual novels into English and 30+ languages — reading .ypf packages and compiled YSTB scripts in pure TypeScript, recovering each script’s XOR key, and exporting translated scripts loose. Best-effort.
RuneTranslate reads another engine that has long been a wall for fan translators: YU-RIS, the Windows scripting engine by raiL-softbehind hundreds of doujin and commercial Japanese visual novels. If you've ever opened a YU-RIS game folder, found a pac/ directory full of .ypf archives and a ysbin.ypfwith nothing readable inside, and given up — that's the engine. RuneTranslate detects it, opens those packages in pure TypeScript, reads the dialogue out of the compiled scripts, and exports a translated copy the game loads on its own.
The honest part first: YU-RIS support is freshly built and has not yet been verified across many real games. So if you point RuneTranslate at a YU-RIS game and it doesn't detect, doesn't open, or exports something the game won't load, please tell us — more at the end.
What the YU-RIS engine actually is
YU-RIS (sometimes written ゆーりす) is a Japanese visual-novel scripting engine by raiL-soft. A finished game is a Windows .exe plus a set of .ypfpackage archives — usually in a pac/folder — holding art, audio, and scripts. The scenario is compiled into a binary format called YSTB, stored as the .ybn files inside ysbin.ypf (at internal paths like ysbin/yst00000.ybn). That “compiled scenario inside a packed archive” combination is exactly what has kept the engine's big back catalogue out of reach for ordinary machine-translation tools.
Why YU-RIS games have been so hard to translate
Compared with a source-driven engine like Ren'Py, YU-RIS hides its text behind several layers:
- Everything lives inside
.ypfpackages.The scripts aren't loose — they're packed into YU-RIS's own container with obfuscated filenames and zlib-compressed entries. Without a reader for that format, there's nothing to edit. - The scenario is compiled, not text. A
.ybnis a binaryYSTBcontainer split into four sections (instruction stream, argument-descriptor table, string table, line numbers). The Japanese lives in the string table, referenced by the descriptors. - The scripts are XOR-encrypted. Each
YSTB's four sections are scrambled with a 4-byte key that varies per game. You have to recover it before any text is readable. - Not every string is dialogue.The string table also holds variable names, asset paths, and expression operands the script compares against — translate one and the flow quietly breaks.
The net effect: even a fluent reader must unpack a proprietary archive, parse a compiled binary, break the XOR, then tell dialogue from the engine's internal strings — before a single line gets translated. That's the work RuneTranslate does for you.
What RuneTranslate does now
RuneTranslate handles the whole pipeline in pure TypeScript — no external tools, no Python sidecar, nothing to install:
- Reads
.ypfpackages directly.It opens the archives in-house, decompresses entries, and recovers the obfuscated filenames — no GARbro. Already unpacked the game yourself? A looseysbin/folder of.ybnscripts is detected too. - Parses the compiled
YSTBscripts and breaks the encryption. It recovers each script's 4-byte XOR key automatically from the argument-descriptor table, decodes the Shift-JIS string table, and lists every Japanese line, grouped by script file. - Knows dialogue from machinery. Variable names, asset paths, and expression operands are surfaced but excluded by default as red opt-in rows, so you never translate a string the story logic compares against.
- Preserves inline control codes. Backslash codes (newline, colour, ruby) and bracketed tags are masked behind numeric placeholders before the provider sees them, then restored exactly.
- Exports without repacking.It rebuilds each translated script — patching the string-table offsets so a longer or shorter translation fits, and re-applying the XOR key — then writes the
.ybnloose at its original archive path. YU-RIS prefers a loose file over the packed copy, so the game just reads your translation — the same loose-file override as our Kirikiri and Artemis flows.
Japanese → English is the sweet spot, but you can target 30+ languages.
What you need
- RuneTranslate for Windows— free; every engine and provider is unlocked (the free tier is throttled on speed, not features).
- A YU-RIS game folder — the directory with the game's
yu-ris.exeand its.ypfpackages (typically inpac/, with the scripts inysbin.ypf). - A target language — English, Spanish, French, German, Chinese, and 30+ more.
- One provider. Free Google Translate works out of the box; DeepL has a free tier; OpenAI, Anthropic, a local model, and any OpenAI-compatible API are bring-your-own-key. YU-RIS games are dialogue-heavy, so an LLM or DeepL reads best.
Step 1: Open the game folder
Launch RuneTranslate, click New project, and point it at the YU-RIS game directory. Detection runs automatically — when it sees a .ypf package (or a loose ysbin/ folder of .ybn scripts), it recognises the project as YU-RIS. Your original game folder is never modified.
Step 2: How the scripts get read
RuneTranslate opens the .ypf packages, pulls the compiled YSTB scripts out of ysbin.ypf, recovers each script's XOR key, and decodes the Shift-JIS string table — listing every Japanese line in the editor, grouped by file. The engine's internal strings (variable names, asset paths, expression operands) are shown but excluded by default, and inline control codes are masked behind numeric placeholders so the provider never mangles them.
Step 3: Translate
Pick a provider and run. An LLM (OpenAI / Anthropic) is best for character voice and tone, DeepL is fast and clean for narration, and free Google Translateis fine for short menu strings and choices. Glossary your cast up front so names render identically — see Glossary 101. When you're done, an optional pass with the AI refiner re-reads each line in context and tightens the stiff, literal phrasing MT tends to leave behind.
Step 4: Export a ready-to-run copy
Click Export. RuneTranslate writes a translated copy of the game with each rebuilt .ybn placed loose at its original archive path, alongside the untouched .ypfpackages. There's no repack— YU-RIS loads the loose scripts in preference to the packed originals, so the game just reads your translations. Run it, and it plays in your target language.
Known limitations
- YU-RIS strings are Shift-JIS (cp932).English and other cp932-representable targets export cleanly. Targets outside cp932 — extended Cyrillic, Korean, Traditional Chinese — need a game-font/encoding hack that isn't automated yet.
- The loose-file override is the expected load pathand works on most YU-RIS games because the engine prefers a loose script over the packed copy. On the rare title that doesn't honour that, the export may need adjusting — exactly the real-game behaviour we're still confirming.
- Text baked into image art— a title screen or menu button drawn as a bitmap — is pixels, not script text. For that, see image-text translation.
- The exact archive and script variant can differ between releases. Always verify on your specific copy.
It's brand new — tell us what breaks
Worth repeating: YU-RIS support is a fresh addition and has not yet been tested across many real games. The .ypf reader, the YSTBparser, and the key recovery are built and unit-tested, but the engine has years of per-studio variation we haven't all seen. So if you point RuneTranslate at a YU-RIS game and it doesn't detect, doesn't open the archives, extracts nothing, or exports something the game won't load, please report it on our Discord — the game's name and how it's packaged helps us harden it fastest.
Download RuneTranslate, point it at that YU-RIS VN you've been wanting to read, and try it. For another archive-based VN engine, read the Artemis walkthrough next.
Ready to try RuneTranslate?
Free tier unlocks every engine + every translation provider. Supporter ($3/mo) unlocks full speed.
Download for Windows