解决flutter 引入的package国际化无效的问题

flutter 专栏收录该内容
45 篇文章 50 订阅

解决flutter intl 引入的库内国际化失效的问题

问题发生场景

你引入了几个module,这几个module分别做了国际化,例如以下4个module ABCD,最后发现只有A的国际化效果可以使用,其他module无效:

localizationsDelegates: const [
          moduleA.S.delegate,
          moduleB.S.delegate,
          moduleC.S.delegate,
          moduleD.S.delegate,
          S.delegate,
          GlobalMaterialLocalizations.delegate,
          GlobalWidgetsLocalizations.delegate,
        ]

解决办法

修改引入的module的国际化相关代码:

新建my_intl.dart替换l10n.dart中的intl :

import 'package:flutter/material.dart';
import 'package:intl/src/intl_helpers.dart';
import 'package:intl/intl.dart' as RealIntl;
import '../generated/intl/messages_all.dart';
import '../generated/l10n.dart';

class Intl {
  // copied from the real intl package
  static String message(String message_str,
          {String desc: '',
          Map<String, Object> examples: const {},
          String locale,
          String name,
          List<Object> args,
          String meaning,
          bool skip}) =>
      _message(message_str, locale, name, args, meaning);

  // copied from the real intl package
  static String _message(
      String message_str, String locale, String name, List<Object> args, String meaning) {
    return myMessageLookup.lookupMessage(message_str, locale, name, args, meaning);
  }

  static MessageLookup myMessageLookup =
      UninitializedLocaleData('initializeMessages(<locale>)', null);

  static Future<S> load(Locale locale) {
    final name = locale.countryCode?.isEmpty ?? true ? locale.languageCode : locale.toString();
    final localeName = RealIntl.Intl.canonicalizedLocale(name);

    return initializeMessages(localeName).then((_) {
      final original = messageLookup;
      messageLookup = myMessageLookup;
      return initializeMessages(localeName).then((_) {
        myMessageLookup = messageLookup;
        messageLookup = original;
        RealIntl.Intl.defaultLocale = localeName;
        S.current = S();
        return S.current;
      });
    });
  }
}

将l10n.dart中的load方法指向my_intl中的load方法。

修改后的l10n.dart:

import 'package:cece_login_module/l10n/my_intl.dart';
import 'package:flutter/material.dart';

class S {
 ...
  static Future<S> load(Locale locale) => Intl.load(locale);
 ...
 

目录图:
在这里插入图片描述

相关链接github

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值