feat: campaign narrative translated into all 10 locales, native-reviewed (#238) - #240
Merged
Merged
Conversation
…wed (#238) Part 2 of #238: the 214 narrative+chrome keys added by #239 as EN placeholders now carry real translations in hi, uk, ru, de, fr, it, pt-BR, ko, zh, nep. Built by per-locale translator -> adversarial native-reviewer pipelines; the register for each language was derived from its own file (the ~700 existing keys are the style guide), so the campaign reads like the rest of that locale, not like a bolted-on translation. Notable register decisions the pipeline made and documented: - hi keeps level titles English (HELLO, GPU): the trophies panel already cites them in English, and 'Level' is on the file's English-terms list — while uk/ru/ko/it/fr/pt-BR/zh/nep translate titles to match the SAME cross-references their achievements already use in those languages. - zh rewrote 'N x faster' comparisons into the unambiguous X 的 N 倍 form — the literal 快 N 倍 prescriptively means (N+1)x and would have taught wrong multipliers next to the correct ms figures. - Devanagari numerals in nep prose, Western figures for $/ms/kW everywhere, per each file's existing conventions. The native reviewers (prompted as engineers who play games, told to refute) found and fixed 126 defects across the 10 locales — exactly the classes a machine translation ships: meaning inversions (pt-BR 'passou longe de' taught the OPPOSITE of 'far past'; ru/uk 'резервные копии' turned the availability-zone lesson into data-backup advice; fr 'télécharger' read as download in the upload level), broken grammar (de transitive 'verbluten', ko particles welded to em-dashes, nep ergative mismatches), and glossary breaks vs each file's own service cards. Also bound the three static briefing headers in index.html (Learn / Goals / Bonus) to the campaign_* keys — they were hardcoded EN and survived locale switches. Verification: scope machine-checked (every changed hunk inside the two #238 blocks, key sets byte-identical, only values differ); 805/805 x5; eslint 0; browser-verified hi/uk/ko/en briefings and level list with zero raw keys and zero console errors; ru/uk additionally hand-reviewed.
This was referenced Aug 5, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part 2 of #238 (mechanism landed in #239). The 214 narrative+chrome keys now carry real translations in hi, uk, ru, de, fr, it, pt-BR, ko, zh, nep — the campaign's teaching spine finally reads in the player's language.
How it was built
Per-locale pipelines: translator → adversarial native reviewer (prompted as an engineer who plays games, told to refute) → fixes in place. Each language's register was derived from its own file — the ~700 existing keys are the style guide — so the campaign reads like the rest of that locale: hi keeps the Hinglish glossary, uk keeps «ти», ru keeps formal «вы», de keeps its English-tech-term conventions, etc.
The reviewers earned their keep: 126 defects fixed
Exactly the classes a machine translation ships:
Register decisions worth knowing
campaign_*keys — they were hardcoded EN and survived locale switches.Verified independently of the agents
#238blocks, key sets byte-identical (only values differ)Out-of-scope finds (filing separately): it.js pre-existing inconsistency —
traffic_inferencesays "INFERENZA" while chapter-5 keys use "INFERENCE", and some it achievement texts cite level titles in EN.