1.依赖组件

Flutter Intl

在VSCode/Android Studio 的插件商城中查找 Intl就能找到,安装后重启程序。

默认情况下,Flutter仅提供美国英语本地化。要添加对其他语言的支持,应用程序必须指定其他MaterialApp属性,并包含一个名为的单独包-“flutter_localizations”。

在pubspec.yaml中添加flutter_localizations依赖并执行packages get

flutter_localizations:
        sdk: flutter

2.初始化项目

Tools -> Flutter Intl -> Initialize for the Project

就会对项目进行初始化,初始化结束后,pubspec.yaml中会自动增加以下字段

 flutter_intl:
        enabled: true

表示国际化已经开启。与此同时,lib目录下会新增generated和l10n两个目录。

3.新增语言

Tools  -> Flutter Intl -> Add Locale

输入地区代码即可生产对应文件
然后填入相应的local值生成arb文件,如zh表示中文。之后便会在lib/generated/intl/目录下会生成新的messages_zh.dart文件

4.配置语言

arb文件生成成功后,剩下的便是在MaterialApp中配置supportedLocales和localizationsDelegates
在main.dart 的 MaterialApp中添加

localizationsDelegates: const [
    S.delegate,
    GlobalMaterialLocalizations.delegate,
    GlobalCupertinoLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate
    ],
    // 讲zh设置为第一项,缺省为英文
    supportedLocales: S.delegate.supportedLocales,
    //多语言使用下列
    //supportedLocales: const <Locale>[
    //    Locale("zh","ZH"),
    //    Locale('en', 'US'),
    //],
* localizationsDelegates列表中的元素是生成本地化值集合的工厂。
* S.delegate 我们项目的本地化委托类,插件自动生成,他会根据你的arb文件自动生成对应的函数。
* GlobalMaterialLocalizations.delegate 为Material Components库提供了本地化的字符串和其他值。
* GlobalCupertinoLocalizations.delegate 为Cupertino Components库提供了本地化的字符串和其他值。
* GlobalWidgetsLocalizations.delegate定义widget默认的文本方向,从左到右或从右到左。
* supportedLocales支持的本地化。
* S.delegate.supportedLocales我们项目支持的本地化,插件自动生成,它会在你添加arb文件时自动更新你的支持的本地化。

5.添加字段

在I10n 目录下的 intl_zh.arb和intl_en.arb 添加字段,例如

  {
    "hello" : "hello",
    "hello1" : "hello1",
    "dialogTip":"Hello {name}"
    }
    {
    "hello" : "你好",
    "hello1" : "你好1",
    "dialogTip":"你好 {name}"
    }

执行运行后,程序会自动在messages_xx.dart中添加获取代码

"dialogTip" : MessageLookupByLibrary.simpleMessage("Hello \$name"),
"hello" : MessageLookupByLibrary.simpleMessage("hello"),
"hello1" : MessageLookupByLibrary.simpleMessage("hello1")

"dialogTip" : MessageLookupByLibrary.simpleMessage("你好 \$name"),
"hello" : MessageLookupByLibrary.simpleMessage("你好"),
"hello1" : MessageLookupByLibrary.simpleMessage("你好1")

6.使用

简单使用:S.of(context).hello
带参数使用:S.of(context).dialogTip("Rhyme");
切换语言:
setState(() {
	S.load(const Locale('en', 'US'));
});