Translate Xcode
String Catalogs

Localizable.xcstrings is Apple's modern format for translations in Xcode, introduced at WWDC 2022. Upload it to SimpleLocalize, translate every language in one place, and export it back.

No credit card required14-day free trialTracking-free service
Localizable.xcstrings
{ "version": "1.0", "sourceLanguage": "en", "strings": { "hello_world": { "comment": "Main greeting message for users", "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", "value": "Hello World" } }, "es": { "stringUnit": { "state": "translated", "value": "Hola Mundo" } }, "fr": { "stringUnit": { "state": "translated", "value": "Bonjour le monde" } } } } } }
{
  "version": "1.0",
  "sourceLanguage": "en",
  "strings": {
    "hello_world": {
      "comment": "Main greeting message for users",
      "extractionState": "manual",
      "localizations": {
        "en": { "stringUnit": { "state": "translated", "value": "Hello World" } },
        "es": { "stringUnit": { "state": "translated", "value": "Hola Mundo" } },
        "fr": { "stringUnit": { "state": "translated", "value": "Bonjour le monde" } }
      }
    }
  }
}

Why teams use String Catalogs
for translations

Localizable.xcstrings is the successor to Localizable.strings and Localizable.stringsdict. Instead of one file per language spread across .lproj folders, every language for a key sits together in one JSON-based file, which makes it easier to see what changed in a diff.

Each key also carries a comment, an extraction state, and a per-language translation state, so a String Catalog already tracks more about a translation's progress than a plain key-value file ever could.

Device variant example
"search_label": { "localizations": { "de": { "variations": { "device": { "mac": { "stringUnit": { "value": "Suche" } }, "other": { "stringUnit": { "value": "Finde" } } } } } } }
"search_label": {
  "localizations": {
    "de": {
      "variations": {
        "device": {
          "mac": { "stringUnit": { "value": "Suche" } },
          "other": { "stringUnit": { "value": "Finde" } }
        }
      }
    }
  }
}

Beyond a plain string table

What SimpleLocalize keeps from your String Catalog

One file, every language

All localizations for a key live in one file, instead of a separate .strings file per language.

Device variants as ICU

mac, iphone, ipad, watch and tv variants convert to ICU select syntax on export.

Plurals as ICU

zero, one, two, few, many and other variants convert to ICU plural syntax, edited as one key.

Comments and states

The comment field becomes translator context, and extractionState (manual, extracted_with_value, migrated) is preserved.

End-to-end workflow

Translate a String Catalog end to end

Upload your Localizable.xcstrings file, run auto-translation across every language, and download it back into your Xcode project with every translation state intact.

Creating String Catalog in Xcode
File → New → File → Resource → String Catalog Name: Localizable Target: [Your App Target]
File → New → File → Resource → String Catalog
Name: Localizable
Target: [Your App Target]

Create the String Catalog in Xcode

1
In Xcode, go to File → New → File and choose "String Catalog" under the Resource section. Name it Localizable to follow Apple's convention, and Xcode adds it to your project.
Terminal
simplelocalize upload \ --apiKey PROJECT_API_KEY \ --uploadFormat localizable-xcstrings \ --uploadPath ./Localizable.xcstrings
simplelocalize upload \
  --apiKey PROJECT_API_KEY \
  --uploadFormat localizable-xcstrings \
  --uploadPath ./Localizable.xcstrings

Upload it to SimpleLocalize

2
Push Localizable.xcstrings to SimpleLocalize. Comments and extraction state come along automatically, and each key's NSLocalizedString call in your Swift code is what populated the file in the first place.
ICU conversion (in the editor)
{COUNT, plural, one {%lld item} other {%lld items}} {DEVICE, select, mac {Suche} other {Finde}}
{COUNT, plural, one {%lld item} other {%lld items}}
{DEVICE, select, mac {Suche} other {Finde}}

Auto-translate, plurals and variants included

