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;
@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}).'),
],
),
);
}
}
7条答案
按热度按时间flseospp1#
解释Flutter区域设置
首先,您应该了解系统设置和应用程序设置之间的区别:
获取当前系统首选项
获取当前默认的系统区域设置
获取系统区域设置列表
或
应用程序的区域设置
MaterialApp小部件支持本地化。它接受 * 您 * 决定应用程序支持的语言环境列表。这意味着 * 您 * 应该在
supportedLocales
属性的小部件初始化中显式定义它们,并提供所谓的“本地化委托”,该委托将实际转换为选定的语言环境(localizationsDelegates
属性)。如果你的应用支持除en_US
之外的任何其他区域设置,则需要提供委托。**当你请求应用程序区域设置时,你将从supportedLocales
**列表中获取准确值。获取应用程序区域设置
这仅在
MaterialApp
小部件已经初始化时才起作用。在MaterialApp
初始化之前,您不能使用它。显然,如果您的应用小部件没有初始化,您将无法获取其语言环境。要使用它,您必须在子组件的build
方法中调用此表达式。例如:这将在屏幕上打印
en_US
文本(因为这是默认区域设置,我们没有提供任何其他内容)。系统区域设置是什么无关紧要,因为我们没有显式定义本例中应用的任何区域设置,因此它返回默认值。捕获系统区域设置更改
为了能够对系统语言环境的变化做出React,您应该使用一个有状态的小部件来实现
WidgetsBindingObserver
mixin,并定义系统语言环境变化时将调用的didChangeLocales
方法:完整示例
为了总结以上所有内容,下面是一个在启动时获取语言环境并对系统设置更改做出React的可视化示例:
受支持的语言环境没有国家代码来定义,以显示当前应用程序语言环境的选择是如何工作的。在内部,
MaterialApp
小部件将应用程序支持的语言环境列表与系统传递的用户首选项列表进行比较,并选择最合适的一个。假设我们有以下系统语言环境列表(en_US、en_GB、ru_RU):
**单击缩略图查看完整屏幕截图。
我们的应用程序在启动时如下所示:
我们看到初始值和当前值显然是相同的。应用程序选择
en
环境作为其当前语言环境。现在让我们将语言环境列表更改为如下所示,将en_GB语言环境移到顶部,使其成为默认系统语言环境:
应用程序将反映此更改:
显然,应用程序仍然选择
en
环境作为其当前语言环境,因为它与en_US
和en_GB
环境都最匹配。现在,让我们将设置更改为俄语作为默认系统值:
我们的应用程序将反映此更改:
现在您可以看到
ru
环境被选为应用程序语言环境。希望这有助于理解本地化在Flutter中是如何工作的,如何获得当前值,以及如何反映系统更改。关于locale委托的细节没有解释,因为这与主题无关。
PS:这段代码只在Android下测试过,我认为只要做些小改动,它就可以适应所有其他平台。
db2dz4w82#
https://flutter.io/tutorials/internationalization/#tracking-locale
区域设置myLocale =区域设置.localeOf(上下文);
提供
countryCode
和languageCode
https://docs.flutter.io/flutter/dart-ui/Locale-class.html
时区应可用于(未尝试)
https://docs.flutter.io/flutter/dart-core/DateTime-class.html
ryevplcw3#
试试这个:
sh7euo9m4#
您可以使用
ia2d9nvy5#
如果您编写Platform.localeName,它会提供语言和国家,如“en_US”、“tr_TR”。
要只接受“en”或“tr”,可以使用substring()并接受前两个字母。
它只给你“en”或“tr”等...
如果你想要国家代码,使用这个;
它只给你“美国”或“TR”等...
e0uiprwp6#
使其工作的步骤是:
1.将包作为依赖项添加到pubspec.yaml文件中
1.导入flutter_localizations库并为MaterialApp指定本地化委托和受支持的本地化
1.仅适用于iOS:打开ios模块并在本地化下添加支持的语言
1.获取当前区域设置
第一个月
如果需要,您可以访问区域设置的countryCode和languageCode字符串属性
jk9hmnmh7#
对于时区,所有其他答案将给予缩写,如'CET','MSK'等和GMT偏移。
要获取
Europe/Paris
的设备时区,请使用flutter_native_timezone package: