如何在Flutter中获取手机默认语言并切换应用语言?
Flutter 获取系统默认语言并切换应用语言
一、检测手机默认语言
Flutter 中可以直接通过平台调度器获取系统当前的语言设置,代码如下:
import 'package:flutter/material.dart'; // 获取系统完整Locale(包含语言和地区,如zh_CN、en_US) Locale getSystemLocale() { return WidgetsBinding.instance.platformDispatcher.locale; } // 获取语言标签字符串(如"zh-CN"、"en-US") String getSystemLocaleTag() { return WidgetsBinding.instance.platformDispatcher.locale.toLanguageTag(); }
调用后会返回系统当前的语言设置,比如中文简体环境下返回Locale('zh', 'CN'),英文环境返回Locale('en', 'US')。
二、根据系统语言切换应用语言
要实现应用内语言跟随系统,需要结合多语言资源配置和MaterialApp的本地化参数,步骤如下:
1. 准备多语言资源
创建i18n文件夹,存放不同语言的JSON文件:
i18n/en.json
{ "hello": "Hello World", "settings": "Settings" }
i18n/zh.json
{ "hello": "你好世界", "settings": "设置" }
在pubspec.yaml中声明资源路径:
flutter: assets: - i18n/en.json - i18n/zh.json
2. 实现本地化代理类
创建app_localizations.dart文件,封装多语言加载和读取逻辑:
import 'dart:async'; import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; class AppLocalizations { final Locale locale; AppLocalizations(this.locale); static AppLocalizations of(BuildContext context) { return Localizations.of<AppLocalizations>(context, AppLocalizations)!; } static const LocalizationsDelegate<AppLocalizations> delegate = _AppLocalizationsDelegate(); Map<String, String> _localizedStrings = {}; Future<void> load() async { String jsonString = await rootBundle.loadString('i18n/${locale.languageCode}.json'); Map<String, dynamic> jsonMap = json.decode(jsonString); _localizedStrings = jsonMap.map((key, value) => MapEntry(key, value.toString())); } String translate(String key) { return _localizedStrings[key] ?? key; } } class _AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> { const _AppLocalizationsDelegate(); @override bool isSupported(Locale locale) { return ['en', 'zh'].contains(locale.languageCode); } @override Future<AppLocalizations> load(Locale locale) async { AppLocalizations localizations = AppLocalizations(locale); await localizations.load(); return localizations; } @override bool shouldReload(_AppLocalizationsDelegate old) => false; }
3. 配置MaterialApp并绑定系统语言
在主入口中初始化应用语言为系统默认值,同时支持手动切换和监听系统语言变化:
import 'package:flutter/material.dart'; import 'app_localizations.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatefulWidget { const MyApp({super.key}); @override State<MyApp> createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { Locale? _appLocale; @override void initState() { super.initState(); // 初始化时获取系统默认语言 _appLocale = WidgetsBinding.instance.platformDispatcher.locale; // 监听系统语言变化,自动同步应用语言 WidgetsBinding.instance.platformDispatcher.onLocaleChanged = () { setState(() { _appLocale = WidgetsBinding.instance.platformDispatcher.locale; }); }; } void _updateLocale(Locale newLocale) { setState(() { _appLocale = newLocale; }); } @override Widget build(BuildContext context) { return MaterialApp( locale: _appLocale, supportedLocales: const [ Locale('en', 'US'), Locale('zh', 'CN'), ], localizationsDelegates: const [ AppLocalizations.delegate, GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], home: HomePage(onLocaleChanged: _updateLocale), ); } } class HomePage extends StatelessWidget { final Function(Locale) onLocaleChanged; const HomePage({super.key, required this.onLocaleChanged}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text(AppLocalizations.of(context).translate('settings'))), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text(AppLocalizations.of(context).translate('hello')), const SizedBox(height: 20), ElevatedButton( onPressed: () => onLocaleChanged(const Locale('en', 'US')), child: const Text('切换到英文'), ), ElevatedButton( onPressed: () => onLocaleChanged(const Locale('zh', 'CN')), child: const Text('切换到中文'), ), ElevatedButton( onPressed: () => onLocaleChanged(WidgetsBinding.instance.platformDispatcher.locale), child: const Text('恢复系统默认语言'), ), ], ), ), ); } }
内容的提问来源于stack exchange,提问作者Uriel
相关产品推荐
相关产品推荐

