Web app i18n stack 2026
Localizing a web app is more than translating strings. Dates, numbers, currencies, plurals, RTL, SEO — all different.
Web app localization is broader than "translate the buttons". The full job:
- UI strings (buttons, labels, error messages).
- Long-form content (articles, descriptions).
- Dates and times in local format.
- Numbers, currencies, units.
- Pluralization (1 file vs 2 files vs 0 files — varies wildly by language).
- RTL — Arabic, Hebrew, Persian.
- SEO — locale URLs, hreflang, sitemap entries.
Stack that works:
- react-i18next or next-intl for UI strings.
- Built-in Intl API for dates, numbers, currencies. Don't import moment.js — it's deprecated.
- ICU MessageFormat for pluralization and complex substitutions.
- Content translations in CMS or database, not in JS bundle.
What goes wrong:
- Hardcoded strings in JSX. Start without i18n, retrofit is painful.
- Wrong pluralization rules — English (1/many) applied to languages with more rules.
- SEO — duplicate hreflang, missing x-default.
- All translations in one giant JSON loaded everywhere.
- Forgetting RTL — even when "we don't support Arabic" — text directions in mixed content.