Further logic cleanup on getPreferredVariant & memoization of functions where possible.

This commit is contained in:
Mark A. Hershberger 2010-01-12 05:31:46 +00:00
parent a8956ea2fd
commit 81f62b6f61

View file

@ -16,7 +16,6 @@
* @maintainers fdcn <fdcn64@gmail.com>, shinjiman <shinjiman@gmail.com>, PhiLiP <philip.npc@gmail.com> * @maintainers fdcn <fdcn64@gmail.com>, shinjiman <shinjiman@gmail.com>, PhiLiP <philip.npc@gmail.com>
*/ */
class LanguageConverter { class LanguageConverter {
var $mPreferredVariant = ''; // The User's preferred variant
var $mMainLanguageCode; var $mMainLanguageCode;
var $mVariants, $mVariantFallbacks, $mVariantNames; var $mVariants, $mVariantFallbacks, $mVariantNames;
var $mTablesLoaded = false; var $mTablesLoaded = false;
@ -30,8 +29,10 @@ class LanguageConverter {
var $mFlags; var $mFlags;
var $mDescCodeSep = ':', $mDescVarSep = ';'; var $mDescCodeSep = ':', $mDescVarSep = ';';
var $mUcfirst = false; var $mUcfirst = false;
var $mHeaderVariant;
var $mConvRuleTitle = false; var $mConvRuleTitle = false;
var $mURLVariant;
var $mUserVariant;
var $mHeaderVariant;
const CACHE_VERSION_KEY = 'VERSION 6'; const CACHE_VERSION_KEY = 'VERSION 6';
@ -137,53 +138,94 @@ class LanguageConverter {
* @public * @public
*/ */
function getPreferredVariant( $fromUser = true, $fromHeader = false ) { function getPreferredVariant( $fromUser = true, $fromHeader = false ) {
global $wgUser, $wgRequest, $wgVariantArticlePath, global $wgDefaultLanguageVariant;
$wgDefaultLanguageVariant, $wgOut;
// see if the preference is set in the request $req = $this->getURLVariant();
$req = $wgRequest->getText( 'variant' );
if ( !$req ) { if ( $fromUser && !isset( $req ) ) {
$req = $wgRequest->getVal( 'uselang' );
}
if ( $fromUser && !$req ) {
$req = $this->getUserVariant(); $req = $this->getUserVariant();
} }
if ( $fromHeader && !$req ) { if ( $fromHeader && !isset( $req ) ) {
$req = $this->getHeaderVariant(); $req = $this->getHeaderVariant();
} }
if ( $wgDefaultLanguageVariant && !$req ) { if ( $wgDefaultLanguageVariant && !isset( $req ) ) {
$req = $wgDefaultLanguageVariant; $req = $this->validateVariant( $wgDefaultLanguageVariant );
} }
if ( in_array( $req, $this->mVariants ) ) { // This function, unlike the other get*Variant functions, is
// not memoized (i.e. there return value is not cached) since
// new information might appear during processing after this
// is first called.
if ( isset( $req ) ) {
return $req; return $req;
} }
return $this->mMainLanguageCode; return $this->mMainLanguageCode;
} }
/** /**
* Determine the user has a variant set. * Validate the variant
* @param string $v the variant to validate
* @returns mixed returns the variant if it is valid, null otherwise
*/
function validateVariant( $v = null ) {
if ( isset( $v ) && in_array( $v, $this->mVariants ) ) {
return $v;
}
return null;
}
/**
* Get the variant specified in the URL
*
* @returns mixed variant if one found, false otherwise.
*/
function getURLVariant() {
global $wgRequest;
$ret = null;
if ( $this->mURLVariant ) {
return $this->mURLVariant;
}
// see if the preference is set in the request
$ret = $wgRequest->getText( 'variant' );
if ( !isset( $ret ) ) {
$ret = $wgRequest->getVal( 'uselang' );
}
return $this->mURLVariant = $this->validateVariant( $ret );
}
/**
* Determine if the user has a variant set.
* *
* @returns mixed variant if one found, false otherwise. * @returns mixed variant if one found, false otherwise.
*/ */
function getUserVariant() { function getUserVariant() {
global $wgUser; global $wgUser;
$ret = null;
// memoizing this function wreaks havoc on parserTest.php
/* if ( $this->mUserVariant ) { */
/* return $this->mUserVariant; */
/* } */
// get language variant preference from logged in users // get language variant preference from logged in users
// Don't call this on stub objects because that causes infinite // Don't call this on stub objects because that causes infinite
// recursion during initialisation // recursion during initialisation
if ( $wgUser->isLoggedIn() ) { if ( $wgUser->isLoggedIn() ) {
return $wgUser->getOption( 'variant' ); $ret = $wgUser->getOption( 'variant' );
} }
else { else {
// figure out user lang without constructing wgLang to avoid // figure out user lang without constructing wgLang to avoid
// infinite recursion // infinite recursion
return $wgUser->getOption( 'language' ); $ret = $wgUser->getOption( 'language' );
} }
return $this->mUserVariant = $this->validateVariant( $ret );
} }
@ -194,24 +236,22 @@ class LanguageConverter {
*/ */
function getHeaderVariant() { function getHeaderVariant() {
global $wgRequest; global $wgRequest;
$ret = null;
if ( $this->mHeaderVariant ) { if ( $this->mHeaderVariant ) {
return $this->mHeaderVariant; return $this->mHeaderVariant;
} }
// see if some supported language variant is set in the // see if some supported language variant is set in the
// http header, but we don't set the mPreferredVariant // http header.
// variable in case this is called before the user's
// preference is loaded
$acceptLanguage = $wgRequest->getHeader( 'Accept-Language' ); $acceptLanguage = $wgRequest->getHeader( 'Accept-Language' );
if ( !$acceptLanguage ) { if ( !$acceptLanguage ) { // not using isset because getHeader returns false
return false; return null;
} }
// explode by comma // explode by comma
$result = explode( ',', strtolower( $acceptLanguage ) ); $result = explode( ',', strtolower( $acceptLanguage ) );
$languages = array(); $languages = array();
foreach ( $result as $elem ) { foreach ( $result as $elem ) {
@ -228,32 +268,36 @@ class LanguageConverter {
foreach ( $languages as $language ) { foreach ( $languages as $language ) {
// strip whitespace // strip whitespace
$language = trim( $language ); $language = trim( $language );
if ( in_array( $language, $this->mVariants ) ) { $this->mHeaderVariant = $this->validateVariant( $language );
$this->mHeaderVariant = $language; if ( isset( $this->mHeaderVariant ) ) {
return $language; break;
} else { }
// To see if there are fallbacks of current language.
// We record these fallback variants, and process // To see if there are fallbacks of current language.
// them later. // We record these fallback variants, and process
$fallbacks = $this->getVariantFallbacks( $language ); // them later.
if ( is_string( $fallbacks ) ) { $fallbacks = $this->getVariantFallbacks( $language );
$fallback_languages[] = $fallbacks; if ( is_string( $fallbacks ) ) {
} elseif ( is_array( $fallbacks ) ) { $fallback_languages[] = $fallbacks;
$fallback_languages = } elseif ( is_array( $fallbacks ) ) {
array_merge( $fallback_languages, $fallback_languages =
$fallbacks ); array_merge( $fallback_languages,
$fallbacks );
}
}
if ( !isset( $this->mHeaderVariant ) ) {
// process fallback languages now
$fallback_languages = array_unique( $fallback_languages );
foreach ( $fallback_languages as $language ) {
$this->mHeaderVariant = $this->validateVariant( $language );
if ( isset( $this->mHeaderVariant ) ) {
break;
} }
} }
} }
// process fallback languages now return $this->mHeaderVariant;
$fallback_languages = array_unique( $fallback_languages );
foreach ( $fallback_languages as $language ) {
if ( in_array( $language, $this->mVariants ) ) {
$this->mHeaderVariant = $language;
return $language;
}
}
} }
/** /**
@ -295,9 +339,9 @@ class LanguageConverter {
if ( !$toVariant ) { if ( !$toVariant ) {
$toVariant = $this->getPreferredVariant(); $toVariant = $this->getPreferredVariant();
} if ( !$toVariant ) {
if ( !in_array( $toVariant, $this->mVariants ) ) { return $text;
return $text; }
} }
/* we convert everything except: /* we convert everything except:
@ -457,7 +501,7 @@ class LanguageConverter {
$convTable = $convRule->getConvTable(); $convTable = $convRule->getConvTable();
$action = $convRule->getRulesAction(); $action = $convRule->getRulesAction();
foreach ( $convTable as $variant => $pair ) { foreach ( $convTable as $variant => $pair ) {
if ( !in_array( $variant, $this->mVariants ) ) { if ( !$this->validateVariant( $variant ) ) {
continue; continue;
} }
@ -851,7 +895,7 @@ class LanguageConverter {
$t = explode( '/', $title, 3 ); $t = explode( '/', $title, 3 );
$c = count( $t ); $c = count( $t );
if ( $c > 1 && $t[0] == 'Conversiontable' ) { if ( $c > 1 && $t[0] == 'Conversiontable' ) {
if ( in_array( $t[1], $this->mVariants ) ) { if ( $this->validateVariant( $t[1] ) ) {
$this->reloadTables(); $this->reloadTables();
} }
} }