Flutter 1.22 以变量为键的国际化

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

我为 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"])
之类的东西当然行不通。

flutter variables dart internationalization arb
4个回答
4
投票

我认为这对于

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 解决方案。

查找表可能看起来像这样。只需确保始终传入当前构建上下文,以便本地化代码可以查找当前语言环境。

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');
    }
  }
}

2
投票

https://stackoverflow.com/users/5638943/kristi-jorgji 的答案提供示例(效果很好):

app_en.arb ->

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

localization_controller.dart ->

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

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

0
投票

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

使用这种方法取得了巨大成功


0
投票

如果您尝试应用提供的 JSON 解决方案但收到此错误:

[app_en.arb:languages] ICU 词法错误:意外字符。 {"en": "英语", "es": "西班牙语"}

首先将以下内容添加到l10n.yaml:

use-escaping: true

然后按如下方式定义您的密钥:

"languages": "'{'\"en\": \"English\", \"es\": \"Spanish\"'}'"
© www.soinside.com 2019 - 2024. All rights reserved.