Order {orderNo} was cancelled by {userName}
MessageFormat.format(pattern, Map.of("orderNo", no, "userName", name));
德语“订单 {0} 已由 {1} 取消”上线后,用户名和订单号互换,客服当天收到 12 张截图。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:代码把位置参数按中文语序传入,译文为了通顺调换了 {0} 和 {1} 的位置,但参数含义没有跟着换。翻译只看到字符串,不知道每个编号对应哪个字段。改成命名占位符后,顺序由译文自己决定。
「占位符顺序」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。同一份配置存在多处的,先确认改的是被加载的那一份。
处理上按这个顺序:把位置占位符换成命名占位符 参数按名字绑定;在译文文件里保留占位符名 不允许翻译括号内容;加一条校验 比对源文和译文的占位符集合;用德语下一单 看通知里订单号和用户名是否各归其位。
确认没问题再收工,德语通知里订单号和用户名不再互换,占位符校验脚本返回 0 条差异。
