Repository navigation
Research
Louis Wright edited this page Oct 14, 2026
·
2 revisions
📄 Mirrors
docs/research.mdin the main repo — the repo version is canonical.
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.
- 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 (i18ntag, top of the past year), X full-archive search, and Reddit via web search, because Reddit's JSON API returned 403.
| # | 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. |
- Next.js 16 + Turbopack "uncompiled message" errors in a compiler-based library: lingui/js-lingui#2354. Already covered by #8 (Turbopack + webpack).
- Type inference/type errors in generated message modules: opral/paraglide-js#566, aymericzip/intlayer#454. Already covered by the 10k-key type-check budget.
- Removing the default-locale prefix: opral/paraglide-js#512, QuiiBz/next-international#446. Already
routing.prefix: 'as-needed'(default). - RTL helper naming confusion: generaltranslation/gt#271. Already
getDir(locale). - Static generation with
[locale]: Stack Overflow 79356803, Stack Overflow 79838926. Covered bylocaleParamsand ADR 0002. - LLM translation producing valid-but-wrong output: dev.to: "The bug it introduced was correct Japanese". Covered by glossary, lockfile, and parity checks in
tongue translate.
| 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. |
- 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.
Guides
- Getting Started
- Configuration
- Routing and Proxy
- Server Components
- Client Components
- Server Actions
- ICU Messages
- Type Safety
- Cache Components and PPR
- Static Export
- Metadata SEO and hreflang
- Database and CMS Messages
- Dev Tools
- Translator Workflow
- Per-user Preferred Language
- CLI
- AI Translation
- Testing
- VS Code Extension
- Migration from next intl
- Migration from next international (deferred)
Reference