chore(i18n): retire the stale per-language gen_<lang>.py generators

Each scripts/gen_<lang>.py held a hardcoded `translations` dict that it
wrote over res/lang/<lang>.json wholesale. Those dicts had drifted ~285
keys behind the committed JSONs (keys were added directly to the JSONs
over time), so running any generator silently truncated a language file —
a live regression trap. Nothing invokes them (not build.sh, CMake, or CI),
and the JSONs are now the maintained source of truth, so the generators are
pure duplication plus a footgun.

Retire all eight. The additive, non-destructive scripts/add_missing_
translations.py remains the i18n helper, and CLAUDE.md now documents the
"edit the JSONs directly and additively" workflow.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-07 01:07:55 -05:00
parent 715cfd622e
commit 036199a011
9 changed files with 1 additions and 5187 deletions

View File

@@ -98,5 +98,5 @@ The version has a **single source of truth**: `project(... VERSION 1.2.0 ...)` p
- **C++17.** Match the surrounding code's style per file.
- **Icons:** use the Material Design icon font defines (`ICON_MD_*`); never raw Unicode glyphs.
- **UI layout values** belong in `res/themes/ui.toml`, read via `schema::UI()` — do not hardcode pixel sizes/offsets in code.
- **i18n:** user-facing strings are translated via `src/util/i18n`; translation JSON lives in `res/lang/` (`de`, `es`, `fr`, `ja`, `ko`, `pt`, `ru`, `zh`, English fallback in code). Translation/font helper scripts are in `scripts/` (`gen_*.py`, CJK subset tooling).
- **i18n:** user-facing strings are translated via `src/util/i18n`; the English source of truth is the `strings_[...]` map in `src/util/i18n.cpp`, and the per-language translations live as the **source of truth** in `res/lang/` (`de`, `es`, `fr`, `ja`, `ko`, `pt`, `ru`, `zh`). **Edit those JSONs directly and additively** — write with `json.dump(..., indent=4, sort_keys=True, ensure_ascii=False)`; never bulk-regenerate/overwrite a whole file (that path silently dropped ~285 keys/language before). `scripts/add_missing_translations.py` back-fills only the keys missing from a JSON (non-destructive), and `scripts/build_cjk_subset.py` rebuilds the CJK subset font (`res/fonts/NotoSansCJK-Subset.ttf`) after new CJK glyphs are added.
- **Commits:** the history uses Conventional Commits (`feat(scope): …`, `fix(scope): …`). PRs target `master`.