我认为值得一提的是,你将找到的大多数文档和教程都说你应该设置 setenv(LC_ALL, $locale),但这只有在本地机器上的语言环境有效时才有效。如果你使用的是系统上不存在或无效的语言环境(例如从 HTTP Accept-Language 标头返回的语言环境,例如“ja”,它永远不是有效的语言环境,因为它不包含国家代码 JP),你可能会花几个小时来尝试找出为什么该死的程序无法工作。
我发现设置 LANGUAGE 变量(例如 setenv("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 变体以及这些软件包的旧版本。