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
相关产品推荐
相关产品推荐

