localint
v0.1.0
Published
Detect placeholder and interpolation mismatches across i18n locale files
Maintainers
Readme
localint
A CLI that catches placeholder mismatches in your i18n locale files before they ship.
When a translator renames {name} to {nom}, your app compiles fine and your tests pass. But at runtime the variable is undefined and users see "Bonjour, !". localint finds these before they reach production.
The problem
// en.json
{ "greeting": "Hello, {name}!" }
// fr.json
{ "greeting": "Bonjour, {nom}!" }Installation
npm install -g localintOr run without installing:
npx localint --source locales/en.json --target "locales/*.json"Usage
localint --source <file> --target <glob> [options]
Options:
-s, --source <file> Source locale file (e.g. locales/en.json)
-t, --target <pattern> Glob pattern for target locales (e.g. "locales/*.json")
-r, --reporter <type> Output format: text (default) or json
--strict Also fail on missing keys
-V, --version Show version
-h, --help Show helpExamples
# Check all locales against English
localint --source locales/en.json --target "locales/*.json"
# Also flag missing keys
localint --source locales/en.json --target "locales/*.json" --strict
# JSON output for tooling
localint --source locales/en.json --target "locales/*.json" --reporter jsonSample output
✗ fr — 1 mismatch(es)
RENAMED greeting
source: Hello, {name}!
target: Bonjour, {nom}!
detail: {name} -> {nom}
2 placeholder mismatch(es), 0 missing key(s).Exits with code 1 on any issues, so it works as a CI check out of the box.
Supported formats
| Format | Example | Used by |
|--------|---------|---------|
| {name} | Hello, {name}! | vue-i18n, basic JSON |
| {{name}} | Hello, {{name}}! | i18next, Handlebars |
| %(name)s | Hello, %(name)s! | Python-style printf |
| %1$s | Hello, %1$s! | Positional printf |
| %s, %d | Hello, %s! | Anonymous printf |
| :name | Hello, :name! | Legacy formats |
GitHub Action
- name: Check translations
uses: moakk/[email protected]
with:
source: locales/en.json
target: "locales/*.json"Library usage
import { compareLocales, loadLocaleFile } from "localint";
const source = loadLocaleFile("locales/en.json");
const target = loadLocaleFile("locales/fr.json");
const result = compareLocales(source, target);
console.log(result.mismatches);License
MIT
