---
id: two-stage-user-styled-translation
title: Two-stage styled translation exists only in pieces
version: 1
published: '2026-10-27'
updated: '2026-10-27'
author: Hiina
produced-by: Claude deep-research run with citation checking
model: claude-opus-5-5
sources-through: '2026-10-25'
status: current
takeaway: No system yet joins an offline per-line meaning record to a cheap user-styled
  renderer; build it with closed-class style flags in code, the Japanese kept in the
  prompt, and style-keyed render caches.
topics:
- machine-translation
- localization
- japanese-learning
- llm-evaluation
---

Index of everything on this site: https://ai.hiina.space/index.md

# Two-stage styled translation exists only in pieces

- Author: Hiina (hiina@hiina.space)
- Produced by: Claude deep-research run with citation checking
- Version: 1 · published 2026-10-27 · updated 2026-10-27 · status: current
- Canonical: https://ai.hiina.space/reports/two-stage-user-styled-translation.md (this version as one file: https://ai.hiina.space/reports/two-stage-user-styled-translation/v1.md)
- Takeaway: No system yet joins an offline per-line meaning record to a cheap user-styled renderer; build it with closed-class style flags in code, the Japanese kept in the prompt, and style-keyed render caches.
- Topics: machine-translation, localization, [japanese-learning](https://ai.hiina.space/topics/japanese-learning.md), [llm-evaluation](https://ai.hiina.space/topics/llm-evaluation.md)
- Model: claude-opus-5-5
- Sources through: 2026-10-25

The question behind this report: could Japanese game or visual novel (VN) text be translated in two stages? First, an expensive offline pass turns each line into a stored, language-neutral record of meaning, context and voice. Then a separate cheap renderer turns that record plus a reader's style profile (keep honorifics or not, literal or localised puns, even "talk like a pirate") into the line actually displayed. The report surveys shipped localisation practice, string formats, machine-translation research, live VN translation tools and dialogue-system design. It then proposes a record schema, a caching design and a ladder of experiments, and ties the same record to a Japanese-learning reading overlay.

## 1. Summary

Every layer of the pipeline has precedent, but this search found no system that assembles them: an offline pass that turns Japanese game or VN text into a stored, language-neutral record of meaning, context and voice, plus a separate cheap renderer that turns that record and a user style profile into the displayed line. The nearest real systems each own one layer. **Fan teams already ship static variants**: the Committee of Zero Steam patch for Steins;Gate 0 added an "Option to include Japanese honorifics in text" ([Committee of Zero project page](http://sonome.dareno.me/projects/sg0-steam.html)), and Square Enix shipped two selectable scripts for Final Fantasy Tactics: The Ivalice Chronicles ([Inverse](https://www.inverse.com/gaming/ivalice-chronicles-final-fantasy-tactics-japanese-only-feature-english-version), secondary). **Localisation formats already branch at display time**: MessageFormat 2 and Fluent select variants on any string variable, so a `$honorifics` selector is legal today, though every example in their documentation branches on grammar, not style ([UTS #35 Part 9](https://unicode.org/reports/tr35/tr35-messageFormat.html); [Fluent selectors](https://projectfluent.org/fluent/guide/selectors.html)). **Offline context extraction already exists in VN tooling**: GalTransl builds a character dictionary with an LLM pass over the script, keeps a per-line JSON cache, and can rebuild output from that cache without calling a model ([GalTransl README_EN](https://github.com/GalTransl/GalTransl/blob/main/README_EN.md); [GalTranslPP](https://github.com/julixian/GalTranslPP)). **The split between planning and wording is old NLG practice**: a symbolic planner feeding a neural realiser cut omissions from 41 to 6 on WebNLG at equal BLEU ([Moryossef et al. 2019](https://arxiv.org/pdf/1904.03396)).

What is missing is the joint. Live tools (LunaTranslator, XUnity plugins, VNTranslator, UGTLive) are single-stage translators with a free-text prompt box. Their caches are keyed by source string and store final text. In this search, none documented a structured style setting such as an honorifics toggle, and none stored more than one rendering per line ([Luna docs](https://docs.lunatranslator.org/en/guochandamoxing.html); [XUnity README](https://github.com/bbepis/XUnity.AutoTranslator/blob/master/README.md)). In research, formality control works well in the English-to-Japanese direction, but this search found no study of rendering Japanese honorifics and register into English under a user setting, and none that feeds an LLM-written scene description to a separate weaker renderer.

The evidence supports a specific shape for the design. Put hard, closed-class facts (names, address terms, honorific spans, register) in structured fields, and apply the closed-class toggles in code wherever possible. A rule-based Japanese verb editor kept formality accuracy at 95.5% formal and 100% informal, where a learned seq2seq post-editor collapsed informal accuracy to 26.2% ([Amazon IWSLT 2022](https://aclanthology.org/2022.iwslt-1.32.pdf)). Keep the Japanese source in the renderer's prompt, because every pivot representation tested so far loses meaning. Cache renders by line ID, record version and style hash, and pre-render ahead of the reader. Evaluate with targeted programmatic checks and a cross-family judge, because BLEU and COMET-class metrics either saturate or punish exactly the changes a style setting asks for.

The same record is the natural backbone for a Japanese-learning reading overlay, described in a companion report on Japanese learning and Anki tooling. A record that already holds lemma IDs, a literal gloss, register notes and a neutral translation turns rungs 4 and 5 of that overlay's hint ladder into a lookup plus a short render, and makes its clause-level hybrid mode tractable. The cheapest useful first step is an afternoon-sized benchmark on about 300 lines of a VN script the experimenter owns: frontier-made records rendered by a local 8B or 14B model under five style profiles, measured against direct frontier translation for fidelity, style compliance and per-line latency on a single 24 GB consumer GPU. That run also answers the overlay design's open latency question.

## 2. Humans ship variants only where the choice is closed-class

### Honorific toggles shipped in fan patches; publishers argued and declined

The strongest documented case is the Committee of Zero patch for the English Steam release of Steins;Gate 0. Its own project page lists "Option to include Japanese honorifics in text added" in the v2.0 changelog and describes restoring honorifics "alongside a new glossary definition explaining them" ([Committee of Zero project page](http://sonome.dareno.me/projects/sg0-steam.html)). VNDB's release record repeats that the patch "enables option to change honorifics and name orders" ([yorhel.org r50519](https://yorhel.org/r50519), secondary). The two sources disagree slightly: VNDB treats name order as optional too, while the project page frames name order as a fixed script change. A Chaos;Child patch report says only that name order can optionally change ([Siliconera](https://www.siliconera.com/fan-made-chaoschild-pc-patch-offers-more-fixes-subtitles-and-translated-cgs/), secondary). Neither page says where the toggle lives or how variants are stored. The team's Steins;Gate HD repo builds two parallel script sets, `cc-scripts` and `cc-scripts-consistency`, but its README does not say whether players choose between them ([CommitteeOfZero/sghd-patch](https://github.com/CommitteeOfZero/sghd-patch)). So the best-evidenced implementation of the "static variants" idea is human-authored, closed-class and of unknown storage format. Honorifics are cheap to toggle because they are a token insert or delete; puns and register shifts appeared as togglable in no source this search found.

Officially shipped variants exist on other axes. Final Fantasy Tactics: The Ivalice Chronicles offers an Enhanced script rewritten for voice acting and a Classic mode using the War of the Lions script ([Inverse](https://www.inverse.com/gaming/ivalice-chronicles-final-fantasy-tactics-japanese-only-feature-english-version), secondary). Taisho x Alice's English add-on lets players switch story text and choices between Japanese and English with a button press ([Nintendo eShop](https://www.nintendo.com/store/products/taisho-x-alice-all-in-one-plus-english-text-mode-add-on-bundle-switch)), and the Kanon port switches between English, Japanese and Simplified Chinese at any time ([RPG Fan](https://www.rpgfan.com/2024/05/25/kanon-to-receive-english-port/), secondary). Pokémon's Japanese releases have a Hiragana or Kanji text setting, a single-source, two-rendering option authored in advance ([Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/Options), community wiki). The Great Ace Attorney Chronicles kept "-san" and "-sama" deliberately, to mark when characters speak Japanese to each other, and rendered faux-Meiji speech as faux-Victorian dialect ([Wikipedia](https://en.wikipedia.org/wiki/The_Great_Ace_Attorney_Chronicles), secondary). Yakuza 0's subtitles use a hybrid of retained honorifics and domestication ([Tradução em Revista](https://periodicos.ufsc.br/index.php/traducao/article/view/87234), abstract only).

Publishing shows why humans rarely go further. In a J-Novel Club forum thread started 3 May 2021, a reader proposed storing both forms inline, `[Mr. Joey|Jonouchi-san]`, and offering "Westernized" and "non-Westernized" EPUBs. A translator and readers objected on EPUB and print logistics, the slippery slope to sibling terms, speech tics and puns, extra translation and QA work, and jarring flow. Staff only redirected the thread to the feature-request channel ([J-Novel Club forum](https://forums.j-novel.club/topic/4422/may-we-get-light-novel-translations-with-honorifics/20?lang=en-US), low-authority forum). That inline markup is the only explicit dual-form honorific notation this search found, and it was never shipped. In anime, the honorifics debate was settled per release by distributor policy, such as MX Media dropping honorifics ([ANN forum](https://www.animenewsnetwork.com/bbs/phpBB2/viewtopic.php?p=3428755), forum) or AnimeNation's selective romanisation ([AnimeNation](https://www.animenation.net/blog/?p=1328), secondary retailer blog). This search found no release with paired honorific and no-honorific English tracks. Netflix's Japanese timed-text guide, which governs subtitles into Japanese, does not address honorifics and asks subtitlers to "match the tone of the original content" ([Netflix Partner Help Center](https://partnerhelp.netflixstudios.com/hc/en-us/articles/215767517-Japanese-Timed-Text-Style-Guide)).

Accent and voice have always been a localiser-side layer added on top of the source. Dragon Quest IV's Japanese used standard formal Japanese with no dialect markers, and the DS localisers added a Scottish dialect ("aboot tae make an announcement tae youse all") and turned the hero's name "Ryan" into "Ragnar McRyan" ([Legends of Localization](https://legendsoflocalization.com/articles/dragon-quest-iv-accents/)). The Mother 3 fan translation replaced the mice's Japanese dialect with Cockney-style English and shipped a 200-page handbook alongside the patch ([Wikipedia](https://en.wikipedia.org/wiki/Mother_3_fan_translation), secondary). Facebook offered a pirate language in 2009 and, per the article's "last year", in 2008, switchable from the language link ([TechCrunch](https://techcrunch.com/2009/09/19/once-again-facebook-owns-talk-like-a-pirate-day-on-the-web)). That joke locale is the proposed "talk like a pirate" setting as a static string table, and it shows users accept a whole interface in a stylised variant of the same strings. In the other direction, Japanese role language (yakuwarigo: pronouns, copula and sentence-final particles that mark character type) is flattened by standard English translation, and a Leiden thesis argues it can only be partly compensated for through lexical, punctuation and font choices ([Leiden thesis](https://openaccess.leidenuniv.nl/handle/1887/64352), single-work thesis). For this design, that means the record should note whether a voice marker is in the source or is a localisation choice, because "pirate" is additive while "keep her rough speech" is not.

### String formats already select variants at display time, on grammar rather than style

Engines and formats already separate line identity from rendered text, which is the substrate the render step needs. Ren'Py treats the source as the "None" language and stores translations as `translate <lang> <id>:` blocks keyed by generated IDs such as `start_636ae3f5`. Translations can run Python and conditionals, and `renpy.change_language` switches at runtime; the docs use `piglatin` as an example language ([Ren'Py translation docs](https://www.renpy.org/doc/html/translation.html)). A "no honorifics" or "pirate" variant could therefore ship as a pseudo-language (my inference; the docs show no per-player variant concept beyond languages). Python inside translate blocks should be side-effect free, because switching languages reruns it. Yarn Spinner gives every line a stable `#line:` ID, exports per-language string tables, and fetches the localised text and linked assets by ID at runtime ([Yarn Spinner localisation](https://docs.yarnspinner.dev/yarn-spinner-for-unity/assets-and-localization)). Its markup has `[select value={$gender} m="he" f="she" nb="they" /]`, `[plural]` and `[ordinal]`, and marks the speaker as a `character` attribute running from line start to the first colon, unless there is no colon or markup already supplies one ([Yarn Spinner markup](https://docs.yarnspinner.dev/write-yarn-scripts/advanced-scripting/markup.md)).

The message formats go further. Fluent lets each locale control its own complexity without touching the source, with dash-prefixed terms that carry variants and translator-authored logic that needs no code change ([Mozilla Hacks](https://hacks.mozilla.org/2019/04/fluent-1-0-a-localization-system-for-natural-sounding-translations/), no visible date, comments from 2019-04-26). Its selectors match strings or numbers and require a `*` default ([Fluent selectors](https://projectfluent.org/fluent/guide/selectors.html)). **Unicode MessageFormat 2.0 became Stable in CLDR 47 (2025-03-13), with only `:string`, `:number` and `:integer` stable and other functions Draft** ([CLDR 47](https://cldr.unicode.org/index/downloads/cldr-47)). The current UTS #35 Part 9 page header reads CLDR 49, dated 2026-10-21, while the CLDR downloads table lists CLDR 49 as 2026-10-22 without clearly marking it released ([UTS #35 Part 9](https://unicode.org/reports/tr35/tr35-messageFormat.html); [CLDR downloads](https://cldr.unicode.org/index/downloads)). The stability policy says updates "will not make any valid message become not valid". Since `:string` is stable, a style selector is spec-conformant today. My sketch, not an example from the spec:

```
.input {$honorifics :string}
.match $honorifics
keep {{You're still up, Tanaka-senpai?}}
title_only {{You're still up, senpai?}}
* {{You're still up, Tanaka?}}
```

Unreal's FText has `|plural`, `|ordinal`, `|gender` and a Korean particle modifier ([Unreal docs](https://dev.epicgames.com/documentation/en-us/unreal-engine/text-localization-in-unreal-engine?application_version=5.3)), i18next selects keys by `context` ([i18next](https://www.i18next.com/translation-function/context)), and gettext's `msgctxt` disambiguates identical source strings ([GNU gettext](https://www.gnu.org/software/gettext/manual/html_node/Contexts.html)). The gettext problem matters for live hooking: the same Japanese string in two scenes needs two keys. In every case a human authors every variant. The proposed pipeline replaces authoring with generation, and the format becomes the output contract of the renderer rather than its input.

### Localisation context kits list the fields a translator needs

Vendors converge on what a translator needs per line: speaker, listener, emotion, relationship notes (superior, close friend, stranger, rival), character gender, character profiles with speech habits, and screenshots tied to string IDs. Without them, lines come out "grammatically perfect and still wrong for the scene" ([Alconost](https://alconost.com/en/blog/game-translation-context), vendor blog, secondary). The complaint is old: "All too often translators are provided with a file containing a collection of strings with no description or context" ([Game Developer, 2014](https://www.gamedeveloper.com/production/developers-make-your-text-translator-friendly-a-few-tips-part-1-)). Fan practice also produces out-of-band notes: Legends of Localization publishes line-by-line diffs of Japanese against English with reasons for each change ([Zelda Dungeon interview](https://www.zeldadungeon.net/zelda-dungeon-exclusive-interview-with-legends-of-localization-creator-clyde-tomato-mandelin/)). The proposed intermediate representation is an automated version of the ideal context kit, made for a renderer to consume rather than a human to consult. Japanese-to-English is a hard case for that kit, because Japanese routinely omits subject, gender and relationship information that English grammar forces a translator to state.

## 3. Research covers each stage separately, and the joint is untested

### Interlingua failed on coverage; LLM-written notes revive it with the source kept

Classic interlingua MT survived only in controlled domains. Grammatical Framework translates by parsing into an abstract syntax and generating from it. Its 2014 wide-coverage translator handled 11 languages, with 10k-60k dictionary entries per language and about 65k abstract lemmas. Its own documentation lists unknown words breaking parses, context-free disambiguation, idioms coming out wrong and fallback to chunk-by-chunk translation, and says "the performance is not yet generally on the level with the best of the competition" ([GF translation doc](https://www.grammaticalframework.org/lib/doc/translation.html), project doc). The KANT group's 1992 paper title argues against pure transfer, pure interlingua and pure statistics alike ([ACL Anthology](https://preview.aclanthology.org/setup/1992.tmi-1.20), bibliographic page only), and Ranta et al.'s 2020 paper frames GF's move from controlled languages toward robust pipelines ([CL journal listing](https://submissions.cljournal.org/index.php/cljournal/article/view/1554), listing only). The AMR experiment is the closest modern test of a meaning pivot. One Transformer generating from English AMR into 21 languages beat an English-only baseline on 18 of 21, but on gold AMR it only matched an AMR-to-English-to-MT cascade (Spanish 21.7 vs 21.6, Italian 19.8 vs 19.6, German 15.3 vs 15.7, the last favouring the cascade), and human semantic accuracy averaged about 2 on a 1-3 scale ([Fan and Gardent 2020](https://arxiv.org/pdf/2011.05443)). **A pivot representation loses roughly a third of the meaning when the source is withheld**; that is the strongest single argument for passing the Japanese to the renderer.

The LLM era revived the idea as prompting rather than as a pivot, and every version keeps the source. MAPS has the model write keywords, topics and demonstrations about the source, filters them with quality estimation, then translates with the source plus the knowledge; the authors report fewer hallucinations, ambiguity errors and awkward style ([MAPS](https://arxiv.org/abs/2305.04118), abstract only; published in TACL 2024 as [Exploring Human-Like Translation Strategy with LLMs](https://aclanthology.org/2024.tacl-1.13/)). TransAgents runs a simulated publishing house (editors, translator, localisation specialist, proofreader) over a shared guideline of glossary, summary, tone, style and audience ([arXiv 2405.11804](https://arxiv.org/html/2405.11804v1); [TACL 2025](https://aclanthology.org/2025.tacl-1.42/)). Its d-BLEU was the lowest of the compared systems (25.0 against 43.1-52.2), yet monolingual readers preferred it over GPT-4 55.6% of the time and over a human reference 52.1%, which the paper itself calls "marginally preferred". It cost about $2.08 per chapter against $168.48 for a human at ATA minimum rates. TEaR (translate, estimate, refine) found one refinement round best and named estimation as the bottleneck: weak estimators overestimate errors and hallucinate corrections. Its arXiv v3 reports that 46.2% of evaluators preferred TEaR over the initial translation on Japanese-to-English in a forced choice ([TEaR arXiv v3](https://arxiv.org/html/2402.16379v3)); the published Findings of NAACL 2025 version covers 8 directions in 5 languages with no Japanese and no human preference study ([NAACL Findings 2025](https://aclanthology.org/2025.findings-naacl.218.pdf)).

Gains from explicit intermediate reasoning depend on the model. On EN-to-FR context-aware translation, reasoning raised GPT-4o's anaphora accuracy from 0.90 to 0.97 but lowered GPT-4 from 0.94 to 0.88 and GPT-4-turbo from 0.91 to 0.84, and cost DeepSeek-R1 8B and 14B 0.0298 and 0.0647 COMET on the anaphora translation task ([Ataee and Popescu-Belis 2025](https://arxiv.org/html/2510.18077v1)). Interpretability work suggests LLMs sometimes route word translation through an intermediate concept, though direct co-occurrence mapping dominates for frequent pairs ([Semantic Pivots](https://arxiv.org/html/2505.16385v1), not citation-checked). The lesson for this design: the strong model should do the reasoning offline, once, and the weak model should receive conclusions, not a long chain to re-derive.

### Formality control works into Japanese; this search found nothing out of it

Japanese formality control is a mature task in the English-to-Japanese direction. Feely et al. tagged Japanese targets as informal, polite or formal so that one model produces multiple registers from the same English ([WAT 2019](https://aclanthology.org/D19-5203/), abstract only). CoCoA-MT made Japanese the hardest language in its benchmark: formal and informal references overlapped least (BLEU 74.6), two commercial systems produced inconsistent "other" formality 24.2% and 20.0% of the time, annotator agreement was the lowest (Krippendorff's alpha 0.82), and the Japanese formality classifier reached about 0.7 precision with recall of 0.43-0.54. Fine-tuning on 1,000 contrastive segments raised in-domain accuracy from 64.5% formal and 35.5% informal to 84.8% and 84.4%, and contrastive data beat 2,000 or 10,000 non-contrastive segments. In human evaluation on held-out domains, informal accuracy rose 67.5 points while formal fell 13.0 ([CoCoA-MT](https://ar5iv.labs.arxiv.org/html/2205.04022)). Amazon's IWSLT 2022 system reached 88.8% formal and 98.8% informal on the blind test ([2022.iwslt-1.32](https://aclanthology.org/2022.iwslt-1.32.pdf)). Prompting caught up: Marrese-Taylor, Wang and Matsuo found GPT-3 and ChatGPT reach matched accuracy of 0.86 and 0.83 (at coverage 0.25) on English-to-Japanese, against 0.76 for the supervised Transformer of the CoCoA-MT paper ([WMT 2023](https://aclanthology.org/2023.wmt-1.49.pdf)). That paper's "compliance" figures (GPT-3 100%, ChatGPT 98.9%, Llama2-chat 13B 55.4% zero-shot and 91.3% one-shot) measure the share of outputs containing a parseable translation. Llama2's low number came largely from refusals, because it flagged words as rude or harmful. That gap is a refusal and format failure, not weaker style-following, and it is a warning for local aligned models rendering villains.

The direction in question here is the reverse: deciding what Japanese register and honorifics become in English under a user preference. **This search found no paper on Japanese-to-English honorific or keigo rendering control.** Two adjacent results transfer anyway. Multi-attribute prompting interferes: controlling one entity's gender lowered accuracy on another, often by around 10 points on WinoMT and by up to 24.2 points on the multi-entity GATE set, although single-entity accuracy (ChatGPT 94.4-96.5%) beat fine-tuned baselines near 87% ([Lee et al., preprint](https://arxiv.org/pdf/2407.15154)). Standard metrics also miss register: on JP-TL-Bench, a 350M MT model nearly matches GPT-4o on COMET (0.8889 vs 0.9093), but a rubric judge rated only 39.5% of its outputs perfect against 64% for GPT-4o. The benchmark's judge, gemini-2.5-flash, is also one of its anchor models, and the authors flag the self-preference risk ([JP-TL-Bench](https://arxiv.org/pdf/2601.00223)).

### Context helps in small doses, and puns mostly fail

For Japanese media, context helps in human judgement but saturates quickly. Scene-level NMT on manga scored 2.98 against 2.76 for sentence-level in human rating while BLEU fell from 14.11 to 12.65, and visual features added nothing significant ([Hinami et al., AAAI 2021](https://arxiv.org/pdf/2012.14271)). With GPT-4 Turbo on OpenMantra, page-level translation with the page image beat line-level; the best variant reached chrF 36.8 against 34.2 for Google Translate. The page-plus-image variant (chrF 36.6) scored MQM -1.98 against -1.31 for the official translation and -4.25 for Google, but had 160 critical errors against 107 for the official translation (Google: 272). Three-page and whole-volume context reduced quality, and a rolling chain-of-density story summary was the best long-context method yet still below page-level ([Lippmann et al., COLING 2025](https://aclanthology.org/2025.coling-main.232.pdf)). A Japanese study found LLaVA-generated image descriptions had minimal or negative effect on GPT-3.5 manga translation ([NLP2024 P7-13](https://www.anlp.jp/proceedings/annual_meeting/2024/pdf_dir/P7-13.pdf), not citation-checked). Generic description does not help; discourse-relevant facts might.

Smaller translation LLMs also fail to use raw context. Across nine models (Tower, ALMA, Llama-2, EuroLLM-9B), EN-to-DE pronoun accuracy with gold context was 26.1-35.5% against 33.3% chance, around or below chance, versus 56.2% for a concatenation-trained encoder-decoder. Perturbed context cost 5-10 points of pronoun accuracy while COMET barely moved ([Mohammed and Niculae 2024](https://arxiv.org/pdf/2410.14391v2)). That supports converting implicit context (who is "you" here) into explicit fields a small model can copy, rather than ten lines of history it will ignore.

Wordplay is where render-time generation is weakest. In the CLEF 2026 JOKER English-to-French pun task, 43% of submitted translations contained wordplay and about 27% were fully successful. The top system reached 79-82% wordplay rate but only 48-50% meaning preservation, while the most faithful system kept 77-78% meaning at about 29% wordplay. BLEU correlated at -0.08 with the number of successful translations ([JOKER 2026 overview](https://ceur-ws.org/Vol-4283/paper303.pdf)). "Literal versus localised puns" is therefore a real trade-off on two axes, and a small renderer will not recreate puns on the fly: the offline pass has to record the mechanism and propose candidate renderings for the renderer to choose between.

Style transfer research gives the same warning for restyling generally. On a content-preserving formality transfer test derived from task dialogue, the best system's joint score (style accuracy times meaning, slot preservation and fluency) was 0.46, and an unconstrained T5 kept content at 0.87 but style at 0.54 ([Don't lose the message while paraphrasing](https://ar5iv.labs.arxiv.org/html/2308.09055)). Combined with the IWSLT result that rule-based editing beat a learned post-editor, the design rule is to move every closed-class transform into code and reserve the model for open-ended voice.

## 4. Live tools are single-stage translators with a prompt box

LunaTranslator, the most widely used VN front end (GPL-3.0, about 13.2k stars), sends each hooked or OCR'd line to the chosen engine with a user-editable prompt. Variables include `{sentence}`, `{contextOriginal[N]}`, `{contextTranslation[N]}` and `{DictWithPrompt[XXXXX]}`, which injects only the glossary entries that match the line and clears itself otherwise. Dedicated offline models (SakuraLLM, GalTransl, Hy-MT2, IndexTeam's Index-Translate) take no custom prompt ([Luna LLM docs](https://docs.lunatranslator.org/en/guochandamoxing.html); [Luna README](https://github.com/HIllya51/LunaTranslator)). Luna seeds its glossary from VNDB character names. Its docs contradict themselves on what non-English users get: one section says the translation is left empty, the pre-translation substitution section says it is filled with the original text ([Luna translation optimisation](https://docs.lunatranslator.org/en/transoptimi.html)). A SQLite translation cache is described only by an auto-generated DeepWiki page, with no schema ([DeepWiki](https://deepwiki.com/HIllya51/LunaTranslator/4.4-adding-new-translation-engines), secondary, auto-generated); the official pages fetched do not mention caching. One blogger found LLM output "frequently better" than Google or Microsoft but the wait "absolutely brutal" for live reading, and concluded batch-made shared patches are the better use ([Sakimichi's Otome Spot](https://sakimichi.wordpress.com/2025/11/22/translating-visual-novels-in-2026/), secondary, single blogger). That latency complaint is the practical case for the split.

Hook and engine tools bolt an OpenAI-compatible call onto a line pipeline. XUnity.AutoTranslator caches results by source string in `_AutoGeneratedTranslations.txt`, which "will always have the lowest priority when reading translations", and recommends redistributing it ([XUnity README](https://github.com/bbepis/XUnity.AutoTranslator/blob/master/README.md)). Its LLM plugins add glossary entries with optional `context` fields only when the raw term matches ([LlmTranslators](https://github.com/joshfreitas1984/XUnity.AutoTranslate.LlmTranslators)) and a `Requirement` field for "a requested translation style" ([AutoLLMTranslator](https://github.com/NothingNullNull/XUnity.AutoLLMTranslator)). Textractor Translator tracks the last speaker for unattributed lines and keeps an in-memory cache ([textractor-translator](https://github.com/MRGRD56/textractor-translator)). MoriTranslates' RPG Maker translator runs a two-stage workflow, database names first and then dialogue, with an auto-built glossary, speaker detection and a pronoun-aware gender system ([rpgmaker-translator](https://github.com/MoriTranslates/rpgmaker-translator)). DazedTL keeps per-game `game.md` (setting, register, naming) and `quirks.md` (voice habits) files, the closest thing found to a persisted per-game style document, though both feed the same single call ([DazedMTLTool](https://github.com/dazedanon/DazedMTLTool)). VNTranslator's example system prompt tells the model to render honorifics and idioms as natural English ([VNTranslator docs](https://docs.vntranslator.com/advanced/llms/system-prompt)), and UGTLive suggests a more literal prompt for learners ([UGTLive](https://github.com/SethRobinson/UGTLive)). In all of them, style is a sentence in a prompt.

The VN-specific LLM projects come closest to the proposed stage one. GalTransl's input is JSON with `name` and `message`; its dictionary lines are `Source[Tab]Target[Tab]Explanation`, with notes such as gender and occupation so the model picks pronouns and titles. Its per-file `transl_cache` stores `index`, `name`, `pre_jp`, `post_jp`, `pre_zh`, `post_zh_preview`, `proofread_zh`, `trans_by`, `proofread_by` and `problem`, and a changed `post_jp` triggers retranslation. Its problem analyser flags word repetition above 20, output over 1.3x source length, leftover kana and dictionary non-compliance ([GalTransl README_EN](https://github.com/GalTransl/GalTransl/blob/main/README_EN.md)). GenDic generates a character-name dictionary with an LLM pass; release 8.4.0 (10 Oct, year not shown, likely 2026) added a joint review of names, nicknames and compound speakers ([GalTransl 8.4.0](https://github.com/GalTransl/GalTransl/releases/tag/8.4.0)), and v8 added an agent mode with a proofreading sub-agent ([GalTransl README](https://github.com/GalTransl/GalTransl)). GalTransl++ adds dictionary conditions on neighbouring lines, cache lookups that consider surrounding sentences, a terminology ledger, and a Rebuild mode that regenerates output from cache with no model call ([GalTranslPP](https://github.com/julixian/GalTranslPP)). Stage one there still emits Chinese text and short notes, not a language-neutral per-line record, but the data model (speaker field, annotated dictionary, problem flags, cache-first rebuild) is the nearest reusable one.

The local models show the shape of a stage-two prompt and the absence of style control. Sakura-GalTransl-7B-v3.7's system prompt says it translates "using the given glossary in the specified style", but its user prompt has only optional history, a `src->dst #note` glossary and the text ([Sakura-GalTransl-7B-v3.7](https://huggingface.co/SakuraLLM/Sakura-GalTransl-7B-v3.7)); output is Japanese-to-Chinese ([SakuraLLM](https://github.com/SakuraLLM/SakuraLLM), CC BY-NC-SA 4.0). The 14B v3.8 card's AutoDL deployment guide claims about 30,000 sentences per hour on an RTX 4090 with 16 parallel slots, an unmethodical tutorial figure ([Sakura-GalTransl-14B-v3.8](https://huggingface.co/SakuraLLM/Sakura-GalTransl-14B-v3.8)). VNTL's Llama-3 8B fine-tune is the only Japanese-to-English model found with structured character metadata in its native format: a `<<METADATA>>` block of `[character] Name | Gender | Aliases` entries, then `<<JAPANESE>>`/`<<ENGLISH>>` turns with `[Speaker]:` tags ([vntl-llama3-8b-202409](https://huggingface.co/lmg-anon/vntl-llama3-8b-202409-hf)). The card romanises the same name 桜乃 as "Sakuno" in its translation example and "Sakurano" in its chat example, a small reminder that names belong in fixed fields. Sugoi 14B Ultra is a Qwen2.5-14B localiser fine-tune recommending about 10 lines of context ([Sugoi-14B-Ultra-GGUF](https://huggingface.co/sugoitoolkit/Sugoi-14B-Ultra-GGUF)), and LinguaGacha adds a term-extraction step before batch translation ([LinguaGacha](https://github.com/neavo/LinguaGacha)). VNDB glossary builders export `info` fields with gender, role, traits and a spoiler flag ([VNDB-Glossary-Builder](https://github.com/rikimtasu/VNDB-Glossary-Builder)) or one sentence per character "to create a prompt for LLM" ([VisualNovelCharacterNameExtractor](https://github.com/HareChaser/VisualNovelCharacterNameExtractor)).

On quality, the community-run VNTL Leaderboard 2026 (87 original entries plus 4 new, scored by embedding cosine similarity on 128 lines each from Senren*Banka and Mashiro-iro Symphony, with values at or below 0.5 counted as zero) puts Qwen2.5-72B at 0.7079, shisa-v2-mistral-nemo-12b at 0.6985, vntl-llama3-8b-v2 at 0.6952, Sugoi-14B-Ultra at 0.6827 and Qwen2.5-7B-instruct at 0.6518 ([VNTL leaderboard 2026](https://huggingface.co/datasets/yukobayashi500/vntl-leaderboard-2026), community-run). Local 8-14B fine-tunes sit close to 72B open models on literal similarity, but that metric rewards closeness to one reference and cannot score a styled render. Manga tools follow the same pattern: manga-image-translator has prompt templates, a glossary and prior-page context for its OpenAI translator only ([manga-image-translator](https://github.com/zyddnys/manga-image-translator/blob/main/README.md)), and Koharu documents local models and an agent workflow with no custom prompt or glossary ([Koharu](https://github.com/koharu-rs/koharu)). Steam's Game Overlay Translator ($3.99, July 2026) runs offline OCR plus FuguMT or Argos, caches translated lines locally, and offers a "High quality (AI)" engine as a free DLC needing a Vulkan GPU. Its page says both that the local AI accepts "your own custom prompt" and that "the app does not accept free-form prompts" ([Steam](https://store.steampowered.com/app/4864520/Game_Overlay_Translator/)).

Community norms matter if records are ever shared. 11 bit studios shipped The Alters with leftover LLM text, including "Sure! Here is the translated text into Brazilian Portuguese" in a player's screenshot of the Portuguese translation and a second leftover line in a background text screen, and said "In hindsight, we acknowledge this was the wrong call" ([PC Gamer, 2025-06-30](https://www.pcgamer.com/games/adventure/spitting-in-the-face-of-your-international-audience-the-alters-caught-using-generative-ai-for-background-text-and-translations-despite-not-disclosing-such-on-steam/)). Romhack.ing "disabled downloads for machine-translated content" (reported for 2026-06-17), keeping them available on request as a base for human scripts, and an AI patch of Tricolore Crise was released over a parallel human effort ([Held Games](https://heldgames.com/guides/ai-fan-translations-controversy), secondary). A per-reader renderer over a private record distributes no translation, which sidesteps the patch backlash but also forgoes community review.

## 5. A small renderer is plausible; measuring it honestly is the hard part

### Plan-then-realise and teacher annotations both favour the split

NLG has evidence that separating what to say from how to say it improves faithfulness. On WebNLG, a symbolic planner plus a neural realiser matched an end-to-end model on BLEU (47.4 vs 46.5) and cut omissions from 41 to 6, wrong lexicalisations from 39 to 17 and over-generation from 29 to 3 on 440 triplets. But the realiser covered the plan's entities in 98.9% of plans on seen data and only 66.7% on unseen data ([Moryossef et al. 2019](https://arxiv.org/pdf/1904.03396)). Expect a renderer to drift when a game's records look unlike its training data. A 2024 study of fine-tuned data-to-text found faithfulness tended to decline with model size while fluency rose, with T5-large matching Llama 2 on several metrics ([model-size study](https://arxiv.org/html/2407.14088v1), not citation-checked, no human eval).

Teacher-written intermediates train small students efficiently. A 770M T5 trained on PaLM 540B rationales beat few-shot PaLM on ANLI using 80% of the data, needed over 50% fewer examples on average than standard fine-tuning, and a weaker 20B teacher gave smaller gains ([Distilling step-by-step](https://arxiv.org/pdf/2305.02301)). MT-Patcher had a teacher write error spans, explanations and post-edits for a student's translations. A 104k feedback-selected set matched or beat 1M-sentence sequence-level distillation for NLLB 3.3B zh-en (COMET 80.3 vs 79.5), and the en-ja student rose from 85.1 to 86.4 COMET with a LLaMA2 teacher ([MT-Patcher, NAACL 2024](https://arxiv.org/pdf/2403.09522)). Unlike rationale distillation, the record is needed at inference, so the gain is a cost shift offline, not a teacher-free student.

### Small models follow two or three constraints reliably, not five

Modern small instruct models score well on verifiable English instructions: Qwen3 4B, 8B and 14B reach 81.2, 83.0 and 84.8 IFEval strict-prompt in non-thinking mode ([Qwen3 report](https://arxiv.org/pdf/2505.09388)). Gemma 3 self-reports higher IFEval under a different scoring setup and a translation score (WMT24++, a chrF-type character F-score) of 46.8 at 4B and 51.6 at 12B ([Gemma 3 report](https://arxiv.org/pdf/2503.19786)); its IFEval should not be compared to Qwen's table. Stacked constraints degrade: on FollowBench, GPT-4's hard satisfaction fell from 84.7% at one constraint to 61.9% at five, and Vicuna-7B from 60.8% to 23.9%; style was GPT-4's easiest category (92.7%), and the authors estimate closed models satisfy about three constraints and open models about two ([FollowBench](https://arxiv.org/pdf/2310.20410), 2023-era models). One follow-up found plain SFT slightly lowered LLaMA3-8B's FollowBench score while judge-guided DPO raised it ([soft-constraint paper](https://arxiv.org/pdf/2501.04945), not citation-checked). A style profile of honorifics, puns, register and voice is four or more constraints on top of fidelity, which is why the deterministic layer should take the closed-class flags off the model's plate.

Persona drift is a design constraint, not a blocker. LLaMA2-chat-70B drifted from its system-prompt persona within eight dialog rounds, with gpt-3.5-turbo-16k also drifting, and the authors' split-softmax fix amplifies attention to the system prompt ([Li et al., Measuring and Controlling Persona Drift](https://arxiv.org/html/2402.10962v1)). A renderer that makes each line an independent call with the style profile freshly at the end of the prompt, as Character Card V2's `post_history_instructions` does ([Character Card V2 spec](https://github.com/malfoyslastname/character-card-spec-v2/blob/main/spec_v2.md)), avoids accumulation. Persona vectors steer traits such as sycophancy and humour in 7-8B open models at some cost to capability, but were not shown for speaking style ([Anthropic, Persona vectors](https://www.anthropic.com/research/persona-vectors), not citation-checked).

### Latency fits on one consumer GPU; evaluation needs targeted checks and a cross-family judge

A third-party llama.cpp benchmark on an RTX 4090 (24 GB; Q4_K_XL, flash attention, model family not named) measured 8B generation at 131 tokens/s and prompt processing at 9,121 tokens/s at 4K context, and 14B at 82.8 and 5,358 ([Hardware Corner](https://www.hardware-corner.net/rtx-4090-llm-benchmarks/), secondary, not peer-reviewed). From those figures (my arithmetic, not a measurement), a 600-token prompt and 60-token line costs about 0.5-0.6 s on 8B and 0.9 s on 14B cold, and prefix caching of the shared system prompt cuts prefill further ([vLLM prefix caching](https://docs.vllm.ai/en/v0.8.5/features/automatic_prefix_caching.html), listing only). Grammar-constrained JSON decoding costs under 40 microseconds per token mask with XGrammar ([XGrammar](https://arxiv.org/html/2411.15100v3)), which matters for the offline record writer, not the plain-text renderer. UGTLive's author guesses 3-6 s for a whole live OCR-plus-LLM loop ([UGTLive](https://github.com/SethRobinson/UGTLive)), so pre-rendering ahead is what makes any of this feel instant.

Evaluation is where naive setups mislead. Neural QE metrics and LLM judges penalise length: appending one to five error-free segments dropped scores by 4.0-8.0 points for MetricX-24 QE, 1.5-5.6 for CometKiwi, 1.7-5.3 for Gemini AutoMQM and 1.8-8.5 for Gemini as a judge, across about 80% of documents, and MetricX and CometKiwi preferred the shorter of two comparable translations 50.4-60.4% of the time ([Penalizing Length](https://arxiv.org/html/2510.22028v3)). A pirate render is longer and will be marked down for it. Judges prefer their own family, and small judges more so (Llama-3.1-8B bias 21.6% against 0.4% for 70B; Qwen2.5 0.5B 41.7% against 2.1% for 14B) ([Beyond the Surface](https://arxiv.org/pdf/2506.02592)), so the judge must come from neither the teacher's nor the renderer's family. For style accuracy GPT-4 tracked humans best (Pearson 0.92 on English sentiment transfer), but for content preservation BERTScore and BLEURT matched or beat it in several cells ([Evaluating TST evaluation](https://arxiv.org/pdf/2502.04718)), so no single judge covers both. The WebNLG error counts (omitted, wrong, added) are the right shape for checking a styled render against the record's meaning field.

## 6. Game dialogue systems supply the field vocabulary

Older game dialogue systems already split what a line does from the words played. Valve's Response System layers concepts (reasons to speak, such as TLK_DANGER), criteria (speaker and world state), weighted rules, response groups and responses, with built-in repeat avoidance; the most specific matching rule wins, with fallback to less specific ones ([Valve Response System](https://developer.valvesoftware.com/wiki/Response_System); [Emily Short on Ruskin's GDC 2012 talk](https://emshort.blog/2012/03/16/gdc-2012-talk-on-dynamic-dialogue/)). Versu authors lines as "quips" that pair a text template with social effects, so one line carries surface and subtext at once, and characters get verb-level text overrides and adverbs for internal state ([Evans and Short, Versu: A Simulationist Storytelling System](https://www.cs.uky.edu/~sgware/reading/papers/evans2014versu.pdf)). Comme il Faut in Prom Week gives each social exchange a primary intent, several instantiations chosen by salience, and conditions on statuses, relationships, traits, social networks and a database of past social facts the dialogue can cite ([McCoy et al.](https://cs.uky.edu/~sgware/reading/papers/mccoy2014cif.pdf)). PERSONAGE drove extraversion through 29 continuous generation parameters, with judges rating extravert output 5.98 and introvert output 2.96 on a 1-7 scale ([Mairesse and Walker, ACL 2007](https://preview.aclanthology.org/fix_video/P07-1063.pdf)), which supports a user style interface of a few named knobs rather than paragraphs of prose.

LLM-era character systems bear on the renderer in one specific way. Character Card V2 separates situation (`description`, `scenario`) from voice samples (`mes_example`) across 15 fields, and supports `{{original}}` composition in both `system_prompt` and `post_history_instructions` ([Character Card V2 spec](https://github.com/malfoyslastname/character-card-spec-v2/blob/main/spec_v2.md)). Jun et al. tested 211 base profiles, each in structured and unstructured versions, on Qwen3-8B, Qwen3-235B-A22B, Mistral-Small-3.2-24B, OLMo-3.1-32B and DeepSeek-v3.2. Character familiarity was negligible on PersonaGym, structure had only marginal and inconsistent effects, and disposition was the bottleneck: immoral characters scored lower on every model ([Jun et al. 2026](https://arxiv.org/pdf/2601.04716)). Ubisoft's NEO NPC prototype fed writer-authored backstory and traits to an LLM that "impersonates" rather than improvises, and shipped nothing ([Game World Observer](https://gameworldobserver.com/2024/03/20/ubisoft-neo-npc-genai-real-dialogue-with-game-characters), secondary). Two consequences follow for translation. Spend the record's budget on intent and relationship content, not elaborate persona schemas. And flag intended harshness explicitly, because an aligned small model softening a villain, or refusing like Llama2 did in the formality study, is a fidelity failure. The generalisation toward "AI improvises from story templates", and on to assistant persona selection, is real but mostly irrelevant here: a translation renderer has a fixed source and should behave like a Valve response lookup with a generative last mile, not like a free agent.

## 7. A concrete record design, and where the cache sits

### The intermediate record: grounded fields plus a few of mine

The sketch below shows one line's record. The Japanese is invented for illustration. A record is written once per line by the frontier pass with full-script context, validated against a JSON schema, and stored.

```json
{
  "line_id": "ch03_0412",
  "source_hash": "sha256:…",
  "prev_line_id": "ch03_0411",
  "speaker": "yui", "addressee": "tanaka", "listeners": ["tanaka"],
  "source_ja": "先輩、まだ起きてたんですか？",
  "literal_en": "Senpai, you were still awake?",
  "neutral_en": "You're still up, {addr0}?",
  "address_terms": [{"slot": "addr0", "span_ja": "先輩", "refers": "tanaka",
     "kind": "title_as_name", "signals": "junior to senior, warm",
     "renderings": {"keep": "senpai", "name_suffix": "Tanaka-senpai", "drop": "Tanaka"}}],
  "register": {"politeness": "teineigo", "markers": ["んですか"], "shift_from_prev": "none"},
  "intent": "express surprise; mild concern",
  "subtext": "she stayed up hoping to catch him alone",
  "delivery": "surprised, soft",
  "relationship": {"status": "addressee senior", "intimacy": "close"},
  "voice_markers": {"in_source": ["polite even when flustered"], "localization_added": []},
  "referents": [],
  "wordplay": null,
  "harshness": "none",
  "scene": "late night, club room, after the festival",
  "lemmas": [{"surface": "起きて", "lemma": "起きる", "jmdict": "<entry id>"}],
  "clauses": [{"ja": "まだ起きてたんですか", "en": "you're still up"}],
  "spoiler_level": 0,
  "flags": [], "confidence": 0.9,
  "provenance": {"writer_model": "…", "record_version": 3}
}
```

| Field | Grounded in | Status |
|---|---|---|
| `line_id`, `prev_line_id` | Yarn `#line:` IDs ([Yarn](https://docs.yarnspinner.dev/yarn-spinner-for-unity/assets-and-localization)); Ren'Py translate IDs ([Ren'Py](https://www.renpy.org/doc/html/translation.html)); GalTransl `index` | Sourced; `prev_line_id` is mine, for gettext-style disambiguation |
| `source_hash` | GalTransl retranslates on changed `post_jp` ([README_EN](https://github.com/GalTransl/GalTransl/blob/main/README_EN.md)) | Sourced pattern |
| `speaker`, `addressee`, `listeners`, `delivery` | Alconost speaker, listener, emotion ([Alconost](https://alconost.com/en/blog/game-translation-context)); VNTL `[Speaker]:` tags; GalTransl `name` | Sourced |
| character data (stored once, referenced by ID) | VNTL name, gender, aliases ([VNTL card](https://huggingface.co/lmg-anon/vntl-llama3-8b-202409-hf)); GalTransl dictionary notes; VNDB glossary `info` with spoiler flag ([VNDB-Glossary-Builder](https://github.com/rikimtasu/VNDB-Glossary-Builder)) | Sourced |
| `relationship` | CiF relationships and statuses ([McCoy et al.](https://cs.uky.edu/~sgware/reading/papers/mccoy2014cif.pdf)); Alconost relationship notes | Sourced |
| `intent`, `subtext` | CiF primary intent; Valve concepts; Versu surface and subtext quips ([Versu](https://www.cs.uky.edu/~sgware/reading/papers/evans2014versu.pdf)) | Sourced |
| `referents` | CiF social facts database; pronoun failures with implicit context ([Mohammed and Niculae](https://arxiv.org/pdf/2410.14391v2)) | Sourced need, my field |
| `register` | CoCoA-MT formal/informal/respectful labels ([CoCoA-MT](https://ar5iv.labs.arxiv.org/html/2205.04022)) | My field, sourced vocabulary |
| `address_terms` with slot renderings, `neutral_en` as a template | J-Novel Club `[Mr. Joey\|Jonouchi-san]` proposal; MF2 and Fluent selectors; Committee of Zero toggle | My synthesis |
| `voice_markers` (source vs localisation) | Yakuwarigo thesis ([Leiden](https://openaccess.leidenuniv.nl/handle/1887/64352)); Dragon Quest IV ([LoL](https://legendsoflocalization.com/articles/dragon-quest-iv-accents/)) | My synthesis |
| `wordplay` (mechanism, literal gloss, candidates) | JOKER 2026 results ([JOKER](https://ceur-ws.org/Vol-4283/paper303.pdf)) | My synthesis |
| `harshness` | Jun et al. disposition result; Llama2 refusals in WMT 2023 | My synthesis |
| `scene` (short, local) | Rolling summary beat longer context but not page-level ([COLING 2025](https://aclanthology.org/2025.coling-main.232.pdf)) | My field, sourced limit |
| `flags`, `confidence`, `provenance` | GalTransl `problem`, `trans_by`, `proofread_comment` | Sourced pattern |
| `literal_en`, `lemmas`, `clauses` | Learner-overlay design (companion report), hint rungs 4-5 and clause-level hybrid mode | My synthesis |

Per-game character records belong in a separate table referenced by ID, as GalTransl and VNTL keep them, so a nickname fix propagates without rewriting lines. Keep the scene field short: the manga results say beyond one page of context, more hurts, and the record already carries the discourse facts that matter.

The user style profile is a small canonical object, for example `{"honorifics": "keep|name_suffix|drop", "name_order": "western|japanese", "puns": "literal_with_note|localize", "register": "match|flatten", "voice": "none|pirate|…", "free_text": "…"}`. Its hash, together with the renderer model ID and prompt version, is the style key. Named knobs follow PERSONAGE's evidence; the free-text escape hatch is what makes "pirate" possible.

### Render after the record lookup, cache the render, and do closed-class flags in code

The render step sits between two caches. The record store is keyed by `line_id` with `source_hash` for invalidation, filled offline from an extracted script, and versioned. The render cache is keyed by `(line_id, record_version, style_hash, renderer_id)` and filled ahead of the reader: when line N displays, render N+1 to N+k in the background. Live hooks deliver text, not IDs, so the hook side needs a lookup from normalised source text plus previous-line hash to `line_id`. That is the gettext `msgctxt` problem, and GalTransl++'s surrounding-sentence cache lookups are the precedent ([GalTranslPP](https://github.com/julixian/GalTranslPP)). For a hooked game whose script cannot be extracted, the "offline" pass degrades to first-encounter writing with only past context, which is the single-stage case again; extraction tools such as GalTransl's extract-translate-inject workflow are what make the split worth it.

Within the render step, apply the deterministic layer first. Honorific keep, suffix or drop, and name order are slot fills on `neutral_en` from `address_terms`, done in code, with no model call. The IWSLT result (rule-based 95.5/100 against learned 26.2% informal) and the Committee of Zero toggle both say closed-class transforms belong there. If the style profile asks for nothing open-ended, the line is done. Only when `voice`, `register: flatten`, pun localisation or free text is set does the local model run, with the filled neutral line as a starting point, the record fields as constraints, and the style profile at the end of the prompt. A post-check verifies the hard facts (names from the glossary, honorific presence or absence by regex, length ratio, leftover kana, borrowing GalTransl's problem analyser) and falls back to the deterministic render on failure, following Valve's specificity-with-fallback rule.

### Keep the Japanese in the renderer's prompt

Four lines of evidence say the source should still reach the renderer. Meaning pivots lose information: AMR generation managed about 2 of 3 on semantic accuracy and only matched a cascade ([Fan and Gardent](https://arxiv.org/pdf/2011.05443)), and GF's interlingua failed on idioms and disambiguation ([GF](https://www.grammaticalframework.org/lib/doc/translation.html)). Every successful LLM-era intermediate method (MAPS, TransAgents, TEaR) keeps the source alongside its notes. The record is written by a model and is unverifiable prose in places; the source is the only ground truth the renderer can check it against. And the source line costs 20-60 tokens, trivial at thousands of tokens per second of prefill. The counter-argument is real: small models attend poorly to context ([Mohammed and Niculae](https://arxiv.org/pdf/2410.14391v2)), and a renderer handed both might re-translate from the Japanese and ignore the record. That is testable with counterfactual records (experiment 2), and the design should treat the record as authoritative for names, address terms and register, and the source as a check on meaning. This search found no study that ran this exact comparison.

## 8. The same record drives the learner overlay

A companion report on Japanese learning and Anki tooling proposes a selective-gloss reading overlay with a five-rung hint ladder (highlight unknown lemma, reading, multiple-choice L1 gloss, contextual sense or grammar note, full translation) over a learner model keyed by JMdict entry ID with FSRS retrievability. The record gives that overlay its expensive rungs for free. Rung 5 is the neutral render, or a styled one for a learner who wants to read in a preferred voice. Rung 4, which the overlay design planned as a live call to a local 7-14B model with unmeasured latency, becomes a short render from `literal_en`, `register`, `address_terms` and the lemma's sense in context, all precomputed by a model that saw the whole script. The record's `lemmas` field, filled offline with Sudachi and JMdict, removes per-line tokenisation from the hot path and lets the overlay pre-compute which lines will need rung 4 for the learner's current known set.

The learner model then becomes one more conditioning input, alongside the style profile. For the overlay's clause-level hybrid-reading mode, the record's `clauses` alignment solves the problem the earlier design identified, that Japanese SOV order breaks word-level weaving, because swaps happen at clause boundaries the frontier pass already aligned. The earlier report's other finding still binds: prompted frontier models are poor at hitting low vocabulary levels, worse in Japanese (GPT-5.2 58.8% coverage against 76.0% for an RL-tuned 4B model) ([Re-RIGHT](https://arxiv.org/pdf/2604.05302)), so a learner render must be verified in code against the learner's known set and regenerated where it misses, exactly like the style post-check. Learner state changes daily, so raw retrievability should not go in the cache key. Key on a coarse bucket, such as the set of unknown lemmas in the line, and keep rungs 1-3 deterministic and uncached. The spoiler flag from VNDB glossaries also earns its keep here: a rung-4 note written by a model that has read the whole script can leak the ending unless the record bounds it.

## 9. Real gaps, as far as this search reached

The empty cells are specific. This search found no tool or paper that stores a language-neutral per-line record and renders it under user style settings. It found no tool documenting an honorifics toggle; the only honorific option found is a human-authored fan patch whose storage format is undocumented. It found no research on Japanese-to-English honorific or register rendering control, as opposed to English-to-Japanese formality generation, and no evaluation of honorific retention. It found no study of a small renderer consuming an LLM-written description, no measurement of how many teacher triples a style-conditioned renderer needs, and no measurement of whether a fine-tuned renderer ignores its conditioning. Puns remain mostly unsolved even for frontier ensembles. Reference-free evaluation of heavily styled output, such as pirate speech, has no benchmark; the check has to be built from the record itself. Search coverage of Chinese-language VN communities and chat-server-only projects was limited, so a private tool doing some of this could exist.

## 10. Candidate experiments, cheapest first

### Experiment 1 (one afternoon): prompted local renderer against direct frontier translation

Take about 300 consecutive lines from a VN script that is owned and extractable, ideally a stretch with honorific shifts, a pun or two and a hostile character. Have a frontier model write records in the schema above with the full chapter in context, plus its own direct translation under each style profile. Render the same lines on a single 24 GB consumer GPU with a prompted Qwen3-8B and 14B (or a Gemma 3 12B) under five profiles: neutral, honorifics kept, honorifics dropped, puns localised, and pirate. Score honorific and name compliance by regex, meaning preservation by having a judge from a third model family count omitted, wrong and added propositions against `literal_en` and `intent`, fidelity of the neutral render with xCOMET or MetricX against the frontier neutral translation, and style compliance by pairwise judgement with position swapping and length binning. Log time to first token and per-line latency at batch 1. This answers the learner overlay's rung-4 latency question as a by-product. A good outcome is that the 14B renderer is within a few points of the frontier on meaning errors while meeting the regex flags 100% via the deterministic layer.

### Experiment 2 (one to two evenings): ablations that test the joint

On the same lines, run the renderer with the source on and off, and with fields removed one at a time (addressee, relationship, register, wordplay, scene). Then edit records counterfactually, for example making the addressee a stranger or flipping status, and check that the output changes accordingly. If outputs ignore counterfactual edits when the source is present, the renderer is re-translating, and the record is decoration. Also compare the deterministic honorific path against asking the model to apply the flag. This experiment decides whether to pass the source, and it yields the minimal field set, which nobody has published.

### Experiment 3 (a weekend): stacking style constraints

Render with one through five simultaneous style flags (honorifics, name order, puns, register flattening, voice) and plot compliance and meaning errors against the number of flags, following FollowBench's design. Include a hostile-character subset to measure softening and refusals, the failure the WMT 2023 study found in Llama2. If compliance falls off at three flags as FollowBench predicts for open models, that sets how much the deterministic layer must absorb, or whether to decompose rendering into two passes.

### Experiment 4 (a week): distil a renderer with QLoRA

Generate on the order of ten thousand (record, style profile, output) triples with the frontier teacher, rendering each record under several sampled profiles so the model learns that output varies with the profile while meaning holds; that size is an engineering guess scaled from the MT-Patcher and distilling step-by-step data efficiency, not a measured requirement. Fine-tune a 4B and an 8B with QLoRA on the same 24 GB GPU. Test on a held-out game and on a style not seen in training, against the prompted baseline from experiment 1. Watch for the SFT regression the soft-constraint paper reported, and judge with a family that is neither the teacher's nor the student's.

### Experiment 5 (ongoing): the learner render on real reading

Wire the record into the learner overlay for one VN the learner is actually reading. Randomise unknown lemmas between rung-4 notes rendered from the record and rung-4 notes generated live from the raw line plus ten lines of history, and compare a blind accuracy rating of the notes and the learner's one-week recognition of the words, using the overlay design's within-subject setup. Add the clause-level hybrid mode for a chapter, verified against the learner's known set with Sudachi. This is the experiment that shows whether the offline record improves learning, not just translation.

## 11. Conclusion

The idea is not new in its parts, and that is the encouraging finding. Localisers have always layered voice on top of a neutral source, fan teams have shipped honorific toggles where the transform is closed-class, NLG showed that a realiser given an explicit plan omits far less, and VN tooling already runs an LLM pass over whole scripts to fix names before translating. What nobody appears to have built is the store in the middle: a per-line record that outlives any single target text. Treating that record, rather than the translation, as the durable artifact changes the economics. The expensive model runs once per line, every later preference is a cheap render or a code path, and the same record serves a reader who wants pirate speech, one who wants every "-senpai" kept, and a learner who wants only the unknown words glossed.

The design choice that matters most is where to stop trusting the model. The evidence says to trust it for open-ended voice and nothing else: names, address terms, register and honorific spans should be fields and slot fills checked in code, and the Japanese should stay in the prompt as the ground truth the record cannot fully replace. If experiment 2 shows the renderer actually conditions on the record rather than re-translating, the rest is familiar engineering: versioned records, content-addressed caches and read-ahead.

## 12. Sources

- [Committee of Zero, Steins;Gate 0 Steam patch project page](http://sonome.dareno.me/projects/sg0-steam.html)
- [Inverse, Final Fantasy Tactics: The Ivalice Chronicles](https://www.inverse.com/gaming/ivalice-chronicles-final-fantasy-tactics-japanese-only-feature-english-version) (secondary)
- [UTS #35 Part 9, MessageFormat](https://unicode.org/reports/tr35/tr35-messageFormat.html)
- [Fluent selectors guide](https://projectfluent.org/fluent/guide/selectors.html)
- [GalTransl README_EN](https://github.com/GalTransl/GalTransl/blob/main/README_EN.md)
- [GalTranslPP](https://github.com/julixian/GalTranslPP)
- [Moryossef et al., Step-by-Step: Separating Planning from Realization](https://arxiv.org/pdf/1904.03396)
- [LunaTranslator LLM docs](https://docs.lunatranslator.org/en/guochandamoxing.html)
- [XUnity.AutoTranslator README](https://github.com/bbepis/XUnity.AutoTranslator/blob/master/README.md)
- [Amazon IWSLT 2022 formality system](https://aclanthology.org/2022.iwslt-1.32.pdf)
- [VNDB release record r50519](https://yorhel.org/r50519) (secondary)
- [VNDB release record r97520](https://yorhel.org/r97520) (secondary)
- [Siliconera, Chaos;Child fan patch](https://www.siliconera.com/fan-made-chaoschild-pc-patch-offers-more-fixes-subtitles-and-translated-cgs/) (secondary)
- [CommitteeOfZero/sghd-patch](https://github.com/CommitteeOfZero/sghd-patch)
- [Nintendo eShop, Taisho x Alice English Text Mode](https://www.nintendo.com/store/products/taisho-x-alice-all-in-one-plus-english-text-mode-add-on-bundle-switch)
- [RPG Fan, Kanon English port](https://www.rpgfan.com/2024/05/25/kanon-to-receive-english-port/) (secondary)
- [Bulbapedia, Options](https://bulbapedia.bulbagarden.net/wiki/Options) (community wiki)
- [Wikipedia, The Great Ace Attorney Chronicles](https://en.wikipedia.org/wiki/The_Great_Ace_Attorney_Chronicles) (secondary)
- [Nihon Goes West, Tradução em Revista](https://periodicos.ufsc.br/index.php/traducao/article/view/87234) (abstract only)
- [J-Novel Club forum, honorifics thread](https://forums.j-novel.club/topic/4422/may-we-get-light-novel-translations-with-honorifics/20?lang=en-US) (forum)
- [ANN forum, honorifics in subs](https://www.animenewsnetwork.com/bbs/phpBB2/viewtopic.php?p=3428755) (forum)
- [AnimeNation, Ask John on honorifics](https://www.animenation.net/blog/?p=1328) (secondary)
- [Netflix Japanese Timed Text Style Guide](https://partnerhelp.netflixstudios.com/hc/en-us/articles/215767517-Japanese-Timed-Text-Style-Guide)
- [Legends of Localization, Dragon Quest IV accents](https://legendsoflocalization.com/articles/dragon-quest-iv-accents/)
- [Wikipedia, Mother 3 fan translation](https://en.wikipedia.org/wiki/Mother_3_fan_translation) (secondary)
- [TechCrunch, Facebook pirate language 2009](https://techcrunch.com/2009/09/19/once-again-facebook-owns-talk-like-a-pirate-day-on-the-web)
- [Leiden thesis, Yakuwarigo Lost in Translation](https://openaccess.leidenuniv.nl/handle/1887/64352)
- [Ren'Py translation docs](https://www.renpy.org/doc/html/translation.html)
- [Yarn Spinner localisation](https://docs.yarnspinner.dev/yarn-spinner-for-unity/assets-and-localization)
- [Yarn Spinner markup](https://docs.yarnspinner.dev/write-yarn-scripts/advanced-scripting/markup.md)
- [Mozilla Hacks, Fluent 1.0](https://hacks.mozilla.org/2019/04/fluent-1-0-a-localization-system-for-natural-sounding-translations/)
- [CLDR 47 release](https://cldr.unicode.org/index/downloads/cldr-47)
- [CLDR downloads](https://cldr.unicode.org/index/downloads)
- [Unreal Engine text localisation](https://dev.epicgames.com/documentation/en-us/unreal-engine/text-localization-in-unreal-engine?application_version=5.3)
- [i18next context](https://www.i18next.com/translation-function/context)
- [GNU gettext contexts](https://www.gnu.org/software/gettext/manual/html_node/Contexts.html)
- [Alconost, game translation context](https://alconost.com/en/blog/game-translation-context) (vendor blog, secondary)
- [Game Developer, translator-friendly text (2014)](https://www.gamedeveloper.com/production/developers-make-your-text-translator-friendly-a-few-tips-part-1-)
- [Zelda Dungeon, interview with Clyde Mandelin](https://www.zeldadungeon.net/zelda-dungeon-exclusive-interview-with-legends-of-localization-creator-clyde-tomato-mandelin/)
- [Grammatical Framework translation doc](https://www.grammaticalframework.org/lib/doc/translation.html) (project doc)
- [Carbonell, Mitamura and Nyberg, The KANT perspective (1992)](https://preview.aclanthology.org/setup/1992.tmi-1.20) (bibliographic page only)
- [Ranta et al., Abstract Syntax as Interlingua (CL 2020)](https://submissions.cljournal.org/index.php/cljournal/article/view/1554) (listing only)
- [Fan and Gardent, multilingual AMR-to-text](https://arxiv.org/pdf/2011.05443)
- [MAPS, arXiv](https://arxiv.org/abs/2305.04118) (abstract only)
- [MAPS, TACL 2024 listing](https://aclanthology.org/2024.tacl-1.13/)
- [TransAgents, arXiv](https://arxiv.org/html/2405.11804v1)
- [TransAgents, TACL 2025 listing](https://aclanthology.org/2025.tacl-1.42/)
- [TEaR, arXiv v3](https://arxiv.org/html/2402.16379v3)
- [TEaR, Findings of NAACL 2025](https://aclanthology.org/2025.findings-naacl.218.pdf)
- [Ataee and Popescu-Belis, CoT for context-aware translation](https://arxiv.org/html/2510.18077v1)
- [Semantic Pivots Enable Cross-Lingual Transfer](https://arxiv.org/html/2505.16385v1)
- [Feely et al., Controlling Japanese Honorifics (WAT 2019)](https://aclanthology.org/D19-5203/) (abstract only)
- [CoCoA-MT](https://ar5iv.labs.arxiv.org/html/2205.04022)
- [Marrese-Taylor, Wang and Matsuo, WMT 2023](https://aclanthology.org/2023.wmt-1.49.pdf)
- [Lee et al., Fine-grained Gender Control](https://arxiv.org/pdf/2407.15154) (preprint)
- [JP-TL-Bench](https://arxiv.org/pdf/2601.00223)
- [Hinami et al., Towards Fully Automated Manga Translation](https://arxiv.org/pdf/2012.14271)
- [Lippmann et al., COLING 2025](https://aclanthology.org/2025.coling-main.232.pdf)
- [NLP2024 P7-13, LLM manga translation](https://www.anlp.jp/proceedings/annual_meeting/2024/pdf_dir/P7-13.pdf)
- [Mohammed and Niculae 2024](https://arxiv.org/pdf/2410.14391v2)
- [JOKER 2026 Task 2 overview](https://ceur-ws.org/Vol-4283/paper303.pdf)
- [Don't lose the message while paraphrasing](https://ar5iv.labs.arxiv.org/html/2308.09055)
- [LunaTranslator README](https://github.com/HIllya51/LunaTranslator)
- [LunaTranslator translation optimisation docs](https://docs.lunatranslator.org/en/transoptimi.html)
- [DeepWiki, LunaTranslator translation engines](https://deepwiki.com/HIllya51/LunaTranslator/4.4-adding-new-translation-engines) (secondary, auto-generated)
- [Sakimichi's Otome Spot, 2025-11-22](https://sakimichi.wordpress.com/2025/11/22/translating-visual-novels-in-2026/) (secondary)
- [XUnity LlmTranslators](https://github.com/joshfreitas1984/XUnity.AutoTranslate.LlmTranslators)
- [XUnity AutoLLMTranslator](https://github.com/NothingNullNull/XUnity.AutoLLMTranslator)
- [Textractor Translator](https://github.com/MRGRD56/textractor-translator)
- [MoriTranslates rpgmaker-translator](https://github.com/MoriTranslates/rpgmaker-translator)
- [DazedMTLTool / DazedTL](https://github.com/dazedanon/DazedMTLTool)
- [VNTranslator system prompt docs](https://docs.vntranslator.com/advanced/llms/system-prompt)
- [UGTLive](https://github.com/SethRobinson/UGTLive)
- [GalTransl release 8.4.0](https://github.com/GalTransl/GalTransl/releases/tag/8.4.0)
- [GalTransl README](https://github.com/GalTransl/GalTransl)
- [Sakura-GalTransl-7B-v3.7](https://huggingface.co/SakuraLLM/Sakura-GalTransl-7B-v3.7)
- [SakuraLLM](https://github.com/SakuraLLM/SakuraLLM)
- [Sakura-GalTransl-14B-v3.8](https://huggingface.co/SakuraLLM/Sakura-GalTransl-14B-v3.8)
- [vntl-llama3-8b-202409](https://huggingface.co/lmg-anon/vntl-llama3-8b-202409-hf)
- [Sugoi-14B-Ultra-GGUF](https://huggingface.co/sugoitoolkit/Sugoi-14B-Ultra-GGUF)
- [LinguaGacha](https://github.com/neavo/LinguaGacha)
- [VNDB-Glossary-Builder](https://github.com/rikimtasu/VNDB-Glossary-Builder)
- [VisualNovelCharacterNameExtractor](https://github.com/HareChaser/VisualNovelCharacterNameExtractor)
- [VNTL Leaderboard 2026](https://huggingface.co/datasets/yukobayashi500/vntl-leaderboard-2026) (community-run)
- [manga-image-translator](https://github.com/zyddnys/manga-image-translator/blob/main/README.md)
- [Koharu](https://github.com/koharu-rs/koharu)
- [Game Overlay Translator on Steam](https://store.steampowered.com/app/4864520/Game_Overlay_Translator/)
- [PC Gamer, The Alters](https://www.pcgamer.com/games/adventure/spitting-in-the-face-of-your-international-audience-the-alters-caught-using-generative-ai-for-background-text-and-translations-despite-not-disclosing-such-on-steam/)
- [Held Games, AI fan translations controversy](https://heldgames.com/guides/ai-fan-translations-controversy) (secondary)
- [Impact of Model Size on Data-to-Text](https://arxiv.org/html/2407.14088v1)
- [Hsieh et al., Distilling step-by-step](https://arxiv.org/pdf/2305.02301)
- [MT-Patcher](https://arxiv.org/pdf/2403.09522)
- [Qwen3 Technical Report](https://arxiv.org/pdf/2505.09388)
- [Gemma 3 Technical Report](https://arxiv.org/pdf/2503.19786)
- [FollowBench](https://arxiv.org/pdf/2310.20410)
- [Step-by-Step Mastery, soft constraints](https://arxiv.org/pdf/2501.04945)
- [Li et al., Measuring and Controlling Persona Drift](https://arxiv.org/html/2402.10962v1)
- [Character Card V2 spec](https://github.com/malfoyslastname/character-card-spec-v2/blob/main/spec_v2.md)
- [Anthropic, Persona vectors](https://www.anthropic.com/research/persona-vectors)
- [Hardware Corner RTX 4090 LLM benchmarks](https://www.hardware-corner.net/rtx-4090-llm-benchmarks/) (secondary)
- [vLLM automatic prefix caching](https://docs.vllm.ai/en/v0.8.5/features/automatic_prefix_caching.html) (listing only)
- [XGrammar](https://arxiv.org/html/2411.15100v3)
- [Penalizing Length](https://arxiv.org/html/2510.22028v3)
- [Beyond the Surface, self-preference](https://arxiv.org/pdf/2506.02592)
- [Evaluating Text Style Transfer Evaluation](https://arxiv.org/pdf/2502.04718)
- [Valve Response System](https://developer.valvesoftware.com/wiki/Response_System)
- [Emily Short on Ruskin's GDC 2012 talk](https://emshort.blog/2012/03/16/gdc-2012-talk-on-dynamic-dialogue/) (secondary summary)
- [Evans and Short, Versu](https://www.cs.uky.edu/~sgware/reading/papers/evans2014versu.pdf)
- [McCoy et al., Comme il Faut / Prom Week](https://cs.uky.edu/~sgware/reading/papers/mccoy2014cif.pdf)
- [Mairesse and Walker, PERSONAGE](https://preview.aclanthology.org/fix_video/P07-1063.pdf)
- [Jun et al. 2026](https://arxiv.org/pdf/2601.04716)
- [Game World Observer, Ubisoft NEO NPC](https://gameworldobserver.com/2024/03/20/ubisoft-neo-npc-genai-real-dialogue-with-game-characters) (secondary)
- [Re-RIGHT](https://arxiv.org/pdf/2604.05302)
- [Project status: Japanese immersion learning with Anki and selective glossing (Hiina, companion report)](https://ai.hiina.space/reports/jp-learning-and-anki-tooling.md), source of the learner-overlay design referenced in sections 1, 7, 8 and 10

---

Text licensed CC BY 4.0 (attribution: Hiina, ai.hiina.space). Source: https://github.com/hiinaspace/ai-hiina-space
