https://www.mediawiki.org/wiki/Special:Code/MediaWiki/110207

Revision: 110207
Author:   liangent
Date:     2012-01-28 14:23:26 +0000 (Sat, 28 Jan 2012)
Log Message:
-----------
Do language variant conversion in feeds

Modified Paths:
--------------
    trunk/extensions/FeaturedFeeds/ApiFeaturedFeeds.php
    trunk/extensions/FeaturedFeeds/FeaturedFeeds.body.php
    trunk/extensions/FeaturedFeeds/SpecialFeedItem.php

Modified: trunk/extensions/FeaturedFeeds/ApiFeaturedFeeds.php
===================================================================
--- trunk/extensions/FeaturedFeeds/ApiFeaturedFeeds.php 2012-01-28 12:19:24 UTC 
(rev 110206)
+++ trunk/extensions/FeaturedFeeds/ApiFeaturedFeeds.php 2012-01-28 14:23:26 UTC 
(rev 110207)
@@ -15,6 +15,7 @@
        }
 
        public function execute() {
+               global $wgContLang;
                wfProfileIn( __METHOD__ );
 
                $params = $this->extractRequestParams();
@@ -31,7 +32,12 @@
                        wfProfileOut( __METHOD__ );
                        $this->dieUsage( 'Invalid language code', 
'language-invalid' );
                }
-               $feeds = FeaturedFeeds::getFeeds( $language );
+               $variant = isset( $params['variant'] ) ? $params['variant'] : 
false;
+               if ( $variant !== false && !in_array( $variant, 
$wgContLang->getVariants() ) ) {
+                       wfProfileOut( __METHOD__ );
+                       $this->dieUsage( 'Invalid variant code', 
'variant-invalid' );
+               }
+               $feeds = FeaturedFeeds::getFeeds( $language, $variant );
                $ourFeed = $feeds[$params['feed']];
 
                $feedClass = new $wgFeedClasses[$params['feedformat']] (
@@ -52,7 +58,7 @@
        public function getAllowedParams() {
                global $wgFeedClasses;
                $feedFormatNames = array_keys( $wgFeedClasses );
-               $availableFeeds = array_keys( FeaturedFeeds::getFeeds( false ) 
);
+               $availableFeeds = array_keys( FeaturedFeeds::getFeeds( false, 
false ) );
                return array (
                        'feedformat' => array(
                                ApiBase::PARAM_DFLT => 'rss',
@@ -64,7 +70,10 @@
                        ),
                        'language' => array(
                                ApiBase::PARAM_TYPE => 'string',
-                       )
+                       ),
+                       'variant' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                       ),
                );
        }
 
@@ -72,7 +81,8 @@
                return array(
                        'feedformat' => 'The format of the feed',
                        'feed' => 'Feed name',
-                       'language' => 'Feed language code. Ignored by some 
feeds.'
+                       'language' => 'Feed language code. Ignored by some 
feeds.',
+                       'variant' => 'Feed variant code.',
                );
        }
 
