PHP 中的 Gettext 需要调用 setlocale(LC_MESSAGES, NULL)


Gettext in PHP requires setlocale(LC_MESSAGES, NULL) to be called

在 Ubuntu 上使用 PHP 5.5.9 时,gettext 无法正常工作,尽管一切都设置正确。

我用来设置 gettext 的行如下:

putenv('LANG=es_ES.utf8');
setlocale(LC_MESSAGES, 'es_ES');
bindtextdomain('messages', './i18n');
bind_textdomain_codeset('messages', 'UTF-8');
textdomain('messages');

这应该包含所需的一切。但是 gettext 总是返回默认语言环境的字符串(传入的字符串),而不是正确的翻译。

调用locale -a还会列出所需的所有语言,因此此设置也正确。

phpinfo()证明 gettext(以及 intl 扩展)安装正确:

GetText Support = enabled
intl version = 1.1.0
ICU version = 52.1
ICU Data version = 52.1

当然,Ubuntu已经重新启动了。

最后,指定的目录还包含 gettext 所需的翻译文件。

简而言之,一切似乎都设置正确 - 但它不起作用。

但是,当我在调用setlocale(LC_MESSAGES, 'es_ES');之前添加setlocale(LC_MESSAGES, NULL);时,gettext突然起作用。

有人可以解释一下吗?虽然操作系统和PHP版本不再是最新的,但我不知道有任何错误阻止gettext在这个堆栈上工作。

该解决方案感觉像是一个肮脏的黑客,当然不是我觉得可以依赖的东西。

当你调用setlocale(LC_MESSAGES,NULL)时,它使用环境中的语言环境名称,所以它将是"es_ES.utf8"。

您可以尝试调用setlocale(LC_MESSAGES,"es_ES.utf8"),甚至更好
setlocale(LC_MESSAGES, array("es_ES", "es_ES.utf8"))