Skip to content

Flutter i18n 实现国际化

豆浆油条 edited this page Jul 12, 2019 · 6 revisions

Flutter i18n 实现国际化

step 1

安装Android Studio 插件 Flutter_i18n (当前版本是0.2)

step 2

安装完成之后,重启 Android Studio,flutter项目下面会出现res/values文件夹

step 3

点击同步按钮,会自动生成lib/generated/i18n.dart

step4

return  MaterialApp(
    title: "Flutter Demo",
    ...
    /// localizationsDelegates 列表中的元素时生成本地化集合的工厂
    localizationsDelegates: [
        // 为Material Components库提供本地化的字符串和其他值
        GlobalMaterialLocalizations.delegate,
        // 定义widget默认的文本方向,从左往右或从右往左
        GlobalWidgetsLocalizations.delegate,
        S.delegate
    ],
    supportedLocales: S.delegate.supportedLocales,
    locale: mapLocales[SupportLocale.values[model.local]],
    localeResolutionCallback: S.delegate.resolution(fallback: const Locale('zh', 'CN')),
);

Flutter 入口程序一般都是这个样子,针对涉及国际化的每个字段,简单的说明一下:

字段 含义
localizationsDelegates 国际化代理类,这个只需知道是国际化字符串资源类的集合即可,一般我们会将自定义的国际化字符串对象在这里声明;具体功能可以查看[LocalizationsDelegate]类
supportedLocales 系统支持的语言环境,比如中文简体,中文繁体等等,注意的是,locale要同时赋值语言和国家,以英文为例:Locale("en", "")
localeResolutionCallback 如果当前手机设置的语言环境或者说宿主app设置的语言环境不在 supportedLocales 中,那么需要默认一个locale值,不默认也可以,系统会默认取支持列表supportedLocales中第一个值
locale 自己设定一个当前语言locale,如果不设置或者设置为null,就取宿主app当前的语言环境(等价于设置语言环境为:"跟随系统")

我们大致只需要知道上面所说的部分即可,假设现在需要实现一个语言切换的功能,需要包含以下几种类型:

  1. 跟随系统
  2. 简体中文
  3. 繁体台湾
  4. 繁体香港
  5. 英文

对于跟随系统来说,只要将MaterialApp中locale字段置为null,其他四种情况分别对应不同的 locale即可;至于MaterialApp中另外几个字段,也只需要根据支持列表一一填入;最重要的部分是国际化资源代理类:S的创建与更新。

有了这个插件开发起来会方便的多,在安装此插件后,项目中会自动生成${project}/res/values/*.arb以及${project}/lib/generated/i18n.dart文件;*.arb代表多个文件(工具只会帮忙生成strings_en.arb),类似于安卓中多个目录下针对字符串的配置,这个可以自行添加或者删除*.arb文件,多添加一个正确的配置文件,就相当于多一种语言支持,添加*.arb文件后编辑器会自己处理剩下的逻辑,或者点击工具栏顶部的这个图标:

Flutter i18n已经集成了快捷键来提取字符串,这个和android中的这个功能使用方法相同:

继续之前工具自动生成的两部分文件说,*.arb文件类似下面的结构:

注意:strings_en.arb是默认的arb文件,其他arb文件需要根据默认的arb文件生成对应的字符串。

i18n.dart是国际化的核心代码,大致结构如下:

可以看到,里面包含了不同国家地区(自己配置支持的国际语言,和*.arb相对应),同样的,已经替我们生成了MaterialApp中所需的几乎所有配置(具体使用配置可参照demo)。

S类是i18n.dart自动帮助我们生成的,类似于一个代理类,根据不同的语言环境代理$zh_HK、$zh_TW、$en、$zh_CN这些具体实现类,达到国际化的目的

经过上面的总结,我们来看Flutter i18n到底完成了什么:

自动帮助生成 strings_en.arb 默认字符串模版 提供快捷方式,替换文件出现的字符串到*.arb文件中 根据*.arb自动生成i18n.dart文件,包含支持语言列表,国际化代理类等 i18n.dart 提供在运行时提取不同国家语言字符串的功能方法

整体来看,该工具没有依赖任何库,也就是说相对于官方提供的方法,Flutter i18n不需要对pubspec.yaml做出修改。 基本上,如果项目中没有太过复杂的要求,只提供这种字符串国际化足够,但有些情况下, 针对不同的语言环境,图片也需要动态进行更替,关于更换图片的逻辑,放到文章下面介绍换肤功能的时候再考虑。