From 99733619ef435e89e9dadbe4fabf52d1e4df0918 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Thu, 29 Jan 2009 08:59:53 +0000 Subject: [PATCH] Revert r46523, r46525. Spewing errors. See below. Behaviour observed on http://translatewiki.net. PHP Notice: Undefined property: FakeConverter::$mMainLanguageCode in /var/www/w/languages/Language.php on line 2230 PHP Notice: Undefined property: FakeConverter::$mVariants in /var/www/w/languages/Language.php on line 2233 PHP Warning: in_array() [function.in-array]: Wrong datatype for second argument in /var/www/w/languages/Language.php on line 2233 PHP Notice: Undefined property: FakeConverter::$mMainLanguageCode in /var/www/w/languages/Language.php on line 2234 --- languages/Language.php | 83 +---------------------- languages/LanguageConverter.php | 109 +++++++++++++++++++++++++------ languages/classes/LanguageZh.php | 2 +- 3 files changed, 93 insertions(+), 101 deletions(-) diff --git a/languages/Language.php b/languages/Language.php index 366ab53c18..c1bccd9cb8 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -53,7 +53,7 @@ class FakeConverter { * @ingroup Language */ class Language { - var $mConverter, $mVariant, $mVariants, $mCode, $mLoaded = false; + var $mConverter, $mVariants, $mCode, $mLoaded = false; var $mMagicExtensions = array(), $mMagicHookDone = false; static public $mLocalisationKeys = array( @@ -2210,86 +2210,9 @@ 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 ) { - 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; + function getPreferredVariant( $fromUser = true ) { + return $this->mConverter->getPreferredVariant( $fromUser ); } /** diff --git a/languages/LanguageConverter.php b/languages/LanguageConverter.php index 63b98f1292..9c38d2fa59 100644 --- a/languages/LanguageConverter.php +++ b/languages/LanguageConverter.php @@ -18,7 +18,7 @@ class LanguageConverter { var $mPreferredVariant=''; var $mMainLanguageCode; - var $mVariants, $mVariantFallbacks, $mLanguageNames; + var $mVariants, $mVariantFallbacks, $mVariantNames; var $mTablesLoaded = false; var $mTables; var $mManualAddTables; @@ -58,7 +58,7 @@ class LanguageConverter { $this->mVariants = $variants; $this->mVariantFallbacks = $variantfallbacks; global $wgLanguageNames; - $this->mLanguageNames = $wgLanguageNames; + $this->mVariantNames = $wgLanguageNames; $this->mCacheKey = wfMemcKey( 'conversiontables', $maincode ); $m = array( 'begin'=>'-{', @@ -117,9 +117,85 @@ class LanguageConverter { return $this->mMainLanguageCode; } - // this method body in Language class + /** + * get preferred language variants. + * @param boolean $fromUser Get it from $wgUser's preferences + * @return string the preferred language code + * @public + */ function getPreferredVariant( $fromUser = true ) { - return $this->mLangObj->getPreferredVariant( $fromUser ); + 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; + } /** @@ -132,10 +208,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\""; @@ -296,19 +372,12 @@ class LanguageConverter { if( !in_array($v,$this->mVariants) )continue; if( $action=="add" ) { foreach($t as $from=>$to) { - // to ensure that $from and $to not be left blank - // so $this->translate() could always return a string - if ($from || $to) - // more efficient than array_merge(), about 2.5 times. - $this->mManualAddTables[$v][$from] = $to; - } - } - elseif ( $action=="remove" ) { - foreach($t as $from=>$to) { - if ($from || $to) - $this->mManualRemoveTables[$v][$from] = $to; + // more efficient than array_merge(), about 2.5 times. + $this->mManualAddTables[$v][$from] = $to; } } + elseif ( $action=="remove" ) + $this->mManualRemoveTables[$v] = array_merge($this->mManualRemoveTables[$v], $t); } } @@ -909,7 +978,7 @@ class ConverterRule { $unidtable[$v][$from]=$to; } // syntax error, pass - if (!array_key_exists($v,$this->mConverter->mLanguageNames)){ + if (!array_key_exists($v,$this->mConverter->mVariantNames)){ $bidtable = array(); $unidtable = array(); break; @@ -927,10 +996,10 @@ class ConverterRule { $varsep = $this->mConverter->mDescVarSep; $text=''; foreach($this->mBidtable as $k => $v) - $text .= $this->mConverter->mLanguageNames[$k]."$codesep$v$varsep"; + $text .= $this->mConverter->mVariantNames[$k]."$codesep$v$varsep"; foreach($this->mUnidtable as $k => $a) foreach($a as $from=>$to) - $text.="$from⇒".$this->mConverter->mLanguageNames[$k]."$codesep$to$varsep"; + $text.=$from.'⇒'.$this->mConverter->mVariantNames[$k]."$codesep$to$varsep"; return $text; } @@ -1056,7 +1125,7 @@ class ConverterRule { $this->mRuleDisplay = $rules; } elseif ( in_array('N',$flags) ){ // proces N flag: output current variant name - $this->mRuleDisplay = $this->mConverter->mLanguageNames[trim($rules)]; + $this->mRuleDisplay = $this->mConverter->mVariantNames[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 e257d5ac63..093626909b 100644 --- a/languages/classes/LanguageZh.php +++ b/languages/classes/LanguageZh.php @@ -33,7 +33,7 @@ class ZhConverter extends LanguageConverter { 'zh-sg' => '新加坡', 'zh-my' => '大马', ); - $this->mLanguageNames = array_merge($this->mLanguageNames,$names); + $this->mVariantNames = array_merge($this->mVariantNames,$names); } function loadDefaultTables() { -- 2.20.1