Index: branches/wmf/1.18wmf1/extensions/FeaturedFeeds/FeaturedFeeds.alias.php |
— | — | @@ -0,0 +1,14 @@ |
| 2 | +<?php |
| 3 | +/** |
| 4 | + * Aliases for Special:FeedItem |
| 5 | + * |
| 6 | + * @file |
| 7 | + * @ingroup Extensions |
| 8 | + */ |
| 9 | + |
| 10 | +$specialPageAliases = array(); |
| 11 | + |
| 12 | +/** English (English) */ |
| 13 | +$specialPageAliases['en'] = array( |
| 14 | + 'FeedItem' => array( 'FeedItem' ), |
| 15 | +); |
Property changes on: branches/wmf/1.18wmf1/extensions/FeaturedFeeds/FeaturedFeeds.alias.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 16 | + native |
Index: branches/wmf/1.18wmf1/extensions/FeaturedFeeds/ApiFeaturedFeeds.php |
— | — | @@ -0,0 +1,115 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +class ApiFeaturedFeeds extends ApiBase { |
| 5 | + public function __construct( $main, $action ) { |
| 6 | + parent::__construct( $main, $action ); |
| 7 | + } |
| 8 | + |
| 9 | + /** |
| 10 | + * This module uses a custom feed wrapper printer. |
| 11 | + * |
| 12 | + * @return ApiFormatFeedWrapper |
| 13 | + */ |
| 14 | + public function getCustomPrinter() { |
| 15 | + return new ApiFormatFeedWrapper( $this->getMain() ); |
| 16 | + } |
| 17 | + |
| 18 | + public function execute() { |
| 19 | + wfProfileIn( __METHOD__ ); |
| 20 | + |
| 21 | + $params = $this->extractRequestParams(); |
| 22 | + |
| 23 | + global $wgFeedClasses; |
| 24 | + |
| 25 | + if ( !isset( $wgFeedClasses[$params['feedformat']] ) ) { |
| 26 | + wfProfileOut( __METHOD__ ); |
| 27 | + $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' ); |
| 28 | + } |
| 29 | + |
| 30 | + $language = isset( $params['language'] ) ? $params['language'] : false; |
| 31 | + if ( $language !== false && !Language::isValidCode( $language ) ) { |
| 32 | + wfProfileOut( __METHOD__ ); |
| 33 | + $this->dieUsage( 'Invalid language code', 'language-invalid' ); |
| 34 | + } |
| 35 | + $feeds = FeaturedFeeds::getFeeds( $language ); |
| 36 | + $ourFeed = $feeds[$params['feed']]; |
| 37 | + |
| 38 | + $feedClass = new $wgFeedClasses[$params['feedformat']] ( |
| 39 | + $ourFeed->title, |
| 40 | + $ourFeed->description, |
| 41 | + wfExpandUrl( Title::newMainPage()->getFullURL() ) |
| 42 | + ); |
| 43 | + |
| 44 | + ApiFormatFeedWrapper::setResult( $this->getResult(), $feedClass, $ourFeed->getFeedItems() ); |
| 45 | + |
| 46 | + // Cache stuff in squids |
| 47 | + $this->getMain()->setCacheMode( 'public' ); |
| 48 | + $this->getMain()->setCacheMaxAge( FeaturedFeeds::getMaxAge() ); |
| 49 | + |
| 50 | + wfProfileOut( __METHOD__ ); |
| 51 | + } |
| 52 | + |
| 53 | + public function getAllowedParams() { |
| 54 | + global $wgFeedClasses; |
| 55 | + $feedFormatNames = array_keys( $wgFeedClasses ); |
| 56 | + $availableFeeds = array_keys( FeaturedFeeds::getFeeds( false ) ); |
| 57 | + return array ( |
| 58 | + 'feedformat' => array( |
| 59 | + ApiBase::PARAM_DFLT => 'rss', |
| 60 | + ApiBase::PARAM_TYPE => $feedFormatNames |
| 61 | + ), |
| 62 | + 'feed' => array( |
| 63 | + ApiBase::PARAM_TYPE => $availableFeeds, |
| 64 | + ApiBase::PARAM_REQUIRED => true, |
| 65 | + ), |
| 66 | + 'language' => array( |
| 67 | + ApiBase::PARAM_TYPE => 'string', |
| 68 | + ) |
| 69 | + ); |
| 70 | + } |
| 71 | + |
| 72 | + public function getParamDescription() { |
| 73 | + return array( |
| 74 | + 'feedformat' => 'The format of the feed', |
| 75 | + 'feed' => 'Feed name', |
| 76 | + 'language' => 'Feed language code. Ignored by some feeds.' |
| 77 | + ); |
| 78 | + } |
| 79 | + |
| 80 | + public function getDescription() { |
| 81 | + return 'Returns a user contributions feed'; |
| 82 | + } |
| 83 | + |
| 84 | + public function getPossibleErrors() { |
| 85 | + return array_merge( parent::getPossibleErrors(), array( |
| 86 | + array( 'code' => 'feed-invalid', 'info' => 'Invalid subscription feed type' ), |
| 87 | + array( 'code' => 'language-invalid', 'info' => 'Invalid language code' ), |
| 88 | + ) ); |
| 89 | + } |
| 90 | + |
| 91 | + public function getExamples() { |
| 92 | + global $wgVersion; |
| 93 | + // attempt to find a valid feed name |
| 94 | + // if none available, just use an example value |
| 95 | + $availableFeeds = array_keys( FeaturedFeeds::getFeeds( false ) ); |
| 96 | + $feed = reset( $availableFeeds ); |
| 97 | + if ( !$feed ) { |
| 98 | + $feed = 'featured'; |
| 99 | + } |
| 100 | + |
| 101 | + if ( version_compare( $wgVersion, '1.19alpha', '>=' ) ) { |
| 102 | + return array( |
| 103 | + "api.php?action=featuredfeed&feed=$feed" => "Retrieve feed ``$feed'", |
| 104 | + ); |
| 105 | + } else { |
| 106 | + return array( |
| 107 | + "Retrieve feed `$feed'", |
| 108 | + " api.php?action=featuredfeed&feed=$feed", |
| 109 | + ); |
| 110 | + } |
| 111 | + } |
| 112 | + |
| 113 | + public function getVersion() { |
| 114 | + return __CLASS__ . ': $Id$'; |
| 115 | + } |
| 116 | +} |
Property changes on: branches/wmf/1.18wmf1/extensions/FeaturedFeeds/ApiFeaturedFeeds.php |
___________________________________________________________________ |
Added: svn:keywords |
1 | 117 | + Id |
Added: svn:eol-style |
2 | 118 | + native |
Index: branches/wmf/1.18wmf1/extensions/FeaturedFeeds/FeaturedFeedsWMF.php |
— | — | @@ -0,0 +1,78 @@ |
| 2 | +<?php |
| 3 | +/* |
| 4 | + * Feed settings for WMF projects |
| 5 | + */ |
| 6 | + |
| 7 | +if ( !defined( 'MEDIAWIKI' ) ) { |
| 8 | + die( 'Not a valid entry point' ); |
| 9 | +} |
| 10 | + |
| 11 | +$wgHooks['FeaturedFeeds::getFeeds'][] = 'wfFeaturedFeedsWMF_getFeeds'; |
| 12 | + |
| 13 | +/** |
| 14 | + * @param $feeds array |
| 15 | + * @return bool |
| 16 | + */ |
| 17 | +function wfFeaturedFeedsWMF_getFeeds( &$feeds ) { |
| 18 | + global $wgConf; |
| 19 | + list( $site, $lang ) = $wgConf->siteFromDB( wfGetDB( DB_SLAVE )->getDBname() ); |
| 20 | + $media = array( |
| 21 | + 'potd' => array( // Picture Of The Day |
| 22 | + 'page' => 'ffeed-potd-page', |
| 23 | + 'title' => 'ffeed-potd-title', |
| 24 | + 'short-title' => 'ffeed-potd-short-title', |
| 25 | + 'description' => 'ffeed-potd-desc', |
| 26 | + 'entryName' => 'ffeed-potd-entry', |
| 27 | + ), |
| 28 | + 'motd' => array( // Media Of The Day |
| 29 | + 'page' => 'ffeed-motd-page', |
| 30 | + 'title' => 'ffeed-motd-title', |
| 31 | + 'short-title' => 'ffeed-motd-short-title', |
| 32 | + 'description' => 'ffeed-motd-desc', |
| 33 | + 'entryName' => 'ffeed-motd-entry', |
| 34 | + ), |
| 35 | + ); |
| 36 | + switch ( $site ) { |
| 37 | + case 'wikipedia': |
| 38 | + $feeds += array( |
| 39 | + 'featured' => array( |
| 40 | + 'page' => 'ffeed-featured-page', |
| 41 | + 'title' => 'ffeed-featured-title', |
| 42 | + 'short-title' => 'ffeed-featured-short-title', |
| 43 | + 'description' => 'ffeed-featured-desc', |
| 44 | + 'entryName' => 'ffeed-featured-entry', |
| 45 | + ), |
| 46 | + 'onthisday' => array( |
| 47 | + 'page' => 'ffeed-onthisday-page', |
| 48 | + 'title' => 'ffeed-onthisday-title', |
| 49 | + 'short-title' => 'ffeed-onthisday-short-title', |
| 50 | + 'description' => 'ffeed-onthisday-desc', |
| 51 | + 'entryName' => 'ffeed-onthisday-entry', |
| 52 | + ), |
| 53 | + 'dyk' => array( // Did you know? |
| 54 | + 'page' => 'ffeed-dyk-page', |
| 55 | + 'title' => 'ffeed-dyk-title', |
| 56 | + 'short-title' => 'ffeed-dyk-short-title', |
| 57 | + 'description' => 'ffeed-dyk-desc', |
| 58 | + 'entryName' => 'ffeed-dyk-entry', |
| 59 | + ), |
| 60 | + ); |
| 61 | + $feeds += $media; |
| 62 | + break; |
| 63 | + case 'commons': |
| 64 | + $feeds += $media; |
| 65 | + $feeds['potd']['inUserLanguage'] = true; |
| 66 | + $feeds['motd']['inUserLanguage'] = true; |
| 67 | + break; |
| 68 | + case 'wikiquote': |
| 69 | + $feeds['qotd'] = array( // Quote of the Day |
| 70 | + 'page' => 'ffeed-qotd-page', |
| 71 | + 'title' => 'ffeed-qotd-title', |
| 72 | + 'short-title' => 'ffeed-qotd-short-title', |
| 73 | + 'description' => 'ffeed-qotd-desc', |
| 74 | + 'entryName' => 'ffeed-qotd-entry', |
| 75 | + ); |
| 76 | + break; |
| 77 | + } |
| 78 | + return true; |
| 79 | +} |
Property changes on: branches/wmf/1.18wmf1/extensions/FeaturedFeeds/FeaturedFeedsWMF.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 80 | + native |
Index: branches/wmf/1.18wmf1/extensions/FeaturedFeeds/FeaturedFeeds.body.php |
— | — | @@ -0,0 +1,328 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +class FeaturedFeeds { |
| 5 | + /** |
| 6 | + * Returns the list of feeds |
| 7 | + * |
| 8 | + * @param $langCode string||bool Code of language to use or false if default |
| 9 | + * @return array Feeds in format of 'name' => array of FeedItem |
| 10 | + */ |
| 11 | + public static function getFeeds( $langCode ) { |
| 12 | + global $wgMemc, $wgContLang; |
| 13 | + |
| 14 | + if ( !$langCode ) { |
| 15 | + $langCode = $wgContLang->getCode(); |
| 16 | + } |
| 17 | + static $cache = array(); |
| 18 | + if ( isset( $cache[$langCode] ) ) { |
| 19 | + return $cache[$langCode]; |
| 20 | + } |
| 21 | + |
| 22 | + $key = wfMemcKey( 'featured-feeds', $langCode ); |
| 23 | + $feeds = $wgMemc->get( $key ); |
| 24 | + |
| 25 | + if ( !$feeds ) { |
| 26 | + $feeds = self::getFeedsInternal( $langCode ); |
| 27 | + $wgMemc->set( $key, $feeds, self::getMaxAge() ); |
| 28 | + } |
| 29 | + $cache[$langCode] = $feeds; |
| 30 | + return $feeds; |
| 31 | + } |
| 32 | + |
| 33 | + /** |
| 34 | + * Adds feeds to the page header |
| 35 | + * |
| 36 | + * @param OutputPage $out |
| 37 | + * @return bool |
| 38 | + */ |
| 39 | + public static function beforePageDisplay( OutputPage &$out ) { |
| 40 | + global $wgAdvertisedFeedTypes; |
| 41 | + if ( $out->getTitle()->isMainPage() ) { |
| 42 | + foreach ( self::getFeeds( $out->getLanguage()->getCode() ) as $feed ) { |
| 43 | + foreach ( $wgAdvertisedFeedTypes as $type ) { |
| 44 | + $out->addLink( array( |
| 45 | + 'rel' => 'alternate', |
| 46 | + 'type' => "application/$type+xml", |
| 47 | + 'title' => $feed->title, |
| 48 | + 'href' => $feed->getURL( $type ), |
| 49 | + ) ); |
| 50 | + } |
| 51 | + } |
| 52 | + } |
| 53 | + return true; |
| 54 | + } |
| 55 | + |
| 56 | + /** |
| 57 | + * SkinTemplateOutputPageBeforeExec hook handler |
| 58 | + * @param Skin $sk |
| 59 | + * @param QuickTemplate $tpl |
| 60 | + * @return Boolean |
| 61 | + */ |
| 62 | + public static function skinTemplateOutputPageBeforeExec( &$sk, &$tpl ) { |
| 63 | + global $wgDisplayFeedsInSidebar, $wgAdvertisedFeedTypes; |
| 64 | + |
| 65 | + if ( $wgDisplayFeedsInSidebar && $sk->getContext()->getTitle()->isMainPage() ) { |
| 66 | + $feeds = self::getFeeds( $sk->getContext()->getLanguage()->getCode() ); |
| 67 | + $links = array(); |
| 68 | + $format = $wgAdvertisedFeedTypes[0]; // @fixme: |
| 69 | + foreach ( $feeds as $feed ) { |
| 70 | + $links[] = array( |
| 71 | + 'href' => $feed->getURL( $format ), |
| 72 | + 'title' => $feed->title, |
| 73 | + 'text' => $feed->shortTitle, |
| 74 | + ); |
| 75 | + } |
| 76 | + if ( count( $links ) ) { |
| 77 | + $tpl->data['sidebar']['ffeed-sidebar-section'] = $links; |
| 78 | + } |
| 79 | + } |
| 80 | + return true; |
| 81 | + } |
| 82 | + |
| 83 | + /** |
| 84 | + * @param $langCode string |
| 85 | + * @return array |
| 86 | + * @throws MWException |
| 87 | + */ |
| 88 | + private static function getFeedsInternal( $langCode ) { |
| 89 | + global $wgFeaturedFeeds, $wgFeaturedFeedsDefaults, $wgContLang; |
| 90 | + |
| 91 | + wfProfileIn( __METHOD__ ); |
| 92 | + $feedDefs = $wgFeaturedFeeds; |
| 93 | + wfRunHooks( 'FeaturedFeeds::getFeeds', array( &$feedDefs ) ); |
| 94 | + |
| 95 | + // fill defaults |
| 96 | + foreach ( $feedDefs as $name => $opts ) { |
| 97 | + foreach ( $wgFeaturedFeedsDefaults as $setting => $value ) { |
| 98 | + if ( !isset( $opts[$setting] ) ) { |
| 99 | + $feedDefs[$name][$setting] = $value; |
| 100 | + } |
| 101 | + } |
| 102 | + } |
| 103 | + |
| 104 | + $feeds = array(); |
| 105 | + $requestedLang = Language::factory( $langCode ); |
| 106 | + $parser = new Parser(); |
| 107 | + foreach ( $feedDefs as $name => $opts ) { |
| 108 | + $feed = new FeaturedFeedChannel( $name, $opts, $requestedLang ); |
| 109 | + if ( !$feed->isOK() ) { |
| 110 | + continue; |
| 111 | + } |
| 112 | + $feed->getFeedItems(); |
| 113 | + $feeds[$name] = $feed; |
| 114 | + } |
| 115 | + wfProfileOut( __METHOD__ ); |
| 116 | + |
| 117 | + return $feeds; |
| 118 | + } |
| 119 | + |
| 120 | + |
| 121 | + |
| 122 | + /** |
| 123 | + * Returns the Unix timestamp of current day's first second |
| 124 | + * |
| 125 | + * @return int Timestamp |
| 126 | + */ |
| 127 | + public static function todaysStart() { |
| 128 | + static $time = false; |
| 129 | + if ( !$time ) { |
| 130 | + $time = self::startOfDay( time() ); |
| 131 | + } |
| 132 | + return $time; |
| 133 | + } |
| 134 | + |
| 135 | + /** |
| 136 | + * Returns the Unix timestamp of current day's first second |
| 137 | + * |
| 138 | + * @return int Timestamp |
| 139 | + */ |
| 140 | + public static function startOfDay( $timestamp ) { |
| 141 | + global $wgLocaltimezone; |
| 142 | + if ( isset( $wgLocaltimezone ) ) { |
| 143 | + $tz = new DateTimeZone( $wgLocaltimezone ); |
| 144 | + } else { |
| 145 | + $tz = new DateTimeZone( date_default_timezone_get() ); |
| 146 | + } |
| 147 | + $dt = new DateTime( "@$timestamp", $tz ); |
| 148 | + $dt->setTime( 0, 0, 0 ); |
| 149 | + return $dt->getTimestamp(); |
| 150 | + } |
| 151 | + |
| 152 | + /** |
| 153 | + * Returns the number of seconds a feed should stay in cache |
| 154 | + * |
| 155 | + * @return int: Time in seconds |
| 156 | + */ |
| 157 | + public static function getMaxAge() { |
| 158 | + // add 10 seconds to cater for time deviation between servers |
| 159 | + $expiry = self::todaysStart() + 24 * 3600 - wfTimestamp() + 10; |
| 160 | + return min( $expiry, 3600 ); |
| 161 | + } |
| 162 | +} |
| 163 | + |
| 164 | +class FeaturedFeedChannel { |
| 165 | + /** |
| 166 | + * @var ParserOptions |
| 167 | + */ |
| 168 | + private static $parserOptions = null; |
| 169 | + /** |
| 170 | + * @var Parser |
| 171 | + */ |
| 172 | + private static $parser; |
| 173 | + |
| 174 | + /** |
| 175 | + * @var Language |
| 176 | + */ |
| 177 | + private $language; |
| 178 | + |
| 179 | + private $name; |
| 180 | + private $options; |
| 181 | + private $items = false; |
| 182 | + private $page = false; |
| 183 | + private $entryName; |
| 184 | + |
| 185 | + public $title = false; |
| 186 | + public $shortTitle; |
| 187 | + public $description; |
| 188 | + |
| 189 | + public function __construct( $name, $options, $lang ) { |
| 190 | + global $wgContLang; |
| 191 | + if ( !self::$parserOptions ) { |
| 192 | + self::$parserOptions = new ParserOptions(); |
| 193 | + self::$parser = new Parser(); |
| 194 | + } |
| 195 | + $this->name = $name; |
| 196 | + $this->options = $options; |
| 197 | + if ( $options['inUserLanguage'] ) { |
| 198 | + $this->language = $lang; |
| 199 | + } else { |
| 200 | + $this->language = $wgContLang; |
| 201 | + } |
| 202 | + } |
| 203 | + |
| 204 | + private function msg( $key ) { |
| 205 | + return wfMessage( $key )->inLanguage( $this->language ); |
| 206 | + } |
| 207 | + |
| 208 | + public function isOK() { |
| 209 | + $this->init(); |
| 210 | + return $this->page !== false; |
| 211 | + } |
| 212 | + |
| 213 | + /** |
| 214 | + * Returns language used by the feed |
| 215 | + * @return Language |
| 216 | + */ |
| 217 | + public function getLanguage() { |
| 218 | + return $this->language; |
| 219 | + } |
| 220 | + |
| 221 | + public function init() { |
| 222 | + if ( $this->title !== false ) { |
| 223 | + return; |
| 224 | + } |
| 225 | + $this->title = $this->msg( $this->options['title'] )->text(); |
| 226 | + $this->shortTitle = $this->msg( $this->options['short-title'] ); |
| 227 | + $this->description = $this->msg( $this->options['description'] )->text(); |
| 228 | + $pageMsg = $this->msg( $this->options['page'] )->params( $this->language->getCode() ); |
| 229 | + if ( $pageMsg->isDisabled() ) { |
| 230 | + return; |
| 231 | + } |
| 232 | + $this->page = $pageMsg->plain(); |
| 233 | + $this->entryName = $this->msg( $this->options['entryName'] )->plain(); |
| 234 | + } |
| 235 | + |
| 236 | + public function getFeedItems() { |
| 237 | + $this->init(); |
| 238 | + if ( $this->items === false ) { |
| 239 | + $this->items = array(); |
| 240 | + for ( $i = 1 - $this->options['limit']; $i <= 0; $i++ ) { |
| 241 | + $timestamp = FeaturedFeeds::todaysStart() + $i * 24 * 3600; |
| 242 | + $item = $this->getFeedItem( $timestamp ); |
| 243 | + if ( $item ) { |
| 244 | + $this->items[] = $item; |
| 245 | + } |
| 246 | + } |
| 247 | + } |
| 248 | + return $this->items; |
| 249 | + } |
| 250 | + |
| 251 | + /** |
| 252 | + * |
| 253 | + * @param int $date |
| 254 | + * @return FeaturedFeedItem |
| 255 | + */ |
| 256 | + public function getFeedItem( $date ) { |
| 257 | + self::$parserOptions->setTimestamp( $date ); |
| 258 | + self::$parserOptions->setUserLang( $this->language ); |
| 259 | + |
| 260 | + $titleText = self::$parser->transformMsg( $this->page, self::$parserOptions ); |
| 261 | + $title = Title::newFromText( $titleText ); |
| 262 | + if ( !$title ) { |
| 263 | + return false; |
| 264 | + } |
| 265 | + $rev = Revision::newFromTitle( $title ); |
| 266 | + if ( !$rev ) { |
| 267 | + return false; // page does not exist |
| 268 | + } |
| 269 | + $text = $rev->getText(); |
| 270 | + if ( !$text ) { |
| 271 | + return false; |
| 272 | + } |
| 273 | + $text = self::$parser->parse( $text, $title, self::$parserOptions )->getText(); |
| 274 | + $url = SpecialPage::getTitleFor( 'FeedItem' , |
| 275 | + $this->name . '/' . wfTimestamp( TS_MW, $date ) . '/' . $this->language->getCode() |
| 276 | + )->getFullURL(); |
| 277 | + |
| 278 | + return new FeaturedFeedItem( |
| 279 | + self::$parser->transformMsg( $this->entryName, self::$parserOptions ), |
| 280 | + wfExpandUrl( $url ), |
| 281 | + $text, |
| 282 | + $date |
| 283 | + ); |
| 284 | + } |
| 285 | + |
| 286 | + /** |
| 287 | + * Returns a URL to the feed |
| 288 | + * |
| 289 | + * @param type $format: Feed format, 'rss' or 'atom' |
| 290 | + * @return String |
| 291 | + */ |
| 292 | + public function getURL( $format ) { |
| 293 | + global $wgContLang; |
| 294 | + |
| 295 | + $options = array( |
| 296 | + 'action' => 'featuredfeed', |
| 297 | + 'feed' => $this->name, |
| 298 | + 'feedformat' => $format, |
| 299 | + ); |
| 300 | + if ( $this->options['inUserLanguage'] && $this->language->getCode() != $wgContLang->getCode() ) { |
| 301 | + $options['language'] = $this->language->getCode(); |
| 302 | + } |
| 303 | + return wfScript( 'api' ) . '?' . wfArrayToCGI( $options ); |
| 304 | + } |
| 305 | +} |
| 306 | + |
| 307 | +class FeaturedFeedItem extends FeedItem { |
| 308 | + const CACHE_VERSION = 1; |
| 309 | + |
| 310 | + public function __construct( $title, $url, $text, $date ) { |
| 311 | + parent::__construct( $title, $text, $url, $date ); |
| 312 | + } |
| 313 | + |
| 314 | + public function getRawDate() { |
| 315 | + return $this->date; |
| 316 | + } |
| 317 | + |
| 318 | + public function getRawTitle() { |
| 319 | + return $this->title; |
| 320 | + } |
| 321 | + |
| 322 | + public function getRawUrl() { |
| 323 | + return $this->url; |
| 324 | + } |
| 325 | + |
| 326 | + public function getRawText() { |
| 327 | + return $this->description; |
| 328 | + } |
| 329 | +} |
Property changes on: branches/wmf/1.18wmf1/extensions/FeaturedFeeds/FeaturedFeeds.body.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 330 | + native |
Index: branches/wmf/1.18wmf1/extensions/FeaturedFeeds/SpecialFeedItem.php |
— | — | @@ -0,0 +1,56 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +class SpecialFeedItem extends UnlistedSpecialPage { |
| 5 | + public function __construct() { |
| 6 | + parent::__construct( 'FeedItem' ); |
| 7 | + } |
| 8 | + |
| 9 | + public function execute( $par = '' ) { |
| 10 | + global $wgMemc; |
| 11 | + $this->setHeaders(); |
| 12 | + $out = $this->getOutput(); |
| 13 | + $parts = explode( '/', $par ); |
| 14 | + if ( count( $parts ) != 3 ) { |
| 15 | + $out->showErrorPage( 'error', 'ffeed-no-feed' ); |
| 16 | + return; |
| 17 | + } |
| 18 | + list( $feedName, $date, $langCode ) = $parts; |
| 19 | + $feeds = FeaturedFeeds::getFeeds( $langCode ); |
| 20 | + if ( !isset( $feeds[$feedName] ) ) { |
| 21 | + $out->showErrorPage( 'error', 'ffeed-feed-not-found', array( $feedName ) ); |
| 22 | + return; |
| 23 | + } |
| 24 | + $feed = $feeds[$feedName]; |
| 25 | + $date = FeaturedFeeds::startOfDay( wfTimestamp( TS_UNIX, $date ) ); |
| 26 | + // First, search in the general cache |
| 27 | + foreach ( $feed->getFeedItems() as $item ) { |
| 28 | + if ( $item->getRawDate() == $date ) { |
| 29 | + $this->displayItem( $item ); |
| 30 | + return; |
| 31 | + } |
| 32 | + } |
| 33 | + $key = wfMemcKey( 'featured', $feedName, $date, $feed->getLanguage()->getCode(), |
| 34 | + FeaturedFeedItem::CACHE_VERSION |
| 35 | + ); |
| 36 | + $item = $wgMemc->get( $key ); |
| 37 | + if ( !$item ) { |
| 38 | + $item = $feed->getFeedItem( $date ); |
| 39 | + if ( $item ) { |
| 40 | + $wgMemc->set( $key, $item, 3600 * 24 ); |
| 41 | + } |
| 42 | + } |
| 43 | + if ( $item ) { |
| 44 | + $this->displayItem( $item ); |
| 45 | + } else { |
| 46 | + $out->showErrorPage( 'error', 'ffeed-entry-not-found', |
| 47 | + array( $this->getLanguage()->date( $date ) ) |
| 48 | + ); |
| 49 | + } |
| 50 | + } |
| 51 | + |
| 52 | + private function displayItem( FeaturedFeedItem $item ) { |
| 53 | + $out = $this->getOutput(); |
| 54 | + $out->setPageTitle( $item->getRawTitle() ); |
| 55 | + $out->addHTML( $item->getRawText() ); |
| 56 | + } |
| 57 | +} |
Property changes on: branches/wmf/1.18wmf1/extensions/FeaturedFeeds/SpecialFeedItem.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 58 | + native |
Index: branches/wmf/1.18wmf1/extensions/FeaturedFeeds/FeaturedFeeds.i18n.php |
— | — | @@ -0,0 +1,435 @@ |
| 2 | +<?php |
| 3 | +/** |
| 4 | + * Internationalisation file for FeaturedFeeds extension. |
| 5 | + * |
| 6 | + * @file |
| 7 | + * @ingroup Extensions |
| 8 | + */ |
| 9 | + |
| 10 | +$messages = array(); |
| 11 | + |
| 12 | +/** English |
| 13 | + * @author Max Semenik |
| 14 | + */ |
| 15 | +$messages['en'] = array( |
| 16 | + 'ffeed-desc' => "Adds syndication feeds of wiki's featured content", |
| 17 | + 'ffeed-no-feed' => 'Feed not specified', |
| 18 | + 'ffeed-feed-not-found' => 'Feed $1 not found', |
| 19 | + 'ffeed-entry-not-found' => 'Feed entry for $1 not found', |
| 20 | + 'ffeed-sidebar-section' => 'Featured content feeds', |
| 21 | + |
| 22 | + # Featured Article |
| 23 | + 'ffeed-featured-page' => '', # do not localise |
| 24 | + 'ffeed-featured-title' => '{{SITENAME}} featured articles feed', |
| 25 | + 'ffeed-featured-short-title' => 'Featured articles', |
| 26 | + 'ffeed-featured-desc' => 'Best articles {{SITENAME}} has to offer', |
| 27 | + 'ffeed-featured-entry' => '{{LOCALMONTHNAME}} {{LOCALDAY}} {{SITENAME}} featured article', |
| 28 | + |
| 29 | + # On this day... |
| 30 | + 'ffeed-onthisday-page' => '', # do not localise |
| 31 | + 'ffeed-onthisday-title' => '{{SITENAME}} "On this day..." feed', |
| 32 | + 'ffeed-onthisday-short-title' => 'On this day...', |
| 33 | + 'ffeed-onthisday-desc' => 'Historical events on this day', |
| 34 | + 'ffeed-onthisday-entry' => 'On this day: {{LOCALMONTHNAME}} {{LOCALDAY}}', |
| 35 | + |
| 36 | + # Did You Know? |
| 37 | + 'ffeed-dyk-page' => '', # do not localise |
| 38 | + 'ffeed-dyk-title' => '{{SITENAME}} "Did You Know?" feed', |
| 39 | + 'ffeed-dyk-short-title' => 'Did you know?', |
| 40 | + 'ffeed-dyk-desc' => "From {{SITENAME}}'s newest content", |
| 41 | + 'ffeed-dyk-entry' => 'Did you know?: {{LOCALMONTHNAME}} {{LOCALDAY}}', |
| 42 | + |
| 43 | + // Media Of The Day |
| 44 | + 'ffeed-motd-page' => '', # do not localise |
| 45 | + 'ffeed-motd-title' => '{{SITENAME}} media of the day feed', |
| 46 | + 'ffeed-motd-short-title' => 'Media of the day', |
| 47 | + 'ffeed-motd-desc' => 'Some of the finest media on {{SITENAME}}', |
| 48 | + 'ffeed-motd-entry' => '{{SITENAME}} media of the day for {{LOCALMONTHNAME}} {{LOCALDAY}}', |
| 49 | + |
| 50 | + # Picture Of The Day |
| 51 | + 'ffeed-potd-page' => '', # do not localise |
| 52 | + 'ffeed-potd-title' => '{{SITENAME}} picture of the day feed', |
| 53 | + 'ffeed-potd-short-title' => 'Picture of the day', |
| 54 | + 'ffeed-potd-desc' => 'Some of the finest images on {{SITENAME}}', |
| 55 | + 'ffeed-potd-entry' => '{{SITENAME}} picture of the day for {{LOCALMONTHNAME}} {{LOCALDAY}}', |
| 56 | + |
| 57 | + # Quote of the Day |
| 58 | + 'ffeed-qotd-page' => '', # do not localise |
| 59 | + 'ffeed-qotd-title' => '{{SITENAME}} quote of the day feed', |
| 60 | + 'ffeed-qotd-short-title' => 'Quote of the day', |
| 61 | + 'ffeed-qotd-desc' => 'Some of the finest quotes on {{SITENAME}}', |
| 62 | + 'ffeed-qotd-entry' => '{{SITENAME}} quote of the day for {{LOCALMONTHNAME}} {{LOCALDAY}}', |
| 63 | +); |
| 64 | + |
| 65 | +/** Message documentation (Message documentation) |
| 66 | + * @author Max Semenik |
| 67 | + */ |
| 68 | +$messages['qqq'] = array( |
| 69 | + 'ffeed-desc' => '{{desc}}', |
| 70 | + 'ffeed-feed-not-found' => '$1 is feed name', |
| 71 | + 'ffeed-entry-not-found' => '$1 is date', |
| 72 | + 'ffeed-featured-title' => 'Title of the Featured Articles [[w:web feed|syndication feed]]', |
| 73 | + 'ffeed-featured-desc' => 'Description of the Featured Articles [[w:web feed|syndication feed]]', |
| 74 | + 'ffeed-featured-entry' => "Title of day's entry in the Featured Articles [[w:web feed|syndication feed]]", |
| 75 | + 'ffeed-onthisday-title' => 'Title of the "On this day..." [[w:web feed|syndication feed]]', |
| 76 | + 'ffeed-onthisday-desc' => 'Description of the "On this day..." [[w:web feed|syndication feed]]', |
| 77 | + 'ffeed-onthisday-entry' => 'Title of day\'s entry in the "On this day..." [[w:web feed|syndication feeds]', |
| 78 | + 'ffeed-dyk-title' => 'Title of the "Did you know?" [[w:web feed|syndication feed]]', |
| 79 | + 'ffeed-dyk-desc' => 'Description of the "Did you know?" [[w:web feed|syndication feed]]', |
| 80 | + 'ffeed-dyk-entry' => 'Title of day\'s entry in the "Did you know?" [[w:web feed|syndication feeds]', |
| 81 | + 'ffeed-motd-title' => 'Title of the Media of the Day [[w:web feed|syndication feed]]', |
| 82 | + 'ffeed-motd-desc' => 'Description of the Media of the Day [[w:web feed|syndication feed]]', |
| 83 | + 'ffeed-motd-entry' => "Title of day's entry in the Media of the Day [[w:web feed|syndication feed]]", |
| 84 | + 'ffeed-potd-title' => 'Title of the Picture Of The Day [[w:web feed|syndication feed]]', |
| 85 | + 'ffeed-potd-desc' => 'Description of the Picture Of The Day [[w:web feed|syndication feed]]', |
| 86 | + 'ffeed-potd-entry' => "Title of day's entry in the Media of the Day [[w:web feed|syndication feed]]", |
| 87 | +); |
| 88 | + |
| 89 | +/** Belarusian (Taraškievica orthography) (Беларуская (тарашкевіца)) |
| 90 | + * @author EugeneZelenko |
| 91 | + * @author Jim-by |
| 92 | + * @author Wizardist |
| 93 | + */ |
| 94 | +$messages['be-tarask'] = array( |
| 95 | + 'ffeed-desc' => 'Дадае сындыкаваныя стужкі лепшага зьместу вікі', |
| 96 | + 'ffeed-no-feed' => 'Стужка не пазначаная', |
| 97 | + 'ffeed-feed-not-found' => 'Стужка $1 ня знойдзеная', |
| 98 | + 'ffeed-entry-not-found' => 'Запіс ў стужцы за $1 ня знойдзены', |
| 99 | + 'ffeed-featured-title' => 'Стужка з абранымі артыкуламі {{GRAMMAR:родны|{{SITENAME}}}}', |
| 100 | + 'ffeed-featured-desc' => 'Найлепшыя артыкулы ў {{GRAMMAR:месны|{{SITENAME}}}}', |
| 101 | + 'ffeed-featured-entry' => 'Абраны артыкул {{GRAMMAR:родны|{{SITENAME}}}} за {{LOCALDAY}} {{LOCALMONTHNAMEGEN}}', |
| 102 | + 'ffeed-onthisday-title' => 'Стужка {{GRAMMAR:родны|{{SITENAME}}}} «Гэты дзень у гісторыі»', |
| 103 | + 'ffeed-onthisday-desc' => 'Гістарычныя падзеі, якія адбыліся ў гэты дзень', |
| 104 | + 'ffeed-onthisday-entry' => 'У гэты дзень, {{LOCALDAY}} {{LOCALMONTHNAMEGEN}}', |
| 105 | + 'ffeed-dyk-title' => 'Стужка {{GRAMMAR:родны|{{SITENAME}}}} «Ці ведаеце Вы?»', |
| 106 | + 'ffeed-dyk-desc' => 'З новых артыкулаў {{GRAMMAR:родны|{{SITENAME}}}}', |
| 107 | + 'ffeed-dyk-entry' => 'Ці ведаеце Вы? ({{LOCALDAY}} {{LOCALMONTHNAMEGEN}})', |
| 108 | + 'ffeed-motd-title' => 'Стужка {{GRAMMAR:родны|{{SITENAME}}}} «Цытата дня»', |
| 109 | + 'ffeed-motd-desc' => 'Некаторыя з найлепшых цытатаў у {{GRAMMAR:месны|{{SITENAME}}}}', |
| 110 | + 'ffeed-motd-entry' => 'Цытата дня ў {{GRAMMAR:месны|{{SITENAME}}}} за {{LOCALDAY}} {{LOCALMONTHNAMEGEN}}', |
| 111 | + 'ffeed-potd-title' => 'Стужка {{GRAMMAR:родны|{{SITENAME}}}} «Выява дня»', |
| 112 | + 'ffeed-potd-desc' => 'Некаторыя найлепшыя выявы ў {{GRAMMAR:родны|{{SITENAME}}}}', |
| 113 | + 'ffeed-potd-entry' => 'Выява дня ў {{GRAMMAR:месны|{{SITENAME}}}} за {{LOCALDAY}} {{LOCALMONTHNAMEGEN}}', |
| 114 | +); |
| 115 | + |
| 116 | +/** Breton (Brezhoneg) |
| 117 | + * @author Y-M D |
| 118 | + */ |
| 119 | +$messages['br'] = array( |
| 120 | + 'ffeed-featured-desc' => 'Ar pennadoù wellañ a gaver war {{SITENAME}}', |
| 121 | + 'ffeed-onthisday-title' => '{{SITENAME}} Steudad "An devezh-se..."', |
| 122 | + 'ffeed-onthisday-desc' => 'Darvoudoù istorel evit an devezh-mañ', |
| 123 | + 'ffeed-onthisday-entry' => 'An deiz-se : {{LOCALDAY}} {{LOCALMONTHNAME}}', |
| 124 | + 'ffeed-dyk-title' => '{{SITENAME}} Neudennad "Ha gouzout a rit ?"', |
| 125 | + 'ffeed-dyk-desc' => 'Deus danvez nevesañ {{SITENAME}}', |
| 126 | + 'ffeed-dyk-entry' => 'Ha gouzout a rit ? : {{LOCALDAY}} {{LOCALMONTHNAME}}', |
| 127 | + 'ffeed-motd-title' => '{{SITENAME}} steudad arroudenn an devezh', |
| 128 | + 'ffeed-motd-desc' => 'Un nebeut deus arroudennoù wellañ {{SITENAME}}', |
| 129 | + 'ffeed-motd-entry' => 'Arroudenn an devezh deus {{SITENAME}} evit {{LOCALDAY}} {{LOCALMONTHNAME}}', |
| 130 | + 'ffeed-potd-title' => '{{SITENAME}} steudad skeudenn an devezh', |
| 131 | + 'ffeed-potd-desc' => 'Un nebeut re deus skeudennoù wellañ {{SITENAME}}', |
| 132 | + 'ffeed-potd-entry' => 'Skeudenn an devezh deus {{SITENAME}} evit {{LOCALDAY}} {{LOCALMONTHNAME}}', |
| 133 | +); |
| 134 | + |
| 135 | +/** German (Deutsch) |
| 136 | + * @author Kghbln |
| 137 | + */ |
| 138 | +$messages['de'] = array( |
| 139 | + 'ffeed-desc' => 'Ermöglicht gesonderte Feeds zu bestimmten Inhalten des Wikis', |
| 140 | + 'ffeed-no-feed' => 'Es wurde kein Feed angegeben.', |
| 141 | + 'ffeed-feed-not-found' => 'Feed $1 wurde nicht gefunden.', |
| 142 | + 'ffeed-entry-not-found' => 'Feedeintrag $1 wurde nicht gefunden.', |
| 143 | + 'ffeed-sidebar-section' => 'Feeds zu empfohlenen Inhalten', |
| 144 | + 'ffeed-featured-title' => 'Feeds zu empfohlenen Inhalten auf {{SITENAME}}', |
| 145 | + 'ffeed-featured-short-title' => 'Empfohlene Artikel', |
| 146 | + 'ffeed-featured-desc' => 'Die besten Artikel auf {{SITENAME}}', |
| 147 | + 'ffeed-featured-entry' => 'Am {{LOCALDAY}} {{LOCALMONTHNAME}} auf {{SITENAME}} empfohlener Artikel', |
| 148 | + 'ffeed-onthisday-title' => 'Feed zu „An diesem Tag …“ auf {{SITENAME}}', |
| 149 | + 'ffeed-onthisday-short-title' => 'An diesem Tag …', |
| 150 | + 'ffeed-onthisday-desc' => 'Historische Ereignisse dieses Tages', |
| 151 | + 'ffeed-onthisday-entry' => 'An diesem Tag: {{LOCALDAY}} {{LOCALMONTHNAME}}', |
| 152 | + 'ffeed-dyk-title' => 'Feed zu „Schon gewusst?“ auf {{SITENAME}}', |
| 153 | + 'ffeed-dyk-short-title' => 'Schon gewusst?', |
| 154 | + 'ffeed-dyk-desc' => 'Die neuesten Inhalte auf {{SITENAME}}', |
| 155 | + 'ffeed-dyk-entry' => '„Schon gewusst?“: {{LOCALDAY}} {{LOCALMONTHNAME}}', |
| 156 | + 'ffeed-motd-title' => 'Feed zur Mediendatei Zitat des Tages auf {{SITENAME}}', |
| 157 | + 'ffeed-motd-short-title' => 'Mediendatei des Tages', |
| 158 | + 'ffeed-motd-desc' => 'Einige der besten Mediendateien auf {{SITENAME}}', |
| 159 | + 'ffeed-motd-entry' => 'Mediendatei des Tages am {{LOCALDAY}} {{LOCALMONTHNAME}} auf {{SITENAME}}', |
| 160 | + 'ffeed-potd-title' => 'Feed zum Bild des Tages auf {{SITENAME}}', |
| 161 | + 'ffeed-potd-short-title' => 'Bild des Tages', |
| 162 | + 'ffeed-potd-desc' => 'Einige der besten Bilder auf {{SITENAME}}', |
| 163 | + 'ffeed-potd-entry' => 'Bild des Tages am {{LOCALDAY}} {{LOCALMONTHNAME}} auf {{SITENAME}}', |
| 164 | + 'ffeed-qotd-title' => 'Feed zum Zitat des Tages auf {{SITENAME}}', |
| 165 | + 'ffeed-qotd-short-title' => 'Zitat des Tages', |
| 166 | + 'ffeed-qotd-desc' => 'Einige der besten Zitate auf {{SITENAME}}', |
| 167 | + 'ffeed-qotd-entry' => 'Zitat des Tages am {{LOCALDAY}} {{LOCALMONTHNAME}} auf {{SITENAME}}', |
| 168 | +); |
| 169 | + |
| 170 | +/** Lower Sorbian (Dolnoserbski) |
| 171 | + * @author Michawiki |
| 172 | + */ |
| 173 | +$messages['dsb'] = array( |
| 174 | + 'ffeed-desc' => 'Dodawa syndikaciske kanale wuběrnego wikiwopśimjeśa.', |
| 175 | + 'ffeed-no-feed' => 'Kanal njepódany', |
| 176 | + 'ffeed-feed-not-found' => 'Kanal $1 njenamakany', |
| 177 | + 'ffeed-entry-not-found' => 'Kanalowy zapisk za $1 njenamakany', |
| 178 | + 'ffeed-sidebar-section' => 'Kanale dopóruconych wopśimjeśow', |
| 179 | + 'ffeed-featured-title' => '{{SITENAME}} - kanal wuběrnych nastawkow', |
| 180 | + 'ffeed-featured-short-title' => 'Dopórucone nastawki', |
| 181 | + 'ffeed-featured-desc' => 'Nejlěpše nastawki, kótarež {{SITENAME}} póbitujo', |
| 182 | + 'ffeed-featured-entry' => '{{LOCALDAY}}. {{LOCALMONTHNAMEGEN}} {{SITENAME}} - wuběrny nastawk', |
| 183 | + 'ffeed-onthisday-title' => '{{SITENAME}} - kanal "Toś ten źeń..."', |
| 184 | + 'ffeed-onthisday-short-title' => 'Toś ten źeń...', |
| 185 | + 'ffeed-onthisday-desc' => 'Historiske tšojenja na toś ten źeń', |
| 186 | + 'ffeed-onthisday-entry' => 'Toś ten źeń: {{LOCALDAY}}. {{LOCALMONTHNAMEGEN}}', |
| 187 | + 'ffeed-dyk-title' => '{{SITENAME}} - kanal "Sćo wěželi, až...?"', |
| 188 | + 'ffeed-dyk-short-title' => 'Sy južo wěźeł?', |
| 189 | + 'ffeed-dyk-desc' => 'Nejnowše wopśimjeśe z {{GRAMMAR:genitiw|{{SITENAME}}}}', |
| 190 | + 'ffeed-dyk-entry' => 'Sćo wěźeli, až...?: {{LOCALDAY}}. {{LOCALMONTHNAMEGEN}}', |
| 191 | + 'ffeed-motd-title' => '{{SITENAME}} - kanal citata dnja', |
| 192 | + 'ffeed-motd-short-title' => 'Medium dnja', |
| 193 | + 'ffeed-motd-desc' => 'Někotare z nejlěpšych mediumow na {{GRAMMAR:lokatiw|{{SITENAME}}}}', |
| 194 | + 'ffeed-motd-entry' => '{{SITENAME}} - medium dnja za {{LOCALDAY}}. {{LOCALMONTHNAMEGEN}}', |
| 195 | + 'ffeed-potd-title' => '{{SITENAME}} - kanal wobraz dnja', |
| 196 | + 'ffeed-potd-short-title' => 'Wobraz dnja', |
| 197 | + 'ffeed-potd-desc' => 'Někotare z nejlěpšych wobrazow na {{GRAMMAR:lokatiw|{{SITENAME}}}}', |
| 198 | + 'ffeed-potd-entry' => '{{SITENAME}} - wobraz dnja za {{LOCALDAY}}. {{LOCALMONTHNAMEGEN}}', |
| 199 | + 'ffeed-qotd-title' => 'Kanal citata dnja na {{GRAMMAR:lokatiw|{{SITENAME}}}}', |
| 200 | + 'ffeed-qotd-short-title' => 'Citat dnja', |
| 201 | + 'ffeed-qotd-desc' => 'Někotare z nejlěpšych citatow na {{GRAMMAR:lokatiw|{{SITENAME}}}}', |
| 202 | + 'ffeed-qotd-entry' => '{{SITENAME}} - citat dnja za {{LOCALDAY}}. {{LOCALMONTHNAMEGEN}}', |
| 203 | +); |
| 204 | + |
| 205 | +/** French (Français) |
| 206 | + * @author Gomoko |
| 207 | + * @author Jean-Frédéric |
| 208 | + */ |
| 209 | +$messages['fr'] = array( |
| 210 | + 'ffeed-desc' => 'Ajoute des files de publication du contenu caractéristique du wiki', |
| 211 | + 'ffeed-no-feed' => 'Alimentation non spécifiée', |
| 212 | + 'ffeed-feed-not-found' => 'Alimentation $1 non trouvée', |
| 213 | + 'ffeed-entry-not-found' => "Entrée d'alimentation pour $1 non trouvée", |
| 214 | + 'ffeed-sidebar-section' => 'Alimentations de contenu caractéristique', |
| 215 | + 'ffeed-featured-title' => 'File des articles caractéristiques de {{SITENAME}}', |
| 216 | + 'ffeed-featured-short-title' => 'Articles en vedette', |
| 217 | + 'ffeed-featured-desc' => 'Meilleurs articles que {{SITENAME}} peut offrir', |
| 218 | + 'ffeed-featured-entry' => 'Article vedette de {{SITENAME}} le {{LOCALDAY}} {{LOCALMONTHNAME}}', |
| 219 | + 'ffeed-onthisday-title' => '{{SITENAME}} File «Ce jour-là..."', |
| 220 | + 'ffeed-onthisday-short-title' => 'Ce jour-là...', |
| 221 | + 'ffeed-onthisday-desc' => 'Événements historiques sur cette journée', |
| 222 | + 'ffeed-onthisday-entry' => 'Ce jour-là: {{LOCALDAY}} {{LOCALMONTHNAME}}', |
| 223 | + 'ffeed-dyk-title' => '{{SITENAME}} File "Le savez-vous?"', |
| 224 | + 'ffeed-dyk-short-title' => 'Le saviez-vous?', |
| 225 | + 'ffeed-dyk-desc' => 'Du contenu le plus récent de {{SITENAME}}', |
| 226 | + 'ffeed-dyk-entry' => 'Le saviez-vous?: {{LOCALDAY}} {{LOCALMONTHNAME}}', |
| 227 | + 'ffeed-motd-title' => 'Flux du média du jour de {{SITENAME}}', |
| 228 | + 'ffeed-motd-short-title' => 'Les médias de la journée.', |
| 229 | + 'ffeed-motd-desc' => 'Quelques-uns des meilleurs médias sur {{SITENAME}}', |
| 230 | + 'ffeed-motd-entry' => 'Média du jour de {{SITENAME}} pour {{LOCALDAY}} {{LOCALMONTHNAME}}', |
| 231 | + 'ffeed-potd-title' => '{{SITENAME}} File image du jour', |
| 232 | + 'ffeed-potd-short-title' => 'Image du jour', |
| 233 | + 'ffeed-potd-desc' => 'Quelques-unes des meilleures images de {{SITENAME}}', |
| 234 | + 'ffeed-potd-entry' => 'Image du jour de {{SITENAME}} pour {{LOCALDAY}} {{LOCALMONTHNAME}}', |
| 235 | + 'ffeed-qotd-title' => 'Alimentation de la citation de {{SITENAME}} du jour', |
| 236 | + 'ffeed-qotd-short-title' => 'Citation du jour', |
| 237 | + 'ffeed-qotd-desc' => 'Quelques-unes de meilleurs citations sur {{SITENAME}}', |
| 238 | + 'ffeed-qotd-entry' => 'Citation du jour de {{SITENAME}} pour {{LOCALDAY}} {{LOCALMONTHNAME}}', |
| 239 | +); |
| 240 | + |
| 241 | +/** Galician (Galego) |
| 242 | + * @author Toliño |
| 243 | + */ |
| 244 | +$messages['gl'] = array( |
| 245 | + 'ffeed-desc' => 'Engade fontes de novas dos contidos destacados do wiki', |
| 246 | + 'ffeed-no-feed' => 'Non se especificou a fonte de novas', |
| 247 | + 'ffeed-feed-not-found' => 'Non se atopou a fonte de novas "$1"', |
| 248 | + 'ffeed-entry-not-found' => 'Non se atopou a entrada da fonte de novas do día $1', |
| 249 | + 'ffeed-sidebar-section' => 'Fontes de novas dos contidos destacados', |
| 250 | + 'ffeed-featured-title' => 'Fonte de novas dos artigos destacados de {{SITENAME}}', |
| 251 | + 'ffeed-featured-short-title' => 'Artigos destacados', |
| 252 | + 'ffeed-featured-desc' => 'Os mellores artigos que ofrece {{SITENAME}}', |
| 253 | + 'ffeed-featured-entry' => 'Artigo destacado de {{SITENAME}} o {{LOCALDAY}} de {{LOCALMONTHNAME}}', |
| 254 | + 'ffeed-onthisday-title' => 'Fonte de novas "Tal día como hoxe no ano..." de {{SITENAME}}', |
| 255 | + 'ffeed-onthisday-short-title' => 'Tal día como hoxe no ano...', |
| 256 | + 'ffeed-onthisday-desc' => 'Acontecementos históricos deste día', |
| 257 | + 'ffeed-onthisday-entry' => 'Tal día como hoxe: {{LOCALDAY}} de {{LOCALMONTHNAME}}', |
| 258 | + 'ffeed-dyk-title' => 'Fonte de novas "Sabía que...?" de {{SITENAME}}', |
| 259 | + 'ffeed-dyk-short-title' => 'Sabía que...?', |
| 260 | + 'ffeed-dyk-desc' => 'Dos contidos máis recentes de {{SITENAME}}', |
| 261 | + 'ffeed-dyk-entry' => 'Sabía que...?: {{LOCALDAY}} de {{LOCALMONTHNAME}}', |
| 262 | + 'ffeed-motd-title' => 'Fonte de novas do ficheiro multimedia do día de {{SITENAME}}', |
| 263 | + 'ffeed-motd-short-title' => 'Ficheiro multimedia do día', |
| 264 | + 'ffeed-motd-desc' => 'Un dos mellores ficheiros multimedia de {{SITENAME}}', |
| 265 | + 'ffeed-motd-entry' => 'Ficheiro multimedia do día de {{SITENAME}} o {{LOCALDAY}} de {{LOCALMONTHNAME}}', |
| 266 | + 'ffeed-potd-title' => 'Fonte de novas da imaxe do día de {{SITENAME}}', |
| 267 | + 'ffeed-potd-short-title' => 'Imaxe do día', |
| 268 | + 'ffeed-potd-desc' => 'Unha das mellores imaxes de {{SITENAME}}', |
| 269 | + 'ffeed-potd-entry' => 'Imaxe do día de {{SITENAME}} o {{LOCALDAY}} de {{LOCALMONTHNAME}}', |
| 270 | + 'ffeed-qotd-title' => 'Fonte de novas da cita do día de {{SITENAME}}', |
| 271 | + 'ffeed-qotd-short-title' => 'Cita do día', |
| 272 | + 'ffeed-qotd-desc' => 'Unha das mellores citas de {{SITENAME}}', |
| 273 | + 'ffeed-qotd-entry' => 'Cita do día de {{SITENAME}} o {{LOCALDAY}} de {{LOCALMONTHNAME}}', |
| 274 | +); |
| 275 | + |
| 276 | +/** Upper Sorbian (Hornjoserbsce) |
| 277 | + * @author Michawiki |
| 278 | + */ |
| 279 | +$messages['hsb'] = array( |
| 280 | + 'ffeed-desc' => 'Přidawa syndikaciske kanale wuběrneho wikiwobsaha.', |
| 281 | + 'ffeed-no-feed' => 'Kanal njepodaty', |
| 282 | + 'ffeed-feed-not-found' => 'Kanal $1 njenamakany', |
| 283 | + 'ffeed-entry-not-found' => 'Kanalowy zapisk za $1 njenamakany', |
| 284 | + 'ffeed-sidebar-section' => 'Kanale doporučenych wobsahow', |
| 285 | + 'ffeed-featured-title' => '{{SITENAME}} - kanal wuběrnych nastawkow', |
| 286 | + 'ffeed-featured-short-title' => 'Doporučene nastawki', |
| 287 | + 'ffeed-featured-desc' => 'Najlěpše nastawki, kotrež {{SITENAME}} poskića', |
| 288 | + 'ffeed-featured-entry' => '{{LOCALDAY}}. {{LOCALMONTHNAMEGEN}} {{SITENAME}} wuběrny nastawk', |
| 289 | + 'ffeed-onthisday-title' => '{{SITENAME}} - kanal "Tutón dźeń..."', |
| 290 | + 'ffeed-onthisday-short-title' => 'Tutón dźeń...', |
| 291 | + 'ffeed-onthisday-desc' => 'Historiske podawki na tutón dźeń', |
| 292 | + 'ffeed-onthisday-entry' => 'Tutón dźeń: {{LOCALDAY}}. {{LOCALMONTHNAMEGEN}}', |
| 293 | + 'ffeed-dyk-title' => '{{SITENAME}} - kanal "Wěš ty, zo...?"', |
| 294 | + 'ffeed-dyk-short-title' => 'Sy hižo wědźał?', |
| 295 | + 'ffeed-dyk-desc' => 'Najnowši wobsah z {{GRAMMAR:genitiw|{{SITENAME}}}}', |
| 296 | + 'ffeed-dyk-entry' => 'Wěš ty, zo...?: {{LOCALDAY}}. {{LOCALMONTHNAMEGEN}}', |
| 297 | + 'ffeed-motd-title' => 'Kanal medija dnja na {{GRAMMAR:lokatiw|{{SITENAME}}}}', |
| 298 | + 'ffeed-motd-short-title' => 'Medij dnja', |
| 299 | + 'ffeed-motd-desc' => 'Někotre z najlěpšich medijow na {{GRAMMAR:lokatiw|{{SITENAME}}}}', |
| 300 | + 'ffeed-motd-entry' => '{{SITENAME}} - medij dnja za {{LOCALDAY}}. {{LOCALMONTHNAMEGEN}}', |
| 301 | + 'ffeed-potd-title' => '{{SITENAME}} - kanal wobraz dnja', |
| 302 | + 'ffeed-potd-short-title' => 'Wobraz dnja', |
| 303 | + 'ffeed-potd-desc' => 'Někotre z najlěpšich wobrazow na {{GRAMMAR:lokatiw|{{SITENAME}}}}', |
| 304 | + 'ffeed-potd-entry' => '{{SITENAME}} - wobraz dnja za {{LOCALDAY}}. {{LOCALMONTHNAMEGEN}}', |
| 305 | + 'ffeed-qotd-title' => 'Kanal citata dnja na {{GRAMMAR:lokatiw|{{SITENAME}}}}', |
| 306 | + 'ffeed-qotd-short-title' => 'Citat dnja', |
| 307 | + 'ffeed-qotd-desc' => 'Někotre z najlěpšich citatow na {{GRAMMAR:lokatiw|{{SITENAME}}}}', |
| 308 | + 'ffeed-qotd-entry' => '{{SITENAME}} - medij dnja za {{LOCALDAY}}. {{LOCALMONTHNAMEGEN}}', |
| 309 | +); |
| 310 | + |
| 311 | +/** Interlingua (Interlingua) |
| 312 | + * @author McDutchie |
| 313 | + */ |
| 314 | +$messages['ia'] = array( |
| 315 | + 'ffeed-desc' => 'Adde fluxos de syndication del contento eminente de iste wiki', |
| 316 | + 'ffeed-no-feed' => 'Syndication non specificate', |
| 317 | + 'ffeed-feed-not-found' => 'Syndication $1 non trovate', |
| 318 | + 'ffeed-entry-not-found' => 'Entrata de syndication pro $1 non trovate', |
| 319 | + 'ffeed-sidebar-section' => 'Syndicationes de contento eminente', |
| 320 | + 'ffeed-featured-title' => 'Syndication de articulos eminente de {{SITENAME}}', |
| 321 | + 'ffeed-featured-short-title' => 'Articulos eminente', |
| 322 | + 'ffeed-featured-desc' => 'Le melior articulos que {{SITENAME}} pote offerer', |
| 323 | + 'ffeed-featured-entry' => 'Articulo eminente de {{SITENAME}} le {{LOCALDAY}} de {{LOCALMONTHNAME}}', |
| 324 | + 'ffeed-onthisday-title' => 'Syndication "In iste die..." de {{SITENAME}}', |
| 325 | + 'ffeed-onthisday-short-title' => 'In iste die...', |
| 326 | + 'ffeed-onthisday-desc' => 'Eventos historic in iste die', |
| 327 | + 'ffeed-onthisday-entry' => 'In iste die: le {{LOCALDAY}} de {{LOCALMONTHNAME}}', |
| 328 | + 'ffeed-dyk-title' => 'Syndication "Sapeva tu?" de {{SITENAME}}', |
| 329 | + 'ffeed-dyk-short-title' => 'Sapeva tu?', |
| 330 | + 'ffeed-dyk-desc' => 'Del contento le plus recente de {{SITENAME}}', |
| 331 | + 'ffeed-dyk-entry' => 'Sapeva tu?: le {{LOCALDAY}} de {{LOCALMONTHNAME}}', |
| 332 | + 'ffeed-motd-title' => 'Syndication "Multimedia del die" de {{SITENAME}}', |
| 333 | + 'ffeed-motd-short-title' => 'Multimedia del die', |
| 334 | + 'ffeed-motd-desc' => 'Alcunes del melior materiales in {{SITENAME}}', |
| 335 | + 'ffeed-motd-entry' => 'Material del die de {{SITENAME}} le {{LOCALDAY}} de {{LOCALMONTHNAME}}', |
| 336 | + 'ffeed-potd-title' => 'Syndication "Imagine del die" de {{SITENAME}}', |
| 337 | + 'ffeed-potd-short-title' => 'Imagine del die', |
| 338 | + 'ffeed-potd-desc' => 'Alcunes del melior imagines in {{SITENAME}}', |
| 339 | + 'ffeed-potd-entry' => 'Imagine del die de {{SITENAME}} le {{LOCALDAY}} de {{LOCALMONTHNAME}}', |
| 340 | + 'ffeed-qotd-title' => 'Syndication "Citation del die" de {{SITENAME}}', |
| 341 | + 'ffeed-qotd-short-title' => 'Citation del die', |
| 342 | + 'ffeed-qotd-desc' => 'Alcunes del melior citationes in {{SITENAME}}', |
| 343 | + 'ffeed-qotd-entry' => 'Citation del die de {{SITENAME}} le {{LOCALDAY}} de {{LOCALMONTHNAME}}', |
| 344 | +); |
| 345 | + |
| 346 | +/** Luxembourgish (Lëtzebuergesch) |
| 347 | + * @author Robby |
| 348 | + */ |
| 349 | +$messages['lb'] = array( |
| 350 | + 'ffeed-featured-short-title' => 'Recommandéiert Artikelen', |
| 351 | + 'ffeed-featured-desc' => 'Déi bescht Artikelen déi {{SITENAME}} ze bidden huet', |
| 352 | + 'ffeed-featured-entry' => 'Den {{LOCALDAY}} {{LOCALMONTHNAME}} op {{SITENAME}} ausgezeechenten Artikel', |
| 353 | + 'ffeed-onthisday-short-title' => 'Um Dag vun haut...', |
| 354 | + 'ffeed-onthisday-desc' => 'Historesch Evenementer op dësem Dag', |
| 355 | + 'ffeed-onthisday-entry' => 'Op dësem Dag: {{LOCALMONTHNAME}} {{LOCALDAY}}', |
| 356 | + 'ffeed-dyk-title' => '{{SITENAME}} "Vosst Dir schonn" Feed', |
| 357 | + 'ffeed-dyk-short-title' => 'Wosst Dir?', |
| 358 | + 'ffeed-dyk-desc' => 'De rezensten Inhalt op {{SITENAME}}', |
| 359 | + 'ffeed-dyk-entry' => 'Wosst Dir schonn?: {{LOCALMONTHNAME}} {{LOCALDAY}}', |
| 360 | + 'ffeed-motd-title' => '{{SITENAME}} Feed mam Medie-Fichier vum Dag', |
| 361 | + 'ffeed-motd-desc' => 'E puer vun de beschte Medie-Fichieren op {{SITENAME}}', |
| 362 | + 'ffeed-potd-short-title' => 'Bild vum Dag', |
| 363 | + 'ffeed-potd-desc' => 'E puer vun de beschte Biller op {{SITENAME}}', |
| 364 | + 'ffeed-qotd-short-title' => 'Zitat vum Dag', |
| 365 | +); |
| 366 | + |
| 367 | +/** Macedonian (Македонски) |
| 368 | + * @author Bjankuloski06 |
| 369 | + */ |
| 370 | +$messages['mk'] = array( |
| 371 | + 'ffeed-desc' => 'Додава канали за избрани содржини на викито.', |
| 372 | + 'ffeed-no-feed' => 'Каналот не е укажан', |
| 373 | + 'ffeed-feed-not-found' => 'Каналот $1 не е пронајден', |
| 374 | + 'ffeed-entry-not-found' => 'Каналскиот запис за $1 не е пронајден', |
| 375 | + 'ffeed-sidebar-section' => 'Канали за избрани содржини', |
| 376 | + 'ffeed-featured-title' => 'Канал на избрани статии на {{SITENAME}}', |
| 377 | + 'ffeed-featured-short-title' => 'Избрани статии', |
| 378 | + 'ffeed-featured-desc' => 'Најдобрите статии на {{SITENAME}}', |
| 379 | + 'ffeed-featured-entry' => 'Избрана статија на {{SITENAME}} за {{LOCALDAY}} {{LOCALMONTHNAME}}', |
| 380 | + 'ffeed-onthisday-title' => 'Канал „На денешен ден...“ на {{SITENAME}}', |
| 381 | + 'ffeed-onthisday-short-title' => 'На денешен ден...', |
| 382 | + 'ffeed-onthisday-desc' => 'Историски настани што се случиле на денешен ден', |
| 383 | + 'ffeed-onthisday-entry' => 'На денешен ден: {{LOCALDAY}} {{LOCALMONTHNAME}}', |
| 384 | + 'ffeed-dyk-title' => 'Канал „Дали сте знаеле?“ на {{SITENAME}}', |
| 385 | + 'ffeed-dyk-short-title' => 'Дали сте знаеле?', |
| 386 | + 'ffeed-dyk-desc' => 'Од најновите содржини на {{SITENAME}}', |
| 387 | + 'ffeed-dyk-entry' => 'Дали сте знаеле?: {{LOCALDAY}} {{LOCALMONTHNAME}}', |
| 388 | + 'ffeed-motd-title' => 'Канал за снимка на денот на {{SITENAME}}', |
| 389 | + 'ffeed-motd-short-title' => 'Снимка на денот', |
| 390 | + 'ffeed-motd-desc' => 'Најубавите снимки на {{SITENAME}}', |
| 391 | + 'ffeed-motd-entry' => 'Снимка на денот за {{LOCALDAY}} {{LOCALMONTHNAME}} на {{SITENAME}}', |
| 392 | + 'ffeed-potd-title' => 'Канал за слика на денот на {{SITENAME}}', |
| 393 | + 'ffeed-potd-short-title' => 'Слика на денот', |
| 394 | + 'ffeed-potd-desc' => 'Најдобрите слики на {{SITENAME}}', |
| 395 | + 'ffeed-potd-entry' => 'Слика на денот за {{LOCALDAY}} {{LOCALMONTHNAME}} на {{SITENAME}}', |
| 396 | + 'ffeed-qotd-title' => 'Канал за мисла на денот на {{SITENAME}}', |
| 397 | + 'ffeed-qotd-short-title' => 'Мисла на денот', |
| 398 | + 'ffeed-qotd-desc' => 'Наијнтересните мисли на {{SITENAME}}', |
| 399 | + 'ffeed-qotd-entry' => 'Мисла на денот за {{LOCALDAY}} {{LOCALMONTHNAME}} на {{SITENAME}}', |
| 400 | +); |
| 401 | + |
| 402 | +/** Dutch (Nederlands) |
| 403 | + * @author SPQRobin |
| 404 | + * @author Siebrand |
| 405 | + */ |
| 406 | +$messages['nl'] = array( |
| 407 | + 'ffeed-desc' => 'Voegt feeds toe voor de uitgelichte inhoud van een wiki', |
| 408 | + 'ffeed-no-feed' => 'Er is geen feed opgegeven', |
| 409 | + 'ffeed-feed-not-found' => 'De feed $1 bestaat niet', |
| 410 | + 'ffeed-entry-not-found' => 'De feedvermelding $1 is niet gevonden', |
| 411 | + 'ffeed-featured-title' => 'Feed voor uitgelichte artikelen van {{SITENAME}}', |
| 412 | + 'ffeed-featured-short-title' => 'Uitgelichte artikelen', |
| 413 | + 'ffeed-featured-desc' => 'De beste artikelen van {{SITENAME}}', |
| 414 | + 'ffeed-featured-entry' => 'Uitgelicht artikel van {{SITENAME}} op {{LOCALDAY}} {{LOCALMONTHNAME}}', |
| 415 | + 'ffeed-onthisday-title' => 'Feed voor "Op deze dag..." van {{SITENAME}}', |
| 416 | + 'ffeed-onthisday-short-title' => 'Op deze dag...', |
| 417 | + 'ffeed-onthisday-desc' => 'Historische gebeurtenissen op deze dag', |
| 418 | + 'ffeed-onthisday-entry' => 'Op deze dag: {{LOCALDAY}} {{LOCALMONTHNAME}}', |
| 419 | + 'ffeed-dyk-title' => 'Feed voor "Wist u dat" van {{SITENAME}}', |
| 420 | + 'ffeed-dyk-short-title' => 'Wist u dat?', |
| 421 | + 'ffeed-dyk-desc' => 'De nieuwste inhoud van {{SITENAME}}', |
| 422 | + 'ffeed-dyk-entry' => 'Wist u dat?: {{LOCALDAY}} {{LOCALMONTHNAME}}', |
| 423 | + 'ffeed-motd-title' => 'Feed voor media van de dag van {{SITENAME}}', |
| 424 | + 'ffeed-motd-short-title' => 'Media van de dag', |
| 425 | + 'ffeed-motd-desc' => 'De beste media van {{SITENAME}}', |
| 426 | + 'ffeed-motd-entry' => 'Media van de dag voor van {{LOCALDAY}} {{LOCALMONTHNAME}} van {{SITENAME}}', |
| 427 | + 'ffeed-potd-title' => 'Feed voor afbeelding van de dag van {{SITENAME}}', |
| 428 | + 'ffeed-potd-short-title' => 'Foto van de dag', |
| 429 | + 'ffeed-potd-desc' => 'De beste afbeeldingen van {{SITENAME}}', |
| 430 | + 'ffeed-potd-entry' => 'Afbeelding van de dag voor van {{LOCALDAY}} {{LOCALMONTHNAME}} van {{SITENAME}}', |
| 431 | + 'ffeed-qotd-title' => 'Feed voor uitspraak van de dag van {{SITENAME}}', |
| 432 | + 'ffeed-qotd-short-title' => 'Citaat van de dag', |
| 433 | + 'ffeed-qotd-desc' => 'De beste uitspraken van {{SITENAME}}', |
| 434 | + 'ffeed-qotd-entry' => 'Uitspraak van de dag voor van {{LOCALDAY}} {{LOCALMONTHNAME}} van {{SITENAME}}', |
| 435 | +); |
| 436 | + |
Property changes on: branches/wmf/1.18wmf1/extensions/FeaturedFeeds/FeaturedFeeds.i18n.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 437 | + native |
Index: branches/wmf/1.18wmf1/extensions/FeaturedFeeds/FeaturedFeeds.php |
— | — | @@ -0,0 +1,52 @@ |
| 2 | +<?php |
| 3 | +/* |
| 4 | + * Featured Feed extension by Max Semenik. |
| 5 | + * License: WTFPL 2.0 |
| 6 | + */ |
| 7 | + |
| 8 | +if ( !defined( 'MEDIAWIKI' ) ) { |
| 9 | + die( 'Not a valid entry point' ); |
| 10 | +} |
| 11 | + |
| 12 | + |
| 13 | +$wgExtensionCredits['other'][] = array( |
| 14 | + 'path' => __FILE__, |
| 15 | + 'name' => 'FeaturedFeeds', |
| 16 | + 'author' => array( 'Max Semenik' ), |
| 17 | + 'url' => '//mediawiki.org/wiki/Extension:FeaturedFeeds', |
| 18 | + 'descriptionmsg' => 'ffeed-desc', |
| 19 | +); |
| 20 | + |
| 21 | +$dir = dirname( __FILE__ ); |
| 22 | + |
| 23 | +$wgAutoloadClasses['ApiFeaturedFeeds'] = "$dir/ApiFeaturedFeeds.php"; |
| 24 | +$wgAutoloadClasses['FeaturedFeeds'] = "$dir/FeaturedFeeds.body.php"; |
| 25 | +$wgAutoloadClasses['FeaturedFeedChannel'] = "$dir/FeaturedFeeds.body.php"; |
| 26 | +$wgAutoloadClasses['FeaturedFeedItem'] = "$dir/FeaturedFeeds.body.php"; |
| 27 | +$wgAutoloadClasses['SpecialFeedItem'] = "$dir/SpecialFeedItem.php"; |
| 28 | + |
| 29 | +$wgExtensionMessagesFiles['FeaturedFeeds'] = "$dir/FeaturedFeeds.i18n.php"; |
| 30 | +$wgExtensionMessagesFiles['FeaturedFeedsAliases'] = "$dir/FeaturedFeeds.alias.php"; |
| 31 | + |
| 32 | +$wgSpecialPages['FeedItem'] = 'SpecialFeedItem'; |
| 33 | + |
| 34 | +$wgAPIModules['featuredfeed'] = 'ApiFeaturedFeeds'; |
| 35 | + |
| 36 | +$wgHooks['BeforePageDisplay'][] = 'FeaturedFeeds::beforePageDisplay'; |
| 37 | +$wgHooks['SkinTemplateOutputPageBeforeExec'][] = 'FeaturedFeeds::skinTemplateOutputPageBeforeExec'; |
| 38 | + |
| 39 | +/** |
| 40 | + * Configuration settings |
| 41 | + */ |
| 42 | + |
| 43 | +$wgFeaturedFeedsDefaults = array( |
| 44 | + 'limit' => 10, |
| 45 | + 'inUserLanguage' => false, |
| 46 | +); |
| 47 | + |
| 48 | +$wgFeaturedFeeds = array(); |
| 49 | + |
| 50 | +/** |
| 51 | + * Whether links to feeds should appear in sidebar |
| 52 | + */ |
| 53 | +$wgDisplayFeedsInSidebar = true; |
Property changes on: branches/wmf/1.18wmf1/extensions/FeaturedFeeds/FeaturedFeeds.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 54 | + native |