StringLane

Browse docsWhat Is an ARB File? The Flutter Localization Format Explained
Concept

What Is an ARB File? The Flutter Localization Format Explained

ARB (Application Resource Bundle) is the JSON-based translation format Flutter uses for app localization. Here is how the format works — keys, placeholders, and @ metadata — and how to edit it.

ARB stands for Application Resource Bundle. It is a JSON-based file format for storing localized strings, and it is the format Flutter's flutter_localizations and gen-l10n toolchain reads when you translate an app. One ARB file holds all the strings for a single locale — app_en.arb for English, app_es.arb for Spanish, and so on.

What an ARB file looks like

An ARB file is plain JSON. Each translation is a key/value pair, and Flutter generates a typed Dart getter for every key:

{
  "@@locale": "en",
  "helloWorld": "Hello, World!",
  "greeting": "Hello, {name}!",
  "@greeting": {
    "description": "Greeting shown on the home screen",
    "placeholders": {
      "name": { "type": "String" }
    }
  }
}

Three things are happening here:

  • @@locale — a reserved key that declares which language this file holds.
  • Translation keyshelloWorld and greeting are the strings your app renders.
  • @ metadata@greeting is an annotation object describing the greeting key. It carries a description (context for translators and AI) and placeholders (the typed variables in the string).

Placeholders and ICU

ARB values can contain placeholders like {name} and full ICU MessageFormat plurals and select forms:

"itemCount": "{count, plural, one {# item} other {# items}}"

The placeholders block in the @ annotation tells Flutter the type of each variable so it generates a correctly-typed Dart method. If a placeholder appears in your English source but goes missing in a translation, the generated code breaks at runtime — which is exactly the kind of error a side-by-side editor catches before it ships.

Why ARB is awkward to edit by hand

The format is simple, but managing it across many locales is not. Each language is a separate file, so confirming that every locale has every key means opening five, ten, or twenty JSON files and reading them in parallel. A missing key, a stray comma, or a placeholder typo is easy to introduce and hard to spot.

How StringLane works with ARB

StringLane is a desktop editor built for exactly this. It opens your lib/l10n/ folder, loads every app_*.arb file, and shows all locales side-by-side for each key — so gaps and mismatches are visible at a glance instead of buried in JSON. It reads and preserves your @ metadata, validates ICU and placeholders in real time, and writes changes straight back to the source files. Nothing is imported or exported.

Next steps