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

标签 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, '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"))

关于php - PHP 中的 Gettext 需要调用 setlocale(LC_MESSAGES, NULL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29088861/

相关文章:

php - 有 "MD5-based block cipher"的 Go 版本吗?

javascript - 当数据来自数据库时如何只选择一个复选框

PHP Carbon - 相互绑定(bind)的变量

php - codeigniter 中的表单助手自动转义表单数据?

php - CakePHP 如何在同一请求中更改 __() 语言

java - android setText 与 getString 使用变量名

javascript - selenium webdriver getText 返回 [对象对象]

PHP:更改日期/strftime/strtotime 中的语言

c++ - 为什么unicode编码需要函数wsetlocale()?

c++ - setlocale 是线程安全函数吗?