Soft launch Dialecto is still in testing, and details on this site may change as we finish it.

Concepts

Six ideas explain almost everything Dialecto does. Once they click, the rest of the docs are details.

Your repo is the source of truth

Dialecto never becomes the home of your strings. Your translation files (.po/.pot for gettext, JSON message files for JSON projects) stay in your repository; Dialecto holds an editable index of them — a queryable, reviewable working copy built from your scans — and every change flows back as a pull request you merge like any other. If you stop using Dialecto, you lose nothing: the catalog in your repo is current as of your last merged PR.

The surgical slice

A scan carries exactly two things: your translation catalogs (verbatim bytes) and, optionally, the small usage snippets around each gettext call. Not your application code, not your history, not your whole repo. By default the Dialecto GitHub App reads only the translation files; if you block read access, your CI sends them instead. Usage snippets only ever arrive from your CI. They power in-place context (seeing where a string lives while translating) and the call-site rewrite.

Domains

Gettext already organizes strings into domains — default, errors, emails, whatever your app has grown. Dialecto makes that the primary editing structure: browse a domain, translate a domain, and when the naming has drifted, rename keys in batch — each rename carrying its call sites with it. Entries can be added and deleted; the structure your app already has is the structure you edit in.

The minimal diff

Dialecto parses your files but never regenerates them. Edits are byte-precise splices into the original file content: change one translation, and the diff is that one line. Comments (translator comments, extracted comments, references, flags, previous-msgid markers, obsolete entries), ordering, and wrapping all survive untouched. That’s what makes a translation PR reviewable — and it’s the property the merge gate and your reviewers can trust.

The review lifecycle

Changes move through explicit states: staged → submitted → reviewed → approved → batched into a PR. Roles decide who can do what (translators can be scoped to specific locales; see the reference for the full matrix). Comments attach per entry, an attributed activity trail records who did what, revision history lets you step any entry back, and notifications (in-app and email) keep reviewers unblocked.

Two safety nets run underneath:

  • Validation — placeholder parity, plural forms, glossary consistency — flags problems while you type, not after you ship.
  • Stale-base detection — if a new scan changes a string you have a pending edit against, the conflict is surfaced instead of silently merged. Scans are authoritative; your stale edit is flagged, never guessed about.

Branches

Scans carry their branch, so Dialecto knows your base catalog from your feature branches. Feature branches get their own editable catalog view; edits there are branch-scoped and ship as pull requests into that branch, so localization can ride along with the feature instead of trailing it. The merge gate evaluates PRs against this same model — in its default incremental scope, only gaps a PR newly introduces count against it.