Private iOS and macOS localization check

iOS String Catalog (.xcstrings) QA & Diff

Open an Xcode String Catalog to see translation coverage per language, placeholders that do not match the source, plural and device variations a language needs, stale keys and empty translations. Add an earlier version to diff what changed—and which translations are now outdated.

String Catalogs

Open a catalog

No catalog selected.

No earlier catalog.

Listing expected locales reports languages that have no entries yet. Catalogs up to 32 MiB.

Paste or choose a String Catalog, or load the teaching pair.

String Catalogs and reports stay in this browser tab. ToolQuill does not upload your app’s text.

What the QA reads

A String Catalog is JSON: each key has an optional comment, an extractionState, a shouldTranslate flag and per-language localizations. A localization holds a stringUnit with a value and state—translated, needs_review or new—or nested variations by plural category or device, and substitutions for %#@token@ placeholders that carry their own plural cases. Every leaf is checked and rolled up into the status Xcode shows.

Placeholders, plurals and substitutions

Each translation’s format specifiers—%@, %lld, %.2f, positional %1$@—and substitution tokens are compared with the source. Changing a type or adding an argument index is an error because String(format:) reads the wrong argument; dropping one is a warning. Plural cases are compared with the language’s CLDR categories, read from your browser’s Intl.PluralRules: Polish needs one, few, many and other, Japanese only other.

Diffing catalog versions

Add the catalog from your last release or translation hand-off. The diff lists added and removed locales and keys, source-text edits, and translation, state, extraction-state and comment changes. Translations still marked translated after their source text changed are flagged as possibly outdated—exactly the strings translators need to revisit.

Validation boundary

This is a QA aid, not Xcode. It does not compile catalogs, scan Swift or Objective-C source, merge multiple tables or packages, render device-specific UI, or judge translation quality, and CLDR data in your browser can differ slightly from the OS on a device. Build the app, run it in each language, and use Xcode’s own catalog view before release.

Frequently asked questions

What does a stale key mean?

Xcode marks a key stale when it can no longer find the string in your source code. The entry and its translations still ship until you remove them.

Which placeholder mistakes are dangerous?

Changing a specifier type, such as %@ to %d, or adding an argument index the source does not have can crash String(format:) or print garbage. Dropping a placeholder silently loses information.

Why does my catalog show 100% in Xcode but gaps here?

Xcode’s percentage can ignore plural cases a language needs or translations that are still identical to the source. This QA counts those separately.

Is my catalog uploaded?

No. The JSON is parsed and compared in your browser.

Authoritative references

Apple documents localizing and varying text with a String Catalog and localization in Xcode; plural categories follow the Unicode CLDR plural rules.

Browse localization tools · Check Android strings.xml · Validate XLIFF packages