Skip to content

Updating Outdated Translations

On this page

Available in LATW AI Translation for Polylang PRO.

#What it does

When you change a post that is already translated, its translations fall behind. On the
Translations screen such a language is marked with a yellow warning icon — Translation is
older than the original — needs updating
— and its box starts ticked. You then decide how to
bring it up to date. The plugin offers three ways:

  • Translate only changed strings (recommended) — the default. Only the parts of the post you
    actually changed are sent to the AI. Everything else keeps the translation it already has.
  • Translate only changed strings, with the whole page as context (best quality, higher cost) —
    the same strings are translated and written, but the AI is also shown the rest of the page and
    the translation already published for it.
  • Re-translate the whole post from scratch — the post is translated again from the first word
    to the last, and the previous translation is replaced.

The setting lives in AI Translation → Settings → Translation → Outdated Translations.

Translating only what changed is usually much cheaper: fixing a typo in one paragraph of a long
article costs one paragraph, not the whole article. It is also faster, and it leaves the rest of
the translation exactly as it is — including any wording you corrected by hand.

This setting only applies to content that is already translated. A post being translated for
the first time is always translated in full, because there is nothing to keep. The Translate
Again
button is also always a full re-translation, whatever the setting says — that is what the
button is for (see How to Translate Again?).

Without an active licence every update is a full re-translation, so an update costs what a first
translation costs.

#Translating with the whole page as context

The two “only changed strings” modes write exactly the same thing: the changed strings, nothing
else. They differ in what the AI is allowed to see while translating them.

In the default mode the AI receives the changed strings alone. A new paragraph added to a long
article arrives with no idea what the article is about, how its terms were translated before, or
whether the page addresses the reader formally or informally. That is what makes an updated page
read as if it were written by two different people: the new paragraph is correct on its own and
does not match the page around it.

With the whole page as context, the job also carries every untouched part of the page — its
source text and the translation currently published for it — marked as reference material the
AI must not translate or return. The AI is told to treat the published translation as approved:
to reuse its terminology, keep its tone and formality, and not to “improve” a word you chose.

This is the mode to pick if you correct translations by hand and want new content to sound like
the corrections rather than like a fresh translation. Your corrections are part of the context
— they are read from the translated post, so the AI is shown your wording, not the wording it
produced originally.

The cost. Every update sends the entire page to the AI on top of the strings being translated,
so an update to a long article is priced closer to a full re-translation than to a delta one —
while still writing only the changed strings, and still protecting everything else. It is
deliberately the expensive option: it exists for sites where translation quality matters more than
the token bill.

The exact shape of that reference material is described in How the Translation Prompt Works.

Machine-translation engines. DeepL, Google Translate and MyMemory translate text instead of
following instructions, so there is no way to give them context. With one of those selected, this
mode behaves exactly like the default one.

#How the plugin decides what changed

Polylang does not remember what was translated, so the plugin keeps its own record: every
finished translation stores the exact text that was sent and the translation that came back. On
the next update it compares the original as it is now with that record:

  • Identical → the existing translation is kept and nothing is sent to the AI.
  • Different, or brand new → it goes to the AI.

A piece of text is recognised by what it says, not by where it sits. Insert a paragraph at the top
of a page and only that paragraph is translated — the paragraphs below it moved, but they did not
change.

What counts as one “string” depends on how the post is built:

Content Compared as
Title, excerpt One string each
Body written in the block editor One string per piece of text in a block — usually one per paragraph or heading, several for blocks that hold more than one (a list, a table, a button and its label)
Body written in the classic editor The whole body as a single string
Elementor One string per text field of a widget
Custom fields (ACF, SEO plugins, …) One string per field; a field holding a list is compared value by value

This is why the block editor and Elementor benefit most: add one paragraph to a long page and only
that paragraph is translated. In the classic editor the body is a single string, so any change to
it — even one word — re-translates the whole body. Title, excerpt and custom fields are still
compared separately, so they are still skipped when untouched.

The record has to exist. Only translations this plugin produced can be updated this way. A
translation written by hand or with another tool, or one whose linked post was deleted or replaced
in Polylang’s language switcher, is translated in full the first time; from then on it updates
normally.

Categories, tags and other terms are short and are always translated whole.

#When nothing is sent to the AI at all

Some changes carry no new text to translate: re-arranging blocks, swapping an image, changing a
category, or a field that is not translated, such as a price written by an importer.

