Translate your Flutter app's .arb files without losing a single ICU rule
Upload lib/l10n/app_en.arb, pick locales, and get back app_de.arb, app_ja.arb… — @@locale, @key metadata and {count, plural, ...} all intact.
Upload app_en.arb
Or run kaeris init --preset flutter-arb to point the CLI at lib/l10n/ directly.
Pick locales
46 languages, mapped straight to Flutter's supportedLocales.
Ship
Drop the output back into lib/l10n/ and run flutter gen-l10n.
Before → after
{ "@@locale": "en", "welcome": "Welcome back, {name}!", "cartItemCount": "{count, plural, one{You have {count} item in your cart} other{You have {count} items in your cart}}", "@cartItemCount": { "description": "Shown on the cart screen", "placeholders": { "count": { "type": "int" } } } }
{ "@@locale": "de", "welcome": "Willkommen zurück, {name}!", "cartItemCount": "{count, plural, one{Du hast {count} Artikel im Warenkorb} other{Du hast {count} Artikel im Warenkorb}}", "@cartItemCount": { "description": "Shown on the cart screen", "placeholders": { "count": { "type": "int" } } } }
The @cartItemCount metadata block — description and placeholder type — is copied through untouched. Only translatable string content moves.
ARB-native
Reads and writes real .arb — @@locale and every @key metadata block (description, placeholder types) survives untouched.
ICU plural/select preserved
{count, plural, ...} and {gender, select, ...} blocks are translated branch-by-branch, not string-mangled.
gen-l10n ready
Output drops straight into lib/l10n/ — no post-processing before flutter gen-l10n.
One CLI command
kaeris init --preset flutter-arb scaffolds locale detection from your existing ARB folder.
{count} / {name} is never dropped or mistranslated..arb out, metadata and ICU intact, not a flattened wrapper.Ship Flutter in every market
46 languages, ARB-native, ICU-safe. Free to start, no account required.
$ pip install kaeris $ kaeris init --preset flutter-arb