PHP gettext()仅返回英文翻译,fr_FR语言设置不生效
解决PHP gettext() 始终返回英文翻译的问题
兄弟,我之前也踩过这个gettext的大坑!明明配置看起来都对,就是死活不显示目标语言,给你几个我亲测有效的排查方向:
1. 先确认setlocale是否真的生效了
很多时候系统根本不支持你指定的fr_FR完整locale,比如有些Linux发行版只预装了fr_FR.UTF-8或者简写的fr。你可以在初始化代码里加一行打印,看看实际生效的locale是什么:
$language = "fr_FR"; var_dump(setlocale(LC_ALL, $language)); // 看看返回的是false还是预期的locale值
如果返回false,那你得换成系统支持的locale,比如试试:
setlocale(LC_ALL, 'fr_FR.UTF-8', 'fr_FR', 'fr');
同时别忘了对应更新putenv的参数,比如putenv("LC_ALL=fr_FR.UTF-8");
2. 检查环境变量是否被覆盖
有时候LC_ALL会被系统的LANG变量覆盖,建议同时设置LANG:
putenv("LANG=" . $language); putenv("LC_ALL=" . $language);
3. 用绝对路径指定locale文件夹
相对路径很容易出问题,比如你的脚本在子目录里,locale文件夹的相对路径就不对了。改成绝对路径试试:
$folder = __DIR__ . "/locale"; // __DIR__ 是当前脚本所在的目录
4. 确认.mo文件是否有效
别以为po文件翻译对了就万事大吉,编译过程可能出问题。重新用msgfmt编译一次:
msgfmt messages.po -o messages.mo
编译的时候如果有报错,说明po文件有语法问题,比如msgid和msgstr不匹配、编码错误,得先修正po文件。
5. 清除缓存
gettext和PHP的opcache都可能缓存旧的翻译文件:
- 重启你的web服务器(Apache/Nginx)
- 如果开了opcache,要么重启PHP-FPM,要么在调试阶段临时加
opcache_reset();(生产环境别这么干)
6. 严格匹配msgid
gettext是完全大小写敏感的,检查你的法语po文件里是不是有一模一样的msgid "HELLO_WORLD",多一个空格、少一个下划线都不行。
最后试试直接用gettext()函数
虽然_()是gettext()的别名,但偶尔会有别名失效的情况,替换成:
echo gettext("HELLO_WORLD");
看看会不会正常显示法语翻译。
内容的提问来源于stack exchange,提问作者Nikola Stanojković
相关产品推荐
相关产品推荐

