New · native iOS support

Localize your Swift app with AI,
straight from the String Catalog.

Import Localizable.xcstrings, translate every language in one click, review with your team, and get the catalog back in Xcode's own format. No Flutter required.

Free plan · no credit card · Xcode 15 or later

Import the catalog Xcode made

Drop your Localizable.xcstrings into a new iOS project. Keys, comments, every language and every review state come in as they are. Info.plist permission texts land in InfoPlist.xcstrings.

Translate all languages at once

AI that knows app copy: button labels, permission prompts, error states. Placeholders such as %@ and %lld and plural forms stay intact.

Export in Xcode's own format

Sorted keys, the same spacing, the same empty-object layout. Xcode opens the file and never rewrites it, so your Git history stays clean.

Pull from the CLI or Git

One command writes the catalog into your Xcode resources folder, or let the Git sync commit it to GitHub, GitLab or Bitbucket. Works in CI.

Review states, kept

Translated, needs review, new, stale: the states Xcode stores are the states the dashboard shows. A reviewer can approve per language before you ship.

Flutter, iOS or both

One project can feed a Flutter app and its native companion from the same keys: ARB files for Dart, a String Catalog for Swift, one source of truth.

How it works

Three commands from Xcode to every language

  1. Create an iOS project in the dashboard and import your catalog, or seed it from the terminal.
  2. Translate and review in the browser. Invite a translator per language if you want a human pass.
  3. Pull the catalog into your resources folder, or let the Git sync commit it. Build as usual.

The CLI also ships an MCP server, so an AI agent in your editor can add a key, translate it and open the pull request.

zsh · your-ios-app
$ dart pub global activate flutter_localisation_cli
$ fl login --token flk_live_…
$ fl import Gush/Resources/Localizable.xcstrings
✓ 75 keys · 23 languages imported
$ fl pull
✓ Gush/Resources/Localizable.xcstrings
✓ Gush/Resources/InfoPlist.xcstrings

flutterlocalisation.json in the repo root holds the project name and xcstrings_dir, the folder Xcode reads the catalogs from.

What maps to what

Honest about the format

In the dashboardIn the String Catalog
Text placeholder {name}%@, numbered %1$@ when there are several
Integer placeholder%lld
Decimal placeholder%lf
Plural (one, few, many, other)Plural variations per CLDR category
Info.plist keys (NS…UsageDescription, CFBundleDisplayName)InfoPlist.xcstrings
ICU select, substitutions, device variationsRefused with a clear message, never guessed
FAQ

Questions from iOS developers

Does FlutterLocalisation work for a native Swift app, without Flutter?

Yes. Since October 2026 a project can ship a Flutter app, a native iOS app, or both. Pick iOS when you create the project and the platform speaks String Catalogs end to end: import, AI translation, review, export, CLI and Git sync. No ARB files, no Dart.

Which file formats are supported for iOS?

Xcode String Catalogs (.xcstrings), the format Xcode 15 introduced to replace .strings and .stringsdict. The platform writes Localizable.xcstrings, plus InfoPlist.xcstrings when the project holds Info.plist keys such as NSCameraUsageDescription. Older .strings files are not read; Xcode migrates them to a catalog in one click (Edit, Convert, To String Catalog).

Will a build or a commit rewrite my catalog?

No. The export matches Xcode's own serialisation (sorted keys, the same spacing, the same empty-object layout), and the CLI writes the bytes exactly as served. Xcode opens the file, compiles it and leaves it untouched, so your Git history stays clean.

How are placeholders and plurals handled?

Positional Swift placeholders are kept: %@ for text, %lld for integers, %lf for doubles, numbered (%1$@, %2$lld) when a string has more than one. Plurals become String Catalog plural variations per CLDR category (one, few, many, other), so String(localized:) picks the right form at runtime.

What is not supported?

ICU select (gender switches), String Catalog substitutions (several plural arguments in one string) and device variations. The import and the export refuse those with a clear message instead of guessing, so nothing silently breaks.

Can I share one project between a Flutter app and its native iOS companion?

Yes. A project with both platforms keeps one set of keys and translations, exports them as ARB files for Flutter and as a String Catalog for Xcode, and pushes both to Git. Keys must be valid identifiers for that, since Dart needs them.

Do live over-the-air updates work on iOS too?

Over-the-air updates come with the flutter_localisation Flutter package. A native Swift app gets its strings from the compiled catalog, so a copy change ships with the next build. AI translation, review, Git sync, the CLI and the MCP server all work the same for both.

Ship your iOS app in every language.

Start with the free plan, import one catalog, and see every language filled in before lunch.