随着flutter_i18n组件的做者再也不维护,IDE中的插件已被做者从插件市场中下架.原先使用该方案的FunAndroid项目采用了新的Flutter Intl方案android
该方案没有flutter_i18n方案成熟,在开发中,IDE的插件也尚未开源.在使用中还须要开发者跟随项目作一些适配,好比下边会提到的对
简繁体
和supportedLocales
的一些特殊处理git
确保Android Studio 或 VScode安装有Flutter Intl插件github
目前AS安装Flutter插件会自动捆绑安装该插件xcode
在pubspec.yaml
中添加flutter_localizations
依赖并执行packages get
bash
# 国际化
flutter_localizations:
sdk: flutter
复制代码
在菜单中找到Tools
,选择Flutter Intl
,点击Init for the project
app
init结束后,pubspec.yaml中会自动增长如下字段less
flutter_intl:
enabled: true
复制代码
lib
目录下会新增generated
和l10n
两个目录.ide
新增语言(好比中文)post
zh
,en
,生成arb文件
若是存在地区,相似汉语下有大陆的简体
zh_CN
,港台的繁体zh_HK
和zh_TW
学习
lib/generated/intl/
目录下会生成新的messages_xx.dart
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'),
);
}
}
复制代码
普通使用
{"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