ARB ⇄ Xcode String Catalog Converter

Turn Flutter .arb files into one Localizable.xcstrings, or a String Catalog back into one ARB file per language. Placeholders, plurals and descriptions are mapped. Runs in your browser, nothing is uploaded.

Direction:

Drop your .arb files here (app_en.arb, app_de.arb, …) or

Keep both apps in sync without converting by hand

A FlutterLocalisation project can ship Flutter, native iOS or both. One set of keys, AI translation for new strings, review per language, and both the ARB files and the String Catalog committed to Git.

Start free →

How the mapping works

{name}A String placeholder becomes %@. With more than one placeholder they are numbered in order of first appearance: %1$@, %2$lld.
intBecomes %lld. Going back, %lld, %ld and %d become an int placeholder.
double, numBecome %lf; %f and %lf come back as double.
pluralICU arms =0, =1, one, few, many, other become plural variations. # is expanded to the count placeholder.
@descriptionBecomes the String Catalog comment, and the comment comes back as the description.
selectRefused. String Catalogs have no select; the key is listed and skipped.
substitutions, deviceRefused when converting to ARB. Listed per key.

Frequently asked questions

How do I convert ARB files to an Xcode String Catalog?

Drop your app_en.arb, app_de.arb and so on into the converter. It merges them into one Localizable.xcstrings: named placeholders become %@, %lld or %lf (numbered when a string has several), ICU plurals become plural variations, and the @description becomes the Xcode comment. Download the file and add it to your Xcode target.

How do I convert a .xcstrings file to ARB files for Flutter?

Drop the Localizable.xcstrings. You get one ARB file per language with the source language first. Printf arguments turn into named placeholders (arg1, arg2) typed as String, int or double, and plural variations turn back into ICU plural strings.

What cannot be converted?

ICU select (gender switches) has no String Catalog equivalent. Going the other way, String Catalog substitutions and device variations have no ARB equivalent. Keys that are not valid Dart identifiers cannot be used by gen-l10n. The converter lists each case by key instead of guessing.

Why does the catalog look exactly like one Xcode wrote?

The output uses Xcode's own serialisation: sorted keys, " : " separators and two-space indentation. When you open and build it, Xcode does not rewrite the file, so your Git diff stays clean.

Is anything uploaded?

No. The conversion runs in your browser. Nothing leaves your machine.

Can I keep a Flutter app and a Swift app in sync from one set of keys?

Yes. FlutterLocalisation does exactly this: one project with both platforms exports ARB files for Flutter and a String Catalog for Xcode, translates new keys with AI and commits both to Git. This converter is the one-off version of that.

Related tools and guides