πLocalization
To provide a truly native experience, Natively supports localized Permission Descriptions and App Names. When a user's device is set to one of the following languages, the system will automatically display the corresponding translation you have provided in the dashboard.
Supported Languages
Natively currently supports AI-powered and manual translation for the following locales:
English (Default Base)
Arabic
Chinese (Simplified)
Dutch
French
German
Italian
Korean
Portuguese
Spanish
If a user's device is set to a language not included in your active translations, the app will fall back to the app's primary language.
Managing Feature Translations
Localization is handled within the specific configuration of each feature to ensure context is maintained.
The workflow
Accessing Translations: Navigate to the Features tab, select a feature (e.g., Notifications or Camera), and click Manage under the Permission description section.

The "Base Language": Your primary language acts as the "Source of Truth." Finalize your primary text first before proceeding to other languages.

Individual Translation: Select a target language tab (e.g., Italian). You can manually type your text or use the AI auto-translate button for an instant draft.

Global Bulk Translations
To save time when managing several features, use bulk synchronization actions.
Apply to all: If you update your primary base text, use the Apply to All button in the translation drawer to sync that change across all other active languages instantly.

This action will overwrite all existing manual translations for that feature. Use this only when you have made significant changes to your core messaging.
Verification & Best Practices
Following these rules will protect your app from being rejected during the App Store or Google Play review process.
Character Limits: Mobile systems have strict UI limits. If your permission description is too long, the counter will turn red.
Manual Review: Always verify AI-generated text. Automated translations can sometimes miss technical context or use a tone that doesn't fit your brand.
Truncation Warning: Be aware that Romance languages (such as Spanish, French, Italian, and Portuguese) are typically 30β35% longer than English. If an automated translation exceeds the limit, the system will automatically truncate (cut off) the text. This often happens in the middle of a sentence, causing the description to lose its meaning and potentially leading to App Store rejection.
Sync Status: Monitor your translation manager for these indicators:
β Saved and ready for build.
β οΈ Your translation is outdated.
Changing the Primary App Language
Changing your Primary Language in the App Settings is a global action that affects your entire project.
Global Update: Changing the base language triggers an automatic AI re-translation of every Permission Description in your app to match the new source.
Manual Audit: After a base language change, you must manually verify all features before build.

Note on App Store Listings Please note that the primary language you select here will also dictate the default language visible for your application in the Apple App Store and Google Play Store.
App Name Localization
The App Name is localized separately within the App Settings. This ensures that the primary identity of your app remains consistent or is specifically tailored to each market.
Unlike Permission Descriptions, the App Name is NOT automatically translated when you add a new language through the Feature Translation drawer.
Before triggering a new build, please navigate to App Settings to verify that your App Name has been correctly translated for all active languages.
Permission Description Templates
Use these templates as a baseline to ensure your app meets Apple and Googleβs strict transparency requirements.
Disclaimer: These are examples only and are not "ready-to-use" final texts. Every app has individual and unique reasons for requesting hardware access. You must always be transparent and specific with your users about why your particular app needs a permission. Failing to provide an honest, app-specific reason is the #1 cause for App Store rejections.
Camera
"Use your camera to take profile photos, scan QR codes, and upload images directly to the app."
Photo Library
"Select and upload existing photos from your library to customize your profile and share content."
Microphone
"Access to the microphone is required to record voice messages and capture audio for video uploads."
NFC
"This allows the app to scan physical NFC tags and interact with supported hardware devices."
Location
"Your location is used to provide relevant local content, map features, and personalized recommendations near you."
Location Background
"Enable background location to receive important proximity alerts and automated features even when the app is closed."
Notifications
"Stay updated with real-time alerts, reminders, and important account activity directly on your screen."
Contacts
"Sync your contacts to easily find and connect with friends or colleagues already using the app."
Calendars
"Access to your calendar allows you to save important events, book appointments, and stay organized."
HealthKit (Read)
"We read your health data to track your fitness progress and provide personalized wellness insights."
HealthKit (Write)
"This allows the app to save your activity and health updates directly to your Apple Health dashboard."
Apple ATT
"Your data will be used to provide a more personalized experience and deliver content that matches your interests."
Admob
"This allows us to show you relevant advertisements and helps keep the app free for all users."
Analytics
"We collect anonymous data to understand app performance and improve your user experience with every update."
Implementation
Choose your integration method below: Bubble.io Plugin (No-Code) or JavaScript SDK (Code).
Check Plugin
Before starting, verify if the Natively plugin is already installed in your Bubble project.
Open your Bubble editor and navigate to the Plugins tab in the left sidebar.
Check Installed Plugins: Look through your list of installed plugins for "Natively iOS & Android app builder".
If it IS installed: Check the version number. If an update is available (e.g., you see a button saying "Update"), click it to ensure you have the latest features and bug fixes.

If it is NOT installed: Click the + Add plugins button , search for "Natively", and click Install.

Check SDK
Before writing any logic, ensure the Natively SDK is correctly installed and up-to-date in your codebase.
Open your project's main HTML file (or header settings) and look for the Natively script tag inside the
<head>section.Install/Update: If missing or outdated, add the following code. You can specify the SDK version in the URL (e.g.,
@2.25.2).
Setup logic
Drag the Natively - Audio Player element onto your page.
This element must be set to Visible on page load to initialize correctly. It should be placed directly on the page root and not inside hidden containers, such as Popups, Floating Groups, Group Focus elements, or Repeating Groups. To hide the element from your UI, you may set its dimensions to 0x0 px.

Element Logic (Events, States, & Actions)
Events:
Locales Received: Fires immediately after a successful
Get Localesaction. Use this event to populate a custom state or a dropdown menu with the newly fetchedLocaleslist.Locale Updated: Fires immediately after a successful
Set Localeaction. Use this event to refresh the page data or show a "Language updated successfully" alert.Error Occurred: Fires if any action fails. Use this to trigger an error popup displaying the element's
Error messagestate.
States:
Status(Text): Returns the current operational status (e.g.,SUCCESS).Error message(Text): Returns the description of the error encountered during a failure.Locales(List of texts): An array of all locale codes supported by the app (e.g.,["en", "fr", "es"]).Current(Text): The currently active locale code being used by the app (e.g.,"fr").Default(Text): The app's original default or fallback locale.
Actions:
Get Locales: Retrieves the app's current and default locale details and a list of all supported languages.
Set Locale: Updates the app's active language to your specified locale code.
Locale(Text): The target language code (e.g.,fr).
Live Demo & Editor Example
To see a working implementation of the Localization feature we highly recommend exploring our demo application. You can test the live functionality or open the Bubble Editor to inspect the exact workflow configurations and reverse-engineer the setup for your own app.
Troubleshooting
If the feature isn't behaving as expected, the Debug Console is your best friend. It reveals the conversation between your web app and the native app.
If you cannot resolve the issue using the logs, our team is here to help. To solve your issue on the first reply, we require a Standardized Bug Report based on your debug data.
Your report must include:
App ID: Provide the unique ID found in Natively Dashboard > Settings.
Actual Behavior: A clear description of what is happening (or not happening).
Expected Behavior: A clear description of what the app should be doing.
Steps to Reproduce: A list of the exact actions needed to trigger the error.
Console Screenshot: A capture of the Debug Console showing the specific error logs.
Logic Configuration: Screenshots of the specific logic where the error occurs (e.g., Bubble workflows, API connectors, or code snippets).
Test Credentials: If the issue requires a login to reproduce, provide a set of working test credentials (User/Pass).
Last updated