Merge "Make show/hide link in RC individually localizable"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 27 Feb 2014 12:50:05 +0000 (12:50 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 27 Feb 2014 12:50:05 +0000 (12:50 +0000)
1  2 
includes/specials/SpecialRecentchanges.php
languages/messages/MessagesEn.php
languages/messages/MessagesQqq.php
maintenance/language/messages.inc

   *
   * @ingroup SpecialPage
   */
 -class SpecialRecentChanges extends SpecialPage {
 -      var $rcOptions, $rcSubpage;
 -      protected $customFilters;
 -
 -      /**
 -       * The feed format to output as (either 'rss' or 'atom'), or null if no
 -       * feed output was requested
 -       *
 -       * @var string $feedFormat
 -       */
 -      protected $feedFormat;
 +class SpecialRecentChanges extends ChangesListSpecialPage {
  
        public function __construct( $name = 'Recentchanges', $restriction = '' ) {
                parent::__construct( $name, $restriction );
        }
  
 -      public function isIncludable() {
 -              return true;
 +      /**
 +       * Main execution point
 +       *
 +       * @param string $subpage
 +       */
 +      public function execute( $subpage ) {
 +              // 10 seconds server-side caching max
 +              $this->getOutput()->setSquidMaxage( 10 );
 +              // Check if the client has a cached version
 +              $lastmod = $this->checkLastModified( $this->feedFormat );
 +              if ( $lastmod === false ) {
 +                      return;
 +              }
 +
 +              parent::execute( $subpage );
        }
  
        /**
@@@ -55,7 -52,7 +55,7 @@@
         * @return FormOptions
         */
        public function getDefaultOptions() {
 -              $opts = new FormOptions();
 +              $opts = parent::getDefaultOptions();
                $user = $this->getUser();
  
                $opts->add( 'days', $user->getIntOption( 'rcdays' ) );
                $opts->add( 'hidepatrolled', $user->getBoolOption( 'hidepatrolled' ) );
                $opts->add( 'hidemyself', false );
  
 -              $opts->add( 'namespace', '', FormOptions::INTNULL );
 -              $opts->add( 'invert', false );
 -              $opts->add( 'associated', false );
 -
                $opts->add( 'categories', '' );
                $opts->add( 'categories_any', false );
                $opts->add( 'tagfilter', '' );
                return $opts;
        }
  
 -      /**
 -       * Create a FormOptions object with options as specified by the user
 -       *
 -       * @param array $parameters
 -       * @return FormOptions
 -       */
 -      public function setup( $parameters ) {
 -              global $wgFeedLimit;
 -
 -              $opts = $this->getDefaultOptions();
 -              foreach ( $this->getCustomFilters() as $key => $params ) {
 -                      $opts->add( $key, $params['default'] );
 -              }
 -
 -              $opts = $this->fetchOptionsFromRequest( $opts );
 -
 -              // Give precedence to subpage syntax
 -              if ( $parameters !== null ) {
 -                      $this->parseParameters( $parameters, $opts );
 -              }
 -
 -              $opts->validateIntBounds( 'limit', 0, $this->feedFormat ? $wgFeedLimit : 5000 );
 -
 -              return $opts;
 -      }
 -
 -      /**
 -       * Fetch values for a FormOptions object from the WebRequest associated with this instance.
 -       *
 -       * Intended for subclassing, e.g. to add a backwards-compatibility layer.
 -       *
 -       * @param FormOptions $parameters
 -       * @return FormOptions
 -       */
 -      protected function fetchOptionsFromRequest( $opts ) {
 -              $opts->fetchValuesFromRequest( $this->getRequest() );
 -              return $opts;
 -      }
 -
        /**
         * Get custom show/hide filters
         *
        }
  
        /**
 -       * Get the current FormOptions for this request
 -       */
 -      public function getOptions() {
 -              if ( $this->rcOptions === null ) {
 -                      $this->rcOptions = $this->setup( $this->rcSubpage );
 -              }
 -
 -              return $this->rcOptions;
 -      }
 -
 -      /**
 -       * Main execution point
 -       *
 -       * @param string $subpage
 -       */
 -      public function execute( $subpage ) {
 -              $this->rcSubpage = $subpage;
 -              $this->feedFormat = $this->including() ? null : $this->getRequest()->getVal( 'feed' );
 -
 -              # 10 seconds server-side caching max
 -              $this->getOutput()->setSquidMaxage( 10 );
 -              # Check if the client has a cached version
 -              $lastmod = $this->checkLastModified( $this->feedFormat );
 -              if ( $lastmod === false ) {
 -                      return;
 -              }
 -
 -              $opts = $this->getOptions();
 -              $this->setHeaders();
 -              $this->outputHeader();
 -              $this->addModules();
 -
 -              // Fetch results, prepare a batch link existence check query
 -              $conds = $this->buildMainQueryConds( $opts );
 -              $rows = $this->doMainQuery( $conds, $opts );
 -              if ( $rows === false ) {
 -                      if ( !$this->including() ) {
 -                              $this->doHeader( $opts );
 -                      }
 -
 -                      return;
 -              }
 -
 -              if ( !$this->feedFormat ) {
 -                      $batch = new LinkBatch;
 -                      foreach ( $rows as $row ) {
 -                              $batch->add( NS_USER, $row->rc_user_text );
 -                              $batch->add( NS_USER_TALK, $row->rc_user_text );
 -                              $batch->add( $row->rc_namespace, $row->rc_title );
 -                      }
 -                      $batch->execute();
 -              }
 -              if ( $this->feedFormat ) {
 -                      list( $changesFeed, $formatter ) = $this->getFeedObject( $this->feedFormat );
 -                      /** @var ChangesFeed $changesFeed */
 -                      $changesFeed->execute( $formatter, $rows, $lastmod, $opts );
 -              } else {
 -                      $this->webOutput( $rows, $opts );
 -              }
 -
 -              $rows->free();
 -      }
 -
 -      /**
 -       * Return an array with a ChangesFeed object and ChannelFeed object
 -       *
 -       * @param string $feedFormat Feed's format (either 'rss' or 'atom')
 -       * @return array
 -       */
 -      public function getFeedObject( $feedFormat ) {
 -              $changesFeed = new ChangesFeed( $feedFormat, 'rcfeed' );
 -              $formatter = $changesFeed->getFeedObject(
 -                      $this->msg( 'recentchanges' )->inContentLanguage()->text(),
 -                      $this->msg( 'recentchanges-feed-description' )->inContentLanguage()->text(),
 -                      $this->getPageTitle()->getFullURL()
 -              );
 -
 -              return array( $changesFeed, $formatter );
 -      }
 -
 -      /**
 -       * Process $par and put options found if $opts
 -       * Mainly used when including the page
 +       * Process $par and put options found in $opts. Used when including the page.
         *
         * @param string $par
         * @param FormOptions $opts
                }
        }
  
 -      /**
 -       * Get last modified date, for client caching
 -       * Don't use this if we are using the patrol feature, patrol changes don't
 -       * update the timestamp
 -       *
 -       * @param string $feedFormat
 -       * @return string|bool
 -       */
 -      public function checkLastModified( $feedFormat ) {
 -              $dbr = wfGetDB( DB_SLAVE );
 -              $lastmod = $dbr->selectField( 'recentchanges', 'MAX(rc_timestamp)', false, __METHOD__ );
 -              if ( $feedFormat || !$this->getUser()->useRCPatrol() ) {
 -                      if ( $lastmod && $this->getOutput()->checkLastModified( $lastmod ) ) {
 -                              # Client cache fresh and headers sent, nothing more to do.
 -                              return false;
 -                      }
 -              }
 -
 -              return $lastmod;
 +      public function validateOptions( FormOptions $opts ) {
 +              global $wgFeedLimit;
 +              $opts->validateIntBounds( 'limit', 0, $this->feedFormat ? $wgFeedLimit : 5000 );
 +              parent::validateOptions( $opts );
        }
  
        /**
         * @return array
         */
        public function buildMainQueryConds( FormOptions $opts ) {
 -              $dbr = wfGetDB( DB_SLAVE );
 -              $conds = array();
 -
 -              # It makes no sense to hide both anons and logged-in users
 -              # Where this occurs, force anons to be shown
 -              $forcebot = false;
 -              if ( $opts['hideanons'] && $opts['hideliu'] ) {
 -                      # Check if the user wants to show bots only
 -                      if ( $opts['hidebots'] ) {
 -                              $opts['hideanons'] = false;
 -                      } else {
 -                              $forcebot = true;
 -                              $opts['hidebots'] = false;
 -                      }
 -              }
 +              $dbr = $this->getDB();
 +              $conds = parent::buildMainQueryConds( $opts );
  
                // Calculate cutoff
                $cutoff_unixtime = time() - ( $opts['days'] * 86400 );
  
                $conds[] = 'rc_timestamp >= ' . $dbr->addQuotes( $cutoff );
  
 -              $hidePatrol = $this->getUser()->useRCPatrol() && $opts['hidepatrolled'];
 -              $hideLoggedInUsers = $opts['hideliu'] && !$forcebot;
 -              $hideAnonymousUsers = $opts['hideanons'] && !$forcebot;
 -
 -              if ( $opts['hideminor'] ) {
 -                      $conds['rc_minor'] = 0;
 -              }
 -              if ( $opts['hidebots'] ) {
 -                      $conds['rc_bot'] = 0;
 -              }
 -              if ( $hidePatrol ) {
 -                      $conds['rc_patrolled'] = 0;
 -              }
 -              if ( $forcebot ) {
 -                      $conds['rc_bot'] = 1;
 -              }
 -              if ( $hideLoggedInUsers ) {
 -                      $conds[] = 'rc_user = 0';
 -              }
 -              if ( $hideAnonymousUsers ) {
 -                      $conds[] = 'rc_user != 0';
 -              }
 -
 -              if ( $opts['hidemyself'] ) {
 -                      if ( $this->getUser()->getId() ) {
 -                              $conds[] = 'rc_user != ' . $dbr->addQuotes( $this->getUser()->getId() );
 -                      } else {
 -                              $conds[] = 'rc_user_text != ' . $dbr->addQuotes( $this->getUser()->getName() );
 -                      }
 -              }
 -
 -              # Namespace filtering
 -              if ( $opts['namespace'] !== '' ) {
 -                      $selectedNS = $dbr->addQuotes( $opts['namespace'] );
 -                      $operator = $opts['invert'] ? '!=' : '=';
 -                      $boolean = $opts['invert'] ? 'AND' : 'OR';
 -
 -                      # namespace association (bug 2429)
 -                      if ( !$opts['associated'] ) {
 -                              $condition = "rc_namespace $operator $selectedNS";
 -                      } else {
 -                              # Also add the associated namespace
 -                              $associatedNS = $dbr->addQuotes(
 -                                      MWNamespace::getAssociated( $opts['namespace'] )
 -                              );
 -                              $condition = "(rc_namespace $operator $selectedNS "
 -                                      . $boolean
 -                                      . " rc_namespace $operator $associatedNS)";
 -                      }
 -
 -                      $conds[] = $condition;
 -              }
 -
                return $conds;
        }
  
         * @return bool|ResultWrapper Result or false (for Recentchangeslinked only)
         */
        public function doMainQuery( $conds, $opts ) {
 -              $tables = array( 'recentchanges' );
 -              $join_conds = array();
 -              $query_options = array();
 +              global $wgAllowCategorizedRecentChanges;
  
 -              $uid = $this->getUser()->getId();
 -              $dbr = wfGetDB( DB_SLAVE );
 -              $limit = $opts['limit'];
 -              $namespace = $opts['namespace'];
 -              $invert = $opts['invert'];
 -              $associated = $opts['associated'];
 +              $dbr = $this->getDB();
 +              $user = $this->getUser();
  
 +              $tables = array( 'recentchanges' );
                $fields = RecentChange::selectFields();
 +              $query_options = array();
 +              $join_conds = array();
 +
                // JOIN on watchlist for users
 -              if ( $uid && $this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
 +              if ( $user->getId() && $user->isAllowed( 'viewmywatchlist' ) ) {
                        $tables[] = 'watchlist';
                        $fields[] = 'wl_user';
                        $fields[] = 'wl_notificationtimestamp';
                        $join_conds['watchlist'] = array( 'LEFT JOIN', array(
 -                              'wl_user' => $uid,
 +                              'wl_user' => $user->getId(),
                                'wl_title=rc_title',
                                'wl_namespace=rc_namespace'
                        ) );
                }
 -              if ( $this->getUser()->isAllowed( 'rollback' ) ) {
 +
 +              if ( $user->isAllowed( 'rollback' ) ) {
                        $tables[] = 'page';
                        $fields[] = 'page_latest';
                        $join_conds['page'] = array( 'LEFT JOIN', 'rc_cur_id=page_id' );
                }
 -              // Tag stuff.
 +
                ChangeTags::modifyDisplayQuery(
                        $tables,
                        $fields,
  
                // rc_new is not an ENUM, but adding a redundant rc_new IN (0,1) gives mysql enough
                // knowledge to use an index merge if it wants (it may use some other index though).
 -              return $dbr->select(
 +              $rows = $dbr->select(
                        $tables,
                        $fields,
                        $conds + array( 'rc_new' => array( 0, 1 ) ),
                        __METHOD__,
 -                      array( 'ORDER BY' => 'rc_timestamp DESC', 'LIMIT' => $limit ) + $query_options,
 +                      array( 'ORDER BY' => 'rc_timestamp DESC', 'LIMIT' => $opts['limit'] ) + $query_options,
                        $join_conds
                );
 +
 +              // Build the final data
 +              if ( $wgAllowCategorizedRecentChanges ) {
 +                      $this->filterByCategories( $rows, $opts );
 +              }
 +
 +              return $rows;
        }
  
        /**
 -       * Send output to the OutputPage object, only called if not used feeds
 +       * Output feed links.
 +       */
 +      public function outputFeedLinks() {
 +              $feedQuery = $this->getFeedQuery();
 +              if ( $feedQuery !== '' ) {
 +                      $this->getOutput()->setFeedAppendQuery( $feedQuery );
 +              } else {
 +                      $this->getOutput()->setFeedAppendQuery( false );
 +              }
 +      }
 +
 +      /**
 +       * Build and output the actual changes list.
         *
         * @param array $rows Database rows
         * @param FormOptions $opts
         */
 -      public function webOutput( $rows, $opts ) {
 -              global $wgRCShowWatchingUsers, $wgShowUpdatedMarker, $wgAllowCategorizedRecentChanges;
 -
 -              // Build the final data
 -
 -              if ( $wgAllowCategorizedRecentChanges ) {
 -                      $this->filterByCategories( $rows, $opts );
 -              }
 +      public function outputChangesList( $rows, $opts ) {
 +              global $wgRCShowWatchingUsers, $wgShowUpdatedMarker;
  
                $limit = $opts['limit'];
  
                $showWatcherCount = $wgRCShowWatchingUsers && $this->getUser()->getOption( 'shownumberswatching' );
                $watcherCache = array();
  
 -              $dbr = wfGetDB( DB_SLAVE );
 +              $dbr = $this->getDB();
  
                $counter = 1;
                $list = ChangesList::newFromContext( $this->getContext() );
                }
                $rclistOutput .= $list->endRecentChangesList();
  
 -              // Print things out
 -
 -              if ( !$this->including() ) {
 -                      // Output options box
 -                      $this->doHeader( $opts );
 -              }
 -
 -              // And now for the content
 -              $feedQuery = $this->getFeedQuery();
 -              if ( $feedQuery !== '' ) {
 -                      $this->getOutput()->setFeedAppendQuery( $feedQuery );
 -              } else {
 -                      $this->getOutput()->setFeedAppendQuery( false );
 -              }
 -
                if ( $rows->numRows() === 0 ) {
                        $this->getOutput()->addHtml(
                                '<div class="mw-changeslist-empty">' . $this->msg( 'recentchanges-noresult' )->parse() . '</div>'
                }
        }
  
 -      /**
 -       * Get the query string to append to feed link URLs.
 -       *
 -       * @return string
 -       */
 -      public function getFeedQuery() {
 -              global $wgFeedLimit;
 -
 -              $this->getOptions()->validateIntBounds( 'limit', 0, $wgFeedLimit );
 -              $options = $this->getOptions()->getChangedValues();
 -
 -              // wfArrayToCgi() omits options set to null or false
 -              foreach ( $options as &$value ) {
 -                      if ( $value === false ) {
 -                              $value = '0';
 -                      }
 -              }
 -              unset( $value );
 -
 -              return wfArrayToCgi( $options );
 -      }
 -
        /**
         * Return the text to be displayed above the changes
         *
                $this->setBottomText( $opts );
        }
  
 +      /**
 +       * Send the text to be displayed above the options
 +       *
 +       * @param FormOptions $opts Unused
 +       */
 +      function setTopText( FormOptions $opts ) {
 +              global $wgContLang;
 +
 +              $message = $this->msg( 'recentchangestext' )->inContentLanguage();
 +              if ( !$message->isDisabled() ) {
 +                      $this->getOutput()->addWikiText(
 +                              Html::rawElement( 'p',
 +                                      array( 'lang' => $wgContLang->getCode(), 'dir' => $wgContLang->getDir() ),
 +                                      "\n" . $message->plain() . "\n"
 +                              ),
 +                              /* $lineStart */ false,
 +                              /* $interface */ false
 +                      );
 +              }
 +      }
 +
        /**
         * Get options to be displayed in a form
         *
        }
  
        /**
 -       * Return the legend displayed within the fieldset.
 -       *
 -       * This method is also called from SpecialWatchlist.
 +       * Add page-specific modules.
 +       */
 +      protected function addModules() {
 +              parent::addModules();
 +              $out = $this->getOutput();
 +              $out->addModules( 'mediawiki.special.recentchanges' );
 +      }
 +
 +      /**
 +       * Get last modified date, for client caching
 +       * Don't use this if we are using the patrol feature, patrol changes don't
 +       * update the timestamp
         *
 -       * @param $context the object available as $this in non-static functions
 -       * @return string
 +       * @param string $feedFormat
 +       * @return string|bool
         */
 -      public static function makeLegend( IContextSource $context ) {
 -              global $wgRecentChangesFlags;
 -              $user = $context->getUser();
 -              # The legend showing what the letters and stuff mean
 -              $legend = Xml::openElement( 'dl' ) . "\n";
 -              # Iterates through them and gets the messages for both letter and tooltip
 -              $legendItems = $wgRecentChangesFlags;
 -              if ( !$user->useRCPatrol() ) {
 -                      unset( $legendItems['unpatrolled'] );
 -              }
 -              foreach ( $legendItems as $key => $legendInfo ) { # generate items of the legend
 -                      $label = $legendInfo['title'];
 -                      $letter = $legendInfo['letter'];
 -                      $cssClass = isset( $legendInfo['class'] ) ? $legendInfo['class'] : $key;
 -
 -                      $legend .= Xml::element( 'dt',
 -                              array( 'class' => $cssClass ), $context->msg( $letter )->text()
 -                      ) . "\n";
 -                      if ( $key === 'newpage' ) {
 -                              $legend .= Xml::openElement( 'dd' );
 -                              $legend .= $context->msg( $label )->escaped();
 -                              $legend .= ' ' . $context->msg( 'recentchanges-legend-newpage' )->parse();
 -                              $legend .= Xml::closeElement( 'dd' ) . "\n";
 -                      } else {
 -                              $legend .= Xml::element( 'dd', array(),
 -                                      $context->msg( $label )->text()
 -                              ) . "\n";
 +      public function checkLastModified( $feedFormat ) {
 +              $dbr = $this->getDB();
 +              $lastmod = $dbr->selectField( 'recentchanges', 'MAX(rc_timestamp)', false, __METHOD__ );
 +              if ( $feedFormat || !$this->getUser()->useRCPatrol() ) {
 +                      if ( $lastmod && $this->getOutput()->checkLastModified( $lastmod ) ) {
 +                              # Client cache fresh and headers sent, nothing more to do.
 +                              return false;
                        }
                }
 -              # (+-123)
 -              $legend .= Xml::tags( 'dt',
 -                      array( 'class' => 'mw-plusminus-pos' ),
 -                      $context->msg( 'recentchanges-legend-plusminus' )->parse()
 -              ) . "\n";
 -              $legend .= Xml::element(
 -                      'dd',
 -                      array( 'class' => 'mw-changeslist-legend-plusminus' ),
 -                      $context->msg( 'recentchanges-label-plusminus' )->text()
 -              ) . "\n";
 -              $legend .= Xml::closeElement( 'dl' ) . "\n";
 -
 -              # Collapsibility
 -              $legend =
 -                      '<div class="mw-changeslist-legend">' .
 -                              $context->msg( 'recentchanges-legend-heading' )->parse() .
 -                              '<div class="mw-collapsible-content">' . $legend . '</div>' .
 -                      '</div>';
 -
 -              return $legend;
 +
 +              return $lastmod;
        }
  
        /**
 -       * Send the text to be displayed above the options
 +       * Return an array with a ChangesFeed object and ChannelFeed object.
         *
 -       * @param FormOptions $opts Unused
 +       * @param string $feedFormat Feed's format (either 'rss' or 'atom')
 +       * @return array
         */
 -      function setTopText( FormOptions $opts ) {
 -              global $wgContLang;
 +      public function getFeedObject( $feedFormat ) {
 +              $changesFeed = new ChangesFeed( $feedFormat, 'rcfeed' );
 +              $formatter = $changesFeed->getFeedObject(
 +                      $this->msg( 'recentchanges' )->inContentLanguage()->text(),
 +                      $this->msg( 'recentchanges-feed-description' )->inContentLanguage()->text(),
 +                      $this->getPageTitle()->getFullURL()
 +              );
  
 -              $message = $this->msg( 'recentchangestext' )->inContentLanguage();
 -              if ( !$message->isDisabled() ) {
 -                      $this->getOutput()->addWikiText(
 -                              Html::rawElement( 'p',
 -                                      array( 'lang' => $wgContLang->getCode(), 'dir' => $wgContLang->getDir() ),
 -                                      "\n" . $message->plain() . "\n"
 -                              ),
 -                              /* $lineStart */ false,
 -                              /* $interface */ false
 -                      );
 -              }
 +              return array( $changesFeed, $formatter );
        }
  
        /**
 -       * Send the text to be displayed after the options, for use in subclasses.
 +       * Get the query string to append to feed link URLs.
         *
 -       * @param FormOptions $opts
 +       * @return string
         */
 -      function setBottomText( FormOptions $opts ) {
 +      public function getFeedQuery() {
 +              global $wgFeedLimit;
 +
 +              $options = $this->getOptions()->getChangedValues();
 +
 +              // wfArrayToCgi() omits options set to null or false
 +              foreach ( $options as &$value ) {
 +                      if ( $value === false ) {
 +                              $value = '0';
 +                      }
 +              }
 +              unset( $value );
 +
 +              if ( isset( $options['limit'] ) && $options['limit'] > $wgFeedLimit ) {
 +                      $options['limit'] = $wgFeedLimit;
 +              }
 +
 +              return wfArrayToCgi( $options );
        }
  
        /**
        /**
         * Filter $rows by categories set in $opts
         *
 -       * @param array $rows Database rows
 +       * @param ResultWrapper $rows Database rows
         * @param FormOptions $opts
         */
        function filterByCategories( &$rows, FormOptions $opts ) {
                $dl = $lang->pipeList( $dl );
  
                // show/hide links
-               $showhide = array( $this->msg( 'show' )->text(), $this->msg( 'hide' )->text() );
                $filters = array(
                        'hideminor' => 'rcshowhideminor',
                        'hidebots' => 'rcshowhidebots',
                        'hideliu' => 'rcshowhideliu',
                        'hidepatrolled' => 'rcshowhidepatr',
                        'hidemyself' => 'rcshowhidemine'
-               );
+                 );
+               // The following messages are also used as the link text itself:
+               // rcshowhideminor-show, rcshowhideminor-hide,
+               // rcshowhidebots-show, rcshowhideminor-hide,
+               // rcshowhideanons-show, rcshowhideanons-hide,
+               // rcshowhidepatr-show, rcshowhidepatr-hide,
+               // rcshowhidemine-show, rcshowhidemine-hide.
+               $showhide = array( 'show', 'hide' );
                foreach ( $this->getCustomFilters() as $key => $params ) {
                        $filters[$key] = $params['msg'];
                }
  
                $links = array();
                foreach ( $filters as $key => $msg ) {
-                       $link = $this->makeOptionsLink( $showhide[1 - $options[$key]],
+                       $link = $this->makeOptionsLink( $this->msg( $msg . '-' . $showhide[1 - $options[$key]] ),
                                array( $key => 1 - $options[$key] ), $nondefaults );
                        $links[] = $this->msg( $msg )->rawParams( $link )->escaped();
                }
                return "{$note}$rclinks<br />$rclistfrom";
        }
  
 -      /**
 -       * Add page-specific modules.
 -       */
 -      protected function addModules() {
 -              $out = $this->getOutput();
 -              $out->addModules( 'mediawiki.special.recentchanges' );
 -              // This modules include styles and behavior for the legend box, load it unconditionally
 -              $out->addModuleStyles( 'mediawiki.special.changeslist' );
 -              $out->addModules( 'mediawiki.special.changeslist.js' );
 -      }
 -
 -      protected function getGroupName() {
 -              return 'changes';
 +      public function isIncludable() {
 +              return true;
        }
  }
@@@ -404,7 -404,6 +404,7 @@@ $specialPageAliases = array
        'CreateAccount'             => array( 'CreateAccount' ),
        'Deadendpages'              => array( 'DeadendPages' ),
        'DeletedContributions'      => array( 'DeletedContributions' ),
 +      'Diff'                      => array( 'Diff' ),
        'DoubleRedirects'           => array( 'DoubleRedirects' ),
        'EditWatchlist'             => array( 'EditWatchlist' ),
        'Emailuser'                 => array( 'EmailUser' ),
@@@ -659,6 -658,7 +659,6 @@@ future releases. Also note that since e
  
  # User preference toggles
  'tog-underline'               => 'Link underlining:',
 -'tog-justify'                 => 'Justify paragraphs',
  'tog-hideminor'               => 'Hide minor edits in recent changes',
  'tog-hidepatrolled'           => 'Hide patrolled edits in recent changes',
  'tog-newpageshidepatrolled'   => 'Hide patrolled pages from new page list',
  'tog-numberheadings'          => 'Auto-number headings',
  'tog-showtoolbar'             => 'Show edit toolbar',
  'tog-editondblclick'          => 'Edit pages on double click',
 -'tog-editsection'             => 'Enable section editing via [edit] links',
  'tog-editsectiononrightclick' => 'Enable section editing by right clicking on section titles',
 -'tog-showtoc'                 => 'Show table of contents (for pages with more than 3 headings)',
  'tog-rememberpassword'        => 'Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})',
  'tog-watchcreations'          => 'Add pages I create and files I upload to my watchlist',
  'tog-watchdefault'            => 'Add pages and files I edit to my watchlist',
  'category_header'                => 'Pages in category "$1"',
  'subcategories'                  => 'Subcategories',
  'category-media-header'          => 'Media in category "$1"',
 -'category-empty'                 => "''This category currently contains no pages or media.''",
 +'category-empty'                 => '<em>This category currently contains no pages or media.</em>',
  'hidden-categories'              => '{{PLURAL:$1|Hidden category|Hidden categories}}',
  'hidden-category-category'       => 'Hidden categories',
  'category-subcat-count'          => '{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}',
  'vector-action-protect'          => 'Protect',
  'vector-action-undelete'         => 'Undelete',
  'vector-action-unprotect'        => 'Change protection',
 -'vector-simplesearch-preference' => 'Enable simplified search bar (Vector skin only)',
  'vector-view-create'             => 'Create',
  'vector-view-edit'               => 'Edit',
  'vector-view-history'            => 'View history',
@@@ -1006,7 -1009,7 +1006,7 @@@ This may indicate a bug in the software
  'databaseerror-query'           => 'Query: $1',
  'databaseerror-function'        => 'Function: $1',
  'databaseerror-error'           => 'Error: $1',
 -'laggedslavemode'               => "'''Warning:''' Page may not contain recent updates.",
 +'laggedslavemode'               => '<strong>Warning:</strong> Page may not contain recent updates.',
  'readonly'                      => 'Database locked',
  'enterlockreason'               => 'Enter a reason for the lock, including an estimate of when the lock will be released',
  'readonlytext'                  => 'The database is currently locked to new entries and other modifications, probably for routine database maintenance, after which it will be back to normal.
@@@ -1054,15 -1057,15 +1054,15 @@@ Data here will not presently be refresh
  Please try again in a few minutes.',
  'protectedpagetext'             => 'This page has been protected to prevent editing or other actions.',
  'viewsourcetext'                => 'You can view and copy the source of this page:',
 -'viewyourtext'                  => "You can view and copy the source of '''your edits''' to this page:",
 +'viewyourtext'                  => 'You can view and copy the source of <strong>your edits</strong> to this page:',
  'protectedinterface'            => 'This page provides interface text for the software on this wiki, and is protected to prevent abuse.
  To add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.',
 -'editinginterface'              => "'''Warning:''' You are editing a page that is used to provide interface text for the software.
 +'editinginterface'              => '<strong>Warning:</strong> You are editing a page that is used to provide interface text for the software.
  Changes to this page will affect the appearance of the user interface for other users on this wiki.
 -To add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
 +To add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.',
  'cascadeprotected'              => 'This page has been protected from editing because it is included in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the "cascading" option turned on:
  $2',
 -'namespaceprotected'            => "You do not have permission to edit pages in the '''$1''' namespace.",
 +'namespaceprotected'            => "You do not have permission to edit pages in the <strong>$1</strong> namespace.",
  'customcssprotected'            => "You do not have permission to edit this CSS page because it contains another user's personal settings.",
  'customjsprotected'             => "You do not have permission to edit this JavaScript page because it contains another user's personal settings.",
  'mycustomcssprotected'          => 'You do not have permission to edit this CSS page.',
  'mypreferencesprotected'        => 'You do not have permission to edit your preferences.',
  'ns-specialprotected'           => 'Special pages cannot be edited.',
  'titleprotected'                => 'This title has been protected from creation by [[User:$1|$1]].
 -The reason given is "\'\'$2\'\'".',
 +The reason given is "<em>$2</em>".',
  'filereadonlyerror'             => 'Unable to modify the file "$1" because the file repository "$2" is in read-only mode.
  
  The administrator who locked it offered this explanation: "$3".',
  'exception-nologin-text-manual' => 'Please $1 to be able to access this page or action.',
  
  # Virus scanner
 -'virus-badscanner'     => "Bad configuration: Unknown virus scanner: ''$1''",
 +'virus-badscanner'     => "Bad configuration: Unknown virus scanner: <em>$1</em>",
  'virus-scanfailed'     => 'scan failed (code $1)',
  'virus-unknownscanner' => 'unknown antivirus:',
  
  # Login and logout pages
 -'logouttext'                      => "'''You are now logged out.'''
 +'logouttext'                      => "<strong>You are now logged out.</strong>
  
  Note that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
  'welcomeuser'                     => 'Welcome, $1!',
@@@ -1178,7 -1181,7 +1178,7 @@@ Ensure you have cookies enabled, reloa
  'nocookiesforlogin'               => '{{int:nocookieslogin}}', # only translate this message to other languages if you have to change it
  'noname'                          => 'You have not specified a valid username.',
  'loginsuccesstitle'               => 'Login successful',
 -'loginsuccess'                    => "'''You are now logged in to {{SITENAME}} as \"\$1\".'''",
 +'loginsuccess'                    => "<strong>You are now logged in to {{SITENAME}} as \"\$1\".</strong>",
  'nosuchuser'                      => 'There is no user by the name "$1".
  Usernames are case sensitive.
  Check your spelling, or [[Special:UserLogin/signup|create a new account]].',
@@@ -1254,9 -1257,6 +1254,9 @@@ Please wait $1 before trying again.'
  'suspicious-userlogout'           => 'Your request to log out was denied because it looks like it was sent by a broken browser or caching proxy.',
  'createacct-another-realname-tip' => 'Real name is optional.
  If you choose to provide it, this will be used for giving the user attribution for their work.',
 +'pt-createaccount'                => 'Create account',
 +'pt-login'                        => 'Log in',
 +'pt-userlogout'                   => 'Log out',
  
  # Email sending
  'pear-mail-error'        => '$1', # do not translate or duplicate this message to other languages
  # Change password dialog
  'changepassword'            => 'Change password',
  'changepassword-summary'    => '', # do not translate or duplicate this message to other languages
 -'resetpass_announce'        => 'You logged in with a temporary emailed code.
 -To finish logging in, you must set a new password here:',
 +'changepassword-throttled'  => 'You have made too many recent login attempts.
 +Please wait $1 before trying again.',
 +'resetpass_announce'        => 'To finish logging in, you must set a new password.',
  'resetpass_text'            => '<!-- Add text here -->', # only translate this message to other languages if you have to change it
  'resetpass_header'          => 'Change account password',
  'oldpassword'               => 'Old password:',
  'resetpass-submit-cancel'   => 'Cancel',
  'resetpass-wrong-oldpass'   => 'Invalid temporary or current password.
  You may have already successfully changed your password or requested a new temporary password.',
 +'resetpass-recycled'        => 'Please reset your password to something other than your current password.',
 +'resetpass-temp-emailed'    => 'You logged in with a temporary emailed code.
 +To finish logging in, you must set a new password here:',
  'resetpass-temp-password'   => 'Temporary password:',
  'resetpass-abort-generic'   => 'Password change has been aborted by an extension.',
 +'resetpass-expired' => 'Your password has expired. Please set a new password to login.',
 +'resetpass-expired-soft' => 'Your password has expired, and needs to be reset. Please choose a new password now, or click cancel to reset it later.',
  
  # Special:PasswordReset
  'passwordreset'                    => 'Reset password',
@@@ -1344,8 -1338,6 +1344,8 @@@ Temporary password: $2'
  'changeemail-password' => 'Your {{SITENAME}} password:',
  'changeemail-submit'   => 'Change email',
  'changeemail-cancel'   => 'Cancel',
 +'changeemail-throttled' => 'You have made too many login attempts.
 +Please wait $1 before trying again.',
  
  # Special:ResetTokens
  'resettokens'                 => 'Reset tokens',
@@@ -1391,21 -1383,21 +1391,21 @@@ You should do it if you accidentally sh
  'showpreview'                      => 'Show preview',
  'showlivepreview'                  => 'Live preview',
  'showdiff'                         => 'Show changes',
 -'anoneditwarning'                  => "'''Warning:''' You are not logged in.
 +'anoneditwarning'                  => "<strong>Warning:</strong> You are not logged in.
  Your IP address will be recorded in this page's edit history.",
 -'anonpreviewwarning'               => "''You are not logged in. Saving will record your IP address in this page's edit history.''",
 -'missingsummary'                   => "'''Reminder:''' You have not provided an edit summary.
 +'anonpreviewwarning'               => "<em>You are not logged in. Saving will record your IP address in this page's edit history.</em>",
 +'missingsummary'                   => "<strong>Reminder:</strong> You have not provided an edit summary.
  If you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
  'missingcommenttext'               => 'Please enter a comment below.',
 -'missingcommentheader'             => "'''Reminder:''' You have not provided a subject/headline for this comment.
 +'missingcommentheader'             => "<strong>Reminder:</strong> You have not provided a subject/headline for this comment.
  If you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
  'summary-preview'                  => 'Summary preview:',
  'subject-preview'                  => 'Subject/headline preview:',
  'blockedtitle'                     => 'User is blocked',
 -'blockedtext'                      => "'''Your username or IP address has been blocked.'''
 +'blockedtext'                      => "<strong>Your username or IP address has been blocked.</strong>
  
  The block was made by $1.
 -The reason given is ''$2''.
 +The reason given is <em>$2</em>.
  
  * Start of block: $8
  * Expiry of block: $6
@@@ -1418,7 -1410,7 +1418,7 @@@ Please include all above details in an
  'autoblockedtext'                  => "Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.
  The reason given is:
  
 -:''$2''
 +:<em>$2</em>
  
  * Start of block: $8
  * Expiry of block: $6
@@@ -1441,15 -1433,15 +1441,15 @@@ It may have been moved or deleted whil
  'loginreqlink'                     => 'log in',
  'loginreqpagetext'                 => 'Please $1 to view other pages.',
  'accmailtitle'                     => 'Password sent',
 -'accmailtext'                      => "A randomly generated password for [[User talk:$1|$1]] has been sent to $2. It can be changed on the ''[[Special:ChangePassword|change password]]'' page upon logging in.",
 +'accmailtext'                      => "A randomly generated password for [[User talk:$1|$1]] has been sent to $2. It can be changed on the <em>[[Special:ChangePassword|change password]]</em> page upon logging in.",
  'newarticle'                       => '(New)',
  'newarticletext'                   => "You have followed a link to a page that does not exist yet.
  To create the page, start typing in the box below (see the [[{{MediaWiki:Helppage}}|help page]] for more info).
 -If you are here by mistake, click your browser's '''back''' button.",
 +If you are here by mistake, click your browser's <strong>back</strong> button.",
  'newarticletextanon'               => '{{int:newarticletext}}', # do not translate or duplicate this message to other languages
  'talkpagetext'                     => '<!-- MediaWiki:talkpagetext -->', # do not translate or duplicate this message to other languages
  'anontalkpagetext'                 => "----
 -''This is the discussion page for an anonymous user who has not created an account yet, or who does not use it.''
 +<em>This is the discussion page for an anonymous user who has not created an account yet, or who does not use it.</em>
  We therefore have to use the numerical IP address to identify him/her.
  Such an IP address can be shared by several users.
  If you are an anonymous user and feel that irrelevant comments have been directed at you, please [[Special:UserLogin/signup|create an account]] or [[Special:UserLogin|log in]] to avoid future confusion with other anonymous users.",
@@@ -1469,42 -1461,42 +1469,42 @@@ Please check if you want to create/edi
  'userpage-userdoesnotexist-view'   => 'User account "$1" is not registered.',
  'blocked-notice-logextract'        => 'This user is currently blocked.
  The latest block log entry is provided below for reference:',
 -'clearyourcache'                   => "'''Note:''' After saving, you may have to bypass your browser's cache to see the changes.
 -* '''Firefox / Safari:''' Hold ''Shift'' while clicking ''Reload'', or press either ''Ctrl-F5'' or ''Ctrl-R'' (''⌘-R'' on a Mac)
 -* '''Google Chrome:''' Press ''Ctrl-Shift-R'' (''⌘-Shift-R'' on a Mac)
 -* '''Internet Explorer:''' Hold ''Ctrl'' while clicking ''Refresh'', or press ''Ctrl-F5''
 -* '''Opera:''' Clear the cache in ''Tools → Preferences''",
 -'usercssyoucanpreview'             => "'''Tip:''' Use the \"{{int:showpreview}}\" button to test your new CSS before saving.",
 -'userjsyoucanpreview'              => "'''Tip:''' Use the \"{{int:showpreview}}\" button to test your new JavaScript before saving.",
 -'usercsspreview'                   => "'''Remember that you are only previewing your user CSS.'''
 -'''It has not yet been saved!'''",
 -'userjspreview'                    => "'''Remember that you are only testing/previewing your user JavaScript.'''
 -'''It has not yet been saved!'''",
 -'sitecsspreview'                   => "'''Remember that you are only previewing this CSS.'''
 -'''It has not yet been saved!'''",
 -'sitejspreview'                    => "'''Remember that you are only previewing this JavaScript code.'''
 -'''It has not yet been saved!'''",
 -'userinvalidcssjstitle'            => "'''Warning:''' There is no skin \"\$1\".
 +'clearyourcache'                   => "<strong>Note:</strong> After saving, you may have to bypass your browser's cache to see the changes.
 +* <strong>Firefox / Safari:</strong> Hold <em>Shift</em> while clicking <em>Reload</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> on a Mac)
 +* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)
 +* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>
 +* <strong>Opera:</strong> Clear the cache in <em>Tools → Preferences</em>",
 +'usercssyoucanpreview'             => "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new CSS before saving.",
 +'userjsyoucanpreview'              => "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new JavaScript before saving.",
 +'usercsspreview'                   => "<strong>Remember that you are only previewing your user CSS.
 +It has not yet been saved!</strong>",
 +'userjspreview'                    => "<strong>Remember that you are only testing/previewing your user JavaScript.
 +It has not yet been saved!</strong>",
 +'sitecsspreview'                   => "<strong>Remember that you are only previewing this CSS.
 +It has not yet been saved!</strong>",
 +'sitejspreview'                    => "<strong>Remember that you are only previewing this JavaScript code.
 +It has not yet been saved!</strong>",
 +'userinvalidcssjstitle'            => "<strong>Warning:</strong> There is no skin \"\$1\".
  Custom .css and .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.css as opposed to {{ns:user}}:Foo/Vector.css.",
  'updated'                          => '(Updated)',
 -'note'                             => "'''Note:'''",
 -'previewnote'                      => "'''Remember that this is only a preview.'''
 +'note'                             => "<strong>Note:</strong>",
 +'previewnote'                      => "<strong>Remember that this is only a preview.</strong>
  Your changes have not yet been saved!",
  'continue-editing'                 => 'Go to editing area',
  'previewconflict'                  => 'This preview reflects the text in the upper text editing area as it will appear if you choose to save.',
 -'session_fail_preview'             => "'''Sorry! We could not process your edit due to a loss of session data.'''
 +'session_fail_preview'             => "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>
  Please try again.
  If it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
 -'session_fail_preview_html'        => "'''Sorry! We could not process your edit due to a loss of session data.'''
 +'session_fail_preview_html'        => "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>
  
 -''Because {{SITENAME}} has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.''
 +<em>Because {{SITENAME}} has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.</em>
  
 -'''If this is a legitimate edit attempt, please try again.'''
 +<strong>If this is a legitimate edit attempt, please try again.</strong>
  If it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
 -'token_suffix_mismatch'            => "'''Your edit has been rejected because your client mangled the punctuation characters in the edit token.'''
 +'token_suffix_mismatch'            => "<strong>Your edit has been rejected because your client mangled the punctuation characters in the edit token.</strong>
  The edit has been rejected to prevent corruption of the page text.
  This sometimes happens when you are using a buggy web-based anonymous proxy service.",
 -'edit_form_incomplete'             => "'''Some parts of the edit form did not reach the server; double-check that your edits are intact and try again.'''",
 +'edit_form_incomplete'             => "<strong>Some parts of the edit form did not reach the server; double-check that your edits are intact and try again.</strong>",
  'editing'                          => 'Editing $1',
  'creating'                         => 'Creating $1',
  'editingsection'                   => 'Editing $1 (section)',
  The upper text area contains the page text as it currently exists.
  Your changes are shown in the lower text area.
  You will have to merge your changes into the existing text.
 -'''Only''' the text in the upper text area will be saved when you press \"{{int:savearticle}}\".",
 +<strong>Only</strong> the text in the upper text area will be saved when you press \"{{int:savearticle}}\".",
  'yourtext'                         => 'Your text',
  'storedversion'                    => 'Stored revision',
 -'nonunicodebrowser'                => "'''Warning: Your browser is not Unicode compliant.'''
 +'nonunicodebrowser'                => "<strong>Warning: Your browser is not Unicode compliant.</strong>
  A workaround is in place to allow you to safely edit pages: Non-ASCII characters will appear in the edit box as hexadecimal codes.",
 -'editingold'                       => "'''Warning: You are editing an out-of-date revision of this page.'''
 +'editingold'                       => "<strong>Warning: You are editing an out-of-date revision of this page.</strong>
  If you save it, any changes made since this revision will be lost.",
  'yourdiff'                         => 'Differences',
  'copyrightwarning'                 => "Please note that all contributions to {{SITENAME}} are considered to be released under the $2 (see $1 for details).
  If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.<br />
  You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.
 -'''Do not submit copyrighted work without permission!'''",
 +<strong>Do not submit copyrighted work without permission!</strong>",
  'copyrightwarning2'                => "Please note that all contributions to {{SITENAME}} may be edited, altered, or removed by other contributors.
  If you do not want your writing to be edited mercilessly, then do not submit it here.<br />
  You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see $1 for details).
 -'''Do not submit copyrighted work without permission!'''",
 +<strong>Do not submit copyrighted work without permission!</strong>",
  'editpage-head-copy-warn'          => '-', # do not translate or duplicate this message to other languages
  'editpage-tos-summary'             => '-', # do not translate or duplicate this message to other languages
  'longpage-hint'                    => '-', # do not translate or duplicate this message to other languages
 -'longpageerror'                    => "'''Error: The text you have submitted is {{PLURAL:$1|one kilobyte|$1 kilobytes}} long, which is longer than the maximum of {{PLURAL:$2|one kilobyte|$2 kilobytes}}.'''
 +'longpageerror'                    => "<strong>Error: The text you have submitted is {{PLURAL:$1|one kilobyte|$1 kilobytes}} long, which is longer than the maximum of {{PLURAL:$2|one kilobyte|$2 kilobytes}}.</strong>
  It cannot be saved.",
 -'readonlywarning'                  => "'''Warning: The database has been locked for maintenance, so you will not be able to save your edits right now.'''
 +'readonlywarning'                  => "<strong>Warning: The database has been locked for maintenance, so you will not be able to save your edits right now.</strong>
  You may wish to copy and paste your text into a text file and save it for later.
  
  The administrator who locked it offered this explanation: $1",
 -'protectedpagewarning'             => "'''Warning: This page has been protected so that only users with administrator privileges can edit it.'''
 +'protectedpagewarning'             => "<strong>Warning: This page has been protected so that only users with administrator privileges can edit it.</strong>
  The latest log entry is provided below for reference:",
 -'semiprotectedpagewarning'         => "'''Note:''' This page has been protected so that only registered users can edit it.
 +'semiprotectedpagewarning'         => "<strong>Note:</strong> This page has been protected so that only registered users can edit it.
  The latest log entry is provided below for reference:",
 -'cascadeprotectedwarning'          => "'''Warning:''' This page has been protected so that only users with administrator privileges can edit it because it is included in the following cascade-protected {{PLURAL:$1|page|pages}}:",
 -'titleprotectedwarning'            => "'''Warning: This page has been protected so that [[Special:ListGroupRights|specific rights]] are needed to create it.'''
 +'cascadeprotectedwarning'          => "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can edit it because it is included in the following cascade-protected {{PLURAL:$1|page|pages}}:",
 +'titleprotectedwarning'            => "<strong>Warning: This page has been protected so that [[Special:ListGroupRights|specific rights]] are needed to create it.</strong>
  The latest log entry is provided below for reference:",
  'templatesused'                    => '{{PLURAL:$1|Template|Templates}} used on this page:',
  'templatesusedpreview'             => '{{PLURAL:$1|Template|Templates}} used in this preview:',
@@@ -1562,7 -1554,7 +1562,7 @@@ You can go back and edit an existing pa
  'permissionserrors'                => 'Permission error',
  'permissionserrorstext'            => 'You do not have permission to do that, for the following {{PLURAL:$1|reason|reasons}}:',
  'permissionserrorstext-withaction' => 'You do not have permission to $2, for the following {{PLURAL:$1|reason|reasons}}:',
 -'recreate-moveddeleted-warn'       => "'''Warning: You are recreating a page that was previously deleted.'''
 +'recreate-moveddeleted-warn'       => "<strong>Warning: You are recreating a page that was previously deleted.</strong>
  
  You should consider whether it is appropriate to continue editing this page.
  The deletion and move log for this page are provided here for convenience:",
@@@ -1585,7 -1577,7 +1585,7 @@@ It already exists.'
  'invalid-content-data'             => 'Invalid content data',
  'content-not-allowed-here'         => '"$1" content is not allowed on page [[$2]]',
  'editwarning-warning'              => 'Leaving this page may cause you to lose any changes you have made.
 -If you are logged in, you can disable this warning in the "Editing" section of your preferences.',
 +If you are logged in, you can disable this warning in the "{{int:prefs-editing}}" section of your preferences.',
  'editpage-notsupportedcontentformat-title'=> 'Content format not supported',
  'editpage-notsupportedcontentformat-text' => 'The content format $1 is not supported by the content model $2.',
  
  'content-model-css'        => 'CSS',
  
  # Parser/template warnings
 -'expensive-parserfunction-warning'        => "'''Warning:''' This page contains too many expensive parser function calls.
 +'expensive-parserfunction-warning'        => "<strong>Warning:</strong> This page contains too many expensive parser function calls.
  
  It should have less than $2 {{PLURAL:$2|call|calls}}, there {{PLURAL:$1|is now $1 call|are now $1 calls}}.",
  'expensive-parserfunction-category'       => 'Pages with too many expensive parser function calls',
 -'post-expand-template-inclusion-warning'  => "'''Warning:''' Template include size is too large.
 +'post-expand-template-inclusion-warning'  => "<strong>Warning:</strong> Template include size is too large.
  Some templates will not be included.",
  'post-expand-template-inclusion-category' => 'Pages where template include size is exceeded',
 -'post-expand-template-argument-warning'   => "'''Warning:''' This page contains at least one template argument that has a too large expansion size.
 +'post-expand-template-argument-warning'   => "<strong>Warning:</strong> This page contains at least one template argument that has a too large expansion size.
  These arguments have been omitted.",
  'post-expand-template-argument-category'  => 'Pages containing omitted template arguments',
  'parser-template-loop-warning'            => 'Template loop detected: [[$1]]',
  Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.',
  'undo-failure'                 => 'The edit could not be undone due to conflicting intermediate edits.',
  'undo-norev'                   => 'The edit could not be undone because it does not exist or was deleted.',
 +'undo-nochange'                => 'The edit appears to have already been undone.',
  'undo-summary'                 => 'Undo revision $1 by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])',
  'undo-summary-username-hidden' => 'Undo revision $1 by a hidden user',
  
  'cantcreateaccount-range-text' => "Account creation from IP addresses in the range '''$1''', which includes your IP address ('''$4'''), has been blocked by [[User:$3|$3]].
  
  The reason given by $3 is ''$2''",
 -'cantcreateaccount-text' => "Account creation from this IP address ('''$1''') has been blocked by [[User:$3|$3]].
 +'cantcreateaccount-text' => "Account creation from this IP address (<strong>$1</strong>) has been blocked by [[User:$3|$3]].
  
 -The reason given by $3 is ''$2''",
 +The reason given by $3 is <em>$2</em>",
 +'createaccount-hook-aborted' => '$1', # do not translate or duplicate this message to other languages
  
  # History pages
  'viewpagelogs'           => 'View logs for this page',
  'page_first'             => 'first',
  'page_last'              => 'last',
  'histlegend'             => "Diff selection: Mark the radio boxes of the revisions to compare and hit enter or the button at the bottom.<br />
 -Legend: '''({{int:cur}})''' = difference with latest revision, '''({{int:last}})''' = difference with preceding revision, '''{{int:minoreditletter}}''' = minor edit.",
 +Legend: <strong>({{int:cur}})</strong> = difference with latest revision, <strong>({{int:last}})</strong> = difference with preceding revision, <strong>{{int:minoreditletter}}</strong> = minor edit.",
  'history-fieldset-title' => 'Browse history',
  'history-show-deleted'   => 'Deleted only',
  'history_copyright'      => '-', # do not translate or duplicate this message to other languages
@@@ -1676,30 -1666,30 +1676,30 @@@ Try [[Special:Search|searching on the w
  'rev-deleted-user'            => '(username removed)',
  'rev-deleted-event'           => '(log action removed)',
  'rev-deleted-user-contribs'   => '[username or IP address removed - edit hidden from contributions]',
 -'rev-deleted-text-permission' => "This page revision has been '''deleted'''.
 +'rev-deleted-text-permission' => "This page revision has been <strong>deleted</strong>.
  Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
 -'rev-deleted-text-unhide'     => "This page revision has been '''deleted'''.
 +'rev-deleted-text-unhide'     => "This page revision has been <strong>deleted</strong>.
  Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].
  You can still [$1 view this revision] if you wish to proceed.",
 -'rev-suppressed-text-unhide'  => "This page revision has been '''suppressed'''.
 +'rev-suppressed-text-unhide'  => "This page revision has been <strong>suppressed</strong>.
  Details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].
  You can still [$1 view this revision] if you wish to proceed.",
 -'rev-deleted-text-view'       => "This page revision has been '''deleted'''.
 +'rev-deleted-text-view'       => "This page revision has been <strong>deleted</strong>.
  You can view it; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
 -'rev-suppressed-text-view'    => "This page revision has been '''suppressed'''.
 +'rev-suppressed-text-view'    => "This page revision has been <strong>suppressed</strong>.
  You can view it; details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
 -'rev-deleted-no-diff'         => "You cannot view this diff because one of the revisions has been '''deleted'''.
 +'rev-deleted-no-diff'         => "You cannot view this diff because one of the revisions has been <strong>deleted</strong>.
  Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
 -'rev-suppressed-no-diff'      => "You cannot view this diff because one of the revisions has been '''deleted'''.",
 -'rev-deleted-unhide-diff'     => "One of the revisions of this diff has been '''deleted'''.
 +'rev-suppressed-no-diff'      => "You cannot view this diff because one of the revisions has been <strong>deleted</strong>.",
 +'rev-deleted-unhide-diff'     => "One of the revisions of this diff has been <strong>deleted</strong>.
  Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].
  You can still [$1 view this diff] if you wish to proceed.",
 -'rev-suppressed-unhide-diff'  => "One of the revisions of this diff has been '''suppressed'''.
 +'rev-suppressed-unhide-diff'  => "One of the revisions of this diff has been <strong>suppressed</strong>.
  Details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].
  You can still [$1 view this diff] if you wish to proceed.",
 -'rev-deleted-diff-view'       => "One of the revisions of this diff has been '''deleted'''.
 +'rev-deleted-diff-view'       => "One of the revisions of this diff has been <strong>deleted</strong>.
  You can view this diff; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
 -'rev-suppressed-diff-view'    => "One of the revisions of this diff has been '''suppressed'''.
 +'rev-suppressed-diff-view'    => "One of the revisions of this diff has been <strong>suppressed</strong>.
  You can view this diff; details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
  'rev-delundel'                => 'change visibility',
  'rev-showdeleted'             => 'show',
@@@ -1710,15 -1700,15 +1710,15 @@@ function, the specified revision does n
  'revdelete-no-file'           => 'The file specified does not exist.',
  'revdelete-show-file-confirm' => 'Are you sure you want to view a deleted revision of the file "<nowiki>$1</nowiki>" from $2 at $3?',
  'revdelete-show-file-submit'  => 'Yes',
 -'revdelete-selected'          => "'''{{PLURAL:$2|Selected revision|Selected revisions}} of [[:$1]]:'''",
 -'logdelete-selected'          => "'''{{PLURAL:$1|Selected log event|Selected log events}}:'''",
 -'revdelete-text'              => "'''Deleted revisions and events will still appear in the page history and logs, but parts of their content will be inaccessible to the public.'''
 +'revdelete-selected'          => "<strong>{{PLURAL:$2|Selected revision|Selected revisions}} of [[:$1]]:</strong>",
 +'logdelete-selected'          => "<strong>{{PLURAL:$1|Selected log event|Selected log events}}:</strong>",
 +'revdelete-text'              => "<strong>Deleted revisions and events will still appear in the page history and logs, but parts of their content will be inaccessible to the public.</strong>
  Other administrators on {{SITENAME}} will still be able to access the hidden content and can undelete it again through this same interface, unless additional restrictions are set.",
  'revdelete-confirm'           => 'Please confirm that you intend to do this, that you understand the consequences, and that you are doing this in accordance with [[{{MediaWiki:Policy-url}}|the policy]].',
 -'revdelete-suppress-text'     => "Suppression should '''only''' be used for the following cases:
 +'revdelete-suppress-text'     => "Suppression should <strong>only</strong> be used for the following cases:
  * potentially libelous information
  * inappropriate personal information
 -*: ''home addresses and telephone numbers, national identification numbers, etc.''",
 +*: <em>home addresses and telephone numbers, national identification numbers, etc.</em>",
  'revdelete-legend'            => 'Set visibility restrictions',
  'revdelete-hide-text'         => 'Revision text',
  'revdelete-hide-image'        => 'Hide file content',
  'revdelete-unsuppress'        => 'Remove restrictions on restored revisions',
  'revdelete-log'               => 'Reason:',
  'revdelete-submit'            => 'Apply to selected {{PLURAL:$1|revision|revisions}}',
 -'revdelete-success'           => "'''Revision visibility successfully updated.'''",
 -'revdelete-failure'           => "'''Revision visibility could not be updated:'''
 +'revdelete-success'           => "<strong>Revision visibility successfully updated.</strong>",
 +'revdelete-failure'           => "<strong>Revision visibility could not be updated:</strong>
  $1",
 -'logdelete-success'           => "'''Log visibility successfully set.'''",
 -'logdelete-failure'           => "'''Log visibility could not be set:'''
 +'logdelete-success'           => "<strong>Log visibility successfully set.</strong>",
 +'logdelete-failure'           => "<strong>Log visibility could not be set:</strong>
  $1",
  'revdel-restore'              => 'change visibility',
  'pagehist'                    => 'Page history',
@@@ -1749,7 -1739,7 +1749,7 @@@ You do not have access to it.'
  'revdelete-modify-no-access'  => 'Error modifying the item dated $2, $1: This item has been marked "restricted".
  You do not have access to it.',
  'revdelete-modify-missing'    => 'Error modifying item ID $1: It is missing from the database!',
 -'revdelete-no-change'         => "'''Warning:''' The item dated $2, $1 already had the requested visibility settings.",
 +'revdelete-no-change'         => "<strong>Warning:</strong> The item dated $2, $1 already had the requested visibility settings.",
  'revdelete-concurrent-change' => 'Error modifying the item dated $2, $1: Its status appears to have been changed by someone else while you attempted to modify it.
  Please check the logs.',
  'revdelete-only-restricted'   => 'Error hiding the item dated $2, $1: You cannot suppress items from view by administrators without also selecting one of the other visibility options.',
@@@ -1810,8 -1800,7 +1810,8 @@@ Note that using the navigation links wi
  'showhideselectedversions'    => 'Change visibility of selected revisions',
  'editundo'                    => 'undo',
  'diff-empty'                  => '(No difference)',
 -'diff-multi'                  => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one user|$2 users}} not shown)',
 +'diff-multi-sameuser'         => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by the same user not shown)',
 +'diff-multi-otherusers'       => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one other user|$2 users}} not shown)',
  'diff-multi-manyusers'        => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by more than $2 {{PLURAL:$2|user|users}} not shown)',
  'difference-missing-revision' => '{{PLURAL:$2|One revision|$2 revisions}} of this difference ($1) {{PLURAL:$2|was|were}} not found.
  
@@@ -1832,8 -1821,8 +1832,8 @@@ Details can be found in the [{{fullurl:
  'nextn-title'                      => 'Next $1 {{PLURAL:$1|result|results}}',
  'shown-title'                      => 'Show $1 {{PLURAL:$1|result|results}} per page',
  'viewprevnext'                     => 'View ($1 {{int:pipe-separator}} $2) ($3)',
 -'searchmenu-exists'                => "'''There is a page named \"[[:\$1]]\" on this wiki.''' {{PLURAL:$2|0=|See also the other search results found.}}",
 -'searchmenu-new'                   => "'''Create the page \"[[:\$1]]\" on this wiki!''' {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
 +'searchmenu-exists'                => "<strong>There is a page named \"[[:\$1]]\" on this wiki.</strong> {{PLURAL:$2|0=|See also the other search results found.}}",
 +'searchmenu-new'                   => "<strong>Create the page \"[[:\$1]]\" on this wiki!</strong> {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
  'searchmenu-new-nocreate'          => '', # do not translate or duplicate this message to other languages
  'searchprofile-articles'           => 'Content pages',
  'searchprofile-project'            => 'Help and Project pages',
  'searcheverything-enable'          => 'Search in all namespaces',
  'searchrelated'                    => 'related',
  'searchall'                        => 'all',
 -'showingresults'                   => "Showing below up to {{PLURAL:$1|'''1''' result|'''$1''' results}} starting with #'''$2'''.",
 -'showingresultsnum'                => "Showing below {{PLURAL:$3|'''1''' result|'''$3''' results}} starting with #'''$2'''.",
 -'showingresultsheader'             => "{{PLURAL:$5|Result '''$1''' of '''$3'''|Results '''$1 - $2''' of '''$3'''}} for '''$4'''",
 +'showingresults'                   => "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} starting with #<strong>$2</strong>.",
 +'showingresultsinrange'            => "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} in range #<strong>$2</strong> to #<strong>$3</strong>.",
 +'showingresultsnum'                => "Showing below {{PLURAL:$3|<strong>1</strong> result|<strong>$3</strong> results}} starting with #<strong>$2</strong>.",
 +'showingresultsheader'             => "{{PLURAL:$5|Result <strong>$1</strong> of <strong>$3</strong>|Results <strong>$1 - $2</strong> of <strong>$3</strong>}} for <strong>$4</strong>",
  'search-nonefound'                 => 'There were no results matching the query.',
  'powersearch-legend'               => 'Advanced search',
  'powersearch-ns'                   => 'Search in namespaces:',
@@@ -1934,7 -1922,7 +1934,7 @@@ Note that their indexes of {{SITENAME}
  'prefs-help-recentchangescount' => 'This includes recent changes, page histories, and logs.',
  'prefs-help-watchlist-token2'   => 'This is the secret key to the web feed of your watchlist.
  Anyone who knows it will be able to read your watchlist, so do not share it.
 -[[Special:ResetTokens|Click here if you need to reset it]].',
 +If you need to, [[Special:ResetTokens|you can reset it]].',
  'savedprefs'                    => 'Your preferences have been saved.',
  'timezonelegend'                => 'Time zone:',
  'localtime'                     => 'Local time:',
@@@ -2025,7 -2013,7 +2025,7 @@@ Your email address is not revealed whe
  'userrights-lookup-user'         => 'Manage user groups',
  'userrights-user-editname'       => 'Enter a username:',
  'editusergroup'                  => 'Edit user groups',
 -'editinguser'                    => "Changing user rights of user '''[[User:$1|$1]]''' $2",
 +'editinguser'                    => "Changing user rights of user <strong>[[User:$1|$1]]</strong> $2",
  'userrights-editusergroup'       => 'Edit user groups',
  'saveusergroups'                 => 'Save user groups',
  'userrights-groupsmember'        => 'Member of:',
  'recentchanges-label-plusminus'     => 'The page size changed by this number of bytes',
  'recentchanges-legend-heading'      => "'''Legend:'''",
  'recentchanges-legend-newpage'      => '(also see [[Special:NewPages|list of new pages]])',
 -'recentchanges-legend-plusminus'    => "(''±123'')",
 -'rcnotefrom'                        => "Below are the changes since '''$2''' (up to '''$1''' shown).",
 +'recentchanges-legend-plusminus'    => "(<em>±123</em>)",
 +'rcnotefrom'                        => "Below are the changes since <strong>$2</strong> (up to <strong>$1</strong> shown).",
  'rclistfrom'                        => 'Show new changes starting from $1',
  'rcshowhideminor'                   => '$1 minor edits',
+ 'rcshowhideminor-show'              => 'Show',
+ 'rcshowhideminor-hide'              => 'Hide',
  'rcshowhidebots'                    => '$1 bots',
+ 'rcshowhidebots-show'               => 'Show',
+ 'rcshowhidebots-hide'               => 'Hide',
  'rcshowhideliu'                     => '$1 registered users',
+ 'rcshowhideliu-show'                => 'Show',
+ 'rcshowhideliu-hide'                => 'Hide',
  'rcshowhideanons'                   => '$1 anonymous users',
+ 'rcshowhideanons-show'              => 'Show',
+ 'rcshowhideanons-hide'              => 'Hide',
  'rcshowhidepatr'                    => '$1 patrolled edits',
+ 'rcshowhidepatr-show'               => 'Show',
+ 'rcshowhidepatr-hide'               => 'Hide',
  'rcshowhidemine'                    => '$1 my edits',
+ 'rcshowhidemine-show'               => 'Show',
+ 'rcshowhidemine-hide'               => 'Hide',
  'rclinks'                           => 'Show last $1 changes in last $2 days<br />$3',
  'diff'                              => 'diff',
  'hist'                              => 'hist',
  'recentchangeslinked-toolbox' => 'Related changes',
  'recentchangeslinked-title'   => 'Changes related to "$1"',
  'recentchangeslinked-summary' => "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).
 -Pages on [[Special:Watchlist|your watchlist]] are '''bold'''.",
 +Pages on [[Special:Watchlist|your watchlist]] are <strong>bold</strong>.",
  'recentchangeslinked-page'    => 'Page name:',
  'recentchangeslinked-to'      => 'Show changes to pages linked to the given page instead',
  
  'upload_directory_read_only'  => 'The upload directory ($1) is not writable by the webserver.',
  'uploaderror'                 => 'Upload error',
  'upload-summary'              => '', # do not translate or duplicate this message to other languages
 -'upload-recreate-warning'     => "'''Warning: A file by that name has been deleted or moved.'''
 +'upload-recreate-warning'     => "<strong>Warning: A file by that name has been deleted or moved.</strong>
  
  The deletion and move log for this page are provided here for convenience:",
  'uploadtext'                  => "Use the form below to upload files.
  To view or search previously uploaded files go to the [[Special:FileList|list of uploaded files]], (re)uploads are also logged in the [[Special:Log/upload|upload log]], deletions in the [[Special:Log/delete|deletion log]].
  
  To include a file in a page, use a link in one of the following forms:
 -* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' to use the full version of the file
 -* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' to use a 200 pixel wide rendition in a box in the left margin with \"alt text\" as description
 -* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' for directly linking to the file without displaying the file",
 +* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> to use the full version of the file
 +* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> to use a 200 pixel wide rendition in a box in the left margin with \"alt text\" as description
 +* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> for directly linking to the file without displaying the file",
  'upload-permitted'            => 'Permitted file types: $1.',
  'upload-preferred'            => 'Preferred file types: $1.',
  'upload-prohibited'           => 'Prohibited file types: $1.',
@@@ -2293,9 -2293,9 +2305,9 @@@ Please rename the file and try uploadin
  'filetype-mime-mismatch'      => 'File extension ".$1" does not match the detected MIME type of the file ($2).',
  'filetype-badmime'            => 'Files of the MIME type "$1" are not allowed to be uploaded.',
  'filetype-bad-ie-mime'        => 'Cannot upload this file because Internet Explorer would detect it as "$1", which is a disallowed and potentially dangerous file type.',
 -'filetype-unwanted-type'      => "'''\".\$1\"''' is an unwanted file type.
 +'filetype-unwanted-type'      => "<strong>\".\$1\"</strong> is an unwanted file type.
  Preferred {{PLURAL:\$3|file type is|file types are}} \$2.",
 -'filetype-banned-type'        => '\'\'\'".$1"\'\'\' {{PLURAL:$4|is not a permitted file type|are not permitted file types}}.
 +'filetype-banned-type'        => '<strong>".$1"</strong> {{PLURAL:$4|is not a permitted file type|are not permitted file types}}.
  Permitted {{PLURAL:$3|file type is|file types are}} $2.',
  'filetype-missing'            => 'The file has no extension (like ".jpg").',
  'empty-file'                  => 'The file you submitted was empty.',
@@@ -2326,12 -2326,12 +2338,12 @@@ To make your summary appear there, you 
  * Name of the uploading file: <strong>[[:$1]]</strong>
  * Name of the existing file: <strong>[[:$2]]</strong>
  Please choose a different name.',
 -'fileexists-thumbnail-yes'    => "The file seems to be an image of reduced size ''(thumbnail)''.
 +'fileexists-thumbnail-yes'    => "The file seems to be an image of reduced size <em>(thumbnail)</em>.
  [[$1|thumb]]
  Please check the file <strong>[[:$1]]</strong>.
  If the checked file is the same image of original size it is not necessary to upload an extra thumbnail.",
  'file-thumbnail-no'           => "The filename begins with <strong>$1</strong>.
 -It seems to be an image of reduced size ''(thumbnail)''.
 +It seems to be an image of reduced size <em>(thumbnail)</em>.
  If you have this image in full resolution upload this one, otherwise change the filename please.",
  'fileexists-forbidden'        => 'A file with this name already exists, and cannot be overwritten.
  If you still want to upload your file, please go back and use a new name.
@@@ -2371,7 -2371,7 +2383,7 @@@ Uploading Java files is not allowed bec
  'watchthisupload'             => 'Watch this file',
  'filewasdeleted'              => 'A file of this name has been previously uploaded and subsequently deleted.
  You should check the $1 before proceeding to upload it again.',
 -'filename-bad-prefix'         => "The name of the file you are uploading begins with '''\"\$1\"''', which is a non-descriptive name typically assigned automatically by digital cameras.
 +'filename-bad-prefix'         => "The name of the file you are uploading begins with <strong>\"\$1\"</strong>, which is a non-descriptive name typically assigned automatically by digital cameras.
  Please choose a more descriptive name for your file.",
  'filename-prefix-blacklist'   => ' #<!-- leave this line exactly as it is --> <pre>
  # Syntax is as follows:
@@@ -2429,7 -2429,7 +2441,7 @@@ If the problem persists, contact an [[S
  'backend-fail-read'          => 'Could not read file "$1".',
  'backend-fail-create'        => 'Could not write file "$1".',
  'backend-fail-maxsize'       => 'Could not write file "$1" because it is larger than {{PLURAL:$2|one byte|$2 bytes}}.',
 -'backend-fail-readonly'      => 'The storage backend "$1" is currently read-only. The reason given is: "\'\'$2\'\'"',
 +'backend-fail-readonly'      => 'The storage backend "$1" is currently read-only. The reason given is: "<em>$2</em>"',
  'backend-fail-synced'        => 'The file "$1" is in an inconsistent state within the internal storage backends',
  'backend-fail-connect'       => 'Could not connect to storage backend "$1".',
  'backend-fail-internal'      => 'An unknown error occurred in storage backend "$1".',
@@@ -2581,24 -2581,24 +2593,24 @@@ Maybe you want to edit the description 
  # File reversion
  'filerevert'                => 'Revert $1',
  'filerevert-legend'         => 'Revert file',
 -'filerevert-intro'          => "You are about to revert the file '''[[Media:$1|$1]]''' to the [$4 version as of $3, $2].",
 +'filerevert-intro'          => "You are about to revert the file <strong>[[Media:$1|$1]]</strong> to the [$4 version as of $3, $2].",
  'filerevert-comment'        => 'Reason:',
  'filerevert-defaultcomment' => 'Reverted to version as of $2, $1',
  'filerevert-submit'         => 'Revert',
 -'filerevert-success'        => "'''[[Media:$1|$1]]''' has been reverted to the [$4 version as of $3, $2].",
 +'filerevert-success'        => "<strong>[[Media:$1|$1]]</strong> has been reverted to the [$4 version as of $3, $2].",
  'filerevert-badversion'     => 'There is no previous local version of this file with the provided timestamp.',
  
  # File deletion
  'filedelete'                   => 'Delete $1',
  'filedelete-legend'            => 'Delete file',
 -'filedelete-intro'             => "You are about to delete the file '''[[Media:$1|$1]]''' along with all of its history.",
 -'filedelete-intro-old'         => "You are deleting the version of '''[[Media:$1|$1]]''' as of [$4 $3, $2].",
 +'filedelete-intro'             => "You are about to delete the file <strong>[[Media:$1|$1]]</strong> along with all of its history.",
 +'filedelete-intro-old'         => "You are deleting the version of <strong>[[Media:$1|$1]]</strong> as of [$4 $3, $2].",
  'filedelete-comment'           => 'Reason:',
  'filedelete-submit'            => 'Delete',
 -'filedelete-success'           => "'''$1''' has been deleted.",
 -'filedelete-success-old'       => "The version of '''[[Media:$1|$1]]''' as of $3, $2 has been deleted.",
 -'filedelete-nofile'            => "'''$1''' does not exist.",
 -'filedelete-nofile-old'        => "There is no archived version of '''$1''' with the specified attributes.",
 +'filedelete-success'           => "<strong>$1</strong> has been deleted.",
 +'filedelete-success-old'       => "The version of <strong>[[Media:$1|$1]]</strong> as of $3, $2 has been deleted.",
 +'filedelete-nofile'            => "<strong>$1</strong> does not exist.",
 +'filedelete-nofile-old'        => "There is no archived version of <strong>$1</strong> with the specified attributes.",
  'filedelete-otherreason'       => 'Other/additional reason:',
  'filedelete-reason-otherlist'  => 'Other reason',
  'filedelete-reason-dropdown'   => '*Common delete reasons
@@@ -2769,21 -2769,12 +2781,21 @@@ It now redirects to [[$2]].'
  'deadendpagestext'                => 'The following pages do not link to other pages in {{SITENAME}}.',
  'protectedpages'                  => 'Protected pages',
  'protectedpages-indef'            => 'Indefinite protections only',
 -'protectedpages-summary'          => '', # do not translate or duplicate this message to other languages
 +'protectedpages-summary'          => 'This page lists existing pages that are currently protected. For a list of titles that are protected from creation, see [[{{#special:ProtectedTitles}}]].',
  'protectedpages-cascade'          => 'Cascading protections only',
  'protectedpages-noredirect'       => 'Hide redirects',
  'protectedpagesempty'             => 'No pages are currently protected with these parameters.',
 +'protectedpages-timestamp'        => 'Timestamp',
 +'protectedpages-page'             => 'Page',
 +'protectedpages-expiry'           => 'Expires',
 +'protectedpages-performer'        => 'Protecting user',
 +'protectedpages-params'           => 'Protection parameters',
 +'protectedpages-reason'           => 'Reason',
 +'protectedpages-unknown-timestamp' => 'Unknown',
 +'protectedpages-unknown-performer' => 'Unknown user',
 +'protectedpages-unknown-reason'   => '—', # do not translate or duplicate this message to other languages
  'protectedtitles'                 => 'Protected titles',
 -'protectedtitles-summary'         => '', # do not translate or duplicate this message to other languages
 +'protectedtitles-summary'         => 'This page lists titles that are currently protected from creation. For a list of existing pages that are protected, see [[{{#special:ProtectedPages}}]].',
  'protectedtitlesempty'            => 'No titles are currently protected with these parameters.',
  'listusers'                       => 'User list',
  'listusers-summary'               => '', # do not translate or duplicate this message to other languages
@@@ -2984,12 -2975,12 +2996,12 @@@ Future changes to this page and its ass
  'notvisiblerev'        => 'The last revision by a different user has been deleted',
  'watchlist-details'    => '{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not counting talk pages.',
  'wlheader-enotif'      => 'Email notification is enabled.',
 -'wlheader-showupdated' => "Pages that have been changed since you last visited them are shown in '''bold'''.",
 +'wlheader-showupdated' => "Pages that have been changed since you last visited them are shown in <strong>bold</strong>.",
  'watchmethod-recent'   => 'checking recent edits for watched pages',
  'watchmethod-list'     => 'checking watched pages for recent edits',
  'watchlistcontains'    => 'Your watchlist contains $1 {{PLURAL:$1|page|pages}}.',
  'iteminvalidname'      => 'Problem with item "$1", invalid name...',
 -'wlnote'               => "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}, as of $3, $4.",
 +'wlnote2'              => "Below are the changes in the last {{PLURAL:$1|hour|<strong>$1</strong> hours}}, as of $2, $3.",
  'wlshowlast'           => 'Show last $1 hours $2 days $3',
  'watchlist-options'    => 'Watchlist options',
  
@@@ -3052,7 -3043,7 +3064,7 @@@ Feedback and further assistance
  'exblank'                => 'page was empty',
  'delete-confirm'         => 'Delete "$1"',
  'delete-legend'          => 'Delete',
 -'historywarning'         => "'''Warning:''' The page you are about to delete has a history with approximately $1 {{PLURAL:$1|revision|revisions}}:",
 +'historywarning'         => "<strong>Warning:</strong> The page you are about to delete has a history with approximately $1 {{PLURAL:$1|revision|revisions}}:",
  'confirmdeletetext'      => 'You are about to delete a page along with all of its history.
  Please confirm that you intend to do this, that you understand the consequences, and that you are doing this in accordance with [[{{MediaWiki:Policy-url}}|the policy]].',
  'deleting-backlinks-warning' => "'''Warning:''' Other pages link to or transclude from the page you are about to delete.",
@@@ -3126,13 -3117,13 +3138,13 @@@ See the [[Special:ProtectedPages|protec
  'protect_expiry_invalid'           => 'Expiry time is invalid.',
  'protect_expiry_old'               => 'Expiry time is in the past.',
  'protect-unchain-permissions'      => 'Unlock further protect options',
 -'protect-text'                     => "Here you may view and change the protection level for the page '''$1'''.",
 +'protect-text'                     => "Here you may view and change the protection level for the page <strong>$1</strong>.",
  'protect-locked-blocked'           => "You cannot change protection levels while blocked.
 -Here are the current settings for the page '''$1''':",
 +Here are the current settings for the page <strong>$1</strong>:",
  'protect-locked-dblock'            => "Protection levels cannot be changed due to an active database lock.
 -Here are the current settings for the page '''$1''':",
 +Here are the current settings for the page <strong>$1</strong>:",
  'protect-locked-access'            => "Your account does not have permission to change page protection levels.
 -Here are the current settings for the page '''$1''':",
 +Here are the current settings for the page <strong>$1</strong>:",
  'protect-cascadeon'                => "This page is currently protected because it is included in the following {{PLURAL:$1|page, which has|pages, which have}} cascading protection turned on.
  You can change this page's protection level, but it will not affect the cascading protection.",
  'protect-default'                  => 'Allow all users',
  'undelete'                     => 'View deleted pages',
  'undelete-summary'             => '', # do not translate or duplicate this message to other languages
  'undeletepage'                 => 'View and restore deleted pages',
 -'undeletepagetitle'            => "'''The following consists of deleted revisions of [[:$1|$1]]'''.",
 +'undeletepagetitle'            => "<strong>The following consists of deleted revisions of [[:$1|$1]]</strong>.",
  'viewdeletedpage'              => 'View deleted pages',
  'undeletepagetext'             => 'The following {{PLURAL:$1|page has been deleted but is|$1 pages have been deleted but are}} still in the archive and can be restored.
  The archive may be periodically cleaned out.',
  'undelete-fieldset-title'      => 'Restore revisions',
 -'undeleteextrahelp'            => "To restore the page's entire history, leave all checkboxes deselected and click '''''{{int:undeletebtn}}'''''.
 -To perform a selective restoration, check the boxes corresponding to the revisions to be restored, and click '''''{{int:undeletebtn}}'''''.",
 +'undeleteextrahelp'            => "To restore the page's entire history, leave all checkboxes deselected and click <strong><em>{{int:undeletebtn}}</em></strong>.
 +To perform a selective restoration, check the boxes corresponding to the revisions to be restored, and click <strong><em>{{int:undeletebtn}}</em></strong>.",
  'undeleterevisions'            => '$1 {{PLURAL:$1|revision|revisions}} archived',
  'undeletehistory'              => 'If you restore the page, all revisions will be restored to the history.
  If a new page with the same name has been created since the deletion, the restored revisions will appear in the prior history.',
@@@ -3208,7 -3199,7 +3220,7 @@@ You may have a bad link, or the revisio
  'undeletedfiles'               => '{{PLURAL:$1|1 file|$1 files}} restored',
  'cannotundelete'               => 'Undelete failed:
  $1',
 -'undeletedpage'                => "'''$1 has been restored'''
 +'undeletedpage'                => "<strong>$1 has been restored</strong>
  
  Consult the [[Special:Log/delete|deletion log]] for a record of recent deletions and restorations.",
  'undelete-header'              => 'See [[Special:Log/delete|the deletion log]] for recently deleted pages.',
@@@ -3277,9 -3268,9 +3289,9 @@@ The latest block log entry is provided 
  'whatlinkshere-title'      => 'Pages that link to "$1"',
  'whatlinkshere-summary'    => '', # do not translate or duplicate this message to other languages
  'whatlinkshere-page'       => 'Page:',
 -'linkshere'                => "The following pages link to '''[[:$1]]''':",
 -'nolinkshere'              => "No pages link to '''[[:$1]]'''.",
 -'nolinkshere-ns'           => "No pages link to '''[[:$1]]''' in the chosen namespace.",
 +'linkshere'                => "The following pages link to <strong>[[:$1]]</strong>:",
 +'nolinkshere'              => "No pages link to <strong>[[:$1]]</strong>.",
 +'nolinkshere-ns'           => "No pages link to <strong>[[:$1]]</strong> in the chosen namespace.",
  'isredirect'               => 'redirect page',
  'istemplate'               => 'transclusion',
  'isimage'                  => 'file link',
@@@ -3375,7 -3366,7 +3387,7 @@@ See the [[Special:BlockList|block list]
  'contribslink'                    => 'contribs',
  'emaillink'                       => 'send email',
  'autoblocker'                     => 'Autoblocked because your IP address has been recently used by "[[User:$1|$1]]".
 -The reason given for $1\'s block is "\'\'$2\'\'"',
 +The reason given for $1\'s block is "$2"',
  'blocklogpage'                    => 'Block log',
  'blocklog-showlog'                => 'This user has been blocked previously.
  The block log is provided below for reference:',
@@@ -3453,10 -3444,10 +3465,10 @@@ You can update redirects that point to 
  If you choose not to, be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].
  You are responsible for making sure that links continue to point where they are supposed to go.
  
 -Note that the page will '''not''' be moved if there is already a page at the new title, unless the latter is a redirect and has no past edit history.
 +Note that the page will <strong>not</strong> be moved if there is already a page at the new title, unless the latter is a redirect and has no past edit history.
  This means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.
  
 -'''Warning!'''
 +<strong>Warning!</strong>
  This can be a drastic and unexpected change for a popular page;
  please be sure you understand the consequences of this before proceeding.",
  'movepagetext-noredirectfixer' => "Using the form below will rename a page, moving all of its history to the new name.
@@@ -3464,19 -3455,19 +3476,19 @@@ The old title will become a redirect pa
  Be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].
  You are responsible for making sure that links continue to point where they are supposed to go.
  
 -Note that the page will '''not''' be moved if there is already a page at the new title, unless it is a redirect and has no past edit history.
 +Note that the page will <strong>not</strong> be moved if there is already a page at the new title, unless it is a redirect and has no past edit history.
  This means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.
  
 -'''Warning!'''
 +<strong>Warning!</strong>
  This can be a drastic and unexpected change for a popular page;
  please be sure you understand the consequences of this before proceeding.",
 -'movepagetalktext'             => "The associated talk page will be automatically moved along with it '''unless:'''
 +'movepagetalktext'             => "The associated talk page will be automatically moved along with it <strong>unless:</strong>
  *A non-empty talk page already exists under the new name, or
  *You uncheck the box below.
  
  In those cases, you will have to move or merge the page manually if desired.",
  'movearticle'                  => 'Move page:',
 -'moveuserpage-warning'         => "'''Warning:''' You are about to move a user page. Please note that only the page will be moved and the user will ''not'' be renamed.",
 +'moveuserpage-warning'         => "<strong>Warning:</strong> You are about to move a user page. Please note that only the page will be moved and the user will <em>not</em> be renamed.",
  'movenologintext'              => 'You must be a registered user and [[Special:UserLogin|logged in]] to move a page.',
  'movenotallowed'               => 'You do not have permission to move pages.',
  'movenotallowedfile'           => 'You do not have permission to move files.',
  'move-watch'                   => 'Watch source page and target page',
  'movepagebtn'                  => 'Move page',
  'pagemovedsub'                 => 'Move succeeded',
 -'movepage-moved'               => '\'\'\'"$1" has been moved to "$2"\'\'\'',
 +'movepage-moved'               => '<strong>"$1" has been moved to "$2"</strong>',
  'movepage-moved-redirect'      => 'A redirect has been created.',
  'movepage-moved-noredirect'    => 'The creation of a redirect has been suppressed.',
  'articleexists'                => 'A page of that name already exists, or the name you have chosen is not valid.
@@@ -3527,9 -3518,9 +3539,9 @@@ cannot move a page over itself.'
  'imageinvalidfilename'         => 'The target filename is invalid',
  'fix-double-redirects'         => 'Update any redirects that point to the original title',
  'move-leave-redirect'          => 'Leave a redirect behind',
 -'protectedpagemovewarning'     => "'''Warning:''' This page has been protected so that only users with administrator privileges can move it.
 +'protectedpagemovewarning'     => "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can move it.
  The latest log entry is provided below for reference:",
 -'semiprotectedpagemovewarning' => "'''Note:''' This page has been protected so that only registered users can move it.
 +'semiprotectedpagemovewarning' => "<strong>Note:</strong> This page has been protected so that only registered users can move it.
  The latest log entry is provided below for reference:",
  'move-over-sharedrepo'         => '== File exists ==
  [[:$1]] exists on a shared repository. Moving a file to this title will override the shared file.',
@@@ -3548,7 -3539,7 +3560,7 @@@ In the latter case you can also use a l
  'exportall'         => 'Export all pages',
  'exportcuronly'     => 'Include only the current revision, not the full history',
  'exportnohistory'   => "----
 -'''Note:''' Exporting the full history of pages through this form has been disabled due to performance reasons.",
 +<strong>Note:</strong> Exporting the full history of pages through this form has been disabled due to performance reasons.",
  'exportlistauthors' => 'Include a full list of contributors for each page',
  'export-submit'     => 'Export',
  'export-addcattext' => 'Add pages from category:',
  'allmessagescurrent'            => 'Current message text',
  'allmessagestext'               => 'This is a list of system messages available in the MediaWiki namespace.
  Please visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.',
 -'allmessagesnotsupportedDB'     => "This page cannot be used because '''\$wgUseDatabaseMessages''' has been disabled.",
 +'allmessagesnotsupportedDB'     => "This page cannot be used because <strong>\$wgUseDatabaseMessages</strong> has been disabled.",
  'allmessages-filter-legend'     => 'Filter',
  'allmessages-filter'            => 'Filter by customization state:',
  'allmessages-filter-unmodified' => 'Unmodified',
  'allmessages-prefix'            => 'Filter by prefix:',
  'allmessages-language'          => 'Language:',
  'allmessages-filter-submit'     => 'Go',
 +'allmessages-filter-translate'  => 'Translate',
  
  # Thumbnails
  'thumbnail-more'           => 'Enlarge',
@@@ -3592,7 -3582,6 +3604,7 @@@ $2'
  'thumbnail_image-type'     => 'Image type not supported',
  'thumbnail_gd-library'     => 'Incomplete GD library configuration: Missing function $1',
  'thumbnail_image-missing'  => 'File seems to be missing: $1',
 +'thumbnail_image-failure-limit' => 'There have been too many recent failed attempts ($1 or more) to render this thumbnail. Please try again later.',
  
  # Special:Import
  'import'                     => 'Import pages',
@@@ -3632,7 -3621,7 +3644,7 @@@ The file was only partially uploaded.'
  A temporary folder is missing.',
  'import-parse-failure'       => 'XML import parse failure',
  'import-noarticle'           => 'No page to import!',
 -'import-nonewrevisions'      => 'All revisions were previously imported.',
 +'import-nonewrevisions'      => 'No revisions imported (all were either already present, or skipped due to errors).',
  'xml-error-string'           => '$1 at line $2, col $3 (byte $4): $5',
  'import-upload'              => 'Upload XML data',
  'import-token-mismatch'      => 'Loss of session data.
@@@ -3644,7 -3633,6 +3656,7 @@@ Please try again.'
  'import-error-special'       => 'Page "$1" is not imported because it belongs to a special namespace that does not allow pages.',
  'import-error-invalid'       => 'Page "$1" is not imported because its name is invalid.',
  'import-error-unserialize'   => 'Revision $2 of page "$1" could not be unserialized. The revision was reported to use content model $3 serialized as $4.',
 +'import-error-bad-location'  => 'Revision $2 using content model $3 can not be stored on "$1" on this wiki, since that model is not supported on that page.',
  'import-options-wrong'       => 'Wrong {{PLURAL:$2|option|options}}: <nowiki>$1</nowiki>',
  'import-rootpage-invalid'    => 'Given root page is an invalid title.',
  'import-rootpage-nosubpage'  => 'Namespace "$1" of the root page does not allow subpages.',
  'accesskey-pt-watchlist'                => 'l', # do not translate or duplicate this message to other languages
  'accesskey-pt-mycontris'                => 'y', # do not translate or duplicate this message to other languages
  'accesskey-pt-login'                    => 'o', # do not translate or duplicate this message to other languages
 -'accesskey-pt-anonlogin'                => 'o', # do not translate or duplicate this message to other languages
  'accesskey-pt-logout'                   => '', # do not translate or duplicate this message to other languages
  'accesskey-ca-talk'                     => 't', # do not translate or duplicate this message to other languages
  'accesskey-ca-edit'                     => 'e', # do not translate or duplicate this message to other languages
  'tooltip-pt-watchlist'                => 'A list of pages you are monitoring for changes',
  'tooltip-pt-mycontris'                => 'A list of your contributions',
  'tooltip-pt-login'                    => 'You are encouraged to log in; however, it is not mandatory',
 -'tooltip-pt-anonlogin'                => 'You are encouraged to log in; however, it is not mandatory',
  'tooltip-pt-logout'                   => 'Log out',
  'tooltip-ca-talk'                     => 'Discussion about the content page',
  'tooltip-ca-edit'                     => 'You can edit this page. Please use the preview button before saving',
@@@ -3858,7 -3848,7 +3870,7 @@@ This is probably caused by a link to a 
  'spam_blanking'       => 'All revisions contained links to $1, blanking',
  'spam_deleting'       => 'All revisions contained links to $1, deleting',
  'simpleantispam-label' => "Anti-spam check.
 -Do '''NOT''' fill this in!",
 +Do <strong>NOT</strong> fill this in!",
  
  # Info page
  'pageinfo-header'                 => '-', # do not translate or duplicate this message to other languages
@@@ -3951,9 -3941,9 +3963,9 @@@ $1'
  'nextdiff'     => 'Newer edit →',
  
  # Media information
 -'mediawarning'                => "'''Warning:''' This file type may contain malicious code.
 +'mediawarning'                => "<strong>Warning:</strong> This file type may contain malicious code.
  By executing it, your system may be compromised.",
 -'imagemaxsize'                => "Image size limit:<br />''(for file description pages)''",
 +'imagemaxsize'                => "Image size limit:<br /><em>(for file description pages)</em>",
  'thumbsize'                   => 'Thumbnail size:',
  'widthheight'                 => '$1 × $2', # only translate this message to other languages if you have to change it
  'widthheightpage'             => '$1 × $2, $3 {{PLURAL:$3|page|pages}}',
  'file-info-png-looped'        => 'looped',
  'file-info-png-repeat'        => 'played $1 {{PLURAL:$1|time|times}}',
  'file-info-png-frames'        => '$1 {{PLURAL:$1|frame|frames}}',
 -'file-no-thumb-animation'     => "'''Note: Due to technical limitations, thumbnails of this file will not be animated.'''",
 -'file-no-thumb-animation-gif' => "'''Note: Due to technical limitations, thumbnails of high resolution GIF images such as this one will not be animated.'''",
 +'file-no-thumb-animation'     => "<strong>Note: Due to technical limitations, thumbnails of this file will not be animated.</strong>",
 +'file-no-thumb-animation-gif' => "<strong>Note: Due to technical limitations, thumbnails of high resolution GIF images such as this one will not be animated.</strong>",
  
  # Special:NewFiles
  'newimages'             => 'Gallery of new files',
 -'imagelisttext'         => "Below is a list of '''$1''' {{PLURAL:$1|file|files}} sorted $2.",
 +'imagelisttext'         => "Below is a list of <strong>$1</strong> {{PLURAL:$1|file|files}} sorted $2.",
  'newimages-summary'     => 'This special page shows the last uploaded files.',
  'newimages-legend'      => 'Filter',
  'newimages-label'       => 'Filename (or a part of it):',
@@@ -4099,7 -4089,7 +4111,7 @@@ Others will be hidden by default
  * gpslatitude
  * gpslongitude
  * gpsaltitude',
 -'metadata-langitem'         => "'''$2:''' $1", # only translate this message to other languages if you have to change it
 +'metadata-langitem'         => "<strong>$2:</strong> $1", # only translate this message to other languages if you have to change it
  'metadata-langitem-default' => '$1', # only translate this message to other languages if you have to change it
  
  # Exif tags
@@@ -4617,9 -4607,9 +4629,9 @@@ This confirmation code will expire at $
  'scarytranscludetoolong'           => '[URL is too long]',
  
  # Delete conflict
 -'deletedwhileediting'      => "'''Warning:''' This page was deleted after you started editing!",
 +'deletedwhileediting'      => "<strong>Warning:</strong> This page was deleted after you started editing!",
  'confirmrecreate'          => "User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing with reason:
 -: ''$2''
 +: <em>$2</em>
  Please confirm that you really want to recreate this page.",
  'confirmrecreate-noreason' => 'User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing. Please confirm that you really want to recreate this page.',
  'recreate'                 => 'Recreate',
@@@ -4830,7 -4820,7 +4842,7 @@@ You can also [[Special:EditWatchlist|us
  
  # Core parser functions
  'unknown_extension_tag' => 'Unknown extension tag "$1"',
 -'duplicate-defaultsort' => '\'\'\'Warning:\'\'\' Default sort key "$2" overrides earlier default sort key "$1".',
 +'duplicate-defaultsort' => '<strong>Warning:</strong> Default sort key "$2" overrides earlier default sort key "$1".',
  
  # Special:Version
  'version'                               => 'Version',
  'version-ext-colheader-license'         => 'License',
  'version-ext-colheader-description'     => 'Description',
  'version-ext-colheader-credits'         => 'Authors',
 -'version-poweredby-credits'             => "This wiki is powered by '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 +'version-poweredby-credits'             => "This wiki is powered by <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
  'version-poweredby-others'              => 'others',
  'version-poweredby-translators'         => 'translatewiki.net translators',
  'version-credits-summary'               => 'We would like to recognize the following persons for their contribution to [[Special:Version|MediaWiki]].',
   * @author Huji
   * @author IAlex
   * @author INkubusse
 + * @author Incnis Mrsi
   * @author Iniquity
   * @author Iwan Novirion
   * @author Jon Harald Søby
   * @author Joseph
 + * @author Kaganer
   * @author Karduelis
   * @author Kazu89
   * @author Kghbln
@@@ -91,7 -89,6 +91,7 @@@
   * @author Mihai
   * @author Minh Nguyen
   * @author Moha
 + * @author MongolWiki
   * @author Mormegil
   * @author Mpradeep
   * @author Murma174
  $messages = array(
  # User preference toggles
  'tog-underline' => "[[Special:Preferences]], tab 'Misc'. Offers user a choice how to underline links. {{Gender}}",
 -'tog-justify' => "[[Special:Preferences]], tab 'Appearance'. Offers user a choice to justify paragraphs or not. {{Gender}}",
  'tog-hideminor' => "[[Special:Preferences]], tab 'Recent changes'. Offers user to hide minor edits in recent changes or not. {{Gender}}",
  'tog-hidepatrolled' => 'Option in Recent changes tab of [[Special:Preferences]] (if [[mw:Manual:$wgUseRCPatrol|$wgUseRCPatrol]] is enabled). {{Gender}}',
  'tog-newpageshidepatrolled' => 'Toggle in [[Special:Preferences]], section "Recent changes" (if [[mw:Manual:$wgUseRCPatrol|$wgUseRCPatrol]] is enabled). {{Gender}}',
@@@ -183,8 -181,11 +183,8 @@@ Offers user to use alternative represen
  This is the toolbar: [[Image:Toolbar.png]]",
  'tog-editondblclick' => "{{Gender}}
  [[Special:Preferences]], tab 'Edit'. Offers user to open edit page on double click.",
 -'tog-editsection' => "[[Special:Preferences]], tab 'Edit'. Offers user to add links in sub headings for editing sections. {{Gender}}",
  'tog-editsectiononrightclick' => "{{Gender}}
  [[Special:Preferences]], tab 'Edit'. Offers user to edit a section by clicking on a section title.",
 -'tog-showtoc' => "[[Special:Preferences]], tab 'Misc'.
 -Offers user to show a table of contents automatically if a page has more than 3 headings (= 4 or more headings).",
  'tog-rememberpassword' => "{{Gender}}
  [[Special:Preferences]], tab 'User profile', section 'Change password'. Offers user remember login details.
  Parameters:
@@@ -406,8 -407,8 +406,8 @@@ Parameters
  Parameters:
  * $1 - number of subcategories shown',
  'category-article-count' => 'This message is used on category pages. Parameters:
 -* $1 - number of pages shown
 -* $2 - total number of pages in category',
 +* $1  number of pages shown
 +* $2  total number of pages in category',
  'category-article-count-limited' => 'This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted.
  
  Parameters:
  'category-file-count' => 'This message is displayed at the top of a category page showing the number of pages in the category.
  
  Parameters:
 -* $1 - number of files shown
 -* $2 - total number of files in category',
 +* $1  number of files shown
 +* $2  total number of files in category',
  'category-file-count-limited' => 'This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted.
  
  Parameters:
@@@ -509,6 -510,7 +509,6 @@@ This page is only linked in CologneBlu
  {{Identical|Undelete}}',
  'vector-action-unprotect' => 'Tab at top of page, in vector skin.
  {{Identical|Change protection}}',
 -'vector-simplesearch-preference' => 'Preference for enhanced search suggestion in the Vector skin.',
  'vector-view-create' => 'Tab label in the Vector skin. See for example {{canonicalurl:Foo|useskin=vector}}
  {{Identical|Create}}',
  'vector-view-edit' => 'Tab label in the Vector skin. See for example {{canonicalurl:Main_Page|useskin=vector}}
@@@ -854,10 -856,8 +854,10 @@@ See also
  * {{msg-mw|Youhavenewmessages}}',
  'newmessageslinkplural' => "This is the first link displayed in an orange rectangle when a user gets a message on their talk page.
  
 -Used as <code>$1</code> in messages {{msg-mw|youhavenewmessagesfromusers}}, {{msg-mw|youhavenewmessagesmanyusers}}, {{msg-mw|youhavenewmessages}}.
 -
 +Used as <code>$1</code> in the following messages:
 +* {{msg-mw|youhavenewmessagesfromusers}}
 +* {{msg-mw|youhavenewmessagesmanyusers}}
 +* {{msg-mw|youhavenewmessages}}.
  Parameters:
  * $1 - 1 or 999:
  ** 1 - if there was '''one''' new edit since the last time the user has seen their talk page
@@@ -1293,8 -1293,13 +1293,8 @@@ See example: [[Special:UserLogin]]'
  'yourdomainname' => 'Used as label for listbox.',
  'password-change-forbidden' => 'Error message shown when an external authentication source does not allow the password to be changed.',
  'externaldberror' => 'This message is thrown when a valid attempt to change the wiki password for a user fails because of a database error or an error from an external system.',
 -'login' => "Shown as the caption of the button at [[Special:UserLogin]], and also to anonymous users in the upper right corner of the page when they can't create an account (otherwise the message {{msg-mw|nav-login-createaccount}} is shown there). Also the title of the new login special page, which does not combine Log in & Create account.
 -
 -See also:
 -* {{msg-mw|Login}}
 -* {{msg-mw|Accesskey-pt-anonlogin}}
 -* {{msg-mw|Tooltip-pt-anonlogin}}
 -{{Identical|Log in}}",
 +'login' => '{{Doc-special|UserLogin|unlisted=1}}
 +{{Identical|Log in}}',
  'nav-login-createaccount' => "Shown to anonymous users in the upper right corner of the page. When you can't create an account, the message {{msg-mw|login}} is shown.
  {{Identical|Log in / create account}}",
  'loginprompt' => 'A small notice in the log in form.',
@@@ -1311,7 -1316,8 +1311,7 @@@ See also
  * {{msg-mw|Accesskey-pt-logout}}
  * {{msg-mw|Tooltip-pt-logout}}
  {{Identical|Log out}}',
 -'userlogout' => '{{Doc-actionlink}}
 -{{doc-special|UserLogout|unlisted=1}}
 +'userlogout' => '{{doc-special|UserLogout|unlisted=1}}
  {{Identical|Log out}}',
  'notloggedin' => 'This message is displayed in the standard skin when not logged in. The message is placed above the login link in the top right corner of pages.
  
@@@ -1325,8 -1331,10 +1325,8 @@@ See example: [[Special:UserLogin]]'
  * $1 - a link to the account creation form, and the text of it is {{msg-mw|Nologinlink}}
  {{Identical|Do not have an account}}',
  'nologinlink' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED.
 -{{Identical|Create an account}}',
 -'createaccount' => 'Used on the top of the page for logged out users, where it appears next to {{msg-mw|login}}, so consider making them similar.
 -
 -{{doc-special|CreateAccount}}
 +{{Identical|Create account}}',
 +'createaccount' => '{{doc-special|CreateAccount|unlisted=1}}
  {{Identical|Create account}}',
  'gotaccount' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED. Parameter:
  * $1 - a link to the log in form, and the text of it is {{msg-mw|Gotaccountlink}}',
@@@ -1550,7 -1558,7 +1550,7 @@@ Parameters
  * $3 - a password (randomly generated)
  * $4 - a URL to the wiki ('<' + server name + script name + '>')
  * $5 - (Unused) number of days to password expiry date",
 -'login-throttled' => 'Error message shown at [[Special:UserLogin]] after the user has tried to login with incorrect password too many times; also used by [[Special:ChangeEmail]] and [[Special:ChangePassword]].
 +'login-throttled' => 'Error message shown at [[Special:UserLogin]] after the user has tried to login with incorrect password too many times.
  
  The user has to wait a certain time before trying to log in again.
  
@@@ -1568,8 -1576,7 +1568,8 @@@ Parameters
  
  This is a protection against robots trying to find the password by trying lots of them.
  The number of attempts and waiting time are configured via [[mw:Manual:$wgPasswordAttemptThrottle|$wgPasswordAttemptThrottle]].
 -This message is used in html.',
 +This message is used in html.
 +{{identical|Login throttled}}',
  'login-abort-generic' => 'The generic unsuccessful login message is used unless otherwise specified by hook writers',
  'loginlanguagelabel' => 'Used on [[Special:UserLogin]] if $wgLoginLanguageSelector is true. Parameters:
  * $1 - a pipe-separated list built from the names that appear in the message {{msg-mw|Loginlanguagelinks}}.
  'createacct-another-realname-tip' => "{{doc-singularthey}}
  Used on the account creation form when creating another user's account. Similar to {{msg-mw|prefs-help-realname}}.
  {{Identical|Real name attribution}}",
 +'pt-login' => "Shown as the caption of the button at [[Special:UserLogin]], and also to anonymous users in the upper right corner of the page when they can't create an account (otherwise the message {{msg-mw|nav-login-createaccount}} is shown there)
 +{{Identical|Log in}}",
 +'pt-createaccount' => 'Used on the top of the page for logged out users, where it appears next to {{msg-mw|login}}, so consider making them similar.
 +{{Identical|Create account}}',
 +'pt-userlogout' => '{{Doc-actionlink}}
 +{{Identical|Log out}}',
  
  # Email sending
  'php-mail-error-unknown' => 'Used as error message when <code>mail()</code> returned empty error message.',
  'resetpass_header' => 'Header on box on special page [[Special:ChangePassword]].
  
  {{Identical|Reset password}}',
 -'oldpassword' => "Used on the 'User profile' tab of 'my preferences'. This is the text next to an entry box for the old password in the 'change password' section.",
 +'oldpassword' => "Used on the 'User profile' tab of 'my preferences'. This is the text next to an entry box for the old password in the 'change password' section.
 +{{Identical|Old password}}",
  'newpassword' => '{{Identical|New password}}',
  'retypenew' => "Appears on the 'User profile' tab of the 'Preferences' special page in the 'Change password' section. It appears next to the text box for entering the new password a second time.",
  'resetpass_submit' => 'Submit button on [[Special:ChangePassword]]',
  'changepassword-success' => 'Used in [[Special:ChangePassword]].',
 +'changepassword-throttled' => 'Error message shown at [[Special:ChangePassword]] after the user has tried to login with incorrect password too many times.
 +
 +The user has to wait a certain time before trying to log in again.
 +
 +Parameters:
 +* $1 - the time to wait before the next login attempt. Automatically formatted using the following duration messages:
 +** {{msg-mw|Duration-millennia}}
 +** {{msg-mw|Duration-centuries}}
 +** {{msg-mw|Duration-decades}}
 +** {{msg-mw|Duration-years}}
 +** {{msg-mw|Duration-weeks}}
 +** {{msg-mw|Duration-days}}
 +** {{msg-mw|Duration-hours}}
 +** {{msg-mw|Duration-minutes}}
 +** {{msg-mw|Duration-seconds}}
 +
 +This is a protection against robots trying to find the password by trying lots of them.
 +The number of attempts and waiting time are configured via [[mw:Manual:$wgPasswordAttemptThrottle|$wgPasswordAttemptThrottle]].
 +This message is used in html.
 +
 +See also:
 +* {{msg-mw|Changeemail-throttled}}',
  'resetpass_forbidden' => "Used as error message in changing password. Maybe the external auth plugin won't allow local password changes.",
  'resetpass-no-info' => 'Error message for [[Special:ChangePassword]].
  
@@@ -1637,12 -1615,8 +1637,12 @@@ Parameters
  'resetpass-submit-cancel' => 'Used on [[Special:ResetPass]].
  {{Identical|Cancel}}',
  'resetpass-wrong-oldpass' => 'Error message shown on [[Special:ChangePassword]] when the old password is not valid.',
 +'resetpass-recycled' => 'Error message shown on [[Special:ChangePassword]] when a user attempts to reset their password to their existing password.',
 +'resetpass-temp-emailed' => 'Message shown on [[Special:ChangePassword]] when a user logs in with a temporary password, and must set a new password.',
  'resetpass-temp-password' => 'The label of the input box for the temporary password (received by email) on the form displayed after logging in with a temporary password.',
  'resetpass-abort-generic' => 'Generic error message shown on [[Special:ChangePassword]] when an extension aborts a password change from a hook.',
 +'resetpass-expired' => "Generic error message shown on [[Special:ChangePassword]] when a user's password is expired",
 +'resetpass-expired-soft' => 'Generic marning message shown on [[Special:ChangePassword]] when a user needs to reset their password, but they are not prevented from logging in at this time',
  
  # Special:PasswordReset
  'passwordreset' => 'Title of [[Special:PasswordReset]].
@@@ -1719,28 -1693,6 +1719,28 @@@ Parameters
  'changeemail-cancel' => 'Cancel button on [[Special:ChangeEmail]]
  
  {{Identical|Cancel}}',
 +'changeemail-throttled' => 'Error message shown at [[Special:ChangeEmail]] after the user has tried to login with incorrect password too many times.
 +
 +The user has to wait a certain time before trying to log in again.
 +
 +Parameters:
 +* $1 - the time to wait before the next login attempt. Automatically formatted using the following duration messages:
 +** {{msg-mw|Duration-millennia}}
 +** {{msg-mw|Duration-centuries}}
 +** {{msg-mw|Duration-decades}}
 +** {{msg-mw|Duration-years}}
 +** {{msg-mw|Duration-weeks}}
 +** {{msg-mw|Duration-days}}
 +** {{msg-mw|Duration-hours}}
 +** {{msg-mw|Duration-minutes}}
 +** {{msg-mw|Duration-seconds}}
 +
 +This is a protection against robots trying to find the password by trying lots of them.
 +The number of attempts and waiting time are configured via [[mw:Manual:$wgPasswordAttemptThrottle|$wgPasswordAttemptThrottle]].
 +This message is used in html.
 +
 +See also:
 +* {{msg-mw|Changepassword-throttled}}',
  
  # Special:ResetTokens
  'resettokens' => '{{doc-special|ResetTokens}}
@@@ -2184,7 -2136,9 +2184,7 @@@ Parameters
  'content-not-allowed-here' => 'Error message indicating that the desired content model is not supported in given localtion.
  * $1 - the human readable name of the content model: {{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}
  * $2 - the title of the page in question',
 -'editwarning-warning' => "{{doc-important|Do ''not'' use <nowiki>{{int:prefs-editing}}</nowiki> for \"Editing\". It is forbidden in this message, see [[mwr:68405]].}}
 -
 -but you can see the text of that button here: {{msg-mw|Prefs-editing}}",
 +'editwarning-warning' => 'Uses {{msg-mw|Prefs-editing}}',
  'editpage-notsupportedcontentformat-title' => 'Title of error page shown when using an incompatible format on EditPage',
  'editpage-notsupportedcontentformat-text' => 'Error message shown when using an incompatible format on EditPage. Parameters:
  * $1 - the format id
@@@ -2301,21 -2255,10 +2301,21 @@@ See also
  {{Identical|Undo}}',
  'undo-failure' => 'Message appears if an attempt to revert an edit by clicking the "undo" link on the page history fails.
  
 +See also:
 +* {{msg-mw|Undo-norev}}
 +* {{msg-mw|Undo-nochange}}
  {{Identical|Undo}}',
  'undo-norev' => 'Message appears if an attempt to revert an edit by clicking the "undo" link on the page history fails.
  
 +See also:
 +* {{msg-mw|Undo-failure}}
 +* {{msg-mw|Undo-nochange}}
  {{Identical|Undo}}',
 +'undo-nochange' => 'Message appears if an attempt to revert an edit by clicking the "undo" link results in an edit making no change to the current version of the page.
 +
 +See also:
 +* {{msg-mw|Undo-failure}}
 +* {{msg-mw|Undo-norev}}',
  'undo-summary' => 'Edit summary for an undo action. Parameters:
  * $1 - revision ID
  * $2 - username
@@@ -2821,23 -2764,20 +2821,23 @@@ See also
  This message has sometimes a tooltip {{msg-mw|tooltip-undo}}
  {{Identical|Undo}}',
  'diff-empty' => 'This message appears instead of a "diff" when comparing two revisions that are identical.',
 -'diff-multi' => "This message appears in the revision history of a page when comparing two versions which aren't consecutive.
 +'diff-multi-sameuser' => "This message appears in the revision history of a page when comparing two versions which aren't consecutive, and the intermediate revisions were all created by the same user as the new revision.
  
  Parameters:
  * $1 - the number of revisions
 -* $2 - the number of distinct users who made those revisions
 -See also:
 -* {{msg-mw|Diff-multi-manyusers}}",
 +{{Related|Diff-multi}}",
 +'diff-multi-otherusers' => "This message appears in the revision history of a page when comparing two versions which aren't consecutive, and at least one of the intermediate revisions was created by a user other than the user who created the new revision.
 +
 +Parameters:
 +* $1 - the number of revisions
 +* $2 - the number of distinct other users who made those revisions
 +{{Related|Diff-multi}}",
  'diff-multi-manyusers' => "This message appears in the revision history of a page when comparing two versions which aren't consecutive, and the intermediate revisions have been edited by more than 100 users.
  
  Parameters:
  * $1 - the number of revisions, will always be 101 or more
  * $2 - the number of users that were found, which was limited at 100
 -See also:
 -* {{msg-mw|Diff-multi}}",
 +{{Related|Diff-multi}}",
  'difference-missing-revision' => 'Text displayed when the requested revision does not exist using a diff link.
  
  Example: [{{canonicalurl:Project:News|diff=426850&oldid=99999999}} Diff with invalid revision#]
@@@ -2993,12 -2933,6 +2993,12 @@@ Parameters
  * $2 - the number of the first item listed
  See also:
  * {{msg-mw|Showingresultsnum}}',
 +'showingresultsinrange' => 'Used in pagination of [[Special:MostLinkedCategories]]. Parameters:
 +* $1 - the total number of results in the batch shown
 +* $2 - the number of the first item listed
 +* $3 - the number of last item in the batch shown
 +
 +See also {{msg-mw|Showingresults}}',
  'showingresultsnum' => 'Parameters:
  * $1 - (Unused) the total number of results in the batch shown
  * $2 - the first number in the batch of results
@@@ -3696,21 -3630,93 +3696,93 @@@ Parameters
  
  The corresponding message is {{msg-mw|Rcnotefrom}}.',
  'rcshowhideminor' => 'Option text in [[Special:RecentChanges]]. Parameters:
- * $1 - the "show/hide" command, with the text taken from either {{msg-mw|Show}} or {{msg-mw|Hide}}',
+ * $1 - the "show/hide" command, with the text taken from either {{msg-mw|rcshowhideminor-show}} or {{msg-mw|rcshowhideminor-hide}}',
+ 'rcshowhideminor-show' => '{{doc-actionlink}}
+ Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideminor}}.
+ See also:
+ * {{msg-mw|rcshowhideminor-hide}}
+ {{Identical|Show}}',
+ 'rcshowhideminor-hide' => '{{doc-actionlink}}
+ Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideminor}}.
+ See also:
+ * {{msg-mw|rcshowhideminor-show}}
+ {{Identical|Hide}}',
  'rcshowhidebots' => 'Option text in [[Special:RecentChanges]]. Parameters:
- * $1 - the "show/hide" command, with the text taken from either {{msg-mw|Show}} or {{msg-mw|Hide}}
+ * $1 - the "show/hide" command, with the text taken from either {{msg-mw|rcshowhidebots-show}} or {{msg-mw|rcshowhidebots-hide}}
  {{Identical|$1 bots}}',
+ 'rcshowhidebots-show' => '{{doc-actionlink}}
+ Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidebots}}.
+ See also:
+ * {{msg-mw|rcshowhidebots-show}}
+ {{Identical|Show}}',
+ 'rcshowhidebots-hide' => '{{doc-actionlink}}
+ Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidebots}}.
+ See also:
+ * {{msg-mw|rcshowhidebots-hide}}
+ {{Identical|Hide}}',
  'rcshowhideliu' => 'Option text in [[Special:RecentChanges]]. Parameters:
  * $1 - any one of the following messages:
- ** {{msg-mw|Show}}
- ** {{msg-mw|Hide}}',
+ ** {{msg-mw|rcshowhideliu-show}}
+ ** {{msg-mw|rcshowhideliu-hide}}',
+ 'rcshowhideliu-show' => '{{doc-actionlink}}
+ Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideliu}}.
+ See also:
+ * {{msg-mw|rcshowhideliu-hide}}
+ {{Identical|Show}}',
+ 'rcshowhideliu-hide' => '{{doc-actionlink}}
+ Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideliu}}.
+ See also:
+ * {{msg-mw|rcshowhideliu-show}}
+ {{Identical|Hide}}',
  'rcshowhideanons' => 'Option text in [[Special:RecentChanges]]. Parameters:
- * $1 - the "show/hide" command, with the text taken from either {{msg-mw|Show}} or {{msg-mw|Hide}}
+ * $1 - the "show/hide" command, with the text taken from either {{msg-mw|rcshowhideanons-show}} or {{msg-mw|showhideanons-hide}}
  {{Identical|Anonymous user}}',
+ 'rcshowhideanons-show' => '{{doc-actionlink}}
+ Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideanons}}.
+ See also:
+ * {{msg-mw|rcshowhideanons-hide}}
+ {{Identical|Hide}}',
+ 'rcshowhideanons-hide' => '{{doc-actionlink}}
+ Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideanons}}.
+ See also:
+ * {{msg-mw|rcshowhideanons-show}}
+ {{Identical|hide}}',
  'rcshowhidepatr' => 'Option text in [[Special:RecentChanges]]. Parameters:
- * $1 - the "show/hide" command, with the text taken from either {{msg-mw|Show}} or {{msg-mw|Hide}}',
+ * $1 - the "show/hide" command, with the text taken from either {{msg-mw|rcshowhidepatr-show}} or {{msg-mw|rcshowhidepatr-hide}}',
+ 'rcshowhidepatr-show' => '{{doc-actionlink}}
+ Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidepatr}}.
+ See also:
+ * {{msg-mw|rcshowhidepatr-hide}}
+ {{Identical|Show}}',
+ 'rcshowhidepatr-hide' => '{{doc-actionlink}}
+ Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidepatr}}.
+ See also:
+ * {{msg-mw|rcshowhidepatr-show}}
+ {{Identical|Hide}}',
  'rcshowhidemine' => 'Option text in [[Special:RecentChanges]]. Parameters:
- * $1 - the "show/hide" command, with the text taken from either {{msg-mw|Show}} or {{msg-mw|Hide}}',
+ * $1 - the "show/hide" command, with the text taken from either {{msg-mw|rcshowhidemine-show}} or {{msg-mw|rcshowhidemine-hide}}',
+ 'rcshowhidemine-show' => '{{doc-actionlink}}
+ Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidemine}}.
+ See also:
+ * {{msg-mw|rcshowhidemine-hide}}
+ {{Identical|show}}',
+ 'rcshowhidemine-hide' => '{{doc-actionlink}}
+ Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidemine}}.
+ See also:
+ * {{msg-mw|rcshowhidemine-show}}
+ {{Identical|hide}}',
  'rclinks' => "Used on [[Special:RecentChanges]].
  * \$1 - a list of different choices with number of pages to be shown.<br />&nbsp;Example: \"''50{{int:pipe-separator}}100{{int:pipe-separator}}250{{int:pipe-separator}}500\".
  * \$2 - a list of clickable links with a number of days for which recent changes are to be displayed.<br />&nbsp;Example: \"''1{{int:pipe-separator}}3{{int:pipe-separator}}7{{int:pipe-separator}}14{{int:pipe-separator}}30''\".
