StringLane

Browse docsWhat Is the .xcstrings Format? Xcode String Catalogs Explained
Concept

What Is the .xcstrings Format? Xcode String Catalogs Explained

String Catalogs (.xcstrings) are Apple's modern localization format — one JSON file holding every locale plus per-string translation state. Here is how the format works and how to edit it.

.xcstrings is the file extension for String Catalogs, the localization format Apple introduced at WWDC 2023 to replace the older .strings and .stringsdict files. A String Catalog is a single JSON file that holds every locale for a target, plus a translation state for each string — so Xcode can show you, per language, what is new, what needs review, and what is done.

What it replaces

The classic Apple approach split localization across formats:

  • Localizable.strings — one file per locale, simple "key" = "value"; pairs.
  • Localizable.stringsdict — a separate XML plist just for plurals.

String Catalogs fold all of that into one .xcstrings file per string table, with plural and device variations expressed inline. Xcode extracts strings into it automatically at build time.

What a String Catalog contains

The file is JSON keyed by source string. Each entry stores its localizations and, critically, a state for every language:

  • new — extracted but not yet translated.
  • needs_review — translation exists but is flagged for a second look.
  • translated — done.

It also tracks strings marked shouldTranslate: false — system-managed text that should be left alone — and a extractionState that records whether a string is still present in code.

Why the state model matters

The per-string state is the feature, and it is also the thing hand-editing the JSON gets wrong. Edit a value in a text editor and the surrounding state does not update — so Xcode's "what still needs translating" view drifts out of sync with reality. Multiply that across a few hundred strings and several locales and the catalog becomes untrustworthy.

How StringLane works with .xcstrings

StringLane reads and writes .xcstrings natively — it auto-detects the format by extension, loads every locale from the single file, and shows them side-by-side like any other project. Translation state appears inline as a badge next to each value (grey for new, amber for needs-review). When you edit and save, StringLane updates the state automatically — a non-empty value becomes translated, an empty one reverts to new — and leaves shouldTranslate: false strings untouched. Adding a locale merges into the existing file rather than creating a new one, so the catalog stays canonical.

Next steps