glotto
v3.1.0
Published
AI-powered i18n JSON translator. Multi-target, incremental, provider-agnostic (OpenAI, Anthropic, Gemini).
Downloads
87
Maintainers
Readme
Glotto AI Translator
Glotto translates i18n JSON files (i18next, react-intl, vue-i18n, etc.) using AI providers without forcing the model to produce JSON. It walks the input JSON, extracts every string leaf with its path, sends them to the model as plain-text tagged batches, and reconstructs the JSON from the responses. The original structure, keys, arrays, variables and HTML tags are preserved by Glotto itself — the model only sees and produces text.
Installation
JSR (Deno)
deno install --global --name glotto -A jsr:@ibodev/glottoOr run without installing:
deno run -A jsr:@ibodev/glottonpm (Node)
npm install --global glottoOr via npx:
npx glottopnpm
pnpm add --global glottoOr via pnpx:
pnpx glottoUsage
Basic (default OpenAI)
glotto --key <openai-api-key> -i en.json -o tr.json -f English -t TurkishGemini
glotto --key <gemini-api-key> -i en.json -o ar.json -f English -t Arabic -p geminiOpenAI / OpenAI-compatible endpoints
glotto --key <openai-api-key> -i en.json -o tr.json -f English -t Turkish -p openaiCustom base URL (e.g. self-hosted OpenAI-compatible server):
glotto --key <key> -i en.json -o tr.json -f English -t Turkish \
-p openai -m <model-name> --url <base-url>Anthropic (Claude)
glotto --key <anthropic-api-key> -i en.json -o tr.json -f English -t Turkish -p anthropicOverride the model
glotto --key <key> -i en.json -o tr.json -f English -t Turkish -p openai -m <model-name>Multi-target — translate to several languages in one run
Pass comma-separated values to -t/--to and -o/--output. The two lists must have the same length; entries pair up by index.
glotto --key <key> -i en.json -f English \
-t "Turkish,French,German" \
-o "tr.json,fr.json,de.json"Incremental — translate only missing keys
When --incremental is set and the target file already exists, Glotto compares it against the source and only sends keys whose target value is missing or
empty. The existing target structure is preserved; only the missing values are filled in.
glotto --key <key> -i en.json -o tr.json -f English -t Turkish --incrementalIf the target file does not exist, Glotto falls back to a full translation.
Stats — see token usage
--stats prints input/output token totals, call counts, batch sizes and per-target breakdown after the run finishes. Off by default.
glotto --key <key> -i en.json -o tr.json -f English -t Turkish --statsConfig file (glotto.config.json)
You can keep flags in a config file so you don't have to retype them. Glotto looks for glotto.config.json in the current working directory by default; pass
--config <path> to use a custom location. CLI flags always override config values.
Reference the JSON Schema for editor autocompletion and validation:
{
"$schema": "https://raw.githubusercontent.com/ibodev1/glotto/main/schema/glotto.schema.json",
"provider": "openai",
"model": "gpt-4.1-mini",
"input": "locales/en.json",
"from": "English",
"to": ["Turkish", "French", "German"],
"output": ["locales/tr.json", "locales/fr.json", "locales/de.json"],
"incremental": true,
"stats": true
}With this config you only need to provide the API key on the CLI:
glotto --key <key>Disable rate-limit delay and request timeout
glotto --key <key> -i en.json -o tr.json -f English -t Turkish --no-limit --no-timeoutTune batch size
--max-batch-size is the maximum source bytes per batch, in KB. Smaller batches mean more requests but lower per-request token cost; larger batches mean fewer
requests.
glotto --key <key> -i en.json -o tr.json -f English -t Turkish --max-batch-size 8Parameters
| Flag | Description |
| ------------------ | ------------------------------------------------------------------------------------ |
| --key | API key for the chosen provider (required) |
| -p, --provider | gemini | openai | anthropic (default openai) |
| -m, --model | Model name (defaults: gpt-4.1-mini, gemini-2.5-flash, claude-3-5-haiku-latest) |
| -i, --input | Source JSON file (required) |
| -o, --output | Target JSON file path. Comma-separated for multi-target (required) |
| -f, --from | Source language |
| -t, --to | Target language. Comma-separated for multi-target |
| --url | Custom base URL for OpenAI/Anthropic |
| --config | Path to a config file (default: ./glotto.config.json if present) |
| --stats | Print AI usage stats (tokens, calls, bytes) at the end |
| --incremental | Translate only missing/empty keys when the target already exists |
| --no-limit | Skip the inter-batch rate-limit delay |
| --no-timeout | Disable request timeout |
| --max-batch-size | Max source bytes per batch in KB (default 12) |
| -h, --help | Help |
| -v, --version | Version |
Config file fields
glotto.config.json accepts the keys below. CLI flags override config values.
| Key | Type | Notes |
| -------------- | ----------------------------------- | --------------------------------------- |
| key | string | API key |
| provider | openai | gemini | anthropic | |
| model | string | |
| input | string | Source JSON path |
| from | string | Source language |
| to | string | string[] | Single target or array for multi-target |
| output | string | string[] | Must match to length when array |
| url | string | Custom base URL |
| noLimit | boolean | |
| noTimeout | boolean | |
| maxBatchSize | integer (KB) | |
| stats | boolean | |
| incremental | boolean | |
Development
Run from source:
deno task cli --key <key> -i en.json -o tr.json -f English -t TurkishBuild a single-file binary:
deno task buildBuild npm package:
deno task build:npmStar us
If Glotto saves you time, consider giving it a ⭐ on GitHub — it really helps the project reach more people.
License
MIT © 2026
