我認為值得一提的是,您會發現的大多數文件和教學課程都說您應該 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 變體以及這些軟體的舊版本。