Official translation CLI and library by DV Net for JSON and Markdown files into multiple locales. Supports incremental JSON updates with hash tracking, parallel translation threads, Google Translate (JSON) and OpenAI GPT (JSON / Markdown).
- π¦ Install with yarn
yarn add -D @dv.net/translator- π» Use in a consumer project
{
"devDependencies": {
"@dv.net/translator": "^1.0.0"
},
"scripts": {
"i18n": "dv-translator translate --dir i18n/locales --all --exclude ru",
"i18n:md": "dv-translator translate-md --dir blog/translates --all --exclude ru",
"i18n:status": "dv-translator status --dir i18n/locales"
}
}Project layout:
my-app/
βββ i18n/locales/
β βββ en.json # source
β βββ ru.json # β generated
β βββ es.json # β generated
β βββ .translation-hashes.json
βββ blog/translates/
βββ en.md # source
βββ ru.md # β generated
βββ es.md # β generated
Both translation commands work the same way: --dir points to the directory containing the English source file. Translations are written into the same directory.
dv-translator translate --dir i18n/locales --all
dv-translator translate --dir i18n/locales --all --exclude ru
dv-translator translate --dir i18n/locales -l ru,es,fr --exclude ru
dv-translator translate --dir i18n/locales --all -f- Reads
i18n/locales/en.json - Writes
i18n/locales/ru.json,es.json, ... - Hashes:
i18n/locales/.translation-hashes.json - Default provider: Google (no API key required)
dv-translator translate-md --dir blog/translates --all
dv-translator translate-md --dir blog/translates --all --exclude ru
dv-translator translate-md --dir blog/translates -l ru,es --exclude ru
dv-translator translate-md --dir blog/translates --all -f- Reads
blog/translates/en.md - Writes
blog/translates/ru.md,es.md, ... - Requires an OpenAI API key
| Provider | When | API key |
|---|---|---|
google |
Default for JSON | Not required |
gpt |
-p gpt (JSON) or translate-md |
OpenAI |
API key resolution order:
-k/--keyOPENAI_API_KEYenvironment variablekey.txtin the project root
# JSON via Google
dv-translator translate --dir i18n/locales -l ru,es
# JSON via GPT
dv-translator translate --dir i18n/locales -l ru -p gpt -k $OPENAI_API_KEY| Flag | Description | Default |
|---|---|---|
--dir |
Directory with en.json / en.md |
required |
-l, --locales |
Comma-separated locales | ru,es,fr,de |
--all |
All locales except en |
β |
--exclude |
Locales to skip | β |
-f, --force |
Re-translate everything / overwrite existing files | β |
-t, --threads |
Parallel threads | 5 |
-k, --key |
OpenAI API key | env / key.txt |
-m, --model |
GPT model | gpt-4o-mini |
Additional flags for translate: -p, --provider (google / gpt)
Additional flags for translate-md: --temperature (0β2, default 1)
dv-translator status --dir i18n/locales
dv-translator clean --dir i18n/locales
dv-translator infoclean removes {locale}.json, {locale}.md, and .translation-hashes.json from the directory. It does not touch en.json or en.md.
import Translator from '@dv.net/translator';
const translator = new Translator({ provider: 'google', maxConcurrent: 5 });
await translator.translateJsonFile('i18n/locales/en.json', ['ru', 'es'], 'i18n/locales');βΆοΈ startβ run the CLI locally (node bin/cli.js)- π¦
pack:checkβ verify publishable package contents (npm pack --dry-run)
- βοΈ Node.js ESM (
>=18) - π₯οΈ Commander β CLI
- π Google Translate β free JSON translation
- π€ OpenAI β GPT translation for JSON and Markdown
- π fs-extra β file I/O
bin/
cli.js # CLI entry point
src/
index.js # public API (Translator class)
commands/ # translate, translate-md, status, clean
providers/ # google, gpt
utils/ # helpers
langs.js # supported locales
- π¦ Install dependencies
yarn installβΆοΈ Run the CLI
yarn start info
yarn start translate --dir ./locales --all- π¦ Verify package before publish
yarn pack:checkPublishing is automated via GitHub Release:
- Bump
versioninpackage.json - Create a GitHub Release with tag
vX.Y.Zmatchingpackage.json - The workflow publishes to npm as
@dv.net/translator
Requires NPM_TOKEN in the npm GitHub environment.
- π₯οΈ Node.js
>=18 - π
OPENAI_API_KEYβ only for GPT / Markdown translation
This project is licensed under the MIT License - see the LICENSE file for details.