Translate only what changed.

verbatra is a CLI and SDK that keeps your i18n locale files in sync. You maintain the source locale; it fills every other locale through the AI provider you choose.

npm i -D @verbatra/cli
  • Latest published @verbatra/cli version on npm
  • Latest published @verbatra/sdk version on npm
  • Continuous integration build status
  • Test coverage reported on Codecov
  • Monthly npm downloads
  • Released under the MIT license
~/acme-shop

An example verbatra command-line session.

  1. verbatra init
    • ✓ created verbatra.config.ts
    • source en · targets de, es, fr
    • provider gemini · key from GEMINI_API_KEY
  2. verbatra translate
    • diff en.json · 12 new · 0 changed · 108 unchanged
    • de 12 translated · 108 unchanged · 0 withheld
    • es 12 translated · 108 unchanged · 0 withheld
    • fr 12 translated · 108 unchanged · 0 withheld
    • ✓ 36 keys translated in 5.4s · 0 skipped · lock updated
  3. verbatra diff
    • en.json · 120 keys · source of truth
    • de 2 new · 1 changed · 117 up to date
    • es 0 new · 0 changed · 120 up to date
    • fr 5 new · 0 changed · 115 up to date
    • 8 keys would be sent · run verbatra translate to apply
  4. verbatra watch
    • watching en.json for changes
    • en.json changed · 1 new key
    • de 1 translated · 0 withheld
    • es 1 translated · 0 withheld
    • fr 1 translated · 0 withheld
    • ✓ 3 keys translated · waiting for changes

One tool for the whole translation loop.

verbatra is more than AI translation. It covers machine translation you control, a clean Excel handoff for human translators, and the automation to keep every locale in sync.

AI translation

Translate only what changed through your choice of provider: Anthropic, OpenAI, Gemini, DeepL, Google Cloud Translation, or any OpenAI-compatible server you run yourself. A committed lock file keeps every run incremental, and placeholder and ICU integrity is checked before anything is written.

Excel handoff

Run verbatra export to produce a styled .xlsx workbook, hand it to a translation office or in-house translators, then verbatra import reads their edits back into your locale files. Mix machine translation with professional human work.

Automation

Keep every locale in sync as you work: verbatra watch translates on change, CI-friendly exit codes and --json output slot into any pipeline, and a GitHub Action runs it in your workflow.

One tool, every framework.

verbatra reads the locale files your stack already uses: JSON for i18next, vue-i18n, next-intl, and ngx-translate, plus XLIFF, YAML, Flutter ARB, Java/Spring .properties, Apple .strings and Xcode String Catalogs, Android strings.xml, and gettext .po/.pot files. It fills them through the provider you choose, no new format to adopt.

  • Frameworks and formats:
  • React
  • Next.js
  • Vue
  • Nuxt
  • Angular
  • Node.js
  • SvelteKit
  • Astro
  • React Native
  • Flutter

Translate through the model you trust.

Anthropic, OpenAI, Gemini, DeepL, Google Cloud Translation, or any OpenAI-compatible server you host yourself. Pick one in a single line of config and switch providers without touching your locale files.

  • Translation providers:
  • Anthropic
  • OpenAI
  • Gemini
  • DeepL

A run is a short, predictable pipeline.

No magic, no background sync: a deterministic sequence you can read top to bottom.

  1. 01

    Configure

    Point verbatra at your source locale, list the target languages, and pick a provider. Configuration lives in one file; API keys stay in your environment.

  2. 02

    Diff

    Each run compares your source locale against the committed lock file and sorts every key into new, changed, unchanged, or orphaned. Orphaned keys, the ones no longer in your source, are reported and left in place: nothing is removed from your locale files unless you opt in with --prune.

  3. 03

    Translate

    Only the new and changed keys are sent to your provider, in batches, with your glossary and tone applied. Everything else is left untouched.

  4. 04

    Verify & write

    Placeholder and ICU integrity are checked on every result. Anything that breaks is withheld; the rest is written to your locale files and the lock is updated.

Watch the whole translation state, locally.

Verbatra Studio is a local dashboard over your project. It shows every locale's coverage live, lists the translations a run flagged as worth a second look, and lets you fix them in place. Editing needs no API key and never calls a provider.

Verbatra Studio
The Verbatra Studio Translations page: four summary tiles for keys needing attention, average coverage, locales in sync and last-run token usage, above a grid marking each key as missing or in sync per locale, and a per-locale coverage table.
Studio ships in light and dark. Switch the screenshot to compare.
Review translations in Studio

Built for teams that ship in many languages.

Every choice favors predictability: small diffs, explicit config, and nothing written that was not verified first.

Incremental by default

A committed lock file records what was translated. Each run diffs the source and calls the provider only for the keys that changed.

Your choice of provider

Anthropic, OpenAI, Gemini, DeepL, Google Cloud Translation, or a local OpenAI-compatible model, chosen in one line of config. Switch providers without touching your locale files.

Safe by construction

Placeholder and ICU integrity are checked after every translation. A result that breaks a placeholder is withheld, never written.

Keys stay in your environment

Provider API keys are read from environment variables, never from the config file, never from CLI arguments, and never logged.

CLI and SDK, one engine

The verbatra command and @verbatra/sdk share a single orchestration core, so scripts, CI, and your own tooling behave identically.

Dry runs and watch mode

Preview exactly what a run would change without writing anything, or keep a watch running that translates as your source locale evolves.

Frequently asked questions

Short, direct answers to the questions teams ask before adopting verbatra.

JSON for i18next, vue-i18n, next-intl, and ngx-translate, plus XLIFF, YAML, Flutter ARB, Java/Spring .properties, Apple .strings and Xcode String Catalogs, Android strings.xml, and gettext .po/.pot files. That covers React, Next.js, Vue, Nuxt, Angular, SvelteKit, Astro, Node.js, Spring, Flutter, iOS, macOS, Android, and any gettext-based stack. verbatra reads the files you already have; there is no verbatra-specific format to migrate to.

It keeps a committed lock file that records what was already translated. Each run diffs your source locale against that lock and sends only the new or changed keys to your provider. Unchanged keys are never touched, so a typical run costs a handful of strings, not your whole catalog.

Six, behind one interface: Anthropic, OpenAI, and Gemini (LLMs), DeepL and Google Cloud Translation (machine translation), and openai-compatible, which points verbatra at a local or self-hosted server like Ollama, LM Studio, or vLLM. You pick one by id in your config and can switch later by editing that one line. Gemini has a real free tier, and a local model costs nothing per call.

Every result passes a placeholder and ICU integrity check before it is written. A translation that drops, invents, or reorders a placeholder, or produces invalid ICU message syntax, is withheld rather than saved to your locale file. The same gate applies to edits and retranslations made in Verbatra Studio.

verbatra itself is free and open source under the MIT license. The only cost is your provider's usage, which you control: it translates only what changed, and you can run it for free on Gemini's free tier or a local OpenAI-compatible model.

Stop hand-syncing locale files.

Add verbatra, commit the lock file, and let every run touch only what changed.