vue-i18n prints {count} instead of the value
A Vue app renders the literal {count} or {team} in one locale. The usual cause is a renamed source variable that the translations never followed, and it is invisible to a key diff.
What you see
- •The UI shows `{count}`, `{name}` or `{workspace}` as literal text, in some languages and not others.
- •The key exists in every locale file and the JSON is valid, so nothing in the build complains.
- •It is often an older locale that breaks, because the newest translations were written against the current source.
Why it happens
vue-i18n substitutes by name. A message with `{workspace}` is filled from the object the component passes; a message with `{team}` gets nothing, because no such property is supplied, and vue-i18n leaves the token in place rather than failing. Renaming an interpolation in the source language is therefore a silent breaking change for every translation that still uses the old name.
1The source renamed the variable
English moved from `{team}` to `{workspace}` as the product renamed a concept. Key parity stayed perfect, every locale still had the string, and the substitution quietly stopped working in the ones nobody revisited.
Twenty-one locales still carry `{team}` across `team.invited_to_team`, `join_team` and `joined_team`. German reads `{team} beitreten`, Spanish `Entrar al espacio de trabajo {team}`.
Our report — the Afrikaans fix is merged; the rest are still open →
2The variable name itself was translated
A translator or a model treats the token as part of the sentence. The result looks careful and idiomatic and cannot bind to anything.
Afrikaans had `Gekoppel aan {naam}` where the source has `{name}`, and Japanese renders `{名前}に接続しました`.
Find every instance
Run the check over your locales directory. The vue grammar understands pipe plurals and `{'{'}` literals:
npx @shipi18n/cli@latest check ./locales -s en --severity 'missing-key=off,untranslated=off,orphan-key=off'Without those flags it also lists every missing and untranslated key, which on a partly translated app is thousands of lines and hides the findings that break at runtime.
✗ de coverage 100.0% 3 error(s), 0 warning(s)
error team.join_team placeholder-missing — dropped {workspace}How to fix it
- 1Rename the token in every locale in the same commit as the source change, not afterwards.
- 2Search for the old name across the whole locale directory rather than fixing the language that was reported. It is almost never alone.
- 3Put the check in CI so the next rename cannot merge while translations still reference the retired variable.
The rules that catch this
How often this actually happens
The scan that found this covers 64 public repositories, 21 of which ship at least one broken translation: https://shipi18n.com/oss