
Translate Xcode String Catalogs in Seconds
Plural forms correct per CLDR. Device variations preserved. Translation states tracked. Your .xcstrings files translated without leaving your IDE.
String Catalog Translation Is Deceptively Complex
Xcode 15 String Catalogs replaced .strings and .stringsdict with a single JSON file — but the complexity didn't go away. Plural forms need correct CLDR categories per language, device variations (iPhone vs iPad vs Mac) must stay paired with their keys, and Xcode's state tracking means one wrong field invalidates the entire entry.
Each language needs different CLDR plural categories — Arabic needs all six, Japanese needs only 'other', Russian needs four distinct forms
Device-specific string variations (iPhone, iPad, Mac, Apple Watch) must stay correctly associated with their parent keys
Xcode tracks translation states (new, needs_review, translated, stale) — wrong state values cause Xcode to ignore or flag translations incorrectly
Migrating from legacy .strings/.stringsdict to .xcstrings introduces format differences that generic tools don't handle
{
"sourceLanguage": "en",
"version": "1.0",
"strings": {
"welcome_title": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Welcome to the App"
}
}
}
},
"item_count": {
"localizations": {
"en": {
"variations": {
"plural": {
"zero": {
"stringUnit": {
"state": "translated",
"value": "No items"
}
},
"one": {
"stringUnit": {
"state": "translated",
"value": "%lld item"
}
},
"other": {
"stringUnit": {
"state": "translated",
"value": "%lld items"
}
}
}
}
}
}
},
"device_greeting": {
"localizations": {
"en": {
"variations": {
"device": {
"iphone": {
"stringUnit": {
"state": "translated",
"value": "Tap to continue"
}
},
"ipad": {
"stringUnit": {
"state": "translated",
"value": "Tap or click to continue"
}
},
"mac": {
"stringUnit": {
"state": "translated",
"value": "Click to continue"
}
}
}
}
}
}
}
}
}{
"sourceLanguage": "en",
"version": "1.0",
"strings": {
"welcome_title": {
"extractionState": "manual",
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Willkommen in der App"
}
}
}
},
"item_count": {
"localizations": {
"de": {
"variations": {
"plural": {
"zero": {
"stringUnit": {
"state": "translated",
"value": "Keine Elemente"
}
},
"one": {
"stringUnit": {
"state": "translated",
"value": "%lld Element"
}
},
"other": {
"stringUnit": {
"state": "translated",
"value": "%lld Elemente"
}
}
}
}
}
}
},
"device_greeting": {
"localizations": {
"de": {
"variations": {
"device": {
"iphone": {
"stringUnit": {
"state": "translated",
"value": "Tippen zum Fortfahren"
}
},
"ipad": {
"stringUnit": {
"state": "translated",
"value": "Tippen oder klicken zum Fortfahren"
}
},
"mac": {
"stringUnit": {
"state": "translated",
"value": "Klicken zum Fortfahren"
}
}
}
}
}
}
}
}
}What i18n Agent Preserves
Plural Forms
Correct CLDR plural categories generated for each target language — from single-category Japanese to six-category Arabic
Device Variations
iPhone, iPad, Mac, and Apple Watch string variations stay correctly associated with their parent keys
State Awareness
Translation states (new, needs_review, translated) are set correctly so Xcode's localization workflow functions properly
Format Compatibility
Output is fully compatible with Xcode's String Catalog editor and integrates cleanly with both new and migrated projects
Works Across Apple Development
How It Works

No manual copy-paste. No string extraction. Just translated files.
Try i18n Agent Now
Drop your translation file here
JSON, YAML, PO, XML, CSV, Markdown, Properties
or click to browse
Target languages
Frequently Asked Questions
Enterprise team?
Still stuck on a TMS contract? Let's talk about migrating.