Saltar al contenido

¿Cómo obtener la zona horaria, el idioma y la identificación del condado en flutter por la ubicación del dispositivo en flutter?

Después de de una larga compilación de datos hemos podido resolver esta obstáculo que pueden tener ciertos de nuestros lectores. Te ofrecemos la respuesta y deseamos que te sea de gran ayuda.

Solución:

https://flutter.io/tutorials/internationalization/#tracking-locale

Locale myLocale = Localizations.localeOf (contexto);

proporciona countryCode y languageCode

https://docs.flutter.io/flutter/dart-ui/Locale-class.html

La zona horaria debería estar disponible con (no probado)

DateTime.now().timeZoneName

https://docs.flutter.io/flutter/dart-core/DateTime-class.html

Explicación de las configuraciones regionales de Flutter

En primer lugar, debe comprender la diferencia entre la configuración del sistema y la configuración de su aplicación:

  • Configuración del sistema: lo que el sistema proporciona a su aplicación como preferencias de usuario para su información.
  • Configuración de la aplicación: qué usted decidió (explícita o implícitamente) ser la configuración regional de la aplicación. Puede permitir que sus usuarios seleccionen cualquier configuración regional de su aplicación o dejar que Flutter lo haga por usted.

Obtener las preferencias actuales del sistema

Obtener la configuración regional del sistema predeterminada actual

import 'dart:io';

final String defaultLocale = Platform.localeName; // Returns locale string in the form 'en_US'

Obtener la lista de configuraciones regionales del sistema

import 'package:flutter/material.dart';

final List systemLocales = WidgetsBinding.instance.window.locales; // Returns the list of locales that user defined in the system settings.

o

import 'dart:ui';

final List systemLocales = window.locales;

Local de su aplicación

El widget MaterialApp admite la localización. Acepta la lista de configuraciones regionales que usted decidió que su aplicación es compatible. Eso significa usted debe definirlos explícitamente en la inicialización del widget en el supportedLocales propiedad y proporcionar los llamados “delegados de localización” que harán la traducción real a una ubicación seleccionada (el localizationsDelegates propiedad). Es necesario proporcionar delegados si su aplicación admite otras configuraciones regionales excepto en_US. Cuando solicite una configuración regional de la aplicación, obtendrá un valor exacto de la lista de supportedLocales.

Obtener la configuración regional de su aplicación

final Locale appLocale = Localizations.localeOf(context);

Esto funciona solamente cuando el MaterialApp El widget ya está inicializado. No puede usarlo antes del MaterialApp inicialización. Obviamente, si el widget de su aplicación no está inicializado, no podrá obtener su configuración regional. Para usarlo, debe llamar a esta expresión en el componente secundario build método. Por ejemplo:

void main() async 
  runApp(
    MaterialApp(
      title: 'MyApp',
      home: MyApp(),
    )
  );


class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    // Show the name of the current application locale
    return Text(Localizations.localeOf(context).toString());
  


Esto imprimirá el en_US texto en la pantalla (porque esta es la configuración regional predeterminada y no proporcionamos nada más). No importa cuál sea la configuración regional del sistema porque no definimos explícitamente ninguna configuración regional para nuestra aplicación en este ejemplo y, por lo tanto, devuelve la predeterminada.

Detectar cambios en la configuración regional del sistema

Para poder reaccionar ante los cambios de configuración regional del sistema, debe utilizar un widget con estado que implemente la WidgetsBindingObserver mezclar y definir el didChangeLocales método que se llamará en los cambios de configuración regional del sistema:

  @override
  void didChangeLocales(List locale) 
    // This is run when system locales are changed
    super.didChangeLocales(locale);
    setState(() 
      // Do actual stuff on the changes
    );
  

Ejemplo completo

Para resumir todo lo anterior, aquí está el ejemplo visual de cómo obtener las configuraciones regionales al inicio y reaccionar ante los cambios de configuración del sistema:

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';

