gettext · .po catalogs · 60+ languages & dialects

Translate your .po catalogs in minutes, structure intact.

Placeholders, plural forms, msgctxt and inline tags survive the round trip. You see the cost before anything runs. Output comes back shaped like your repo, valid gettext, ready to merge.

First month’s standing charge is on us. After that you add funds and pay per word for what you translate, nothing to pay to explore, and no free translations we’d have to claw back.
real output · en → de · zh-Hans · ru · ar
locale/de/LC_MESSAGES/messages.pointegrity check passed
source · en#: src/inbox/list.tsx:142msgctxt "inbox.badge"msgid "Hi %1$s, you have %2$d new <b>unread</b> messages"#: src/billing/receipt.tsx:88msgid "Use code {{code}} before %(date)s"
translation · placeholders preservedHallo %1$s, du hast %2$d neue <b>ungelesene</b> Nachrichten你好 %1$s,你有 %2$d 条新的未读消息Привет, %1$s! У вас %2$d новых сообщенийمرحبًا %1$s، لديك %2$d رسائل جديدة
msgctxt kept{{code}}%(date)snested <b><i>
entries0
words~7,400
est. cost · draft · illustrative~$0.69
shown before you runYou approve the estimate. Jobs pause rather than overspend.
Valid gettext out, compiles with msgfmtPlural headers read, not guessed, Arabic 6, Polish 3Scoped, revocable API keys · signed webhooksCost preview before every job · prepaid balance
two ways in · one product

Drop a folder, or POST a job.

The same engine, the same catalogs, the same audit trail. Pick the surface that matches how you work.

for localization teams

See the cost, watch it run, review the misses.

  1. 01Drop .po files or a whole locale folder, targets read from each header.
  2. 02Pick quality (Draft, Standard or Pro) and see entries, words and cost before you commit.
  3. 03Watch it run chunk by chunk, per locale.
  4. 04Review flagged entries, re-run just those, download a repo-shaped zip.
11 filesComplete
en → pl, it, pt-PT, ar, pt-BR, de, fr, es +3550/550 entries · 10/10 chunks
for developers

Localization as a pipeline step.

A scoped key, one POST, a signed webhook when it’s done. Pull the catalogs in CI and open the PR.

POST /v1/jobs
curl -X POST https://api.echo-lingua.com/v1/jobs \
  -H "Authorization: Bearer $ECHO_LINGUA_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "sourceLanguage": "en",
    "contextMode": "ui-label",
    "quality": "standard",
    "inputs": [
      { "filename": "de/messages.po", "targetLanguage": "de", "content": "…" },
      { "filename": "ar/messages.po", "targetLanguage": "ar", "content": "…" }
    ]
  }'
webhook · job.completed (signed)
{
  "id": "whd_3f9c8a",
  "type": "job.completed",
  "createdAt": 1726669123456,
  "data": {
    "jobId": "job_8f2c41",
    "status": "COMPLETE",
    "downloadUrl": "/v1/jobs/job_8f2c41/download"
  }
}
what you get

Six things a script won’t do for you.

Structure-preserving

Placeholders, plurals, msgctxt and HTML survive the round trip, every entry checked, not hoped for.

%1$s · {{code}} · %(date)s · <b><i>

Cost you see first

Entries, words and estimated cost before submit. Prepaid balance, drawn down as jobs run. Group caps block new jobs instead of surprising you.

550 entries · ~7,400 words · ~$0.69 draft (illustrative)

Context-aware

UI label, marketing or docs mode, plus a glossary whose terms come through verbatim, and per-entry rationale when you need to ask why.

quality=draft · standard · pro

Review & recover

Entries that fail the integrity check are flagged in the catalog, never shipped silently. Re-run just the misses.

#, el-review

Developer-native

A real HTTP API: scoped keys you can revoke, signed webhooks, per-key spend attribution, CI-ready downloads.

POST /v1/jobs → job.completed

Drops into your repo

Output mirrors your input tree, one file per locale, valid gettext. Unzip over locale/ and read the diff.

locale/ar/LC_MESSAGES/messages.po
coverage

Sixty-plus languages, and the dialects that matter.

Translation is model-driven, so any BCP-47 locale in a PO header is accepted. These are the languages we officially support and have validated, including regional variants most tools flatten into one.

AfrikaansafArabicRTLarBasqueeuBengalibnBulgarianbgCantoneseyueCatalancaChinese (Simplified)zh-HansChinese (Traditional)zh-HantCroatianhrCzechcsDanishdaDutchnlEnglishenEnglish (Australia)en-AUEnglish (Canada)en-CAEnglish (UK)en-GBEnglish (US)en-USEstonianetFilipinofilFinnishfiFrenchfrFrench (Canada)fr-CAGermandeGreekelGujaratiguHebrewRTLheHindihiHungarianhuIcelandicisIndonesianidIrishgaItalianitJapanesejaKazakhkkKoreankoLatvianlvLithuanianltMalaymsMaltesemtNepalineNorwegian BokmålnbNorwegian NynorsknnPersianRTLfaPolishplPortugueseptPortuguese (Brazil)pt-BRPortuguese (Portugal)pt-PTRomanianroRussianruSerbiansrSlovakskSlovenianslSpanishesSpanish (Latin America)es-419Spanish (Spain)es-ESSwahiliswSwedishsvTamiltaThaithTurkishtrUkrainianukUrduRTLurVietnameseviWelshcy
In preview, quality not yet validated
AmharicamBurmesemyKhmerkmLaoloSinhalasiZuluzu
65 officially supported · 6 in preview · any BCP-47 locale accepted

Dialects

pt-BR vs pt-PT, es-ES vs es-419, en-GB/US/AU/CA, fr vs fr-CA, zh-Hans vs zh-Hant, Norwegian Bokmål vs Nynorsk, same source, correctly different output (vocabulary and plural rules).

Right-to-left

Arabic, Hebrew, Persian and Urdu render right-to-left, with the layout correctly mirrored.

Plurals

Plural forms are read from each locale’s header, not guessed, Arabic 6, Polish 3.

pricing · stated plainly

Your first month’s standing charge is on us.

After that: a flat monthly standing charge, and you pay per word for what you actually translate. Funds are prepaid and drawn down as jobs run, so the bill can’t outrun the balance.

first 30 daysStanding charge waivedA card starts the free month. Nothing to pay to explore the app, run a cost preview, or read the docs.
thenPer word translatedAdd funds, translate, watch the balance draw down. Every job shows its estimate first and you’re billed for actual usage, usually less.
teamsOne balance, owner-billedSpend is attributed per member and per key, with per-group caps. Heavier or regular users can request monthly invoicing instead.
the quiet part

What you’re actually worried about.

“Will it surprise me with a bill?”

Nothing runs before you see the estimate. The balance is prepaid, per-group caps are hard limits, and jobs pause rather than overspend.

“These are production files.”

Output is valid gettext you review before merge. Keys are scoped and revocable, spend is attributed per key, and every job leaves an audit trail.

“We work in CJK and RTL.”

So does this page. Arabic takes six plural forms, Polish three, read from your header, every index filled, laid out right-to-left where it belongs.

Point it at one catalog and see.

Sign up, drop a .po file, read the cost preview. That’s the whole evaluation, no demo call required.

Start freeFirst month’s standing charge waived · then pay per word · cancel any time