@@@ -4682,7 -4688,7 +4754,7 @@@ Parameters
  'shared-repo-name-wikimediacommons' => '{{optional}}
  {{Identical|Wikimedia Commons}}',
  'filepage.css' => '{{Optional}}',
 -'upload-disallowed-here' => 'This message appears on an image page in place of the normal reupload link if they cannot upload - e.g. if the image page is upload protected and they do not have the right priviledge.',
 +'upload-disallowed-here' => 'This message appears on an image page in place of the normal reupload link if they cannot upload - e.g. if the image page is upload protected and they do not have the right privilege.',
  
  # File reversion
  'filerevert' => 'Used as page title. Parameters:
@@@ -5021,34 -5027,11 +5093,34 @@@ See the following search results
  'deadendpagestext' => 'Introductory text for [[Special:DeadendPages]]',
  'protectedpages' => '{{doc-special|ProtectedPages}}',
  'protectedpages-indef' => 'Option in [[Special:ProtectedPages]]',
 +'protectedpages-summary' => 'Summary of [[Special:ProtectedPages]].
 +
 +See also:
 +* {{msg-mw|Protectedtitles-summary}}',
  'protectedpages-cascade' => 'Option in [[Special:ProtectedPages]]',
  'protectedpages-noredirect' => 'Option in [[Special:ProtectedPages]].
  {{Identical|Hide redirect}}',
  'protectedpagesempty' => 'Used in [[Special:ProtectedPages]], when there are no protected pages with the specified parameters.',
 +'protectedpages-timestamp' => 'This is a column header for dates and times in the table on the page [[Special:ProtectedPages]].
 +{{Identical|Timestamp}}',
 +'protectedpages-page' => 'This is a column header in the table on the page [[Special:ProtectedPages]].
 +{{Identical|Page}}',
 +'protectedpages-expiry' => 'This is a column header in the table on the page [[Special:ProtectedPages]].
 +
 +This refers to expiry timestamp.
 +{{Identical|Expire}}',
 +'protectedpages-performer' => 'This is a column header in the table on the page [[Special:ProtectedPages]].',
 +'protectedpages-params' => 'This is a column header in the table on the page [[Special:ProtectedPages]].',
 +'protectedpages-reason' => 'This is a column header in the table on the page [[Special:ProtectedPages]].
 +{{Identical|Reason}}',
 +'protectedpages-unknown-timestamp' => 'This is shown, when the date and time is unknown for a protection on the page [[Special:ProtectedPages]].
 +{{Identical|Unknown}}',
 +'protectedpages-unknown-performer' => 'This is shown, when the protecting user is unknown for a protection on the page [[Special:ProtectedPages]].',
  'protectedtitles' => '{{doc-special|ProtectedTitles}}',
 +'protectedtitles-summary' => 'Summary of [[Special:ProtectedTitles]].
 +
 +See also:
 +* {{msg-mw|Protectedpages-summary}}',
  'protectedtitlesempty' => 'Used on [[Special:ProtectedTitles]]. This text appears if the list of protected titles is empty. See the [[mw:Project:Protected_titles|help page on MediaWiki]] for more information.',
  'listusers' => '{{doc-special|ListUsers}}',
  'listusers-editsonly' => 'Option in [[Special:ListUsers]].',
