0

我为 Flutter 实现了新的(官方)本地化(https://pascalw.me/blog/2020/10/02/flutter-1.22-internationalization.html)并且一切正常,除了我不知道如何获取变量键的翻译。

翻译在 ARB 文件中,但我如何访问它?

通常我使用 访问翻译Translations.of(context).formsBack,但现在我想获得 的翻译value["labels"]["label"]

Translations.of(context).(value["labels"]["label"])这样的东西当然行不通。

4

2 回答 2

1

我认为这是不可能的gen_l10n。生成的代码gen_l10n如下所示(略略):

/// The translations for English (`en`).
class TranslationsEn extends Translations {
  TranslationsEn([String locale = 'en']) : super(locale);

  @override
  String get confirmDialogBtnOk => 'Yes';

  @override
  String get confirmDialogBtnCancel => 'No';
}

如您所见,它不会生成任何代码来执行动态查找。

对于大多数情况,这样的代码生成是一个很好的优势,因为您可以获得自动完成和类型安全,但这确实意味着适应这些动态用例更加困难。

您唯一能做的就是手动编写一个查找表,或者选择另一个支持动态查找的 i18n 解决方案。

查找表可能看起来像这样。只要确保你总是传入当前的构建上下文,这样 l10n 代码就可以查找当前的语言环境。

class DynamicTranslations {
  String get(BuildContext context, String messageId) {
    switch(messageId) {
      case 'confirmDialogBtnOk':
        return Translations.of(context).confirmDialogBtnOk;
      case 'confirmDialogBtnCancel':
        return Translations.of(context).confirmDialogBtnCancel;
      default:
        throw Exception('Unknown message: $messageId');
    }
  }
}
于 2020-12-24T10:28:46.997 回答
0

您可以将翻译中的键存储为 json 字符串。然后您阅读它,将其解析为 Map<string,string> 并动态访问您需要的内容。

一直在使用这种方法并取得了巨大的成功

于 2021-08-09T15:17:52.250 回答