我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Flutter多语言实践

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Flutter多语言实践

简单来讲,流程图如下:

Flutter多语言实践简单讲一下整个流程:

  1. 我们先写一个AppStrings.dart,这个文件是整个多语言的核心,生成和使用都需要这个文件。在这个文件里可以定义获得文本的api,比如

String order_list_waiting_for_review() => Intl.message(        'Waiting for the review',        name: "order_list_waiting_for_review",          locale: _localeName      );

其中,方法名和name必须保持一致(不要问我为何会有这种坑爹要求)。'Waiting for the review'是默认文案,locale是当前的locale。
这样定义的话,可以用下面的方式获得文本

String text = AppStrings.of(context).order_list_waiting_for_review();// text == "Waiting for the review"

很好理解,AppStrings.of(context)就是通过context获得对应的locale的AppStrings,进而获得对应的文案。

  1. 在上面以那种格式定义后,我们可以执行下面这个命令把AppStrings.dart生成intl_messages.arb

flutter pub pub run intl_translation:extract_to_arb --output-dir=lib/l10n lib/app_strings.dart

*.arb是个中间产物,其内就是JSON文本。其实会有更多附加信息,描述这个文本,不过在此省略。

{  "order_list_waiting_for_review": "Waiting for the review",}
  1. 生成的arb文件只是一种语言的,我们可以把它拷贝成N种语言对应的文件,比如intl_en.arb,intl_es.arb等,并把内容的value都替换成对应语言的文案。

  2. 然后再执行下面这个命令,生成messages_*.dart

flutter pub pub run intl_translation:generate_from_arb --output-dir=lib/l10n \   --no-use-deferred-loading lib/app_strings.dart lib/l10n/intl_*.arb

可以看到,作为入参的是lib/app_strings.dart和lib/l10n/intl_*.arb,flutter工具党确保lib/app_strings.dart中的方法名、方法中的name参数,和lib/l10n/intl_*.arb中的json的key一致的时候,才会在生成的messages_*.dart文件中加入对应的文案,缺一不可。

我们再回过头来看这段代码

String order_list_waiting_for_review() => Intl.message(        'Waiting for the review',        name: "order_list_waiting_for_review",          locale: _localeName      );

Intl.message()方法实际上是根据locale获取对应的message_*.dart文件,然后再通过name找到对应的文案返回。

  1. 当然,还需要对MaterialApp定义localizationsDelegates本地化代理和supportedLocales支持的多语言,这部分在文章最开始的文档里写的很详细了,就不再赘述了。

官方方案的问题

官方的方案虽然很长很繁琐,但还是可以实现多语言的功能的,只是对于我们来讲,它存在以下几个问题:

  1. 需要在AppStrings.dart中定义文本获得的方法,一个文本就需要定义一个方法,并且方法名和name必须一致才能和arb文件一起生成最后的dart文件。一个文案对应一个方法,代码写起来很冗余,并且不利于文案的枚举使用(比如文案的key之间有关系)。和native开发之前的习惯也不同。使用和生成的逻辑放到一起,倘若有几千个文案,AppStrings.dart估计要爆表。

  2. 流程太长,不利于自动化下载语言的脚本的实现

我们的流程

Flutter多语言实践起点的i18n.py是我们自己写的python脚本,一共有两个作用

  1. 从美杜莎(阿里国际化文案管理平台)上获得多语言文案,并重命名成arb文件。

前面说到,arb文件其实是json格式的,美杜莎支持以json格式导出文本,所以我们做的只是重命名,不需要对内容进行更改。

  1. 在arb文件处理好后,会拿默认的(英语)文本去生成一个dart文件,这个dart文件只用来作为中间产物,不会被其他dart使用的。
    其中只包含如下内容

