我记得几个月前使用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)(可能有自定义语言环境 …
我正在寻找一种符合标准的方法来存储Web应用程序的多语言内容.到目前为止,我已经使用了自己的"translate()"函数,这些函数从数据库中的文件或字典表中读取数据.但是,如果您使用Web应用程序的不同副本,则在数据库表中保持字典最新是非常麻烦的.
我喜欢gettext,因为有很多可用的工具.但是,我为不同的平台开发应用程序.我绝对不愿意处理setlocale()和consorts的糟糕方式 - 即不同系统之间的许多不同的区域设置字符串变体,您需要提供这些变体才能使其正常工作.永远不能.我有一组语言 - 比如de,en和es - 我想加载适当的字典并使用_()而不需要触及setlocale()或bindtexdomain()一次.
这是否可以使用gettext?或者有人知道另一个简单,小巧,快速(!)i18n的PHP解决方案,可以使用.po/.mo文件,最好不需要PHP扩展吗?