Flutter 1.22 以变量为键的国际化
Flutter 1.22 Internationalization with variable as key
我为 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';
}
如您所见,它不会生成任何代码来执行动态查找。
在大多数情况下,这样的代码生成是一个很好的优势,因为您可以获得自动完成和类型安全,但这确实意味着适应这些动态用例更加困难。
您唯一能做的就是手动编写查找 table,或者选择另一个支持动态查找的 i18n 解决方案。
查找 table 可能看起来像这样。只需确保始终传入当前构建上下文,以便 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');
}
}
}
您可以将翻译中的密钥存储为 json 字符串。
然后您阅读它,将其解析为 Map 并动态访问您需要的内容。
一直在使用这种方法并取得了巨大成功
我为 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';
}
如您所见,它不会生成任何代码来执行动态查找。
在大多数情况下,这样的代码生成是一个很好的优势,因为您可以获得自动完成和类型安全,但这确实意味着适应这些动态用例更加困难。
您唯一能做的就是手动编写查找 table,或者选择另一个支持动态查找的 i18n 解决方案。
查找 table 可能看起来像这样。只需确保始终传入当前构建上下文,以便 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');
}
}
}
您可以将翻译中的密钥存储为 json 字符串。
然后您阅读它,将其解析为 Map
一直在使用这种方法并取得了巨大成功