Translate $localize strings without losing a single ICU rule
Angular's own extractor speaks XLIFF by default — point ng extract-i18n at JSON instead, and KAERIS translates the result into 46 languages, keeping {count, plural, ...}/{gender, select, ...} blocks intact for ng build --localize.
Extract as JSON
ng extract-i18n --format json --out-file src/locale/messages.json — skips the XLIFF round-trip entirely.
Translate
Upload the file, or run kaeris translate src/locale/messages.json --langs de,fr,ja --icu.
Ship
Save each output as messages.de.json, wire it into angular.json's i18n.locales, and ng build --localize.
Before → after
<p i18n="@@welcome">Welcome back, {{ name }}!</p> <p i18n="@@cartCount"> {count, plural, =0 {Your cart is empty} one {# item in your cart} other {# items in your cart}} </p>
{ "welcome": "Willkommen zurück, {{ name }}!", "cartCount": "{count, plural, =0 {Dein Warenkorb ist leer} one {# Artikel im Warenkorb} other {# Artikel im Warenkorb}}" }
KAERIS translates a flat JSON id→string map, exactly what --format json extraction produces — ICU plural/select blocks are translated branch-by-branch, collapsed to each locale's own CLDR categories, same treatment as next-intl and Flutter's ARB. Angular wraps the real file in a { "locale", "translations" } envelope with hashed message ids unless you set @@ids — keep your own ids, translate the inner map, then drop it back into that envelope per locale.
ICU-aware
plural, select and selectordinal blocks are parsed and translated branch-by-branch, not string-mangled.
JSON-native, no XLIFF conversion
Angular's default extractor output is XLIFF — export --format json instead and KAERIS reads it directly, one of its 7 native formats.
Custom @@id friendly
Set i18n="@@welcome" in your templates for readable keys instead of Angular's default content-hash ids.
One CLI command
kaeris translate src/locale/messages.json --langs de,fr,ja --icu — run it right after ng extract-i18n in CI.
Ship Angular in every market
46 languages, ICU-safe, JSON-native. Free to start, no account required.
$ pip install kaeris $ kaeris translate src/locale/messages.json --langs de,fr,ja --icu