前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Flutter 实战】 Intl 插件实现国际化以及修改系统组件的国际化

【Flutter 实战】 Intl 插件实现国际化以及修改系统组件的国际化

作者头像
老孟Flutter
发布于 2020-11-26 08:11:25
发布于 2020-11-26 08:11:25
3.1K00
代码可运行
举报
文章被收录于专栏:FlutterFlutter
运行总次数:0
代码可运行

老孟导读:本文介绍如何使用 Intl 插件实现国际化以及修改系统组件的国际化文案。

Intl 官方出品,包含用于处理国际化/本地化消息,日期和数字格式和解析,双向文本以及其他国际化问题。

pub地址:https://pub.dev/packages/intl Github地址:https://github.com/dart-lang/intl

Android Studio 和 VS Code 都有 Flutter Intl 插件,方便接入。

安装插件

并不是一定要使用插件,也可以通过命令行,当然 Flutter Intl 插件简化操作, Android Studio -> File -> Setting -> Plugins -> 搜索Flutter Intl:

安装重启即可。

VS Code 的 Flutter Intl 插件:https://marketplace.visualstudio.com/items?itemName=localizely.flutter-intl

添加依赖

在项目的 pubspec.yaml 文件中添加依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dev_dependencies:
 ...
  flutter_localizations:
    sdk: flutter

执行命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
flutter pub get

Tool->Flutter Intl ->Initalize for the project:

成功后,在 pubspec.yaml末尾增加:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
flutter_intl:
  enabled: true

在lib下生成generated 和 l10n

  • generated包下的intl目录默认生成 messages_all.dartmessages_en.dart 文件,messages开头的文件无需手动修改,是自动生成的。
  • generated包下的 I10n.dart 是Localizations和Delegate的实现,无需手动修改,是自动生成的。
  • l10n包下存在一个intl_en.arb文件,文案存放在此处。

添加语言

Tool->Flutter Intl -> Add Locale:

添加中文支持:

自动生成相关文件:

添加系统国际化支持

在pubspec.yaml文件中添加包依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter

MaterialApp 修改如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MaterialApp(
  ...
  localizationsDelegates: [
    S.delegate,
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
    GlobalCupertinoLocalizations.delegate,
  ],
  supportedLocales: S.delegate.supportedLocales,
  ...
)

在 intl_en.arb 和 intl_zh.arb下添加文案

添加一个 title 文案,intl_en.arb:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "title": "hello word"
}

intl_zh.arb:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "title": "你好"
}

command + s 保存,generated 目录下相关文件将会重新生成。

使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class LocalizationDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text('${S.of(context).title}'),
      ),
    );
  }
}

Intl 还可以进行日期和数字格式化等, 具体功能可参考官方文档:https://github.com/dart-lang/intl。

国际化系统组件

部分系统组件已经支持国际化,那么如何修改其国际化文案呢?下面以日期组件为例进行介绍。

新建类MyLocalizationsDelegate

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MyLocalizationsDelegate
    extends LocalizationsDelegate<CupertinoLocalizations> {
  const MyLocalizationsDelegate();

  @override
  bool isSupported(Locale locale) => locale.languageCode == 'zh';

  @override
  Future<CupertinoLocalizations> load(Locale locale) =>
      ZhCupertinoLocalizations.load(locale);

  @override
  bool shouldReload(MyLocalizationsDelegate old) => false;

  @override
  String toString() => 'DefaultCupertinoLocalizations.delegate(zh)';
}

