From: Philip Tzou Date: Thu, 29 Jan 2009 06:51:20 +0000 (+0000) Subject: Move method 'getPreferredVariant' to Language class, patched by Fdcn. X-Git-Tag: 1.31.0-rc.0~43142 X-Git-Url: https://git.cyclocoop.org/%7B%24admin_url%7Dmembres/fiche.php?a=commitdiff_plain;h=3bea66b61ac47cae78c85dd28d130bdd710d542d;p=lhc%2Fweb%2Fwiklou.git Move method 'getPreferredVariant' to Language class, patched by Fdcn. --- diff --git a/languages/Language.php b/languages/Language.php index c1bccd9cb8..366ab53c18 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -53,7 +53,7 @@ class FakeConverter { * @ingroup Language */ class Language { - var $mConverter, $mVariants, $mCode, $mLoaded = false; + var $mConverter, $mVariant, $mVariants, $mCode, $mLoaded = false; var $mMagicExtensions = array(), $mMagicHookDone = false; static public $mLocalisationKeys = array( @@ -2210,9 +2210,86 @@ class Language { return $this->mConverter->getVariants(); } - + /** + * get preferred language variants. + * moved from LanguageConverter class + * @param boolean $fromUser Get it from $wgUser's preferences + * @return string the preferred language code + * @public + */ function getPreferredVariant( $fromUser = true ) { - return $this->mConverter->getPreferredVariant( $fromUser ); + global $wgUser, $wgRequest, $wgVariantArticlePath, $wgDefaultLanguageVariant; + + if($this->mVariant) + return $this->mVariant; + + // figure out user lang without constructing wgLang to avoid infinite recursion + if( $fromUser ) + $defaultUserLang = $wgUser->getOption( 'language' ); + else + $defaultUserLang = $this->mConverter->mMainLanguageCode; + $userLang = $wgRequest->getVal( 'uselang', $defaultUserLang ); + // see if interface language is same as content, if not, prevent conversion + if( ! in_array( $userLang, $this->mConverter->mVariants ) ){ + $this->mVariant = $this->mConverter->mMainLanguageCode; // no conversion + return $this->mVariant; + } + + // see if the preference is set in the request + $req = $wgRequest->getText( 'variant' ); + if( in_array( $req, $this->mConverter->mVariants ) ) { + $this->mVariant = $req; + return $req; + } + + // check the syntax /code/ArticleTitle + if($wgVariantArticlePath!=false && isset($_SERVER['SCRIPT_NAME'])){ + // Note: SCRIPT_NAME probably won't hold the correct value if PHP is run as CGI + // (it will hold path to php.cgi binary), and might not exist on some very old PHP installations + $scriptBase = basename( $_SERVER['SCRIPT_NAME'] ); + if(in_array($scriptBase,$this->mConverter->mVariants)){ + $this->mVariant = $scriptBase; + return $this->mPreferredVariant; + } + } + + // get language variant preference from logged in users + // Don't call this on stub objects because that causes infinite + // recursion during initialisation + if( $fromUser && $wgUser->isLoggedIn() ) { + $this->mVariant = $wgUser->getOption('variant'); + return $this->mVariant; + } + + // see if default variant is globaly set + if($wgDefaultLanguageVariant != false && in_array( $wgDefaultLanguageVariant, $this->mVariants )){ + $this->mVariant = $wgDefaultLanguageVariant; + return $this->mVariant; + } + + # FIXME rewrite code for parsing http header. The current code + # is written specific for detecting zh- variants + if( !$this->mVariant ) { + // see if some supported language variant is set in the + // http header, but we don't set the mPreferredVariant + // variable in case this is called before the user's + // preference is loaded + $pv=$this->mConverter->mMainLanguageCode; + if(array_key_exists('HTTP_ACCEPT_LANGUAGE', $_SERVER)) { + $header = str_replace( '_', '-', strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"])); + $zh = strstr($header, $pv.'-'); + if($zh) { + $ary = split("[,;]",$zh); + $pv = $ary[0]; + } + } + // don't try to return bad variant + if(in_array( $pv, $this->mConverter->mVariants )) + return $pv; + } + + return $this->mConverter->mMainLanguageCode; + } /** diff --git a/languages/LanguageConverter.php b/languages/LanguageConverter.php index 9c38d2fa59..a070f3f281 100644 --- a/languages/LanguageConverter.php +++ b/languages/LanguageConverter.php @@ -18,7 +18,7 @@ class LanguageConverter { var $mPreferredVariant=''; var $mMainLanguageCode; - var $mVariants, $mVariantFallbacks, $mVariantNames; + var $mVariants, $mVariantFallbacks, $mLanguageNames; var $mTablesLoaded = false; var $mTables; var $mManualAddTables; @@ -58,7 +58,7 @@ class LanguageConverter { $this->mVariants = $variants; $this->mVariantFallbacks = $variantfallbacks; global $wgLanguageNames; - $this->mVariantNames = $wgLanguageNames; + $this->mLanguageNames = $wgLanguageNames; $this->mCacheKey = wfMemcKey( 'conversiontables', $maincode ); $m = array( 'begin'=>'-{', @@ -117,85 +117,9 @@ class LanguageConverter { return $this->mMainLanguageCode; } - /** - * get preferred language variants. - * @param boolean $fromUser Get it from $wgUser's preferences - * @return string the preferred language code - * @public - */ + // this method body in Language class function getPreferredVariant( $fromUser = true ) { - global $wgUser, $wgRequest, $wgVariantArticlePath, $wgDefaultLanguageVariant; - - if($this->mPreferredVariant) - return $this->mPreferredVariant; - - // figure out user lang without constructing wgLang to avoid infinite recursion - if( $fromUser ) - $defaultUserLang = $wgUser->getOption( 'language' ); - else - $defaultUserLang = $this->mMainLanguageCode; - $userLang = $wgRequest->getVal( 'uselang', $defaultUserLang ); - // see if interface language is same as content, if not, prevent conversion - if( ! in_array( $userLang, $this->mVariants ) ){ - $this->mPreferredVariant = $this->mMainLanguageCode; // no conversion - return $this->mPreferredVariant; - } - - // see if the preference is set in the request - $req = $wgRequest->getText( 'variant' ); - if( in_array( $req, $this->mVariants ) ) { - $this->mPreferredVariant = $req; - return $req; - } - - // check the syntax /code/ArticleTitle - if($wgVariantArticlePath!=false && isset($_SERVER['SCRIPT_NAME'])){ - // Note: SCRIPT_NAME probably won't hold the correct value if PHP is run as CGI - // (it will hold path to php.cgi binary), and might not exist on some very old PHP installations - $scriptBase = basename( $_SERVER['SCRIPT_NAME'] ); - if(in_array($scriptBase,$this->mVariants)){ - $this->mPreferredVariant = $scriptBase; - return $this->mPreferredVariant; - } - } - - // get language variant preference from logged in users - // Don't call this on stub objects because that causes infinite - // recursion during initialisation - if( $fromUser && $wgUser->isLoggedIn() ) { - $this->mPreferredVariant = $wgUser->getOption('variant'); - return $this->mPreferredVariant; - } - - // see if default variant is globaly set - if($wgDefaultLanguageVariant != false && in_array( $wgDefaultLanguageVariant, $this->mVariants )){ - $this->mPreferredVariant = $wgDefaultLanguageVariant; - return $this->mPreferredVariant; - } - - # FIXME rewrite code for parsing http header. The current code - # is written specific for detecting zh- variants - if( !$this->mPreferredVariant ) { - // see if some supported language variant is set in the - // http header, but we don't set the mPreferredVariant - // variable in case this is called before the user's - // preference is loaded - $pv=$this->mMainLanguageCode; - if(array_key_exists('HTTP_ACCEPT_LANGUAGE', $_SERVER)) { - $header = str_replace( '_', '-', strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"])); - $zh = strstr($header, $pv.'-'); - if($zh) { - $ary = split("[,;]",$zh); - $pv = $ary[0]; - } - } - // don't try to return bad variant - if(in_array( $pv, $this->mVariants )) - return $pv; - } - - return $this->mMainLanguageCode; - + return $this->mLangObj->getPreferredVariant( $fromUser ); } /** @@ -208,10 +132,10 @@ class LanguageConverter { * @private */ function captionConvert( $matches ) { - // we convert captions except URL $toVariant = $this->getPreferredVariant(); $title = $matches[1]; $text = $matches[2]; + // we convert captions except URL if( !strpos( $text, '://' ) ) $text = $this->translate($text, $toVariant); return " $title=\"$text\""; @@ -978,7 +902,7 @@ class ConverterRule { $unidtable[$v][$from]=$to; } // syntax error, pass - if (!array_key_exists($v,$this->mConverter->mVariantNames)){ + if (!array_key_exists($v,$this->mConverter->mLanguageNames)){ $bidtable = array(); $unidtable = array(); break; @@ -996,10 +920,10 @@ class ConverterRule { $varsep = $this->mConverter->mDescVarSep; $text=''; foreach($this->mBidtable as $k => $v) - $text .= $this->mConverter->mVariantNames[$k]."$codesep$v$varsep"; + $text .= $this->mConverter->mLanguageNames[$k]."$codesep$v$varsep"; foreach($this->mUnidtable as $k => $a) foreach($a as $from=>$to) - $text.=$from.'⇒'.$this->mConverter->mVariantNames[$k]."$codesep$to$varsep"; + $text.="$from⇒".$this->mConverter->mLanguageNames[$k]."$codesep$to$varsep"; return $text; } @@ -1125,7 +1049,7 @@ class ConverterRule { $this->mRuleDisplay = $rules; } elseif ( in_array('N',$flags) ){ // proces N flag: output current variant name - $this->mRuleDisplay = $this->mConverter->mVariantNames[trim($rules)]; + $this->mRuleDisplay = $this->mConverter->mLanguageNames[trim($rules)]; } elseif ( in_array('D',$flags) ){ // proces D flag: output rules description $this->mRuleDisplay = $this->getRulesDesc(); diff --git a/languages/classes/LanguageZh.php b/languages/classes/LanguageZh.php index 093626909b..e257d5ac63 100644 --- a/languages/classes/LanguageZh.php +++ b/languages/classes/LanguageZh.php @@ -33,7 +33,7 @@ class ZhConverter extends LanguageConverter { 'zh-sg' => '新加坡', 'zh-my' => '大马', ); - $this->mVariantNames = array_merge($this->mVariantNames,$names); + $this->mLanguageNames = array_merge($this->mLanguageNames,$names); } function loadDefaultTables() {