# FLXN ## i18n (Lingui v6) — applies to every user-facing string Any change that adds, edits, or removes user-visible text must follow the `i18n` skill (`.claude/skills/i18n/SKILL.md`): wrap with context-bound Lingui macros, then `bun run extract`, translate new entries in every non-`en` locale, and `bun run i18n:check`. Adding a language: use the `add-language` skill. Hard rules (full detail in the skill): - Only `Trans`/`Plural`/`useLingui` from `@lingui/react/macro` and `msg` from `@lingui/core/macro`. Never global `t`/`plural`/`select` from core/macro (SSR locale bleed). - `useLingui()` at top level of components/hooks only; add `t`/`i18n` to memo dep arrays. - Never hand-edit msgids or `src/locales/en/messages.po` (generated). - vite.config.ts babel plugin order (lingui before react-compiler) is load-bearing. - `LinguiProvider` stays ABOVE `AuthProvider` in providers.tsx (localized query hooks call useLingui), and `__root`'s `head()` must never read `match`/context (circular route-type inference breaks beforeLoad typing).