AI-powered translations you can actually ship
Use source code analysis, context enrichment, styleguides and integrated checks to translate your app—so quality holds up in languages you don’t speak. All from the command line.
By Jan Amann
Author of next-intl
Improving translation quality across the web
Static analysis
Catch translation errors early, with eloqnt lint
A broken translation often surfaces only when a user reports it. By analyzing your source code and messages at the AST level, a mismatch breaks the build instead of the page.
Lint your projectsrc/components/DashboardHeader.tsx
import {useExtracted} from 'next-intl';export default function DashboardHeader({user}) {const t = useExtracted();return (<h1>{t('Welcome back, {name}', user)}Every translation now needs this argument</h1>);}
src/components/Nav.tsx
import {useTranslations} from 'next-intl';export default function Nav() {const t = useTranslations('Nav');return (<nav><Link href="/">{t('home')}</Link><Link href="/settings">{t('setings')}</Link>Misspelled, this will fail at runtime</nav>);}
messages/en.json
{"Settings": {"title": "Settings","save": "Save changes","discard": "Discard changes","csvExport": "Export as CSV (deprecated)",No longer referenced in your source code"delete": "Delete account"}}
Source text review
Fix it before it fans out, with eloqnt review
If a term is off in your primary language, it will be off in all your translations too. Source copy is reviewed for spelling, grammar, and styleguide adherence, so errors can be fixed at the source.
Review your messagessrc/components/InviteDialog.tsx
import {useExtracted} from 'next-intl';export default function InviteDialog() {const t = useExtracted();return (<Dialog><h2>{t('Invite to your team space')}</h2>Your styleguide calls this a “workspace”<Button>{t('Send invites')}</Button></Dialog>);}
src/components/InvoiceNotice.tsx
import {useExtracted} from 'next-intl';export default function InvoiceNotice() {const t = useExtracted();return (<Notice><p>{t('You will recieve an invoice by email.')}</p>Misspelling of "recieve"<Button>{t('Got it')}</Button></Notice>);}
src/components/SignOutAlert.tsx
import {useExtracted} from 'next-intl';export default function SignOutAlert() {const t = useExtracted();return (<Alert><p>{t('This signs you out on every device.')}</p><Button>{t('Sign out everywhere')}</Button>Your styleguide suggests Title Case for button labels</Alert>);}
Contextual translations
Translate the meaning, not the word, with eloqnt translate
A word alone is ambiguous. Each string is enriched with how its call site uses it, translated according to your styleguides, and then checked for accuracy and consistency before it lands.
Translate your appsrc/app/products/[slug]/page.tsx
import {useExtracted} from 'next-intl';export default function ProductDetailPage {const t = useExtracted();return (<form action={checkout}><button type="submit">{t('Order')}</button>“Order” is a purchase, not a sort direction</form>);}
src/components/CartSummary.tsx
import {useExtracted} from 'next-intl';export default function CartSummary({count}) {const t = useExtracted();return (<p>{t('{count, plural, one {# item} other {# items}}', {count})}Polish needs four plural forms, per CLDR</p>);}
src/components/MembersHeader.tsx
import {useExtracted} from 'next-intl';export default function MembersHeader() {const t = useExtracted();return (<header><h2>{t('Members')}</h2><Button>{t('Invite to your workspace')}</Button>Your German styleguide translates this as “Arbeitsbereich”</header>);}
Localization outgrowing your repo? Crowdin adds reviews, integrations, collaboration, and more—your strings and context carry right over.
Local first
Hackable, because it’s just files
Config, styleguides and messages live right next to the code they belong to. That gives you versioning, reviews and ownership, and your coding agent can read and edit them like any other file.
Add a styleguide.eloqnt/styleguide.md
# Styleguide## Voice and tone- Friendly and concise.- Address the user as "you".## Glossary- "workspace": where a team keeps its projectsPlain markdown, right in your codebase- "API key": the token that authenticates a project
Your data is yours. Since all files sit right in your repo, our backend is stateless and keeps nothing between runs. If you bring your own model, no message or line of code reaches us at all.
“Agents are only as good as the proof-checkers, compilers, type systems, and linters you give them.”
Guillermo Rauch@rauchgWould you merge unreviewed code? When you tell your agent to “just translate”, it does what it’s told. Whether it has enough context, or not.
But quality needs a gate. And with a guarantee on full context, eloqnt/cli helps to translate with confidence—instead of guesses. For you, and your agent.
feat: Greet the user by namea41c9e2
messages/es.json
Check failure on messages/es.json
Inconsistent ICU arguments: missing {name} from source, unknown {nombre}
Agent is fixing the failing check
Thought for 2s
Read the inconsistent-args docs
cli.eloqnt.dev/docs/lint-rules/inconsistent-args.md
The Spanish translation accidentally renamed {name} to {nombre}.
Retranslated kFvGpR
npx eloqnt translate --id kFvGpR --locale es
No issues found
npx eloqnt lint
Pushed 1 commit
git commit -am "fix: Retranslate kFvGpR" && git push
fix: Retranslate kFvGpR8a1d4b7
- "kFvGpR": "Bienvenido de nuevo, {nombre}",
+ "kFvGpR": "Bienvenido de nuevo, {name}",
Pricing
Translations that hold up—in languages you don’t speak
Lint for free. Translate with our hosted model or bring your own. You can switch between plans or cancel anytime.
Non-AI features
Use AST-level linting to catch broken translations before they ship.
Freeforever
- Check for errors like missing or undefined messages, inconsistent ICU arguments & more
- Fully local, no account needed
- Built-in Crowdin sync
npm i @eloqnt/cli --save-dev
Read the quickstart guide.
Hosted model
Use an eval-proven model provided by us and get started immediately.
$15per month
- Source reviews & context enrichment for translation quality you can ship
- Styleguides for authentic voice, vocabulary & tonality
- Included monthly AI usage for ongoing project work
- Unlimited languages and projects
Nothing is charged until the trial ends, cancel anytime.
Bring your own model
Run the translation pipeline locally, with your own model. Buy once, use forever.
$149one-time
- All features of the hosted version
- Bring your favorite model—anything the AI SDK supports (incl. 3rd-party providers for Claude Code & Codex)
- All future eloqnt/engine pipeline & prompt updates included
- Full control over inference
7-day money-back guarantee
“I’ve been using eloqnt/cli for a while now, and it’s been a game changer for i18n. The translation quality is noticeably better than using Codex or Claude Code directly. It handles context more accurately, and being able to define styleguides as markdown files (similar to skills) is extremely useful.”

Will Ceolin
Founder of Zoonk
Ship your next language today
Every translation starts from your code, follows your styleguide and passes your checks.