Internationalization: 7 languages with live switching
Custom signal-based runtime (no i18n dependency): shared src/shared/i18n dictionaries, ui I18nService.t() reactive by construction so language switches live, and a backend i18n.ts for native menus + thrown errors. Every user-facing string keyed across templates, toasts, dialogs, file kinds, columns, macOS menu/context menus, and errors. Language picker in Options (auto-detects OS locale, falls back to English); switching relabels the webview and native chrome instantly. English/Spanish/French/ German fully drafted; Chinese/Japanese/Basque drafted, flagged for native review. Docs updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -85,6 +85,25 @@ touching the adjacent code.
|
||||
don't shrink the 400 ms debounce.
|
||||
- `panel.touched` gates localDir auto-navigation; `connectToken` guards
|
||||
against a slow connect resolving into a panel the user already reused.
|
||||
|
||||
## i18n
|
||||
|
||||
- **Translations live in `src/shared/i18n/*.ts` (TS, not JSON)** — deliberate:
|
||||
it sidesteps `resolveJsonModule` differences between the Angular esbuild and
|
||||
Bun builds and gives full typing. `en.ts` is the source of truth; other
|
||||
locales are partial and fall back to English then the raw key.
|
||||
- **`i18n.t()` is reactive because it reads the `locale` signal** — that's what
|
||||
makes live language switching work with no pipe. If you cache a translated
|
||||
string in a plain field it WON'T update on switch; call `t()` in the template
|
||||
(or in a signal-reading getter) instead. Same for `i18n.date()/size()`.
|
||||
- Dictionary values are TS string literals: **French/other apostrophes break
|
||||
single-quoted entries** (`'…c'est…'`). Use double quotes for any value
|
||||
containing an apostrophe. Plurals are `{ one, other }` maps (not ICU strings);
|
||||
zh/ja supply only `other`.
|
||||
- **Native menus can't use the Angular service** — `menu.ts`/`context-menu.ts`
|
||||
go through backend `i18n.ts`, and the app menu must be rebuilt when the locale
|
||||
changes (wired in index.ts `settingsChanged`), or it keeps the old language.
|
||||
- `eu`/`zh`/`ja` are AI drafts pending native review (see the i18n README).
|
||||
- **Silent auto-refresh must snapshot sessionId+cwd and discard a mismatched
|
||||
result.** A normal `refresh()` is masked by `busy` (input blocked), but the
|
||||
silent variant (poll/watch) runs while the user can navigate — without the
|
||||
|
||||
Reference in New Issue
Block a user