ZhCupertinoLocalizations定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ZhCupertinoLocalizations implements CupertinoLocalizations {
  const ZhCupertinoLocalizations();

  static const List<String> _shortWeekdays = <String>[
    '自周一',
    '自周二',
    '自周三',
    '自周四',
    '自周五',
    '自周六',
    '自周日',
  ];

  static const List<String> _shortMonths = <String>[
    '1月',
    '2月',
    '3月',
    '4月',
    '5月',
    '6月',
    '7月',
    '8月',
    '9月',
    '10月',
    '11月',
    '12月',
  ];

  static const List<String> _months = <String>[
    '1月',
    '2月',
    '3月',
    '4月',
    '5月',
    '6月',
    '7月',
    '8月',
    '9月',
    '10月',
    '11月',
    '12月',
  ];

  @override
  String datePickerYear(int yearIndex) => yearIndex.toString();

  @override
  String datePickerMonth(int monthIndex) => _months[monthIndex - 1];

  @override
  String datePickerDayOfMonth(int dayIndex) => dayIndex.toString();

  @override
  String datePickerHour(int hour) => hour.toString();

  @override
  String datePickerHourSemanticsLabel(int hour) => hour.toString() + " o'clock";

  @override
  String datePickerMinute(int minute) => minute.toString().padLeft(2, '0');

  @override
  String datePickerMinuteSemanticsLabel(int minute) {
    if (minute == 1) return '1 分';
    return minute.toString() + ' 分';
  }

  @override
  String datePickerMediumDate(DateTime date) {
    return '${_shortWeekdays[date.weekday - DateTime.monday]} '
        '${_shortMonths[date.month - DateTime.january]} '
        '${date.day.toString().padRight(2)}';
  }

  @override
  DatePickerDateOrder get datePickerDateOrder => DatePickerDateOrder.mdy;

  @override
  DatePickerDateTimeOrder get datePickerDateTimeOrder =>
      DatePickerDateTimeOrder.date_time_dayPeriod;

  @override
  String get anteMeridiemAbbreviation => '上午';

  @override
  String get postMeridiemAbbreviation => '下午';

  @override
  String get todayLabel => '今天';

  @override
  String get alertDialogLabel => 'Alert';

  @override
  String timerPickerHour(int hour) => hour.toString();

  @override
  String timerPickerMinute(int minute) => minute.toString();

  @override
  String timerPickerSecond(int second) => second.toString();

  @override
  String timerPickerHourLabel(int hour) => hour == 1 ? '小时' : '小时';

  @override
  String timerPickerMinuteLabel(int minute) => '分.';

  @override
  String timerPickerSecondLabel(int second) => '秒.';

  @override
  String get cutButtonLabel => '剪贴';

  @override
  String get copyButtonLabel => '拷贝';

  @override
  String get pasteButtonLabel => '黏贴';

  @override
  String get selectAllButtonLabel => '选择全部';

  static Future<CupertinoLocalizations> load(Locale locale) {
    return SynchronousFuture<CupertinoLocalizations>(
        const ZhCupertinoLocalizations());
  }

  /// A [LocalizationsDelegate] that uses [DefaultCupertinoLocalizations.load]
  /// to create an instance of this class.
  static const LocalizationsDelegate<CupertinoLocalizations> delegate =
      MyLocalizationsDelegate();
}

注意开始的属性_shortWeekdays,这个属性表示星期几,故意写成'自周x',为了和系统的区分,在根控件MaterialApplocalizationsDelegates属性中增加:ZhCupertinoLocalizations.delegate,这个就是上面定义的国际化文件,效果如下:

注意:ZhCupertinoLocalizations.delegate要放在GlobalCupertinoLocalizations.delegate,的前面,系统加载顺序为从上到下。

