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');
但奇怪的是,即使是错误的目录,它有时也会起作用!!!这真是奸诈。
我在 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');
但奇怪的是,即使是错误的目录,它有时也会起作用!!!这真是奸诈。