Flutter 1.22以变量为键的国际化

gzjq41n4  于 2023-02-09  发布在  Flutter
关注(0)|答案(4)|浏览(135)

我为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"])这样的东西当然不起作用。

t2a7ltrp

t2a7ltrp1#

我认为这在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');
    }
  }
}
vd8tlhqk

vd8tlhqk2#

为了提供https://stackoverflow.com/users/5638943/kristi-jorgji的答案的示例(工作正常):
应用程序_en.任意波形-〉

{
     "languages": "{\"en\": \"English\", \"ro\": \"Romanian\"}"
 }

本地化_控制器.dart -〉

String getLocaleName(BuildContext ctx, String languageCode) {
    return jsonDecode(AppLocalizations.of(ctx)!.languages)[languageCode];
  }

getLocaleName(context, 'ro') -> "Romanian"
vc6uscn9

vc6uscn93#

你可以把一个键翻译成json字符串,然后读取它,解析成Map〈string,string〉,动态访问你需要的内容。
这种方法已经取得了巨大成功

blmhpbnm

blmhpbnm4#

创建了一个包来解决这个问题,因为flutter还不支持使用动态键访问翻译。
阅读文档以设置https://pub.dev/packages/localization_mapper_annotation
如果有帮助的话请投票。

相关问题