@@@ -5510,14 -5493,13 +5582,14 @@@ See also
  * {{msg-mw|Watchlist-details}}',
  'iteminvalidname' => 'Parameters:
  * $1 - item name',
 -'wlnote' => 'Used on [[Special:Watchlist]] when a maximum number of hours or days is specified.
 +'wlnote2' => 'Used on [[Special:Watchlist]] when a maximum number of hours or days is specified.
  
  Parameters:
 -* $1 - the number of changes shown
 -* $2 - the number of hours for which the changes are shown
 -* $3 - a date alone
 -* $4 - a time alone',
 +* $1 - the number of hours for which the changes are shown
 +* $2 - a date alone
 +* $3 - a time alone
 +See also:
 +* {{msg-mw|Wlnote}}',
  'wlshowlast' => 'Appears on [[Special:Watchlist]]. Parameters:
  * $1 - a choice of different numbers of hours ("1 | 2 | 6 | 12")
  * $2 - a choice of different numbers of days ("1 | 3 | 7")
@@@ -7239,8 -7221,6 +7311,8 @@@ See also
  'allmessages-filter-submit' => 'Used on [[Special:Allmessages]].
  
  {{Identical|Go}}',
 +'allmessages-filter-translate' => 'Used on [[Special:Allmessages]]. Label for a link to translatewiki.net for a message to translate.
 +{{Identical|Translate}}',
  
  # Thumbnails
  'thumbnail-more' => '[[Image:Yes.png|thumb|This:]]
