Skip to main content
RapidDev - Software Development Agency
bubble-tutorial

How to build a multilingual site in Bubble

Build a multilingual site in Bubble using Option Sets or a translations data type to store text in multiple languages, a language switcher UI, and user language preferences. This tutorial covers static text translation, dynamic content translation, and persisting language selection across sessions.

What you'll learn

  • How to store translations using Option Sets or a database
  • How to build a language switcher dropdown
  • How to display translated text based on the user's language preference
  • How to translate dynamic database content
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Beginner4 min read25-30 minAll Bubble plansLast updated March 2026RapidDev Engineering Team
TL;DR

Build a multilingual site in Bubble using Option Sets or a translations data type to store text in multiple languages, a language switcher UI, and user language preferences. This tutorial covers static text translation, dynamic content translation, and persisting language selection across sessions.

Quick facts about this guide
FactValue
ToolBubble
DifficultyBeginner
Time required25-30 min
CompatibilityAll Bubble plans
Last updatedMarch 2026

Overview: Multilingual Sites in Bubble

A multilingual site serves content in multiple languages based on user preference. Bubble does not have built-in i18n, but you can implement translations using Option Sets for static text and database records for dynamic content. This tutorial covers both approaches.

Prerequisites

  • A Bubble account with an app
  • Translations ready for your target languages
  • Basic understanding of Option Sets and conditional expressions

Step-by-step guide

1

Create a Language Option Set

Go to Data → Option sets → Create 'Language' with options: en (English), es (Spanish), fr (French), etc. Add a 'label' attribute for display names. On the User data type, add a 'preferred_language' field (type: Language option set, default: en).

Expected result: Language options and user preference field are ready.

2

Store static translations in Option Sets

Create a 'Translation' Option Set. Each option represents a text key (e.g., nav_home, nav_about, btn_signup). Add attributes for each language: text_en (text), text_es (text), text_fr (text). Enter translated values for each key. This approach is fast (zero WU) since Option Sets are cached.

Pro tip: For apps with many translations, use a Translation data type instead of an Option Set for easier management.

Expected result: Static text translations stored in an Option Set with one attribute per language.

3

Build the language switcher

Add a Dropdown in your header with data source: All Languages. Display the label attribute. When the user changes the selection: Make changes to Current User → preferred_language = Dropdown's value. If the user is not logged in, use a custom state or URL parameter to store the selection.

Expected result: Users can switch languages from a dropdown in the header.

4

Display translated text throughout the app

For every static text element, replace hardcoded text with a dynamic expression. Example: Get option Translation where Display = nav_home, then use a conditional: When language is en → text_en, When language is es → text_es. A cleaner approach: create a utility expression using the :formatted as text operator to select the right attribute based on the language code.

Expected result: All static text displays in the user's selected language.

5

Translate dynamic database content

For database content (articles, products), add translation fields directly on the Data Type: title_en, title_es, description_en, description_es. Display using conditionals based on the user's language. Alternatively, create a separate Translation data type linking content ID to language code and translated text for more scalable management.

Expected result: Dynamic content displays in the user's selected language.

Complete working example

Workflow summary
1MULTILINGUAL SITE ARCHITECTURE
2==================================
3
4LANGUAGE OPTION SET:
5 en (English), es (Spanish), fr (French)
6
7STATIC TEXT (Option Set approach):
8 Translation Option Set:
9 nav_home: text_en="Home", text_es="Inicio", text_fr="Accueil"
10 btn_signup: text_en="Sign Up", text_es="Registrarse", text_fr="S'inscrire"
11
12DYNAMIC CONTENT (database approach):
13 Article type: title_en, title_es, description_en, description_es
14 OR ContentTranslation type: content_id, language, field_name, value
15
16LANGUAGE DETECTION:
17 1. User's preferred_language (if logged in)
18 2. URL parameter ?lang=es (for sharing)
19 3. Default: en
20
21DISPLAY LOGIC:
22 Text element content:
23 When language is en Translation's text_en
24 When language is es Translation's text_es
25 When language is fr Translation's text_fr

Common mistakes when building a multilingual site in Bubble

Why it's a problem: Hardcoding text in elements instead of using translations

How to avoid: Replace all static text with dynamic expressions referencing the Translation Option Set

Why it's a problem: Adding too many languages to an Option Set

How to avoid: For more than 3-4 languages, use a database Translation data type instead of Option Set attributes

Why it's a problem: Not persisting language selection for logged-out users

How to avoid: Use a URL parameter (?lang=es) or browser localStorage via JavaScript to persist the selection

Best practices

  • Use Option Sets for static text in apps with 2-3 languages for zero-WU performance
  • Use a database Translation type for apps with many languages or dynamic content
  • Persist language preference on the User record for logged-in users
  • Use URL parameters for language sharing and SEO
  • Test all pages in every supported language before launching
  • Provide a visible language switcher in the header on every page

Still stuck?

Copy one of these prompts to get a personalized, step-by-step explanation.

ChatGPT Prompt

I want to make my Bubble.io app multilingual with English and Spanish. I need a language switcher, translated static text, and translated database content. What is the best approach?

Bubble Prompt

Add multilingual support for English and Spanish. Create a Translation Option Set for static text, add a language switcher dropdown, and display all text based on the user's language preference.

Frequently asked questions

Does Bubble have built-in translation?

Bubble has a Languages section in Settings that supports basic text translation, but it is limited. Most builders use Option Sets or database records for more control.

Can I auto-detect the user's browser language?

Yes. Use a JavaScript snippet in an HTML element to read navigator.language and set the default language accordingly.

How do I handle right-to-left languages like Arabic?

Add dir='rtl' via a conditional on the page's HTML element. Also adjust text alignment and layout direction for RTL languages.

Will multiple languages affect SEO?

For best SEO, use URL parameters (?lang=es) or separate page slugs (/es/about) so search engines can index each language version.

Can I translate Bubble system messages?

Yes. Go to Settings → Languages tab to translate built-in messages like error texts and email templates.

Can RapidDev build a multilingual Bubble app?

Yes. RapidDev implements multilingual solutions with translation management, RTL support, and SEO-optimized language routing.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation
Matt Graham

Written by

Matt Graham · CEO & Founder, RapidDev

1,000+ client projects delivered. Columbia University & Harvard Business School alumnus, U.S. Navy veteran. About the author →

Learning is great. Shipping is faster with help.

Our engineers have built 600+ apps on Bubble and the tools around it. If your project needs to be live sooner than your learning curve allows — book a free consultation.

Book a free consultation

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.