flutter-intl是否支持带fallback的翻译方法处理protobuf枚举?
Flutter Intl 实现 Protobuf 枚举翻译带回退值
flutter_intl 默认的 translate 方法没有直接支持传入回退值的参数,但可以通过两种简单方式实现你要的效果:
1. 先处理枚举字符串的格式问题
Protobuf 生成的枚举调用 toString() 会返回类似 Color.blue 的完整字符串,需要先提取出后面的枚举值名称(比如 blue),避免翻译 key 不匹配:
extension EnumExtension on Enum { // 提取枚举的纯值名称,去掉类名前缀 String get nameOnly => toString().split('.').last; }
2. 实现带回退的翻译方法
方法一:扩展 AppLocalizations 类,添加带异常捕获的翻译方法
通过扩展类新增一个支持回退的方法,捕获翻译缺失的异常后返回回退值:
import 'package:flutter/foundation.dart'; import 'package:flutter_intl/flutter_intl.dart'; extension LocalizationsFallback on AppLocalizations { String translateWithFallback(String key, String fallback) { try { return translate(key); } on MissingTranslationException { return fallback; } } }
使用方式:
final enumName = enumVal.nameOnly; String translatedStr = AppLocalizations.of(context)!.translateWithFallback(enumName, enumName);
方法二:先检查翻译 key 是否存在,再决定返回值
利用 flutter_intl 自动生成的 containsKey 方法,先判断当前语言包是否有对应翻译,没有则直接返回枚举名称:
final enumName = enumVal.nameOnly; final loc = AppLocalizations.of(context)!; String translatedStr = loc.containsKey(enumName) ? loc.translate(enumName) : enumName;
注意事项
- 确保你的 arb 翻译文件中,key 和枚举的纯值名称一致,比如:
像{ "blue": "蓝色", "red": "红色" }yellow这类没有配置翻译的枚举值,就会自动回退显示yellow。
内容的提问来源于stack exchange,提问作者Alai
相关产品推荐
相关产品推荐

