Skip to content

Research

Louis Wright edited this page Oct 14, 2026 · 2 revisions

📄 Mirrors docs/research.md in the main repo — the repo version is canonical.

Research: i18n pain points, 2025–2026

Status: planning input. Collected 2026-10-14. This round covers sources not used before: other libraries' issue trackers, vercel/next.js, Reddit, Stack Overflow, Hacker News, dev.to, and X. Earlier research covered next-intl issues #1493, #1362, #2412, #2060, #2355, plus npm/GitHub stats. Every link below was opened and checked when collected. Where a summary is ours and not the reporter's, it says so.

Method

  • GitHub issue search, created ≥ 2025-01-01, sorted by comments, in: vercel/next.js, i18next/next-i18next, i18next/react-i18next, i18next/i18next, opral/paraglide-js, lingui/js-lingui, aymericzip/intlayer, generaltranslation/gt, lingodotdev/lingo.dev, tolgee/tolgee-js, QuiiBz/next-international, formatjs/formatjs, plus topic searches (root params, time zone, RTL, Zod, monorepo, email).
  • Stack Overflow API (tags next.js+internationalization, next-intl, i18next+next.js, since 2025-01-01), Hacker News Algolia API, dev.to API (i18n tag, top of the past year), X full-archive search, and Reddit via web search, because Reddit's JSON API returned 403.

Accepted findings → changes

# Finding Sources What changed in next-tongue
A1 next/root-params arrived in Next.js 16.3 and libraries are adopting it, but it still had bugs: Turbopack exports, missing types with two root layouts, and a stale "use cache" segment after changing locale. lingui/js-lingui#2645, Lingui on X, i18next/next-i18next#2345, vercel/next.js#92744, #96756, #98493, r/nextjs: next-intl and cacheComponents ADR 0007. The explicit locale stays canonical; an opt-in getT(ns) is evaluated at v0.9 behind tests for those three bugs. Tracked in #24.
A2 Time zone vs static rendering / hydration. Users get hydration mismatches when the server formats in the default zone, and a dynamic zone made every translation dynamic. amannn/next-intl#2136 ADR 0008. New timeZone config option, getFormat(locale, { timeZone }), a TongueProvider timeZone prop, and a dev warning. Tracked in #17.
A3 Locale negotiation cost grows with locale count. A Reddit user reports 120–180 ms per request with about 140 locales versus 1–3 ms with fewer than 5. Commenters suspect the locale matcher. r/nextjs: middleware extremely slow with 140+ locales The proxy uses a matcher precomputed at build time (lookup tables, with no Intl.* construction per request). A benchmark is now a v0.2 acceptance criterion. Tracked in #18.
A4 Whole catalogs leak into the RSC payload / client. lingui/js-lingui#2224, Stack Overflow 79579089, r/nextjs: Working with next-intl This was already a design goal. It is now an explicit, tested criterion: no catalog JSON in the RSC payload or HTML. Tracked in #20.
A5 Locale cookie SameSite=Strict breaks detection on cross-site navigation. QuiiBz/next-international#453 localeCookie defaults to SameSite=Lax and gains sameSite, secure, and path options. Tested. Tracked in #19.
A6 Monorepos: generated/library types not portable (TS2742, unresolved type package under pnpm). QuiiBz/next-international#455 v0.2 adds a pnpm-workspace fixture (shared messages package, two apps) with declaration: true. Public types must not reference non-exported internal packages. Tracked in #21.
A7 Script-locale fallback is error-prone (zh-TW falling to zh-Hans). i18next/i18next#2299 The default fallback chain follows CLDR parent locales (zh-Hant-HK → zh-Hant, never zh-Hans). Explicit fallback still overrides it. Added to v0.1 criteria. Tracked in #22.
A8 Providers/helpers that read headers() force dynamic rendering, and server helpers fail on cold workers. tolgee/tolgee-js#3526, i18next/next-i18next#2347, lingui/js-lingui#2615 This confirms ADR 0002. A cold-start test was added: getT inside generateMetadata and a server action on a fresh worker. (ROADMAP v0.2 criterion; part of #10.)
A9 Dev watcher memory leaks / orphaned processes. aymericzip/intlayer#398 v0.2 criterion: watch-mode memory stays flat over a 30-minute soak with 1,000 edits, and no child processes outlive next dev. Tracked in #23.

Evidence that confirms existing plans (no change)

Rejected / out of scope

Item Source Why rejected
Localized dynamic segments not cached under Cache Components vercel/next.js#86870, #85240 An upstream Next.js behaviour, not something an i18n library can fix. We link it from Troubleshooting only.
"Internal-only" locale mode (locale in the route, never in the URL) i18next/next-i18next#2345 Already prefix: 'never' (rewrite). No new mode needed.
In-context editing; client-side runtime catalogs tolgee/tolgee-js#3537, aymericzip/intlayer#289 Client catalogs conflict with ADR 0001/0009. Database/CMS messages are no longer rejected: build-time sources and server formatMessage are planned (ADR 0013, Database messages). MDX/content stays in "v1.x ideas".
Zod / form-validation messages, email and OG-image translation — We found no recent, verifiable reports for these topics in the sources searched. The existing getT(locale) already works in route handlers and server actions. We are not adding features without evidence.
Pages Router API routes with i18n config vercel/next.js#97231 Pages Router is out of scope (ADR 0006).
Hacker News e.g. Show HN: Localize React apps without rewriting code Product launches only. The search turned up no concrete pain reports.

Limitations

  • Reddit's JSON API returned 403, so we reached Reddit through web search. Reddit coverage is partial.
  • The GitHub search API rate-limited the last topic queries (RTL, monorepo, email), so those topics rely on the per-repository searches above.
  • X results were mostly promotional. Only the Lingui post was used, as a primary source for root-params adoption.

Clone this wiki locally