@@@ -7304,10 -7284,6 +7376,10 @@@ See also
  *$1 is a function name of the GD library',
  'thumbnail_image-missing' => 'This is the parameter 1 of the message {{msg-mw|thumbnail error}}.
  *$1 is the path incl. filename of the missing image',
 +'thumbnail_image-failure-limit' => 'Used as <code>$1</code> in {{msg-mw|Thumbnail error}}.
 +
 +Parameters:
 +* $1 - the maximum allowed number of failed attempts',
  
  # Special:Import
  'import' => 'The title of the special page [[Special:Import]];',
@@@ -7485,12 -7461,6 +7557,12 @@@ Parameters
  * $3 - the content model reported for the offending revision in the dump that is being imported
  * $4 - the serialization format reported for the offending revision in the dump that is being imported
  {{Related|Import-error}}',
 +'import-error-bad-location' => 'Parameters:
 +* $1 - page title
 +* $2 - revision ID
 +* $3 - content model
 +* $4 - (Unused) format
 +{{Related|Import-error}}',
  'import-options-wrong' => 'Used as error message on [[Special:Import]], when one of the options has an error.
  
  Parameters:
@@@ -7587,6 -7557,12 +7659,6 @@@ See also
  * {{msg-mw|Accesskey-pt-mycontris}}
  * {{msg-mw|Tooltip-pt-mycontris}}',
  'tooltip-pt-login' => "Tooltip shown when hovering over the link 'Log in / create account' in the upper right corner show on all pages while not logged in.",
 -'tooltip-pt-anonlogin' => 'Used as tooltip for link {{msg-mw|Login}} in your personal toolbox (upper right side).
 -
 -See also:
 -* {{msg-mw|Login}}
 -* {{msg-mw|Accesskey-pt-anonlogin}}
 -* {{msg-mw|Tooltip-pt-anonlogin}}',
  'tooltip-pt-logout' => 'Tooltip shown when hovering over the {{msg-mw|Logout}} link in your personal toolbox (upper right side).
  
  See also:
