Retranslation

Max PrilutskiyCEO & Co-FounderUpdated 21 days ago · 3 min read

lingo push only translates what changed: it hashes each source against the lockfile and skips anything that matches. That's the right default, but sometimes you want to retranslate content whose source text is identical — after switching the engine's model, updating its rules or glossary, or fixing a quality issue.

There are three ways to do that, and they differ in how much you pay: --key for individual strings, a scoped --force push for whole files, or purge followed by a normal push for a whole locale. Reach for the narrowest one that covers what you want to redo.

Retranslate specific keys#

--key re-translates only the keys you name, merges them into the existing translation, and leaves every other key byte-identical. It ignores the source diff, so a string whose English never changed is still redone.

bash
lingo push --key auth.login

Repeat the flag for several keys:

bash
lingo push --key auth.login --key billing.plan

A pattern claims a key exactly, as a prefix ending on a ., /, - or [ boundary, or as a glob. So auth.login also claims auth.login.title, but never auth.login_url; plain auth claims the whole auth subtree but never authority. Quote globs, or your shell expands them before the CLI sees them:

bash
lingo push --key "auth.*"

This is the cheapest option by a wide margin — you pay for the keys you named and nothing else. It needs an existing translation to merge into, so a locale you have never translated is skipped with a message pointing at --backfill-missing. Some formats can't take a key scope at all — Formats lists which, and why.

See lingo push for the full behavior, including what happens to keys you didn't name.

Force a scoped push#

--force retranslates every matching target, ignoring existing translations and server-side cache. Scope it, unless you really do mean the whole project — bare lingo push --force covers every configured pattern, and the confirmation prompt is all that stands in the way.

One file#

bash
lingo push content/en/landing.mdx --force

A subtree#

bash
lingo push 'content/en/**/*.md' --force

Everything#

bash
lingo push --backfill-missing --force --yes

--force prompts before overwriting; pass --yes to skip the prompt (CI). See lingo push for the full flag reference.

Retranslate a single locale#

push has no per-locale flag. To redo just one language, delete its files and backfill:

bash
lingo purge --locale fr
lingo push --backfill-missing

purge removes the fr targets; --backfill-missing then regenerates only what's missing — the other locales are untouched. This is also cheaper than --force, because everything except fr stays a cache hit. See Purge.

Estimate before you spend#

Any push accepts --estimate, which prices the run and exits without translating:

bash
lingo push 'content/en/**/*.md' --force --estimate

It composes with --key too, so you can price a key scope before running it:

bash
lingo push --key auth.login --estimate

Estimates are heuristic, not a quote — final cost may differ.

When to retranslate#

SituationWhat to run
Source text changedNothing — plain lingo push picks it up
A few strings you're unhappy withlingo push --key auth.login --key billing.plan
Switched the engine's modellingo push <scope> --force
Updated rules / glossarylingo push --key <affected keys>, or lingo push <scope> --force
Poor quality in one localelingo purge --locale <code> then lingo push --backfill-missing
Starting completely freshlingo push --backfill-missing --force --yes