FOUR PACKAGES
i18n-core
Translator engine with multi-stage fallback resolution. React provider, hooks, SSR injection — one package.
i18n-core-zustand
Bidirectional Zustand sync with rehydration barrier. No flash, no race condition, no workaround.
i18n-formatters
Date, number, currency — all from browser Intl APIs. No ICU data bundle, no locale packages to install.
i18n-loaders
Network loader with TTL cache, request dedup, exponential backoff. Dev mode auto-invalidates on window focus.
KEY FEATURES
Rehydration Barrier
Zustand persist loads from localStorage asynchronously. If your i18n initializes before Zustand rehydrates — flash. A pub/sub barrier waits for storage, then syncs. No workaround needed.
Array Translation
Translation values can be arrays. t() randomly picks one. Built for emotional apps where varied responses matter. tArray() gives you all options.
Native Intl Formatting
useDateFormatter and useNumberFormatter wrap browser Intl APIs directly. No ICU data bundles, no locale packages. The browser already knows how to format.
Zero Flash Switch
Switching en → ko? If Korean isn't loaded yet, we show English — not empty strings, not raw keys. Stage-2 fallback across loaded languages.
ESLint Plugin
no-missing-key catches typos. no-raw-text flags hardcoded CJK. no-dynamic-key warns on runtime keys. no-unused-key finds dead translations. Four rules, all auto-fixable.
HOW WE COMPARE