That difference is deliberate: a link is a public URL that must always render something, while an app survey
is targeted at a known user, and showing them a survey in a language they did not ask for is worse than not
showing it at all. See App and website surveys for the full rule.
Add languages to your workspace
Languages live on the workspace, so every survey in it can use the same list.1
Open the Survey Languages settings
Go to your workspace settings and open Survey Languages:

2
Add a language
Click Edit languages, then Add language, and pick the language from the dropdown. The
Identifier is filled in for you — it is the language’s BCP-47 tag, such as 
Optionally set an Alias: an alternate name you can use instead of the identifier in link survey URLs
and in the SDK. It is worth setting when your app already works in tags of its own, such as
de-DE or ar-EG.
en_us. A
bare two-letter code like de is rejected — it names a language of its own in the picker, so allowing it
as another language’s alias would make the two ambiguous. Click Save changes when you are done.The language itself and its identifier are fixed once the language is created — only the alias stays
editable. A language that is still used by a survey cannot be removed; Formbricks lists the surveys that
hold it so you can remove it there first.
Activate translations for a survey
1
Open the Language tab
Open the survey editor and switch to the Language tab.
2
Turn on Activate translations
Enable Activate translations and pick the survey’s default language. The default language is the
one your existing content is already written in.

Choosing the default language is a one-way decision. To change it later you have to switch
Activate translations off, which deletes every translation on the survey.
3
Make languages visible
Every workspace language shows up as a row with its Code, a Translated progress bar, and a
Visible toggle. Turn Visible on for each language respondents should be able to answer in.A visible language must carry a translation for every required field before the survey can be
published, and before further changes to an already-published survey can be saved. A draft saves
either way, so you can stop mid-translation and come back. If a live survey blocks you, switch the
unfinished language back to invisible — the translations you already entered are kept.
Translate your survey content
Once a language is switched on, click its row — or ⋮ → Manage translations — to open the translations editor for that language. It lists every translatable string side by side: the default language on the left, the target language on the right.
Translate with AI
Translate with AI fills in every empty field for the language you have open, in one pass — headlines, descriptions, choices, button labels and all. Strings you have already translated are left untouched, so you can run it again after adding a question and it will only fill the gap.1
Open the language you want to fill
Open Manage translations for that language. The button is active as long as there is at least one
empty field left to fill.
2
Click Translate with AI
The translations appear in the right-hand column, formatting and rich text included.
3
Review, then save
Read the result before you keep it — tone and product terms are the two things worth a second look — edit
anything you want to change, and click Save. That hands the translations back to the editor; they are
only stored once you save or publish the survey itself.
Translate with AI is an Enterprise feature. It needs Smart
functionality (AI) enabled for your organization and a configured AI instance — see
AI Features. Without it, the button is disabled and its tooltip says
which of the two is missing.
Translate by hand
Type your translations straight into the right-hand column of the same editor. Two things help on a long survey:- Missing first re-sorts the list so untranslated strings come first. Show in order puts it back into survey order.
- The ID column tells you where a string lives —
1.1is the first element of the first block,Wis the welcome card — so you can find it again in the editor.
Let respondents switch language
Turn on Show language switch in the Language tab to put a language picker in the survey itself, on every card, so respondents can change language at any point instead of only at the start. It needs at least two visible languages.
Link surveys
A link survey renders in whatever language thelang URL parameter asks for:

lang accepts the language’s identifier (de-DE) or its alias, and matching is case-insensitive. Formbricks
resolves it in a fixed order: an exact identifier first, then an alias, then a canonical match. That last pass
is what makes a shortened or legacy code work — ?lang=de reaches de-DE, and an old ?lang=pt link still
reaches a language since stored as pt-BR.
Without a lang parameter — or with one that names a language the survey does not have, or one that is not
visible — the survey opens in its default language.
In Share survey → Link settings you can also set the link preview title and description per language,
so a survey shared in a German-speaking channel previews in German. The preview image is one image for the
whole survey — it is not per-language.
App and website surveys
For app and website surveys, the language comes from the user’slanguage attribute, which you set through
the SDK:
setLanguage() whenever your app’s language changes — for example right after the user switches it in
your own settings — and Formbricks will use the new value for every survey it shows from then on.
setLanguage() accepts a language’s identifier or its alias, case-insensitively. Unlike the lang URL
parameter, it does not fall back to a canonical match — see the note below.
What happens when a translation is missing
For a survey with more than one language, Formbricks resolves the user’slanguage attribute like this:
The last row is deliberate: a targeted survey is skipped rather than shown in a language the user did not ask
for. A survey with only one language, or with translations switched off entirely, is exempt — it ignores the
language attribute and is shown to a matching user whatever their language is set to.
The value you pass has to match a language’s identifier or its alias exactly — Formbricks does not widen a
bare code to a region-tagged one here, the way the
lang parameter does. With a survey language stored as
ar-EG, setLanguage("ar") matches nothing and the survey is skipped, while ?lang=ar on a link survey
still resolves. Pass the identifier exactly as Survey Languages shows it; a bare code cannot be papered
over with an alias, because ar is rejected as one.Right-to-left languages
Right-to-left languages need no configuration. When the active language is an RTL one — Arabic, Hebrew, Persian or Urdu — the whole survey mirrors itself: text alignment, progress bar, rating scales, button placement and the language switch.
Built-in interface translations
Beyond the content you translate yourself, every survey ships with a set of built-in interface strings that Formbricks localizes automatically — so respondents see them in their own language without any extra work from you. These include:- Default navigation and action buttons (Back, Next, Finish)
- Form validation messages (e.g. “Please fill out this field”, “Please enter a valid email address”)
- File-upload prompts and states
- Offline, retry, and “sending responses” notices
- Attribution and helper labels like “Powered by” and “Required”
Formbricks matches the survey’s active language to the closest available bundle — for example,
de-AT and
de both use the German bundle, and pt-PT uses pt-BR. Writing script is preserved when matching, so
zh-Hant and zh-TW resolve to the Traditional Chinese bundle rather than the Simplified one. If a language
has no matching bundle, your translated survey content is still shown as usual, but these built-in interface
strings fall back to English.
Don’t see your language? These interface translations live in the open-source
@formbricks/surveys package.
You can add a new one by contributing a locale file on
GitHub.Analyzing multi-language responses
Every response records the language it was answered in, so you can:- Filter responses by Language on the summary and responses pages
- See the language of a single response on its response card
Need help? Reach out in Github Discussions