---
title: "How to translate Flutter ARB files with AI"
description: "Add a language to your Flutter app. Translate app_en.arb with AI, keep the @ metadata and ICU plurals, then run flutter gen-l10n. Options and steps."
date: 2026-10-04
language: en
canonical: https://ai-glot.com/blog/how-to-translate-flutter-arb-files-with-ai
source: AI Glot blog
---
**To add a language to a Flutter app, you translate one file: your template ARB.** Everything else, the Dart classes included, is generated from it.

This guide is for that one file, `app_en.arb`, and for the three things that go wrong in it: the `@` metadata, the placeholders and the plurals. For the other app formats, see [how to translate your app's language files](/blog/how-to-translate-app-language-files-with-ai).

## What an ARB file is

An ARB file is JSON with a convention on top of it. [Flutter's localization tool](https://docs.flutter.dev/ui/internationalization) reads ARB files from `lib/l10n` by default, uses `app_en.arb` as the template, and generates the Dart classes when you run `flutter gen-l10n`. One file holds one language.

Entries come in pairs: a key with its text, and an `@` entry that describes it. Only the text is for translating.

## Which option should you use?

| | Good for | Where it stops |
|---|---|---|
| **AI Glot** | A new locale or five, a glossary that must hold, every release | Not needed for ten strings |
| **A translation management platform** (Crowdin, Lokalise, Phrase, Localizely) | A team with reviewers and a repository connection | You set up a project and connect your repository first |
| **DeepL** | XLIFF files, which [are on its list](https://developers.deepl.com/docs/best-practices/document-translations) | ARB is not on that list, so you convert first |
| **ChatGPT, Claude or another assistant** | A handful of strings | You write the prompt and carry your glossary into every chat. Each run risks a changed key, a broken `{placeholder}` or a mangled ICU plural, so you diff every file |
| **A freelancer or an agency** | Your App Store and Play Store text | Slow, priced per word, and you still prepare the file |

**Pay a person for the store listing and the first screen.** Run the long tail of labels and messages through an engine.

## Why AI Glot fits an ARB file

- **Keys and `@` metadata are structure.** They can be left exactly as they are.
- **Placeholders and ICU syntax are kept.** `{name}` and `{count, plural, ...}` stay in the message while the words inside each branch are translated.
- **Several languages in one job**, instead of the same strings five times.
- **One glossary across every locale**, and the files you add later.
- **A plan before any spend**, with a sample you can check.

## The path of one file

*Illustration: The five steps of an ARB job. Everything before approval is free, so a plan that misread the file costs nothing to correct.*

## What a translated entry looks like

*Illustration: An ARB entry before and after. Keys, @ metadata and placeholders stay as written, and the words inside the plural branches are translated.*

## What to check after

**Plurals in languages with more forms.** English needs two branches. Russian and Arabic need more, and the translated message may need branches the English source does not have. Read those messages once.

**`@@locale`.** If you did not ask for it to be updated, it comes back as it was, so set it to the target locale before you ship.

**Length.** Look at the screens with the longest strings for text that overflows a button or a card.

## How to do it, step by step

**1. Try a file for free.** The [ARB translator](/file-formats/arb-translation) needs no account and takes files up to 2 MB and 5,000 words.

**2. Upload `app_en.arb`** in [the app](https://app.ai-glot.com/signup), or send it from the command line, below.

**3. Say what you need in one sentence.**

```
Translate this file into French, German and Spanish.
Leave the @ metadata entries alone. Set @@locale to the target language.
```

*Illustration: You describe the job in plain English. AI Glot turns it into a plan you can read and correct before anything runs.*

The sentence decides what is translated across the whole file. A rule about wording, such as "keep every `{placeholder}` and ICU plural syntax exactly as written" or "use the informal register", goes into the second box at approval, because it is applied to each message as it is written.

**4. Add a glossary** for the app name, feature names and the words your app always says one way. [How to build one](/blog/build-translation-glossary-brand).

*Illustration: A glossary settles the terms that must not drift, and applies the same decision to every file.*

**5. Read the plan and choose a quality level.**

*Illustration: Two quality tiers, chosen per file. Lite covers about three times more words for the same credits.*

**Lite** gives about three times more words per credit and is faster: right for a first pass on a new locale. **Standard** is for the strings a user reads first. One credit is one word in Standard.

**6. Approve and download.**

*Illustration: One file comes back, in the format it arrived in.*

**7. Put the files in `lib/l10n`** next to `app_en.arb`, then run:

```bash
flutter gen-l10n
```

## One file, several locales

*Illustration: One template ARB file becomes one translated file per locale, all with the same keys and the same glossary.*

The file names and counts are an example. An ARB file holds one language, so each locale is its own file.

## Three ways to run it

*Illustration: Three ways to translate your ARB file. They all give you the same translated files.*

**From the command line** is the one Flutter developers keep, because it runs again at every release:

```bash
id=$(aiglot batches create lib/l10n/app_en.arb \
      --instruction "Translate into French. Leave the @ metadata entries alone. Set @@locale to the target language." \
      --json | jq -r '.data.id')
aiglot batches get "$id" --json | jq '.data.plan'
aiglot batches approve "$id" --quality lite \
  --instructions "Keep every {placeholder} and ICU plural syntax exactly as written."
aiglot batches download "$id" --output lib/l10n/app_fr.arb
```

**With your AI agent:** connect AI Glot as an [MCP server](https://ai-glot.com/docs/mcp/overview). The agent can read your project, propose glossary terms, run the job, save the files in `lib/l10n` and run `flutter gen-l10n` for you.

**In the app:** upload, click, download. Good for a one-off.

For an API integration, see the [API documentation](https://ai-glot.com/docs/api/overview).

[Pricing](/pricing) lists what a larger volume costs, and a [free account](https://app.ai-glot.com/signup) comes with credits to run a real file.

---

*The limits quoted here are the ones in force when this was written: 8 MB per ARB file, and 2 MB and 5,000 words in the free tool. The Flutter defaults come from Flutter's own documentation and can change. DeepL's list comes from its own documentation. File names and string counts in the diagrams are examples. Your plan shows the real figures for your own file, and it is free to read.*