flutter - Flutter 1.22 以变量为键的国际化
问题描述
我为 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"])
这样的东西当然行不通。
解决方案
我认为这是不可能的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');
}
}
}
推荐阅读
- html - 如何从输入字段中引用其标签?
- visual-studio - 仅将全局使用应用于某些文件/命名空间
- amazon-web-services - Ansible:根据当前状态启动或停止 EC2 实例
- excel - Excel:部分匹配范围 1 与范围 2 中的每个单元格字符串,然后在列中返回值
- python - Omron Sysmac - 将十六进制转换为有符号浮点十进制
- python - 在循环中更改变量?
- javascript - 将 HTMLElement 附加到内联元素的中间
- c# - RemoveRange 上的 DbUpdate 异常
- ios - 进入后台时停止应用程序刷新。(iOS)
- statistics - 不同样本量的不同组的统计参数比较