Built for Phoenix first.
We built Dialecto's gettext support for Phoenix first, and it's the experience we've polished most. If you localize a Phoenix app, this is for you.
Why it fits
Dialecto is gettext-native — no export step, no format conversion, no
"sync" that rewrites your files. Your gettext domains map
straight onto Dialecto's domain-driven editing, and the validation
matches what your app actually runs: %{} placeholder
parity and plural-form checks that agree with Elixir's
Gettext runtime, so a translation that passes here works
there.
The quickstart
- Connect your repo. The scan runs on your side and
sends a surgical slice — your
.po/.potfiles plus the usage snippets around each string. Nothing else leaves. - Scan. Your catalog appears organized by domain, every string with its context.
- Edit by domain. Fast navigation, bulk operations, review built in.
- Ship a clean pull request — into whichever branch you're working on, one line of diff per change.
The Elixir-specific wins
Your domains, already there
Phoenix apps split translations across gettext domains — default, errors, emails, whatever you've grown. Dialecto reads that structure and makes it the editing model: browse by domain, translate a domain at a time, rearchitect domains when your app outgrows them.
In-place context from your call sites
Every string is shown with the snippet of your code that uses it — the surgical slice the scan captured. Translators see what a string is for; nobody translates blind.
Rename a msgid, fix the code
Renaming a msgid rewrites the gettext() call-sites in your source — computed by Dialecto, applied by a CI action in your repo, shipped in the same pull request. A rename is finally one operation, not a grep-and-pray.
A merge gate on your pull requests
The completeness check fails a pull request on strings it newly leaves untranslated — as a required check, if you want teeth. Configured in your repo's Dialecto settings, with a link that takes the author straight to the strings that need them.
Bring your own model, grounded
Machine-translation suggestions are grounded in your brand voice, your audience personas, your glossary, and the domain each string lives in — whichever model you bring, frontier or local. Dialecto is model-agnostic on purpose: we don't claim "best translation," we make sure your model sees exactly the right context and that a human signs off before anything merges.