GoLocal!
Technical Guide

Complete Setup Guide

Everything you need to install, configure, and use GoLocal! to make your Bubble.io app multilingual.

📦 Free Bubble plugin + GoLocal! SaaS subscription (API key required)
Current Free/API-key PluginRuntime 4.1.23

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.

Read the GoLocal Query developer guide →

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.

a

Open the Bubble editor → Plugins tab.

b

Click "+ Add plugins" and search for "GoLocal" or "Auto Translator".

c

Install GoLocal! — Auto Translator. If it is already installed, update it to the latest published version.

d

Drag the GoLocal! element onto any page (typically a reusable header). The element is invisible.

💡
Best practice: Place GoLocal! on a reusable element (header/footer) that appears on every page.

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
Go to goinglocal.online/dashboard and sign in with Google. Instant — no forms.
b
Click "New Project". Enter project name, domain, source language, and target languages.
c

A 5-day free trial starts automatically. No credit card required. Your API key is generated immediately.

d

Copy the API key — you'll need it when configuring the plugin in Bubble.

⚠️
Domain must match exactly. The API key is bound to the domain you specify. If your Bubble app runs on 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! project

With 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_keyRequired

Your project's API key from the GoLocal! dashboard.

Domain-bound — safe to include in client-side code.

source_languageOptional

Two-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_languageOptional

Normally 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.

enabledOptional

Checkbox controlling whether translation is active. Default: checked.

show_widgetOptional

Show 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_positionOptional

Widget position: bottom-right (default), bottom-left, top-right, top-left.

dataset_1Optional

Pre-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_idsOptional

Comma-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_selectorsOptional

CSS 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_idsOptional

Elements 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...}

Key: Fields inside {} 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.

💡
You don't need to store translations in your Bubble database. GoLocal! translates and caches everything automatically. Your database stays in one language.
💡
Multilingual search is intentionally scoped. Automatic reverse lookup is available for Bubble SearchBox, Dropdown, legacy MultiDropdown, and Select2 MultiDropdown. For an ordinary Input that filters source-language text, add one GoLocal Query element and use its 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.

Exposed states
current_languagetext

The active two-letter language code. Use it for PDF links, Bubble conditionals, and app-owned language UI.

detected_languagetext

The detected source/browser language reported by the runtime.

translator_readyyes/no

Yes after the translation runtime has initialized.

is_translatingyes/no

Yes while GoLocal is processing a translation pass.

translation_completeyes/no

Completion flag for the most recent pass.

total_textsnumber

Number of text items observed in the current runtime session.

cached_local / cached_bundle / cached_servernumber

Diagnostic cache counters. Useful for support and performance checks.

translated / errors / tokens_usednumber

Runtime translation and error counters.

last_error / preload_statustext

The latest runtime error and preload status for diagnostics.

Element actions

  • switch_language — switch to the required action field target_lang, for example fr.
  • 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.

⚠️
GoLocal Query is a separate element. It does not replace the main GoLocal! element and its states are not part of the main element. Add it only for a specific normal Input whose downstream Bubble logic needs a source-language text value. Open the complete Query guide.

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-editor and 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. 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. 2. Give each row a unique dynamic ID.
    gl-user-content-Current cell's Thing's unique id
  3. 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.

⚠️
Never duplicate an HTML ID in a repeating group. A duplicate ID can cause a selector to match unpredictably or exclude a larger area than intended. Use a class, a data attribute, or a dynamic ID containing the Thing's unique ID.
💡
Material icons and custom glyph controls: some Bubble or third-party icons render from literal glyph names such as 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. 1. Open the project in the GoLocal dashboard and choose Translations.
  2. 2. Search the exact source phrase and language pair.
  3. 3. Edit the target value, or use Add Translation for a new exact source phrase.
  4. 4. Save. The entry is marked manual, the bundle version changes, and the runtime refreshes the project dictionary.
  5. 5. Retest the exact Bubble route where the phrase renders. Use rescan_dom only if the phrase appears after an unusual third-party render.
💡
Exact source-language pair matters. If the project source language is English, add the manual pair as 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.

1

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.

2

Cached translations

Known phrases are applied from the bundle or browser cache without regenerating them. A changed bundle version invalidates stale cached values.

3

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.

Anti-flicker is built into the published plugin runtime. App developers update the plugin from Bubble's Plugins tab; they do not paste a GoLocal script into the app's HTML Header. The safety timeout always reveals the page even if a network request fails.

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.
💡
Useful support evidence: send the exact live or version-test URL, project name, source and target languages, the affected Bubble element type, steps to reproduce, test time with timezone, screenshot, and console lines beginning with [GoLocal v4].

11
Pricing & Billing

Three plans, all with unlimited translation words and unlimited target languages.

FeatureStarterProBusiness
Monthly price$15/mo$35/mo$89/mo
Yearly price$149/yr$349/yr$890/yr
Target languagesUnlimitedUnlimitedUnlimited
MAU limit30K150K1M
Projects112

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.

1

Sign up as a partner

Dashboard → Partner tab → "Join Partner Program". Get your unique referral link.

2

Share your link

Blog, YouTube, Bubble forum, social media, tutorials, or directly with clients.

3

Earn commissions

Recurring commission for the lifetime of each referred user's subscription.

4

Get paid

Request payout via bank transfer or PayPal when balance reaches minimum threshold.

💡
Perfect for Bubble agencies: Recommend GoLocal! to clients. You earn passive income, they get professional translation.

Ready to make your app multilingual?

Install the free plugin, create a project, paste your API key — and your Bubble app speaks every language.