From 07dc087494f3f954d3ecec01398bdde3eec5f948 Mon Sep 17 00:00:00 2001 From: Robin Pepermans Date: Thu, 22 Sep 2011 20:31:23 +0000 Subject: [PATCH] Re-do r96798 ("LanguageConverter now depends on the page content language"), without the change in WikiPage which caused an infinite loop (see bug 31098) --- RELEASE-NOTES-1.19 | 2 ++ includes/OutputPage.php | 27 +++++++++++++----------- includes/SkinLegacy.php | 10 +++++---- includes/SkinTemplate.php | 15 +++++++++----- includes/Title.php | 4 ++-- includes/parser/Parser.php | 34 ++++++++++++++----------------- includes/parser/ParserOptions.php | 11 +++++++--- 7 files changed, 58 insertions(+), 45 deletions(-) diff --git a/RELEASE-NOTES-1.19 b/RELEASE-NOTES-1.19 index 9f8bf988e0..da48b4ca65 100644 --- a/RELEASE-NOTES-1.19 +++ b/RELEASE-NOTES-1.19 @@ -61,6 +61,8 @@ production. to stop it from replace an already existing default sort, and suppress error. * (bug 18578) Rewrote revision delete related messages to allow better localisation +* (bug 30364) LanguageConverter now depends on the page content language + instead of the wiki content language === Bug fixes in 1.19 === * $wgUploadNavigationUrl should be used for file redlinks if diff --git a/includes/OutputPage.php b/includes/OutputPage.php index 8a97061baa..7fd423fb83 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -1654,12 +1654,12 @@ class OutputPage extends ContextSource { * /w/index.php?title=Main_page&variant=zh-cn should never be served. */ function addAcceptLanguage() { - global $wgContLang; - if( !$this->getRequest()->getCheck( 'variant' ) && $wgContLang->hasVariants() ) { - $variants = $wgContLang->getVariants(); + $lang = $this->getTitle()->getPageLanguage(); + if( !$this->getRequest()->getCheck( 'variant' ) && $lang->hasVariants() ) { + $variants = $lang->getVariants(); $aloption = array(); foreach ( $variants as $variant ) { - if( $variant === $wgContLang->getCode() ) { + if( $variant === $lang->getCode() ) { continue; } else { $aloption[] = 'string-contains=' . $variant; @@ -2614,7 +2614,7 @@ $distantTemplates * have to be purged on configuration changes. */ protected function getJSVars() { - global $wgUseAjax, $wgEnableMWSuggest, $wgContLang; + global $wgUseAjax, $wgEnableMWSuggest; $title = $this->getTitle(); $ns = $title->getNamespace(); @@ -2640,9 +2640,10 @@ $distantTemplates 'wgCategories' => $this->getCategories(), 'wgBreakFrames' => $this->getFrameOptions() == 'DENY', ); - if ( $wgContLang->hasVariants() ) { - $vars['wgUserVariant'] = $wgContLang->getPreferredVariant(); - } + $lang = $this->getTitle()->getPageLanguage(); + if ( $lang->hasVariants() ) { + $vars['wgUserVariant'] = $lang->getPreferredVariant(); + } foreach ( $title->getRestrictionTypes() as $type ) { $vars['wgRestriction' . ucfirst( $type )] = $title->getRestrictions( $type ); } @@ -2693,7 +2694,7 @@ $distantTemplates global $wgUniversalEditButton, $wgFavicon, $wgAppleTouchIcon, $wgEnableAPI, $wgSitename, $wgVersion, $wgHtml5, $wgMimeType, $wgFeed, $wgOverrideSiteFeed, $wgAdvertisedFeedTypes, - $wgDisableLangConversion, $wgCanonicalLanguageLinks, $wgContLang, + $wgDisableLangConversion, $wgCanonicalLanguageLinks, $wgRightsPage, $wgRightsUrl; $tags = array(); @@ -2819,14 +2820,16 @@ $distantTemplates ) ); } + $lang = $this->getTitle()->getPageLanguage(); + # Language variants if ( !$wgDisableLangConversion && $wgCanonicalLanguageLinks - && $wgContLang->hasVariants() ) { + && $lang->hasVariants() ) { - $urlvar = $wgContLang->getURLVariant(); + $urlvar = $lang->getURLVariant(); if ( !$urlvar ) { - $variants = $wgContLang->getVariants(); + $variants = $lang->getVariants(); foreach ( $variants as $_v ) { $tags[] = Html::element( 'link', array( 'rel' => 'alternate', diff --git a/includes/SkinLegacy.php b/includes/SkinLegacy.php index d636883656..665e9f8b7c 100644 --- a/includes/SkinLegacy.php +++ b/includes/SkinLegacy.php @@ -269,13 +269,15 @@ class LegacyTemplate extends BaseTemplate { $s = ''; /* show links to different language variants */ - global $wgDisableLangConversion, $wgLang, $wgContLang; + global $wgDisableLangConversion, $wgLang; - $variants = $wgContLang->getVariants(); + $lang = $this->getSkin()->getTitle()->getPageLanguage(); + $variants = $lang->getVariants(); - if ( !$wgDisableLangConversion && sizeof( $variants ) > 1 ) { + if ( !$wgDisableLangConversion && sizeof( $variants ) > 1 + && $title->getNamespace() != NS_SPECIAL ) { foreach ( $variants as $code ) { - $varname = $wgContLang->getVariantname( $code ); + $varname = $lang->getVariantname( $code ); if ( $varname == 'disable' ) { continue; diff --git a/includes/SkinTemplate.php b/includes/SkinTemplate.php index ea6274dd97..b4f299aba0 100644 --- a/includes/SkinTemplate.php +++ b/includes/SkinTemplate.php @@ -1011,16 +1011,21 @@ class SkinTemplate extends Skin { array( &$this, &$content_navigation ) ); } + $pageLang = $title->getPageLanguage(); + // Gets list of language variants - $variants = $wgContLang->getVariants(); + $variants = $pageLang->getVariants(); // Checks that language conversion is enabled and variants exist - if( !$wgDisableLangConversion && count( $variants ) > 1 ) { - // Gets preferred variant - $preferred = $wgContLang->getPreferredVariant(); + // And if it is not in the special namespace + if( !$wgDisableLangConversion && count( $variants ) > 1 + && $title->getNamespace() != NS_SPECIAL ) { + // Gets preferred variant (note that user preference is + // only possible for wiki content language variant) + $preferred = $pageLang->getPreferredVariant(); // Loops over each variant foreach( $variants as $code ) { // Gets variant name from language code - $varname = $wgContLang->getVariantname( $code ); + $varname = $pageLang->getVariantname( $code ); // Checks if the variant is marked as disabled if( $varname == 'disable' ) { // Skips this variant diff --git a/includes/Title.php b/includes/Title.php index 2ad98b4de8..1f1a6a8f0f 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -885,7 +885,7 @@ class Title { */ public function getLocalURL( $query = '', $variant = false ) { global $wgArticlePath, $wgScript, $wgServer, $wgRequest; - global $wgVariantArticlePath, $wgContLang; + global $wgVariantArticlePath; if ( is_array( $query ) ) { $query = wfArrayToCGI( $query ); @@ -904,7 +904,7 @@ class Title { } else { $dbkey = wfUrlencode( $this->getPrefixedDBkey() ); if ( $query == '' ) { - if ( $variant != false && $wgContLang->hasVariants() ) { + if ( $variant != false && $this->getPageLanguage()->hasVariants() ) { if ( !$wgVariantArticlePath ) { $variantArticlePath = "$wgScript?title=$1&variant=$2"; // default } else { diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php index 0d3e2a2b80..a183101892 100644 --- a/includes/parser/Parser.php +++ b/includes/parser/Parser.php @@ -321,7 +321,7 @@ class Parser { * to internalParse() which does all the real work. */ - global $wgUseTidy, $wgAlwaysUseTidy, $wgContLang, $wgDisableLangConversion, $wgDisableTitleConversion; + global $wgUseTidy, $wgAlwaysUseTidy, $wgDisableLangConversion, $wgDisableTitleConversion; $fname = __METHOD__.'-' . wfGetCaller(); wfProfileIn( __METHOD__ ); wfProfileIn( $fname ); @@ -376,8 +376,7 @@ class Parser { # The position of the convert() call should not be changed. it # assumes that the links are all replaced and the only thing left # is the mark. - - $text = $wgContLang->convert( $text ); + $text = $this->getFunctionLang()->convert( $text ); } /** @@ -393,11 +392,11 @@ class Parser { || isset( $this->mDoubleUnderscores['notitleconvert'] ) || $this->mOutput->getDisplayTitle() !== false ) ) { - $convruletitle = $wgContLang->getConvRuleTitle(); + $convruletitle = $this->getFunctionLang()->getConvRuleTitle(); if ( $convruletitle ) { $this->mOutput->setTitleText( $convruletitle ); } else { - $titleText = $wgContLang->convertTitle( $title ); + $titleText = $this->getFunctionLang()->convertTitle( $title ); $this->mOutput->setTitleText( $titleText ); } } @@ -1194,7 +1193,6 @@ class Parser { * @private */ function makeFreeExternalLink( $url ) { - global $wgContLang; wfProfileIn( __METHOD__ ); $trail = ''; @@ -1227,7 +1225,7 @@ class Parser { $text = $this->maybeMakeExternalImage( $url ); if ( $text === false ) { # Not an image, make a link - $text = Linker::makeExternalLink( $url, $wgContLang->markNoConversion($url), true, 'free', + $text = Linker::makeExternalLink( $url, $this->getFunctionLang()->markNoConversion($url), true, 'free', $this->getExternalLinkAttribs( $url ) ); # Register it in the output object... # Replace unnecessary URL escape codes with their equivalent characters @@ -1455,7 +1453,6 @@ class Parser { * @return string */ function replaceExternalLinks( $text ) { - global $wgContLang; wfProfileIn( __METHOD__ ); $bits = preg_split( $this->mExtLinkBracketedRegex, $text, -1, PREG_SPLIT_DELIM_CAPTURE ); @@ -1501,7 +1498,7 @@ class Parser { list( $dtrail, $trail ) = Linker::splitTrail( $trail ); } - $text = $wgContLang->markNoConversion( $text ); + $text = $this->getFunctionLang()->markNoConversion( $text ); $url = Sanitizer::cleanUrl( $url ); @@ -1658,8 +1655,6 @@ class Parser { * @private */ function replaceInternalLinks2( &$s ) { - global $wgContLang; - wfProfileIn( __METHOD__ ); wfProfileIn( __METHOD__.'-setup' ); @@ -1683,7 +1678,7 @@ class Parser { $line = $a->current(); # Workaround for broken ArrayIterator::next() that returns "void" $s = substr( $s, 1 ); - $useLinkPrefixExtension = $wgContLang->linkPrefixExtension(); + $useLinkPrefixExtension = $this->getFunctionLang()->linkPrefixExtension(); $e2 = null; if ( $useLinkPrefixExtension ) { # Match the end of a line for a word that's not followed by whitespace, @@ -1709,8 +1704,8 @@ class Parser { $prefix = ''; } - if ( $wgContLang->hasVariants() ) { - $selflink = $wgContLang->autoConvertToAllVariants( $this->mTitle->getPrefixedText() ); + if ( $this->getFunctionLang()->hasVariants() ) { + $selflink = $this->getFunctionLang()->autoConvertToAllVariants( $this->mTitle->getPrefixedText() ); } else { $selflink = array( $this->mTitle->getPrefixedText() ); } @@ -1878,6 +1873,7 @@ class Parser { # Link not escaped by : , create the various objects if ( $noforce ) { + global $wgContLang; # Interwikis wfProfileIn( __METHOD__."-interwiki" ); @@ -1927,7 +1923,7 @@ class Parser { } $sortkey = Sanitizer::decodeCharReferences( $sortkey ); $sortkey = str_replace( "\n", '', $sortkey ); - $sortkey = $wgContLang->convertCategoryKey( $sortkey ); + $sortkey = $this->getFunctionLang()->convertCategoryKey( $sortkey ); $this->mOutput->addCategory( $nt->getDBkey(), $sortkey ); /** @@ -3028,7 +3024,7 @@ class Parser { * @private */ function braceSubstitution( $piece, $frame ) { - global $wgContLang, $wgNonincludableNamespaces, $wgEnableInterwikiTranscluding, $wgEnableInterwikiTemplatesTracking; + global $wgNonincludableNamespaces, $wgEnableInterwikiTranscluding, $wgEnableInterwikiTemplatesTracking; wfProfileIn( __METHOD__ ); wfProfileIn( __METHOD__.'-setup' ); @@ -3129,7 +3125,7 @@ class Parser { $function = $this->mFunctionSynonyms[1][$function]; } else { # Case insensitive functions - $function = $wgContLang->lc( $function ); + $function = $this->getFunctionLang()->lc( $function ); if ( isset( $this->mFunctionSynonyms[0][$function] ) ) { $function = $this->mFunctionSynonyms[0][$function]; } else { @@ -3205,8 +3201,8 @@ class Parser { } $titleText = $title->getPrefixedText(); # Check for language variants if the template is not found - if ( $wgContLang->hasVariants() && $title->getArticleID() == 0 ) { - $wgContLang->findVariantLink( $part1, $title, true ); + if ( $this->getFunctionLang()->hasVariants() && $title->getArticleID() == 0 ) { + $this->getFunctionLang()->findVariantLink( $part1, $title, true ); } # Do recursion depth check $limit = $this->mOptions->getMaxTemplateDepth(); diff --git a/includes/parser/ParserOptions.php b/includes/parser/ParserOptions.php index 36fce3423d..eceef69813 100644 --- a/includes/parser/ParserOptions.php +++ b/includes/parser/ParserOptions.php @@ -275,11 +275,11 @@ class ParserOptions { * * @since 1.17 * @param $forOptions Array - * @param $title Title: will be used to get the page content language (since r97636) + * @param $title Title: used to get the content language of the page (since r97636) * @return \string Page rendering hash */ public function optionsHash( $forOptions, $title = null ) { - global $wgContLang, $wgRenderHashAppend; + global $wgRenderHashAppend; $confstr = ''; @@ -323,7 +323,12 @@ class ParserOptions { // add in language specific options, if any // @todo FIXME: This is just a way of retrieving the url/user preferred variant - $confstr .= $wgContLang->getExtraHashOptions(); + if( !is_null( $title ) ) { + $confstr .= $title->getPageLanguage()->getExtraHashOptions(); + } else { + global $wgContLang; + $confstr .= $wgContLang->getExtraHashOptions(); + } $confstr .= $wgRenderHashAppend; -- 2.20.1