Merge "Add validation of the content model edited by EditPage"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 9 Jan 2014 15:02:08 +0000 (15:02 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 9 Jan 2014 15:02:08 +0000 (15:02 +0000)
1  2 
includes/EditPage.php
languages/messages/MessagesEn.php
languages/messages/MessagesQqq.php
maintenance/language/messages.inc

diff --combined includes/EditPage.php
@@@ -319,6 -319,18 +319,18 @@@ class EditPage 
                }
        }
  
+       /**
+        * Returns if the given content model is editable.
+        *
+        * @param string $modelId The ID of the content model to test. Use CONTENT_MODEL_XXX constants.
+        * @return bool
+        * @throws MWException if $modelId has no known handler
+        */
+       public function isSupportedContentModel( $modelId ) {
+               return $this->allowNonTextContent ||
+                       ContentHandler::getForModelID( $modelId ) instanceof TextContentHandler;
+       }
        function submit() {
                $this->edit();
        }
                # Ignore some permissions errors when a user is just previewing/viewing diffs
                $remove = array();
                foreach ( $permErrors as $error ) {
 -                      if ( ( $this->preview || $this->diff ) &&
 -                              ( $error[0] == 'blockedtext' || $error[0] == 'autoblockedtext' ) )
 -                      {
 +                      if ( ( $this->preview || $this->diff )
 +                              && ( $error[0] == 'blockedtext' || $error[0] == 'autoblockedtext' )
 +                      {
                                $remove[] = $error;
                        }
                }
                } elseif ( ( $wgRequest->getVal( 'preload' ) !== null || $this->mTitle->exists() ) && $wgUser->getOption( 'previewonfirst' ) ) {
                        // Standard preference behavior
                        return true;
 -              } elseif ( !$this->mTitle->exists() &&
 -                      isset( $wgPreviewOnOpenNamespaces[$this->mTitle->getNamespace()] ) &&
 -                      $wgPreviewOnOpenNamespaces[$this->mTitle->getNamespace()] )
 -              {
 +              } elseif ( !$this->mTitle->exists()
 +                      && isset( $wgPreviewOnOpenNamespaces[$this->mTitle->getNamespace()] )
 +                      && $wgPreviewOnOpenNamespaces[$this->mTitle->getNamespace()]
 +              {
                        // Categories are special
                        return true;
                } else {
        /**
         * This function collects the form data and uses it to populate various member variables.
         * @param $request WebRequest
+        * @throws ErrorPageError
         */
        function importFormData( &$request ) {
                global $wgContLang, $wgUser;
                        $this->watchthis = $request->getCheck( 'wpWatchthis' );
  
                        # Don't force edit summaries when a user is editing their own user or talk page
 -                      if ( ( $this->mTitle->mNamespace == NS_USER || $this->mTitle->mNamespace == NS_USER_TALK ) &&
 -                              $this->mTitle->getText() == $wgUser->getName() )
 -                      {
 +                      if ( ( $this->mTitle->mNamespace == NS_USER || $this->mTitle->mNamespace == NS_USER_TALK )
 +                              && $this->mTitle->getText() == $wgUser->getName()
 +                      {
                                $this->allowBlankSummary = true;
                        } else {
                                $this->allowBlankSummary = $request->getBool( 'wpIgnoreBlankSummary' ) || !$wgUser->getOption( 'forceeditsummary' );
                $this->bot = $request->getBool( 'bot', true );
                $this->nosummary = $request->getBool( 'nosummary' );
  
-               $content_handler = ContentHandler::getForTitle( $this->mTitle );
-               $this->contentModel = $request->getText( 'model', $content_handler->getModelID() ); #may be overridden by revision
-               $this->contentFormat = $request->getText( 'format', $content_handler->getDefaultFormat() ); #may be overridden by revision
+               $this->contentModel = $request->getText( 'model', $this->contentModel ); #may be overridden by revision
+               $this->contentFormat = $request->getText( 'format', $this->contentFormat ); #may be overridden by revision
  
+               if ( !ContentHandler::getForModelID( $this->contentModel )->isSupportedFormat( $this->contentFormat ) ) {
+                       throw new ErrorPageError(
+                               'editpage-notsupportedcontentformat-title',
+                               'editpage-notsupportedcontentformat-text',
+                               array( $this->contentFormat, ContentHandler::getLocalizedName( $this->contentModel ) )
+                       );
+               }
                #TODO: check if the desired model is allowed in this namespace, and if a transition from the page's current model to the new model is allowed
-               #TODO: check if the desired content model supports the given content format!
  
                $this->live = $request->getCheck( 'live' );
                $this->editintro = $request->getText( 'editintro',
                        // Show the edit conflict page for certain recognized errors from doEdit(),
                        // but don't show it for errors from extension hooks
                        $errors = $doEditStatus->getErrorsArray();
 -                      if ( in_array( $errors[0][0], array( 'edit-gone-missing', 'edit-conflict',
 -                              'edit-already-exists' ) ) )
 -                      {
 +                      if ( in_array( $errors[0][0],
 +                                      array( 'edit-gone-missing', 'edit-conflict', 'edit-already-exists' ) )
 +                      {
                                $this->isConflict = true;
                                // Destroys data doEdit() put in $status->value but who cares
                                $doEditStatus->value = self::AS_END;
        function getBaseRevision() {
                if ( !$this->mBaseRevision ) {
                        $db = wfGetDB( DB_MASTER );
 -                      $baseRevision = Revision::loadFromTimestamp(
 +                      $this->mBaseRevision = Revision::loadFromTimestamp(
                                $db, $this->mTitle, $this->edittime );
 -                      return $this->mBaseRevision = $baseRevision;
 -              } else {
 -                      return $this->mBaseRevision;
                }
 +              return $this->mBaseRevision;
        }
  
        /**
                        return $content;
                }
  
-               if ( !$this->allowNonTextContent && !( $content instanceof TextContent ) ) {
-                       throw new MWException( "This content model can not be edited as text: "
-                                                               . ContentHandler::getLocalizedName( $content->getModel() ) );
+               if ( !$this->isSupportedContentModel( $content->getModel() ) ) {
+                       throw new MWException( 'This content model is not supported: '
+                               . ContentHandler::getLocalizedName( $content->getModel() ) );
                }
  
                return $content->serialize( $this->contentFormat );
                $content = ContentHandler::makeContent( $text, $this->getTitle(),
                        $this->contentModel, $this->contentFormat );
  
-               if ( !$this->allowNonTextContent && !( $content instanceof TextContent ) ) {
-                       throw new MWException( "This content model can not be edited as text: "
+               if ( !$this->isSupportedContentModel( $content->getModel() ) ) {
+                       throw new MWException( 'This content model is not supported: '
                                . ContentHandler::getLocalizedName( $content->getModel() ) );
                }
  
                        }
                }
  
 -              if ( $this->mTitle->getNamespace() != NS_MEDIAWIKI && $this->mTitle->isProtected( 'edit' ) ) {
 +              if ( $this->mTitle->isProtected( 'edit' ) &&
 +                      MWNamespace::getRestrictionLevels( $this->mTitle->getNamespace() ) !== array( '' )
 +              ) {
                        # Is the title semi-protected?
                        if ( $this->mTitle->isSemiProtected() ) {
                                $noticeMsg = 'semiprotectedpagewarning';
@@@ -2678,9 -2696,7 +2696,9 @@@ HTM
                        $attribs = array( 'style' => 'display:none;' );
                } else {
                        $classes = array(); // Textarea CSS
 -                      if ( $this->mTitle->getNamespace() != NS_MEDIAWIKI && $this->mTitle->isProtected( 'edit' ) ) {
 +                      if ( $this->mTitle->isProtected( 'edit' ) &&
 +                              MWNamespace::getRestrictionLevels( $this->mTitle->getNamespace() ) !== array( '' )
 +                      ) {
                                # Is the title semi-protected?
                                if ( $this->mTitle->isSemiProtected() ) {
                                        $classes[] = 'mw-textarea-sprotected';
                                }
                        }
  
 -                      $rt = $content->getRedirectChain();
 -                      if ( $rt ) {
 -                              $previewHTML = $this->mArticle->viewRedirect( $rt, false );
 -                      } else {
 -
 -                              # If we're adding a comment, we need to show the
 -                              # summary as the headline
 -                              if ( $this->section === "new" && $this->summary !== "" ) {
 -                                      $content = $content->addSectionHeader( $this->summary );
 -                              }
 +                      # If we're adding a comment, we need to show the
 +                      # summary as the headline
 +                      if ( $this->section === "new" && $this->summary !== "" ) {
 +                              $content = $content->addSectionHeader( $this->summary );
 +                      }
  
 -                              $hook_args = array( $this, &$content );
 -                              ContentHandler::runLegacyHooks( 'EditPageGetPreviewText', $hook_args );
 -                              wfRunHooks( 'EditPageGetPreviewContent', $hook_args );
 +                      $hook_args = array( $this, &$content );
 +                      ContentHandler::runLegacyHooks( 'EditPageGetPreviewText', $hook_args );
 +                      wfRunHooks( 'EditPageGetPreviewContent', $hook_args );
  
 -                              $parserOptions->enableLimitReport();
 +                      $parserOptions->enableLimitReport();
  
 -                              # For CSS/JS pages, we should have called the ShowRawCssJs hook here.
 -                              # But it's now deprecated, so never mind
 +                      # For CSS/JS pages, we should have called the ShowRawCssJs hook here.
 +                      # But it's now deprecated, so never mind
  
 -                              $content = $content->preSaveTransform( $this->mTitle, $wgUser, $parserOptions );
 -                              $parserOutput = $content->getParserOutput( $this->getArticle()->getTitle(), null, $parserOptions );
 +                      $content = $content->preSaveTransform( $this->mTitle, $wgUser, $parserOptions );
 +                      $parserOutput = $content->getParserOutput( $this->getArticle()->getTitle(), null, $parserOptions );
  
 -                              $previewHTML = $parserOutput->getText();
 -                              $this->mParserOutput = $parserOutput;
 -                              $wgOut->addParserOutputNoText( $parserOutput );
 +                      $previewHTML = $parserOutput->getText();
 +                      $this->mParserOutput = $parserOutput;
 +                      $wgOut->addParserOutputNoText( $parserOutput );
  
 -                              if ( count( $parserOutput->getWarnings() ) ) {
 -                                      $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() );
 -                              }
 +                      if ( count( $parserOutput->getWarnings() ) ) {
 +                              $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() );
                        }
                } catch ( MWContentSerializationException $ex ) {
                        $m = wfMessage( 'content-failed-to-parse', $this->contentModel, $this->contentFormat, $ex->getMessage() );
@@@ -363,7 -363,6 +363,7 @@@ $magicWords = array
        'numberingroup'           => array( 1,    'NUMBERINGROUP', 'NUMINGROUP' ),
        'staticredirect'          => array( 1,    '__STATICREDIRECT__' ),
        'protectionlevel'         => array( 1,    'PROTECTIONLEVEL' ),
 +      'cascadingsources'        => array( 1,    'CASCADINGSOURCES' ),
        'formatdate'              => array( 0,    'formatdate', 'dateformat' ),
        'url_path'                => array( 0,    'PATH' ),
        'url_wiki'                => array( 0,    'WIKI' ),
@@@ -678,6 -677,7 +678,6 @@@ future releases. Also note that since e
  'tog-minordefault'            => 'Mark all edits minor by default',
  'tog-previewontop'            => 'Show preview before edit box',
  'tog-previewonfirst'          => 'Show preview on first edit',
 -'tog-nocache'                 => 'Disable browser page caching',
  'tog-enotifwatchlistpages'    => 'Email me when a page or file on my watchlist is changed',
  'tog-enotifusertalkpages'     => 'Email me when my user talk page is changed',
  'tog-enotifminoredits'        => 'Email me also for minor edits of pages and files',
  'qbedit'         => 'Edit',
  'qbpageoptions'  => 'This page',
  'qbmyoptions'    => 'My pages',
 -'qbspecialpages' => 'Special pages',
  'faq'            => 'FAQ',
  'faqpage'        => 'Project:FAQ',
  'sitetitle'      => '{{SITENAME}}', # do not translate or duplicate this message to other languages
@@@ -938,8 -939,8 +938,8 @@@ See [[Special:Version|version page]].'
  'pagetitle-view-mainpage'      => '{{SITENAME}}', # only translate this message to other languages if you have to change it
  'backlinksubtitle'             => '← $1', # only translate this message to other languages if you have to change it
  'retrievedfrom'                => 'Retrieved from "$1"',
 -'youhavenewmessages'           => 'You have $1 ($2).',
 -'youhavenewmessagesfromusers'  => 'You have $1 from {{PLURAL:$3|another user|$3 users}} ($2).',
 +'youhavenewmessages'           => '{{PLURAL:$3|You have}} $1 ($2).',
 +'youhavenewmessagesfromusers'  => '{{PLURAL:$4|You have}} $1 from {{PLURAL:$3|another user|$3 users}} ($2).',
  'youhavenewmessagesmanyusers'  => 'You have $1 from many users ($2).',
  'newmessageslinkplural'        => '{{PLURAL:$1|a new message|999=new messages}}',
  'newmessagesdifflinkplural'    => 'last {{PLURAL:$1|change|999=changes}}',
@@@ -1050,6 -1051,9 +1050,6 @@@ It may contain one or more characters t
  'perfcachedts'                  => 'The following data is cached, and was last updated $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
  'querypage-no-updates'          => 'Updates for this page are currently disabled.
  Data here will not presently be refreshed.',
 -'wrong_wfQuery_params'          => 'Incorrect parameters to wfQuery()<br />
 -Function: $1<br />
 -Query: $2',
  'viewsource'                    => 'View source',
  'viewsource-title'              => 'View source for $1',
  'actionthrottled'               => 'Action throttled',
@@@ -1196,7 -1200,7 +1196,7 @@@ Please try again.'
  'passwordtooshort'                => 'Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.',
  'password-name-match'             => 'Your password must be different from your username.',
  'password-login-forbidden'        => 'The use of this username and password has been forbidden.',
 -'mailmypassword'                  => 'Email new password',
 +'mailmypassword'                  => 'Reset password',
  'passwordremindertitle'           => 'New temporary password for {{SITENAME}}',
  'passwordremindertext'            => 'Someone (probably you, from IP address $1) requested a new
  password for {{SITENAME}} ($4). A temporary password for user
@@@ -1234,7 -1238,6 +1234,7 @@@ No email will be sent for any of the fo
  Please enter a well-formatted address or empty that field.',
  'cannotchangeemail'               => 'Account email addresses cannot be changed on this wiki.',
  'emaildisabled'                   => 'This site cannot send emails.',
 +'emailsender'                     => '{{SITENAME}}', # do not translate or duplicate this message to other languages
  'accountcreated'                  => 'Account created',
  'accountcreatedtext'              => 'The user account for [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) has been created.',
  'createaccount-title'             => 'Account creation for {{SITENAME}}',
@@@ -1266,8 -1269,7 +1266,8 @@@ If you choose to provide it, this will 
  'user-mail-no-body'      => 'Tried to send email with an empty or unreasonably short body.',
  
  # Change password dialog
 -'resetpass'                 => 'Change password',
 +'changepassword'            => 'Change password',
 +'changepassword-summary'    => '', # do not translate or duplicate this message to other languages
  'resetpass_announce'        => 'You logged in with a temporary emailed code.
  To finish logging in, you must set a new password here:',
  'resetpass_text'            => '<!-- Add text here -->', # only translate this message to other languages if you have to change it
@@@ -1288,8 -1290,8 +1288,8 @@@ You may have already successfully chang
  
  # Special:PasswordReset
  'passwordreset'                    => 'Reset password',
 -'passwordreset-text-one'           => 'Complete this form to reset your password.',
 -'passwordreset-text-many'          => '{{PLURAL:$1|Fill one of the fields to reset your 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-legend'             => 'Reset password',
  'passwordreset-disabled'           => 'Password resets have been disabled on this wiki.',
  'passwordreset-emaildisabled'      => 'Email features have been disabled on this wiki.',
@@@ -1423,7 -1425,7 +1423,7 @@@ Note that you may not use the \"email t
  Your current IP address is $3, and the block ID is #$5.
  Please include all above details in any queries you make.",
  'blockednoreason'                  => 'no reason given',
 -'whitelistedittext'                => 'You have to $1 to edit pages.',
 +'whitelistedittext'                => 'Please $1 to edit pages.',
  'confirmedittext'                  => 'You must confirm your email address before editing pages.
  Please set and validate your email address through your [[Special:Preferences|user preferences]].',
  'nosuchsectiontitle'               => 'Cannot find section',
  It may have been moved or deleted while you were viewing the page.',
  'loginreqtitle'                    => 'Login required',
  'loginreqlink'                     => 'log in',
 -'loginreqpagetext'                 => 'You must $1 to view other pages.',
 +'loginreqpagetext'                 => 'Please $1 to view other pages.',
  'accmailtitle'                     => 'Password sent',
  'accmailtext'                      => "A randomly generated password for [[User talk:$1|$1]] has been sent to $2. It can be changed on the ''[[Special:ChangePassword|change password]]'' page upon logging in.",
  'newarticle'                       => '(New)',
@@@ -1578,6 -1580,8 +1578,8 @@@ It already exists.'
  'content-not-allowed-here'         => '"$1" content is not allowed on page [[$2]]',
  'editwarning-warning'              => 'Leaving this page may cause you to lose any changes you have made.
  If you are logged in, you can disable this warning in the "Editing" section of your preferences.',
+ 'editpage-notsupportedcontentformat-title'=> 'Content format not supported',
+ 'editpage-notsupportedcontentformat-text' => 'The content format $1 is not supported by the content model $2.',
  
  # Content models
  'content-model-wikitext'   => 'wikitext',
@@@ -1617,9 -1621,6 +1619,9 @@@ Please check the comparison below to ve
  
  # Account creation failure
  'cantcreateaccounttitle' => 'Cannot create account',
 +'cantcreateaccount-range-text' => "Account creation from IP addresses in the range '''$1''', which includes your IP address ('''$4'''), has been blocked by [[User:$3|$3]].
 +
 +The reason given by $3 is ''$2''",
  'cantcreateaccount-text' => "Account creation from this IP address ('''$1''') has been blocked by [[User:$3|$3]].
  
  The reason given by $3 is ''$2''",
@@@ -1695,6 -1696,10 +1697,6 @@@ You can view this diff; details can be 
  'revdelete-nooldid-title'     => 'Invalid target revision',
  'revdelete-nooldid-text'      => 'You have either not specified a target revision(s) to perform this
  function, the specified revision does not exist, or you are attempting to hide the current revision.',
 -'revdelete-nologtype-title'   => 'No log type given',
 -'revdelete-nologtype-text'    => 'You have not specified a log type to perform this action on.',
 -'revdelete-nologid-title'     => 'Invalid log entry',
 -'revdelete-nologid-text'      => 'You have either not specified a target log event to perform this function or the specified entry does not exist.',
  'revdelete-no-file'           => 'The file specified does not exist.',
  'revdelete-show-file-confirm' => 'Are you sure you want to view a deleted revision of the file "<nowiki>$1</nowiki>" from $2 at $3?',
  'revdelete-show-file-submit'  => 'Yes',
  Other administrators on {{SITENAME}} will still be able to access the hidden content and can undelete it again through this same interface, unless additional restrictions are set.",
  'revdelete-confirm'           => 'Please confirm that you intend to do this, that you understand the consequences, and that you are doing this in accordance with [[{{MediaWiki:Policy-url}}|the policy]].',
  'revdelete-suppress-text'     => "Suppression should '''only''' be used for the following cases:
 -* Potentially libelous information
 -* Inappropriate personal information
 +* potentially libelous information
 +* inappropriate personal information
  *: ''home addresses and telephone numbers, national identification numbers, etc.''",
  'revdelete-legend'            => 'Set visibility restrictions',
  'revdelete-hide-text'         => 'Revision text',
@@@ -1728,6 -1733,8 +1730,6 @@@ $1"
  'logdelete-failure'           => "'''Log visibility could not be set:'''
  $1",
  'revdel-restore'              => 'change visibility',
 -'revdel-restore-deleted'      => 'deleted revisions',
 -'revdel-restore-visible'      => 'visible revisions',
  'pagehist'                    => 'Page history',
  'deletedhist'                 => 'Deleted history',
  'revdelete-hide-current'      => 'Error hiding the item dated $2, $1: This is the current revision.
@@@ -1809,8 -1816,12 +1811,8 @@@ Details can be found in the [{{fullurl:
  'search-summary'                   => '', # do not translate or duplicate this message to other languages
  'searchresults'                    => 'Search results',
  'searchresults-title'              => 'Search results for "$1"',
 -'searchresulttext'                 => 'For more information about searching {{SITENAME}}, see [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 -'searchsubtitle'                   => 'You searched for \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|all pages starting with "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|all pages that link to "$1"]])',
 -'searchsubtitleinvalid'            => "You searched for '''$1'''",
  'toomanymatches'                   => 'Too many matches were returned, please try a different query',
  'titlematches'                     => 'Page title matches',
 -'notitlematches'                   => 'No page title matches',
  'textmatches'                      => 'Page text matches',
  'notextmatches'                    => 'No page text matches',
  'prevn'                            => 'previous {{PLURAL:$1|$1}}',
  'nextn-title'                      => 'Next $1 {{PLURAL:$1|result|results}}',
  'shown-title'                      => 'Show $1 {{PLURAL:$1|result|results}} per page',
  'viewprevnext'                     => 'View ($1 {{int:pipe-separator}} $2) ($3)',
 -'searchmenu-legend'                => 'Search options',
 -'searchmenu-exists'                => "'''There is a page named \"[[:\$1]]\" on this wiki.'''",
 -'searchmenu-new'                   => "'''Create the page \"[[:\$1]]\" on this wiki!'''",
 +'searchmenu-exists'                => "'''There is a page named \"[[:\$1]]\" on this wiki.''' {{PLURAL:$2|0=|See also the other search results found.}}",
 +'searchmenu-new'                   => "'''Create the page \"[[:\$1]]\" on this wiki!''' {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
  'searchmenu-new-nocreate'          => '', # do not translate or duplicate this message to other languages
 -'searchmenu-prefix'                => '[[Special:PrefixIndex/$1|Browse pages with this prefix]]',
  'searchprofile-articles'           => 'Content pages',
  'searchprofile-project'            => 'Help and Project pages',
  'searchprofile-images'             => 'Multimedia',
  'search-interwiki-custom'          => '', # do not translate or duplicate this message to other languages
  'search-interwiki-more'            => '(more)',
  'search-relatedarticle'            => 'Related',
 -'mwsuggest-disable'                => 'Disable search suggestions',
  'searcheverything-enable'          => 'Search in all namespaces',
  'searchrelated'                    => 'related',
  'searchall'                        => 'all',
  'showingresults'                   => "Showing below up to {{PLURAL:$1|'''1''' result|'''$1''' results}} starting with #'''$2'''.",
  'showingresultsnum'                => "Showing below {{PLURAL:$3|'''1''' result|'''$3''' results}} starting with #'''$2'''.",
  'showingresultsheader'             => "{{PLURAL:$5|Result '''$1''' of '''$3'''|Results '''$1 - $2''' of '''$3'''}} for '''$4'''",
 -'nonefound'                        => "'''Note:''' Only some namespaces are searched by default.
 -Try prefixing your query with ''all:'' to search all content (including talk pages, templates, etc.), or use the desired namespace as prefix.",
  'search-nonefound'                 => 'There were no results matching the query.',
 -'powersearch'                      => 'Advanced search',
  'powersearch-legend'               => 'Advanced search',
  'powersearch-ns'                   => 'Search in namespaces:',
  'powersearch-redir'                => 'List redirects',
 -'powersearch-field'                => 'Search for',
  'powersearch-togglelabel'          => 'Check:',
  'powersearch-toggleall'            => 'All',
  'powersearch-togglenone'           => 'None',
@@@ -1883,7 -1901,9 +1885,7 @@@ Note that their indexes of {{SITENAME}
  'preferences-summary'           => '', # do not translate or duplicate this message to other languages
  'mypreferences'                 => 'Preferences',
  'prefs-edits'                   => 'Number of edits:',
 -'prefsnologintext2'             => 'Please $1 to set user preferences.',
 -'changepassword'                => 'Change password',
 -'changepassword-summary'        => '', # do not translate or duplicate this message to other languages
 +'prefsnologintext2'             => 'Please $1 to change your preferences.',
  'prefs-skin'                    => 'Skin',
  'skin-preview'                  => 'Preview',
  'datedefault'                   => 'No preference',
  'prefs-email'                   => 'Email options',
  'prefs-rendering'               => 'Appearance',
  'saveprefs'                     => 'Save',
 -'resetprefs'                    => 'Clear unsaved changes',
  'restoreprefs'                  => 'Restore all default settings (in all sections)',
  'prefs-editing'                 => 'Editing',
  'rows'                          => 'Rows:',
  'columns'                       => 'Columns:',
  'searchresultshead'             => 'Search',
 -'resultsperpage'                => 'Hits per page:',
  'stub-threshold'                => 'Threshold for <a href="#" class="stub">stub link</a> formatting (bytes):',
  'stub-threshold-disabled'       => 'Disabled',
  'recentchangesdays'             => 'Days to show in recent changes:',
@@@ -1925,6 -1947,7 +1927,6 @@@ Anyone who knows it will be able to rea
  'localtime'                     => 'Local time:',
  'timezoneuseserverdefault'      => 'Use wiki default ($1)',
  'timezoneuseoffset'             => 'Other (specify offset)',
 -'timezoneoffset'                => 'Offset¹:',
  'servertime'                    => 'Server time:',
  'guesstimezone'                 => 'Fill in from browser',
  'timezoneregion-africa'         => 'Africa',
@@@ -1998,7 -2021,6 +2000,7 @@@ Your email address is not revealed whe
  'prefs-tokenwatchlist'          => 'Token',
  'prefs-diffs'                   => 'Diffs',
  'prefs-help-prefershttps'       => 'This preference will take effect on your next login.',
 +'prefs-tabs-navigation-hint'    => 'Tip: You can use the left and right arrow keys to navigate between the tabs in the tabs list.',
  
  # User preference: email validation using jQuery
  'email-address-validity-valid'   => 'Email address appears valid',
  '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-newpage'      => '(also see [[Special:NewPages|list of new pages]])',
  'recentchanges-legend-plusminus'    => "(''±123'')",
 -'rcnote'                            => "Below {{PLURAL:$1|is '''1''' change|are the last '''$1''' changes}} in the last {{PLURAL:$2|day|'''$2''' days}}, as of $5, $4.",
  'rcnotefrom'                        => "Below are the changes since '''$2''' (up to '''$1''' shown).",
  'rclistfrom'                        => 'Show new changes starting from $1',
  'rcshowhideminor'                   => '$1 minor edits',
  'rcshowhidebots'                    => '$1 bots',
 -'rcshowhideliu'                     => '$1 logged-in users',
 +'rcshowhideliu'                     => '$1 registered users',
  'rcshowhideanons'                   => '$1 anonymous users',
  'rcshowhidepatr'                    => '$1 patrolled edits',
  'rcshowhidemine'                    => '$1 my edits',
@@@ -2237,7 -2259,7 +2239,7 @@@ Pages on [[Special:Watchlist|your watch
  'reuploaddesc'                => 'Cancel upload and return to the upload form',
  'upload-tryagain'             => 'Submit modified file description',
  'uploadnologin'               => 'Not logged in',
 -'uploadnologintext'           => 'You must $1 to upload files.',
 +'uploadnologintext'           => 'Please $1 to upload files.',
  'upload_directory_missing'    => 'The upload directory ($1) is missing and could not be created by the webserver.',
  'upload_directory_read_only'  => 'The upload directory ($1) is not writable by the webserver.',
  'uploaderror'                 => 'Upload error',
@@@ -2327,8 -2349,6 +2329,8 @@@ If you still want to upload your file, 
  '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.
  You 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.
 +You should ask someone with the ability to view suppressed file data to review the situation before proceeding to re-upload it.",
  'uploadwarning'               => 'Upload warning',
  'uploadwarning-text'          => 'Please modify the file description below and try again.',
  'savefile'                    => 'Save file',
@@@ -2692,7 -2712,6 +2694,7 @@@ It now redirects to [[$2]].'
  'ninterwikis'                     => '$1 {{PLURAL:$1|interwiki|interwikis}}',
  'nlinks'                          => '$1 {{PLURAL:$1|link|links}}',
  'nmembers'                        => '$1 {{PLURAL:$1|member|members}}',
 +'nmemberschanged'                 => '$1 → $2 {{PLURAL:$2|member|members}}',
  'nrevisions'                      => '$1 {{PLURAL:$1|revision|revisions}}',
  'nviews'                          => '$1 {{PLURAL:$1|view|views}}',
  'nimagelinks'                     => 'Used on $1 {{PLURAL:$1|page|pages}}',
  'protectedpages-indef'            => 'Indefinite protections only',
  'protectedpages-summary'          => '', # do not translate or duplicate this message to other languages
  'protectedpages-cascade'          => 'Cascading protections only',
 -'protectedpagestext'              => 'The following pages are protected from moving or editing',
 +'protectedpages-noredirect'       => 'Hide redirects',
  'protectedpagesempty'             => 'No pages are currently protected with these parameters.',
  'protectedtitles'                 => 'Protected titles',
  'protectedtitles-summary'         => '', # do not translate or duplicate this message to other languages
 -'protectedtitlestext'             => 'The following titles are protected from creation',
  'protectedtitlesempty'            => 'No titles are currently protected with these parameters.',
  'listusers'                       => 'User list',
  'listusers-summary'               => '', # do not translate or duplicate this message to other languages
@@@ -2820,6 -2840,9 +2822,6 @@@ You can narrow down the view by selecti
  'allpagesto'              => 'Display pages ending at:',
  'allarticles'             => 'All pages',
  'allinnamespace'          => 'All pages ($1 namespace)',
 -'allnotinnamespace'       => 'All pages (not in $1 namespace)',
 -'allpagesprev'            => 'Previous',
 -'allpagesnext'            => 'Next',
  'allpagessubmit'          => 'Go',
  'allpagesprefix'          => 'Display pages with prefix:',
  'allpagesbadtitle'        => 'The given page title was invalid or had an inter-language or inter-wiki prefix.
@@@ -3030,7 -3053,6 +3032,7 @@@ Feedback and further assistance
  'historywarning'         => "'''Warning:''' The page you are about to delete has a history with approximately $1 {{PLURAL:$1|revision|revisions}}:",
  'confirmdeletetext'      => 'You are about to delete a page along with all of its history.
  Please confirm that you intend to do this, that you understand the consequences, and that you are doing this in accordance with [[{{MediaWiki:Policy-url}}|the policy]].',
 +'deleting-backlinks-warning' => "'''Warning:''' Other pages link to the page you are about to delete.",
  'actioncomplete'         => 'Action complete',
  'actionfailed'           => 'Action failed',
  'deletedtext'            => '"$1" has been deleted.
@@@ -3176,6 -3198,7 +3178,6 @@@ You may have a bad link, or the revisio
  'undeletebtn'                  => 'Restore',
  'undeletelink'                 => 'view/restore',
  'undeleteviewlink'             => 'view',
 -'undeletereset'                => 'Reset',
  'undeleteinvert'               => 'Invert selection',
  'undeletecomment'              => 'Reason:',
  'undeletedrevisions'           => '{{PLURAL:$1|1 revision|$1 revisions}} restored',
@@@ -3204,7 -3227,7 +3206,7 @@@ It may have already been undeleted.'
  $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-revisionrow'         => '$1 $2 ($3) $4 . . $5 $6 $7', # only translate this message to other languages if you have to change it
 +'undelete-revision-row'         => '$1 $2 ($3) $4 . . $5 $6 $7 $8 $9', # only translate this message to other languages if you have to change it
  
  # Namespace form on various pages
  'namespace'                     => 'Namespace:',
@@@ -3273,6 -3296,7 +3275,6 @@@ The latest block log entry is provided 
  'unblock'                         => 'Unblock user',
  'unblock-summary'                 => '', # do not translate or duplicate this message to other languages
  'blockip'                         => 'Block user',
 -'blockip-title'                   => 'Block user',
  'blockip-legend'                  => 'Block user',
  'blockiptext'                     => 'Use the form below to block write access from a specific IP address or username.
  This should be done only to prevent vandalism, and in accordance with [[{{MediaWiki:Policy-url}}|policy]].
@@@ -3280,6 -3304,7 +3282,6 @@@ Fill in a specific reason below (for ex
  'ipadressorusername'              => 'IP address or username:',
  'ipbexpiry'                       => 'Expiry:',
  'ipbreason'                       => 'Reason:',
 -'ipbreasonotherlist'              => 'Other reason',
  'ipbreason-dropdown'              => '*Common block reasons
  ** Inserting false information
  ** Removing content from pages
  'ipbsubmit'                       => 'Block this user',
  'ipbother'                        => 'Other time:',
  'ipboptions'                      => '2 hours:2 hours,1 day:1 day,3 days:3 days,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,indefinite:infinite',
 -'ipbotheroption'                  => 'other',
 -'ipbotherreason'                  => 'Other/additional reason:',
  'ipbhidename'                     => 'Hide username from edits and lists',
  'ipbwatchuser'                    => "Watch this user's user and talk pages",
  'ipb-disableusertalk'             => 'Prevent this user from editing their own talk page while blocked',
  See the [[Special:BlockList|block list]] to review blocks.',
  'ipb-blockingself'                => 'You are about to block yourself! Are you sure you want to do that?',
  'ipb-confirmhideuser'             => 'You are about to block a user with "hide user" enabled. This will suppress the user\'s name in all lists and log entries. Are you sure you want to do that?',
 +'ipb-confirmaction'               => 'If you are sure you really want to do it, please check the "{{int:ipb-confirm}}" field at the bottom.',
  'ipb-edit-dropdown'               => 'Edit block reasons',
  'ipb-unblock-addr'                => 'Unblock $1',
  'ipb-unblock'                     => 'Unblock a username or IP address',
@@@ -3373,7 -3399,7 +3375,7 @@@ See the [[Special:BlockList|block list]
  'ipb_expiry_invalid'              => 'Expiry time invalid.',
  'ipb_expiry_temp'                 => 'Hidden username blocks must be permanent.',
  'ipb_hide_invalid'                => 'Unable to suppress this account; it may have too many edits.',
 -'ipb_already_blocked'             => '"$1" is already blocked',
 +'ipb_already_blocked'             => '"$1" is already blocked.',
  'ipb-needreblock'                 => '$1 is already blocked. Do you want to change the settings?',
  'ipb-otherblocks-header'          => 'Other {{PLURAL:$1|block|blocks}}',
  'unblock-hideuser'                => 'You cannot unblock this user, as their username has been hidden.',
@@@ -3388,12 -3414,13 +3390,12 @@@ Please contact your Internet service pr
  'sorbs'                           => 'DNSBL', # only translate this message to other languages if you have to change it
  'sorbsreason'                     => 'Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.',
  'sorbs_create_account_reason'     => 'Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.
 -You cannot create an account',
 +You cannot create an account.',
  'xffblockreason'                  => 'An IP address present in the X-Forwarded-For header, either yours or that of a proxy server you are using, has been blocked. The original block reason was: $1',
 -'cant-block-while-blocked'        => 'You cannot block other users while you are blocked.',
  'cant-see-hidden-user'            => "The user you are trying to block has already been blocked and hidden.
  Since you do not have the hideuser right, you cannot see or edit the user's block.",
 -'ipbblocked'                      => 'You cannot block or unblock other users because you are yourself blocked',
 -'ipbnounblockself'                => 'You are not allowed to unblock yourself',
 +'ipbblocked'                      => 'You cannot block or unblock other users because you are yourself blocked.',
 +'ipbnounblockself'                => 'You are not allowed to unblock yourself.',
  'ipb-default-expiry'              => '', # do not translate or duplicate this message to other languages
  
  # Developer tools
@@@ -3452,6 -3479,7 +3454,6 @@@ please be sure you understand the conse
  In those cases, you will have to move or merge the page manually if desired.",
  'movearticle'                  => 'Move page:',
  'moveuserpage-warning'         => "'''Warning:''' You are about to move a user page. Please note that only the page will be moved and the user will ''not'' be renamed.",
 -'movenologin'                  => 'Not logged in',
  'movenologintext'              => 'You must be a registered user and [[Special:UserLogin|logged in]] to move a page.',
  'movenotallowed'               => 'You do not have permission to move pages.',
  'movenotallowedfile'           => 'You do not have permission to move files.',
  'articleexists'                => 'A page of that name already exists, or the name you have chosen is not valid.
  Please choose another name.',
  'cantmove-titleprotected'      => 'You cannot move a page to this location because the new title has been protected from creation',
 -'talkexists'                   => "'''The page itself was moved successfully, but the talk page could not be moved because one already exists at the new title.
 -Please merge them manually.'''",
 -'movedto'                      => 'moved to',
  'movetalk'                     => 'Move associated talk page',
  'move-subpages'                => 'Move subpages (up to $1)',
  'move-talk-subpages'           => 'Move subpages of talk page (up to $1)',
@@@ -3790,7 -3821,6 +3792,7 @@@ You can view its source'
  'print.css'               => '/* CSS placed here will affect the print output */', # only translate this message to other languages if you have to change it
  'noscript.css'            => '/* CSS placed here will affect users with JavaScript disabled */', # only translate this message to other languages if you have to change it
  'group-autoconfirmed.css' => '/* CSS placed here will affect autoconfirmed users only */', # only translate this message to other languages if you have to change it
 +'group-user.css'          => '/* CSS placed here will affect registered users only */', # only translate this message to other languages if you have to change it
  'group-bot.css'           => '/* CSS placed here will affect bots only */', # only translate this message to other languages if you have to change it
  'group-sysop.css'         => '/* CSS placed here will affect sysops only */', # only translate this message to other languages if you have to change it
  'group-bureaucrat.css'    => '/* CSS placed here will affect bureaucrats only */', # only translate this message to other languages if you have to change it
  'modern.js'              => '/* Any JavaScript here will be loaded for users using the Modern skin */', # only translate this message to other languages if you have to change it
  'vector.js'              => '/* Any JavaScript here will be loaded for users using the Vector skin */', # only translate this message to other languages if you have to change it
  'group-autoconfirmed.js' => '/* Any JavaScript here will be loaded for autoconfirmed users only */', # only translate this message to other languages if you have to change it
 +'group-user.js'          => '/* Any JavaScript here will be loaded for registered users only */', # only translate this message to other languages if you have to change it
  'group-bot.js'           => '/* Any JavaScript here will be loaded for bots only */', # only translate this message to other languages if you have to change it
  'group-sysop.js'         => '/* Any JavaScript here will be loaded for sysops only */', # only translate this message to other languages if you have to change it
  'group-bureaucrat.js'    => '/* Any JavaScript here will be loaded for bureaucrats only */', # only translate this message to other languages if you have to change it
@@@ -4510,10 -4539,15 +4512,10 @@@ $8', # only translate this message to o
  'exif-urgency-high'   => 'High ($1)',
  'exif-urgency-other'  => 'User-defined priority ($1)',
  
 -# External editor support
 -'edit-externally'      => 'Edit this file using an external application',
 -'edit-externally-help' => '(See the [https://www.mediawiki.org/wiki/Manual:External_editors setup instructions] for more information)',
 -
  # 'all' in various places, this might be different for inflected languages
  'watchlistall2' => 'all',
  'namespacesall' => 'all',
  'monthsall'     => 'all',
 -'limitall'      => 'all',
  
  # Email address confirmation
  'confirmemail'              => 'Confirm email address',
@@@ -4534,10 -4568,11 +4536,10 @@@ Please check your email address for inv
  Mailer returned: $1',
  'confirmemail_invalid'      => 'Invalid confirmation code.
  The code may have expired.',
 -'confirmemail_needlogin'    => 'You need to $1 to confirm your email address.',
 +'confirmemail_needlogin'    => 'Please $1 to confirm your email address.',
  'confirmemail_success'      => 'Your email address has been confirmed.
  You may now [[Special:UserLogin|log in]] and enjoy the wiki.',
  'confirmemail_loggedin'     => 'Your email address has now been confirmed.',
 -'confirmemail_error'        => 'Something went wrong saving your confirmation.',
  'confirmemail_subject'      => '{{SITENAME}} email address confirmation',
  'confirmemail_body'         => 'Someone, probably you, from IP address $1,
  has registered an account "$2" with this email address on {{SITENAME}}.
@@@ -4630,11 -4665,6 +4632,11 @@@ Please confirm that you really want to 
  'imgmultigo'       => 'Go!',
  'imgmultigoto'     => 'Go to page $1',
  
 +'img-lang-opt' => '$2 ($1)',
 +'img-lang-default' => '(default language)',
 +'img-lang-info' => 'Render this image in $1. $2',
 +'img-lang-go' => 'Go',
 +
  # Table pager
  'ascending_abbrev'         => 'asc',
  'descending_abbrev'        => 'desc',
@@@ -4823,20 -4853,10 +4825,20 @@@ You can also [[Special:EditWatchlist|us
  'version-parser-function-hooks'         => 'Parser function hooks',
  'version-hook-name'                     => 'Hook name',
  'version-hook-subscribedby'             => 'Subscribed by',
 -'version-version'                       => '(Version $1)',
 -'version-svn-revision'                  => '(r$2)', # only translate this message to other languages if you have to change it
 -'version-license'                       => 'License',
 -'version-poweredby-credits'             => "This wiki is powered by '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 +'version-version'                       => '($1)',
 +'version-svn-revision'                  => 'r$1', # only translate this message to other languages if you have to change it
 +'version-license'                       => 'MediaWiki License',
 +'version-license-title'                 => 'License for $1',
 +'version-license-not-found'             => 'No detailed license information was found for this extension.',
 +'version-credits-title'                 => 'Credits for $1',
 +'version-credits-not-found'             => 'No detailed credits information was found for this extension.',
 +'version-ext-license'                   => 'License',
 +'version-ext-colheader-name'            => 'Extension',
 +'version-ext-colheader-version'         => 'Version',
 +'version-ext-colheader-license'         => 'License',
 +'version-ext-colheader-description'     => 'Description',
 +'version-ext-colheader-credits'         => 'Authors',
 +'version-poweredby-credits'             => "This wiki is powered by '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
  'version-poweredby-others'              => 'others',
  'version-poweredby-translators'         => 'translatewiki.net translators',
  'version-credits-summary'               => 'We would like to recognize the following persons for their contribution to [[Special:Version|MediaWiki]].',
@@@ -4858,16 -4878,15 +4860,16 @@@ You should have received [{{SERVER}}{{S
  'version-entrypoints-load-php'          => '[https://www.mediawiki.org/wiki/Manual:load.php load.php]', # do not translate or duplicate this message to other languages
  
  # Special:Redirect
 -'redirect'            => 'Redirect by file, user, or revision ID',
 +'redirect'            => 'Redirect by file, user, page or revision ID',
  'redirect-legend'     => 'Redirect to a file or page',
  'redirect-text'       => '', # do not translate or duplicate this message to other languages
 -'redirect-summary'    => 'This special page redirects to a file (given the file name), a page (given a revision ID), or a user page (given a numeric user ID). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].',
 +'redirect-summary'    => 'This special page redirects to a file (given the file name), 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-submit'     => 'Go',
  'redirect-lookup'     => 'Lookup:',
  'redirect-value'      => 'Value:',
  'redirect-user'       => 'User ID',
  'redirect-revision'   => 'Page revision',
 +'redirect-page'       => 'Page ID',
  'redirect-file'       => 'File name',
  'redirect-not-exists' => 'Value not found',
  
  # Special:ComparePages
  'comparepages'                => 'Compare pages',
  'comparepages-summary'        => '', # do not translate or duplicate this message to other languages
 -'compare-selector'            => 'Compare page revisions',
  'compare-page1'               => 'Page 1',
  'compare-page2'               => 'Page 2',
  'compare-rev1'                => 'Revision 1',
@@@ -5096,7 -5116,6 +5098,7 @@@ Otherwise, you can use the easy form be
  '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-stasherror'                    => 'There was an error while uploading the file to stash.',
  
  # Durations
  'duration-seconds'   => '$1 {{PLURAL:$1|second|seconds}}',
  'limitreport-expensivefunctioncount-value' => '$1/$2', # only translate this message to other languages if you have to change it
  
  # ExpandTemplates
 -'expandtemplates'                  => 'Expand templates',
 -'expand_templates_intro'           => 'This special page takes text and expands all templates in it recursively.
 +'expandtemplates'                   => 'Expand templates',
 +'expand_templates_intro'            => 'This special page takes text and expands all templates in it recursively.
  It also expands supported parser functions like
  <code><nowiki>{{</nowiki>#language:…}}</code> and variables like
  <code><nowiki>{{</nowiki>CURRENTDAY}}</code>.
  In fact, it expands pretty much everything in double-braces.',
 -'expand_templates_title'           => 'Context title, for {{FULLPAGENAME}}, etc.:',
 -'expand_templates_input'           => 'Input text:',
 -'expand_templates_output'          => 'Result',
 -'expand_templates_xml_output'      => 'XML output',
 -'expand_templates_ok'              => 'OK',
 -'expand_templates_remove_comments' => 'Remove comments',
 -'expand_templates_remove_nowiki'   => 'Suppress <nowiki> tags in result',
 -'expand_templates_generate_xml'    => 'Show XML parse tree',
 -'expand_templates_preview'         => 'Preview',
 +'expand_templates_title'            => 'Context title, for {{FULLPAGENAME}}, etc.:',
 +'expand_templates_input'            => 'Input text:',
 +'expand_templates_output'           => 'Result',
 +'expand_templates_xml_output'       => 'XML output',
 +'expand_templates_html_output'      => 'Raw HTML output',
 +'expand_templates_ok'               => 'OK',
 +'expand_templates_remove_comments'  => 'Remove comments',
 +'expand_templates_remove_nowiki'    => 'Suppress <nowiki> tags in result',
 +'expand_templates_generate_xml'     => 'Show XML parse tree',
 +'expand_templates_generate_rawhtml' => 'Show raw HTML',
 +'expand_templates_preview'          => 'Preview',
  );
@@@ -27,7 -27,6 +27,7 @@@
   * @author Boivie
   * @author Brest
   * @author BrokenArrow
 + * @author Byfserag
   * @author Byrial
   * @author BáthoryPéter
   * @author Claudia Hattitten
@@@ -59,7 -58,6 +59,7 @@@
   * @author Iwan Novirion
   * @author Jon Harald Søby
   * @author Karduelis
 + * @author Kazu89
   * @author Kghbln
   * @author Kizito
   * @author Klenje
@@@ -80,7 -78,6 +80,7 @@@
   * @author Matma Rex
   * @author MaxSem
   * @author McDutchie
 + * @author MegaAlex
   * @author Meno25
   * @author Metalhead64
   * @author MichaelFrey
   * @author PhiLiP
   * @author Piangpha
   * @author Platonides
 + * @author PleaseStand
   * @author Prima klasy4na
   * @author Prometheus.pyrphoros
   * @author Psubhashish
   * @author Sp5uhe
   * @author Srhat
   * @author Subhashkataria21.90
 + * @author TMg
   * @author Tedjuh10
   * @author Tgr
   * @author The Evil IP address
@@@ -197,6 -192,7 +197,6 @@@ Parameters
  '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}}',
  'tog-previewonfirst' => 'Toggle option used in [[Special:Preferences]]. {{Gender}}',
 -'tog-nocache' => "[[Special:Preferences]], tab 'Misc.'. Offers the user the option of disabling caching of pages in the browser. {{Gender}}",
  'tog-enotifwatchlistpages' => 'Option in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}. {{Gender}}',
  'tog-enotifusertalkpages' => 'Option in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}. {{Gender}}',
  'tog-enotifminoredits' => 'Option in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}. {{Gender}}
@@@ -487,6 -483,7 +487,6 @@@ This can also appear in the credits pag
  {{Identical|This page}}',
  'qbmyoptions' => 'Heading in the Cologne Blue skin user menu containing links to user (talk) page, preferences, watchlist, etc.
  {{Identical|My pages}}',
 -'qbspecialpages' => '{{Identical|Special page}}',
  'faq' => "FAQ is short for ''frequently asked questions''.
  {{Identical|FAQ}}",
  'faqpage' => '{{doc-important|Do not translate <code>Project:</code> part.}}
@@@ -823,27 -820,19 +823,27 @@@ Appears in subtitle. Parameters
  
  Parameters:
  * $1 - a link back to the current page: {{FULLURL:{{FULLPAGENAME}}}}',
 -'youhavenewmessages' => 'The yellow message appearing when someone edited your user talk page.
 +'youhavenewmessages' => "The yellow message appearing when someone edited your user talk page.
  
 -The format is: "{{int:youhavenewmessages| [[MediaWiki:Newmessageslinkplural/{{SUBPAGENAME}}|{{int:newmessageslinkplural}}]] |[[MediaWiki:Newmessagesdifflinkplural/{{SUBPAGENAME}}|{{int:newmessagesdifflinkplural}}]]}}"
 +The format is: {{int:youhavenewmessages| [[MediaWiki:Newmessageslinkplural/{{SUBPAGENAME}}|{{int:newmessageslinkplural}}]] |[[MediaWiki:Newmessagesdifflinkplural/{{SUBPAGENAME}}|{{int:newmessagesdifflinkplural}}]]}}
  
  Parameters:
  * $1 - a link points to new messages. Its text is {{msg-mw|Newmessageslinkplural}}
  * $2 - a link points to new messages diff. Its text is {{msg-mw|Newmessagesdifflinkplural}}
 +* $3 - 1 or 999:
 +** 1 if there was '''one''' new edit since the last time the user has seen their talk page
 +** 999 - if there was '''more than one''' new edit since the last time the user has seen their talk page
  See also:
 -* {{msg-mw|Youhavenewmessagesmanyusers}}',
 -'youhavenewmessagesfromusers' => 'New talk indicator message: the message appearing when someone edited your user talk page. Parameters:
 +* {{msg-mw|Youhavenewmessagesmanyusers}}",
 +'youhavenewmessagesfromusers' => "New talk indicator message: the message appearing when someone edited your user talk page.
 +
 +Parameters:
  * $1 - defined as {{msg-mw|newmessageslinkplural}}
  * $2 - defined as {{msg-mw|newmessagesdifflinkplural}}
 -* $3 - the number of authors who have edited the talk page since the owning user last viewed it',
 +* $3 - the number of authors who have edited the talk page since the owning user last viewed it
 +* $4 - 1 or 999:
 +** 1 if there was '''one''' new edit since the last time the user has seen their talk page
 +** 999 - if there was '''more than one''' new edit since the last time the user has seen their talk page",
  'youhavenewmessagesmanyusers' => 'New talk indicator message: the message appearing when someone edited your user talk page.
  
  Used when more than 10 users edited the user talk page since the owning user last viewed it, similar to {{msg-mw|youhavenewmessages}}.
@@@ -1165,6 -1154,9 +1165,6 @@@ Parameters
  * $3 - a time (optional)
  * $4 - the cut off limit for cached results ($wgQueryCacheLimit). If there are more then this many results for the query, only the first $4 of those will be listed on the page. Usually $4 is about 1000.',
  'querypage-no-updates' => 'Text on some special pages, e.g. [[Special:FewestRevisions]].',
 -'wrong_wfQuery_params' => 'Used as error message. Parameters:
 -* $1 - function name
 -* $2 - query',
  'viewsource' => 'The text displayed in place of the {{msg-mw|Edit}} tab when the user has no permission to edit the page.
  
  See also:
@@@ -1333,6 -1325,7 +1333,6 @@@ See example: [[Special:UserLogin]]'
  {{Identical|Create an account}}',
  'createaccount' => 'Used on the top of the page for logged out users, where it appears next to {{msg-mw|login}}, so consider making them similar.
  
 -It is also used on the submit button in the form/special page where you register a new account.
  {{doc-special|CreateAccount}}
  {{Identical|Create account}}',
  'gotaccount' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED. Parameter:
  'gotaccountlink' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED.
  {{Identical|Log in}}',
  'userlogin-resetlink' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED.',
 -'userlogin-resetpassword-link' => 'Used as link text on login form.
 +'userlogin-resetpassword-link' => 'Used as link text in the login form.
  
 -The link points to the local [[Special:PasswordReset]].
 +The link points to the local page [[Special:PasswordReset]].
  
  See example: [[Special:UserLogin]]
  
@@@ -1481,7 -1474,6 +1481,7 @@@ Parameters
  Parameters:
  * $1 - (Optional) username, for GENDER support',
  'wrongpassword' => 'Used as error message when the provided password is wrong.
 +This message is used in html.
  {{Identical|Please try again}}',
  'wrongpasswordempty' => 'Error message displayed when entering a blank password.
  {{Identical|Please try again}}',
@@@ -1491,8 -1483,7 +1491,8 @@@ Parameters
  * $1 - the minimum number of characters in the password',
  'password-name-match' => 'Used as error message when password validity check failed.',
  'password-login-forbidden' => 'Error message shown when the user has tried to log in using one of the special username/password combinations used for MediaWiki testing. (See [[mwr:75589]], [[mwr:75605]].)',
 -'mailmypassword' => 'Heading in [[Special:PasswordReset]]',
 +'mailmypassword' => 'Used as label for Submit button in [[Special:PasswordReset]].
 +{{Identical|Reset password}}',
  'passwordremindertitle' => 'Title of email which contains temporary password',
  'passwordremindertext' => 'This text is used in an email sent when a user requests a new temporary password (he has forgotten his password) or when an sysop creates a new user account choosing to have password and username sent to the new user by email.
  
@@@ -1574,8 -1565,7 +1574,8 @@@ Parameters
  ** {{msg-mw|Duration-seconds}}
  
  This is a protection against robots trying to find the password by trying lots of them.
 -The number of attempts and waiting time are configured via [[mw:Manual:$wgPasswordAttemptThrottle|$wgPasswordAttemptThrottle]].',
 +The number of attempts and waiting time are configured via [[mw:Manual:$wgPasswordAttemptThrottle|$wgPasswordAttemptThrottle]].
 +This message is used in html.',
  'login-abort-generic' => 'The generic unsuccessful login message is used unless otherwise specified by hook writers',
  'loginlanguagelabel' => 'Used on [[Special:UserLogin]] if $wgLoginLanguageSelector is true. Parameters:
  * $1 - a pipe-separated list built from the names that appear in the message {{msg-mw|Loginlanguagelinks}}.
@@@ -1591,8 -1581,9 +1591,8 @@@ Used on the account creation form when 
  'user-mail-no-body' => 'This is the error message in case an email has an empty or unreasonably short body.',
  
  # Change password dialog
 -'resetpass' => 'The caption of [[Special:ChangePassword]]
 -
 -{{Identical|Change password}}',
 +'changepassword' => "Section heading on [[Special:Preferences]], tab 'User profile'.
 +{{Identical|Change password}}",
  'resetpass_announce' => 'Used in [[Special:UserLogin]].',
  'resetpass_text' => '{{optional}}',
  'resetpass_header' => 'Header on box on special page [[Special:ChangePassword]].
  'resetpass_submit' => 'Submit button on [[Special:ChangePassword]]',
  'changepassword-success' => 'Used in [[Special:ChangePassword]].',
  'resetpass_forbidden' => "Used as error message in changing password. Maybe the external auth plugin won't allow local password changes.",
 -'resetpass-no-info' => 'Error message for [[Special:ChangePassword]].',
 +'resetpass-no-info' => 'Error message for [[Special:ChangePassword]].
 +
 +Parameters:
 +* $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.
  
  {{Identical|Change password}}',
@@@ -1678,10 -1666,7 +1678,10 @@@ See also
  'changeemail' => 'Title of [[Special:ChangeEmail|special page]].',
  'changeemail-header' => 'Header on [[Special:ChangeEmail]].',
  'changeemail-text' => 'Text of [[Special:ChangeEmail]].',
 -'changeemail-no-info' => 'Error message for [[Special:ChangeEmail]].',
 +'changeemail-no-info' => 'Error message for [[Special:ChangeEmail]].
 +
 +Parameters:
 +* $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]].',
  'changeemail-none' => "Probably appears in 'Current E-mail address' field when no address held, in [[Special:ChangeEmail]].
@@@ -1795,8 -1780,7 +1795,8 @@@ See also
  See also:
  * {{msg-mw|Showdiff}}
  * {{msg-mw|Accesskey-diff}}
 -* {{msg-mw|Tooltip-diff}}',
 +* {{msg-mw|Tooltip-diff}}
 +{{Identical|Show change}}',
  'anoneditwarning' => 'Shown when editing a page anonymously.
  See also:
  * {{msg-mw|Sf autoedit anoneditwarning}}
@@@ -1873,14 -1857,10 +1873,14 @@@ See also
  {{Identical|Login required}}',
  'loginreqlink' => 'Take a look on inflection. Used as <code>$1</code> in the following messages:
  * {{msg-mw|loginreqpagetext}}
 +* {{msg-mw|exception-nologin-text-manual}}
  * {{msg-mw|whitelistedittext}}
  * {{msg-mw|Uploadnologintext}}
 -* {{msg-mw|watchlistanontext‎}}
 -* {{msg-mw|Confirmemail needlogin}}
 +* {{msg-mw|watchlistanontext}}
 +* {{msg-mw|confirmemail_needlogin}}
 +* {{msg-mw|changeemail-no-info}}
 +* {{msg-mw|resetpass-no-info}}
 +* {{msg-mw|prefsnologintext2}}
  {{Identical|Log in}}',
  'loginreqpagetext' => 'This message is displayed if an anonymous reader attempts to access a page which is only available to logged-in users.
  
@@@ -2016,7 -1996,7 +2016,7 @@@ Parameters
  'semiprotectedpagewarning' => '{{Related|Semiprotectedpagewarning}}',
  'cascadeprotectedwarning' => 'Parameters:
  * $1 - number of pages, for PLURAL support',
 -'titleprotectedwarning' => 'Warning message above the edit form when editing a page that has been protected aginst creation.',
 +'titleprotectedwarning' => 'Warning message above the edit form when editing a page that has been protected against creation.',
  'templatesused' => 'Displayed below the page when editing it. It indicates a list of templates which are used on that page.
  
  Parameters:
@@@ -2138,6 -2118,11 +2138,11 @@@ Parameters
  'editwarning-warning' => "{{doc-important|Do ''not'' use <nowiki>{{int:prefs-editing}}</nowiki> for \"Editing\". It is forbidden in this message, see [[mwr:68405]].}}
  
  but you can see the text of that button here: {{msg-mw|Prefs-editing}}",
+ 'editpage-notsupportedcontentformat-title'=> 'Title of error page shown when using an incompatible format on EditPage',
+ 'editpage-notsupportedcontentformat-text' => 'Error message shown when using an incompatible format on EditPage.
+ * $1 is the format id
+ * $2 is the content model name
+ ',
  
  # Content models
  'content-model-wikitext' => 'Name for the wikitext content model, used when decribing what type of content a page contains.
@@@ -2267,17 -2252,10 +2272,17 @@@ See also
  
  # Account creation failure
  'cantcreateaccounttitle' => 'Used as title of the error message {{msg-mw|Cantcreateaccount-text}}.',
 -'cantcreateaccount-text' => 'Used as error message, with the title {{msg-mw|cantcreateaccounttitle}}.
 +'cantcreateaccount-text' => 'Used as error message, with the title {{msg-mw|Cantcreateaccounttitle}}.
  * $1 - target IP address
 -* $2 - reason or {{msg-mw|blockednoreason}}
 -* $3 - username',
 +* $2 - reason or {{msg-mw|Blockednoreason}}
 +* $3 - username
 +See also:
 +* {{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}}.
 +* $1 - target IP range
 +* $2 - reason or {{msg-mw|Blockednoreason}}
 +* $3 - username
 +* $4 - current user's IP address",
  
  # History pages
  'viewpagelogs' => 'Link displayed in history of pages',
@@@ -2405,6 -2383,14 +2410,6 @@@ See [{{canonicalurl:x|feed=atom&action=
  {{doc-special|RevisionDelete|unlisted=1}}',
  'revdelete-nooldid-title' => '{{RevisionDelete}}',
  'revdelete-nooldid-text' => '{{RevisionDelete}}',
 -'revdelete-nologtype-title' => 'See also:
 -* {{msg-mw|Revdelete-nologtype-text}}',
 -'revdelete-nologtype-text' => 'See also:
 -* {{msg-mw|Revdelete-nologtype-title}}',
 -'revdelete-nologid-title' => 'See also:
 -* {{msg-mw|Revdelete-nologid-text}}',
 -'revdelete-nologid-text' => 'See also:
 -* {{msg-mw|Revdelete-nologid-title}}',
  'revdelete-no-file' => 'Used as error message in [[Special:RevisionDelete]].',
  'revdelete-show-file-confirm' => 'A confirmation message shown on [[Special:Revisiondelete]] when the request does not contain a valid token (e.g. when a user clicks a link received in mail).
  
@@@ -2526,6 -2512,8 +2531,6 @@@ Possible alternative message - "Restric
  Parameters:
  * $1 - ...',
  'revdel-restore' => '{{RevisionDelete}}',
 -'revdel-restore-deleted' => '{{RevisionDelete}}',
 -'revdel-restore-visible' => '{{RevisionDelete}}',
  'pagehist' => '{{RevisionDelete}}
  Links to page history at Special:RevisionDelete header together with links to the logs and [[Special:Undelete]].
  {{Identical|Page history}}',
@@@ -2789,10 -2777,25 +2794,10 @@@ Parameters
  
  Parameters:
  * $1 - the search term',
 -'searchresulttext' => '{{doc-important|Do not translate <code><nowiki>[[{{MediaWiki:Helppage}}|{{int:help}}]]</nowiki></code>.}}
 -See also:
 -* {{msg-mw|Helppage}}
 -* {{msg-mw|Help}}',
 -'searchsubtitle' => 'Refers to {{msg-mw|Pipe-separator}}.
 -
 -Parameters:
 -* $1 - search term
 -See also:
 -* {{msg-mw|Searchsubtitleinvalid}}',
 -'searchsubtitleinvalid' => 'Parameters:
 -* $1 - search term
 -See also:
 -* {{msg-mw|Searchsubtitle}}',
  'toomanymatches' => 'Used as section header in [[Special:Search]], when there are too many hits.',
  'titlematches' => 'Used as section header in [[Special:Search]].
  
  This message is followed by search results.',
 -'notitlematches' => 'Header of results page after a search for a title for which no page exists',
  'textmatches' => 'When displaying search results',
  'notextmatches' => 'Error message when there are no results',
  'prevn' => "This is part of the navigation message on the top and bottom of Special pages (lists of things in alphabetical order, i.e. the '[[Special:Categories]]' page), where it is used as the first argument of {{msg-mw|Viewprevnext}}.
@@@ -2829,16 -2832,18 +2834,16 @@@ For Special pages, the navigation bar i
  Viewprevnext 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).
  
  Refers to {{msg-mw|Pipe-separator}}.',
 -'searchmenu-legend' => '{{Identical|Search options}}',
  '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).
  
  Parameters:
 -* $1 - page title',
 +* $1 - page title
 +* $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).
  
  Parameters:
 -* $1 - page title',
 -'searchmenu-prefix' => '{{doc-important|Do not translate "Special:PrefixIndex"}}
 -Parameters:
 -* $1 - prefix string',
 +* $1 - page title
 +* $2 - the number of search results found',
  '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.
  
  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]].
@@@ -2918,6 -2923,7 +2923,6 @@@ Parameters
  'search-interwiki-more' => '{{Identical|More}}',
  'search-relatedarticle' => 'This is a search result (and I guess search engine) dependent messages. I do not know how to trigger the feature. The message is displayed if the search result contains information that related pages can also be provided from the search engine. I assume this is "More Like This" functionality. Microsoft glossary defines MLT as "A way to refine search by identifying the right set of documents and then locating similar documents. This allows the searcher to control the direction of the search and focus on the most fruitful lines of inquiry."[http://www.microsoft.com/enterprisesearch/en/us/search-glossary.aspx]
  {{Identical|Related}}',
 -'mwsuggest-disable' => "The text of an option on the 'search options' tab of a user's Preferences.",
  'searcheverything-enable' => 'Used in [[Special:Preferences]], tab "Search".',
  'searchrelated' => 'This is a search result (and I guess search engine) dependent messages. I do not know how to trigger the feature. The message is displayed if the search result contains information that related pages can also be provided from the search engine. I assume this is "More Like This" functionality. Microsoft glossary defines MLT as "A way to refine search by identifying the right set of documents and then locating similar documents. This allows the searcher to control the direction of the search and focus on the most fruitful lines of inquiry."[http://www.microsoft.com/enterprisesearch/en/us/search-glossary.aspx]
  {{Identical|Related}}',
@@@ -2939,12 -2945,18 +2944,12 @@@ See also
  * $3 - total number of results
  * $4 - the search term
  * $5 - number of results',
 -'nonefound' => 'This message appears on the search results page if no results are found.
 -{{doc-important|Do not translate "all:".}}',
  'search-nonefound' => 'Message shown when a search returned no results (when using the default MediaWiki search engine).',
 -'powersearch' => 'Verb. Text of search button at the bottom of [[Special:Search]], for searching in selected namespaces.
 -
 -{{Identical|Advanced search}}',
  'powersearch-legend' => 'Advanced search
  
  {{Identical|Advanced search}}',
  'powersearch-ns' => 'Used in the extended search form at [[Special:Search]]',
  'powersearch-redir' => 'Used in the extended search form at [[Special:Search]]',
 -'powersearch-field' => 'Used in the extended search form at [[Special:Search]]',
  'powersearch-togglelabel' => 'Used in [{{canonicalurl:Special:Search|advanced=1}} Advanced search]. Synonym: "Select" as verb.
  {{Identical|Check}}',
  'powersearch-toggleall' => '"All" refers to namespaces. It is used in Advanced search: {{canonicalurl:Special:Search|advanced=1}}
@@@ -2972,6 -2984,8 +2977,6 @@@ See also
  'prefs-edits' => 'In user preferences.',
  'prefsnologintext2' => 'Parameters:
  * $1 - a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description',
 -'changepassword' => "Section heading on [[Special:Preferences]], tab 'User profile'.
 -{{Identical|Change password}}",
  'prefs-skin' => 'Used in user preferences.
  {{Identical|Skin}}',
  'skin-preview' => '{{doc-actionlink}}
@@@ -3028,6 -3042,7 +3033,6 @@@ See also
  * {{msg-mw|Accesskey-preferences-save}}
  * {{msg-mw|Tooltip-preferences-save}}
  {{Identical|Save}}',
 -'resetprefs' => 'Button for resetting changes in the preferences page.',
  'restoreprefs' => 'Used as link text in [[Special:Preferences]]. The link points to [[Special:Preferences/reset]] which shows the "Restore all default settings" form.
  
  Also used as label for the Submit button in [[Special:Preferences/reset]].',
@@@ -3038,9 -3053,10 +3043,9 @@@ When changing this message, please als
  {{Identical|Row}}',
  'columns' => 'Used on [[Special:Preferences]], "Editing" section in the "Size of editing window" fieldset.
  {{Identical|Column}}',
 -'searchresultshead' => 'This is the label of the tab in [[Special:Preferences|my preferences]] which contains options for searching the wiki.
 +'searchresultshead' => 'Replaced by {{msg-mw|prefs-searchoptions}}, though may still be used in some extensions. DEPRECATED.
  
  {{Identical|Search}}',
 -'resultsperpage' => "Option on the 'Search options' tab of [[Special:Preferences]]",
  'stub-threshold' => 'Used in [[Special:Preferences]], tab "Misc".',
  'stub-threshold-disabled' => 'Used in [[Special:Preferences]].
  {{Identical|Disabled}}',
@@@ -3062,6 -3078,7 +3067,6 @@@ This option lets your time zone settin
  Parameters:
  * $1 - timezone name, or timezone offset (in "%+03d:%02d" format)',
  'timezoneuseoffset' => 'Used in "Time zone" listbox in [[Special:Preferences#mw-prefsection-datetime|preferences]], "date and time" tab.',
 -'timezoneoffset' => "Text next to input box in [[Special:Preferences]], tab 'date and time', section 'timezone'.",
  'servertime' => 'Used as label in [[Special:Preferences#mw-prefsection-datetime|preferences]].',
  'guesstimezone' => 'Option to fill in the timezone from the browser setting',
  'timezoneregion-africa' => 'Used in "Time zone" listbox in [[Special:Preferences#mw-prefsection-datetime|preferences]], "date and time" tab.
@@@ -3235,7 -3252,6 +3240,7 @@@ Used in [[Special:Preferences]], tab "W
  The checkbox has the label {{msg-mw|Tog-prefershttps}}.
  
  See example: [[mw:Special:Preferences]].',
 +'prefs-tabs-navigation-hint' => 'Hint message that explains the arrow key navigation for the tabs on [[Special:Preferences]] to screenreader users.',
  
  # User preference: email validation using jQuery
  'email-address-validity-valid' => 'Used as hint for {{msg-mw|changeemail-newemail}} field in [[Special:ChangeEmail]], when the provided E-mail address is valid.',
@@@ -3593,20 -3609,28 +3598,20 @@@ See also
  'recentchanges-summary' => 'Summary of [[Special:RecentChanges]].',
  'recentchanges-noresult' => 'Used in [[Special:RecentChanges]], [[Special:RecentChangesLinked]], and [[Special:Watchlist]] when there are no changes to be shown.',
  'recentchanges-feed-description' => 'Used in feed of RecentChanges. See example [{{canonicalurl:Special:RecentChanges|feed=atom}} feed].',
 -'recentchanges-label-newpage' => 'Tooltip for {{msg-mw|newpageletter}}',
 -'recentchanges-label-minor' => 'Tooltip for {{msg-mw|minoreditletter}}',
 -'recentchanges-label-bot' => 'Tooltip for {{msg-mw|boteditletter}}',
 +'recentchanges-label-newpage' => '# Used as tooltip for {{msg-mw|Newpageletter}}.
 +# Also used as legend. Preceded by {{msg-mw|Newpageletter}} and followed by {{msg-mw|Recentchanges-legend-newpage}}.',
 +'recentchanges-label-minor' => '# Used as tooltip for {{msg-mw|Minoreditletter}}
 +# Also used as legend. Preceded by {{msg-mw|Minoreditletter}}',
 +'recentchanges-label-bot' => '# Used as tooltip for {{msg-mw|Boteditletter}}
 +# Also used as legend. Preceded by {{msg-mw|Boteditletter}}',
  'recentchanges-label-unpatrolled' => 'Tooltip for {{msg-mw|unpatrolledletter}}',
 -'recentchanges-label-plusminus' => 'Legend item for plus/minus',
 -'recentchanges-legend-newpage' => 'A link to [[Special:NewPages]]',
 -'recentchanges-legend-plusminus' => 'A plus/minus sign with a number for the legend.',
 -'rcnote' => 'Used on [[Special:RecentChanges]].
 +'recentchanges-label-plusminus' => 'Legend item for plus/minus.
  
 -Similar to {{msg-mw|wlnote}} which is used on [[Special:Watchlist]].
 -
 -Parameters:
 -* $1 - the number of changes shown
 -* $2 - the number of days for which the changes are shown
 -* $3 - (Unused) a date and time
 -* $4 - a date alone
 -* $5 - a time alone
 -
 - <!--Example: "\'\'Below are the last 50 changes in the last 7 days, as of 14:48, 24 January 2008.\'\'"-->
 - Example: "\'\'{{int:rcnote/en|50|7||24 January 2008|14:48}}\'\'"
 -See also:
 -* {{msg-mw|Rcnotefrom}}',
 +Preceded by legend example {{msg-mw|Recentchanges-legend-plusminus}}.',
 +'recentchanges-legend-heading' => 'Used as a heading for legend box on [[Special:RecentChanges]] and [[Special:Watchlist]].
 +{{Identical|Legend}}',
 +'recentchanges-legend-newpage' => 'Used as legend in [[Special:RecentChanges]]. Preceded by {{msg-mw|Recentchanges-label-newpage}}.',
 +'recentchanges-legend-plusminus' => 'A plus/minus sign with a number for the legend.',
  'rcnotefrom' => 'This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time.
  
  The corresponding message is {{msg-mw|Rclistfrom}} (without split of date and time, [[bugzilla:19104|Bug 19104]]).
@@@ -3615,29 -3639,31 +3620,29 @@@ Parameters
  * $1 - the maximum number of changes that are displayed
  * $2 - a date and time
  * $3 - (Optional) a date
 -* $4 - (Optional) a time
 -See also:
 -* {{msg-mw|Rcnote}}',
 +* $4 - (Optional) a time',
  'rclistfrom' => 'Used on [[Special:RecentChanges]].
  
  Parameters:
  * $1 - a link to the revision of a specific date and time. The date and the time are the link description (without split of date and time, [[bugzilla:19104|Bug 19104]]).
  
  The corresponding message is {{msg-mw|Rcnotefrom}}.',
 -'rcshowhideminor' => "Option text in [[Special:RecentChanges]]. Parameters:
 -* $1 is the 'show/hide' command, with the text taken from either {{msg-mw|show}} or {{msg-mw|hide}}.",
 -'rcshowhidebots' => "Option text in [[Special:RecentChanges]]. Parameters:
 -* $1 is the 'show/hide' command, with the text taken from either {{msg-mw|show}} or {{msg-mw|hide}}.
 -{{Identical|$1 bots}}",
 +'rcshowhideminor' => 'Option text in [[Special:RecentChanges]]. Parameters:
 +* $1 - the "show/hide" command, with the text taken from either {{msg-mw|Show}} or {{msg-mw|Hide}}',
 +'rcshowhidebots' => 'Option text in [[Special:RecentChanges]]. Parameters:
 +* $1 - the "show/hide" command, with the text taken from either {{msg-mw|Show}} or {{msg-mw|Hide}}
 +{{Identical|$1 bots}}',
  'rcshowhideliu' => 'Option text in [[Special:RecentChanges]]. Parameters:
  * $1 - any one of the following messages:
  ** {{msg-mw|Show}}
  ** {{msg-mw|Hide}}',
 -'rcshowhideanons' => "Option text in [[Special:RecentChanges]]. Parameters:
 -* $1 is the 'show/hide' command, with the text taken from either {{msg-mw|show}} or {{msg-mw|hide}}.
 -{{Identical|Anonymous user}}",
 -'rcshowhidepatr' => "Option text in [[Special:RecentChanges]]. Parameters:
 -* $1 is the 'show/hide' command, with the text taken from either {{msg-mw|show}} or {{msg-mw|hide}}.",
 -'rcshowhidemine' => "Option text in [[Special:RecentChanges]]. Parameters:
 -* $1 is the 'show/hide' command, with the text taken from either {{msg-mw|show}} or {{msg-mw|hide}}.",
 +'rcshowhideanons' => 'Option text in [[Special:RecentChanges]]. Parameters:
 +* $1 - the "show/hide" command, with the text taken from either {{msg-mw|Show}} or {{msg-mw|Hide}}
 +{{Identical|Anonymous user}}',
 +'rcshowhidepatr' => 'Option text in [[Special:RecentChanges]]. Parameters:
 +* $1 - the "show/hide" command, with the text taken from either {{msg-mw|Show}} or {{msg-mw|Hide}}',
 +'rcshowhidemine' => 'Option text in [[Special:RecentChanges]]. Parameters:
 +* $1 - the "show/hide" command, with the text taken from either {{msg-mw|Show}} or {{msg-mw|Hide}}',
  'rclinks' => "Used on [[Special:RecentChanges]].
  * \$1 - a list of different choices with number of pages to be shown.<br />&nbsp;Example: \"''50{{int:pipe-separator}}100{{int:pipe-separator}}250{{int:pipe-separator}}500\".
  * \$2 - a list of clickable links with a number of days for which recent changes are to be displayed.<br />&nbsp;Example: \"''1{{int:pipe-separator}}3{{int:pipe-separator}}7{{int:pipe-separator}}14{{int:pipe-separator}}30''\".
@@@ -3828,8 -3854,8 +3833,8 @@@ See also
  'badfilename' => 'Parameters:
  * $1 - filename',
  'filetype-mime-mismatch' => 'Upload error. Parameters:
 -* $1 is the extension of the uploaded file
 -* $2 is the MIME type of the uploaded file',
 +* $1 - the extension of the uploaded file
 +* $2 - the MIME type of the uploaded file',
  'filetype-badmime' => 'Parameters:
  * $1 - string representing the MIME type',
  'filetype-bad-ie-mime' => 'Parameters:
@@@ -4041,14 -4067,7 +4046,14 @@@ This message is followed by the galler
  Parameters:
  * $1 - number of duplicate files',
  'file-deleted-duplicate' => 'Used in [[Special:Upload]. Parameters:
 -* $1 - page title of the file',
 +* $1 - page title of the file
 +
 +See also:
 +* {{msg-mw|file-deleted-duplicate-notitle}}',
 +'file-deleted-duplicate-notitle' => 'Used in [[Special:Upload]] when the title of the deleted duplicate is not available.
 +
 +See also:
 +* {{msg-mw|file-deleted-duplicate}}',
  'uploadwarning' => 'Used as section header in [[Special:Upload]].',
  'uploadwarning-text' => 'Used in [[Special:Upload]].',
  'savefile' => 'When uploading a file',
@@@ -4162,10 -4181,11 +4167,10 @@@ See also
  * {{msg-mw|upload-warning-subj|subject}}
  * {{msg-mw|upload-warning-msg|message}}',
  'upload-warning-msg' => 'Used as warning body which is posted on the user talk page. Parameters:
 -* $1 is the URL the file was uploaded from, when using upload-by-URL
 -* $2 is the session key for the upload
 +* $1 - the URL the file was uploaded from, when using upload-by-URL
 +* $2 - the session key for the upload
  See also:
 -* {{msg-mw|upload-warning-subj|subject}}
 -* {{msg-mw|upload-warning-msg|message}}',
 +* {{msg-mw|Upload-warning-subj|subject}}',
  
  'upload-proto-error' => 'See also:
  * {{msg-mw|Upload-proto-error|title}}
@@@ -4204,22 -4224,22 +4209,22 @@@ See also
  
  # File backend
  'backend-fail-stream' => 'Parameters:
 -* $1 is a filename.',
 +* $1 - a filename',
  'backend-fail-backup' => 'Parameters:
 -* $1 is a filename.',
 +* $1 - a filename',
  'backend-fail-notexists' => 'Parameters:
 -* $1 is a filename.',
 +* $1 - a filename',
  'backend-fail-hashes' => 'Definition of "[[w:en:Hash_function|hashes]]".',
  'backend-fail-notsame' => 'Parametreler:
  * $1 bir dosya ismi.',
  'backend-fail-invalidpath' => 'Parameters:
 -* $1 is a storage path.',
 +* $1 - a storage path',
  'backend-fail-delete' => 'Parameters:
 -* $1 is a file path.',
 +* $1 - a file path',
  'backend-fail-describe' => 'Parameters:
 -* $1 is a file path.',
 +* $1 - a file path',
  'backend-fail-alreadyexists' => 'Parameters:
 -* $1 is a filename.',
 +* $1 - a filename',
  'backend-fail-store' => 'Parameters:
  * $1 - a filename
  * $2 - a storage path',
  * $1 - filename
  {{Related|Backend-fail}}',
  'backend-fail-create' => 'Parameters:
 -* $1 is a filename.',
 +* $1 - a filename',
  'backend-fail-maxsize' => 'Parameters:
  * $1 - destination storage path
  * $2 - max file size (in bytes)',
@@@ -4271,7 -4291,7 +4276,7 @@@ Parameters
  
  A "[[:wikipedia:Front and back ends|backend]]" is a system or component that ordinary users don\'t interact with directly and don\'t need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are "system" or "service", or (depending on context and language) even leave it untranslated.',
  'backend-fail-usable' => 'Parameters:
 -* $1 is the file name, including the path, formatted for the storage backend used',
 +* $1 - the file name, including the path, formatted for the storage backend used',
  
  # File journal errors
  'filejournal-fail-dbconnect' => 'Parameters:
@@@ -4870,19 -4890,7 +4875,19 @@@ See also
  Parameters:
  * $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.',
 -'nmembers' => 'Appears in brackets after each category listed on the special page [[Special:WantedCategories]]. $1 is the number of members of the category.',
 +'nmembers' => 'Appears in brackets after each category listed on the special page [[Special:WantedCategories]].
 +
 +Parameters:
 +* $1 - the number of members of the category
 +See also:
 +* {{msg-mw|Nmemberschanged}}',
 +'nmemberschanged' => 'Appears in brackets after each category listed on the special page [[Special:WantedCategories]] if the number of pages in the category has changed since the list was last refreshed.
 +
 +Parameters:
 +* $1 - the original number of members of the category
 +* $2 - the current one
 +See also:
 +* {{msg-mw|Nmembers}}',
  'nrevisions' => 'Used as link text in [[Special:FewestRevisions]].
  
  The link points to the page history (action=history).
@@@ -4949,10 -4957,10 +4954,10 @@@ See the following search results
  'protectedpages' => '{{doc-special|ProtectedPages}}',
  'protectedpages-indef' => 'Option in [[Special:ProtectedPages]]',
  'protectedpages-cascade' => 'Option in [[Special:ProtectedPages]]',
 -'protectedpagestext' => 'Shown on top of [[Special:ProtectedPages]]',
 +'protectedpages-noredirect' => 'Option in [[Special:ProtectedPages]].
 +{{Identical|Hide redirect}}',
  'protectedpagesempty' => 'Used in [[Special:ProtectedPages]], when there are no protected pages with the specified parameters.',
  'protectedtitles' => '{{doc-special|ProtectedTitles}}',
 -'protectedtitlestext' => 'Shown on top of list of titles on [[Special:ProtectedTitles]]. If the list is empty the message [[MediaWiki:Protectedtitlesempty]] appears instead of this. See the [[mw:Project:Protected_titles|help page on MediaWiki]] for more information.',
  'protectedtitlesempty' => 'Used on [[Special:ProtectedTitles]]. This text appears if the list of protected titles is empty. See the [[mw:Project:Protected_titles|help page on MediaWiki]] for more information.',
  'listusers' => '{{doc-special|ListUsers}}',
  'listusers-editsonly' => 'Option in [[Special:ListUsers]].',
@@@ -4989,7 -4997,7 +4994,7 @@@ See also
  See also:
  * {{msg-mw|Notargettitle|title}}
  * {{msg-mw|Notargettext|text}}',
 -'nopagetitle' => 'Used as title of [[Special:MovePage]], when the oldtitle does not exist.
 +'nopagetitle' => 'Used as title on special pages like [[Special:MovePage]] (when the oldtitle does not exist) or [[Special:PermaLink]].
  
  The text is {{msg-mw|nopagetext}}.
  
@@@ -5076,6 -5084,19 +5081,6 @@@ Parameters
  See also:
  * {{msg-mw|Allnotinnamespace}}
  {{Identical|All pages}}',
 -'allnotinnamespace' => 'Presumably intended to be used as a page title of [[Special:Allpages]] and probably also in [[Special:PrefixIndex]] when the user limit the display to other than a certain namespace.
 -
 -Parameters:
 -* $1 - namespace name
 -See also:
 -* {{msg-mw|Allinnamespace}}
 -{{Identical|All pages}}',
 -'allpagesprev' => "Allegedly used in [[Special:AllPages]], although I haven't seen it.
 -
 -{{Identical|Previous}}",
 -'allpagesnext' => "Allegedly used in [[Special:AllPages]], although I haven't seen it.
 -
 -{{Identical|Next}}",
  'allpagessubmit' => 'Text on submit button in [[Special:AllPages]], [[Special:RecentChanges]], [[Special:RecentChangesLinked]], [[Special:NewPages]], [[Special:Log]], [[Special:ListUsers]], [[Special:ProtectedPages]], [[Special:ProtectedTitles]], [[Special:WhatLinksHere]] and [[Special:Watchlist]].
  
  {{Identical|Go}}',
  'allpagesbadtitle' => 'Used in [[Special:AllPages]], [[Special:PrefixIndex]] and [[Special:RecentChangesLinked]].',
  'allpages-bad-ns' => 'Used as error message. Parameters:
  * $1 - namespace name, other than "Main" namespace',
 -'allpages-hide-redirects' => 'Label for a checkbox. If the checkbox is checked redirects will not be shown in the list. Used in [[Special:PrefixIndex]] and [[Special:Allpages]].',
 +'allpages-hide-redirects' => 'Label for a checkbox. If the checkbox is checked redirects will not be shown in the list. Used in [[Special:PrefixIndex]] and [[Special:Allpages]].
 +{{Identical|Hide redirect}}',
  
  # SpecialCachedPage
  'cachedspecial-viewing-cached-ttl' => 'Message notifying they are watching a cached page. $1 is a duration (ie "1 hour and 30 minutes")',
@@@ -5414,7 -5434,9 +5419,7 @@@ See also
  * {{msg-mw|Watchlist-details}}',
  'iteminvalidname' => 'Parameters:
  * $1 - item name',
 -'wlnote' => 'Used on [[Special:Watchlist]] when the maximum number of days is specified.
 -
 -Similar to {{msg-mw|rcnote}} which is used on [[Special:RecentChanges]].
 +'wlnote' => 'Used on [[Special:Watchlist]] when a maximum number of hours or days is specified.
  
  Parameters:
  * $1 - the number of changes shown
@@@ -5609,7 -5631,6 +5614,7 @@@ See also
  * $1 - the upper limit of number of revisions
  See also:
  * {{msg-mw|Delete-toobig}}',
 +'deleting-backlinks-warning' => 'A warning shown when a page that is being deleted has links to it.',
  
  # Rollback
  'rollback' => '{{Identical|Rollback}}',
@@@ -5915,6 -5936,8 +5920,6 @@@ Example (in English)
  'undeleteviewlink' => 'First part of {{msg-mw|undeletelink}}.
  Display name of link to view a deleted page used on [[Special:Log/delete]].
  {{Identical|View}}',
 -'undeletereset' => 'Shown on [[Special:Undelete]] as button caption.
 -{{Identical|Reset}}',
  'undeleteinvert' => '{{Identical|Invert selection}}',
  'undeletecomment' => '{{Identical|Reason}}',
  'undeletedrevisions' => 'Used as reason in the log entry. Parameters:
@@@ -5992,17 -6015,15 +5997,17 @@@ Parameters
  * $3 - the time of the displayed revision
  {{Identical|Are you sure you want to view the deleted revision of the file...}}',
  'undelete-show-file-submit' => '{{Identical|Yes}}',
 -'undelete-revisionrow' => "{{Optional}}
 +'undelete-revision-row' => "{{Optional}}
  A revision row in the undelete page. Parameters:
  * $1 is a checkBox to indicate whether to restore this specific revision
  * $2 is a link to the revision
  * $3 is a link to the last revision of a page ({{msg-mw|last}})
  * $4 is a link to the page
  * $5 is a link to the revision's user
 -* $6 is the revision size
 -* $7 is the revision comment",
 +* $6 is the revision's minor edit identifier
 +* $7 is the revision size
 +* $8 is the revision comment
 +* $9 is the revision's tags",
  
  # Namespace form on various pages
  'namespace' => 'This message is located at [[Special:Contributions]].
@@@ -6245,9 -6266,10 +6250,9 @@@ See also
  'block' => '{{doc-special|Block}}
  {{Identical|Block user}}',
  'unblock' => '{{doc-special|Unblock}}',
 -'blockip' => 'The title of the special page [[Special:BlockIP]].
 +'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.
  
  {{Identical|Block user}}',
 -'blockip-title' => '{{Identical|Block user}}',
  'blockip-legend' => 'Legend/Header for the fieldset around the input form of [[Special:Block]].
  
  {{Identical|Block user}}',
@@@ -6264,6 -6286,7 +6269,6 @@@ See also
  '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].
  
  {{Identical|Reason}}',
 -'ipbreasonotherlist' => '{{Identical|Other reason}}',
  'ipbreason-dropdown' => 'Used as item list for dropdown on [[Special:Block]].
  
  The label for this dropdown is {{msg-mw|Ipbreason}}.',
@@@ -6300,6 -6323,8 +6305,6 @@@ See also
  'ipboptions' => "{{doc-important|Be careful: '''1 translation:1 english''', so the first part is the translation and the second part should stay in English.}}
  Options for the duration of the block. Example: See e.g. [[MediaWiki:Ipboptions/nl]] if you still don't know how to do it.
  {{Identical|Infinite}}",
 -'ipbotheroption' => '{{Identical|Other}}',
 -'ipbotherreason' => '{{Identical|Other/additional reason}}',
  'ipbhidename' => 'This is the label for a checkbox in the user block form on [[Special:Block]].
  
  See also:
@@@ -6787,6 -6812,7 +6792,6 @@@ See also
  * {{msg-mw|move-watch|label for checkbox}}
  {{Identical|Move page}}',
  'moveuserpage-warning' => 'Used as warning in [[Special:MovePage]], when moving a user page.',
 -'movenologin' => '{{Identical|Not logged in}}',
  'movenologintext' => "Text of message on special page 'Permissions Errors', which appears when somebody tries to move a page without being logged in.
  
  See also:
@@@ -7857,7 -7883,6 +7862,7 @@@ CSS applied to users using Monobook ski
  'print.css' => '{{optional}}',
  'noscript.css' => '{{optional}}',
  'group-autoconfirmed.css' => '{{doc-group|autoconfirmed|css}}',
 +'group-user.css' => '{{doc-group|user|css}}',
  'group-bot.css' => '{{doc-group|bot|css}}',
  'group-sysop.css' => '{{doc-group|sysop|css}}',
  'group-bureaucrat.css' => '{{doc-group|bureaucrat|css}}',
@@@ -7871,7 -7896,6 +7876,7 @@@ JS for users using Monobook skin.'
  'modern.js' => '{{optional}}',
  'vector.js' => '{{optional}}',
  'group-autoconfirmed.js' => '{{doc-group|autoconfirmed|js}}',
 +'group-user.js' => '{{doc-group|user|js}}',
  'group-bot.js' => '{{doc-group|bot|js}}',
  'group-sysop.js' => '{{doc-group|sysop|js}}',
  'group-bureaucrat.js' => '{{doc-group|bureaucrat|js}}',
@@@ -8010,8 -8034,7 +8015,8 @@@ The label and the input box are always 
  'pageinfo-display-title' => 'The title that is displayed when the page is viewed.',
  'pageinfo-default-sort' => 'The key by which the page is sorted in categories by default.',
  'pageinfo-length' => 'The length of the page, in bytes.',
 -'pageinfo-article-id' => 'The numeric identifier of the page.',
 +'pageinfo-article-id' => 'The numeric identifier of the page.
 +{{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.
  
@@@ -8036,8 -8059,7 +8041,8 @@@ Preceded by the label {{msg-mw|Pageinfo
  'pageinfo-few-watchers' => 'Message displayed when there are fewer than $wgUnwatchedPageThreshold watchers. $1 is the value of $wgUnwatchedPageThreshold.',
  'pageinfo-redirects-name' => 'Header of the row in the first table of the info action.
  
 -Followed by the number of redirects to the page.
 +Followed by {{msg-mw|Pageinfo-redirects-value}}.
 +
  Used as link text. The link points to "{{int:Whatlinkshere-title}}" page ([[Special:WhatLinksHere]]).
  
  See example: [{{canonicalurl:Main page|action=info}} Main page?action=info]',
@@@ -8046,8 -8068,7 +8051,8 @@@ Parameters
  * $1 - the number of redirects to the page',
  'pageinfo-subpages-name' => 'Header of the row in the first table of the info action.
  
 -Followed by the number of subpages of the page.
 +Followed by {{msg-mw|Pageinfo-subpages-value}}.
 +
  Used as link text. The link points to the "{{int:Prefixindex}}" page ([[Special:PrefixIndex]]).
  
  See example: [{{canonicalurl:Main page|action=info}} Main page?action=info]',
@@@ -9424,6 -9445,11 +9429,6 @@@ Parameters
  * $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.
  {{Related|Exif-urgency}}',
  
 -# External editor support
 -'edit-externally' => 'Displayed on image description pages. See for example [[:Image:Yes.png#filehistory]].',
 -'edit-externally-help' => '{{doc-important|Please leave the link "<code>https://www.mediawiki.org/wiki/Manual:External_editors</code>" exactly as it is.}}
 -Displayed on image description pages. See for example [[:Image:Yes.png#filehistory]].',
 -
  # 'all' in various places, this might be different for inflected languages
  'watchlistall2' => 'Appears on [[Special:Watchlist]].
  
@@@ -9433,6 -9459,9 +9438,6 @@@ Used as <code>$3</code> in the message 
  
  {{Identical|All}}',
  'monthsall' => 'Used in a drop-down box on [[Special:Contributions]] as an option for "all months". See also {{msg-mw|Month}}.
 -{{Identical|All}}',
 -'limitall' => 'Used on [[Special:AllMessages]] (and potentially other TablePager based tables) to display "all" the messages.
 -
  {{Identical|All}}',
  
  # Email address confirmation
@@@ -9452,11 -9481,10 +9457,11 @@@ See also
  * {{msg-mw|Confirmemail oncreate}}',
  'confirmemail_invalid' => 'Error message on [[Special:ConfirmEmail]] on error of confirmation.',
  'confirmemail_needlogin' => 'Used on [[Special:ConfirmEmail]] when you are logged out.
 -* $1 is a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description',
 +
 +Parameters:
 +* $1 - a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description',
  'confirmemail_success' => 'Explanation on [[Special:ConfirmEmail]] on completion of confirmation.',
  'confirmemail_loggedin' => 'Explanation on [[Special:ConfirmEmail]] on completion of confirmation.',
 -'confirmemail_error' => 'Error message on [[Special:ConfirmEmail]]',
  'confirmemail_subject' => 'Subject of the e-mail sent to user during e-mail address confirmation
  {{Identical|SITENAME e-mail address confirmation}}',
  'confirmemail_body' => 'Body of the email sent to user when their account is created or they confirm their email address.
@@@ -9579,34 -9607,6 +9584,34 @@@ See also
  See also:
  * {{msg-mw|Imgmultigo|Submit button text}}',
  
 +# Language selector for translatable SVGs
 +'img-lang-opt' => '{{optional}}
 +Items in the language drop down on the image page for a translated SVG file. For an example see [[:File:Gerrit patchset 25838 test.svg]].
 +
 +Parameters:
 +* $1 - language code
 +* $2 - language name (Either in the language in question, or the name of that language translated to the current users interface language)
 +See also:
 +* {{msg-mw|Img-lang-info}}',
 +'img-lang-default' => 'An option in the drop down of a translatable file. For example see [[:File:Gerrit patchset 25838 test.svg]].
 +
 +Used when it cannot be determined what the default fallback language is.
 +
 +However it should be noted that most of the time, the content displayed for this option would be in English.
 +{{Identical|Default language}}',
 +'img-lang-info' => 'Label for drop down box. Appears underneath the image on the image description page. See [[:File:Gerrit patchset 25838 test.svg]] for an example.
 +
 +Parameters:
 +* $1 - a drop down box with language options, uses the following messages:
 +** {{msg-mw|Img-lang-default}}
 +** {{msg-mw|Img-lang-opt}}. e.g. "English (en)", "日本語 (ja)"
 +* $2 - a submit button, which uses the text from {{msg-mw|Img-lang-go}}',
 +'img-lang-go' => 'Go button for the language select for translatable files. See [[:File:Gerrit patchset 25838 test.svg]] for an example.
 +
 +See also:
 +* {{msg-mw|img-lang-info}}
 +{{Identical|Go}}',
 +
  # Table pager
  'ascending_abbrev' => 'Abbreviation of ascending order.
  See also:
@@@ -9944,50 -9944,18 +9949,50 @@@ This message is followed by the list o
  'version-parser-function-hooks' => 'Shown in [[Special:Version]]',
  'version-hook-name' => 'Shown in [[Special:Version]]',
  'version-hook-subscribedby' => 'Shown in [[Special:Version]]',
 -'version-version' => 'Used in [[Special:Version]].
 -
 -Preceded by the MediaWiki extension name.
 +'version-version' => '{{Optional}}
 +Used in [[Special:Version]]. Preceded by the MediaWiki extension name.
  
  Parameters:
 -* $1 - version number of the extension
 -{{Identical|Version}}',
 +* $1 - version number of the extension',
  'version-svn-revision' => '{{Identical|Revision}}{{optional}}
  Used in [[Special:Version]], preceeding the Subversion revision numbers of the extensions loaded inside brackets, like this: "({{int:version-revision}} r012345"). Parameters:
  * $1 - (Unused) directory revision number or empty string
  * $2 - checkout revision number',
 -'version-license' => '{{Identical|License}}',
 +'version-license' => 'Used specifically for the MediaWiki software.
 +
 +Used as heading in [[Special:Version]].',
 +'version-ext-license' => "Used in [[Special:Version]].
 +
 +Used as label for the link pointing to the extension's license page. e.g. [[Special:Version/License/Maps]]
 +{{Identical|License}}",
 +'version-ext-colheader-name' => 'Column header for the name of an extension.
 +{{Identical|Extension}}',
 +'version-ext-colheader-version' => 'Column header for describing an extensions version.
 +{{Identical|Version}}',
 +'version-ext-colheader-license' => 'Column header for describing an extensions license.
 +{{Identical|License}}',
 +'version-ext-colheader-description' => 'Column header for the description of an extension.
 +{{Identical|Description}}',
 +'version-ext-colheader-credits' => 'Column header for the list of authors and credits for an extension.
 +{{Identical|Author}}',
 +'version-license-title' => 'Page title for an extended license for a piece of software.
 +
 +Used as page title for the license page. e.g. [[Special:Version/License/Maps]].
 +
 +Parameters:
 +* $1 - the name of software',
 +'version-license-not-found' => 'Descriptive error used when detailed license text for a piece of software is not found.
 +
 +See example: [[Special:Version/License/Foo]]',
 +'version-credits-title' => 'Page title for an about/credits page for a MediaWiki extension.
 +
 +Used as heading in credits page. e.g. [[Special:Version/Credits]] and [[Special:Version/Credits/UniversalLanguageSelector]]
 +
 +Parameters:
 +* $1 - the name of the extension',
 +'version-credits-not-found' => 'Descriptive error used when detailed about/credits for an extension are not available.
 +
 +See example: [[Special:Version/Credits/Foo]]',
  'version-poweredby-credits' => 'Message shown on [[Special:Version]]. Parameters:
  * $1 - the current year
  * $2 - a list of selected MediaWiki authors',
@@@ -10016,7 -9984,7 +10021,7 @@@ A short description of the script path 
  
  # Special:Redirect
  'redirect' => "{{doc-special|Redirect}}
 -This means \"Redirect by file'''name''', user '''ID''', or revision ID\".",
 +This means \"Redirect by file'''name''', user '''ID''', page '''ID''', or revision ID\".",
  'redirect-legend' => 'Legend of fieldset around input box in [[Special:Redirect]]',
  'redirect-summary' => 'Shown at top of [[Special:Redirect]]',
  'redirect-submit' => 'Button label in [[Special:Redirect]].
  
  Followed by the select box which has the following options:
  * {{msg-mw|Redirect-user}}
 +* {{msg-mw|Redirect-page}}
  * {{msg-mw|Redirect-revision}}
  * {{msg-mw|Redirect-file}}',
  'redirect-value' => 'Second field label in [[Special:Redirect]]
  {{Identical|Value}}',
  'redirect-user' => 'Description of lookup type for [[Special:Redirect]].
  {{Identical|User ID}}',
 +'redirect-page' => 'Description of lookup type for [[Special:Redirect]].
 +{{Identical|Page ID}}',
  'redirect-revision' => "Description of lookup type for [[Special:Redirect]].
  
  This means \"Page revision '''ID'''\".",
@@@ -10088,7 -10053,7 +10093,7 @@@ See also
  'specialpages-group-media' => '{{doc-special-group|like=[[Special:FilePath]], [[Special:MIMESearch]] and [[Special:Upload]]}}',
  'specialpages-group-users' => '{{doc-special-group|like=[[Special:ActiveUsers]], [[Special:Contributions]] and [[Special:ListGroupRights]]}}',
  'specialpages-group-highuse' => '{{doc-special-group|like=[[Special:MostCategories]], [[Special:MostLinked]] and [[Special:MostRevisions]]}}',
 -'specialpages-group-pages' => '{{doc-special-group|like=[[Special:AllPages]], [[Special:PrefixIndex]], [[Special:Categories]], 
 +'specialpages-group-pages' => '{{doc-special-group|like=[[Special:AllPages]], [[Special:PrefixIndex]], [[Special:Categories]],
  [[Special:Disambiguations]], etc}}',
  'specialpages-group-pagetools' => '{{doc-special-group|like=[[Special:MovePage]], [[Special:Undelete]], [[Special:WhatLinksHere]], [[Special:Export]] etc}}',
  'specialpages-group-wiki' => '{{doc-special-group|like=[[Special:Version]], [[Special:Statistics]], [[Special:LockDB]], etc}}',
@@@ -10112,7 -10077,7 +10117,7 @@@ See definition of [[w:Regular_expressio
  # Special:Tags
  'tags' => "Shown on [[Special:Specialpages]] for page listing the tags that the software may mark an edit with, and their meaning. For more information on tags see [[mw:Manual:Tags|MediaWiki]].
  
 -It appears that the word 'valid' describes 'tags', not 'change'. It also appears that you could use the term 'defined' instead of 'valid', or perhaps use a phrase meaning 'Change tags in use'.",
 +It appears that the word 'valid' describes 'tags', not 'change'. It also appears that you could use the term 'defined' instead of 'valid', or perhaps use a phrase meaning 'The change tags that are in use'.",
  '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)
  
@@@ -10154,6 -10119,7 +10159,6 @@@ Parameters
  
  # Special:ComparePages
  'comparepages' => 'The title of [[Special:ComparePages]]',
 -'compare-selector' => 'Header of the form on [[Special:ComparePages]]',
  'compare-page1' => 'Label for the field of the 1st page in the comparison for [[Special:ComparePages]]
  {{Identical|Page}}',
  'compare-page2' => 'Label for the field of the 2nd page in the comparison for [[Special:ComparePages]]
@@@ -10477,7 -10443,6 +10482,7 @@@ See also
  'api-error-overwrite' => 'API error message that can be used for client side localisation of API errors.',
  '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-timeout' => 'API error message that can be used for client side localisation of API errors.',
  'api-error-unclassified' => 'API error message that can be used for client side localisation of API errors.',
  'api-error-unknown-code' => 'API error message that can be used for client side localisation of API errors.
@@@ -10595,29 -10560,10 +10600,29 @@@ For more information, see [[mw:Extensio
  'expand_templates_input' => '{{Identical|Input text}}',
  'expand_templates_output' => '{{Identical|Result}}',
  'expand_templates_xml_output' => 'Used as HTML <code><nowiki><h2></nowiki></code> heading.',
 +'expand_templates_html_output' => 'Used as HTML <code><nowiki><h2></nowiki></code> heading.',
  'expand_templates_ok' => '{{Identical|OK}}',
  'expand_templates_remove_comments' => 'Check box to tell [[mw:Extension:ExpandTemplates]] to not show comments in the expanded template.',
 -'expand_templates_remove_nowiki' => 'Option on [[Special:Expandtemplates]]',
 +'expand_templates_remove_nowiki' => "Option on [[Special:Expandtemplates]]
 +
 +Here's what the tick box does:
 +
 +For:
 +<pre>
 +&lt;nowiki>test&lt;/nowiki>
 +</pre>
 +
 +Not ticked:
 +<pre>
 +&lt;nowiki>test&lt;/nowiki>
 +</pre>
 +
 +Ticked:
 +<pre>
 +test
 +</pre>",
  'expand_templates_generate_xml' => 'Used as checkbox label.',
 +'expand_templates_generate_rawhtml' => 'Used as checkbox label.',
  'expand_templates_preview' => '{{Identical|Preview}}',
  
  );
@@@ -48,6 -48,7 +48,6 @@@ $wgMessageStructure = array
                'tog-minordefault',
                'tog-previewontop',
                'tog-previewonfirst',
 -              'tog-nocache',
                'tog-enotifwatchlistpages',
                'tog-enotifusertalkpages',
                'tog-enotifminoredits',
                'qbedit',
                'qbpageoptions',
                'qbmyoptions',
 -              'qbspecialpages',
                'faq',
                'faqpage',
                'sitetitle',
                'perfcached',
                'perfcachedts',
                'querypage-no-updates',
 -              'wrong_wfQuery_params',
                'viewsource',
                'viewsource-title',
                'actionthrottled',
                'invalidemailaddress',
                'cannotchangeemail',
                'emaildisabled',
 +              'emailsender',
                'accountcreated',
                'accountcreatedtext',
                'createaccount-title',
                'user-mail-no-body',
        ),
        'resetpass' => array(
 -              'resetpass',
 +              'changepassword',
 +              'changepassword-summary',
                'resetpass_announce',
                'resetpass_text',
                'resetpass_header',
                'invalid-content-data',
                'content-not-allowed-here',
                'editwarning-warning',
+               'editpage-notsupportedcontentformat-title',
+               'editpage-notsupportedcontentformat-text',
        ),
        'contentmodels' => array(
                'content-model-wikitext',
        'cantcreateaccount' => array(
                'cantcreateaccounttitle',
                'cantcreateaccount-text',
 +              'cantcreateaccount-range-text',
        ),
        'history' => array(
                'viewpagelogs',
                'revisiondelete',
                'revdelete-nooldid-title',
                'revdelete-nooldid-text',
 -              'revdelete-nologtype-title',
 -              'revdelete-nologtype-text',
 -              'revdelete-nologid-title',
 -              'revdelete-nologid-text',
                'revdelete-no-file',
                'revdelete-show-file-confirm',
                'revdelete-show-file-submit',
                'logdelete-success',
                'logdelete-failure',
                'revdel-restore',
 -              'revdel-restore-deleted',
 -              'revdel-restore-visible',
                'pagehist',
                'deletedhist',
                'revdelete-hide-current',
                'search-summary',
                'searchresults',
                'searchresults-title',
 -              'searchresulttext',
 -              'searchsubtitle',
 -              'searchsubtitleinvalid',
                'toomanymatches',
                'titlematches',
 -              'notitlematches',
                'textmatches',
                'notextmatches',
                'prevn',
                'nextn-title',
                'shown-title',
                'viewprevnext',
 -              'searchmenu-legend',
                'searchmenu-exists',
                'searchmenu-new',
                'searchmenu-new-nocreate',
 -              'searchmenu-prefix',
                'searchprofile-articles',
                'searchprofile-project',
                'searchprofile-images',
                'search-interwiki-custom',
                'search-interwiki-more',
                'search-relatedarticle',
 -              'mwsuggest-disable',
                'searcheverything-enable',
                'searchrelated',
                'searchall',
                'showingresults',
                'showingresultsnum',
                'showingresultsheader',
 -              'nonefound',
                'search-nonefound',
 -              'powersearch',
                'powersearch-legend',
                'powersearch-ns',
                'powersearch-redir',
 -              'powersearch-field',
                'powersearch-togglelabel',
                'powersearch-toggleall',
                'powersearch-togglenone',
                'mypreferences',
                'prefs-edits',
                'prefsnologintext2',
 -              'changepassword',
 -              'changepassword-summary',
                'prefs-skin',
                'skin-preview',
                'datedefault',
                'prefs-email',
                'prefs-rendering',
                'saveprefs',
 -              'resetprefs',
                'restoreprefs',
                'prefs-editing',
                'rows',
                'columns',
                'searchresultshead',
 -              'resultsperpage',
                'stub-threshold',
                'stub-threshold-disabled',
                'recentchangesdays',
                'localtime',
                'timezoneuseserverdefault',
                'timezoneuseoffset',
 -              'timezoneoffset',
                'servertime',
                'guesstimezone',
                'timezoneregion-africa',
                'prefs-tokenwatchlist',
                'prefs-diffs',
                'prefs-help-prefershttps',
 +              'prefs-tabs-navigation-hint',
        ),
        'preferences-email' => array(
                'email-address-validity-valid',
                'recentchanges-label-bot',
                'recentchanges-label-unpatrolled',
                'recentchanges-label-plusminus',
 +              'recentchanges-legend-heading',
                'recentchanges-legend-newpage',
                'recentchanges-legend-plusminus',
 -              'rcnote',
                'rcnotefrom',
                'rclistfrom',
                'rcshowhideminor',
                'fileexists-shared-forbidden',
                'file-exists-duplicate',
                'file-deleted-duplicate',
 +              'file-deleted-duplicate-notitle',
                'uploadwarning',
                'uploadwarning-text',
                'savefile',
                'ninterwikis',
                'nlinks',
                'nmembers',
 +              'nmemberschanged',
                'nrevisions',
                'nviews',
                'nimagelinks',
                'protectedpages-indef',
                'protectedpages-summary',
                'protectedpages-cascade',
 -              'protectedpagestext',
 +              'protectedpages-noredirect',
                'protectedpagesempty',
                'protectedtitles',
                'protectedtitles-summary',
 -              'protectedtitlestext',
                'protectedtitlesempty',
                'listusers',
                'listusers-summary',
                'allpagesto',
                'allarticles',
                'allinnamespace',
 -              'allnotinnamespace',
 -              'allpagesprev',
 -              'allpagesnext',
                'allpagessubmit',
                'allpagesprefix',
                'allpagesbadtitle',
                'delete-edit-reasonlist',
                'delete-toobig',
                'delete-warning-toobig',
 +              'deleting-backlinks-warning',
        ),
        'rollback' => array(
                'rollback',
                'undeletebtn',
                'undeletelink',
                'undeleteviewlink',
 -              'undeletereset',
                'undeleteinvert',
                'undeletecomment',
                'undeletedrevisions',
                'undelete-error-long',
                'undelete-show-file-confirm',
                'undelete-show-file-submit',
 -              'undelete-revisionrow',
 +              'undelete-revision-row',
        ),
        'nsform' => array(
                'namespace',
                'unblock',
                'unblock-summary',
                'blockip',
 -              'blockip-title',
                'blockip-legend',
                'blockiptext',
                'ipadressorusername',
                'ipbexpiry',
                'ipbreason',
 -              'ipbreasonotherlist',
                'ipbreason-dropdown',
                'ipb-hardblock',
                'ipbcreateaccount',
                'ipbsubmit',
                'ipbother',
                'ipboptions',
 -              'ipbotheroption',
 -              'ipbotherreason',
                'ipbhidename',
                'ipbwatchuser',
                'ipb-disableusertalk',
                'blockipsuccesstext',
                'ipb-blockingself',
                'ipb-confirmhideuser',
 +              'ipb-confirmaction',
                'ipb-edit-dropdown',
                'ipb-unblock-addr',
                'ipb-unblock',
                'sorbsreason',
                'sorbs_create_account_reason',
                'xffblockreason',
 -              'cant-block-while-blocked',
                'cant-see-hidden-user',
                'ipbblocked',
                'ipbnounblockself',
                'movepagetalktext',
                'movearticle',
                'moveuserpage-warning',
 -              'movenologin',
                'movenologintext',
                'movenotallowed',
                'movenotallowedfile',
                'movepage-moved-noredirect',
                'articleexists',
                'cantmove-titleprotected',
 -              'talkexists',
 -              'movedto',
                'movetalk',
                'move-subpages',
                'move-talk-subpages',
                'print.css',
                'noscript.css',
                'group-autoconfirmed.css',
 +              'group-user.css',
                'group-bot.css',
                'group-sysop.css',
                'group-bureaucrat.css',
                'modern.js',
                'vector.js',
                'group-autoconfirmed.js',
 +              'group-user.js',
                'group-bot.js',
                'group-sysop.js',
                'group-bureaucrat.js',
                'exif-urgency-high',
                'exif-urgency-other',
        ),
 -      'edit-externally' => array(
 -              'edit-externally',
 -              'edit-externally-help',
 -      ),
        'all' => array(
                'watchlistall2',
                'namespacesall',
                'monthsall',
 -              'limitall',
        ),
        'confirmemail' => array(
                'confirmemail',
                'confirmemail_needlogin',
                'confirmemail_success',
                'confirmemail_loggedin',
 -              'confirmemail_error',
                'confirmemail_subject',
                'confirmemail_body',
                'confirmemail_body_changed',
                'imgmultigo',
                'imgmultigoto',
        ),
 +      'img-lang' => array(
 +              'img-lang-opt',
 +              'img-lang-default',
 +              'img-lang-info',
 +              'img-lang-go',
 +      ),
        'tablepager' => array(
                'ascending_abbrev',
                'descending_abbrev',
                'version-version',
                'version-svn-revision',
                'version-license',
 +              'version-ext-license',
 +              'version-ext-colheader-name',
 +              'version-ext-colheader-version',
 +              'version-ext-colheader-license',
 +              'version-ext-colheader-description',
 +              'version-ext-colheader-credits',
 +              'version-license-title',
 +              'version-license-not-found',
 +              'version-credits-title',
 +              'version-credits-not-found',
                'version-poweredby-credits',
                'version-poweredby-others',
                'version-poweredby-translators',
                'redirect-lookup',
                'redirect-value',
                'redirect-user',
 +              'redirect-page',
                'redirect-revision',
                'redirect-file',
                'redirect-not-exists',
        'comparepages' => array(
                'comparepages',
                'comparepages-summary',
 -              'compare-selector',
                'compare-page1',
                'compare-page2',
                'compare-rev1',
                'api-error-overwrite',
                'api-error-stashfailed',
                'api-error-publishfailed',
 +              'api-error-stasherror',
                'api-error-timeout',
                'api-error-unclassified',
                'api-error-unknown-code',
                'expand_templates_input',
                'expand_templates_output',
                'expand_templates_xml_output',
 +              'expand_templates_html_output',
                'expand_templates_ok',
                'expand_templates_remove_comments',
                'expand_templates_remove_nowiki',
                'expand_templates_generate_xml',
 +              'expand_templates_generate_rawhtml',
                'expand_templates_preview',
        ),
  );
@@@ -4177,6 -4193,7 +4179,6 @@@ Variants for Chinese language"
        'exif-maxaperturevalue' => '',
        'exif-iimcategory' => '',
        'exif-urgency' => '',
 -      'edit-externally' => 'External editor support',
        'all' => "'all' in various places, this might be different for inflected languages",
        'confirmemail' => 'Email address confirmation',
        'scarytransclusion' => 'Scary transclusion',
        'watch-unwatch' => 'action=watch/unwatch',
        'separators' => 'Separators for various lists, etc.',
        'imgmulti' => 'Multipage image navigation',
 +      'img-lang' => 'Language selector for translatable SVGs',
        'tablepager' => 'Table pager',
        'autosumm' => 'Auto-summaries',
        'autoblock_whitelist' => 'Autoblock whitelist',