Follow-up to r64587:
authorMax Semenik <maxsem@users.mediawiki.org>
Mon, 2 Aug 2010 20:16:36 +0000 (20:16 +0000)
committerMax Semenik <maxsem@users.mediawiki.org>
Mon, 2 Aug 2010 20:16:36 +0000 (20:16 +0000)
* Use WebRequest::getAcceptLang() instead of home-brewed code (and in LanguageConverter too).
* Refactored that function to use getHeader()

includes/WebRequest.php
includes/installer/WebInstaller.php
languages/LanguageConverter.php

index 58247cd..144dab4 100644 (file)
@@ -733,14 +733,15 @@ class WebRequest {
         */
        public function getAcceptLang() {
                // Modified version of code found at http://www.thefutureoftheweb.com/blog/use-accept-language-header
-               if ( !isset( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ) ) {
+               $acceptLang = $this->getHeader( 'Accept-Language' );
+               if ( !$acceptLang ) {
                        return array();
                }
                
                // Break up string into pieces (languages and q factors)
                $lang_parse = null;
                preg_match_all( '/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0(\.[0-9]+))?)?/i',
-                       $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse );
+                       $acceptLang, $lang_parse );
                
                if ( !count( $lang_parse[1] ) ) {
                        return array();
index 408fc52..bcef6f3 100644 (file)
@@ -444,28 +444,14 @@ class WebInstaller extends CoreInstaller {
         * @return string
         */
        public function getAcceptLanguage() {
-               global $wgLanguageCode;
+               global $wgLanguageCode, $wgRequest;
 
                $mwLanguages = Language::getLanguageNames();
-               $langs = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
+               $headerLanguages = array_keys( $wgRequest->getAcceptLang() );
                
-               foreach ( explode( ';', $langs ) as $splitted ) {
-                       foreach ( explode( ',', $splitted ) as $lang ) {
-                               $lang = trim( strtolower( $lang ) );
-                               
-                               if ( $lang == '' || $lang[0] == 'q' ) {
-                                       continue;
-                               }
-                               
-                               if ( isset( $mwLanguages[$lang] ) ) {
-                                       return $lang;
-                               }
-                               
-                               $lang = preg_replace( '/^(.*?)(?=-[^-]*)$/', '\\1', $lang );
-                               
-                               if ( $lang != '' && isset( $mwLanguages[$lang] ) ) {
-                                       return $lang;
-                               }
+               foreach ( $headerLanguages as $lang ) {
+                       if ( isset( $mwLanguages[$lang] ) ) {
+                               return $lang;
                        }
                }
                
index 956cecf..e0081de 100644 (file)
@@ -233,29 +233,13 @@ class LanguageConverter {
 
                // see if some supported language variant is set in the
                // http header.
-               $acceptLanguage = $wgRequest->getHeader( 'Accept-Language' );
-               if ( !$acceptLanguage ) {
+               $languages = array_keys( $wgRequest->getAcceptLang() );
+               if ( empty( $languages ) ) {
                        return null;
                }
 
-               // explode by comma
-               $result = StringUtils::explode( ',', strtolower( $acceptLanguage ) );
-               $languages = array();
-
-               foreach ( $result as $elem ) {
-                       // if $elem likes 'zh-cn;q=0.9'
-                       if ( ( $posi = strpos( $elem, ';' ) ) !== false ) {
-                               // get the real language code likes 'zh-cn'
-                               $languages[] = substr( $elem, 0, $posi );
-                       } else {
-                               $languages[] = $elem;
-                       }
-               }
-
                $fallback_languages = array();
                foreach ( $languages as $language ) {
-                       // strip whitespace
-                       $language = trim( $language );
                        $this->mHeaderVariant = $this->validateVariant( $language );
                        if ( $this->mHeaderVariant ) {
                                break;