我认为有必要提及,您会发现大多数文档和教程都说您应该设置 env(LC_ALL, $locale),但这只有在本地机器上的区域设置有效的情况下才有效。如果您使用的是系统上不存在或无效的区域设置(例如从 HTTP Accept-Language 标头返回的内容,例如“ja”,这永远不是有效的区域设置,因为它不包含国家代码 JP),那么您可能会拔掉头发几个小时试图弄清楚为什么这个东西不工作。
我发现设置 LANGUAGE 变量(例如 putenv("LANGUAGE=$locale"))将允许 gettext 在您的区域设置目录中搜索,即使该区域设置实际上在本地系统上无效。
因此,总结一下
这将有效
<?php
$locale = 'ja'; $locale_dir = './locale'; putenv("LANGUAGE=$locale");
bindtextdomain('messages', $locale_dir);
textdomain('messages');
?>
这将无效
<?php
$locale = 'ja';
$locale_dir = './locale';
putenv("LC_ALL=$locale");
bindtextdomain('messages', $locale_dir);
textdomain('messages');
?>
这也会无效
<?php
$locale = 'ja';
$locale_dir = './locale';
setlocale(LC_ALL, $locale);
bindtextdomain('messages', $locale_dir);
textdomain('messages');
?>
这也不会有效
<?php
$locale = 'ja';
$locale_dir = './locale';
setlocale(LC_MESSAGES, $locale);
bindtextdomain('messages', $locale_dir);
textdomain('messages');
?>
作为参考,这在 Ubuntu Dapper 6.06 上的 PHP 5.1.2 + LigHTTPd 1.4.11 + gettext 0.14.5 上进行了测试。但是,对于任何版本的 Linux 以及这些软件包的旧版本,这应该是正确的。