{"id":106,"date":"2026-09-23T11:24:44","date_gmt":"2026-09-23T11:24:44","guid":{"rendered":"https:\/\/docs.latw.ai\/uncategorized\/outdated-translations-2\/"},"modified":"2026-09-23T11:24:44","modified_gmt":"2026-09-23T11:24:44","slug":"outdated-translations-2","status":"publish","type":"post","link":"https:\/\/docs.latw.ai\/pl\/latw-for-polylang\/outdated-translations-2\/","title":{"rendered":"Updating Outdated Translations"},"content":{"rendered":"<p><em>Available in LATW AI Translation for Polylang <strong>PRO<\/strong>.<\/em><\/p>\n<h2>What it does<\/h2>\n<p>When you change a post that is already translated, its translations fall behind. On the<br \/>\n<strong>Translations<\/strong> screen such a language is marked with a yellow warning icon \u2014 <em>Translation is<br \/>\nolder than the original \u2014 needs updating<\/em> \u2014 and its box starts ticked. You then decide how to<br \/>\nbring it up to date. The plugin offers three ways:<\/p>\n<ul>\n<li><strong>Translate only changed strings (recommended)<\/strong> \u2014 the default. Only the parts of the post you<br \/>\nactually changed are sent to the AI. Everything else keeps the translation it already has.<\/li>\n<li><strong>Translate only changed strings, with the whole page as context (best quality, higher cost)<\/strong> \u2014<br \/>\nthe same strings are translated and written, but the AI is also shown the rest of the page and<br \/>\nthe translation already published for it.<\/li>\n<li><strong>Re-translate the whole post from scratch<\/strong> \u2014 the post is translated again from the first word<br \/>\nto the last, and the previous translation is replaced.<\/li>\n<\/ul>\n<p>The setting lives in <strong>AI Translation \u2192 Settings \u2192 Translation \u2192 Outdated Translations<\/strong>.<\/p>\n<p>Translating only what changed is usually much cheaper: fixing a typo in one paragraph of a long<br \/>\narticle costs one paragraph, not the whole article. It is also faster, and it leaves the rest of<br \/>\nthe translation exactly as it is \u2014 including any wording you corrected by hand.<\/p>\n<p><strong>This setting only applies to content that is already translated.<\/strong> A post being translated for<br \/>\nthe first time is always translated in full, because there is nothing to keep. The <strong>Translate<br \/>\nAgain<\/strong> button is also always a full re-translation, whatever the setting says \u2014 that is what the<br \/>\nbutton is for (see <em>How to Translate Again?<\/em>).<\/p>\n<p>Without an active licence every update is a full re-translation, so an update costs what a first<br \/>\ntranslation costs.<\/p>\n<h2>Translating with the whole page as context<\/h2>\n<p>The two &#8220;only changed strings&#8221; modes write exactly the same thing: the changed strings, nothing<br \/>\nelse. They differ in what the AI is allowed to see while translating them.<\/p>\n<p>In the default mode the AI receives the changed strings alone. A new paragraph added to a long<br \/>\narticle arrives with no idea what the article is about, how its terms were translated before, or<br \/>\nwhether the page addresses the reader formally or informally. That is what makes an updated page<br \/>\nread as if it were written by two different people: the new paragraph is correct on its own and<br \/>\ndoes not match the page around it.<\/p>\n<p>With the whole page as context, the job also carries every untouched part of the page \u2014 its<br \/>\nsource text <em>and<\/em> the translation currently published for it \u2014 marked as reference material the<br \/>\nAI must not translate or return. The AI is told to treat the published translation as approved:<br \/>\nto reuse its terminology, keep its tone and formality, and not to &#8220;improve&#8221; a word you chose.<\/p>\n<p>This is the mode to pick if you correct translations by hand and want new content to sound like<br \/>\nthe corrections rather than like a fresh translation. <strong>Your corrections are part of the context<\/strong><br \/>\n\u2014 they are read from the translated post, so the AI is shown your wording, not the wording it<br \/>\nproduced originally.<\/p>\n<p><strong>The cost.<\/strong> Every update sends the entire page to the AI on top of the strings being translated,<br \/>\nso an update to a long article is priced closer to a full re-translation than to a delta one \u2014<br \/>\nwhile still writing only the changed strings, and still protecting everything else. It is<br \/>\ndeliberately the expensive option: it exists for sites where translation quality matters more than<br \/>\nthe token bill.<\/p>\n<p>The exact shape of that reference material is described in <em>How the Translation Prompt Works<\/em>.<\/p>\n<p><strong>Machine-translation engines.<\/strong> DeepL, Google Translate and MyMemory translate text instead of<br \/>\nfollowing instructions, so there is no way to give them context. With one of those selected, this<br \/>\nmode behaves exactly like the default one.<\/p>\n<h2>How the plugin decides what changed<\/h2>\n<p>Polylang does not remember what was translated, so the plugin keeps its own record: every<br \/>\nfinished translation stores the exact text that was sent and the translation that came back. On<br \/>\nthe next update it compares the original as it is now with that record:<\/p>\n<ul>\n<li>Identical \u2192 the existing translation is kept and nothing is sent to the AI.<\/li>\n<li>Different, or brand new \u2192 it goes to the AI.<\/li>\n<\/ul>\n<p>A piece of text is recognised by what it says, not by where it sits. Insert a paragraph at the top<br \/>\nof a page and only that paragraph is translated \u2014 the paragraphs below it moved, but they did not<br \/>\nchange.<\/p>\n<p>What counts as one &#8220;string&#8221; depends on how the post is built:<\/p>\n<table>\n<thead>\n<tr>\n<th>Content<\/th>\n<th>Compared as<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Title, excerpt<\/td>\n<td>One string each<\/td>\n<\/tr>\n<tr>\n<td>Body written in the <strong>block editor<\/strong><\/td>\n<td>One string per piece of text in a block \u2014 usually one per paragraph or heading, several for blocks that hold more than one (a list, a table, a button and its label)<\/td>\n<\/tr>\n<tr>\n<td>Body written in the <strong>classic editor<\/strong><\/td>\n<td>The whole body as a single string<\/td>\n<\/tr>\n<tr>\n<td><strong>Elementor<\/strong><\/td>\n<td>One string per text field of a widget<\/td>\n<\/tr>\n<tr>\n<td>Custom fields (ACF, SEO plugins, \u2026)<\/td>\n<td>One string per field; a field holding a list is compared value by value<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>This is why the block editor and Elementor benefit most: add one paragraph to a long page and only<br \/>\nthat paragraph is translated. In the classic editor the body is a single string, so any change to<br \/>\nit \u2014 even one word \u2014 re-translates the whole body. Title, excerpt and custom fields are still<br \/>\ncompared separately, so they are still skipped when untouched.<\/p>\n<p><strong>The record has to exist.<\/strong> Only translations this plugin produced can be updated this way. A<br \/>\ntranslation written by hand or with another tool, or one whose linked post was deleted or replaced<br \/>\nin Polylang&#8217;s language switcher, is translated in full the first time; from then on it updates<br \/>\nnormally.<\/p>\n<p>Categories, tags and other terms are short and are always translated whole.<\/p>\n<h2>When nothing is sent to the AI at all<\/h2>\n<p>Some changes carry no new text to translate: re-arranging blocks, swapping an image, changing a<br \/>\ncategory, or a field that is not translated, such as a price written by an importer.<\/p>\n<p>When that happens the plugin finds nothing to translate and <strong>does not call the AI<\/strong>. You are not<br \/>\nbilled, and the Translations screen says <em>already up to date \u2014 nothing needed re-translating<\/em>. The<br \/>\ntranslation is still saved once, so its categories, featured image and copied fields follow the<br \/>\noriginal, and the warning icon disappears.<\/p>\n<h2>Corrections you made by hand<\/h2>\n<p>This is the part worth understanding, because it is where the two modes differ most.<\/p>\n<p>You translate a page, then open the translation and fix a sentence the AI got wrong. Later you add<br \/>\na new paragraph to the original and update the translation. What happens to your fix?<\/p>\n<p><strong>With &#8220;translate only changed strings&#8221;, your correction is kept.<\/strong> Before sending anything to the<br \/>\nAI, the plugin reads the translated post as it stands now and records your wording as the current<br \/>\ntranslation of that paragraph. The AI is then asked only for the new paragraph, and the finished<br \/>\npage contains your corrected sentence plus the newly translated paragraph.<\/p>\n<p><strong>With &#8220;re-translate the whole post from scratch&#8221;, your correction is replaced.<\/strong> Every paragraph<br \/>\nis translated again, including the one you fixed. This is intentional \u2014 it is what a full<br \/>\nre-translation means \u2014 but it is worth knowing before you pick that option on a post you have<br \/>\nedited by hand.<\/p>\n<h3>Where hand corrections are kept<\/h3>\n<table>\n<thead>\n<tr>\n<th>What you edited in the translation<\/th>\n<th>Kept when translating only what changed<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Title, excerpt<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Body \u2014 block editor content<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Body \u2014 classic editor content<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Elementor text<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Custom fields (ACF, SEO plugins, \u2026)<\/td>\n<td>Yes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Edit the translation wherever you normally would \u2014 the WordPress editor, Elementor, the SEO<br \/>\nplugin&#8217;s box. There is no separate translation editor to use.<\/p>\n<h3>Things that stop a merge<\/h3>\n<p>There are situations the plugin will not try to resolve:<\/p>\n<ul>\n<li><strong>You added or removed blocks (or Elementor widgets) in the translation itself.<\/strong> The<br \/>\ntranslation no longer matches the original piece for piece, so there is no safe way to say which<br \/>\ntranslated block belongs to which original one.<\/li>\n<li><strong>The same text appears twice in the original and you translated the two copies differently.<\/strong><br \/>\nThe plugin keeps one translation per distinct piece of source text, so there is no way to keep<br \/>\nboth.<\/li>\n<\/ul>\n<p>When this happens, <strong>the update is refused before anything is sent to the AI<\/strong>. You get a message<br \/>\nsaying so, nothing is billed, and the translation stays exactly as you left it. This is deliberate:<br \/>\nthe plugin rebuilds the translated post from the structure of the original, so going ahead would<br \/>\nthrow away the blocks you added \u2014 and charge you for it.<\/p>\n<p>The fix is <strong>Translate Again<\/strong>. It replaces the translation completely, in one pass, and updates<br \/>\nmerge normally from then on. If you would rather keep what is there, make the same structural<br \/>\nchange to the original first, so the two line up again.<\/p>\n<p>If the structure differs but you did not change any of the text \u2014 nothing of yours is at risk \u2014<br \/>\nthe update simply goes ahead.<\/p>\n<h3>What a changed paragraph does to your correction<\/h3>\n<p>If you correct the translation of a paragraph <strong>and then change that same paragraph in the<br \/>\noriginal<\/strong>, the paragraph is re-translated and your correction to it is gone. Only corrections to<br \/>\nparts you did not touch in the original survive. That is unavoidable: the source text it belonged<br \/>\nto no longer exists.<\/p>\n<p>Purely cosmetic differences \u2014 an extra space, a <code>&amp;nbsp;<\/code>, a different HTML entity for the same<br \/>\ncharacter \u2014 are not treated as corrections and do not stop anything.<\/p>\n<h2>Which mode should I use?<\/h2>\n<p>Use <strong>translate only changed strings<\/strong> (the default) for normal editing: fixing typos, adding<br \/>\nsections, updating prices in text, extending an article. It is cheaper, faster, and it protects<br \/>\nthe corrections you or your translators made.<\/p>\n<p>Use <strong>translate only changed strings, with the whole page as context<\/strong> when the result matters more<br \/>\nthan the cost: a flagship page, a site whose translations are proofread by a person, or content<br \/>\nfull of terminology that has to stay consistent from one update to the next. It keeps everything<br \/>\nthe default mode keeps and buys consistency with the surrounding text.<\/p>\n<p>Use <strong>re-translate the whole post from scratch<\/strong> when the translation as a whole is no longer good:<br \/>\nyou rewrote the original heavily, you changed the translation prompt or glossary, you switched<br \/>\nengine or model, or you simply want a clean result and do not need what is there now.<\/p>\n<p>You do not have to change the setting to do a one-off full re-translation \u2014 the <strong>Translate Again<\/strong><br \/>\nbutton on the Translations screen always does that.<\/p>\n<h2>Automatic translation<\/h2>\n<p>Automatic translation is for new content, so it rarely meets this setting. It does when a post that<br \/>\nalready has some of its languages is published into the missing ones: the languages it already has<br \/>\nare brought up to date in the mode chosen here. With <strong>Re-translate the whole post from scratch<\/strong><br \/>\nselected, that means paying for them again. See <em>Automatic Translation<\/em>.<\/p>\n<h2>Checking what happened<\/h2>\n<p>Every run is recorded in the plugin log (<strong>AI Translation \u2192 Logs<\/strong>). Useful lines:<\/p>\n<ul>\n<li><code>addon: imported manual edits from the translation<\/code> \u2014 hand corrections were found and kept, with<br \/>\nthe number of strings.<\/li>\n<li><code>pll_service: delta job already up to date, closing without an LLM call<\/code> \u2014 nothing changed,<br \/>\nnothing was billed.<\/li>\n<li><code>addon: refusing to translate, the translation was edited and no longer lines up with the original<\/code> \u2014 the update was refused as described above; nothing was sent to the AI and nothing<br \/>\nwas changed.<\/li>\n<li><code>pll_service: enqueued post job<\/code> \u2014 shows the mode the job ran in (<code>delta<\/code>, <code>delta-context<\/code> or<br \/>\n<code>full<\/code>), how many strings are being translated, how many were kept (<code>carried_fields<\/code>) and, for<br \/>\n<code>delta-context<\/code>, how many were sent along as context.<\/li>\n<\/ul>\n<p>The <strong>History<\/strong> screen lists every translation with the tokens and cost it used, so an update that<br \/>\nonly translated a paragraph is visibly cheaper than a full one.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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\u2026<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_latwm_translated_slug":"","footnotes":""},"categories":[17],"tags":[],"class_list":["post-106","post","type-post","status-publish","format-standard","hentry","category-latw-for-polylang"],"_links":{"self":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts\/106","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/comments?post=106"}],"version-history":[{"count":0,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts\/106\/revisions"}],"wp:attachment":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/media?parent=106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/categories?post=106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/tags?post=106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}