When that happens the plugin finds nothing to translate and does not call the AI. You are not
billed, and the Translations screen says already up to date — nothing needed re-translating. The
translation is still saved once, so its categories, featured image and copied fields follow the
original, and the warning icon disappears.

#Corrections you made by hand

This is the part worth understanding, because it is where the two modes differ most.

You translate a page, then open the translation and fix a sentence the AI got wrong. Later you add
a new paragraph to the original and update the translation. What happens to your fix?

With “translate only changed strings”, your correction is kept. Before sending anything to the
AI, the plugin reads the translated post as it stands now and records your wording as the current
translation of that paragraph. The AI is then asked only for the new paragraph, and the finished
page contains your corrected sentence plus the newly translated paragraph.

With “re-translate the whole post from scratch”, your correction is replaced. Every paragraph
is translated again, including the one you fixed. This is intentional — it is what a full
re-translation means — but it is worth knowing before you pick that option on a post you have
edited by hand.

#Where hand corrections are kept

What you edited in the translation Kept when translating only what changed
Title, excerpt Yes
Body — block editor content Yes
Body — classic editor content Yes
Elementor text Yes
Custom fields (ACF, SEO plugins, …) Yes

Edit the translation wherever you normally would — the WordPress editor, Elementor, the SEO
plugin’s box. There is no separate translation editor to use.

#Things that stop a merge

There are situations the plugin will not try to resolve:

  • You added or removed blocks (or Elementor widgets) in the translation itself. The
    translation no longer matches the original piece for piece, so there is no safe way to say which
    translated block belongs to which original one.
  • The same text appears twice in the original and you translated the two copies differently.
    The plugin keeps one translation per distinct piece of source text, so there is no way to keep
    both.

When this happens, the update is refused before anything is sent to the AI. You get a message
saying so, nothing is billed, and the translation stays exactly as you left it. This is deliberate:
the plugin rebuilds the translated post from the structure of the original, so going ahead would
throw away the blocks you added — and charge you for it.

The fix is Translate Again. It replaces the translation completely, in one pass, and updates
merge normally from then on. If you would rather keep what is there, make the same structural
change to the original first, so the two line up again.

If the structure differs but you did not change any of the text — nothing of yours is at risk —
the update simply goes ahead.

#What a changed paragraph does to your correction

If you correct the translation of a paragraph and then change that same paragraph in the
original
, the paragraph is re-translated and your correction to it is gone. Only corrections to
parts you did not touch in the original survive. That is unavoidable: the source text it belonged
to no longer exists.

Purely cosmetic differences — an extra space, a  , a different HTML entity for the same
character — are not treated as corrections and do not stop anything.

#Which mode should I use?

Use translate only changed strings (the default) for normal editing: fixing typos, adding
sections, updating prices in text, extending an article. It is cheaper, faster, and it protects
the corrections you or your translators made.

Use translate only changed strings, with the whole page as context when the result matters more
than the cost: a flagship page, a site whose translations are proofread by a person, or content
full of terminology that has to stay consistent from one update to the next. It keeps everything
the default mode keeps and buys consistency with the surrounding text.

Use re-translate the whole post from scratch when the translation as a whole is no longer good:
you rewrote the original heavily, you changed the translation prompt or glossary, you switched
engine or model, or you simply want a clean result and do not need what is there now.

You do not have to change the setting to do a one-off full re-translation — the Translate Again
button on the Translations screen always does that.

#Automatic translation

Automatic translation is for new content, so it rarely meets this setting. It does when a post that
already has some of its languages is published into the missing ones: the languages it already has
are brought up to date in the mode chosen here. With Re-translate the whole post from scratch
selected, that means paying for them again. See Automatic Translation.

#Checking what happened

Every run is recorded in the plugin log (AI Translation → Logs). Useful lines:

  • addon: imported manual edits from the translation — hand corrections were found and kept, with
    the number of strings.
  • pll_service: delta job already up to date, closing without an LLM call — nothing changed,
    nothing was billed.
  • addon: refusing to translate, the translation was edited and no longer lines up with the original — the update was refused as described above; nothing was sent to the AI and nothing
    was changed.
  • pll_service: enqueued post job — shows the mode the job ran in (delta, delta-context or
    full), how many strings are being translated, how many were kept (carried_fields) and, for
    delta-context, how many were sent along as context.

The History screen lists every translation with the tokens and cost it used, so an update that
only translated a paragraph is visibly cheaper than a full one.