Joomla User Group London01

Keeping the translator
in the loop

How Joomla translation learns from every correction.

Krishna Gandhi
Google Summer of Code 2026 · Joomla
18 August 2026

Mentored by Herman Peeren, Stefan Wendhausen and Charvi Mehra, who put the project forward.

The problem00

A general translation tool already does translation, and does it well

Source content item article, category, tag, menu item Translation tool a draft in seconds Translated item in the target language Can be published once a translator has checked it one direction, and no way back
The problem02

It just does not know the words your community agreed on

Joomla has its own vocabulary, and its translators have spent twenty years deciding how it reads in each language.

“Article”English → German
A translation tool givesArtikelThe dictionary answer.
German Joomla usesBeitragSettled by its translators, years ago.
“Template”English → Dutch, French
A translation tool givesSjabloon, modèleHelpfully translated.
Those communities useTemplateDeliberately left in English.
Addressing the readerEnglish → German
A translation tool picksSieThe formal default.
Your site may wantduNothing in the text says which.
The problem03

Translator fixes it, and then the fix is thrown away

Source content item Translation tool Translated item A translator reviews and fixes it Can be published everything the translator knew discarded

The translation is kept. The judgement that produced it is not.

The idea05

My project keeps the correction for future translations, with the translator at the heart of it

The tool drafts a translation A correction The change is kept A rule to reuse 1 2 3 4 Approved, and published what the reader gets The translator
The idea06

Inspired by RLHF, built with RAG

  • Inspired by RLHF, reinforcement learning from human feedback.
  • Corrections become candidate rules, and a human translator approves them.
  • Built with RAG, retrieval augmented generation. Only the rules that fit the next text are fetched and handed to the model with it.

The learning is a by-product of work the translator was doing anyway.

How it is built00

Categories and tags are translated before the article

translated in this order Tags Categories Articles Menu items each one points back at what is already translated 1 2 3 4

The order comes from relations the content types already declare, so nothing is hardcoded

Demo07

Let us watch it learn something

01Translate — everything, on a schedule
02Correct — and the corrections become rules
03Translate something it has never seen

In the queue every cell is one item in one language, so first, what its states mean.

No translation yet
nothing made in that language
Translating
it spins while the call is out
Ready for review
a draft is waiting for a person
Approved
a translator has checked it
Published
put on the site from here
Pending
the English changed, so it comes round again
Live on the site, though it was published elsewhere Published from here, but no longer live
What it does10

A real site has more than two languages

The translation queue on a site with thirteen target languages, each source item a row and each language a column, every cell showing its own state icon.

One row per item, one column per language, one cell you can click

Demo08

All I changed was formal to informal

the tool wrotethe translator wrote
Bevor Sie veröffentlichen→Bevor du veröffentlichst
lesen Sie ihn→lies ihn
Prüfen Sie→Prüfe
Ihre Bilder→deine Bilder
Wenn Sie … gewählt haben→Wenn du … gewählt hast
schauen Sie sich Ihren→schau dir deinen
Wenn Sie zufrieden sind→Wenn du zufrieden bist
veröffentlichen Sie ihn→veröffentliche ihn
What it does13

What else it does

Four content types
Articles, categories, tags and menu items.
No admin access needed
A translator with no administrator access can do the whole job from the front end.
Unattended
Both the translating and the learning run on Joomla's own scheduler.
Edited an original?
Its translations return to the queue, noticed through Joomla's version history.
Updated in place
A re-translation becomes a new version of the existing item, not a second one.
Already translated?
Existing associations are read in, so the queue reflects work done before installing.
Only the rules that matter
Relevant rules are selected before the call, rather than sending everything.
Normalised words
A noun to its singular, a verb to its infinitive. One rule covers them all.
Not everything needs it
Mark an item as needing no translation, on its own edit form, for any of the four types.
Straight to the site
Optionally publish a new translation the moment it is made. Off by default.
Starts in your language
A new item defaults to the source language, so it reaches the queue on its own.
No two people clash
A draft is checked out while it is edited, like any other Joomla content.
Image alt text
Alt text and captions are translated. The image itself is left alone.
Custom fields
Translated beside the core fields, in the same editor.
How it is built07

What is in the package

One component, and five plugins around it.

com_translations queue, editor, rules, drafts, associations plg_content_translations watches your content plg_translation_claude makes the translation call plg_rag_claude distils rules, normalises words plg_task_translationstranslate translates on a schedule plg_task_translationsdistiller distils on a schedule
Where it goes13

The primary goal of this project is Joomla's own documentation, readable in as many languages as possible

guide.joomla.org the official User Guide English only The language packs twenty years of agreed words, already written down A starting set of rules so no community begins empty not built yet

Everything you have just seen works the same way on your own multilingual site

Thank you14

Thank you

Herman reviewed this work throughout, and asked the questions and gave the suggestions that shaped most of it.

The tool drafts a translation A correction The change is kept A rule to reuse The translator
← → to move · F for full screen