X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FWebRequest.php;h=87526fcc033fbc1f08db188b642983fb8f0bc51f;hb=c29fd59775f597847a57f598a76de48c63952243;hp=39c1b1ba3cd2e76f73aa7aca7b8bd4461e8f9a84;hpb=883b0850d363ea09faff1db0e6747fd5057a00f0;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/WebRequest.php b/includes/WebRequest.php index 39c1b1ba3c..87526fcc03 100644 --- a/includes/WebRequest.php +++ b/includes/WebRequest.php @@ -981,9 +981,11 @@ HTML; /** * Parse the Accept-Language header sent by the client into an array - * @return array array( languageCode => q-value ) sorted by q-value in descending order + * @return array array( languageCode => q-value ) sorted by q-value in descending order then + * appearing time in the header in ascending order. * May contain the "language" '*', which applies to languages other than those explicitly listed. * This is aligned with rfc2616 section 14.4 + * Preference for earlier languages appears in rfc3282 as an extension to HTTP/1.1. */ public function getAcceptLang() { // Modified version of code found at http://www.thefutureoftheweb.com/blog/use-accept-language-header @@ -1004,19 +1006,25 @@ HTML; return array(); } - // Create a list like "en" => 0.8 - $langs = array_combine( $lang_parse[1], $lang_parse[4] ); + $langcodes = $lang_parse[1]; + $qvalues = $lang_parse[4]; + $indices = range( 0, count( $lang_parse[1] ) - 1 ); + // Set default q factor to 1 - foreach ( $langs as $lang => $val ) { - if ( $val === '' ) { - $langs[$lang] = 1; - } elseif ( $val == 0 ) { - unset($langs[$lang]); + foreach ( $indices as $index ) { + if ( $qvalues[$index] === '' ) { + $qvalues[$index] = 1; + } elseif ( $qvalues[$index] == 0 ) { + unset( $langcodes[$index], $qvalues[$index], $indices[$index] ); } } - // Sort list - arsort( $langs, SORT_NUMERIC ); + // Sort list. First by $qvalues, then by order. Reorder $langcodes the same way + array_multisort( $qvalues, SORT_DESC, SORT_NUMERIC, $indices, $langcodes ); + + // Create a list like "en" => 0.8 + $langs = array_combine( $langcodes, $qvalues ); + return $langs; }