← Back to research
CLIIncomplete

Stringproof

Stringproof compares every translated Apple .strings file with its source. It reports structural and encoding damage without translating or changing the catalogs.

A deliberately corrupted Japanese Localizable.strings catalog containing placeholder damage, encoding errors, mixed scripts, and leaked prompt residue

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.