@@@ -8210,8 -8186,7 +8282,8 @@@ See also
  # Skin names
  'skinname-cologneblue' => '{{optional}}',
  'skinname-monobook' => '{{optional}}',
 -'skinname-modern' => '{{optional}}',
 +'skinname-modern' => '{{optional}}
 +{{Identical|Modern}}',
  'skinname-vector' => '{{optional}}',
  
  # Patrolling
@@@ -8576,23 -8551,9 +8648,23 @@@ Variant option for wikis with variants 
  
  # Variants for Serbian language
  'variantname-sr-ec' => '{{optional}}
 -Varient Option for wikis with variants conversion enabled.',
 +Variant Option for wikis with variants conversion enabled.
 +
 +Note that <code>sr-ec</code> is not a conforming BCP47 language tag. Wikis should be migrated by:
 +* allowing it only as a legacy alias of the preferred tag <code>sr-cyrl</code> (possibly insert a tracking category in templates as long as they must support the legacy tag),
 +* making the new tag the default to look first, before looking for the old tag,
 +* moving the translations to the new code by renaming them,
 +* checking links in source pages still using the legacy tag to change it to the new tag,
 +* possibly cleanup the redirect pages.',
  'variantname-sr-el' => '{{optional}}
 -Varient Option for wikis with variants conversion enabled.',
 +Variant Option for wikis with variants conversion enabled.
 +
 +Note that <code>sr-el</code> is not a conforming BCP47 language tag. Wikis should be migrated by:
 +* allowing it only as a legacy alias of the preferred tag <code>sr-latn</code> (possibly insert a tracking category in templates as long as they must support the legacy tag),
 +* making the new tag the default to look first, before looking for the old tag,
 +* moving the translations to the new code by renaming them,
 +* checking links in source pages still using the legacy tag to change it to the new tag,
 +* possibly cleanup the redirect pages.',
  'variantname-sr' => '{{optional}}
  Varient Option for wikis with variants conversion enabled.',
  
