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