·Flutter Intl· 插件,包含用于处理国际化/本地化消息,日期和数字格式和解析,双向文本以及其他国际化问题。

安装 Flutter Intl 插件

在项目的 pubspec.yaml 文件中添加依赖:

1
2
3
4
5
6
dependencies:
flutter:
sdk: flutter
# 国际化
flutter_localizations:
sdk: flutter

初始化项目

Visual Studio Code中打开命令面板: View -> Command Palette…

在打开的命令面板中输入 flutter intl, 在下拉的命令项中选择:Flutter Intl: Initialze, 开始执行项目的初始化。

初始化执行成功后,会自动在 pubspec.yaml 末尾增加:

1
2
flutter_intl:
enabled: true

同时在 lib 文件夹下生成 generatedl10n 两个文件夹

generated包下的intl目录默认生成 messages_all.dartmessages_en.dart 文件,messages开头的文件无需手动修改,是自动生成的。

generated 包下的 I10n.dartLocalizationsDelegate 的实现,无需手动修改,是自动生成的。

l10n包下存在一个intl_en.arb文件,文案存放在此处。

ARB文件扩展名为:Application Resource Bundle 意为应用程序资源包,并得到Google的支持,每个.arb文件都包含一个JSON表,该表从资源ID映射到本地化值,文件名包含已为其转换值的语言环境。

添加语言

Visual Studio Code中打开命令面板: View -> Command Palette…

在打开的命令面板中输入 flutter intl, 在下拉的命令项中选择:Flutter Intl: Add Locale

在命令面板中输入中文的语言名称:zh

添加语言成功后,在 generated\intl 文件夹下多了一个名为messages_zh.dart 的文件

l10n 文件夹下多了一个名为 intl_zh.arb 的文件

添加系统国际化支持

MaterialApp 修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
MaterialApp(
...
localizationsDelegates: [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
// 将 en设置为第一项, 没有适配语言时, 英语为首选项
supportedLocales: [
const Locale('en', ''),
...S.delegate.supportedLocales
],
// 插件目前不完善手动处理简繁体
localeResolutionCallback: (locale, supportLocales) {
// 中文 简繁体处理
if (locale?.languageCode == 'zh') {
// zh-CN:地区限制匹配规范,表示用在中国大陆区域的中文。
// 包括各种大方言、小方言、繁体、简体等等都可以被匹配到。
if (locale?.scriptCode == 'Hant') {
// zh-Hant和zh-CHT相同相对应;
return const Locale('zh', 'HK'); //繁体
} else {
// zh-Hans:语言限制匹配规范,表示简体中文
return const Locale('zh', 'CN'); //简体
}
}
return null;
},

...
)

解释下上面这段代码出现的变量

localizationsDelegates 列表中的元素是生成本地化值集合的工厂。

S.delegate 项目的本地化委托类,插件自动生成,它会根据你的arb文件自动生成对应的函数。

GlobalMaterialLocalizations.delegateMaterial Components库提供了本地化的字符串和其他值。

GlobalCupertinoLocalizations.delegateCupertino Components库提供了本地化的字符串和其他值。

GlobalWidgetsLocalizations.delegate定义widget默认的文本方向,从左到右或从右到左。

supportedLocales支持的本地化。

S.delegate.supportedLocales 项目支持的本地化,插件自动生成,它会在你添加arb文件时自动更新你的支持的本地化。

intl_en.arbintl_zh.arb 下添加文案

添加一个 title 文案,intl_en.arb

1
2
3
{
"title": "hello word"
}

intl_zh.arb

1
2
3
{
"title": "你好"
}

保存修改,generated 目录下相关文件将会重新生成。

使用Flutter Intl

普通使用

1
2
{"content": "内容"}
S.of(context).content

占位

1
2
{"welcome": "welcome {name}"}
S.of(context).welcome("phoenixsky")

重复占位

1
2
{"goodStudy": "{good}{good}学习,{day}{day}向上"}
S.of(context).goodStudy("好", "天")

复数形式

1
2
{"getMessageTips": "{howMany, plural, zero{You have no message} one{You have 1 message} other{You have {howMany} messages}}"}
S.of(context).getMessageTips(2)

参考:https://github.com/localizely/flutter-intl-plugin-sample-app

===END===