# Translating form content

Translate form content, respondent emails, and generated PDFs while keeping published versions in sync.

## Translating form content

Translate respondent-facing content, review source changes, and publish each language without losing sync with the form version respondents see.

<h2 id="how-translations-work">How translations work</h2>
<p>
  formbase separates the <strong>source language</strong> from each <strong>published translation</strong>. Your form content stays authored
  in the source language. Each translated language stores only the translated fragments for that form: question titles, options, content
  blocks, placeholders, email copy, and other respondent-facing strings.
</p>
<p>
  Translation rows are tied to stable block ids and source-text hashes. When you edit the source text later, formbase can tell which
  translations are still current, which are missing, and which need review.
</p>

> ℹ️ **Source language does not auto-translate your custom content**
> <p>
>     Setting the source language localizes formbase's built-in UI. It does not rewrite labels, help text, options, custom thank-you content,
>     or custom emails that you authored. Use the translation editor for those. See{' '}
>     <a href="/building-forms/language-setting">Language setting</a> for source-language and respondent-language behavior.
>   </p>

<h2 id="translation-editor">Translation editor</h2>
<p>
  Open a form and click <strong>Translate</strong> in the toolbar. Pick a language, then translate each row manually or ask AI to draft a
  suggestion. Each row shows the <strong>Original</strong>, the <strong>Translation</strong>, and a status. Two tabs split the work:{' '}
  <strong>Form content</strong> and <strong>Emails</strong>. Changes save as you type.
</p>

<h3 id="add-language">Add a language</h3>
<p>
  Click <strong>Add language</strong> and pick one from the list. Any of the 65 languages formbase supports can be added except the form's
  own source language, and each language can be added once. The four regional variants — <code>en-GB</code>, <code>es-MX</code>,{' '}
  <code>fr-CA</code>, <code>pt-BR</code> — are separate entries, so pick one when wording, formatting, or legal copy differs by market. See{' '}
  <a href="/building-forms/language-setting#supported-languages">supported languages</a>.
</p>

> ℹ️ **Right-to-left languages**
> <p>
>     Arabic, Hebrew, Persian, Urdu and the other right-to-left languages can be added like any other. The respondent form and the generated
>     PDF lay themselves out right-to-left for them.
>   </p>

<h3 id="what-you-can-translate">What you can translate</h3>
<ul>
  <li>Headers, paragraphs, lists, tables, and other text blocks</li>
  <li>Question titles, descriptions, placeholders, scale labels, matrix labels, and choice options</li>
  <li>Image captions and custom thank-you content</li>
  <li>Custom respondent confirmation email subject/body</li>
  <li>Custom abandoned-response reminder email subject/body</li>
</ul>

<h3 id="what-is-not-translated">What is not translated</h3>
<ul>
  <li>Hidden fields and calculated fields as standalone fields</li>
  <li>Uploaded files, signatures, and respondent answers</li>
  <li>Integration payload destinations such as table names, database names, or webhook URLs</li>
  <li>
    The event title and location on a <a href="/integrations/cal-com">Cal.com scheduling</a> question, such as "Cal Video". They come from
    Cal.com, so rename them in the Cal.com event type
  </li>
  <li>Custom source-language email text when no translation exists for that respondent's language</li>
</ul>

<p>
  Field references stay intact across translations. If an email says <code>Hello @Name</code>, the translation should keep the field mention
  and translate only the surrounding text.
</p>

<h2 id="ai-translation">AI translation</h2>
<p>
  Use AI for first drafts, not blind publishing. The translation page offers quick-action chips that change with the state of the language
  you have open, and each row has its own <strong>Suggest</strong> / <strong>Re-suggest</strong> button.
</p>
<ul>
  <li>
    <strong>Translate … missing</strong> — after adding new questions. The chip names the count.
  </li>
  <li>
    <strong>Refresh … outdated</strong> — after rewriting source copy.
  </li>
  <li>
    <strong>Translate everything</strong> — bootstrapping a language from scratch.
  </li>
  <li>
    <strong>Polish translations</strong> — when translations are literal but need native phrasing.
  </li>
  <li>
    <strong>Spot-check for issues</strong> — a review pass over what is already there.
  </li>
  <li>
    <strong>Translate to several languages</strong> — run one language's work across the rest.
  </li>
</ul>
<p>
  AI writes into the row as a suggestion, not a saved translation. Accept or decline per row, or use <strong>Accept all</strong> /{' '}
  <strong>Decline all</strong> in the toast. Keep product names, legal terms, and glossary terms consistent across rows.
</p>

