note 115582 added to function.http-negotiate-language
| From: | Anonymous | Date: | Wed, 20 Aug 2014 10:57:01 +0000 |
| Subject: | note 115582 added to function.http-negotiate-language | ||
| Groups: | php.notes php.notes | ||
| Request: | Send a blank email to php-notes+get-200225@lists.php.net to get a copy of this message | ||
Refinements to get_prefered_language above:
1. in_array is not case-insensitive
2. language ids may come in "de_DE" and "de-DE" form
3. candidate list of language ids may be in form "de-DE", not just short forms. (not
handled by second check)
4. don't return first item of candidate list by default: caller code can't distinguish if
first item matched or if there was no match.
<?php
function get_prefered_language($lang_ids) //returns empty if no match
{
$http_accept_language = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ?
$_SERVER['HTTP_ACCEPT_LANGUAGE'] : '';
// standard for HTTP_ACCEPT_LANGUAGE is defined under http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
// pattern to find is therefore something like this:
// 1#( language-range [ ";" "q" "=" qvalue ] )
// where:
// language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
// qvalue = ( "0" [ "." 0*3DIGIT ] )
// | ( "1" [ "." 0*3("0") ] )
preg_match_all("/([[:alpha:]]{1,8})(-([[:alpha:]|-]{1,8}))?" .
"(\s*;\s*q\s*=\s*(1\.0{0,3}|0\.\d{0,3}))?\s*(,|$)/i",
$http_accept_language, $hits, PREG_SET_ORDER);
$bestlang;
$bestqval = 0;
foreach ($hits as $arr)
{
$qvalue = empty($arr[5]) ? 1.0 : floatval($arr[5]);
$lang_id_short = $arr[1];
$lang_id_long = $lang_id_short;
if (!empty($arr[3]))
$lang_id_long .= '-' . $arr[3];
foreach ($lang_ids as $lang_id)
if ($qvalue > $bestqval && strcasecmp(str_replace('_', '-',
$lang_id), $lang_id_long) == 0)
{
$bestlang = $lang_id;
$bestqval = $qvalue;
}
// if no direct hit, try the prefix only but decrease q-value by 10% (as http_negotiate_language
does)
foreach ($lang_ids as $lang_id)
if ($qvalue * 0.9 > $bestqval &&
substr_compare($lang_id, $lang_id_short, 0, 2, true) === 0) //case-insensitive comparison of
first two chars
{
$bestlang = $lang_id;
$bestqval = $qvalue * 0.9;
}
}
return $bestqval > 0 ? $bestlang : '';
}
?>
----
Server IP: 72.52.91.14
Probable Submitter: 84.174.106.115
----
Manual Page -- http://php.net/manual/en/function.http-negotiate-language.php
Edit -- https://master.php.net/note/edit/115582
Del: integrated -- https://master.php.net/note/delete/115582/integrated
Del: useless -- https://master.php.net/note/delete/115582/useless
Del: bad code -- https://master.php.net/note/delete/115582/bad+code
Del: spam -- https://master.php.net/note/delete/115582/spam
Del: non-english -- https://master.php.net/note/delete/115582/non-english
Del: in docs -- https://master.php.net/note/delete/115582/in+docs
Del: other reasons-- https://master.php.net/note/delete/115582
Reject -- https://master.php.net/note/reject/115582
Search -- https://master.php.net/manage/user-notes.php