我记得几个月前使用 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!
这工作得很好(如果我没记错的话,在 Windows XP 和 CentOS 下),这很好,因为我可以使用任意的“语言环境”,而不必担心它们是否安装在系统上。但是,这似乎不再起作用了,我想知道为什么...
红帽 + PHP 5.2.11:
我可以在各种语言环境中来回切换,只要setlocale()
调用不返回错误(如果系统上可用/安装了语言环境),翻译就会显示正确。
这并不完美(如果我可以将 gettext 指向任何任意翻译目录而不必测试语言环境的存在,那就太好了),但这是可以接受的。稍后我将进行更多测试。
Windows 7 + PHP 5.3.1 (XAMPP):
setlocale()
总是返回 false (即使使用LC_ALL
而不是LC_MESSAGES
),除非我使用一些有效的 Windows 语言环境,例如eng
,deu
或ptg
- 在这种情况下,语言环境似乎设置正确,但翻译仍然不显示。我现在无法测试,因为我打开了数百个选项卡,但我认为对该脚本的第一次调用会产生正确的翻译(重新启动 Apache 不会成功)。
我不确定这是否与PHP Bug #49349 有关。我会测试这是几个小时。
有什么方法可以跨不同的操作系统(可能使用自定义语言环境,如)可靠地使用 gettext 扩展(不是纯 PHP 实现,如php-gettext或Zend Translate Adapter)?l33t
另外,绝对有必要使用setlocale(LC_ALL, ...)
吗?我宁愿保留TIME
,NUMERIC
和MONETARY
(特别是)语言环境设置不变(默认为POSIX
语言环境)。
我有一个想法......是否可以setlocale()
使用非常常见的语言环境(如C
,POSIX
或en_US
)进行调用并通过域指定语言?像这样的东西:
/lang/C/LC_MESSAGES/domain.pt.mo
/lang/C/LC_MESSAGES/domain.de.mo
/lang/C/LC_MESSAGES/domain.en.mo
/lang/C/LC_MESSAGES/domain2.pt.mo
/lang/C/LC_MESSAGES/domain2.de.mo
/lang/C/LC_MESSAGES/domain2.en.mo
这可以在 *nix 和 Windows 平台上正常工作吗?