Aggiornamenti delle traduzioni over-the-air in Flutter
La localizzazione integrata di Flutter compila i testi nell'app, quindi ogni modifica richiede una nuova release. Questa guida carica invece le traduzioni di litei18n all'avvio dell'app, con la copia inclusa come riserva.
Passaggi di configurazione
Crea una release
In litei18n, esegui il commit delle traduzioni e crea una release nella pagina Releases (dal piano Starter in su). Copia l'ID del progetto dall'URL della release mostrato lì. Esporta anche le traduzioni in JSON e aggiungile alla tua app come copia inclusa.
Carica la release all'avvio dell'app
Aggiungi il pacchetto http a pubspec.yaml, metti i file JSON esportati in assets/i18n/ ed elenca quella cartella sotto flutter: assets: in pubspec.yaml, altrimenti l'app non può leggerli. Questa classe legge prima il file incluso, poi ne sostituisce i valori con l'ultima release quando la rete lo consente.
lib/translations.dartimport 'dart:convert'; import 'package:flutter/services.dart' show rootBundle; import 'package:http/http.dart' as http; const projectId = 'YOUR_PROJECT_ID'; const releases = 'https://ttksowxkfdohtprtfarf.supabase.co/storage/v1/object/public/releases/locales'; class Translations { Translations(this._values); final Map<String, String> _values; String t(String key) => _values[key] ?? key; static Future<Translations> load(String locale) async { // The copy bundled with the app: works offline and on first launch. final values = Map<String, String>.from( jsonDecode(await rootBundle.loadString('assets/i18n/$locale.json')), ); try { final res = await http .get(Uri.parse('$releases/$projectId/latest/$locale.json')) .timeout(const Duration(seconds: 5)); if (res.statusCode == 200) { values.addAll(Map<String, String>.from(jsonDecode(utf8.decode(res.bodyBytes)))); } } catch (_) { // Offline or slow: keep the bundled copy. } return Translations(values); } }Usa i testi
Carica le traduzioni prima di runApp e passale ai widget, oppure tienile nella gestione dello stato che usi già. Una chiave mancante mostra il proprio nome, quindi è facile accorgersene.
lib/main.dartimport 'package:flutter/material.dart'; import 'translations.dart'; Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); final tr = await Translations.load('es'); runApp(MyApp(tr: tr)); } // In a widget: Text(tr.t('home.title'))Cambia i testi senza una nuova build
Modifica una traduzione, esegui il commit e crea una nuova release. L'URL latest ora restituisce il nuovo testo e la tua app lo riceve la prossima volta che carica le traduzioni. Nessuna nuova build, nessuna revisione dello store.
Buono a sapersi
- I file delle release sono in cache su una CDN, quindi una nuova release può impiegare qualche minuto per essere visibile ovunque.
- Per vincolare una versione dell'app a una release precisa, usa l'URL con versione (…/v3/es.json) invece di …/latest/es.json.
- Per conservare il testo scaricato anche offline, salva la risposta con shared_preferences o path_provider e leggila prima del file incluso la volta successiva.
Inizia a distribuire globalmente in 5 minuti
Unisciti agli sviluppatori che pubblicano le loro app in ogni lingua con litei18n.
Piano gratuito disponibile · Nessuna carta di credito · Configurazione in meno di 5 minuti