CLI

# Commands

What each lingo subcommand does.

## status

Prints, for each target locale, the total key count and how many are translated, missing, or outdated. No credentials, no writes — the read-only snapshot. Add `--json` for a machine-readable form.

## translate

Translates the missing and outdated keys for one or all target locales and merges the results into `config/locales/`. Determines the work from the source-hash state, so unchanged keys are never re-sent.

- `--locale de` limits to one locale.
- `--force` re-translates everything (respecting protected manual edits).
- `--force-key a.b.c` re-translates specific keys.
- `--dry-run` shows the plan without writing.

On success it runs the configured `after_translate` hooks. Requires provider credentials.

## validate

Runs the configured validators and prints the violations. `--strict` and `--strict-all` make it exit non-zero on their respective violation types — this is the CI command. See [Validators](https://locallingo.zoolutions.llc/docs/validators) for the checks and [Continuous integration](https://locallingo.zoolutions.llc/docs/ci) for wiring.

## quality / fix-quality

`quality` lints a locale's text (defaults to the source locale) with the static rules, terminology list, and — with `--ai` — an LLM review pass. `fix-quality` rewrites the auto-fixable suggestions (universal fixes and British spellings) back into the locale files, preserving case; add `--dry-run` to preview. See [Quality linting](https://locallingo.zoolutions.llc/docs/quality).

## accept-edits

When the `manual_edits` validator is enabled, `accept-edits` records the current target values as intentional so they are protected from being overwritten by the next `translate` and no longer flagged as hand-edited. See [Drift & state](https://locallingo.zoolutions.llc/docs/drift-state).

## sync

Rebuilds the `.i18n-state/` drift state from the current locale files — for initial setup on an existing app, or after manual edits, so `validate` doesn't report spurious "outdated" keys.

## hash

Prints a single CRC32 fingerprint of the current source translations — handy as a cache key (e.g. to skip a translate step in CI when the source hasn't changed). `--json` wraps it in an object.