Flutter intl未替换ICU复数格式#数字占位符的问题咨询
结论
这不是你的配置或操作错误,是 Dart intl 包及配套 intl_utils 工具的既定实现逻辑——这套工具链从始至终就没实现ICU消息格式里#占位符的自动替换能力。
细节说明
- 你参考的ICU标准规则本身没问题:标准plural/select语法块内的
#确实应该自动绑定当前计数值,按当前激活locale的数字规则格式化后替换占位。但Dart生态的intl包开发时没有实现这个特性,相关功能申请已经存在多年,至今没有合入正式发布版本。 - 你观察到的「代码生成阶段保留#、运行时直接输出带#的字符串」是所有使用这套工具链的项目都会遇到的统一表现,和你本地的命令、配置没有关系。
可行解决方法
目前有两个方案可以绕过这个问题:
- 不使用
#占位符,显式写参数名
直接把ARB里的#换成你传入的计数参数名即可,比如把你示例里的内容改成:
改完重新执行{number, plural, one {Temporarily inactive ({number} day left)} other {Temporarily inactive ({number} days left)}}flutterw pub run intl_utils:generate生成代码即可正常渲染数字。提示:如果你需要本地化数字格式(比如不同语种的数字字符、千分位分隔),不要直接把原始num类型的参数传进去,要提前用对应locale的
NumberFormat处理后再传给国际化方法,否则阿拉伯语、印地语等使用非阿拉伯数字的语种会出现数字格式不符合当地习惯的问题。 - 迁移到Flutter官方国际化工具链
Flutter官方自带的flutter gen-l10n代码生成工具是完整支持ICU标准的#占位符特性的,如果项目还在早期阶段,可以直接迁移到官方方案,不用再自己处理这类兼容问题。
内容的提问来源于stack exchange,提问作者Eric-Xeo
相关产品推荐
相关产品推荐

