Complete Setup Guide
Everything you need to install, configure, and use GoLocal! to make your Bubble.io app multilingual.
Safe Bubble data, stable UI translation, and explicit multilingual logic
Update the plugin from Bubble's Plugins tab before testing the features below. Project configuration, translations, and billing stay attached to the GoLocal project. App developers do not need to paste or maintain a script in Bubble's HTML Header; the published plugin version contains the supported runtime.
Editable data stays untouched
Ordinary Inputs, Multiline Inputs, Quill editors, and other contenteditable areas are not reverse-translated while a user types.
Reusable content exclusions
Protect user-entered database values and repeating-group cells with do_not_translate_selectors instead of duplicated HTML IDs.
Safe automatic reverse lookup
Bubble SearchBox, Dropdown, legacy MultiDropdown, and Select2 MultiDropdown can match translated choices against source-language values.
GoLocal Query element
Use one independent GoLocal Query element per ordinary Input only when that Input drives a source-language text search, condition, or API filter.
1 Install the Plugin
GoLocal! is available as a free plugin on the Bubble.io marketplace. You don't pay anything to install it — the plugin itself costs $0. Billing only applies when you connect it to a GoLocal! project with an API key.
Open the Bubble editor → Plugins tab.
Click "+ Add plugins" and search for "GoLocal" or "Auto Translator".
Install GoLocal! — Auto Translator. If it is already installed, update it to the latest published version.
Drag the GoLocal! element onto any page (typically a reusable header). The element is invisible.
2 Create Your Account & Project
To activate the plugin, you need an API key. API keys are generated in your GoLocal! dashboard when you create a project.
A 5-day free trial starts automatically. No credit card required. Your API key is generated immediately.
Copy the API key — you'll need it when configuring the plugin in Bubble.
myapp.bubbleapps.io, enter exactly that.3 Configure the Plugin
Click on the GoLocal! element. At minimum, set one field:
Minimum required setup:
api_key→ paste the API key from your GoLocal! projectWith just the API key, GoLocal! loads the project configuration, uses the visitor's browser or saved widget selection, translates visible UI text, and shows the language switcher.
4 Plugin Fields — Reference
api_keyRequiredYour project's API key from the GoLocal! dashboard.
Domain-bound — safe to include in client-side code.
source_languageOptionalTwo-letter code of your app's original language. Examples: en, uk, de.
Normally leave this empty when the source language is already configured in the GoLocal project. Set it only when you intentionally need to override the project/Worker value.
target_languageOptionalNormally leave this field empty. The widget and the visitor's persisted selection control the active language across page loads.
A hard-coded value such as fr forces that language whenever the element initializes and can override the visitor's choice. Bind a dynamic value only when your Bubble app intentionally owns language state and supplies one stable language code on every page.
enabledOptionalCheckbox controlling whether translation is active. Default: checked.
show_widgetOptionalShow the built-in language switcher widget. Default: checked. Turn it off only when your Bubble app provides its own language controls and calls switch_language.
widget_positionOptionalWidget position: bottom-right (default), bottom-left, top-right, top-left.
dataset_1OptionalPre-translate your Bubble database for instant loading.
Structured format (recommended):
// Bubble setup:
Do a search for (Categories) :format as text
Content: {This Category's Title ; This Category's Name ; This Category's Body}
Delimiter: ,
// Append another type:
:append Do a search for (Cures) :format as text
Content: {This Cure's Title ; This Cure's Name ; This Cure's Prescription}
Delimiter: ,
Fields inside { } separated by ; — blocks separated by ,. See Datasets for details.
do_not_translate_idsOptionalComma-separated element IDs to never translate. Specifying a group/container ID excludes all children.
Example: user-bio, code-block, brand-section
HTML IDs must be unique. Do not reuse the same ID in repeating-group cells; use do_not_translate_selectors with a class instead.
do_not_translate_selectorsOptionalCSS selectors for reusable or repeating content that must stay exactly as stored. A matching element and all of its children are excluded.
Examples: .gl-user-content, [data-user-content], [id^="gl-user-content-"]
Recommended for user-entered database values and repeating groups. A class or ID-prefix selector can safely match many rows without creating duplicate HTML IDs.
private_translate_idsOptionalElements that are translated but translations aren't cached globally. Use for per-user data (names, addresses).
Example: user-name, order-address
If the content must remain exactly as the user entered it, do not use this field. Exclude it with do_not_translate_selectors instead.
5 Datasets — Translating Your Bubble Database
Most Bubble apps display data from the database. Without datasets, dynamic content is translated on first view — causing a visible delay. Datasets pre-translate everything for instant loading.
Format 1: Structured — for multi-field items (recommended)
Wrap each item in {}, separate fields with ; (semicolon), use , as delimiter between items.
// Bubble: Do a search for (Categories) :format as text
Content: {This Category's Title ; This Category's Name ; This Category's Body}
Delimiter: ,
// Append: Do a search for (Cures) :format as text
Content: {This Cure's Title ; This Cure's Name ; This Cure's Prescription}
Delimiter: ,
// Result: {Health;Wellness;Guide...},{Beauty;Skincare;Routines...},{Aspirin;Relief;Take 2x...}
{} split by ; — blocks split by , — commas in your text are safe.Format 2: Simple — for single-value lists
For short values without commas (category names, tags):
Content: This Category's Name Delimiter: ,
// Output: Electronics,Clothing,Books,Toys
Important: If text may contain commas, always use the structured format with {field;field} wrapping.
normalized_query only in the filter or condition. See the full Bubble guide.6 Bubble States, Events & Actions
The main GoLocal! element owns page translation and exposes the active language to Bubble. Use its states in conditions and its events to start workflows at the correct point in the translation lifecycle.
1. Runtime ready
translator_ready = yes means GoLocal initialized. It does not mean every dynamic Bubble element has finished translating.
2. Language changed
language_changed fires when the active language changes. Read current_language here.
3. Pass complete
translation_complete fires after a translation batch completes. Dynamic content may create later batches.
current_languagetextThe active two-letter language code. Use it for PDF links, Bubble conditionals, and app-owned language UI.
detected_languagetextThe detected source/browser language reported by the runtime.
translator_readyyes/noYes after the translation runtime has initialized.
is_translatingyes/noYes while GoLocal is processing a translation pass.
translation_completeyes/noCompletion flag for the most recent pass.
total_textsnumberNumber of text items observed in the current runtime session.
cached_local / cached_bundle / cached_servernumberDiagnostic cache counters. Useful for support and performance checks.
translated / errors / tokens_usednumberRuntime translation and error counters.
last_error / preload_statustextThe latest runtime error and preload status for diagnostics.
Element actions
switch_language— switch to the required action fieldtarget_lang, for examplefr.Start_translation— start or resume observing and translating.Stop_translation— stop observing and translating until restarted.rescan_dom— explicitly scan content rendered after a Bubble popup, reusable element, or repeating-group update.
Example: show a French PDF link
Create a Bubble condition on the link or group: When GoLocal! A's current_language is "fr". If a workflow must run when the visitor switches language, use When GoLocal! A language_changed. You do not need to wait for translation_complete just to read the selected language.
7 User Data, Forms & Repeating Groups
GoLocal translates interface text, but data typed or created by your users must remain stable. The current runtime protects ordinary Inputs, Multiline Inputs, Quill editors, and other contenteditable areas while a person types.
Safe by default
- • Input and Multiline Input values save exactly as typed.
- • Quill
.ql-editorand other editable regions are skipped while typing. - • Emails, passwords, numbers, dates, IDs, and files should always use their original Bubble values.
Display needs an exclusion
When saved user content is later displayed by a normal Bubble Text element, GoLocal cannot know whether it is UI copy or user data. Mark that display element or its smallest container as a no-translate zone.
Recommended repeating-group setup
- 1. Select only the Text element that displays user content. Do not exclude the entire repeating group if its buttons, headings, and static labels should still translate.
- 2. Give each row a unique dynamic ID.gl-user-content-Current cell's Thing's unique id
- 3. Add one selector to the GoLocal element.do_not_translate_selectors = [id^="gl-user-content-"]
If your Bubble setup or a reusable element can apply a custom class, .gl-user-content is even simpler. Add that class once to do_not_translate_selectors.
Supported no-translate markers
The runtime respects data-tr-skip, data-no-translate, translate="no", and nested .notranslate elements. The configured ID and CSS selector fields remain the easiest Bubble-native method.
Skip versus private translation
do_not_translate_* preserves the original value. private_translate_ids still translates the value but prevents a shared global cache. Use private translation only when the content should genuinely be translated.
home or check_box. If an icon is text-backed, exclude the smallest icon/control container so the glyph keyword is never translated.8 Translation Editor & Manual Corrections
Use the Translation Editor for fixed product copy: navigation labels, headings, buttons, help text, and other phrases that should have one reviewed translation. Manual entries are locked and are not replaced by later automatic translation.
Good manual correction
Source Upgrade plan → reviewed French product phrase Améliorer le plan. This is stable interface copy and belongs in the editor.
Do not correct user data one row at a time
A customer-created name such as Travail à domicile should be excluded at the Bubble display element. Adding thousands of identity translations is not a safe replacement for a no-translate zone.
- 1. Open the project in the GoLocal dashboard and choose Translations.
- 2. Search the exact source phrase and language pair.
- 3. Edit the target value, or use Add Translation for a new exact source phrase.
- 4. Save. The entry is marked manual, the bundle version changes, and the runtime refreshes the project dictionary.
- 5. Retest the exact Bubble route where the phrase renders. Use
rescan_domonly if the phrase appears after an unusual third-party render.
en → fr, not auto → fr. The runtime requests the project's resolved source pair.9 How Translation Works
GoLocal watches the rendered Bubble DOM, applies translations from the project bundle and local cache first, and requests only missing or changed phrases. It continues observing popups, reusable elements, and repeating groups that Bubble renders later.
Initial page load
The runtime resolves source and target languages, loads the current project bundle, scans visible UI text, and reveals the page through the built-in anti-flicker flow.
Cached translations
Known phrases are applied from the bundle or browser cache without regenerating them. A changed bundle version invalidates stale cached values.
Dynamic Bubble content
The DOM observer picks up newly rendered popups, reusable elements, conditionally visible groups, and repeating-group cells. rescan_dom is an explicit fallback.
10 Troubleshooting & Release Testing
The page resets to one language
Leave target_language empty on every page and reusable GoLocal element unless your Bubble app deliberately owns the language. A hard-coded value is reapplied on initialization.
The widget is missing
Confirm show_widget is checked, the newest plugin version is installed, and only one intended GoLocal element controls the page. Then test outside Bubble step-by-step debugger mode.
A popup or new repeating-group row remains untranslated
Wait for the element to become visible. The observer normally finds it automatically; if a third-party element renders unusually, run rescan_dom after the popup or group is shown.
Input or rich text changes while typing
Update the plugin, confirm the current runtime, and verify that the save workflow reads the original Input/editor value—not translated display text or normalized_query.
User-created French text is translated again
Exclude the display Text/container through do_not_translate_selectors. Protect the smallest dynamic value, not all static UI around it.
A manual correction returns to auto
Current manual entries are locked. Confirm you edited the same source text and exact language pair used by the runtime, then send the project, route, phrase, and test time to support.
Month/day names remain in English
Native browser or Bubble date-picker chrome follows the browser/control locale. GoLocal translates surrounding labels but does not rewrite the internal date-picker UI.
Chrome offers its own page translation
The plugin already marks the document notranslate for browser translation while allowing GoLocal itself to run. Update the plugin; do not add a second translation extension or script.
Text wraps differently after translation
GoLocal preserves Bubble typography. Translated phrases can be longer, so verify Bubble min width, max width, fit height, overflow, and responsive rules at every breakpoint.
Bubble acceptance checklist
- ✓Switch source → target → source without refreshing.
- ✓Navigate between all Bubble pages and reusable headers.
- ✓Open popups and load repeating-group rows after page load.
- ✓Type, paste, edit, save, and reopen normal and rich-text fields.
- ✓Test one excluded user-data value inside each repeating group.
- ✓Test SearchBox, Dropdown, legacy/Select2 MultiDropdown search.
- ✓Test every current_language conditional and PDF/resource link.
- ✓Retest Chrome, Safari, mobile width, and a private session.
[GoLocal v4].11 Pricing & Billing
Three plans, all with unlimited translation words and unlimited target languages.
| Feature | Starter | Pro | Business |
|---|---|---|---|
| Monthly price | $15/mo | $35/mo | $89/mo |
| Yearly price | $149/yr | $349/yr | $890/yr |
| Target languages | Unlimited | Unlimited | Unlimited |
| MAU limit | 30K | 150K | 1M |
| Projects | 1 | 1 | 2 |
MAU
Unique visitors who saw translations. Bots filtered out. 10% overage free, then $3/10K extra.
Languages
All paid plans include unlimited target languages at no additional per-language charge.
5-Day Free Trial
Every new project starts with a free trial. No credit card required.
12 Partner Program
Earn money by recommending GoLocal!
Share your referral link — earn recurring commissions for every paying customer you bring.
Sign up as a partner
Dashboard → Partner tab → "Join Partner Program". Get your unique referral link.
Share your link
Blog, YouTube, Bubble forum, social media, tutorials, or directly with clients.
Earn commissions
Recurring commission for the lifetime of each referred user's subscription.
Get paid
Request payout via bank transfer or PayPal when balance reaches minimum threshold.
Ready to make your app multilingual?
Install the free plugin, create a project, paste your API key — and your Bubble app speaks every language.