Flutter笔记十一之国际化(跟随系统及应用内切换)和数据本地存储

Flutter项目默认是自动跟随系统语言的,iOS和Android需要单独配置

文末有demo,demo是用intl插件进行国际化,跟随系统语言,并且可以在应用内切换语言,下面是效果图:


iOS国际化项目配置

苹果的我以前写过,点击链接查看,如果只是通过flutter配置国际化,那只需要把Localizations里面添加需要支持的语言包即可,其他的就不用配置了。

Android国际化项目配置

添加依赖

flutter_localizations:
 sdk: flutter

Pub get
两种方法,第一种是使用intl插件,第二种是使用JSON文件,先记录第一种,

安装插件(Android Studio)

如下图安装插件,重启IDE


初始化项目

Tools -> Flutter Intl -> Initialize for the Project,如下图所示

配置语种

supportedLocales: S.delegate.supportedLocales,

添加对应的delegate

localizationsDelegates: const [
  GlobalMaterialLocalizations.delegate,
  GlobalWidgetsLocalizations.delegate,
  GlobalCupertinoLocalizations.delegate,
  S.delegate
],

添加其他语言

默认只有英语,添加其他语言文件:Tools->Flutter Intl->Add Locale,根据需要添加语言,我这里添加简体繁体中文zh_Hanszh_Hant,如下图所示

编写国际化配置文件

分别在intl_en.arb,intl_zh_Hans.arb,intl_zh_Hant.arb三个文件中编写英文,简体中文,繁体中文对应的key-value

使用多语言

S.of(context).key换一下key即可

语言切换:

  • MyApp改成StatefulWidget
  • MyApp添加静态方法:static _MyAppState *of*(BuildContext context) => context.findAncestorStateOfType<_MyAppState>()!;
  • _MyAppState添加属性locale,添加set方法(赋值包裹setState),MaterialApp添加locale
  • 使用MyApp.of(context).setLocale(Locale.fromSubtags(languageCode: ‘语言‘))切换语言

使用第三方库shared_preferences本地存储

  • 添加依赖shared_preferences: ^2.0.15 -> Pub get
  • 保存语言
final prefs = await SharedPreferences.*getInstance*();
prefs.setInt("language", index);
  • 读取语言
SharedPreferences prefs = await SharedPreferences.*getInstance*();
int? languageIndex = prefs.get("language") as int?;

接下来记录的是json国际化(不推荐,可以直接跳到文章末尾看demo)

添加依赖是一样的

配置语种

supportedLocales:[
 const Locale.fromSubtags(languageCode: "zh", scriptCode: "Hans"),
 const Locale.fromSubtags(languageCode: "zh", scriptCode: "Hant"),
 const Locale.fromSubtags(languageCode: "en"),
]

添加对应的delegate

localizationsDelegates:[
 GlobalMaterialLocalizations.delegate,
 GlobalCupertinoLocalizations.delegate,
 GlobalWidgetsLocalizations.delegate 
 //上面三个是系统的,这里还要加上一个自己创建的类
 GCLocalizationsDelegate.*delegate*
]

创建文件(文件名随意)

  • localizations.dart文件(操作国际化的类)
  • i18n.json文件 (国际化配置文件)

添加i18n.json依赖,并Pub get

Json文件和上面的arb文件一样编写key-value
localizations.dart文件除了下面的代码,还要自己实现json文件中get的方法

class GCLocalizations {
  GCLocalizations(this._locale);
  final Locale _locale;

  static GCLocalizations of(BuildContext context){
    return Localizations.of(context, GCLocalizations);
  }

  static Map> _localizeValues = {};
  Future loadJson() async {
    //1.加载json文件
    final jsonFile = await rootBundle.loadString("assets/json/i18n.json");
    //2.解析json文件
    Mapmap = json.decode(jsonFile);
    _localizeValues = map.map((key, value) => MapEntry(key, value.cast()));
  }

class GCLocalizationsDelegate extends LocalizationsDelegate {
  static GCLocalizationsDelegate delegate = GCLocalizationsDelegate();

  @override
  bool isSupported(Locale locale) {
    return ["en", "zh"].contains(locale.languageCode);
  }

  @override
  bool shouldReload(covariant LocalizationsDelegate old) {
    return false;
  }

  @override
  Future load(Locale locale) async{
    final localizations = GCLocalizations(locale);
    await localizations.loadJson();
    return localizations;
  }
}

Demo自取,欢迎Star.
最后是国际化的官方文档(官网文档里没有应用内切换语言的说明๑_๑)

版权声明:本文为 Crazy Steven 原创出品,欢迎转载,转载时请注明出处!

你可能感兴趣的:(Flutter笔记十一之国际化(跟随系统及应用内切换)和数据本地存储)