PHP 未获取 gettext 翻译

PHP gettext translations not getting picked up

所以我用类似的问题搜索了 Whosebug 并检查了所有内容。我只是无法让 t运行slations 与 gettext.

一起工作

我有以下文件结构

locale/
    en_US/
        LC_MESSAGES/
            messages.mo
            messages.po
test.php

messages.po 包含多条消息,但只有一条是 t运行 预定的。我 运行 msgfmt 从 .po 文件生成 .mo 文件。

#: test.php:43
msgid "Olen omena"
msgstr "I am an apple"

正在尝试 运行 test.php 使用以下代码:

<?php

$locale = "en_US";

$results = putenv("LANG=" . $locale);

if (!$results) {
    exit ('putenv LANG failed');
}

$results = putenv("LANGUAGE=" . $locale);

if (!$results) {
    exit ('putenv LANGUAGE failed');
}
$results = setlocale(LC_MESSAGES, $locale);

if (!$results) {
    exit ('setlocale failed');
}
echo "Locale set to: $locale<br>";

$domain = 'localhost';

$results = bindtextdomain($domain, "locale/");

if (!$results) {
    exit ('bindtextdomain failed');
}

$results = bind_textdomain_codeset($domain, "ISO-8859-1");

if (!$results) {
    exit ('bind_textdomain_codeset failed');
}

$results = textdomain($domain);

if (!$results) {
    exit ('textdomain failed');
}

echo _("Olen omena");

并打印

Locale set to: en_US
Olen omena

Apache 和 PHP 运行 在 Docker 容器中,我用 locale -a 检查了 en_US 存在。

...
en_US
en_US.iso885915
en_US.utf8

尝试了所有 en_US 选项。尝试了 LC_ALL 和 LC_MESSAGES。尝试了不同的域...在这里不知所措。到底哪里出了问题?

好的!我通过查看 PHP.net 示例弄明白了!域必须与文件名相同!如果域设置为 'localhost' 文件必须命名为 'localhost.mo'!

Edit 但是我确实观察到了奇怪的行为。 无论出于何种原因,PHP 每 7 次刷新一次都会重置翻译,并弹出原始文本。观察chrome中的网络选项卡初始页面加载在400 B以上,第二个是399,直到第7个是395:

是否 PHP 每 7 次重新加载都会重置一些缓存?