3
Run DeepL, Google Translate, OpenAI, Claude or Gemini across every language. Plural and device variants are edited as a single ICU-format key, not several disconnected strings.
Terminal
simplelocalize download \ --apiKey PROJECT_API_KEY \ --downloadFormat localizable-xcstrings \ --downloadPath ./Localizable.xcstrings
simplelocalize download \
  --apiKey PROJECT_API_KEY \
  --downloadFormat localizable-xcstrings \
  --downloadPath ./Localizable.xcstrings

Download back into your project

4
Export drops Localizable.xcstrings back with every language, variant and translation state intact, ready for Xcode's String Catalog editor to pick up.

Migrating from Localizable.strings

Xcode can convert existing .strings files automatically: select them in the Project Navigator, choose "Migrate to String Catalog," and Xcode creates a new .xcstrings file with your translation keys, comments and language localizations carried over.

.stringsdict plural definitions are converted into the String Catalog's plural variations during the same migration, so nothing needs to be re-entered by hand.

Multiple files with namespaces
Localizable-Auth.xcstrings Localizable-Settings.xcstrings Localizable-Main.xcstrings simplelocalize upload \ --uploadFormat localizable-xcstrings \ --uploadPath ./Localizable-{ns}.xcstrings
Localizable-Auth.xcstrings
Localizable-Settings.xcstrings
Localizable-Main.xcstrings

simplelocalize upload \
  --uploadFormat localizable-xcstrings \
  --uploadPath ./Localizable-{ns}.xcstrings

For developers

A localization platform,
not just a String Catalog viewer

A .xcstrings file packs device variants, plurals and translation state into one file. SimpleLocalize edits all of it as regular translation keys.

Device variants as ICU

Per-device translations are converted to ICU select syntax on export, so they survive a round trip to other file formats too.

Plurals as ICU

Pluralized strings are converted to ICU plural syntax the same way, editable as one key instead of several loose variants.

Cross-platform placeholders

Convert native specifiers into a platform-independent format, so the same string exports correctly to Android Strings too.

Namespaces for multi-file projects

Split translations across several .xcstrings files with a {ns} placeholder in the upload and download path, and manage each one separately.

SimpleLocalize connects your code to professional translations

Every Apple platform

Where Localizable.xcstrings is used

Supported by Xcode 15+ across every Apple platform and framework.

iOS

iOS

macOS

macOS

Swift

Swift

SwiftUI

SwiftUI

Xcode

Xcode

watchOS

watchOS

tvOS

tvOS

visionOS

visionOS

Start translating String Catalogs

  • Device variants and plurals converted to ICU, edited as one key
  • One file per project, not one file per language
  • Auto-translation with DeepL, Google, OpenAI, Claude and Gemini
Start for free
No credit card required5-minute setup
"The product
and support
are fantastic."
Laars Buur|CTO
"The support is
blazing fast,
thank you Jakub!"
Stefan|Developer
"Interface that
makes any dev
feel at home!"
Dario De Cianni|CTO
"Excellent app,
saves my time
and money"
Dmitry Melnik|Developer

Frequently asked questions about String Catalogs

Are device variants preserved on export?

Yes. They are converted to ICU select syntax (for example {DEVICE, select, mac {...} other {...}}), so the device-specific meaning survives even when exporting to a different file format.

What about substitutions?

Substitutions (nested plural placeholders inside a string) are read on import, but editing them directly in the translation editor is not yet supported.

Can I use Universal Placeholders with Android too?

Yes. Enabling UNIVERSAL_PLACEHOLDERS on both Android Strings and .xcstrings lets the same source string export correctly to either platform's native placeholder syntax.

What source language does an exported file use?

SimpleLocalize uses your project's default language key for the sourceLanguage field. If no default language is set, it falls back to en.

Does migrating from Localizable.strings lose anything?

No. Xcode's built-in migration carries over translation keys, values, comments and language localizations, and converts existing .stringsdict plural definitions into the String Catalog's own plural variations.