Bubble has a built-in language and translation system accessible through Settings that lets you define translations for all static text in your app. This tutorial covers enabling multiple languages, translating UI elements, building a language switcher, handling right-to-left languages, and formatting dates and currencies per locale for a fully localized user experience.
Overview: Multi-Language Applications in Bubble
This tutorial guides you through creating a fully localized Bubble app that supports multiple languages. You will use Bubble's native translation system for static text, build a language selector, and handle special cases like RTL layouts and locale-specific formatting.
Prerequisites
- A Bubble app with static text elements ready for translation
- Basic familiarity with Bubble's Settings and Design tabs
- Translated text prepared for your target languages
- A Bubble account on any plan
Step-by-step guide
Enable multiple languages in Settings
Enable multiple languages in Settings
Go to Settings in the left sidebar and click the Languages tab. You will see your default language, usually English. Click 'Add a new language' and select the languages you want to support — for example, Spanish, French, and Arabic. Each language creates a new column in the translation table. Bubble lists every text string in your app in this table. You can also export the translation file as a CSV, send it to translators, and import the completed translations back.
Pro tip: Export the CSV file for professional translators instead of translating each string manually in the editor. This is faster and produces better quality translations.
Expected result: Multiple languages are added to your app and the translation table shows all text strings with columns for each language.
Translate static text for each language
Translate static text for each language
In the Settings → Languages tab, you will see a table with your default language text in the first column and empty columns for each added language. Click into each cell and type the translation. This covers button labels, placeholder text on inputs, static text elements, and error messages. For dynamic text from the database, you need a different approach — store translated versions in separate fields on your Data Type such as 'title_en', 'title_es', 'title_fr' or use a Translation Data Type that links translations to the original record.
Expected result: All static text strings have translations for each supported language in the translation table.
Build a language switcher UI
Build a language switcher UI
In the Design tab, create a Dropdown or a set of flag icon buttons for language selection. For a dropdown approach, add a Dropdown element and set its choices to your supported languages. When the dropdown value changes, create a workflow that uses Bubble's built-in Set language action from the Navigation actions to switch the app language. For a persistent preference, save the language choice to the Current User's profile using Make changes to Current User so it loads on their next visit.
Expected result: Users can select their preferred language and all static text updates immediately.
Handle right-to-left languages
Handle right-to-left languages
If you support Arabic, Hebrew, or other RTL languages, your layout needs to mirror. Add an HTML element with a script that detects the current language and sets the page direction. When an RTL language is selected, apply document.body.dir = 'rtl' via JavaScript. Also use Bubble's conditional formatting: on each Row container, add a condition that changes alignment when the language is RTL. Test thoroughly — some elements like icons and navigation may need individual RTL adjustments.
Pro tip: Create a reusable RTL handler element placed on every page so the direction logic is centralized.
Expected result: When an RTL language is selected, the page layout mirrors correctly with right-aligned text and reversed element order.
Format dates and currencies per locale
Format dates and currencies per locale
Dates and currencies display differently across locales. For dates, use Bubble's :formatted as operator with locale-specific format strings. Create conditional formatting on text elements that shows different date formats based on the current language. For currencies, create an Option Set called Currency Locale with attributes for symbol, position, decimal separator, and thousands separator. Display prices using dynamic text that combines the symbol and formatted number based on current locale settings.
Expected result: Dates and currencies display in the correct format based on the user's selected language and locale.
Store and load user language preferences
Store and load user language preferences
Add a field to your User Data Type called 'preferred_language' of type text. When a user changes their language via the switcher, add a workflow step to save the selection: Make changes to Current User → preferred_language = selected language. On the Page is loaded event, add a Set language action set to Current User's preferred_language with an Only When condition that the field is not empty. This ensures returning users automatically see the app in their chosen language.
Expected result: Returning users see the app in their previously selected language automatically on every page load.
Complete working example
1MULTI-LANGUAGE APPLICATION SUMMARY2=====================================34SETUP:5 Settings → Languages tab6 Add languages: Spanish, French, Arabic, etc.7 Fill translation table or export/import CSV89TRANSLATION COVERAGE:10 Static text: Settings → Languages (built-in)11 Dynamic data: Separate fields per language12 e.g., title_en, title_es, title_fr13 Display: Conditional text source per language1415LANGUAGE SWITCHER:16 Design tab → Add Dropdown or flag buttons17 Workflow: When dropdown changes18 → Navigation → Set language19 → Make changes to Current User20 → preferred_language = selection2122PERSISTENCE:23 User Data Type → preferred_language (text)24 Page is loaded workflow:25 → Set language = Current User's preferred_language26 → Only when: preferred_language is not empty2728RTL SUPPORT:29 HTML element with script:30 If Arabic/Hebrew: document.body.dir = 'rtl'31 Else: document.body.dir = 'ltr'32 Conditional formatting on containers:33 When language is RTL → alignment reversed3435DATE FORMATTING BY LOCALE:36 en: MM/DD/YYYY37 es/fr: DD/MM/YYYY38 ja: YYYY/MM/DD3940CURRENCY FORMATTING:41 Option Set: Currency Locale42 Attributes: symbol, position, separators43 Display: symbol + formatted number per localeCommon mistakes when creating a Multi-Language Application in Bubble
Why it's a problem: Trying to translate dynamic database content with the built-in language system
How to avoid: For dynamic content, create separate fields per language on Data Types or use a Translation Data Type
Why it's a problem: Forgetting to set the language on page load for returning users
How to avoid: Add a Page is loaded workflow that sets language to Current User's preferred_language
Why it's a problem: Not testing RTL layout on every page
How to avoid: Test every page in RTL mode and add conditional formatting for elements that do not mirror automatically
Best practices
- Use Bubble's built-in translation system for all static text
- Export translations as CSV for professional translators
- Save user language preference to their profile for seamless returning experience
- Test all supported languages thoroughly, especially RTL
- Keep text strings short and context-free for easier translation
- Use Option Sets for locale-specific formatting rules
- Provide a visible language switcher in navigation
Still stuck?
Copy one of these prompts to get a personalized, step-by-step explanation.
I need to make my Bubble.io app available in English, Spanish, and Arabic. How do I set up the translation system, build a language switcher, and handle Arabic's right-to-left layout?
Help me add multi-language support to my app. I need English, Spanish, and French with a language switcher in the header that persists the user's choice.
Frequently asked questions
How many languages can I add to a Bubble app?
Bubble supports over 100 language codes. There is no practical limit to the number of languages you can add.
Does the built-in translation system handle database content?
No. The built-in system only translates static editor text. For dynamic content, store translations as separate fields on your Data Types.
Can I auto-translate text using an API?
Yes. Use the Google Cloud Translation API via the API Connector to translate text on demand. Cache translations in your database to avoid repeated API costs.
Does language switching affect SEO?
Bubble apps are single-page applications, so language switching happens client-side without separate URLs. For multilingual SEO, consider separate pages with hreflang meta tags.
How do I handle images with text for multiple languages?
Avoid text in images. Use overlay text elements instead so the text can be translated. If you must use text images, store separate versions per language.
Can RapidDev help build a multi-language Bubble app?
Yes. RapidDev can set up the full localization system including translation management, language switching, RTL support, and locale-specific formatting for your Bubble application.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation