The pipeline was hard-coded to Simplified Chinese in three places: the
drafter was told to translate into Chinese, the critic was told to compare
English with Chinese, and the glossary's translated forms were read from a
"zh" key. A production that declared target_language: es-ES was therefore
translated into Chinese and filed under a Spanish name - measured on oldbox,
deal-hunter-es held 3,038 paragraphs of Chinese and was reported complete.
A new registry, tools/translation/languages.py, is the single source of
truth for what a target language is: its names, its script, its punctuation,
its glossary key, its typography and its chapter-numbering convention. Ten
languages are registered. The prompt scaffolding stays in Chinese - that is
what the models read best - and the target is named with its Chinese, English
and native names so there is no room to misread it.
The registry now reaches every stage:
- prompts.py: the analyst, drafter, critic and glossary blocks take the
target. The hard rules about this book - Deal Hunter is the ship's name,
the AI's name and the book's title, so it stays in English - are the
language's own table for Chinese and the global rules for everything else,
so a language with no table does not lose them. The Chinese rules are
byte-for-byte what they were.
- pipeline.py: --target-language, a run-directory guard that refuses to
reuse a directory belonging to another language (from the manifest, or by
measuring the text it already holds), a draft-keyed-by-target reader, and
a refusal of a draft that came back in the wrong script.
- book.py: per-language chapter-title and subtitle tables. A language with no
table falls back to the English title, never to another language's; a
language with a table and a missing chapter gets a visible marker in its
own language.
- qa.py: the target's quote marks, punctuation, script count and forbidden
title forms. The Latin-residue check is skipped for a Latin target, where
it would flag the whole book.
- align.py: the aligner and verifier prompts name the target, and the
sentence and clause splitting uses the target's own terminators.
- render.py: the fonts, the language and country codes, the writing
direction, the chapter headings and the fixed editorial strings around the
translation are the target's. The Latin-run span is skipped for a Latin
target, where marking the text as English would tell the renderer it is
English.
- project_status.py: the dashboard measures a sample of a production's text
and reports a production whose text is not in the language it declares as
"mismatched", not "complete". A chapter count is a claim about the files;
the script check is a measurement of the text.
Also fixes: the dashboard gated every language's production on the source
production existing, so a Spanish production could never be reported even
when it was there.
The Chinese render is byte-identical to before on the real book, and the
Chinese rules are unchanged. Suite: 620 passed, the same 68 pre-existing
environment failures, +49 new tests.