void main() async 
  WidgetsFlutterBinding.ensureInitialized();

  // Get the initial locale values
  final String defaultSystemLocale = Platform.localeName;
  final List systemLocales = WidgetsBinding.instance.window.locales;

  // Define locales that our app supports (no country codes, see comments below)
  final appSupportedLocales = [
    Locale('ru'),
    Locale('en'),
  ];

  final MyApp myApp = MyApp(defaultSystemLocale, systemLocales);

  runApp(
    MaterialApp(
      title: 'MyApp',
      home: myApp,
      supportedLocales: appSupportedLocales,
      localizationsDelegates: [
        // These are default localization delegates that implement the very basic translations for standard controls and date/time formats.
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
    )
  );


class MyApp extends StatefulWidget 
  // Store initial locale settings here, they are unchanged
  final String initialDefaultSystemLocale;
  final List initialSystemLocales;

  MyApp(this.initialDefaultSystemLocale, this.initialSystemLocales);

  @override
  _MyAppState createState() => _MyAppState();



class _MyAppState extends State with WidgetsBindingObserver 
  // Store dynamic changeable locale settings here, they change with the system changes
  String currentDefaultSystemLocale;
  List currentSystemLocales;

  // Here we read the current locale values
  void setCurrentValues() 
    currentSystemLocales = WidgetsBinding.instance.window.locales;
    currentDefaultSystemLocale = Platform.localeName;
  

  @override
  void initState() 
    // This is run when the widget is first time initialized
    WidgetsBinding.instance.addObserver(this); // Subscribe to changes
    setCurrentValues();
    super.initState();
  

  @override
  void didChangeLocales(List locale) 
    // This is run when system locales are changed
    super.didChangeLocales(locale);
    // Update state with the new values and redraw controls
    setState(() 
      setCurrentValues();
    );
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(),
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        mainAxisAlignment: MainAxisAlignment.start,
        children: [
          Text('Initial system default locale: $widget.initialDefaultSystemLocale.'),
          Text('Initial language code: $widget.initialDefaultSystemLocale.split('_')[0], country code: $widget.initialDefaultSystemLocale.split('_')[1].'),
          Text('Initial system locales:'),
          for (var locale in widget.initialSystemLocales) Text(locale.toString()),
          Text(''),
          Text('Current system default locale: $currentDefaultSystemLocale.'),
          Text('Current system locales:'),
          for (var locale in currentSystemLocales) Text(locale.toString()),
          Text(''),
          Text('Selected application locale: $Localizations.localeOf(context).toString().'),
          Text(''),
          Text('Current date: $Localizations.of(context, MaterialLocalizations).formatFullDate(DateTime.now()).'),
          Text('Current time zone: $DateTime.now().timeZoneName (offset $DateTime.now().timeZoneOffset).'),
        ],
      ),
    );
  


Las configuraciones regionales admitidas se definen sin códigos de país para mostrarle cómo funciona la selección de la configuración regional actual de la aplicación. Internamente, el MaterialApp widget está comparando la lista de configuraciones regionales admitidas por la aplicación con la lista de preferencias de usuario transmitidas por el sistema y selecciona la más adecuada.

Supongamos que tenemos la siguiente lista de configuraciones regionales del sistema (en_US, en_GB, ru_RU):

** Haga clic en la miniatura para ver la captura de pantalla completa.

lista inicial de locales

Nuestra aplicación se verá así al inicio:

estado inicial de la aplicación

Vemos que los valores iniciales y actuales obviamente son los mismos. La aplicación seleccionó el en locale como su locale actual.

Ahora cambiemos la lista de configuraciones regionales a lo siguiente, moviendo la configuración regional en_GB a la parte superior, convirtiéndola en la configuración regional predeterminada del sistema:

Configuración regional del Reino Unido en la parte superior

La aplicación reflejará este cambio:

aplicación con la configuración regional del Reino Unido

La aplicación obviamente todavía selecciona el en locale como su locale actual porque es la coincidencia más cercana a ambos en_US y en_GB locales.

Ahora cambiemos la configuración al idioma ruso como valor predeterminado del sistema:

Configuración regional RU en la parte superior

Nuestra aplicación reflejará este cambio:

aplicación con la configuración regional RU

Ahora puedes ver que el ru locale fue seleccionada como la configuración regional de la aplicación.

Espero que esto ayude a comprender cómo funciona la localización en Flutter, cómo obtener los valores actuales y cómo reflejar los cambios del sistema. Los detalles sobre los delegados de configuración regional no se explican porque no se trata aquí.

PD: este código se prueba solo en Android. Creo que con pequeños cambios se puede adaptar a todas las demás plataformas.

Prueba esto:

import 'dart:ui' as ui;
......
 @override
  Widget build(BuildContext context) {
// get system language code
    _sysLng = ui.window.locale.languageCode;    
...

Aquí tienes las comentarios y calificaciones

Recuerda que te brindamos la opción de decir .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *