为什么采用Intl方案
随着flutter_i18n组件的作者不再维护,IDE中的插件已被作者从插件市场中下架.原先使用该方案的FunAndroid项目采用了新的Flutter Intl方案
该方案没有flutter_i18n方案成熟,在开发中,IDE的插件也还没有开源.在使用中还需要开发者跟随项目做一些适配,比如下边会提到的对
简繁体
和supportedLocales
的一些特殊处理
配置Flutter Intl
1.安装插件
确保Android Studio 或 VScode安装有Flutter Intl插件
目前AS安装Flutter插件会自动捆绑安装该插件

2.初始化项目
-
在
pubspec.yaml
中添加flutter_localizations
依赖并执行packages get
# 国际化 flutter_localizations: sdk: flutter
-
在菜单中找到
Tools
,选择Flutter Intl
,点击Init for the project
-
init结束后,pubspec.yaml中会自动增加以下字段
flutter_intl: enabled: true
-
lib
目录下会新增generated
和l10n
两个目录.- l10n目录下为arb文件
- generated目录下为根据arb文件自动生成以下dart代码
-
新增语言(比如中文)
- 通过插件添加arb文件
- 填入local code 如
zh
,en
,生成arb文件如果存在地区,类似汉语下有大陆的简体
zh_CN
,港台的繁体zh_HK
和zh_TW
- 在
lib/generated/intl/
目录下会生成新的messages_xx.dart
- 通过插件添加arb文件
-
MaterialApp
中配置supportedLocales
和localizationsDelegates
localizationsDelegates
,加入由Intl
插件生成的S.delegate
和SDK组件库的delegatesupportedLocales
需要手动将en
设置为第一项,保证无适配对应locale时,en为默认选项.(此处处理并不优雅)- 目前插件在简繁体不完善需要做部分适配
- 在
localeResolutionCallback
回调中手动处理简繁体
- 在
以下为示例
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: const [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate
],
// 讲en设置为第一项,没有适配语言时,英语为首选项
supportedLocales: [const Locale('en', ''), ...S.delegate.supportedLocales],
// 插件目前不完善手动处理简繁体
localeResolutionCallback: (locale, supportLocales) {
// 中文 简繁体处理
if (locale?.languageCode == 'zh') {
if (locale?.scriptCode == 'Hant') {
return const Locale('zh', 'HK'); //繁体
} else {
return const Locale('zh', 'CN'); //简体
}
}
return null;
},
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
- iOS需要在xcode中添加Localizations
使用Flutter Intl
-
普通使用
{"content": "内容"} S.of(context).content
-
占位
{"welcome": "welcome {name}"} S.of(context).welcome("phoenixsky")
-
重复占位
{"goodStudy": "{good}{good}学习,{day}{day}向上"} S.of(context).goodStudy("好", "天")
-
复数形式
{"getMessageTips": "{howMany, plural, zero{You have no message} one{You have 1 message} other{You have {howMany} messages}}"} S.of(context).getMessageTips(2)
-
更多使用方式见intl | Dart Package