三、国际化的工具
- 3.1、认识
arb文件
目前我们已经可以通过加载对应的json文件来进行本地化了但是还有另外一个问题,我们在进行国际化的过程中,下面的代码依然需要根据 json文件 手动编写:
String get title { return _localizedValues[locale.languageCode]["title"]; } String get greet { return _localizedValues[locale.languageCode]["greet"]; } String get pickTime { return _localizedValues[locale.languageCode]["picktime"]; }
- 有没有一种更好的方式,让我们可以快速在本地化文件-dart代码文件直接来转换呢?答案就是arb文件
arb
文件全称Application Resource Bundle
,表示应用资源包,目前已经得到Google的支持;- 其本质就是一个 json 文件,但是可以根据该文件转成对应的语言环境;
- arb 的说明文档:https://github.com/google/app-resource-bundle/wiki/ApplicationResourceBundleSpecification
- 3.2、intl package官方文档推荐可以使用intl package来进行arb和dart文件之间的转换(通过终端指令)
- 需要在在
pubspec.yaml
中添加其相关的依赖,具体步骤这里不再详细给出,可以参考官方文档 - 3.3、使用IDE插件
- 在之前有一个比较好用的Android Studio的插件:
Flutter i18n
- 但是这个插件已经很久不再维护了,所以不再推荐给大家使用
- 目前我们可以使用另外一个插件:Flutter Intl
- 该插件更新维护频率很高,并且广受好评;
- 另外,在Android Studio和VSCode中都是支持的
- 我们这里以Android Studio为例,讲解其使用过程:
- 3.3.1、安装插件
在Android Studio的Plugins中安装插件:
提示:如果遇到如下图的问题,可看下图修复
3.3.2. 初始化 intl
选择工具栏Tools - Flutter Intl - Initialize for the Project
- 完成上面的操作之后会自动生成如下文件目录:
generated
是自动生成的dart代码I10n
是对应的arb文件
目录
- 3.3.3、使用intl
- 在localizationsDelegates中配置生成的class,名字是S
- 1.添加对应的delegate
- 2.supportedLocales使用S.delegate.supportedLocales
localizationsDelegates: [ GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, JKLocalizationsDelegate.delegate, S.delegate ], supportedLocales: S.delegate.supportedLocales,
- 因为我们目前还没有对应的本地化字符串,所以需要在intl_en.arb文件中编写:编写后
ctrl(command) + s
保存即可
{ "title": "home", "greet": "hello~", "picktime": "Pick a time" }
- 在代码中使用即可,按照如下格式:
S.of(context).title
- 3.3.4、添加中文
如果希望添加中文支持:add local,在弹出框中输入zh即可,我们会发现,会生成对应的intl_zh.arb
和messages_zh.dart
文件
- 编写intl_zh.arb文件
{ "title": "首页", "greet": "您好~", "picktime": "选择一个时间" }
- 查看界面,会根据当前语言显示对应的语言文本
- 3.4. arb 其它语法
- 如果我们希望在使用本地化的过程中传递一些参数:
- 比如hello kobe或hello james
- 比如你好啊,周杰伦 或 你好啊
- 修改对应的arb文件:
{name}
表示传递的参数
{ "title": "home", "greet": "hello~", "picktime": "Pick a time", "sayHello": "hello {name}" }
- 在使用时,传入对应的参数即可:
Text(S.of(context).sayHello("周杰伦")),
提示
: arb 的好处, 每次我们只需要修改intl_en.arb
、intl_zh.arb
等文件的 json数据,它会自动帮我们生成对用名字的 get 方法,到时候直接S.of(context).名字
调用即可
最后对应的 i18n代码