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.
Upload messages/en.json
Or run kaeris init --preset next-intl to scan your messages/ folder automatically.
Pick locales
Matched 1:1 to your [locale] route segments — no renaming needed.
Ship
Drop the output into messages/, wire up next-intl's routing — done.
Before → after
{ "HomePage": { "title": "Welcome, {name}!", "cartItems": "{count, plural, =0 {Your cart is empty} one {# item in your cart} other {# items in your cart}}" } }
{ "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.
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.
{name} / {count} is never dropped or mistranslated.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