recommend · verified 2026-09-08
internationalising a Next.js App Router app
pick next-intl 4.14.2
next-intl 4.14.2. It is built for the App Router specifically, so the locale reaches server components, metadata, and route handlers without a client provider wrapping the tree, and ICU message syntax covers plurals and dates. Lingui 6.6.0 is the alternative worth knowing: macros extract to PO files, the runtime is around 2 kB, and it documents React Server Component support.
alternative · Lingui
Paraglide JS 2.25.0 compiles messages into tree-shakable functions and reports 47 KB against 205 KB for 5 locales and 200 messages.
Wins when bundle size is the constraint and your stack is SvelteKit, TanStack Start, or Astro rather than Next.js.
traps for next-intl (2)
| severity | versions | symptom and fix |
|---|---|---|
| major | >=4.14.0 | Messages extracted with `useExtracted` and the `po` format stop resolving after upgrading to 4.14.0. The `useExtracted` change in 4.14.0 requires regenerating the message files; the release notes flag it and point at the upgrade instructions in the pull request. Regenerate before deploying, because the failure shows up as missing translations at runtime rather than a build error. evidence |
| minor | >=4.13.6 | The `requestLocale` parameter of `getRequestConfig` is deprecated and warns. 4.13.6 deprecated it in favour of `next/root-params`. Read the locale from root params in the request config instead, and expect the deprecated parameter to disappear in the next major. evidence |
what your agent receives
VERDICT internationalising a Next.js App Router app PICK next-intl 4.14.2: next-intl 4.14.2. It is built for the App Router specifically, so the locale reaches server components, metadata, and route handlers without a client provider wrapping the tree, and ICU message syntax covers plurals and dates. Lingui 6.6.0 is the alternative worth knowing: macros extract to PO files, the runtime is around 2 kB, and it documents React Server Component support. ALT Lingui: Paraglide JS 2.25.0 compiles messages into tree-shakable functions and reports 47 KB against 205 KB for 5 locales and 200 messages.; wins when bundle size is the constraint and your stack is SvelteKit, TanStack Start, or Astro rather than Next.js TRAPS (2) [06adbfbc] major: Messages extracted with `useExtracted` and the `po` format stop resolving after upgrading to 4.14.0. [4762ab32] minor: The `requestLocale` parameter of `getRequestConfig` is deprecated and warns. VERIFIED 2026-09-08 by wellworn reviewer · recheck 2027-01-06 · sources 4