Engineeringこの記事を日本語で読む

Localizing visual novels and text-heavy narrative games

A visual novel or dialogue-heavy narrative game is a different localization problem from most other genres, mostly because of scale. Where an action game might have a few thousand words of UI and item text, a mid-length visual novel routinely runs into the hundreds of thousands of words, sometimes over a million across branching routes. Engines built for this genre — Ren'Py is the best-known open-source example, and RPG Maker projects with heavy dialogue face the same shape of problem — generally organize script and dialogue as structured text files with speaker and line information, which is exactly the right shape for the volume involved, but volume itself becomes the central challenge rather than any particular technical mechanism.

This article is about what changes when dialogue is the majority of your game rather than a supporting feature: consistency at scale, text box constraints, Japanese-specific typographic concerns, and why revision tracking becomes non-negotiable once a script this large starts getting edited after translation has begun.

Consistency at scale is the real challenge

With hundreds of thousands of words, no single translator holds the entire script in their head, and even a small team will each work on different chapters or routes in parallel. The result, without deliberate effort, is drift: a character's speech pattern shifts partway through, an item or place name gets translated two different ways, an honorific or form of address is used inconsistently for the same relationship.

The fix is not more talent, it is more structure: a shared glossary of names, places, and recurring terms that is treated as authoritative and updated the moment a term is introduced; character voice notes (formality level, verbal tics, preferred vocabulary) attached somewhere every translator working on that character can find them; and some review pass — even a lightweight one — that specifically checks for consistency across chapters rather than only correctness within one.

Speaker attribution is data, not decoration

Every line in a well-structured VN script is associated with a speaker, and that association matters far beyond who the name tag on screen says is talking. It tells a translator which character's voice to write in, it is what a glossary of character-specific vocabulary keys off, and it is what makes automated consistency checks possible in the first place — you cannot flag a mid-scene tone shift for a character if the data does not know which character is speaking.

Keep speaker identity as structured data, not just implied by scene context or embedded in the prose itself. A stray unattributed line, or a speaker tag that is technically correct but inconsistent in format across the script, quietly breaks any tooling built on top of it.

Text box length is a real constraint, not a suggestion

Dialogue is usually rendered inside a fixed-size text box, sometimes with a portrait taking up part of the screen, and unlike a UI label that might resize, a dialogue box in a VN often has a hard practical limit on lines and characters per line before text either scrolls awkwardly, overflows, or gets auto-shrunk into illegibility. English source text written to comfortably fit a box will frequently not fit once translated into a longer language, and the reverse can also be true for Japanese source translated into English, where terse Japanese lines sometimes expand significantly.

This is worth testing directly and early with realistic-length placeholder text in the actual text box, in the actual font, before a large volume of real translation exists — finding out a box overflows after a hundred thousand words are translated is a far more expensive fix than finding out on line one.

Ruby, furigana, and Japanese-specific typography

If Japanese is either your source or target language, ruby text (furigana — small pronunciation glyphs placed above kanji) is worth planning for explicitly rather than retrofitting. It is commonly used for character names, invented terms, or kanji intentionally read with a non-standard pronunciation for stylistic effect, and it needs both font and rendering support plus a way to encode the ruby-base and ruby-text pairing in your script format. If your project involves creative use of furigana (a name read differently than its kanji would normally suggest, for instance), that pairing is content, not formatting, and needs to survive the translation and text pipeline intact even when translating into a language where furigana has no equivalent at all.

Why regression tracking matters here specifically

Narrative scripts get revised after translation starts, more than almost any other kind of game text — a writer tightens a scene, fixes a plot hole, or reworks dialogue for pacing, and that edit lands in a script that may already be partially or fully translated. Without a way to detect exactly which lines changed, a team either re-translates the entire chapter out of caution (wasteful) or risks missing the specific lines that actually changed (a worse outcome — a stale translation sitting next to a revised original, invisible until a player notices the mismatch).

This is where treating your script as versioned, structured data pays off directly: a reliable way to fingerprint each line so an edit to one line's source text is detectable as a change to that line specifically, not a vague signal that something in this chapter changed. Whatever tooling you use, this is the property to insist on before your script is large enough that manual diffing stops being realistic.

  • A shared, actively maintained glossary for names, places, and recurring terms
  • Speaker identity kept as structured data on every line, not inferred from context
  • Text box limits verified with realistic-length dummy text before real translation begins
  • A deliberate plan for ruby/furigana if Japanese is source or target
  • Line-level change detection so a script revision does not silently orphan a translation

Related articles