diff U3 ./includes/language.inc ./language.inc --- ./includes/language.inc Mon Feb 25 21:26:38 2008 +++ ./language.inc Mon Feb 25 21:20:13 2008 @@ -72,17 +72,19 @@ function language_from_browser() { // Specified by the user via the browser's Accept Language setting // Samples: "hu, en-us;q=0.66, en;q=0.33", "hu,en-us;q=0.5" + // MSIE 7: "en-nz,en-us;q=0.7,sv-se;q=0.3" + $browser_langs = array(); if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { - $browser_accept = explode(",", $_SERVER['HTTP_ACCEPT_LANGUAGE']); + preg_match_all('"(((\S\S)-?(\S\S)?)(;q=([0-9.]+))?)\s*(,\s*|$)"',strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']),$browser_accept); for ($i = 0; $i < count($browser_accept); $i++) { // The language part is either a code or a code with a quality. // We cannot do anything with a * code, so it is skipped. // If the quality is missing, it is assumed to be 1 according to the RFC. - if (preg_match("!([a-z-]+)(;q=([0-9\\.]+))?!", trim($browser_accept[$i]), $found)) { - $browser_langs[$found[1]] = (isset($found[3]) ? (float) $found[3] : 1.0); - } + if(!empty($browser_accept[2][$i])) $browser_langs[$browser_accept[2][$i]] = ($browser_accept[6][$i]? (float) $browser_accept[6][$i] : 1.0); + if(!empty($browser_accept[3][$i]) && empty($browser_langs[$browser_accept[3][$i]])) $browser_langs[$browser_accept[3][$i]] = ($browser_accept[6][$i]? (float) $browser_accept[6][$i]-0.01 : 0.99); + } }