如何通过颤振设备的位置来获得时区,语言和县ID?

时间:2018-06-19 08:31:26

标签: datetime dart timezone flutter

我是新手,我想在我的设备android或iOS上运行我的项目时获得时区,语言和县ID。它应该从设备的位置检测时区,语言和国家ID。我是新手,他会颤抖,不知道我怎么能得到这些。有没有图书馆,或者我可以通过内部图书馆获取这些图书馆,请给我一个方法。

8 个答案:

答案 0 :(得分:33)

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属性中明确定义它们,并提供所谓的“本地化委托”,它将实际转换为选定的语言环境({{1 }}属性)。如果您的应用支持除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混合并定义将在系统区域设置更改时调用的WidgetsBindingObserver方法:

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

定义的受支持语言环境没有国家/地区代码,以向您显示当前应用程序语言环境的选择方式。在内部,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}).'), ], ), ); } } 小部件正在将应用程序支持的语言环境列表与系统传递的用户首选项列表进行比较,然后选择最合适的语言环境。

假设我们具有以下系统区域设置列表(en_US,en_GB,ru_RU):

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

initial list of locales

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

initial app state

我们看到初始值和当前值明显相同。该应用选择了MaterialApp语言环境作为其当前语言环境。

现在让我们将语言环境列表更改为以下内容,将en_GB语言环境移到顶部,使其成为默认的系统语言环境:

UK locale on top

该应用将反映此更改:

app with the UK locale

该应用显然仍选择en语言环境作为其当前语言环境,因为它与enen_US语言环境都最匹配。

现在让我们将设置更改为俄语作为默认系统值:

RU locale on top

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

app with the RU locale

现在您可以看到选择了en_GB语言环境作为应用程序语言环境。

希望这有助于了解Flutter中的本地化工作原理,如何获取当前值以及如何反映系统更改。关于语言环境委托的详细信息未作解释,因为它不在这里。

PS:此代码仅在Android下经过测试。我认为,只要稍作更改,它就可以适应所有其他平台。

答案 1 :(得分:12)

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

  

Locale myLocale = Localizations.localeOf(context);

提供countryCodelanguageCode

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

时区应该可以使用(未​​尝试)

DateTime.now().timeZoneName

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

答案 2 :(得分:11)

您可以使用

import 'dart:io' show Platform;

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

答案 3 :(得分:2)

我无法评论Cenk YAGMUR的答案。 但是,他是正确的。略。 Cenk,您错过了国家代码和语言代码的位置。 请改变它。因此其他人不会犯我在发布时犯的错误。 谢谢。

import 'dart:io' show Platform;

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

答案 4 :(得分:1)

如果您编写 Platform.localeName,它会为您提供语言和国家/地区,例如“en_US”、“tr_TR”。

要只取“en”或“tr”,您可以使用 substring() 并取前 2 个字母。

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

它只给你“en”或“tr”等...

如果你想要国家代码,使用这个;

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

它只给你“US”或“TR”等...

答案 5 :(得分:0)

尝试一下:

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

答案 6 :(得分:0)

您无法通过intl软件包获取设备国家/地区。您将需要根据https://pub.dev/packages/geolocator

使用设备地理定位

答案 7 :(得分:0)

使其生效的步骤是:

  1. 将软件包作为依赖项添加到pubspec.yaml文件中

    dependencies:
       flutter:
       sdk: flutter
    flutter_localizations:
       sdk: flutter
    
  2. 导入flutter_localizations库并为MaterialApp指定localizationsDelegates和supportedLocales

    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
     ],
    // ...
    )
    
  3. 仅适用于iOS :打开ios模块,然后在本地化

    下添加受支持的语言。

enter image description here

  1. 获取当前语言环境

    Locale myLocale = Localizations.localeOf(context);

如果需要,可以从区域设置访问 countryCode languageCode 字符串属性 enter image description here