TS2307: Cannot find module './locales/en.json' at context.tsx | en.json is gitignored; fresh clone has none | pnpm run build:en-locale |
❌ i18n key mismatch detected | Key set differs between en.ts and a locale JSON (typos show as Missing + Extra) | Apply the exact per-file Missing/Extra list |
❌ Untranslated values detected | Locale value copied from English, misses allowlist heuristics | Translate it, or allowlist the key if identity is intentional |
❌ i18n interpolation mismatch detected | {name} token in en.ts ≠ param name at the t() call (output gives file:line) | Make token and param identical — fix whichever side is wrong |
❌ Unused i18n keys detected blocks a commit that only added one key | An earlier PR deleted the last ref; the gated check fires on the next i18n toucher | Delete the listed definitely-unused keys from en.ts + all JSONs; ⚠️ possibly-unused (dynamic-prefix) lines are warn-only |
UI renders literal {count} or a raw ICU block | Runtime is plain replaceAll; the interpolation check only sees literal t('key', ...) calls — ternary/dynamic keys are invisible to it | Pass the vars object; replace ICU with .one/.other keys + ternary. 'collab.participantCount' in en.ts is a live latent bug — do not copy it |
| UI shows raw dotted key, sometimes only briefly or only non-English | Key missing in active locale before the en chunk lazy-loads; pre-load resolves only the hardcoded fallback map in context.tsx (errorBoundary., seo., common.loading) | Run check:i18n for parity; keys needed outside React/before load must also go in that fallback map |
| Unrelated commit blocked by an i18n check | Checks scan whole files, not staged hunks | Fix or stash existing i18n debt first |
| Component test asserts translated text without a provider and passes | src/test/setup.ts globally mocks @/i18n with real en.ts strings | Expected; locale-switching/fallback behavior is only tested in src/i18n/context.test.tsx |
| Missing loading spinner on first page load after a locale change | Initial mount deliberately renders children with the fallback map to avoid CLS; spinner appears only on explicit setLocale() | Not a bug — don't "fix" it |