如何在 flutter 中使用 运行 时间下载本地化 arb/json 文件?

How to use run time downloaded localization arb/json file in flutter?

看了那么多关于flutter本地化的教程和博客。他们使用 assets 文件夹或 l10n 文件夹中的 arb/json 文件进行本地化。那是固定的语言列表。意味着如果我使用英语本地化并且现在在 运行 时间我想向用户提供 Spanish/Chinese/Italian/French 然后我必须将该本地化 arb/json 文件放在项目中然后用户可以使用该语言.那么有什么方法可以让我在 运行 时间下载本地化文件并在应用程序中使用它?有没有图书馆可以做到这一点?

所有通过 l10n 或 arb/json 的默认本地化方法都无法进行运行时本地化。这是因为他们使用 InheritedWidget/BuildContext 解析本地化 - 因此应该预先构建带有资源的资产包 - 与字体、图像等一样(否则你会遇到错误 Unable to load asset).

但你想要的是可能的。不过,您将必须设置自己的方法。最简单的方法是在应用程序加载时下载所有需要的 JSON 本地化文件并将它们存储在共享首选项(db/file 系统)中。在进入每个屏幕之前检查当前的本地化并检索所需的 (language-wise) 文件,解析它并在您的 Text 小部件中使用它。

此外,您可以采用后端样式 - 每个对后端的请求都应在其 URL 或 body 中的区域设置字段中包含区域设置查询。它不仅会检索值,还会检索 key-value 样式的标题,如

some-get/data?locale=en
{
   "userName": {
       "key":"User name",
       "value": "John Dou"
   }
}

所有动态本地化的方法都需要在前端(flutter)和后端进行额外的工作。 我假设已经有服务为此提供了一些解决方案(可能不是特定于 flutter 的)但是快速谷歌搜索是不成功的。

我在 Flutter 项目中使用了 flutter_i18n package。由于 NetworkFileTranslationLoader class.

,它允许从远程源检索翻译

要使用它,您需要将它添加到您的 localizationsDelegates 中,如文档中所示。下面的示例显示了如何从远程服务器上的静态目录加载所有翻译文件。

localizationsDelegates: [
        FlutterI18nDelegate(translationLoader: 
          NetworkFileTranslationLoader(baseUri: Uri.https("example.com", "static")),
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate
],

我用 GetXHive.

制作了一个简单的多语言 Android 应用程序

此项目执行以下任务,它:

  • 在不同语言之间切换,
  • 从外部源安装新语言包,并且
  • 提供本地数据持久性。

安装新语言包后,应用需要重启才能使更改生效。

可以找到源代码here

更新 2021 年 8 月 7 日

此项目的新版本已发布here