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<String, Map<String,String>> _localizeValues = {};
  Future loadJson() async {
    //1.加载json文件
    final jsonFile = await rootBundle.loadString("assets/json/i18n.json");
    //2.解析json文件
    Map<String, dynamic>map = json.decode(jsonFile);
    _localizeValues = map.map((key, value) => MapEntry(key, value.cast<String, String>()));
  }

class GCLocalizationsDelegate extends LocalizationsDelegate<GCLocalizations> {
  static GCLocalizationsDelegate delegate = GCLocalizationsDelegate();

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

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

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一. 国际化的认识 开发一个App,如果我们的App需要面向不同的语种(比如中文、英文、繁体等),那么我们需要对齐...
    AlanGe阅读 537评论 0 0
  • 概述 国际化的认识 国际化的适配 国际化的工具 一、国际化的认识 开发一个App,如果我们的App需要面向不同的语...
    IIronMan阅读 844评论 0 2
  • 一. 国际化的认识 开发一个App,如果我们的App需要面向不同的语种(比如中文、英文、繁体等),那么我们需要对齐...
    5e4c664cb3ba阅读 1,602评论 0 3
  • 如果App的用户使用的是不同语言,那进行国际化是必要的。国际化主要包括文案的国际化(不同的语言展示不同的文案)和布...
    chonglingliu阅读 2,448评论 5 6
  • 前言 如果APP有需要支持多种语言,就需要支持国际化,无论是android和ios,现在针对flutter的国际化...
    lebonbill阅读 10,921评论 4 6

友情链接更多精彩内容