Flutter集成Easy Localization后无法加载设备本地语言
解决Easy Localization无法自动适配设备系统语言的问题
我在Flutter应用中集成了Easy Localization包,应用内通过单选按钮切换语言可以正常工作,但现在需要让应用自动加载并适配设备的本地语言,无需用户手动切换。但修改设备系统语言后重启应用,语言并没有发生变化。
当前代码
main.dart
void main() async { WidgetsFlutterBinding.ensureInitialized(); await EasyLocalization.ensureInitialized(); runApp( EasyLocalization( supportedLocales: [ Locale('en', 'US'), Locale('it', 'IT'), Locale('fr', 'FR') ], path: 'assets/translations', // <-- change the path of the translation files fallbackLocale: Locale('en', 'US'), //assetLoader: CodegenLoader(), child: MyLangApp(), ), ); }
MyLangApp代码
class MyLangApp extends StatefulWidget { const MyLangApp({Key? key}) : super(key: key); @override State<MyLangApp> createState() => _MyLangAppState(); } class _MyLangAppState extends State<MyLangApp> { @override Widget build(BuildContext context) { return MaterialApp( localizationsDelegates: context.localizationDelegates, supportedLocales: context.supportedLocales, locale: context.locale, home: MainPage(), ); } }
问题原因
当前代码未配置Easy Localization自动检测设备系统语言的逻辑,且该包默认会保存用户上次手动切换的语言设置,导致重启应用时优先读取保存的语言,而非设备当前系统语言。
解决方案
1. 修改main.dart,添加系统语言检测逻辑
在EasyLocalization组件中配置startLocale参数指定设备系统语言,并根据需求设置saveLocale:
void main() async { WidgetsFlutterBinding.ensureInitialized(); await EasyLocalization.ensureInitialized(); // 获取设备当前系统语言 final deviceLocale = WidgetsBinding.instance.platformDispatcher.locale; runApp( EasyLocalization( supportedLocales: [ Locale('en', 'US'), Locale('it', 'IT'), Locale('fr', 'FR') ], path: 'assets/translations', fallbackLocale: Locale('en', 'US'), // 启动时优先使用设备系统语言 startLocale: deviceLocale, // 若需每次启动强制使用系统语言,设为false;若要保留用户手动切换的记忆,设为true saveLocale: false, child: MyLangApp(), ), ); }
2. 适配规则说明
- 若设备系统语言在
supportedLocales列表内,应用启动将自动加载对应语言 - 若设备系统语言不在支持列表内,会 fallback 到
fallbackLocale指定的语言 - 当
saveLocale: true时,用户手动切换语言后,下次启动会加载用户选择的语言;仅在首次启动或无保存记录时,才会使用设备系统语言
内容的提问来源于stack exchange,提问作者Giovanni
相关产品推荐
相关产品推荐

