How to Translate an Xcode String Catalog (.xcstrings) — and Migrate from .strings
Xcode String Catalogs (.xcstrings) replaced the old .strings + .stringsdict pair as Apple's localization format: one JSON file holding every language, every plural variant, and per-string state. That single-file design is great for Xcode — and awkward for translation, because most tools still don't speak it properly. Here's how to translate an .xcstrings catalog into every App Store language, and how to use one to escape legacy .strings files entirely.
How a String Catalog is structured
An .xcstrings file is JSON with a strings dictionary. Each key holds localizations per language, and each localization is either a plain string or a set of plural variants:
"%lld items" : {
"localizations" : {
"de" : {
"variations" : {
"plural" : {
"one" : { "stringUnit" : { "value" : "%lld Artikel" } },
"other" : { "stringUnit" : { "value" : "%lld Artikel" } }
}
}
}
}
}
Two things trip up generic translation tools: every language lives in one file (so "one file per translator" workflows break), and plural categories differ per language — Japanese needs only other, Russian needs one, few, and many. A tool that copies the English plural structure produces invalid catalogs.
Translating an .xcstrings catalog
- Upload the catalog. Localize Your App reads
.xcstringsnatively — source strings, comments, and plural variants are all extracted, and format specifiers like%lldare locked so they survive translation. - Select target languages. All 39 App Store Connect localizations are available. Plural variants are generated per the target language's CLDR rules, not copied from English.
- Review, then export. Edit anything that needs polish side by side, then download a single merged
.xcstringswith every language filled in. Drop it into your project and build — Xcode shows each language as fully localized.
Migrating from .strings to .xcstrings
If you're still on legacy .strings files, the catalog format is worth the switch: Xcode keeps it in sync with your code automatically and flags stale keys. You can migrate and translate in one pass — upload the old Localizable.strings, translate, and export as .xcstrings instead of .strings. The file formats guide covers what each format can and can't represent.
Keeping the catalog current across releases
New build, new strings: Xcode adds them to the catalog as untranslated. Re-upload the catalog and only the new or changed strings cost credits — translation memory fills everything it has seen before, so a release with 12 new strings costs 12 strings' worth per language, not a full re-translation. Which languages deserve a slot in your catalog? The App Store languages guide ranks them by revenue per user.
Ship your app in 39 languages by tonight
Upload your localization file, review side by side, download ready-to-import files for every language. One-time credits from $9 — no subscription.
No subscription. Credits never expire.