> 💡 **Translate in review-sized batches**
> <p>
>     Translate one language, review the most important pages and email copy, then publish. For high-stakes forms, have a native speaker
>     review legal text, consent language, and payment-related copy before publishing.
>   </p>

<h2 id="statuses">Translation statuses</h2>

<p>
  Above the rows, each language carries a completion badge counting how many rows are <strong>complete</strong>, <strong>missing</strong>,
  and <strong>outdated</strong>.
</p>

<h2 id="keeping-in-sync">How formbase keeps translations in sync</h2>
<p>
  The translation editor builds a live source manifest from your current form and email settings. Each manifest row has a stable translation
  key and a hash of the source fragment. This lets formbase update translation status without guessing from plain text.
</p>

<h3 id="field-reference-checks">Field reference checks</h3>
<p>
  Email translations can include <code>@</code> mentions that pipe respondent answers into the message. If you delete or rename a field that
  a translated email still references, formbase flags the stale reference before you publish.
</p>
<ul>
  <li>An inline warning appears below the affected email translation row.</li>
  <li>The publish indicator flags the stale reference so you can fix it before shipping.</li>
</ul>
<p>
  The same reference checks apply to source email templates and integration message templates in{' '}
  <a href="/building-forms/form-settings#email-notifications">notification settings</a>.
</p>

<h2 id="publishing">Drafts and publishing</h2>
<p>
  Translations are draft-first. Respondents only see a language after you publish it. Publishing an empty language removes it from the
  respondent language picker.
</p>
<p>
  Publish after source copy is stable when possible. If you rewrite source copy after translating, use the outdated status to review only
  rows that changed instead of re-checking every row.
</p>

<h3 id="fallbacks">Missing or blank translations</h3>
<p>
  Missing strings fall back to the source language for that specific row. Respondents never see blank labels because one translation entry
  is empty. This makes it safe to publish incrementally, but mixed-language forms can feel unfinished, so review the completion count before
  shipping.
</p>

<h2 id="emails-and-pdfs">Emails and PDFs</h2>
<p>Translations carry beyond the on-page form.</p>
<ul>
  <li>
    <strong>Respondent confirmation emails</strong> use the translated custom subject/body when the respondent submits in a translated
    language. If no translated custom copy exists, formbase uses the default localized template instead of sending the source-language
    custom copy to a non-source respondent.
  </li>
  <li>
    <strong>Abandoned-response reminder emails</strong> use the respondent's saved language and the translated reminder subject/body when
    available.
  </li>
  <li>
    <strong>Attached submission PDFs</strong> are generated from the same translated form content the respondent saw, including labels,
    options, page content, and RTL layout where applicable.
  </li>
  <li>
    <strong>Owner PDF downloads</strong> can render against the frozen translation bundle for the submitted snapshot, so old downloads do
    not silently change after you edit and republish translations.
  </li>
</ul>

> ℹ️ **Submission language is preserved**
> <p>
>     formbase stores the respondent language with the submission. Later emails, PDF generation, and re-renders can use that language even if
>     you publish new translations later.
>   </p>

<h2 id="tips">Practical translation tips</h2>
<ul>
  <li>Keep source copy short before translating; concise labels reduce localization drift.</li>
  <li>Translate button-like choices as actions, not word-for-word nouns, when the target language needs it.</li>
  <li>
    Check variables and <code>@</code> mentions after AI translation. They should stay present and in the right sentence position.
  </li>
  <li>
    Preview the form with <code>?lang=xx</code> before sending localized links.
  </li>
  <li>Submit one test response per important language when emails or PDFs are enabled.</li>
  <li>Republish after accepting AI suggestions; accepted suggestions are still drafts until publish.</li>
</ul>

> ℹ️ **Free on every plan**
> <p>
>     Every plan includes the translation editor. AI-assisted suggestions use AI credits — see{' '}
>     <a href="/ai/ai-credits-usage">AI credits & usage</a>.
>   </p>

<h2 id="next-steps">Next steps</h2>
<div class="not-prose grid gap-3 sm:grid-cols-2">
  - [Language setting](/building-forms/language-setting) — Source language, browser matching, and ?lang= links
  - [Share links](/sharing-publishing/sharing-embedding) — Pin localized links with ?lang= or share-link defaults
  - [Respondent emails](/submissions-analytics/respondent-notifications) — Send localized confirmation emails
  - [Form settings](/building-forms/form-settings) — Set source language, emails, PDFs, and reminders
  - [AI credits & usage](/ai/ai-credits-usage) — What AI-assisted translation costs
</div>
