Over-the-air localization SDK for Flutter apps. No more unnecessary app updates.
Localizely lets you update translations for your Flutter applications over the air. No need to release a new version to the App Store or Google Play. Localizely lets you push updates for text translations in your mobile apps instantly.
Most common use cases: correcting typos, optimizing texts, or updating translations on the fly.
Flutter app example with Over-the-air translation updates, available on GitHub: https://t.co/EFUIKP1WjN#flutterdev #flutter #translation
— Localizely (@localizely) October 7, 2020
Get started by creating an SDK token inside the Over the Air page for your project. You will need the token for configuring Flutter SDK later.
Create your first distribution inside the same Over the Air section for your project. You can have multiple distributions but typically you will have one distribution per project. You will need Distribution ID for configuring your Flutter SDK later.
To update translations inside your apps, simply create a new release within the distribution. This will export the current state of your project and make it available to the connected Flutter apps. For each release you can specify:
By default, each release will be visible only for your app builds that initialized Localizely SDK with the prerelease flag set to true. Using such app builds only inside your team allows you to test translation changes before you publish them to your end-users.
First, you need to include localizely_sdk
library in your pubspec.yaml
file and update flutter_intl.localizely
config:
dependencies:
localizely_sdk: ^2.2.0 # Or ^1.3.0 if you use Flutter <2.0
...
flutter_intl:
enabled: true
localizely:
ota_enabled: true
Note: It is required to use Flutter Intl plugin for Android Studio / VS Code or intl_utils (1.5.0 or newer) in order to generate relevant localization dart code.
For this step you will need your SDK token (generated in step 1) and the Distribution ID (created in step 2). In your main.dart
file include the following code:
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:localizely_sdk/localizely_sdk.dart'; // Import sdk package
import 'generated/l10n.dart';
void main() {
Localizely.init('<SDK_TOKEN>', '<DISTRIBUTION_ID>'); // Init sdk
Localizely.setPreRelease(true); // Add this only if you want to use prereleases
Localizely.setAppVersion('<APP_VERSION>'); // Add this only if you want to explicitly set the application version, or in cases when automatic detection is not possible (e.g. Flutter web apps)
runApp(MaterialApp(
onGenerateTitle: (context) => S.of(context).appTitle,
localizationsDelegates: [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: S.delegate.supportedLocales,
home: HomePage()));
}
class HomePage extends StatefulWidget {
@override
State<StatefulWidget> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
bool _isLoading = true;
@override
void initState() {
super.initState();
// Call 'updateTranslations' after localization delegates initialization
Localizely.updateTranslations().then(
(response) => setState(() {
_isLoading = false;
}),
onError: (error) => setState(() {
_isLoading = false;
}));
}
@override,
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(S.of(context).pageHomeTitle)),
body: Center(
child: _isLoading ? CircularProgressIndicator() : Column(children: <Widget>[Text(S.of(context).welcome)])));
}
}
Note: Ensure you have added INTERNET
permission for Android devices.
As of localizely_sdk 2.4.0
, an update of min platform versions is required:
- Android: Required Android SDK 21 or newer (update minSdkVersion
to 21
in the android/app/build.gradle
file).
- iOS: Required iOS 11 or newer.
There is no need to update your code, refer to the keys as usual:
S.of(context).title
There is no need to update your code, change locale as usual:
setState(() {
S.load(Locale('en', 'US'));
});
The sample Flutter app with Over-the-air integration can be found in the github repository.
When a user starts an application that uses Localizely SDK for the first time on a device, it generates a unique, random Device Identifier. This identifier’s sole purpose is the tracking of active users over a given period of time. It is not used for any other form or means of tracking and does not contain any user or device information.
We will not automatically lock your OTA functionality when you exceed your MAU quota. Instead, you will be informed and you will have enough time to upgrade your OTA Add-on according to your needs.
The app will fallback to previously fetched translations from Localizely, or to embedded translations during the build time, in that order. Once the app has internet access again, it can fetch the latest translations.
Previous: Translation editor
Read next: Flutter In-Context Editing
Tired of manually editing translation files?
Our platform streamlines software localization for you.