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

时间:2015-03-16 23:40:15

标签: php gettext setlocale php-gettext

在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, NULL);之前添加setlocale(LC_MESSAGES, 'es_ES');时,gettext突然有效。

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

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

1 个答案:

答案 0 :(得分:3)

当你调用setlocale(LC_MESSAGES,NULL)时,它使用来自环境的语言环境名称,因此它将是" es_ES.utf8"。

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