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

Flutter如何在ARB本地化文件中存储与访问JSON对象?

问题解答

是否可以在ARB文件中存储JSON对象/数组?

不行。Flutter官方的本地化代码生成工具仅支持ARB文件中的翻译值为字符串类型,所有非字符串类型的值(数组、对象、数字等)都会触发你遇到的编译错误。ARB规范本身虽然基于JSON,但Flutter的l10n工具对其做了约束,仅接收键值对形式的字符串翻译,以及对应的@开头的元数据配置(元数据本身是对象,属于特殊配置,不属于翻译值)。

可行的替代方案

方案1:展平翻译键(最推荐,适配官方工具逻辑)

将嵌套的数组/对象拆为独立的扁平化翻译键,之后在Dart代码中自行组装成你需要的结构。
示例修改如下:
app_en.arb

{
  "helloWorld": "Hello World!",
  "@helloWorld": {
    "description": "The conventional newborn programmer greeting"
  },
  "content_one_question": "What's your name?",
  "@content_one_question": {
    "description": "Question for content item with id one"
  },
  "content_two_question": "What's your name?",
  "@content_two_question": {
    "description": "Question for content item with id two"
  }
}

Dart代码组装逻辑:

List<Map<String, String>> getContent(BuildContext context) {
  final loc = AppLocalizations.of(context)!;
  return [
    {"id": "one", "question": loc.content_one_question},
    {"id": "two", "question": loc.content_two_question}
  ];
}

方案2:单独维护结构化JSON翻译文件

如果你的翻译内容嵌套层级多、数量不固定,可以把这类复杂结构的翻译单独存为JSON文件,放在assets目录下,根据当前App的locale动态加载解析即可,可和ARB的普通翻译混用。
操作步骤:

  • 在assets下新建i18n目录,存放content_en.json、content_hi.json等文件,直接存储你需要的数组结构
  • 在pubspec.yaml中注册对应assets路径
  • 运行时用rootBundle.loadString('assets/i18n/content_${Localizations.localeOf(context).languageCode}.json')加载,解析后直接使用

方案3:序列化内容为字符串存储(不推荐)

你可以把整个数组JSON序列化为转义后的字符串,作为ARB的value存储,代码中读取后再做JSON解析。但这种方式维护成本很高,翻译时需要处理转义字符,不建议使用。


内容的提问来源于stack exchange,提问作者sg717

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:15:03