Review a locale’s submissions in minutes, not evenings.

polyglots
    ▜     ▜   ▗                                                                     polyglots 0.28.0
▛▌▛▌▐ ▌▌▛▌▐ ▛▌▜▘▛▘                                                                     review claude
▙▌▙▌▐▖▙▌▙▌▐▖▙▌▐▖▄▌                           setup 4/5 ✓ locale ✓ provider ✓ keys ✓ glossary ✗ rules
▌     ▄▌▄▌

 ╭───────────────────────────────────────────────╮ ╭───────────────────────────────────────────────╮
 │ [✓] › r Review a submitted .po                │ │ a→b   t Translate a .po file                  │
 │       Rules plus your review agent            │ │       Draft with memory, glossary and MT      │
 ╰───────────────────────────────────────────────╯ ╰───────────────────────────────────────────────╯
 ╭───────────────────────────────────────────────╮ ╭───────────────────────────────────────────────╮
 │ ↓wp   f Fetch from translate.wordpress.org    │ │ ▁▃▅   s Review statistics                     │
 │       Waiting strings, by project             │ │       Open the stats page locally             │
 ╰───────────────────────────────────────────────╯ ╰───────────────────────────────────────────────╯
 ╭───────────────────────────────────────────────╮ ╭───────────────────────────────────────────────╮
 │ { }   o Tools                                 │ │ [≡]   c Configuration                         │
 │       Split, import and export TM             │ │       Glossary, rules, agents, keys           │
 ╰───────────────────────────────────────────────╯ ╰───────────────────────────────────────────────╯
 ╭───────────────────────────────────────────────╮ ╭───────────────────────────────────────────────╮
 │ (?)   h Help                                  │ │ (i)   a About                                 │
 │       Every key, every screen                 │ │       Version, paths and links                │
 ╰───────────────────────────────────────────────╯ ╰───────────────────────────────────────────────╯


←↑↓→ move  enter open  tab setup  p provider  ? help  ^K go to  q quit

polyglots is an app for WordPress locale teams. Pick a contributor’s .po file and it checks every string against your glossary and the translations your team already approved, repairs what it can, and hands you back only the entries that still need you, with a message ready for the contributor.

Install with
npm install -g polyglots
npx polyglots

Needs Node.js 24 or later. npx runs it without installing.

Then type polyglots and press enter. The app opens in your terminal window, and a setup wizard walks you through the first run.

Get started Tour the app

The app

Arrow keys and enter, and every key on screen

You do not need to know the command line. Run polyglots with nothing after it and you get the screen above: a card for each job, your setup at the top, and the keys for the screen you are on at the bottom. Each screen shown here is the app itself, rendered from its source when this page was built.

  • Pick a file, not a command

    Review and Translate open on a list of the .po files in your folder, newest first, with how many strings each holds. Choose one, check the options, start.

  • Set up once, in five steps

    Your locale, which AI agent reviews, drafting keys, the glossary from translate.wordpress.org, and your locale’s rules. Skip any step; the header shows what is left, and the wizard is always under Configuration.

  • Watch it work, stop when you like

    A run shows its progress, the time left and the last entries it decided. p pauses, q stops, and nothing already reviewed is lost: start it again and it carries on.

  • Help is one key away

    ? explains the screen you are on, ctrl+k jumps to any other, esc goes back. The full tour

polyglots · first run
    ▜     ▜   ▗                                                                     polyglots 0.28.0
▛▌▛▌▐ ▌▌▛▌▐ ▛▌▜▘▛▘                                                                     review claude
▙▌▙▌▐▖▙▌▙▌▐▖▙▌▐▖▄▌                           setup 1/5 ✗ locale ✓ provider ✗ keys ✗ glossary ✗ rules
▌     ▄▌▄▌

Setup · Step 1 of 5 · Locale  (locale needs doing)
esc skips a step · the wizard stays under Configuration › Setup wizard

The locale you translate into, as translate.wordpress.org names it.
Search: nl 
› nl nl_NL
  nl-be nl_BE
  nl/formal nl_NL_formal










enter choose and continue  esc skip this step  ? help

On the command line

The same work as commands, for scripts and automation

