我认为这是不可能的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');
}
}
}