Further logic cleanup on getPreferredVariant & memoization of functions where possible.
This commit is contained in:
parent
a8956ea2fd
commit
81f62b6f61
1 changed files with 95 additions and 51 deletions
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue