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