String concatenation
The translation-breaking habit of gluing sentence pieces together in code, leaving translators unable to reorder words or handle grammar.
What it is
String concatenation builds one visible sentence from separately translated fragments, such as 'You have ' + count + ' messages'. It looks convenient in the source language but locks the fragments into that language's order. Translators cannot move the count, change words around it, or apply a plural rule to the sentence as a whole. Japanese wants the verb at the end and a counter word attached to the number, so there is no arrangement of your three fragments that produces a correct Japanese sentence.
Keep each complete thought in one message and insert runtime values with named placeholders. When grammar changes with a count or category, use ICU MessageFormat plural or select branches inside that same message. This gives translators the entire sentence and lets each locale reorder it without asking developers for a new code path.
Gotcha: interpolation itself is not the problem. 'Welcome, {userName}' is safe because the translator owns the full sentence; translating 'Welcome, ' and appending the name in code is not. Watch for fragments hidden in JSX siblings, template literals, conditional suffixes, and helpers that join labels with punctuation.
Ask AI for it
Find every user-visible sentence assembled with +, template literals, adjacent JSX nodes, join(), or conditional prefixes and suffixes. Replace each one with a single ICU MessageFormat entry in the message catalog and render it through FormatJS. Use named placeholders for runtime values, plural or selectordinal for counts, and select for wording branches. Keep punctuation inside the message. Return the updated catalog keys and call sites, and leave no translated sentence fragment in code.