@@@ -9666,11 -9627,7 +9738,11 @@@ px is the abbreviation for "pixel".'
  
  # Separators for various lists, etc.
  'semicolon-separator' => '{{optional}}',
 -'comma-separator' => '{{optional}}',
 +'comma-separator' => '{{optional}}
 +
 +Warning: languages have different usages of punctuation, and sometimes they are swapped (e.g. openining and closing quotation marks, or full stop and colon in Armenian), or change their form (the full stop in Chinese and Japanese, the prefered "colon" in Armenian used in fact as the regular full stop, the comma in Arabic, Armenian, and Chinese...)
 +
 +Their spacing (before or after) may also vary across languages (for example French requires a non-breaking space, preferably narrow if the browser supports NNBSP, on the inner side of some punctuations like quotation/question/exclamation marks, colon, and semicolons).',
  'colon-separator' => "{{optional}}
  Change it only if your language uses another character for ':' or it needs an extra space before the colon.",
  'pipe-separator' => '{{optional}}',
@@@ -9792,7 -9749,7 +9864,7 @@@ Bitrate (of a file, typically) in kilob
  'bitrate-megabits' => '{{optional}}
  Bitrate (of a file, typically) in megabits (1 megabits = 1000×1000 bits).',
  'bitrate-gigabits' => '{{optional}}
 -Bitrate (of a file, typically) in gibibits (1 gigabits = 1000×1000×1000 bits).',
 +Bitrate (of a file, typically) in gigabits (1 gigabits = 1000×1000×1000 bits).',
  'bitrate-terabits' => '{{optional}}
  Bitrate (of a file, typically) in terabits (1 terabits = 1000×1000×1000×1000 bits).',
  'bitrate-petabits' => '{{optional}}
@@@ -10067,9 -10024,7 +10139,9 @@@ There are no such extensions here, so l
  'version-parser-extensiontags' => 'Part of [[Special:Version]].
  This message is followed by the list of parser extension tags like <code><nowiki><charinsert></nowiki></code>, <code><nowiki><coordinates></nowiki></code>, etc.',
  'version-parser-function-hooks' => 'Shown in [[Special:Version]]',
 -'version-hook-name' => 'Shown in [[Special:Version]]',
 +'version-hook-name' => 'Shown in [[Special:Version]].
 +
 +For meaning of hook see [[mw:Special:MyLanguage/Manual:Hooks|mw:Manual:Hooks]] and [[w:Hooking]].',
  'version-hook-subscribedby' => 'Shown in [[Special:Version]]',
  'version-version' => '{{Optional}}
  Used in [[Special:Version]]. Preceded by the MediaWiki extension name.
@@@ -28,6 -28,7 +28,6 @@@ $wgMessageStructure = array
        ),
        'toggles' => array(
                'tog-underline',
 -              'tog-justify',
                'tog-hideminor',
                'tog-hidepatrolled',
                'tog-newpageshidepatrolled',
@@@ -36,7 -37,9 +36,7 @@@
                'tog-numberheadings',
                'tog-showtoolbar',
                'tog-editondblclick',
 -              'tog-editsection',
                'tog-editsectiononrightclick',
 -              'tog-showtoc',
                'tog-rememberpassword',
                'tog-watchcreations',
                'tog-watchdefault',
                'vector-action-protect',
                'vector-action-undelete',
                'vector-action-unprotect',
 -              'vector-simplesearch-preference',
                'vector-view-create',
                'vector-view-edit',
                'vector-view-history',
                'loginlanguagelinks',
                'suspicious-userlogout',
                'createacct-another-realname-tip',
 +              'pt-login',
 +              'pt-createaccount',
 +              'pt-userlogout',
        ),
        'mail' => array(
                'pear-mail-error',
                'retypenew',
                'resetpass_submit',
                'changepassword-success',
 +              'changepassword-throttled',
                'resetpass_forbidden',
                'resetpass-no-info',
                'resetpass-submit-loggedin',
                'resetpass-submit-cancel',
                'resetpass-wrong-oldpass',
 +              'resetpass-recycled',
 +              'resetpass-temp-emailed',
                'resetpass-temp-password',
                'resetpass-abort-generic',
 +              'resetpass-expired',
 +              'resetpass-expired-soft',
        ),
        'passwordreset' => array(
                'passwordreset',
                'changeemail-password',
                'changeemail-submit',
                'changeemail-cancel',
 +              'changeemail-throttled'
        ),
        'resettokens' => array(
                'resettokens',
                'undo-success',
                'undo-failure',
                'undo-norev',
 +              'undo-nochange',
                'undo-summary',
                'undo-summary-username-hidden',
        ),
                'showhideselectedversions',
                'editundo',
                'diff-empty',
 -              'diff-multi',
 +              'diff-multi-sameuser',
 +              'diff-multi-otherusers',
                'diff-multi-manyusers',
                'difference-missing-revision',
        ),
                'searchrelated',
                'searchall',
                'showingresults',
 +              'showingresultsinrange',
                'showingresultsnum',
                'showingresultsheader',
                'search-nonefound',
                'rcnotefrom',
                'rclistfrom',
                'rcshowhideminor',
