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

本地PhpStorm开发服务器中PHP gettext函数无法翻译页面如何解决

PHP Windows环境下gettext不生效问题排查与解决

问题描述

找到了两种让PHP中gettext生效的实现方法,但均未成功运行。预期输出德语翻译的Willkommen替代原英文Welcome,当前要么返回空白页面,要么仅显示原始英文文本,确认gettext扩展已正确安装。

环境配置

OS: Windows 10
Gettext 0.21 with Libiconv 1.16 (安装包安装)
开发环境: PhpStorm
PHP版本: 8.08

已测试实现方案

方案1代码

<?php
//  方法1:
error_reporting(E_ALL); // 32767
ini_set("display_errors", "On"); // On
$lang = "de"; // de
$domain = "messages"; // messages
setlocale(LC_ALL, $lang . ".utf8", $lang . "utf-8", $lang . "UTF-8", $lang); // de.utf8
putenv("LC_ALL=de"); // 1
bindtextdomain($domain, __DIR__ . "/locale"); // C:\MAMP\htdocs\test\locale
bind_textdomain_codeset($domain, "utf-8"); // utf-8
textdomain($domain); // messages
?>
<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <h1><?php _("Welcome") ?></h1>
</body>
</html>

方案2代码

<?php
//  方法2:
$locale = "de"; // de
putenv("LANG = $locale"); // 1
putenv("LANGUAGE = $locale"); // 1
setlocale(LC_ALL, $locale); // de
$domain = "messages"; // messages
textdomain($domain); // messages
bindtextdomain($domain, "locale"); // C:\MAMP\htdocs\test\locale
bind_textdomain_codeset($domain, "UTF-8"); // UTF-8
?>
<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <h1><?php _("Welcome") ?></h1>
</body>
</html>

现有配置详情

目录结构

目录结构

初始messages.po文件内容

msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: 2021-08-10 17:58+0200\n"
"PO-Revision-Date: 2021-08-10 17:58+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.0\n"
"X-Poedit-Basepath: ../../..\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SearchPath-0: .\n"

#: test.php:21
msgid "Welcome"
msgstr "Willkommen"

调整后运行结果

调整locale配置为de_DE后页面仍只显示Welcome:
运行结果

解决方案

Windows环境下gettext的规则和Linux有明显区别,按照以下步骤修改即可生效:

  1. 修复输出逻辑:_()函数仅返回翻译后的字符串,需要加echo输出,这是你最初返回空白页面的核心原因,调用写法改为<?php echo _("Welcome") ?>或者短标签<?= _("Welcome") ?>即可。
  2. 修正locale命名规则:Windows下德语的标准locale名是deu_DEU,不支持de/de_DE这类两字母简写,同时需要先在Windows设置-时间和语言-语言中添加德语语言包。
  3. 调整配置执行顺序:环境变量设置必须放在setlocale之前执行,同时需要同时配置LC_ALL、LANG、LANGUAGE三个变量,避免遗漏。
  4. 修正PO文件配置:删除PO文件头的#, fuzzy标记,带fuzzy标记的翻译条目不会被gettext加载,同时把Language字段改为deu_DEU,修改后重新编译生成mo文件。
  5. 修正目录结构:确保locale目录结构为locale/deu_DEU/LC_MESSAGES/messages.po和对应的mo文件,文件夹名必须和locale名完全一致。
  6. 最终参考代码:
<?php
error_reporting(E_ALL);
ini_set("display_errors", "On");

// Windows下德语标准locale名
$locale = 'deu_DEU.UTF-8';
$domain = 'messages';

// 环境变量必须放在setlocale之前
putenv("LC_ALL=$locale");
putenv("LANG=$locale");
putenv("LANGUAGE=$locale");

// 兼容不同写法尝试设置locale
setlocale(LC_ALL, $locale, 'deu_DEU', 'de');

bindtextdomain($domain, __DIR__ . '/locale');
bind_textdomain_codeset($domain, 'UTF-8');
textdomain($domain);
?>
<!doctype html>
<html lang="de">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <h1><?= _("Welcome") ?></h1>
</body>
</html>
  1. 缓存处理:修改mo/po文件后需要重启PHP服务/开发服务器,gettext会缓存翻译文件,不重启不会加载新配置。

内容的提问来源于stack exchange,提问作者Artur Müller Romanov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 12:06:03