如何通过设备在Flutter中的位置获取Flutter中的时区、语言和国家ID?

r1zk6ea1  于 2022-12-27  发布在  Flutter
关注(0)|答案(7)|浏览(1315)

当我在Android或iOS设备上运行我的项目时,我想获得时区、语言和国家ID。它应该从设备的位置检测时区、语言和国家ID。
我能通过内部图书馆得到这些吗?

flseospp

flseospp1#

解释Flutter区域设置

首先,您应该了解系统设置和应用程序设置之间的区别:

  • 系统设置-系统向您的应用提供的内容,作为您的信息的用户首选项。
  • 应用程序设置--你决定的(显式或隐式)应用程序区域设置。你可以允许你的用户选择你的应用程序的任何区域设置,或者让Flutter为你选择。

获取当前系统首选项

获取当前默认的系统区域设置

import 'dart:io';

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

获取系统区域设置列表

import 'package:flutter/material.dart';

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

import 'dart:ui';

final List<Locale> systemLocales = window.locales;

应用程序的区域设置

MaterialApp小部件支持本地化。它接受 * 您 * 决定应用程序支持的语言环境列表。这意味着 * 您 * 应该在supportedLocales属性的小部件初始化中显式定义它们,并提供所谓的“本地化委托”,该委托将实际转换为选定的语言环境(localizationsDelegates属性)。如果你的应用支持除en_US之外的任何其他区域设置,则需要提供委托。**当你请求应用程序区域设置时,你将从supportedLocales**列表中获取准确值。

获取应用程序区域设置

final Locale appLocale = Localizations.localeOf(context);

MaterialApp小部件已经初始化时才起作用。在MaterialApp初始化之前,您不能使用它。显然,如果您的应用小部件没有初始化,您将无法获取其语言环境。要使用它,您必须在子组件的build方法中调用此表达式。例如:

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());
  }
}

这将在屏幕上打印en_US文本(因为这是默认区域设置,我们没有提供任何其他内容)。系统区域设置是什么无关紧要,因为我们没有显式定义本例中应用的任何区域设置,因此它返回默认值。

捕获系统区域设置更改

为了能够对系统语言环境的变化做出React,您应该使用一个有状态的小部件来实现WidgetsBindingObserver mixin,并定义系统语言环境变化时将调用的didChangeLocales方法:

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

完整示例

为了总结以上所有内容,下面是一个在启动时获取语言环境并对系统设置更改做出React的可视化示例:

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<Locale> systemLocales = WidgetsBinding.instance.window.locales;

  // Define locales that our app supports (no country codes, see comments below)
  final appSupportedLocales = <Locale>[
    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<Locale> initialSystemLocales;

  MyApp(this.initialDefaultSystemLocale, this.initialSystemLocales);

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

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
  // Store dynamic changeable locale settings here, they change with the system changes
  String currentDefaultSystemLocale;
  List<Locale> 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> 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: <Widget>[
          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<MaterialLocalizations>(context, MaterialLocalizations).formatFullDate(DateTime.now())}.'),
          Text('Current time zone: ${DateTime.now().timeZoneName} (offset ${DateTime.now().timeZoneOffset}).'),
        ],
      ),
    );
  }
}

受支持的语言环境没有国家代码来定义,以显示当前应用程序语言环境的选择是如何工作的。在内部,MaterialApp小部件将应用程序支持的语言环境列表与系统传递的用户首选项列表进行比较,并选择最合适的一个。
假设我们有以下系统语言环境列表(en_US、en_GB、ru_RU):

**单击缩略图查看完整屏幕截图。

我们的应用程序在启动时如下所示:

我们看到初始值和当前值显然是相同的。应用程序选择en环境作为其当前语言环境。
现在让我们将语言环境列表更改为如下所示,将en_GB语言环境移到顶部,使其成为默认系统语言环境:

应用程序将反映此更改:

显然,应用程序仍然选择en环境作为其当前语言环境,因为它与en_USen_GB环境都最匹配。
现在,让我们将设置更改为俄语作为默认系统值:

我们的应用程序将反映此更改:

现在您可以看到ru环境被选为应用程序语言环境。
希望这有助于理解本地化在Flutter中是如何工作的,如何获得当前值,以及如何反映系统更改。关于locale委托的细节没有解释,因为这与主题无关。
PS:这段代码只在Android下测试过,我认为只要做些小改动,它就可以适应所有其他平台。

db2dz4w8

db2dz4w82#

https://flutter.io/tutorials/internationalization/#tracking-locale
区域设置myLocale =区域设置.localeOf(上下文);
提供countryCodelanguageCode
https://docs.flutter.io/flutter/dart-ui/Locale-class.html
时区应可用于(未尝试)

DateTime.now().timeZoneName

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

ryevplcw

ryevplcw3#

试试这个:

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

sh7euo9m4#

您可以使用

import 'dart:io' show Platform;

String languageCode = Platform.localeName.split('_')[0];
String countryCode = Platform.localeName.split('_')[1];
ia2d9nvy

ia2d9nvy5#

如果您编写Platform.localeName,它会提供语言和国家,如“en_US”、“tr_TR”。
要只接受“en”或“tr”,可以使用substring()并接受前两个字母。

String deviceLanguage= Platform.localeName.substring(0,2);

它只给你“en”或“tr”等...
如果你想要国家代码,使用这个;

String deviceCountry= Platform.localeName.substring(3,5);

它只给你“美国”或“TR”等...

e0uiprwp

e0uiprwp6#

使其工作的步骤是:
1.将包作为依赖项添加到pubspec.yaml文件中

dependencies:
   flutter:
   sdk: flutter
flutter_localizations:
   sdk: flutter

1.导入flutter_localizations库并为MaterialApp指定本地化委托和受支持的本地化

import 'package:flutter_localizations/flutter_localizations.dart';

MaterialApp(
localizationsDelegates: [
    // ... app-specific localization delegate[s] here
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
    GlobalCupertinoLocalizations.delegate,
],

supportedLocales: [
    const Locale('en', ''), // English, no country code
    const Locale('es', ''), // Spanish, no country code
    // ... other locales the app supports
 ],
// ...
)

1.仅适用于iOS:打开ios模块并在本地化下添加支持的语言

1.获取当前区域设置
第一个月
如果需要,您可以访问区域设置的countryCodelanguageCode字符串属性

jk9hmnmh

jk9hmnmh7#

对于时区,所有其他答案将给予缩写,如'CET','MSK'等和GMT偏移。
要获取Europe/Paris的设备时区,请使用flutter_native_timezone package

final String currentTimeZone = await FlutterNativeTimezone.getLocalTimezone();

相关问题