phpEnv 默认不启用 gettext 扩展,需手动开启 extension=php_gettext.dll、设置 Windows 兼容 locale(如 Chinese_China.65001)、调用 putenv() 和 bind_textdomain_codeset(),并严格匹配 MO 文件路径与命名,否则 _() 恒返原文。

phpEnv 默认不启用 gettext 扩展,必须手动开启并验证环境变量和 locale 支持,否则 _() 函数始终返回原文、setlocale() 返回 false。
检查 phpEnv 中 gettext 扩展是否已安装但未启用
phpEnv 是 Windows 下的 PHP 环境管理工具,其扩展目录结构与原生 PHP 一致,但默认不激活 gettext。常见错误是:明明看到 php_gettext.dll 在 ext/ 目录下,却在 phpinfo() 里找不到 gettext 模块。
- 打开 phpEnv 控制面板 → 点击「PHP 设置」→ 查看当前使用的
php.ini路径(通常形如C:\phpenv\versions\8.2\php.ini) - 用记事本或 VS Code 打开该
php.ini,搜索php_gettext - 确认存在且未被注释的行:
extension=php_gettext.dll(注意不是extension=gettext,Windows 下必须带.dll后缀) - 保存后,**必须重启 phpEnv 的 Web 服务(Apache/Nginx)**,仅重启浏览器或刷新页面无效
- 新建
test.php写入,访问后搜索 “gettext”,有模块信息才表示加载成功
Windows 下 setlocale() 失败的典型原因和修复
即使扩展启用,setlocale(LC_ALL, 'zh_CN.UTF-8') 在 Windows 上大概率返回 false,因为 Windows 不识别类 Unix 的 locale 名称(如 zh_CN.UTF-8),而只认 Chinese_China.936 或 English_United States.1252 这类格式。
- 先用
setlocale(LC_ALL, '0')查看系统当前支持的 locale 列表(输出类似C\nChinese_China.936\nEnglish_United States.1252) - 中文环境常用有效值:
Chinese_China.936(GBK)、Chinese_China.65001(UTF-8);英文:English_United States.1252 - 务必同步调用
putenv("LC_ALL=Chinese_China.65001"),仅setlocale()不够 -
bind_textdomain_codeset('messages', 'UTF-8')必须显式设置,否则 MO 文件里的 UTF-8 字符可能乱码
MO 文件路径和域名必须严格匹配
phpEnv 下路径分隔符、大小写、文件名拼写稍有偏差,gettext 就静默失败——不报错,但始终输出原文。
- 目录结构必须为:
locale\zh_CN\LC_MESSAGES\messages.mo(注意是反斜杠\,Windows 原生路径) -
bindtextdomain('messages', './locale')中的域名'messages'必须与 MO 文件名前缀一致(即messages.mo) - 路径建议用绝对路径避免歧义:
bindtextdomain('messages', __DIR__ . '\locale') - 确保 MO 文件由
msgfmt编译生成(不能直接改名 .po 为 .mo),且内容非空(可用 Poedit 打开验证)
调试 gettext 是否真正生效的三步验证法
不要依赖肉眼观察输出,要逐层确认每个环节是否走通:
- 执行
var_dump(extension_loaded('gettext'))→ 必须返回true - 执行
var_dump(setlocale(LC_ALL, 'Chinese_China.65001'))→ 必须返回字符串(非false) - 执行
var_dump(bindtextdomain('messages', __DIR__ . '\locale'))→ 必须返回完整绝对路径(不是false) - 最后才测试
echo _('Hello');若前三步任一失败,_()必然退化为恒等函数
最易被忽略的是 Windows locale 名称兼容性和 MO 文件编码声明——这两个点卡住,整个流程就停在“看起来配置全对,但就是不翻译”的状态。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











