Skip to content

Compare · next-intl

For Next.js teams deciding whether tightly integrated locale routing outweighs keeping their message and catalog model portable across future hosts.

One framework deep, or six frameworks wide.

next-intl is built into Next.js as far as a library can be — localized pathnames, domain routing and RSC integration are the product, not add-ons. That depth is genuinely valuable and it is also the shape of the lock-in. Palamedes draws the boundary differently: your framework keeps routing, while Palamedes carries the same authoring, catalog, validation, and runtime model across supported hosts.

Licence
MIT
Scope
Next.js (use-intl for plain React)
Message identity
Explicit keys
Routing
Core feature

next-intl figures: next-intl 4.13.1, researched July 2026. Projects move; re-check before you decide.

01 — Decide

Choose the model that leaves you with less recurring work.

For the audience above, we recommend Palamedes. The alternative is not a disclaimer: if the right column describes your constraint, choose next-intl and do not think twice about it.

Pick Palamedes when…

  • You run more than one meta-framework, or expect to within the lifetime of this codebase.
  • You want .po catalogs your translators can read without a converter.
  • You want message identity that does not depend on someone naming things well.
  • You want compile-time source-string extraction on a stable API rather than behind an unstable_ prefix.

Pick next-intl when…

  • You are all-in on Next.js and have no plan to change that.
  • You want localized pathnames or domain routing without writing the routing layer yourself.
  • You want the most Next-idiomatic API available, including its typed message keys.

02 — Daily work

What changes after the choice is made.

These are workflow consequences, not a feature inventory: fewer conventions to maintain, one catalog boundary to review, and one runtime model to carry through the supported hosts. Each point maps back to an inspectable artifact.

Routing stays with your framework

This is a genuine tradeoff and we will not spin it as a feature gap. next-intl gives you localized routing inside the library. Palamedes gives you headless locale controls — resolution, the deliberate-choice cookie, canonical URLs — and leaves URLs to your router. You wire a little more once. You also keep the wiring, and your router stays framework-native and unwrapped.

Inspect the verified framework and locale matrix

The model outlives the framework choice

Palamedes runs the same runtime and identity model across Next.js, TanStack Start, SolidStart, Waku, React Router and Remix v3. Its examples are smoke-checked on relevant PRs and main pushes across four locale strategies; browser-capable examples run the Playwright contract weekly or on manual dispatch. That is not a compatibility table — it is a test suite. Changing meta-framework changes your routing layer and nothing about your messages.

Inspect the verified framework and locale matrix

Source strings as the stable path, not the experiment

next-intl's stable path is key-based JSON. Its experimental extraction workflow does compile source strings, but writes a generated hash into the PO msgid, inverting the gettext convention translators rely on. Palamedes keeps the source string as the msgid, because a .po file a human can read without tooling is the entire reason the format won.

Inspect the verified framework and locale matrix

03 — next-intl

Where the competitor is the stronger fit.

The strengths and trade-offs below are sourced from the dated research for next-intl. They explain why the right decision can genuinely be next-intl, even when Palamedes is our recommendation for the audience above.

Competitor strength

What next-intl earned

  • Deep App Router and RSC integration, including request configuration and server-component translation APIs.
  • Locale routing as product: middleware, domain routing and localized pathnames work out of the box — real work you would otherwise write and maintain yourself.
  • A strong type-safety story, with TypeScript augmentation of message keys and optionally of ICU argument shapes.

Trade-off

What that depth costs you

  • It is one framework's library. Teams that later diversify off Next.js drop to the lower-level use-intl and rebuild the routing and RSC integration themselves — the part that supplied the framework depth.
  • Its routing, middleware and request-configuration APIs are intentionally coupled to Next.js. Reusing the message layer elsewhere does not carry those integrations with it.
  • The source-string extraction workflow is explicitly experimental, with reported non-deterministic PO ordering across rebuilds, no default-locale fallback for missing translations, and a generated hash in the msgid rather than the source text.

04 — Proof in code

Both are ICU underneath. The difference is what you have to name.

next-intl

// messages/en.json
// { "Checkout": { "buy": "Buy {seats} seats" } }
const t = useTranslations("Checkout")
t("buy", { seats })

Palamedes

import { t } from "@palamedes/core/macro"
function buyLabel(seats) {
return t`Buy ${seats} seats`
}

next-intl asks you to name a namespace and a key. Palamedes asks you to write the sentence. Both compile to ICU; only one of them adds a naming step to every string you ship.

05 — Side by side

The comparison, without the adjectives.

Where a row cites a measurement, it comes from the checked benchmark report in the repository. Where nothing was measured, the row says so.

Criterianext-intlPalamedes
Framework scopeNext.js, deeplyNext.js, TanStack Start, SolidStart, Waku, React Router, Remix v3
Locale routingBuilt in: middleware, domains, localized pathsHeadless controls; your router owns URLs
Message identityKeys in JSON (stable path)message + context
Source-string extractionExperimental, unstable_-prefixedThe only path, and the stable one
Catalog formatJSON; PO only in the experimental workflow, hash msgid.po with the source string as msgid
Extract + update speedNot measured. The checked harness covers Lingui, React Intl, fbtee, i18next-cli, and General Translation; anything else would be a guess.Checked report covers Lingui, React Intl, fbtee, i18next and General Translation
Host boundaryNext.js routing and request lifecycleShared runtime model; routing remains host-owned

06 — The trade-off

If Next.js is your only target and you want routing to come from your i18n library, next-intl is the better fit and this page will not pretend otherwise. Palamedes leaves routing to the framework, and our own Next.js support requires Next 16, where next-intl reaches further back. That is the cost of a current, verified support matrix, and we would rather charge it than carry compatibility code for versions we cannot verify.

07 — Evaluate

Separate routing from the message-model question

Try one small, non-routing feature on a branch and keep your existing route policy intact. The evaluation can establish whether source-string catalogs and the request-local runtime fit your code without claiming that Palamedes replaces next-intl's routing product.

08 — Questions

Questions teams ask before leaving next-intl.

The migration, framework, catalog, runtime and trade-off boundaries are stated here and included in the page's structured data.

01Can we evaluate Palamedes without replacing next-intl everywhere?

Try one small, non-routing feature on a branch and keep your existing route policy intact. The evaluation can establish whether source-string catalogs and the request-local runtime fit your code without claiming that Palamedes replaces next-intl's routing product.

02Does Palamedes make sense if we use only one framework?

Yes, if the source-string, catalog and runtime model is the fit. Framework breadth is proof that the supported adapters share one model, not a requirement that one application use several frameworks. Check the supported host and its documented boundary before adopting.

03Who owns the catalogs?

Palamedes keeps source-string-first PO catalogs in the repository. Extraction, catalog updates, audits, merging and compilation are local workflow steps; it does not provide a hosted TMS or machine translation service.

04What runtime code reaches the application?

Transformed code reaches the active Palamedes instance through getI18n(). The exact adapter and compiled artifact depend on the supported host; inspect the framework documentation and proof rather than treating this comparison as a bundle-size claim.

05What do we give up by choosing Palamedes over next-intl?

If Next.js is your only target and you want routing to come from your i18n library, next-intl is the better fit and this page will not pretend otherwise. Palamedes leaves routing to the framework, and our own Next.js support requires Next 16, where next-intl reaches further back. That is the cost of a current, verified support matrix, and we would rather charge it than carry compatibility code for versions we cannot verify.

Make the next step match the decision you still need to make.