PHP gettext无法返回翻译字符串,求助排查问题
PHP gettext配置问题排查方案
问题现状
MO文件存在(var_dump返回true),服务器已安装对应locale,但gettext仍返回原字符串,未触发翻译。
排查与解决步骤
必须设置locale环境变量
PHP的gettext依赖系统locale环境,代码里缺少关键的locale设置步骤,要在bindtextdomain之前添加:putenv("LC_ALL=" . $locale); setlocale(LC_ALL, $locale);注意:部分系统需要指定编码后缀,比如把
$locale改成en_GB.UTF-8,避免因编码不匹配导致加载失败。验证MO文件内容正确性
用msgunfmt命令检查MO文件是否包含正确的msgid和msgstr:msgunfmt locale/en_GB/LC_MESSAGES/messages.mo确认
msgid "Velkommen"对应的msgstr是你期望的英文翻译(比如"Welcome"),且MO文件编译时没有报错。改用绝对路径绑定文本域
相对路径可能因PHP执行上下文不同失效,换成绝对路径:bindtextdomain($domain, realpath(__DIR__ . "/locale"));检查gettext扩展状态
执行phpinfo()查看是否有gettext扩展的条目,确保扩展已正确安装并启用。
修正后的示例代码
<?php $locale = "en_GB.UTF-8"; // 先初始化locale环境 putenv("LC_ALL=" . $locale); setlocale(LC_ALL, $locale); $domain = 'messages'; // 使用绝对路径确保定位正确 bindtextdomain($domain, realpath(__DIR__ . "/locale")); textdomain($domain); bind_textdomain_codeset($domain, 'UTF-8'); var_dump(file_exists("locale/" . $locale . "/LC_MESSAGES/" . $domain . ".mo")); $results = gettext("Velkommen"); if ($results === "Velkommen") { echo "Original string returned. Something wrong\n"; } echo $results . "\n"; ?> <?= _("Velkommen"); ?>
内容的提问来源于stack exchange,提问作者Jeppe Donslund
相关产品推荐
相关产品推荐

