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.
Nuestra aplicación se verá así al inicio:
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:
La aplicación reflejará este cambio:
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:
Nuestra aplicación reflejará este cambio:
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 .