http://www.mediawiki.org/wiki/Special:Code/MediaWiki/100234

Revision: 100234
Author:   platonides
Date:     2011-10-19 15:56:51 +0000 (Wed, 19 Oct 2011)
Log Message:
-----------
Guess the language from Accept-Language header.

Modified Paths:
--------------
    trunk/tools/ToolserverI18N/TsIntuition.php

Modified: trunk/tools/ToolserverI18N/TsIntuition.php
===================================================================
--- trunk/tools/ToolserverI18N/TsIntuition.php  2011-10-19 15:48:30 UTC (rev 
100233)
+++ trunk/tools/ToolserverI18N/TsIntuition.php  2011-10-19 15:56:51 UTC (rev 
100234)
@@ -1217,11 +1217,48 @@
        }
 
        /**
+        * Return a list of acceptable languages from an Accept-Language header
+        * @param $acceptLanguage String List of language tags, as given in 
+        * http Accept-Language header (omit to fetch from 
$_SERVER['HTTP_ACCEPT_LANGUAGE'])
+        * @return array sorted with the candidate languages as keys and 
q-values asvalues.
+        */
+       static function acceptableLanguages($acceptLanguage = false) {
+               if ( $acceptLanguage === false ) {
+                       $acceptLanguage = @$_SERVER['HTTP_ACCEPT_LANGUAGE'];
+               }
+               
+               $acceptableLanguages = array();
+               
+               //Accept-Language: 1#( language-range [ ";" "q" "=" qvalue ] )
+               //The list of elements is separated by comma and optional LWS
+               $languages = explode( ',', $acceptLanguage );
+               foreach ( $languages as $language ) {
+                       $language = trim( $language ); // Remove optional LWS
+                       
+                       // Extract the language-range and q-value
+                       if ( !preg_match( 
'/^([A-Za-z]{1,8}(?:-[A-Za-z]{1,8})*|\*)(?:\s*;\s*q\s*=\s*([01](?:\.[0-9]{0,3})?))?$/',
 $language, $m ) )
+                               continue;
+                               
+                       // We are not interested in the total match.
+                       array_shift( $m );
+                       $m[] = 1; // Default q-value is 1
+                       list( $languageRange, $qvalue ) = $m;
+                               
+                       $acceptableLanguages[$languageRange] = $qvalue;
+               }
+               
+               arsort( $acceptableLanguages, SORT_NUMERIC ); // This is not an 
stable sort, but it isn't needed
+               
+               return $acceptableLanguages;
+       }
+
+       /**
         * Check language choice tree in the following order:
         * - First: Construct override
         * - Second: Parameter override
         * - Third: Saved cookie
-        * - Fourth: Nothing (default stays)
+        * - Fourth: Preferences from Accept-Language header
+        * - Fifth: English (default stays)
         *
         * @private
         *
@@ -1238,7 +1275,35 @@
                if ( !$set && isset( $_COOKIE[ $this->cookieNames['userlang'] ] 
) ) {
                        $set = $this->setLang( $_COOKIE[ 
$this->cookieNames['userlang'] ] );
                }
+
                if ( !$set ) {
+                       $acceptableLanguages = self::acceptableLanguages();
+                       foreach ( $acceptableLanguages as $lang => $q ) {
+                               
+                               if ( $lang == '*' ) {
+                                       /*  We choose the first available 
language which is not in $acceptableLanguages
+                                        * The special * range matches every 
tag not matched by any other range, languages 
+                                        * present in $acceptableLanguages will 
either have a lower q-value, or be missing 
+                                        * from availableLanguages.
+                                        *  The order will be the one in the 
i18n file: en, af, ar...
+                                        */
+                                        
+                                        foreach ( $this->availableLanguages as 
$lang => $true ) {
+                                                if (! isset( 
$acceptableLanguages[$lang] ) ) {
+                                                        $set = $lang;
+                                                        break;
+                                                }
+                                        }
+                                        if ( $set )
+                                               break;
+                               } elseif ( isset( 
$this->availableLanguages[$lang] ) ) {
+                                       $set = $lang;
+                                       break;
+                               }
+                       }
+               }
+               
+               if ( !$set ) {
                        $set = $this->setLang( 'en' );
                }
                return $set;


_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to