PTC

iOS localization with AI: translations by pull request

PTC (Private Translation Cloud) takes the String Catalog in your repository, translates it into 40+ languages and sends it back as a pull request.

Using Claude Code, Codex or Cursor?

Connect PTC to your agent and it does this for you: it learns your app, asks you only what the code can't answer, and translates and reviews every language. One prompt:

Localize this app into German and Spanish with PTC.

Connect PTC to your agent

Set it up once, and every push comes back translated

PTC is built for an app that keeps changing, not for a one-time translation. You do not export, upload or download anything: the work happens where your code is.

We run our own product this way. WPML has about 80,000 words in 21 languages. A release used to wait two weeks for translators, and with PTC it is ready in about three hours. Read how we translate WPML with PTC.

  1. Connect PTC to Claude Code or Codex and give it one prompt: Set up PTC translations. The getting started page has the command.
  2. PTC learns your app once. The agent finds your String Catalogs and the code that uses each string, tells PTC what the app does, and writes the PTC configuration. See how the PTC agent guide works.
  3. You answer what only you know: the languages, the price, and how translations should arrive.
  4. PTC opens a pull request with the translated Localizable.xcstrings. From then on it runs by itself: every push to your default branch comes back the same way.

You pay only for new and changed strings. A string that was translated once is never charged again.

No coding agent? Connect GitHub, GitLab or Bitbucket yourself, or call the API from your build.

What comes back in the pull request

  • The same file. One Localizable.xcstrings with your source strings and every language, under the name Xcode expects. Legacy .strings and .stringsdict files work the same way.
  • Every plural form. A string you marked Vary by Plural gets the categories each language needs: two for Spanish, three for Russian, all six for Arabic.
  • Placeholders untouched. %lld, %@ and interpolations stay where the grammar of each language puts them.
  • Reviewed translations. PTC reviews each translation against your app's description and glossary before it opens the pull request.

Two patterns keep a string out of the catalog

PTC translates what is in the String Catalog. Xcode fills the catalog from your SwiftUI code at build time, and two common patterns fail without a warning. The string stays in English in every language.

A variable passed to Text

// NOT localized - SwiftUI treats the variable as a plain String
let title = "welcome_title"
Text(title)

// Localized correctly
Text(LocalizedStringKey(title))

A string outside a view

In a view model or a helper, use String(localized:):

let errorMessage = String(localized: "error_generic")

Plurals

Write the string once, then choose Vary by Plural on its key in the catalog. PTC fills the forms for every language.

Text("\(bookCount) books on your shelf")

For the rest of the preparation, see how to prepare software for translation and how to keep long translations from breaking layouts. German runs about 30% longer than English.

Translations that fit the screen they appear on

A string catalog gives a translator “Send” and nothing else. PTC works from more than the string.

  • Context from your code. Your coding agent reads where an ambiguous key is used, and PTC turns that into a one-line note that guides the translation.
  • One glossary. PTC builds it from your existing translations and asks you only where your own sources disagree. See brand voice and glossary.
  • Screens checked. Where AI Visual QA is enabled for your account, you upload screenshots of the translated app. PTC fixes what is in the catalog, such as a label too long for a navigation bar, and gives you a ready prompt for what is in your Swift code, such as a hard-coded string.

One project for iOS, Android and everything around the app

  • Android. Put Localizable.xcstrings and res/values/strings.xml in one PTC project. A term decided for Spanish on Android is the same term on iOS. See localizing your Android app.
  • App Store listing and release notes. They live outside the catalog. Paste them into the same project and they use the same glossary.
  • Texts your users write. Chat, posts and reviews go through the PTC API as they arrive.

Price: per word, no seats

The price per 1,000 words starts at €3.00 and falls with monthly volume to €0.40. The first 500 words each month are free, and there is no subscription. See the pricing page.

Try it on your own String Catalog, free

The trial covers 20,000 words into 2 languages for 30 days, with no credit card.

Start your free trial and connect your agent

Last updated: