Localize Your App

How to Translate Flutter .arb Files into Every Language Your Users Speak

Translating a Flutter app means multiplying .arb files: you write app_en.arb, and every language needs its own app_es.arb, app_de.arb, app_ja.arb with identical keys and valid ICU syntax. As one Flutter developer put it: you're four tabs deep editing N parallel files when you should be editing one grid. Here's how to translate .arb files into every language without living in that grid of tabs.

The .arb format in 30 seconds

ARB (Application Resource Bundle) is JSON with metadata. Keys map to strings; @key entries describe placeholders; ICU MessageFormat handles plurals and selects:

{
  "itemCount": "{count, plural, =0{No items} one{1 item} other{{count} items}}",
  "@itemCount": {
    "placeholders": { "count": { "type": "int" } }
  },
  "greeting": "Hello {username}!"
}

The sharp edge is ICU syntax: a single typo in a {count, plural, ...} block fails your entire flutter gen-l10n build. Most editors don't validate it, so the error surfaces at codegen time, in a different file than the one you edited.

Why the usual workflow drags

Add one key to app_en.arb and you owe that key to every other file. Flutter tooling reports untranslated messages (untranslated-messages-file) but won't translate them. Community CLI tools pipe files through Google Translate or DeepL APIs — you get API keys to manage, no glossary, no review step, and ICU blocks translated as if they were prose. Keys drift, missing translations fall back to English silently, and nobody notices until a user screenshots it.

Translate app_en.arb into every language at once

  1. Upload app_en.arb. Localize Your App parses ICU plural and select blocks structurally — only the translatable text inside variants is sent to translation, and {placeholders} are locked.
  2. Pick your languages. Any of 39 locales. Plural categories are emitted per target-language CLDR rules, and every output is validated as parseable ICU before you can download it — the class of typo that breaks gen-l10n can't get through.
  3. Review, download, drop into lib/l10n. One app_xx.arb per language, same keys, same metadata. Run flutter gen-l10n and ship.

Releases stay cheap: re-upload the grown app_en.arb and translation memory fills every string it has seen before at no cost, so you pay only for the new keys — pricing details in the cost guide.

Which languages should a Flutter app ship?

Flutter's own ecosystem skews global, and the highest-value additions are usually the high-ARPU, low-English markets — Japanese, German, Korean. The language priority guide has the full ranking, and the AI translation quality guide covers when machine output is safe to ship as-is.

Ship your app in 39 languages by tonight

Upload your localization file, review side by side, download ready-to-import files for every language. One-time credits from $9 — no subscription.

No subscription. Credits never expire.

Related guides