diff --git a/calliope-web/package-lock.json b/calliope-web/package-lock.json index 7d763dcd..f2f3602a 100644 --- a/calliope-web/package-lock.json +++ b/calliope-web/package-lock.json @@ -1,12 +1,12 @@ { "name": "calliope-web", - "version": "1.5.1", + "version": "1.5.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "calliope-web", - "version": "1.5.1", + "version": "1.5.2", "dependencies": { "@tanstack/svelte-query": "^5.66.0", "@types/three": "0.185.0", diff --git a/calliope-web/package.json b/calliope-web/package.json index 0e21ea13..ae150464 100644 --- a/calliope-web/package.json +++ b/calliope-web/package.json @@ -1,6 +1,6 @@ { "name": "calliope-web", - "version": "1.5.1", + "version": "1.5.2", "private": true, "scripts": { "dev": "vite dev", diff --git a/docs/changelogs/2026-09-16-bilingual-ui.md b/docs/changelogs/2026-09-16-bilingual-ui.md new file mode 100644 index 00000000..16d6d186 --- /dev/null +++ b/docs/changelogs/2026-09-16-bilingual-ui.md @@ -0,0 +1,35 @@ +# 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.ts` and + `zh.ts`. Both are typed against `Dict` (`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 a `count` shorthand 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 to + `logs/`), and `stop.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. diff --git a/docs/changelogs/README.md b/docs/changelogs/README.md index 2efc71b1..31b73012 100644 --- a/docs/changelogs/README.md +++ b/docs/changelogs/README.md @@ -2,6 +2,7 @@ Dated notes for GitHub releases. Newest first. +- [2026-09-16 bilingual UI](./2026-09-16-bilingual-ui.md) — en/zh dictionary across every component; header language switcher; local start scripts (1.5.2) - [2026-09-13 clip shot brief](./2026-09-13-clip-shot-brief.md) — per-clip brief in the Video composer; two-column Video stage (1.5.1) - [2026-09-10 Build Scene + scene → clips](./2026-09-10-build-scene-clips.md) — 3D blockout composer; vision/doc input; 1 scene : N shot clips; faithful scripts (1.5.0) - [2026-09-07 chunking + cards](./2026-09-07-chunking-cards.md) — Story/script generate in chunks; ask_user cards appear (1.4.1)