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