Every screen in the app has a command behind it. Use them to run a week’s fetch and review in one line, from a scheduled job, or from an AI agent. Each output below is the CLI’s own, rendered from its source when this page was built.

  1. 1 · Fetch

    Pull the work from translate.wordpress.org

    Name the projects, as slugs or URLs. polyglots finds each one, downloads what is waiting for review or still untranslated, and runs the next step on every file. A project with nothing waiting is skipped, not failed.

    polyglots fetch --get waiting …

    fetch
    $ polyglots fetch --get waiting --out-dir ~/Downloads/polyglots lunar-forms harbor quiet-gallery
    ! No locale rules for nl; only the universal checks run. Add some with: polyglots rules edit nl
    Checking 3 projects on translate.wordpress.org...
      lunar-forms    plugin stable, 286 waiting
      harbor         theme, 41 waiting
      quiet-gallery  nothing waiting
    Downloading 2 exports to ~/Downloads/polyglots...
    Started lunar-forms
    [1/2] lunar-forms: done
    Started harbor
    [2/2] harbor: done
    
      lunar-forms    done     286 reviewed, 22 flagged, 21 repaired, wrote wp-plugins-lunar-forms-stable-nl-repaired.po
      harbor         done     41 reviewed, 0 flagged, 0 repaired
      quiet-gallery  skipped  nothing waiting
    
    Message for the requester (lunar-forms):
    I fixed 21 entries, which you can see <a href="https://translate.wordpress.org/projects/wp-plugins/lunar-forms/stable/nl/default/?filters[translated]=yes&filters[status]=current_or_waiting_or_fuzzy_or_untranslated&filters[user_login]=your-wporg-name">here</a>. They included ~10 glossary inconsistencies and ~10 meaning and fluency problems, plus a few smaller ones.
    
    ╭─ ✓ Fetched ───╮
    │  done     2   │
    │  failed   0   │
    │  skipped  1   │
    ╰───────────────╯
  2. 2 · Translate

    Draft what nobody has translated

    Your translation memory answers first. DeepL, OpenAI or a model on your machine drafts the rest, and an AI agent reviews every draft against the glossary, marking fuzzy the ones a person should check.

    Translating

    translate
    $ polyglots translate wp-themes-harbor-pt-br.po
    ! No locale rules for pt-br; only the universal checks run. Add some with: polyglots rules edit pt-br
    polyglots translate  wp-themes-harbor-pt-br.po
      locale  pt-br
      draft   deepl
      review  claude
    Translating wp-themes-harbor-pt-br.po: 74 of 318 entries selected
    batch 1/3 drafting…
    batch 1/3 reviewing…
    batch 2/3 drafting…
    batch 2/3 reviewing…
    batch 3/3 drafting…
    batch 3/3 reviewing…
    ╭─ ✓ Done ──────────────────────────────╮
    │  translated  62                       │
    │  from TM     12                       │
    │  fuzzy        5  check before upload  │
    │  skipped      0                       │
    ╰───────────────────────────────────────╯
    › Open wp-themes-harbor-pt-br.po in your .po editor to review.
  3. 3 · Review

    Judge a submission, and fix it

    Rules decide the hard failures, the memory settles what it already knows, and the agent judges the rest and writes a fix for what it rejects. Every fix is checked by the rules again before it is kept. You get the flagged entries, repaired, and the reply to post on the PTE request, filled in from your locale’s template.

    Reviewing submissions · Reply templates

    review
    $ polyglots review wp-plugins-lunar-forms-stable-de.po
    ! No locale rules for de; only the universal checks run. Add some with: polyglots rules edit de
    polyglots review  wp-plugins-lunar-forms-stable-de.po
      locale  de
      review  claude
    Reviewing wp-plugins-lunar-forms-stable-de.po: 286 of 412 entries submitted
    Settled from memory, not sent to the model: 38 approved, 4 repaired.
    ╭─ ✓ Reviewed ─────────────────────────╮
    │  reviewed    286  126 not submitted  │
    │  flagged      22                     │
    │  approvable  264                     │
    │  repaired     21  2 left for you     │
    ╰──────────────────────────────────────╯
    
    Message for the requester:
    I fixed 21 entries, which you can see <a href="https://translate.wordpress.org/projects/wp-plugins/lunar-forms/stable/de/default/?filters[translated]=yes&filters[status]=current_or_waiting_or_fuzzy_or_untranslated&filters[user_login]=your-wporg-name">here</a>. They included ~10 glossary inconsistencies and ~10 meaning and fluency problems, plus a few smaller ones.
    
    › Wrote wp-plugins-lunar-forms-stable-de-repaired.po
  4. 4 · Stats

    See what you reviewed

    Every run is recorded on your machine. polyglots stats summarises it in the terminal and writes a self-contained page you can keep or share: throughput by week, what gets flagged, which projects take the time.

    stats
    $ polyglots stats
    ╭─ • Statistics ────────────────────────────────╮
    │  submissions        148                       │
    │  entries         21,734                       │
    │  flagged          2,391  11%                  │
    │  weekly          ▁▂▂▃▅▃▆▅▄▇▆█  last 12 weeks  │
    │  translate runs      37                       │
    │  drafted          4,912                       │
    ╰───────────────────────────────────────────────╯
    
    Top projects
      lunar-forms    2,870 entries  12% flagged
      harbor         1,402 entries   7% flagged
      quiet-gallery    966 entries  16% flagged
      2 unfinished reviews are left out of the totals.
    › Serving http://127.0.0.1:52817/k3v9q2/
      Opened in your browser. Ctrl+C to stop.
    ✓ Stopped

