Merge "Add GENDER support to protection null revision edit summary"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 4 Nov 2016 06:13:20 +0000 (06:13 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 4 Nov 2016 06:13:20 +0000 (06:13 +0000)
1  2 
includes/page/WikiPage.php
languages/i18n/en.json
languages/i18n/qqq.json

   * @file
   */
  
 -/**
 - * Abstract class for type hinting (accepts WikiPage, Article, ImagePage, CategoryPage)
 - */
 -interface Page {
 -}
 +use \MediaWiki\Logger\LoggerFactory;
 +use \MediaWiki\MediaWikiServices;
  
  /**
   * Class representing a MediaWiki article and history.
@@@ -83,11 -86,6 +83,11 @@@ class WikiPage implements Page, IDBAcce
         */
        protected $mLinksUpdated = '19700101000000';
  
 +      const PURGE_CDN_CACHE = 1; // purge CDN cache for page variant URLs
 +      const PURGE_CLUSTER_PCACHE = 2; // purge parser cache in the local datacenter
 +      const PURGE_GLOBAL_PCACHE = 4; // set page_touched to clear parser cache in all datacenters
 +      const PURGE_ALL = 7;
 +
        /**
         * Constructor and clear the article
         * @param Title $title Reference to a Title object.
                $this->mTitle = $title;
        }
  
 +      /**
 +       * Makes sure that the mTitle object is cloned
 +       * to the newly cloned WikiPage.
 +       */
 +      public function __clone() {
 +              $this->mTitle = clone $this->mTitle;
 +      }
 +
        /**
         * Create a WikiPage object of the appropriate class for the given title.
         *
         * @param Title $title
         *
         * @throws MWException
 -       * @return WikiPage Object of the appropriate type
 +       * @return WikiPage|WikiCategoryPage|WikiFilePage
         */
        public static function factory( Title $title ) {
                $ns = $title->getNamespace();
                        throw new MWException( "Invalid or virtual namespace $ns given." );
                }
  
 +              $page = null;
 +              if ( !Hooks::run( 'WikiPageFactory', [ $title, &$page ] ) ) {
 +                      return $page;
 +              }
 +
                switch ( $ns ) {
                        case NS_FILE:
                                $page = new WikiFilePage( $title );
         *
         * @param int $id Article ID to load
         * @param string|int $from One of the following values:
 -       *        - "fromdb" or WikiPage::READ_NORMAL to select from a slave database
 +       *        - "fromdb" or WikiPage::READ_NORMAL to select from a replica DB
         *        - "fromdbmaster" or WikiPage::READ_LATEST to select from the master database
         *
         * @return WikiPage|null
                }
  
                $from = self::convertSelectType( $from );
 -              $db = wfGetDB( $from === self::READ_LATEST ? DB_MASTER : DB_SLAVE );
 +              $db = wfGetDB( $from === self::READ_LATEST ? DB_MASTER : DB_REPLICA );
                $row = $db->selectRow(
 -                      'page', self::selectFields(), array( 'page_id' => $id ), __METHOD__ );
 +                      'page', self::selectFields(), [ 'page_id' => $id ], __METHOD__ );
                if ( !$row ) {
                        return null;
                }
         * @since 1.20
         * @param object $row Database row containing at least fields returned by selectFields().
         * @param string|int $from Source of $data:
 -       *        - "fromdb" or WikiPage::READ_NORMAL: from a slave DB
 +       *        - "fromdb" or WikiPage::READ_NORMAL: from a replica DB
         *        - "fromdbmaster" or WikiPage::READ_LATEST: from the master DB
         *        - "forupdate" or WikiPage::READ_LOCKING: from the master DB using SELECT FOR UPDATE
         * @return WikiPage
        }
  
        /**
 -       * Returns overrides for action handlers.
 -       * Classes listed here will be used instead of the default one when
 -       * (and only when) $wgActions[$action] === true. This allows subclasses
 -       * to override the default behavior.
 -       *
         * @todo Move this UI stuff somewhere else
         *
 -       * @return array
 +       * @see ContentHandler::getActionOverrides
         */
        public function getActionOverrides() {
 -              $content_handler = $this->getContentHandler();
 -              return $content_handler->getActionOverrides();
 +              return $this->getContentHandler()->getActionOverrides();
        }
  
        /**
        public static function selectFields() {
                global $wgContentHandlerUseDB, $wgPageLanguageUseDB;
  
 -              $fields = array(
 +              $fields = [
                        'page_id',
                        'page_namespace',
                        'page_title',
                        'page_links_updated',
                        'page_latest',
                        'page_len',
 -              );
 +              ];
  
                if ( $wgContentHandlerUseDB ) {
                        $fields[] = 'page_content_model';
         * @param array $options
         * @return object|bool Database result resource, or false on failure
         */
 -      protected function pageData( $dbr, $conditions, $options = array() ) {
 +      protected function pageData( $dbr, $conditions, $options = [] ) {
                $fields = self::selectFields();
  
 -              Hooks::run( 'ArticlePageDataBefore', array( &$this, &$fields ) );
 +              Hooks::run( 'ArticlePageDataBefore', [ &$this, &$fields ] );
  
                $row = $dbr->selectRow( 'page', $fields, $conditions, __METHOD__, $options );
  
 -              Hooks::run( 'ArticlePageDataAfter', array( &$this, &$row ) );
 +              Hooks::run( 'ArticlePageDataAfter', [ &$this, &$row ] );
  
                return $row;
        }
         * @param array $options
         * @return object|bool Database result resource, or false on failure
         */
 -      public function pageDataFromTitle( $dbr, $title, $options = array() ) {
 -              return $this->pageData( $dbr, array(
 +      public function pageDataFromTitle( $dbr, $title, $options = [] ) {
 +              return $this->pageData( $dbr, [
                        'page_namespace' => $title->getNamespace(),
 -                      'page_title' => $title->getDBkey() ), $options );
 +                      'page_title' => $title->getDBkey() ], $options );
        }
  
        /**
         * @param array $options
         * @return object|bool Database result resource, or false on failure
         */
 -      public function pageDataFromId( $dbr, $id, $options = array() ) {
 -              return $this->pageData( $dbr, array( 'page_id' => $id ), $options );
 +      public function pageDataFromId( $dbr, $id, $options = [] ) {
 +              return $this->pageData( $dbr, [ 'page_id' => $id ], $options );
        }
  
        /**
         *
         * @param object|string|int $from One of the following:
         *   - A DB query result object.
 -       *   - "fromdb" or WikiPage::READ_NORMAL to get from a slave DB.
 +       *   - "fromdb" or WikiPage::READ_NORMAL to get from a replica DB.
         *   - "fromdbmaster" or WikiPage::READ_LATEST to get from the master DB.
         *   - "forupdate"  or WikiPage::READ_LOCKING to get from the master DB
         *     using SELECT FOR UPDATE.
                        $data = $this->pageDataFromTitle( wfGetDB( $index ), $this->mTitle, $opts );
  
                        if ( !$data
 -                              && $index == DB_SLAVE
 +                              && $index == DB_REPLICA
                                && wfGetLB()->getServerCount() > 1
                                && wfGetLB()->hasOrMadeRecentMasterChanges()
                        ) {
                                $data = $this->pageDataFromTitle( wfGetDB( $index ), $this->mTitle, $opts );
                        }
                } else {
 -                      // No idea from where the caller got this data, assume slave database.
 +                      // No idea from where the caller got this data, assume replica DB.
                        $data = $from;
                        $from = self::READ_NORMAL;
                }
         * @since 1.20
         * @param object|bool $data DB row containing fields returned by selectFields() or false
         * @param string|int $from One of the following:
 -       *        - "fromdb" or WikiPage::READ_NORMAL if the data comes from a slave DB
 +       *        - "fromdb" or WikiPage::READ_NORMAL if the data comes from a replica DB
         *        - "fromdbmaster" or WikiPage::READ_LATEST if the data comes from the master DB
         *        - "forupdate"  or WikiPage::READ_LOCKING if the data comes from
         *          the master DB using SELECT FOR UPDATE
         * @return bool
         */
        public function hasViewableContent() {
 -              return $this->exists() || $this->mTitle->isAlwaysKnown();
 +              return $this->mTitle->isKnown();
        }
  
        /**
         */
        public function getContentModel() {
                if ( $this->exists() ) {
 -                      // look at the revision's actual content model
 -                      $rev = $this->getRevision();
 -
 -                      if ( $rev !== null ) {
 -                              return $rev->getContentModel();
 -                      } else {
 -                              $title = $this->mTitle->getPrefixedDBkey();
 -                              wfWarn( "Page $title exists but has no (visible) revisions!" );
 -                      }
 +                      $cache = ObjectCache::getMainWANInstance();
 +
 +                      return $cache->getWithSetCallback(
 +                              $cache->makeKey( 'page', 'content-model', $this->getLatest() ),
 +                              $cache::TTL_MONTH,
 +                              function () {
 +                                      $rev = $this->getRevision();
 +                                      if ( $rev ) {
 +                                              // Look at the revision's actual content model
 +                                              return $rev->getContentModel();
 +                                      } else {
 +                                              $title = $this->mTitle->getPrefixedDBkey();
 +                                              wfWarn( "Page $title exists but has no (visible) revisions!" );
 +                                              return $this->mTitle->getContentModel();
 +                                      }
 +                              }
 +                      );
                }
  
                // use the default model for this page
  
        /**
         * Loads page_touched and returns a value indicating if it should be used
 -       * @return bool True if not a redirect
 +       * @return bool True if this page exists and is not a redirect
         */
        public function checkTouched() {
                if ( !$this->mDataLoaded ) {
                        $this->loadPageData();
                }
 -              return !$this->mIsRedirect;
 +              return ( $this->mId && !$this->mIsRedirect );
        }
  
        /**
         */
        public function getOldestRevision() {
  
 -              // Try using the slave database first, then try the master
 +              // Try using the replica DB first, then try the master
                $continue = 2;
 -              $db = wfGetDB( DB_SLAVE );
 +              $db = wfGetDB( DB_REPLICA );
                $revSelectFields = Revision::selectFields();
  
                $row = null;
                while ( $continue ) {
                        $row = $db->selectRow(
 -                              array( 'page', 'revision' ),
 +                              [ 'page', 'revision' ],
                                $revSelectFields,
 -                              array(
 +                              [
                                        'page_namespace' => $this->mTitle->getNamespace(),
                                        'page_title' => $this->mTitle->getDBkey(),
                                        'rev_page = page_id'
 -                              ),
 +                              ],
                                __METHOD__,
 -                              array(
 +                              [
                                        'ORDER BY' => 'rev_timestamp ASC'
 -                              )
 +                              ]
                        );
  
                        if ( $row ) {
                        // happened after the first S1 SELECT.
                        // http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read
                        $flags = Revision::READ_LOCKING;
 +                      $revision = Revision::newFromPageId( $this->getId(), $latest, $flags );
                } elseif ( $this->mDataLoadedFrom == self::READ_LATEST ) {
                        // Bug T93976: if page_latest was loaded from the master, fetch the
 -                      // revision from there as well, as it may not exist yet on a slave DB.
 +                      // revision from there as well, as it may not exist yet on a replica DB.
                        // Also, this keeps the queries in the same REPEATABLE-READ snapshot.
                        $flags = Revision::READ_LATEST;
 +                      $revision = Revision::newFromPageId( $this->getId(), $latest, $flags );
                } else {
 -                      $flags = 0;
 +                      $dbr = wfGetDB( DB_REPLICA );
 +                      $revision = Revision::newKnownCurrent( $dbr, $this->getId(), $latest );
                }
 -              $revision = Revision::newFromPageId( $this->getId(), $latest, $flags );
 +
                if ( $revision ) { // sanity
                        $this->setLastEdit( $revision );
                }
         * @deprecated since 1.21, getContent() should be used instead.
         */
        public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
 -              ContentHandler::deprecated( __METHOD__, '1.21' );
 +              wfDeprecated( __METHOD__, '1.21' );
  
                $this->loadLastEdit();
                if ( $this->mLastRevision ) {
                return false;
        }
  
 -      /**
 -       * Get the text of the current revision. No side-effects...
 -       *
 -       * @return string|bool The text of the current revision. False on failure
 -       * @deprecated since 1.21, getContent() should be used instead.
 -       */
 -      public function getRawText() {
 -              ContentHandler::deprecated( __METHOD__, '1.21' );
 -
 -              return $this->getText( Revision::RAW );
 -      }
 -
        /**
         * @return string MW timestamp of last article revision
         */
                                // links.
                                $hasLinks = (bool)count( $editInfo->output->getLinks() );
                        } else {
 -                              $hasLinks = (bool)wfGetDB( DB_SLAVE )->selectField( 'pagelinks', 1,
 -                                      array( 'pl_from' => $this->getId() ), __METHOD__ );
 +                              $hasLinks = (bool)wfGetDB( DB_REPLICA )->selectField( 'pagelinks', 1,
 +                                      [ 'pl_from' => $this->getId() ], __METHOD__ );
                        }
                }
  
                }
  
                // Query the redirect table
 -              $dbr = wfGetDB( DB_SLAVE );
 +              $dbr = wfGetDB( DB_REPLICA );
                $row = $dbr->selectRow( 'redirect',
 -                      array( 'rd_namespace', 'rd_title', 'rd_fragment', 'rd_interwiki' ),
 -                      array( 'rd_from' => $this->getId() ),
 +                      [ 'rd_namespace', 'rd_title', 'rd_fragment', 'rd_interwiki' ],
 +                      [ 'rd_from' => $this->getId() ],
                        __METHOD__
                );
  
                // Update the DB post-send if the page has not cached since now
                $that = $this;
                $latest = $this->getLatest();
 -              DeferredUpdates::addCallableUpdate( function() use ( $that, $retval, $latest ) {
 -                      $that->insertRedirectEntry( $retval, $latest );
 -              } );
 +              DeferredUpdates::addCallableUpdate(
 +                      function () use ( $that, $retval, $latest ) {
 +                              $that->insertRedirectEntry( $retval, $latest );
 +                      },
 +                      DeferredUpdates::POSTSEND,
 +                      wfGetDB( DB_MASTER )
 +              );
  
                return $retval;
        }
  
                if ( !$oldLatest || $oldLatest == $this->lockAndGetLatest() ) {
                        $dbw->replace( 'redirect',
 -                              array( 'rd_from' ),
 -                              array(
 +                              [ 'rd_from' ],
 +                              [
                                        'rd_from' => $this->getId(),
                                        'rd_namespace' => $rt->getNamespace(),
                                        'rd_title' => $rt->getDBkey(),
                                        'rd_fragment' => $rt->getFragment(),
                                        'rd_interwiki' => $rt->getInterwiki(),
 -                              ),
 +                              ],
                                __METHOD__
                        );
                }
                                // This can be hard to reverse and may produce loops,
                                // so they may be disabled in the site configuration.
                                $source = $this->mTitle->getFullURL( 'redirect=no' );
 -                              return $rt->getFullURL( array( 'rdfrom' => $source ) );
 +                              return $rt->getFullURL( [ 'rdfrom' => $source ] );
                        } else {
                                // External pages without "local" bit set are not valid
                                // redirect targets
        public function getContributors() {
                // @todo FIXME: This is expensive; cache this info somewhere.
  
 -              $dbr = wfGetDB( DB_SLAVE );
 +              $dbr = wfGetDB( DB_REPLICA );
  
                if ( $dbr->implicitGroupby() ) {
                        $realNameField = 'user_real_name';
                        $realNameField = 'MIN(user_real_name) AS user_real_name';
                }
  
 -              $tables = array( 'revision', 'user' );
 +              $tables = [ 'revision', 'user' ];
  
 -              $fields = array(
 +              $fields = [
                        'user_id' => 'rev_user',
                        'user_name' => 'rev_user_text',
                        $realNameField,
                        'timestamp' => 'MAX(rev_timestamp)',
 -              );
 +              ];
  
 -              $conds = array( 'rev_page' => $this->getId() );
 +              $conds = [ 'rev_page' => $this->getId() ];
  
                // The user who made the top revision gets credited as "this page was last edited by
                // John, based on contributions by Tom, Dick and Harry", so don't include them twice.
                // Username hidden?
                $conds[] = "{$dbr->bitAnd( 'rev_deleted', Revision::DELETED_USER )} = 0";
  
 -              $jconds = array(
 -                      'user' => array( 'LEFT JOIN', 'rev_user = user_id' ),
 -              );
 +              $jconds = [
 +                      'user' => [ 'LEFT JOIN', 'rev_user = user_id' ],
 +              ];
  
 -              $options = array(
 -                      'GROUP BY' => array( 'rev_user', 'rev_user_text' ),
 +              $options = [
 +                      'GROUP BY' => [ 'rev_user', 'rev_user_text' ],
                        'ORDER BY' => 'timestamp DESC',
 -              );
 +              ];
  
                $res = $dbr->select( $tables, $fields, $conds, __METHOD__, $options, $jconds );
                return new UserArrayFromResult( $res );
         *
         * @since 1.19
         * @param ParserOptions $parserOptions ParserOptions to use for the parse operation
 -       * @param null|int $oldid Revision ID to get the text from, passing null or 0 will
 -       *   get the current revision (default value)
 -       *
 -       * @return ParserOutput|bool ParserOutput or false if the revision was not found
 +       * @param null|int      $oldid Revision ID to get the text from, passing null or 0 will
 +       *                             get the current revision (default value)
 +       * @param bool          $forceParse Force reindexing, regardless of cache settings
 +       * @return bool|ParserOutput ParserOutput or false if the revision was not found
         */
 -      public function getParserOutput( ParserOptions $parserOptions, $oldid = null ) {
 -
 -              $useParserCache = $this->shouldCheckParserCache( $parserOptions, $oldid );
 +      public function getParserOutput(
 +              ParserOptions $parserOptions, $oldid = null, $forceParse = false
 +      ) {
 +              $useParserCache =
 +                      ( !$forceParse ) && $this->shouldCheckParserCache( $parserOptions, $oldid );
                wfDebug( __METHOD__ .
                        ': using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
                if ( $parserOptions->getStubThreshold() ) {
                        return;
                }
  
 -              Hooks::run( 'PageViewUpdates', array( $this, $user ) );
 +              Hooks::run( 'PageViewUpdates', [ $this, $user ] );
                // Update newtalk / watchlist notification status
                try {
                        $user->clearNotification( $this->mTitle, $oldid );
  
        /**
         * Perform the actions of a page purging
 +       * @param integer $flags Bitfield of WikiPage::PURGE_* constants
         * @return bool
         */
 -      public function doPurge() {
 -              if ( !Hooks::run( 'ArticlePurge', array( &$this ) ) ) {
 +      public function doPurge( $flags = self::PURGE_ALL ) {
 +              if ( !Hooks::run( 'ArticlePurge', [ &$this ] ) ) {
                        return false;
                }
  
 -              $title = $this->mTitle;
 -              wfGetDB( DB_MASTER )->onTransactionIdle( function() use ( $title ) {
 -                      // Invalidate the cache in auto-commit mode
 -                      $title->invalidateCache();
 -              } );
 +              if ( ( $flags & self::PURGE_GLOBAL_PCACHE ) == self::PURGE_GLOBAL_PCACHE ) {
 +                      // Set page_touched in the database to invalidate all DC caches
 +                      $this->mTitle->invalidateCache();
 +              } elseif ( ( $flags & self::PURGE_CLUSTER_PCACHE ) == self::PURGE_CLUSTER_PCACHE ) {
 +                      // Delete the parser options key in the local cluster to invalidate the DC cache
 +                      ParserCache::singleton()->deleteOptionsKey( $this );
 +                      // Avoid sending HTTP 304s in ViewAction to the client who just issued the purge
 +                      $cache = ObjectCache::getLocalClusterInstance();
 +                      $cache->set(
 +                              $cache->makeKey( 'page', 'last-dc-purge', $this->getId() ),
 +                              wfTimestamp( TS_MW ),
 +                              $cache::TTL_HOUR
 +                      );
 +              }
  
 -              // Send purge after above page_touched update was committed
 -              DeferredUpdates::addUpdate(
 -                      new SquidUpdate( $title->getSquidURLs() ),
 -                      DeferredUpdates::PRESEND
 -              );
 +              if ( ( $flags & self::PURGE_CDN_CACHE ) == self::PURGE_CDN_CACHE ) {
 +                      // Clear any HTML file cache
 +                      HTMLFileCache::clearFileCache( $this->getTitle() );
 +                      // Send purge after any page_touched above update was committed
 +                      DeferredUpdates::addUpdate(
 +                              new CdnCacheUpdate( $this->mTitle->getCdnUrls() ),
 +                              DeferredUpdates::PRESEND
 +                      );
 +              }
  
                if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
                        // @todo move this logic to MessageCache
  
                return true;
        }
 +
 +      /**
 +       * Get the last time a user explicitly purged the page via action=purge
 +       *
 +       * @return string|bool TS_MW timestamp or false
 +       * @since 1.28
 +       */
 +      public function getLastPurgeTimestamp() {
 +              $cache = ObjectCache::getLocalClusterInstance();
 +
 +              return $cache->get( $cache->makeKey( 'page', 'last-dc-purge', $this->getId() ) );
 +      }
 +
        /**
         * Insert a new empty page record for this article.
         * This *must* be followed up by creating a revision
         * Best if all done inside a transaction.
         *
         * @param IDatabase $dbw
 -       * @return int|bool The newly created page_id key; false if the title already existed
 +       * @param int|null $pageId Custom page ID that will be used for the insert statement
 +       *
 +       * @return bool|int The newly created page_id key; false if the row was not
 +       *   inserted, e.g. because the title already existed or because the specified
 +       *   page ID is already in use.
         */
 -      public function insertOn( $dbw ) {
 +      public function insertOn( $dbw, $pageId = null ) {
 +              $pageIdForInsert = $pageId ?: $dbw->nextSequenceValue( 'page_page_id_seq' );
                $dbw->insert(
                        'page',
 -                      array(
 -                              'page_id'           => $dbw->nextSequenceValue( 'page_page_id_seq' ),
 +                      [
 +                              'page_id'           => $pageIdForInsert,
                                'page_namespace'    => $this->mTitle->getNamespace(),
                                'page_title'        => $this->mTitle->getDBkey(),
                                'page_restrictions' => '',
                                'page_touched'      => $dbw->timestamp(),
                                'page_latest'       => 0, // Fill this in shortly...
                                'page_len'          => 0, // Fill this in shortly...
 -                      ),
 +                      ],
                        __METHOD__,
                        'IGNORE'
                );
  
                if ( $dbw->affectedRows() > 0 ) {
 -                      $newid = $dbw->insertId();
 +                      $newid = $pageId ?: $dbw->insertId();
                        $this->mId = $newid;
                        $this->mTitle->resetArticleID( $newid );
  
                $len = $content ? $content->getSize() : 0;
                $rt = $content ? $content->getUltimateRedirectTarget() : null;
  
 -              $conditions = array( 'page_id' => $this->getId() );
 +              $conditions = [ 'page_id' => $this->getId() ];
  
                if ( !is_null( $lastRevision ) ) {
                        // An extra check against threads stepping on each other
                        $conditions['page_latest'] = $lastRevision;
                }
  
 -              $row = array( /* SET */
 +              $row = [ /* SET */
                        'page_latest'      => $revision->getId(),
                        'page_touched'     => $dbw->timestamp( $revision->getTimestamp() ),
                        'page_is_new'      => ( $lastRevision === 0 ) ? 1 : 0,
                        'page_is_redirect' => $rt !== null ? 1 : 0,
                        'page_len'         => $len,
 -              );
 +              ];
  
                if ( $wgContentHandlerUseDB ) {
                        $row['page_content_model'] = $revision->getContentModel();
                        $this->insertRedirectEntry( $redirectTitle );
                } else {
                        // This is not a redirect, remove row from redirect table
 -                      $where = array( 'rd_from' => $this->getId() );
 +                      $where = [ 'rd_from' => $this->getId() ];
                        $dbw->delete( 'redirect', $where, __METHOD__ );
                }
  
        public function updateIfNewerOn( $dbw, $revision ) {
  
                $row = $dbw->selectRow(
 -                      array( 'revision', 'page' ),
 -                      array( 'rev_id', 'rev_timestamp', 'page_is_redirect' ),
 -                      array(
 +                      [ 'revision', 'page' ],
 +                      [ 'rev_id', 'rev_timestamp', 'page_is_redirect' ],
 +                      [
                                'page_id' => $this->getId(),
 -                              'page_latest=rev_id' ),
 +                              'page_latest=rev_id' ],
                        __METHOD__ );
  
                if ( $row ) {
                return $handler->getUndoContent( $this->getRevision(), $undo, $undoafter );
        }
  
 -      /**
 -       * Get the text that needs to be saved in order to undo all revisions
 -       * between $undo and $undoafter. Revisions must belong to the same page,
 -       * must exist and must not be deleted
 -       * @param Revision $undo
 -       * @param Revision $undoafter Must be an earlier revision than $undo
 -       * @return string|bool String on success, false on failure
 -       * @deprecated since 1.21: use ContentHandler::getUndoContent() instead.
 -       */
 -      public function getUndoText( Revision $undo, Revision $undoafter = null ) {
 -              ContentHandler::deprecated( __METHOD__, '1.21' );
 -
 -              $this->loadLastEdit();
 -
 -              if ( $this->mLastRevision ) {
 -                      if ( is_null( $undoafter ) ) {
 -                              $undoafter = $undo->getPrevious();
 -                      }
 -
 -                      $handler = $this->getContentHandler();
 -                      $undone = $handler->getUndoContent( $this->mLastRevision, $undo, $undoafter );
 -
 -                      if ( !$undone ) {
 -                              return false;
 -                      } else {
 -                              return ContentHandler::getContentText( $undone );
 -                      }
 -              }
 -
 -              return false;
 -      }
 -
 -      /**
 -       * @param string|number|null|bool $sectionId Section identifier as a number or string
 -       * (e.g. 0, 1 or 'T-1'), null/false or an empty string for the whole page
 -       * or 'new' for a new section.
 -       * @param string $text New text of the section.
 -       * @param string $sectionTitle New section's subject, only if $section is "new".
 -       * @param string $edittime Revision timestamp or null to use the current revision.
 -       *
 -       * @throws MWException
 -       * @return string|null New complete article text, or null if error.
 -       *
 -       * @deprecated since 1.21, use replaceSectionAtRev() instead
 -       */
 -      public function replaceSection( $sectionId, $text, $sectionTitle = '',
 -              $edittime = null
 -      ) {
 -              ContentHandler::deprecated( __METHOD__, '1.21' );
 -
 -              // NOTE: keep condition in sync with condition in replaceSectionContent!
 -              if ( strval( $sectionId ) === '' ) {
 -                      // Whole-page edit; let the whole text through
 -                      return $text;
 -              }
 -
 -              if ( !$this->supportsSections() ) {
 -                      throw new MWException( "sections not supported for content model " .
 -                              $this->getContentHandler()->getModelID() );
 -              }
 -
 -              // could even make section title, but that's not required.
 -              $sectionContent = ContentHandler::makeContent( $text, $this->getTitle() );
 -
 -              $newContent = $this->replaceSectionContent( $sectionId, $sectionContent, $sectionTitle,
 -                      $edittime );
 -
 -              return ContentHandler::getContentText( $newContent );
 -      }
 -
        /**
         * Returns true if this page's content model supports sections.
         *
  
                $baseRevId = null;
                if ( $edittime && $sectionId !== 'new' ) {
 -                      $dbr = wfGetDB( DB_SLAVE );
 +                      $dbr = wfGetDB( DB_REPLICA );
                        $rev = Revision::loadFromTimestamp( $dbr, $this->mTitle, $edittime );
                        // Try the master if this thread may have just added it.
                        // This could be abstracted into a Revision method, but we don't want
         *          Mark the edit a "bot" edit regardless of user rights
         *      EDIT_AUTOSUMMARY
         *          Fill in blank summaries with generated text where possible
 +       *      EDIT_INTERNAL
 +       *          Signal that the page retrieve/save cycle happened entirely in this request.
         *
         * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the
         * article will be detected. If EDIT_UPDATE is specified and the article
         * @deprecated since 1.21: use doEditContent() instead.
         */
        public function doEdit( $text, $summary, $flags = 0, $baseRevId = false, $user = null ) {
 -              ContentHandler::deprecated( __METHOD__, '1.21' );
 +              wfDeprecated( __METHOD__, '1.21' );
  
                $content = ContentHandler::makeContent( $text, $this->getTitle() );
  
         *          Mark the edit a "bot" edit regardless of user rights
         *      EDIT_AUTOSUMMARY
         *          Fill in blank summaries with generated text where possible
 +       *      EDIT_INTERNAL
 +       *          Signal that the page retrieve/save cycle happened entirely in this request.
         *
         * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the
         * article will be detected. If EDIT_UPDATE is specified and the article
         * @param User $user The user doing the edit
         * @param string $serialFormat Format for storing the content in the
         *   database.
 +       * @param array|null $tags Change tags to apply to this edit
 +       * Callers are responsible for permission checks
 +       * (with ChangeTags::canAddTagsAccompanyingChange)
         *
         * @throws MWException
         * @return Status Possible errors:
         */
        public function doEditContent(
                Content $content, $summary, $flags = 0, $baseRevId = false,
 -              User $user = null, $serialFormat = null
 +              User $user = null, $serialFormat = null, $tags = []
        ) {
                global $wgUser, $wgUseAutomaticEditSummaries;
  
 +              // Old default parameter for $tags was null
 +              if ( $tags === null ) {
 +                      $tags = [];
 +              }
 +
                // Low-level sanity check
                if ( $this->mTitle->getText() === '' ) {
                        throw new MWException( 'Something is trying to edit an article with an empty title' );
                $flags = $this->checkFlags( $flags );
  
                // Trigger pre-save hook (using provided edit summary)
 -              $hookStatus = Status::newGood( array() );
 -              $hook_args = array( &$this, &$user, &$content, &$summary,
 -                                                      $flags & EDIT_MINOR, null, null, &$flags, &$hookStatus );
 +              $hookStatus = Status::newGood( [] );
 +              $hook_args = [ &$this, &$user, &$content, &$summary,
 +                                                      $flags & EDIT_MINOR, null, null, &$flags, &$hookStatus ];
                // Check if the hook rejected the attempted save
                if ( !Hooks::run( 'PageContentSave', $hook_args )
 -                      || !ContentHandler::runLegacyHooks( 'ArticleSave', $hook_args )
 +                      || !ContentHandler::runLegacyHooks( 'ArticleSave', $hook_args, '1.21' )
                ) {
                        if ( $hookStatus->isOK() ) {
                                // Hook returned false but didn't call fatal(); use generic message
                $old_revision = $this->getRevision(); // current revision
                $old_content = $this->getContent( Revision::RAW ); // current revision's content
  
 +              if ( $old_content && $old_content->getModel() !== $content->getModel() ) {
 +                      $tags[] = 'mw-contentmodelchange';
 +              }
 +
                // Provide autosummaries if one is not provided and autosummaries are enabled
                if ( $wgUseAutomaticEditSummaries && ( $flags & EDIT_AUTOSUMMARY ) && $summary == '' ) {
                        $handler = $content->getContentHandler();
                        $summary = $handler->getAutosummary( $old_content, $content, $flags );
                }
  
 +              // Avoid statsd noise and wasted cycles check the edit stash (T136678)
 +              if ( ( $flags & EDIT_INTERNAL ) || ( $flags & EDIT_FORCE_BOT ) ) {
 +                      $useCache = false;
 +              } else {
 +                      $useCache = true;
 +              }
 +
                // Get the pre-save transform content and final parser output
 -              $editInfo = $this->prepareContentForEdit( $content, null, $user, $serialFormat );
 +              $editInfo = $this->prepareContentForEdit( $content, null, $user, $serialFormat, $useCache );
                $pstContent = $editInfo->pstContent; // Content object
 -              $meta = array(
 +              $meta = [
                        'bot' => ( $flags & EDIT_FORCE_BOT ),
                        'minor' => ( $flags & EDIT_MINOR ) && $user->isAllowed( 'minoredit' ),
                        'serialized' => $editInfo->pst,
                        'oldContent' => $old_content,
                        'oldId' => $this->getLatest(),
                        'oldIsRedirect' => $this->isRedirect(),
 -                      'oldCountable' => $this->isCountable()
 -              );
 +                      'oldCountable' => $this->isCountable(),
 +                      'tags' => ( $tags !== null ) ? (array)$tags : []
 +              ];
  
                // Actually create the revision and create/update the page
                if ( $flags & EDIT_UPDATE ) {
                        $status = $this->doCreate( $pstContent, $flags, $user, $summary, $meta );
                }
  
 -              // Trigger post-save hook
 -              $revision = $status->value['revision']; // new revision
 -              $hook_args = array( &$this, &$user, $pstContent, $summary,
 -                      $flags & EDIT_MINOR, null, null, &$flags, $revision, &$status, $baseRevId );
 -              ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $hook_args );
 -              Hooks::run( 'PageContentSaveComplete', $hook_args );
 -
                // Promote user to any groups they meet the criteria for
                DeferredUpdates::addCallableUpdate( function () use ( $user ) {
                        $user->addAutopromoteOnceGroups( 'onEdit' );
                global $wgUseRCPatrol;
  
                // Update article, but only if changed.
 -              $status = Status::newGood( array( 'new' => false, 'revision' => null ) );
 +              $status = Status::newGood( [ 'new' => false, 'revision' => null ] );
  
                // Convenience variables
                $now = wfTimestampNow();
                }
  
                // @TODO: pass content object?!
 -              $revision = new Revision( array(
 +              $revision = new Revision( [
                        'page'       => $this->getId(),
                        'title'      => $this->mTitle, // for determining the default content model
                        'comment'    => $summary,
                        'timestamp'  => $now,
                        'content_model' => $content->getModel(),
                        'content_format' => $meta['serialFormat'],
 -              ) );
 +              ] );
  
                $changed = !$content->equals( $oldContent );
  
 +              $dbw = wfGetDB( DB_MASTER );
 +
                if ( $changed ) {
                        $prepStatus = $content->prepareSave( $this, $flags, $oldid, $user );
                        $status->merge( $prepStatus );
                                return $status;
                        }
  
 -                      $dbw = wfGetDB( DB_MASTER );
 -                      $dbw->begin( __METHOD__ );
 +                      $dbw->startAtomic( __METHOD__ );
                        // Get the latest page_latest value while locking it.
                        // Do a CAS style check to see if it's the same as when this method
                        // started. If it changed then bail out before touching the DB.
                        $latestNow = $this->lockAndGetLatest();
                        if ( $latestNow != $oldid ) {
 -                              $dbw->commit( __METHOD__ );
 +                              $dbw->endAtomic( __METHOD__ );
                                // Page updated or deleted in the mean time
                                $status->fatal( 'edit-conflict' );
  
                        $revisionId = $revision->insertOn( $dbw );
                        // Update page_latest and friends to reflect the new revision
                        if ( !$this->updateRevisionOn( $dbw, $revision, null, $meta['oldIsRedirect'] ) ) {
 -                              $dbw->rollback( __METHOD__ );
                                throw new MWException( "Failed to update page row to use new revision." );
                        }
  
                        Hooks::run( 'NewRevisionFromEditComplete',
 -                              array( $this, $revision, $meta['baseRevId'], $user ) );
 +                              [ $this, $revision, $meta['baseRevId'], $user ] );
  
                        // Update recentchanges
                        if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
                                        $oldContent ? $oldContent->getSize() : 0,
                                        $newsize,
                                        $revisionId,
 -                                      $patrolled
 +                                      $patrolled,
 +                                      $meta['tags']
                                );
                        }
  
                        $user->incEditCount();
  
 -                      $dbw->commit( __METHOD__ );
 +                      $dbw->endAtomic( __METHOD__ );
                        $this->mTimestamp = $now;
                } else {
                        // Bug 32948: revision ID must be set to page {{REVISIONID}} and
 -                      // related variables correctly
 +                      // related variables correctly. Likewise for {{REVISIONUSER}} (T135261).
                        $revision->setId( $this->getLatest() );
 +                      $revision->setUserIdAndName(
 +                              $this->getUser( Revision::RAW ),
 +                              $this->getUserText( Revision::RAW )
 +                      );
                }
  
 -              // Update links tables, site stats, etc.
 -              $this->doEditUpdates(
 -                      $revision,
 -                      $user,
 -                      array(
 -                              'changed' => $changed,
 -                              'oldcountable' => $meta['oldCountable'],
 -                              'oldrevision' => $meta['oldRevision']
 -                      )
 -              );
 -
                if ( $changed ) {
                        // Return the new revision to the caller
                        $status->value['revision'] = $revision;
                        $this->mTitle->invalidateCache( $now );
                }
  
 +              // Do secondary updates once the main changes have been committed...
 +              DeferredUpdates::addUpdate(
 +                      new AtomicSectionUpdate(
 +                              $dbw,
 +                              __METHOD__,
 +                              function () use (
 +                                      $revision, &$user, $content, $summary, &$flags,
 +                                      $changed, $meta, &$status
 +                              ) {
 +                                      // Update links tables, site stats, etc.
 +                                      $this->doEditUpdates(
 +                                              $revision,
 +                                              $user,
 +                                              [
 +                                                      'changed' => $changed,
 +                                                      'oldcountable' => $meta['oldCountable'],
 +                                                      'oldrevision' => $meta['oldRevision']
 +                                              ]
 +                                      );
 +                                      // Trigger post-save hook
 +                                      $params = [ &$this, &$user, $content, $summary, $flags & EDIT_MINOR,
 +                                              null, null, &$flags, $revision, &$status, $meta['baseRevId'] ];
 +                                      ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $params );
 +                                      Hooks::run( 'PageContentSaveComplete', $params );
 +                              }
 +                      ),
 +                      DeferredUpdates::PRESEND
 +              );
 +
                return $status;
        }
  
        ) {
                global $wgUseRCPatrol, $wgUseNPPatrol;
  
 -              $status = Status::newGood( array( 'new' => true, 'revision' => null ) );
 +              $status = Status::newGood( [ 'new' => true, 'revision' => null ] );
  
                $now = wfTimestampNow();
                $newsize = $content->getSize();
                }
  
                $dbw = wfGetDB( DB_MASTER );
 -              $dbw->begin( __METHOD__ );
 +              $dbw->startAtomic( __METHOD__ );
  
                // Add the page record unless one already exists for the title
                $newid = $this->insertOn( $dbw );
                if ( $newid === false ) {
 -                      $dbw->commit( __METHOD__ ); // nothing inserted
 +                      $dbw->endAtomic( __METHOD__ ); // nothing inserted
                        $status->fatal( 'edit-already-exists' );
  
                        return $status; // nothing done
                // unless they actually try to catch exceptions (which is rare).
  
                // @TODO: pass content object?!
 -              $revision = new Revision( array(
 +              $revision = new Revision( [
                        'page'       => $newid,
                        'title'      => $this->mTitle, // for determining the default content model
                        'comment'    => $summary,
                        'timestamp'  => $now,
                        'content_model' => $content->getModel(),
                        'content_format' => $meta['serialFormat'],
 -              ) );
 +              ] );
  
                // Save the revision text...
                $revisionId = $revision->insertOn( $dbw );
                // Update the page record with revision data
                if ( !$this->updateRevisionOn( $dbw, $revision, 0 ) ) {
 -                      $dbw->rollback( __METHOD__ );
                        throw new MWException( "Failed to update page row to use new revision." );
                }
  
 -              Hooks::run( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
 +              Hooks::run( 'NewRevisionFromEditComplete', [ $this, $revision, false, $user ] );
  
                // Update recentchanges
                if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
                                '',
                                $newsize,
                                $revisionId,
 -                              $patrolled
 +                              $patrolled,
 +                              $meta['tags']
                        );
                }
  
                $user->incEditCount();
  
 -              $dbw->commit( __METHOD__ );
 +              $dbw->endAtomic( __METHOD__ );
                $this->mTimestamp = $now;
  
 -              // Update links, etc.
 -              $this->doEditUpdates( $revision, $user, array( 'created' => true ) );
 -
 -              $hook_args = array( &$this, &$user, $content, $summary,
 -                      $flags & EDIT_MINOR, null, null, &$flags, $revision );
 -              ContentHandler::runLegacyHooks( 'ArticleInsertComplete', $hook_args );
 -              Hooks::run( 'PageContentInsertComplete', $hook_args );
 -
                // Return the new revision to the caller
                $status->value['revision'] = $revision;
  
 +              // Do secondary updates once the main changes have been committed...
 +              DeferredUpdates::addUpdate(
 +                      new AtomicSectionUpdate(
 +                              $dbw,
 +                              __METHOD__,
 +                              function () use (
 +                                      $revision, &$user, $content, $summary, &$flags, $meta, &$status
 +                              ) {
 +                                      // Update links, etc.
 +                                      $this->doEditUpdates( $revision, $user, [ 'created' => true ] );
 +                                      // Trigger post-create hook
 +                                      $params = [ &$this, &$user, $content, $summary,
 +                                              $flags & EDIT_MINOR, null, null, &$flags, $revision ];
 +                                      ContentHandler::runLegacyHooks( 'ArticleInsertComplete', $params, '1.21' );
 +                                      Hooks::run( 'PageContentInsertComplete', $params );
 +                                      // Trigger post-save hook
 +                                      $params = array_merge( $params, [ &$status, $meta['baseRevId'] ] );
 +                                      ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $params, '1.21' );
 +                                      Hooks::run( 'PageContentSaveComplete', $params );
 +
 +                              }
 +                      ),
 +                      DeferredUpdates::PRESEND
 +              );
 +
                return $status;
        }
  
         * @return object
         */
        public function prepareTextForEdit( $text, $revid = null, User $user = null ) {
 -              ContentHandler::deprecated( __METHOD__, '1.21' );
 +              wfDeprecated( __METHOD__, '1.21' );
                $content = ContentHandler::makeContent( $text, $this->getTitle() );
                return $this->prepareContentForEdit( $content, $revid, $user );
        }
                }
  
                if ( $this->mPreparedEdit
 -                      && $this->mPreparedEdit->newContent
 +                      && isset( $this->mPreparedEdit->newContent )
                        && $this->mPreparedEdit->newContent->equals( $content )
                        && $this->mPreparedEdit->revid == $revid
                        && $this->mPreparedEdit->format == $serialFormat
                        : false;
  
                $popts = ParserOptions::newFromUserAndLang( $user, $wgContLang );
 -              Hooks::run( 'ArticlePrepareTextForEdit', array( $this, $popts ) );
 +              Hooks::run( 'ArticlePrepareTextForEdit', [ $this, $popts ] );
  
 -              $edit = (object)array();
 +              $edit = (object)[];
                if ( $cachedEdit ) {
                        $edit->timestamp = $cachedEdit->timestamp;
                } else {
                        $edit->timestamp = wfTimestampNow();
                }
 -              // @note: $cachedEdit is not used if the rev ID was referenced in the text
 +              // @note: $cachedEdit is safely not used if the rev ID was referenced in the text
                $edit->revid = $revid;
  
                if ( $cachedEdit ) {
                                // We get here if vary-revision is set. This means that this page references
                                // itself (such as via self-transclusion). In this case, we need to make sure
                                // that any such self-references refer to the newly-saved revision, and not
 -                              // to the previous one, which could otherwise happen due to slave lag.
 +                              // to the previous one, which could otherwise happen due to replica DB lag.
                                $oldCallback = $edit->popts->getCurrentRevisionCallback();
                                $edit->popts->setCurrentRevisionCallback(
                                        function ( Title $title, $parser = false ) use ( $revision, &$oldCallback ) {
                                                }
                                        }
                                );
 +                      } else {
 +                              // Try to avoid a second parse if {{REVISIONID}} is used
 +                              $edit->popts->setSpeculativeRevIdCallback( function () {
 +                                      return 1 + (int)wfGetDB( DB_MASTER )->selectField(
 +                                              'revision',
 +                                              'MAX(rev_id)',
 +                                              [],
 +                                              __METHOD__
 +                                      );
 +                              } );
                        }
                        $edit->output = $edit->pstContent
                                ? $edit->pstContent->getParserOutput( $this->mTitle, $revid, $edit->popts )
                        : '';
                $edit->pst = $edit->pstContent ? $edit->pstContent->serialize( $serialFormat ) : '';
  
 +              if ( $edit->output ) {
 +                      $edit->output->setCacheTime( wfTimestampNow() );
 +              }
 +
 +              // Process cache the result
                $this->mPreparedEdit = $edit;
 +
                return $edit;
        }
  
         *     is true, do update the article count
         *   - 'no-change': don't update the article count, ever
         */
 -      public function doEditUpdates( Revision $revision, User $user, array $options = array() ) {
 -              global $wgRCWatchCategoryMembership;
 +      public function doEditUpdates( Revision $revision, User $user, array $options = [] ) {
 +              global $wgRCWatchCategoryMembership, $wgContLang;
  
 -              $options += array(
 +              $options += [
                        'changed' => true,
                        'created' => false,
                        'moved' => false,
                        'restored' => false,
                        'oldrevision' => null,
                        'oldcountable' => null
 -              );
 +              ];
                $content = $revision->getContent();
  
 -              // Parse the text
 -              // Be careful not to do pre-save transform twice: $text is usually
 -              // already pre-save transformed once.
 -              if ( !$this->mPreparedEdit || $this->mPreparedEdit->output->getFlag( 'vary-revision' ) ) {
 -                      wfDebug( __METHOD__ . ": No prepared edit or vary-revision is set...\n" );
 -                      $editInfo = $this->prepareContentForEdit( $content, $revision, $user );
 +              $logger = LoggerFactory::getInstance( 'SaveParse' );
 +
 +              // See if the parser output before $revision was inserted is still valid
 +              $editInfo = false;
 +              if ( !$this->mPreparedEdit ) {
 +                      $logger->debug( __METHOD__ . ": No prepared edit...\n" );
 +              } elseif ( $this->mPreparedEdit->output->getFlag( 'vary-revision' ) ) {
 +                      $logger->info( __METHOD__ . ": Prepared edit has vary-revision...\n" );
 +              } elseif ( $this->mPreparedEdit->output->getFlag( 'vary-revision-id' )
 +                      && $this->mPreparedEdit->output->getSpeculativeRevIdUsed() !== $revision->getId()
 +              ) {
 +                      $logger->info( __METHOD__ . ": Prepared edit has vary-revision-id with wrong ID...\n" );
 +              } elseif ( $this->mPreparedEdit->output->getFlag( 'vary-user' ) && !$options['changed'] ) {
 +                      $logger->info( __METHOD__ . ": Prepared edit has vary-user and is null...\n" );
                } else {
 -                      wfDebug( __METHOD__ . ": No vary-revision, using prepared edit...\n" );
 +                      wfDebug( __METHOD__ . ": Using prepared edit...\n" );
                        $editInfo = $this->mPreparedEdit;
                }
  
 +              if ( !$editInfo ) {
 +                      // Parse the text again if needed. Be careful not to do pre-save transform twice:
 +                      // $text is usually already pre-save transformed once. Avoid using the edit stash
 +                      // as any prepared content from there or in doEditContent() was already rejected.
 +                      $editInfo = $this->prepareContentForEdit( $content, $revision, $user, null, false );
 +              }
 +
                // Save it to the parser cache.
                // Make sure the cache time matches page_touched to avoid double parsing.
                ParserCache::singleton()->save(
                                DeferredUpdates::addUpdate( $update );
                        }
                        if ( $wgRCWatchCategoryMembership
 +                              && $this->getContentHandler()->supportsCategories() === true
                                && ( $options['changed'] || $options['created'] )
                                && !$options['restored']
                        ) {
                                // bot/deletion/IP flags, ect.
                                JobQueueGroup::singleton()->lazyPush( new CategoryMembershipChangeJob(
                                        $this->getTitle(),
 -                                      array(
 +                                      [
                                                'pageId' => $this->getId(),
                                                'revTimestamp' => $revision->getTimestamp()
 -                                      )
 +                                      ]
                                ) );
                        }
                }
  
 -              Hooks::run( 'ArticleEditUpdates', array( &$this, &$editInfo, $options['changed'] ) );
 +              Hooks::run( 'ArticleEditUpdates', [ &$this, &$editInfo, $options['changed'] ] );
  
 -              if ( Hooks::run( 'ArticleEditUpdatesDeleteFromRecentchanges', array( &$this ) ) ) {
 +              if ( Hooks::run( 'ArticleEditUpdatesDeleteFromRecentchanges', [ &$this ] ) ) {
                        // Flush old entries from the `recentchanges` table
                        if ( mt_rand( 0, 9 ) == 0 ) {
                                JobQueueGroup::singleton()->lazyPush( RecentChangesUpdateJob::newPurgeJob() );
                        } else {
                                // Allow extensions to prevent user notification
                                // when a new message is added to their talk page
 -                              if ( Hooks::run( 'ArticleEditUpdateNewTalk', array( &$this, $recipient ) ) ) {
 +                              if ( Hooks::run( 'ArticleEditUpdateNewTalk', [ &$this, $recipient ] ) ) {
                                        if ( User::isIP( $shortTitle ) ) {
                                                // An anonymous user
                                                $recipient->setNewtalk( true, $revision );
                        }
  
                        MessageCache::singleton()->replace( $shortTitle, $msgtext );
 +
 +                      if ( $wgContLang->hasVariants() ) {
 +                              $wgContLang->updateConversionTable( $this->mTitle );
 +                      }
                }
  
                if ( $options['created'] ) {
                } elseif ( $options['changed'] ) { // bug 50785
                        self::onArticleEdit( $this->mTitle, $revision );
                }
 -      }
 -
 -      /**
 -       * Edit an article without doing all that other stuff
 -       * The article must already exist; link tables etc
 -       * are not updated, caches are not flushed.
 -       *
 -       * @param Content $content Content submitted
 -       * @param User $user The relevant user
 -       * @param string $comment Comment submitted
 -       * @param bool $minor Whereas it's a minor modification
 -       * @param string $serialFormat Format for storing the content in the database
 -       */
 -      public function doQuickEditContent(
 -              Content $content, User $user, $comment = '', $minor = false, $serialFormat = null
 -      ) {
 -
 -              $serialized = $content->serialize( $serialFormat );
 -
 -              $dbw = wfGetDB( DB_MASTER );
 -              $revision = new Revision( array(
 -                      'title'      => $this->getTitle(), // for determining the default content model
 -                      'page'       => $this->getId(),
 -                      'user_text'  => $user->getName(),
 -                      'user'       => $user->getId(),
 -                      'text'       => $serialized,
 -                      'length'     => $content->getSize(),
 -                      'comment'    => $comment,
 -                      'minor_edit' => $minor ? 1 : 0,
 -              ) ); // XXX: set the content object?
 -              $revision->insertOn( $dbw );
 -              $this->updateRevisionOn( $dbw, $revision );
 -
 -              Hooks::run( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
  
 +              ResourceLoaderWikiModule::invalidateModuleCache(
 +                      $this->mTitle, $options['oldrevision'], $revision, wfWikiID()
 +              );
        }
  
        /**
         * @param int &$cascade Set to false if cascading protection isn't allowed.
         * @param string $reason
         * @param User $user The user updating the restrictions
 -       * @return Status
 +       * @param string|string[] $tags Change tags to add to the pages and protection log entries
 +       *   ($user should be able to add the specified tags before this is called)
 +       * @return Status Status object; if action is taken, $status->value is the log_id of the
 +       *   protection log entry.
         */
        public function doUpdateRestrictions( array $limit, array $expiry,
 -              &$cascade, $reason, User $user
 +              &$cascade, $reason, User $user, $tags = null
        ) {
                global $wgCascadingRestrictionLevels, $wgContLang;
  
                }
  
                if ( !$protect ) { // No protection at all means unprotection
-                       $revCommentMsg = 'unprotectedarticle';
+                       $revCommentMsg = 'unprotectedarticle-comment';
                        $logAction = 'unprotect';
                } elseif ( $isProtected ) {
-                       $revCommentMsg = 'modifiedarticleprotection';
+                       $revCommentMsg = 'modifiedarticleprotection-comment';
                        $logAction = 'modify';
                } else {
-                       $revCommentMsg = 'protectedarticle';
+                       $revCommentMsg = 'protectedarticle-comment';
                        $logAction = 'protect';
                }
  
                // Truncate for whole multibyte characters
                $reason = $wgContLang->truncate( $reason, 255 );
  
 -              $logRelationsValues = array();
 +              $logRelationsValues = [];
                $logRelationsField = null;
 -              $logParamsDetails = array();
 +              $logParamsDetails = [];
 +
 +              // Null revision (used for change tag insertion)
 +              $nullRevision = null;
  
                if ( $id ) { // Protection of existing page
 -                      if ( !Hooks::run( 'ArticleProtect', array( &$this, &$user, $limit, $reason ) ) ) {
 +                      if ( !Hooks::run( 'ArticleProtect', [ &$this, &$user, $limit, $reason ] ) ) {
                                return Status::newGood();
                        }
  
                        // Only certain restrictions can cascade...
                        $editrestriction = isset( $limit['edit'] )
 -                              ? array( $limit['edit'] )
 +                              ? [ $limit['edit'] ]
                                : $this->mTitle->getRestrictions( 'edit' );
                        foreach ( array_keys( $editrestriction, 'sysop' ) as $key ) {
                                $editrestriction[$key] = 'editprotected'; // backwards compatibility
                        foreach ( $limit as $action => $restrictions ) {
                                $dbw->delete(
                                        'page_restrictions',
 -                                      array(
 +                                      [
                                                'pr_page' => $id,
                                                'pr_type' => $action
 -                                      ),
 +                                      ],
                                        __METHOD__
                                );
                                if ( $restrictions != '' ) {
                                        $cascadeValue = ( $cascade && $action == 'edit' ) ? 1 : 0;
                                        $dbw->insert(
                                                'page_restrictions',
 -                                              array(
 +                                              [
                                                        'pr_id' => $dbw->nextSequenceValue( 'page_restrictions_pr_id_seq' ),
                                                        'pr_page' => $id,
                                                        'pr_type' => $action,
                                                        'pr_level' => $restrictions,
                                                        'pr_cascade' => $cascadeValue,
                                                        'pr_expiry' => $dbw->encodeExpiry( $expiry[$action] )
 -                                              ),
 +                                              ],
                                                __METHOD__
                                        );
                                        $logRelationsValues[] = $dbw->insertId();
 -                                      $logParamsDetails[] = array(
 +                                      $logParamsDetails[] = [
                                                'type' => $action,
                                                'level' => $restrictions,
                                                'expiry' => $expiry[$action],
                                                'cascade' => (bool)$cascadeValue,
 -                                      );
 +                                      ];
                                }
                        }
  
                        // Clear out legacy restriction fields
                        $dbw->update(
                                'page',
 -                              array( 'page_restrictions' => '' ),
 -                              array( 'page_id' => $id ),
 +                              [ 'page_restrictions' => '' ],
 +                              [ 'page_id' => $id ],
                                __METHOD__
                        );
  
                        Hooks::run( 'NewRevisionFromEditComplete',
 -                              array( $this, $nullRevision, $latest, $user ) );
 -                      Hooks::run( 'ArticleProtectComplete', array( &$this, &$user, $limit, $reason ) );
 +                              [ $this, $nullRevision, $latest, $user ] );
 +                      Hooks::run( 'ArticleProtectComplete', [ &$this, &$user, $limit, $reason ] );
                } else { // Protection of non-existing page (also known as "title protection")
                        // Cascade protection is meaningless in this case
                        $cascade = false;
  
                        if ( $limit['create'] != '' ) {
                                $dbw->replace( 'protected_titles',
 -                                      array( array( 'pt_namespace', 'pt_title' ) ),
 -                                      array(
 +                                      [ [ 'pt_namespace', 'pt_title' ] ],
 +                                      [
                                                'pt_namespace' => $this->mTitle->getNamespace(),
                                                'pt_title' => $this->mTitle->getDBkey(),
                                                'pt_create_perm' => $limit['create'],
                                                'pt_expiry' => $dbw->encodeExpiry( $expiry['create'] ),
                                                'pt_user' => $user->getId(),
                                                'pt_reason' => $reason,
 -                                      ), __METHOD__
 +                                      ], __METHOD__
                                );
 -                              $logParamsDetails[] = array(
 +                              $logParamsDetails[] = [
                                        'type' => 'create',
                                        'level' => $limit['create'],
                                        'expiry' => $expiry['create'],
 -                              );
 +                              ];
                        } else {
                                $dbw->delete( 'protected_titles',
 -                                      array(
 +                                      [
                                                'pt_namespace' => $this->mTitle->getNamespace(),
                                                'pt_title' => $this->mTitle->getDBkey()
 -                                      ), __METHOD__
 +                                      ], __METHOD__
                                );
                        }
                }
                InfoAction::invalidateCache( $this->mTitle );
  
                if ( $logAction == 'unprotect' ) {
 -                      $params = array();
 +                      $params = [];
                } else {
                        $protectDescriptionLog = $this->protectDescriptionLog( $limit, $expiry );
 -                      $params = array(
 +                      $params = [
                                '4::description' => $protectDescriptionLog, // parameter for IRC
                                '5:bool:cascade' => $cascade,
                                'details' => $logParamsDetails, // parameter for localize and api
 -                      );
 +                      ];
                }
  
                // Update the protection log
                $logEntry->setComment( $reason );
                $logEntry->setPerformer( $user );
                $logEntry->setParameters( $params );
 +              if ( !is_null( $nullRevision ) ) {
 +                      $logEntry->setAssociatedRevId( $nullRevision->getId() );
 +              }
 +              $logEntry->setTags( $tags );
                if ( $logRelationsField !== null && count( $logRelationsValues ) ) {
 -                      $logEntry->setRelations( array( $logRelationsField => $logRelationsValues ) );
 +                      $logEntry->setRelations( [ $logRelationsField => $logRelationsValues ] );
                }
                $logId = $logEntry->insert();
                $logEntry->publish( $logId );
  
 -              return Status::newGood();
 +              return Status::newGood( $logId );
        }
  
        /**
        public function insertProtectNullRevision( $revCommentMsg, array $limit,
                array $expiry, $cascade, $reason, $user = null
        ) {
-               global $wgContLang;
                $dbw = wfGetDB( DB_MASTER );
  
                // Prepare a null revision to be added to the history
-               $editComment = $wgContLang->ucfirst(
-                       wfMessage(
-                               $revCommentMsg,
-                               $this->mTitle->getPrefixedText()
-                       )->inContentLanguage()->text()
-               );
+               $editComment = wfMessage(
+                       $revCommentMsg,
+                       $this->mTitle->getPrefixedText(),
+                       $user ? $user->getName() : ''
+               )->inContentLanguage()->text();
                if ( $reason ) {
                        $editComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
                }
                $protectDescription = '';
  
                foreach ( array_filter( $limit ) as $action => $restrictions ) {
 -                      # $action is one of $wgRestrictionTypes = array( 'create', 'edit', 'move', 'upload' ).
 +                      # $action is one of $wgRestrictionTypes = [ 'create', 'edit', 'move', 'upload' ].
                        # All possible message keys are listed here for easier grepping:
                        # * restriction-create
                        # * restriction-edit
                        # * restriction-move
                        # * restriction-upload
                        $actionText = wfMessage( 'restriction-' . $action )->inContentLanguage()->text();
 -                      # $restrictions is one of $wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' ),
 +                      # $restrictions is one of $wgRestrictionLevels = [ '', 'autoconfirmed', 'sysop' ],
                        # with '' filtered out. All possible message keys are listed below:
                        # * protect-level-autoconfirmed
                        # * protect-level-sysop
                        throw new MWException( __METHOD__ . ' given non-array restriction set' );
                }
  
 -              $bits = array();
 +              $bits = [];
                ksort( $limit );
  
                foreach ( array_filter( $limit ) as $action => $restrictions ) {
         * @param bool $u2 Unused
         * @param array|string &$error Array of errors to append to
         * @param User $user The deleting user
 +       * @param array $tags Tags to apply to the deletion action
         * @return Status Status object; if successful, $status->value is the log_id of the
         *   deletion log entry. If the page couldn't be deleted because it wasn't
         *   found, $status is a non-fatal 'cannotdelete' error
         */
        public function doDeleteArticleReal(
 -              $reason, $suppress = false, $u1 = null, $u2 = null, &$error = '', User $user = null
 +              $reason, $suppress = false, $u1 = null, $u2 = null, &$error = '', User $user = null,
 +              $tags = []
        ) {
                global $wgUser, $wgContentHandlerUseDB;
  
  
                $user = is_null( $user ) ? $wgUser : $user;
                if ( !Hooks::run( 'ArticleDelete',
 -                      array( &$this, &$user, &$reason, &$error, &$status, $suppress )
 +                      [ &$this, &$user, &$reason, &$error, &$status, $suppress ]
                ) ) {
                        if ( $status->isOK() ) {
                                // Hook aborted but didn't set a fatal status
                $dbw->startAtomic( __METHOD__ );
  
                $this->loadPageData( self::READ_LATEST );
 -              $id = $this->getID();
 +              $id = $this->getId();
                // T98706: lock the page from various other updates but avoid using
                // WikiPage::READ_LOCKING as that will carry over the FOR UPDATE to
                // the revisions queries (which also JOIN on user). Only lock the page
                        return $status;
                }
  
 +              // Given the lock above, we can be confident in the title and page ID values
 +              $namespace = $this->getTitle()->getNamespace();
 +              $dbKey = $this->getTitle()->getDBkey();
 +
                // At this point we are now comitted to returning an OK
                // status unless some DB query error or other exception comes up.
                // This way callers don't have to call rollback() if $status is bad
                // unless they actually try to catch exceptions (which is rare).
  
                // we need to remember the old content so we can use it to generate all deletion updates.
 -              $content = $this->getContent( Revision::RAW );
 +              $revision = $this->getRevision();
 +              try {
 +                      $content = $this->getContent( Revision::RAW );
 +              } catch ( Exception $ex ) {
 +                      wfLogWarning( __METHOD__ . ': failed to load content during deletion! '
 +                              . $ex->getMessage() );
 +
 +                      $content = null;
 +              }
 +
 +              $fields = Revision::selectFields();
 +              $bitfield = false;
  
                // Bitfields to further suppress the content
                if ( $suppress ) {
 -                      $bitfield = 0;
 -                      // This should be 15...
 -                      $bitfield |= Revision::DELETED_TEXT;
 -                      $bitfield |= Revision::DELETED_COMMENT;
 -                      $bitfield |= Revision::DELETED_USER;
 -                      $bitfield |= Revision::DELETED_RESTRICTED;
 -              } else {
 -                      $bitfield = 'rev_deleted';
 -              }
 -
 -              /**
 -               * For now, shunt the revision data into the archive table.
 -               * Text is *not* removed from the text table; bulk storage
 -               * is left intact to avoid breaking block-compression or
 -               * immutable storage schemes.
 -               *
 -               * For backwards compatibility, note that some older archive
 -               * table entries will have ar_text and ar_flags fields still.
 -               *
 -               * In the future, we may keep revisions and mark them with
 -               * the rev_deleted field, which is reserved for this purpose.
 -               */
 -
 -              $row = array(
 -                      'ar_namespace'  => 'page_namespace',
 -                      'ar_title'      => 'page_title',
 -                      'ar_comment'    => 'rev_comment',
 -                      'ar_user'       => 'rev_user',
 -                      'ar_user_text'  => 'rev_user_text',
 -                      'ar_timestamp'  => 'rev_timestamp',
 -                      'ar_minor_edit' => 'rev_minor_edit',
 -                      'ar_rev_id'     => 'rev_id',
 -                      'ar_parent_id'  => 'rev_parent_id',
 -                      'ar_text_id'    => 'rev_text_id',
 -                      'ar_text'       => '\'\'', // Be explicit to appease
 -                      'ar_flags'      => '\'\'', // MySQL's "strict mode"...
 -                      'ar_len'        => 'rev_len',
 -                      'ar_page_id'    => 'page_id',
 -                      'ar_deleted'    => $bitfield,
 -                      'ar_sha1'       => 'rev_sha1',
 +                      $bitfield = Revision::SUPPRESSED_ALL;
 +                      $fields = array_diff( $fields, [ 'rev_deleted' ] );
 +              }
 +
 +              // For now, shunt the revision data into the archive table.
 +              // Text is *not* removed from the text table; bulk storage
 +              // is left intact to avoid breaking block-compression or
 +              // immutable storage schemes.
 +              // In the future, we may keep revisions and mark them with
 +              // the rev_deleted field, which is reserved for this purpose.
 +
 +              // Get all of the page revisions
 +              $res = $dbw->select(
 +                      'revision',
 +                      $fields,
 +                      [ 'rev_page' => $id ],
 +                      __METHOD__,
 +                      'FOR UPDATE'
                );
 -
 -              if ( $wgContentHandlerUseDB ) {
 -                      $row['ar_content_model'] = 'rev_content_model';
 -                      $row['ar_content_format'] = 'rev_content_format';
 +              // Build their equivalent archive rows
 +              $rowsInsert = [];
 +              foreach ( $res as $row ) {
 +                      $rowInsert = [
 +                              'ar_namespace'  => $namespace,
 +                              'ar_title'      => $dbKey,
 +                              'ar_comment'    => $row->rev_comment,
 +                              'ar_user'       => $row->rev_user,
 +                              'ar_user_text'  => $row->rev_user_text,
 +                              'ar_timestamp'  => $row->rev_timestamp,
 +                              'ar_minor_edit' => $row->rev_minor_edit,
 +                              'ar_rev_id'     => $row->rev_id,
 +                              'ar_parent_id'  => $row->rev_parent_id,
 +                              'ar_text_id'    => $row->rev_text_id,
 +                              'ar_text'       => '',
 +                              'ar_flags'      => '',
 +                              'ar_len'        => $row->rev_len,
 +                              'ar_page_id'    => $id,
 +                              'ar_deleted'    => $suppress ? $bitfield : $row->rev_deleted,
 +                              'ar_sha1'       => $row->rev_sha1,
 +                      ];
 +                      if ( $wgContentHandlerUseDB ) {
 +                              $rowInsert['ar_content_model'] = $row->rev_content_model;
 +                              $rowInsert['ar_content_format'] = $row->rev_content_format;
 +                      }
 +                      $rowsInsert[] = $rowInsert;
                }
 +              // Copy them into the archive table
 +              $dbw->insert( 'archive', $rowsInsert, __METHOD__ );
 +              // Save this so we can pass it to the ArticleDeleteComplete hook.
 +              $archivedRevisionCount = $dbw->affectedRows();
  
 -              // Copy all the page revisions into the archive table
 -              $dbw->insertSelect(
 -                      'archive',
 -                      array( 'page', 'revision' ),
 -                      $row,
 -                      array(
 -                              'page_id' => $id,
 -                              'page_id = rev_page'
 -                      ),
 -                      __METHOD__
 -              );
 +              // Clone the title and wikiPage, so we have the information we need when
 +              // we log and run the ArticleDeleteComplete hook.
 +              $logTitle = clone $this->mTitle;
 +              $wikiPageBeforeDelete = clone $this;
  
                // Now that it's safely backed up, delete it
 -              $dbw->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
 -
 -              if ( !$dbw->cascadingDeletes() ) {
 -                      $dbw->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
 -              }
 -
 -              // Clone the title, so we have the information we need when we log
 -              $logTitle = clone $this->mTitle;
 +              $dbw->delete( 'page', [ 'page_id' => $id ], __METHOD__ );
 +              $dbw->delete( 'revision', [ 'rev_page' => $id ], __METHOD__ );
  
                // Log the deletion, if the page was suppressed, put it in the suppression log instead
                $logtype = $suppress ? 'suppress' : 'delete';
                $logEntry->setPerformer( $user );
                $logEntry->setTarget( $logTitle );
                $logEntry->setComment( $reason );
 +              $logEntry->setTags( $tags );
                $logid = $logEntry->insert();
  
 -              $dbw->onTransactionPreCommitOrIdle( function () use ( $dbw, $logEntry, $logid ) {
 -                      // Bug 56776: avoid deadlocks (especially from FileDeleteForm)
 -                      $logEntry->publish( $logid );
 -              } );
 +              $dbw->onTransactionPreCommitOrIdle(
 +                      function () use ( $dbw, $logEntry, $logid ) {
 +                              // Bug 56776: avoid deadlocks (especially from FileDeleteForm)
 +                              $logEntry->publish( $logid );
 +                      },
 +                      __METHOD__
 +              );
  
                $dbw->endAtomic( __METHOD__ );
  
 -              $this->doDeleteUpdates( $id, $content );
 -
 -              Hooks::run( 'ArticleDeleteComplete',
 -                      array( &$this, &$user, $reason, $id, $content, $logEntry ) );
 +              $this->doDeleteUpdates( $id, $content, $revision );
 +
 +              Hooks::run( 'ArticleDeleteComplete', [
 +                      &$wikiPageBeforeDelete,
 +                      &$user,
 +                      $reason,
 +                      $id,
 +                      $content,
 +                      $logEntry,
 +                      $archivedRevisionCount
 +              ] );
                $status->value = $logid;
  
                // Show log excerpt on 404 pages rather than just a link
                return (int)wfGetDB( DB_MASTER )->selectField(
                        'page',
                        'page_latest',
 -                      array(
 +                      [
                                'page_id' => $this->getId(),
                                // Typically page_id is enough, but some code might try to do
                                // updates assuming the title is the same, so verify that
                                'page_namespace' => $this->getTitle()->getNamespace(),
                                'page_title' => $this->getTitle()->getDBkey()
 -                      ),
 +                      ],
                        __METHOD__,
 -                      array( 'FOR UPDATE' )
 +                      [ 'FOR UPDATE' ]
                );
        }
  
         * Do some database updates after deletion
         *
         * @param int $id The page_id value of the page being deleted
 -       * @param Content $content Optional page content to be used when determining
 +       * @param Content|null $content Optional page content to be used when determining
         *   the required updates. This may be needed because $this->getContent()
         *   may already return null when the page proper was deleted.
 +       * @param Revision|null $revision The latest page revision
         */
 -      public function doDeleteUpdates( $id, Content $content = null ) {
 +      public function doDeleteUpdates( $id, Content $content = null, Revision $revision = null ) {
 +              try {
 +                      $countable = $this->isCountable();
 +              } catch ( Exception $ex ) {
 +                      // fallback for deleting broken pages for which we cannot load the content for
 +                      // some reason. Note that doDeleteArticleReal() already logged this problem.
 +                      $countable = false;
 +              }
 +
                // Update site status
 -              DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, - (int)$this->isCountable(), -1 ) );
 +              DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, - (int)$countable, -1 ) );
  
                // Delete pagelinks, update secondary indexes, etc
                $updates = $this->getDeletionUpdates( $content );
  
                // Clear caches
                WikiPage::onArticleDelete( $this->mTitle );
 +              ResourceLoaderWikiModule::invalidateModuleCache(
 +                      $this->mTitle, $revision, null, wfWikiID()
 +              );
  
                // Reset this object and the Title object
                $this->loadFromRow( false, self::READ_LATEST );
         * to do the dirty work
         *
         * @todo Separate the business/permission stuff out from backend code
 +       * @todo Remove $token parameter. Already verified by RollbackAction and ApiRollback.
         *
         * @param string $fromP Name of the user whose edits to rollback.
         * @param string $summary Custom summary. Set to default summary if empty.
         *    success        : 'summary' (str), 'current' (rev), 'target' (rev)
         *
         * @param User $user The user performing the rollback
 +       * @param array|null $tags Change tags to apply to the rollback
 +       * Callers are responsible for permission checks
 +       * (with ChangeTags::canAddTagsAccompanyingChange)
 +       *
         * @return array Array of errors, each error formatted as
         *   array(messagekey, param1, param2, ...).
         * On success, the array is empty.  This array can also be passed to
         * OutputPage::showPermissionsErrorPage().
         */
        public function doRollback(
 -              $fromP, $summary, $token, $bot, &$resultDetails, User $user
 +              $fromP, $summary, $token, $bot, &$resultDetails, User $user, $tags = null
        ) {
                $resultDetails = null;
  
                $rollbackErrors = $this->mTitle->getUserPermissionsErrors( 'rollback', $user );
                $errors = array_merge( $editErrors, wfArrayDiff2( $rollbackErrors, $editErrors ) );
  
 -              if ( !$user->matchEditToken( $token, array( $this->mTitle->getPrefixedText(), $fromP ) ) ) {
 -                      $errors[] = array( 'sessionfailure' );
 +              if ( !$user->matchEditToken( $token, 'rollback' ) ) {
 +                      $errors[] = [ 'sessionfailure' ];
                }
  
                if ( $user->pingLimiter( 'rollback' ) || $user->pingLimiter() ) {
 -                      $errors[] = array( 'actionthrottledtext' );
 +                      $errors[] = [ 'actionthrottledtext' ];
                }
  
                // If there were errors, bail out now
                        return $errors;
                }
  
 -              return $this->commitRollback( $fromP, $summary, $bot, $resultDetails, $user );
 +              return $this->commitRollback( $fromP, $summary, $bot, $resultDetails, $user, $tags );
        }
  
        /**
         *
         * @param array $resultDetails Contains result-specific array of additional values
         * @param User $guser The user performing the rollback
 +       * @param array|null $tags Change tags to apply to the rollback
 +       * Callers are responsible for permission checks
 +       * (with ChangeTags::canAddTagsAccompanyingChange)
 +       *
         * @return array
         */
 -      public function commitRollback( $fromP, $summary, $bot, &$resultDetails, User $guser ) {
 +      public function commitRollback( $fromP, $summary, $bot,
 +              &$resultDetails, User $guser, $tags = null
 +      ) {
                global $wgUseRCPatrol, $wgContLang;
  
                $dbw = wfGetDB( DB_MASTER );
  
                if ( wfReadOnly() ) {
 -                      return array( array( 'readonlytext' ) );
 +                      return [ [ 'readonlytext' ] ];
                }
  
                // Get the last editor
                $current = $this->getRevision();
                if ( is_null( $current ) ) {
                        // Something wrong... no page?
 -                      return array( array( 'notanarticle' ) );
 +                      return [ [ 'notanarticle' ] ];
                }
  
                $from = str_replace( '_', ' ', $fromP );
                // User name given should match up with the top revision.
                // If the user was deleted then $from should be empty.
                if ( $from != $current->getUserText() ) {
 -                      $resultDetails = array( 'current' => $current );
 -                      return array( array( 'alreadyrolled',
 +                      $resultDetails = [ 'current' => $current ];
 +                      return [ [ 'alreadyrolled',
                                htmlspecialchars( $this->mTitle->getPrefixedText() ),
                                htmlspecialchars( $fromP ),
                                htmlspecialchars( $current->getUserText() )
 -                      ) );
 +                      ] ];
                }
  
                // Get the last edit not by this person...
                $user = intval( $current->getUser( Revision::RAW ) );
                $user_text = $dbw->addQuotes( $current->getUserText( Revision::RAW ) );
                $s = $dbw->selectRow( 'revision',
 -                      array( 'rev_id', 'rev_timestamp', 'rev_deleted' ),
 -                      array( 'rev_page' => $current->getPage(),
 +                      [ 'rev_id', 'rev_timestamp', 'rev_deleted' ],
 +                      [ 'rev_page' => $current->getPage(),
                                "rev_user != {$user} OR rev_user_text != {$user_text}"
 -                      ), __METHOD__,
 -                      array( 'USE INDEX' => 'page_timestamp',
 -                              'ORDER BY' => 'rev_timestamp DESC' )
 +                      ], __METHOD__,
 +                      [ 'USE INDEX' => 'page_timestamp',
 +                              'ORDER BY' => 'rev_timestamp DESC' ]
                        );
                if ( $s === false ) {
                        // No one else ever edited this page
 -                      return array( array( 'cantrollback' ) );
 +                      return [ [ 'cantrollback' ] ];
                } elseif ( $s->rev_deleted & Revision::DELETED_TEXT
                        || $s->rev_deleted & Revision::DELETED_USER
                ) {
                        // Only admins can see this text
 -                      return array( array( 'notvisiblerev' ) );
 +                      return [ [ 'notvisiblerev' ] ];
                }
  
                // Generate the edit summary if necessary
                }
  
                // Allow the custom summary to use the same args as the default message
 -              $args = array(
 +              $args = [
                        $target->getUserText(), $from, $s->rev_id,
                        $wgContLang->timeanddate( wfTimestamp( TS_MW, $s->rev_timestamp ) ),
                        $current->getId(), $wgContLang->timeanddate( $current->getTimestamp() )
 -              );
 +              ];
                if ( $summary instanceof Message ) {
                        $summary = $summary->params( $args )->inContentLanguage()->text();
                } else {
                $summary = $wgContLang->truncate( $summary, 255 );
  
                // Save
 -              $flags = EDIT_UPDATE;
 +              $flags = EDIT_UPDATE | EDIT_INTERNAL;
  
                if ( $guser->isAllowed( 'minoredit' ) ) {
                        $flags |= EDIT_MINOR;
                        $flags |= EDIT_FORCE_BOT;
                }
  
 +              $targetContent = $target->getContent();
 +              $changingContentModel = $targetContent->getModel() !== $current->getContentModel();
 +
                // Actually store the edit
                $status = $this->doEditContent(
 -                      $target->getContent(),
 +                      $targetContent,
                        $summary,
                        $flags,
                        $target->getId(),
 -                      $guser
 +                      $guser,
 +                      null,
 +                      $tags
                );
  
                // Set patrolling and bot flag on the edits, which gets rollbacked.
                // This is done even on edit failure to have patrolling in that case (bug 62157).
 -              $set = array();
 +              $set = [];
                if ( $bot && $guser->isAllowed( 'markbotedits' ) ) {
                        // Mark all reverted edits as bot
                        $set['rc_bot'] = 1;
  
                if ( count( $set ) ) {
                        $dbw->update( 'recentchanges', $set,
 -                              array( /* WHERE */
 +                              [ /* WHERE */
                                        'rc_cur_id' => $current->getPage(),
                                        'rc_user_text' => $current->getUserText(),
                                        'rc_timestamp > ' . $dbw->addQuotes( $s->rev_timestamp ),
 -                              ),
 +                              ],
                                __METHOD__
                        );
                }
                        ? $status->value['revision']
                        : null;
                if ( !( $statusRev instanceof Revision ) ) {
 -                      $resultDetails = array( 'current' => $current );
 -                      return array( array( 'alreadyrolled',
 +                      $resultDetails = [ 'current' => $current ];
 +                      return [ [ 'alreadyrolled',
                                        htmlspecialchars( $this->mTitle->getPrefixedText() ),
                                        htmlspecialchars( $fromP ),
                                        htmlspecialchars( $current->getUserText() )
 -                      ) );
 +                      ] ];
 +              }
 +
 +              if ( $changingContentModel ) {
 +                      // If the content model changed during the rollback,
 +                      // make sure it gets logged to Special:Log/contentmodel
 +                      $log = new ManualLogEntry( 'contentmodel', 'change' );
 +                      $log->setPerformer( $guser );
 +                      $log->setTarget( $this->mTitle );
 +                      $log->setComment( $summary );
 +                      $log->setParameters( [
 +                              '4::oldmodel' => $current->getContentModel(),
 +                              '5::newmodel' => $targetContent->getModel(),
 +                      ] );
 +
 +                      $logId = $log->insert( $dbw );
 +                      $log->publish( $logId );
                }
  
                $revId = $statusRev->getId();
  
 -              Hooks::run( 'ArticleRollbackComplete', array( $this, $guser, $target, $current ) );
 +              Hooks::run( 'ArticleRollbackComplete', [ $this, $guser, $target, $current ] );
  
 -              $resultDetails = array(
 +              $resultDetails = [
                        'summary' => $summary,
                        'current' => $current,
                        'target' => $target,
                        'newid' => $revId
 -              );
 +              ];
  
 -              return array();
 +              return [];
        }
  
        /**
                $title->touchLinks();
                $title->purgeSquid();
                $title->deleteTitleProtection();
 +
 +              MediaWikiServices::getInstance()->getLinkCache()->invalidateTitle( $title );
 +
 +              if ( $title->getNamespace() == NS_CATEGORY ) {
 +                      // Load the Category object, which will schedule a job to create
 +                      // the category table row if necessary. Checking a replica DB is ok
 +                      // here, in the worst case it'll run an unnecessary recount job on
 +                      // a category that probably doesn't have many members.
 +                      Category::newFromTitle( $title )->getID();
 +              }
        }
  
        /**
         * @param Title $title
         */
        public static function onArticleDelete( Title $title ) {
 +              global $wgContLang;
 +
                // Update existence markers on article/talk tabs...
                $other = $title->getOtherPage();
  
                $title->touchLinks();
                $title->purgeSquid();
  
 +              MediaWikiServices::getInstance()->getLinkCache()->invalidateTitle( $title );
 +
                // File cache
                HTMLFileCache::clearFileCache( $title );
                InfoAction::invalidateCache( $title );
                // Messages
                if ( $title->getNamespace() == NS_MEDIAWIKI ) {
                        MessageCache::singleton()->replace( $title->getDBkey(), false );
 +
 +                      if ( $wgContLang->hasVariants() ) {
 +                              $wgContLang->updateConversionTable( $title );
 +                      }
                }
  
                // Images
                // Invalidate the caches of all pages which redirect here
                DeferredUpdates::addUpdate( new HTMLCacheUpdate( $title, 'redirect' ) );
  
 -              // Purge squid for this page only
 +              MediaWikiServices::getInstance()->getLinkCache()->invalidateTitle( $title );
 +
 +              // Purge CDN for this page only
                $title->purgeSquid();
                // Clear file cache for this page only
                HTMLFileCache::clearFileCache( $title );
        public function getCategories() {
                $id = $this->getId();
                if ( $id == 0 ) {
 -                      return TitleArray::newFromResult( new FakeResultWrapper( array() ) );
 +                      return TitleArray::newFromResult( new FakeResultWrapper( [] ) );
                }
  
 -              $dbr = wfGetDB( DB_SLAVE );
 +              $dbr = wfGetDB( DB_REPLICA );
                $res = $dbr->select( 'categorylinks',
 -                      array( 'cl_to AS page_title, ' . NS_CATEGORY . ' AS page_namespace' ),
 -                      // Have to do that since DatabaseBase::fieldNamesWithAlias treats numeric indexes
 +                      [ 'cl_to AS page_title, ' . NS_CATEGORY . ' AS page_namespace' ],
 +                      // Have to do that since Database::fieldNamesWithAlias treats numeric indexes
                        // as not being aliases, and NS_CATEGORY is numeric
 -                      array( 'cl_from' => $id ),
 +                      [ 'cl_from' => $id ],
                        __METHOD__ );
  
                return TitleArray::newFromResult( $res );
         * @return array Array of Title objects
         */
        public function getHiddenCategories() {
 -              $result = array();
 +              $result = [];
                $id = $this->getId();
  
                if ( $id == 0 ) {
 -                      return array();
 +                      return [];
                }
  
 -              $dbr = wfGetDB( DB_SLAVE );
 -              $res = $dbr->select( array( 'categorylinks', 'page_props', 'page' ),
 -                      array( 'cl_to' ),
 -                      array( 'cl_from' => $id, 'pp_page=page_id', 'pp_propname' => 'hiddencat',
 -                              'page_namespace' => NS_CATEGORY, 'page_title=cl_to' ),
 +              $dbr = wfGetDB( DB_REPLICA );
 +              $res = $dbr->select( [ 'categorylinks', 'page_props', 'page' ],
 +                      [ 'cl_to' ],
 +                      [ 'cl_from' => $id, 'pp_page=page_id', 'pp_propname' => 'hiddencat',
 +                              'page_namespace' => NS_CATEGORY, 'page_title=cl_to' ],
                        __METHOD__ );
  
                if ( $res !== false ) {
                // NOTE: stub for backwards-compatibility. assumes the given text is
                // wikitext. will break horribly if it isn't.
  
 -              ContentHandler::deprecated( __METHOD__, '1.21' );
 +              wfDeprecated( __METHOD__, '1.21' );
  
                $handler = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT );
                $oldContent = is_null( $oldtext ) ? null : $handler->unserializeContent( $oldtext );
         * Update all the appropriate counts in the category table, given that
         * we've added the categories $added and deleted the categories $deleted.
         *
 +       * This should only be called from deferred updates or jobs to avoid contention.
 +       *
         * @param array $added The names of categories that were added
         * @param array $deleted The names of categories that were deleted
 +       * @param integer $id Page ID (this should be the original deleted page ID)
         */
 -      public function updateCategoryCounts( array $added, array $deleted ) {
 -              $that = $this;
 -              $method = __METHOD__;
 -              $dbw = wfGetDB( DB_MASTER );
 +      public function updateCategoryCounts( array $added, array $deleted, $id = 0 ) {
 +              $id = $id ?: $this->getId();
 +              $ns = $this->getTitle()->getNamespace();
  
 -              // Do this at the end of the commit to reduce lock wait timeouts
 -              $dbw->onTransactionPreCommitOrIdle(
 -                      function () use ( $dbw, $that, $method, $added, $deleted ) {
 -                              $ns = $that->getTitle()->getNamespace();
 -
 -                              $addFields = array( 'cat_pages = cat_pages + 1' );
 -                              $removeFields = array( 'cat_pages = cat_pages - 1' );
 -                              if ( $ns == NS_CATEGORY ) {
 -                                      $addFields[] = 'cat_subcats = cat_subcats + 1';
 -                                      $removeFields[] = 'cat_subcats = cat_subcats - 1';
 -                              } elseif ( $ns == NS_FILE ) {
 -                                      $addFields[] = 'cat_files = cat_files + 1';
 -                                      $removeFields[] = 'cat_files = cat_files - 1';
 -                              }
 +              $addFields = [ 'cat_pages = cat_pages + 1' ];
 +              $removeFields = [ 'cat_pages = cat_pages - 1' ];
 +              if ( $ns == NS_CATEGORY ) {
 +                      $addFields[] = 'cat_subcats = cat_subcats + 1';
 +                      $removeFields[] = 'cat_subcats = cat_subcats - 1';
 +              } elseif ( $ns == NS_FILE ) {
 +                      $addFields[] = 'cat_files = cat_files + 1';
 +                      $removeFields[] = 'cat_files = cat_files - 1';
 +              }
  
 -                              if ( count( $added ) ) {
 -                                      $existingAdded = $dbw->selectFieldValues(
 -                                              'category',
 -                                              'cat_title',
 -                                              array( 'cat_title' => $added ),
 -                                              __METHOD__
 -                                      );
 +              $dbw = wfGetDB( DB_MASTER );
  
 -                                      // For category rows that already exist, do a plain
 -                                      // UPDATE instead of INSERT...ON DUPLICATE KEY UPDATE
 -                                      // to avoid creating gaps in the cat_id sequence.
 -                                      if ( count( $existingAdded ) ) {
 -                                              $dbw->update(
 -                                                      'category',
 -                                                      $addFields,
 -                                                      array( 'cat_title' => $existingAdded ),
 -                                                      __METHOD__
 -                                              );
 -                                      }
 +              if ( count( $added ) ) {
 +                      $existingAdded = $dbw->selectFieldValues(
 +                              'category',
 +                              'cat_title',
 +                              [ 'cat_title' => $added ],
 +                              __METHOD__
 +                      );
  
 -                                      $missingAdded = array_diff( $added, $existingAdded );
 -                                      if ( count( $missingAdded ) ) {
 -                                              $insertRows = array();
 -                                              foreach ( $missingAdded as $cat ) {
 -                                                      $insertRows[] = array(
 -                                                              'cat_title'   => $cat,
 -                                                              'cat_pages'   => 1,
 -                                                              'cat_subcats' => ( $ns == NS_CATEGORY ) ? 1 : 0,
 -                                                              'cat_files'   => ( $ns == NS_FILE ) ? 1 : 0,
 -                                                      );
 -                                              }
 -                                              $dbw->upsert(
 -                                                      'category',
 -                                                      $insertRows,
 -                                                      array( 'cat_title' ),
 -                                                      $addFields,
 -                                                      $method
 -                                              );
 -                                      }
 -                              }
 +                      // For category rows that already exist, do a plain
 +                      // UPDATE instead of INSERT...ON DUPLICATE KEY UPDATE
 +                      // to avoid creating gaps in the cat_id sequence.
 +                      if ( count( $existingAdded ) ) {
 +                              $dbw->update(
 +                                      'category',
 +                                      $addFields,
 +                                      [ 'cat_title' => $existingAdded ],
 +                                      __METHOD__
 +                              );
 +                      }
  
 -                              if ( count( $deleted ) ) {
 -                                      $dbw->update(
 -                                              'category',
 -                                              $removeFields,
 -                                              array( 'cat_title' => $deleted ),
 -                                              $method
 -                                      );
 +                      $missingAdded = array_diff( $added, $existingAdded );
 +                      if ( count( $missingAdded ) ) {
 +                              $insertRows = [];
 +                              foreach ( $missingAdded as $cat ) {
 +                                      $insertRows[] = [
 +                                              'cat_title'   => $cat,
 +                                              'cat_pages'   => 1,
 +                                              'cat_subcats' => ( $ns == NS_CATEGORY ) ? 1 : 0,
 +                                              'cat_files'   => ( $ns == NS_FILE ) ? 1 : 0,
 +                                      ];
                                }
 +                              $dbw->upsert(
 +                                      'category',
 +                                      $insertRows,
 +                                      [ 'cat_title' ],
 +                                      $addFields,
 +                                      __METHOD__
 +                              );
 +                      }
 +              }
  
 -                              foreach ( $added as $catName ) {
 -                                      $cat = Category::newFromName( $catName );
 -                                      Hooks::run( 'CategoryAfterPageAdded', array( $cat, $that ) );
 -                              }
 +              if ( count( $deleted ) ) {
 +                      $dbw->update(
 +                              'category',
 +                              $removeFields,
 +                              [ 'cat_title' => $deleted ],
 +                              __METHOD__
 +                      );
 +              }
  
 -                              foreach ( $deleted as $catName ) {
 -                                      $cat = Category::newFromName( $catName );
 -                                      Hooks::run( 'CategoryAfterPageRemoved', array( $cat, $that ) );
 -                              }
 +              foreach ( $added as $catName ) {
 +                      $cat = Category::newFromName( $catName );
 +                      Hooks::run( 'CategoryAfterPageAdded', [ $cat, $this ] );
 +              }
 +
 +              foreach ( $deleted as $catName ) {
 +                      $cat = Category::newFromName( $catName );
 +                      Hooks::run( 'CategoryAfterPageRemoved', [ $cat, $this, $id ] );
 +              }
 +
 +              // Refresh counts on categories that should be empty now, to
 +              // trigger possible deletion. Check master for the most
 +              // up-to-date cat_pages.
 +              if ( count( $deleted ) ) {
 +                      $rows = $dbw->select(
 +                              'category',
 +                              [ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ],
 +                              [ 'cat_title' => $deleted, 'cat_pages <= 0' ],
 +                              __METHOD__
 +                      );
 +                      foreach ( $rows as $row ) {
 +                              $cat = Category::newFromRow( $row );
 +                              $cat->refreshCounts();
                        }
 -              );
 +              }
        }
  
        /**
                }
  
                if ( !Hooks::run( 'OpportunisticLinksUpdate',
 -                      array( $this, $this->mTitle, $parserOutput )
 +                      [ $this, $this->mTitle, $parserOutput ]
                ) ) {
                        return;
                }
  
 -              $params = array(
 +              $config = RequestContext::getMain()->getConfig();
 +
 +              $params = [
                        'isOpportunistic' => true,
                        'rootJobTimestamp' => $parserOutput->getCacheTime()
 -              );
 +              ];
  
                if ( $this->mTitle->areRestrictionsCascading() ) {
                        // If the page is cascade protecting, the links should really be up-to-date
                        JobQueueGroup::singleton()->lazyPush(
                                RefreshLinksJob::newPrioritized( $this->mTitle, $params )
                        );
 -              } elseif ( $parserOutput->hasDynamicContent() ) {
 +              } elseif ( !$config->get( 'MiserMode' ) && $parserOutput->hasDynamicContent() ) {
                        // Assume the output contains "dynamic" time/random based magic words.
                        // Only update pages that expired due to dynamic content and NOT due to edits
                        // to referenced templates/files. When the cache expires due to dynamic content,
                                // Although it would be de-duplicated, it would still waste I/O.
                                $cache = ObjectCache::getLocalClusterInstance();
                                $key = $cache->makeKey( 'dynamic-linksupdate', 'last', $this->getId() );
 -                              if ( $cache->add( $key, time(), 60 ) ) {
 +                              $ttl = max( $parserOutput->getCacheExpiry(), 3600 );
 +                              if ( $cache->add( $key, time(), $ttl ) ) {
                                        JobQueueGroup::singleton()->lazyPush(
                                                RefreshLinksJob::newDynamic( $this->mTitle, $params )
                                        );
                }
        }
  
 -      /**
 -       * Return a list of templates used by this article.
 -       * Uses the templatelinks table
 -       *
 -       * @deprecated since 1.19; use Title::getTemplateLinksFrom()
 -       * @return array Array of Title objects
 -       */
 -      public function getUsedTemplates() {
 -              return $this->mTitle->getTemplateLinksFrom();
 -      }
 -
 -      /**
 -       * This function is called right before saving the wikitext,
 -       * so we can do things like signatures and links-in-context.
 -       *
 -       * @deprecated since 1.19; use Parser::preSaveTransform() instead
 -       * @param string $text Article contents
 -       * @param User $user User doing the edit
 -       * @param ParserOptions $popts Parser options, default options for
 -       *   the user loaded if null given
 -       * @return string Article contents with altered wikitext markup (signatures
 -       *      converted, {{subst:}}, templates, etc.)
 -       */
 -      public function preSaveTransform( $text, User $user = null, ParserOptions $popts = null ) {
 -              global $wgParser, $wgUser;
 -
 -              wfDeprecated( __METHOD__, '1.19' );
 -
 -              $user = is_null( $user ) ? $wgUser : $user;
 -
 -              if ( $popts === null ) {
 -                      $popts = ParserOptions::newFromUser( $user );
 -              }
 -
 -              return $wgParser->preSaveTransform( $text, $this->mTitle, $user, $popts );
 -      }
 -
 -      /**
 -       * Update the article's restriction field, and leave a log entry.
 -       *
 -       * @deprecated since 1.19
 -       * @param array $limit Set of restriction keys
 -       * @param string $reason
 -       * @param int &$cascade Set to false if cascading protection isn't allowed.
 -       * @param array $expiry Per restriction type expiration
 -       * @param User $user The user updating the restrictions
 -       * @return bool True on success
 -       */
 -      public function updateRestrictions(
 -              $limit = array(), $reason = '', &$cascade = 0, $expiry = array(), User $user = null
 -      ) {
 -              global $wgUser;
 -
 -              $user = is_null( $user ) ? $wgUser : $user;
 -
 -              return $this->doUpdateRestrictions( $limit, $expiry, $cascade, $reason, $user )->isOK();
 -      }
 -
        /**
         * Returns a list of updates to be performed when this page is deleted. The
         * updates should remove any information about this page from secondary data
         *
         * @param Content|null $content Optional Content object for determining the
         *   necessary updates.
 -       * @return DataUpdate[]
 +       * @return DeferrableUpdate[]
         */
        public function getDeletionUpdates( Content $content = null ) {
                if ( !$content ) {
                        // load content object, which may be used to determine the necessary updates.
                        // XXX: the content may not be needed to determine the updates.
 -                      $content = $this->getContent( Revision::RAW );
 +                      try {
 +                              $content = $this->getContent( Revision::RAW );
 +                      } catch ( Exception $ex ) {
 +                              // If we can't load the content, something is wrong. Perhaps that's why
 +                              // the user is trying to delete the page, so let's not fail in that case.
 +                              // Note that doDeleteArticleReal() will already have logged an issue with
 +                              // loading the content.
 +                      }
                }
  
                if ( !$content ) {
 -                      $updates = array();
 +                      $updates = [];
                } else {
                        $updates = $content->getDeletionUpdates( $this );
                }
  
 -              Hooks::run( 'WikiPageDeletionUpdates', array( $this, $content, &$updates ) );
 +              Hooks::run( 'WikiPageDeletionUpdates', [ $this, $content, &$updates ] );
                return $updates;
        }
 +
 +      /**
 +       * Whether this content displayed on this page
 +       * comes from the local database
 +       *
 +       * @since 1.28
 +       * @return bool
 +       */
 +      public function isLocal() {
 +              return true;
 +      }
  }
diff --combined languages/i18n/en.json
@@@ -18,7 -18,6 +18,7 @@@
        "tog-watchdefault": "Add pages and files I edit to my watchlist",
        "tog-watchmoves": "Add pages and files I move to my watchlist",
        "tog-watchdeletion": "Add pages and files I delete to my watchlist",
 +      "tog-watchuploads": "Add new files I upload to my watchlist",
        "tog-watchrollback": "Add pages where I have performed a rollback to my watchlist",
        "tog-minordefault": "Mark all edits minor by default",
        "tog-previewontop": "Show preview before edit box",
@@@ -28,7 -27,7 +28,7 @@@
        "tog-enotifminoredits": "Email me also for minor edits of pages and files",
        "tog-enotifrevealaddr": "Reveal my email address in notification emails",
        "tog-shownumberswatching": "Show the number of watching users",
 -      "tog-oldsig": "Existing signature:",
 +      "tog-oldsig": "Your existing signature:",
        "tog-fancysig": "Treat signature as wikitext (without an automatic link)",
        "tog-uselivepreview": "Use live preview",
        "tog-forceeditsummary": "Prompt me when entering a blank edit summary",
@@@ -43,9 -42,9 +43,9 @@@
        "tog-ccmeonemails": "Send me copies of emails I send to other users",
        "tog-diffonly": "Do not show page content below diffs",
        "tog-showhiddencats": "Show hidden categories",
 -      "tog-norollbackdiff": "Omit diff after performing a rollback",
 +      "tog-norollbackdiff": "Don't show diff after performing a rollback",
        "tog-useeditwarning": "Warn me when I leave an edit page with unsaved changes",
 -      "tog-prefershttps": "Always use a secure connection when logged in",
 +      "tog-prefershttps": "Always use a secure connection while logged in",
        "underline-always": "Always",
        "underline-never": "Never",
        "underline-default": "Skin or browser default",
        "october-date": "October $1",
        "november-date": "November $1",
        "december-date": "December $1",
 +      "period-am": "AM",
 +      "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Category|Categories}}",
        "pagecategorieslink": "Special:Categories",
        "category_header": "Pages in category \"$1\"",
        "noindex-category": "Noindexed pages",
        "broken-file-category": "Pages with broken file links",
        "categoryviewer-pagedlinks": "($1) ($2)",
 +      "category-header-numerals": "$1–$2",
        "about": "About",
        "article": "Content page",
        "newwindow": "(opens in new window)",
        "cancel": "Cancel",
        "moredotdotdot": "More...",
 -      "morenotlisted": "This list is not complete.",
 +      "morenotlisted": "This list may be incomplete.",
        "mypage": "Page",
        "mytalk": "Talk",
        "anontalk": "Talk",
        "tagline": "From {{SITENAME}}",
        "help": "Help",
        "search": "Search",
 +      "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Headings that will be ignored by search.\n# Changes to this take effect as soon as the page with the heading is indexed.\n# You can force page reindexing by doing a null edit.\n# The syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment.\n#   * Every non-blank line is the exact title to ignore, case and everything.\nReferences\nExternal links\nSee also\n #</pre> <!-- leave this line exactly as it is -->",
        "searchbutton": "Search",
        "go": "Go",
        "searcharticle": "Go",
        "unprotectthispage": "Change protection of this page",
        "newpage": "New page",
        "talkpage": "Discuss this page",
 -      "talkpagelinktext": "Talk",
 +      "talkpagelinktext": "talk",
        "specialpage": "Special page",
        "personaltools": "Personal tools",
        "addsection": "+",
        "talk": "Discussion",
        "views": "Views",
        "toolbox": "Tools",
 +      "tool-link-userrights": "Change {{GENDER:$1|user}} groups",
 +      "tool-link-emailuser": "Email this {{GENDER:$1|user}}",
        "userpage": "View user page",
        "projectpage": "View project page",
        "imagepage": "View file page",
        "databaseerror-query": "Query: $1",
        "databaseerror-function": "Function: $1",
        "databaseerror-error": "Error: $1",
 -      "transaction-duration-limit-exceeded": "In order to avoid creating high replication lag, this transaction was aborted because the write duration ($1) exceeded the $2 second limit.\nIf you are changing many items at once, trying doing multiple smaller operations instead.",
 +      "transaction-duration-limit-exceeded": "To avoid creating high replication lag, this transaction was aborted because the write duration ($1) exceeded the $2 second limit.\nIf you are changing many items at once, try doing multiple smaller operations instead.",
        "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.\n\nThe administrator who locked it offered this explanation: $1",
 +      "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.\n\nThe system administrator who locked it offered this explanation: $1",
        "missing-article": "The database did not find the text of a page that it should have found, named \"$1\" $2.\n\nThis is usually caused by following an outdated diff or history link to a page that has been deleted.\n\nIf this is not the case, you may have found a bug in the software.\nPlease report this to an [[Special:ListUsers/sysop|administrator]], making note of the URL.",
        "missingarticle-rev": "(revision#: $1)",
        "missingarticle-diff": "(Diff: $1, $2)",
        "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 <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.\nTo add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
 +      "protectedinterface": "This page provides interface text for the software on this wiki, and is protected to prevent abuse.\nTo add or change translations for all wikis, please use [https://translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
        "editinginterface": "<strong>Warning:</strong> You are editing a page that is used to provide interface text for the software.\nChanges to this page will affect the appearance of the user interface for other users on this wiki.",
 -      "translateinterface": "To add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
 +      "translateinterface": "To add or change translations for all wikis, please use [https://translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
        "cascadeprotected": "This page has been protected from editing because it is transcluded in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the \"cascading\" option turned on:\n$2",
        "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.",
        "myprivateinfoprotected": "You do not have permission to edit your private information.",
        "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]].\nThe reason given is \"<em>$2</em>\".",
 -      "filereadonlyerror": "Unable to modify the file \"$1\" because the file repository \"$2\" is in read-only mode.\n\nThe administrator who locked it offered this explanation: \"$3\".",
 +      "titleprotected": "This title has been protected from creation by [[User:$1|$1]].\nThe reason given is <em>$2</em>.",
 +      "filereadonlyerror": "Unable to modify the file \"$1\" because the file repository \"$2\" is in read-only mode.\n\nThe system administrator who locked it offered this explanation: \"$3\".",
        "invalidtitle-knownnamespace": "Invalid title with namespace \"$2\" and text \"$3\"",
        "invalidtitle-unknownnamespace": "Invalid title with unknown namespace number $1 and text \"$2\"",
        "exception-nologin": "Not logged in",
        "virus-scanfailed": "scan failed (code $1)",
        "virus-unknownscanner": "unknown antivirus:",
        "logouttext": "<strong>You are now logged out.</strong>\n\nNote that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
 +      "cannotlogoutnow-title": "Cannot log out now",
 +      "cannotlogoutnow-text": "Logging out is not possible when using $1.",
        "welcomeuser": "Welcome, $1!",
        "welcomecreation-msg": "Your account has been created.\nYou can change your {{SITENAME}} [[Special:Preferences|preferences]] if you wish.",
        "yourname": "Username:",
        "yourpasswordagain": "Retype password:",
        "createacct-yourpasswordagain": "Confirm password",
        "createacct-yourpasswordagain-ph": "Enter password again",
 -      "remembermypassword": "Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "userlogin-remembermypassword": "Keep me logged in",
        "userlogin-signwithsecure": "Use secure connection",
 +      "cannotlogin-title": "Cannot log in",
 +      "cannotlogin-text": "Logging in is not possible.",
 +      "cannotloginnow-title": "Cannot log in now",
 +      "cannotloginnow-text": "Logging in is not possible when using $1.",
 +      "cannotcreateaccount-title": "Cannot create accounts",
 +      "cannotcreateaccount-text": "Direct account creation is not enabled on this wiki.",
        "yourdomainname": "Your domain:",
        "password-change-forbidden": "You cannot change passwords on this wiki.",
        "externaldberror": "There was either an authentication database error or you are not allowed to update your external account.",
        "login": "Log in",
 +      "login-security": "Verify your identity",
        "nav-login-createaccount": "Log in / create account",
        "loginprompt": "",
        "userlogin": "Log in / create account",
        "helplogin-url": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Logging_in",
        "userlogin-helplink2": "Help with logging in",
        "userlogin-loggedin": "You are already logged in as {{GENDER:$1|$1}}.\nUse the form below to log in as another user.",
 +      "userlogin-reauth": "You must log in again to verify that you are {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Create another account",
        "createacct-emailrequired": "Email address",
        "createacct-emailoptional": "Email address (optional)",
        "createacct-email-ph": "Enter your email address",
        "createacct-another-email-ph": "Enter email address",
        "createaccountmail": "Use a temporary random password and send it to the specified email address",
 +      "createaccountmail-help": "Can be used to create account for another person without learning the password.",
        "createacct-realname": "Real name (optional)",
        "createaccountreason": "Reason:",
        "createacct-reason": "Reason",
        "createacct-reason-ph": "Why you are creating another account",
 +      "createacct-reason-help": "Message shown in the account creation log",
        "createacct-imgcaptcha-help": "",
        "createacct-submit": "Create your account",
        "createacct-another-submit": "Create account",
 +      "createacct-continue-submit": "Continue account creation",
 +      "createacct-another-continue-submit": "Continue account creation",
        "createacct-benefit-heading": "{{SITENAME}} is made by people like you.",
        "createacct-benefit-icon1": "icon-edits",
        "createacct-benefit-head1": "{{NUMBEROFEDITS}}",
        "nocookieslogin": "{{SITENAME}} uses cookies to log in users.\nYou have cookies disabled.\nPlease enable them and try again.",
        "nocookiesfornew": "The user account was not created, as we could not confirm its source.\nEnsure you have cookies enabled, reload this page and try again.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
 +      "createacct-loginerror": "The account was successfully created but you could not be logged in automatically. Please proceed to [[Special:UserLogin|manual login]].",
        "noname": "You have not specified a valid username.",
 -      "loginsuccesstitle": "Login successful",
 +      "loginsuccesstitle": "Logged in",
        "loginsuccess": "<strong>You are now logged in to {{SITENAME}} as \"$1\".</strong>",
 -      "nosuchuser": "There is no user by the name \"$1\".\nUsernames are case sensitive.\nCheck your spelling, or [[Special:UserLogin/signup|create a new account]].",
 +      "nosuchuser": "There is no user by the name \"$1\".\nUsernames are case sensitive.\nCheck your spelling, or [[Special:CreateAccount|create a new account]].",
        "nosuchusershort": "There is no user by the name \"$1\".\nCheck your spelling.",
        "nouserspecified": "You have to specify a username.",
        "login-userblocked": "This user is blocked. Login not allowed.",
        "noemail": "There is no email address recorded for user \"$1\".",
        "noemailcreate": "You need to provide a valid email address.",
        "passwordsent": "A new password has been sent to the email address registered for \"$1\".\nPlease log in again after you receive it.",
 -      "blocked-mailpassword": "Your IP address is blocked from editing, and so is not allowed to use the password recovery function to prevent abuse.",
 +      "blocked-mailpassword": "Your IP address is blocked from editing. To prevent abuse, it is not allowed to use password recovery from this IP address.",
        "eauthentsent": "A confirmation email has been sent to the specified email address.\nBefore any other email is sent to the account, you will have to follow the instructions in the email, to confirm that the account is actually yours.",
        "throttled-mailpassword": "A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.\nTo prevent abuse, only one password reset email will be sent per {{PLURAL:$1|hour|$1 hours}}.",
        "signupstart": "",
        "signupend": "",
        "signupend-https": "",
        "mailerror": "Error sending mail: $1",
 -      "acct_creation_throttle_hit": "Visitors to this wiki using your IP address have created {{PLURAL:$1|1 account|$1 accounts}} in the last day, which is the maximum allowed in this time period.\nAs a result, visitors using this IP address cannot create any more accounts at the moment.",
 +      "acct_creation_throttle_hit": "Visitors to this wiki using your IP address have created {{PLURAL:$1|1 account|$1 accounts}} in the last $2, which is the maximum allowed in this time period.\nAs a result, visitors using this IP address cannot create any more accounts at the moment.",
        "emailauthenticated": "Your email address was confirmed on $2 at $3.",
        "emailnotauthenticated": "Your email address is not yet confirmed.\nNo email will be sent for any of the following features.",
        "noemailprefs": "Specify an email address in your preferences for these features to work.",
        "createaccount-title": "Account creation for {{SITENAME}}",
        "createaccount-text": "Someone created an account for your email address on {{SITENAME}} ($4) named \"$2\", with password \"$3\".\nYou should log in and change your password now.\n\nYou may ignore this message, if this account was created in error.",
        "login-throttled": "You have made too many recent login attempts.\nPlease wait $1 before trying again.",
 -      "login-abort-generic": "Your login was unsuccessful - Aborted",
 +      "login-abort-generic": "Your login failed - Aborted",
        "login-migrated-generic": "Your account has been migrated, and your username no longer exist on this wiki.",
        "loginlanguagelabel": "Language: $1",
        "loginlanguagelinks": "* {{#language:de}}|de\n* {{#language:en}}|en\n* {{#language:eo}}|eo\n* {{#language:fr}}|fr\n* {{#language:es}}|es\n* {{#language:it}}|it\n* {{#language:nl}}|nl",
        "createacct-another-realname-tip": "Real name is optional.\nIf you choose to provide it, this will be used for giving the user attribution for their work.",
        "pt-login": "Log in",
        "pt-login-button": "Log in",
 +      "pt-login-continue-button": "Continue login",
        "pt-createaccount": "Create account",
        "pt-userlogout": "Log out",
        "pear-mail-error": "$1",
        "newpassword": "New password:",
        "retypenew": "Retype new password:",
        "resetpass_submit": "Set password and log in",
 -      "changepassword-success": "Your password has been changed successfully!",
 +      "changepassword-success": "Your password has been changed!",
        "changepassword-throttled": "You have made too many recent login attempts.\nPlease wait $1 before trying again.",
 +      "botpasswords": "Bot passwords",
 +      "botpasswords-summary": "<em>Bot passwords</em> allow access to a user account via the API without using the account's main login credentials. The user rights available when logged in with a bot password may be restricted.\n\nIf you don't know why you might want to do this, you should probably not do it. No one should ever ask you to generate one of these and give it to them.",
 +      "botpasswords-disabled": "Bot passwords are disabled.",
 +      "botpasswords-no-central-id": "To use bot passwords, you must be logged in to a centralized account.",
 +      "botpasswords-existing": "Existing bot passwords",
 +      "botpasswords-createnew": "Create a new bot password",
 +      "botpasswords-editexisting": "Edit an existing bot password",
 +      "botpasswords-label-appid": "Bot name:",
 +      "botpasswords-label-create": "Create",
 +      "botpasswords-label-update": "Update",
 +      "botpasswords-label-cancel": "Cancel",
 +      "botpasswords-label-delete": "Delete",
 +      "botpasswords-label-resetpassword": "Reset the password",
 +      "botpasswords-label-grants": "Applicable grants:",
 +      "botpasswords-help-grants": "Each grant gives access to listed user rights that a user account already has. See the [[Special:ListGrants|table of grants]] for more information.",
 +      "botpasswords-label-grants-column": "Granted",
 +      "botpasswords-bad-appid": "The bot name \"$1\" is not valid.",
 +      "botpasswords-insert-failed": "Failed to add bot name \"$1\". Was it already added?",
 +      "botpasswords-update-failed": "Failed to update bot name \"$1\". Was it deleted?",
 +      "botpasswords-created-title": "Bot password created",
 +      "botpasswords-created-body": "The bot password for bot name \"$1\" of user \"$2\" was created.",
 +      "botpasswords-updated-title": "Bot password updated",
 +      "botpasswords-updated-body": "The bot password for bot name \"$1\" of user \"$2\" was updated.",
 +      "botpasswords-deleted-title": "Bot password deleted",
 +      "botpasswords-deleted-body": "The bot password for bot name \"$1\" of user \"$2\" was deleted.",
 +      "botpasswords-newpassword": "The new password to log in with <strong>$1</strong> is <strong>$2</strong>. <em>Please record this for future reference.</em> <br> (For old bots which require the login name to be the same as the eventual username, you can also use <strong>$3</strong> as username and <strong>$4</strong> as password.)",
 +      "botpasswords-no-provider": "BotPasswordsSessionProvider is not available.",
 +      "botpasswords-restriction-failed": "Bot password restrictions prevent this login.",
 +      "botpasswords-invalid-name": "The username specified does not contain the bot password separator (\"$1\").",
 +      "botpasswords-not-exist": "User \"$1\" does not have a bot password named \"$2\".",
        "resetpass_forbidden": "Passwords cannot be changed",
 +      "resetpass_forbidden-reason": "Passwords cannot be changed: $1",
        "resetpass-no-info": "You must be logged in to access this page directly.",
        "resetpass-submit-loggedin": "Change password",
        "resetpass-submit-cancel": "Cancel",
 -      "resetpass-wrong-oldpass": "Invalid temporary or current password.\nYou may have already successfully changed your password or requested a new temporary password.",
 +      "resetpass-wrong-oldpass": "Invalid temporary or current password.\nYou may have already 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.\nTo 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 log in.",
 -      "resetpass-expired-soft": "Your password has expired and needs to be reset. Please choose a new password now, or click \"{{int:resetpass-submit-cancel}}\" to reset it later.",
 -      "resetpass-validity-soft": "Your password is not valid: $1\n\nPlease choose a new password now, or click \"{{int:resetpass-submit-cancel}}\" to reset it later.",
 +      "resetpass-expired-soft": "Your password has expired and needs to be reset. Please choose a new password now, or click \"{{int:authprovider-resetpass-skip-label}}\" to reset it later.",
 +      "resetpass-validity-soft": "Your password is not valid: $1\n\nPlease choose a new password now, or click \"{{int:authprovider-resetpass-skip-label}}\" to reset it later.",
        "passwordreset": "Reset password",
        "passwordreset-text-one": "Complete this form to receive a temporary password via email.",
        "passwordreset-text-many": "{{PLURAL:$1|Fill in one of the fields to receive a temporary password via email.}}",
        "passwordreset-emailtext-ip": "Someone (probably you, from IP address $1) requested a reset of your\npassword for {{SITENAME}} ($4). The following user {{PLURAL:$3|account is|accounts are}}\nassociated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
        "passwordreset-emailtext-user": "User $1 on {{SITENAME}} requested a reset of your password for {{SITENAME}}\n($4). The following user {{PLURAL:$3|account is|accounts are}} associated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
        "passwordreset-emailelement": "Username:\n$1\n\nTemporary password:\n$2",
 -      "passwordreset-emailsent": "If this is a registered email address for your account, then a password reset email will be sent.",
 -      "passwordreset-emailsent-capture": "A password reset email has been sent, which is shown below.",
 -      "passwordreset-emailerror-capture": "A password reset email was generated, which is shown below, but sending it to the {{GENDER:$2|user}} failed: $1",
 +      "passwordreset-emailsentemail": "If this email address is associated with your account, then a password reset email will be sent.",
 +      "passwordreset-emailsentusername": "If there is an email address associated with this username, then a password reset email will be sent.",
 +      "passwordreset-emailsent-capture2": "The password reset {{PLURAL:$1|email has|emails have}} been sent. The {{PLURAL:$1|username and password|list of usernames and passwords}} is shown here.",
 +      "passwordreset-emailerror-capture2": "Emailing the {{GENDER:$2|user}} failed: $1 The {{PLURAL:$3|username and password|list of usernames and passwords}} is shown here.",
 +      "passwordreset-nocaller": "A caller must be provided",
 +      "passwordreset-nosuchcaller": "Caller does not exist: $1",
 +      "passwordreset-ignored": "The password reset was not handled. Maybe no provider was configured?",
 +      "passwordreset-invalideamil": "Invalid email address",
 +      "passwordreset-nodata": "Neither a username nor an email address was supplied",
        "changeemail": "Change or remove email address",
        "changeemail-summary": "",
        "changeemail-header": "Complete this form to change your email address. If you would like to remove the association of any email address from your account, leave the new email address blank when submitting the form.",
 -      "changeemail-passwordrequired": "You will need to enter your password to confirm this change.",
        "changeemail-no-info": "You must be logged in to access this page directly.",
        "changeemail-oldemail": "Current email address:",
        "changeemail-newemail": "New email address:",
        "image_tip": "Embedded file",
        "media_sample": "Example.ogg",
        "media_tip": "File link",
 +      "sig-text": "--$1",
        "sig_tip": "Your signature with timestamp",
        "hr_tip": "Horizontal line (use sparingly)",
        "summary": "Summary:",
        "minoredit": "This is a minor edit",
        "watchthis": "Watch this page",
        "savearticle": "Save page",
 +      "savechanges": "Save changes",
 +      "publishpage": "Publish page",
 +      "publishchanges": "Publish changes",
        "preview": "Preview",
        "showpreview": "Show preview",
        "showdiff": "Show changes",
        "subject-preview": "Subject preview:",
        "previewerrortext": "An error occurred while attempting to preview your changes.",
        "blockedtitle": "User is blocked",
 -      "blockedtext": "<strong>Your username or IP address has been blocked.</strong>\n\nThe block was made by $1.\nThe reason given is <em>$2</em>.\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.\nYou cannot use the \"email this user\" feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
 -      "autoblockedtext": "Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.\nThe reason given is:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou may contact $1 or one of the other [[{{MediaWiki:Grouppage-sysop}}|administrators]] to discuss the block.\n\nNote that you may not use the \"email this user\" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.\n\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
 +      "blockedtext": "<strong>Your username or IP address has been blocked.</strong>\n\nThe block was made by $1.\nThe reason given is <em>$2</em>.\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nYou can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.\nYou cannot use the \"email this user\" feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
 +      "autoblockedtext": "Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.\nThe reason given is:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nYou may contact $1 or one of the other [[{{MediaWiki:Grouppage-sysop}}|administrators]] to discuss the block.\n\nNote that you may not use the \"email this user\" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.\n\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
        "blockednoreason": "no reason given",
        "whitelistedittext": "Please $1 to edit pages.",
        "confirmedittext": "You must confirm your email address before editing pages.\nPlease set and validate your email address through your [[Special:Preferences|user preferences]].",
        "newarticletext": "You have followed a link to a page that does not exist yet.\nTo create the page, start typing in the box below (see the [$1 help page] for more info).\nIf you are here by mistake, click your browser's <strong>back</strong> button.",
        "newarticletextanon": "{{int:newarticletext|$1}}",
        "talkpagetext": "<!-- MediaWiki:talkpagetext -->",
 -      "anontalkpagetext": "----\n<em>This is the discussion page for an anonymous user who has not created an account yet, or who does not use it.</em>\nWe therefore have to use the numerical IP address to identify him/her.\nSuch an IP address can be shared by several users.\nIf 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.",
 -      "noarticletext": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.",
 +      "anontalkpagetext": "----\n<em>This is the discussion page for an anonymous user who has not created an account yet, or who does not use it.</em>\nWe therefore have to use the numerical IP address to identify him/her.\nSuch an IP address can be shared by several users.\nIf you are an anonymous user and feel that irrelevant comments have been directed at you, please [[Special:CreateAccount|create an account]] or [[Special:UserLogin|log in]] to avoid future confusion with other anonymous users.",
 +      "noarticletext": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} create this page]</span>.",
        "noarticletext-nopermission": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages, or <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>, but you do not have permission to create this page.",
        "noarticletextanon": "{{int:noarticletext}}",
        "missing-revision": "The revision #$1 of the page named \"{{FULLPAGENAME}}\" does not exist.\n\nThis is usually caused by following an outdated history link to a page that has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
        "userpage-userdoesnotexist": "User account \"$1\" is not registered.\nPlease check if you want to create/edit this page.",
        "userpage-userdoesnotexist-view": "User account \"$1\" is not registered.",
        "blocked-notice-logextract": "This user is currently blocked.\nThe latest block log entry is provided below for reference:",
 -      "clearyourcache": "<strong>Note:</strong> After saving, you may have to bypass your browser's cache to see the changes.\n* <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)\n* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)\n* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Clear the cache in <em>Tools → Preferences</em>",
 +      "clearyourcache": "<strong>Note:</strong> After saving, you may have to bypass your browser's cache to see the changes.\n* <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)\n* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)\n* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Go to <em>Menu → Settings</em> (<em>Opera → Preferences</em> on a Mac) and then to <em>Privacy & security → Clear browsing data → Cached images and files</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.\nIt has not yet been saved!</strong>",
        "previewnote": "<strong>Remember that this is only a preview.</strong>\nYour 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": "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>\nPlease try again.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
 -      "session_fail_preview_html": "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>\n\n<em>Because {{SITENAME}} has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate edit attempt, please try again.</strong>\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
 +      "session_fail_preview": "Sorry! We could not process your edit due to a loss of session data.\n\nYou might have been logged out. <strong>Please verify that you're still logged in and try again</strong>.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in, and check that your browser allows cookies from this site.",
 +      "session_fail_preview_html": "Sorry! We could not process your edit due to a loss of session data.\n\n<em>Because {{SITENAME}} has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate edit attempt, please try again.</strong>\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in, and check that your browser allows cookies from this site.",
        "token_suffix_mismatch": "<strong>Your edit has been rejected because your client mangled the punctuation characters in the edit token.</strong>\nThe edit has been rejected to prevent corruption of the page text.\nThis sometimes happens when you are using a buggy web-based anonymous proxy service.",
        "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",
        "editpage-cannot-use-custom-model": "The content model of this page cannot be changed.",
        "longpage-hint": "-",
        "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>\nIt cannot be saved.",
 -      "readonlywarning": "<strong>Warning: The database has been locked for maintenance, so you will not be able to save your edits right now.</strong>\nYou may wish to copy and paste your text into a text file and save it for later.\n\nThe administrator who locked it offered this explanation: $1",
 +      "readonlywarning": "<strong>Warning: The database has been locked for maintenance, so you will not be able to save your edits right now.</strong>\nYou may wish to copy and paste your text into a text file and save it for later.\n\nThe system administrator who locked it offered this explanation: $1",
        "protectedpagewarning": "<strong>Warning: This page has been protected so that only users with administrator privileges can edit it.</strong>\nThe latest log entry is provided below for reference:",
        "semiprotectedpagewarning": "<strong>Note:</strong> This page has been protected so that only registered users can edit it.\nThe latest log entry is provided below for reference:",
        "cascadeprotectedwarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can edit it because it is transcluded in the following cascade-protected {{PLURAL:$1|page|pages}}:",
        "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}}:",
 -      "contentmodelediterror": "You cannot edit this revision because its content model is <code>$1</code>, and the current content model of the page is <code>$2</code>.",
 +      "contentmodelediterror": "You cannot edit this revision because its content model is <code>$1</code>, which differs from the current content model of the page <code>$2</code>.",
        "recreate-moveddeleted-warn": "<strong>Warning: You are recreating a page that was previously deleted.</strong>\n\nYou should consider whether it is appropriate to continue editing this page.\nThe deletion and move log for this page are provided here for convenience:",
        "moveddeleted-notice": "This page has been deleted.\nThe deletion and move log for the page are provided below for reference.",
        "moveddeleted-notice-recent": "Sorry, this page was recently deleted (within the last 24 hours).\nThe deletion and move log for the page are provided below for reference.",
        "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.\nIf you are logged in, you can disable this warning in the \"{{int:prefs-editing}}\" section of your preferences.",
 +      "editpage-invalidcontentmodel-title": "Content model not supported",
 +      "editpage-invalidcontentmodel-text": "The content model \"$1\" is not supported.",
        "editpage-notsupportedcontentformat-title": "Content format not supported",
        "editpage-notsupportedcontentformat-text": "The content format $1 is not supported by the content model $2.",
        "content-model-wikitext": "wikitext",
        "content-model-json": "JSON",
        "content-json-empty-object": "Empty object",
        "content-json-empty-array": "Empty array",
 +      "deprecated-self-close-category": "Pages using invalid self-closed HTML tags",
 +      "deprecated-self-close-category-desc": "The page contains invalid self-closed HTML tags, such as <code>&lt;b/></code> or <code>&lt;span/></code>.  The behavior of these will change soon to be consistent with the HTML5 specification, so their use in wikitext is deprecated.",
        "duplicate-args-warning": "<strong>Warning:</strong> [[:$1]] is calling [[:$2]] with more than one value for the \"$3\" parameter. Only the last value provided will be used.",
        "duplicate-args-category": "Pages using duplicate arguments in template calls",
        "duplicate-args-category-desc": "The page contains template calls that use duplicates of arguments, such as <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "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",
 -      "cantcreateaccounttitle": "Cannot create account",
        "cantcreateaccount-text": "Account creation from this IP address (<strong>$1</strong>) has been blocked by [[User:$3|$3]].\n\nThe reason given by $3 is <em>$2</em>",
 -      "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]].\n\nThe reason given by $3 is ''$2''",
 +      "cantcreateaccount-range-text": "Account creation from IP addresses in the range <strong>$1</strong>, which includes your IP address (<strong>$4</strong>), has been blocked by [[User:$3|$3]].\n\nThe reason given by $3 is <em>$2</em>",
        "createaccount-hook-aborted": "$1",
        "viewpagelogs": "View logs for this page",
        "nohistory": "There is no edit history for this page.",
        "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-success": "Revision visibility updated.",
        "revdelete-failure": "Revision visibility could not be updated:\n$1",
 -      "logdelete-success": "Log visibility successfully set.",
 +      "logdelete-success": "Log visibility set.",
        "logdelete-failure": "Log visibility could not be set:\n$1",
        "revdel-restore": "change visibility",
        "pagehist": "Page history",
        "mergehistory-empty": "No revisions can be merged.",
        "mergehistory-done": "$3 {{PLURAL:$3|revision|revisions}} of $1 {{PLURAL:$3|was|were}} merged into [[:$2]].",
        "mergehistory-fail": "Unable to perform history merge, please recheck the page and time parameters.",
 -      "mergehistory-fail-toobig" : "Unable to perform history merge as more than the limit of $1 {{PLURAL:$1|revision|revisions}} would be moved.",
 +      "mergehistory-fail-bad-timestamp": "Timestamp is invalid.",
 +      "mergehistory-fail-invalid-source": "Source page is invalid.",
 +      "mergehistory-fail-invalid-dest": "Destination page is invalid.",
 +      "mergehistory-fail-no-change": "History merge did not merge any revisions. Please recheck the page and time parameters.",
 +      "mergehistory-fail-permission": "Insufficient permissions to merge history.",
 +      "mergehistory-fail-self-merge": "Source and destination pages are the same.",
 +      "mergehistory-fail-timestamps-overlap": "Source revisions overlap or come after destination revisions.",
 +      "mergehistory-fail-toobig": "Unable to perform history merge as more than the limit of $1 {{PLURAL:$1|revision|revisions}} would be moved.",
 +      "mergehistory-warning-redirect-not-created": "",
        "mergehistory-no-source": "Source page $1 does not exist.",
        "mergehistory-no-destination": "Destination page $1 does not exist.",
        "mergehistory-invalid-source": "Source page must be a valid title.",
        "mergehistory-same-destination": "Source and destination pages cannot be the same",
        "mergehistory-reason": "Reason:",
        "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
 +      "mergehistory-redirect-text": "",
        "mergelog": "Merge log",
        "pagemerge-logentry": "merged [[$1]] into [[$2]] (revisions up to $3)",
        "revertmerge": "Unmerge",
        "searchprofile-advanced-tooltip": "Search in custom namespaces",
        "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 words}})",
        "search-result-category-size": "{{PLURAL:$1|1 member|$1 members}} ({{PLURAL:$2|1 subcategory|$2 subcategories}}, {{PLURAL:$3|1 file|$3 files}})",
 -      "search-redirect": "(redirect $1)",
 +      "search-redirect": "(redirect from $1)",
        "search-section": "(section $1)",
        "search-category": "(category $1)",
        "search-file-match": "(matches file content)",
        "prefs-help-prefershttps": "This preference will take effect on your next login.",
        "prefswarning-warning": "You've made changes to your preferences that have not been saved yet.\nIf you leave this page without clicking \"$1\" your preferences will not be updated.",
        "prefs-tabs-navigation-hint": "Tip: You can use the left and right arrow keys to navigate between the tabs in the tabs list.",
 -      "email-address-validity-valid": "Email address appears valid",
 -      "email-address-validity-invalid": "Enter a valid email address",
        "userrights": "User rights management",
        "userrights-summary": "",
        "userrights-lookup-user": "Manage user groups",
        "userrights-user-editname": "Enter a username:",
 -      "editusergroup": "Edit user groups",
 +      "editusergroup": "Edit {{GENDER:$1|user}} groups",
        "editinguser": "Changing user rights of {{GENDER:$1|user}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Edit user groups",
 -      "saveusergroups": "Save user groups",
 +      "saveusergroups": "Save {{GENDER:$1|user}} groups",
        "userrights-groupsmember": "Member of:",
        "userrights-groupsmember-auto": "Implicit member of:",
        "userrights-groupsmember-type": "$1",
        "userrights-unchangeable-col": "Groups you cannot change",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Conflict of user rights changes! Please review and confirm your changes.",
 -      "userrights-removed-self": "You successfully removed your own rights. As such, you are no longer able to access this page.",
 +      "userrights-removed-self": "You removed your own rights. As such, you are no longer able to access this page.",
        "group": "Group:",
        "group-user": "Users",
        "group-autoconfirmed": "Autoconfirmed users",
        "right-createpage": "Create pages (which are not discussion pages)",
        "right-createtalk": "Create discussion pages",
        "right-createaccount": "Create new user accounts",
 +      "right-autocreateaccount": "Automatically log in with an external user account",
        "right-minoredit": "Mark edits as minor",
        "right-move": "Move pages",
        "right-move-subpages": "Move pages with their subpages",
        "right-blockemail": "Block a user from sending email",
        "right-hideuser": "Block a username, hiding it from the public",
        "right-ipblock-exempt": "Bypass IP blocks, auto-blocks and range blocks",
 -      "right-proxyunbannable": "Bypass automatic blocks of proxies",
        "right-unblockself": "Unblock oneself",
        "right-protect": "Change protection levels and edit cascade-protected pages",
        "right-editprotected": "Edit pages protected as \"{{int:protect-level-sysop}}\"",
        "right-override-export-depth": "Export pages including linked pages up to a depth of 5",
        "right-sendemail": "Send email to other users",
        "right-passwordreset": "View password reset emails",
 -      "right-managechangetags": "Create and delete [[Special:Tags|tags]] from the database",
 +      "right-managechangetags": "Create and (de)activate [[Special:Tags|tags]]",
        "right-applychangetags": "Apply [[Special:Tags|tags]] along with one's changes",
        "right-changetags": "Add and remove arbitrary [[Special:Tags|tags]] on individual revisions and log entries",
 +      "right-deletechangetags": "Delete [[Special:Tags|tags]] from the database",
 +      "grant-generic": "\"$1\" rights bundle",
 +      "grant-group-page-interaction": "Interact with pages",
 +      "grant-group-file-interaction": "Interact with media",
 +      "grant-group-watchlist-interaction": "Interact with your watchlist",
 +      "grant-group-email": "Send email",
 +      "grant-group-high-volume": "Perform high volume activity",
 +      "grant-group-customization": "Customization and preferences",
 +      "grant-group-administration": "Perform administrative actions",
 +      "grant-group-private-information": "Access private data about you",
 +      "grant-group-other": "Miscellaneous activity",
 +      "grant-blockusers": "Block and unblock users",
 +      "grant-createaccount": "Create accounts",
 +      "grant-createeditmovepage": "Create, edit, and move pages",
 +      "grant-delete": "Delete pages, revisions, and log entries",
 +      "grant-editinterface": "Edit the MediaWiki namespace and user CSS/JavaScript",
 +      "grant-editmycssjs": "Edit your user CSS/JavaScript",
 +      "grant-editmyoptions": "Edit your user preferences",
 +      "grant-editmywatchlist": "Edit your watchlist",
 +      "grant-editpage": "Edit existing pages",
 +      "grant-editprotected": "Edit protected pages",
 +      "grant-highvolume": "High-volume editing",
 +      "grant-oversight": "Hide users and suppress revisions",
 +      "grant-patrol": "Patrol changes to pages",
 +      "grant-privateinfo": "Access private information",
 +      "grant-protect": "Protect and unprotect pages",
 +      "grant-rollback": "Rollback changes to pages",
 +      "grant-sendemail": "Send email to other users",
 +      "grant-uploadeditmovefile": "Upload, replace, and move files",
 +      "grant-uploadfile": "Upload new files",
 +      "grant-basic": "Basic rights",
 +      "grant-viewdeleted": "View deleted files and pages",
 +      "grant-viewmywatchlist": "View your watchlist",
 +      "grant-viewrestrictedlogs": "View restricted log entries",
        "newuserlogpage": "User creation log",
        "newuserlogpagetext": "This is a log of user creations.",
        "rightslog": "User rights log",
        "rightslogtext": "This is a log of changes to user rights.",
        "action-read": "read this page",
        "action-edit": "edit this page",
 -      "action-createpage": "create pages",
 -      "action-createtalk": "create discussion pages",
 +      "action-createpage": "create this page",
 +      "action-createtalk": "create this discussion page",
        "action-createaccount": "create this user account",
 +      "action-autocreateaccount": "automatically create this external user account",
        "action-history": "view the history of this page",
        "action-minoredit": "mark this edit as minor",
        "action-move": "move this page",
        "action-viewmyprivateinfo": "view your private information",
        "action-editmyprivateinfo": "edit your private information",
        "action-editcontentmodel": "edit the content model of a page",
 -      "action-managechangetags": "create and delete tags from the database",
 +      "action-managechangetags": "create and (de)activate tags",
        "action-applychangetags": "apply tags along with your changes",
        "action-changetags": "add and remove arbitrary tags on individual revisions and log entries",
 +      "action-deletechangetags": "delete tags from the database",
 +      "action-purge": "purge this page",
        "nchanges": "$1 {{PLURAL:$1|change|changes}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|since last visit}}",
        "enhancedrc-history": "history",
        "recentchanges-label-bot": "This edit was performed by a bot",
        "recentchanges-label-unpatrolled": "This edit has not yet been patrolled",
        "recentchanges-label-plusminus": "The page size changed by this number of bytes",
 -      "recentchanges-legend-heading": "'''Legend:'''",
 +      "recentchanges-legend-heading": "<strong>Legend:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (also see [[Special:NewPages|list of new pages]])",
        "recentchanges-legend-minor": "{{int:recentchanges-label-minor}}",
        "recentchanges-legend-bot": "{{int:recentchanges-label-bot}}",
        "recentchanges-legend-unpatrolled": "{{int:recentchanges-label-unpatrolled}}",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
 +      "recentchanges-submit": "Show",
        "rcnotefrom": "Below {{PLURAL:$5|is the change|are the changes}} since <strong>$3, $4</strong> (up to <strong>$1</strong> shown).",
        "rclistfrom": "Show new changes starting from $2, $3",
        "rcshowhideminor": "$1 minor edits",
        "recentchangeslinked-page": "Page name:",
        "recentchangeslinked-to": "Show changes to pages linked to the given page instead",
        "recentchanges-page-added-to-category": "[[:$1]] added to category",
 -      "recentchanges-page-added-to-category-bundled": "[[:$1]] and {{PLURAL:$2|one page|$2 pages}} added to category",
 +      "recentchanges-page-added-to-category-bundled": "[[:$1]] added to category, [[Special:WhatLinksHere/$1|this page is included within other pages]]",
        "recentchanges-page-removed-from-category": "[[:$1]] removed from category",
 -      "recentchanges-page-removed-from-category-bundled": "[[:$1]] and {{PLURAL:$2|one page|$2 pages}} removed from category",
 +      "recentchanges-page-removed-from-category-bundled": "[[:$1]] removed from category, [[Special:WhatLinksHere/$1|this page is included within other pages]]",
        "autochange-username": "MediaWiki automatic change",
        "upload": "Upload file",
        "uploadbtn": "Upload file",
        "file-thumbnail-no": "The filename begins with <strong>$1</strong>.\nIt seems to be an image of reduced size <em>(thumbnail)</em>.\nIf 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.\nIf you still want to upload your file, please go back and use a new name.\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "A file with this name exists already in the shared file repository.\nIf you still want to upload your file, please go back and use a new name.\n[[File:$1|thumb|center|$1]]",
 +      "fileexists-no-change": "The upload is an exact duplicate of the current version of <strong>[[:$1]]</strong>.",
 +      "fileexists-duplicate-version": "The upload is an exact duplicate of {{PLURAL:$2|an older version|older versions}} of <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "This file is a duplicate of the following {{PLURAL:$1|file|files}}:",
        "file-deleted-duplicate": "A file identical to this file ([[:$1]]) has previously been deleted.\nYou should check that file's deletion history before proceeding to re-upload it.",
        "file-deleted-duplicate-notitle": "A file identical to this file has previously been deleted, and the title has been suppressed.\nYou should ask someone with the ability to view suppressed file data to review the situation before proceeding to re-upload it.",
        "uploaded-script-svg": "Found scriptable element \"$1\" in the uploaded SVG file.",
        "uploaded-hostile-svg": "Found unsafe CSS in the style element of uploaded SVG file.",
        "uploaded-event-handler-on-svg": "Setting event-handler attributes <code>$1=\"$2\"</code> is not allowed in SVG files.",
 -      "uploaded-href-attribute-svg": "href attributes <code>&lt;$1 $2=\"$3\"&gt;</code> with non-local target (e.g. http://, javascript:, etc) are not allowed in SVG files.",
 -      "uploaded-href-unsafe-target-svg": "Found href to unsafe target <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
 +      "uploaded-href-attribute-svg": "href attributes in SVG files are only allowed to link to http:// or https:// targets, found <code>&lt;$1 $2=\"$3\"&gt;</code>.",
 +      "uploaded-href-unsafe-target-svg": "Found href to unsafe data: URI target <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
        "uploaded-animate-svg": "Found \"animate\" tag that might be changing href, using the \"from\" attribute <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
        "uploaded-setting-event-handler-svg": "Setting event-handler attributes is blocked, found <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
        "uploaded-setting-href-svg": "Using the \"set\" tag to add \"href\" attribute to parent element is blocked.",
        "filename-thumb-name": "This looks like a thumbnail title. Please do not upload thumbnails back to the same wiki. Otherwise, please fix the filename so it is more meaningful, and does not have the thumbnail prefix.",
        "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.\nPlease choose a more descriptive name for your file.",
        "filename-prefix-blacklist": " #<!-- leave this line exactly as it is --> <pre>\n# Syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment\n#   * Every non-blank line is a prefix for typical filenames assigned automatically by digital cameras\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # some mobile phones\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- leave this line exactly as it is -->",
 -      "upload-success-subj": "Successful upload",
 -      "upload-success-msg": "Your upload from [$2] was successful. It is available here: [[:{{ns:file}}:$1]]",
 -      "upload-failure-subj": "Upload problem",
 -      "upload-failure-msg": "There was a problem with your upload from [$2]:\n\n$1",
 -      "upload-warning-subj": "Upload warning",
 -      "upload-warning-msg": "There was a problem with your upload from [$2]. You may return to the [[Special:Upload/stash/$1|upload form]] to correct this problem.",
        "upload-proto-error": "Incorrect protocol",
        "upload-proto-error-text": "Remote upload requires URLs beginning with <code>http://</code> or <code>ftp://</code>.",
        "upload-file-error": "Internal error",
        "upload-too-many-redirects": "The URL contained too many redirects",
        "upload-http-error": "An HTTP error occurred: $1",
        "upload-copy-upload-invalid-domain": "Copy uploads are not available from this domain.",
 +      "upload-foreign-cant-upload": "This wiki is not configured to upload files to the requested foreign file repository.",
 +      "upload-foreign-cant-load-config": "Failed to load the configuration for file uploads to the foreign file repository.",
 +      "upload-dialog-disabled": "File uploads using this dialog are disabled on this wiki.",
        "upload-dialog-title": "Upload file",
        "upload-dialog-button-cancel": "Cancel",
 +      "upload-dialog-button-back": "Back",
        "upload-dialog-button-done": "Done",
        "upload-dialog-button-save": "Save",
        "upload-dialog-button-upload": "Upload",
 -      "upload-form-label-select-file": "Select file",
        "upload-form-label-infoform-title": "Details",
        "upload-form-label-infoform-name": "Name",
 +      "upload-form-label-infoform-name-tooltip": "A unique descriptive title for the file, which will serve as a filename. You may use plain language with spaces. Do not include the file extension.",
        "upload-form-label-infoform-description": "Description",
 +      "upload-form-label-infoform-description-tooltip": "Briefly describe everything notable about the work.\nFor a photo, mention the main things that are depicted, the occasion, or the place.",
        "upload-form-label-usage-title": "Usage",
        "upload-form-label-usage-filename": "File name",
 -      "foreign-structured-upload-form-label-own-work": "This is my own work",
 -      "foreign-structured-upload-form-label-infoform-categories": "Categories",
 -      "foreign-structured-upload-form-label-infoform-date": "Date",
 -      "foreign-structured-upload-form-label-own-work-message-local": "I confirm that I am uploading this file following the terms of service and licensing policies on {{SITENAME}}.",
 -      "foreign-structured-upload-form-label-not-own-work-message-local": "If you are not able to upload this file under the policies of {{SITENAME}}, please close this dialog and try another method.",
 -      "foreign-structured-upload-form-label-not-own-work-local-local": "You may also want to try [[Special:Upload|the default upload page]].",
 -      "foreign-structured-upload-form-label-own-work-message-default": "I understand that I am uploading this file to a shared repository. I confirm that I am doing so following the terms of service and licensing policies there.",
 -      "foreign-structured-upload-form-label-not-own-work-message-default": "If you are not able to upload this file under the policies of the shared repository, please close this dialog and try another method.",
 -      "foreign-structured-upload-form-label-not-own-work-local-default": "You may also want to try using [[Special:Upload|the upload page on {{SITENAME}}]], if this file can be uploaded there under their policies.",
 -      "foreign-structured-upload-form-label-own-work-message-shared": "I attest that I own the copyright on this file, and agree to irrevocably release this file to Wikimedia Commons under the [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] license, and I agree to the [https://wikimediafoundation.org/wiki/Terms_of_Use Terms of Use].",
 -      "foreign-structured-upload-form-label-not-own-work-message-shared": "If you do not own the copyright on this file, or you wish to release it under a different license, consider using the [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard].",
 -      "foreign-structured-upload-form-label-not-own-work-local-shared": "You may also want to try using [[Special:Upload|the upload page on {{SITENAME}}]], if the site allows the upload of this file under their policies.",
 +      "upload-form-label-own-work": "This is my own work",
 +      "upload-form-label-infoform-categories": "Categories",
 +      "upload-form-label-infoform-date": "Date",
 +      "upload-form-label-own-work-message-generic-local": "I confirm that I am uploading this file following the terms of service and licensing policies on {{SITENAME}}.",
 +      "upload-form-label-not-own-work-message-generic-local": "If you are not able to upload this file under the policies of {{SITENAME}}, please close this dialog and try another method.",
 +      "upload-form-label-not-own-work-local-generic-local": "You may also want to try [[Special:Upload|the default upload page]].",
 +      "upload-form-label-own-work-message-generic-foreign": "I understand that I am uploading this file to a shared repository. I confirm that I am doing so following the terms of service and licensing policies there.",
 +      "upload-form-label-not-own-work-message-generic-foreign": "If you are not able to upload this file under the policies of the shared repository, please close this dialog and try another method.",
 +      "upload-form-label-not-own-work-local-generic-foreign": "You may also want to try using [[Special:Upload|the upload page on {{SITENAME}}]], if this file can be uploaded there under their policies.",
        "backend-fail-stream": "Could not stream file \"$1\".",
        "backend-fail-backup": "Could not backup file \"$1\".",
        "backend-fail-notexists": "The file $1 does not exist.",
        "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: \"<em>$2</em>\"",
 +      "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\".",
        "uploadstash-summary": "This page provides access to files that are uploaded or in the process of uploading, but are not yet published to the wiki. These files are not visible to anyone but the user who uploaded them.",
        "uploadstash-clear": "Clear stashed files",
        "uploadstash-nofiles": "You have no stashed files.",
 -      "uploadstash-badtoken": "Performing of that action was unsuccessful, perhaps because your editing credentials expired. Try again.",
 -      "uploadstash-errclear": "Clearing the files was unsuccessful.",
 +      "uploadstash-badtoken": "Performing that action failed, perhaps because your editing credentials expired. Please try again.",
 +      "uploadstash-errclear": "Clearing the files failed.",
        "uploadstash-refresh": "Refresh the list of files",
 +      "uploadstash-thumbnail": "view thumbnail",
 +      "uploadstash-exception": "Could not store upload in the stash ($1): \"$2\".",
        "invalid-chunk-offset": "Invalid chunk offset",
        "img-auth-accessdenied": "Access denied",
        "img-auth-nopathinfo": "Missing PATH_INFO.\nYour server is not set up to pass this information.\nIt may be CGI-based and cannot support img_auth.\nSee https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "filerevert-submit": "Revert",
        "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.",
 +      "filerevert-identical": "The current version of the file is already identical to the selected one.",
        "filedelete": "Delete $1",
        "filedelete-legend": "Delete file",
        "filedelete-intro": "You are about to delete the file <strong>[[Media:$1|$1]]</strong> along with all of its history.",
        "prefixindex": "All pages with prefix",
        "prefixindex-namespace": "All pages with prefix ($1 namespace)",
        "prefixindex-summary": "",
 +      "prefixindex-submit": "Show",
        "prefixindex-strip": "Strip prefix in list",
        "shortpages": "Short pages",
        "shortpages-summary": "",
        "protectedpages-performer": "Protecting user",
        "protectedpages-params": "Protection parameters",
        "protectedpages-reason": "Reason",
 +      "protectedpages-submit": "Display pages",
        "protectedpages-unknown-timestamp": "Unknown",
        "protectedpages-unknown-performer": "Unknown user",
        "protectedpages-unknown-reason": "—",
        "protectedtitles": "Protected titles",
        "protectedtitles-summary": "This page lists titles that are currently protected from creation. For a list of existing pages that are protected, see [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "No titles are currently protected with these parameters.",
 +      "protectedtitles-submit": "Display titles",
        "listusers": "User list",
        "listusers-summary": "",
        "listusers-editsonly": "Show only users with edits",
        "usercreated": "{{GENDER:$3|Created}} on $1 at $2",
        "newpages": "New pages",
        "newpages-summary": "",
 +      "newpages-submit": "Show",
        "newpages-username": "Username:",
        "ancientpages": "Oldest pages",
        "ancientpages-summary": "",
        "apihelp-summary": "",
        "apihelp-no-such-module": "Module \"$1\" not found.",
        "apihelp-link": "[[Special:ApiHelp/$1|$2]]",
 +      "apisandbox": "API sandbox",
 +      "apisandbox-summary": "",
 +      "apisandbox-jsonly": "JavaScript is required to use the API sandbox.",
 +      "apisandbox-api-disabled": "The API is disabled on this site.",
 +      "apisandbox-intro": "Use this page to experiment with the <strong>MediaWiki web service API</strong>.\nRefer to [[mw:API:Main page|the API documentation]] for further details of API usage. Example: [https://www.mediawiki.org/wiki/API#A_simple_example get the content of a Main Page]. Select an action to see more examples.\n\nNote that, although this is a sandbox, actions you carry out on this page may modify the wiki.",
 +      "apisandbox-fullscreen": "Expand panel",
 +      "apisandbox-fullscreen-tooltip": "Expand the sandbox panel to fill the browser window.",
 +      "apisandbox-unfullscreen": "Show page",
 +      "apisandbox-unfullscreen-tooltip": "Reduce the sandbox panel, so MediaWiki navigation links are available.",
 +      "apisandbox-submit": "Make request",
 +      "apisandbox-reset": "Clear",
 +      "apisandbox-retry": "Retry",
 +      "apisandbox-loading": "Loading information for API module \"$1\"...",
 +      "apisandbox-load-error": "An error occurred while loading information for API module \"$1\": $2",
 +      "apisandbox-no-parameters": "This API module has no parameters.",
 +      "apisandbox-helpurls": "Help links",
 +      "apisandbox-examples": "Examples",
 +      "apisandbox-dynamic-parameters": "Additional parameters",
 +      "apisandbox-dynamic-parameters-add-label": "Add parameter:",
 +      "apisandbox-dynamic-parameters-add-placeholder": "Parameter name",
 +      "apisandbox-dynamic-error-exists": "A parameter named \"$1\" already exists.",
 +      "apisandbox-deprecated-parameters": "Deprecated parameters",
 +      "apisandbox-fetch-token": "Auto-fill the token",
 +      "apisandbox-submit-invalid-fields-title": "Some fields are invalid",
 +      "apisandbox-submit-invalid-fields-message": "Please correct the marked fields and try again.",
 +      "apisandbox-results": "Results",
 +      "apisandbox-sending-request": "Sending API request...",
 +      "apisandbox-loading-results": "Receiving API results...",
 +      "apisandbox-results-error": "An error occurred while loading the API query response: $1.",
 +      "apisandbox-request-url-label": "Request URL:",
 +      "apisandbox-request-time": "Request time: {{PLURAL:$1|$1 ms}}",
 +      "apisandbox-results-fixtoken": "Correct token and resubmit",
 +      "apisandbox-results-fixtoken-fail": "Failed to fetch \"$1\" token.",
 +      "apisandbox-alert-page": "Fields on this page are not valid.",
 +      "apisandbox-alert-field": "The value of this field is not valid.",
 +      "apisandbox-continue": "Continue",
 +      "apisandbox-continue-clear": "Clear",
 +      "apisandbox-continue-help": "{{int:apisandbox-continue}} will [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continue] the last request; {{int:apisandbox-continue-clear}} will clear continuation-related parameters.",
        "booksources": "Book sources",
        "booksources-summary": "",
        "booksources-search-legend": "Search for book sources",
        "booksources-search": "Search",
        "booksources-text": "Below is a list of links to other sites that sell new and used books, and may also have further information about books you are looking for:",
        "booksources-invalid-isbn": "The given ISBN does not appear to be valid; check for errors copying from the original source.",
 +      "magiclink-tracking-rfc": "Pages using RFC magic links",
 +      "magiclink-tracking-rfc-desc": "This page uses RFC magic links. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] on how to migrate.",
 +      "magiclink-tracking-pmid": "Pages using PMID magic links",
 +      "magiclink-tracking-pmid-desc": "This page uses PMID magic links. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] on how to migrate.",
 +      "magiclink-tracking-isbn": "Pages using ISBN magic links",
 +      "magiclink-tracking-isbn-desc": "This page uses ISBN magic links. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] on how to migrate.",
        "rfcurl": "//tools.ietf.org/html/rfc$1",
        "pubmedurl": "//www.ncbi.nlm.nih.gov/pubmed/$1?dopt=Abstract",
        "specialloguserlabel": "Performer:",
        "speciallogtitlelabel": "Target (title or {{ns:user}}:username for user):",
        "log": "Logs",
 +      "logeventslist-submit": "Show",
        "all-logs-page": "All public logs",
        "alllogstext": "Combined display of all available logs of {{SITENAME}}.\nYou can narrow down the view by selecting a log type, the username (case-sensitive), or the affected page (also case-sensitive).",
        "logempty": "No matching items in log.",
        "log-title-wildcard": "Search titles starting with this text",
        "showhideselectedlogentries": "Change visibility of selected log entries",
        "log-edit-tags": "Edit tags of selected log entries",
 +      "checkbox-select": "Select: $1",
 +      "checkbox-all": "All",
 +      "checkbox-none": "None",
 +      "checkbox-invert": "Invert",
        "allpages": "All pages",
        "allpages-summary": "",
        "nextpage": "Next page ($1)",
        "cachedspecial-refresh-now": "View latest.",
        "categories": "Categories",
        "categories-summary": "",
 +      "categories-submit": "Show",
        "categoriespagetext": "The following {{PLURAL:$1|category contains|categories contain}} pages or media.\n[[Special:UnusedCategories|Unused categories]] are not shown here.\nAlso see [[Special:WantedCategories|wanted categories]].",
        "categoriesfrom": "Display categories starting at:",
 -      "special-categories-sort-count": "sort by count",
 -      "special-categories-sort-abc": "sort alphabetically",
        "deletedcontributions": "Deleted user contributions",
        "deletedcontributions-summary": "",
        "deletedcontributions-title": "Deleted user contributions",
        "activeusers-intro": "This is a list of users who had some kind of activity within the last $1 {{PLURAL:$1|day|days}}.",
        "activeusers-count": "$1 {{PLURAL:$1|action|actions}} in the last {{PLURAL:$3|day|$3 days}}",
        "activeusers-from": "Display users starting at:",
 -      "activeusers-hidebots": "Hide bots",
 -      "activeusers-hidesysops": "Hide administrators",
 +      "activeusers-groups": "Display users belonging to groups:",
        "activeusers-noresult": "No users found.",
 +      "activeusers-submit": "Display active users",
        "listgrouprights": "User group rights",
        "listgrouprights-summary": "The following is a list of user groups defined on this wiki, with their associated access rights.\nThere may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] about individual rights.",
        "listgrouprights-key": "Legend:\n* <span class=\"listgrouprights-granted\">Granted right</span>\n* <span class=\"listgrouprights-revoked\">Revoked right</span>",
        "listgrouprights-namespaceprotection-header": "Namespace restrictions",
        "listgrouprights-namespaceprotection-namespace": "Namespace",
        "listgrouprights-namespaceprotection-restrictedto": "Right(s) allowing user to edit",
 +      "listgrants": "Grants",
 +      "listgrants-summary": "The following is a list of grants with their associated access to user rights. Users can authorize applications to use their account, but with limited permissions based on the grants the user gave to the application. An application acting on behalf of a user cannot actually use rights that the user does not have however.\nThere may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] about individual rights.",
 +      "listgrants-grant": "Grant",
 +      "listgrants-rights": "Rights",
        "trackingcategories": "Tracking categories",
        "trackingcategories-summary": "This page lists tracking categories which are automatically populated by the MediaWiki software. Their names can be changed by altering the relevant system messages in the {{ns:8}} namespace.",
        "trackingcategories-msg": "Tracking category",
        "trackingcategories-name": "Message name",
        "trackingcategories-desc": "Category inclusion criteria",
 +      "restricted-displaytitle-ignored": "Pages with ignored display titles",
 +      "restricted-displaytitle-ignored-desc": "The page has an ignored <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> because it is not equivalent to the page's actual title.",
        "noindex-category-desc": "The page is not indexed by robots because it has the magic word <code><nowiki>__NOINDEX__</nowiki></code> on it and is in a namespace where that flag is allowed.",
        "index-category-desc": "The page has a <code><nowiki>__INDEX__</nowiki></code> on it (and is in a namespace where that flag is allowed), and hence is indexed by robots where it normally wouldn't be.",
        "post-expand-template-inclusion-category-desc": "The page size is bigger than <code>$wgMaxArticleSize</code> after expanding all the templates, so some templates were not expanded.",
        "watchnologin": "Not logged in",
        "addwatch": "Add to watchlist",
        "addedwatchtext": "\"[[:$1]]\" and its discussion page have been added to your [[Special:Watchlist|watchlist]].",
 +      "addedwatchtext-talk": "\"[[:$1]]\" and its associated page have been added to your [[Special:Watchlist|watchlist]].",
        "addedwatchtext-short": "The page \"$1\" has been added to your watchlist.",
        "removewatch": "Remove from watchlist",
        "removedwatchtext": "\"[[:$1]]\" and its discussion page have been removed from your [[Special:Watchlist|watchlist]].",
 +      "removedwatchtext-talk": "\"[[:$1]]\" and its associated page have been removed from your [[Special:Watchlist|watchlist]].",
        "removedwatchtext-short": "The page \"$1\" has been removed from your watchlist.",
        "watch": "Watch",
        "watchthispage": "Watch this page",
        "wlheader-showupdated": "Pages that have been changed since you last visited them are shown in <strong>bold</strong>.",
        "wlnote": "Below {{PLURAL:$1|is the last change|are the last <strong>$1</strong> changes}} in the last {{PLURAL:$2|hour|<strong>$2</strong> hours}}, as of $3, $4.",
        "wlshowlast": "Show last $1 hours $2 days",
 -      "watchlistall2": "all",
        "watchlist-hide": "Hide",
 +      "watchlist-submit": "Show",
        "wlshowtime": "Period of time to display:",
        "wlshowhideminor": "minor edits",
        "wlshowhidebots": "bots",
        "wlshowhideanons": "anonymous users",
        "wlshowhidepatr": "patrolled edits",
        "wlshowhidemine": "my edits",
 +      "wlshowhidecategorization": "page categorization",
        "watchlist-options": "Watchlist options",
        "watching": "Watching...",
        "unwatching": "Unwatching...",
        "delete-confirm": "Delete \"$1\"",
        "delete-legend": "Delete",
        "historywarning": "<strong>Warning:</strong> The page you are about to delete has a history with $1 {{PLURAL:$1|revision|revisions}}:",
 +      "historyaction-submit": "Show",
        "confirmdeletetext": "You are about to delete a page along with all of its history.\nPlease 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]].",
        "actioncomplete": "Action complete",
        "actionfailed": "Action failed",
        "delete-toobig": "This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.\nDeletion of such pages has been restricted to prevent accidental disruption of {{SITENAME}}.",
        "delete-warning-toobig": "This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.\nDeleting it may disrupt database operations of {{SITENAME}};\nproceed with caution.",
        "deleteprotected": "You cannot delete this page because it has been protected.",
 -      "deleting-backlinks-warning": "'''Warning:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Other pages]] link to or transclude the page you are about to delete.",
 +      "deleting-backlinks-warning": "<strong>Warning:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Other pages]] link to or transclude the page you are about to delete.",
        "rollback": "Roll back edits",
        "rollbacklink": "rollback",
        "rollbacklinkcount": "rollback $1 {{PLURAL:$1|edit|edits}}",
        "rollbacklinkcount-morethan": "rollback more than $1 {{PLURAL:$1|edit|edits}}",
        "rollbackfailed": "Rollback failed",
 +      "rollback-missingparam": "Missing required parameters on request.",
 +      "rollback-missingrevision": "Unable to load revision data.",
        "cantrollback": "Cannot revert edit;\nlast contributor is only author of this page.",
        "alreadyrolled": "Cannot rollback last edit of [[:$1]] by [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nsomeone else has edited or rolled back the page already.\n\nThe last edit to the page was by [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
 -      "editcomment": "The edit summary was: \"''$1''\".",
 +      "editcomment": "The edit summary was: <em>$1</em>.",
        "revertpage": "Reverted edits by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) to last revision by [[User:$1|$1]]",
        "revertpage-nouser": "Reverted edits by a hidden user to last revision by {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Reverted edits by $1;\nchanged back to last revision by $2.",
 +      "rollback-success-notify": "Reverted edits by $1;\nchanged back to last revision by $2. [$3 Show changes]",
        "sessionfailure-title": "Session failure",
        "sessionfailure": "There seems to be a problem with your login session;\nthis action has been canceled as a precaution against session hijacking.\nGo back to the previous page, reload that page and then try again.",
        "changecontentmodel" : "Change content model of a page",
        "changecontentmodel-title-label": "Page title",
        "changecontentmodel-model-label": "New content model",
        "changecontentmodel-reason-label": "Reason:",
 +      "changecontentmodel-submit": "Change",
        "changecontentmodel-success-title": "The content model was changed",
        "changecontentmodel-success-text": "The content type of [[:$1]] has been changed.",
        "changecontentmodel-cannot-convert": "The content on [[:$1]] cannot be converted to a type of $2.",
        "changecontentmodel-nodirectediting": "The $1 content model does not support direct editing",
 +      "changecontentmodel-emptymodels-title": "No content models available",
 +      "changecontentmodel-emptymodels-text": "The content on [[:$1]] cannot be converted to any type.",
        "log-name-contentmodel": "Content model change log",
        "log-description-contentmodel": "Events related to the content models of a page",
 +      "logentry-contentmodel-new": "$1 {{GENDER:$2|created}} the page $3 using a non-default content model \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|changed}} the content model of the page $3 from \"$4\" to \"$5\"",
        "logentry-contentmodel-change-revertlink": "revert",
        "logentry-contentmodel-change-revert": "revert",
        "modifiedarticleprotection": "changed protection level for \"[[$1]]\"",
        "unprotectedarticle": "removed protection from \"[[$1]]\"",
        "movedarticleprotection": "moved protection settings from \"[[$2]]\" to \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Protected}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Changed protection level}} for \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Removed protection}} from \"[[$1]]\"",
        "protect-title": "Change protection level for \"$1\"",
        "protect-title-notallowed": "View protection level of \"$1\"",
        "prot_1movedto2": "[[$1]] moved to [[$2]]",
        "protect-legend": "Confirm protection",
        "protectcomment": "Reason:",
        "protectexpiry": "Expires:",
 -      "protect_expiry_invalid": "Expiry time is invalid.",
 -      "protect_expiry_old": "Expiry time is in the past.",
 +      "protect_expiry_invalid": "Expiration time is invalid.",
 +      "protect_expiry_old": "Expiration 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 <strong>$1</strong>.",
        "protect-locked-blocked": "You cannot change protection levels while blocked.\nHere are the current settings for the page <strong>$1</strong>:",
        "protect-cantedit": "You cannot change the protection levels of this page because you do not have permission to edit it.",
        "protect-othertime": "Other time:",
        "protect-othertime-op": "other time",
 -      "protect-existing-expiry": "Existing expiry time: $3, $2",
 -      "protect-existing-expiry-infinity": "Existing expiry time: infinite",
 +      "protect-existing-expiry": "Existing expiration time: $3, $2",
 +      "protect-existing-expiry-infinity": "Existing expiration time: infinite",
        "protect-otherreason": "Other/additional reason:",
        "protect-otherreason-op": "Other reason",
        "protect-dropdown": "*Common protection reasons\n** Excessive vandalism\n** Excessive spamming\n** Counter-productive edit warring\n** High traffic page",
        "undeletehistorynoadmin": "This page has been deleted.\nThe reason for deletion is shown in the summary below, along with details of the users who had edited this page before deletion.\nThe actual text of these deleted revisions is only available to administrators.",
        "undelete-revision": "Deleted revision of $1 (as of $4, at $5) by $3:",
        "undeleterevision-missing": "Invalid or missing revision.\nYou may have a bad link, or the revision may have been restored or removed from the archive.",
 +      "undeleterevision-duplicate-revid": "{{PLURAL:$1|One revision|$1 revisions}} could not be restored, because {{PLURAL:$1|its|their}} <code>rev_id</code> was already in use.",
        "undelete-nodiff": "No previous revision found.",
        "undeletebtn": "Restore",
        "undeletelink": "view/restore",
        "undeletedrevisions": "{{PLURAL:$1|1 revision|$1 revisions}} restored",
        "undeletedrevisions-files": "{{PLURAL:$1|1 revision|$1 revisions}} and {{PLURAL:$2|1 file|$2 files}} restored",
        "undeletedfiles": "{{PLURAL:$1|1 file|$1 files}} restored",
 -      "cannotundelete": "Undelete failed:\n$1",
 +      "cannotundelete": "Some or all of the undeletion failed:\n$1",
        "undeletedpage": "<strong>$1 has been restored</strong>\n\nConsult 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.",
        "undelete-search-title": "Search deleted pages",
        "undelete-error-long": "Errors were encountered while undeleting the file:\n\n$1",
        "undelete-show-file-confirm": "Are you sure you want to view the deleted revision of the file \"<nowiki>$1</nowiki>\" from $2 at $3?",
        "undelete-show-file-submit": "Yes",
 -      "undelete-revision-row": "$1 $2 ($3) $4 . . $5 $6 $7 $8 $9",
 +      "undelete-revision-row2": "$1 ($2) $3 . . $4 $5 $6 $7 $8",
        "namespace": "Namespace:",
        "invert": "Invert selection",
        "tooltip-invert": "Check this box to hide changes to pages within the selected namespace (and the associated namespace if checked)",
        "sp-contributions-newbies-sub": "For new accounts",
        "sp-contributions-newbies-title": "User contributions for new accounts",
        "sp-contributions-blocklog": "block log",
 -      "sp-contributions-suppresslog": "suppressed user contributions",
 -      "sp-contributions-deleted": "deleted user contributions",
 +      "sp-contributions-suppresslog": "suppressed {{GENDER:$1|user}} contributions",
 +      "sp-contributions-deleted": "deleted {{GENDER:$1|user}} contributions",
        "sp-contributions-uploads": "uploads",
        "sp-contributions-logs": "logs",
        "sp-contributions-talk": "talk",
        "sp-contributions-username": "IP address or username:",
        "sp-contributions-toponly": "Only show edits that are latest revisions",
        "sp-contributions-newonly": "Only show edits that are page creations",
 +      "sp-contributions-hideminor": "Hide minor edits",
        "sp-contributions-submit": "Search",
        "sp-contributions-explain": "",
        "sp-contributions-footer": "-",
        "whatlinkshere-hidelinks": "$1 links",
        "whatlinkshere-hideimages": "$1 file links",
        "whatlinkshere-filters": "Filters",
 +      "whatlinkshere-submit": "Go",
        "autoblockid": "Autoblock #$1",
        "block": "Block user",
        "unblock": "Unblock user",
        "unblock-summary": "",
        "blockip": "Block {{GENDER:$1|user}}",
        "blockip-legend": "Block user",
 -      "blockiptext": "Use the form below to block write access from a specific IP address or username.\nThis should be done only to prevent vandalism, and in accordance with [[{{MediaWiki:Policy-url}}|policy]].\nFill in a specific reason below (for example, citing particular pages that were vandalized).",
 +      "blockiptext": "Use the form below to block write access from a specific IP address or username.\nThis should be done only to prevent vandalism, and in accordance with [[{{MediaWiki:Policy-url}}|policy]].\nFill in a specific reason below (for example, citing particular pages that were vandalized).\nYou can block IP address ranges using the [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] syntax; the largest allowed range is /$1 for IPv4 and /$2 for IPv6.",
        "ipaddressorusername": "IP address or username:",
 -      "ipbexpiry": "Expiry:",
 +      "ipbexpiry": "Expiration:",
        "ipbreason": "Reason:",
        "ipbreason-dropdown": "*Common block reasons\n** Inserting false information\n** Removing content from pages\n** Spamming links to external sites\n** Inserting nonsense/gibberish into pages\n** Intimidating behavior/harassment\n** Abusing multiple accounts\n** Unacceptable username",
        "ipb-hardblock": "Prevent logged-in users from editing from this IP address",
        "ipb-unblock": "Unblock a username or IP address",
        "ipb-blocklist": "View existing blocks",
        "ipb-blocklist-contribs": "Contributions for {{GENDER:$1|$1}}",
 +      "ipb-blocklist-duration-left": "$1 left",
        "unblockip": "Unblock user",
        "unblockiptext": "Use the form below to restore write access to a previously blocked IP address or username.",
        "ipusubmit": "Remove this block",
        "blocklogpage": "Block log",
        "blocklog-showlog": "This user has been blocked previously.\nThe block log is provided below for reference:",
        "blocklog-showsuppresslog": "This user has been blocked and hidden previously.\nThe suppress log is provided below for reference:",
 -      "blocklogentry": "blocked [[$1]] with an expiry time of $2 $3",
 -      "reblock-logentry": "changed block settings for [[$1]] with an expiry time of $2 $3",
 +      "blocklogentry": "blocked [[$1]] with an expiration time of $2 $3",
 +      "reblock-logentry": "changed block settings for [[$1]] with an expiration time of $2 $3",
        "blocklogtext": "This is a log of user blocking and unblocking actions.\nAutomatically blocked IP addresses are not listed.\nSee the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.",
        "unblocklogentry": "unblocked $1",
        "block-log-flags-anononly": "anonymous users only",
        "block-log-flags-hiddenname": "username hidden",
        "range_block_disabled": "The administrator ability to create range blocks is disabled.",
        "ipb_expiry_invalid": "Expiry time invalid.",
 +      "ipb_expiry_old": "Expiry time is in the past.",
        "ipb_expiry_temp": "Hidden username blocks must be permanent.",
        "ipb_hide_invalid": "Unable to suppress this account; it has more than {{PLURAL:$1|one edit|$1 edits}}.",
        "ipb_already_blocked": "\"$1\" is already blocked.",
        "unblock-hideuser": "You cannot unblock this user, as their username has been hidden.",
        "ipb_cant_unblock": "Error: Block ID $1 not found. It may have been unblocked already.",
        "ipb_blocked_as_range": "Error: The IP address $1 is not blocked directly and cannot be unblocked.\nIt is, however, blocked as part of the range $2, which can be unblocked.",
 -      "ip_range_invalid": "Invalid IP range.",
 +      "ip_range_invalid": "Invalid IP address range.",
        "ip_range_toolarge": "Range blocks larger than /$1 are not allowed.",
        "proxyblocker": "Proxy blocker",
        "proxyblockreason": "Your IP address has been blocked because it is an open proxy.\nPlease contact your Internet service provider or technical support of your organization and inform them of this serious security problem.",
        "lockdbsuccesstext": "The database has been locked.<br />\nRemember to [[Special:UnlockDB|remove the lock]] after your maintenance is complete.",
        "unlockdbsuccesstext": "The database has been unlocked.",
        "lockfilenotwritable": "The database lock file is not writable.\nTo lock or unlock the database, this needs to be writable by the web server.",
 +      "databaselocked": "The database is already locked.",
        "databasenotlocked": "The database is not locked.",
        "lockedbyandtime": "(by {{GENDER:$1|$1}} on $2 at $3)",
        "move-page": "Move $1",
        "movepage-summary": "",
        "move-page-legend": "Move page",
 -      "movepagetext": "Using the form below will rename a page, moving all of its history to the new name.\nThe old title will become a redirect page to the new title.\nYou can update redirects that point to the original title automatically.\nIf you choose not to, be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote 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.\nThis 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.\n\n<strong>Warning!</strong>\nThis can be a drastic and unexpected change for a popular page;\nplease 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.\nThe old title will become a redirect page to the new title.\nBe sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote 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.\nThis 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.\n\n<strong>Warning!</strong>\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.",
 +      "movepagetext": "Using the form below will rename a page, moving all of its history to the new name.\nThe old title will become a redirect page to the new title.\nYou can update redirects that point to the original title automatically.\nIf you choose not to, be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote 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.\nThis 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.\n\n<strong>Note:</strong>\nThis can be a drastic and unexpected change for a popular page;\nplease 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.\nThe old title will become a redirect page to the new title.\nBe sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote 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.\nThis 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.\n\n<strong>Note:</strong>\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.",
        "movepagetalktext": "If you check this box, the associated talk page will be automatically moved to new title, unless a non-empty talk page already exists there.\n\nIn this case, you will have to move or merge the page manually if desired.",
        "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.",
        "movecategorypage-warning": "<strong>Warning:</strong> You are about to move a category page. Please note that only the page will be moved and any pages in the old category will <em>not</em> be recategorized into the new one.",
        "movelogpagetext": "Below is a list of all page moves.",
        "movesubpage": "{{PLURAL:$1|Subpage|Subpages}}",
        "movesubpagetext": "This page has $1 {{PLURAL:$1|subpage|subpages}} shown below.",
 +      "movesubpagetalktext": "The corresponding talk page has $1 {{PLURAL:$1|subpage|subpages}} shown below.",
        "movenosubpage": "This page has no subpages.",
        "movereason": "Reason:",
        "move-redirect-text": "",
        "category-move-redirect-override": "-",
        "revertmove": "revert",
 -      "delete_and_move_text": "== Deletion required ==\nThe destination page \"[[:$1]]\" already exists.\nDo you want to delete it to make way for the move?",
 +      "delete_and_move_text": "The destination page \"[[:$1]]\" already exists.\nDo you want to delete it to make way for the move?",
        "delete_and_move_confirm": "Yes, delete the page",
        "delete_and_move_reason": "Deleted to make way for move from \"[[$1]]\"",
        "selfmove": "Source and destination titles are the same;\ncannot move a page over itself.",
        "move-leave-redirect": "Leave a redirect behind",
        "protectedpagemovewarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can move it.\nThe latest log entry is provided below for reference:",
        "semiprotectedpagemovewarning": "<strong>Note:</strong> This page has been protected so that only registered users can move it.\nThe latest log entry is provided below for reference:",
 -      "move-over-sharedrepo": "== File exists ==\n[[:$1]] exists on a shared repository. Moving a file to this title will override the shared file.",
 +      "move-over-sharedrepo": "[[:$1]] exists on a shared repository. Moving a file to this title will override the shared file.",
        "file-exists-sharedrepo": "The filename chosen is already in use on a shared repository.\nPlease choose another name.",
        "export": "Export pages",
        "export-summary": "",
        "export-download": "Save as file",
        "export-templates": "Include templates",
        "export-pagelinks": "Include linked pages to a depth of:",
 +      "export-manual": "Add pages manually:",
        "allmessages": "System messages",
        "allmessagesname": "Name",
        "allmessagesdefault": "Default message text",
        "allmessagescurrent": "Current message text",
 -      "allmessagestext": "This is a list of system messages available in the MediaWiki namespace.\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
 +      "allmessagestext": "This is a list of system messages available in the MediaWiki namespace.\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [https://translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
        "allmessagesnotsupportedDB": "This page cannot be used because <strong>$wgUseDatabaseMessages</strong> has been disabled.",
        "allmessages-filter-legend": "Filter",
        "allmessages-filter": "Filter by customization state:",
        "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.\nPlease try again.",
 +      "import-token-mismatch": "Loss of session data.\n\nYou might have been logged out. <strong>Please verify that you're still logged in and try again</strong>.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in, and check that your browser allows cookies from this site.",
        "import-invalid-interwiki": "Cannot import from the specified wiki.",
        "import-error-edit": "Page \"$1\" was not imported because you are not allowed to edit it.",
        "import-error-create": "Page \"$1\" was not imported because you are not allowed to create it.",
        "import-logentry-interwiki": "transwikied $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision|revisions}} imported from $2",
        "javascripttest": "JavaScript testing",
 -      "javascripttest-backlink": "< $1",
 -      "javascripttest-title": "$1",
 -      "javascripttest-pagetext-noframework": "This page is reserved for running JavaScript tests.",
 -      "javascripttest-pagetext-unknownframework": "Unknown testing framework \"$1\".",
        "javascripttest-pagetext-unknownaction": "Unknown action \"$1\".",
 -      "javascripttest-pagetext-frameworks": "Please choose one of the following testing frameworks: $1",
 -      "javascripttest-pagetext-skins": "Choose a skin to run the tests with:",
 -      "javascripttest-qunit-name": "QUnit",
        "javascripttest-qunit-intro": "See [$1 testing documentation] on mediawiki.org.",
        "accesskey-pt-userpage": ".",
        "accesskey-pt-anonuserpage": ".",
        "accesskey-ca-nstab-category": "c",
        "accesskey-minoredit": "i",
        "accesskey-save": "s",
 +      "accesskey-publish": "s",
        "accesskey-preview": "p",
        "accesskey-diff": "v",
        "accesskey-compareselectedversions": "v",
        "accesskey-import": "s",
        "accesskey-watchlistedit-normal-submit": "s",
        "accesskey-watchlistedit-raw-submit": "s",
 -      "tooltip-pt-userpage": "Your user page",
 +      "tooltip-pt-userpage": "{{GENDER:|Your user}} page",
        "tooltip-pt-anonuserpage": "The user page for the IP address you are editing as",
 -      "tooltip-pt-mytalk": "Your talk page",
 +      "tooltip-pt-mytalk": "{{GENDER:|Your}} talk page",
        "tooltip-pt-anontalk": "Discussion about edits from this IP address",
 -      "tooltip-pt-preferences": "Your preferences",
 +      "tooltip-pt-preferences": "{{GENDER:|Your}} preferences",
        "tooltip-pt-watchlist": "A list of pages you are monitoring for changes",
 -      "tooltip-pt-mycontris": "A list of your contributions",
 +      "tooltip-pt-mycontris": "A list of {{GENDER:|your}} contributions",
        "tooltip-pt-anoncontribs": "A list of edits made from this IP address",
        "tooltip-pt-login": "You are encouraged to log in; however, it is not mandatory",
        "tooltip-pt-logout": "Log out",
        "tooltip-t-recentchangeslinked": "Recent changes in pages linked from this page",
        "tooltip-feed-rss": "RSS feed for this page",
        "tooltip-feed-atom": "Atom feed for this page",
 -      "tooltip-t-contributions": "A list of contributions by this user",
 -      "tooltip-t-emailuser": "Send an email to this user",
 +      "tooltip-t-contributions": "A list of contributions by {{GENDER:$1|this user}}",
 +      "tooltip-t-emailuser": "Send an email to {{GENDER:$1|this user}}",
        "tooltip-t-info": "More information about this page",
        "tooltip-t-upload": "Upload files",
        "tooltip-t-specialpages": "A list of all special pages",
        "tooltip-ca-nstab-category": "View the category page",
        "tooltip-minoredit": "Mark this as a minor edit",
        "tooltip-save": "Save your changes",
 +      "tooltip-publish": "Publish your changes",
        "tooltip-preview": "Preview your changes. Please use this before saving.",
        "tooltip-diff": "Show which changes you made to the text",
        "tooltip-compareselectedversions": "See the differences between the two selected revisions of this page",
        "tooltip-watchlistedit-raw-submit": "Update watchlist",
        "tooltip-recreate": "Recreate the page even though it has been deleted",
        "tooltip-upload": "Start upload",
 -      "tooltip-rollback": "\"Rollback\" reverts edit(s) to this page of the last contributor in one click",
 +      "tooltip-rollback": "\"Rollback\" reverts the last contributor's edit(s) to this page in one click",
        "tooltip-undo": "\"Undo\" reverts this edit and opens the edit form in preview mode. It allows adding a reason in the summary.",
        "tooltip-preferences-save": "Save preferences",
        "tooltip-summary": "Enter a short summary",
        "lastmodifiedatby": "This page was last modified $2, $1 by $3.",
        "othercontribs": "Based on work by $1.",
        "others": "others",
 -      "siteusers": "{{SITENAME}} {{PLURAL:$2|user|users}} $1",
 +      "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|user}}|users}} $1",
        "anonusers": "{{SITENAME}} anonymous {{PLURAL:$2|user|users}} $1",
        "creditspage": "Page credits",
        "nocredits": "There is no credits info available for this page.",
        "pageinfo-article-id": "Page ID",
        "pageinfo-language": "Page content language",
        "pageinfo-content-model": "Page content model",
 +      "pageinfo-content-model-change": "change",
        "pageinfo-robot-policy": "Indexing by robots",
        "pageinfo-robot-index": "Allowed",
        "pageinfo-robot-noindex": "Disallowed",
        "pageinfo-category-pages": "Number of pages",
        "pageinfo-category-subcats": "Number of subcategories",
        "pageinfo-category-files": "Number of files",
 +      "pageinfo-user-id": "User ID",
        "markaspatrolleddiff": "Mark as patrolled",
        "markaspatrolledlink": "[$1]",
        "markaspatrolledtext": "Mark this page as patrolled",
 +      "markaspatrolledtext-file": "Mark this file version as patrolled",
        "markedaspatrolled": "Marked as patrolled",
        "markedaspatrolledtext": "The selected revision of [[:$1]] has been marked as patrolled.",
        "rcpatroldisabled": "Recent changes patrol disabled",
        "newimages-legend": "Filter",
        "newimages-label": "Filename (or a part of it):",
        "newimages-showbots": "Show uploads by bots",
 +      "newimages-hidepatrolled": "Hide patrolled uploads",
        "noimages": "Nothing to see.",
 +      "gallery-slideshow-toggle": "Toggle thumbnails",
        "ilsubmit": "Search",
        "bydate": "by date",
        "sp-newimages-showfrom": "Show new files starting from $2, $1",
        "exif-colorspace": "Color space",
        "exif-componentsconfiguration": "Meaning of each component",
        "exif-compressedbitsperpixel": "Image compression mode",
 -      "exif-pixelydimension": "Image width",
 -      "exif-pixelxdimension": "Image height",
 +      "exif-pixelxdimension": "Image width",
 +      "exif-pixelydimension": "Image height",
        "exif-usercomment": "User comments",
        "exif-relatedsoundfile": "Related audio file",
        "exif-datetimeoriginal": "Date and time of data generation",
        "exif-compression-34712": "JPEG2000",
        "exif-copyrighted-true": "Copyrighted",
        "exif-copyrighted-false": "Copyright status not set",
 +      "exif-photometricinterpretation-0": "Black and white (White is 0)",
 +      "exif-photometricinterpretation-1": "Black and white (Black is 0)",
        "exif-photometricinterpretation-2": "RGB",
 +      "exif-photometricinterpretation-3": "Palette",
 +      "exif-photometricinterpretation-4": "Transparency mask",
 +      "exif-photometricinterpretation-5": "Separated (Probably CMYK)",
        "exif-photometricinterpretation-6": "YCbCr",
 +      "exif-photometricinterpretation-8": "CIE L*a*b*",
 +      "exif-photometricinterpretation-9": "CIE L*a*b* (ICC encoding)",
 +      "exif-photometricinterpretation-10": "CIE L*a*b* (ITU encoding)",
 +      "exif-photometricinterpretation-32803": "Color Filter Array",
 +      "exif-photometricinterpretation-34892": "Linear raw",
        "exif-unknowndate": "Unknown date",
        "exif-orientation-1": "Normal",
        "exif-orientation-2": "Flipped horizontally",
        "confirmemail_body_set": "Someone, probably you, from IP address $1,\nhas set the email address of the account \"$2\" to this address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and activate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf the account does *not* belong to you, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.",
        "confirmemail_invalidated": "Email address confirmation canceled",
        "invalidateemail": "Cancel email confirmation",
 +      "notificationemail_subject_changed": "{{SITENAME}} registered email address has been changed",
 +      "notificationemail_subject_removed": "{{SITENAME}} registered email address has been removed",
 +      "notificationemail_body_changed": "Someone, probably you, from IP address $1,\nhas changed the email address of the account \"$2\" to \"$3\" on {{SITENAME}}.\n\nIf this was not you, contact a site administrator immediately.",
 +      "notificationemail_body_removed": "Someone, probably you, from IP address $1,\nhas removed the email address of the account \"$2\" on {{SITENAME}}.\n\nIf this was not you, contact a site administrator immediately.",
        "scarytranscludedisabled": "[Interwiki transcluding is disabled]",
        "scarytranscludefailed": "[Template fetch failed for $1]",
        "scarytranscludefailed-httpstatus": "[Template fetch failed for $1: HTTP $2]",
        "scarytranscludetoolong": "[URL is too long]",
        "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:\n: <em>$2</em>\nPlease 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.",
 +      "confirmrecreate": "User [[User:$1|$1]] ([[User talk:$1|talk]]) {{GENDER:$1|deleted}} this page after you started editing with reason:\n: <em>$2</em>\nPlease confirm that you really want to recreate this page.",
 +      "confirmrecreate-noreason": "User [[User:$1|$1]] ([[User talk:$1|talk]]) {{GENDER:$1|deleted}} this page after you started editing. Please confirm that you really want to recreate this page.",
        "recreate": "Recreate",
        "unit-pixel": "px",
        "confirm_purge_button": "OK",
        "confirm-watch-top": "Add this page to your watchlist?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Remove this page from your watchlist?",
 +      "confirm-rollback-button": "OK",
 +      "confirm-rollback-top": "Revert edits to this page?",
        "semicolon-separator": ";&#32;",
        "comma-separator": ",&#32;",
        "colon-separator": ":&#32;",
        "watchlistedit-raw-done": "Your watchlist has been updated.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 title was|$1 titles were}} added:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 title was|$1 titles were}} removed:",
 -      "watchlistedit-clear-title": "Cleared watchlist",
 +      "watchlistedit-clear-title": "Clear watchlist",
        "watchlistedit-clear-legend": "Clear watchlist",
        "watchlistedit-clear-explain": "All of the titles will be removed from your watchlist",
        "watchlistedit-clear-titles": "Titles:",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
        "signature-anon": "[[{{#special:Contributions}}/$1|$2]]",
        "timezone-utc": "UTC",
 +      "timezone-local": "Local",
        "duplicate-defaultsort": "<strong>Warning:</strong> Default sort key \"$2\" overrides earlier default sort key \"$1\".",
        "duplicate-displaytitle": "<strong>Warning:</strong> Display title \"$2\" overrides earlier display title \"$1\".",
 +      "restricted-displaytitle": "<strong>Warning:</strong> Display title \"$1\" was ignored since it is not equivalent to the page's actual title.",
        "invalid-indicator-name": "<strong>Error:</strong> Page status indicators' <code>name</code> attribute must not be empty.",
        "version": "Version",
        "version-summary": "",
        "version-hook-subscribedby": "Subscribed by",
        "version-version": "($1)",
        "version-no-ext-name": "[no name]",
 -      "version-svn-revision": "r$1",
        "version-license": "MediaWiki License",
        "version-ext-license": "License",
        "version-ext-colheader-name": "Extension",
        "version-libraries-license": "License",
        "version-libraries-description": "Description",
        "version-libraries-authors": "Authors",
 -      "redirect": "Redirect by file, user, page or revision ID",
 -      "redirect-legend": "Redirect to a file or page",
 +      "redirect": "Redirect by file, user, page, revision, or log ID",
        "redirect-text": "",
 -      "redirect-summary": "This special page redirects to a file (given the filename), a page (given a revision ID or page ID), or a user page (given a numeric user ID). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
 +      "redirect-summary": "This special page redirects to a file (given the filename), a page (given a revision ID or page ID), a user page (given a numeric user ID), or a log entry (given the log ID). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Go",
        "redirect-lookup": "Lookup:",
        "redirect-value": "Value:",
        "redirect-page": "Page ID",
        "redirect-revision": "Page revision",
        "redirect-file": "Filename",
 +      "redirect-logid": "Log ID",
        "redirect-not-exists": "Value not found",
        "fileduplicatesearch": "Search for duplicate files",
        "fileduplicatesearch-summary": "Search for duplicate files based on hash values.",
 -      "fileduplicatesearch-legend": "Search for a duplicate",
        "fileduplicatesearch-filename": "Filename:",
        "fileduplicatesearch-submit": "Search",
        "fileduplicatesearch-info": "$1 × $2 pixel<br />File size: $3<br />MIME type: $4",
        "tag-filter": "[[Special:Tags|Tag]] filter:",
        "tag-filter-submit": "Filter",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
 +      "tag-mw-contentmodelchange": "content model change",
 +      "tag-mw-contentmodelchange-description": "Edits that [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel change the content model] of a page",
        "tags-title": "Tags",
        "tags-intro": "This page lists the tags that the software may mark an edit with, and their meaning.",
        "tags-tag": "Tag name",
        "tags-actions-header": "Actions",
        "tags-active-yes": "Yes",
        "tags-active-no": "No",
 -      "tags-source-extension": "Defined by an extension",
 +      "tags-source-extension": "Defined by the software",
        "tags-source-manual": "Applied manually by users and bots",
        "tags-source-none": "No longer in use",
        "tags-edit": "edit",
        "tags-deactivate": "deactivate",
        "tags-hitcount": "$1 {{PLURAL:$1|change|changes}}",
        "tags-manage-no-permission": "You do not have permission to manage change tags.",
 +      "tags-manage-blocked": "You cannot manage change tags while blocked.",
        "tags-create-heading": "Create a new tag",
        "tags-create-explanation": "By default, newly created tags will be made available for use by users and bots.",
        "tags-create-tag-name": "Tag name:",
        "tags-delete-not-allowed": "Tags defined by an extension cannot be deleted unless the extension specifically allows it.",
        "tags-delete-not-found": "The tag \"$1\" does not exist.",
        "tags-delete-too-many-uses": "The tag \"$1\" is applied to more than $2 {{PLURAL:$2|revision|revisions}}, which means it cannot be deleted.",
 -      "tags-delete-warnings-after-delete": "The tag \"$1\" was deleted successfully, but the following {{PLURAL:$2|warning was|warnings were}} encountered:",
 +      "tags-delete-warnings-after-delete": "The tag \"$1\" was deleted, but the following {{PLURAL:$2|warning was|warnings were}} encountered:",
 +      "tags-delete-no-permission": "You do not have permission to delete change tags.",
        "tags-activate-title": "Activate tag",
        "tags-activate-question": "You are about to activate the tag \"$1\".",
        "tags-activate-reason": "Reason:",
        "tags-deactivate-not-allowed": "It is not possible to deactivate the tag \"$1\".",
        "tags-deactivate-submit": "Deactivate",
        "tags-apply-no-permission": "You do not have permission to apply change tags along with your changes.",
 +      "tags-apply-blocked": "You cannot apply change tags along with your changes while blocked.",
        "tags-apply-not-allowed-one": "The tag \"$1\" is not allowed to be manually applied.",
        "tags-apply-not-allowed-multi": "The following {{PLURAL:$2|tag is|tags are}} not allowed to be manually applied: $1",
        "tags-update-no-permission": "You do not have permission to add or remove change tags from individual revisions or log entries.",
 +      "tags-update-blocked": "You cannot add or remove change tags while blocked.",
        "tags-update-add-not-allowed-one": "The tag \"$1\" is not allowed to be manually added.",
        "tags-update-add-not-allowed-multi": "The following {{PLURAL:$2|tag is|tags are}} not allowed to be manually added: $1",
        "tags-update-remove-not-allowed-one": "The tag \"$1\" is not allowed to be removed.",
        "tags-edit-revision-legend": "Add or remove tags from {{PLURAL:$1|this revision|all $1 revisions}}",
        "tags-edit-logentry-legend": "Add or remove tags from {{PLURAL:$1|this log entry|all $1 log entries}}",
        "tags-edit-existing-tags": "Existing tags:",
 -      "tags-edit-existing-tags-none": "''None''",
 +      "tags-edit-existing-tags-none": "<em>None</em>",
        "tags-edit-new-tags": "New tags:",
        "tags-edit-add": "Add these tags:",
        "tags-edit-remove": "Remove these tags:",
        "tags-edit-reason": "Reason:",
        "tags-edit-revision-submit": "Apply changes to {{PLURAL:$1|this revision|$1 revisions}}",
        "tags-edit-logentry-submit": "Apply changes to {{PLURAL:$1|this log entry|$1 log entries}}",
 -      "tags-edit-success": "The changes were successfully applied.",
 +      "tags-edit-success": "The changes were applied.",
        "tags-edit-failure": "The changes could not be applied:\n$1",
        "tags-edit-nooldid-title": "Invalid target revision",
        "tags-edit-nooldid-text": "You have either not specified any target revision on which to perform this function, or the specified revision does not exist.",
        "htmlform-cloner-create": "Add more",
        "htmlform-cloner-delete": "Remove",
        "htmlform-cloner-required": "At least one value is required.",
 +      "htmlform-date-placeholder": "YYYY-MM-DD",
 +      "htmlform-time-placeholder": "HH:MM:SS",
 +      "htmlform-datetime-placeholder": "YYYY-MM-DD HH:MM:SS",
 +      "htmlform-date-invalid": "The value you specified is not a recognized date. Try using YYYY-MM-DD format.",
 +      "htmlform-time-invalid": "The value you specified is not a recognized time. Try using HH:MM:SS format.",
 +      "htmlform-datetime-invalid": "The value you specified is not a recognized date and time. Try using YYYY-MM-DD HH:MM:SS format.",
 +      "htmlform-date-toolow": "The value you specified is before the earliest allowed date of $1.",
 +      "htmlform-date-toohigh": "The value you specified is after the latest allowed date of $1.",
 +      "htmlform-time-toolow": "The value you specified is before the earliest allowed time of $1.",
 +      "htmlform-time-toohigh": "The value you specified is after the latest allowed time of $1.",
 +      "htmlform-datetime-toolow": "The value you specified is before the earliest allowed date and time of $1.",
 +      "htmlform-datetime-toohigh": "The value you specified is after the latest allowed date and time of $1.",
        "htmlform-title-badnamespace": "[[:$1]] is not in the \"{{ns:$2}}\" namespace.",
        "htmlform-title-not-creatable": "\"$1\" is not a creatable page title",
        "htmlform-title-not-exists": "$1 does not exist.",
        "htmlform-user-not-exists": "<strong>$1</strong> does not exist.",
        "htmlform-user-not-valid": "<strong>$1</strong> isn't a valid username.",
        "rawmessage": "$1",
 -      "sqlite-has-fts": "$1 with full-text search support",
 -      "sqlite-no-fts": "$1 without full-text search support",
        "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} page $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|restored}} page $3",
        "logentry-delete-event": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4",
        "revdelete-uname-unhid": "username unhidden",
        "revdelete-restricted": "applied restrictions to administrators",
        "revdelete-unrestricted": "removed restrictions for administrators",
 -      "logentry-block-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} with an expiry time of $5 $6",
 +      "logentry-block-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} with an expiration time of $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|unblocked}} {{GENDER:$4|$3}}",
 -      "logentry-block-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiry time of $5 $6",
 -      "logentry-suppress-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} with an expiry time of $5 $6",
 -      "logentry-suppress-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiry time of $5 $6",
 +      "logentry-block-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiration time of $5 $6",
 +      "logentry-suppress-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} with an expiration time of $5 $6",
 +      "logentry-suppress-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiration time of $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|imported}} $3 by file upload",
        "logentry-import-upload-details": "$1 {{GENDER:$2|imported}} $3 by file upload ($4 {{PLURAL:$4|revision|revisions}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|imported}} $3 from another wiki",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protected}} $3 $4 [cascading]",
        "logentry-protect-modify": "$1 {{GENDER:$2|changed}} protection level for $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|changed}} protection level for $3 $4 [cascading]",
 -      "logentry-rights-rights": "$1 {{GENDER:$2|changed}} group membership for $3 from $4 to $5",
 +      "logentry-rights-rights": "$1 {{GENDER:$2|changed}} group membership for {{GENDER:$6|$3}} from $4 to $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|changed}} group membership for $3",
        "logentry-rights-autopromote": "$1 was automatically {{GENDER:$2|promoted}} from $4 to $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|uploaded}} $3",
        "feedback-external-bug-report-button": "File a technical task",
        "feedback-dialog-title": "Submit feedback",
        "feedback-dialog-intro": "You can use the easy form below to submit your feedback. Your comment will be added to the page \"$1\", along with your username.",
 -      "feedback-error-title": "Error",
        "feedback-error1": "Error: Unrecognized result from API",
        "feedback-error2": "Error: Edit failed",
        "feedback-error3": "Error: No response from API",
        "feedback-thanks": "Thanks! Your feedback has been posted to the page \"[$2 $1]\".",
        "feedback-thanks-title": "Thank you!",
        "feedback-useragent": "User agent:",
 -      "searchsuggest-search": "Search",
 +      "searchsuggest-search": "Search {{SITENAME}}",
        "searchsuggest-containing": "containing...",
 +      "api-error-autoblocked": "Your IP address has been blocked automatically, because it was used by a blocked user.",
        "api-error-badaccess-groups": "You are not permitted to upload files to this wiki.",
        "api-error-badtoken": "Internal error: Bad token.",
 +      "api-error-blocked": "You have been blocked from editing.",
        "api-error-copyuploaddisabled": "Uploading by URL is disabled on this server.",
        "api-error-duplicate": "There {{PLURAL:$1|is another file|are some other files}} already on the site with the same content.",
        "api-error-duplicate-archive": "There {{PLURAL:$1|was another file|were some other files}} already on the site with the same content, but {{PLURAL:$1|it was|they were}} deleted.",
        "api-error-nomodule": "Internal error: No upload module set.",
        "api-error-ok-but-empty": "Internal error: No response from server.",
        "api-error-overwrite": "Overwriting an existing file is not allowed.",
 +      "api-error-ratelimited": "You're trying to upload more files in a short space of time than this wiki allows.\nPlease try again in a few minutes.",
        "api-error-stashfailed": "Internal error: Server failed to store temporary file.",
        "api-error-publishfailed": "Internal error: Server failed to publish temporary file.",
        "api-error-stasherror": "There was an error while uploading the file to stash.",
        "api-error-unknownerror": "Unknown error: \"$1\".",
        "api-error-uploaddisabled": "Uploading is disabled on this wiki.",
        "api-error-verification-error": "This file might be corrupt, or have the wrong extension.",
 +      "api-error-was-deleted": "A file of this name has been previously uploaded and subsequently deleted.",
        "duration-seconds": "$1 {{PLURAL:$1|second|seconds}}",
        "duration-minutes": "$1 {{PLURAL:$1|minute|minutes}}",
        "duration-hours": "$1 {{PLURAL:$1|hour|hours}}",
        "expand_templates_generate_xml": "Show XML parse tree",
        "expand_templates_generate_rawhtml": "Show raw HTML",
        "expand_templates_preview": "Preview",
 -      "expand_templates_preview_fail_html": "<em>Because {{SITENAME}} has raw HTML enabled and there was a loss of session data, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate preview attempt, please try again.</strong>\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
 +      "expand_templates_preview_fail_html": "<em>Because {{SITENAME}} has raw HTML enabled and there was a loss of session data, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate preview attempt, please try again.</strong>\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in, and check that your browser allows cookies from this site.",
        "expand_templates_preview_fail_html_anon": "<em>Because {{SITENAME}} has raw HTML enabled and you are not logged in, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate preview attempt, please [[Special:UserLogin|log in]] and try again.</strong>",
 -      "pagelanguage": "Page language selector",
 +      "expand_templates_input_missing": "You need to provide at least some input text.",
 +      "pagelanguage": "Change page language",
        "pagelang-name": "Page",
        "pagelang-language": "Language",
        "pagelang-use-default": "Use default language",
        "pagelang-select-lang": "Select language",
 +      "pagelang-submit": "Submit",
        "right-pagelang": "Change page language",
        "action-pagelang": "change the page language",
 -      "log-name-pagelang": "Change language log",
 +      "log-name-pagelang": "Language change log",
        "log-description-pagelang": "This is a log of changes in page languages.",
 -      "logentry-pagelang-pagelang": "$1 {{GENDER:$2|changed}} page language for $3 from $4 to $5.",
 +      "logentry-pagelang-pagelang": "$1 {{GENDER:$2|changed}} the language of $3 from $4 to $5",
        "default-skin-not-found": "Whoops! The default skin for your wiki, defined in <code dir=\"ltr\">$wgDefaultSkin</code> as <code>$1</code>, is not available.\n\nYour installation seems to include the following {{PLURAL:$4|skin|skins}}. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable {{PLURAL:$4|it|them and choose the default}}.\n\n$2\n\n; If you have just installed MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Using Git to download skins].\n: Doing this should not interfere with your git repository if you're a MediaWiki developer.\n\n; If you have just upgraded MediaWiki:\n: MediaWiki 1.24 and newer no longer automatically enables installed skins (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). You can paste the following {{PLURAL:$5|line|lines}} into <code>LocalSettings.php</code> to enable {{PLURAL:$5|the|all}} installed {{PLURAL:$5|skin|skins}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; If you have just modified <code>LocalSettings.php</code>:\n: Double-check the skin names for typos.",
        "default-skin-not-found-no-skins": "Whoops! The default skin for your wiki, defined in <code>$wgDefaultSkin</code> as <code>$1</code>, is not available.\n\nYou have no installed skins.\n\n; If you have just installed or upgraded MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. MediaWiki 1.24 and newer doesn't include any skins in the main repository. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Using Git to download skins].\n: Doing this should not interfere with your git repository if you're a MediaWiki developer. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable skins and choose the default.\n",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (enabled)",
 -      "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''disabled''')",
 +      "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>disabled</strong>)",
        "mediastatistics": "Media statistics",
        "mediastatistics-summary": "Statistics about uploaded file types. This only includes the most recent version of a file. Old or deleted versions of files are excluded.",
        "mediastatistics-nfiles": "$1 ($2%)",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
 +      "mediastatistics-bytespertype": "Total file size for this section: {{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%).",
 +      "mediastatistics-allbytes": "Total file size for all files: {{PLURAL:$1|$1 byte|$1 bytes}} ($2).",
        "mediastatistics-table-mimetype": "MIME type",
        "mediastatistics-table-extensions": "Possible extensions",
        "mediastatistics-table-count": "Number of files",
        "mediastatistics-header-text": "Textual",
        "mediastatistics-header-executable": "Executables",
        "mediastatistics-header-archive": "Compressed formats",
 +      "mediastatistics-header-total": "All files",
        "json-warn-trailing-comma": "$1 trailing {{PLURAL:$1|comma was|commas were}} removed from JSON",
        "json-error-unknown": "There was a problem with the JSON. Error: $1",
        "json-error-depth": "The maximum stack depth has been exceeded",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "Symbols",
        "special-characters-group-greek": "Greek",
 +      "special-characters-group-greekextended": "Greek extended",
        "special-characters-group-cyrillic": "Cyrillic",
        "special-characters-group-arabic": "Arabic",
        "special-characters-group-arabicextended": "Arabic extended",
        "mw-widgets-dateinput-placeholder-month": "YYYY-MM",
        "mw-widgets-titleinput-description-new-page": "page does not exist yet",
        "mw-widgets-titleinput-description-redirect": "redirect to $1",
 -      "api-error-blacklisted": "Please choose a different, descriptive title."
 +      "sessionmanager-tie": "Cannot combine multiple request authentication types: $1.",
 +      "sessionprovider-generic": "$1 sessions",
 +      "sessionprovider-mediawiki-session-cookiesessionprovider": "cookie-based sessions",
 +      "sessionprovider-nocookies": "Cookies may be disabled. Ensure you have cookies enabled and start again.",
 +      "randomrootpage": "Random root page",
 +      "log-action-filter-block": "Type of block:",
 +      "log-action-filter-contentmodel": "Type of contentmodel modification:",
 +      "log-action-filter-delete": "Type of deletion:",
 +      "log-action-filter-import": "Type of import:",
 +      "log-action-filter-managetags": "Type of tag management action:",
 +      "log-action-filter-move": "Type of move:",
 +      "log-action-filter-newusers": "Type of account creation:",
 +      "log-action-filter-patrol": "Type of patrol:",
 +      "log-action-filter-protect": "Type of protection:",
 +      "log-action-filter-rights": "Type of right change:",
 +      "log-action-filter-suppress": "Type of suppression:",
 +      "log-action-filter-upload": "Type of upload:",
 +      "log-action-filter-all": "All",
 +      "log-action-filter-block-block": "Block",
 +      "log-action-filter-block-reblock": "Block modification",
 +      "log-action-filter-block-unblock": "Unblock",
 +      "log-action-filter-contentmodel-change": "Change of Contentmodel",
 +      "log-action-filter-contentmodel-new": "Creation of page with non-standard Contentmodel",
 +      "log-action-filter-delete-delete": "Page deletion",
 +      "log-action-filter-delete-restore": "Page undeletion",
 +      "log-action-filter-delete-event": "Log deletion",
 +      "log-action-filter-delete-revision": "Revision deletion",
 +      "log-action-filter-import-interwiki": "Transwiki import",
 +      "log-action-filter-import-upload": "Import by XML upload",
 +      "log-action-filter-managetags-create": "Tag creation",
 +      "log-action-filter-managetags-delete": "Tag deletion",
 +      "log-action-filter-managetags-activate": "Tag activation",
 +      "log-action-filter-managetags-deactivate": "Tag deactivation",
 +      "log-action-filter-move-move": "Move without overwriting of redirects",
 +      "log-action-filter-move-move_redir": "Move with overwriting of redirects",
 +      "log-action-filter-newusers-create": "Creation by anonymous user",
 +      "log-action-filter-newusers-create2": "Creation by registered user",
 +      "log-action-filter-newusers-autocreate": "Automatic creation",
 +      "log-action-filter-newusers-byemail": "Creation with password sent by e-mail",
 +      "log-action-filter-patrol-patrol": "Manual patrol",
 +      "log-action-filter-patrol-autopatrol": "Automatic patrol",
 +      "log-action-filter-protect-protect": "Protection",
 +      "log-action-filter-protect-modify": "Protection modification",
 +      "log-action-filter-protect-unprotect": "Unprotection",
 +      "log-action-filter-protect-move_prot": "Moved protection",
 +      "log-action-filter-rights-rights": "Manual change",
 +      "log-action-filter-rights-autopromote": "Automatic change",
 +      "log-action-filter-suppress-event": "Log suppression",
 +      "log-action-filter-suppress-revision": "Revision suppression",
 +      "log-action-filter-suppress-delete": "Page suppression",
 +      "log-action-filter-suppress-block": "User suppression by block",
 +      "log-action-filter-suppress-reblock": "User suppression by reblock",
 +      "log-action-filter-upload-upload": "New upload",
 +      "log-action-filter-upload-overwrite": "Reupload",
 +      "authmanager-authn-not-in-progress": "Authentication is not in progress or session data has been lost. Please start again from the beginning.",
 +      "authmanager-authn-no-primary": "The supplied credentials could not be authenticated.",
 +      "authmanager-authn-no-local-user": "The supplied credentials are not associated with any user on this wiki.",
 +      "authmanager-authn-no-local-user-link": "The supplied credentials are valid but are not associated with any user on this wiki. Login in a different way, or create a new user, and you will have an option to link your previous credentials to that account.",
 +      "authmanager-authn-autocreate-failed": "Auto-creation of a local account failed: $1",
 +      "authmanager-change-not-supported": "The supplied credentials cannot be changed, as nothing would use them.",
 +      "authmanager-create-disabled": "Account creation is disabled.",
 +      "authmanager-create-from-login": "To create your account, please fill in the fields below.",
 +      "authmanager-create-not-in-progress": "Account creation is not in progress or session data has been lost. Please start again from the beginning.",
 +      "authmanager-create-no-primary": "The supplied credentials could not be used for account creation.",
 +      "authmanager-link-no-primary": "The supplied credentials could not be used for account linking.",
 +      "authmanager-link-not-in-progress": "Account linking is not in progress or session data has been lost. Please start again from the beginning.",
 +      "authmanager-authplugin-setpass-failed-title": "Password change failed",
 +      "authmanager-authplugin-setpass-failed-message": "The authentication plugin denied the password change.",
 +      "authmanager-authplugin-create-fail": "The authentication plugin denied the account creation.",
 +      "authmanager-authplugin-setpass-denied": "The authentication plugin does not allow changing passwords.",
 +      "authmanager-authplugin-setpass-bad-domain": "Invalid domain.",
 +      "authmanager-autocreate-noperm": "Automatic account creation is not allowed.",
 +      "authmanager-autocreate-exception": "Automatic account creation temporarily disabled due to prior errors.",
 +      "authmanager-userdoesnotexist": "User account \"$1\" is not registered.",
 +      "authmanager-userlogin-remembermypassword-help": "Whether the password should be remembered for longer than the length of the session.",
 +      "authmanager-username-help": "Username for authentication.",
 +      "authmanager-password-help": "Password for authentication.",
 +      "authmanager-domain-help": "Domain for external authentication.",
 +      "authmanager-retype-help": "Password again to confirm.",
 +      "authmanager-email-label": "Email",
 +      "authmanager-email-help": "Email address",
 +      "authmanager-realname-label": "Real name",
 +      "authmanager-realname-help": "Real name of the user",
 +      "authmanager-provider-password": "Password-based authentication",
 +      "authmanager-provider-password-domain": "Password- and domain-based authentication",
 +      "authmanager-account-password-domain": "$1@$2",
 +      "authmanager-provider-temporarypassword": "Temporary password",
 +      "authprovider-confirmlink-message": "Based on your recent login attempts, the following accounts can be linked to your wiki account. Linking them enables logging in via those accounts. Please select which ones should be linked.",
 +      "authprovider-confirmlink-option": "$1 ($2)",
 +      "authprovider-confirmlink-request-label": "Accounts which should be linked",
 +      "authprovider-confirmlink-request-help": "",
 +      "authprovider-confirmlink-success-line": "$1: Linked successfully.",
 +      "authprovider-confirmlink-failed-line": "$1: $2",
 +      "authprovider-confirmlink-failed": "Account linking did not fully succeed: $1",
 +      "authprovider-confirmlink-ok-help": "Continue after displaying linking failure messages.",
 +      "authprovider-resetpass-skip-label": "Skip",
 +      "authprovider-resetpass-skip-help": "Skip resetting the password.",
 +      "authform-nosession-login": "The authentication was successful, but your browser cannot \"remember\" being logged in.\n\n$1",
 +      "authform-nosession-signup": "The account was created, but your browser cannot \"remember\" being logged in.\n\n$1",
 +      "authform-newtoken": "Missing token. $1",
 +      "authform-notoken": "Missing token",
 +      "authform-wrongtoken": "Wrong token",
 +      "specialpage-securitylevel-not-allowed-title": "Not allowed",
 +      "specialpage-securitylevel-not-allowed": "Sorry, you are not allowed to use this page because your identity could not be verified.",
 +      "authpage-cannot-login": "Unable to start login.",
 +      "authpage-cannot-login-continue": "Unable to continue login. Your session most likely timed out.",
 +      "authpage-cannot-create": "Unable to start account creation.",
 +      "authpage-cannot-create-continue": "Unable to continue account creation. Your session most likely timed out.",
 +      "authpage-cannot-link": "Unable to start account linking.",
 +      "authpage-cannot-link-continue": "Unable to continue account linking. Your session most likely timed out.",
 +      "cannotauth-not-allowed-title": "Permission denied",
 +      "cannotauth-not-allowed": "You are not allowed to use this page",
 +      "changecredentials" : "Change credentials",
 +      "changecredentials-submit": "Change credentials",
 +      "changecredentials-invalidsubpage": "$1 is not a valid credential type.",
 +      "changecredentials-success": "Your credentials have been changed.",
 +      "removecredentials" : "Remove credentials",
 +      "removecredentials-submit": "Remove credentials",
 +      "removecredentials-invalidsubpage": "$1 is not a valid credential type.",
 +      "removecredentials-success": "Your credentials have been removed.",
 +      "credentialsform-provider": "Credentials type:",
 +      "credentialsform-account": "Account name:",
 +      "cannotlink-no-provider-title": "There are no linkable accounts",
 +      "cannotlink-no-provider": "There are no linkable accounts.",
 +      "linkaccounts": "Link accounts",
 +      "linkaccounts-success-text": "The account was linked.",
 +      "linkaccounts-submit": "Link accounts",
 +      "unlinkaccounts": "Unlink accounts",
 +      "unlinkaccounts-success": "The account was unlinked.",
 +      "authenticationdatachange-ignored": "The authentication data change was not handled. Maybe no provider was configured?",
 +      "userjsispublic": "Please note: JavaScript subpages should not contain confidential data as they are viewable by other users.",
 +      "usercssispublic": "Please note: CSS subpages should not contain confidential data as they are viewable by other users.",
 +      "restrictionsfield-badip": "Invalid IP address or range: $1",
 +      "restrictionsfield-label": "Allowed IP ranges:",
 +      "restrictionsfield-help": "One IP address or CIDR range per line. To enable everything, use<br><code>0.0.0.0/0</code><br><code>::/0</code>",
 +      "edit-error-short": "Error: $1",
 +      "edit-error-long": "Errors:\n\n$1"
  }
diff --combined languages/i18n/qqq.json
                        "J. 'mach' wust",
                        "Ciencia Al Poder",
                        "Aursani",
 -                      "Robin van der Vliet"
 +                      "Robin van der Vliet",
 +                      "Conquistador",
 +                      "Frigory",
 +                      "Psychoslave",
 +                      "Guycn2",
 +                      "2axterix2",
 +                      "Ата",
 +                      "Matěj Suchánek",
 +                      "Chaduvari",
 +                      "MarcoAurelio"
                ]
        },
        "sidebar": "{{notranslate}}",
        "tog-watchdefault": "[[Special:Preferences]], tab 'Watchlist'. Offers user to add edited pages to watchlist. {{Gender}}",
        "tog-watchmoves": "[[Special:Preferences]], tab 'Watchlist'. Offers user to add moved pages to watchlist. {{Gender}}",
        "tog-watchdeletion": "[[Special:Preferences]], tab 'Watchlist'. Offers user to add deleted pages to watchlist. {{Gender}}",
 +      "tog-watchuploads": "[[Special:Preferences]], tab 'Watchlist'. Offers user to add their uploaded files to watchlist. {{Gender}}",
        "tog-watchrollback": "[[Special:Preferences]], tab 'Watchlist'. Offers user to add pages where the user has rollbacked an edit to watchlist. {{Gender}}\n\nSee also {{msg-mw|tog-watchdefault}}, {{msg-mw|tog-watchcreations}}.",
        "tog-minordefault": "[[Special:Preferences]], tab 'Edit'. Offers user to mark all edits minor by default.  {{Gender}}",
        "tog-previewontop": "Toggle option used in [[Special:Preferences]]. {{Gender}}",
        "october-date": "A date in the Gregorian month of October. $1 is the numerical date, for example \"23\".",
        "november-date": "A date in the Gregorian month of November. $1 is the numerical date, for example \"23\".\n{{Identical|November}}",
        "december-date": "A date in the Gregorian month of December. $1 is the numerical date, for example \"23\".",
 +      "period-am": "Text indicating the first period of the day when using a 12-hour calendar.",
 +      "period-pm": "Text indicating the second period of the day when using a 12-hour calendar.",
        "pagecategories": "Used in the categories section of pages.\n\nFollowed by a colon and a list of categories.\n\nParameters:\n* $1 - number of categories\n{{Identical|Category}}",
        "pagecategorieslink": "{{notranslate}}",
        "category_header": "In category description page. Parameters:\n* $1 - category name\nSee also:\n* {{msg-mw|Category-media-header}}",
        "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.\n\nParameters:\n* $1 - number of pages shown",
        "category-file-count": "This message is displayed at the top of a category page showing the number of pages in the category.\n\nParameters:\n* $1 – number of files shown\n* $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.\n\nParameters:\n* $1 - number of files shown",
 -      "listingcontinuesabbrev": "Shown in contiuation of each first letter group. This message follows the first letter.\n\nSee http://test.wikipedia.org/wiki/Category:Test_ko?uselang={{SUBPAGENAME}}, for example.",
 +      "listingcontinuesabbrev": "Shown in continuation of each first letter group. This message follows the first letter.\n\nSee http://test.wikipedia.org/wiki/Category:Test_ko?uselang={{SUBPAGENAME}}, for example.",
        "index-category": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages with the <nowiki>__INDEX__</nowiki> behavior switch are listed.\n\nFor description of this behavior switch see [[mw:Special:MyLanguage/Help:Magic_words#Behavior_switches|MediaWiki]].\n\nSee also:\n* {{msg-mw|Index-category-desc}}",
        "noindex-category": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages with the <nowiki>__NOINDEX__</nowiki> behavior switch are listed.\n\nFor description of this behavior switch see [[mw:Special:MyLanguage/Help:Magic_words#Behavior_switches|MediaWiki]].\n\nSee also:\n* {{msg-mw|Noindex-category-desc}}",
        "broken-file-category": "Name of [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that embed files that do not exist (\"broken images\") are listed.\n\nSee also:\n* {{msg-mw|Broken-file-category-desc}}",
        "categoryviewer-pagedlinks": "{{Optional}}\nThe pagination links in category viewer. Parameters:\n* $1 - the previous link, uses {{msg-mw|Prevn}}\n* $2 - the next link, uses {{msg-mw|Nextn}}",
 +      "category-header-numerals": "{{Optional}}\nA header for all pages whose titles start with a number. This is used on category pages. This should only be translated if your language uses a different method to indicate a range of numbers (other than a dash).\n* $1 – 0 (or localized equivalent)\n* $2 – 9 (or localized equivalent)",
        "about": "{{Identical|About}}",
        "article": "A 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For technical definition of 'content namespaces' see [[mw:Manual:Using_custom_namespaces#Content_namespaces|MediaWiki]].\n\nPossible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.\n\n{{Identical|Content page}}",
        "newwindow": "Below the edit form, next to \"{{msg-mw|Edithelp}}\".",
        "navigation": "This is shown as a section header in the sidebar of most skins.\n\n{{Identical|Navigation}}",
        "and": "The translation for \"and\" appears in the [[Special:Version]] page, between the last two items of a list. If a comma is needed, add it at the beginning without a gap between it and the \"&\". &amp;#32; is a blank space, one character long. Please leave it as it is.\n\nThis can also appear in the credits page if the credits feature is enabled,for example [{{canonicalurl:Support|action=credits}} the credits of the support page]. (To view any credits page type <nowiki>&action=credits</nowiki> at the end of any URL in the address bar.)\n{{Identical|And}}",
        "qbfind": "Alternative for \"search\" as used in Cologne Blue skin.\n{{Identical|Find}}",
 -      "qbbrowse": "Heading in sidebar menu in CologneBlue skin as seen in http://i.imgur.com/I08Y3jW.png\n{{Identical|Browse}}",
 +      "qbbrowse": "Heading in sidebar menu in CologneBlue skin as seen in [[File:CologneBlue sidebar qqx.png]]\n{{Identical|Browse}}",
        "qbedit": "Heading in sidebar menu in CologneBlue skin as seen in http://i.imgur.com/I08Y3jW.png\n{{Identical|Edit}}",
        "qbpageoptions": "Heading in sidebar menu in CologneBlue skin as seen in http://i.imgur.com/I08Y3jW.png\n{{Identical|This page}}",
        "qbmyoptions": "Heading in the Cologne Blue skin user menu containing links to user (talk) page, preferences, watchlist, etc.\n{{Identical|My pages}}",
        "tagline": "{{doc-important|Do not change <code><nowiki>{{SITENAME}}</nowiki></code>.}}\nUsed to identify the source of copied information.",
        "help": "General text (noun) used in the sidebar (by default).\n\nSee also {{msg-mw|Helppage}} and {{msg-mw|Edithelp}}.\n\nSee also:\n* {{msg-mw|Help}}\n* {{msg-mw|Accesskey-n-help}}\n* {{msg-mw|Tooltip-n-help}}\n{{Identical|Help}}",
        "search": "{{doc-special|Search}}\nNoun. Text of menu section shown on every page of the wiki above the search form.\n\nSee also:\n* {{msg-mw|Search}}\n* {{msg-mw|Accesskey-search}}\n* {{msg-mw|Tooltip-search}}\n{{Identical|Search}}",
 +      "search-ignored-headings": "Headings that will be ignored by search. You can translate the text, including \"Leave this line exactly as it is\". Some lines of this messages have one (1) leading space.",
        "searchbutton": "The button you can see in the sidebar, below the search input box. The \"Go\" button is {{msg-mw|Searcharticle}}.\n{{Identical|Search}}",
        "go": "See also:\n* {{msg-mw|Go}}\n* {{msg-mw|Accesskey-search-go}}\n* {{msg-mw|Tooltip-search-go}}\n{{Identical|Go}}",
        "searcharticle": "Button description in the search menu displayed on every page. The \"Search\" button is {{msg-mw|Searchbutton}}.\n{{Identical|Go}}",
        "talk": "Used as display name for the tab to all {{msg-mw|Talk}} pages. These pages accompany all content pages and can be used for discussing the content page. Example: [[Talk:Example]].\n\nSee also:\n* {{msg-mw|Talk}}\n* {{msg-mw|Accesskey-ca-talk}}\n* {{msg-mw|Tooltip-ca-talk}}\n{{Identical|Discussion}}",
        "views": "Subtitle for the list of available views, for the current page. In \"monobook\" skin the list of views are shown as tabs, so this sub-title is not shown. For an example, see [{{canonicalurl:Main_Page|useskin=simple}} Main Page using simple skin].\n\n'''Note:''' This is \"views\" as in \"appearances\"/\"representations\", '''not''' as in \"visits\"/\"accesses\".\n{{Identical|View}}",
        "toolbox": "The title of the toolbox below the search menu.\n{{Identical|Tool}}",
 +      "tool-link-userrights": "Link to [[Special:UserRights]] (user rights management) in the sidebar toolbox.\n\nParameters:\n* $1 - Name of user for the user group management (usable for GENDER)",
 +      "tool-link-emailuser": "Link to [[Special:EmailUser]] (email user tool) in the sidebar toolbox.\n\nParameters:\n* $1 - Name of user who would receive the email\n\nSee also:\n* {{msg-mw|Emailuser-title-target}}",
        "userpage": "Used in user talk pages as the text of the link to the user page, with the Cologne Blue skin.",
        "projectpage": "Used as link text in Talk page of project page with the Cologne Blue skin.",
        "imagepage": "Used as link text in Talk page of file page.",
        "helppage": "{{ignored}}\nThe link destination used by default in the sidebar, and in {{msg-mw|Noarticletext}}.",
        "helppage-top-gethelp": "Link to some MediaWiki.org help page or tutorial.\n{{Identical|Help}}",
        "mainpage": "Defines the link and display name of the main page of the wiki. Shown as the top link in the navigation part of the interface. Please do not change it too often, that could break things!\n\nSee also:\n* {{msg-mw|Mainpage}}\n* {{msg-mw|Accesskey-n-mainpage}}\n* {{msg-mw|Tooltip-n-mainpage}}\n{{Identical|Main page}}",
 -      "mainpage-description": "The same as {{msg-mw|mainpage}}, used as link text on [[MediaWiki:Sidebar]].\n\nThis makes it possible to the change the link destination (the message \"mainpage\") without changing the link text or without disabling translations.\n\nSee also:\n* {{msg-mw|Mainpage-description}}\n* {{msg-mw|Accesskey-n-mainpage-description}}\n* {{msg-mw|Tooltip-n-mainpage-description}}\n{{Identical|Main page}}",
 +      "mainpage-description": "The same as {{msg-mw|mainpage}}, used as link text on [[MediaWiki:Sidebar]].\n\nThis makes it possible to change the link destination (the message \"mainpage\") without changing the link text or without disabling translations.\n\nSee also:\n* {{msg-mw|Mainpage-description}}\n* {{msg-mw|Accesskey-n-mainpage-description}}\n* {{msg-mw|Tooltip-n-mainpage-description}}\n{{Identical|Main page}}",
        "policy-url": "{{doc-important|Do not change the <code>Project:</code> part.}}\nThe URL of the project page describing the policies of the wiki.\n\nThis is shown below every page (the left link).",
        "portal": "Display name for the 'Community portal', shown in the sidebar menu of all pages. The target page is meant to be a portal for users where useful links are to be found about the wiki's operation.\n\nSee also:\n* {{msg-mw|Portal}}\n* {{msg-mw|Portal-url}}\n* {{msg-mw|Accesskey-n-portal}}\n* {{msg-mw|Tooltip-n-portal}}",
        "portal-url": "{{doc-important|Do not change the <code>Project:</code> part.}}\nDescription: The URL of the community portal. This is shown in the sidebar by default (removed on translatewiki.net).\n\nSee also:\n* {{msg-mw|Portal}}\n* {{msg-mw|Portal-url}}\n* {{msg-mw|Accesskey-n-portal}}\n* {{msg-mw|Tooltip-n-portal}}",
        "readonly_lag": "Error message displayed when the database is locked.",
        "nonwrite-api-promise-error": "Error message displayed when the 'Promise-Non-Write-API-Action' HTTP header is misused.",
        "internalerror": "{{Identical|Internal error}}",
 -      "internalerror_info": "Parameters:\n* $1 - error message",
 +      "internalerror_info": "Parameters:\n* $1 - error message\n{{Identical|Internal error}}",
        "internalerror-fatal-exception": "Error message displayed by MediaWiki itself when the request failed, inside an error box which also contains a code, a timestamp and a colon before this message.\nParameters:\n* $1 - proper name of the kind of error\n* $2 - alphanumeric code identifying the error in the server logs\n* $3 - URL which resulted in the error\n$2 and $3 are not used by default and only available for wiki customisations, because they are useful for communication to the wiki system administrator.",
        "filecopyerror": "Parameters:\n* $1 - source file name\n* $2 - destination file name",
        "filerenameerror": "Parameters:\n* $1 - old file name\n* $2 - new file name",
        "virus-scanfailed": "Used as error message. \"scan\" stands for \"virus scan\". Parameters:\n* $1 - exit code of virus scanner",
        "virus-unknownscanner": "Used as error message. This message is followed by the virus scanner name.",
        "logouttext": "Log out message. Parameters:\n* $1 - (Unused) an URL to [[Special:Userlogin]] containing <code>returnto</code> and <code>returntoquery</code> parameters",
 +      "cannotlogoutnow-title": "Error page title shown when logging out is not possible.",
 +      "cannotlogoutnow-text": "Error page text shown when logging out is not possible. Parameters:\n* $1 - Session type in use that makes it not possible to log out, from a message like {{msg-mw|sessionprovider-mediawiki-session-cookiesessionprovider}}.",
        "welcomeuser": "Text for a welcome heading that users see after registering a user account.\n\nParameters:\n* $1 - the username of the new user. See [[phab:T44215]]",
        "welcomecreation-msg": "A welcome message users see after registering a user account, following a welcomeuser heading.\n\nParameters:\n* $1 - (Unused) the username of the new user.\n\nReplaces [[MediaWiki:welcomecreation|welcomecreation]] in 1.21wmf5, see [[phab:T44215]]",
        "yourname": "Since 1.22 no longer used in core, but used by some extensions.\n{{Identical|Username}}",
        "yourpasswordagain": "Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED",
        "createacct-yourpasswordagain": "In create account form, label for field to re-enter password\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n{{Identical|Confirm password}}",
        "createacct-yourpasswordagain-ph": "Placeholder text in create account form for re-enter password field.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
 -      "remembermypassword": "Used as checkbox label on [[Special:ChangePassword]]. Parameters:\n* $1 - number of days\n{{Identical|Remember my login on this computer}}",
        "userlogin-remembermypassword": "The text for a check box in [[Special:UserLogin]].",
        "userlogin-signwithsecure": "Text of link to HTTPS login form.\n\nSee example: [[Special:UserLogin]]",
 +      "cannotlogin-title": "Error page title shown when logging in is not possible. This is a catch-all when a more specific reason is not available.",
 +      "cannotlogin-text": "Error page text shown when logging in is not possible. This is a catch-all when a more specific reason is not available.",
 +      "cannotloginnow-title": "Error page title shown when logging in is not possible becuse the session provider in use does the user authentication itself.",
 +      "cannotloginnow-text": "Error page text shown when logging in is not possible becuse the session provider in use does the user authentication itself. Parameters:\n* $1 - Session type in use that makes it not possible to log in, from a message like {{msg-mw|sessionprovider-mediawiki-session-cookiesessionprovider}}.",
 +      "cannotcreateaccount-title": "Error page title shown when manual account creation is not possible. That probably means the wiki supports some other account creation method, e.g. autocreation by the session provider. (When account creation is possible but the current user does not have permission to do it, a more specific error message is displayed.)",
 +      "cannotcreateaccount-text": "Error page text shown when manual account creation is not possible. That probably means the wiki supports some other account creation method, e.g. autocreation by the session provider. (When account creation is possible but the current user does not have permission to do it, a more specific error message is displayed.)",
        "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": "{{Doc-special|UserLogin|unlisted=1}}\n{{Identical|Log in}}",
 +      "login-security": "Used as the title of the login page when the user is already logged in but sent to reauthenticate before getting access to a feature with elevated security.",
        "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.\n{{Identical|Log in / create account}}",
        "loginprompt": "{{ignored}}",
        "userlogin": "Since 1.22 no longer used in core, but may still be used by extensions. DEPRECATED\n\n{{Identical|Log in / create account}}",
        "helplogin-url": "{{doc-important|Do not translate the namespace name <code>Help</code>.}}\nUsed as name of the page that provides information about logging into the wiki.\n\nUsed as a link target in the message {{msg-mw|Userlogin-helplink}}.",
        "userlogin-helplink2": "Label for a link to login help.\n\nSee example: [[Special:UserLogin]]\n\nSee also:\n* {{msg-mw|Helplogin-url}}",
        "userlogin-loggedin": "Used as warning on [[Special:UserLogin]] when the current user is already logged in.\n\nFollowed by the Login form.\n\nSee example: [[Special:UserLogin]].\n\nParameters:\n* $1 - user name (used for display and for gender support)\nSee also:\n* {{msg-mw|Mobile-frontend-userlogin-loggedin-register}}",
 +      "userlogin-reauth": "Used as an explanatory message on [[Special:UserLogin]] when the user is redirected there to log in again when trying to use a security-sensitive page.\n\nParameters:\n* $1 - user name (used for display and for gender support)",
        "userlogin-createanother": "Used as label for the button on [[Special:UserLogin]] shown when the current user is already logged in.\n{{Identical|Create another account}}",
        "createacct-emailrequired": "Label in create account form for email field when it is required.\n\nSee also:\n* {{msg-mw|Createacct-emailoptional}}\n{{Identical|E-mail address}}",
        "createacct-emailoptional": "Label in vertical-layout create account form for email field when it is optional.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n\nSee also:\n* {{msg-mw|Createacct-emailrequired}}",
        "createacct-email-ph": "Placeholder in vertical-layout create account form for email field.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
        "createacct-another-email-ph": "Placeholder in create account form for email field when one user creates an account for another.",
 -      "createaccountmail": "The label for the checkbox for creating a new account and sending the new password to the specified email address directly, as used on [[Special:UserLogin/signup]] when one user creates an account for another (if creating accounts by email is allowed).\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
 +      "createaccountmail": "The label for the checkbox for creating a new account and sending the new password to the specified email address directly, as used on [[Special:CreateAccount]] when one user creates an account for another (if creating accounts by email is allowed).\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
 +      "createaccountmail-help": "Account creation API help message for the <code>mailpassword</code> parameter.",
        "createacct-realname": "In vertical-layout create account form, label for field to enter optional real name.",
        "createaccountreason": "Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED\n\n{{Identical|Reason}}",
        "createacct-reason": "In create account form, label for field to enter reason to create an account when already logged-in.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n{{Identical|Reason}}",
        "createacct-reason-ph": "Placeholder in vertical-layout create account form for reason field.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
 +      "createacct-reason-help": "Account creation API help message for the <code>reason</code> parameter.",
        "createacct-imgcaptcha-help": "{{Optional}} Optional help text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.\n\nBlank by default.",
        "createacct-submit": "Submit button on vertical-layout create account form.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
 -      "createacct-another-submit": "Submit button of  [[Special:UserLogin/signup]] ([[Special:CreateAccount]]) when accessed by a registered user.\n\nThe original means \"create an account in addition to the one you already have\"; sometimes, but not always, it means you are going to \"Create the account on behalf of somebody else\" or \"Create account for another\".\n{{Identical|Create another account}}",
 +      "createacct-another-submit": "Submit button of  [[Special:CreateAccount]] when accessed by a registered user.\n\nThe original means \"create an account in addition to the one you already have\"; sometimes, but not always, it means you are going to \"Create the account on behalf of somebody else\" or \"Create account for another\".\n{{Identical|Create another account}}",
 +      "createacct-continue-submit": "Submit button on create account form in second and later steps of a multistep account creation.",
 +      "createacct-another-continue-submit": "Submit button on create account form in second and later steps of a multistep account creation, when done by a registered user.",
        "createacct-benefit-heading": "In vertical-layout create account form, the heading for the section describing the benefits of creating an account. See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n\nIf in your language you need to know the gender of the name for the wiki (which is the subject of the English sentence), please adapt the sentence as much as you need for your translation to fit.",
        "createacct-benefit-icon1": "In vertical-layout create account form, the CSS style for the div next to the first benefit. If you replace this you will need probably need to adjust CSS.\n\nUsed as a CSS class name.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]",
        "createacct-benefit-head1": "In vertical-layout create account form, the text in the heading for the first benefit. Do not edit the magic word; if you replace it you will probably need to adjust CSS.\n\nFollowed by the message {{msg-mw|Createacct-benefit-body1}}.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]",
        "nocookieslogin": "This message is displayed when someone tried to login, but the browser doesn't accept cookies.",
        "nocookiesfornew": "This message is displayed when the user tried to create a new account, but it failed the cross-site request forgery (CSRF) check. It could be blocking an attack, but most likely, the browser isn't  accepting cookies.",
        "nocookiesforlogin": "{{optional}}\nThis message is displayed when someone tried to login and the CSRF failed (most likely, the browser doesn't accept cookies).\n\nDefault:\n* {{msg-mw|Nocookieslogin}}",
 +      "createacct-loginerror": "This message is displayed after a successful registration when there is a server-side error with logging the user in. This is not expected to happen.",
        "noname": "Error message.",
 -      "loginsuccesstitle": "The title of the page saying that you are logged in. The content of the page is the message {{msg-mw|Loginsuccess}}.\n{{Identical|Login successful}}",
 +      "loginsuccesstitle": "The title of the page saying that you are logged in. The content of the page is the message {{msg-mw|Loginsuccess}}.\n{{Identical|Log in}}",
        "loginsuccess": "The content of the page saying that you are logged in. The title of the page is {{msg-mw|Loginsuccesstitle}}.\n\nParameters:\n* $1 - the name of the logged in user\n{{Gender}}",
        "nosuchuser": "Displayed when trying to log in with an unexisting username.\n\nWhen you are not allowed to create an account, the following message is displayed:\n* {{msg-mw|Nosuchusershort}}\nParameters:\n* $1 - username",
        "nosuchusershort": "Displayed when trying to log in with a non-existent username.\n\nThis message is only shown when you can't create an account, otherwise the following message is displayed:\n* {{msg-mw|Nosuchusershort}}\n\nParameters:\n* $1 - username",
        "signupend": "{{notranslate}}",
        "signupend-https": "{{notranslate}}",
        "mailerror": "Used as error message in sending confirmation mail to user. Parameters:\n* $1 - new mail address",
 -      "acct_creation_throttle_hit": "Error message at [[Special:CreateAccount]].\n\n\"in the last day\" precisely means: during the lasts 86400 seconds (24 hours) ending right now.\n\nParameters:\n* $1 - number of accounts",
 +      "acct_creation_throttle_hit": "Error message at [[Special:CreateAccount]].\n\nParameters:\n* $1 - number of accounts\n* $2 - period",
        "emailauthenticated": "In user preferences ([[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}) and on [[Special:ConfirmEmail]].\n\nParameters:\n* $1 - (Unused) obsolete, date and time\n* $2 - date\n* $3 - time",
        "emailnotauthenticated": "Message in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.\n\nIt appears after saving your email address but before you confirm it.",
        "noemailprefs": "Message appearing in the \"Email options\" section of the \"User profile\" page in [[Special:Preferences|Preferences]], when no user email address has been entered.",
        "createacct-another-realname-tip": "{{doc-singularthey}}\nUsed on the account creation form when creating another user's account. Similar to {{msg-mw|prefs-help-realname}}.\n{{Identical|Real name attribution}}",
        "pt-login": "Shown 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).\n{{Identical|Log in}}",
        "pt-login-button": "Shown as the caption of the button at [[Special:UserLogin]].\n{{Identical|Log in}}",
 +      "pt-login-continue-button": "Shown as the caption of the button at [[Special:UserLogin]] in second and later steps of a multipage login.",
        "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.\n{{Identical|Create account}}",
        "pt-userlogout": "{{Doc-actionlink}}\n{{Identical|Log out}}",
        "pear-mail-error": "{{notranslate}}\nParameters:\n* $1 - error message which is returned by PEAR mailer.",
        "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.\n\nThe user has to wait a certain time before trying to log in again.\n\nParameters:\n* $1 - the time to wait before the next login attempt. Automatically formatted using the following duration messages:\n** {{msg-mw|Duration-millennia}}\n** {{msg-mw|Duration-centuries}}\n** {{msg-mw|Duration-decades}}\n** {{msg-mw|Duration-years}}\n** {{msg-mw|Duration-weeks}}\n** {{msg-mw|Duration-days}}\n** {{msg-mw|Duration-hours}}\n** {{msg-mw|Duration-minutes}}\n** {{msg-mw|Duration-seconds}}\n\nThis is a protection against robots trying to find the password by trying lots of them.\nThe number of attempts and waiting time are configured via [[mw:Manual:$wgPasswordAttemptThrottle|$wgPasswordAttemptThrottle]].\nThis message is used in html.\n\nSee also:\n* {{msg-mw|Changeemail-throttled}}",
 +      "botpasswords": "The name of the special page [[Special:BotPasswords]].",
 +      "botpasswords-summary": "Explanatory text shown at the top of [[Special:BotPasswords]].",
 +      "botpasswords-disabled": "Error message displayed when bot passwords are not enabled (<code>$wgEnableBotPasswords = false</code>).",
 +      "botpasswords-no-central-id": "Error message displayed when the current user does not have a central ID (e.g. they're not logged in or not attached in something like CentralAuth).",
 +      "botpasswords-existing": "Form section label for the part of the form listing the user's existing bot passwords.",
 +      "botpasswords-createnew": "Form section label for the part of the form related to creating a new bot password.",
 +      "botpasswords-editexisting": "Form section label for the part of the form related to editing an existing bot password.",
 +      "botpasswords-label-appid": "Form field label for the \"bot name\", internally known as the \"application ID\".",
 +      "botpasswords-label-create": "Button label for the button to create a new bot password.\n{{Identical|Create}}",
 +      "botpasswords-label-update": "Button label for the button to save changes to a bot password.\n{{Identical|Update}}",
 +      "botpasswords-label-cancel": "Button label for a button to cancel the creation or edit of a bot password.\n{{Identical|Cancel}}",
 +      "botpasswords-label-delete": "Button label for the button to delete a bot password.\n{{Identical|Delete}}",
 +      "botpasswords-label-resetpassword": "Label for the checkbox to reset the actual password for the current bot password.",
 +      "botpasswords-label-grants": "Label for the checkmatrix for selecting grants allowed when the bot password is used.\n\ngrant: Vidu http://komputeko.net/index_en.php?vorto=grant sed \"konced/i\" egale funkcius.",
 +      "botpasswords-help-grants": "Help text for the grant selection checkmatrix.\n\nIdentical:\n* {{msg-mw|Mwoauth-consumer-grantshelp}}",
 +      "botpasswords-label-grants-column": "Label for the checkbox column on the checkmatrix for selecting grants allowed when the bot password is used.",
 +      "botpasswords-bad-appid": "Used as an error message when an invalid \"bot name\" is supplied on [[Special:BotPasswords]]. Parameters:\n* $1 - The rejected bot name.",
 +      "botpasswords-insert-failed": "Error message when saving a new bot password failed. It's likely that the failure was because the user resubmitted the form after a previous successful save. Parameters:\n* $1 - Bot name",
 +      "botpasswords-update-failed": "Error message when saving changes to an existing bot password failed. It's likely that the failure was because the user deleted the bot password in another browser window. Parameters:\n* $1 - Bot name",
 +      "botpasswords-created-title": "Title of the success page when a new bot password is created.",
 +      "botpasswords-created-body": "Success message when a new bot password is created. Parameters:\n* $1 - Bot name\n* $2 - User name",
 +      "botpasswords-updated-title": "Title of the success page when a bot password is updated.",
 +      "botpasswords-updated-body": "Success message when a bot password is updated. Parameters:\n* $1 - Bot name\n* $2 - User name",
 +      "botpasswords-deleted-title": "Title of the success page when a bot password is deleted.",
 +      "botpasswords-deleted-body": "Success message when a bot password is deleted. Parameters:\n* $1 - Bot name\n* $2 - User name",
 +      "botpasswords-newpassword": "Success message to display the new password when a bot password is created or updated. Parameters:\n* $1 - User name to be used for login.\n* $2 - Password to be used for login.\n* $3, $4 - an alternative version of the user name and password, respectively, which is less preferred, but more compatible with old bots.",
 +      "botpasswords-no-provider": "Error message when login is attempted but the BotPasswordsSessionProvider is not included in <code>$wgSessionProviders</code>.",
 +      "botpasswords-restriction-failed": "Error message when login is rejected because the configured restrictions were not satisfied.",
 +      "botpasswords-invalid-name": "Error message when a username lacking the separator character is passed to BotPassword. Parameters:\n* $1 - The separator character.",
 +      "botpasswords-not-exist": "Error message when a username exists but does not a bot password for the given \"bot name\". Parameters:\n* $1 - username\n* $2 - bot name",
        "resetpass_forbidden": "Used as error message in changing password. Maybe the external auth plugin won't allow local password changes.",
 +      "resetpass_forbidden-reason": "Like {{msg-mw|resetpass_forbidden}} but the auth provider gave a reason.\n\nParameters:\n* $1 - reason given by auth provider",
        "resetpass-no-info": "Error message for [[Special:ChangePassword]].\n\nParameters:\n* $1 (unused) - a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description",
        "resetpass-submit-loggedin": "Button on [[Special:ResetPass]] to submit new password.\n\n{{Identical|Change password}}",
        "resetpass-submit-cancel": "Used on [[Special:ResetPass]].\n{{Identical|Cancel}}",
        "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 warning message shown on [[Special:ChangePassword]] when a user needs to reset their password, but they are not prevented from logging in at this time",
 -      "resetpass-validity-soft": "Warning message shown on [[Special:ChangePassword]] when a user needs to reset their password, because their password is not valid.\n\nRefers to {{msg-mw|Resetpass-submit-cancel}}.\n\nParameters:\n* $1 - error message",
 +      "resetpass-validity-soft": "Warning message shown on [[Special:ChangePassword]] when a user needs to reset their password, because their password is not valid.\n\nRefers to {{msg-mw|authprovider-resetpass-skip-label}}.\n\nParameters:\n* $1 - error message",
        "passwordreset": "Title of [[Special:PasswordReset]].\n{{Identical|Reset password}}",
        "passwordreset-text-one": "Text on [[Special:PasswordReset]] that appears when there is only one way of resetting the password.\n\n{{msg-mw|Passwordreset-text-many}} will be used, when there are multiple ways of resetting the password.",
        "passwordreset-text-many": "Text on [[Special:PasswordReset]] that appears when there are multiple ways of resetting the password.\n\nParameters:\n* $1 - the number of password reset routes\n\n{{msg-mw|Passwordreset-text-one}} will be used, when there is only one way of resetting the password.",
        "passwordreset-emailtext-ip": "Be consistent with {{msg-mw|Passwordreset-emailtext-user}}.\n\nParameters:\n* $1 - an IP address\n* $2 - message {{msg-mw|Passwordreset-emailelement}} repeated $3 times\n* $3 - the number of repetitions in $2\n* $4 - base URL of the wiki\n* $5 - number of days",
        "passwordreset-emailtext-user": "Be consistent with {{msg-mw|Passwordreset-emailtext-ip}}.\n\nParameters:\n* $1 - a user name, no GENDER suport.\n* $2 - message {{msg-mw|Passwordreset-emailelement|notext=1}} repeated $3 times\n* $3 - the number of repetitions in $2\n* $4 - base URL of the wiki\n* $5 - number of days",
        "passwordreset-emailelement": "This is a body of a password reset email to allow them into the system with a new password. Parameters:\n* $1 - the user's login name. This parameter can be used for GENDER.\n* $2 - the temporary password given by the system",
 -      "passwordreset-emailsent": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
 -      "passwordreset-emailsent-capture": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsent}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
 -      "passwordreset-emailerror-capture": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\nSee also:\n* {{msg-mw|Passwordreset-emailsent}}\n* {{msg-mw|Passwordreset-emailsent-capture}}",
 +      "passwordreset-emailsentemail": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
 +      "passwordreset-emailsentusername": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
 +      "passwordreset-emailsent-capture2": "Used in [[Special:PasswordReset]].\n\nParameters:\n* $1 - number of accounts notified\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {{msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
 +      "passwordreset-emailerror-capture2": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\n* $3 - number of accounts notified\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {{msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
 +      "passwordreset-nocaller": "Shown when a password reset was requested but the caller was not provided. This is an internal error.",
 +      "passwordreset-nosuchcaller": "Shown when a password reset was requested but the username of the caller could not be resolved to a user. This is an internal error.\n\nParameters:\n* $1 - username of the caller",
 +      "passwordreset-ignored": "Shown when password reset was unsuccessful due to configuration problems.",
 +      "passwordreset-invalideamil": "Returned when the email address is syntatically invalid.",
 +      "passwordreset-nodata": "Returned when no data was provided.",
        "changeemail": "Title of [[Special:ChangeEmail|special page]]. This page also allows removing the user's email address.",
        "changeemail-summary": "{{ignored}}",
        "changeemail-header": "Text of [[Special:ChangeEmail]].",
 -      "changeemail-passwordrequired": "Shown on [[Special:ChangeEmail]] if users are required to enter their password to change their email address..",
        "changeemail-no-info": "Error message for [[Special:ChangeEmail]].\n\nParameters:\n* $1 (unused) - a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description",
        "changeemail-oldemail": "Label for e-mail address field in [[Special:ChangeEmail]].",
        "changeemail-newemail": "Label for e-mail address field in [[Special:ChangeEmail]]. See also {{msg-mw|changeemail-newemail-help}}",
        "image_tip": "This is the text that appears when you hover the mouse over the sixth (middle) button on the edit toolbar.\n\n{{Identical|Embedded file}}",
        "media_sample": "{{optional}}\n{{Identical|Example}}",
        "media_tip": "This is the text that appears when you hover the mouse over the fifth button from the right in the edit toolbar.\n{{Identical|File link}}",
 +      "sig-text": "{{notranslate}} This is the text that appears when you click on the signature button (second button from the right) on the edit toolbar. $1 will be replaced with four tildes (which cannot be included directly in the message for technical reasons).",
        "sig_tip": "This is the text that appears when you hover the mouse over the second key from the right on the edit toolbar.\n{{Identical|Signature with timestamp}}",
        "hr_tip": "This is the text that appears when you hover the mouse over the first button on the right on the edit toolbar.",
        "summary": "The Summary text beside the edit summary field\n\nSee also:\n* {{msg-mw|Subject}}\nSee also:\n* {{msg-mw|Accesskey-summary}}\n* {{msg-mw|Tooltip-summary}}\n{{Identical|Summary}}",
        "subject": "Used as label for input box in the EditPage page.\n\nSee also:\n* {{msg-mw|Summary}}\n{{Identical|Subject}}",
        "minoredit": "Text above Save page button in editor\n\nSee also:\n* {{msg-mw|Minoredit}}\n* {{msg-mw|Accesskey-minoredit}}\n* {{msg-mw|Tooltip-minoredit}}",
        "watchthis": "Text of checkbox above {{msg-mw|Showpreview}} button in editor.\n\nSee also:\n* {{msg-mw|Watchthis}}\n* {{msg-mw|Accesskey-watch}}\n* {{msg-mw|Tooltip-watch}}\n{{Identical|Watch this page}}",
 -      "savearticle": "Text on the Save page button. See also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons.\n\nSee also:\n* {{msg-mw|Savearticle}}\n* {{msg-mw|Accesskey-save}}\n* {{msg-mw|Tooltip-save}}\n{{Identical|Save page}}",
 +      "savearticle": "Text on the button to create a new page. It should be an action which is short and makes clear that the effect is immediate and public.\n\nSee also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons, and {{msg-mw|savechanges}} for the label for the button when the page is being modified.\n\nSee also:\n* {{msg-mw|Accesskey-publish}}\n* {{msg-mw|Tooltip-publish}}\n{{Identical|Save page}}",
 +      "savechanges": "Text on the button to save the changes to an existing page. It should be an action which is short and makes clear that the effect is immediate and public.\n\nSee also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons, and {{msg-mw|savearticle}} for the label for the button when the page is being modified.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|Accesskey-publish}}\n* {{msg-mw|Tooltip-publish}}\n{{Identical|Save changes}}",
 +      "publishpage": "Text on the button to create a new page on a public wiki. It should be an action which is short and makes clear that the effect is immediate and public.\n\nSee also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons, and {{msg-mw|publishchanges}} for the label for the button when the page is being modified.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|Accesskey-publish}}\n* {{msg-mw|Tooltip-publish}}\n{{Identical|Publish page}}",
 +      "publishchanges": "Text on the button to save the changes to an existing page on a public wiki. It should be an action which is short and makes clear that the effect is immediate and public.\n\nSee also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons, and {{msg-mw|publishchanges}} for the label for the button when the page is being created.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|Accesskey-publish}}\n* {{msg-mw|Tooltip-publish}}\n{{Identical|Publish changes}}",
        "preview": "The title of the Preview page shown after clicking the \"Show preview\" button in the edit page. Since this is a heading, it should probably be translated as a noun and not as a verb.\n\n{{Identical|Preview}}",
        "showpreview": "The text of the button to preview the page you are editing. See also {{msg-mw|showdiff}} and {{msg-mw|savearticle}} for the other buttons.\n\nSee also:\n* {{msg-mw|Showpreview}}\n* {{msg-mw|Accesskey-preview}}\n* {{msg-mw|Tooltip-preview}}\n{{Identical|Show preview}}",
        "showdiff": "Button below the edit page. See also {{msg-mw|Showpreview}} and {{msg-mw|Savearticle}} for the other buttons.\n\nSee also:\n* {{msg-mw|Showdiff}}\n* {{msg-mw|Accesskey-diff}}\n* {{msg-mw|Tooltip-diff}}\n{{Identical|Show change}}",
        "blankarticle": "Notice displayed once after the user tries to save an empty page.",
 -      "anoneditwarning": "Shown when editing a page anonymously.\n\nParameters:\n* $1 – A link to log in, <nowiki>{{fullurl:Special:UserLogin|returnto={{FULLPAGENAMEE}}}}</nowiki>\n* $2 – A link to sign up, <nowiki>{{fullurl:Special:UserLogin/signup|returnto={{FULLPAGENAMEE}}}}</nowiki>\n\nSee also:\n* {{msg-mw|mobile-frontend-editor-anoneditwarning}}",
 +      "anoneditwarning": "Shown when editing a page anonymously.\n\nParameters:\n* $1 – A link to log in, <nowiki>{{fullurl:Special:UserLogin|returnto={{FULLPAGENAMEE}}}}</nowiki>\n* $2 – A link to sign up, <nowiki>{{fullurl:Special:CreateAccount|returnto={{FULLPAGENAMEE}}}}</nowiki>\n\nSee also:\n* {{msg-mw|Mobile-frontend-editor-anonwarning}}",
        "anonpreviewwarning": "See also:\n* {{msg-mw|Anoneditwarning}}",
        "missingsummary": "The text \"edit summary\" is in {{msg-mw|Summary}}.\n\nSee also:\n* {{msg-mw|Missingcommentheader}}\n* {{msg-mw|Savearticle}}",
        "selfredirect": "Notice displayed once after the user tries to create a redirect to the same article.",
        "userpage-userdoesnotexist": "Error message displayed when trying to edit or create a page or a subpage that belongs to a user who is not registered on the wiki.\n\nParameters:\n* $1 - a username\n{{identical|userdoesnotexist}}",
        "userpage-userdoesnotexist-view": "Shown in user pages of non-existing users. See for example [{{canonicalurl:User:Foo}} User:Foo].\n\nParameters:\n* $1 - a username\n{{identical|userdoesnotexist}}",
        "blocked-notice-logextract": "{{gender}}\nParameters:\n* $1 - (Optional) the name of the blocked user. Can be used for GENDER.",
 -      "clearyourcache": "Text at the top of .js/.css pages",
 +      "clearyourcache": "Text at the top of .js/.css pages.\n\nWhen translating browser function names, check how they are translated in the localized versions of these web browsers in your language. If a browser is not translated to it, use English or another language in which browsers are most commonly used by the speakers of your language.",
        "usercssyoucanpreview": "Text displayed on every CSS page.\n\nSee also:\n* {{msg-mw|Userjsyoucanpreview}}\n* {{msg-mw|Showpreview}}",
        "userjsyoucanpreview": "Text displayed on every JavaScript page.\n\nSee also:\n* {{msg-mw|Usercssyoucanpreview}}\n* {{msg-mw|Showpreview}}",
        "usercsspreview": "Text displayed on preview of every user .css subpage.\n\nSee also:\n* {{msg-mw|Sitecsspreview}}",
        "previewnote": "Note displayed when clicking on Show preview",
        "continue-editing": "{{doc-actionlink}}\nA link to the beginning of the editing textarea on the same page.\n\nDisplayed after {{msg-mw|previewnote}}.",
        "previewconflict": "Used in Preview page.",
 -      "session_fail_preview": "Error message in Preview page.\n\nSee also:\n* {{msg-mw|Token suffix mismatch}}\n* {{msg-mw|Session fail preview}}\n* {{msg-mw|Edit form incomplete}}",
 -      "session_fail_preview_html": "Used as error message in Preview page.",
 +      "session_fail_preview": "Error message in Preview page.\n\nSee also:\n* {{msg-mw|Token suffix mismatch}}\n* {{msg-mw|Session fail preview}}\n* {{msg-mw|Edit form incomplete}}\n\n{{Identical|Loss of session data}}",
 +      "session_fail_preview_html": "Used as error message in Preview page.\n\n{{Identical|Loss of session data}}",
        "token_suffix_mismatch": "Error message in Preview page.\n\nSee also:\n* {{msg-mw|Token suffix mismatch}}\n* {{msg-mw|Session fail preview}}\n* {{msg-mw|Edit form incomplete}}",
        "edit_form_incomplete": "Error message in Preview page.\n\nSee also:\n* {{msg-mw|Token suffix mismatch}}\n* {{msg-mw|Session fail preview}}\n* {{msg-mw|Edit form incomplete}}",
        "editing": "Shown as page title when editing a page. Parameters:\n* $1 - the name of the page that is being edited. e.g. \"Editing Main Page\"\n{{Related|Editing}}\n{{Identical|Editing}}",
        "yourtext": "Used in Diff Preview page. The diff is between {{msg-mw|currentrev}} and {{msg-mw|yourtext}}.\n\nAlso used in Edit Conflict page; the diff between {{msg-mw|yourtext}} and {{msg-mw|storedversion}}.",
        "storedversion": "This is used in an edit conflict as the label for the top revision that has been stored, as opposed to your version {{msg-mw|yourtext}} that has not been stored which is shown at the bottom of the page.",
        "nonunicodebrowser": "Used as warning when editing page.",
 -      "editingold": "Used as warning when editing page.",
 +      "editingold": "Used as warning when editing an old revision of a page.",
        "yourdiff": "Used as h2 header for the diff of the current version of a page with the user's version in case there is an edit conflict or a spam filter hit.",
        "copyrightwarning": "Copyright warning displayed under the edit box in editor. Parameters:\n* $1 - link\n* $2 - license name",
        "copyrightwarning2": "Copyright warning displayed under the edit box in editor\n*$1 - license name",
        "invalid-content-data": "Error message indicating that the page's content can not be saved because it is invalid. This may occurr for content types with internal consistency constraints.",
        "content-not-allowed-here": "Error message indicating that the desired content model is not supported in given localtion.\n* $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}}\n* $2 - the title of the page in question",
        "editwarning-warning": "Uses {{msg-mw|Prefs-editing}}",
 +      "editpage-invalidcontentmodel-title": "Title of error page shown when using an unrecognized content model on EditPage",
 +      "editpage-invalidcontentmodel-text": "Error message shown when using an unrecognized content model on EditPage. $1 is the user's invalid input",
        "editpage-notsupportedcontentformat-title": "Title of error page shown when using an incompatible format on EditPage.\n\nUsed as title for the following error message:\n* {{msg-mw|Editpage-notsupportedcontentformat-text}}.",
        "editpage-notsupportedcontentformat-text": "Error message shown when using an incompatible format on EditPage.\n\nThe title for this error is {{msg-mw|Editpage-notsupportedcontentformat-title}}.\n\nParameters:\n* $1 - the format id\n* $2 - the content model name",
        "content-model-wikitext": "Name for the wikitext content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
 -      "content-model-text": "Name for the plain text content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}\n{{Identical|Plain text}}",
 +      "content-model-text": "Name for the plain text content model, used when decribing what type of content a page contains. Plaintext means that the content of the page will be rendered as is like:\n\n<nowiki>This is [[plain text]]. <a href=\"https://www.mediawiki.org/\">Really!</a></nowiki>\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}\n\n{{Identical|Plain text}}",
        "content-model-javascript": "Name for the JavaScript content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
        "content-model-css": "Name for the CSS content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
        "content-model-json": "Name for the JSON content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
        "content-json-empty-object": "Used to represent an object with no properties on a JSON content model page.",
        "content-json-empty-array": "Used to represent an array with no values on a JSON content model page.",
 +      "deprecated-self-close-category": "This message is used as a category name for a [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages are placed automatically if they contain invalid self-closed HTML tags, such as <code>&lt;b/></code> or <code>&lt;span/></code>.  The behavior of these will change soon to be consistent with the HTML5 specification, so their use in wikitext is deprecated.",
 +      "deprecated-self-close-category-desc": "Invalid self-closed HTML tag category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|deprecated-self-close-category}}",
        "duplicate-args-warning": "If a page calls a template and specifies the same argument more than once, such as <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>, this warning is displayed when previewing.\n\nParameters:\n* $1 - The calling page\n* $2 - The called template\n* $3 - The name of the duplicated argument",
        "duplicate-args-category": "This message is used as a category name for a [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages are placed automatically if they contain template calls that use duplicates of arguments, such as <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "duplicate-args-category-desc": "Duplicate arguments category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Duplicate-args-category}}",
        "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.\n\nSee also:\n* {{msg-mw|Undo-failure}}\n* {{msg-mw|Undo-norev}}",
        "undo-summary": "Edit summary for an undo action. Parameters:\n* $1 - revision ID\n* $2 - username\n{{Identical|Undo}}",
        "undo-summary-username-hidden": "Edit summary for an undo action where the username of the old revision is hidden.\n\nParameters:\n* $1 - the revision ID being undone\nSee also:\n* {{msg-mw|Undo-summary}}",
 -      "cantcreateaccounttitle": "Used as title of the error message {{msg-mw|Cantcreateaccount-text}}.",
 -      "cantcreateaccount-text": "Used as error message, with the title {{msg-mw|Cantcreateaccounttitle}}.\n* $1 - target IP address\n* $2 - reason or {{msg-mw|Blockednoreason}}\n* $3 - username\nSee also:\n* {{msg-mw|Cantcreateaccount-range-text}}",
 -      "cantcreateaccount-range-text": "Used as more detailed version of the {{msg-mw|Cantcreateaccount-text}} error message, with the title {{msg-mw|Cantcreateaccounttitle}}.\n* $1 - target IP range\n* $2 - reason or {{msg-mw|Blockednoreason}}\n* $3 - username\n* $4 - current user's IP address",
 +      "cantcreateaccount-text": "Used as error message when account creation is prevented by an IP block.\n* $1 - target IP address\n* $2 - reason or {{msg-mw|Blockednoreason}}\n* $3 - username\nSee also:\n* {{msg-mw|Cantcreateaccount-range-text}}",
 +      "cantcreateaccount-range-text": "Used instead of the {{msg-mw|Cantcreateaccount-text}} when the block is a range block.\n* $1 - target IP address range\n* $2 - reason or {{msg-mw|Blockednoreason}}\n* $3 - username\n* $4 - current user's IP address",
        "createaccount-hook-aborted": "Placeholder message to return with API errors on account create; passes through the message from a hook {{notranslate}}",
        "viewpagelogs": "Link displayed in history of pages",
        "nohistory": "Message shown when there are no history to list. See [{{canonicalurl:x|action=history}} example history].\n----\nAlso used as title of error message when the feed is empty. See [{{canonicalurl:x|action=history&feed=atom}} example feed].\n\nSee the error message:\n* {{msg-mw|history-feed-empty}}",
        "mergehistory-empty": "Used in [[Special:MergeHistory]].",
        "mergehistory-done": "Success message shown on [[Special:MergeHistory]].\n* $1 - link to target page\n* $2 - destination page title\n* $3 - number of revisions which succeeded to merge",
        "mergehistory-fail": "Used as error message in [[Special:MergeHistory]].",
 -      "mergehistory-fail-toobig": "Used as error message in [[Special:MergeHistory]].\n* $1 - maximum allowed number of revisions that can be moved",
 +      "mergehistory-fail-bad-timestamp": "Used as error message in [[Special:MergeHistory]] API.",
 +      "mergehistory-fail-invalid-source": "Used as error message in [[Special:MergeHistory]] API.",
 +      "mergehistory-fail-invalid-dest": "Used as error message in [[Special:MergeHistory]] API.",
 +      "mergehistory-fail-no-change": "Used as error message in [[Special:MergeHistory]] API.",
 +      "mergehistory-fail-permission": "Used as error message in [[Special:MergeHistory]] API.",
 +      "mergehistory-fail-self-merge": "Used as error message in [[Special:MergeHistory]] API.",
 +      "mergehistory-fail-timestamps-overlap": "Used as error message in [[Special:MergeHistory]] API.",
 +      "mergehistory-fail-toobig": "Used as error message in [[Special:MergeHistory]] and API.\n* $1 - maximum allowed number of revisions that can be moved",
 +      "mergehistory-warning-redirect-not-created": "Used as warning message in [[Special:MergeHistory]] API.",
        "mergehistory-no-source": "Used as error message in [[Special:MergeHistory]].\n* $1 - source page title\nSee also:\n* {{msg-mw|mergehistory-invalid-source}}\n* {{msg-mw|mergehistory-invalid-destination}}\n* {{msg-mw|mergehistory-no-destination}}\n* {{msg-mw|mergehistory-same-destination}}",
        "mergehistory-no-destination": "Used as error message in [[Special:MergeHistory]].\n* $1 - destination page title\nSee also:\n* {{msg-mw|mergehistory-invalid-source}}\n* {{msg-mw|mergehistory-no-source}}\n* {{msg-mw|mergehistory-invalid-destination}}\n* {{msg-mw|mergehistory-same-destination}}",
        "mergehistory-invalid-source": "Used as error message in [[Special:MergeHistory]].\n\nSee also:\n* {{msg-mw|mergehistory-no-source}}\n* {{msg-mw|mergehistory-invalid-destination}}\n* {{msg-mw|mergehistory-no-destination}}\n* {{msg-mw|mergehistory-same-destination}}",
        "mergehistory-same-destination": "Error message shown on [[Special:MergeHistory]] when the user entered the same page title to both source and destination\n\nSee also:\n* {{msg-mw|mergehistory-invalid-source}}\n* {{msg-mw|mergehistory-no-source}}\n* {{msg-mw|mergehistory-invalid-destination}}\n* {{msg-mw|mergehistory-no-destination}}",
        "mergehistory-reason": "{{Identical|Reason}}",
        "mergehistory-revisionrow": "{{Optional}}\nA revision row in the merge history page. Parameters:\n* $1 - a radio button to indicate a merge point\n* $2 - a link to the last revision of a page ({{msg-mw|Last}})\n* $3 - a page link\n* $4 - a user link\n* $5 - a revision size\n* $6 - a revision comment",
 +      "mergehistory-redirect-text": "{{ignored}}The text that's added to a redirected page when that redirect is created as part of a history merge.",
        "mergelog": "{{doc-logpage}}\n\nThis is the name of a log of merge actions done on [[Special:MergeHistory]]. This special page and this log is not enabled by default.",
        "pagemerge-logentry": "{{ignored}}This is a ''logentry'' message only used on IRC.\n\nParameters:\n* $1 - the page name of the source of the content to be merged\n* $2 - the page into which the content is merged\n* $3 - a timestamp of limit\n\nThe log and its associated special page 'MergeHistory' is not enabled by default.\n\nPlease note that the parameters in a log entry will appear in the log only in the default language of the wiki. View [[Special:Log]] for examples on translatewiki.net with English default language.",
        "revertmerge": "Used as link text",
        "shown-title": "Parameters:\n* $1 - number of search results",
        "viewprevnext": "This is part of the navigation message on the top and bottom of Special pages which are lists of things, e.g. the User's contributions page (in date order) or the list of all categories (in alphabetical order). ($1) and ($2) are either {{msg-mw|Pager-older-n}} and {{msg-mw|Pager-newer-n}} (for date order) or {{msg-mw|Prevn}} and {{msg-mw|Nextn}} (for alphabetical order).\n\nIt is also used by [[Special:WhatLinksHere|Whatlinkshere]] pages, where ($1) and ($2) are {{msg-mw|Whatlinkshere-prev}} and {{msg-mw|Whatlinkshere-next}}.\n($3) is made up in all cases of the various proposed numbers of results per page, e.g. \"(20 | 50 | 100 | 250 | 500)\".\nFor Special pages, the navigation bar is prefixed by \"({{msg-mw|Page first}} | {{msg-mw|Page last}})\" (alphabetical order) or \"({{msg-mw|Histfirst}} | {{msg-mw|Histlast}})\" (date order).\n\nViewprevnext is sometimes preceded by the {{msg-mw|Showingresults}} or {{msg-mw|Showingresultsnum}} message (for Special pages) or by the {{msg-mw|Linkshere}} message (for Whatlinkshere pages).\n\nRefers to {{msg-mw|Pipe-separator}}.",
        "searchmenu-exists": "An option shown in a menu beside search form offering a link to the existing page having the specified title (when using the default MediaWiki search engine).\n\nParameters:\n* $1 - page title\n* $2 - the number of search results found",
 -      "searchmenu-new": "An option shown in a menu beside search form offering a red link to the not yet existing page having the specified title (when using the default MediaWiki search engine).\n\nParameters:\n* $1 - page title\n* $2 - the number of search results found",
 +      "searchmenu-new": "An option shown in a menu beside search form offering a red link to the not yet existing page having the specified title (when using the default MediaWiki search engine).\nParameters:\n* $1 - page title\n* $2 - the number of search results found\nParameterless gender ({{GENDER:|male|female|unspecified}}) can be used in translations.",
        "searchmenu-new-nocreate": "{{notranslate}}",
        "searchprofile-articles": "A quick link in the advanced search box on [[Special:Search]]. Clicking on this link starts a search in the content pages of the wiki.\n\nA 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For technical definition of 'content namespaces' see [[mw:Manual:Using_custom_namespaces#Content_namespaces|MediaWiki]].\n\nPossible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.\n\n{{Identical|Content page}}",
        "searchprofile-images": "An option in the [[Special:Search]].\n\nSee also:\n* {{msg-mw|Searchprofile-images|message}}\n* {{msg-mw|Searchprofile-images-tooltip|tooltip}}\n{{Identical|Muitimedia}}",
        "columns": "Used on [[Special:Preferences]], \"Editing\" section in the \"Size of editing window\" fieldset.\n{{Identical|Column}}",
        "searchresultshead": "Replaced by {{msg-mw|prefs-searchoptions}}, though may still be used in some extensions. DEPRECATED.\n\n{{Identical|Search}}",
        "stub-threshold": "Used in [[Special:Preferences]], \"Advanced options\" section. The setting allows the user to select a threshold value, in bytes, from a predefined list of options. Any links that lead to pages smaller than the threshold (\"stub links\") will be styled differently.\n\nParameters:\n* $1: the text of {{msg-mw|stub-threshold-sample-link}}, styled as a stub link",
 -      "stub-threshold-sample-link": "Passed as a parameter to the {{msg-mw|stub-threshold}} message.",
 +      "stub-threshold-sample-link": "Passed as a parameter to the {{msg-mw|stub-threshold}} message.\n{{Identical|Sample}}",
        "stub-threshold-disabled": "Used in [[Special:Preferences]].\n{{Identical|Disabled}}",
        "recentchangesdays": "Used in [[Special:Preferences]], tab \"Recent changes\".",
        "recentchangesdays-max": "Shown as hint in [[Special:Preferences]], tab \"Recent changes\". Parameters:\n* $1 - number of days\nSee also:\n* {{msg-mw|Prefs-watchlist-days-max}}",
        "prefs-help-prefershttps": "Used as help text for the checkbox in [[Special:Preferences]].\n\nThe checkbox has the label {{msg-mw|Tog-prefershttps}}.\n\nSee example: [[mw:Special:Preferences]].",
        "prefswarning-warning": "Warning shown (except in Firefox) when attempting to leave [[Special:Preferences]] with unsaved changes.\n\nParameters:\n* $1 - Text of {{msg-mw|saveprefs}}, as <nowiki>{{int:saveprefs}}</nowiki> cannot be used directly.",
        "prefs-tabs-navigation-hint": "Hint message that explains the arrow key navigation for the tabs on [[Special:Preferences]] to screenreader users.",
 -      "email-address-validity-valid": "Used as hint for {{msg-mw|changeemail-newemail}} field in [[Special:ChangeEmail]], when the provided E-mail address is valid.",
 -      "email-address-validity-invalid": "Used as warning for {{msg-mw|changeemail-newemail}} field in [[Special:ChangeEmail]], when the provided E-mail address is invalid.",
        "userrights": "Page title of [[Special:UserRights]].",
        "userrights-summary": "{{doc-specialpagesummary|userrights}}",
        "userrights-lookup-user": "Label text when managing user rights ([[Special:UserRights]])",
        "userrights-user-editname": "Displayed on [[Special:UserRights]].",
 -      "editusergroup": "Button name, in page [[Special:Userrights]] (only available to administrators), in the section named {{MediaWiki:userrights-lookup-user}}.\n\n{{Identical|Edit user groups}}",
 +      "editusergroup": "Button name, in page [[Special:Userrights]] (only available to administrators), in the section named {{MediaWiki:userrights-lookup-user}}.\n\n{{Identical|Edit user groups}}.\nParameters:\n* $1 - username, for GENDER support",
        "editinguser": "Appears on [[Special:UserRights]]. Parameters:\n* $1 - a plaintext username\n* $2 - user tool links. e.g. \"(Talk | contribs | block | send email)\"",
        "userrights-editusergroup": "Parameter:\n* $1 - (Optional) a username, can be used for GENDER\n{{Identical|Edit user groups}}",
 -      "saveusergroups": "Button text when editing user groups",
 +      "saveusergroups": "Button text when editing user groups.\nParameters:\n* $1 - username, for GENDER support",
        "userrights-groupsmember": "Used when editing user groups in [[Special:Userrights]].\n\nThe message is followed by a list of group names.\n\nParameters:\n* $1 - (Optional) the number of items in the list following the message, for PLURAL\n* $2 - (Optional) the user name, for GENDER",
        "userrights-groupsmember-auto": "Used when editing user groups in [[Special:Userrights]]. The message is followed by a list of group names.\n\n\"Implicit\" is for groups that the user was automatically added to (such as \"autoconfirmed\"); cf. {{msg-mw|userrights-groupsmember}}\n\nParameters:\n* $1 - (Optional) the number of items in the list following the message, for PLURAL\n* $2 - (Optional) the user name, for GENDER",
        "userrights-groupsmember-type": "{{optional}}\nParameters:\n* $1 - list of group names\n* $2 - list of group member names. Used with labels {{msg-mw|Userrights-groupsmember}} and {{msg-mw|Userrights-groupsmember-auto}}",
        "group-bot": "{{doc-group|bot}}\n{{Identical|Bot}}",
        "group-sysop": "{{doc-group|sysop}}\n{{Identical|Administrator}}",
        "group-bureaucrat": "{{doc-group|bureaucrat}}",
 -      "group-suppress": "{{doc-group|suppress}}\nThis is an optional (disabled by default) user group, meant for the [[mw:RevisionDelete|RevisionDelete]] feature, to change the visibility of revisions through [[Special:RevisionDelete]].\n\n{{Identical|Suppress}}",
 +      "group-suppress": "{{doc-group|suppress}}\nThis is an optional (disabled by default) user group, meant for the suppression feature in [[mw:Flow|Flow]]. It is not to be confused with the Oversighters group, which also has access to the [[mw:RevisionDelete|RevisionDelete]] feature, to change the visibility of revisions through [[Special:RevisionDelete]].\n\n{{Identical|Suppress}}",
        "group-all": "The name of the user group that contains all users, including anonymous users\n\n{{Identical|All}}",
        "group-user-member": "{{doc-group|user|member}}\n{{Identical|User}}",
        "group-autoconfirmed-member": "{{doc-group|autoconfirmed|member}}",
        "right-createpage": "{{doc-right|createpage}}\nBasic right to create pages. The right to edit discussion/talk pages is {{msg-mw|right-createtalk}}.",
        "right-createtalk": "{{doc-right|createtalk}}\nBasic right to create discussion/talk pages. The right to edit other pages is {{msg-mw|right-createpage}}.",
        "right-createaccount": "{{doc-right|createaccount}}\nThe right to [[Special:CreateAccount|create a user account]].",
 +      "right-autocreateaccount": "{{doc-right|autocreateaccount}}\nThe right to automatically create an account from an external source (e.g. CentralAuth).",
        "right-minoredit": "{{doc-right|minoredit}}\nThe right to use the \"This is a minor edit\" checkbox. See {{msg-mw|minoredit}} for the message used for that checkbox.",
        "right-move": "{{doc-right|move}}\nThe right to move any page that is not protected from moving.\n{{Identical|Move page}}",
        "right-move-subpages": "{{doc-right|move-subpages}}",
        "right-blockemail": "{{doc-right|blockemail}}",
        "right-hideuser": "{{doc-right|hideuser}}\nThis user right is part of the [[mw:RevisionDelete|RevisionDelete]] feature.\nIt can be given to the group {{msg-mw|group-suppress}}, although that group is disabled by default.\n\nSee also\n* {{msg-mw|right-suppressionlog}}\n* {{msg-mw|right-suppressrevision}}\n* {{msg-mw|right-deletelogentry}}\n* {{msg-mw|right-deleterevision}}",
        "right-ipblock-exempt": "{{doc-right|ipblock-exempt}}\nThis user automatically bypasses IP blocks, auto-blocks and range blocks - so I presume - but I am uncertain",
 -      "right-proxyunbannable": "{{doc-right|proxyunbannable}}",
        "right-unblockself": "{{doc-right|unblockself}}",
        "right-protect": "{{doc-right|protect}}",
        "right-editprotected": "{{doc-right|editprotected}}\nRefers to {{msg-mw|Protect-level-sysop}}.\n\nSee also:\n* {{msg-mw|Right-editsemiprotected}}",
        "right-managechangetags": "{{doc-right|managechangetags}}",
        "right-applychangetags": "{{doc-right|applychangetags}}",
        "right-changetags": "{{doc-right|changetags}}",
 +      "right-deletechangetags": "{{doc-right|deletechangetags}}",
 +      "grant-generic": "Used if the grant name is not defined. Parameters:\n* $1 - grant name\n\nDefined grants (grant name refers: blockusers, createeditmovepage, ...):\n* {{msg-mw|grant-checkuser}}\n* {{msg-mw|grant-blockusers}}\n* {{msg-mw|grant-createaccount}}\n* {{msg-mw|grant-createeditmovepage}}\n* {{msg-mw|grant-delete}}\n* {{msg-mw|grant-editinterface}}\n* {{msg-mw|grant-editmycssjs}}\n* {{msg-mw|grant-editmyoptions}}\n* {{msg-mw|grant-editmywatchlist}}\n* {{msg-mw|grant-editpage}}\n* {{msg-mw|grant-editprotected}}\n* {{msg-mw|grant-highvolume}}\n* {{msg-mw|grant-oversight}}\n* {{msg-mw|grant-patrol}}\n* {{msg-mw|grant-privateinfo}}\n* {{msg-mw|grant-protect}}\n* {{msg-mw|grant-rollback}}\n* {{msg-mw|grant-sendemail}}\n* {{msg-mw|grant-uploadeditmovefile}}\n* {{msg-mw|grant-uploadfile}}\n* {{msg-mw|grant-basic}}\n* {{msg-mw|grant-viewdeleted}}\n* {{msg-mw|grant-viewmywatchlist}}",
 +      "grant-group-page-interaction": "{{Related|Grant-group}}",
 +      "grant-group-file-interaction": "{{Related|Grant-group}}",
 +      "grant-group-watchlist-interaction": "{{Related|Grant-group}}",
 +      "grant-group-email": "{{Related|Grant-group}}\n{{Identical|E-mail}}",
 +      "grant-group-high-volume": "{{Related|Grant-group}}",
 +      "grant-group-customization": "{{Related|Grant-group}}",
 +      "grant-group-administration": "{{Related|Grant-group}}",
 +      "grant-group-private-information": "{{Related|Grant-group}}",
 +      "grant-group-other": "{{Related|Grant-group}}",
 +      "grant-blockusers": "Name for grant \"blockusers\".\n{{Related|Grant}}",
 +      "grant-createaccount": "Name for grant \"createaccount\".\n{{Related|Grant}}",
 +      "grant-createeditmovepage": "Name for grant \"createeditmovepage\".\n{{Related|Grant}}",
 +      "grant-delete": "Name for grant \"delete\".\n{{Related|Grant}}",
 +      "grant-editinterface": "Name for grant \"editinterface\".\n\n\"JS\" stands for \"JavaScript\".\n{{Related|Grant}}",
 +      "grant-editmycssjs": "Name for grant \"editmycssjs\".\n\n\"JS\" stands for \"JavaScript\".\n{{Related|Grant}}",
 +      "grant-editmyoptions": "Name for grant \"editmyoptions\".\n{{Related|Grant}}",
 +      "grant-editmywatchlist": "Name for grant \"editmywatchlist\".\n{{Related|Grant}}\n{{Identical|Edit your watchlist}}",
 +      "grant-editpage": "Name for grant \"editpage\".\n{{Related|Grant}}",
 +      "grant-editprotected": "Name for grant \"editprotected\".\n{{Related|Grant}}",
 +      "grant-highvolume": "Name for grant \"highvolume\".\n{{Related|Grant}}",
 +      "grant-oversight": "Name for grant \"oversight\".\n{{Related|Grant}}",
 +      "grant-patrol": "Name for grant \"patrol\".\n{{Related|Grant}}",
 +      "grant-privateinfo": "Name for grant \"privateinfo\".\n{{Related|Grant}}",
 +      "grant-protect": "Name for grant \"protect\".\n{{Related|Grant}}",
 +      "grant-rollback": "Name for grant \"rollback\".\n{{Related|Grant}}",
 +      "grant-sendemail": "Name for grant \"sendemail\".\n{{Related|Grant}}",
 +      "grant-uploadeditmovefile": "Name for grant \"uploadeditmovefile\".\n{{Related|Grant}}",
 +      "grant-uploadfile": "Name for grant \"uploadfile\".\n{{Related|Grant}}\n{{Identical|Upload new file}}",
 +      "grant-basic": "Name for grant \"basic\".\n{{Related|Grant}}",
 +      "grant-viewdeleted": "Name for grant \"viewdeleted\".\n{{Related|Grant}}",
 +      "grant-viewmywatchlist": "Name for grant \"viewmywatchlist\".\n{{Related|Grant}}\n{{Identical|View your watchlist}}",
 +      "grant-viewrestrictedlogs": "Name for grant \"viewrestrictedlogs\".\n{{Related|Grant}}",
        "newuserlogpage": "{{doc-logpage}}\n\nPart of the \"Newuserlog\" extension. It is both the title of [[Special:Log/newusers]] and the link you can see in [[Special:RecentChanges]].",
        "newuserlogpagetext": "Part of the \"Newuserlog\" extension. It is the description you can see on [[Special:Log/newusers]].",
        "rightslog": "{{doc-logpage}}\n\nIn [[Special:Log]]",
        "action-createpage": "{{Doc-action|createpage}}\n{{Identical|Create page}}",
        "action-createtalk": "{{Doc-action|createtalk}}",
        "action-createaccount": "{{Doc-action|createaccount}}",
 +      "action-autocreateaccount": "{{Doc-action|autocreateaccount}}",
        "action-history": "{{Doc-action|history}}",
        "action-minoredit": "{{Doc-action|minoredit}}",
        "action-move": "{{Doc-action|move}}",
        "action-managechangetags": "{{doc-action|managechangetags}}",
        "action-applychangetags": "{{doc-action|applychangetags}}",
        "action-changetags": "{{doc-action|changetags}}",
 +      "action-deletechangetags": "{{doc-action|deletechangetags}}",
 +      "action-purge": "{{doc-action|purge}}",
        "nchanges": "Appears on enhanced watchlist and recent changes when page has more than one change on given date, linking to a diff of the changes.\n\nParameters:\n* $1 - the number of changes on that day (2 or more)\nThree messages are shown side-by-side: ({{msg-mw|Nchanges}} | {{msg-mw|Enhancedrc-since-last-visit}} | {{msg-mw|Enhancedrc-history}}).",
        "enhancedrc-since-last-visit": "Appears on enhanced watchlist and recent changes when page has more than one change on given date and at least one that the user hasn't seen yet, linking to a diff of the unviewed changes.\n\nParameters:\n* $1 - the number of unviewed changes (1 or more)\nThree messages are shown side-by-side: ({{msg-mw|nchanges}} | {{msg-mw|enhancedrc-since-last-visit}} | {{msg-mw|enhancedrc-history}}).",
        "enhancedrc-history": "Appears on enhanced watchlist and recent changes when page has more than one change on given date, linking to its history.\n\nThis is the same as {{msg-mw|hist}}, but not abbreviated.\n\nThree messages are shown side-by-side: ({{msg-mw|nchanges}} | {{msg-mw|enhancedrc-since-last-visit}} | {{msg-mw|enhancedrc-history}}).\n{{Identical|History}}",
        "recentchanges-legend-bot": "Used as legend on [[Special:RecentChanges]] and [[Special:Watchlist]].\n\nRefers to {{msg-mw|Recentchanges-label-bot}}.",
        "recentchanges-legend-unpatrolled": "Used as legend on [[Special:RecentChanges]] and [[Special:Watchlist]].\n\nRefers to {{msg-mw|Recentchanges-label-unpatrolled}}.",
        "recentchanges-legend-plusminus": "{{optional}}\nA plus/minus sign with a number for the legend.",
 +      "recentchanges-submit": "Label for submit button in [[Special:RecentChanges]]\n{{Identical|Show}}",
        "rcnotefrom": "This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time.\n\nThe corresponding message is {{msg-mw|Rclistfrom}}.\n\nParameters:\n* $1 - the maximum number of changes that are displayed\n* $2 - (Optional) a date and time\n* $3 - a date\n* $4 - a time\n* $5 - Number of changes are displayed, for use with PLURAL",
        "rclistfrom": "Used on [[Special:RecentChanges]]. Parameters:\n* $1 - (Currently not use) date and time. The date and the time adds to the rclistfrom description.\n* $2 - time. The time adds to the rclistfrom link description (with split of date and time).\n* $3 - date. The date adds to the rclistfrom link description (with split of date and time).\n\nThe corresponding message is {{msg-mw|Rcnotefrom}}.",
        "rcshowhideminor": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhideminor-show}} or {{msg-mw|rcshowhideminor-hide}}\n{{Identical|Minor edit}}",
        "recentchangeslinked-page": "{{Identical|Page name}}",
        "recentchangeslinked-to": "Checkbox in [[Special:RecentChangesLinked]].",
        "recentchanges-page-added-to-category": "Comment message for pages added to a category\n\nParameters:\n* $1 - name of the page being added",
 -      "recentchanges-page-added-to-category-bundled": "Comment message for template embedded by other pages added to a category\n\nParameters:\n* $1 - name of the page being added\n* $2 - number of additional pages being affected",
 +      "recentchanges-page-added-to-category-bundled": "Comment message for template embedded by other pages added to a category\n\nParameters:\n* $1 - name of the page being added",
        "recentchanges-page-removed-from-category": "Comment message for pages removed from a category\n\nParameters:\n* $1 - name of the page being removed",
 -      "recentchanges-page-removed-from-category-bundled": "Comment message for templates embeddedby other pages removed from a category\n\nParameters:\n* $1 - name of the page being added\n* $2 - number of additional pages being affected",
 +      "recentchanges-page-removed-from-category-bundled": "Comment message for templates embedded by other pages removed from a category\n\nParameters:\n* $1 - name of the page being added",
        "autochange-username": "Used as bot / unknown username.",
        "upload": "Display name for link to [[Special:Upload]] for uploading files to the wiki.\n\nSee also:\n* {{msg-mw|Upload}}\n* {{msg-mw|Accesskey-t-upload}}\n* {{msg-mw|Tooltip-t-upload}}\n{{Identical|Upload file}}",
        "uploadbtn": "Button name in [[Special:Upload]].\n\nSee also:\n* {{msg-mw|Uploadbtn}}\n* {{msg-mw|Accesskey-upload}}\n* {{msg-mw|Tooltip-upload}}\n{{Identical|Upload file}}",
        "file-thumbnail-no": "Error message at [[Special:Upload]]. Parameters:\n* $1 - String (e.g. \"180px-\")",
        "fileexists-forbidden": "{{doc-important|''thumb'' and ''center'' are magic words. Leave it untranslated!}}\nParameters:\n* $1 - name of the existing file",
        "fileexists-shared-forbidden": "{{doc-important|''thumb'' and ''center'' are magic words. Leave it untranslated!}}\nError message at [[Special:Upload]].\nParameters:\n* $1 - name of the existing file",
 +      "fileexists-no-change": "Used in [[Special:Upload]] to warn when the upload is an exact duplicate of the current version of the file.\nParameters:\n* $1 - name of the existing file",
 +      "fileexists-duplicate-version": "Used in [[Special:Upload]] to warn when the upload is an exact duplicate of (an) older version(s) of the file\nParameters:\n* $1 - name of the existing file\n* $2 - Amount of matching older versions (PLURAL support)",
        "file-exists-duplicate": "Used as warning in [[Special:Upload]].\nThis message is followed by the gallery of the duplicate files.\n\nParameters:\n* $1 - number of duplicate files",
        "file-deleted-duplicate": "Used in [[Special:Upload]. Parameters:\n* $1 - page title of the file\n\nSee also:\n* {{msg-mw|file-deleted-duplicate-notitle}}",
        "file-deleted-duplicate-notitle": "Used in [[Special:Upload]] when the title of the deleted duplicate is not available.\n\nSee also:\n* {{msg-mw|file-deleted-duplicate}}",
        "uploaded-script-svg": "Used as error message when uploading an SVG file that contains scriptable tags (script, handler, stylesheet, iframe).\n\nParameters:\n* $1 - The scriptable tag that blocked the SVG file from uploading.",
        "uploaded-hostile-svg": "Used as error message when uploading an SVG file that contains unsafe CSS.",
        "uploaded-event-handler-on-svg": "Used as error message when uploading an SVG file that contains event-handler attributes.\n\nParameters:\n* $1 - The event-handler attribute that is being modified in the SVG file.\n* $2 - The value that is given to the event-handler attribute.",
 -      "uploaded-href-attribute-svg": "Used as error message when uploading an SVG file that contains href attribute with non-local target (like http://, javascript:, etc).\n\nParameters:\n* $1 - The name of the tag containing href attribute.\n* $2 - The attribute \"href\".\n* $3 - The value of the href attribute.",
 +      "uploaded-href-attribute-svg": "Used as error message when uploading an SVG file that contains href attribute with disallowed target.\n\nParameters:\n* $1 - The name of the tag containing href attribute.\n* $2 - The attribute \"href\".\n* $3 - The value of the href attribute.",
        "uploaded-href-unsafe-target-svg": "Used as error message when uploading an SVG file that contains href to some unsafe target.\n\nParameters:\n* $1 - The name of the tag containing href attribute.\n* $2 - The attribute \"href\".\n* $3 - The value of the href attribute.",
        "uploaded-animate-svg": "Used as error message when uploading an SVG file that contains the element <animate> that might be changing href.\n\nParameters:\n* $1 - The name of the HTML tag.\n* $2 - The name of the attribute.\n* $3 - The value getting assigned to the attribute.",
        "uploaded-setting-event-handler-svg": "Used as error message when uploading an SVG file that sets the event-handler attribute, using <set> or <animate> tags.\n\nParameters:\n* $1 - The name of the HTML tag.\n* $2 - The name of the attribute.\n* $3 - The value getting assigned to the attribute.",
        "filename-thumb-name": "Appears when thumbnail title is similar to \"22px-Example.jpg\" - the prefix is what MW adds when downloading pictures as thumbnails.",
        "filename-bad-prefix": "Used as warning in [[Special:Upload]]. Parameters:\n* $1 - prefix\nSee also:\n* {{msg-mw|fileexists}}\n* {{msg-mw|filepageexists}}\n* {{msg-mw|fileexists-extension}}\n* {{msg-mw|fileexists-thumbnail-yes}}\n* {{msg-mw|file-thumbnail-no}}\n* {{msg-mw|filewasdeleted}}",
        "filename-prefix-blacklist": "{{optional}}\nDo not translate the file name prefixes before the hash mark (#). Leave all the wiki markup, including the spaces, as is. You can translate the text, including 'Leave this line exactly as it is'. The first line of this messages has one (1) leading space.",
 -      "upload-success-subj": "Used as message subject which is posted on the user talk page.\n\nSee also:\n* {{msg-mw|upload-success-subj|subject}}\n* {{msg-mw|upload-success-msg|message}}\n* {{msg-mw|upload-failure-subj|subject}}\n* {{msg-mw|upload-failure-msg|message}}",
 -      "upload-success-msg": "Used as message body which is posted on the user talk page. Parameters:\n* $1 - the local file name after uploading\n* $2 - the URL the file was uploaded from, when using upload-by-URL\nSee also:\n* {{msg-mw|upload-success-subj|subject}}\n* {{msg-mw|upload-success-msg|message}}\n* {{msg-mw|upload-failure-subj|subject}}\n* {{msg-mw|upload-failure-msg|message}}",
 -      "upload-failure-subj": "Used as message subject which is posted on the user talk page.\n\nI think this message should be translated as opposed to {{msg-mw|upload-success-subj}}.\n\nSee also:\n* {{msg-mw|upload-success-subj|subject}}\n* {{msg-mw|upload-success-msg|message}}\n* {{msg-mw|upload-failure-subj|subject}}\n* {{msg-mw|upload-failure-msg|message}}",
 -      "upload-failure-msg": "Used as message body which is posted on the user talk page. Parameters:\n* $1 - the specific error message\n* $2 - the URL the file tried to upload from, when using upload-by-URL.\nSee also:\n* {{msg-mw|upload-success-subj|subject}}\n* {{msg-mw|upload-success-msg|message}}\n* {{msg-mw|upload-failure-subj|subject}}\n* {{msg-mw|upload-failure-msg|message}}",
 -      "upload-warning-subj": "Used as warning subject which is posted on the user talk page.\n\nSee also:\n* {{msg-mw|upload-warning-subj|subject}}\n* {{msg-mw|upload-warning-msg|message}}",
 -      "upload-warning-msg": "Used as warning body which is posted on the user talk page. Parameters:\n* $1 - the URL the file was uploaded from, when using upload-by-URL\n* $2 - the session key for the upload\nSee also:\n* {{msg-mw|Upload-warning-subj|subject}}",
        "upload-proto-error": "See also:\n* {{msg-mw|Upload-proto-error|title}}\n* {{msg-mw|Upload-proto-error-text|text}}",
        "upload-proto-error-text": "\"Remote upload\" is explained on [[w:Uploading_and_downloading#Remote_upload|Wikipedia]].\n\nSee also:\n* {{msg-mw|Upload-proto-error|title}}\n* {{msg-mw|Upload-proto-error-text|text}}",
        "upload-file-error": "Unused on core [[mw:Special:Code/MediaWiki/53282]].\n\nExtensions making use of it:\n*ImportFreeImages\n*SemanticForms\nSee also:\n* {{msg-mw|Upload-file-error|title}}\n* {{msg-mw|Upload-file-error-text|text}}\n{{Identical|Internal error}}",
        "upload-too-many-redirects": "Error message shown when uploading a file via URL, if the upload failed because the URL returned too many redirects.",
        "upload-http-error": "Parameters:\n* $1 - error message",
        "upload-copy-upload-invalid-domain": "Error message shown if a user is trying to upload (i.e. copy) a file from a website that is not in $wgCopyUploadsDomains (if set).\n\nSee also:\n* {{msg-mw|http-invalid-url}}\n* {{msg-mw|tmp-create-error}}\n* {{msg-mw|tmp-write-error}}",
 +      "upload-foreign-cant-upload": "Error message shown when a user is trying to upload a file to foreign repository that is not configured to receive file uploads from current wiki.",
 +      "upload-foreign-cant-load-config": "Error message shown when a user is trying to upload a file to foreign repository and the foreign wiki is down or otherwise unable to respond to API requests.",
 +      "upload-dialog-disabled": "Message shown when the upload dialog functionality is disabled. (This doesn't mean that uploads in general are disabled, only this specific method of uploading.)",
        "upload-dialog-title": "Title of the upload dialog box\n{{Identical|Upload file}}",
        "upload-dialog-button-cancel": "Button to cancel the dialog\n{{Identical|Cancel}}",
 +      "upload-dialog-button-back": "Button to go back the dialog\n{{Identical|Back}}",
        "upload-dialog-button-done": "Button to close the dialog once upload is complete\n{{Identical|Done}}",
 -      "upload-dialog-button-save": "Button to save the file\n{{Identical|Save}}",
 -      "upload-dialog-button-upload": "Button to initiate upload\n{{Identical|Upload}}",
 -      "upload-form-label-select-file": "Label for the select file widget\n{{Identical|Select file}}",
 +      "upload-dialog-button-save": "Button to save the file after upload finishes and metadata is filled out, part 2 of a multi-step upload form\n{{Identical|Save}}",
 +      "upload-dialog-button-upload": "Button to initiate upload, part 1 of a multi-step upload form\n{{Identical|Upload}}",
        "upload-form-label-infoform-title": "Title for the information form\n{{Identical|Detail}}",
        "upload-form-label-infoform-name": "Label for the file name input\n{{Identical|Name}}",
 +      "upload-form-label-infoform-name-tooltip": "The tooltip documenting the title field for the file - used as the filename on-wiki.\n\nIdentical to {{msg-mw|mwe-upwiz-tooltip-title}}.",
        "upload-form-label-infoform-description": "Label for the file description input\n{{Identical|Description}}",
 +      "upload-form-label-infoform-description-tooltip": "The tooltip documenting the description fields on the details page.\n\nIdentical to {{msg-mw|mwe-upwiz-tooltip-description}}.",
        "upload-form-label-usage-title": "Title for the insert form showing how to use the uploaded item.\n{{Identical|Usage}}",
        "upload-form-label-usage-filename": "Label for the file name input\n{{Identical|Filename}}",
 -      "foreign-structured-upload-form-label-own-work": "Label for own work toggle",
 -      "foreign-structured-upload-form-label-infoform-categories": "Label for category selector input\n{{Identical|Category}}",
 -      "foreign-structured-upload-form-label-infoform-date": "Label for date input\n{{Identical|Date}}",
 -      "foreign-structured-upload-form-label-own-work-message-local": "Message shown by local when a user affirms that they are allowed to upload a file to the local wiki.",
 -      "foreign-structured-upload-form-label-not-own-work-message-local": "Message shown by local when a user cannot upload a file to the local wiki.",
 -      "foreign-structured-upload-form-label-not-own-work-local-local": "Suggests uploading a file via Special:Upload instead of using whatever method they're currently using.",
 -      "foreign-structured-upload-form-label-own-work-message-default": "Message shown by default when a user affirms that they are allowed to upload a file to a remote wiki.",
 -      "foreign-structured-upload-form-label-not-own-work-message-default": "Message shown by default when a user cannot upload a file to a remote wiki.",
 -      "foreign-structured-upload-form-label-not-own-work-local-default": "Suggests uploading a file locally instead of to a remote wiki.",
 -      "foreign-structured-upload-form-label-own-work-message-shared": "Legal message to show when the work is made by the uploader.",
 -      "foreign-structured-upload-form-label-not-own-work-message-shared": "Message to show when the work isn't owned by the uploader.",
 -      "foreign-structured-upload-form-label-not-own-work-local-shared": "Message suggesting the user might want to upload a file locally instead of to Wikimedia Commons. $1 is the name of the local wiki.",
 +      "upload-form-label-own-work": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 1.png|thumb]] Label for own work confirmation checkbox",
 +      "upload-form-label-infoform-categories": "Label for category selector input\n{{Identical|Category}}",
 +      "upload-form-label-infoform-date": "Label for date input\n{{Identical|Date}}",
 +      "upload-form-label-own-work-message-generic-local": "Message shown by local when a user affirms that their file upload to the local wiki follows the terms of service and licensing policies of the local wiki.",
 +      "upload-form-label-not-own-work-message-generic-local": "Message shown by local when a user cannot upload a file to the local wiki.",
 +      "upload-form-label-not-own-work-local-generic-local": "Suggests uploading a file via Special:Upload instead of using whatever method they're currently using.",
 +      "upload-form-label-own-work-message-generic-foreign": "Message shown by default when a user affirms that they are allowed to upload a file to a remote wiki.",
 +      "upload-form-label-not-own-work-message-generic-foreign": "Message shown by default when a user cannot upload a file to a remote wiki.",
 +      "upload-form-label-not-own-work-local-generic-foreign": "Suggests uploading a file locally instead of to a remote wiki.",
        "backend-fail-stream": "Parameters:\n* $1 - a filename",
        "backend-fail-backup": "Parameters:\n* $1 - a filename",
        "backend-fail-notexists": "Parameters:\n* $1 - a filename",
        "uploadstash-badtoken": "Used as error message in [[Special:UploadStash]].",
        "uploadstash-errclear": "Used as error message in [[Special:UploadStash]].",
        "uploadstash-refresh": "Used as link text in [[Special:UploadStash]].",
 +      "uploadstash-thumbnail": "Used as link text in [[Special:UploadStash]].",
 +      "uploadstash-exception": "Error message shown when an action related to the upload stash fails unexpectedly.\n\nParameters:\n* $1 - exception name, e.g. 'UploadStashFileNotFoundException'\n* $2 - exceptions details (always in English), e.g. 'cannot find path, or not a plain file'",
        "invalid-chunk-offset": "Error that can happen if chunks get uploaded out of order.\nAs a result of this error, clients can continue from an offset provided or restart the upload.\nUsed on [[Special:UploadWizard]].",
        "img-auth-accessdenied": "[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Access Denied\n{{Identical|Access denied}}",
        "img-auth-nopathinfo": "[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Missing PATH_INFO - see english description\n{{Doc-important|This is plain text. Do not use any wiki syntax.}}",
        "filerevert-submit": "{{Identical|Revert}}",
        "filerevert-success": "Message displayed when you succeed in reverting a version of a file.\n* $1 is the name of the media\n* $2 is a date\n* $3 is a time\n* $4 is an URL and must follow square bracket: [$4\n{{Identical|Revert}}",
        "filerevert-badversion": "Used as error message.",
 +      "filerevert-identical": "Used as error message.",
        "filedelete": "Used as page title. Parameters:\n* $1 - file title\nSee also:\n* {{msg-mw|Filedelete-intro}}",
        "filedelete-legend": "Used as fieldset label in the \"Delete file\" form.\n{{Identical|Delete file}}",
        "filedelete-intro": "Used as introduction for FileDelete form. Parameters:\n* $1 - page title for file\nSee also:\n* {{msg-mw|Filedelete|page title}}",
        "withoutinterwiki-submit": "{{Identical|Show}}",
        "fewestrevisions": "{{doc-special|FewestRevisions}}",
        "fewestrevisions-summary": "{{doc-specialpagesummary|fewestrevisions}}",
 -      "nbytes": "Message used on the history page of a wiki page. Each version of a page consist of a number of bytes. $1 is the number of bytes that the page uses. Uses plural as configured for a language based on $1.",
 +      "nbytes": "Message used on the history page of a wiki page. Each version of a page consist of a number of bytes. $1 is the number of bytes that the page uses. Uses plural as configured for a language based on $1.\n{{Identical|Byte}}",
        "ncategories": "Used in the special page '[[Special:MostCategories]]' in brackets after each entry on the list signifying how many categories a page is part of. $1 is the number of categories.",
        "ninterwikis": "Used in the special page '[[Special:MostInterwikis]]' in brackets after each entry on the list signifying how many interwikis a page is part of.\n\nParameters:\n* $1 - the number of interwiki links",
        "nlinks": "This appears in brackets after each entry on the special page [[Special:MostLinked]]. $1 is the number of wiki links.",
        "prefixindex": "{{doc-special|PrefixIndex}}\nWhen the user limits the list to a certain namespace, {{msg-mw|allinnamespace}} is used instead.",
        "prefixindex-namespace": "The page title of [[Special:PrefixIndex]] limited to a specific namespace. Similar to {{msg-mw|allinnamespace}}. $1 is the name of the namespace",
        "prefixindex-summary": "{{notranslate}}\n\nThe summary displayed at the top of [[Special:Prefixindex]]. [[mw:Manual:Interface/Special pages summary|MediaWiki manual]].",
 -      "prefixindex-strip": "Label for a checkbox. If the checkbox is checked, the prefix searched will be removed from the title displayed in the list. Used in [[Special:PrefixIndex]].\n\nSee the following search results:\n* [{{canonicalurl:Special:PrefixIndex|prefix=Doc&namespace=10}} Special:PrefixIndex?prefix=Doc&namespace=10] (prefix NOT stripped)\n* [{{canonicalurl:Special:PrefixIndex|prefix=Doc&namespace=10&stripprefix=1}} Special:PrefixIndex?prefix=Doc&namespace=10&stripprefix=1] (prefix stripped)",
 +      "prefixindex-submit": "Label on submit button in [[Special:PrefixIndex]]\n{{Identical|Show}}",
 +      "prefixindex-strip": "Label for a checkbox. If the checkbox is checked, the prefix searched (do not confuse with prefix of the namespace) will be removed from the title displayed in the list. Used in [[Special:PrefixIndex]].\n\nSee the following search results:\n* [{{canonicalurl:Special:PrefixIndex|prefix=Doc&namespace=10}} Special:PrefixIndex?prefix=Doc&namespace=10] (prefix NOT stripped)\n* [{{canonicalurl:Special:PrefixIndex|prefix=Doc&namespace=10&stripprefix=1}} Special:PrefixIndex?prefix=Doc&namespace=10&stripprefix=1] (prefix stripped)",
        "shortpages": "{{doc-special|ShortPages}}",
        "shortpages-summary": "{{notranslate}}\nThe summary displayed at the top of [[Special:Shortpages]]. [[mw:Manual:Interface/Special pages summary|mw manual]].",
        "longpages": "{{doc-special|LongPages}}",
        "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]].\n\nProtection parameters are:\n* {{msg-mw|Restriction-level-autoconfirmed}}\n* {{msg-mw|Restriction-level-sysop}}",
        "protectedpages-reason": "This is a column header in the table on the page [[Special:ProtectedPages]].\n{{Identical|Reason}}",
 +      "protectedpages-submit": "Label on search button in [[Special:ProtectedPages]]",
        "protectedpages-unknown-timestamp": "This is shown, when the date and time is unknown for a protection on the page [[Special:ProtectedPages]].\n{{Identical|Unknown}}",
        "protectedpages-unknown-performer": "This is shown, when the protecting user is unknown for a protection on the page [[Special:ProtectedPages]].",
        "protectedpages-unknown-reason": "{{ignored}}Comment used for extremely old protection log events (before there was a reason field).",
        "protectedtitles": "{{doc-special|ProtectedTitles}}",
        "protectedtitles-summary": "Summary of [[Special:ProtectedTitles]].\n\nSee also:\n* {{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.",
 +      "protectedtitles-submit": "Label on submit button in [[Special:ProtectedTitles]]",
        "listusers": "{{doc-special|ListUsers}}",
        "listusers-summary": "{{notranslate}}\nThe summary displayed at the top of [[Special:Listusers]]. [[mw:Manual:Interface/Special pages summary|mw manual]].",
        "listusers-editsonly": "Option in [[Special:ListUsers]].",
        "usercreated": "Used in [[Special:ListUsers]]. Parameters:\n* $1 - a date\n* $2 - a time\n* $3 - the name of the user, for use in GENDER",
        "newpages": "{{doc-special|NewPages}}\n{{Identical|New page}}",
        "newpages-summary": "{{notranslate}}\nThe summary displayed at the top of [[Special:Newpages]]. [[mw:Manual:Interface/Special pages summary|mw manual]].",
 +      "newpages-submit": "Submit button on [[Special:Newpages]]\n{{Identical|Show}}",
        "newpages-username": "{{Identical|Username}}",
        "ancientpages": "{{doc-special|AncientPages}}\nSee [[mw:Manual:Interface/Special pages title|manual]].",
        "ancientpages-summary": "{{doc-specialpagesummary|ancientpages}}",
        "apihelp-summary": "{{doc-specialpagesummary|ApiHelp}}",
        "apihelp-no-such-module": "Used as an error message if the requested API module is not found.\n\nParameters:\n* $1 - Requested module name",
        "apihelp-link": "{{notranslate}} Used to construct a link to [[Special:ApiHelp]]\n\nParameters:\n* $1 - module to link\n* $2 - link text",
 +      "apisandbox": "{{doc-special|ApiSandbox}}",
 +      "apisandbox-summary": "{{ignored}}\n{{doc-specialpagesummary|ApiSandbox}}",
 +      "apisandbox-jsonly": "Displayed as an error message if the browser does not have JavaScript enabled.",
 +      "apisandbox-api-disabled": "Displayed as an error message if the API is disabled on this site.",
 +      "apisandbox-intro": "Displayed (from JavaScript) as a header on [[Special:ApiSandbox]].",
 +      "apisandbox-fullscreen": "JavaScript button label for enabling full-page mode.\n\nSee https://phabricator.wikimedia.org/T129632#2465838 for details.",
 +      "apisandbox-fullscreen-tooltip": "Tooltip for the {{msg-mw|apisandbox-fullscreen}} button.",
 +      "apisandbox-unfullscreen": "JavaScript button label for disabling full-page mode.\n\nSee https://phabricator.wikimedia.org/T129632#2465838 for details.",
 +      "apisandbox-unfullscreen-tooltip": "Tooltip for the {{msg-mw|apisandbox-unfullscreen}} button.",
 +      "apisandbox-submit": "JavaScript button label for submitting the request.",
 +      "apisandbox-reset": "JavaScript button label for clearing the form.\n{{Identical|Clear}}",
 +      "apisandbox-retry": "JavaScript button label for retrying the submission.\n{{Identical|Retry}}",
 +      "apisandbox-loading": "JavaScript message displayed while data is loading.\n\nParameters:\n* $1 - Module being loaded",
 +      "apisandbox-load-error": "Displayed as an error message from JavaScript when data failed to load.\n\nParameters:\n* $1 - Module being loaded\n* $2 - Error message from the API",
 +      "apisandbox-no-parameters": "Displayed (from JavaScript) when the loaded API module has no parameters.",
 +      "apisandbox-helpurls": "JavaScript button label for showing help URLs.",
 +      "apisandbox-examples": "JavaScript button label for showing example queries.\n{{Identical|Example}}",
 +      "apisandbox-dynamic-parameters": "JavaScript fieldset legend for the section containing the widgets to add arbitrary parameters to a module that can accept dynamic parameters.",
 +      "apisandbox-dynamic-parameters-add-label": "JavaScript label for the widget to add a new arbitrary parameter.",
 +      "apisandbox-dynamic-parameters-add-placeholder": "JavaScript text field placeholder for the widget to add a new arbitrary parameter.",
 +      "apisandbox-dynamic-error-exists": "Displayed as an error message from JavaScript when trying to add a new arbitrary parameter with a name that already exists. Parameters:\n* $1 - Parameter name that failed.",
 +      "apisandbox-deprecated-parameters": "JavaScript button label and fieldset legend for separating deprecated parameters in the UI.",
 +      "apisandbox-fetch-token": "Tooltop for the button that fetches a CSRF token.",
 +      "apisandbox-submit-invalid-fields-title": "Title for a JavaScript error message when fields are invalid.",
 +      "apisandbox-submit-invalid-fields-message": "Content for a JavaScript error message when fields are invalid.",
 +      "apisandbox-results": "JavaScript tab label for the tab displaying the API query results.\n{{Identical|Result}}",
 +      "apisandbox-sending-request": "JavaScript message displayed while the request is being sent.",
 +      "apisandbox-loading-results": "JavaScript message displayed while the response is being read.",
 +      "apisandbox-results-error": "Displayed as an error message from JavaScript when the request failed.\n\nParameters:\n* $1 - Error message",
 +      "apisandbox-request-url-label": "Label for the text field displaying the URL used to make this request.",
 +      "apisandbox-request-time": "Label and value for displaying the time taken by the request.\n\nParameters:\n* $1 - Time taken in milliseconds",
 +      "apisandbox-results-fixtoken": "JavaScript button label",
 +      "apisandbox-results-fixtoken-fail": "Displayed as an error message from JavaScript when a CSRF token could not be fetched.\n\nParameters:\n* $1 - Token type",
 +      "apisandbox-alert-page": "Tooltip for the alert icon on a module's page tab when the page contains fields with issues.",
 +      "apisandbox-alert-field": "Tooltip for the alert icon on a field when the field has issues.",
 +      "apisandbox-continue": "Button text for sending another request using query continuation.\n{{Identical|Continue}}",
 +      "apisandbox-continue-clear": "Button text for clearing query continuation parameters.\n{{Identical|Clear}}",
 +      "apisandbox-continue-help": "Help text for the continue and clear buttons.",
        "booksources": "{{doc-special|BookSources}}\n\n'''This message shouldn't be changed unless it has serious mistakes.'''\n\nIt's used as the page name of the configuration page of [[Special:BookSources]]. Changing it breaks existing sites using the default version of this message.\n\nSee also:\n* {{msg-mw|Booksources|title}}\n* {{msg-mw|Booksources-text|text}}",
        "booksources-summary": "{{doc-specialpagesummary|booksources}}",
        "booksources-search-legend": "Box heading on [[Special:BookSources|book sources]] special page. The box is for searching for places where a particular book can be bought or viewed.",
        "booksources-search": "Search button in [[Special:BookSources]]\n\n{{Identical|Search}}",
        "booksources-text": "Used in [[Special:BookSources/1]].\n\nThis message is followed by a list of links to other sites.\n\nSee also:\n* {{msg-mw|Booksources|title}}\n* {{msg-mw|Booksources-text|text}}",
        "booksources-invalid-isbn": "This message is displayed after an invalid ISBN is entered on [[Special:Booksources]].",
 +      "magiclink-tracking-rfc": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that use RFC magic links will be added.",
 +      "magiclink-tracking-rfc-desc": "Description of the tracking category {{mw-msg|magiclink-tracking-rfc}}",
 +      "magiclink-tracking-pmid": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that use PMID magic links will be added.",
 +      "magiclink-tracking-pmid-desc": "Description of the tracking category {{mw-msg|magiclink-tracking-pmid}}",
 +      "magiclink-tracking-isbn": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that use ISBN magic links will be added.",
 +      "magiclink-tracking-isbn-desc": "Description of the tracking category {{mw-msg|magiclink-tracking-isbn}}",
        "rfcurl": "{{notranslate}}\nParameters:\n* $1 - RFC number\nSee also:\n* {{msg-mw|Pubmedurl}}",
        "pubmedurl": "{{notranslate}}\nParameters:\n* $1 - Pubmed number\nSee also:\n* {{msg-mw|Rfcurl}}",
        "specialloguserlabel": "Used in [[Special:Log]] as a label for an input field with which the log can be filtered for entries describing actions ''performed'' by the specified user.  \"Carried out\" and \"done\" are possible alternatives for \"performed\".",
        "speciallogtitlelabel": "Used in [[Special:Log]] as a label for an input field with which the log can be filtered.  This filter selects for pages or users on which a log action was performed.",
        "log": "{{doc-special|Log}}\n{{Identical|Log}}",
 +      "logeventslist-submit": "Submit button on [[Special:Log]]\n{{Identical|Show}}",
        "all-logs-page": "{{doc-logpage}}\nTitle of [[Special:Log]].",
        "alllogstext": "Header of [[Special:Log]]",
        "logempty": "Used as warning when there are no items to show.",
        "log-title-wildcard": "* Appears in: [[Special:Log]]\n* Description: A check box to enable prefix search option",
        "showhideselectedlogentries": "Text of the button which brings up the [[mw:RevisionDelete|RevisionDelete]] menu on [[Special:Log]].",
        "log-edit-tags": "Text of button used to access change tagging interface. For more information on tags see [[mw:Manual:Tags]].",
 +      "checkbox-select": "Parameters:\n* $1 - three links: {{msg-mw|checkbox-all}}, {{msg-mw|checkbox-none}}, and {{msg-mw|checkbox-invert}} which respectively selects all pages, de-selects all, and inverts the current selection state\n{{Identical|Select}}",
 +      "checkbox-all": "Text of button used to mark all revisions or log entries as selected in a list.\n{{Identical|All}}",
 +      "checkbox-none": "Text of button used to mark all revisions or log entries as unselected in a list.\n{{Identical|None}}",
 +      "checkbox-invert": "Text of button used to invert the currently-selected-state of all revisions or log entries in a list.\n{{Identical|Invert}}",
        "allpages": "{{doc-special|AllPages}}\nFirst part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]].\nThe other parts are {{msg-mw|Prevpage}} and {{msg-mw|Nextpage}}.\n{{Identical|All pages}}",
        "allpages-summary": "{{doc-specialpagesummary|allpages}}",
        "nextpage": "Third part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]]. $1 is a page title. The other parts are {{msg-mw|Allpages}} and {{msg-mw|Prevpage}}.\n\n{{Identical|Next page}}",
        "cachedspecial-refresh-now": "Link text pointing to the most recent version of the page.",
        "categories": "The page name of [[Special:Categories]].\n{{Identical|Category}}",
        "categories-summary": "{{doc-specialpagesummary|categories}}",
 +      "categories-submit": "Submit button on [[Special:Categories]]\n{{Identical|Show}}",
        "categoriespagetext": "{{doc-important|Do not translate or change links.}}\nText displayed in [[Special:Categories]].\n\nIn order to translate \"Unused categories\" and \"wanted categories\" see {{msg-mw|Unusedcategories}} and {{msg-mw|Wantedcategories}}.\n\nParameters:\n* $1 - number of categories",
        "categoriesfrom": "Used as label for the input box in [[Special:Categories]].\n\nThis message follows the fieldset label {{msg-mw|categories}}, and is followed by the input box.",
 -      "special-categories-sort-count": "Commented out at this time.\n\nThis message is used on [[Special:Categories]] to sort the list by the number of members in the categories.\n\nSee also:\n* {{msg-mw|Special-categories-sort-abc}}",
 -      "special-categories-sort-abc": "Commented out at this time.\n\nThis message is used on [[Special:Categories]] to sort the list by the category name.\n\nSee also:\n* {{msg-mw|Special-categories-sort-count}}\n{{Identical|Sort alphabetically}}",
        "deletedcontributions": "The message is shown as a link on [[Special:SpecialPages]] to [[Special:DeletedContributions]].\n\n{{Identical|Deleted user contributions}}",
        "deletedcontributions-summary": "{{doc-specialpagesummary|deletedcontributions}}",
        "deletedcontributions-title": "Title of [[Special:DeletedContributions]] (extension), a special page with a list of edits to pages which were deleted. Only viewable by sysops.\n\n{{Identical|Deleted user contributions}}",
        "activeusers-summary": "{{doc-specialpagesummary|activeusers}}",
        "activeusers-intro": "Used as introduction in [[Special:ActiveUsers]]. Parameters:\n* $1 - number of days (<code>$wgActiveUserDays</code>)",
        "activeusers-count": "Used in [[Special:ActiveUsers]] to show the active user's recent action count in brackets ([]).\n* $1 is the number of recent actions\n* $2 is the user's name for use with GENDER (optional)\n* $3 is the maximum number of days of the RecentChangesList",
 -      "activeusers-from": "Used as label for checkbox in the form on [[Special:ActiveUsers]].\n\nidentical with {{msg-mw|listusersfrom}}\n\nSee also:\n* {{msg-mw|activeusers|legend for the form}}\n* {{msg-mw|activeusers-hidebots|label for checkbox}}\n* {{msg-mw|activeusers-hidesysops|label for checkbox}}",
 -      "activeusers-hidebots": "Used as label for checkbox in the form on [[Special:ActiveUsers]].\n\nSee also:\n* {{msg-mw|activeusers|legend for the form}}\n* {{msg-mw|activeusers-from|label for input box}}\n* {{msg-mw|activeusers-hidesysops|label for checkbox}}",
 -      "activeusers-hidesysops": "Used as label for checkbox in the form on [[Special:ActiveUsers]].\n\nSee also:\n* {{msg-mw|activeusers|legend for the form}}\n* {{msg-mw|activeusers-from|label for input box}}\n* {{msg-mw|activeusers-hidebots|label for checkbox}}",
 +      "activeusers-from": "Used as label for checkbox in the form on [[Special:ActiveUsers]].\n\nidentical with {{msg-mw|listusersfrom}}\n\nSee also:\n* {{msg-mw|activeusers|legend for the form}}",
 +      "activeusers-groups": "Used as label on [[Special:ActiveUsers]].",
        "activeusers-noresult": "identical with {{msg-mw|listusers-noresult}}",
 +      "activeusers-submit": "Used as label for button in the form on [[Special:ActiveUsers]]",
        "listgrouprights": "The name of the special page [[Special:ListGroupRights]].",
        "listgrouprights-summary": "The description used on [[Special:ListGroupRights]].\n\nRefers to {{msg-mw|Listgrouprights-helppage}}.",
        "listgrouprights-key": "Footer note for the [[Special:ListGroupRights]] page",
        "listgrouprights-namespaceprotection-header": "Shown on [[Special:ListGroupRights]] as the header for the namespace restrictions table.",
        "listgrouprights-namespaceprotection-namespace": "Shown on [[Special:ListGroupRights]] as the 'namespace' column header for the namespace restrictions table.\n{{Identical|Namespace}}",
        "listgrouprights-namespaceprotection-restrictedto": "Shown on [[Special:ListGroupRights]] as the \"right(s) allowing user to edit\" column header for the namespace restrictions table.",
 +      "listgrants": "The name of the special page [[Special:ListGrants]].\n{{Identical|Grant}}",
 +      "listgrants-summary": "Explanatory text shown at the top of the grant/rights mapping table.\n\nRefers to {{msg-mw|Listgrouprights-helppage}}.",
 +      "listgrants-grant": "Used as table header for the grant/rights mapping table.\n{{Identical|Grant}}",
 +      "listgrants-rights": "Used as table header for the grant/rights mapping table.\n{{Identical|Right}}",
        "trackingcategories": "[[Special:TrackingCategories]] page implementing list of Tracking categories [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]].\n{{Identical|Tracking category}}",
        "trackingcategories-summary": "Description for [[Special:TrackingCategories]] page [[mw:Help:Tracking categories|tracking category]]",
        "trackingcategories-msg": "Header for the message column of the table on [[Special:TrackingCategories]]. This column lists the mediawiki message that controls the tracking category in question.\n{{Identical|Tracking category}}",
        "trackingcategories-name": "Header for the message column of the table on [[Special:TrackingCategories]]. This column lists the name of the tracking category in the content language.",
        "trackingcategories-desc": "Header for the message column of the table on [[Special:TrackingCategories]]. This column lists the inclusion criteria for the category.",
 +      "restricted-displaytitle-ignored": "This message is used as a category name for a [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages are placed automatically if a page has an ignored display title.\n\nSee also:\n* {{msg-mw|restricted-displaytitle-ignored-desc}}\n*{{msg-mw|restricted-displaytitle}}",
 +      "restricted-displaytitle-ignored-desc": "Pages with ignored display titles category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|restricted-displaytitle-ignored}}\n* {{msg-mw|restricted-displaytitle}}",
        "noindex-category-desc": "No-index category-description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Noindex-category}}",
        "index-category-desc": "Index category-description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Index-category}}",
        "post-expand-template-inclusion-category-desc": "Post expand template inclusion category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Post-expand-template-inclusion-category}}",
        "emailsubject": "Field in [[Special:EmailUser]].\n\n{{Identical|Subject}}",
        "emailmessage": "Field in [[Special:EmailUser]].\n\n{{Identical|Message}}",
        "emailsend": "Button name in [[Special:EmailUser]].\n\n{{Identical|Send}}",
 -      "emailccme": "Used at [[Special:Preferences]] > E-mail",
 +      "emailccme": "Used at [[Special:EmailUser]]",
        "emailccsubject": "Used in [[Special:EmailUser]].\n\nSubject of the carbon-copied email for the sender sent through MediaWiki.\n\nParameters:\n* $1 - target username\n* $2 - email subject",
        "emailsent": "Title of [[Special:EmailUser]] when it says you it sent an email",
        "emailsenttext": "Confirmation page: when you send an email, [[Special:EmailUser]] says you this (Your email has been sent).\n\nParameters:\n* $1 - (Optional) the recipient's username, for local customizations",
        "watchlistanontext": "Shown on Special:Userlogin when user tries to access their watchlist before logging in",
        "watchnologin": "Used as error page title.\n\nThe error message for this title is:\n* {{msg-mw|Watchnologintext}}\n{{Identical|Not logged in}}",
        "addwatch": "Link to a dialog box, displayed at the end of the list of categories at the foot of each page.\n\nSee also:\n* {{msg-mw|Removewatch}}",
 -      "addedwatchtext": "Explanation shown when clicking on the {{msg-mw|Watch}} tab. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Addedwatch}}",
 +      "addedwatchtext": "Message shown after clicking on the {{msg-mw|Watch}} tab in a content namespace page. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Removedwatchtext}}\n* {{msg-mw|Addedwatchtext-talk}}",
 +      "addedwatchtext-talk": "Message shown after clicking on the {{msg-mw|Watch}} tab in a talk namespace page. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Removedwatchtext-talk}}\n* {{msg-mw|Addedwatchtext}}",
        "addedwatchtext-short": "Explanation shown when watching item from [[Special:UnwatchedPages]].\n\nSee also:\n* {{msg-mw|Removedwatchtext-short}}\n* {{msg-mw|Addedwatchtext}}",
        "removewatch": "Link to a dialog box, displayed at the end of the list of categories at the foot of each page.\n\nSee also:\n* {{msg-mw|Addwatch}}",
 -      "removedwatchtext": "After a page has been removed from a user's watchlist by clicking the {{msg-mw|Unwatch}} tab at the top of an article, this message appears just below the title of the article.\n\nParameters:\n* $1 - the title of the article\nSee also:\n* {{msg-mw|Removedwatch}}\n* {{msg-mw|Addedwatchtext}}",
 +      "removedwatchtext": "Message shown after clicking on the {{msg-mw|Unwatch}} tab in a content namespace page. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Addedwatchtext}}\n* {{msg-mw|Removedwatchtext-talk}}",
 +      "removedwatchtext-talk": "Message shown after clicking on the {{msg-mw|Unwatch}} tab in a talk namespace page. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Addedwatchtext-talk}}\n* {{msg-mw|Removedwatchtext}}",
        "removedwatchtext-short": "Explanation shown when unwatching item from [[Special:UnwatchedPages]].\n\nSee also:\n* {{msg-mw|Addedwatchtext-short}}.\n* {{msg-mw|Removedwatchtext}}.",
        "watch": "{{doc-actionlink}}\nName of the Watch tab. Should be in the imperative mood.\n\nSee also:\n* {{msg-mw|Watch}}\n* {{msg-mw|Accesskey-ca-watch}}\n* {{msg-mw|Tooltip-ca-watch}}",
        "watchthispage": "Used as link text.\n\nSee also:\n* {{msg-mw|Unwatchthispage|link text}}\n* {{msg-mw|Notanarticle|error message}}\n{{Identical|Watch this page}}",
        "wlheader-showupdated": "Message at the top of [[Special:Watchlist]], after {{msg-mw|watchlist-details}}. Has to be a full sentence.",
        "wlnote": "Used on [[Special:Watchlist]] when a maximum number of hours or days is specified.\n\nParameters:\n* $1 - the number of changes shown\n* $2 - the number of hours for which the changes are shown\n* $3 - a date alone\n* $4 - a time alone",
        "wlshowlast": "Appears on [[Special:Watchlist]]. Parameters:\n* $1 - a choice of different numbers of hours (\"1 | 2 | 6 | 12\")\n* $2 - a choice of different numbers of days (\"1 | 3 | 7\" and the maximum number of days available)\nClicking on your choice changes the list of changes you see (without changing the default in my preferences).",
 -      "watchlistall2": "Appears on [[Special:Watchlist]], after {{msg-mw|wlshowtime}}, as the option to display all available data regardless of age.\n{{Identical|All}}",
        "watchlist-hide": "Appears on [[Special:Watchlist]]. It is the first word on a new line with checkboxes to hide/unhide options\n{{Identical|Hide}}",
 -      "wlshowtime": "Appears on [[Special:Watchlist]]. Label of a drop-down list used to specify the period of time to display in the watchlist. This period can be {{msg-mw|days}}, {{msg-mw|hours}}, or {{msg-mw|watchlistall2}}.",
 +      "watchlist-submit": "Label on the submit button in [[Special:Watchlist]]\n{{Identical|Show}}",
 +      "wlshowtime": "Appears on [[Special:Watchlist]]. Label of a drop-down list used to specify the period of time to display in the watchlist. This period can be {{msg-mw|days}} or {{msg-mw|hours}}.",
        "wlshowhideminor": "Option text in [[Special:Watchlist]]. Cf. {{msg-mw|rcshowhideminor}}.\n{{Identical|Minor edit}}",
        "wlshowhidebots": "Option text in [[Special:Watchlist]]. Cf. {{msg-mw|rcshowhidebots}}.\n{{Identical|Bot}}",
        "wlshowhideliu": "Option text in [[Special:Watchlist]]. Cf. {{msg-mw|rcshowhideliu}}.\n{{Identical|Registered user}}",
        "wlshowhideanons": "Option text in [[Special:Watchlist]]. Cf. {{msg-mw|rcshowhideanons}}.\n{{Identical|Anonymous user}}",
        "wlshowhidepatr": "Option text in [[Special:Watchlist]]. Cf. {{msg-mw|rcshowhidepatr}}.",
        "wlshowhidemine": "Option text in [[Special:Watchlist]]. Cf. {{msg-mw|rcshowhidemine}}.",
 +      "wlshowhidecategorization": "Option text in [[Special:Watchlist]]. Cf. {{msg-mw|rcshowhidecategorization}}.",
        "watchlist-options": "Legend of the fieldset of [[Special:Watchlist]]\n\nSee also:\n* {{msg-mw|Watchlist-details|watchlist header}}\n* {{msg-mw|Wlheader-enotif|watchlist header}}\n* {{msg-mw|enotif reset|Submit button text}}",
        "watching": "Text displayed when clicked on the watch tab: {{msg-mw|Watch}}. It means the wiki is adding that page to your watchlist.",
        "unwatching": "Text displayed when clicked on the unwatch tab: {{msg-mw|Unwatch}}. It means the wiki is removing that page from your watchlist.",
        "delete-confirm": "Used as page title. Parameters:\n* $1 - the page title\n{{Identical|Delete}}",
        "delete-legend": "{{Identical|Delete}}",
        "historywarning": "Warning when about to delete a page that has history.\n\nFollowed by a link which points to the history page.\n\nParameters:\n* $1 - the number of revisions that the page has",
 +      "historyaction-submit": "Submit button on history pages\n{{Identical|Show}}",
        "confirmdeletetext": "Introduction shown when deleting a page.\n\nRefers to {{msg-mw|Policy-url}}.",
        "actioncomplete": "Used in several situations, for example when a page has been deleted.\n\nSee also:\n* {{msg-mw|Actionfailed|page title}}",
        "actionfailed": "Used as page title when the submit operation failed, in [[Special:RevisionDelete]].\n\nSee also:\n* {{msg-mw|Actioncomplete|page title}}",
        "rollbacklinkcount": "{{doc-actionlink}}\nText of the rollback link showing the number of edits to be rolled back. See also {{msg-mw|rollbacklink}}.\n\nParameters:\n* $1 - the number of edits that will be rolled back. If $1 is over the value of <code>$wgShowRollbackEditCount</code> (default: 10) {{msg-mw|rollbacklinkcount-morethan}} is used.\n\nThe rollback link is displayed with a tooltip {{msg-mw|Tooltip-rollback}}",
        "rollbacklinkcount-morethan": "{{doc-actionlink}}\nText of the rollback link when a greater number of edits is to be rolled back. See also {{msg-mw|rollbacklink}}.\n\nWhen the number of edits rolled back is smaller than [[mw:Special:MyLanguage/Manual:$wgShowRollbackEditCount|$wgShowRollbackEditCount]], {{msg-mw|rollbacklinkcount}} is used instead.\n\nParameters:\n* $1 - number of edits",
        "rollbackfailed": "{{Identical|Rollback}}",
 -      "cantrollback": "Used as error message when rolling back.\n\nSee also:\n* {{msg-mw|Notvisiblerev}}\n{{Identical|Revert}}\n{{Identical|Rollback}}",
 +      "rollback-missingparam": "Used as error message that rollback is accessed without the required parameters\n\nSee also:\n* {{msg-mw|Rollbackfailed}}",
 +      "rollback-missingrevision": "Used as error message that rollback failed to load revision data\n\nSee also:\n* {{msg-mw|Rollbackfailed}}",
 +      "cantrollback": "Used as error message when rollback fails due to there not being a valid revision to revert back to.\n\nSee also:\n* {{msg-mw|Notvisiblerev}}\n{{Identical|Revert}}\n{{Identical|Rollback}}",
        "alreadyrolled": "Appear when there's rollback and/or edit collision.\n\nRefers to:\n* {{msg-mw|Pipe-separator}}\n* {{msg-mw|Contribslink}}\nParameters:\n* $1 - the page to be rolled back\n* $2 - the editor to be rolled-back of that page\n* $3 - the editor that cause collision\n{{Identical|Rollback}}",
        "editcomment": "Only shown if there is an edit {{msg-mw|Summary}}. Parameters:\n* $1 - the edit summary",
        "revertpage": "Parameters:\n* $1 - username 1\n* $2 - username 2\n* $3 - (Optional) revision ID of the revision reverted to\n* $4 - (Optional) timestamp of the revision reverted to\n* $5 - (Optional) revision ID of the revision reverted from\n* $6 - (Optional) timestamp of the revision reverted from\nSee also:\n* {{msg-mw|Revertpage-nouser}}\n{{Identical|Revert}}",
        "revertpage-nouser": "This is a confirmation message a user sees after reverting, when the username of the version is hidden with RevisionDelete.\n\nIn other cases the message {{msg-mw|Revertpage}} is used.\n\nParameters:\n* $1 - username 1, can be used for GENDER\n* $2 - (Optional) username 2\n* $3 - (Optional) revision ID of the revision reverted to\n* $4 - (Optional) timestamp of the revision reverted to\n* $5 - (Optional) revision ID of the revision reverted from\n* $6 - (Optional) timestamp of the revision reverted from",
        "rollback-success": "This message shows up on screen after successful revert (generally visible only to admins). $1 describes user whose changes have been reverted, $2 describes user which produced version, which replaces reverted version.\n{{Identical|Revert}}\n{{Identical|Rollback}}",
 +      "rollback-success-notify": "Notification shown after a successful revert.\n* $1 - User whose changes have been reverted\n* $2 - User that made the edit that was restored\n* $3 - Url to the diff of the rollback\nSee also:\n* {{msg-mw|showdiff}}\n{{related|rollback-success}}\n{{Format|jquerymsg}}",
        "sessionfailure-title": "Used as title of the error message {{msg-mw|Sessionfailure}}.",
        "sessionfailure": "Used as error message.\n\nThe title for this error message is {{msg-mw|Sessionfailure-title}}.",
        "changecontentmodel": "Title of the change content model special page",
        "changecontentmodel-title-label": "Label for the input field where the target page title should be entered\n{{Identical|Page title}}",
        "changecontentmodel-model-label": "Label of the dropdown listing available content model types the user can change a page to",
        "changecontentmodel-reason-label": "{{Identical|Reason}}",
 +      "changecontentmodel-submit": "Label of the form \"submit\" button for [[Special:ChangeContentModel]]\n{{Identical|Change}}",
        "changecontentmodel-success-title": "Title of the success page of the change content model special page",
        "changecontentmodel-success-text": "Message telling user that their change has been successfully done.\n* $1 - Target page title",
        "changecontentmodel-cannot-convert": "Error message shown if the content model cannot be changed to the specified type. $1 is the page title, $2 is the localized content model name.",
        "changecontentmodel-nodirectediting": "Error message shown if the content model does not allow for direct editing. $1 is the localized name of the content model.",
 +      "changecontentmodel-emptymodels-title": "Title of the error page shown if the content model cannot be changed to any of the available types.",
 +      "changecontentmodel-emptymodels-text": "Text of the error page shown if the content model cannot be changed to any of the available types. $1 is the page title.",
        "log-name-contentmodel": "{{doc-logpage}}\n\nTitle of [[Special:Log/contentmodel]].",
        "log-description-contentmodel": "Text in [[Special:Log/contentmodel]].",
 +      "logentry-contentmodel-new": "{{Logentry}}\n$4 is not used.\n$5 is the new content model.",
        "logentry-contentmodel-change": "{{Logentry}}\n$4 is the original content model.\n$5 is the new content model.",
        "logentry-contentmodel-change-revertlink": "Text on a link that reverts the content model change. {{identical|revertmove}}.",
        "logentry-contentmodel-change-revert": "Prefilled edit summary when reverting a content model change. {{identical|revertmove}}",
        "modifiedarticleprotection": "This is a ''logentry'' message only used on IRC.\nText describing an action. $1 is a page title.",
        "unprotectedarticle": "This is a ''logentry'' message only used on IRC.\nUsed as action. Parameters:\n* $1 - target page title",
        "movedarticleprotection": "This is a ''logentry'' message only used on IRC. It appears in the log if a protected page is renamed.\n\nExample:\n<code>00:51, 16 September 2010 Siebrand +(Talk • contribs • block) moved protection settings from \"User:Siebrand/prot-move\" to \"User:Siebrand/prot-moved\" ‎ (User:Siebrand/prot-move moved to User:Siebrand/prot-moved: prot_move test.)</code>\n\nParameters:\n* $1 - target page title\n* $2 - source page title",
+       "protectedarticle-comment": "Used as part of the edit summary placed in the page history when a page is protected.\n\nParameters:\n* $1 - page title\n* $2 - user who carried out the action (should only be used in the <code>GENDER</code> magic word)",
+       "modifiedarticleprotection-comment": "Used as part of the edit summary placed in the page history when a page's protection settings are modified.\n\nParameters:\n* $1 - page title\n* $2 - user who carried out the action (should only be used in the <code>GENDER</code> magic word)",
+       "unprotectedarticle-comment": "Used as part of the edit summary placed in the page history when a page is unprotected.\n\nParameters:\n* $1 - page title\n* $2 - user who carried out the action (should only be used in the <code>GENDER</code> magic word)",
        "protect-title": "Title for the protection form. $1 is the title of the page to be (un)protected.",
        "protect-title-notallowed": "Same as {{msg-mw|Protect-title}}, but when the user does not have the right to change protection levels.\n\nParameters:\n* $1 - page title",
        "prot_1movedto2": "Message description: [[mw:Manual:Interface/1movedto2]]\n\nParameters:\n* $1 - source page title\n* $2 - target page title",
        "undeletehistorynoadmin": "Used in [[Special:Undelete]].\n\nSee also:\n* {{msg-mw|Undeletehistory}}\n* {{msg-mw|Undeleterevdel}}",
        "undelete-revision": "Shown in \"View and restore deleted pages\" ([[Special:Undelete/$1]]).\nParameters:\n* $1 - deleted page name\n* $2 - (unused)\n* $3 - username (author of revision, not who deleted it)\n* $4 - date of the revision (localized)\n* $5 - time of the revision (localized)\nExample (in English):\n* Deleted revision of [[Main Page]] (as of 14 September 2013, at 08:17) by [[User:Username|Username]]:",
        "undeleterevision-missing": "Used as warning when undeleting the revision.",
 +      "undeleterevision-duplicate-revid": "Used as warning when some revisions could not be undeleted due to <code>rev_id</code> collisions.  Parameters:\n* $1 - Number of revisions that could not be restored for this reason.",
        "undelete-nodiff": "Used in [[Special:Undelete]].",
        "undeletebtn": "Shown on [[Special:Undelete]] as button caption and on [[Special:Log/delete|deletion log]] after each entry (for sysops).\n\n{{Identical|Restore}}",
        "undeletelink": "Display name of link to undelete a page used on [[Special:Log/delete]]\n\n{{Identical|View}}\n{{Identical|Restore}}",
        "undelete-error-long": "Used as error message. Parameters:\n* $1 - ...\nSee also:\n* {{msg-mw|Undelete-error-short}}",
        "undelete-show-file-confirm": "A confirmation message shown on [[Special:Undelete]] when the request does not contain a valid token (e.g. when a user clicks a link received in mail).\n\nParameters:\n* $1 - the name of the file being undeleted\n* $2 - the date of the displayed revision\n* $3 - the time of the displayed revision\n{{Identical|Are you sure you want to view the deleted revision of the file...}}",
        "undelete-show-file-submit": "{{Identical|Yes}}",
 -      "undelete-revision-row": "{{Optional}}\nA revision row in the undelete page. Parameters:\n* $1 is a checkBox to indicate whether to restore this specific revision\n* $2 is a link to the revision\n* $3 is a link to the last revision of a page ({{msg-mw|last}})\n* $4 is a link to the page\n* $5 is a link to the revision's user\n* $6 is the revision's minor edit identifier\n* $7 is the revision size\n* $8 is the revision comment\n* $9 is the revision's tags",
 +      "undelete-revision-row2": "{{Optional}}\nA revision row in the undelete page. Parameters:\n* $1 is a checkBox to indicate whether to restore this specific revision\n* $2 is a link to the last revision of a page ({{msg-mw|last}})\n* $3 is a link to the page\n* $4 is a link to the revision's user\n* $5 is the revision's minor edit identifier\n* $6 is the revision size\n* $7 is the revision comment\n* $8 is the revision's tags",
        "namespace": "This message is located at [[Special:Contributions]].\n{{Identical|Namespace}}",
        "invert": "Displayed in [[Special:RecentChanges|RecentChanges]], [[Special:RecentChangesLinked|RecentChangesLinked]] and [[Special:Watchlist|Watchlist]].\n\nThis message means \"Invert selection of namespace\".\n\nThis message has a tooltip {{msg-mw|tooltip-invert}}\n{{Identical|Invert selection}}",
        "tooltip-invert": "Used in [[Special:Recentchanges]] as a tooltip for the invert checkbox. See also the message {{msg-mw|invert}}",
        "sp-contributions-newbies-sub": "Note at the top of the page of results for a search on [[Special:Contributions]] where 'Show contributions for new accounts only' has been selected.",
        "sp-contributions-newbies-title": "The page title in your browser bar, but not the page title.\n\nSee also:\n* {{msg-mw|Sp-contributions-newbies-sub}}",
        "sp-contributions-blocklog": "Used as a display name for a link to the block log on for example [[Special:Contributions/Mediawiki default]]\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-logs}}\n* {{msg-mw|Sp-contributions-deleted}}\n* {{msg-mw|Sp-contributions-userrights}}\n{{Identical|Block log}}",
 -      "sp-contributions-suppresslog": "Used as a display name for a link to log entries of suppressed edits made by that user.\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also {{msg-mw|sp-contributions-deleted}}, {{msg-mw|sp-deletedcontributions-contribs}}, {{msg-mw|contributions}}, {{msg-mw|deletedcontributions-title}}.",
 -      "sp-contributions-deleted": "This is a link anchor used in [[Special:Contributions]]/''name'', when user viewing the page has the right to delete pages, or to restore deleted pages.\n\nUsed as link title in [[Special:Contributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-logs}}\n* {{msg-mw|Sp-contributions-userrights}}",
 +      "sp-contributions-suppresslog": "Used as a display name for a link to log entries of suppressed edits made by that user.\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]]. Parameters:\n* $1 is a plain text username used for GENDER.\nSee also {{msg-mw|sp-contributions-deleted}}, {{msg-mw|sp-deletedcontributions-contribs}}, {{msg-mw|contributions}}, {{msg-mw|deletedcontributions-title}}.",
 +      "sp-contributions-deleted": "This is a link anchor used in [[Special:Contributions]]/''name'', when user viewing the page has the right to delete pages, or to restore deleted pages.\n\nUsed as link title in [[Special:Contributions]]. Parameters:\n* $1 is a plain text username used for GENDER.\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-logs}}\n* {{msg-mw|Sp-contributions-userrights}}",
        "sp-contributions-uploads": "Used as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-logs}}\n* {{msg-mw|Sp-contributions-deleted}}\n* {{msg-mw|Sp-contributions-userrights}}\n{{Identical|Upload}}",
        "sp-contributions-logs": "Appears as an action link in the header of the Special:Contributions/''Username'' pages (e.g. \"For Somebody (talk | block log | logs)\").\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-deleted}}\n* {{msg-mw|Sp-contributions-userrights}}\n{{Identical|Log}}",
        "sp-contributions-talk": "This is a link anchor used in the [[Special:Contributions]]/''usernamename'' pages.\nThe link appears in a list of similar ones separated by {{msg-mw|pipe-separator}}, e.g. like this:<br />\n( talk | block log | logs | deleted contributions | rights management )\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|change-blocklink}}\n* {{msg-mw|unblocklink}}\n* {{msg-mw|blocklink}}\n* {{msg-mw|sp-contributions-blocklog}}\n* {{msg-mw|sp-contributions-uploads}}\n* {{msg-mw|sp-contributions-logs}}\n* {{msg-mw|sp-contributions-deleted}}\n* {{msg-mw|sp-contributions-userrights}}\n{{Identical|Talk}}",
        "sp-contributions-username": "This message appears whenever someone requests [[Special:Contributions]].\n{{Identical|IP address or username}}",
        "sp-contributions-toponly": "A checkbox at [[Special:Mycontributions|Special:Contributions]]",
        "sp-contributions-newonly": "Used as checkbox label at [[Special:Mycontributions|Special:Contributions]].\n\n\"page creation\" means the \"first revision\" of a page.\n\nPreceded by {{msg-mw|Sp-contributions-toponly}}.",
 +      "sp-contributions-hideminor": "Used as checkbox label at [[Special:Mycontributions|Special:Contributions]].\n\nSee also:\n* {{msg-mw|Tog-hideminor}}",
        "sp-contributions-submit": "{{Identical|Search}}",
        "sp-contributions-explain": "{{optional}}",
        "sp-contributions-footer": "{{ignored}}This is the footer for users that are not anonymous or newbie on [[Special:Contributions]].",
        "whatlinkshere-prev": "This is part of the navigation message on the top and bottom of Whatlinkshere pages, where it is used as the first argument of {{msg-mw|Viewprevnext}}.\n\nParameters:\n* $1 - the number of items shown per page. It is not used when $1 is zero; not sure what happens when $1 is one.\nSpecial pages use {{msg-mw|Prevn}} instead (still as an argument to {{msg-mw|Viewprevnext}}).\n\nSee also:\n* {{msg-mw|Whatlinkshere-next}}\n{{Identical|Previous}}",
        "whatlinkshere-next": "This is part of the navigation message on the top and bottom of Whatlinkshere pages, where it is used as the second argument of {{msg-mw|Viewprevnext}}.\n\nParameters:\n* $1 - the number of items shown per page. It is not used when $1 is zero; not sure what happens when $1 is one.\nSpecial pages use {{msg-mw|Nextn}} instead (still as an argument to {{msg-mw|Viewprevnext}}).\n\nSee also:\n* {{msg-mw|Whatlinkshere-prev}}\n{{Identical|Next}}",
        "whatlinkshere-links": "Used on [[Special:WhatLinksHere]]. It is a link to the WhatLinksHere page of that page.\n\nExample line:\n* [[Main Page]] ([[Special:WhatLinksHere/Main Page|{{int:whatlinkshere-links}}]])\n{{Identical|Link}}",
 -      "whatlinkshere-hideredirs": "Filter option in [[Special:WhatLinksHere]]. Parameters:\n* $1 is the {{msg-mw|hide}} or {{msg-mw|show}}\n{{Identical|Redirect}}",
 -      "whatlinkshere-hidetrans": "First filter option in [[Special:WhatLinksHere]]. Parameters:\n* $1 is the {{msg-mw|hide}} or {{msg-mw|show}}\n{{Identical|Transclusion}}",
 -      "whatlinkshere-hidelinks": "Filter option in [[Special:WhatLinksHere]]. Parameters:\n* $1 is the {{msg-mw|hide}} or {{msg-mw|show}}\n{{Identical|Link}}",
 -      "whatlinkshere-hideimages": "Filter option in [[Special:WhatLinksHere]]. Parameters:\n* $1 - the {{msg-mw|Hide}} or {{msg-mw|Show}}\n\nSee also:\n*{{msg-mw|Isimage}}\n*{{msg-mw|Media tip}}",
 +      "whatlinkshere-hideredirs": "Filter option in [[Special:WhatLinksHere]].\n\nParameters:\n* $1 - {{msg-mw|hide}}/{{msg-mw|show}}",
 +      "whatlinkshere-hidetrans": "First filter option in [[Special:WhatLinksHere]]. Parameters:\n* $1 is the {{msg-mw|hide}} or {{msg-mw|show}}",
 +      "whatlinkshere-hidelinks": "Filter option in [[Special:WhatLinksHere]].",
 +      "whatlinkshere-hideimages": "Filter option in [[Special:WhatLinksHere]].\n\nSee also:\n*{{msg-mw|Isimage}}\n*{{msg-mw|Media tip}}",
        "whatlinkshere-filters": "{{Identical|Filter}}",
 +      "whatlinkshere-submit": "Label for submit button in [[Special:WhatLinksHere]]\n{{Identical|Go}}",
        "autoblockid": "Used as name of autoblock, instead of autoblocked IPs. Parameters:\n* $1 - autoblock ID",
        "block": "{{doc-special|Block}}\n{{Identical|Block user}}",
        "unblock": "{{doc-special|Unblock}}",
        "unblock-summary": "{{doc-specialpagesummary|unblock}}",
        "blockip": "Used as the text of a link in the sidebar toolbox. Clicking this link takes you to [[Special:Block]], with a relevant username or IP address (e.g. \"Username\" on [[User talk:Username]], [[Special:Contributions/Username]], etc.) already filled in.\n\nParameters:\n* $1 - username, for GENDER support\n{{Identical|Block user}}",
        "blockip-legend": "Legend/Header for the fieldset around the input form of [[Special:Block]].\n\n{{Identical|Block user}}",
 -      "blockiptext": "Used in the {{msg-mw|Blockip}} form in [[Special:Block]].\n\nRefers to {{msg-mw|Policy-url}}.\n\nThis message may follow the message {{msg-mw|Ipb-otherblocks-header}} and other block messages.\n\nSee also:\n* {{msg-mw|Unblockiptext}}",
 +      "blockiptext": "Used in the {{msg-mw|Blockip}} form in [[Special:Block]].\n\nRefers to {{msg-mw|Policy-url}}.\n\nThis message may follow the message {{msg-mw|Ipb-otherblocks-header}} and other block messages.\n\nParameters:\n* $1 - CIDR suffix of the largest allowed IPv4 block (as an integer)\n* $2 - CIDR suffix of the largest allowed IPv6 block (as an integer)\n\nSee also:\n* {{msg-mw|Unblockiptext}}",
        "ipaddressorusername": "{{Identical|IP address or username}}",
        "ipbexpiry": "{{Identical|Expiry}}",
        "ipbreason": "Label of the block reason dropdown in [[Special:BlockIP]] and the unblock reason textfield in [{{fullurl:Special:IPBlockList|action=unblock}} Special:IPBlockList?action=unblock].\n\n{{Identical|Reason}}",
        "ipb-unblock": "Used as page title in [[Special:Block]], if the target user is not specified.\n\nSee also:\n* {{msg-mw|Ipb-unblock-addr}}",
        "ipb-blocklist": "Used as link text in [[Special:Block]].\n\nThe link points to Specil:BlockList.",
        "ipb-blocklist-contribs": "Used in [[Special:Block]].\n* $1 - target username",
 -      "unblockip": "Used as legend for the form in [[Special:Unblock]].",
 +      "ipb-blocklist-duration-left": "Used on [[Special:BlockList]] to show the remaining time (years, months, days, hours, minutes) until the block expires.\n$1 - The duration left",
 +      "unblockip": "Used as title and legend for the form in [[Special:Unblock]].",
        "unblockiptext": "Used in the {{msg-mw|Unblockip}} form on [[Special:Unblock]].",
        "ipusubmit": "Used as button text on [{{canonicalurl:Special:BlockList|action=unblock}} Special:BlockList?action=unblock]. To see the message:\n* Go to [[Special:BlockList]]\n* Click \"unblock\" for any block (but you can only see \"unblock\" if you have administrator rights)\n* It is now the button below the form",
        "unblocked": "{{doc-important|Do not translate the namespace \"User:\".}}\nParameters:\n* $1 - the username that was unblocked\nSee also:\n* {{msg-mw|Unblocked-range}}\n* {{msg-mw|Unblocked-id}}\n*{{msg-mw|Unblocked-ip}}",
        "block-log-flags-hiddenname": "Used as a block log flag in [[Special:Log/block]] and in [[Special:Block]].\n\n{{Related|Block-log-flags}}",
        "range_block_disabled": "Used as error message in [[Special:Block]].\n\nSee also:\n* {{msg-mw|Range block disabled}}\n* {{msg-mw|Ip range invalid}}\n* {{msg-mw|Ip range toolarge}}",
        "ipb_expiry_invalid": "Used as error message in [[Special:Block]].",
 +      "ipb_expiry_old": "Used as error message in [[Special:Block]], if the expiry time is in the past.\n{{Identical|protect_expiry_old}}",
        "ipb_expiry_temp": "Warning message displayed on [[Special:BlockIP]] if the option \"hide username\" is selected but the expiry time is not infinite.",
        "ipb_hide_invalid": "Used as error message in [[Special:Block]].\n* $1 - Number of edits (Value of [[mw:Manual:$wgHideUserContribLimit]])",
        "ipb_already_blocked": "{{Identical|$1 is already blocked}}",
 -      "ipb-needreblock": "Used in [[Special:Block]].\n* $1 - target username",
 +      "ipb-needreblock": "Used in [[Special:Block]].\n* $1 - target username, can be used for GENDER support",
        "ipb-otherblocks-header": "[[File:Special.Block with other blocks from GlobalBlocking and TorBlocks.png|thumb|Example]]\nUsed on [[Special:Block]] as header for other blocks, i.e. from GlobalBlocking or TorBlocks\n\nParameters:\n* $1 - number of blocks\nSee also:\n* {{msg-mw|Ipblocklist-otherblocks}}",
        "unblock-hideuser": "{{doc-singularthey}}",
        "ipb_cant_unblock": "Used as error message in [[Special:Unblock]]. Parameters:\n* $1 - block ID",
 -      "ipb_blocked_as_range": "Used when unblock of a single IP fails. Parameters:\n* $1 - IP address\n* $2 - IP range",
 +      "ipb_blocked_as_range": "Used when unblock of a single IP fails. Parameters:\n* $1 - IP address\n* $2 - IP address range",
        "ip_range_invalid": "Used as error message in [[Special:Block]].\n\nSee also:\n* {{msg-mw|Range block disabled}}\n* {{msg-mw|Ip range invalid}}\n* {{msg-mw|Ip range toolarge}}",
        "ip_range_toolarge": "Used as error message in [[Special:Block]]. Parameters:\n* $1 - a number from 0 to 32 for IPv4 (from 0 to 128 for IPv6); a part of CIDR (Classless Inter-Domain Routing) notation.\nSee also:\n* {{msg-mw|Range block disabled}}\n* {{msg-mw|Ip range invalid}}\n* {{msg-mw|Ip range toolarge}}",
        "proxyblocker": "Used in [[Special:BlockMe]].\n\nSee also:\n* {{msg-mw|proxyblocker-disabled}}\n* {{msg-mw|proxyblockreason}}\n* {{msg-mw|proxyblocksuccess}}",
        "unlockdbsuccesssub": "Used as subtitle in [[Special:UnlockDB]].\n\nSee also:\n* {{msg-mw|Lockdbsuccesssub|subtitle}}\n* {{msg-mw|Lockdbsuccesstext|text}}\n* {{msg-mw|Unlockdbsuccesssub|subtitle}}\n* {{msg-mw|Unlockdbsuccesstext|text}}",
        "lockdbsuccesstext": "Used as message text in [[Special:LockDB]].\n\nSee also:\n* {{msg-mw|Lockdbsuccesssub|subtitle}}\n* {{msg-mw|Lockdbsuccesstext|text}}\n* {{msg-mw|Unlockdbsuccesssub|subtitle}}\n* {{msg-mw|Unlockdbsuccesstext|text}}",
        "unlockdbsuccesstext": "Used as message text in [[Special:UnlockDB]].\n\nSee also:\n* {{msg-mw|Lockdbsuccesssub|subtitle}}\n* {{msg-mw|Lockdbsuccesstext|text}}\n* {{msg-mw|Unlockdbsuccesssub|subtitle}}\n* {{msg-mw|Unlockdbsuccesstext|text}}",
 -      "lockfilenotwritable": "'No longer needed' on wikipedia.",
 +      "lockfilenotwritable": "Used as error message in [[Special:LockDB]].",
 +      "databaselocked": "Used as error message in [[Special:LockDB]].\nThe title of this error message is {{msg-mw|Lockdb}}.\n\nSee also:\n* {{msg-mw|Lockdb|title}}\n* {{msg-mw|Databaselocked|message}}",
        "databasenotlocked": "Used as error message in [[Special:UnlockDB]].\nThe title of this error message is {{msg-mw|Lockdb}}.\n\nSee also:\n* {{msg-mw|Lockdb|title}}\n* {{msg-mw|Databasenotlocked|message}}",
        "lockedbyandtime": "Used as part of the message when a database is locked through [[Special:LockDB]]. Parameters:\n* $1 is the user that locked the database.\n* $2 is the date on which the lock was made\n* $3 is the time at which the lock was made",
        "move-page": "Used as page title of [[Special:MovePage]] to move pages.\n\nSee example: [[Special:MovePage/Portal:En]].\n\nParameters:\n* $1 - the name of the page to be moved (without link)\n{{Identical|Move}}",
        "movepage-max-pages": "PROBABLY (A GUESS): when moving a page, you can select an option of moving its subpages, but there is a maximum that can be moved automatically.\n\nParameters:\n* $1 - maximum moved pages, defined in the variable [[mw:Special:MyLanguage/Manual:$wgMaximumMovedPages|$wgMaximumMovedPages]]",
        "movelogpage": "{{doc-logpage}}\n\nTitle of [[Special:Log/move]]. Used as heading on that page, and in the dropdown menu on log pages.",
        "movelogpagetext": "Text on the special page 'Move log'.",
 -      "movesubpage": "This is a section header on [[Special:MovePage]], below is a list of subpages.\n\nParameters:\n* $1 - number of subpages\nSee also:\n* {{msg-mw|movenosubpage|without subpage}}\n* {{msg-mw|movesubpagetext|with subpages}}",
 -      "movesubpagetext": "Used in [[Special:MovePage]]. Parameters:\n* $1 - number of subpages\nSee also:\n* {{msg-mw|movesubpage|section header}}\n* {{msg-mw|movenosubpage|without subpage}}",
 -      "movenosubpage": "See also:\n* {{msg-mw|movesubpage|section header}}\n* {{msg-mw|movenosubpage|without subpage}}\n* {{msg-mw|movesubpagetext|with subpages}}",
 +      "movesubpage": "This is a section header on [[Special:MovePage]], below is a list of subpages.\n\nParameters:\n* $1 - number of subpages\nSee also:\n* {{msg-mw|movenosubpage|without subpage}}\n* {{msg-mw|movesubpagetext|with subpages}}\n* {{msg-mw|movesubpagetalktext|with talk subpages}}",
 +      "movesubpagetext": "Used in [[Special:MovePage]]. Parameters:\n* $1 - number of subpages\nSee also:\n* {{msg-mw|movesubpage|section header}}\n* {{msg-mw|movenosubpage|without subpage}}\n* {{msg-mw|movesubpagetalktext|with talk subpages}}",
 +      "movesubpagetalktext": "Used in [[Special:MovePage]] when corresponding talk page has subpages. Parameters:\n* $1 - number of subpages\nSee also:\n* {{msg-mw|movesubpage|section header}}\n* {{msg-mw|movenosubpage|without subpage}}",
 +      "movenosubpage": "See also:\n* {{msg-mw|movesubpage|section header}}\n* {{msg-mw|movenosubpage|without subpage}}\n* {{msg-mw|movesubpagetext|with subpages}}\n* {{msg-mw|movesubpagetalktext|with talk subpages}}",
        "movereason": "Used in [[Special:MovePage]]. The text for the inputbox to give a reason for the page move.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}\n{{Identical|Reason}}",
        "move-redirect-text": "{{ignored}}The text that's added to a redirected page when that redirect is created.",
        "category-move-redirect-override": "{{ignored}}The text that's added to a redirected category page when that redirect is created.",
        "export-download": "A label of checkbox option in [[Special:Export]]\n\nSee also:\n* {{msg-mw|Exportlistauthors}}",
        "export-templates": "A label of checkbox option in [[Special:Export]]",
        "export-pagelinks": "This is an input in [[Special:Export]]",
 +      "export-manual": "The label for the textarea input on [[Special:Export]]",
        "allmessages": "The title of the special page [[Special:AllMessages]].",
        "allmessagesname": "Used on [[Special:Allmessages]] meaning \"the name of the message\".\n{{Identical|Name}}",
        "allmessagesdefault": "The header for the lower row of each column in the table of [[Special:AllMessages]].",
        "import-nonewrevisions": "Used in [[Special:Import]].",
        "xml-error-string": "Parameters:\n* $1 - Some kind of message, perhaps name of the error?\n* $2 - line number\n* $3 - column number\n* $4 - ?? $this->mByte . $this->mContext\n* $5 - error description\nExample:\n* Import failed: XML import parse failure at line 1, col 1 (byte 3; \"- <mediawiki xml\"): Empty document",
        "import-upload": "Used on [[Special:Import]].\n\nRelated messages:\n* {{msg-mw|right-importupload}} (the user right for this)",
 -      "import-token-mismatch": "Used as error message in [[Special:Import]].\n\nSee also:\n* {{msg-mw|import-token-mismatch}}\n* {{msg-mw|import-invalid-interwiki}}\n* {{msg-mw|Importunknownsource}}",
 +      "import-token-mismatch": "Used as error message in [[Special:Import]].\n\nSee also:\n* {{msg-mw|import-token-mismatch}}\n* {{msg-mw|import-invalid-interwiki}}\n* {{msg-mw|Importunknownsource}}\n\n{{Identical|Loss of session data}}",
        "import-invalid-interwiki": "Used as error message in [[Special:Import]].\n\nSee also:\n* {{msg-mw|import-token-mismatch}}\n* {{msg-mw|import-invalid-interwiki}}\n* {{msg-mw|Importunknownsource}}",
        "import-error-edit": "Import error message displayed when importing user has no edit rights for a page.\n\nParameters:\n* $1 - a page name\n{{Related|Import-error}}",
        "import-error-create": "Import error message displayed when importing user has no create rights for a page.\n\nParameters:\n* $1 - a page name\n{{Related|Import-error}}",
        "import-logentry-interwiki": "{{ignored}}This is a ''logentry'' message only used on IRC. Parameters:\n* $1 - page title",
        "import-logentry-interwiki-detail": "Used as success message and log entry. Parameters:\n* $1 - number of succeeded revisions\n* $2 - interwiki name\nSee also:\n* {{msg-mw|Import-logentry-upload-detail}}",
        "javascripttest": "Title of the special page [[Special:JavaScriptTest]].\n\nSee also:\n* {{msg-mw|Javascripttest|title}}\n* {{msg-mw|Javascripttest-pagetext-noframework|summary}}\n* {{msg-mw|Javascripttest-pagetext-unknownframework|error message}}",
 -      "javascripttest-backlink": "{{optional}}\nUsed as subtitle in [[Special:JavaScriptTest]]. Parameters:\n* $1 - page title",
 -      "javascripttest-title": "{{Ignore}}",
 -      "javascripttest-pagetext-noframework": "Used as summary when no framework specified.\n\nSee also:\n* {{msg-mw|Javascripttest|title}}\n* {{msg-mw|Javascripttest-pagetext-noframework|summary}}\n* {{msg-mw|Javascripttest-pagetext-unknownframework|error message}}",
 -      "javascripttest-pagetext-unknownframework": "Error message when given framework ID is not found. Parameters:\n* $1 - the ID of the framework\nSee also:\n* {{msg-mw|Javascripttest|title}}\n* {{msg-mw|Javascripttest-pagetext-noframework|summary}}\n* {{msg-mw|Javascripttest-pagetext-unknownframework|error message}}",
        "javascripttest-pagetext-unknownaction": "Error message when url specifies an unknown action. Parameters:\n* $1 - the action specified in the url.",
 -      "javascripttest-pagetext-frameworks": "Parameters:\n* $1 - frameworks list which contain a link text {{msg-mw|Javascripttest-qunit-name}}",
 -      "javascripttest-pagetext-skins": "Used as label in [[Special:JavaScriptTest]].",
 -      "javascripttest-qunit-name": "{{Ignore}}",
        "javascripttest-qunit-intro": "Used as summary. Parameters:\n* $1 - the configured URL to the documentation\nSee also:\n* {{msg-mw|Javascripttest-qunit-heading}}",
        "accesskey-pt-userpage": "{{doc-accesskey}}\nSee also:\n<!--* username-->\n* {{msg-mw|Accesskey-pt-userpage}}\n* {{msg-mw|Tooltip-pt-userpage}}",
        "accesskey-pt-anonuserpage": "{{doc-accesskey}}",
        "accesskey-ca-nstab-category": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Nstab-category}}\n* {{msg-mw|Accesskey-ca-nstab-category}}\n* {{msg-mw|Tooltip-ca-nstab-category}}",
        "accesskey-minoredit": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Minoredit}}\n* {{msg-mw|Accesskey-minoredit}}\n* {{msg-mw|Tooltip-minoredit}}",
        "accesskey-save": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Savearticle}}\n* {{msg-mw|Accesskey-save}}\n* {{msg-mw|Tooltip-save}}",
 +      "accesskey-publish": "{{doc-accesskey}}\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\nSee also:\n* {{msg-mw|publishpage}}\n* {{msg-mw|Tooltip-publish}}",
        "accesskey-preview": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Showpreview}}\n* {{msg-mw|Accesskey-preview}}\n* {{msg-mw|Tooltip-preview}}",
        "accesskey-diff": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Showdiff}}\n* {{msg-mw|Accesskey-diff}}\n* {{msg-mw|Tooltip-diff}}",
        "accesskey-compareselectedversions": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Compareselectedversions}}\n* {{msg-mw|Accesskey-compareselectedversions}}\n* {{msg-mw|Tooltip-compareselectedversions}}",
        "tooltip-t-recentchangeslinked": "Used as tooltip for the link {{msg-mw|Recentchangeslinked}}.\n\nSee also:\n* {{msg-mw|Recentchangeslinked}}\n* {{msg-mw|Accesskey-t-recentchangeslinked}}\n* {{msg-mw|Tooltip-t-recentchangeslinked}}",
        "tooltip-feed-rss": "Used as tooltip for RSS feed link.\n\nSee also:\n* {{msg-mw|Feed-rss}}\n* {{msg-mw|Accesskey-feed-rss}}\n* {{msg-mw|Tooltip-feed-rss}}",
        "tooltip-feed-atom": "Used as tooltip for Atom feed link.\n\nSee also:\n* {{msg-mw|Feed-atom}}\n* {{msg-mw|Accesskey-feed-atom}}\n* {{msg-mw|Tooltip-feed-atom}}",
 -      "tooltip-t-contributions": "Tooltip shown when hovering over {{msg-mw|Contributions}} in the toolbox.\n\nSee also:\n* {{msg-mw|Contributions}}\n* {{msg-mw|Accesskey-t-contributions}}\n* {{msg-mw|Tooltip-t-contributions}}",
 -      "tooltip-t-emailuser": "Tooltip shown when hovering over the {{msg-mw|Emailuser}} link in the toolbox (sidebar, below).\n\nSee also:\n* {{msg-mw|Emailuser}}\n* {{msg-mw|Accesskey-t-emailuser}}\n* {{msg-mw|Tooltip-t-emailuser}}",
 +      "tooltip-t-contributions": "Tooltip shown when hovering over {{msg-mw|Contributions}} in the toolbox.\n\nParameters:\n* $1 - Name of the user\n\nSee also:\n* {{msg-mw|Contributions}}\n* {{msg-mw|Accesskey-t-contributions}}\n* {{msg-mw|Tooltip-t-contributions}}",
 +      "tooltip-t-emailuser": "Tooltip shown when hovering over the {{msg-mw|Emailuser}} link in the toolbox (sidebar, below).\n\nParameters:\n* $1 - Name of the user\n\nSee also:\n* {{msg-mw|Emailuser}}\n* {{msg-mw|Accesskey-t-emailuser}}\n* {{msg-mw|Tooltip-t-emailuser}}",
        "tooltip-t-info": "Tooltip shown when hovering over the {{msg-mw|pageinfo-toolboxlink}} link in the toolbox (sidebar, below).",
        "tooltip-t-upload": "Tooltip shown when hovering over the link to upload files shown in the side bar menu on all pages.\n\nSee also:\n* {{msg-mw|Upload}}\n* {{msg-mw|Accesskey-t-upload}}\n* {{msg-mw|Tooltip-t-upload}}\n{{Identical|Upload file}}",
        "tooltip-t-specialpages": "The tooltip when hovering over the link {{msg-mw|Specialpages}} going to a list of all special pages available in the wiki.\n\nSee also:\n* {{msg-mw|Specialpages}}\n* {{msg-mw|Accesskey-t-specialpages}}\n* {{msg-mw|Tooltip-t-specialpages}}",
        "tooltip-ca-nstab-category": "Tooltip shown when hovering over the {{msg-mw|Nstab-category}} tab.\n\nSee also:\n* {{msg-mw|Nstab-category}}\n* {{msg-mw|Accesskey-ca-nstab-category}}\n* {{msg-mw|Tooltip-ca-nstab-category}}",
        "tooltip-minoredit": "Tooltip shown when hovering over the \"{{msg-mw|Minoredit}}\" link below the edit form.\n\nSee also:\n* {{msg-mw|Minoredit}}\n* {{msg-mw|Accesskey-minoredit}}\n* {{msg-mw|Tooltip-minoredit}}",
        "tooltip-save": "This is the text that appears when you hover the mouse over {{msg-mw|Savearticle}} button on the edit page.\n\nSee also:\n* {{msg-mw|Savearticle}}\n* {{msg-mw|Accesskey-save}}\n* {{msg-mw|Tooltip-save}}",
 +      "tooltip-publish": "This is the text that appears when you hover the mouse over {{msg-mw|publishpage}} button on the edit page.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|publishpage}}\n* {{msg-mw|Accesskey-publish}}",
        "tooltip-preview": "Tooltip shown when hovering over {{msg-mw|Showpreview}} button.\n\nIf the length of the translated message is over 60 characters (including spaces) then the end of the message will be cut off when using Firefox 2.0.0.7 browser, Linux operating system and the Monobook skin.\n\nSee also:\n* {{msg-mw|Showpreview}}\n* {{msg-mw|Accesskey-preview}}\n* {{msg-mw|Tooltip-preview}}",
        "tooltip-diff": "This is the text (tooltip) that appears when you hover the mouse over {{msg-mw|Showdiff}} button on the edit page.\n\nSee also:\n* {{msg-mw|Showdiff}}\n* {{msg-mw|Accesskey-diff}}\n* {{msg-mw|Tooltip-diff}}",
        "tooltip-compareselectedversions": "Tooltip of {{msg-mw|Compareselectedversions}} (which is used as button in history pages).\n\nSee also:\n* {{msg-mw|Compareselectedversions}}\n* {{msg-mw|Accesskey-compareselectedversions}}\n* {{msg-mw|Tooltip-compareselectedversions}}",
        "pageinfo-article-id": "The numeric identifier of the page.\n{{Identical|Page ID}}",
        "pageinfo-language": "Language in which the page content is written.",
        "pageinfo-content-model": "The model in which the page content is written.\n\nUsed as label at [{{fullurl:Main Page|action=info}} action=info]. Followed by one of the following messages:\n* {{msg-mw|Content-model-wikitext}}\n* {{msg-mw|Content-model-javascript}}\n* {{msg-mw|Content-model-css}}\n* {{msg-mw|Content-model-text}}",
 +      "pageinfo-content-model-change": "Link text for a link to Special:ChangeContentModel. The link will be wrapped in parenthesis.\n{{Identical|Change}}",
        "pageinfo-robot-policy": "The search engine status of the page.\n\nUsed as label. Followed by any one of the following messages:\n*{{msg-mw|Pageinfo-robot-index}}\n*{{msg-mw|Pageinfo-robot-noindex}}",
        "pageinfo-robot-index": "An indication that the page is indexable by search engines, that is listed in their search results.\n\nPreceded by the label {{msg-mw|Pageinfo-robot-policy}}.\n{{Identical|Allowed}}",
        "pageinfo-robot-noindex": "An indication that the page is not indexable (that is, is not listed on the results page of a search engine).\n\nPreceded by the label {{msg-mw|Pageinfo-robot-policy}}.",
        "pageinfo-category-pages": "See also:\n* {{msg-mw|Pageinfo-category-subcats}}\n* {{msg-mw|Pageinfo-category-files}}\n{{Identical|Number of pages}}",
        "pageinfo-category-subcats": "See also:\n* {{msg-mw|Pageinfo-category-pages}}\n* {{msg-mw|Pageinfo-category-files}}",
        "pageinfo-category-files": "See also:\n* {{msg-mw|Pageinfo-category-pages}}\n* {{msg-mw|Pageinfo-category-subcats}}",
 +      "pageinfo-user-id": "The numeric ID for a user",
        "markaspatrolleddiff": "{{doc-actionlink}}\nSee also:\n* {{msg-mw|Markaspatrolledtext}}\n{{Identical|Mark as patrolled}}",
        "markaspatrolledlink": "{{notranslate}}\nParameters:\n* $1 - link which has text {{msg-mw|Markaspatrolledtext}}",
        "markaspatrolledtext": "{{doc-actionlink}}\nSee also:\n* {{msg-mw|Markaspatrolleddiff}}",
 +      "markaspatrolledtext-file": "Same as markaspatrolledtext, but for files (new versions included) instead of pages.\n\nSee: {{msg-mw|markaspatrolledtext}}",
        "markedaspatrolled": "Used as title of the message {{msg-mw|Markedaspatrolledtext}}, when marking a change as patrolled.\n{{Related|Markedaspatrolled}}",
        "markedaspatrolledtext": "Used when marking a change as patrolled.\n\nThe title for this message is {{msg-mw|Markedaspatrolled}}.\n\nParameters:\n* $1 - page title\n{{Related|Markedaspatrolled}}",
        "rcpatroldisabled": "Used as title of the error message {{msg-mw|Rcpatroldisabledtext}}, when marking a change as patrolled.\n{{Related|Markedaspatrolled}}",
        "newimages-legend": "Caption of the fieldset for the filter on [[Special:NewImages]]\n\n{{Identical|Filter}}",
        "newimages-label": "Caption of the filter editbox on [[Special:NewImages]]",
        "newimages-showbots": "Used as label for a checkbox. When checked, [[Special:NewImages]] will also display uploads by users in the bots group.",
 +      "newimages-hidepatrolled": "Used as label for a checkbox. When checked, [[Special:NewImages]] will not display patrolled uploads.\n\nCf. {{msg-mw|tog-hidepatrolled}} and {{msg-mw|apihelp-feedrecentchanges-param-hidepatrolled}}.",
        "noimages": "This is shown on the special page [[Special:NewImages]], when there aren't any recently uploaded files.",
 +      "gallery-slideshow-toggle": "Tooltip for the icon that toggles thumbnails on a slideshow  gallery.",
        "ilsubmit": "Used as label for input box in the MIMESearch form on [[Special:MIMESearch]].\n\nSee also:\n* {{msg-mw|Mimesearch|page title}}\n* {{msg-mw|Mimetype|label for input box}}\n{{Identical|Search}}",
        "bydate": "{{Identical|Date}}",
        "sp-newimages-showfrom": "This is a link on [[Special:NewImages]] which takes you to a gallery of the newest files.\n* $1 is a date (example: ''19 March 2008'')\n* $2 is a time (example: ''12:15'')",
        "variantname-gan": "{{Optional}}\n\nVariant option for wikis with variants conversion enabled.",
        "variantname-sr-ec": "{{optional}}\nVariant Option for wikis with variants conversion enabled.\n\nNote that <code>sr-ec</code> is not a conforming BCP47 language tag. Wikis should be migrated by:\n* 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),\n* making the new tag the default to look first, before looking for the old tag,\n* moving the translations to the new code by renaming them,\n* checking links in source pages still using the legacy tag to change it to the new tag,\n* possibly cleanup the redirect pages.",
        "variantname-sr-el": "{{optional}}\nVariant Option for wikis with variants conversion enabled.\n\nNote that <code>sr-el</code> is not a conforming BCP47 language tag. Wikis should be migrated by:\n* 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),\n* making the new tag the default to look first, before looking for the old tag,\n* moving the translations to the new code by renaming them,\n* checking links in source pages still using the legacy tag to change it to the new tag,\n* possibly cleanup the redirect pages.",
 -      "variantname-sr": "{{optional}}\nVarient Option for wikis with variants conversion enabled.",
 +      "variantname-sr": "{{optional}}\nVariant Option for wikis with variants conversion enabled.",
        "variantname-kk-kz": "{{optional}}\nVarient Option for wikis with variants conversion enabled.",
        "variantname-kk-tr": "{{optional}}\nVarient Option for wikis with variants conversion enabled.",
        "variantname-kk-cn": "{{optional}}\nVarient Option for wikis with variants conversion enabled.",
        "metadata-fields": "{{doc-important|Do not translate list items, only translate the text! So leave \"<code>* make</code>\" and the other items exactly as they are.}}\nThe sentences are for explanation only and are not shown to the user.",
        "metadata-langitem": "{{optional}}\nThis is used for constructing the list of translations when a metadata property is translated into multiple languages.\n\nParameters:\n* $1 - the value of the property (in one language)\n* $2 - the language name that this translation is for (or language code if language name cannot be determined)\n* $3 - (Unused) the language code",
        "metadata-langitem-default": "{{optional}}\nSimilar to \"metadata-langitem\" but for the case where a multilingual property has a default specified that does not specify what language the default is in. $1 is the value of the property.",
 -      "exif-imagewidth": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Width}}",
 -      "exif-imagelength": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Height}}",
 +      "exif-imagewidth": "{{exif-qqq}}\n{{Identical|Width}}",
 +      "exif-imagelength": "{{exif-qqq}}\n{{Identical|Height}}",
        "exif-bitspersample": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
 -      "exif-compression": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis field labels what the compression of the image is. It is commonly seen in Tiff images. It uses messages like {{msg-mw|exif-compression-1}} for the value. [[w:TIFF#TIFF_Compression_Tag]] has information about this field.\n{{Related|Exif-compression}}",
 +      "exif-compression": "{{exif-qqq}}\n\nThis field labels what the compression of the image is. It is commonly seen in Tiff images. It uses messages like {{msg-mw|exif-compression-1}} for the value. [[w:TIFF#TIFF Compression Tag]] has information about this field.\n\n{{Related|Exif-compression}}",
        "exif-photometricinterpretation": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
 -      "exif-orientation": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nFor specific information on the orientation tag, see http://sylvana.net/jpegcrop/exif_orientation.html\n{{Related|Exif-orientation}}",
 +      "exif-orientation": "{{exif-qqq}}\n\nFor specific information on the orientation tag, see http://sylvana.net/jpegcrop/exif_orientation.html\n\n{{Related|Exif-orientation}}",
        "exif-samplesperpixel": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
 -      "exif-planarconfiguration": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also:\n* {{msg-mw|Exif-planarconfiguration}}\n* {{msg-mw|Exif-planarconfiguration-1}}\n* {{msg-mw|Exif-planarconfiguration-2}}",
 +      "exif-planarconfiguration": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-planarconfiguration}}\n* {{msg-mw|Exif-planarconfiguration-1}}\n* {{msg-mw|Exif-planarconfiguration-2}}",
        "exif-ycbcrsubsampling": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
 -      "exif-ycbcrpositioning": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Related|Exif-ycbcrpositioning}}",
 -      "exif-xresolution": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis is the horizontal resolution in either dots/inch or dots/cm.",
 -      "exif-yresolution": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis is the vertical resolution in either dots/inch or dots/cm.",
 +      "exif-ycbcrpositioning": "{{exif-qqq}}\n{{Related|Exif-ycbcrpositioning}}",
 +      "exif-xresolution": "{{exif-qqq}}\n\nThis is the horizontal resolution in either dots/inch or dots/cm.",
 +      "exif-yresolution": "{{exif-qqq}}\n\nThis is the vertical resolution in either dots/inch or dots/cm.",
        "exif-stripoffsets": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
        "exif-rowsperstrip": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
        "exif-stripbytecounts": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
        "exif-primarychromaticities": "The chromaticity of the three primary colours of the image. Normally this tag is not necessary, since colour space is specified in the colour space information tag. This should probably be translated it as \"Chromaticity of primary colours\".\n\nExif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
        "exif-ycbcrcoefficients": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
        "exif-referenceblackwhite": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
 -      "exif-datetime": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nNote, this message is also used for the XMP:ModifyDate property in XMP metadata. See page 35 of http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf\n\nDatetime is the time that the digital file was last changed.",
 -      "exif-imagedescription": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis property is the description or caption of the image. It is used for the exif ImageDescription property, the dc:description property in XMP (see http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf ), and the iptc-iim 2:120 caption/abstract property ( http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf ).\n\nWhen an image has multiple differing descriptions, mediawiki follows the MWG guidelines when deciding which to show (Which typically means Exif takes precedence).",
 -      "exif-make": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe Manufacturer of the digital camera (or scanner) that took the photo.",
 -      "exif-model": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe model of camera (or scanner) used to take the picture.",
 -      "exif-software": "Short for \"The software which was used to create or modify this image\".\n\nThe property can come from the Exif Software tag, PNG software chunk, iptc-iim 2:65 Software field, or XMP's xmp:CreatorTool field.\n\nExif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
 -      "exif-artist": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis message labels the author or artist of the work. Usually this means who took the photograph, or who drew the picture. The corresponding value field most commonly contains a single author, however it can contain an ordered (or unordered depending on which metadata standard is used to store the information) list of authors. Sometimes the persons position is prefixed before their name such as \"Photographer, John Smith\". The exif standard recommends multiple authors be specified by \"position, Author 1; position for author 2, Author 2's name\" however this doesn't seem to happen in practise very often. If multiple authors are specified using a non-exif standard, then a billeted (or numbered) list is used.\n\nThis property can be specified by exif Artist tag, XMP's tiff:Artist, XMP's dc:creator, iptc-iim's 2:80 byline, PNG's author textual chunk, PNG's (unofficial) artist textual chunk. XMP's photoshop:AuthorsPosition and iptc 2:85 byline-title can also affect display of this property.\n{{Identical|Author}}",
 +      "exif-datetime": "{{exif-qqq}}\n\nNote: this message is also used for the XMP:ModifyDate property in XMP metadata. See page 35 of http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf\n\nDatetime is the time that the digital file was last changed.",
 +      "exif-imagedescription": "{{exif-qqq}}\n\nThis property is the description or caption of the image. It is used for the exif ImageDescription property, the dc:description property in XMP (see http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf ), and the iptc-iim 2:120 caption/abstract property ( http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf ).\n\nWhen an image has multiple differing descriptions, mediawiki follows the MWG guidelines when deciding which to show (Which typically means Exif takes precedence).",
 +      "exif-make": "{{exif-qqq}}\n\nThe Manufacturer of the digital camera (or scanner) that took the photo.",
 +      "exif-model": "{{exif-qqq}}\n\nThis tag specifies the model of camera (or scanner) used to take the picture.",
 +      "exif-software": "{{exif-qqq}}\n\nThis tag is short for \"The software which was used to create or modify this image\".\n\nThe property can come from the Exif Software tag, PNG software chunk, iptc-iim 2:65 Software field, or XMP's xmp:CreatorTool field.",
 +      "exif-artist": "{{exif-qqq}}\n\nThis message labels the author or artist of the work. Usually this means who took the photograph, or who drew the picture. The corresponding value field most commonly contains a single author, however it can contain an ordered (or unordered depending on which metadata standard is used to store the information) list of authors. Sometimes the persons position is prefixed before their name such as \"Photographer, John Smith\". The exif standard recommends multiple authors be specified by \"position, Author 1; position for author 2, Author 2's name\" however this doesn't seem to happen in practice very often. If multiple authors are specified using a non-exif standard, then a billeted (or numbered) list is used.\n\nThis property can be specified by exif Artist tag, XMP's tiff:Artist, XMP's dc:creator, iptc-iim's 2:80 byline, PNG's author textual chunk, PNG's (unofficial) artist textual chunk. XMP's photoshop:AuthorsPosition and iptc 2:85 byline-title can also affect display of this property.\n\n{{Identical|Author}}",
        "exif-copyright": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nLabel for information contained in exif Copyright tag, XMP dc:rights, IPTC-iim 2:116, or PNG copyright textual chunk.\n\nTypically the copyright statement for the photograph/drawing/video (such as ''(c) 2010 John Smith. Released under GFDL''). Sometimes contains license information. See also {{msg-mw|exif-copyrightowner}}",
 -      "exif-exifversion": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nVersion of exif standard photo uses. Typically this is 2.22",
 +      "exif-exifversion": "{{exif-qqq}}\n\nVersion of exif standard photo uses. Typically this is 2.22",
        "exif-flashpixversion": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nVersion of flashpix used. Flashpix is a format used for storing some types of metadata in image. It is not as commonly used as EXIF, and mediawiki currently cannot read Flashpix data.",
 -      "exif-colorspace": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe colorspace of the photo. This tells the computer how to make the colours in the photo be more true to the original photo. Typical values for this are sRGB or uncalibrated. This only gives information on colour information given in the exif-colorspace property. However, colour information is often stored elsewhere in the photo.\n\nSee also:\n* {{msg-mw|Exif-colorspace}}\n* {{msg-mw|Exif-colorspace-1|optional}}\n* {{msg-mw|Exif-colorspace-65535}}",
 -      "exif-componentsconfiguration": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis contains how the information in the picture is stored. This is most commonly Y, Cr, Cb to specify luma, red, blue. RGB is also possible to specify Red, Green, Blue.\n{{Related|Exif-componentsconfiguration}}",
 +      "exif-colorspace": "{{exif-qqq}}\n\nThe colorspace of the photo. This tells the computer how to make the colours in the photo be more true to the original photo. Typical values for this are sRGB or uncalibrated. This only gives information on colour information given in the exif-colorspace property. However, colour information is often stored elsewhere in the photo.\n\nSee also:\n* {{msg-mw|Exif-colorspace}}\n* {{msg-mw|Exif-colorspace-1|optional}}\n* {{msg-mw|Exif-colorspace-65535}}",
 +      "exif-componentsconfiguration": "{{exif-qqq}}\n\nThis contains how the information in the picture is stored. This is most commonly Y, Cr, Cb to specify luma, red, blue. RGB is also possible to specify Red, Green, Blue.\n\n{{Related|Exif-componentsconfiguration}}",
        "exif-compressedbitsperpixel": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
 -      "exif-pixelydimension": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Image width}}",
 -      "exif-pixelxdimension": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Image height}}",
 -      "exif-usercomment": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nComments by user. Sometimes used like ImageDescription when the ImageDescription contained non-ascii characters. (Technically ImageDescription is supposed to contain ascii characters. In practise utf-8 is used in ImageDescription, so this field isn't used too much.)",
 +      "exif-pixelxdimension": "{{exif-qqq}}\n{{Identical|Image width}}",
 +      "exif-pixelydimension": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Image height}}",
 +      "exif-usercomment": "{{exif-qqq}}\n\nComments by user. Sometimes used like ImageDescription when the ImageDescription contained non-ascii characters. (Technically ImageDescription is supposed to contain ascii characters. In practice utf-8 is used in ImageDescription, so this field isn't used too much.)",
        "exif-relatedsoundfile": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSome cameras offer the option to record an audio \"memo\" for the photo they just took. If the user did that, the name of the file is labelled with this message.",
        "exif-datetimeoriginal": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe date and time when the original image data was generated. For example if it was a painting from 1773, scanned in to a computer in 2007, the datetimeoriginal would be 1773 and {{msg-mw|exif-datetimedigitized}} would have the 2007 date.",
        "exif-datetimedigitized": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe date and time when the image was stored as digital data.",
 -      "exif-subsectime": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\n'DateTime subseconds' shows the detail of the fraction of a second (1/100s) at which the file was changed, when the tag {{msg-mw|Exif-datetime}} is recorded to the whole second.",
 -      "exif-subsectimeoriginal": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis tag shows the detail of the fraction of a second (1/100s) at which the file data was originally generated, when the tag {{msg-mw|Exif-datetimeoriginal}} is recorded to the whole second.",
 -      "exif-subsectimedigitized": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis tag shows the detail of the fraction of a second (1/100s) at which the file was stored as digital data, when the tag {{msg-mw|Exif-datetimedigitized}} is recorded to the whole second.",
 -      "exif-exposuretime": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe exposure time. Number of (or fraction of) seconds the film was exposed to light. The value for this property is formatted using {{msg-mw|exif-exposuretime-format}}",
 -      "exif-exposuretime-format": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nParameters:\n* $1 - the exposure time written as a fraction of a second, for example 1/640 of a second\n* $2 - the exposure time written as a decimal, for example 0.0015625\n\n'sec' is the abbreviation used in English for the unit of time 'second'.",
 -      "exif-fnumber": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe [[w:F_number|F number]] is the relative aperture of the camera.",
 +      "exif-subsectime": "{{exif-qqq}}\n\n'DateTime subseconds' shows the detail of the fraction of a second (1/100s) at which the file was changed, when the tag {{msg-mw|Exif-datetime}} is recorded to the whole second.",
 +      "exif-subsectimeoriginal": "{{exif-qqq}}\n\nThis tag shows the detail of the fraction of a second (1/100s) at which the file data was originally generated, when the tag {{msg-mw|Exif-datetimeoriginal}} is recorded to the whole second.",
 +      "exif-subsectimedigitized": "{{exif-qqq}}\n\nThis tag shows the detail of the fraction of a second (1/100s) at which the file was stored as digital data, when the tag {{msg-mw|Exif-datetimedigitized}} is recorded to the whole second.",
 +      "exif-exposuretime": "{{exif-qqq}}\n\nThe exposure time. Number of (or fraction of) seconds the film was exposed to light. The value for this property is formatted using {{msg-mw|exif-exposuretime-format}}",
 +      "exif-exposuretime-format": "{{exif-qqq}}\n\nParameters:\n* $1 - the exposure time written as a fraction of a second, for example 1/640 of a second\n* $2 - the exposure time written as a decimal, for example 0.0015625\n\n'sec' is the abbreviation used in English for the unit of time 'second'.",
 +      "exif-fnumber": "{{exif-qqq}}\n\nThe [[w:F number|F number]] is the relative aperture of the camera.",
        "exif-fnumber-format": "{{optional}}\nExif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nParameters:\n* $1 - a number\nNote:\n* f is the abbreviation used in English for \"f-number\".",
 -      "exif-exposureprogram": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nHow the camera figured out what exposure to use. (If it was manually set, if its optimizing for fast shutter speed, etc).\n{{Related|Exif-exposureprogram}}",
 +      "exif-exposureprogram": "{{exif-qqq}}\n\nHow the camera figured out what exposure to use. (If it was manually set, if its optimizing for fast shutter speed, etc).\n\n{{Related|Exif-exposureprogram}}",
        "exif-spectralsensitivity": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nHow sensitive each channel (colour) of the photo is to light. This tag is almost never used.",
        "exif-isospeedratings": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe iso speed of the film used in the camera. This is basically a measure of how sensitive the film in the camera is to light.",
        "exif-shutterspeedvalue": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\n[[w:Shutter_speed|Shutter speed]] is the time that the camera shutter is open.\n\nThis is the shutter speed measured in APEX units (negative base 2 log of shutter speed in seconds). See {{msg-mw|exif-exposuretime}} for this property in more traditional units of seconds.",
 -      "exif-aperturevalue": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe [[w:Aperture|aperture]] of a camera is the hole through which light shines. This message can be translated 'Aperture width'. Note, this is measured in APEX units which is 2*log<sub>2</sub>(f-number) . See {{msg-mw|exif-fnumber}} for this value in more traditional units.",
 +      "exif-aperturevalue": "{{exif-qqq}}\n\nThe [[w:Aperture|aperture]] of a camera is the hole through which light shines. This message can be translated 'Aperture width'. Note, this is measured in APEX units which is 2*log<sub>2</sub>(f-number) . See {{msg-mw|exif-fnumber}} for this value in more traditional units.",
        "exif-brightnessvalue": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nHow intense the illumination of the scene photographed is. Measured in APEX brightness units. See Annex C of Exif standard for details on the measurement system in use.",
        "exif-exposurebiasvalue": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nAnother term for [[w:Exposure_bias|'exposure bias']] is 'exposure compensation'.",
        "exif-maxaperturevalue": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe 'land' in a camera refers possibly to the inner surface of the barrel of the lens. An alternative phrasing for this message could perhaps be 'maximum width of the land aperture'.",
        "exif-subjectdistance": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe subject of a photograph is the person or thing on which the camera focuses. 'Subject distance' is the distance to the subject given in meters.",
 -      "exif-meteringmode": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee [[w:Metering_mode|Wikipedia article]] on metering mode.\n{{Related|Exif-meteringmode}}",
 -      "exif-lightsource": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Related|Exif-lightsource}}",
 -      "exif-flash": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee this [[w:en:Flash_(photography)|Wikipedia article]] for an explanation of the term.\n{{Related|Exif-flash}}\n{{Identical|Flash}}",
 +      "exif-meteringmode": "{{exif-qqq}}\n\nSee [[w:Metering mode|Wikipedia article]] on metering mode.\n\n{{Related|Exif-meteringmode}}",
 +      "exif-lightsource": "{{exif-qqq}}\n\n{{Related|Exif-lightsource}}",
 +      "exif-flash": "{{exif-qqq}}\n\nSee this [[w:en:Flash (photography)|Wikipedia article]] for an explanation of the term.\n\n{{Related|Exif-flash}}\n{{Identical|Flash}}",
        "exif-focallength": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee this [[w:en:Focal_length_(photography)|Wikipedia article]] for an explanation of the term.",
        "exif-focallength-format": "{{optional}}\nExif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nParameters:\n* $1 - a number\nNote:\n* mm is the abbreviation used in English for the unit of measurement of length \"millimeter\".",
 -      "exif-subjectarea": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis exif property contains the position of the main subject. The first two numbers is the position of the subject in the picture in pixels from the upper left corner. If a third number is specified, it is a circle centred at the first two numbers. If four numbers are specified, the first two are coordinates of the centre of the subject as before, the third is the width of the rectangle, and the fourth is the height of the rectangle. It is rare for a photo to use this tag.",
 +      "exif-subjectarea": "{{exif-qqq}}\n\nThis exif property contains the position of the main subject. The first two numbers is the position of the subject in the picture in pixels from the upper left corner. If a third number is specified, it is a circle centred at the first two numbers. If four numbers are specified, the first two are coordinates of the centre of the subject as before, the third is the width of the rectangle, and the fourth is the height of the rectangle. It is rare for a photo to use this tag.",
        "exif-flashenergy": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nHow bright the flash is in beam candle power seconds.",
        "exif-focalplanexresolution": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nIndicates the number of pixels in the image width (X) direction per FocalPlaneResolutionUnit on the camera focal plane.",
        "exif-focalplaneyresolution": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
 -      "exif-focalplaneresolutionunit": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also:\n* {{msg-mw|Exif-focalplaneresolutionunit-2}}",
 +      "exif-focalplaneresolutionunit": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-focalplaneresolutionunit-2}}",
        "exif-subjectlocation": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSame as {{msg-mw|exif-subjectarea}} but only ever has two numbers as a value.",
        "exif-exposureindex": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
 -      "exif-sensingmethod": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Related|Exif-sensingmethod}}",
 +      "exif-sensingmethod": "{{exif-qqq}}\n{{Related|Exif-sensingmethod}}",
        "exif-filesource": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nDetermines if the image was recorded by a digital camera adhering to DSC standard (which is almost all digital cameras).",
 -      "exif-scenetype": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nIf the image is directly photographed (taken by a digital camera).\n\nSee also:\n* {{msg-mw|Exif-scenetype}}\n* {{msg-mw|Exif-scenetype-1}}",
 -      "exif-customrendered": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also Wikipedia on [[w:Image_processing|image processing]].\n\nSee also:\n* {{msg-mw|Exif-customrendered}}\n* {{msg-mw|Exif-customrendered-0}}\n* {{msg-mw|Exif-customrendered-1}}",
 -      "exif-exposuremode": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also Wikipedia on [[w:en:Exposure_(photography)|exposure in photography]]. This tag shows if the photo's exposure was manually set or automatically determined.\n{{Related|Exif-exposuremode}}",
 -      "exif-whitebalance": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also Wikipedia on [[w:Color_balance|color balance]].\n\nSee also:\n* {{msg-mw|Exif-whitebalance}}\n* {{msg-mw|Exif-whitebalance-0}}\n* {{msg-mw|Exif-whitebalance-1}}",
 +      "exif-scenetype": "{{exif-qqq}}\n\nThis tag indicates whether the image is directly photographed (taken by a digital camera).\n\nSee also:\n* {{msg-mw|Exif-scenetype}}\n* {{msg-mw|Exif-scenetype-1}}",
 +      "exif-customrendered": "{{exif-qqq}}\n\nSee also the Wikipedia article on [[w:Image processing|image processing]].\n\nSee also:\n* {{msg-mw|Exif-customrendered}}\n* {{msg-mw|Exif-customrendered-0}}\n* {{msg-mw|Exif-customrendered-1}}",
 +      "exif-exposuremode": "{{exif-qqq}}\n\nThis tag shows if the photo's exposure was manually set or automatically determined. See the Wikipedia article on [[w:en:Exposure (photography)|exposure in photography]] for more details.\n\n{{Related|Exif-exposuremode}}",
 +      "exif-whitebalance": "{{exif-qqq}}\n\nSee also the Wikipedia article on [[w:Color balance|color balance]].\n\nSee also:\n* {{msg-mw|Exif-whitebalance}}\n* {{msg-mw|Exif-whitebalance-0}}\n* {{msg-mw|Exif-whitebalance-1}}",
        "exif-digitalzoomratio": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also Wikipedia on [[w:Digital_zoom|digital zoom]].",
        "exif-focallengthin35mmfilm": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also Wikipedia on [[w:Focal_length#In_photography|focal length]].",
 -      "exif-scenecapturetype": "{{Related|Exif-scenecapturetype}}",
 -      "exif-gaincontrol": "Gain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n{{Related|Exif-gaincontrol}}",
 -      "exif-contrast": "{{Related|Exif-contrast}}",
 -      "exif-saturation": "{{Related|Exif-saturation}}",
 -      "exif-sharpness": "{{Related|Exif-sharpness}}",
 +      "exif-scenecapturetype": "{{exif-qqq}}\n{{Related|Exif-scenecapturetype}}",
 +      "exif-gaincontrol": "{{exif-qqq}}\n\nGain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n\n{{Related|Exif-gaincontrol}}",
 +      "exif-contrast": "{{exif-qqq}}\n{{Related|Exif-contrast}}",
 +      "exif-saturation": "{{exif-qqq}}\n{{Related|Exif-saturation}}",
 +      "exif-sharpness": "{{exif-qqq}}\n{{Related|Exif-sharpness}}",
        "exif-devicesettingdescription": "The section header shown above device settings extracted from a file's EXIF data on the file's page.",
 -      "exif-subjectdistancerange": "{{Related|Exif-subjectdistancerange}}",
 +      "exif-subjectdistancerange": "{{exif-qqq}}\n{{Related|Exif-subjectdistancerange}}",
        "exif-imageuniqueid": "A unique identifier for the image in the form of a 128-bit hexadecimal string. See http://www.exif.org/Exif2-2.PDF for details on exif properties.",
        "exif-gpsversionid": "Version of the GPS IFD used to store location information. This is usually 2.2.0.0",
 -      "exif-gpslatituderef": "In older versions of mediawiki this referred to if the latitude was North or South. This is no longer used in modern versions of mediawiki except for when using a foreign image repository that is using an older version of mediawiki since the information is now contained in {{msg-mw|exif-gpslatitude}}.\n{{Related|Exif-gpslatitude}}",
 -      "exif-gpslatitude": "The latitude of the location from where the picture was taken from.\n{{Related|Exif-gpslatitude}}\n{{Identical|Latitude}}",
 -      "exif-gpslongituderef": "Same as {{msg-mw|exif-gpslatituderef}} but for longitude.\n\n{{Related|Exif-gpslatitude}}",
 -      "exif-gpslongitude": "The longitude of the location from where the picture was taken from.\n{{Related|Exif-gpslatitude}}\n{{Identical|Longitude}}",
 +      "exif-gpslatituderef": "{{exif-qqq}}\n\nIn older versions of mediawiki this referred to if the latitude was North or South. This is no longer used in modern versions of mediawiki except for when using a foreign image repository that is using an older version of mediawiki since the information is now contained in {{msg-mw|exif-gpslatitude}}.\n\n{{Related|Exif-gpslatitude}}",
 +      "exif-gpslatitude": "{{exif-qqq}}\n\nThe latitude of the location from where the picture was taken from.\n\n{{Related|Exif-gpslatitude}}\n{{Identical|Latitude}}",
 +      "exif-gpslongituderef": "{{exif-qqq}}\n\nSame as {{msg-mw|exif-gpslatituderef}} but for longitude.\n\n{{Related|Exif-gpslatitude}}",
 +      "exif-gpslongitude": "{{exif-qqq}}\n\nThe longitude of the location from where the picture was taken from.\n\n{{Related|Exif-gpslatitude}}\n{{Identical|Longitude}}",
        "exif-gpsaltituderef": "No longer used except for when using foreign image repository with old version of mediawiki. 0 for above sea level, 1 for below sea level.",
        "exif-gpsaltitude": "Altitude in meters that the image was taken at.",
        "exif-gpstimestamp": "Time (does not include date) that GPS measurement was taken, in UTC. Since often this is at the same time as photo was taken, this is sometimes more reliable than {{msg-mw|exif-datetimeoriginal}}.",
        "exif-gpssatellites": "Label for EXIF information. Indicates the GPS satellites used for measurements.",
 -      "exif-gpsstatus": "See also:\n* {{msg-mw|Exif-gpsstatus-a}}\n* {{msg-mw|Exif-gpsstatus-v}}",
 -      "exif-gpsmeasuremode": "Is the measurement 2D (latitude and longitude) or 3D (latitude, longitude, and altitude).\n\nSee also:\n* {{msg-mw|Exif-gpsmeasuremode-2}}\n* {{msg-mw|Exif-gpsmeasuremode-3}}",
 -      "exif-gpsdop": "How accurate the GPS information is. See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n{{Related|Exif-gpsdop}}",
 -      "exif-gpsspeedref": "{{Related|Exif-gpsspeed}}",
 -      "exif-gpsspeed": "{{Related|Exif-gpsspeed}}",
 -      "exif-gpstrackref": "See also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
 -      "exif-gpstrack": "See also:\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
 -      "exif-gpsimgdirectionref": "See also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
 -      "exif-gpsimgdirection": "See also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
 +      "exif-gpsstatus": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpsstatus-a}}\n* {{msg-mw|Exif-gpsstatus-v}}",
 +      "exif-gpsmeasuremode": "{{exif-qqq}}\n\nThis tag indicates whether the measurement 2D (latitude and longitude) or 3D (latitude, longitude, and altitude).\n\nSee also:\n* {{msg-mw|Exif-gpsmeasuremode-2}}\n* {{msg-mw|Exif-gpsmeasuremode-3}}",
 +      "exif-gpsdop": "{{exif-qqq}}\n\nHow accurate the GPS information is. See [[wikipedia:Dilution of precision (GPS)]].\n\n{{Related|Exif-gpsdop}}",
 +      "exif-gpsspeedref": "{{exif-qqq}}\n{{Related|Exif-gpsspeed}}",
 +      "exif-gpsspeed": "{{exif-qqq}}\n{{Related|Exif-gpsspeed}}",
 +      "exif-gpstrackref": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
 +      "exif-gpstrack": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
 +      "exif-gpsimgdirectionref": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
 +      "exif-gpsimgdirection": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
        "exif-gpsmapdatum": "Label for EXIF information. Indicates the geodetic survey data used by the GPS receiver.",
 -      "exif-gpsdestlatituderef": "{{Related|Exif-gpslatitude}}",
 -      "exif-gpsdestlatitude": "The latitude of the location shown in the picture, if it is different from latitude of the camera location. See {{msg-mw|exif-gpslatitude}}.\n{{Related|Exif-gpslatitude}}\n{{Identical|Latitude}}",
 -      "exif-gpsdestlongituderef": "{{Related|Exif-gpslatitude}}",
 -      "exif-gpsdestlongitude": "The longitude of the location shown in the picture, if it is different from longitude of the camera location. See {{msg-mw|exif-gpslongitude}}.\n{{Related|Exif-gpslatitude}}\n{{Identical|Longitude}}",
 -      "exif-gpsdestbearingref": "See also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}",
 -      "exif-gpsdestbearing": "See also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
 -      "exif-gpsdestdistanceref": "I think \"reference\" stands for \"unit\". See {{msg-mw|Exif-gpsspeedref}}\n{{Related|Exif-gpsdestdistance}}",
 -      "exif-gpsdestdistance": "{{Related|Exif-gpsdestdistance}}",
 +      "exif-gpsdestlatituderef": "{{exif-qqq}}\n{{Related|Exif-gpslatitude}}",
 +      "exif-gpsdestlatitude": "{{exif-qqq}}\n\nThe latitude of the location shown in the picture, if it is different from latitude of the camera location. See {{msg-mw|exif-gpslatitude}}.\n\n{{Related|Exif-gpslatitude}}\n{{Identical|Latitude}}",
 +      "exif-gpsdestlongituderef": "{{exif-qqq}}\n{{Related|Exif-gpslatitude}}",
 +      "exif-gpsdestlongitude": "{{exif-qqq}}\n\nThe longitude of the location shown in the picture, if it is different from longitude of the camera location. See {{msg-mw|exif-gpslongitude}}.\n\n{{Related|Exif-gpslatitude}}\n{{Identical|Longitude}}",
 +      "exif-gpsdestbearingref": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}",
 +      "exif-gpsdestbearing": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
 +      "exif-gpsdestdistanceref": "{{exif-qqq}}\n\nIndicates the unit used to express the distance to the destination point. Values are typically \"K\", \"M\" or \"N\", standing for kilometers, miles and nautical miles, respectively. See also {{msg-mw|Exif-gpsspeedref}}.\n\n{{Related|Exif-gpsdestdistance}}",
 +      "exif-gpsdestdistance": "{{exif-qqq}}\n{{Related|Exif-gpsdestdistance}}",
        "exif-gpsprocessingmethod": "Label for EXIF information. A character string recording the name of the method used for location finding.",
        "exif-gpsareainformation": "Label for EXIF information. Contains a character string recording the name of the GPS area.",
 -      "exif-gpsdatestamp": "Date (does not generally include time unless recorded in XMP) that GPS measurement was taken, in UTC. Since often this is at the same date as photo was taken, this is sometimes more reliable than {{msg-mw|exif-datetimeoriginal}}.",
 +      "exif-gpsdatestamp": "{{exif-qqq}}\n\nDate (does not generally include time unless recorded in XMP) that GPS measurement was taken, in UTC. Since often this is at the same date as photo was taken, this is sometimes more reliable than {{msg-mw|exif-datetimeoriginal}}.",
        "exif-gpsdifferential": "Label for EXIF information. Indicates whether differential correction is applied to the GPS receiver.",
        "exif-coordinate-format": "{{optional}}\nFor formatting GPS latitude coordinates. Parameters:\n* $1 - degrees\n* $2 - minutes\n* $3 - seconds (up to two decimal places)\n* $4 - direction (N, S, W, or E)\n* $5 - (Unused) coordinate as a single positive or negative real number",
        "exif-jpegfilecomment": "This is not a true exif tag, but the contents of the JPEG COM segment. This often contains a file source, but can potentially contain any comment about the file. This is similar to {{msg-mw|exif-usercomment}}, {{msg-mw|exif-pngfilecomment}}, and {{msg-mw|exif-giffilecomment}}.",
 -      "exif-keywords": "List of keywords for the photograph (or other media).\n\nThis can come from IPTC-iim 2:25 keyword field, or XMP's dc:subject field.\n{{Identical|Keyword}}",
 +      "exif-keywords": "{{exif-qqq}}\n\nList of keywords for the photograph (or other media). This can come from IPTC-iim 2:25 keyword field, or XMP's dc:subject field.\n\n{{Identical|Keyword}}",
        "exif-worldregioncreated": "The world region (generally that means continent, but could also include 'World' as a whole) where the media was created.",
 -      "exif-countrycreated": "Country that the picture was taken in. Note this is where it was taken, not what country is depicted in the picture.",
 +      "exif-countrycreated": "{{exif-qqq}}\n\nCountry that the picture was taken in. Note this is where it was taken, not what country is depicted in the picture.",
        "exif-countrycodecreated": "ISO Code for the country that the picture was taken in. Note this is where it was taken, not what country is depicted in the picture.",
        "exif-provinceorstatecreated": "Province, state, territory, or other secondary political division (bigger than a city, smaller then a country) where that the picture was taken in.  Note this is where it was taken, not what province/state is depicted in the picture.",
        "exif-citycreated": "City that the picture was taken in.  Note this is where it was taken, not what city is depicted in the picture. This is generally only used if different from the city depicted in photo.",
        "exif-provinceorstatedest": "Province, state, territory, or other secondary political division shown.",
        "exif-citydest": "City shown",
        "exif-sublocationdest": "Sub-location of city shown. This could be an address, a street, an area of town, etc.",
 -      "exif-objectname": "This is a short name for the image or other media. (As compared to {{msg-mw|exif-imagedescription}} which is a long description of the image).\n\nThis is sometimes an ID number used to identify the photo, or a (short) title of the photo.\n\nThis property is extracted based on XMP's dc:title property ( http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf ), PNG's title keyword ( http://www.w3.org/TR/PNG/#11keywords ), or IPTC-iim 2:05 Object name property ( http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf ).",
 +      "exif-objectname": "{{exif-qqq}}\n\nThis is a short name for the image or other media. (As compared to {{msg-mw|exif-imagedescription}} which is a long description of the image).\n\nThis is sometimes an ID number used to identify the photo, or a (short) title of the photo.\n\nThis property is extracted based on XMP's [http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf dc:title property], PNG's [http://www.w3.org/TR/PNG/#11keywords title keyword], or IPTC-iim 2:05 [http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf Object name property].",
        "exif-specialinstructions": "Special instructions for how to use the image/media. This might include embargo notices, or other warnings.\n\nThis is IPTC-iim property 2:40. See http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf for details.",
 -      "exif-headline": "A short version of the image caption. The IPTC4XMP standard is clear that \"this is not the same thing as title [ {{msg-mw|exif-objectname}} ]\".\n\nThis is extracted from XMP's photoshop:headline ( http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-201007_1.pdf ) and IPTC-iim: 2:105 Headline tag ( http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf ).\n{{Identical|Headline}}",
 +      "exif-headline": "{{exif-qqq}}\n\nA short version of the image caption. The IPTC4XMP standard is clear that \"this is not the same thing as title [ {{msg-mw|exif-objectname}} ]\".\n\nThis is extracted from [http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-201007_1.pdf XMP's photoshop:headline] and [http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf IPTC-iim: 2:105 Headline tag].\n\n{{Identical|Headline}}",
        "exif-credit": "Provider/credit.\n\nWho gave us the image. This might be different from the creator of the image. This is IPTC-iim property 2:110",
 -      "exif-source": "See IPTC-iim standard 2:115 - http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf.\n\nThis is who originally owned the image (a person, stock photo agency, etc). This does not refer to the image this image is based on.\n{{Identical|Source}}",
 +      "exif-source": "{{exif-qqq}}\n\nSee [http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf IPTC-iim standard 2:115].\n\nThis is who originally owned the image (a person, stock photo agency, etc). This does not refer to the image this image is based on.\n\n{{Identical|Source}}",
        "exif-editstatus": "Editorial status of image. This is more intended for use with people making news papers. This denotes whether the image is on the main page, is part of a correction, etc. See 2:07 of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf",
 -      "exif-urgency": "Urgency. How urgent this image is. 1 is very urgent, 5 is normal, 8 is  very low priority.\n{{Related|Exif-urgency}}",
 +      "exif-urgency": "{{exif-qqq}}\n\nUrgency. How urgent this image is. 1 is very urgent, 5 is normal, 8 is  very low priority.\n\n{{Related|Exif-urgency}}",
        "exif-fixtureidentifier": "Fixture name. Identifies frequently occurring object data, for example a regular column in a news paper.",
        "exif-locationdest": "Full printable name of location.",
        "exif-locationdestcode": "Code of location depicted. Typically this is an ISO country code, but the IPTC-iim standard also defines other codes like XSP for outer space. See appendix D (and tag 2:100) of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf",
        "exif-objectcycle": "Time of day that media is intended for. Either morning only, evening only, or all day. Typically only used for news related things that might only be broadcast at a specific time of day.\n\nSee also:\n* {{msg-mw|Exif-objectcycle-a}}\n* {{msg-mw|Exif-objectcycle-p}}\n* {{msg-mw|Exif-objectcycle-b}}",
        "exif-contact": "Contact information of the person responsible for the image.",
        "exif-writer": "The person who wrote the caption of the image. See Description Writer on page 18 of http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-201007_1.pdf\n{{Identical|Writer}}",
 -      "exif-languagecode": "Language of image/media.\n\nThis is taken from IPTC-iim 2:135 and XMP's dc:language.\n{{Identical|Language}}",
 +      "exif-languagecode": "{{exif-qqq}}\n\nLanguage of image/media. This is taken from IPTC-iim 2:135 and XMP's dc:language.\n\n{{Identical|Language}}",
        "exif-iimversion": "IIM version number. Version of information interchange 2:xx records. 4 is current version. 2 is often seen as well. This is the value stored 2:00 field (Note, iptc-iim also stores a model version in 1:00. This version field displays the 2:00 record only)",
 -      "exif-iimcategory": "Primary Category of image (or other media). Technically supposed to be limited to 3 characters, however that is not always followed. Some common 3 letter category abbreviations are expanded by mediawiki. Similar to {{msg-mw|exif-keywords}}.\n{{Identical|Category}}",
 +      "exif-iimcategory": "{{exif-qqq}}\n\nPrimary Category of image (or other media). Technically supposed to be limited to 3 characters, however that is not always followed. Some common 3 letter category abbreviations are expanded by mediawiki. Similar to {{msg-mw|exif-keywords}}.\n\n{{Identical|Category}}",
        "exif-iimsupplementalcategory": "Supplemental categories. Like {{msg-mw|exif-iimcategory}} but for categories beyond the main one.",
 -      "exif-datetimeexpires": "Date after which not to use the image (media). This is often used in news situations were certain things (like forecasts) should not be used after a specified date.",
 -      "exif-datetimereleased": "Earliest date the image (media) can be used.\n\nSee 2:30 of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf",
 +      "exif-datetimeexpires": "{{exif-qqq}}\n\nDate after which not to use the image (media). This is often used in news situations were certain things (like forecasts) should not be used after a specified date.",
 +      "exif-datetimereleased": "{{exif-qqq}}\n\nEarliest date the image (media) can be used.\n\nSee 2:30 of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf",
        "exif-originaltransmissionref": "This is basically a job ID. This could help an individual keep track of for what reason the image was created.\n\nSee Job Id on page 19 of http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-201007_1.pdf",
 -      "exif-identifier": "A formal identifier for the image. Often this is a URL.\n{{Identical|Identifier}}",
 +      "exif-identifier": "{{exif-qqq}}\nA formal identifier for the image. Often this is a URL.\n{{Identical|Identifier}}",
        "exif-lens": "Description of lens used. This is taken from aux:Lens XMP property. See http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart2.pdf",
        "exif-serialnumber": "Serial number of camera. See aux:SerialNumber in http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart2.pdf",
        "exif-cameraownername": "Who owns the camera.",
 -      "exif-label": "Label given to the image for organizational purposes. This is very similar to {{msg-mw|exif-keywords}}. Label is more used by a person to organize their media, where keywords are used to describe the photo contents itself.\n\nThis property can come from xmp:Label in XMP ( http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf ) or the label textual chunk in PNG.\n{{Identical|Label}}",
 -      "exif-datetimemetadata": "Date metadata was last modified. Typically this refers to XMP metadata.",
 +      "exif-label": "{{exif-qqq}}\n\nLabel given to the image for organizational purposes. This is very similar to {{msg-mw|exif-keywords}}. Label is more used by a person to organize their media, where keywords are used to describe the photo contents itself.\n\nThis property can come from xmp:Label in XMP ( http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf ) or the label textual chunk in PNG.\n\n{{Identical|Label}}",
 +      "exif-datetimemetadata": "{{exif-qqq}}\n\nDate metadata was last modified. Typically this refers to XMP metadata.",
        "exif-nickname": "Short informal name of image. See http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart2.pdf",
        "exif-rating": "This is a rating for how good the image is. The range is between 1 to 5 (5 highest), with an additional option of \"reject\".",
        "exif-rightscertificate": "URL of Rights management certificate. This comes from XMPRights:Certificate property. See http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf",
        "exif-copyrighted": "Copyright status. This is a true or false field showing either Copyrighted or Public Domain. It should be noted that Copyrighted includes freely-licensed works.",
 -      "exif-copyrightowner": "Copyright owner. Can have more than one person or entity.",
 +      "exif-copyrightowner": "{{exif-qqq}}\n\nCopyright owner. Can have more than one person or entity.",
        "exif-usageterms": "Terms under which you're allowed to use the image/media.",
 -      "exif-webstatement": "URL detailing the copyright status of the image, and how you're allowed to use the image. Often this is a link to a creative commons license, however the creative commons people recommend using a page that generally contains specific information about the image, and recommend using {{msg-mw|exif-licenseurl}} for linking to the license. See http://wiki.creativecommons.org/XMP",
 +      "exif-webstatement": "{{exif-qqq}}\n\nURL detailing the copyright status of the image, and how you're allowed to use the image. Often this is a link to a creative commons license, however the creative commons people recommend using a page that generally contains specific information about the image, and recommend using {{msg-mw|exif-licenseurl}} for linking to the license. See http://wiki.creativecommons.org/XMP",
        "exif-originaldocumentid": "A unique ID of the original document (image) that this document (image) is based on.",
 -      "exif-licenseurl": "URL for copyright license. This is almost always a creative commons license since this information comes from the creative commons namespace of XMP (but could be a link to any type of license). See also {{msg-mw|exif-webstatement}}",
 +      "exif-licenseurl": "{{exif-qqq}}\n\nURL for copyright license. This is almost always a creative commons license since this information comes from the creative commons namespace of XMP (but could be a link to any type of license). See also {{msg-mw|exif-webstatement}}",
        "exif-morepermissionsurl": "A URL where you can \"buy\" (or otherwise negotiate) to get more rights for the image.",
        "exif-attributionurl": "A URL that you're supposed to use when re-using the image.",
        "exif-preferredattributionname": "The preferred name to give credit to when re-using this image.",
 -      "exif-pngfilecomment": "See also:\n* {{msg-mw|Exif-pngfilecomment}}\n* {{msg-mw|Exif-giffilecomment}}",
 -      "exif-disclaimer": "Disclaimer for the image.\n{{Identical|Disclaimer}}",
 +      "exif-pngfilecomment": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-pngfilecomment}}\n* {{msg-mw|Exif-giffilecomment}}",
 +      "exif-disclaimer": "{{exif-qqq}}\n\nDisclaimer for the image.\n\n{{Identical|Disclaimer}}",
        "exif-contentwarning": "Content warning for the image. For example if the image/media contains violent, sexual or otherwise offensive content.\n\nThis comes from the png warning textual chunk. See http://www.w3.org/TR/PNG/#11keywords",
 -      "exif-giffilecomment": "See also:\n* {{msg-mw|Exif-pngfilecomment}}\n* {{msg-mw|Exif-giffilecomment}}",
 +      "exif-giffilecomment": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-pngfilecomment}}\n* {{msg-mw|Exif-giffilecomment}}",
        "exif-intellectualgenre": "The \"intellectual genre\" of the image/media item. This typically means the type of item it is, ignoring the actual content of the item. See http://cv.iptc.org/newscodes/genre/ for some examples of the types of values this field might have.",
        "exif-subjectnewscode": "A (or multiple) codes describing the content of the image/media. The code is an 8 digit number representing some sort of category. The code is hierarchical , with the first two digits being a broad category (this broad category is shown to the user. See {{msg-mw|exif-subjectnewscode-value}} for how the value this field labels is shown to user). See http://cv.iptc.org/newscodes/subjectcode for the full list of codes.",
        "exif-scenecode": "IPTC (numeric) scene code. Contains information on what type of scene it is (like panoramic scene, close-up, etc). See http://cv.iptc.org/newscodes/scene/",
        "exif-software-value": "{{notranslate}}\nParameters:\n* $1 - software name",
        "exif-software-version-value": "{{notranslate}}\nParameters:\n* $1 - software name\n* $2 - version number",
        "exif-contact-value": "{{optional}}\nParameters:\n* $1 - email\n* $2 - URL of website\n* $3 - street address\n* $4 - city\n* $5 - region\n* $6 - postal code\n* $7 - country\n* $8 - telephone number\nNote, not all fields are guaranteed to be present, some may be empty strings.",
 -      "exif-subjectnewscode-value": "{{Optional}}\nParameters:\n* $1 - numeric IPTC subject news code (one of http://cv.iptc.org/newscodes/subjectcode )\n* $2 - one of 17 broad categories that the code falls into. For example any code starting with 15 has the contents of {{msg-mw|Exif-iimcategory-spo}} for $2.",
 -      "exif-compression-1": "{{Related|Exif-compression}}",
 +      "exif-subjectnewscode-value": "{{Optional}}\n\n{{exif-qqq}}\n\nParameters:\n* $1 - numeric IPTC subject news code (one of http://cv.iptc.org/newscodes/subjectcode )\n* $2 - one of 17 broad categories that the code falls into. For example any code starting with 15 has the contents of {{msg-mw|Exif-iimcategory-spo}} for $2.",
 +      "exif-compression-1": "{{exif-qqq}}\n{{Related|Exif-compression}}",
        "exif-compression-2": "{{Related|Exif-compression}}",
        "exif-compression-3": "{{Related|Exif-compression}}",
        "exif-compression-4": "{{Related|Exif-compression}}",
        "exif-compression-34712": "{{optional}}",
        "exif-copyrighted-true": "The image is under copyright (including if its copyrighted but freely licensed)",
        "exif-copyrighted-false": "Copyright status is not set in the file.\n\nCompare: {{msg-mw|exif-copyrighted-true}}.",
 -      "exif-photometricinterpretation-2": "{{optional}}",
 -      "exif-photometricinterpretation-6": "{{optional}}",
 -      "exif-unknowndate": "Used if the Exif date and time is \"<code>0000:00:00 00:00:00</code>\".\n\nRelated Exif attributes:\n* {{msg-mw|Exif-datetime}}\n* {{msg-mw|Exif-datetimeoriginal}}\n* {{msg-mw|Exif-datetimedigitized}}\n* {{msg-mw|Exif-datetimereleased}}\n* {{msg-mw|Exif-datetimeexpires}}\n* {{msg-mw|Exif-gpsdatestamp}}\n* {{msg-mw|Exif-dc-date}}\n* {{msg-mw|Exif-datetimemetadata}}",
 +      "exif-photometricinterpretation-0": "Black and white image. See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
 +      "exif-photometricinterpretation-1": "Black and white image. Commons for B&W tiffs. See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
 +      "exif-photometricinterpretation-2": "{{optional}} RGB (red green blue) image. Common for colour tiffs. See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
 +      "exif-photometricinterpretation-3": "See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
 +      "exif-photometricinterpretation-4": "See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
 +      "exif-photometricinterpretation-5": "See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
 +      "exif-photometricinterpretation-6": "{{optional}}\nYCbCr encoding. Common for jpeg images and tiffs with jpeg compressed data",
 +      "exif-photometricinterpretation-8": "{{optional}}\nSee http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
 +      "exif-photometricinterpretation-9": "See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
 +      "exif-photometricinterpretation-10": "See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
 +      "exif-photometricinterpretation-32803": "Used mostly by DNG images. See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
 +      "exif-photometricinterpretation-34892": "Used mostly by DNG images. See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
 +      "exif-unknowndate": "{{exif-qqq}}\n\nUsed if the Exif date and time is \"<code>0000:00:00 00:00:00</code>\".\n\nRelated Exif attributes:\n* {{msg-mw|Exif-datetime}}\n* {{msg-mw|Exif-datetimeoriginal}}\n* {{msg-mw|Exif-datetimedigitized}}\n* {{msg-mw|Exif-datetimereleased}}\n* {{msg-mw|Exif-datetimeexpires}}\n* {{msg-mw|Exif-gpsdatestamp}}\n* {{msg-mw|Exif-dc-date}}\n* {{msg-mw|Exif-datetimemetadata}}",
        "exif-orientation-1": "0th row: top; 0th column: left\n{{Related|Exif-orientation}}\n{{Identical|Normal}}",
 -      "exif-orientation-2": "0th row: top; 0th column: right\n{{Related|Exif-orientation}}",
 -      "exif-orientation-3": "0th row: bottom; 0th column: right\n{{Related|Exif-orientation}}",
 -      "exif-orientation-4": "0th row: bottom; 0th column: left\n{{Related|Exif-orientation}}",
 +      "exif-orientation-2": "{{exif-qqq}}\n\n0th row: top; 0th column: right\n\n{{Related|Exif-orientation}}",
 +      "exif-orientation-3": "{{exif-qqq}}\n\n0th row: bottom; 0th column: right\n\n{{Related|Exif-orientation}}",
 +      "exif-orientation-4": "{{exif-qqq}}\n\n0th row: bottom; 0th column: left\n\n{{Related|Exif-orientation}}",
        "exif-orientation-5": "0th row: left; 0th column: top\n\nCCW is an abbreviation for counter-clockwise\n{{Related|Exif-orientation}}",
 -      "exif-orientation-6": "0th row: right; 0th column: top\n\nCCW is an abbreviation for counter-clockwise.\n{{Related|Exif-orientation}}",
 +      "exif-orientation-6": "{{exif-qqq}}\n\n0th row: right; 0th column: top\n\nCCW is an abbreviation for counter-clockwise.\n\n{{Related|Exif-orientation}}",
        "exif-orientation-7": "0th row: right; 0th column: bottom\n\nCW is an abbreviation for clockwise\n{{Related|Exif-orientation}}",
 -      "exif-orientation-8": "0th row: left; 0th column: bottom\n\nCW is an abbreviation for clockwise.\n{{Related|Exif-orientation}}",
 -      "exif-planarconfiguration-1": "See also:\n* {{msg-mw|Exif-planarconfiguration}}\n* {{msg-mw|Exif-planarconfiguration-1}}\n* {{msg-mw|Exif-planarconfiguration-2}}",
 -      "exif-planarconfiguration-2": "See also:\n* {{msg-mw|Exif-planarconfiguration}}\n* {{msg-mw|Exif-planarconfiguration-1}}\n* {{msg-mw|Exif-planarconfiguration-2}}",
 +      "exif-orientation-8": "{{exif-qqq}}\n\n0th row: left; 0th column: bottom\n\nCW is an abbreviation for clockwise.\n\n{{Related|Exif-orientation}}",
 +      "exif-planarconfiguration-1": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-planarconfiguration}}\n* {{msg-mw|Exif-planarconfiguration-1}}\n* {{msg-mw|Exif-planarconfiguration-2}}",
 +      "exif-planarconfiguration-2": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-planarconfiguration}}\n* {{msg-mw|Exif-planarconfiguration-1}}\n* {{msg-mw|Exif-planarconfiguration-2}}",
        "exif-xyresolution-i": "{{Optional}}\nUsed to format {{msg-mw|Exif-xresolution}} and {{msg-mw|Exif-yresolution}} if the unit is dots per inch.\n\nParameters:\n* $1 - the number of dots/in",
        "exif-xyresolution-c": "{{Optional}}\nUsed to format {{msg-mw|Exif-xresolution}} and {{msg-mw|Exif-yresolution}} if the unit is dots per centimeter.\n\nParameters:\n* $1 - the number of dots/cm",
 -      "exif-colorspace-1": "{{Optional}}\nIf it uses the standard sRGB colour space.\n\nSee also:\n* {{msg-mw|Exif-colorspace}}\n* {{msg-mw|Exif-colorspace-1|optional}}\n* {{msg-mw|Exif-colorspace-65535}}",
 -      "exif-colorspace-65535": "The photograph is not colour calibrated.\n\nSee also:\n* {{msg-mw|Exif-colorspace}}\n* {{msg-mw|Exif-colorspace-1|optional}}\n* {{msg-mw|Exif-colorspace-65535}}",
 -      "exif-componentsconfiguration-0": "{{Related|Exif-componentsconfiguration}}",
 -      "exif-componentsconfiguration-1": "{{optional}}\n{{Related|Exif-componentsconfiguration}}",
 -      "exif-componentsconfiguration-2": "{{optional}}\n{{Related|Exif-componentsconfiguration}}",
 -      "exif-componentsconfiguration-3": "{{optional}}\n{{Related|Exif-componentsconfiguration}}",
 -      "exif-componentsconfiguration-4": "{{optional}}\n{{Related|Exif-componentsconfiguration}}",
 -      "exif-componentsconfiguration-5": "{{optional}}\n{{Related|Exif-componentsconfiguration}}",
 -      "exif-componentsconfiguration-6": "{{optional}}\n{{Related|Exif-componentsconfiguration}}",
 -      "exif-exposureprogram-0": "{{Related|Exif-exposureprogram}}",
 +      "exif-colorspace-1": "{{Optional}}\n{{exif-qqq}}\n\nThis value indicates that the image uses the standard sRGB colour space.\n\nSee also:\n* {{msg-mw|Exif-colorspace}}\n* {{msg-mw|Exif-colorspace-1|optional}}\n* {{msg-mw|Exif-colorspace-65535}}",
 +      "exif-colorspace-65535": "{{exif-qqq}}\n\nThis value indicates that the photograph is not colour-calibrated.\n\nSee also:\n* {{msg-mw|Exif-colorspace}}\n* {{msg-mw|Exif-colorspace-1|optional}}\n* {{msg-mw|Exif-colorspace-65535}}",
 +      "exif-componentsconfiguration-0": "{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
 +      "exif-componentsconfiguration-1": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
 +      "exif-componentsconfiguration-2": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
 +      "exif-componentsconfiguration-3": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
 +      "exif-componentsconfiguration-4": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
 +      "exif-componentsconfiguration-5": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
 +      "exif-componentsconfiguration-6": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
 +      "exif-exposureprogram-0": "{{exif-qqq}}\n{{Related|Exif-exposureprogram}}",
        "exif-exposureprogram-1": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.\n{{Related|Exif-exposureprogram}}\n{{Identical|Manual}}",
 -      "exif-exposureprogram-2": "One of the exposure program types in the table of metadata on image description pages.\n{{Related|Exif-exposureprogram}}",
 -      "exif-exposureprogram-3": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article for a definition of the term [[w:Aperture_priority|aperture priority]].\n{{Related|Exif-exposureprogram}}",
 -      "exif-exposureprogram-4": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article for a definition of the term [[w:Shutter_priority|shutter priority]].\n{{Related|Exif-exposureprogram}}",
 +      "exif-exposureprogram-2": "{{exif-qqq}}\n\nOne of the exposure program types in the table of metadata on image description pages.\n\n{{Related|Exif-exposureprogram}}",
 +      "exif-exposureprogram-3": "{{exif-qqq}}\n\nOne of the exposure program types in the table of metadata on image description pages. See the Wikipedia article for a definition of the term [[w:Aperture_priority|aperture priority]].\n\n{{Related|Exif-exposureprogram}}",
 +      "exif-exposureprogram-4": "{{exif-qqq}}\n\nOne of the exposure program types in the table of metadata on image description pages. See the Wikipedia article for a definition of the term [[w:Shutter_priority|shutter priority]].\n\n{{Related|Exif-exposureprogram}}",
        "exif-exposureprogram-5": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.\n{{Related|Exif-exposureprogram}}",
        "exif-exposureprogram-6": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.\n{{Related|Exif-exposureprogram}}",
        "exif-exposureprogram-7": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.\n{{Related|Exif-exposureprogram}}",
        "exif-subjectdistance-value": "Parameters:\n* $1 - a distance measured in meters. The value can, and usually does, include decimal places.",
        "exif-meteringmode-0": "{{Related|Exif-meteringmode}}\n{{Identical|Unknown}}",
        "exif-meteringmode-1": "{{Related|Exif-meteringmode}}\n{{Identical|Average}}",
 -      "exif-meteringmode-2": "{{Related|Exif-meteringmode}}",
 -      "exif-meteringmode-3": "{{Related|Exif-meteringmode}}",
 -      "exif-meteringmode-4": "{{Related|Exif-meteringmode}}",
 -      "exif-meteringmode-5": "{{Related|Exif-meteringmode}}\n{{Identical|Pattern}}",
 -      "exif-meteringmode-6": "{{Related|Exif-meteringmode}}",
 +      "exif-meteringmode-2": "{{exif-qqq}}\n{{Related|Exif-meteringmode}}",
 +      "exif-meteringmode-3": "{{exif-qqq}}\n{{Related|Exif-meteringmode}}",
 +      "exif-meteringmode-4": "{{exif-qqq}}\n{{Related|Exif-meteringmode}}",
 +      "exif-meteringmode-5": "{{exif-qqq}}\n{{Related|Exif-meteringmode}}\n{{Identical|Pattern}}",
 +      "exif-meteringmode-6": "{{exif-qqq}}\n{{Related|Exif-meteringmode}}",
        "exif-meteringmode-255": "{{Identical|Other}}",
        "exif-lightsource-0": "{{Identical|Unknown}}\n{{Related|Exif-lightsource}}",
 -      "exif-lightsource-1": "{{Related|Exif-lightsource}}",
 -      "exif-lightsource-2": "{{Related|Exif-lightsource}}",
 -      "exif-lightsource-3": "{{Related|Exif-lightsource}}",
 -      "exif-lightsource-4": "{{Identical|Flash}}\n{{Related|Exif-lightsource}}",
 -      "exif-lightsource-9": "{{Related|Exif-lightsource}}",
 -      "exif-lightsource-10": "{{Related|Exif-lightsource}}",
 -      "exif-lightsource-11": "{{Related|Exif-lightsource}}",
 -      "exif-lightsource-12": "{{Related|Exif-lightsource}}",
 -      "exif-lightsource-13": "{{Related|Exif-lightsource}}",
 -      "exif-lightsource-14": "{{Related|Exif-lightsource}}",
 -      "exif-lightsource-15": "{{Related|Exif-lightsource}}",
 -      "exif-lightsource-17": "{{Related|Exif-lightsource}}",
 -      "exif-lightsource-18": "{{Related|Exif-lightsource}}",
 -      "exif-lightsource-19": "{{Related|Exif-lightsource}}",
 -      "exif-lightsource-20": "{{optional}}\n{{Related|Exif-lightsource}}",
 -      "exif-lightsource-21": "{{optional}}\n{{Related|Exif-lightsource}}",
 -      "exif-lightsource-22": "{{optional}}\n{{Related|Exif-lightsource}}",
 -      "exif-lightsource-23": "{{optional}}\n{{Related|Exif-lightsource}}",
 -      "exif-lightsource-24": "{{Related|Exif-lightsource}}",
 -      "exif-lightsource-255": "{{Related|Exif-lightsource}}",
 +      "exif-lightsource-1": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
 +      "exif-lightsource-2": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
 +      "exif-lightsource-3": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
 +      "exif-lightsource-4": "{{exif-qqq}}\n{{Identical|Flash}}\n{{Related|Exif-lightsource}}",
 +      "exif-lightsource-9": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
 +      "exif-lightsource-10": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
 +      "exif-lightsource-11": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
 +      "exif-lightsource-12": "{{exif-qqq}}\n\nThe \"D\" stands for \"daylight\", as defined in the JIS Z 9112:2012 standard.\n\n{{Related|Exif-lightsource}}",
 +      "exif-lightsource-13": "{{exif-qqq}}\n\nThe \"N\" symbol is defined in the JIS Z 9112:2012 standard.\n\n{{Related|Exif-lightsource}}",
 +      "exif-lightsource-14": "{{exif-qqq}}\n\nThe \"W\" stands for \"white\", as defined in the JIS Z 9112:2012 standard.\n\n{{Related|Exif-lightsource}}",
 +      "exif-lightsource-15": "{{exif-qqq}}\n\nThe \"WW\" stands for \"warm white\", as defined in the JIS Z 9112:2012 standard.\n\n{{Related|Exif-lightsource}}",
 +      "exif-lightsource-17": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
 +      "exif-lightsource-18": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
 +      "exif-lightsource-19": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
 +      "exif-lightsource-20": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-lightsource}}",
 +      "exif-lightsource-21": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-lightsource}}",
 +      "exif-lightsource-22": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-lightsource}}",
 +      "exif-lightsource-23": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-lightsource}}",
 +      "exif-lightsource-24": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
 +      "exif-lightsource-255": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
        "exif-flash-fired-0": "{{Related|Exif-flash}}",
        "exif-flash-fired-1": "{{Related|Exif-flash}}",
        "exif-flash-return-0": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\n\"Strobe\" and \"flash\" mean the same here.\n{{Related|Exif-flash}}",
        "exif-flash-mode-3": "{{Related|Exif-flash}}",
        "exif-flash-function-1": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Related|Exif-flash}}",
        "exif-flash-redeye-1": "{{Related|Exif-flash}}",
 -      "exif-focalplaneresolutionunit-2": "See also:\n* {{msg-mw|Exif-focalplaneresolutionunit}}",
 +      "exif-focalplaneresolutionunit-2": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-focalplaneresolutionunit}}",
        "exif-sensingmethod-1": "{{Related|Exif-sensingmethod}}\n{{Identical|Undefined}}",
        "exif-sensingmethod-2": "{{Related|Exif-sensingmethod}}",
        "exif-sensingmethod-3": "{{Related|Exif-sensingmethod}}",
        "exif-sensingmethod-4": "{{Related|Exif-sensingmethod}}",
        "exif-sensingmethod-5": "''Color sequential'' means, that the three base colors are measured one after another (i.e. the sensor is first measuring red, than green, than blue).\n{{Related|Exif-sensingmethod}}",
 -      "exif-sensingmethod-7": "{{Related|Exif-sensingmethod}}",
 +      "exif-sensingmethod-7": "{{exif-qqq}}\n{{Related|Exif-sensingmethod}}",
        "exif-sensingmethod-8": "''Color sequential'' means, that the three base colors are measured one after another (i.e. the sensor is first measuring red, than green, than blue).\n{{Related|Exif-sensingmethod}}",
        "exif-filesource-3": "{{optional}}",
        "exif-scenetype-1": "See also:\n* {{msg-mw|Exif-scenetype}}\n* {{msg-mw|Exif-scenetype-1}}",
 -      "exif-customrendered-0": "See also:\n* {{msg-mw|Exif-customrendered}}\n* {{msg-mw|Exif-customrendered-0}}\n* {{msg-mw|Exif-customrendered-1}}",
 -      "exif-customrendered-1": "See also:\n* {{msg-mw|Exif-customrendered}}\n* {{msg-mw|Exif-customrendered-0}}\n* {{msg-mw|Exif-customrendered-1}}",
 -      "exif-exposuremode-0": "{{Related|Exif-exposuremode}}",
 -      "exif-exposuremode-1": "{{Related|Exif-exposuremode}}",
 -      "exif-exposuremode-2": "A type of exposure mode shown as part of the metadata on image description pages. The Wikipedia article on [[w:Bracketing#Exposure_bracketing|bracketing]] says that 'auto bracket' is a camera exposure setting which automatically takes a series of pictures at slightly different light exposures.\n{{Related|Exif-exposuremode}}",
 -      "exif-whitebalance-0": "See also:\n* {{msg-mw|Exif-whitebalance}}\n* {{msg-mw|Exif-whitebalance-0}}\n* {{msg-mw|Exif-whitebalance-1}}",
 -      "exif-whitebalance-1": "See also:\n* {{msg-mw|Exif-whitebalance}}\n* {{msg-mw|Exif-whitebalance-0}}\n* {{msg-mw|Exif-whitebalance-1}}",
 +      "exif-customrendered-0": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-customrendered}}\n* {{msg-mw|Exif-customrendered-0}}\n* {{msg-mw|Exif-customrendered-1}}",
 +      "exif-customrendered-1": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-customrendered}}\n* {{msg-mw|Exif-customrendered-0}}\n* {{msg-mw|Exif-customrendered-1}}",
 +      "exif-exposuremode-0": "{{exif-qqq}}\n{{Related|Exif-exposuremode}}",
 +      "exif-exposuremode-1": "{{exif-qqq}}\n{{Related|Exif-exposuremode}}",
 +      "exif-exposuremode-2": "{{exif-qqq}}\n\nA type of exposure mode shown as part of the metadata on image description pages. The Wikipedia article on [[w:Bracketing#Exposure_bracketing|bracketing]] says that 'auto bracket' is a camera exposure setting which automatically takes a series of pictures at slightly different light exposures.\n\n{{Related|Exif-exposuremode}}",
 +      "exif-whitebalance-0": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-whitebalance}}\n* {{msg-mw|Exif-whitebalance-0}}\n* {{msg-mw|Exif-whitebalance-1}}",
 +      "exif-whitebalance-1": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-whitebalance}}\n* {{msg-mw|Exif-whitebalance-0}}\n* {{msg-mw|Exif-whitebalance-1}}",
        "exif-scenecapturetype-0": "{{Related|Exif-scenecapturetype}}\n{{Identical|Standard}}",
 -      "exif-scenecapturetype-1": "{{Related|Exif-scenecapturetype}}",
 -      "exif-scenecapturetype-2": "{{Related|Exif-scenecapturetype}}",
 -      "exif-scenecapturetype-3": "{{Related|Exif-scenecapturetype}}",
 +      "exif-scenecapturetype-1": "{{exif-qqq}}\n{{Related|Exif-scenecapturetype}}",
 +      "exif-scenecapturetype-2": "{{exif-qqq}}\n{{Related|Exif-scenecapturetype}}",
 +      "exif-scenecapturetype-3": "{{exif-qqq}}\n{{Related|Exif-scenecapturetype}}",
        "exif-gaincontrol-0": "Gain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n{{Related|Exif-gaincontrol}}\n{{Identical|None}}",
 -      "exif-gaincontrol-1": "Gain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n{{Related|Exif-gaincontrol}}",
 -      "exif-gaincontrol-2": "Gain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n{{Related|Exif-gaincontrol}}",
 -      "exif-gaincontrol-3": "Gain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n{{Related|Exif-gaincontrol}}",
 -      "exif-gaincontrol-4": "Gain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n{{Related|Exif-gaincontrol}}",
 +      "exif-gaincontrol-1": "{{exif-qqq}}\n\nGain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n\n{{Related|Exif-gaincontrol}}",
 +      "exif-gaincontrol-2": "{{exif-qqq}}\n\nGain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n\n{{Related|Exif-gaincontrol}}",
 +      "exif-gaincontrol-3": "{{exif-qqq}}\n\nGain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n\n{{Related|Exif-gaincontrol}}",
 +      "exif-gaincontrol-4": "{{exif-qqq}}\n\nGain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n\n{{Related|Exif-gaincontrol}}",
        "exif-contrast-0": "{{Related|Exif-contrast}}\n{{Identical|Normal}}",
 -      "exif-contrast-1": "{{Related|Exif-contrast}}\n{{Identical|Soft}}",
 -      "exif-contrast-2": "{{Related|Exif-contrast}}\n{{Identical|Hard}}",
 +      "exif-contrast-1": "{{exif-qqq}}\n{{Related|Exif-contrast}}\n{{Identical|Soft}}",
 +      "exif-contrast-2": "{{exif-qqq}}\n{{Related|Exif-contrast}}\n{{Identical|Hard}}",
        "exif-saturation-0": "{{Related|Exif-saturation}}\n{{Identical|Normal}}",
 -      "exif-saturation-1": "{{Related|Exif-saturation}}",
 -      "exif-saturation-2": "Color saturation in picture EXIF data\n{{Related|Exif-saturation}}",
 +      "exif-saturation-1": "{{exif-qqq}}\n{{Related|Exif-saturation}}",
 +      "exif-saturation-2": "{{exif-qqq}}\n\nColor saturation in picture EXIF data\n\n{{Related|Exif-saturation}}",
        "exif-sharpness-0": "{{Related|Exif-sharpness}}\n{{Identical|Normal}}",
 -      "exif-sharpness-1": "{{Related|Exif-sharpness}}\n{{Identical|Soft}}",
 -      "exif-sharpness-2": "{{Related|Exif-sharpness}}\n{{Identical|Hard}}",
 +      "exif-sharpness-1": "{{exif-qqq}}\n{{Related|Exif-sharpness}}\n{{Identical|Soft}}",
 +      "exif-sharpness-2": "{{exif-qqq}}\n{{Related|Exif-sharpness}}\n{{Identical|Hard}}",
        "exif-subjectdistancerange-0": "{{Related|Exif-subjectdistancerange}}\n{{Identical|Unknown}}",
 -      "exif-subjectdistancerange-1": "Macro view is close-up photography. See [[w:Macro_photography|Wikipedia]].\n{{Identical|Macro}}\n{{Related|Exif-subjectdistancerange}}",
 -      "exif-subjectdistancerange-2": "{{Related|Exif-subjectdistancerange}}",
 -      "exif-subjectdistancerange-3": "{{Related|Exif-subjectdistancerange}}",
 -      "exif-gpslatitude-n": "Very rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n{{Related|Exif-gpslatitude}}",
 -      "exif-gpslatitude-s": "Very rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n{{Related|Exif-gpslatitude}}",
 -      "exif-gpslongitude-e": "Very rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n{{Related|Exif-gpslatitude}}",
 -      "exif-gpslongitude-w": "Very rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n{{Related|Exif-gpslatitude}}",
 +      "exif-subjectdistancerange-1": "{{exif-qqq}}\n\nMacro view is close-up photography. See [[w:Macro photography|Wikipedia]].\n\n{{Identical|Macro}}\n{{Related|Exif-subjectdistancerange}}",
 +      "exif-subjectdistancerange-2": "{{exif-qqq}}\n{{Related|Exif-subjectdistancerange}}",
 +      "exif-subjectdistancerange-3": "{{exif-qqq}}\n{{Related|Exif-subjectdistancerange}}",
 +      "exif-gpslatitude-n": "{{exif-qqq}}\n\nVery rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n\n{{Related|Exif-gpslatitude}}",
 +      "exif-gpslatitude-s": "{{exif-qqq}}\n\nVery rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n\n{{Related|Exif-gpslatitude}}",
 +      "exif-gpslongitude-e": "{{exif-qqq}}\n\nVery rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n\n{{Related|Exif-gpslatitude}}",
 +      "exif-gpslongitude-w": "{{exif-qqq}}\n\nVery rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n\n{{Related|Exif-gpslatitude}}",
        "exif-gpsaltitude-above-sealevel": "Used as GPS Altitude in Exif data. Parameters:\n* $1 - altitude above sea level (in meters)\nSee also:\n* {{msg-mw|Exif-gpsaltitude-below-sealevel}}",
        "exif-gpsaltitude-below-sealevel": "Used as GPS Altitude in Exif data. Parameters:\n* $1 - altitude below sea level (in meters)\nSee also:\n* {{msg-mw|Exif-gpsaltitude-above-sealevel}}",
 -      "exif-gpsstatus-a": "See also:\n* {{msg-mw|Exif-gpsstatus}}\n* {{msg-mw|Exif-gpsstatus-v}}",
 -      "exif-gpsstatus-v": "See also:\n* {{msg-mw|Exif-gpsstatus}}\n* {{msg-mw|Exif-gpsstatus-a}}",
 -      "exif-gpsmeasuremode-2": "Only latitude and longitude recorded, no altitude.\n\nSee also:\n* {{msg-mw|Exif-gpsmeasuremode}}\n* {{msg-mw|Exif-gpsmeasuremode-3}}",
 -      "exif-gpsmeasuremode-3": "Latitude, longitude, and altitude recorded.\n\nSee also:\n* {{msg-mw|Exif-gpsmeasuremode}}\n* {{msg-mw|Exif-gpsmeasuremode-2}}",
 -      "exif-gpsspeed-k": "{{Related|Exif-gpsspeed}}",
 -      "exif-gpsspeed-m": "{{Related|Exif-gpsspeed}}",
 -      "exif-gpsspeed-n": "Knots: ''Knot'' is a unit of speed on water used for ships, etc., equal to one nautical mile per hour.\n{{Related|Exif-gpsspeed}}",
 -      "exif-gpsdestdistance-k": "{{Related|Exif-gpsdestdistance}}",
 -      "exif-gpsdestdistance-m": "{{Related|Exif-gpsdestdistance}}",
 -      "exif-gpsdestdistance-n": "{{Related|Exif-gpsdestdistance}}",
 +      "exif-gpsstatus-a": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpsstatus}}\n* {{msg-mw|Exif-gpsstatus-v}}",
 +      "exif-gpsstatus-v": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpsstatus}}\n* {{msg-mw|Exif-gpsstatus-a}}",
 +      "exif-gpsmeasuremode-2": "{{exif-qqq}}\n\nOnly latitude and longitude recorded, no altitude.\n\nSee also:\n* {{msg-mw|Exif-gpsmeasuremode}}\n* {{msg-mw|Exif-gpsmeasuremode-3}}",
 +      "exif-gpsmeasuremode-3": "{{exif-qqq}}\n\nLatitude, longitude, and altitude recorded.\n\nSee also:\n* {{msg-mw|Exif-gpsmeasuremode}}\n* {{msg-mw|Exif-gpsmeasuremode-2}}",
 +      "exif-gpsspeed-k": "{{exif-qqq}}\n{{Related|Exif-gpsspeed}}",
 +      "exif-gpsspeed-m": "{{exif-qqq}}\n{{Related|Exif-gpsspeed}}",
 +      "exif-gpsspeed-n": "{{exif-qqq}}\n\n''Knot'' is a unit of speed on water used for ships, etc., equal to one nautical mile per hour.\n\n{{Related|Exif-gpsspeed}}",
 +      "exif-gpsdestdistance-k": "{{exif-qqq}}\n{{Related|Exif-gpsdestdistance}}",
 +      "exif-gpsdestdistance-m": "{{exif-qqq}}\n{{Related|Exif-gpsdestdistance}}",
 +      "exif-gpsdestdistance-n": "{{exif-qqq}}\n{{Related|Exif-gpsdestdistance}}",
        "exif-gpsdop-excellent": "Parameters:\n* $1 - the actual HDOP/PDOP value (less than or equal to 2 for excellent). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n{{Related|Exif-gpsdop}}",
        "exif-gpsdop-good": "Parameters:\n* $1 - the actual HDOP/PDOP value (2-5 for good). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n{{Related|Exif-gpsdop}}",
        "exif-gpsdop-moderate": "Parameters:\n* $1 - the actual HDOP/PDOP value (5-10 for moderate). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n{{Related|Exif-gpsdop}}\n{{Identical|Moderate}}",
 -      "exif-gpsdop-fair": "Parameters:\n* $1 - the actual HDOP/PDOP value (10-20 for fair). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n{{Related|Exif-gpsdop}}",
 +      "exif-gpsdop-fair": "{{exif-qqq}}\n\nParameters:\n* $1 - the actual HDOP/PDOP value (10-20 for fair). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n\n{{Related|Exif-gpsdop}}",
        "exif-gpsdop-poor": "Parameters:\n* $1 - the actual HDOP/PDOP value (greater than 20 for poor). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n{{Related|Exif-gpsdop}}",
        "exif-objectcycle-a": "Morning only (a is for AM).\n\nSee also:\n* {{msg-mw|Exif-objectcycle}}\n* {{msg-mw|Exif-objectcycle-p}}\n* {{msg-mw|Exif-objectcycle-b}}",
 -      "exif-objectcycle-p": "Evening only (p is for PM).\n\nSee also:\n* {{msg-mw|Exif-objectcycle}}\n* {{msg-mw|Exif-objectcycle-a}}\n* {{msg-mw|Exif-objectcycle-b}}",
 +      "exif-objectcycle-p": "{{exif-qqq}}\n\nEvening only (p is for PM).\n\nSee also:\n* {{msg-mw|Exif-objectcycle}}\n* {{msg-mw|Exif-objectcycle-a}}\n* {{msg-mw|Exif-objectcycle-b}}",
        "exif-objectcycle-b": "Both morning and evening (b is for both).\n\nSee also:\n* {{msg-mw|Exif-objectcycle}}\n* {{msg-mw|Exif-objectcycle-a}}\n* {{msg-mw|Exif-objectcycle-p}}",
 -      "exif-gpsdirection-t": "See also:\n* {{msg-mw|Exif-gpsdirection-m}}",
 -      "exif-gpsdirection-m": "See also:\n* {{msg-mw|Exif-gpsdirection-t}}",
 -      "exif-ycbcrpositioning-1": "If the Chrominance samples are centered with respect to the Luminance samples.\n{{Related|Exif-ycbcrpositioning}}",
 +      "exif-gpsdirection-t": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpsdirection-m}}",
 +      "exif-gpsdirection-m": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpsdirection-t}}",
 +      "exif-ycbcrpositioning-1": "{{exif-qqq}}\n\nThis tag indicates that the Chrominance samples are centered with respect to the Luminance samples.\n\n{{Related|Exif-ycbcrpositioning}}",
        "exif-ycbcrpositioning-2": "If the Chrominance samples are on top of to the Luminance samples.\nSee: http://www.awaresystems.be/imaging/tiff/tifftags/ycbcrpositioning.html\n{{Related|Exif-ycbcrpositioning}}",
        "exif-dc-contributor": "People who helped make the resource, but are secondary in contribution to the author.\n{{Identical|Contributor}}",
        "exif-dc-coverage": "\"The extent or scope of the resource\" see dc:coverage in http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart2.pdf",
        "exif-iimcategory-evn": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
        "exif-iimcategory-hth": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
        "exif-iimcategory-hum": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
 -      "exif-iimcategory-lab": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}\n\n\"Labor\" here refers to all news on labor issues; employment; unemployment; work relations; labor disputes; strikes; legislation; unions; job related issues; government policy. (at least, according to Reuters.)",
 +      "exif-iimcategory-lab": "{{exif-qqq}}\n\nDisplayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}\n\n\"Labor\" here refers to all news on labor issues; employment; unemployment; work relations; labor disputes; strikes; legislation; unions; job related issues; government policy. (at least, according to Reuters.)",
        "exif-iimcategory-lif": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
        "exif-iimcategory-pol": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
        "exif-iimcategory-rel": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
        "exif-iimcategory-spo": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}.\n{{Identical|Sport}}",
        "exif-iimcategory-war": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
        "exif-iimcategory-wea": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
 -      "exif-urgency-normal": "Parameters:\n* $1 - numeric priority (aka 5 for normal)\n{{Related|Exif-urgency}}",
 -      "exif-urgency-low": "Parameters:\n* $1 - numeric priority (6-8 for low)\n{{Related|Exif-urgency}}",
 +      "exif-urgency-normal": "{{exif-qqq}}\n\nParameters:\n* $1 - numeric priority (aka 5 for normal)\n\n{{Related|Exif-urgency}}",
 +      "exif-urgency-low": "{{exif-qqq}}\n\nParameters:\n* $1 - numeric priority (6-8 for low)\n\n{{Related|Exif-urgency}}",
        "exif-urgency-high": "Parameters:\n* $1 - numeric priority (1-4 for high)\n{{Related|Exif-urgency}}",
        "exif-urgency-other": "Parameters:\n* $1 - numeric priority. Most specs define 0 and 9 to either be reserved or not allowed. However the exiftool documentation defines 0 to be reserved and 9 to be user-defined priority.\n{{Related|Exif-urgency}}",
        "namespacesall": "In special page [[Special:WhatLinksHere]]. Drop-down box option for namespace.\n\n{{Identical|All}}",
        "confirmemail_body_set": "This is used in a confirmation email sent when a contact email address is set.\n\nSee also [[MediaWiki:Confirmemail body changed]].\n\nParameters:\n* $1 - the IP address of the user that set the email address\n* $2 - the name of the user\n* $3 - a URL to [[Special:ConfirmEmail]]\n* $4 - a time and date (duplicated by $6 and $7)\n* $5 - a URL to [[Special:InvalidateEmail]]\n* $6 - (Optional) a date\n* $7 - (Optional) a time\n{{Related|Confirmemail body}}",
        "confirmemail_invalidated": "This is the text of the special page [[Special:InvalidateEmail|InvalidateEmail]] (with the title in {{msg-mw|Invalidateemail}}) where user goes if he chooses the cancel e-mail confirmation link from the confirmation e-mail.",
        "invalidateemail": "This is the '''name of the special page''' where user goes if he chooses the cancel e-mail confirmation link from the confirmation e-mail.",
 +      "notificationemail_subject_changed": "Subject of the email sent to the previously registered email address notifying them about the change in the registered email address.",
 +      "notificationemail_subject_removed": "Subject of the email sent to the previously registered email address notifying them about the removal of the registered email address.",
 +      "notificationemail_body_changed": "Body of the email sent on the previously registered email address notifying them about the change in the registered email address.",
 +      "notificationemail_body_removed": "Body of the email sent on the previously registered email address notifying them about the removal of the registered email address.",
        "scarytranscludedisabled": "Shown when scary transclusion is disabled.",
        "scarytranscludefailed": "Shown when the HTTP request for the template failed. Identical to {{msg-mw|Scarytranscludefailed-httpstatus}}, but does not show the HTTP error which was received. This will not be parsed as wikitext and will appear as is. Parameters:\n* $1 - URL which points to interwiki template",
        "scarytranscludefailed-httpstatus": "Identical to {{msg-mw|Scarytranscludefailed}}, but shows the HTTP error which was received. This will not be parsed as wikitext and will appear as is. Parameters:\n* $1 - URL which points to interwiki template\n* $2 - HTTP status, integer (other than 200)",
        "scarytranscludetoolong": "The URL was too long.",
        "deletedwhileediting": "Used as warning in the EditPage page.",
 -      "confirmrecreate": "Followed by the checkbox which has the label {{msg-mw|Recreate}}.\n\nParameters:\n* $1 - username\n* $2 - reason\nSee also:\n* {{msg-mw|Confirmrecreate-noreason}}",
 -      "confirmrecreate-noreason": "Followed by the checkbox which has the label {{msg-mw|Recreate}}.\n\nParameters:\n* $1 - username\n* $2 - (Unused) reason\nSee also:\n* {{msg-mw|Confirmrecreate}}",
 +      "confirmrecreate": "Followed by the checkbox which has the label {{msg-mw|Recreate}}.\n\nParameters:\n* $1 - username, also used for GENDER support\n* $2 - reason\nSee also:\n* {{msg-mw|Confirmrecreate-noreason}}",
 +      "confirmrecreate-noreason": "Followed by the checkbox which has the label {{msg-mw|Recreate}}.\n\nParameters:\n* $1 - username, also used for GENDER support\n* $2 - (Unused) reason\nSee also:\n* {{msg-mw|Confirmrecreate}}",
        "recreate": "Text shown when the editor fails to save the page due to it having been deleted since they opened VE. $1 is the message {{msg-mw|ooui-dialog-process-continue}}.",
        "unit-pixel": "{{optional}}\npx is the abbreviation for \"pixel\".",
        "confirm_purge_button": "Used as Submit button text.\n{{Identical|OK}}",
        "confirm-watch-top": "Used as confirmation message.",
        "confirm-unwatch-button": "Used as Submit button text.\n{{Identical|OK}}",
        "confirm-unwatch-top": "Used as confirmation message.",
 +      "confirm-rollback-button": "Used as Submit button text.\n{{Identical|OK}}",
 +      "confirm-rollback-top": "Used as confirmation message.",
        "semicolon-separator": "{{optional}}",
        "comma-separator": "{{optional}}\n\nWarning: 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...)\n\nTheir 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}}\nChange it only if your language uses another character for ':' or it needs an extra space before the colon.",
        "signature": "This will be substituted in the signature (~<nowiki></nowiki>~~ or ~~<nowiki></nowiki>~~ excluding timestamp).\n\nParameters:\n* $1 - the username that is currently login\n* $2 - the customized signature which is specified in [[Special:Preferences|user's preferences]] as non-raw\nUse your language default parentheses ({{msg-mw|parentheses}}), but not use the message direct.\n\nSee also:\n* {{msg-mw|Signature-anon}} - signature for anonymous user",
        "signature-anon": "{{notranslate}}\nUsed as signature for anonymous user. Parameters:\n* $1 - username (IP address?)\n* $2 - nickname (IP address?)\nSee also:\n* {{msg-mw|Signature}} - signature for registered user",
        "timezone-utc": "{{optional}}",
 +      "timezone-local": "Label to indicate that a time is in the user's local timezone.\n{{Identical|Local}}",
        "duplicate-defaultsort": "See definition of [[w:Sorting|sort key]] on Wikipedia. Parameters:\n* $1 - old default sort key\n* $2 - new default sort key",
        "duplicate-displaytitle": "Warning shown when a page has its display title set multiple times. Parameters:\n* $1 - old display title\n* $2 - new display title",
 +      "restricted-displaytitle": "Warning shown when a display title is ignored because it is not equivalent to its actual title. Parameters:\n* $1 - the ignored display title",
        "invalid-indicator-name": "Warning shown when the [https://www.mediawiki.org/wiki/Help:Page_status_indicators &lt;indicator name=\"''unique-identifier''\">''content''&lt;/indicator>] parser tag is used incorrectly.",
        "version": "{{doc-special|Version}}\n{{Identical|Version}}",
        "version-summary": "{{doc-specialpagesummary|version}}",
        "version-hook-subscribedby": "Shown in [[Special:Version]]",
        "version-version": "{{Optional}}\nUsed in [[Special:Version]]. Preceded by the MediaWiki extension name.\n\nParameters:\n* $1 - version number of the extension",
        "version-no-ext-name": "Used in [[Special:Version]], in the rows of the main table when a name for an extension is not provided.",
 -      "version-svn-revision": "{{Identical|Revision}}{{optional}}\nUsed in [[Special:Version]], preceeding the Subversion revision numbers of the extensions loaded inside brackets, like this: \"({{int:version-revision}} r012345\"). Parameters:\n* $1 - (Unused) directory revision number or empty string\n* $2 - checkout revision number",
        "version-license": "Used specifically for the MediaWiki software.\n\nUsed as heading in [[Special:Version]].",
        "version-ext-license": "Used in [[Special:Version]].\n\nUsed as label for the link pointing to the extension's license page. e.g. [[Special:Version/License/Maps]]\n{{Identical|License}}",
        "version-ext-colheader-name": "Column header for the name of an extension.\n{{Identical|Extension}}",
        "version-libraries-license": "Column header for the library's license\n{{Identical|License}}",
        "version-libraries-description": "Column header for the library's description\n{{Identical|Description}}",
        "version-libraries-authors": "Column header for the library's authors\n{{Identical|Author}}",
 -      "redirect": "{{doc-special|Redirect}}\nThis means \"Redirect by file'''name''', user '''ID''', page '''ID''', or revision ID\".",
 -      "redirect-legend": "Legend of fieldset around input box in [[Special:Redirect]]",
 +      "redirect": "{{doc-special|Redirect}}\nThis means \"Redirect by file '''name''', user '''ID''', page '''ID''', revision '''ID''', or log '''ID'''\".",
        "redirect-text": "Inside fieldset for [[Special:Redirect]]",
        "redirect-summary": "Shown at top of [[Special:Redirect]]",
        "redirect-submit": "Button label in [[Special:Redirect]].\n{{Identical|Go}}",
        "redirect-page": "Description of lookup type for [[Special:Redirect]].\n{{Identical|Page ID}}",
        "redirect-revision": "Description of lookup type for [[Special:Redirect]].\n\nThis means \"Page revision '''ID'''\".",
        "redirect-file": "Description of lookup type for [[Special:Redirect]].\n{{Identical|Filename}}",
 +      "redirect-logid": "Description of lookup type for [[Special:Redirect]].\n{{Identical|Log ID}}",
        "redirect-not-exists": "Used as error message in [[Special:Redirect]]",
        "fileduplicatesearch": "Name of special page [[Special:FileDuplicateSearch]].",
        "fileduplicatesearch-summary": "Summary of [[Special:FileDuplicateSearch]]",
 -      "fileduplicatesearch-legend": "Legend of the fieldset around the input form of [[Special:FileDuplicateSearch]]",
        "fileduplicatesearch-filename": "Input form of [[Special:FileDuplicateSearch]]:\n\n{{Identical|Filename}}",
        "fileduplicatesearch-submit": "Button label on [[Special:FileDuplicateSearch]].\n\n{{Identical|Search}}",
        "fileduplicatesearch-info": "Information beneath the thumbnail on the right side shown after a successful search via [[Special:FileDuplicateSearch]].\n\nParameters:\n* $1 - width of the file\n* $2 - height of the file\n* $3 - File size\n* $4 - MIME type",
        "tag-filter": "Caption of a filter shown on lists of changes (e.g. [[Special:Log]], [[Special:Contributions]], [[Special:Newpages]], [[Special:Recentchanges]], [[Special:Recentchangeslinked]], page histories)",
        "tag-filter-submit": "Caption of the submit button displayed next to the tag filter on lists of changes (e.g. [[Special:Log]], [[Special:Contributions]], [[Special:Newpages]], [[Special:Recentchanges]], [[Special:Recentchangeslinked]], page histories)\n\n{{Identical|Filter}}",
        "tag-list-wrapper": "Wrapper for the list of tags shown on recent changes, watchlists, history pages and diffs.\n\nParameters:\n* $1 - number of distinct tags for given edit\n* $2 - comma-separated list of tags for given edit",
 +      "tag-mw-contentmodelchange": "Change tag for edits that change the content model of a page",
 +      "tag-mw-contentmodelchange-description": "Description for \"content model change\" change tag",
        "tags-title": "The title of [[Special:Tags]].\n{{Identical|Tag}}",
        "tags-intro": "Explanation on top of [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
        "tags-tag": "Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
        "tags-actions-header": "Caption of a column in [[Special:Tags]]. The column contains action links like \"delete\". For more information on tags see [[mw:Manual:Tags|MediaWiki]].\n{{Identical|Action}}",
        "tags-active-yes": "Table cell contents if given tag is \"active\".\n\nSee also:\n* {{msg-mw|Tags-active-no}}\n{{Identical|Yes}}",
        "tags-active-no": "Table cell contents if given tag is not \"active\".\n\nSee also:\n* {{msg-mw|Tags-active-yes}}\n{{Identical|No}}",
 -      "tags-source-extension": "Table cell contents if given tag can be applied automatically by a software [[mw:Manual:Extensions|extension]].\n\nSee also:\n* {{msg-mw|Tags-source-manual}}\n* {{msg-mw|Tags-source-none}}",
 -      "tags-source-manual": "Table cell contents if given tag can be applied by users or bots.\n\nSee also:\n* {{msg-mw|Tags-source-extension}}\n* {{msg-mw|Tags-source-none}}",
 +      "tags-source-extension": "Table cell contents if given tag can be applied automatically by the MediaWiki software.\n\nSee also:\n* {{msg-mw|Tags-source-manual}}\n* {{msg-mw|Tags-source-none}}",
 +      "tags-source-manual": "\"Applied\" is not past tense, but an adjective that describes an action that sometimes happens, as in the sentence: \"(this tag is usually) applied by users and bots\".\n\nTable cell contents if given tag can be applied by users or bots.\n\nSee also:\n* {{msg-mw|Tags-source-extension}}\n* {{msg-mw|Tags-source-none}}",
        "tags-source-none": "Table cell contents if given tag is no longer in use. (It was applied in the past, but it is currently not applied.)\n\nSee also:\n* {{msg-mw|Tags-source-extension}}\n* {{msg-mw|Tags-source-manual}}",
        "tags-edit": "Used on [[Special:Tags]]. Verb. Used as display text on a link to create/edit a description.\n{{Identical|Edit}}",
        "tags-delete": "Used on [[Special:Tags]]. Verb. Used as display text on a link to delete a tag.\n{{Identical|Delete}}",
        "tags-deactivate": "Used on [[Special:Tags]]. Verb. Used as display text on a link to deactivate a tag.\n{{Identical|Delete}}",
        "tags-hitcount": "Shown in the \"{{msg-mw|Tags-hitcount-header}}\" column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].\n\nParameters:\n* $1 - the number of changes marked with the tag",
        "tags-manage-no-permission": "Error message on [[Special:Tags]]",
 +      "tags-manage-blocked": "Error message on [[Special:Tags]]",
        "tags-create-heading": "The title of a fieldset, beneath which lies a form used to create a tag. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
        "tags-create-explanation": "The first paragraph of an explanation to tell users what they are about to do.",
        "tags-create-tag-name": "Form field label for the name of the tag to be created.",
        "tags-delete-not-found": "Error message on [[Special:Tags]]",
        "tags-delete-too-many-uses": "Error message on [[Special:Tags]]",
        "tags-delete-warnings-after-delete": "Warning shown after deleting a tag.\n\nParameters:\n* $1 - the code name of the tag that was deleted\n* $2 - the number of warnings",
 +      "tags-delete-no-permission": "Error message on [[Special:Tags]]",
        "tags-activate-title": "The title of a page used to activate a tag. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
        "tags-activate-question": "An explanation to tell users what they are about to do.\n\nParameters:\n* $1 - the code name of the tag that is about to be activated",
        "tags-activate-reason": "{{Identical|Reason}}",
        "tags-deactivate-not-allowed": "Error message on [[Special:Tags]]",
        "tags-deactivate-submit": "The label of the form \"submit\" button when the user is about to deactivate a tag.\n{{Identical|Deactivate}}",
        "tags-apply-no-permission": "Error message seen via the API when a user lacks the permission to apply change tags.",
 +      "tags-apply-blocked": "Error message seen via the API when a user is blocked and attempted to apply change tags.",
        "tags-apply-not-allowed-one": "Error message seen via the API when a user tries to apply a single tag that is not properly defined. This message is only ever used in the case of 1 tag.\n\nParameters:\n* $1 - tag name",
        "tags-apply-not-allowed-multi": "Error message seen via the API when a user tries to apply more than one tag that is not properly defined.\n\nParameters:\n* $1 - comma-separated list of tag names\n* $2 - number of tags",
        "tags-update-no-permission": "Error message seen via the API when a user lacks the permission to add or remove change tags after the fact.",
 +      "tags-update-blocked": "Error message seen via the API when a user is blocked and attempted to add or remove change tags after the fact.",
        "tags-update-add-not-allowed-one": "Error message seen via the API when a user tries to add a single tag that is not properly defined. This message is only ever used in the case of 1 tag.\n\nParameters:\n* $1 - tag name",
        "tags-update-add-not-allowed-multi": "Error message seen via the API when a user tries to add more than one tag that is not properly defined.\n\nParameters:\n* $1 - comma-separated list of tag names\n* $2 - number of tags",
        "tags-update-remove-not-allowed-one": "Error message seen via the API when a user tries to remove a single tag that is not properly defined. This message is only ever used in the case of 1 tag.\n\nParameters:\n* $1 - tag name",
        "tags-update-remove-not-allowed-multi": "Error message seen via the API when a user tries to remove more than one tag that is not properly defined.\n\nParameters:\n* $1 - comma-separated list of tag names\n* $2 - number of tags",
        "tags-edit-title": "The title of a page where tags can be added or removed from selected revisions or log entries.\nFor more information on tags see [[mw:Manual:Tags]].",
        "tags-edit-manage-link": "Text of a link to [[Special:Tags]], in imperative mood. Refers to the same thing as {{msg-mw|log-name-managetags}}.",
 -      "tags-edit-revision-selected": "{{Identical|revdelete-selected-text}}\n\nSee also:\n* {{msg-mw|tags-edit-logentry-selected}}",
 +      "tags-edit-revision-selected": "{{Identical|revdelete-selected-text}}\n\nParameters:\n* $1 - Number of ids of selected revisions\n* $2 - Title of the page that user has selected revisions of\nSee also:\n* {{msg-mw|tags-edit-logentry-selected}}",
        "tags-edit-logentry-selected": "{{Identical|logdelete-selected}}\n\nSee also:\n* {{msg-mw|tags-edit-revision-selected}}",
        "tags-edit-revision-explanation": "Leave blank.\n\nSee also:\n* {{msg-mw|tags-edit-logentry-explanation}}",
        "tags-edit-logentry-explanation": "Leave blank.\n\nSee also:\n* {{msg-mw|tags-edit-revision-explanation}}",
        "tags-edit-revision-legend": "Form legend.\n\n$1 is the number of revisions.\n\nSee also:\n* {{msg-mw|tags-edit-logentry-legend}}",
        "tags-edit-logentry-legend": "Form legend.\n\n$1 is the number of entries.\n\nSee also:\n* {{msg-mw|tags-edit-revision-legend}}",
        "tags-edit-existing-tags": "Heading beneath which a list of tags already applied to the revision or log entry is presented.",
 -      "tags-edit-existing-tags-none": "Shown when no tags are applied. Should be formatted differently (italicised or parenthesised).",
 +      "tags-edit-existing-tags-none": "Shown when no tags are applied. Should be formatted differently (italicised or parenthesised).\n{{Identical|None}}",
        "tags-edit-new-tags": "Heading beneath which the user chooses which tags should be attached to the revision or log entry. They may add or remove tags.",
        "tags-edit-add": "Heading beneath which the user picks which tags to add to the revision or log entry.",
        "tags-edit-remove": "Heading beneath which the user picks which tags to remove from the revision or log entry.",
        "htmlform-cloner-create": "Used as the text for the button that adds a row to a multi-input HTML form element.\n\nSee also:\n* {{msg-mw|htmlform-cloner-delete}}\n* {{msg-mw|htmlform-cloner-required}}",
        "htmlform-cloner-delete": "Used as the text for the button that removes a row from a multi-input HTML form element\n\nSee also:\n* {{msg-mw|htmlform-cloner-create}}\n* {{msg-mw|htmlform-cloner-required}}\n{{Identical|Remove}}",
        "htmlform-cloner-required": "Used as an error message in HTML forms.\n\nSee also:\n* {{msg-mw|htmlform-required}}\n* {{msg-mw|htmlform-cloner-create}}\n* {{msg-mw|htmlform-cloner-delete}}",
 +      "htmlform-date-placeholder": "Used as initial placeholder text in \"date\" input boxes. This date MUST be formatted as a 4-digit year, 2-digit month, and 2-digit day, in the Gregorian calendar, separated with ASCII hyphen ('-') characters. You can localise the letters to your language or script, but you should not change the format.",
 +      "htmlform-time-placeholder": "Used as initial placeholder text in \"time\" input boxes. This time MUST be formatted as a 2-digit hour 00 to 23, a 2-digit minute, and an optional 2-digit second, all separated by ASCII colons. You can localise the letters to your language or script, but you should not change the format.",
 +      "htmlform-datetime-placeholder": "Used as initial placeholder text in \"datetime\" input boxes. This date and time MUST be formatted as a 4-digit year, 2-digit month, and 2-digit day, in the Gregorian calendar, separated with ASCII hyphen ('-') characters, followed by a space (or the letter 'T'), followed by a time formatted as a 2-digit hour 00 to 23, a 2-digit minute, and an optional 2-digit second, all separated by ASCII colons. You can localise the letters to your language or script, but you should not change the format.",
 +      "htmlform-date-invalid": "Used as error message in HTML forms. This date MUST be formatted as a 4-digit year, 2-digit month, and 2-digit day, in the Gregorian calendar, separated with ASCII hyphen ('-') characters. You can localise the letters to your language or script, but you should not change the format.\n\n* {{msg-mw|Htmlform-invalid-input}}\n* {{msg-mw|Apifeatureusage-htmlform-date-placeholder}}\n* {{msg-mw|Apifeatureusage-htmlform-date-toolow}}\n* {{msg-mw|Apifeatureusage-htmlform-date-toohigh}}\n* {{msg-mw|Htmlform-required}}",
 +      "htmlform-time-invalid": "Used as error message in HTML forms. This time MUST be formatted as a 2-digit hour 00 to 23, a 2-digit minute, and an optional 2-digit second, all separated by ASCII colons. You can localise the letters to your language or script, but you should not change the format.\n\n* {{msg-mw|Htmlform-invalid-input}}\n* {{msg-mw|Apifeatureusage-htmlform-time-placeholder}}\n* {{msg-mw|Apifeatureusage-htmlform-time-toolow}}\n* {{msg-mw|Apifeatureusage-htmlform-time-toohigh}}\n* {{msg-mw|Htmlform-required}}",
 +      "htmlform-datetime-invalid": "Used as error message in HTML forms. This date and time MUST be formatted as a 4-digit year, 2-digit month, and 2-digit day, in the Gregorian calendar, separated with ASCII hyphen ('-') characters, followed by a space (or the letter 'T'), followed by a time formatted as a 2-digit hour 00 to 23, a 2-digit minute, and an optional 2-digit second, all separated by ASCII colons. You can localise the letters to your language or script, but you should not change the format.\n\n* {{msg-mw|Htmlform-invalid-input}}\n* {{msg-mw|Apifeatureusage-htmlform-datetime-placeholder}}\n* {{msg-mw|Apifeatureusage-htmlform-datetime-toolow}}\n* {{msg-mw|Apifeatureusage-htmlform-datetime-toohigh}}\n* {{msg-mw|Htmlform-required}}",
 +      "htmlform-date-toolow": "Used as error message in HTML forms. Parameters:\n* $1 - minimum date\nSee also:\n* {{msg-mw|Htmlform-invalid-input}}\n* {{msg-mw|Htmlform-required}}\n* {{msg-mw|Apifeatureusage-htmlform-date-invalid}}\n* {{msg-mw|Apifeatureusage-htmlform-date-toohigh}}",
 +      "htmlform-date-toohigh": "Used as error message in HTML forms. Parameters:\n* $1 - maximum date\nSee also:\n* {{msg-mw|Htmlform-invalid-input}}\n* {{msg-mw|Htmlform-required}}\n* {{msg-mw|Apifeatureusage-htmlform-date-invalid}}\n* {{msg-mw|Apifeatureusage-htmlform-date-toolow}}",
 +      "htmlform-time-toolow": "Used as error message in HTML forms. Parameters:\n* $1 - minimum date\nSee also:\n* {{msg-mw|Htmlform-invalid-input}}\n* {{msg-mw|Htmlform-required}}\n* {{msg-mw|Apifeatureusage-htmlform-time-invalid}}\n* {{msg-mw|Apifeatureusage-htmlform-time-toohigh}}",
 +      "htmlform-time-toohigh": "Used as error message in HTML forms. Parameters:\n* $1 - maximum date\nSee also:\n* {{msg-mw|Htmlform-invalid-input}}\n* {{msg-mw|Htmlform-required}}\n* {{msg-mw|Apifeatureusage-htmlform-time-invalid}}\n* {{msg-mw|Apifeatureusage-htmlform-time-toolow}}",
 +      "htmlform-datetime-toolow": "Used as error message in HTML forms. Parameters:\n* $1 - minimum date\nSee also:\n* {{msg-mw|Htmlform-invalid-input}}\n* {{msg-mw|Htmlform-required}}",
 +      "htmlform-datetime-toohigh": "Used as error message in HTML forms. Parameters:\n* $1 - maximum date\nSee also:\n* {{msg-mw|Htmlform-invalid-input}}\n* {{msg-mw|Htmlform-required}}",
        "htmlform-title-badnamespace": "Error message shown if the page title provided by the user is not in the required namespace. $1 is the page, $2 is the numerical namespace index.",
        "htmlform-title-not-creatable": "Error message shown if the page title provided by the user is not creatable (a special page). $1 is the page title.",
        "htmlform-title-not-exists": "Error message shown if the page title provided by the user does not exist. $1 is the page title.",
        "htmlform-user-not-exists": "Error message shown if a user with the name provided by the user does not exist. $1 is the username.",
        "htmlform-user-not-valid": "Error message shown if the name provided by the user isn't a valid username. $1 is the username.",
        "rawmessage": "{{notranslate}} Used to pass arbitrary text as a message specifier array",
 -      "sqlite-has-fts": "Shown on [[Special:Version]].\nParameters:\n* $1 - version",
 -      "sqlite-no-fts": "Shown on [[Special:Version]].\nParameters:\n* $1 - version",
        "logentry-delete-delete": "{{Logentry|[[Special:Log/delete]]}}",
        "logentry-delete-restore": "{{Logentry|[[Special:Log/delete]]}}",
 -      "logentry-delete-event": "{{Logentry|[[Special:Log/delete]]}}\n{{Logentryparam}}\n* $3 - the name of the log page inside parenthesis",
 +      "logentry-delete-event": "{{Logentry|[[Special:Log/delete]]}}\n{{Logentryparam}}\n* $5 - count of affected log events",
        "logentry-delete-revision": "{{Logentry|[[Special:Log/delete]]}}\n{{Logentryparam}}\n* $5 - the number of affected revisions of the page $3",
 -      "logentry-delete-event-legacy": "{{Logentry|[[Special:Log/delete]]}}\n* $3 - the name of the log page inside parenthesis",
 +      "logentry-delete-event-legacy": "{{Logentry|[[Special:Log/delete]]}}",
        "logentry-delete-revision-legacy": "{{Logentry|[[Special:Log/delete]]}}",
 -      "logentry-suppress-delete": "{{Logentry}}\n\n'Hid' is a possible alternative to 'suppressed' in this message.",
 -      "logentry-suppress-event": "{{Logentry}}\n{{Logentryparam}}\n$3 is the name of the log page inside parenthesis",
 +      "logentry-suppress-delete": "{{Logentry}}\n\n'Hid' is a possible alternative to 'suppressed' in this message.\n\n'''This is not a normal deletion log entry''' and is used only when the page is removed even from administrators view (on WMF wikis this is called 'oversight' or 'suppression'.",
 +      "logentry-suppress-event": "{{Logentry}}\n{{Logentryparam}}\n* $5 - count of affected log events",
        "logentry-suppress-revision": "{{Logentry}}\n{{Logentryparam}}\n* $5 - the number of affected revisions of the page $3.",
 -      "logentry-suppress-event-legacy": "{{Logentry}}\n$3 is the name of the log page inside parenthesis",
 +      "logentry-suppress-event-legacy": "{{Logentry}}",
        "logentry-suppress-revision-legacy": "{{Logentry}}",
        "revdelete-content-hid": "Used on\n* {{msg-mw|logentry-delete-event}}\n* {{msg-mw|logentry-delete-revision}}\n* {{msg-mw|logentry-suppress-event}}\n* {{msg-mw|logentry-suppress-event}}",
        "revdelete-summary-hid": "Used on\n* {{msg-mw|logentry-delete-event}}\n* {{msg-mw|logentry-delete-revision}}\n* {{msg-mw|logentry-suppress-event}}\n* {{msg-mw|logentry-suppress-event}}",
        "logentry-protect-protect-cascade": "{{Logentry|[[Special:Log/protect]]}}\n\n* $4 - protect expiry (formatted with {{msg-mw|protect-summary-desc}}, multiple possible)\nFor word \"cascading\" see {{msg-mw|protect-summary-cascade}}",
        "logentry-protect-modify": "{{Logentry|[[Special:Log/protect]]}}\n\n* $4 - protect expiry (formatted with {{msg-mw|protect-summary-desc}}, multiple possible)",
        "logentry-protect-modify-cascade": "{{Logentry|[[Special:Log/protect]]}}\n\n* $4 - protect expiry (formatted with {{msg-mw|protect-summary-desc}}, multiple possible)\nFor word \"cascading\" see {{msg-mw|protect-summary-cascade}}",
 -      "logentry-rights-rights": "* $1 - username\n* $2 - (see below)\n* $3 - username\n* $4 - list of user groups or {{msg-mw|Rightsnone}}\n* $5 - list of user groups or {{msg-mw|Rightsnone}}\n----\n{{Logentry|[[Special:Log/rights]]}}",
 +      "logentry-rights-rights": "* $1 - (see below)\n* $2 - (see below)\n* $3 - target user, like $1\n* $4 - list of user groups or {{msg-mw|Rightsnone}}\n* $5 - list of user groups or {{msg-mw|Rightsnone}}\n* $6 - target user, can be used with GENDER\n----\n{{Logentry|[[Special:Log/rights]]}}",
        "logentry-rights-rights-legacy": "* $1 - username\n* $2 - (see below)\n* $3 - username\n----\n{{Logentry|[[Special:Log/rights]]}}",
 -      "logentry-rights-autopromote": "* $1 - username\n* $2 - (see below)\n* $3 - (see below)\n* $4 - comma separated list of old user groups or {{msg-mw|Rightsnone}}\n* $5 - comma separated list of new user groups\n----\n{{Logentry|[[Special:Log/rights]]}}",
 +      "logentry-rights-autopromote": "* $1 - username\n* $2 - (see below)\n* $3 - (see below) - unused\n* $4 - comma separated list of old user groups or {{msg-mw|Rightsnone}}\n* $5 - comma separated list of new user groups\n* $6 - target user, can be used with GENDER for $3 - unused\n----\n{{Logentry|[[Special:Log/rights]]}}",
        "logentry-upload-upload": "{{Logentry|[[Special:Log/upload]]}}",
        "logentry-upload-overwrite": "{{Logentry|[[Special:Log/upload]]}}",
        "logentry-upload-revert": "{{Logentry|[[Special:Log/upload]]}}",
        "feedback-external-bug-report-button": "A button for submitting an external technical bug report.",
        "feedback-dialog-title": "Title of the feedback dialog",
        "feedback-dialog-intro": "An introduction at the top of the feedback dialog. $1 - Feedback page link",
 -      "feedback-error-title": "{{Identical|Error}}",
        "feedback-error1": "Error message, appears when an unknown error occurs submitting feedback",
        "feedback-error2": "Error message, appears when we could not add feedback",
        "feedback-error3": "Error message, appears when we lose our connection to the wiki",
        "feedback-thanks": "Thanks message, appears if feedback was successful. Parameters:\n* $1 - \"Feedback\"\n* $2 - Feedback page URL",
        "feedback-thanks-title": "The title of the thank you dialog at the end of the submission process.\n{{Identical|Thank you}}",
        "feedback-useragent": "A label denoting the user agent in the feedback that is posted to the feedback page.\n{{Identical|User agent}}",
 -      "searchsuggest-search": "Greyed out default text in the simple search box in the Vector skin. (It disappears and lets the user enter the requested search terms when the search box receives focus.)\n\n{{Identical|Search}}",
 +      "searchsuggest-search": "Greyed out default text in the simple search box in the Vector skin. (It disappears and lets the user enter the requested search terms when the search box receives focus.)\n{{Identical|Search}}",
        "searchsuggest-containing": "Label used in the special item of the search suggestions list which gives the user an option to perform a full text search for the term.",
 +      "api-error-autoblocked": "API error message that can be used for client side localisation of API errors.\n\nCf. {{msg-mw|Autoblockedtext}}.",
        "api-error-badaccess-groups": "API error message that can be used for client side localisation of API errors.",
        "api-error-badtoken": "API error message that can be used for client side localisation of API errors.",
 +      "api-error-blocked": "API error message that can be used for client side localisation of API errors.",
        "api-error-copyuploaddisabled": "API error message that can be used for client side localisation of API errors.",
        "api-error-duplicate": "API error message that can be used for client side localisation of API errors. Parameters:\n* $1 - a number of files",
        "api-error-duplicate-archive": "API error message that can be used for client side localisation of API errors. Parameters:\n* $1 - a number of files",
        "api-error-nomodule": "API error message that can be used for client side localisation of API errors.",
        "api-error-ok-but-empty": "API error message that can be used for client side localisation of API errors.",
        "api-error-overwrite": "API error message that can be used for client side localisation of API errors.",
 +      "api-error-ratelimited": "API error message that can be used for client side localisation of API errors.\n\nCf. {{msg-mw|Actionthrottledtext}}",
        "api-error-stashfailed": "API error message that can be used for client side localisation of API errors.",
        "api-error-publishfailed": "API error message that can be used for client side localisation of API errors.",
        "api-error-stasherror": "API error message that can be used for client side localisation of API errors.",
        "api-error-unknownerror": "API error message that can be used for client side localisation of API errors.\n\nParameters:\n* $1 - an unknown error message\n{{Identical|Unknown error}}",
        "api-error-uploaddisabled": "API error message that can be used for client side localisation of API errors.",
        "api-error-verification-error": "The word \"extension\" refers to the part behind the last dot in a file name, that by convention gives a hint about the kind of data format which a files contents are in.",
 +      "api-error-was-deleted": "API error message that can be used for client side localisation of API errors.",
        "duration-seconds": "Used as duration. Parameters:\n* $1 - number of seconds\n{{Related|Duration}}\n{{Identical|Second}}",
        "duration-minutes": "Used as duration. Parameters:\n* $1 - number of minutes\n{{Related|Duration}}\n{{Identical|Minute}}",
 -      "duration-hours": "Used as duration. Parameters:\n* $1 - number of hours\n{{Related|Duration}}",
 -      "duration-days": "Used as duration. Parameters:\n* $1 - number of days\n{{Related|Duration}}",
 -      "duration-weeks": "Used as duration. Parameters:\n* $1 - number of weeks\n{{Related|Duration}}",
 -      "duration-years": "Used as duration. Parameters:\n* $1 - number of years\n{{Related|Duration}}",
 +      "duration-hours": "Used as duration. Parameters:\n* $1 - number of hours\n{{Related|Duration}}\n{{Identical|Hour}}",
 +      "duration-days": "Used as duration. Parameters:\n* $1 - number of days\n{{Related|Duration}}\n{{Identical|Day}}",
 +      "duration-weeks": "Used as duration. Parameters:\n* $1 - number of weeks\n{{Related|Duration}}\n{{Identical|Week}}",
 +      "duration-years": "Used as duration. Parameters:\n* $1 - number of years\n{{Related|Duration}}\n{{Identical|Year}}",
        "duration-decades": "Used as duration. Parameters:\n* $1 - number of decades\n{{Related|Duration}}",
        "duration-centuries": "Used as duration. Parameters:\n* $1 - number of centuries\n{{Related|Duration}}",
        "duration-millennia": "Used as duration. Parameters:\n* $1 - number of millennia\n{{Related|Duration}}",
        "expand_templates_generate_xml": "Used as checkbox label.",
        "expand_templates_generate_rawhtml": "Used as checkbox label.",
        "expand_templates_preview": "{{Identical|Preview}}",
 -      "expand_templates_preview_fail_html": "Used as error message in Preview section of [[Special:ExpandTemplates]] page.",
 +      "expand_templates_preview_fail_html": "Used as error message in Preview section of [[Special:ExpandTemplates]] page.\n\n{{Identical|Loss of session data}}",
        "expand_templates_preview_fail_html_anon": "Used as error message in Preview section of [[Special:ExpandTemplates]] page.",
 +      "expand_templates_input_missing": "Used on [[Special:ExpandTemplates]] as an error message, if no input text was provided.",
        "pagelanguage": "Title for page Special:PageLanguage",
        "pagelang-name": "Input label for page name on Special:PageLanguage\n{{Identical|Page}}",
        "pagelang-language": "Language selector label for Special:PageLanguage\n{{Identical|Language}}",
        "pagelang-use-default": "Radio label for selector on Special:PageLanguage for default language",
        "pagelang-select-lang": "Radio label for selector on Special:PageLanguage for language selection\n{{Identical|Select language}}",
 +      "pagelang-submit": "Submit button label for Special:PageLanguage form\n{{Identical|Submit}}",
        "right-pagelang": "{{Doc-right|pagelang}}\nRight to change page language on Special:PageLanguage",
        "action-pagelang": "{{Doc-action|pagelang}}",
        "log-name-pagelang": "Display entry for log name for changes in page language in Special:Log.",
        "mediastatistics-summary": "Used to explain that this page only does statistics over current versions of files. \"Old\" versions of files and deleted files are not counted.",
        "mediastatistics-nfiles": "{{optional}}\nEntry in table on [[Special:MediaStatistics]] that gives total number of files. $1 - number of files. $2 - percentage of total files that is this type (percent will be formatted to have about 3 interesting digits. e.g. 0.121 or 10.2)",
        "mediastatistics-nbytes": "Combined space of this type of file. Bytes and \"human units\" are shown so that users can better get a sense of magnitude when making comparisons.\n*$1 - total space in bytes.\n*$2 - total space in \"human units\" (i.e. KB, MB, GB, etc)\n*$3 - What percentage of the space all uploads take up does this file take up.",
 +      "mediastatistics-bytespertype": "Combined space of one section of [[Special:MediaStatistics]]. \n*$1 - total space in bytes\n*$2 - total space in \"human units\" (i.e. KB, MB, GB, etc)\n*$3 - What percentage of the space all uploads take up does this file take up.",
 +      "mediastatistics-allbytes": "Combined space of all uploaded files. \n*$1 - total space in bytes\n*$2 - total space in \"human units\" (i.e. KB, MB, GB, etc)",
        "mediastatistics-table-mimetype": "Header for table on Special:MediaStatistics. Column that lists MIME types (The values in this column will look like 'image/jpeg', and be linked to Special:MIMESearch).",
        "mediastatistics-table-extensions": "Header for column in tables on [[Special:MediaStatistics]] that lists possible extensions for a given file type. (The values in this column will be a comma separated list of file extensions, such as '.webm' or '.png, .apng').",
        "mediastatistics-table-count": "Column header on Special:MediaStatistics for the number of files column. The headers in this column use {{msg-mw|mediastatistics-nfiles}}.",
        "mediastatistics-header-text": "Header on [[Special:MediaStatistics]] for file types that are in the text category. This includes simple text formats, including plain text formats, json, csv, and xml. Source code of compiled programming languages may be included here in the future, but isn't currently.",
        "mediastatistics-header-executable": "Header on [[Special:MediaStatistics]] for file types that are in the executable category. This includes things like source files for interpreted programming language (Shell scripts, javascript, etc).",
        "mediastatistics-header-archive": "Header on [[Special:MediaStatistics]] for file types that are in the archive category. Includes things like tar, zip, gzip etc.",
 +      "mediastatistics-header-total": "Header on [[Special:MediaStatistics]] for a summary of all file types.",
        "json-warn-trailing-comma": "A warning message notifying that JSON text was automatically corrected by removing erroneous commas.\n\nParameters:\n* $1 - number of commas that were removed\n{{Related|Json-error}}",
        "json-error-unknown": "User error message when there’s an unknown error.\n\nThis error is shown if we received an unexpected value from PHP. See http://php.net/manual/en/function.json-last-error.php\n\nParameters:\n* $1 - integer error code\n{{Related|Json-error}}",
        "json-error-depth": "User error message when the maximum stack depth is exceeded.\nSee http://php.net/manual/en/function.json-last-error.php\n{{Related|Json-error}}",
        "special-characters-group-ipa": "IPA means a script: \"international phonetic alphabet\" here, and not \"international phonetic association\", the organization behind it.",
        "special-characters-group-symbols": "The section name for symbols\n\n{{Identical|Symbol}}",
        "special-characters-group-greek": "This is the name of a script, or alphabet, not a language.",
 +      "special-characters-group-greekextended": "The name of the Greek Extended character set.",
        "special-characters-group-cyrillic": "This is the name of a script, or a group of alphabets, used mainly in Eastern Europe and North and Central Asia.\n{{related|Special-characters-group}}",
        "special-characters-group-arabic": "This is the name of a script, or alphabet, not a language.\n{{related|Special-characters-group}}",
        "special-characters-group-arabicextended": "This is a description of the additional group of Arabic script characters for languages such as a Persian, Urdu, Pashto and others. This message is supposed to be similar to {{msg-mw|special-characters-group-latinextended}}.\n{{related|Special-characters-group}}",
        "mw-widgets-dateinput-placeholder-month": "Placeholder displayed in a date input field when it's empty, representing a date format with 4 digits for year and 2 digits for month, separated with hyphens (without a day). This should be uppercase, if possible, and must not include any additional explanations. If there is no good way to translate it, make this message blank.",
        "mw-widgets-titleinput-description-new-page": "Description label for a new page in the title input widget.",
        "mw-widgets-titleinput-description-redirect": "Description label for a redirect in the title input widget.",
 -      "api-error-blacklisted": "Used as error message.\n\nFollowed by the link {{msg-mw|Mwe-upwiz-feedback-blacklist-info-prompt}}."
 +      "sessionmanager-tie": "Used as an error message when multiple session sources are tied in priority.\n\nParameters:\n* $1 - List of dession type descriptions, from messages like {{msg-mw|sessionprovider-mediawiki-session-cookiesessionprovider}}.",
 +      "sessionprovider-generic": "Used to create a generic session type description when one isn't provided via the proper message. Should be phrased to make sense when added to a message such as {{msg-mw|cannotloginnow-text}}.\n\nParameters:\n* $1 - PHP classname.",
 +      "sessionprovider-mediawiki-session-cookiesessionprovider": "Description of the sessions provided by the CookieSessionProvider class, which use HTTP cookies. Should be phrased to make sense when added to a message such as {{msg-mw|cannotloginnow-text}}.",
 +      "sessionprovider-nocookies": "Used to inform the user that sessions may be missing due to lack of cookies.",
 +      "randomrootpage": "{{doc-special|RandomRootPage}}",
 +      "log-action-filter-block": "{{doc-log-action-filter-type|block}}",
 +      "log-action-filter-contentmodel": "{{doc-log-action-filter-type|contentmodel}}",
 +      "log-action-filter-delete": "{{doc-log-action-filter-type|delete}}",
 +      "log-action-filter-import": "{{doc-log-action-filter-type|import}}",
 +      "log-action-filter-managetags": "{{doc-log-action-filter-type|managetags}}",
 +      "log-action-filter-move": "{{doc-log-action-filter-type|move}}",
 +      "log-action-filter-newusers": "{{doc-log-action-filter-type|newusers}}",
 +      "log-action-filter-patrol": "{{doc-log-action-filter-type|patrol}}",
 +      "log-action-filter-protect": "{{doc-log-action-filter-type|protect}}",
 +      "log-action-filter-rights": "{{doc-log-action-filter-type|rights}}",
 +      "log-action-filter-suppress": "{{doc-log-action-filter-type|suppress}}",
 +      "log-action-filter-upload": "{{doc-log-action-filter-type|upload}}",
 +      "log-action-filter-all": "{{doc-log-action-filter-type|all}}\n{{Identical|All}}",
 +      "log-action-filter-block-block": "{{doc-log-action-filter-action|block|block}}\n{{Identical|Block}}",
 +      "log-action-filter-block-reblock": "{{doc-log-action-filter-action|block|reblock}}",
 +      "log-action-filter-block-unblock": "{{doc-log-action-filter-action|block|unblock}}\n{{Identical|Unblock}}",
 +      "log-action-filter-contentmodel-change": "{{doc-log-action-filter-action|contentmodel|change}}",
 +      "log-action-filter-contentmodel-new": "{{doc-log-action-filter-action|contentmodel|new}}",
 +      "log-action-filter-delete-delete": "{{doc-log-action-filter-action|delete|delete}}",
 +      "log-action-filter-delete-restore": "{{doc-log-action-filter-action|delete|restore}}",
 +      "log-action-filter-delete-event": "{{doc-log-action-filter-action|delete|event}}",
 +      "log-action-filter-delete-revision": "{{doc-log-action-filter-action|delete|revision}}",
 +      "log-action-filter-import-interwiki": "{{doc-log-action-filter-action|import|interwiki}}",
 +      "log-action-filter-import-upload": "{{doc-log-action-filter-action|import|upload}}",
 +      "log-action-filter-managetags-create": "{{doc-log-action-filter-action|managetags|create}}",
 +      "log-action-filter-managetags-delete": "{{doc-log-action-filter-action|managetags|delete}}",
 +      "log-action-filter-managetags-activate": "{{doc-log-action-filter-action|managetags|activate}}",
 +      "log-action-filter-managetags-deactivate": "{{doc-log-action-filter-action|managetags|deactivate}}",
 +      "log-action-filter-move-move": "{{doc-log-action-filter-action|move|move}}",
 +      "log-action-filter-move-move_redir": "{{doc-log-action-filter-action|move|move_redir}}",
 +      "log-action-filter-newusers-create": "{{doc-log-action-filter-action|newusers|create}}",
 +      "log-action-filter-newusers-create2": "{{doc-log-action-filter-action|newusers|create2}}",
 +      "log-action-filter-newusers-autocreate": "{{doc-log-action-filter-action|newusers|autocreate}}",
 +      "log-action-filter-newusers-byemail": "{{doc-log-action-filter-action|newusers|byemail}}",
 +      "log-action-filter-patrol-patrol": "{{doc-log-action-filter-action|patrol|patrol}}",
 +      "log-action-filter-patrol-autopatrol": "{{doc-log-action-filter-action|patrol|autopatrol}}",
 +      "log-action-filter-protect-protect": "{{doc-log-action-filter-action|protect|protect}}",
 +      "log-action-filter-protect-modify": "{{doc-log-action-filter-action|protect|modify}}",
 +      "log-action-filter-protect-unprotect": "{{doc-log-action-filter-action|protect|unprotect}}",
 +      "log-action-filter-protect-move_prot": "{{doc-log-action-filter-action|protect|move_prot}}",
 +      "log-action-filter-rights-rights": "{{doc-log-action-filter-action|rights|rights}}",
 +      "log-action-filter-rights-autopromote": "{{doc-log-action-filter-action|rights|autopromote}}",
 +      "log-action-filter-suppress-event": "{{doc-log-action-filter-action|suppress|event}}",
 +      "log-action-filter-suppress-revision": "{{doc-log-action-filter-action|suppress|revision}}",
 +      "log-action-filter-suppress-delete": "{{doc-log-action-filter-action|suppress|delete}}",
 +      "log-action-filter-suppress-block": "{{doc-log-action-filter-action|suppress|block}}",
 +      "log-action-filter-suppress-reblock": "{{doc-log-action-filter-action|suppress|reblock}}",
 +      "log-action-filter-upload-upload": "{{doc-log-action-filter-action|upload|upload}}",
 +      "log-action-filter-upload-overwrite": "{{doc-log-action-filter-action|upload|overwrite}}",
 +      "authmanager-authn-not-in-progress": "Error message when AuthManager session data is lost during authentication, or the user hits the \"continue\" endpoint without an active authentication attempt.",
 +      "authmanager-authn-no-primary": "Error message when no AuthenticationProvider handles the AuthenticationRequests for login. This might mean the user needs to fill out all the form fields.",
 +      "authmanager-authn-no-local-user": "Error message when authentication somehow succeeds without a username being known. This probably should never happen.",
 +      "authmanager-authn-no-local-user-link": "Error message when federated authentication (e.g. \"login with Google\") succeeds, but no account is associated.",
 +      "authmanager-authn-autocreate-failed": "Error message when auto-creation fails during login. Parameters:\n* $1 - Error message from the account creation attempt, as wikitext.",
 +      "authmanager-change-not-supported": "Error message when all PrimaryAuthenticationProviders ignore the change request.",
 +      "authmanager-create-disabled": "Message displayed when account creation is disabled.",
 +      "authmanager-create-from-login": "Message displayed when moving from login to account creation and additional data must be collected from the user.",
 +      "authmanager-create-not-in-progress": "Error message when AuthManager session data is lost during account creation, or the user hits the \"continue\" endpoint without an active account creation attempt.",
 +      "authmanager-create-no-primary": "Error message when no AuthenticationProvider handles the AuthenticationRequests for account creation. This might mean the user needs to fill out all the form fields.",
 +      "authmanager-link-no-primary": "Error message when no AuthenticationProvider handles the AuthenticationRequests for account linking. This might mean the user needs to fill out all the form fields.",
 +      "authmanager-link-not-in-progress": "Error message when AuthManager session data is lost during account linking, or the user hits the \"continue\" endpoint without an active account link attempt.",
 +      "authmanager-authplugin-setpass-failed-title": "Title of error page from AuthManager if AuthPlugin returns false from its setPassword() method.",
 +      "authmanager-authplugin-setpass-failed-message": "Text of error page from AuthManager if AuthPlugin returns false from its setPassword() method.",
 +      "authmanager-authplugin-create-fail": "Error message from AuthManager if the AuthPlugin returns false from its addUser() method.",
 +      "authmanager-authplugin-setpass-denied": "Error message from AuthManager if the AuthPlugin returns false from its allowPasswordChange() method.",
 +      "authmanager-authplugin-setpass-bad-domain": "Error message from AuthManager if the AuthPlugin rejects the passed domain.",
 +      "authmanager-autocreate-noperm": "Error message when auto-creation fails due to lack of permission.",
 +      "authmanager-autocreate-exception": "Error message when auto-creation fails because we tried recently and an exception was thrown, so we're not going to try again yet.",
 +      "authmanager-userdoesnotexist": "Error message when a user account does not exist. Parameters:\n* $1 - User name.",
 +      "authmanager-userlogin-remembermypassword-help": "Description of the field with label {{msg-mw|userlogin-remembermypassword}}.",
 +      "authmanager-username-help": "Description of the field with label {{msg-mw|userlogin-yourname}}.",
 +      "authmanager-password-help": "Description of the field with label {{msg-mw|userlogin-yourpassword}}.",
 +      "authmanager-domain-help": "Description of the field with label {{msg-mw|yourdomainname}}.",
 +      "authmanager-retype-help": "Description of the field with label {{msg-mw|createacct-yourpasswordagain}}.",
 +      "authmanager-email-label": "Label for the email field.\n{{Identical|E-mail}}",
 +      "authmanager-email-help": "Description of the field with label {{msg-mw|authmanager-email-label}}.\n{{Identical|E-mail address}}",
 +      "authmanager-realname-label": "Label for the realname field.\n{{Identical|Real name}}",
 +      "authmanager-realname-help": "Description of the field with label {{msg-mw|authmanager-realname-label}}.",
 +      "authmanager-provider-password": "Description for PasswordAuthenticationRequest. Will be used as $1 in messages such as {{msg-mw|authprovider-confirmlink-option}}.",
 +      "authmanager-provider-password-domain": "Description for PasswordDomainAuthenticationRequest. Will be used as $1 in messages such as {{msg-mw|authprovider-confirmlink-option}}.",
 +      "authmanager-account-password-domain": "Format to display username and domain for PasswordDomainAuthenticationRequest. Will be used as $2 in messages such as {{msg-mw|authprovider-confirmlink-option}}. Parameters:\n* $1 - Username\n* $2 - Domain",
 +      "authmanager-provider-temporarypassword": "Description for TemporaryPasswordAuthenticationRequest. Will be used as $1 in messages such as {{msg-mw|authprovider-confirmlink-option}}.",
 +      "authprovider-confirmlink-message": "Message from ConfirmLinkSecondaryAuthenticationProvider to indicate that credentials may be linked.",
 +      "authprovider-confirmlink-option": "Used to format linkable credentials in ConfirmLinkSecondaryAuthenticationProvider. Parameters:\n* $1 - Credential provider (e.g. the name of the third-party authentication service).\n* $2 - Credential account (e.g. the email address).",
 +      "authprovider-confirmlink-request-label": "Form field label for the list of linkable credentials",
 +      "authprovider-confirmlink-request-help": "Form field help text",
 +      "authprovider-confirmlink-success-line": "Line to display that credentials were linked successfully. Parameters:\n* $1 - Linked credentials, formatted with {{msg-mw|authprovider-confirmlink-option}}\n\nSee also:\n* {{msg-mw|authprovider-confirmlink-failed}}\n* {{msg-mw|authprovider-confirmlink-failed-line}}",
 +      "authprovider-confirmlink-failed-line": "Line to display that credentials were not linked successfully. Parameters:\n* $1 - Credentials that failed, formatted with {{msg-mw|authprovider-confirmlink-option}}\n* $2 - Failure message text.\n\nSee also:\n* {{msg-mw|authprovider-confirmlink-failed}}\n* {{msg-mw|authprovider-confirmlink-success-line}}",
 +      "authprovider-confirmlink-failed": "Used to prefix the list of individual link statuses when some did not succeed. Parameters:\n* $1 - Failure message, or a wikitext bulleted list of failure messages.\n\nSee also:\n* {{msg-mw|authprovider-confirmlink-success-line}}\n* {{msg-mw|authprovider-confirmlink-failed-line}}",
 +      "authprovider-confirmlink-ok-help": "Description of the \"ok\" field when ConfirmLinkSecondaryAuthenticationProvider needs to display link failure messages to the user.",
 +      "authprovider-resetpass-skip-label": "Label for the \"Skip\" button when it's possible to skip resetting a password in ResetPasswordSecondaryAuthenticationProvider.\n{{Identical|Skip}}",
 +      "authprovider-resetpass-skip-help": "Description of the option to skip resetting a password in ResetPasswordSecondaryAuthenticationProvider.",
 +      "authform-nosession-login": "Error message shown when the login was successful, but the session could not be reestablished on the next request. $1 is an explanation which depends on what session handler is being used, such as {{msg-mw|sessionprovider-nocookies}}.",
 +      "authform-nosession-signup": "Error message shown when the account creation was successful, but the session could not be reestablished on the next request. $1 is an explanation which depends on what session handler is being used, such as {{msg-mw|sessionprovider-nocookies}}.",
 +      "authform-newtoken": "Error message shown on the auth form when the session has no CSRF token. This can be caused by session expiry but it is more likely that the client does not support sessions for some reason (e.g. a browser with all cookies diabled). $1 is an explanation (in the form of full sentences) given by the session provider of why sessions might not work (usually this will be {{msg-mw|sessionprovider-nocookies}}).",
 +      "authform-notoken": "Error message shown on the auth form when the submitted data has no CSRF token.",
 +      "authform-wrongtoken": "Error message shown on the auth form when the submitted CSRF token value is invalid.",
 +      "specialpage-securitylevel-not-allowed-title": "Error page title shown when the user visits a special page but the authentication security check fails.",
 +      "specialpage-securitylevel-not-allowed": "Error message shown when the user visits a special page but the authentication security check fails.",
 +      "authpage-cannot-login": "Error message shown on authentication-related special pages when login cannot start. This is not supposed to happen unless the site is misconfigured.",
 +      "authpage-cannot-login-continue": "Error message shown on authentication-related special pages when login cannot continue. This most likely means a session timeout.",
 +      "authpage-cannot-create": "Error message shown on authentication-related special pages when account creation cannot start. This is not supposed to happen unless the site is misconfigured.",
 +      "authpage-cannot-create-continue": "Error message shown on authentication-related special pages when account creation cannot continue. This most likely means a session timeout.",
 +      "authpage-cannot-link": "Error message shown on authentication-related special pages when account linking cannot start. This is not supposed to happen unless the site is misconfigured.",
 +      "authpage-cannot-link-continue": "Error message shown on authentication-related special pages when account linking cannot continue. This most likely means a session timeout.",
 +      "cannotauth-not-allowed-title": "Title of the error page shown when the user tries to use an authentication-related page they should not have access to.",
 +      "cannotauth-not-allowed": "Text of the error page shown when the user tries t use an authentication-related page they should not have access to.",
 +      "changecredentials": "Title of the special page [[Special:ChangeCredentials]] which allows changing authentication credentials (such as the password).",
 +      "changecredentials-submit": "Used on [[Special:ChangeCredentials]].",
 +      "changecredentials-invalidsubpage": "Error message shown when using [[Special:ChangeCredentials]] with an invalid type.\n\nParameters:\n* $1 - subpage name.",
 +      "changecredentials-success": "Success message after using [[Special:ChangeCredentials]].",
 +      "removecredentials": "Title of the special page [[Special:RemoveCredentials]] which allows removing authentication credentials (such as a two-factor token).",
 +      "removecredentials-submit": "Used on [[Special:RemoveCredentials]].",
 +      "removecredentials-invalidsubpage": "Error message shown when using [[Special:RemoveCredentials]] with an invalid type.\n\nParameters:\n* $1 - subpage name.",
 +      "removecredentials-success": "Success message after using [[Special:RemoveCredentials]].",
 +      "credentialsform-provider": "Shown on [[Special:ChangeCredentials]]/[[Special:RemoveCredentials]] as the label for the authentication type (e.g. \"password\", \"English Wikipedia via OAuth\")",
 +      "credentialsform-account": "Shown on [[Special:ChangeCredentials]]/[[Special:RemoveCredentials]] as the label for the account name",
 +      "cannotlink-no-provider-title": "Error page title shown when the user visits [[Special:LinkAccounts]] but there is no external account provider that could be linked.",
 +      "cannotlink-no-provider": "Error message shown when the user visits [[Special:LinkAccounts]] but there is no external account provider that could be linked.",
 +      "linkaccounts": "Title of the special page [[Special:LinkAccounts]] which allows the user to connect the local user accounts with external ones such as Google or Facebook.",
 +      "linkaccounts-success-text": "Text shown on top of the form after a successful action.",
 +      "linkaccounts-submit": "Text of the main submit button on [[Special:LinkAccounts]] (when there is one)",
 +      "unlinkaccounts": "Title of the special page [[Special:UnlinkAccounts]] which allows the user to remove linked remote accounts.",
 +      "unlinkaccounts-success": "Account unlinking form success message",
 +      "authenticationdatachange-ignored": "Shown when authentication data change was unsuccessful due to configuration problems.\n\nCf. e.g. {{msg-mw|Passwordreset-ignored}}.",
 +      "userjsispublic": "A reminder to users that Javascript subpages are not preferences but normal pages, and thus can be viewed by other users and the general public. This message is shown to a user whenever they are editing a subpage in their own user-space that ends in .js. See also {{msg-mw|usercssispublic}}.",
 +      "usercssispublic": "A reminder to users that CSS subpages are not preferences but normal pages, and thus can be viewed by other users and the general public. This message is shown to a user whenever they are editing a subpage in their own user-space that ends in .css. See also {{msg-mw|userjsispublic}}",
 +      "restrictionsfield-badip": "An error message shown when one entered an invalid IP address or range in a restrictions field (such as Special:BotPassword). $1 is the IP address.",
 +      "restrictionsfield-label": "Field label shown for restriction fields (e.g. on Special:BotPassword).",
 +      "restrictionsfield-help": "Placeholder text displayed in restriction fields (e.g. on Special:BotPassword).",
 +      "edit-error-short": "Error message. Parameters:\n* $1 - the error details\nSee also:\n* {{msg-mw|edit-error-long}}\n{{Identical|Error}}",
 +      "edit-error-long": "Error message. Parameters:\n* $1 - the error details\nSee also:\n* {{msg-mw|edit-error-short}}\n{{Identical|Error}}"
  }