AI agent network visualization

Translate .strings Files Without Breaking Your App

Keys untouched. Format specifiers preserved. Plural rules correct. Your Localizable.strings translated in seconds, not days.

Apple .strings Translation Is Tedious and Error-Prone

You export your Localizable.strings, hand it to a translator or paste it into a generic tool, get back corrupted format specifiers, broken escape sequences, and mangled plural rules. Then you spend hours debugging why your app crashes on launch in Japanese.

Format specifiers like %@, %d, and %1$@ get translated, reordered, or removed by generic tools

Escape sequences (\n, \", \t) get corrupted or double-escaped, breaking string parsing

Stringsdict plural rules need language-specific CLDR categories that most tools ignore entirely

Translator comments and context hints are stripped, leading to wrong translations

Source (English)
Base.lproj/Localizable.strings
/* Localizable.strings (English) */

"welcome_title" = "Welcome to MyApp";
"login_button" = "Sign In";
"greeting" = "Hello, %@!";
"items_count" = "%d items in your cart";
"transfer" = "Send %1$@ to %2$@";
Translated (Japanese)
ja.lproj/Localizable.strings
/* Localizable.strings (Japanese) */

"welcome_title" = "MyAppへようこそ";
"login_button" = "サインイン";
"greeting" = "%@さん、こんにちは!";
"items_count" = "カートに%d個のアイテム";
"transfer" = "%2$@に%1$@を送信";

What i18n Agent Preserves

Format Specifiers

Positional (%1$@) and type-specific (%d, %f, %@) specifiers are detected and left untouched

Escape Sequences

Newlines (\n), tabs (\t), quotes (\"), and Unicode escapes are preserved correctly

Stringsdict Plurals

CLDR plural categories (zero, one, two, few, many, other) are set correctly per target language

Comments & Context

Translator comments and developer notes are preserved to maintain translation context

Works Across Apple Platforms

SwiftUI
UIKit / AppKit
Xcode String Catalogs
macOS Apps
watchOS / tvOS
Swift Packages

Open-Source Tools for iOS Localization

i18n Agent for Xcode

A macOS menu bar app that adds one-click localization to Xcode. It auto-detects your active project, translates your .strings, .xcstrings, and .stringsdict files, and writes them to the correct .lproj directories. Push existing translations as translation memory for consistent results across your project.

Auto-detects your active Xcode project via AppleScript
Pull: translates files and writes to the correct .lproj directories
Push: uploads existing translations as translation memory
Lives in your menu bar, works with .strings, .xcstrings, and .stringsdict
View on GitHub

LocaleChain

iOS has a known gap: when a user's regional locale (like pt-BR) is missing, the system skips straight to English instead of trying a related locale (like pt-PT). LocaleChain is a Swift package that fixes this with configurable fallback chains. One line of setup, zero changes to your existing code.

One-line setup: LocaleChain.configure()
Works transparently with NSLocalizedString, SwiftUI Text, and .stringsdict
Built-in fallback chains for Portuguese, Spanish, French, German, and more
Installs via Swift Package Manager, MIT licensed
View on GitHub

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 MCP server and translate your first file in 2 minutes.

Install MCP Server

Enterprise team?

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