乐趣区

关于flutter:在-Flutter-应用程序中通过定制服务进行本地化

前言

猫哥在我的项目中也是有这个困惑,如何治理 多语言,如果常量定义形式,还是有点不优雅。

这篇文章的作者就提出了个不错的倡议,服务端编辑,本地文件缓存同步。

就是读取数据库啦,后端弄个界面保护保护数据,貌似是一个不错的计划。

原文

https://medium.com/flutter-co…

代码

https://github.com/VB10/custo…

参考

  • https://pub.dev/packages/easy…

注释

许多应用程序在客户端进行本地化。这意味着,如果您的密钥有任何问题,您必须同时更新字符串和应用程序。让咱们学习自定义解决方案,当用户将扭转语言,咱们的应用程序将间接更新每个屏幕的新语言。

正如我所说的,通常咱们应用 JSON 文件等的本地化。我写了许多 Flutter 我的项目,所以我过来使本地化为咱们的客户,一般来说,我做了一个土耳其和英语版本的产品由我写的。

通常咱们像这样定义这些键,而后应用程序用键读取值。

Flutter 有许多本地化选项,特地是我在生产我的项目中屡次应用了 easy_localizaiton。这对我的所有要求都实用,但有一天,客户须要非凡的解决方案。我曾经间接要求,

  • 你晓得咱们有一个 location,你还指望什么?
  • 是的,Veli 咱们晓得这一点,然而咱们想要治理本地化文件在咱们的 web 服务和客户端能够更改语言到咱们的本地化列表响应。

实际上,这个申请并不是什么大问题,因为咱们能够应用近程配置、Firebase 实时配置或者简略的本地化都有自定义的后端解决方案,然而任何人都不能满足这些要求。该做甜甜圈了!

如果咱们想要更好的编码工夫,咱们必须制订打算。首先,两个应用程序的 API 端点是什么,以取得咱们反对的语言列表,应用程序将通过查看语言键带来翻译值。当应用程序用户更改应用程序中的语言时,咱们必须更改整个字符串值,而不是旧值。

咱们的步骤:

  • 应用程序和应用程序更改语言的后端端点能够是显示语言
  • 咱们将实现初始语言
  • 咱们能够依据主动接管到的新语言信息扭转整个文本的一个点。
  • 用户能够找到以后的语言值。

我用 Firebase 创立了简略的后端资源,例如:

通常我有一个定制的后端,比方 node.js,Java 等等,或者我能够抉择 Firebase 云函数,然而我只是想展现如何应用 flutter 个性定制本地化,所以咱们没有应用这个办法。

让咱们开始编码吧!

咱们晓得如何用后端端点加载语言资源。之后,我想缓存它的后端响应,因为客户端须要每次重新启动的全副数据。因而,咱们须要缓存机制,以放弃后端响应,而用户不更改语言。

我曾经抉择了 Hive 解决方案应用缓存的应用程序,因而 Hive 十分疾速,平安,和有用的解决方案为咱们。我为咱们的许多企业项目选择了 Hive。我将在这个我的项目中应用这个库:

  • Hive – https://pub.dev/packages/hive (Cache)
  • Vexana – https://pub.dev/packages/vexana (Network)
  • Provider – https://pub.dev/packages/prov… (Global State)
  • 首先,咱们须要示例屏幕来显示初始语言的键值 (当初我承受在更改为 tr 之后开始 en while 应用程序)。

我在上面的图片中增加了 tr 和 en 的语言值。

当初,我将实现一个服务层来获取列表语言后果和相干键值。我总是偏向于为上面的实例服务调用的每个业务操作提供接口。

abstract class ILangugaeService {
  final INetworkManager networkManager;
  ILangugaeService(this.networkManager);
  Future<List<String>?> fetchLangageList();
  Future<Map<String, dynamic>?> fetchSpesificResources(String key);
}

在我尝试为控件后端响应实现一个个性测试之后,我编写了这个接口,它是正确的,因而我想为咱们的业务验证这个响应。

当您调用这个测试服务测试文件时,您将看到每个操作都是正确的。

  • 测试性能后果

是时候实现后端局部了。在包含 to title 和 body widget 之后,我将调用 en 的资源列表。实现后,咱们实现了第一个指标

  • 初始资源

当初,咱们连贯到了后端服务,如果更改为语言参数,咱们能够主动显示新的资源。当初,咱们须要什么?如果咱们有太多的页面,咱们心愿动静地更改整个键。让咱们把这个修建。

最初,我实现了这个小工具。它由语言列表响应填充。如果您想要增加一种新的语言,您只需在应用实现后在数据库中增加一个资源键即可。

语言治理

我将创立一个用于治理经营的 manager 类。它须要告诉一个应用程序的每一个变动。对钥匙的其余要求。我打算为键字符串设置语言扩大类。这个扩大将可能监听语言的变动。

它扭转了咱们的本地化资源,而后通过提供程序管理告诉整个模块。我更新了每个语言更改申请的初始资源键。

这是筹备应用,但我如何应用我的钥匙。是的,咱们谈到须要一个字符串变动的扩大。首先,咱们须要学习如何依据以后视图实现这个管理器。

Text(context.watch<LanguageManager>().resources?[LocaleKeys.hello.name] ?? '')

也就是说,每次更改都会失去字符串响应,但我不应用这个,因为它太长而且不能管制。当然,咱们如何能力为此编写一个更好的解决方案?

我将替换 home 视图中的文本小部件,例如:

ListTile(title: Text(LocaleKeys.ageQuestion.tr(context))),

您能够抉择不应用 context-param 的其余状态治理办法。那是你的抉择,我给倡议应该用这个。

来自后端响应的运行时更改

当初,咱们曾经筹备好应用,然而咱们须要最初的改良缓存,因而咱们将通过缓存取得性能和能力。咱们的要求曾经够多了。Hive 它既是一个疾速又平安的键值数据库。

实现配置单元后,我将向数据库中增加后端响应,以便应用脱机或应用程序启动。通常咱们应该获取语言响应,直到用户能够手动更改语言或者获取数据到具备任何数据的应用程序。

我创立了 IHive 抽象类来治理我的 hive 类。我做了一个两个盒子,第一个治理我的钥匙,另一个保留语言列表。

在我更新了我的语言管理器之后。我增加了两个新的参数 IHive <map> 和 IHive <list>,用于保留语言环境数据。

LanguageManager(LanguageService(ProductNetworkManager()),
  LanguageHive(),
  LanguageListHive(),),

我开始管制那些有缓存数据的应用程序。如果应用程序有任何缓存数据,它将在第一次启动时更新管理器资源。用户在更新语言环境时,我将进入在 Hive 中响应以便再次重用。

我在 map 数组中放弃抉择的语言,然而通常如果你想放弃其余语言,你能够为新的键关上一个新的框。它将提供不再下载其余语言,因为您的旧框保留在应用程序,而您删除的 Hive。

还有一点,当应用程序启动时,我将在查看缓存中的数据之后,首先进行初始化。

咱们差不多筹备好了! 让咱们看看后果如何。

其余提醒,您能够应用流构建器监听配置更改,然而我不应用流创立屏幕,兴许您能够创立一个基类并监听配置更改,而不须要任何状态治理。

Thank you for reading 🍀
Have a good hacking, both in real life and coding life

感谢您浏览 🍀

《Have a good hacking, both in real life and coding life》

GitHub 代码

https://github.com/VB10/custo…

end


© 猫哥

  • 微信 ducafecat
  • 博客 ducafecat.tech
  • github
  • bilibili
退出移动版