我记得几个月前使用gettext运行一些测试,以下代码完美运行:
putenv('LANG=l33t');
putenv('LANGUAGE=l33t');
putenv('LC_MESSAGES=l33t');
if (defined('LC_MESSAGES')) // available if PHP was compiled with libintl
{
setlocale(LC_MESSAGES, 'l33t');
}
else
{
setlocale(LC_ALL, 'l33t');
}
bindtextdomain('default', './locale'); // ./locale/l33t/LC_MESSAGES/default.mo
bind_textdomain_codeset('default', 'UTF-8');
textdomain('default');
echo _('Hello World!'); // h3110 w0r1d!
Run Code Online (Sandbox Code Playgroud)
这非常有效(如果我没记错的话,在Windows XP和CentOS下),这很好,因为我可以使用任意 "语言环境",而不必担心它们是否安装在系统上.然而,这似乎不再起作用,我想知道为什么......
我可以在各种语言环境中来回切换,只要setlocale()调用没有返回false(如果系统上的语言环境可用/已安装),翻译就会显示相关内容.
这并不完美(如果我可以将gettext指向任意翻译目录而不必测试是否存在语言环境,那将是很好的),但这是可以接受的.我稍后会再进行一些测试.
setlocale()总是返回false(即使使用LC_ALL而不是LC_MESSAGES),除非我使用一些有效的Windows语言环境,例如eng,deu或ptg- 在这种情况下,语言环境似乎正确设置但翻译仍未显示.我现在无法测试,因为我已经打开了数百个标签但是我认为第一次调用该脚本会产生正确的转换(重启Apache不会起作用).
我不确定这是否与PHP Bug#49349有关.我将测试这是几个小时.
有没有办法在不同的操作系统中可靠地使用gettext扩展(不是纯PHP实现,如php-gettext或Zend Translate Adapter)(可能有自定义语言环境 …