{"id":112,"date":"2026-09-24T09:57:26","date_gmt":"2026-09-24T09:57:26","guid":{"rendered":"https:\/\/docs.latw.ai\/uncategorized\/translating-contact-form-7\/"},"modified":"2026-09-24T09:57:26","modified_gmt":"2026-09-24T09:57:26","slug":"translating-contact-form-7","status":"publish","type":"post","link":"https:\/\/docs.latw.ai\/pl\/latw-multilingual\/translating-contact-form-7\/","title":{"rendered":"Translating Contact Form 7 Forms"},"content":{"rendered":"<p>A Contact Form 7 form is not part of the page that shows it. The page only holds a reference to<br \/>\nthe form &#8211; a shortcode, a block, or a page-builder widget that lets you pick a form &#8211; and the form<br \/>\nitself (its labels, placeholders, options, button and messages) is stored separately. That is why<br \/>\ntranslating a page leaves its form in the original language.<\/p>\n<p>The plugin translates each form once, as its own item. The translated form is then shown in every<br \/>\nplace it is embedded, whatever embeds it: the <code>[contact-form-7]<\/code> shortcode, the block, or a widget<br \/>\nfrom Elementor, your theme or an add-on.<\/p>\n<p><em>Translating forms by hand is part of the free version. Translating them automatically with AI<br \/>\nrequires <strong>PRO<\/strong>.<\/em><\/p>\n<p>Turn it on under <strong>LATW Multilingual \u2192 Settings \u2192 Translation \u2192 Other objects<\/strong>, with<br \/>\n<strong>Contact Form 7: form labels, placeholders, options, buttons and messages (Strings \u2192 Contact Form<br \/>\n7)<\/strong>. The option is shown<br \/>\nonly while Contact Form 7 is active, and is on by default.<\/p>\n<h2>Translating a form<\/h2>\n<p>Go to <strong>LATW Multilingual \u2192 Strings<\/strong> and set the <strong>Type<\/strong> filter to <strong>Contact Form 7<\/strong>. Each form<br \/>\nis one row. Click its name to open it, or click the pencil next to a single language in the<br \/>\n<strong>Languages<\/strong> column.<\/p>\n<p>The form is split into short pieces of text, each in its own field:<\/p>\n<ul>\n<li><strong>Form text<\/strong> &#8211; labels and any other text you wrote around the fields.<\/li>\n<li><strong>Placeholder \/ default text<\/strong> &#8211; the quoted text inside a field, for example <code>\"Name*\"<\/code> in<br \/>\n<code>[text* your-name placeholder \"Name*\"]<\/code>.<\/li>\n<li><strong>Option<\/strong> &#8211; each choice of a drop-down, checkbox or radio field.<\/li>\n<li><strong>Checkbox text<\/strong> &#8211; the text of an acceptance checkbox (<code>[acceptance]\u2026[\/acceptance]<\/code>).<\/li>\n<li><strong>Button label<\/strong> &#8211; the text of the submit button.<\/li>\n<li>The <strong>messages<\/strong> &#8211; &#8220;Thank you for your message\u2026&#8221;, validation errors and the rest &#8211; each labeled<br \/>\nas in Contact Form 7&#8217;s <strong>Messages<\/strong> tab.<\/li>\n<\/ul>\n<p>Leave a field empty and the original is used for that language.<\/p>\n<p>With <strong>PRO<\/strong>, tick the forms on the Strings page and use <strong>Translate Selected<\/strong>, or the<br \/>\n<strong>Translate<\/strong> button on a single row, like any other string.<\/p>\n<h2>What is never changed<\/h2>\n<p>Only text is ever translated. The structure of the form is rebuilt from the original each time, so<br \/>\na translation cannot break it:<\/p>\n<ul>\n<li><strong>Field names<\/strong> stay as they are (<code>your-name<\/code>, <code>terms<\/code>) &#8211; your mail template and any integration<br \/>\nthat reads the submitted data keep working.<\/li>\n<li><strong>Field types and options<\/strong> stay as they are (<code>text*<\/code>, <code>class:\u2026<\/code>, <code>placeholder<\/code>, <code>akismet:\u2026<\/code>).<\/li>\n<li><strong>The mail<\/strong> is not translated. You keep receiving submissions in the language the form was<br \/>\nbuilt in.<\/li>\n<\/ul>\n<h3>Drop-down, checkbox and radio options<\/h3>\n<p>A visitor sees and picks the option in their own language, but the <strong>mail you receive contains the<br \/>\noriginal option<\/strong>. If your form offers <em>Consulenza<\/em> and <em>Assistenza<\/em>, a visitor on the English<br \/>\nsite picks <em>Consulting<\/em>, and your mail still says <em>Consulenza<\/em>. Filters and automations that react<br \/>\nto a particular option keep working in every language.<\/p>\n<p>This uses Contact Form 7&#8217;s own &#8220;pipes&#8221; feature (<code>\"Consulting|Consulenza\"<\/code>). If an option in your<br \/>\nform already uses a pipe, the part after <code>|<\/code> is kept exactly as you wrote it.<\/p>\n<h2>After you edit the form<\/h2>\n<p>Every time you save the form in Contact Form 7, the plugin checks which texts changed. On the<br \/>\nStrings page the form then shows as partly translated in each language.<\/p>\n<p>A text you changed is shown in the original language until it is translated again &#8211; the old<br \/>\ntranslation is never shown for the new text. Adding or removing a field has the same effect on the<br \/>\ntexts that come after it in the form. Open the form on the Strings page (or translate it again with<br \/>\nAI) to bring the language up to date. Editing a form does not trigger an automatic translation.<\/p>\n<h2>What this does not do<\/h2>\n<ul>\n<li><strong>One form for all languages.<\/strong> You cannot add a field or an option in one language only. The<br \/>\ntranslation covers the text, not the structure.<\/li>\n<li><strong>The mail and auto-reply<\/strong> are not translated (see above).<\/li>\n<li><strong>Additional Settings<\/strong> of the form are not translated.<\/li>\n<li><strong>Only published forms<\/strong> are listed on the Strings page.<\/li>\n<li><strong>Texts printed by the page, not by the form<\/strong> &#8211; a title or description a theme widget shows<br \/>\nabove the form &#8211; belong to the page. For a widget from your theme or an add-on see<br \/>\n<em>Translating Custom Elementor Widgets<\/em>.<\/li>\n<\/ul>\n<h2>Troubleshooting<\/h2>\n<p><strong>The form is translated, but after sending it the visitor gets &#8220;Undefined value was submitted<br \/>\nthrough this field&#8221;.<\/strong> The form is sent in the background, and the plugin recognises the<br \/>\nvisitor&#8217;s language from the address of the page the form was sent from. A security or privacy<br \/>\nplugin that removes that information from requests makes the form arrive in the original language,<br \/>\nso a translated option is not recognised. Check whether such a plugin strips the Referer header.<\/p>\n<p><strong>One label stays in the original language.<\/strong> Open the form on the Strings page. If the field is<br \/>\nempty for that language, it was never translated. If it shows as outdated, you edited that text in<br \/>\nContact Form 7 after it was translated.<\/p>\n<h2>Developer reference<\/h2>\n<ul>\n<li>Object type <code>cf7_form<\/code>, object ID = the form&#8217;s post ID, fields <code>form:N<\/code> (the N-th piece of text<br \/>\nin the form template, in document order) and <code>messages:&lt;key&gt;<\/code>.<\/li>\n<li>Read layer: the <code>wpcf7_contact_form_properties<\/code> filter. Only <code>form<\/code> and <code>messages<\/code> are replaced.<\/li>\n<li>A <code>form:N<\/code> translation is served only while its stored source hash matches the current text of<br \/>\npiece N, so an edited form never shows a translation next to the wrong field.<\/li>\n<li>Setting key: <code>translate_cf7<\/code> in the <code>latwm_ai_settings<\/code> option.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>A Contact Form 7 form is not part of the page that shows it. The page only holds a reference to the form &#8211; a shortcode,\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-112","post","type-post","status-publish","format-standard","hentry","category-latw-multilingual"],"_links":{"self":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts\/112","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=112"}],"version-history":[{"count":1,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts\/112\/revisions"}],"predecessor-version":[{"id":117,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts\/112\/revisions\/117"}],"wp:attachment":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/media?parent=112"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/categories?post=112"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/tags?post=112"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}