将动态字符串传递给 AppLocalizations.of(context)!在颤振中

问题描述 投票:0回答:3

现在我使用 Flutter 在 App 中工作,我有 4 种不同的语言,我使用 json(arb 文件)进行本地化(翻译)

我需要传递不同的字符串值,应用程序使用 API 获取它们,如下面的示例所示

AppLocalizations.of(context)!snapshot.data![index].state_pickup[0]

但是

"AppLocalizations.of(context)!"
不会从
snapshot.data![index].state_pickup[0]
获取返回数据,而是将其作为字符串查找,并尝试在 AppLocalization.dart 类中搜索匹配字符串名称?

知道如何将动态字符串参数传递给

AppLocalizations.of(context)!
吗?

flutter fetch-api snapshot flutter-futurebuilder applocalizations
3个回答
5
投票

您正在尝试做的事情,在运行时通过名称调用方法,称为反射,并且 Flutter 本身不支持此功能(尽管有一些软件包试图模拟这一点,但我没有使用它们的经验) .

对您有用的方法是手动将您的值从 API 映射到

AppLocalizations.of(context)
中的相应方法,尽管这可能很乏味。

String localizedString = getLocalizedString(snapshot.data![index].state_pickup[0], context);

String getLocalizedString(String key, BuildContext context) {
  switch (key) {
    case "possible_api_value_1":
      return AppLocalizations.of(context)!.possibleApiValue1;
    case "possible_api_value_2":
       return AppLocalizations.of(context)!.possibleApiValue2;
      ...
     }

3
投票

另一种选择是使用(滥用?)ICU

Select
选项。

这相当于翻译文件本身中的 switch case 语句,而不是像 @pdurasie 所描述的那样对其进行编码。

如 Localizely 文档中所述(此处此处

Select 语句采用与传递的变量匹配的形式或默认为其他形式,这是必需的。

{
  "selectExample": "Today is {gender, select, male {his} female {her} other {their} } birthday"
  "@selectExample": {
    "placeholders": {
      "gender": {}
    }
  }
}

如果我们将值为male的性别变量传递给示例,它将打印“今天是他的生日”。

海报的 Flutter 代码如下所示:

AppLocalizations.of(context).selectExample(snapshot.data![index].state_pickup[0])

目前尚不清楚选择选项的数量是否有任何限制。 (ICU 参考文档


-1
投票

使用 Flutter easy_localization 包,您可以在 JSON 翻译文件中使用大括号“{}”来处理动态字符串表达式。以下是 Flutter 代码和 JSON 文件的格式:

en_US.json:
{"before_notification": "Notifications will be set to {} minutes ago."}

 Flutter:
Text(tr('before_notification', args:[_selectedMinutes.round()]),), 

在此设置中,您可以在 JSON 文件中定义翻译键,并使用大括号“{}”作为动态值的占位符。然后,在 Flutter 代码中,使用 tr() 函数访问翻译,并使用 args 参数将动态值传递给占位符。

通过遵循此结构,easy_localization 包将在运行时将翻译中的占位符 {} 替换为相应的动态值。这样,您就可以根据所选语言轻松显示带有动态内容的翻译字符串。

© www.soinside.com 2019 - 2024. All rights reserved.