9 Flutter国际化手动配置

(1) yaml文件添加依赖

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter

(2) 创建类文件:数据类


class YYYLocalizations {
  
  YYYLocalizations(this.locale);

  Locale? locale;

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

  /// 国际化数据data字典
  Map<String, Map<String, String>> data = {};

  /// 从json中加载数据
  Future<void> loadI18nJson() async {
    String path = "assets/json/i18n.json";
    final result = await rootBundle.loadString(path);
    Map<String, dynamic> dataDict = json.decode(result);
    data = dataDict.map((key, value) {
      return MapEntry(key, value.cast<String, String>());
    });
  }

  /// 手写对应字段的get方法
  String? get title1 {
    return data[locale?.languageCode]?["title1"];
  }

  String? get title2 {
    return data[locale?.languageCode]?["title2"];
  }

  String? get title3 {
    return data[locale?.languageCode]?["title3"];
  }

  String? get title4 {
    return data[locale?.languageCode]?["title4"];
  }

  String? get title5 {
    return data[locale?.languageCode]?["title5"];
  }
}

(3) 创建类文件:代理delegate类

class YYYLocalizationDelegate extends LocalizationsDelegate<YYYLocalizations> {
  static YYYLocalizationDelegate delegate = YYYLocalizationDelegate();

  /// 支持的语言编码
  @override
  bool isSupported(Locale locale) {
    return ["zh", "en"].contains(locale.languageCode);
  }

  /// 加载国际化数据并返回
  @override
  Future<YYYLocalizations> load(Locale locale) async {
    YYYLocalizations localizations = YYYLocalizations(locale);
    await localizations.loadI18nJson();  //异步加载数据
    return localizations;
    //return SynchronousFuture(YYYLocalizations(locale)); //同步本地数据
  }

  /// 是否重新加载数据资源
  @override
  bool shouldReload(covariant LocalizationsDelegate<YYYLocalizations> old) {
    return false;
  }
}

(4) MaterialApp中进行配置

MaterialApp(
      supportedLocales: [
        Locale('zh'),
        Locale("en"),
      ],
      localizationsDelegates: [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
        YYYLocalizationDelegate.delegate, //手动创建的
      ],
    );

(6) 不同界面中获取国际化配置的内容

YYYLocalizations.of(context).bottomBarTitle1;

YYYLocalizations.of(context).bottomBarTitle2;

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

相关阅读更多精彩内容

  • 概述 国际化的认识 国际化的适配 国际化的工具 一、国际化的认识 开发一个App,如果我们的App需要面向不同的语...
    IIronMan阅读 861评论 0 2
  • 一. 国际化的认识 开发一个App,如果我们的App需要面向不同的语种(比如中文、英文、繁体等),那么我们需要对齐...
    5e4c664cb3ba阅读 1,626评论 0 3
  • 一. 国际化的认识 开发一个App,如果我们的App需要面向不同的语种(比如中文、英文、繁体等),那么我们需要对齐...
    AlanGe阅读 547评论 0 0
  • 前言 如果APP有需要支持多种语言,就需要支持国际化,无论是android和ios,现在针对flutter的国际化...
    lebonbill阅读 10,954评论 4 6
  • 国际化:支持多种语言。为应用程序支持的每种语言设置本地化值,如文本(语言差异)、布局(阅读方向差异)、图片(国旗)...
    平安喜乐698阅读 3,963评论 0 3

友情链接更多精彩内容