diff --git a/AGENTS.md b/AGENTS.md index e9759839..89d70ac4 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -15,6 +15,23 @@ - Prefer composable primitives (signals, hooks, utilities) over deep inheritance or implicit global state. - When adding platform integrations (SSE, IPC, SDK), isolate them in thin adapters that surface typed events/actions. +## Multi-Language Support (i18n) + +The UI uses a small custom i18n layer (no ICU/messageformat). When building features, never hardcode user-visible strings. + +- **Runtime API:** use `useI18n()` in components (`const { t } = useI18n();`) and `tGlobal(...)` in stores/non-component code. + - Implementation: `packages/ui/src/lib/i18n/index.tsx` +- **Where messages live:** `packages/ui/src/lib/i18n/messages//` as TypeScript objects (`"flat.dot.keys": "string"`). + - Each locale has an `index.ts` that merges message parts; duplicate keys throw at build time. + - Merge helper: `packages/ui/src/lib/i18n/messages/merge.ts` +- **Adding a new string:** add it to the appropriate `.../messages/en/*.ts` part file, then add the same key to each other locale’s corresponding file. + - Missing translations fall back to English (and finally to the key), so gaps can be easy to miss. +- **Interpolation:** placeholders are simple `{name}` replacements (word characters only). Avoid placeholders like `{file-name}`. +- **Pluralization:** handle manually via separate keys like `something.one` / `something.other` and choose in code. +- **Adding a new language:** add a new `messages//` folder + `index.ts`, register it in `packages/ui/src/lib/i18n/index.tsx`, and add it to the language picker in `packages/ui/src/components/folder-selection-view.tsx`. +- **Locale persistence:** the selected locale is stored in app preferences (`locale`) and persisted via the server config (default `~/.config/codenomad/config.json`). +- **Avoid English-only paths:** do not import `enMessages` directly in feature code; always go through `t(...)` so locale changes apply. + ## File Length Guidelines (Highlight Only) We track file size as a refactoring signal. When you touch or create files, highlight oversized files so the team can plan refactors when time permits.