https://www.mediawiki.org/wiki/Special:Code/MediaWiki/102205

Revision: 102205
Author:   krinkle
Date:     2011-11-06 23:02:37 +0000 (Sun, 06 Nov 2011)
Log Message:
-----------
[TsIntuition] Minor fixes in acceptableLanguages()
* Adding an example of the static utility function to demo/demo6
* Moving the function out of the TsIntuition class into TsIntuitionUtil where 
the other static utility functions are, renaming to getAcceptableLanguages
* Improving documentation/variable naming a little bit
* Whitespace / curly braces fixes
* Although I'm not 100% sure about this, I've added a FIXME about the q-val 
defaulting to 1. It needs a look-ahead technique to be more solid, right now 
low-level accept-languages are getting too high. Example:
-- code
getAcceptableLanguages: ( 'nl-be,nl;q=0.7,en-us,en;q=0.3' ):
array(4) {
  ["nl-be"]=>
  string(1) "1" // should be 0.7
  ["en-us"]=>
  string(1) "1" // should be 0.3
  ["nl"]=>
  string(3) "0.7"
  ["en"]=>
  string(3) "0.3"
}
-- /code
See demo6 for more this in action

* Follows-up r100234

Modified Paths:
--------------
    trunk/tools/ToolserverI18N/TsIntuition.php
    trunk/tools/ToolserverI18N/TsIntuitionUtil.php
    trunk/tools/ToolserverI18N/public_html/demo/demo6.php

Modified: trunk/tools/ToolserverI18N/TsIntuition.php
===================================================================
--- trunk/tools/ToolserverI18N/TsIntuition.php  2011-11-06 23:01:21 UTC (rev 
102204)
+++ trunk/tools/ToolserverI18N/TsIntuition.php  2011-11-06 23:02:37 UTC (rev 
102205)
@@ -1217,42 +1217,6 @@
        }
 
        /**
-        * 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
@@ -1266,46 +1230,54 @@
         */
        private function initLangSelect( $option ) {
                $set = false;
+
                if ( isset( $option ) && !empty( $option ) ) {
                        $set = $this->setLang( $option );
                }
+
                if ( !$set && $this->getUseRequestParam() === true && isset( 
$_GET[ $this->paramNames['userlang'] ] ) ) {
                        $set = $this->setLang( $_GET[ 
$this->paramNames['userlang'] ] );
                }
+
                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...
+                       $acceptableLanguages = 
TsIntuitionUtil::GetAcceptableLanguages();
+                       foreach ( $acceptableLanguages as $acceptLang => $qVal 
) {
+
+                               if ( $acceptLang == '*' ) {
+
+                                       /**
+                                        * We pick the first available language 
which is not in $acceptableLanguages.
+                                        * The special * range matches every 
tag not matched by any other range.
+                                        * Other language codes 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 = $this->setLang( 
$lang );
+
+                                        foreach ( $this->availableLanguages as 
$availableLang => $true ) {
+                                                if ( !isset( 
$acceptableLanguages[$availableLang] ) ) {
+                                                        $set = $this->setLang( 
$availableLangf );
                                                         break;
                                                 }
                                         }
-                                        if ( $set )
+                                        if ( $set ) {
                                                break;
-                               } elseif ( isset( 
$this->availableLanguages[$lang] ) ) {
-                                       $set = $this->setLang( $lang );
+                                       }
+
+                               } elseif ( isset( 
$this->availableLanguages[$acceptLang] ) ) {
+                                       $set = $this->setLang( $acceptLang );
                                        break;
                                }
                        }
                }
-               
+
                if ( !$set ) {
                        $set = $this->setLang( 'en' );
                }
+
                return $set;
        }
 

Modified: trunk/tools/ToolserverI18N/TsIntuitionUtil.php
===================================================================
--- trunk/tools/ToolserverI18N/TsIntuitionUtil.php      2011-11-06 23:01:21 UTC 
(rev 102204)
+++ trunk/tools/ToolserverI18N/TsIntuitionUtil.php      2011-11-06 23:02:37 UTC 
(rev 102205)
@@ -123,4 +123,57 @@
                }
        }
 
+       /**
+        * Return a list of acceptable languages from an Accept-Language header
+        * @param $rawList String List of language tags, formatted like an
+        * HTTP Accept-Language header (optional; defaults to 
$_SERVER['HTTP_ACCEPT_LANGUAGE'])
+        * @return array keyed by language codes with q-values as values.
+        */
+       public static function getAcceptableLanguages( $rawList = false ) {
+               if ( $rawList === false ) {
+                       $rawList = @$_SERVER['HTTP_ACCEPT_LANGUAGE'];
+               }
+
+               $acceptableLanguages = array();
+
+               // Accept-Language: 1#( language-range [ ";" "q" "=" qvalue ] )
+               // Example: "nl-be,nl;q=0.7,en-us,en;q=0.3"
+               // The list of elements is separated by comma and optional LWS
+               $languages = explode( ',', $rawList );
+               foreach ( $languages as $language ) {
+                       $language = trim( $language ); // Remove optional LWS
+
+                       // Extract the language-range and, if present, the 
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;
+                       }
+
+                       /**
+                        * $m is now an array with either two or three values:
+                        * - array( 'lang-code', 'lang-code' )
+                        * - array( 'lang-code;q=val', 'lang-code', 'val' )
+                        */
+
+                       // We are not interested in the first value.
+                       array_shift( $m );
+
+                       // Default to 1 as q-val
+                       // @FIXME: In case "nl-be,nl;q=0.7,en-us,en;q=0.3", 
"en" gets defaulted to '1',
+                       // it should default to the next q-val (0.3 in this 
case)
+                       if ( !isset( $m[1] ) ) {
+                               $m[1] = '1';
+                       }
+
+                       list( $langCode, $qVal ) = $m;
+
+                       $acceptableLanguages[$langCode] = $qVal;
+               }
+
+               // Sort by q value in descending order
+               arsort( $acceptableLanguages, SORT_NUMERIC );
+
+               return $acceptableLanguages;
+       }
+
 }

Modified: trunk/tools/ToolserverI18N/public_html/demo/demo6.php
===================================================================
--- trunk/tools/ToolserverI18N/public_html/demo/demo6.php       2011-11-06 
23:01:21 UTC (rev 102204)
+++ trunk/tools/ToolserverI18N/public_html/demo/demo6.php       2011-11-06 
23:02:37 UTC (rev 102205)
@@ -50,7 +50,23 @@
 
 );
 
+// GetAcceptableLanguages
+echo "<br />getAcceptableLanguages: (default: 
\$_SERVER['HTTP_ACCEPT_LANGUAGE']: {$_SERVER['HTTP_ACCEPT_LANGUAGE']}):<br />";
+var_dump(
 
+       TsIntuitionUtil::getAcceptableLanguages( 
@$_SERVER['HTTP_ACCEPT_LANGUAGE'] )
+
+);
+
+$acceptLang = 'nl-be,nl;q=0.7,en-us,en;q=0.3';
+echo "<br />getAcceptableLanguages: ( '{$acceptLang}' ):<br />";
+var_dump(
+
+       TsIntuitionUtil::getAcceptableLanguages( $acceptLang )
+
+);
+
+
 /* View source */
 view_source( __FILE__ );
 close_demo();
\ No newline at end of file


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

Reply via email to