如何在翻译字符串中获取%count%的绝对值以解决日期间隔负号问题
解决方案
你当前的翻译字符串存在分支冲突问题:{1} the day after tomorrow的匹配阈值设置错误,值为1会同时命中{1} tomorrow和{1} the day after tomorrow两个分支,建议先将该规则调整为{2} the day after tomorrow。
方案1:兼容现有Choice格式(无需调整框架配置)
你当前使用的是管道分隔的Choice翻译格式,该语法本身不支持在翻译字符串内直接做数值运算,最简单的解决方式是调用翻译时额外传入一个绝对值参数,调整后的翻译字符串如下:
dateinterval: '{0} today|{1} tomorrow|{2} the day after tomorrow |{-1} yesterday|[2,Inf[ In %count% days|]-Inf,-2] %abs_count% days ago'
调用翻译方法时传入两个参数即可:
%count%:原始的正负日期间隔值,用于区间匹配%abs_count%:提前用abs(count)计算得到的无符号间隔值,用于负区间的文本展示
方案2:ICU MessageFormat格式(支持翻译内直接处理绝对值)
如果你的项目支持ICU MessageFormat语法(Symfony 4.4+、Laravel 9+等主流框架均默认支持),可以直接在翻译规则内完成逻辑判断,不需要额外传参,配置示例如下:
dateinterval: "{count, select, 0 {today} 1 {tomorrow} 2 {the day after tomorrow} -1 {yesterday} other {{count, plural, >1 {In # days} < -1 {# days ago} }} }"
该语法会自动根据分支场景处理#占位符的输出,在小于-1的区间自动展示绝对值,不会携带负号。
内容的提问来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

