next-intl
next-intl · App Router · ICU · 46 languages · Free

Translate next-intl's messages/en.json — ICU intact, App Router ready

Upload messages/en.json, pick locales, and get back messages/de.json, messages/ja.json… — nested namespaces and ICU plural/select blocks translated branch-by-branch, not mangled.

Translate your messages file → $ pip install kaeris
Nested-namespace safe ICU MessageFormat aware Real CLDR plural categories per locale App Router ready No account needed
Localize your Next.js app in 3 steps
1

Upload messages/en.json

Or run kaeris init --preset next-intl to scan your messages/ folder automatically.

2

Pick locales

Matched 1:1 to your [locale] route segments — no renaming needed.

3

Ship

Drop the output into messages/, wire up next-intl's routing — done.

ICU translated per-branch, per-locale plural rules

Before → after

messages/en.json
{
  "HomePage": {
    "title": "Welcome, {name}!",
    "cartItems": "{count, plural, =0 {Your cart is empty} one {# item in your cart} other {# items in your cart}}"
  }
}
messages/ja.json
{
  "HomePage": {
    "title": "ようこそ、{name}さん!",
    "cartItems": "{count, plural, other {カートに#点の商品があります}}"
  }
}

Japanese only has a CLDR other plural category — KAERIS collapses the English =0/one/other branches down correctly instead of copy-pasting all three.

Built for next-intl

Nested-namespace safe

Dotted structures like HomePage.title keep their exact nesting — nothing gets flattened or re-keyed.

ICU-aware

plural, select and selectordinal blocks are parsed and translated branch-by-branch, collapsed to each locale's real CLDR plural categories.

App Router ready

Output drops straight into your [locale] messages — no reshaping for getRequestConfig.

One CLI command

kaeris init --preset next-intl scaffolds locale detection from your existing messages/ folder.

Why KAERIS
Placeholder-safe{name} / {count} is never dropped or mistranslated.
Format-native — real ICU MessageFormat out, not a flattened wrapper you have to reshape.
Verify-meaning QA — every string is back-translated to catch meaning drift before you ship.
No account needed — drag & drop free up to 10,000 characters, or use the CLI/API.

Ship next-intl in every market

46 languages, ICU-safe, App Router ready. Free to start, no account required.

$ pip install kaeris
$ kaeris init --preset next-intl
Translate your messages files now →