值得一提的是,如果用户浏览器没有发送 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 面向对象范例
<?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 Warning: Uncaught IntlException: locale_accept_from_http: 无法在 ... 中找到可接受的区域设置