{"id":63,"date":"2026-09-16T10:29:03","date_gmt":"2026-09-16T10:29:03","guid":{"rendered":"https:\/\/docs.latw.ai\/uncategorized\/outdated-translations\/"},"modified":"2026-09-16T10:29:03","modified_gmt":"2026-09-16T10:29:03","slug":"outdated-translations","status":"publish","type":"post","link":"https:\/\/docs.latw.ai\/pl\/latw-for-wpml\/outdated-translations\/","title":{"rendered":"Updating Outdated Translations"},"content":{"rendered":"<p><em>Available in LATW AI Translator for WPML <strong>PRO<\/strong>.<\/em><\/p>\n<h2>What it does<\/h2>\n<p>When you change a post that is already translated, WPML marks its translations as <strong>outdated<\/strong>.<br \/>\nYou then decide how to bring them 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<\/strong> \u2014 the same strings are<br \/>\ntranslated and written, but the AI is also shown the rest of the page and the translation<br \/>\nalready published for it. Best quality, and it costs more on every update.<\/li>\n<li><strong>Re-translate the whole post from scratch<\/strong> \u2014 the post is translated again from the first<br \/>\nword to the last, and the previous translation is replaced.<\/li>\n<\/ul>\n<p>The setting lives in <strong>AI Translator \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<h2>Translating with the whole page as context<\/h2>\n<p><em>This mode requires version 2.3.0 or later.<\/em><\/p>\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 last year,<br \/>\nor whether the page addresses the reader formally or informally. That is what makes an updated<br \/>\npage read as if it were written by two different people: the new paragraph is correct on its own<br \/>\nand does not match the page around it.<\/p>\n<p>With the whole page as context, the job also carries every untouched field 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 your<br \/>\ntranslator 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 back from the translation exactly as the default delta mode reads them, so the AI<br \/>\nis shown your wording, not the wording it produced originally.<\/p>\n<p><strong>The cost.<\/strong> Every update sends the entire page to the AI on top of the strings being<br \/>\ntranslated, so an update to a long article is priced closer to a full re-translation than to a<br \/>\ndelta one \u2014 while still writing only the changed strings, and still protecting everything else.<br \/>\nIt is deliberately the expensive option: it exists for sites where translation quality matters<br \/>\nmore than the token bill.<\/p>\n<p>The exact shape of that reference material \u2014 and of everything else the model receives \u2014 is<br \/>\ndescribed in <em>How the Translation Prompt Works<\/em>.<\/p>\n<p><strong>Machine-translation engines.<\/strong> DeepL and Google Translate translate text instead of following<br \/>\ninstructions, so there is no way to give them context. With one of those selected, this mode<br \/>\nbehaves exactly like the default one.<\/p>\n<p>Nothing else changes. The same strings are compared, the same hand corrections are kept, jobs<br \/>\nwith nothing to translate are still closed without calling the AI, and the same limits apply to<br \/>\npage builders and custom fields as described below.<\/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.<\/p>\n<h2>How the plugin decides what changed<\/h2>\n<p>The comparison is WPML&#8217;s, not ours. WPML remembers the exact text it sent for translation last<br \/>\ntime and compares it with the text now:<\/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>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, slug<\/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>Custom fields (ACF and others)<\/td>\n<td>One string per field<\/td>\n<\/tr>\n<tr>\n<td>Taxonomy terms<\/td>\n<td>One string per term name<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>This is why the block editor benefits most: add one paragraph to a long page and only that<br \/>\nparagraph is translated. In the classic editor the body is a single string, so any change to it \u2014<br \/>\neven one word \u2014 re-translates the whole body. Title, excerpt and custom fields are still compared<br \/>\nseparately, so they are still skipped when untouched.<\/p>\n<h2>When nothing is sent to the AI at all<\/h2>\n<p>A translation is marked outdated when anything WPML watches changes \u2014 the content, the title, the<br \/>\nexcerpt, the terms, the custom fields. Some of those changes carry no new text to translate at<br \/>\nall: re-arranging blocks, swapping an image, adjusting a block setting, or a field that is not<br \/>\ntranslated, such as a price written by an importer.<\/p>\n<p>When that happens the plugin finds nothing to translate, closes the job and clears the outdated<br \/>\nflag <strong>without calling the AI<\/strong>. You are not billed, and the translation stops showing as<br \/>\noutdated.<\/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 translation 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, slug<\/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>Body \u2014 block editor content<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Body \u2014 Divi, Elementor, WPBakery and other page builders<\/td>\n<td><strong>No<\/strong> \u2014 correct them in WPML&#8217;s Translation Editor<\/td>\n<\/tr>\n<tr>\n<td>Custom fields \/ ACF values<\/td>\n<td><strong>No<\/strong> \u2014 correct them in WPML&#8217;s Translation Editor<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Where they are not<\/h3>\n<p><strong>Page builders.<\/strong> Divi, Elementor, WPBakery, Beaver Builder, Fusion Builder and the like store<br \/>\ntheir content in their own format, and the plugin cannot tell which piece of the translation<br \/>\nbelongs to which piece of the original. If you edited a translation in the builder, updates to it<br \/>\nare refused the same way as above \u2014 nothing is billed and nothing is lost \u2014 until you replace the<br \/>\ntranslation with <strong>Translate Again<\/strong>. <strong>Do not correct page-builder translations in the builder<br \/>\nitself.<\/strong> Make the correction in WPML&#8217;s Translation Editor, where it is stored as the translation<br \/>\nand kept from then on.<\/p>\n<p><strong>Custom fields.<\/strong> The same applies to ACF and other custom fields: editing the value directly on<br \/>\nthe translated post is not recorded anywhere WPML reads back from, so a later update overwrites it<br \/>\nwith the last translated value. Change custom field translations in WPML&#8217;s Translation Editor.<\/p>\n<h3>Things that stop a merge<\/h3>\n<p>Even with block content, there are situations the plugin will not try to resolve:<\/p>\n<ul>\n<li><strong>You added or removed blocks in the translation itself.<\/strong> The translation no longer matches the<br \/>\noriginal block for block, so there is no safe way to say which translated block belongs to which<br \/>\noriginal one.<\/li>\n<li><strong>The same text appears twice in the original and you translated the two copies differently.<\/strong><br \/>\nWPML stores one translation per distinct source text, so there is no way to keep both.<\/li>\n<\/ul>\n<p>When this happens on a translation you edited directly in the WordPress editor, <strong>the update is<br \/>\nrefused before anything is sent to the AI<\/strong>. You get a message saying so, nothing is billed, and<br \/>\nthe translation stays exactly as you left it. This is deliberate: WPML would not have written the<br \/>\nnew translation to that page anyway, so paying for it would buy nothing \u2014 and the attempt would<br \/>\ncost you your corrections on the run after.<\/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, edit the translation in<br \/>\nWPML&#8217;s Translation Editor instead \u2014 corrections made there are stored as translations and are<br \/>\nalways kept.<\/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<br \/>\nmore than the cost: a flagship page, a site whose translations are proofread by a person, or<br \/>\ncontent full of terminology that has to stay consistent from one update to the next. It keeps<br \/>\neverything the 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<br \/>\ngood: you rewrote the original heavily, you changed the translation prompt or glossary, you<br \/>\nswitched AI provider or model, or you simply want a clean result and do not need what is there<br \/>\nnow.<\/p>\n<p>You do not have to change the setting to do a one-off full re-translation \u2014 the <strong>Translate<br \/>\nAgain<\/strong> button on the Translations screen always does that for the posts you select.<\/p>\n<h2>Checking what happened<\/h2>\n<p>Every run is recorded in the plugin log (<strong>AI Translator \u2192 Logs<\/strong>). Useful lines:<\/p>\n<ul>\n<li><code>imported manual edits from the translation into String Translation<\/code> \u2014 hand corrections were<br \/>\nfound and kept, with the number of strings.<\/li>\n<li><code>delta job already up to date, closing without an LLM call<\/code> \u2014 nothing changed, nothing was<br \/>\nbilled.<\/li>\n<li><code>refusing to translate, WPML will not rebuild this translation<\/code> \u2014 the update was refused as<br \/>\ndescribed above; nothing was sent to the AI and nothing was changed.<\/li>\n<li><code>could not match part of the translation to the original<\/code> \u2014 part of the translation could not be<br \/>\nattributed to the original, but the update went ahead because there were no hand edits at risk.<\/li>\n<li><code>enqueued WPML job<\/code> \u2014 shows the mode the job ran in (<code>delta<\/code>, <code>delta-context<\/code> or <code>full<\/code>), how<br \/>\nmany fields are being translated and, for <code>delta-context<\/code>, how many fields were sent along as<br \/>\ncontext.<\/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 Translator for WPML PRO. What it does When you change a post that is already translated, WPML marks its translations as outdated.\u2026<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_latwm_translated_slug":"","footnotes":""},"categories":[3],"tags":[],"class_list":["post-63","post","type-post","status-publish","format-standard","hentry","category-latw-for-wpml"],"_links":{"self":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts\/63","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=63"}],"version-history":[{"count":1,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts\/63\/revisions"}],"predecessor-version":[{"id":72,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts\/63\/revisions\/72"}],"wp:attachment":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/media?parent=63"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/categories?post=63"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/tags?post=63"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}