Symfony 4.4中ICU翻译占位符依句位调整大小写问题
Symfony 4.4.41 ICU翻译大小写适配方案
解决思路
借助ICU翻译内置的格式化函数,在翻译规则里直接控制变量的大小写,避免业务代码耦合语言逻辑,同时满足不同语言的语法规范。
具体实现
1. 调整YAML翻译文件
在翻译文件中使用ICU的case格式器来处理变量:
- 英文翻译(
messages.en.yaml):delete_confirmation: "Delete {type, lowercase} for {supervisor}?" - 荷兰语翻译(
messages.nl.yaml):delete_confirmation: "{type, uppercase, words} verwijderen voor {supervisor}?"- 英文里用
lowercase将type转为全小写,符合句中单词的大小写规范; - 荷兰语里用
uppercase, words确保变量首字母大写,适配句首的语法要求。
- 英文里用
2. PHP代码中正常传参
无需在代码里处理大小写,直接传入原始变量值即可:
$translated = $translator->trans('delete_confirmation', [ 'type' => 'Preference', 'supervisor' => 'Dr Hibbert' ]);
- 英文环境输出:
Delete preference for Dr Hibbert? - 荷兰语环境(传入
Voorkeur时)输出:Voorkeur verwijderen voor Dr Hartman?
3. 进阶大小写控制
如果需要更精细的格式(比如仅首字母调整),可以使用ICU的其他格式器:
title:将每个单词的首字母大写,其余小写;sentence:仅将第一个单词的首字母大写;uppercase/lowercase:全大写/全小写。
不推荐的方案(耦合性高)
不要在业务代码里根据语言手动处理变量大小写,比如:
// 不推荐:语言逻辑耦合到业务代码 $type = $locale === 'nl' ? ucfirst($rawType) : strtolower($rawType);
这种方式会增加维护成本,后续新增语言时需要修改业务代码。
内容的提问来源于stack exchange,提问作者bluedot
相关产品推荐
相关产品推荐

