Flutter国际化 多语言 使用Flutter intl插件实现多语言

前言

开始的时候我以为没有必要使用插件来实现国际化 , 几个json文件一加载就完事了,而后配置一下语言相关的处理. 可是使用了插件以后我真香了 , 真的是简单了太多了.git

准备工做

搜索插件并安装 : Flutter Intl

插件

项目配置

添加依赖:github

dev_dependencies:
...
  //add this
  flutter_localizations:
    sdk: flutter

复制代码

在菜单栏的Tool下找到Flutter Intl 并选择Initalize for the project, 配置结束后效果以下:json

image-20200819233727693

  1. 会在 pubspec.yaml中增长如下字段
flutter_intl:  
    enabled: true
复制代码
  1. 会在lib目录下增长 generated 和 l10n两个包

image-20200819234311852

  • generated包下的intl包默认存在一个messages_all.dartmessages_en.dart文件,messages开头的文件会在添加语言后自动生成
  • l10n包下存在一个intl_en.arb文件
  1. 使用Add Locale生成其余语言的arb文件markdown

    image-20200819234431082

例如:zh_CN , 会在l10n包下生成Intl_zh_CN.arb文件 , 可在其中填入对应的文案.oop

  1. 设置国际化语言
return MaterialApp(
  ...
    localizationsDelegates: const [
      S.delegate,
      GlobalMaterialLocalizations.delegate,
      GlobalCupertinoLocalizations.delegate,
      GlobalWidgetsLocalizations.delegate
    ],
    supportedLocales: S.delegate.supportedLocales,
    localeListResolutionCallback: (locales, supportedLocales) {
      print(locales);
      return;
    },
  ...
);

复制代码
  1. 使用

在须要配置国际化的地方调用S.of(context).key便可.ui

没有context 时可使用S.current.keythis

具体使用方式请参考本项目的代码spa

注意 :.net

  1. 支持语言的顺序为字符串排序 (如zh_A会在zh_B以前) , 并不是添加语言的顺序.
  2. 假设系统语言为zh_TW , 项目并不支持,会优先寻找zh的其余语言 , 以supportedLocales顺序从上向下寻找.
  3. 旧版本i18n插件生成的为i18n文件夹 , 而flutter intl生成的为l10n , 首字母不一样 , 须要注意.
  4. 此方式无需依赖intl包 , 但不提供intl相关功能. 须要额外功能才须要依赖intl.
  5. 如不想弃用旧版intl的AS插件,但AS版本又不支持,可以使用该插件生成的dart代码替代i18n中的代码,但可能须要修改类名.

从flutter i18n过渡

  1. 成功初始化以后,复制原有的arb文件到l10n文件夹下, 并修更名字 ,例如:intl_en.arb , intl_zh_CN.arb
  2. 将以前使用导入i18n.dart的地方替换成l10n.dart,通常只修改导入的头文件便可。
  3. flutter i18n中的带变量的写法为${param},而flutter intl插件为{param},要注意去掉$.
相关文章
相关标签/搜索