es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Flutter GetX coloca las traducciones de internacionalización en archivos separados para cada idioma.

Hola, quiero traducir mi aplicación y para eso intenté usar el paquete GetX. Lo básico funciona bien, pero pienso que no es muy limpio tener todas las diferentes traducciones en un solo archivo como se muestra en el ejemplo:

import 'package:get/get.dart';

class Messages extends Translations {
  @override
  Map<string,></string,><string, string="">> get keys => {
        'en_US': {
          'hello': 'Hello World',
        },
        'de_DE': {
          'hello': 'Hallo Welt',
        }
      };
}

Idealmente me gustaría tener un archivo para cada idioma, pero las traducciones de GetX solo esperan un archivo:

  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: 'Flutter Demo',
      theme: themeData,
      translations: AppTranslations(),
      locale: const Locale('de', 'DE'),
      fallbackLocale: const Locale('de', 'DE'),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

¿Qué puedo hacer aquí para que sea más limpio? No encontré ninguna información al respecto. ¡Agradezco cualquier ayuda!</string,>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución es crear un archivo separado para cada idioma y luego importar el archivo correspondiente según el idioma seleccionado. Por ejemplo:

    En tu archivo main.dart:

    import 'package:flutter/material.dart';
    import 'package:get/get.dart';
    import 'translations.dart'; // importa los archivos de idioma
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return GetMaterialApp(
          translations: TranslationsHelper(),
          locale: Locale('en', 'US'),
          fallbackLocale: Locale('en', 'US'),
          home: HomeScreen(),
        );
      }
    }
    

    En el archivo translations.dart:

    import 'package:get/get.dart';
    
    class TranslationsHelper extends Translations {
      @override
      Map<string,></string,><string, string="">> get keys => translationValues;
    }
    
    final Map<string,></string,><string, string="">> translationValues = {
      'en_US': {
        'hello': 'Hola Mundo',
      },
      'de_DE': {
        'hello': 'Hallo Welt',
      },
      // añade más idiomas aquí
    };
    

    Luego, crea archivos separados para cada idioma, nombrados según el código de idioma, por ejemplo de_DE.dart:

    final Map<string, string=""> de_DE = {
      'hello': 'Hallo Welt',
      // añade más traducciones aquí
    };
    

    De la misma manera, crea un archivo para cada idioma compatible, siguiendo el mismo formato.

    Finalmente, en la clase TranslationsHelper, modifica el método getter keys para leer las traducciones del archivo correspondiente según la configuración regional actual:

    @override
    Map<string,></string,><string, string="">> get keys {
      Map<string,></string,><string, string="">> result = {};
      final currentLocale = Get.locale?.toString() ?? 'en_US';
    
      if (currentLocale == 'en_US') {
        result[currentLocale] = translationValues[currentLocale];
      } else {
        // Importa dinámicamente el archivo de idioma correspondiente
        final importedTranslationFile =
            import('translations/${currentLocale.toLowerCase()}.dart');
        result[currentLocale] = importedTranslationFile.defaultValues;
      }
      return result;
    }
    

    Ten en cuenta que la función de importación dinámica requiere Dart 2.6 o una versión superior. Si estás usando una versión más antigua de Dart, puedes utilizar una estrategia de importación diferente, como package:import.</string,></string,></string,></string,></string,>

Comments are closed.