You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:10:37