https://www.mediawiki.org/wiki/Special:Code/MediaWiki/110207
Revision: 110207 Author: liangent Date: 2012-01-28 14:23:26 +0000 (Sat, 28 Jan 2012) Log Message: ----------- Do language variant conversion in feeds Modified Paths: -------------- trunk/extensions/FeaturedFeeds/ApiFeaturedFeeds.php trunk/extensions/FeaturedFeeds/FeaturedFeeds.body.php trunk/extensions/FeaturedFeeds/SpecialFeedItem.php Modified: trunk/extensions/FeaturedFeeds/ApiFeaturedFeeds.php =================================================================== --- trunk/extensions/FeaturedFeeds/ApiFeaturedFeeds.php 2012-01-28 12:19:24 UTC (rev 110206) +++ trunk/extensions/FeaturedFeeds/ApiFeaturedFeeds.php 2012-01-28 14:23:26 UTC (rev 110207) @@ -15,6 +15,7 @@ } public function execute() { + global $wgContLang; wfProfileIn( __METHOD__ ); $params = $this->extractRequestParams(); @@ -31,7 +32,12 @@ wfProfileOut( __METHOD__ ); $this->dieUsage( 'Invalid language code', 'language-invalid' ); } - $feeds = FeaturedFeeds::getFeeds( $language ); + $variant = isset( $params['variant'] ) ? $params['variant'] : false; + if ( $variant !== false && !in_array( $variant, $wgContLang->getVariants() ) ) { + wfProfileOut( __METHOD__ ); + $this->dieUsage( 'Invalid variant code', 'variant-invalid' ); + } + $feeds = FeaturedFeeds::getFeeds( $language, $variant ); $ourFeed = $feeds[$params['feed']]; $feedClass = new $wgFeedClasses[$params['feedformat']] ( @@ -52,7 +58,7 @@ public function getAllowedParams() { global $wgFeedClasses; $feedFormatNames = array_keys( $wgFeedClasses ); - $availableFeeds = array_keys( FeaturedFeeds::getFeeds( false ) ); + $availableFeeds = array_keys( FeaturedFeeds::getFeeds( false, false ) ); return array ( 'feedformat' => array( ApiBase::PARAM_DFLT => 'rss', @@ -64,7 +70,10 @@ ), 'language' => array( ApiBase::PARAM_TYPE => 'string', - ) + ), + 'variant' => array( + ApiBase::PARAM_TYPE => 'string', + ), ); } @@ -72,7 +81,8 @@ return array( 'feedformat' => 'The format of the feed', 'feed' => 'Feed name', - 'language' => 'Feed language code. Ignored by some feeds.' + 'language' => 'Feed language code. Ignored by some feeds.', + 'variant' => 'Feed variant code.', ); } @@ -84,6 +94,7 @@ return array_merge( parent::getPossibleErrors(), array( array( 'code' => 'feed-invalid', 'info' => 'Invalid subscription feed type' ), array( 'code' => 'language-invalid', 'info' => 'Invalid language code' ), + array( 'code' => 'variant-invalid', 'info' => 'Invalid variant code' ), ) ); } @@ -91,7 +102,7 @@ global $wgVersion; // attempt to find a valid feed name // if none available, just use an example value - $availableFeeds = array_keys( FeaturedFeeds::getFeeds( false ) ); + $availableFeeds = array_keys( FeaturedFeeds::getFeeds( false, false ) ); $feed = reset( $availableFeeds ); if ( !$feed ) { $feed = 'featured'; Modified: trunk/extensions/FeaturedFeeds/FeaturedFeeds.body.php =================================================================== --- trunk/extensions/FeaturedFeeds/FeaturedFeeds.body.php 2012-01-28 12:19:24 UTC (rev 110206) +++ trunk/extensions/FeaturedFeeds/FeaturedFeeds.body.php 2012-01-28 14:23:26 UTC (rev 110207) @@ -7,27 +7,31 @@ * Returns the list of feeds * * @param $langCode string|bool Code of language to use or false if default + * @param $variantCode string|bool Code of variant to use or false if default or empty string if don't convert * @return array Feeds in format of 'name' => array of FeedItem */ - public static function getFeeds( $langCode ) { - global $wgMemc, $wgLangCode; + public static function getFeeds( $langCode, $variantCode ) { + global $wgMemc, $wgLangCode, $wgContLang; if ( !$langCode || self::allInContentLanguage() ) { $langCode = $wgLangCode; } + if ( $variantCode === false ) { + $variantCode = $wgContLang->getPreferredVariant(); + } static $cache = array(); - if ( isset( $cache[$langCode] ) ) { - return $cache[$langCode]; + if ( isset( $cache[$langCode][$variantCode] ) ) { + return $cache[$langCode][$variantCode]; } - $key = self::getCacheKey( $langCode ); + $key = self::getCacheKey( $langCode, $variantCode ); $feeds = $wgMemc->get( $key ); if ( !$feeds ) { - $feeds = self::getFeedsInternal( $langCode ); + $feeds = self::getFeedsInternal( $langCode, $variantCode ); $wgMemc->set( $key, $feeds, self::getMaxAge() ); } - $cache[$langCode] = $feeds; + $cache[$langCode][$variantCode] = $feeds; return $feeds; } @@ -36,8 +40,8 @@ * @param String $langCode: Feed language code * @return String */ - private static function getCacheKey( $langCode ) { - return wfMemcKey( 'featured-feeds', $langCode ); + private static function getCacheKey( $langCode, $variantCode ) { + return wfMemcKey( 'featured-feeds', $langCode, $variantCode ); } /** @@ -83,9 +87,13 @@ * @return bool */ public static function beforePageDisplay( OutputPage &$out ) { - global $wgAdvertisedFeedTypes; + global $wgAdvertisedFeedTypes, $wgContLang; if ( $out->getTitle()->isMainPage() ) { - foreach ( self::getFeeds( $out->getLanguage()->getCode() ) as $feed ) { + $feeds = self::getFeeds( + $out->getLanguage()->getCode(), + $wgContLang->getPreferredVariant() + ); + foreach ( $feeds as $feed ) { foreach ( $wgAdvertisedFeedTypes as $type ) { $out->addLink( array( 'rel' => 'alternate', @@ -106,10 +114,13 @@ * @return Boolean */ public static function skinTemplateOutputPageBeforeExec( &$sk, &$tpl ) { - global $wgDisplayFeedsInSidebar, $wgAdvertisedFeedTypes; + global $wgDisplayFeedsInSidebar, $wgAdvertisedFeedTypes, $wgContLang; if ( $wgDisplayFeedsInSidebar && $sk->getContext()->getTitle()->isMainPage() ) { - $feeds = self::getFeeds( $sk->getContext()->getLanguage()->getCode() ); + $feeds = self::getFeeds( + $sk->getContext()->getLanguage()->getCode(), + $wgContLang->getPreferredVariant() + ); $links = array(); $format = $wgAdvertisedFeedTypes[0]; // @fixme: foreach ( $feeds as $feed ) { @@ -163,7 +174,7 @@ * @return array * @throws MWException */ - private static function getFeedsInternal( $langCode ) { + private static function getFeedsInternal( $langCode, $variantCode ) { wfProfileIn( __METHOD__ ); $feedDefs = self::getFeedDefinitions(); @@ -171,7 +182,7 @@ $requestedLang = Language::factory( $langCode ); $parser = new Parser(); foreach ( $feedDefs as $name => $opts ) { - $feed = new FeaturedFeedChannel( $name, $opts, $requestedLang ); + $feed = new FeaturedFeedChannel( $name, $opts, $requestedLang, $variantCode ); if ( !$feed->isOK() ) { continue; } @@ -252,7 +263,7 @@ public $shortTitle; public $description; - public function __construct( $name, $options, $lang ) { + public function __construct( $name, $options, $lang, $variant ) { global $wgContLang; if ( !self::$parserOptions ) { self::$parserOptions = new ParserOptions(); @@ -266,6 +277,7 @@ } else { $this->language = $wgContLang; } + $this->variant = $variant; } private function msg( $key ) { @@ -286,13 +298,19 @@ } public function init() { - global $wgLanguageCode; + global $wgLanguageCode, $wgContLang; if ( $this->title !== false ) { return; } $this->title = $this->msg( $this->options['title'] )->text(); $this->shortTitle = $this->msg( $this->options['short-title'] ); $this->description = $this->msg( $this->options['description'] )->text(); + // Convert the messages if the content language has variants. + if ( $wgContLang->hasVariants() && $this->variant ) { + $this->title = $wgContLang->mConverter->convertTo( $this->title, $this->variant ); + $this->shortTitle = $wgContLang->mConverter->convertTo( $this->shortTitle, $this->variant ); + $this->description = $wgContLang->mConverter->convertTo( $this->description, $this->variant ); + } $pageMsg = $this->msg( $this->options['page'] )->params( $this->language->getCode() ); if ( $pageMsg->isDisabled() ) { // fall back manually, messages can be existent but empty @@ -330,6 +348,7 @@ * @return FeaturedFeedItem */ public function getFeedItem( $date ) { + global $wgContLang; self::$parserOptions->setTimestamp( $date ); self::$parserOptions->setUserLang( $this->language ); @@ -347,16 +366,20 @@ return false; } $text = self::$parser->parse( $text, $title, self::$parserOptions )->getText(); - $url = SpecialPage::getTitleFor( 'FeedItem' , + $special = SpecialPage::getTitleFor( 'FeedItem' , $this->name . '/' . wfTimestamp( TS_MW, $date ) . '/' . $this->language->getCode() - )->getFullURL(); + ); + $entry = self::$parser->transformMsg( $this->entryName, self::$parserOptions ); + if ( $wgContLang->hasVariants() && $this->variant ) { + $text = $wgContLang->mConverter->convertTo( $text, $this->variant ); + $entry = $wgContLang->mConverter->convertTo( $entry, $this->variant ); + // bug 34010. otherwise variant specified in the second argument can be ignored. + $url = $special->getFullURL( array( 'variant' => $this->variant ) ); + } else { + $url = $special->getFullURL(); + } - return new FeaturedFeedItem( - self::$parser->transformMsg( $this->entryName, self::$parserOptions ), - wfExpandUrl( $url ), - $text, - $date - ); + return new FeaturedFeedItem( $entry, wfExpandUrl( $url ), $text, $date ); } /** @@ -376,6 +399,9 @@ if ( $this->options['inUserLanguage'] && $this->language->getCode() != $wgContLang->getCode() ) { $options['language'] = $this->language->getCode(); } + if ( $wgContLang->hasVariants() && $this->variant ) { + $options['variant'] = $this->variant; + } return wfScript( 'api' ) . '?' . wfArrayToCGI( $options ); } } Modified: trunk/extensions/FeaturedFeeds/SpecialFeedItem.php =================================================================== --- trunk/extensions/FeaturedFeeds/SpecialFeedItem.php 2012-01-28 12:19:24 UTC (rev 110206) +++ trunk/extensions/FeaturedFeeds/SpecialFeedItem.php 2012-01-28 14:23:26 UTC (rev 110207) @@ -15,7 +15,7 @@ return; } list( $feedName, $date, $langCode ) = $parts; - $feeds = FeaturedFeeds::getFeeds( $langCode ); + $feeds = FeaturedFeeds::getFeeds( $langCode, '' ); if ( !isset( $feeds[$feedName] ) ) { $out->showErrorPage( 'error', 'ffeed-feed-not-found', array( $feedName ) ); return; @@ -54,8 +54,10 @@ } private function displayItem( FeaturedFeedItem $item ) { + global $wgContLang; $out = $this->getOutput(); - $out->setPageTitle( $item->getRawTitle() ); + // The language converter converts page content automatically but not page title. + $out->setPageTitle( $wgContLang->convert( $item->getRawTitle() ) ); $out->addHTML( $item->getRawText() ); } } _______________________________________________ MediaWiki-CVS mailing list MediaWiki-CVS@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs