Skip to content
i18n System

Tired of configuration hell?

Four packages. Zustand-native state sync. No plugins to wire, no adapters to configure. Built because we wanted something that just works.

FOUR PACKAGES

01

i18n-core

Translator engine with multi-stage fallback resolution. React provider, hooks, SSR injection — one package.

02

i18n-core-zustand

Bidirectional Zustand sync with rehydration barrier. No flash, no race condition, no workaround.

03

i18n-formatters

Date, number, currency — all from browser Intl APIs. No ICU data bundle, no locale packages to install.

04

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

Feature
react-i18next
next-intl
HUA i18n
State management
Plugin-based
React context
Zustand-native
Zustand sync
Manual wiring
Not supported
Built-in, bidirectional
SSR support
Plugin required
Built-in
Built-in + rehydration barrier
Pluralization
Plugin
ICU MessageFormat
Native Intl.PluralRules
Array values
Built-in + random select
Flash prevention
Partial
Stage-2 cross-language fallback
ESLint rules
4 rules
Routing dependency
None
/[locale]/ required
None