You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 11:28:22