langsync: zsh

One source file. Every language in sync.

Fills missing keys, re-translates edited ones and keeps ICU plurals intact.

% curl -sSL langsync.nevil.dev | bash

nevil@macbook ~ % langsync --features

Features

Only what changed
A snapshot of every source string tells new keys from edited ones. Translations you did not touch stay as they are.
ICU plurals stay valid
Only the words inside plural and select branches go to the translator. Each rebuilt message is parsed before it is written.
Repairs broken strings
A target with broken ICU, often left by an older tool, is re-translated in place on the next run.
Batched and parallel
Keys go out in batches and locales run side by side. When the API pushes back, it slows down and retries.
Placeholders untouched
{name}, <b> tags and the brand names you whitelist come back exactly as they went in.
Errors with the fix
Every error and warning ends with the command that fixes it, ready to paste.

nevil@macbook ~ % open screenshots/

Screenshots

langsync output: a settings summary, a table showing de, es and fr all done, and Translated: 32, Failed: 0
First run: 32 keys across three locales, from one English file.

nevil@macbook ~ % langsync --install

Install

Install

# macOS and Linux, via pipx
curl -sSL langsync.nevil.dev | bash
# or by hand, anywhere Python 3 runs
pipx install git+https://github.com/dracu-lah/langsync-cli.git

Point it at your source

# langsync.json, in your project root
{ "source": "messages/en.json", "dir": "messages" }

Run it

langsync                 # sync every locale in dir
langsync --dry-run       # show what would change
langsync -l fr,de        # only these locales
langsync --prune         # drop keys the source removed
langsync --check         # exit 1 on drift, for CI

Add an empty {} file per language, like messages/fr.json, and LangSync fills it. The README covers every flag and config key.

nevil@macbook ~ % langsync --support

Free, MIT licensed, made by one person.

If it saves you an afternoon of copy and paste, a sponsor or a coffee keeps it going.

nevil@macbook ~ %