@@ -84,6 +94,7 @@
                return array_merge( parent::getPossibleErrors(), array(
                        array( 'code' => 'feed-invalid', 'info' => 'Invalid 
subscription feed type' ),
                        array( 'code' => 'language-invalid', 'info' => 'Invalid 
language code' ),
+                       array( 'code' => 'variant-invalid', 'info' => 'Invalid 
variant code' ),
                ) );
        }
 
@@ -91,7 +102,7 @@
                global $wgVersion;
                // attempt to find a valid feed name
                // if none available, just use an example value
-               $availableFeeds = array_keys( FeaturedFeeds::getFeeds( false ) 
);
+               $availableFeeds = array_keys( FeaturedFeeds::getFeeds( false, 
false ) );
                $feed = reset( $availableFeeds );
                if ( !$feed ) {
                        $feed = 'featured';

Modified: trunk/extensions/FeaturedFeeds/FeaturedFeeds.body.php
===================================================================
--- trunk/extensions/FeaturedFeeds/FeaturedFeeds.body.php       2012-01-28 
12:19:24 UTC (rev 110206)
+++ trunk/extensions/FeaturedFeeds/FeaturedFeeds.body.php       2012-01-28 
14:23:26 UTC (rev 110207)
@@ -7,27 +7,31 @@
         * Returns the list of feeds
         * 
         * @param $langCode string|bool Code of language to use or false if 
default
+        * @param $variantCode string|bool Code of variant to use or false if 
default or empty string if don't convert
         * @return array Feeds in format of 'name' => array of FeedItem
         */
-       public static function getFeeds( $langCode ) {
-               global $wgMemc, $wgLangCode;
+       public static function getFeeds( $langCode, $variantCode ) {
+               global $wgMemc, $wgLangCode, $wgContLang;
 
                if ( !$langCode || self::allInContentLanguage() ) {
                        $langCode = $wgLangCode;
                }
+               if ( $variantCode === false ) {
+                       $variantCode = $wgContLang->getPreferredVariant();
+               }
                static $cache = array();
-               if ( isset( $cache[$langCode] ) ) {
-                       return $cache[$langCode];
+               if ( isset( $cache[$langCode][$variantCode] ) ) {
+                       return $cache[$langCode][$variantCode];
                }
 
-               $key = self::getCacheKey( $langCode );
+               $key = self::getCacheKey( $langCode, $variantCode );
                $feeds = $wgMemc->get( $key );
                
                if ( !$feeds ) {
-                       $feeds = self::getFeedsInternal( $langCode );
+                       $feeds = self::getFeedsInternal( $langCode, 
$variantCode );
                        $wgMemc->set( $key, $feeds, self::getMaxAge() );
                }
-               $cache[$langCode] = $feeds;
+               $cache[$langCode][$variantCode] = $feeds;
                return $feeds;
        }
 
@@ -36,8 +40,8 @@
         * @param String $langCode: Feed language code
         * @return String
         */
-       private static function getCacheKey( $langCode ) {
-               return wfMemcKey( 'featured-feeds', $langCode );
+       private static function getCacheKey( $langCode, $variantCode ) {
+               return wfMemcKey( 'featured-feeds', $langCode, $variantCode );
        }
 
        /**
@@ -83,9 +87,13 @@
         * @return bool
         */
        public static function beforePageDisplay( OutputPage &$out ) {
-               global $wgAdvertisedFeedTypes;
+               global $wgAdvertisedFeedTypes, $wgContLang;
                if ( $out->getTitle()->isMainPage() ) {
-                       foreach ( self::getFeeds( 
$out->getLanguage()->getCode() ) as $feed ) {
+                       $feeds = self::getFeeds(
+                               $out->getLanguage()->getCode(),
+                               $wgContLang->getPreferredVariant()
+                       );
+                       foreach ( $feeds as $feed ) {
                                foreach ( $wgAdvertisedFeedTypes as $type ) {
                                        $out->addLink( array(
                                                'rel' => 'alternate',
@@ -106,10 +114,13 @@
         * @return Boolean
         */
        public static function skinTemplateOutputPageBeforeExec( &$sk, &$tpl ) {
-               global $wgDisplayFeedsInSidebar, $wgAdvertisedFeedTypes;
+               global $wgDisplayFeedsInSidebar, $wgAdvertisedFeedTypes, 
$wgContLang;
 
                if ( $wgDisplayFeedsInSidebar && 
$sk->getContext()->getTitle()->isMainPage() ) {
-                       $feeds = self::getFeeds( 
$sk->getContext()->getLanguage()->getCode() );
+                       $feeds = self::getFeeds(
+                               $sk->getContext()->getLanguage()->getCode(),
+                               $wgContLang->getPreferredVariant()
+                       );
                        $links = array();
                        $format = $wgAdvertisedFeedTypes[0]; // @fixme:
                        foreach ( $feeds as $feed ) {
@@ -163,7 +174,7 @@
         * @return array
         * @throws MWException
         */
-       private static function getFeedsInternal( $langCode ) {
+       private static function getFeedsInternal( $langCode, $variantCode ) {
                wfProfileIn( __METHOD__ );
                $feedDefs = self::getFeedDefinitions();
                
@@ -171,7 +182,7 @@
                $requestedLang = Language::factory( $langCode );
                $parser = new Parser();
                foreach ( $feedDefs as $name => $opts ) {
-                       $feed = new FeaturedFeedChannel( $name, $opts, 
$requestedLang );
+                       $feed = new FeaturedFeedChannel( $name, $opts, 
$requestedLang, $variantCode );
                        if ( !$feed->isOK() ) {
                                continue;
                        }
@@ -252,7 +263,7 @@
        public $shortTitle;
        public $description;
 
-       public function __construct( $name, $options, $lang ) {
+       public function __construct( $name, $options, $lang, $variant ) {
                global $wgContLang;
                if ( !self::$parserOptions ) {
                        self::$parserOptions = new ParserOptions();
@@ -266,6 +277,7 @@
                } else {
                        $this->language = $wgContLang;
                }
+               $this->variant = $variant;
        }
 
        private function msg( $key ) {
@@ -286,13 +298,19 @@
        }
 
        public function init() {
-               global $wgLanguageCode;
+               global $wgLanguageCode, $wgContLang;
                if ( $this->title !== false ) {
                        return;
                }
                $this->title = $this->msg( $this->options['title'] )->text();
                $this->shortTitle = $this->msg( $this->options['short-title'] );
                $this->description = $this->msg( $this->options['description'] 
)->text();
+               // Convert the messages if the content language has variants.
+               if ( $wgContLang->hasVariants() && $this->variant ) {
+                       $this->title = $wgContLang->mConverter->convertTo( 
$this->title, $this->variant );
+                       $this->shortTitle = $wgContLang->mConverter->convertTo( 
$this->shortTitle, $this->variant );
+                       $this->description = 
$wgContLang->mConverter->convertTo( $this->description, $this->variant );
+               }
                $pageMsg = $this->msg( $this->options['page'] )->params( 
$this->language->getCode() );
                if ( $pageMsg->isDisabled() ) {
                        // fall back manually, messages can be existent but 
empty
@@ -330,6 +348,7 @@
         * @return FeaturedFeedItem
         */
        public function getFeedItem( $date ) {
+               global $wgContLang;
                self::$parserOptions->setTimestamp( $date );
                self::$parserOptions->setUserLang( $this->language );
 
@@ -347,16 +366,20 @@
                        return false;
                }
                $text = self::$parser->parse( $text, $title, 
self::$parserOptions )->getText();
-               $url = SpecialPage::getTitleFor( 'FeedItem' , 
+               $special = SpecialPage::getTitleFor( 'FeedItem' , 
                        $this->name . '/' . wfTimestamp( TS_MW, $date ) . '/' . 
$this->language->getCode()
-               )->getFullURL();
+               );
+               $entry = self::$parser->transformMsg( $this->entryName, 
self::$parserOptions );
+               if ( $wgContLang->hasVariants() && $this->variant ) {
+                       $text = $wgContLang->mConverter->convertTo( $text, 
$this->variant );
+                       $entry = $wgContLang->mConverter->convertTo( $entry, 
$this->variant );
+                       // bug 34010. otherwise variant specified in the second 
argument can be ignored.
+                       $url = $special->getFullURL( array( 'variant' => 
$this->variant ) );
+               } else {
+                       $url = $special->getFullURL();
+               }
 
-               return new FeaturedFeedItem(
-                       self::$parser->transformMsg( $this->entryName, 
self::$parserOptions ),
-                       wfExpandUrl( $url ),
-                       $text,
-                       $date
-               );
+               return new FeaturedFeedItem( $entry, wfExpandUrl( $url ), 
$text, $date );
        }
 
        /**
@@ -376,6 +399,9 @@
                if ( $this->options['inUserLanguage'] && 
$this->language->getCode() != $wgContLang->getCode() ) {
                        $options['language'] = $this->language->getCode();
                }
+               if ( $wgContLang->hasVariants() && $this->variant ) {
+                       $options['variant'] = $this->variant;
+               }
                return wfScript( 'api' ) . '?' . wfArrayToCGI( $options );
        }
 }

Modified: trunk/extensions/FeaturedFeeds/SpecialFeedItem.php
===================================================================
--- trunk/extensions/FeaturedFeeds/SpecialFeedItem.php  2012-01-28 12:19:24 UTC 
(rev 110206)
+++ trunk/extensions/FeaturedFeeds/SpecialFeedItem.php  2012-01-28 14:23:26 UTC 
(rev 110207)
@@ -15,7 +15,7 @@
                        return;
                }
                list( $feedName, $date, $langCode ) = $parts;
-               $feeds = FeaturedFeeds::getFeeds( $langCode );
+               $feeds = FeaturedFeeds::getFeeds( $langCode, '' );
                if ( !isset( $feeds[$feedName] ) ) {
                        $out->showErrorPage( 'error', 'ffeed-feed-not-found', 
array( $feedName ) );
                        return;
@@ -54,8 +54,10 @@
        }
 
        private function displayItem( FeaturedFeedItem $item ) {
+               global $wgContLang;
                $out = $this->getOutput();
-               $out->setPageTitle( $item->getRawTitle() );
+               // The language converter converts page content automatically 
but not page title.
+               $out->setPageTitle( $wgContLang->convert( $item->getRawTitle() 
) );
                $out->addHTML( $item->getRawText() );
        }
 }


_______________________________________________
MediaWiki-CVS mailing list
MediaWiki-CVS@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to