String audit
Check strings on the way out, and deliveries on the way in.
Two checks over the same catalog: lint the source for the patterns that make strings hard to translate, then diff the returned delivery against it before you import. Load the samples to see what each check catches. Nothing you paste leaves the browser.
Lints one catalog for the problems that make a string hard or impossible to translate.
Paste your strings catalog
Audit findings
Keys
15
Errors
3
Warnings
5
Info
9
Filter by rule
Empty / whitespace-only valueerror
checkout.freeShipping
Value is empty. Did you forget to fill in the translation?
Unbalanced ICU braceserror
checkout.intro
Welcome to checkout. {Plus a few more lines of legalese, actually a very long s…Unbalanced braces (1 unclosed).
String concatenation in valueerror
auth.rateLimit
"You have " + count + " attempts remaining"
Looks like concatenated JS: translators can't reorder fragments. Refactor into a single string with placeholders.
Embedded HTMLwarning
auth.tos
By signing in you agree to our <a href='/tos'>Terms</a>
HTML detected. Either use ICU tag syntax ({tagName, /tagName}) or move markup outside the string and inject the inner text only.
Hardcoded plural via key suffixwarning
auth.errorPassword_plural
Wrong password (multiple attempts)
Looks like a plural form encoded in the key. ICU MessageFormat (`{count, plural, one {…} other {…}}`) lets translators pick the correct categories per locale.
Identifier or code as valuewarning
common.ok
OK
Value looks like an identifier, not a UI string. Move it to config and do not ship it to translators.
Identifier or code as valuewarning
checkout.FOOTER_TEXT
footerText
Value looks like an identifier, not a UI string. Move it to config and do not ship it to translators.
Printf-style placeholderwarning
checkout.summary
You have %d items in cart
Found printf-style or Objective-C placeholders. Use ICU named placeholders ({count}) so translators can reorder.
Ambiguous short stringinfo
common.ok
OK
Short value with little context. Add a translator comment (e.g. via .arb's `@key.description` or a sibling `_comment` key).
Ambiguous short stringinfo
common.submit
Submit
Short value with little context. Add a translator comment (e.g. via .arb's `@key.description` or a sibling `_comment` key).
Ambiguous short stringinfo
common.cancel
Cancel
Short value with little context. Add a translator comment (e.g. via .arb's `@key.description` or a sibling `_comment` key).
Ambiguous short stringinfo
auth.signIn
Sign in
Short value with little context. Add a translator comment (e.g. via .arb's `@key.description` or a sibling `_comment` key).
Ambiguous short stringinfo
checkout.totalLabel
Total:
Short value with little context. Add a translator comment (e.g. via .arb's `@key.description` or a sibling `_comment` key).
Ambiguous short stringinfo
checkout.FOOTER_TEXT
footerText
Short value with little context. Add a translator comment (e.g. via .arb's `@key.description` or a sibling `_comment` key).
Double space inside valueinfo
checkout.totalLabel
Total:
Multiple consecutive spaces. Usually a typo.
Very long stringinfo
checkout.intro
Welcome to checkout. {Plus a few more lines of legalese, actually a very long s…Value is 300 characters. Split into shorter strings so TM leverage works sentence-by-sentence.
Leading or trailing whitespaceinfo
checkout.totalLabel
Total:
Whitespace at the start or end of the value. Trim unless intentional (e.g. concatenation glue).
Related: Lesson: Pseudolocalization workbench