Stringproof
Stringproof compares every translated Apple .strings file with its source. It reports structural and encoding damage without translating or changing the catalogs.
Damage that still parses
A translated catalog may load successfully even after a placeholder disappears, a key goes missing, scripts are mixed, prompt instructions leak into a value, or text is damaged by encoding. Those failures often appear only when the affected screen or language ships.
Source comparison
Stringproof discovers Apple .strings catalogs and pairs each translation with its source by relative path. Source keys define the expected catalog; source placeholders define the values the app must still be able to insert. One command checks the locale tree and reports each problem at its file, key, and line.
Checks
Catalog structure
Syntax errors, duplicate keys, missing keys, and unexpected keys.
Placeholders
Missing, added, or changed printf, ICU, and Swift interpolation tokens, including types, positions, and repeated arguments.
Text integrity
Replacement characters, mojibake, prompt residue, and suspicious unchanged text.
Scripts
Unexpected scripts in the target locale, while allowing source text such as product names and API identifiers.
A valid file can still be wrong
The source expects a name. The Japanese value below parses, but drops the placeholder:
/* en */ "welcome.user" = "Welcome, %@";
/* ja */ "welcome.user" = "ようこそ"; Stringproof identifies the missing argument directly:
ja.lproj/Localizable.strings:2
[placeholder.missing] ja welcome.user: missing placeholder(s): %@ One command for agents and CI
stringproof check ./Resources --source-locale en --json JSON findings have stable codes and locations. Exit 0 means clean input, 1 means translation findings, and 2 means an invocation or input failure. A text-mode check stays silent when clean. Neither mode rewrites a catalog.