Saltar al contenido principal
Todas las guías
Guía

Actualizaciones de traducciones over-the-air en Flutter

La localización integrada de Flutter compila los textos dentro de la app, así que cada cambio exige una nueva versión. Esta guía carga tus traducciones de litei18n al iniciar la app, con la copia incluida como respaldo.

Pasos de configuración

  1. Crea una publicación

    En litei18n, confirma tus traducciones y crea una publicación en la página Releases (plan Starter o superior). Copia el ID de tu proyecto de la URL de la publicación que aparece allí. Exporta también tus traducciones en JSON y añádelas a tu app como copia incluida.

  2. Carga la publicación al iniciar la app

    Añade el paquete http a pubspec.yaml, coloca tus archivos JSON exportados en assets/i18n/ y declara esa carpeta en flutter: assets: dentro de pubspec.yaml; si no, la app no podrá leerlos. Esta clase lee primero el archivo incluido y después sustituye sus valores por los de la última publicación cuando hay conexión.

    lib/translations.dart
    import '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);
      }
    }
  3. Usa los textos

    Carga las traducciones antes de runApp y pásalas hacia abajo, o guárdalas en el gestor de estado que ya uses. Una clave que falta muestra su propio nombre, así que es fácil detectarla.

    lib/main.dart
    import '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'))
  4. Cambia textos sin una nueva build

    Edita una traducción, confírmala y crea una nueva publicación. La URL latest ya sirve el texto nuevo y tu app lo recoge la próxima vez que cargue las traducciones. Sin nueva build ni revisión en la tienda.

Conviene saber

  • Los archivos de las publicaciones se guardan en caché en una CDN, así que una nueva publicación puede tardar unos minutos en verse en todas partes.
  • Para fijar una versión de la app a una publicación concreta, usa la URL con versión (…/v3/es.json) en lugar de …/latest/es.json.
  • Para conservar el texto descargado sin conexión, guarda la respuesta con shared_preferences o path_provider y léela antes que el archivo incluido la próxima vez.

Empieza a enviar globalmente en 5 minutos

Únete a los desarrolladores que envían sus apps en todos los idiomas con litei18n.

Plan gratuito disponible · Sin tarjeta de crédito · Configuración en menos de 5 minutos