在Flutter中向AppLocalizations.of(context)传递动态字符串!

9

我目前正在使用Flutter开发应用,其中包含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提供的解决方案(intl包)无法实现。但是您可以使用另一个i18n包,例如https://pub.dev/packages/easy_localization或按照[Flutter文档](https://docs.flutter.dev/development/accessibility-and-localization/internationalization#an-alternative-class-for-the-apps-localized-resources)中所示实现自己的库。 - vogdb
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;
      ...
     }

谢谢,我别无选择,希望能找到更实用的解决方案,因为我有很多需要翻译成四种语言的动态文本!! - Husam Alhwadi
1
@HusamAlhwadi,你有没有想到一个不那么繁琐的解决方案?我现在正处于你曾经遇到的同样困境中。 - RogyBear
@RogyBear 看起来解决方案是使用另一个 i18n 包,比如 https://pub.dev/packages/easy_localization 或者按照 Flutter 文档 中所示实现自己的库。 - vogdb
但如果您有100个字符串的列表 - appdev

2

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

这相当于在翻译文件本身中使用 switch case 语句,而不是像 @pdurasie 描述的那样编码。

如 Localizely 文档所述(这里这里

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

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

如果我们将性别变量的值设置为男性,示例代码将打印出"今天是他的生日"。
海报的Flutter代码如下:
AppLocalizations.of(context).selectExample(snapshot.data![index].state_pickup[0])

不清楚是否有关于选择选项数量的限制。(ICU参考文档

0
使用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包将在运行时用相应的动态值替换翻译中的占位符{}。这样,您就可以根据所选语言轻松显示带有动态内容的翻译字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接