{"id":113,"date":"2026-09-25T06:56:39","date_gmt":"2026-09-25T06:56:39","guid":{"rendered":"https:\/\/docs.latw.ai\/uncategorized\/translating-custom-elementor-widgets\/"},"modified":"2026-09-25T06:56:39","modified_gmt":"2026-09-25T06:56:39","slug":"translating-custom-elementor-widgets","status":"publish","type":"post","link":"https:\/\/docs.latw.ai\/pl\/latw-multilingual\/translating-custom-elementor-widgets\/","title":{"rendered":"Translating Custom Elementor Widgets"},"content":{"rendered":"<p><em>Available in <strong>PRO<\/strong> (version 2.4.0 and later).<\/em><\/p>\n<p>When AI translates an Elementor page, it does not send the whole page layout to the translation<br \/>\nengine. It sends only the texts it knows are texts: a heading&#8217;s title, a button&#8217;s label, a tab&#8217;s<br \/>\ncontent. For that it keeps a list of widgets and of the settings in each widget that hold text.<br \/>\nThe list covers the widgets of Elementor, Elementor Pro and PowerPack for Elementor.<\/p>\n<p>A widget that is not on the list is <strong>skipped<\/strong>. That is the case for widgets your theme brings<br \/>\nwith it, and for widgets from add-on packs the plugin does not know. The rest of the page is<br \/>\ntranslated, but the texts inside those widgets stay in the original language. No error is shown,<br \/>\nbecause nothing failed: the plugin simply did not know those settings were text.<\/p>\n<p>The <strong>Elementor Widgets<\/strong> screen lets you close that gap yourself, without code: scan the site,<br \/>\nsee which widgets are not translated, and tick the settings that hold text.<\/p>\n<p>This page is about widgets an add-on <strong>built from scratch<\/strong> for Elementor. A widget whose type<br \/>\nstarts with <code>wp-widget-<\/code> is a different thing &#8211; it is your theme&#8217;s own <strong>WordPress<\/strong> widget<br \/>\n(Search, Categories, Recent Posts, Tag Cloud, or a theme&#8217;s own widget class), only wrapped so it<br \/>\ncan be dragged onto an Elementor page. Its text is not stored in Elementor&#8217;s settings at all &#8211; see<br \/>\n<em>Translating Widgets<\/em> for how that text is handled instead. That is also why a <code>wp-widget-*<\/code> entry<br \/>\nalmost always lands under <strong>No text found<\/strong> on this screen: there is nothing in <code>_elementor_data<\/code><br \/>\nfor it to find.<\/p>\n<h2>When you need this<\/h2>\n<ul>\n<li>A section of an otherwise translated page is still in the original language, and that section<br \/>\nis a widget from your theme or from an add-on.<\/li>\n<li>You installed a new Elementor add-on and want its widgets translated too.<\/li>\n<\/ul>\n<p>If a whole Elementor page is not translated, this screen is not the cause &#8211; check the page in the<br \/>\n<strong>LATW Translations<\/strong> box first.<\/p>\n<h2>Scanning the site<\/h2>\n<p>Go to <strong>LATW Multilingual \u2192 Elementor Widgets<\/strong> and click <strong>Scan site<\/strong>. The plugin reads every<br \/>\nElementor page, post and template (including headers, footers and popups built with the Theme<br \/>\nBuilder) and lists each widget it does not know. The scan reads your content only; it does not<br \/>\nchange anything and does not contact the translation engine, so it costs nothing.<\/p>\n<p>The results are grouped:<\/p>\n<ul>\n<li><strong>Not translated yet<\/strong> &#8211; widgets that hold text and are skipped today. This is where you work.<\/li>\n<li><strong>Translated with your settings<\/strong> &#8211; widgets you already set up.<\/li>\n<li><strong>Configured in code<\/strong> &#8211; widgets your theme or a plugin already set up for translation. Nothing<br \/>\nto do here.<\/li>\n<li><strong>No text found<\/strong> &#8211; widgets with no text stored in your pages (images, spacers, icons\u2026).<\/li>\n<\/ul>\n<p>Run the scan again after you add new widgets to your pages or install a new add-on.<\/p>\n<p>Each group, and each widget card, can be folded by clicking its heading; <strong>Expand all<\/strong> and<br \/>\n<strong>Collapse all<\/strong> fold or unfold everything at once. Widgets you already set up start folded. The<br \/>\nscreen remembers what you folded, in this browser.<\/p>\n<h3>Working on one page<\/h3>\n<p>To see only the widgets used on a particular page, pick it in <strong>Show widgets on<\/strong>. The list holds<br \/>\nevery page, post and template the scan found a listed widget on, with the number of widgets on<br \/>\neach. Groups with nothing on that page are hidden, and each group&#8217;s count shows how many of its<br \/>\nwidgets are on the page. Choose <strong>All pages<\/strong> to see everything again.<\/p>\n<h2>Choosing what to translate<\/h2>\n<p>Each widget is shown as a card: its name, how many times it is used, links to a few pages that use<br \/>\nit, and a table of its settings with an example value taken from your pages.<\/p>\n<ul>\n<li><strong>Text fields are ticked for you<\/strong> when the widget is active on your site &#8211; the plugin can see<br \/>\nwhich settings the widget declares as text (single-line text, multi-line text, rich text).<\/li>\n<li><strong>Settings that are not text are greyed out<\/strong> and cannot be ticked: selects, switches, colors,<br \/>\nicons, numbers. A setting that picks a contact form, a menu or a template is one of these &#8211; it<br \/>\nstores an ID, and translating it would break the link to the form.<\/li>\n<li><strong>Link fields are offered but not ticked.<\/strong> Tick one only when the link should lead to a<br \/>\ndifferent address in each language. Links to pages on your own site are usually handled already<br \/>\nby the <strong>Internal links in content<\/strong> setting.<\/li>\n<li><strong>Settings of an inactive widget.<\/strong> If the add-on that provides the widget is switched off, the<br \/>\nplugin cannot see its settings. It then lists only the values stored in your pages that look like<br \/>\ntext, and ticks none of them.<\/li>\n<\/ul>\n<p>Always look at the example values before you save. A text field can still hold something that must<br \/>\nnot be translated &#8211; an HTML ID, a CSS class, a shortcode. Leave those unticked.<\/p>\n<p>Click <strong>Save<\/strong>. From then on, every AI translation of a page that uses this widget includes the<br \/>\nticked settings. To stop, click <strong>Stop translating<\/strong> on the card. Translations that already exist<br \/>\nstay as they are.<\/p>\n<h2>Updating pages that are already translated<\/h2>\n<p>Saving a widget&#8217;s settings does not change your pages, so pages you translated earlier still count<br \/>\nas up to date and will not be translated again on their own.<\/p>\n<p>To bring them up to date, translate them again the usual way &#8211; from the <strong>Posts<\/strong> screen or the<br \/>\n<strong>LATW Translations<\/strong> box of each page. The widget&#8217;s card lists how many pages use it, and picking a<br \/>\npage in <strong>Show widgets on<\/strong> shows which widgets it holds, so you can see which pages are affected.<\/p>\n<p>Translating a page again sends the <strong>whole page<\/strong> to the translation engine, not just the widget,<br \/>\nand is billed like any other translation.<\/p>\n<p>If you change a widget&#8217;s settings while one of its pages is being translated, that translation<br \/>\nfails with the message that the Elementor content or widget settings changed. Nothing is written<br \/>\nto the page. Translate it again.<\/p>\n<h2>What this does not do<\/h2>\n<ul>\n<li><strong>Texts left at the widget&#8217;s default.<\/strong> Elementor stores a setting in the page only when you<br \/>\nchange it. A button label you never touched is not in the page at all &#8211; the widget prints its<br \/>\nbuilt-in text, which comes from the theme or add-on. Translate those under<br \/>\n<strong>LATW Multilingual \u2192 Themes &amp; Plugins<\/strong>.<\/li>\n<li><strong>Content outside the widget.<\/strong> A widget that shows a contact form, a menu or a post only points<br \/>\nto it. The form, menu or post is translated on its own &#8211; for Contact Form 7 see<br \/>\n<em>Translating Contact Form 7 Forms<\/em>.<\/li>\n<li><strong>Lists inside lists.<\/strong> Repeater items (a list of tabs, slides, features) are supported. A list<br \/>\nnested inside a repeater item is not.<\/li>\n<li><strong>Elementor 4 (Atomic) widgets from other add-ons.<\/strong> They store text in a different format and<br \/>\nare not offered on this screen.<\/li>\n<li><strong>Built-in widgets.<\/strong> Elementor, Elementor Pro and PowerPack widgets are already covered and<br \/>\ncannot be changed here.<\/li>\n<\/ul>\n<h2>Developer reference<\/h2>\n<p>The screen stores its choices in the <code>latwmp_elementor_widgets<\/code> option. A theme or plugin can<br \/>\ndeclare its widgets in code instead, through the <code>latwmp_elementor_widgets_to_translate<\/code> filter &#8211;<br \/>\nfor example from a child theme&#8217;s <code>functions.php<\/code>:<\/p>\n<pre><code class=\"language-php\">add_filter( 'latwmp_elementor_widgets_to_translate', function ( $widgets ) {\n    $widgets['tj-form'] = array(\n        'match'  =&gt; array( 'widgetType' =&gt; 'tj-form' ),\n        \/\/ Each entry is a path under the widget's settings.\n        'fields' =&gt; array(\n            array( 'tj_title' ),\n            array( 'tj_subtitle' ),\n            array( 'button_link', 'url' ), \/\/ $settings['button_link']['url']\n        ),\n        \/\/ Repeaters: one group per repeater control ('items' =&gt; one group is also accepted).\n        'items_groups' =&gt; array(\n            array(\n                'items_field' =&gt; 'features',\n                'fields'      =&gt; array( array( 'feature_text' ) ),\n            ),\n        ),\n    );\n    return $widgets;\n} );<\/code><\/pre>\n<ul>\n<li>The filter receives the built-in list merged with the choices from the <strong>Elementor Widgets<\/strong><br \/>\nscreen, so code has the last word.<\/li>\n<li>A widget declared in code is shown under <strong>Configured in code<\/strong> and cannot be edited on the<br \/>\nscreen.<\/li>\n<li>Only list settings that hold text a visitor reads. Never list a setting that stores an ID,<br \/>\nbecause the translation would replace it.<\/li>\n<li>Settings driven by an Elementor dynamic tag are handled automatically: only the tag&#8217;s<br \/>\n<em>before<\/em>, <em>after<\/em> and <em>fallback<\/em> texts are translated.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Available in PRO (version 2.4.0 and later). When AI translates an Elementor page, it does not send the whole page layout to the translation engine. It\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":[4],"tags":[],"class_list":["post-113","post","type-post","status-publish","format-standard","hentry","category-latw-multilingual"],"_links":{"self":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts\/113","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=113"}],"version-history":[{"count":2,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts\/113\/revisions"}],"predecessor-version":[{"id":121,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts\/113\/revisions\/121"}],"wp:attachment":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/media?parent=113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/categories?post=113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/tags?post=113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}