import { LocaleProvider } from "@elabs-ai/components-ui";npm install @elabs-ai/components-tokens @elabs-ai/components-uiPaste it into Claude Code, Cursor, Codex or any other coding agent. Text in [brackets] is yours to fill in.
Add the brand-ui LocaleProvider component (from @elabs-ai/components-ui) to this project. 1. Read https://elabs-ai.com/llms.txt first: it maps every package and the rules. If you can use MCP servers, connect https://elabs-ai.com/mcp and use its search, docs and tokens tools. If not, run the same lookups in the terminal: `npx -y @elabs-ai/components-cli search "<what you need>"` and `npx -y @elabs-ai/components-cli docs <Component>`. 2. Look LocaleProvider up before writing code: `npx -y @elabs-ai/components-cli docs LocaleProvider` prints its real props, variants, what it pairs with and what to avoid. 3. If @elabs-ai/components-ui is not installed yet: `pnpm add @elabs-ai/components-tokens @elabs-ai/components-ui` (or `npm install @elabs-ai/components-tokens @elabs-ai/components-ui`). If this is the first brand-ui package in the project, wire it once: import `@elabs-ai/components-tokens/styles.css` plus the `themes/light.css` and `themes/dark.css` stylesheets in the CSS entry, add one Tailwind `@source` line per installed @elabs-ai package (Tailwind does not scan node_modules, so without it everything renders unstyled), and wrap the app root in `ThemeProvider` from `@elabs-ai/components-tokens`. 4. Use it here: [the screen or file, and what it should show] 5. Rules: use only @elabs-ai/components-* components and the semantic tokens — no raw colours, no raw font sizes, no arbitrary Tailwind values. Look up each component's real props with the docs tool before you use it; never guess a prop. 6. Done means: the typecheck passes, `npx -y @elabs-ai/components-cli audit src --strict` reports nothing, and you have opened the app and looked at every screen you touched in the light and the dark theme.
Examples
Rtl Arabic
Arabic (ar-EG) locale with RTL direction. Overrides `next` and `previous` keys; other keys fall back to the English defaults.
No Provider
Without a provider — `useLocale` degrades to en-US / ltr defaults.
External Translate Resolver
The `translate` resolver bridge (#19) — stands in for an app's own i18n runtime (next-intl, react-intl, i18next, …). It takes precedence over both `messages` and the shipped English defaults; returning `undefined` for a key falls through to the normal chain. See `docs/I18N.md` for a worked next-intl example.
Plural Forms
Cardinal-plural microcopy (#19) — `t("itemsSelected", { count })` selects the right English form ("1 item selected" vs "N items selected") from a `PluralMessage` map as `count` changes, via `Intl.PluralRules`.
Plural Forms Polish
The same plural key resolved for Polish (`pl-PL`), which has FOUR cardinal categories (one/few/many/other) with different count boundaries than English's two (one/other) — the case a plural design that only handles English silently gets wrong. Count 1 → "one", 2 → "few", 5 → "many".
API
LocaleProvider
| Prop | Type | Description |
|---|---|---|
locale | string | BCP-47 locale tag. Defaults to "en-US". Used by `t`, `formatNumber`, and `formatDate`. |
dir | "ltr" | "rtl" | Layout direction for the subtree. Defaults to "ltr". Set "rtl" for Arabic, Hebrew, Farsi, etc. |
messages | Messages | Additional/overriding message strings merged on top of the shipped English defaults. Only the keys you provide are overridden; the rest fall through to the English bundle. |
translate | (key: string, vars?: Record<string, string | number>) => string | undefined | null | Optional external resolver — hand brand-ui's microcopy off to an app's own i18n runtime (next-intl, react-intl, i18next, …) instead of maintaining a second, flattened message catalogue. Called with the raw key and vars (not pre-interpolated), so a real ICU formatter gets real values and can do its own pluralization/number/date formatting. Return a string to use it as-is (brand-ui does NOT re-run its own `{name}` interpolation on it — the app's runtime already formatted it). Return `undefined`/`null` to decline a key; brand-ui then falls back to `messages` → `DEFAULT_MESSAGES` → the raw key, in that order — so a resolver only needs to cover the keys it actually wants to override. See `docs/I18N.md`. |
childrenrequired | ReactNode |