使用Slim框架时,Twig+i18n复数翻译失效如何排查?
排查Twig i18n复数翻译失效问题
我帮你梳理几个最容易踩的坑,毕竟Twig的i18n扩展处理复数时,对.po文件格式和调用逻辑的要求挺严格的:
1. 先确认瑞典语的复数规则是否在.po里正确配置
瑞典语的复数规则和英语不一样!英语是「1为单数,其余为复数」,但Gettext对瑞典语的复数判定逻辑是 n != 1(也就是除了1之外都用复数)。你的.po文件必须按这个规则定义复数条目,比如:
msgid "%d message" msgid_plural "%d messages" msgstr[0] "%d meddelande" msgstr[1] "%d meddelanden"
注意:瑞典语的复数类别是2个(索引0和1),所以msgstr必须同时包含这两个索引,少一个都会导致复数判断失效。
2. 检查Twig模板的复数调用语法
你在模板里的写法是否正确?Twig i18n的复数翻译有两种正确写法:
- 块级语法:
{% trans with {'count': messageCount} %} {{ count }} message {% plural count %} {{ count }} messages {% endtrans %}
- 过滤器语法:
{{ "message"|transchoice(messageCount, {'count': messageCount}) }}
重点要确保:传递的count是数字类型(不是字符串),而且变量名和模板里的占位符对应,否则Gettext无法正确判断复数类别。
3. 验证.mo文件的编译与加载逻辑
- Poedit编译时,有没有选对**瑞典语(Swedish)**作为目标语言?如果选错语言,复数规则会套用错误的逻辑,比如选成英语的话,虽然16应该用复数,但如果规则不匹配还是会出问题。
- 检查.mo文件的存放路径是否和Slim配置一致,比如你的PHP配置里要正确绑定翻译域和目录:
$app->extend('view', function(\Slim\Views\Twig $view, \Slim\Container $container) { $view->addExtension(new \Twig\Extensions\I18nExtension()); // 绑定翻译文件目录 bindtextdomain('messages', __DIR__ . '/../locales'); textdomain('messages'); // 设置正确的瑞典语区域(系统需支持该locale) setlocale(LC_ALL, 'sv_SE.UTF-8'); return $view; });
另外要确认服务器系统已安装瑞典语locale(比如Linux下可以用locale -a检查是否存在sv_SE.UTF-8)。
4. 清空缓存试试
Twig的模板缓存、服务器的文件缓存都可能导致旧的翻译文件被加载。试试清空Twig的缓存目录,重启PHP服务,或者强制刷新页面(Ctrl+F5),确保加载的是最新编译的.mo文件。
5. 快速调试小技巧
可以在模板里输出当前locale,确认语言设置是否生效:
{{ getlocale() }}
如果输出不是sv_SE.UTF-8或类似的瑞典语区域,那就是语言配置出了问题,复数规则自然无法正确触发。
也可以直接用PHP的Gettext函数测试,排除Twig层面的问题:
echo ngettext("%d message", "%d messages", 16);
如果这个输出是正确的瑞典语复数,那问题就出在Twig的调用语法上;如果这个也不对,那就是.po/.mo文件或locale设置的问题。
内容的提问来源于stack exchange,提问作者Magnus
相关产品推荐
相关产品推荐

