值得一提的是,如果使用者瀏覽器不會傳送 HTTP_ACCEPT_LANGUAGE,則
Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
的輸出將會是 null。
因此請記得設定容錯處理!
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)
Locale::acceptFromHttp -- locale_accept_from_http — 嘗試根據 HTTP "Accept-Language" 標頭找出最佳可用地區設定
物件導向風格
程序風格
嘗試找出符合 HTTP "Accept-Language" 標頭所請求的語言清單的地區設定。
header
根據 RFC 2616 格式包含 "Accept-Language" 標頭的字串。
範例 1 locale_accept_from_http() 範例
<?php
$locale = locale_accept_from_http($_SERVER['HTTP_ACCEPT_LANGUAGE']);
echo $locale;
?>
範例 2 OO 範例
<?php
$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
echo $locale;
?>
以上範例會輸出
en_US
值得一提的是,如果使用者瀏覽器不會傳送 HTTP_ACCEPT_LANGUAGE,則
Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
的輸出將會是 null。
因此請記得設定容錯處理!
如果您正在努力找出如何在僅支援特定語言的專案中使用此函數,請繼續往下看。
不幸的是,此函數不允許您指定您的專案支援的語言 - 由於內部標頭剖析和協商邏輯沒有以任何其他方式公開,您很可能需要捨棄此函數,並採用相同功能的自訂實作。
https://github.com/willdurand/Negotiation
沒有看到這點有任何文件記錄,而且錯誤尚未解決,因此為了讓其他人不用再煩惱,此方法在處理不同的地區設定時會有一些奇怪的行為
php > echo locale_accept_from_http("zh_TW");
zh
php > echo locale_accept_from_http("zh_CN");
zh
請注意,在某些情況下,當傳遞的標頭字串無效,並且您已啟用例外時,此方法可能會擲回 IntlException。例如
<?php
ini_set('intl.use_exceptions', 1);
$header = 'fr-FR,fr;q=0.9,fr;q=0.9;q=0.8,en-gb;q=0.8;q=0.7,en;q=0.6,en;q=0.7;q=0.5,*;q=0.5;q=0.4';
var_dump(locale_accept_from_http($header));
?>
回傳
PHP 警告:Uncaught IntlException:locale_accept_from_http:無法在 ... 中找到可接受的地區設定