Flutter 国际化(多语言处理)

项目内最近加入国际化内容,那么我们需要转化对应语言内容,来展示UI

App国际化开发主要包括:

  • 文本国际化
  • Widget显示的国际化
  • 某些文本在对应语言环境下应该显示为所选择语言内容;

多语言适配:

目前我项目内使用的是:Flutter Intl插件:

1.安装Flutter Intl插件
在Android studio内直接搜索Intl,添加插件即可,我这里已经添加好了;如图:

截屏2023-01-31 17.17.38.png

*安装完成后,先使用Intl初始化一下项目

初始化项目:

截屏2023-01-31 17.49.39.png

系统会默认创建messages_all.dart、messages_en.dart以及intl_en.arb文件*

使用Intl创建对应语言文件,如图所示:

例如:中文,在弹出框中输入zh即可[图片上传失败...(image-1e2c3e-1675218734109)]
我们会发现,会生成对应的intl_zh.arb和messages_zh.dart文件,那么接下来,我们就根据需求编写对应语言文件即可:

截屏2023-01-31 17.46.58.png

arb其它语法:
对于一些例如页面里重复的title,每个页面写一个比较麻烦,我们可以采用使用本地化的过程中传递一些参数:

  • {name}:表示传递的参数
    使用:S.of(context).sayHello("Flutter")
  • pageTitle就是一个可选参数,
"commonPageTitle" : "{pageTitle, select, mine{我的} set{设置} changeHead{修改头像} resetPsw{重置密码} changeNickname{修改昵称} about{关于我们} helpCenter{帮助中心} proviate{隐私管理} feedback{意见反馈} customerService{客服中心} login{登录} register{注册} theme{一键换肤} languege{多语言}}",
  "@commonPageTitle" : {
    "description" : "Welcome message on the pageTitle screen",
    "placeholders": {
      "pageTitle": {}
    }
  },

使用时候:S.of(context).commonPageTitle("mine")就行啦,根据对应设置key取值

上面输出:"我的"或者对应翻译语言

2.pubspec.yaml内添加依赖:

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

3.创建多语言管理类

class LocaleTool {
  // 获取本地存储的配置语言
  static List<String> languageConfig() {
    List<String> list = ["zh", 'CN'];
    String language = CommonSpUtil.getLanguageType();
    if (language.isNotEmpty) {
      List<String> languageList = language.split('_');
      if (languageList.length >= 2) {
        list = languageList;
      }
    }
    return list;
  }

  /// 切换语言
  changeLanguage({required languageStr}) async {
    List list = languageStr.split('_');
    String languageCode = 'zh';
    String countryCode = "CN";
    if (list.length == 2) {
      languageCode = list[0];
      countryCode = list[1];
    }
    var locale = Locale(languageCode, countryCode);

    /// 更新语言
    await Get.updateLocale(locale);

    /// 存储本地语言配置
    await CommonSpUtil.saveLanguageType(languageStr);
  }
}

上面CommonSpUtil类,是基于插件sp_util封装的本地存储类:

  /// 存语言配置
  static saveLanguageType(String languageType) {
    return SpUtil.putString(CommonSpUtil.languageType, languageType);
  }

  /// 获取语言配置 默认 中文
  static String getLanguageType() {
    return SpUtil.getString(CommonSpUtil.languageType) ?? "zh_CN";
  }

好了,上面准备工作基本已经完成了。

4.入口配置:

GetMaterialApp(
          title: '',
          debugShowCheckedModeBanner: false,
          initialBinding: InitBinding(),
          initialRoute: RouterUtil.tabBar,
          getPages: RouterUtil.getPages,
          // translations: StringRes(),
          defaultTransition: Transition.cupertino,
          locale: LocaleTool.languageConfig().isNotEmpty
              ? Locale(LocaleTool.languageConfig()[0],
                  LocaleTool.languageConfig()[1])
              : null, //默认展示本地语言
          fallbackLocale: const Locale('zh', 'CN'), //语言选择无效时,备用语言
          /// 支持语言
          supportedLocales: S.delegate.supportedLocales,
          localizationsDelegates: [
            GlobalMaterialLocalizations.delegate,
            GlobalWidgetsLocalizations.delegate,
            GlobalCupertinoLocalizations.delegate,
            S.delegate
          ],
          theme: ThemeData(brightness: Brightness.light),
          darkTheme: ThemeData(brightness: Brightness.dark),

          /// 配置 本地存储 主题类型
          themeMode: ThemeTool.getLocalThemeModel(),
          builder: EasyLoading.init(builder: (context, child) {
            return GestureDetector(
              onTap: () {
                FocusScopeNode currentFocus = FocusScope.of(context);
                if (!currentFocus.hasPrimaryFocus &&
                    currentFocus.focusedChild != null) {
                  FocusManager.instance.primaryFocus?.unfocus();
                }
              },
              child: child,
            );
          }),
        )

5.最后就是切换语言环境

选择对应语言环境,使用多语言管理类切换即可


  /// 配置语言 根据需求 进行处理
  String configlanguage(String string) {
    String languagestr = "zh_CN";
    switch (string) {
      case "简体中文":
        languagestr = "zh_CN";
        break;
      case "English":
        languagestr = "en_US";
        break;
      default:
    }
    return languagestr;
  }
  LocaleTool().changeLanguage(
   languageStr: logic.configlanguage(
      logic.config[logic.datas[index].toString()]));

效果:

QQ20230201-102949.gif

好了,到此多语言就处理完毕了,关键代码已贴出,有问题欢迎各位大佬指正~ 请轻喷。😄

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容