import 'package:intl/intl.dart';class MessagesIndex {  String order_list_waiting_for_review() => Intl.message(        'Waiting for the review',        name: "order_list_waiting_for_review",      );  // ......}

那么,我们继续调用生成最终产物的命令行

flutter pub pub run intl_translation:generate_from_arb --output-dir=lib/l10n \   --no-use-deferred-loading lib/messages_index.dart lib/l10n/intl_*.arb

发现文件以及其内的文案已经被正确生成了。

调用方式

我之所以这样更改流程,其实只有两个目的:

  1. 可以像读map一样的读取多语言文案,而不是像调用方法那样去读取。

  2. 拉取、生成多语言文案的过程可以自动化。
    通过上面一顿操作,生成文案的工作都被自动化搞定了,那我们只需要在AppStrings.dart中添加一个方法,传入name,传出想要的多语言文案即可:

class AppStrings {  final String _localeName;  // ......  static AppStrings of(BuildContext context) {    return Localizations.of<AppStrings>(context, AppStrings);  }  // AppStrings.of(context).str(stringKey)  String str(String name) {    return Intl.message(name, name: name, locale: _localeName);  }  // 重写操作符,减少代码量  // AppStrings.of(context)[stringKey]  operator [](String messageName) => str(messageName);}

【本文转载自云栖社区,作者:shoulder,原文链接:https://yq.aliyun.com/articles/624559?spm=a2c4e.11157919.spm-cont-list.8.146c27aewVdE98】

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Flutter多语言实践

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Flutter多语言实践

简单来讲,流程图如下:简单讲一下整个流程:我们先写一个AppStrings.dart,这个文件是整个多语言的核心,生成和使用都需要这个文件。在这个文件里可以定义获得文本的api,比如String order_list_waiting_for
2023-06-05

PHP核心的多语言支持与实践

PHP核心的多语言支持与实践随着全球化的发展,多语言支持成为了现代应用程序开发的重要需求。为了满足不同语言背景的用户,开发人员需要在应用程序中提供多语言支持,以便用户能够使用他们熟悉的语言进行交互。PHP作为一种流行的服务器端脚本语言,提供
PHP核心的多语言支持与实践
2023-11-08

Go语言多线程编程实践指南

Go语言多线程编程实践指南Go语言作为一种现代化的编程语言,自带优秀的并发支持,使得多线程编程变得非常简单和高效。本文将介绍如何使用Go语言进行多线程编程,并通过具体的代码示例展示其中的各种技巧和最佳实践。一、Go语言的并发模型在Go
Go语言多线程编程实践指南
2024-02-29

iOS文本的多语言适配以及实践指南

目录背景字体包的多语言适配和实践需求分析技术设计文本信息的多语言适配和实践需求分析技术设计技术开发拓展总结背景产品被多个国家使用,产品方希望产品拥有更好的多语言使用体验,所以设计师提供多种字体来适配指定的语言。基于以上背景,客户端需要快速给
2022-06-02

提升多语言网站用户体验的妙招:CMS 多语言支持的最佳实践

多语言网站需要提供无缝的用户体验。本文将深入探讨 CMS 多语言支持的最佳实践,为您提供提升用户体验的妙招。
提升多语言网站用户体验的妙招:CMS 多语言支持的最佳实践
2024-02-28

Thinkphp语言包实现原理与实践

我们知道,Thinkphp中支持语言包功能。ThinkPHP具备语言包定义、自动识别、动态定义语言参数的功能。首先我们来说语言文件名称,该文件名称是受我们控制的,我们可以在底层配置文件convention.php中进行配置DEFAULT_L
Thinkphp语言包实现原理与实践
2024-02-27

今日头条 Flutter 架构实践

移动跨平台技术探究◆ 为什么需要跨平台?◆ 跨平台技术是如何发展起来的?◆ 跨平台技术选型有哪些?◆ Flutter有什么独特优势(为什么选择Flutter)?◆ 为什么说Flutter是高性能的,体现在哪里?Flutter引擎原理剖析先来
2023-06-04

Go语言项目开发实践中的最佳实践分享

Go语言近年来在软件开发领域越来越受到关注,成为了很多开发者的首选语言。其简洁的语法、高效的并发模型,以及强大的标准库,使得Go语言在开发项目时具有很大的优势。然而,在实际项目开发中,还是存在一些需要注意的地方,本文将分享一些Go语言项目开
Go语言项目开发实践中的最佳实践分享
2023-11-03

Go语言接口开发实践手册

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《Go语言接口开发实践手册》,就带大家讲解一下知识点,若是你对本文感兴趣,或者
Go语言接口开发实践手册
2024-04-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录