[For engineers]

i18n that lives in your terminal.

Detect untranslated strings, wrap them, and translate them from the command line. No SaaS dashboard to babysit, no copy-paste into Google Translate, no broken builds from a missing key.

$curl -fsSL https://getpolyglot.ai/install.sh | bash

Free to start · no account required · no credit card

polyglot — zsh
$ polyglot scan
✓ Found 43 string(s) across 6 file(s)
$ polyglot wrap
✓ Wrapped 43 string(s) in 6 file(s)
$ polyglot translate --languages de,fr,ja
de: 43 translations
fr: 43 translations
ja: 43 translations
Done! 129 strings translated across 3 languages.
$ polyglot preview --lang de
Preview ready at http://localhost:3000
[01]Workflow

Four commands, start to shipped.

Polyglot fits the workflow you already have — your editor, your repo, your CI. Run it locally or in a pipeline; the output is plain JSON your runtime library already reads.

01

Scan

$ polyglot scan

Tree-sitter parses your actual source — JSX, attributes, template literals — and finds hardcoded strings. Not a regex; an AST walk.

02

Wrap

$ polyglot wrap

Rewrites string literals into t() calls and adds the imports, with a --dry-run to preview the diff before it touches a file.

03

Translate

$ polyglot translate

Sends new strings to the translation API with component context and your glossary. Translation memory means you never pay to translate the same string twice.

04

Preview

$ polyglot preview

Spins up your app with translations injected so you catch truncation, layout breaks, and RTL issues before they ship.

[02]Detection engine

It reads your code, not a spreadsheet.

Most i18n tools manage strings after you've already extracted them — finding what needs translating is left to you. Polyglot parses your source with tree-sitter and finds the strings a grep would miss and the ones it would wrongly flag: it knows a className isn't user-facing and a button's text is.

Understands JSX, attributes, and template literals — an AST walk, not a regex
Framework-aware: Next.js, Astro, SvelteKit, Vue, Angular, React Native, and Flutter
Skips URLs, CSS classes, enum keys, and code identifiers automatically
AST · src/components/hero.tsxtree-sitter
Body 2ms
Section 1ms
Header 1ms
H1"Get started"<span/> translatable
Nav⊘ skip · styles
Main 1ms
H2"Pricing"<span/> translatable
Div⊘ skip · aria
Button"Get started today"<span/> translatable
3 translatable
2 skipped
[03]CI / CD

Translations gated like any other check.

Add the open Polyglot Action for a differential check you configure in your repo, or use Polyglot Automation (early access) for native GitHub Checks and shared policy. Establish the baseline once and every run afterward separates new findings from the debt you already had. Policies that block a merge are in early access.

Differential results separate new, existing, and resolved findings
polyglot validate catches interpolation mismatches and length blowouts
Git hook blocks the commit locally before it ever reaches CI

# .github/workflows/i18n.yml

- uses: polyglot-i18n/polyglot-action@v1

with:

check-mode: differential

✗ 2 new untranslated strings in this PR:

src/checkout.tsx:44 "Pay now"

src/checkout.tsx:51 "Order total"

Check failed — wrap them or mark them as ignored.

[04]By the numbers

Built for engineers who'd rather not think about i18n

$0

Local scan, wrap & preview

no account needed

7

Frameworks detected

Next, Astro, Svelte, Vue, Angular, RN, Flutter

0

Dashboard visits for local work

none required

<1s

Incremental scans

content-hash cached

[05]The difference

The manual way vs. the Polyglot way.

Same outcome. One of them eats a sprint.

Doing i18n by hand

Hunt for hardcoded strings by eye and grep
Wrap every string in t() and wire up imports manually
Paste strings into a translation tool and copy results back
Discover missing translations after they ship

With Polyglot

AST scan finds them, including the ones grep can't
polyglot wrap rewrites them with a previewable diff
polyglot translate writes locale files directly
Differential CI surfaces the gap during pull-request review
[06] Questions

Engineer questions, answered

Only when you run polyglot wrap, and only after you've seen the diff with --dry-run. It rewrites string literals into t() calls and adds the necessary imports — nothing else. Detection (scan) and translation are read-only with respect to your components; they write to locale JSON files, not your code.

[07]Pricing

Pricing that grows with you.

Start with the CLI and open GitHub Action on any plan. Team adds managed checks, catalog sync, and verified translation PRs.

MonthlyAnnualSave up to 20%

Pro

For individual developers

$39/month
billed annually
Get started today
10,000 strings
5 languages
Unlimited characters
Glossary overrides
Async translation
Email support

Team

Best value

For growing teams

$119/month
billed annually
Get started today

Polyglot Automation is in early access. Setup and availability

25,000 strings
15 languages
3M characters/mo
5 developer/admin seats
Reviewers free — invite as many as you want
Polyglot Automation — native checks, catalog sync & translation PRs
Review workflow & team roles
Shared glossaries
Email support

Scale

For large projects

$449/month
billed annually
Get started today

Polyglot Automation is in early access. Setup and availability

Everything in Team, including Polyglot Automation
Unlimited strings
Unlimited languages
25M characters/mo
15 developer/admin seats
Priority support
Audit log

Free

$0

Try it out — no card, no commitment.

500 strings2 languagesUnlimited charactersUnlimited detectionOr try 50 strings without an accountLocal checks + open GitHub Action

Start in your terminal

Localize your first screen this afternoon.

Your first 50 translations are free, no account required. Install the CLI and run a scan against your own code. A free account takes you to 500 strings; when a real migration outgrows that, Pro covers 10,000 — self-serve, no sales call.

$curl -fsSL https://getpolyglot.ai/install.sh | bash
Polyglot for Engineers — The i18n CLI built for your workflow | Polyglot