Build-an-X workflow that scans source code for untranslated strings - finds hardcoded user-facing text not wrapped in the i18n function (`t()`, `i18n.t`, `gettext`, `__()`, etc.), maps gaps to the team's translation file, reports per-language coverage (en: 100%; fr: 87%; es: 60%), gates per-PR for new untranslated strings. Use when the product ships in multiple locales and the team needs continuous coverage tracking.
79
99%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fill this from a run: the per-locale block comes from the Step 3 diff, the untranslated-strings block from the Step 2 scan. Post it as a PR comment or a scheduled coverage summary.
<sha>Locales: 5 (en source + 4 targets) Total keys (en): 542 Untranslated source strings: 18 (newly flagged)
| Locale | Coverage | Missing keys | Orphan keys | Recent additions |
|---|---|---|---|---|
| de | 100% | 0 | 2 | +5 |
| fr | 98% | 12 | 0 | +5 |
| es | 87% | 71 | 0 | +5 |
| ja | 60% | 218 | 0 | +5 |
| File | Line | String | Suggested key |
|---|---|---|---|
src/checkout/PromoBanner.tsx | 18 | "Apply your discount" | checkout.promo.banner_cta |
src/cart/EmptyCart.tsx | 12 | "Your cart is empty" | cart.empty_message |
These keys exist in de.json but no longer in source - likely deprecated.
Recommend deletion:
legacy.old_promo_textlegacy.old_checkout_button