What it checks

Rules where rules work, judgement where they don’t

The things that break a site

Dropped or invented placeholders, HTML that no longer matches, the wrong number of plural forms, escaped quotes, line breaks, settings the code reads such as ltr. Decided by rules, never by a guess.

Your glossary and your memory

Every string is checked against your locale’s glossary from translate.wordpress.org and the translations your team already approved. A string the memory knows word for word is settled without asking a model.

Your language’s conventions

Title case, apostrophes, ampersands and number formats only matter in some languages, so they run where a locale’s rules turn them on. Turkish ships a maintained pack and Swedish a starting one; any team can write its own, with its common mistakes. Locale rules

An agent for the rest

Meaning, fluency and the soft findings go to an AI agent with the rule hints in hand and three lookups: the glossary, your memory and translate.wordpress.org’s consistency data. Claude gets those and nothing else, no shell and no files; Antigravity is held to them by its own settings. It decides, and repairs what it rejects.

Prefer no AI? Choose No AI in setup: every mechanical check still runs, on your machine, with nothing sent to a model. What the rules catch, and what they cannot

Engines and providers

What runs, and what it costs

polyglots calls no model API of its own for reviews. It drives an agent CLI you already use, under that agent’s account.

Used forOptionCost
ReviewingClaude Code (default)Your Claude plan’s usage, or API billing if the CLI is signed in with a key.
ReviewingAntigravity CLI setupYour Antigravity account’s usage.
DraftingDeepL (default)Free within DeepL API Free’s allowance (one-time for new accounts); metered on a paid plan.
DraftingOpenAIMetered per token.
Drafting, experimental reviewingLocal models: Ollama, LM Studio, llama.cpp, vLLM setupFree; runs on your machine.
Rules-only reviewNo AI, chosen in setup, or review --no-ai what it checksFree; no model at all.

Your data

Two files on your machine, and nothing uploaded to GlotPress

The translation memory and glossary live in polyglots.db; run history and caches in jobs.db. Both sit under ~/.local/share/polyglots. polyglots downloads from translate.wordpress.org and never uploads to it: what goes back to GlotPress is your decision, made in GlotPress.

What does leave the machine:

  • Reviewing sends each batch of strings, with its glossary terms and memory matches, to the agent you review with and its model provider (Anthropic for Claude, Google for Antigravity).
  • Drafting sends source strings to DeepL or OpenAI.
  • Lookups query translate.wordpress.org for the glossary, exports and consistency data.
  • Usage totals, only if you turn them on: a weekly count of strings reviewed, drafted and repaired, with no names, strings or locale. What is sent

Only with a local model for both drafting and reviewing, or with No AI, do the strings stay on your machine. Claude is held to polyglots’ three lookups on every run and cannot open files or run commands; Antigravity’s limits come from its own settings and any other tool servers registered with it.

Help translate polyglots

The stats page speaks your language too

The page polyglots stats writes ships in English and Turkish. Its strings are an ordinary gettext template: translate stats.pot in any .po editor and send the .po as a pull request, or attach it to an issue. A locale rules pack for your language is just as welcome.

Install and docs

Start with one file

Install with
npm install -g polyglots
npx polyglots

Needs Node.js 24 or later. npx runs it without installing.

Roughly, across the installs that share their totals: about 53,000 strings reviewed, 16,000 repaired and 2,300 drafted. How this is counted

Version 0.28.0. Driving polyglots from an agent? Point it at ada.tools/polyglots/ai.