效果如下:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老孟Flutter 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
不得不知的ES6十大特性
ES6(ECMAScript2015)的出现,无疑给前端开发人员带来了新的惊喜,它包含了一些很棒的新特性,可以更加方便的实现很多复杂的操作,提高开发人员的效率。 本文主要针对ES6做一个简要介绍。 主要译自:  http://webapplog.com/ES6/comment-page-1/。也许你还不知道ES6是什么, 实际上, 它是一种新的javascript规范。在这个大家都很忙碌的时代,如果你想对ES6有一个快速的了解,那么请继续往下读,去了解当今最流行的编程语言JavaScript最新一代的十大特
庞小明
2018/03/08
1.1K0
不得不知的ES6十大特性
ES6中的几个常用特性
5.Enhanced Object Literals (增强的对象字面量)in ES6
javascript.shop
2019/09/04
5290
前端入门21-JavaScript的ES6新特性声明正文-ES6新特性
阮一峰的这本书,我个人觉得写得挺好的,不管是描述方面,还是例子,都讲得挺通俗易懂,每个新特性基本都还会跟 ES5 旧标准做比较,说明为什么会有这个新特性,这更于理解。
请叫我大苏
2018/12/24
5080
10个最佳ES6特性
为了保证可读性,本文采用意译而非直译,并且对源代码进行了大量修改。另外,本文版权归原作者所有,翻译仅用于学习。
疯狂的技术宅
2019/03/28
5020
ES6知识点补充
ECMAScript 6.0(简称ES6),作为下一代JavaScript的语言标准正式发布于2015 年 6 月,至今已经发布3年多了,但是因为蕴含的语法之广,完全消化需要一定的时间,这里我总结了部分ES6,以及ES6以后新语法的知识点,使用场景,希望对各位有所帮助
grain先森
2019/03/28
1.2K0
ES6知识点补充
ES6新特性
由于ES6在一些低版本的浏览器上无法运行,需转成ES5之前的版本兼容,以下有几种方案可以自动转换
jinghong
2020/05/09
1K0
ES6新特性
JavaScript第十二弹——ES6(上)
Hello大家好,最近我们也讲了不少JavaScript的知识了,今天再来点实用的吧,不管是在工作中还是面试中,ES6都是我们会遇到的一个东西,ES6呢,全称是ECMAScript2015,那么ECMAScript与JavaScript又是啥关系呢?ECMAScript是JavaScript的规格,JavaScript是ECMAScript的实现,ES6呢则是JavaScript的下一代标准。
萌兔IT
2019/07/25
5530
通过 20 个棘手的ES6面试问题来提高咱们的 JS 技能
ECMAScript 6(以下简称ES6)是 JS 语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得 JS 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。接下来咱们来看看 20 道棘手的面试题,通过做题,顺带提升一下咱们的 JS 的技能。
前端达人
2019/11/22
1.6K0
JavaScript 设计模式学习第四篇-ES6 中可能遇到的知识点
ES6(ECMAScript 6,ES2015)原来指的是 ECMA 组织在 2015 年发布的 ECMAScript 2015 标准,以后发布的 ECMAScript 2016 对应 ES7,依此类推。今年发布的 ECMAScript 2019 标准对应的就是 ES10。相比于之后发布的这些版本,ES6 的改变幅度非常大,因此我们通常说的 ES6 广义上也包括 ES5 之后的所有更新。
越陌度阡
2020/11/26
4840
JavaScript 设计模式学习第四篇-ES6 中可能遇到的知识点
通过 20 个棘手的ES6面试问题来提高咱们的 JS 技能
ECMAScript 6(以下简称ES6)是 JS 语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得 JS 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。接下来咱们来看看 20 道棘手的面试题,通过做题,顺带提升一下咱们的 JS 的技能。
前端小智@大迁世界
2019/11/12
8910
前端模块化开发--ES6相关知识
Promise 是异步编程的一种解决方案,避免了传统的回调函数的层层嵌套,也就是常说的“回调地狱”。
MiChong
2020/09/24
5450
[JavaScript] ES6及以后版本的新特性
在 ES5 之前,JavaScript 没有原生模块化系统,开发者通常使用全局变量或外部库(如 require.js)来实现模块化。但这会导致代码难以维护、命名冲突等问题。
DevKevin
2025/01/25
1500
你不得不知的ES6的变量声明!
在ES5中,变量声明只有var和function以及隐式声明三种,在ES6中则增加了let,const,import和class四种,以下来介绍着七种变量的声明。
胡哥有话说
2019/07/25
4660
JavaScript ES6  让我们写得少,做得多
JavaScript ES6 带来了新的语法和新的强大功能,使您的代码更现代,更易读。它允许您编写更少的代码并执行更多操作。 ES6 向我们介绍了许多强大的功能,如箭头函数,模板字符串,对象结构,模块等,让我们来看看。
桃翁
2018/10/18
8360
ES6 新特性示例
JS的新版本 ES6/ECMAScript2015 在去年出来了,我们现在普遍使用的ES5是在2009年出来的,相隔这么多年,变化比较大,添加了一些很好用的特性 下面就看几个简单而实用的小特性 特性示例 1模板文本 需要在字符串中加入变量时,通常做法就是使用字符串拼接,如 var param = 'b'; var str = 'a ' + param + ' c'; ES6中简单了,可以直接在字符串中添加变量 var str = `a ${param} c`; 注意,使用的是反引号 ``,而不
dys
2018/04/03
8140
ES6的前世今生
1996 年 11 月,Netscape 创造了javascript并将其提交给了标准化组织 ECMA,次年,ECMA 发布 262 号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript,这个版本就是 1.0 版。
创译科技
2019/09/03
9770
ES6的前世今生
ES6 小结(前端开发js技术进阶提升总结)
es6中有很多特性,使javascript语法更加丰满,总结一波常用的es6知识点。
用户1272076
2019/03/26
1K0
ES6的一些常用特性
由于公司的前端业务全部基于ES6开发,于是给自己开个小灶补补ES6的一些常用特性。原来打算花两天学习ES6的,结果花了3天才勉强过了一遍阮老师的ES6标准入门,下面罗列一些自己经常用到的ES6特性。 Default Parameters(默认参数) 还记得我们以前不得不通过下面方式来定义默认参数: var link = function (height, color, url) { var height = height || 50; var color = color || 'red';
牧云云
2018/05/02
7110
ECMAScript 6 特性ECMAScript 6 特性
ECMAScript 6,也被称做ECMAScript 2015,是ECMAScript标准的下一个版本。这个标准预计将于2015年6月被正式批准。ES6是这门语言的一次重大更新,自ES5以来,该语言的首次更新是在2009年。主流Javascript引擎对ES6相关特性的实现也正在进行中。
用户2936342
2018/08/27
6400
90% 的前端都会使用 ES6 来简化代码,你都用过哪些?
ECMA-262:主标准,由 ECMA 国际组织(Ecma International)负责管理(为了让最初的JavaScript 与最初的 JScript 能遵循同一套标准发展而诞生的 ECMAScript ,正好排到了作为 Ecma 的 262 号标准,所以得到 ECMA-262 编号。)
coder_koala
2021/05/28
4650
相关推荐
不得不知的ES6十大特性
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档