App texts (translations)
This section covers how to translate your app into multiple languages
App texts, short for Application texts and messages, are a kind of database for the text strings you use around your app. You can use them for a single language, or translate every string into other languages to offer users a multilingual app.
App texts are part of Bubble's static data features. That means they aren't dynamic like the database, and your app has to be redeployed whenever one changes. Because of that, they're meant for shorter content like headers, menu options, and button labels, not long strings like articles or product descriptions.
App texts become part of your app's codebase and are downloaded to every user on page load. Never use them to store sensitive information.
Using app texts
An app text can be used in any expression, so you can assign it to any element property that accepts a dynamic text. This includes text elements, button and checkbox labels, text input fields, tooltips, and many other places.

In the editor, the property shows App text ([name]), while your running app shows the string you saved for the currently active language.

This also means you can use app texts in workflows, element conditions, and anywhere else you can insert a dynamic expression. In the example above, we selected App text as the data source and My input as the operator. My input is the ID of the specific string we want to show, which means it has to be created first.
Editing app texts
To open the app text editor, go to the Settings tab, in the Languages section. Under General settings you'll find your app's default language and the field on the user that determines their language preference (more on that below).
Under Application texts and messages, you'll find every custom string you've added, along with Bubble's core texts. The left column is the string's ID. In the earlier example, the ID was My input.

Core texts
Core texts are the strings Bubble includes by default. You can change what they say, but you can't delete them, and their IDs stay fixed. They cover the error and informational messages tied to Bubble's core functionality, and they're already translated into every available language.

Element strings
Some elements and plugins add their own strings, which appear at the bottom of the list. The multi-file uploader plugin, for example, adds strings like Cancel upload and Remove file.
Exporting and importing translations

Bubble lets you export all your language strings to a CSV file, adjust them, and re-import the file. This is an efficient way to have someone else translate your strings without giving them access to the Bubble editor.
Exporting and importing translations
Bubble lets you export your language strings to a CSV file, adjust them, and re-import the file. This is an efficient way to have someone translate your strings without giving them access to the Bubble editor.
Exporting
What the CSV looks like
The exported file has one row per text string and one column per language. The first few columns identify each string:
plugin_name
Where the string comes from, such as CORE for Bubble's core texts or USER_TEXTS for your own.
text_name
An internal identifier for the string.
text_code
The string's ID, like My Dashboard or 2FA_TEMP.
After those, each remaining column is one language, headed by its language code (af_za, sq, and so on). The cell where a string's row meets a language's column holds that string's translation in that language. To translate your app, fill in the cells under each language column.
Don't change the text IDs or the column structure. Bubble matches each row back to its string using these, so altering them will break the import. Importing also overwrites all strings, even where a cell is left empty, so keep any string you want to retain in the file.
Importing
Importing a CSV overwrites all strings, even where a cell is left empty. To keep a string as it was on export, make sure it stays in the file.
How Bubble determines the language
On web apps, Bubble picks the current language using this order of priority:
The
langparameter in the URL, if setThe current user's language, if the field exists and its value is valid
The app's primary language
English
Setting up multiple languages
App texts use IETF language tags to identify each language and dialect.
Setting the main language
The main language is what Bubble uses to run your app when no language setting applies. It defines the messages your app can send and show, and it changes how location-sensitive elements behave, for example how dates are formatted in the date input, calendar, and map elements.
Setting the language field on the user
Users don't have a built-in language field, but Bubble lets you add one if you need it. Bubble reads the user's language from this field, so its value has to be a valid IETF language tag, one of the codes in the language dropdown.
Create a Languages option set
Create an option set to hold your languages, and give it an attribute for the language code. In this example, the Languages option set has an IETF language tag attribute, and the Spanish option stores the code es_es. Add an option for each language you want to support.

Configure the language settings
Go to the Settings tab, in the Languages section. Set Language field on the user type to the field you created. Since this field holds an option set rather than a plain text code, also set Attribute for language field to the attribute that holds the code, in this example IETF language tag. Bubble then displays strings in each user's language based on that value.

If the field is empty, Bubble falls back to the language set in Application primary language.
Setting the language with a URL parameter
You can also set the language in the URL with the lang query parameter: add lang=code to the URL, where code is the language code from the Settings tab, in the Languages section. Most, but not all, of these codes follow a two-character, underscore, two-character format.
For example, to run your app in Russian, you'd use https://myapp.com?lang=ru_ru.
App texts in native mobile apps
App texts work in native mobile apps too, so you can localize your content there as well. The main difference is how the app decides which language to show.
How it works
When a mobile app launches, Bubble compares the device's primary language against the list of supported languages in your app's mobile settings. If it finds a match, it uses that language's app text translations. If not, it shows content in the primary app language.
You manage supported languages in the Settings tab, under Supported languages.

Supported languages and dialects
Some languages have regional variations, known as dialects. Spanish, for example:
es_es(Spanish, Spain)es_mx(Spanish, Mexico)es_ar(Spanish, Argentina)
Bubble lets you set a specific dialect for each supported language, using the Select base language and Select region or dialect fields. A user's device, though, might report only a base language like es, with no region. To handle that, each supported language has a Select fallback language setting that decides which dialect to use when the device gives only the base language.
For example, if you support es_mx and es_ar and a device reports only es, Bubble uses the fallback dialect you set, such as es_mx.
How mobile chooses a language, in short
A supported dialect
That dialect's translation
A base language only
The fallback dialect you defined
No match
The app's primary language
Updating supported languages
Adding a supported language can go out in an over-the-air (OTA) update.
Translations for system-level prompts, like permission messages, need a new build, since those values are compiled into the native binary.
FAQ: App texts
Last updated
Was this helpful?


