Skip to main content
AI agent network visualization

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

Source (English)
Localizable.xcstrings
{
  "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"
                }
              }
            }
          }
        }
      }
    }
  }
}
Translated (German)
Localizable.xcstrings (with de)
{
  "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

Xcode 15+ String Catalogs
SwiftUI Localization
UIKit / AppKit
Swift Packages

How It Works

How i18n Agent works: Install, Translate, Done
1
2
3
terminal
$translate_filesrc/messages/en.json
 --target["de", "ja", "es"]
Done.3 languages, 142 keys translated.

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

No signup requiredInstant estimate

Frequently Asked Questions

Developer?

Install the CLI tool and translate your first file in 2 minutes.

Install CLI Tool

Enterprise team?

Still stuck on a TMS contract? Let's talk about migrating.