ICU MessageFormat
A mini-syntax inside a translation string that picks the right wording for counts, gender, and variables. One string covers '1 item' and '5 items'.
See it
What it is
ICU MessageFormat is a small syntax that lives inside a translation string and lets the string branch on its own data. The classic shape is {count, plural, one {# item} other {# items}}: one key, one string per locale, correct grammar at every number. Alongside plural there is select (branch on gender or any category), selectordinal (1st, 2nd, 3rd), and inline date, time, and number formatting.
Reach for it the moment a sentence contains a number, a name, or anything that changes the wording around it. The alternative is gluing fragments together in code, which strands translators: they cannot reorder the pieces, and plenty of languages need to. ICU is what FormatJS and react-intl speak natively, what i18next speaks via its ICU plugin, and what most translation platforms parse.
Gotcha: the 'one' category is not the number 1. French counts 0 as 'one'. Russian puts 21 in 'one' and 22 in 'few'. So never hardcode the English singular/plural pair, and let the runtime consult CLDR. Use # for the count rather than a second placeholder, because # gets locale-aware number formatting applied for free.
Ask AI for it
Rewrite these UI strings as ICU MessageFormat messages. Wrap every counted string as {count, plural, one {...} other {...}} and use # for the number instead of a separate placeholder. Use {gender, select, ...} wherever the sentence changes on gender, and named placeholders like {userName} for interpolation. Keep each sentence whole inside one message: no concatenating fragments in code. Output a flat JSON message catalog keyed by dot-separated IDs, plus the matching react-intl render call for each message.