How this skill is triggered — by the user, by Claude, or both
Slash command
/i18n-audit:i18n-auditThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
---
Audit internationalization files for missing keys, untranslated values, hardcoded strings, and inconsistencies. Works across any tech stack, i18n library, and locale file format.
For any project, regardless of framework. No coding experience required.
Internationalization (i18n) means keeping all user-facing text (buttons, messages, labels) in separate files per language, instead of hardcoding them in the app. This lets the app switch languages without changing code.
Without i18n: <button>Submit</button> ← Only English, forever
With i18n: <button>{t('form.submit')}</button> ← Shows "Submit", "제출", "提交" depending on language
[Step 1] Find locale files → Auto-detect or specify paths
[Step 2] Identify base locale → The "source of truth" language (usually en or ko)
[Step 3] Run 6 checks → Missing keys, untranslated, hardcoded, placeholders, extras, naming
[Step 4] Generate report → Issues by severity with copy-paste fixes
[Step 5] Save progress → Track improvements over time
The skill auto-detects the i18n setup by scanning common locations:
| Framework | Typical Paths | Format |
|---|---|---|
| i18next / react-i18next | src/locales/*.json, public/locales/**/*.json | JSON |
| next-intl | messages/*.json, src/messages/*.json | JSON |
| react-intl | src/lang/*.json, src/translations/*.json | JSON |
| vue-i18n | src/i18n/*.json, src/locales/*.json | JSON/YAML |
| Angular | src/assets/i18n/*.json | JSON |
| Nuxt i18n | locales/*.json, i18n/*.json | JSON/YAML |
| Rails | config/locales/*.yml | YAML |
| Django | locale/*/LC_MESSAGES/*.po | PO |
| Laravel | lang/*.json, resources/lang/**/*.php | JSON/PHP |
| Flutter | lib/l10n/*.arb | ARB (JSON) |
| iOS | *.lproj/Localizable.strings | .strings |
| Android | res/values*/strings.xml | XML |
| Svelte (paraglide) | messages/*.json | JSON |
| Custom | Configurable via .i18n-audit/config.json | Any |
| Framework | Translation Call | Import Pattern |
|---|---|---|
| i18next | t('key') | useTranslation() |
| react-intl | intl.formatMessage({ id: 'key' }), <FormattedMessage id="key" /> | useIntl() |
| vue-i18n | $t('key'), t('key') | useI18n() |
| next-intl | t('key') | useTranslations() |
| Angular | {{ 'key' | translate }} | TranslateModule |
| Flutter | AppLocalizations.of(context)!.key | flutter_localizations |
| Custom | Configurable | Configurable |
Keys in base locale absent from targets. Impact: Raw keys or blank UI. Severity: Critical.
Keys in targets not present in base. Impact: Dead code, translator confusion. Severity: Warning.
Empty strings, copy-pasted base values, or TODO/FIXME markers. Severity: Warning/Info.
Mismatched {{variables}}, {variables}, or printf-style placeholders across locales. Severity: Critical.
User-facing text in source code that bypasses the i18n translation function. Severity: Warning.
Inconsistent key naming patterns (dot.notation vs camelCase vs SCREAMING_SNAKE). Severity: Info.
See references/check-examples.md for detailed examples and output format.
This skill builds project knowledge over time, reducing false positives and speeding up audits.
.i18n-audit/ directory with:
config.json: detected paths, base locale, translation function pattern, file formatglossary.json: terms intentionally identical across locales (brand names, units)history.json: baseline audit results with timestamp.i18n-audit/config.json — skip detection stepglossary.json — exclude known-identical terms from untranslated checkhistory.jsonTerms added to the glossary are excluded from the "untranslated value" check:
{
"terms": [
{ "key": "brand.name", "value": "MyApp", "reason": "Brand name — never translated" },
{ "key": "unit.km", "value": "km", "reason": "Universal unit" },
{ "key": "social.url", "value": "https://...", "reason": "URL — locale independent" }
]
}
How it grows: When the audit flags an identical value, ask whether it should be added to the glossary. Once added, future audits skip it automatically.
As the project matures, the skill tightens its checks:
| Project Stage | Strictness | Checks Enforced |
|---|---|---|
| Early (< 50 keys) | Lenient | Missing keys, placeholders only |
| Growing (50-500) | Standard | All 6 checks, glossary building |
| Mature (500+) | Strict | Zero-tolerance on missing keys, naming convention enforced |
placeholder="Enter name" is not a substitute for i18npayment.title not titles.payment — colocate related keyssection.element.modifier)_description keys or use i18n platforms with context supportscripts/i18n-check.js: Zero-dependency Node.js locale checker. Run with node scripts/i18n-check.js <locale-dir> [--base=en]. Compares JSON locale files, detects missing keys, orphaned keys, untranslated values, and placeholder mismatches. Outputs markdown report to stdout. Exit code 0 = pass, 1 = critical issues. CI-ready.scripts/locale-check-hook.sh: PostToolUse hook that auto-checks locale files on Write/Edit. Warns about critical issues without blocking.references/framework-detection.md: Detailed auto-detection rules for 10+ frameworks. Includes locale file discovery patterns, translation function signatures, hardcoded string exclusion rules, placeholder format reference, and .i18n-audit/config.json schema.references/check-examples.md: Detailed BAD/GOOD examples for each of the 6 audit checks, placeholder format reference table, and full output report template.agents/key-checker.md: Parallel agent for missing/orphaned key analysis across all locale files.agents/hardcode-scanner.md: Parallel agent that scans source code for hardcoded user-facing strings bypassing i18n.translate-content: Active translation workflow (complements i18n-audit)web-accessibility: Accessibility often intersects with i18n (screen reader language, dir attributes)Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub jhyeok5/claude-plugin-marketplace --plugin i18n-audit