Missing translation catcher for locale files

Dev toolWebweekendNode.jsGitHub ActionsClaude API

The idea

Teams that localise with plain JSON files all hit the same failure: someone adds checkout.discountBanner to en.json, ships, and German users see the raw key string in production. The gap is invisible in review because nobody diffs five locale files by hand, and it is invisible in staging because everyone tests in English. Full translation platforms like Lokalise fix this by taking over your whole workflow, which is exactly why small teams do not adopt them.

The wedge is living inside the PR instead of beside it. A CI check that fails on drift is a two-minute install, and machine-drafted placeholder translations mean the check never blocks shipping, it just makes the debt explicit and reviewable. Now is the right time because LLM translation drafts are finally good enough to ship behind a review marker.

Who pays

The buyer is a developer or team lead at a SaaS company selling into Europe, where a broken German UI costs real deals. Pricing is 9 to 29 dollars a month per private org, sold through GitHub Marketplace so billing rides the existing GitHub invoice. Distribution: free for public repos, which seeds the Action into open-source projects that maintainers then bring to work.

MVP scope

  • CLI that deep-diffs locale JSON files against the source locale
  • GitHub Action failing PRs on missing keys, orphaned keys and empty values
  • One sticky PR comment with a per-locale gap table
  • ICU placeholder mismatch detection
  • Optional Claude-drafted translations committed with a review marker
  • Skip for v1: YAML/gettext formats, a web dashboard, translator accounts, glossary management
// Build prompt — paste into Cursor / Claude Code / Lovable / Bolt
Build i18n-guard, a Node.js CLI plus a GitHub Action that stops locale-file drift in the PR. Stack: Node.js (TypeScript, published to npm), a composite GitHub Action wrapping the CLI, Claude API for draft translations.

Core flow: the repo has a source locale (default en.json) and sibling locale files (de.json, fr.json, etc), flat or nested JSON. On every PR, the Action runs the CLI, which deep-diffs each locale against the source and reports three classes of problem: keys missing from a locale, orphaned keys that no longer exist in the source, and empty-string values. Any finding fails the check and posts a single sticky PR comment with a table per locale (update the same comment on subsequent pushes, do not spam new ones).

Optional autofix mode: with a CLAUDE_API_KEY secret set and autofix: true, the Action calls Claude to draft translations for missing keys, writes them into the locale files wrapped with a configurable marker suffix like " [MT]" or a parallel needs-review manifest, and pushes a commit to the PR branch. Send the surrounding keys of the same namespace as context in the prompt so terminology stays consistent.

Config lives in i18nguard.config.json: source locale, glob for locale files, ignored key patterns, ICU placeholder validation on or off. Validate that ICU placeholders like {count} match between source and translation; mismatches fail even when the key exists.

No web app, no dashboard. Free for public repos; 15 dollars a month per private org via GitHub Marketplace.

// More Dev tool ideas