作为一名 Flutter 开发者,如何快速高效地让我们的应用支持多语言呢?
今天就来聊聊 flutter_localizations
这个神器,带你轻松实现 Flutter 国际化!
flutter_localizations
是Flutter 官方推荐的国际化解决方案,与 Flutter 框架深度集成,稳定性和兼容性无需担心。
它的扩展性极强,当你的应用需要新增语言时,只需简单配置就能完成,大大降低了开发成本和维护难度。
01. 安装依赖
这里用的flutter_localizations
是官方SDK的Package,不同于pub.dev上的名为flutter_localization
的Package。
flutter_localizations
依赖的intl
版本lock在了0.19.0,所以不能用pub.dev上最新版本。
pubspec.yaml
里flutter
对应小节加上generate: true
后续多国语言资源文件变更时运行flutter gen-l10n
即可重新生成语言资源API代码文件
yaml
pubspec.yaml
dependencies:
flutter_localizations:
sdk: flutter
intl: 0.19.0
flutter:
generate: true
然后运行flutter pub get
更新依赖。
02. 创建l10n配置文件
和pubspec.yaml
同级创建l10n.yaml
makefile
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
- arb-dir:指定语言资源文件位置
- template-arb-file:指定模板使用哪个语言的文件
- output-localization-file:指定生成的语言资源API代码文件名,便于在渲染Widget时引用
03. 手动创建需要支持的语言资源文件
默认文件名格式是app_{LANG-CODE}.arb
,如英语则为app_en.arb
,中文则为app_zh.arb
。
更多语言代码参考:
GlobalMaterialLocalizations class - flutter_localizations library - Dart API

应用里用到字符串渲染时先在arb
资源文件里定义,以简单的欢迎语为例:

普通字符串hello
称为资源(Resource)ID,Widget里引用其值的时候,可以通过语言资源API对象点语法操作取值。
以@
开头的字符串@hello
称为资源属性,定义对应Resource的元数据,数据类型,描述等
示例中hello
对应Resource里带有一个placeholder
参数userName
,对应取值形式是作为带参数函数调用。
其他常用语法可以参考文档: i18n | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter
04. 生成语言资源API代码
运行flutter gen-l10n
,没有错误信息说明生成成功。 生成的文件在.dart_tool/flutter_gen/gen_l10n
目录里,

05. 应用入口类里全局配置
main.dart
里
arduino
`import`语言资源:
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
MaterialApp添加初始化参数:
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,

06. Widget的build上下文里引用对应Resource
这里有个地方要注意,引用语言资源不能直接在MaterialApp
里使用。 如下图用法运行会报空安全异常

Material 应用必须启动完成后才能初始化
AppLocalizations
。如果应用尚未完全启动,
AppLocalizations.of(context)!.helloWorld
将导致空异常。
然后单独创建一个Widget就可以正常运行了

- 17行在
MaterialApp
里可以通过指定语言代码来测试


07. 总结
通过 flutter_localizations,我们能够轻松实现 Flutter 应用的国际化,让应用突破语言的限制,走向更广阔的市场。
从基础配置到动态切换,再到避坑指南,相信大家对它已经有了全面的了解。