name: copy-check description: Checks UI copy across locales by comparing key parity between next-intl message catalogs and in-code sv/en COPY objects, finding placeholder and array mismatches and words from the other language leaking in (the "och" in English bug), then manually reviewing claims against terms and pricing and the project's banned phrases. Use after editing copy or translations, before shipping a page with new text, or when asked to proofread or check translations. argument-hint: [dir] [--locales sv,en] allowed-tools: Bash(node *) Read Grep Glob Edit
copy-check
1. Mechanical pass
Args: $ARGUMENTS
node ${CLAUDE_SKILL_DIR}/scripts/i18n-parity.mjs <dir, default: app root of the current project> --locales sv,en
The script finds **/messages|locales|i18n/<locale>.json catalogs and sibling sv: {…} / en: {…} object literals in TS/JS. It reports:
- ERROR: missing keys, array length mismatches, placeholder mismatches (
{name},${x},{{x}}). Fix all of these. - warn: Swedish function words (och, att, för, med, inte, är, …) in English strings and vice versa, and long identical strings (untranslated?). Judge each one; product names and quoted Swedish terms are fine.
- unparsed: blocks the mini-parser couldn't read. Check those files by eye.
Strings built outside these patterns (JSX literals, t() with inline defaults) aren't covered. Grep the changed files for hard-coded text in the wrong locale.
2. Judgement pass (changed files first, then the pages they appear on)
- Banned or stale phrases: read the repo's CLAUDE.md and the project's memory entries. Projects often keep a list of retired taglines, required lead lines, or things that must never be stated publicly.
- Claims vs reality: prices, trial lengths, limits and "free" against the actual pricing config, Stripe products and terms page. Coverage claims must not quote a display cap as coverage. "Fastest", "every" and "all" need a source.
- Legal/consent wording: marketing consent is never bundled into terms, and Swedish legal terms are correct (ångerrätt, personuppgifter).
- Locale quality (Swedish example): natural word order, no särskrivningar ("hyres lägenhet"), correct en/ett, decimal comma and
krafter the number (1 299 kr), dates as19 okt/2026-10-19. - English quality: sentence case, no Swedish punctuation habits, and currency formatted for the locale.
- Consistency: the same term for the same thing across pages (pick the existing one).
Exit criteria
- i18n-parity exits 0, or every remaining warn is judged.
- No banned phrases, and every factual claim matches config, terms or a source.
- Fixes made only to copy, with no redesigns smuggled in.
- A short summary to the user.