Flutter国际化场景下如何通过Map键值动态调用AppLocalizations获取翻译
Flutter国际化动态获取星期翻译实现方案
Flutter默认禁用dart:mirrors反射库,无法直接通过字符串动态调用AppLocalizations实例的getter属性,可通过以下两种稳妥方案实现需求:
方案1:手动添加统一映射方法(官方推荐,稳定性最高)
步骤1:确保arb文件已配置对应词条
英文词条intl_en.arb配置示例:
{ "monday": "Monday", "tuesday": "Tuesday", "wednesday": "Wednesday", "thursday": "Thursday", "friday": "Friday", "saturday": "Saturday", "sunday": "Sunday" }
西班牙语词条intl_es.arb配置示例:
{ "monday": "Lunes", "tuesday": "Martes", "wednesday": "Miércoles", "thursday": "Jueves", "friday": "Viernes", "saturday": "Sábado", "sunday": "Domingo" }
步骤2:在AppLocalizations类中新增取值方法
在自动生成的AppLocalizations类中新增统一的星期取值方法:
class AppLocalizations { // 原有自动生成的星期getter无需修改 String get monday => Intl.message('Monday', name: 'monday'); String get tuesday => Intl.message('Tuesday', name: 'tuesday'); // ... 其余星期的自动生成getter保留 // 新增手动映射方法 String getWeekDay(String key) { switch (key) { case 'monday': return monday; case 'tuesday': return tuesday; case 'wednesday': return wednesday; case 'thursday': return thursday; case 'friday': return friday; case 'saturday': return saturday; case 'sunday': return sunday; default: return key; // 兜底逻辑,找不到匹配key直接返回原字符串 } } }
步骤3:遍历Map时调用方法获取翻译
final loc = AppLocalizations.of(context); map.entries.forEach((entry) { final displayStr = '${loc.getWeekDay(entry.key)}: ${entry.value}'; // 此处处理展示逻辑即可 });
方案2:直接调用Intl底层lookup方法(无需手动写switch)
如果不想维护switch映射,可直接通过Intl的消息查询能力获取对应翻译,前提是传入的key和arb文件中的词条名称完全一致:
String getWeekDayTranslation(String key, BuildContext context) { return Intl.message( '', name: key, locale: Localizations.localeOf(context).toString(), ); } // 使用示例 final displayStr = '${getWeekDayTranslation(entry.key, context)}: ${entry.value}';
内容的提问来源于stack exchange,提问作者Carlos
相关产品推荐
相关产品推荐

