Translate

Command line

A Python package with no dependencies. Without a key it runs as the free demo: 10,000 characters per file, up to 8 languages per run.

Run
pip install kaeris
kaeris translate en.json --langs de,ja
Output, shortened
→ no key: free demo limits 10,000 chars per file, 8 languages per run, get a key: kaeris.dev/developer
→ Translating en.json → de, ja
✓ Wrote 2 file(s) to /home/you/app
/home/you/app/de.json
/home/you/app/ja.json
✓ Translation QA: no placeholder loss, no overflow risks

Next commands

CommandWhat it does
kaeris initWrites kaeris.json with your source file, languages and output folder, so kaeris translate runs with no flags. --preset fills it for i18next, react-i18next, next-intl, react-intl, vue-i18n or flutter-arb.
kaeris translate --only-newTranslates only new and edited keys. kaeris.lock next to the source remembers what is done. JSON and ARB.
kaeris checkFinds broken translations on your machine, no key. Without Python: npx kaeris check (Node 18+). Details of the check.
kaeris languagesPrints the 46 language codes.
kaeris quotaHow much of this month's volume is left on your key.

Flags you will use

FlagMeaning
--langs de,jaTarget languages, comma-separated. Short form -l.
--out localesWhere to write the files. Default: next to the source.
--verifyTranslates every result back to English and writes verify.json, so you can check the meaning.
--keep 'KAERIS,GitHub'Words that stay as written in every language, such as brand names.
--context 'a bank app'One line about your app. Helps with words that have two meanings.
--tone formalneutral, formal or casual.
--model openai/gpt-4.1Lifetime: the OpenRouter model to translate with. One per language: models in kaeris.json. On other plans the request is refused with the reason.
--keyYour API key. Or set KAERIS_API_KEY, which is safer: a key typed after --key stays in your shell history and shows in the process list.
--source-lang enLanguage of the source file. Default en; also finds locales/<lang>/<namespace>.json layouts.
--back-lang enLanguage --verify translates back into. Default en.
--lock PATHWhere kaeris.lock lives. Default: next to the source.
--assume-currentFirst --only-new run on a project that is already translated: trust the existing translations instead of translating everything again.
--tm PATHTranslation memory file, kaeris-tm.json next to the source by default. It reuses translations by text, so a renamed key or a fresh clone does not pay twice. --no-tm turns it off.
--receipt run.jsonWrites a record of the run: model, plan, languages delivered, characters charged and reused. Counts only, no strings.

Files: .json .yml .yaml .strings .xcstrings .po .arb .xml .csv .xliff .xlf .properties .resx .ftl .md .mdx. An unknown language code is refused before anything is sent: kaeris languages lists the valid ones. Exit codes of translate: 0 done, 1 error, 3 some languages came back untranslated. Full list: kaeris translate --help.

Guides by format: JSON · YAML · PO · XLIFF · ARB · .strings · .xcstrings · Fluent · .properties · .resx · CSV · Markdown · Android XML

CI recipes (in English): GitHub Actions · GitLab CI · pre-commit · Make and npm scripts