+               'rcshowhideminor-show',
+               'rcshowhideminor-hide',
                'rcshowhidebots',
+               'rcshowhidebots-show',
+               'rcshowhidebots-hide',
                'rcshowhideliu',
+               'rcshowhideliu-show',
+               'rcshowhideliu-hide',
                'rcshowhideanons',
+               'rcshowhideanons-show',
+               'rcshowhideanons-hide',
                'rcshowhidepatr',
+               'rcshowhidepatr-show',
+               'rcshowhidepatr-hide',
                'rcshowhidemine',
+               'rcshowhidemine-show',
+               'rcshowhidemine-hide',
                'rclinks',
                'diff',
                'hist',
                'protectedpages-cascade',
                'protectedpages-noredirect',
                'protectedpagesempty',
 +              'protectedpages-timestamp',
 +              'protectedpages-page',
 +              'protectedpages-expiry',
 +              'protectedpages-performer',
 +              'protectedpages-params',
 +              'protectedpages-reason',
 +              'protectedpages-unknown-timestamp',
 +              'protectedpages-unknown-performer',
 +              'protectedpages-unknown-reason',
                'protectedtitles',
                'protectedtitles-summary',
                'protectedtitlesempty',
                'watchmethod-list',
                'watchlistcontains',
                'iteminvalidname',
 -              'wlnote',
 +              'wlnote2',
                'wlshowlast',
                'watchlist-options',
        ),
                'allmessages-prefix',
                'allmessages-language',
                'allmessages-filter-submit',
 +              'allmessages-filter-translate',
        ),
        'thumbnails' => array(
                'thumbnail-more',
                'thumbnail_image-type',
                'thumbnail_gd-library',
                'thumbnail_image-missing',
 +              'thumbnail_image-failure-limit'
        ),
        'import' => array(
                'import',
                'import-error-special',
                'import-error-invalid',
                'import-error-unserialize',
 +              'import-error-bad-location',
                'import-options-wrong',
                'import-rootpage-invalid',
                'import-rootpage-nosubpage',
                'accesskey-pt-watchlist',
                'accesskey-pt-mycontris',
                'accesskey-pt-login',
 -              'accesskey-pt-anonlogin',
                'accesskey-pt-logout',
                'accesskey-ca-talk',
                'accesskey-ca-edit',
                'tooltip-pt-watchlist',
                'tooltip-pt-mycontris',
                'tooltip-pt-login',
 -              'tooltip-pt-anonlogin',
                'tooltip-pt-logout',
                'tooltip-ca-talk',
                'tooltip-ca-edit',