wellworn
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)
severityversionssymptom 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