r110030 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r110029‎ | r110030 | r110031 >
Date:21:39, 25 January 2012
Author:awjrichards
Status:ok
Tags:
Comment:
Copying FeaturedFeeds from trunk for deployment
Modified paths:
  • /branches/wmf/1.18wmf1/extensions/FeaturedFeeds (added) (history)

Diff [purge]

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
116 + 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
1117 + Id
Added: svn:eol-style
2118 + 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
180 + 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
1330 + 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
158 + 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
1437 + 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
154 + native

Follow-up revisions

RevisionCommit summaryAuthorDate
r110058r110030: Enabled on the WMF cluster for all wikisraymond13:50, 26 January 2012

Status & tagging log