本地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有明显区别,按照以下步骤修改即可生效:
- 修复输出逻辑:
_()函数仅返回翻译后的字符串,需要加echo输出,这是你最初返回空白页面的核心原因,调用写法改为<?php echo _("Welcome") ?>或者短标签<?= _("Welcome") ?>即可。 - 修正locale命名规则:Windows下德语的标准locale名是
deu_DEU,不支持de/de_DE这类两字母简写,同时需要先在Windows设置-时间和语言-语言中添加德语语言包。 - 调整配置执行顺序:环境变量设置必须放在
setlocale之前执行,同时需要同时配置LC_ALL、LANG、LANGUAGE三个变量,避免遗漏。 - 修正PO文件配置:删除PO文件头的
#, fuzzy标记,带fuzzy标记的翻译条目不会被gettext加载,同时把Language字段改为deu_DEU,修改后重新编译生成mo文件。 - 修正目录结构:确保locale目录结构为
locale/deu_DEU/LC_MESSAGES/messages.po和对应的mo文件,文件夹名必须和locale名完全一致。 - 最终参考代码:
<?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>
- 缓存处理:修改mo/po文件后需要重启PHP服务/开发服务器,gettext会缓存翻译文件,不重启不会加载新配置。
内容的提问来源于stack exchange,提问作者Artur Müller Romanov
相关产品推荐
相关产品推荐

