agentleFS
AvighnaBasakAvighnaBasak/i18n-audit-skill/SKILL.md

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

  • Other versions3 projects use a version of this.

    Word for word · 0

    None found.

    Edited · 0

    None found.

    Wrote their own version · 3

    1. RocketChat/Rocket.Chat.Electron★ 1.7ksame name
    2. zevnda/steam-game-idler★ 788same name
    3. 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
  1. Distinctive:

    Run a comprehensive internationalization quality audit and provide actionable, prioritized findings.

    line 13
  2. Very specific:

    Run it with Node.js: node "__INSTALL_PATH__/dist/cli.js" [flags]

    line 22
  3. Very specific:

    If the user passed a path argument, use --cwd <path>

    line 33
  4. Very specific:

    If no path given, use --cwd .

    line 34
  5. Very specific:

    If the user specified extra flags (--threshold, --fix-orphans, etc.), pass them through

    line 35
  6. Distinctive:

    Run the tool in CI mode to get structured JSON output:

    line 39
  7. Very specific:

    If the user also wants the visual terminal report, run without --ci first:

    line 44
  8. Distinctive:

    After presenting results, offer:

    line 78
  9. Distinctive:

    When presenting findings, use this template:

    line 143

≈ “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.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

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.js

Run 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>&1

If 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-run to preview removing X orphaned keys (saves Y bytes)?"
  • "Run --report audit.md to save a full markdown report?"
  • "Add i18n-audit --ci --threshold 95 to 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 90

Example 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 itemCount

Download now (ZIP)

Does 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
What did you use it for? e.g. Reviewing pull requests in a Rails app

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.