i18n-audit
Skill2 starsChanged 6 months agoMITView on GitHub
Run a comprehensive internationalization audit on any project. Detects missing keys, orphaned translations, hardcoded strings, placeholder mismatches, ICU plural violations, structural inconsistencies, and bundle bloat. Works with react-i18next, next-intl, vue-i18n, react-intl, lingui, svelte-i18n, django, and flask-babel.
3 other projects use a version of this.
Adopted by
Most recently taken up by
- zevnda/steam-game-idlertheir own version, first seen Nov 9, 2026
- qiaojinxia/okapitheir own version, first seen Oct 13, 2026
- RocketChat/Rocket.Chat.Electrontheir own version, first seen Oct 8, 2026
Other versions3 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 3
- RocketChat/Rocket.Chat.Electron★ 1.7ksame name
- zevnda/steam-game-idler★ 788same name
- qiaojinxia/okapi★ 2same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
The file
We split this skill into the rules it gives an agent
9 rules. About 0 are common, 4 are distinctive, and 5 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈4
Distinctive · estimate
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 13
Run a comprehensive internationalization quality audit and provide actionable, prioritized findings.
- Very specific: line 22
Run it with Node.js: node "__INSTALL_PATH__/dist/cli.js" [flags]
- Very specific: line 33
If the user passed a path argument, use --cwd <path>
- Very specific: line 34
If no path given, use --cwd .
- Very specific: line 35
If the user specified extra flags (--threshold, --fix-orphans, etc.), pass them through
- Distinctive: line 39
Run the tool in CI mode to get structured JSON output:
- Very specific: line 44
If the user also wants the visual terminal report, run without --ci first:
- Distinctive: line 78
After presenting results, offer:
- Distinctive: line 143
When presenting findings, use this template:
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
i18n-audit Skill
Run a comprehensive internationalization quality audit and provide actionable, prioritized findings.
Tool Location
The i18n-audit CLI is installed at:
__INSTALL_PATH__/dist/cli.jsRun it with Node.js: node "__INSTALL_PATH__/dist/cli.js" [flags]
Or if globally linked: i18n-audit [flags]
When This Skill Is Invoked
The user wants to audit a project's internationalization health. They may specify a project path, or you should audit the current working directory.
Execution Protocol
Step 1 — Determine target project
- If the user passed a path argument, use
--cwd <path> - If no path given, use
--cwd .(current directory) - If the user specified extra flags (--threshold, --fix-orphans, etc.), pass them through
Step 2 — Run the audit
Run the tool in CI mode to get structured JSON output:
node "__INSTALL_PATH__/dist/cli.js" --cwd <target> --ci 2>&1If the user also wants the visual terminal report, run without --ci first:
node "__INSTALL_PATH__/dist/cli.js" --cwd <target>Step 3 — Parse JSON result and produce analysis
Parse the JSON output and produce a structured human-readable analysis in this format:
## i18n Audit — <project name or path>
Framework detected: <framework or "none detected">
### Coverage
<locale>: <percent>% (<missing> missing, <orphaned> orphaned)
...
Worst coverage: <locale> at <percent>%
### Critical Issues (exit code 2)
- <issue type>: <detail with file:line if available>
### Warnings (exit code 1)
- <issue type>: <detail>
### Quality Issues
- <issue type>: <locale> › <key> — <detail>
### Recommendations (prioritized)
1. <highest impact fix first>
2. ...Step 4 — Offer follow-up actions
After presenting results, offer:
- "Run
--fix-orphans --dry-runto preview removing X orphaned keys (saves Y bytes)?" - "Run
--report audit.mdto save a full markdown report?" - "Add
i18n-audit --ci --threshold 95to your CI pipeline?" - "Show the full list of hardcoded strings to fix?"
Interpreting Results
Exit Codes
0— Clean. All locales complete, no warnings.1— Warnings. Orphaned keys, hardcoded strings, quality issues. Won't break the app but should be fixed.2— Failure. Missing keys in production locales (users will see raw key names or fallback to wrong language). Fix before shipping.
Coverage
100%— Complete. This locale is fully translated.80-99%— Partial. Users in this locale will see untranslated content for missing keys.< 80%— Incomplete. Significant untranslated content. Treat as a launch blocker.
Hardcoded Strings — Confidence Levels
HIGH— Almost certainly a user-facing string that needs to be extracted. Prioritize these.MEDIUM— Likely user-facing (aria-labels, alt text). Review each one.LOW— Possible. May be technical constants. Human judgment needed.
Quality Issues
copy_paste— Developer added a key but forgot to translate it. The string is byte-for-byte English in a non-English locale.placeholder_mismatch— A{variable}was dropped or renamed in translation. Will cause runtime errors in ICU-based frameworks.icu_missing_forms— A plural string is missing required plural category forms for the locale's language (Arabic needs 6 forms, Russian needs 4, English only 2).suspiciously_short— The translation is much shorter than the source string relative to what's typical for that language pair. May be truncated or untranslated.empty_value— A key exists but has an empty string value.
Structural Issues
parse_error— A locale file is not valid JSON/YAML. Fix immediately — the entire file is skipped.duplicate_key— The same key appears twice in one JSON object. The second value silently overwrites the first.missing_locale_file— A namespace exists for some locales but not others.flat_vs_nested— Different locales use different key organization for the same namespace.
Recommendations to Give Users
For missing keys
"Add these keys to <locale>.json. If using i18next, run i18next-scanner to extract them. If using next-intl, add them to your messages file."
For orphaned keys
"Run i18n-audit --cwd <project> --fix-orphans --dry-run to preview removal, then drop --dry-run to apply. This is safe — orphaned keys by definition are not used in code."
For hardcoded strings
"Wrap each string in your i18n function: t('your.key'). Add the key to all locale files. Focus on HIGH confidence findings first."
For placeholder mismatches
"In <locale>/<file>.json, restore the {variable} placeholder in the translation. The source string has it; the translation dropped it."
For ICU missing plural forms
"Add the missing plural categories to your ICU string. Arabic requires: {count, plural, zero {0 عناصر} one {عنصر واحد} two {عنصران} few {# عناصر} many {# عنصرًا} other {# عنصر}}"
For copy-paste translations
"The string in <locale> is identical to English. Either it needs translation, or it's legitimately the same (technical term, proper noun) and should be marked with a /* same-as-source */ comment in your workflow."
For CI integration
# .github/workflows/i18n.yml
- name: i18n audit
run: npx i18n-audit --ci --threshold 90Example Analysis Format
When presenting findings, use this template:
## i18n Audit Results
**Framework:** react-i18next
**Locales:** en (source), fr, ar
**Source keys:** 45
### Coverage
| Locale | Coverage | Missing | Orphaned |
|--------|----------|---------|----------|
| en | 100% | 0 | 0 |
| fr | 91% | 4 | 2 |
| ar | 67% | 15 | 0 |
### Critical (exit code 2) — Fix before shipping
- **Missing in fr:** `auth.forgotPassword`, `dashboard.subtitle`, `settings.theme`, `settings.language`
- **Missing in ar:** 15 keys across `auth`, `dashboard`, `settings` namespaces
### Hardcoded strings — 3 HIGH confidence
- `src/components/Header.tsx:24` — `placeholder="Search..."` — wrap in `t('header.searchPlaceholder')`
- `src/pages/Login.tsx:41` — `aria-label="Password field"` — wrap in `t('auth.passwordLabel')`
- `src/components/Modal.tsx:8` — JSX text "Are you sure?" — wrap in `t('common.confirmDialog')`
### Quality issues
- **ar** › `common.itemCount` — ICU plural missing forms: zero, two, few, many (Arabic requires 6)
- **fr** › `auth.login` — copy-paste from English (value identical to en)
### Recommendations
1. **Immediate:** Add 15 missing Arabic keys before your ar-locale launch
2. **This sprint:** Extract 3 hardcoded strings to i18n keys
3. **Cleanup:** Remove 2 orphaned keys from fr to save 89 bytes
4. **Quality:** Fix ICU plural forms for Arabic itemCountDoes it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

