PHP 中的非确定性 gettext 行为

Non-deterministic gettext behavior in PHP

我在 PHP 中使用 gettext,我遇到了一个非常奇怪的问题。当我不断重新加载页面时,大多数时候字符串没有翻译成英语,但有时它们是!! !

我的代码是这样的(虽然它是更大代码的一部分):

bindtextdomain ('messages', dirname(__FILE__) . '/lang/nocache'); #  (nevim jestli je to u me problem, ale pro jistotu
bindtextdomain ('messages', dirname(__FILE__) . '/lang');
textdomain('messages');
bind_textdomain_codeset('messages', 'UTF-8');

$rv = setlocale(LC_MESSAGES, 'en_US.UTF-8');
var_dump($rv); # always returns "en_US.UTF-8"

echo "<br>TEST: " . _("Úvod");
echo "<br>TEST: " . _("Výsledky");
echo "<br>TEST: " . gettext("Úvod");

当我将此代码片段剪切到单独的 PHP 文件时,文本 always 得到翻译。我不怀疑我更大的代码会产生这种不确定性,因为里面的这段代码很紧凑,不受其他部分的影响。我怀疑这种奇怪的非确定性只在某些条件下出现,不幸的是,当我把它放在一个小的测试文件中时,这些条件就消失了(你必须非常了解这个墨菲定律的噩梦:-))。

我不知道它是不是 gettext cache problem, but I haven't changed the translations. I tried the recommended nocache dir trick 我也尝试重新启动 Apache (Apache/2.4.10 (Debian)),但它没有帮助。我的 PHP 版本是 5.6.12-0+deb8u1.

这怎么会是非确定性的?问题出在哪里?


编辑: 在 /etc/php5/apache2/php.ini 中编码:

; PHP's default character set is set to UTF-8.
; http://php.net/default-charset
default_charset = "UTF-8"

; PHP internal character encoding is set to empty.
; If empty, default_charset is used.
; http://php.net/internal-encoding
;internal_encoding =

; PHP input character encoding is set to empty.
; If empty, default_charset is used.
; http://php.net/input-encoding
;input_encoding =

; PHP output character encoding is set to empty.
; If empty, default_charset is used.
; mbstring or iconv output handler is used.
; See also output_buffer.
; http://php.net/output-encoding
;output_encoding =

目录中确实有问题,因为带有 __FILE__ 的代码在不同的目录中,我包含了它,但没有意识到 __FILE__ 会给出错误的路径。所以我硬编码了路径:

bindtextdomain('messages', './lang/nocache'); #  
bindtextdomain('messages', './lang');

但奇怪的是,即使是错误的目录,它有时也会起作用!!!这真是奸诈。