note 115582 added to function.http-negotiate-language

From: 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-200226@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

« previous php.notes (#200226) next »