我是新手,我想在我的设备android或iOS上运行我的项目时获得时区,语言和县ID。它应该从设备的位置检测时区,语言和国家ID。我是新手,他会颤抖,不知道我怎么能得到这些。有没有图书馆,或者我可以通过内部图书馆获取这些图书馆,请给我一个方法。
答案 0 :(得分:33)
首先,您应该了解系统设置和应用程序设置之间的区别:
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):
**单击缩略图以查看完整的屏幕截图。
我们的应用在启动时将如下所示:
我们看到初始值和当前值明显相同。该应用选择了MaterialApp
语言环境作为其当前语言环境。
现在让我们将语言环境列表更改为以下内容,将en_GB语言环境移到顶部,使其成为默认的系统语言环境:
该应用将反映此更改:
该应用显然仍选择en
语言环境作为其当前语言环境,因为它与en
和en_US
语言环境都最匹配。
现在让我们将设置更改为俄语作为默认系统值:
我们的应用将反映此更改:
现在您可以看到选择了en_GB
语言环境作为应用程序语言环境。
希望这有助于了解Flutter中的本地化工作原理,如何获取当前值以及如何反映系统更改。关于语言环境委托的详细信息未作解释,因为它不在这里。
PS:此代码仅在Android下经过测试。我认为,只要稍作更改,它就可以适应所有其他平台。
答案 1 :(得分:12)
https://flutter.io/tutorials/internationalization/#tracking-locale
Locale myLocale = Localizations.localeOf(context);
提供countryCode
和languageCode
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)
使其生效的步骤是:
将软件包作为依赖项添加到pubspec.yaml文件中
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
导入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
],
// ...
)
仅适用于iOS :打开ios模块,然后在本地化
下添加受支持的语言。获取当前语言环境
Locale myLocale = Localizations.localeOf(context);