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

Never surrender your source code.

Only your translation files ever reach Dialecto, and it changes them one clean line at a time.

Everything else in your repository stays where it is, unread. Every change comes back as a pull request your team reviews.

gettext · JSON · Phoenix first · built in the EU

  • lib/
  • config/
  • .env
checkout.po · french
# Shown when the charge fails.#: lib/shop_web/live/checkout_live.ex:88msgid "We couldn't process your payment."msgstr "Paiement refusé."msgstr "Nous n'avons pas pu traiter votre paiement."

the only line touched

A better way to edit.

Come through to the workshop. Your strings arrive grouped by domain, and each one carries the place it's shown in your app. You work a domain at a time, the checks keep pace with you, and nothing you stage touches anything you didn't.

See the editor

lib/shop_web/live/checkout_live.ex:88

put_flash(socket, :error, gettext("We couldn't process your payment."))

# Shown when the charge fails.

We couldn't process your payment.

Nous n'avons pas pu traiter votre paiement.french · staged
  • Placeholders
  • Plural forms
  • Glossary

What reaches Dialecto, and what never will.

Only your translation files reach Dialecto, and you choose which. Your source code never does. How much access Dialecto gets is your call, down to none at all.

You don't have to take our word for it.

Reaches Dialecto the files you named

  • priv/gettext/**/*.po and nothing else

If your pipeline also sends the few source lines around each string, a rename can follow its call sites. That, too, is your workflow's choice.

Never

  • Source code lib/ · app/ · src/
  • Secrets and environment .env · config/runtime.exs
  • Tests and assets
  • Git history
  • Anything you didn't name

With the GitHub App

Install it, and Dialecto reads the translation files and opens the pull requests itself. GitHub's permission covers the whole repository, so the limit to translation files is enforced by Dialecto's own code.

Or from your own pipeline

Dialecto gets no access to your repository at all. Your CI sends only the files your own workflow names, and opens Dialecto's pull requests. It is the strongest posture, and it's yours to pick.

Checked before it ships.

Placeholders, plural forms, completeness and glossary terms are checked on every change, and a person reviews it before it goes anywhere. The merge gate holds a pull request that would leave new strings untranslated. An advisory quality check scores what the pull request adds, and whether that one blocks is your call.

The merge gate

Localize checkout (fr)acme/storefront · pull request #284

Open
Dialecto/translationsNothing left untranslated
Dialecto/qualityAdvisory · nothing flagged
Reviewed by InésApproved
Placeholders Plural forms Completeness Glossary
#: lib/shop_web/live/checkout_live.ex:88 msgid "We couldn't process your payment." − msgstr "Paiement refusé." + msgstr "Nous n'avons pas pu traiter votre paiement."

One line changed. Comments, order and wrapping stay exactly where they were; the rest of the file does not move.

Your model, with the right context.

We don't sell you a model. Bring your own, local or frontier. Dialecto grounds it in your domain, your glossary, your translation memory and the voice you show it, and nothing a model drafts merges on its own.

How context works
Suggestion · Frenchlocal model · Ollama

Grounded in

  • Domain checkout
  • Glossary 2 terms
  • Translation memory 1 match
  • Voice Acme storefront · formal
  • Your source code
Nous n'avons pas pu traiter votre paiement. "paiement" per glossary · vous, never tu
Needs review

A person approves it before it ships.

Fix it where it's shown.

Open your running Phoenix or Astro app, click any text and edit it in the Dialecto sidebar. Or drive Dialecto from your coding agent over MCP. Either way it lands as the same clean pull request.

The add-ons

Over MCP your coding agent does the same: list · stage · preview · open a pull request.

It speaks your files.

We set the Phoenix table first. Dialecto patches gettext and JSON catalogs in place, and Rails YAML is in beta. Wrapping, comments, plurals and order all survive, because the file is never regenerated.

priv/gettext/fr/LC_MESSAGES/checkout.po gettext
# Shown on the confirmation page.msgid "Your order is on its way."msgstr "Votre commande est en route."

Phoenix firstand any .po or .pot

src/locales/fr.json JSON
"checkout": {  "shipped": "Votre commande est en route."}

Flat, nested, and browser extensionswith the in-context editor for Astro

config/locales/fr.yml YAML
fr:  checkout:    shipped: Votre commande est en route.

Railsbetaconfig/locales, keys and plurals

For Elixir teams

Asked on the veranda.

What reaches Dialecto from my repository?

Only your translation files, and you choose which. Source code, secrets, tests and history never do. With the GitHub App, Dialecto reads those files and opens the pull requests itself, and its own code enforces the limit. From your own pipeline, Dialecto has no access to your repository at all: your CI sends the files and opens the pull requests.

Do I have to migrate anything?

No. Your files stay in your repository, exactly as they are. Dialecto works on them in place and sends each change back as a pull request. Turn it off tomorrow and you've lost nothing.

Which formats and frameworks?

gettext (.po and .pot), JSON in its flat, nested and browser-extension shapes, and Rails YAML, which is in beta. Phoenix is the experience we polished first, and the in-context editor ships for Phoenix and Astro.

Can I bring my own model?

Yes: local or frontier, your call. We never claim the best translation model; we make whichever model you choose good by grounding it in your domain, your glossary and your voice, and every suggestion still goes through review.

How is this different from a translation platform, or from the AI-native command-line tools?

The platforms keep your strings in their database and regenerate your files on the way back. The command-line tools regenerate them too, only faster: we ran two of their published loaders over a valid 104-line gettext file and got back 23 broken lines from one and a silently changed translation from the other. We keep the receipts. Dialecto never regenerates a file; it patches the line you changed and leaves the rest as it found it.

When can I use it, and what does it cost?

We're onboarding the first teams by hand. Ask for early access and tell us your framework, and we'll set a place for you. It's free to start, and priced to be an easy yes when your team grows.

Start with one project.

Sit; the table's set. Install the app or wire up your pipeline, see your strings by domain, and ship the first clean pull request. Decide from there.

Freeone project, the domain editor, clean pull requests
Teamorganizations, review, the merge gate, curated context
Enterpriseself-hosted on your own metal, priority support

Nothing to migrate · no trackers on this site · no client-side JavaScript