Ship the merged dictionary layer as 1.5.2. Every user-facing string now resolves through the en/zh dictionaries instead of hardcoded English, with a language switcher in the header and local setup/start scripts for the first-run path. Docs: docs/changelogs/2026-09-16-bilingual-ui.md
1.9 KiB
1.9 KiB
Calliope 1.5.2 — bilingual UI (English / 中文) and one-command local start
Every user-facing string used to be hardcoded English, spread across ~60 components — so a Chinese-speaking user saw an English UI no matter how the app was configured, and there was no single place to change a label. This release routes the whole interface through a dictionary layer with a language switcher in the header.
What changed
- Full en/zh dictionary — 1001 keys, mirrored 1:1 between
en.tsandzh.ts. Both are typed againstDict(typeof en), so the compiler rejects a translation that is missing a key. - Every component wired through
t()— nav rail, canvas, projects, story, assets, script, queue, the video workspace, Build Scene, settings, agent chat, toasts, and the error paths. No hardcoded English copy remains in the UI. - Language switcher in the header — English / 中文. The choice is stored in
localStorage(calliope-lang) and applied on reload; a missing or unrecognized value falls back to English. - Placeholder interpolation —
t('key', { name: … })substitutes{name}, with acountshorthand that also fills{n}, the convention most count-bearing strings use. - Genre / tone / duration options moved into
formOptions.ts, mapping the English values the backend stores onto dictionary keys — so stored project data keeps working regardless of the display language. - Local start/stop scripts —
setup.bat(idempotent first-time install),start.bat(two visible windows),start-bg.bat(background, output tologs/), andstop.bat.
Upgrade
No migration and no new dependencies. git pull, then reload the frontend — an
npm install in calliope-web/ is only needed if you are coming from an older
release. The UI defaults to English; switch to 中文 with the dropdown in the
header.