ICU消息格式是Symfony Translation处理复数、性别、选择逻辑的核心机制,支持按语言区域自动适配多复数规则、偏移量计数及嵌套语法,YAML中需加引号避免解析错误。

ICU消息格式是Symfony Translation处理复数、性别、选择逻辑等复杂语言规则的核心机制,比简单管道语法更精准、更符合国际化标准。
基础复数写法:用plural关键词
最常用的是根据数字自动匹配单复数形式。ICU语法使用{count, plural, ...}结构,其中one对应1,other覆盖其余情况(包括0、2+、小数等):
-
"{count, plural, one {1 message} other {# messages}}"→ count=1 → "1 message";count=5 → "5 messages" -
"{count, plural, =0 {No items} one {1 item} other {# items}}"显式处理零值 -
#是占位符,自动替换为数值;{count}也可直接写,但#更简洁且隐含格式化(如千分位)
适配多复数语言:支持6种规则的阿拉伯语等
英语只有 two forms(one/other),但斯洛伐克语有 three(one/few/other),阿拉伯语多达 six。ICU通过语言区域(locale)自动识别规则,无需手动判断:
- 传入
ar_SA时,other会拆解为zero、one、two、few、many、other - 写法示例:
"{count, plural, =0 {لا يوجد عناصر} =1 {عنصر واحد} =2 {عنصران} few {# عناصر} other {# عنصراً}}" - Symfony底层调用
MessageFormatter,已内置CLDR数据,开箱即用
带偏移量(offset)的计数场景
当显示“你还有2个邀请名额”这类文案时,“2”是剩余数,但语义上常从1开始计数(如“第1位客人”“第2位客人”),可用offset:1调整逻辑起点:
"{count, plural, offset:1 =0 {没有客人} =1 {一位客人} other {# 位客人}}"- 若
count = 0,实际按0 + 1 = 1匹配=1分支 → “一位客人” - 若
count = 1,按1 + 1 = 2匹配other→ “2位客人”
嵌套使用:复数 + 性别 + 参数组合
真实业务中常需同时处理多个维度。ICU支持任意嵌套,例如“主持人(男/女)邀请了N位客人”:
"{gender, select, female {{count, plural, one {مُضيفة واحدة تدعو ضيفًا} other {مُضيفة واحدة تدعو # ضيوف}} } male {{count, plural, one {مُضيف واحد يدعو ضيفًا} other {مُضيف واحد يدعو # ضيوف}} }}"- 注意外层
select处理性别,内层plural处理人数,层级清晰 - 所有变量(
gender、count)都需在$parameters中提供
不复杂但容易忽略:YAML文件里写ICU字符串要加引号,避免冒号或花括号被YAML解析器截断;PHP代码中直接传字符串即可,trans()方法原生支持ICU语法解析。


















