Merge "ForeignAPIRepo: Fetch thumb error from foreign repo"
authorTheDJ <hartman.wiki@gmail.com>
Sun, 19 May 2013 13:20:17 +0000 (13:20 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sun, 19 May 2013 13:20:17 +0000 (13:20 +0000)
1  2 
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/file/ForeignAPIFile.php
languages/messages/MessagesEn.php
languages/messages/MessagesQqq.php
maintenance/language/messages.inc

@@@ -61,21 -61,21 +61,21 @@@ class ForeignAPIRepo extends FileRepo 
                // http://commons.wikimedia.org/w/api.php
                $this->mApiBase = isset( $info['apibase'] ) ? $info['apibase'] : null;
  
 -              if( isset( $info['apiThumbCacheExpiry'] ) ) {
 +              if ( isset( $info['apiThumbCacheExpiry'] ) ) {
                        $this->apiThumbCacheExpiry = $info['apiThumbCacheExpiry'];
                }
 -              if( isset( $info['fileCacheExpiry'] ) ) {
 +              if ( isset( $info['fileCacheExpiry'] ) ) {
                        $this->fileCacheExpiry = $info['fileCacheExpiry'];
                }
 -              if( !$this->scriptDirUrl ) {
 +              if ( !$this->scriptDirUrl ) {
                        // hack for description fetches
                        $this->scriptDirUrl = dirname( $this->mApiBase );
                }
                // If we can cache thumbs we can guess sane defaults for these
 -              if( $this->canCacheThumbs() && !$this->url ) {
 +              if ( $this->canCacheThumbs() && !$this->url ) {
                        $this->url = $wgLocalFileRepo['url'];
                }
 -              if( $this->canCacheThumbs() && !$this->thumbUrl ) {
 +              if ( $this->canCacheThumbs() && !$this->thumbUrl ) {
                        $this->thumbUrl = $this->url . '/thumb';
                }
        }
                        if ( isset( $this->mFileExists[$k] ) ) {
                                $results[$k] = true;
                                unset( $files[$k] );
 -                      } elseif( self::isVirtualUrl( $f ) ) {
 +                      } elseif ( self::isVirtualUrl( $f ) ) {
                                # @todo FIXME: We need to be able to handle virtual
                                # URLs better, at least when we know they refer to the
                                # same repo.
  
                $data = $this->fetchImageQuery( array( 'titles' => implode( $files, '|' ),
                                                                                        'prop' => 'imageinfo' ) );
 -              if( isset( $data['query']['pages'] ) ) {
 +              if ( isset( $data['query']['pages'] ) ) {
                        $i = 0;
 -                      foreach( $files as $key => $file ) {
 +                      foreach ( $files as $key => $file ) {
                                $results[$key] = $this->mFileExists[$key] = !isset( $data['query']['pages'][$i]['missing'] );
                                $i++;
                        }
         * @return string
         */
        function fetchImageQuery( $query ) {
-               global $wgMemc;
+               global $wgMemc, $wgLanguageCode;
  
                $query = array_merge( $query,
                        array(
 -                              'format'    => 'json',
 -                              'action'    => 'query',
 +                              'format' => 'json',
 +                              'action' => 'query',
                                'redirects' => 'true'
                        ) );
+               if ( !isset( $query['uselang'] ) ) { // uselang is unset or null
+                       $query['uselang'] = $wgLanguageCode;
+               }
                if ( $this->mApiBase ) {
                        $url = wfAppendQuery( $this->mApiBase, $query );
                } else {
                        $url = $this->makeUrl( $query, 'api' );
                }
  
 -              if( !isset( $this->mQueryCache[$url] ) ) {
 +              if ( !isset( $this->mQueryCache[$url] ) ) {
                        $key = $this->getLocalCacheKey( 'ForeignAPIRepo', 'Metadata', md5( $url ) );
                        $data = $wgMemc->get( $key );
 -                      if( !$data ) {
 +                      if ( !$data ) {
                                $data = self::httpGet( $url );
                                if ( !$data ) {
                                        return null;
                                $wgMemc->set( $key, $data, 3600 );
                        }
  
 -                      if( count( $this->mQueryCache ) > 100 ) {
 +                      if ( count( $this->mQueryCache ) > 100 ) {
                                // Keep the cache from growing infinitely
                                $this->mQueryCache = array();
                        }
         * @return bool|array
         */
        function getImageInfo( $data ) {
 -              if( $data && isset( $data['query']['pages'] ) ) {
 -                      foreach( $data['query']['pages'] as $info ) {
 -                              if( isset( $info['imageinfo'][0] ) ) {
 +              if ( $data && isset( $data['query']['pages'] ) ) {
 +                      foreach ( $data['query']['pages'] as $info ) {
 +                              if ( isset( $info['imageinfo'][0] ) ) {
                                        return $info['imageinfo'][0];
                                }
                        }
         */
        function findBySha1( $hash ) {
                $results = $this->fetchImageQuery( array(
 -                                                                              'aisha1base36' => $hash,
 -                                                                              'aiprop'       => ForeignAPIFile::getProps(),
 -                                                                              'list'         => 'allimages', ) );
 +                      'aisha1base36' => $hash,
 +                      'aiprop' => ForeignAPIFile::getProps(),
 +                      'list' => 'allimages',
 +              ) );
                $ret = array();
                if ( isset( $results['query']['allimages'] ) ) {
                        foreach ( $results['query']['allimages'] as $img ) {
                                // 1.14 was broken, doesn't return name attribute
 -                              if( !isset( $img['name'] ) ) {
 +                              if ( !isset( $img['name'] ) ) {
                                        continue;
                                }
                                $ret[] = new ForeignAPIFile( Title::makeTitle( NS_FILE, $img['name'] ), $this, $img );
                        'iiprop' => 'url|timestamp',
                        'iiurlwidth' => $width,
                        'iiurlheight' => $height,
 -                      'iiurlparam'  => $otherParams,
 +                      'iiurlparam' => $otherParams,
                        'prop' => 'imageinfo' ) );
                $info = $this->getImageInfo( $data );
  
 -              if( $data && $info && isset( $info['thumburl'] ) ) {
 +              if ( $data && $info && isset( $info['thumburl'] ) ) {
                        wfDebug( __METHOD__ . " got remote thumb " . $info['thumburl'] . "\n" );
                        $result = $info;
                        return $info['thumburl'];
                }
        }
  
+       /**
+        * @param $name string
+        * @param $width int
+        * @param $height int
+        * @param $otherParams string
+        * @return bool|MediaTransformError
+        * @since 1.22
+        */
+       function getThumbError( $name, $width = -1, $height = -1, $otherParams = '', $lang = null ) {
+               $data = $this->fetchImageQuery( array(
+                       'titles' => 'File:' . $name,
+                       'iiprop' => 'url|timestamp',
+                       'iiurlwidth' => $width,
+                       'iiurlheight' => $height,
+                       'iiurlparam' => $otherParams,
+                       'prop' => 'imageinfo',
+                       'uselang' => $lang,
+               ) );
+               $info = $this->getImageInfo( $data );
+               if( $data && $info && isset( $info['thumberror'] ) ) {
+                       wfDebug( __METHOD__ . " got remote thumb error " . $info['thumberror'] . "\n" );
+                       return new MediaTransformError(
+                               'thumbnail_error_remote',
+                               $width,
+                               $height,
+                               $this->getDisplayName(),
+                               $info['thumberror'] // already parsed message from foreign repo
+                       );
+               } else {
+                       return false;
+               }
+       }
        /**
         * Return the imageurl from cache if possible
         *
  
                /* Get the array of urls that we already know */
                $knownThumbUrls = $wgMemc->get( $key );
 -              if( !$knownThumbUrls ) {
 +              if ( !$knownThumbUrls ) {
                        /* No knownThumbUrls for this file */
                        $knownThumbUrls = array();
                } else {
 -                      if( isset( $knownThumbUrls[$sizekey] ) ) {
 +                      if ( isset( $knownThumbUrls[$sizekey] ) ) {
                                wfDebug( __METHOD__ . ': Got thumburl from local cache: ' .
                                        "{$knownThumbUrls[$sizekey]} \n" );
                                return $knownThumbUrls[$sizekey];
                $metadata = null;
                $foreignUrl = $this->getThumbUrl( $name, $width, $height, $metadata, $params );
  
 -              if( !$foreignUrl ) {
 +              if ( !$foreignUrl ) {
                        wfDebug( __METHOD__ . " Could not find thumburl\n" );
                        return false;
                }
  
                // We need the same filename as the remote one :)
                $fileName = rawurldecode( pathinfo( $foreignUrl, PATHINFO_BASENAME ) );
 -              if( !$this->validateFilename( $fileName ) ) {
 +              if ( !$this->validateFilename( $fileName ) ) {
                        wfDebug( __METHOD__ . " The deduced filename $fileName is not safe\n" );
                        return false;
                }
                $localFilename = $localPath . "/" . $fileName;
                $localUrl = $this->getZoneUrl( 'thumb' ) . "/" . $this->getHashPath( $name ) . rawurlencode( $name ) . "/" . rawurlencode( $fileName );
  
 -              if( $backend->fileExists( array( 'src' => $localFilename ) )
 -                      && isset( $metadata['timestamp'] ) )
 -              {
 +              if ( $backend->fileExists( array( 'src' => $localFilename ) )
 +                      && isset( $metadata['timestamp'] ) ) {
                        wfDebug( __METHOD__ . " Thumbnail was already downloaded before\n" );
                        $modified = $backend->getFileTimestamp( array( 'src' => $localFilename ) );
                        $remoteModified = strtotime( $metadata['timestamp'] );
                        $current = time();
                        $diff = abs( $modified - $current );
 -                      if( $remoteModified < $modified && $diff < $this->fileCacheExpiry ) {
 +                      if ( $remoteModified < $modified && $diff < $this->fileCacheExpiry ) {
                                /* Use our current and already downloaded thumbnail */
                                $knownThumbUrls[$sizekey] = $localUrl;
                                $wgMemc->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
                        /* There is a new Commons file, or existing thumbnail older than a month */
                }
                $thumb = self::httpGet( $foreignUrl );
 -              if( !$thumb ) {
 +              if ( !$thumb ) {
                        wfDebug( __METHOD__ . " Could not download thumb\n" );
                        return false;
                }
                # @todo FIXME: Delete old thumbs that aren't being used. Maintenance script?
                $backend->prepare( array( 'dir' => dirname( $localFilename ) ) );
                $params = array( 'dst' => $localFilename, 'content' => $thumb );
 -              if( !$backend->quickCreate( $params )->isOK() ) {
 +              if ( !$backend->quickCreate( $params )->isOK() ) {
                        wfDebug( __METHOD__ . " could not write to thumb path '$localFilename'\n" );
                        return $foreignUrl;
                }
@@@ -54,22 -54,22 +54,22 @@@ class ForeignAPIFile extends File 
         */
        static function newFromTitle( Title $title, $repo ) {
                $data = $repo->fetchImageQuery( array(
 -                      'titles'            => 'File:' . $title->getDBkey(),
 -                      'iiprop'            => self::getProps(),
 -                      'prop'              => 'imageinfo',
 +                      'titles' => 'File:' . $title->getDBkey(),
 +                      'iiprop' => self::getProps(),
 +                      'prop' => 'imageinfo',
                        'iimetadataversion' => MediaHandler::getMetadataVersion()
                ) );
  
                $info = $repo->getImageInfo( $data );
  
 -              if( $info ) {
 +              if ( $info ) {
                        $lastRedirect = isset( $data['query']['redirects'] )
                                ? count( $data['query']['redirects'] ) - 1
                                : -1;
 -                      if( $lastRedirect >= 0 ) {
 +                      if ( $lastRedirect >= 0 ) {
                                $newtitle = Title::newFromText( $data['query']['redirects'][$lastRedirect]['to'] );
                                $img = new self( $newtitle, $repo, $info, true );
 -                              if( $img ) {
 +                              if ( $img ) {
                                        $img->redirectedFrom( $title->getDBkey() );
                                }
                        } else {
         * @return bool|MediaTransformOutput
         */
        function transform( $params, $flags = 0 ) {
 -              if( !$this->canRender() ) {
 +              if ( !$this->canRender() ) {
                        // show icon
                        return parent::transform( $params, $flags );
                }
                // Note, the this->canRender() check above implies
                // that we have a handler, and it can do makeParamString.
                $otherParams = $this->handler->makeParamString( $params );
+               $width = isset( $params['width'] ) ? $params['width'] : -1;
+               $height = isset( $params['height'] ) ? $params['height'] : -1;
  
                $thumbUrl = $this->repo->getThumbUrlFromCache(
                        $this->getName(),
-                       isset( $params['width'] ) ? $params['width'] : -1,
-                       isset( $params['height'] ) ? $params['height'] : -1,
-                       $otherParams );
+                       $width,
+                       $height,
+                       $otherParams
+               );
+               if ( $thumbUrl === false ) {
+                       global $wgLang;
+                       return $this->repo->getThumbError(
+                               $this->getName(),
+                               $width,
+                               $height,
+                               $otherParams,
+                               $wgLang->getCode()
+                       );
+               }
                return $this->handler->getTransform( $this, 'bogus', $thumbUrl, $params );
        }
  
         * @return array
         */
        public static function parseMetadata( $metadata ) {
 -              if( !is_array( $metadata ) ) {
 +              if ( !is_array( $metadata ) ) {
                        return $metadata;
                }
                $ret = array();
 -              foreach( $metadata as $meta ) {
 +              foreach ( $metadata as $meta ) {
                        $ret[$meta['name']] = self::parseMetadata( $meta['value'] );
                }
                return $ret;
         * @return string
         */
        function getMimeType() {
 -              if( !isset( $this->mInfo['mime'] ) ) {
 +              if ( !isset( $this->mInfo['mime'] ) ) {
                        $magic = MimeMagic::singleton();
                        $this->mInfo['mime'] = $magic->guessTypesForExtension( $this->getExtension() );
                }
@@@ -162,22 -162,18 +162,22 @@@ $dateFormats = array
        'mdy time' => 'H:i',
        'mdy date' => 'F j, Y',
        'mdy both' => 'H:i, F j, Y',
 +      'mdy pretty' => 'F j',
  
        'dmy time' => 'H:i',
        'dmy date' => 'j F Y',
        'dmy both' => 'H:i, j F Y',
 +      'dmy pretty' => 'j F',
  
        'ymd time' => 'H:i',
        'ymd date' => 'Y F j',
        'ymd both' => 'H:i, Y F j',
 +      'ymd pretty' => 'F j',
  
        'ISO 8601 time' => 'xnH:xni:xns',
        'ISO 8601 date' => 'xnY-xnm-xnd',
        'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
 +      'ISO 8601 pretty' => 'xnm-xnd'
  );
  
  /**
@@@ -253,8 -249,6 +253,8 @@@ $magicWords = array
        'fullpagenamee'           => array( 1,    'FULLPAGENAMEE' ),
        'subpagename'             => array( 1,    'SUBPAGENAME' ),
        'subpagenamee'            => array( 1,    'SUBPAGENAMEE' ),
 +      'rootpagename'            => array( 1,    'ROOTPAGENAME' ),
 +      'rootpagenamee'           => array( 1,    'ROOTPAGENAMEE' ),
        'basepagename'            => array( 1,    'BASEPAGENAME' ),
        'basepagenamee'           => array( 1,    'BASEPAGENAMEE' ),
        'talkpagename'            => array( 1,    'TALKPAGENAME' ),
   * hook.
   */
  $specialPageAliases = array(
 +      'Activeusers'               => array( 'ActiveUsers' ),
        'Allmessages'               => array( 'AllMessages' ),
        'Allpages'                  => array( 'AllPages' ),
        'Ancientpages'              => array( 'AncientPages' ),
        'Randomredirect'            => array( 'RandomRedirect' ),
        'Recentchanges'             => array( 'RecentChanges' ),
        'Recentchangeslinked'       => array( 'RecentChangesLinked', 'RelatedChanges' ),
 +      'Redirect'                  => array( 'Redirect' ),
        'Revisiondelete'            => array( 'RevisionDelete' ),
        'Search'                    => array( 'Search' ),
        'Shortpages'                => array( 'ShortPages' ),
@@@ -629,8 -621,8 +629,8 @@@ The sidebar for MonoBook is generated f
  begin with * or ** are discarded, furthermore lines that do begin with ** and
  do not contain | are also discarded, but do not depend on this behavior for
  future releases. Also note that since each list value is wrapped in a unique
 -XHTML id it should only appear once and include characters that are legal
 -XHTML id names.
 +(X)HTML id it should only appear once and include characters that are legal
 +(X)HTML id names.
  */
  'sidebar' => '
  * navigation
  'tog-shownumberswatching'     => 'Show the number of watching users',
  'tog-oldsig'                  => 'Existing signature:',
  'tog-fancysig'                => 'Treat signature as wikitext (without an automatic link)',
 -'tog-externaleditor'          => 'Use external editor by default (for experts only, needs special settings on your computer. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 -'tog-externaldiff'            => 'Use external diff by default (for experts only, needs special settings on your computer. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
  'tog-showjumplinks'           => 'Enable "jump to" accessibility links',
  'tog-uselivepreview'          => 'Use live preview (requires JavaScript) (experimental)',
  'tog-forceeditsummary'        => 'Prompt me when entering a blank edit summary',
  'tog-showhiddencats'          => 'Show hidden categories',
  'tog-noconvertlink'           => 'Disable link title conversion', # only translate this message to other languages if you have to change it
  'tog-norollbackdiff'          => 'Omit diff after performing a rollback',
 +'tog-useeditwarning'          => 'Warn me when I leave an edit page with unsaved changes',
  
  'underline-always'  => 'Always',
  'underline-never'   => 'Never',
@@@ -1081,19 -1074,9 +1081,19 @@@ Note that some pages may continue to b
  'welcomecreation-msg'             => 'Your account has been created.
  Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
  'yourname'                        => 'Username:',
 +'userlogin-yourname'              => 'Username',
 +'userlogin-yourname-ph'           => 'Enter your username',
 +'createacct-helpusername'      => '', # do not translate or duplicate this message to other languages
  'yourpassword'                    => 'Password:',
 +'userlogin-yourpassword'          => 'Password',
 +'userlogin-yourpassword-ph'       => 'Enter your password',
 +'createacct-yourpassword-ph'      => 'Enter a password',
  'yourpasswordagain'               => 'Retype password:',
 +'createacct-yourpasswordagain'    => 'Confirm password',
 +'createacct-yourpasswordagain-ph' => 'Enter password again',
  'remembermypassword'              => 'Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})',
 +'userlogin-remembermypassword'    => 'Keep me logged in',
 +'userlogin-signwithsecure'        => 'Use secure connection',
  'securelogin-stick-https'         => 'Stay connected to HTTPS after login',
  'yourdomainname'                  => 'Your domain:',
  'password-change-forbidden'       => 'You cannot change passwords on this wiki.',
  'userlogout'                      => 'Log out',
  'userlogout-summary'              => '', # do not translate or duplicate this message to other languages
  'notloggedin'                     => 'Not logged in',
 +'userlogin-noaccount'             => "Don't have an account?",
 +'userlogin-joinproject'           => 'Join {{SITENAME}}',
  'nologin'                         => "Don't have an account? $1.",
  'nologinlink'                     => 'Create an account',
  'createaccount'                   => 'Create account',
  'gotaccount'                      => 'Already have an account? $1.',
  'gotaccountlink'                  => 'Log in',
  'userlogin-resetlink'             => 'Forgotten your login details?',
 +'userlogin-resetpassword-link'    => 'Reset your password',
 +'helplogin-url'                   => 'Help:Logging in',
 +'userlogin-helplink'              => '[[{{MediaWiki:helplogin-url}}|Help with logging in]]',
 +'createacct-join'                 => 'Enter your information below.',
 +'createacct-emailrequired'        => 'Email address',
 +'createacct-emailoptional'        => 'Email address (optional)',
 +'createacct-email-ph'             => 'Enter your email address',
  'createaccountmail'               => 'Use a temporary random password and send it to the email address specified below',
 +'createacct-realname'             => 'Real name (optional)',
  'createaccountreason'             => 'Reason:',
 +'createacct-reason'               => 'Reason',
 +'createacct-reason-ph'            => 'Why you are creating another account',
 +'createacct-captcha'              => 'Security check',
 +'createacct-imgcaptcha-help'      => '', # do not translate or duplicate this message to other languages
 +'createacct-imgcaptcha-ph'        => 'Enter the text you see above',
 +'createacct-submit'               => 'Create your account',
 +'createacct-benefit-heading'      => '{{SITENAME}} is made by people like you.',
 +'createacct-benefit-icon1'        => 'icon-edits', # do not translate or duplicate this message to other languages
 +'createacct-benefit-head1'        => '{{NUMBEROFEDITS}}', # do not translate or duplicate this message to other languages
 +'createacct-benefit-body1'        => '{{PLURAL:$1|edit|edits}}',
 +'createacct-benefit-icon2'        => 'icon-pages', # do not translate or duplicate this message to other languages
 +'createacct-benefit-head2'        => '{{NUMBEROFARTICLES}}', # do not translate or duplicate this message to other languages
 +'createacct-benefit-body2'        => '{{PLURAL:$1|page|pages}}',
 +'createacct-benefit-icon3'        => 'icon-contributors', # do not translate or duplicate this message to other languages
 +'createacct-benefit-head3'        => '{{NUMBEROFACTIVEUSERS}}', # do not translate or duplicate this message to other languages
 +'createacct-benefit-body3'        => 'recent {{PLURAL:$1|contributor|contributors}}',
  'badretype'                       => 'The passwords you entered do not match.',
  'userexists'                      => 'Username entered already in use.
  Please choose a different name.',
  'loginerror'                      => 'Login error',
 +'createacct-error'                => 'Account creation error',
  'createaccounterror'              => 'Could not create account: $1',
  'nocookiesnew'                    => 'The user account was created, but you are not logged in.
  {{SITENAME}} uses cookies to log in users.
@@@ -1259,14 -1215,12 +1259,14 @@@ Now logging you in...'
  'resetpass-wrong-oldpass'   => 'Invalid temporary or current password.
  You may have already successfully changed your password or requested a new temporary password.',
  'resetpass-temp-password'   => 'Temporary password:',
 +'resetpass-abort-generic'   => 'Password change has been aborted by an extension.',
  
  # Special:PasswordReset
  'passwordreset'                    => 'Reset password',
  'passwordreset-text'               => 'Complete this form to reset your password.',
  'passwordreset-legend'             => 'Reset password',
  'passwordreset-disabled'           => 'Password resets have been disabled on this wiki.',
 +'passwordreset-emaildisabled'      => 'Email features have been disabled on this wiki.',
  'passwordreset-pretext'            => '{{PLURAL:$1||Enter one of the pieces of data below}}',
  'passwordreset-username'           => 'Username:',
  'passwordreset-domain'             => 'Domain:',
@@@ -1299,7 -1253,7 +1299,7 @@@ password.'
  Temporary password: $2',
  'passwordreset-emailsent'          => 'A password reset email has been sent.',
  'passwordreset-emailsent-capture'  => 'A password reset email has been sent, which is shown below.',
 -'passwordreset-emailerror-capture' => 'A password reset email was generated, which is shown below, but sending it to the user failed: $1',
 +'passwordreset-emailerror-capture' => 'A password reset email was generated, which is shown below, but sending it to the {{GENDER:$2|user}} failed: $1',
  
  # Special:ChangeEmail
  'changeemail'          => 'Change email address',
@@@ -1538,8 -1492,6 +1538,8 @@@ It already exists.'
  'content-failed-to-parse'          => 'Failed to parse $2 content for $1 model: $3',
  'invalid-content-data'             => 'Invalid content data',
  'content-not-allowed-here'         => '"$1" content is not allowed on page [[$2]]',
 +'editwarning-warning'              => 'Leaving this page may cause you to lose any changes you have made.
 +If you are logged in, you can disable this warning in the "Editing" section of your preferences.',
  
  # Content models
  'content-model-wikitext'   => 'wikitext',
@@@ -1849,11 -1801,19 +1849,11 @@@ Note that their indexes of {{SITENAME}
        <input type="radio" name="sitesearch" id="gWWW" value="" /><label for="gWWW">WWW</label>
    </div>
  </form>', # do not translate or duplicate this message to other languages
 +'search-error'                     => 'An error has occurred while searching: $1',
  
  # OpenSearch description
  'opensearch-desc' => '{{SITENAME}} ({{CONTENTLANGUAGE}})', # do not translate or duplicate this message to other languages
  
 -# Quickbar
 -'qbsettings'                => 'Quickbar',
 -'qbsettings-none'           => 'None',
 -'qbsettings-fixedleft'      => 'Fixed left',
 -'qbsettings-fixedright'     => 'Fixed right',
 -'qbsettings-floatingleft'   => 'Floating left',
 -'qbsettings-floatingright'  => 'Floating right',
 -'qbsettings-directionality' => 'Fixed, depending on the script directionality of your language',
 -
  # Preferences page
  'preferences'                   => 'Preferences',
  'preferences-summary'           => '', # do not translate or duplicate this message to other languages
@@@ -2006,7 -1966,6 +2006,7 @@@ Your email address is not revealed whe
  'userrights-changeable-col'      => 'Groups you can change',
  'userrights-unchangeable-col'    => 'Groups you cannot change',
  'userrights-irreversible-marker' => '$1*', # only translate this message to other languages if you have to change it
 +'userrights-conflict'            => 'User rights conflict! Please apply your changes again.',
  
  # Groups
  'group'               => 'Group:',
@@@ -2432,13 -2391,14 +2432,13 @@@ For optimal security, img_auth.php is d
  'img-auth-bad-query-string' => 'The URL has an invalid query string.',
  
  # HTTP errors
 -'http-invalid-url'      => 'Invalid URL: $1',
 -'http-invalid-scheme'   => 'URLs with the "$1" scheme are not supported.',
 -'http-request-error'    => 'HTTP request failed due to unknown error.',
 -'http-read-error'       => 'HTTP read error.',
 -'http-timed-out'        => 'HTTP request timed out.',
 -'http-curl-error'       => 'Error fetching URL: $1',
 -'http-host-unreachable' => 'Could not reach URL.',
 -'http-bad-status'       => 'There was a problem during the HTTP request: $1 $2',
 +'http-invalid-url'    => 'Invalid URL: $1',
 +'http-invalid-scheme' => 'URLs with the "$1" scheme are not supported.',
 +'http-request-error'  => 'HTTP request failed due to unknown error.',
 +'http-read-error'     => 'HTTP read error.',
 +'http-timed-out'      => 'HTTP request timed out.',
 +'http-curl-error'     => 'Error fetching URL: $1',
 +'http-bad-status'     => 'There was a problem during the HTTP request: $1 $2',
  
  # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
  'upload-curl-error6'       => 'Could not reach URL',
@@@ -2819,16 -2779,6 +2819,16 @@@ Supported {{PLURAL:$2|protocol|protocol
  'listusers-noresult' => 'No user found.',
  'listusers-blocked'  => '(blocked)',
  
 +# Special:ActiveUsers
 +'activeusers'            => 'Active users list',
 +'activeusers-summary'    => '', # do not translate or duplicate this message to other languages
 +'activeusers-intro'      => 'This is a list of users who had some kind of activity within the last $1 {{PLURAL:$1|day|days}}.',
 +'activeusers-count'      => '$1 {{PLURAL:$1|action|actions}} in the last {{PLURAL:$3|day|$3 days}}',
 +'activeusers-from'       => 'Display users starting at:',
 +'activeusers-hidebots'   => 'Hide bots',
 +'activeusers-hidesysops' => 'Hide administrators',
 +'activeusers-noresult'   => 'No users found.',
 +
  # Special:ListGroupRights
  'listgrouprights'                      => 'User group rights',
  'listgrouprights-summary'              => 'The following is a list of user groups defined on this wiki, with their associated access rights.
@@@ -3516,6 -3466,8 +3516,8 @@@ Please visit [//www.mediawiki.org/wiki/
  'thumbnail-more'           => 'Enlarge',
  'filemissing'              => 'File missing',
  'thumbnail_error'          => 'Error creating thumbnail: $1',
+ 'thumbnail_error_remote'   => 'Error message from $1:
+ $2',
  'djvu_page_error'          => 'DjVu page out of range',
  'djvu_no_xml'              => 'Unable to fetch XML for DjVu file',
  'thumbnail-temp-create'    => 'Unable to create temporary thumbnail file',
@@@ -3927,26 -3879,11 +3929,26 @@@ By executing it, your system may be com
  'minutes'        => '{{PLURAL:$1|$1 minute|$1 minutes}}',
  'hours'          => '{{PLURAL:$1|$1 hour|$1 hours}}',
  'days'           => '{{PLURAL:$1|$1 day|$1 days}}',
 +'weeks'          => '{{PLURAL:$1|$1 week|$1 weeks}}',
  'months'         => '{{PLURAL:$1|$1 month|$1 months}}',
  'years'          => '{{PLURAL:$1|$1 year|$1 years}}',
  'ago'            => '$1 ago',
  'just-now'       => 'just now',
  
 +# Human-readable timestamps
 +'hours-ago'    => '$1 {{PLURAL:$1|hour|hours}} ago',
 +'minutes-ago'  => '$1 {{PLURAL:$1|minute|minutes}} ago',
 +'seconds-ago'  => '$1 {{PLURAL:$1|seconds|seconds}} ago',
 +'monday-at'    => 'Monday at $1',
 +'tuesday-at'   => 'Tuesday at $1',
 +'wednesday-at' => 'Wednesday at $1',
 +'thursday-at'  => 'Thursday at $1',
 +'friday-at'    => 'Friday at $1',
 +'saturday-at'  => 'Saturday at $1',
 +'sunday-at'    => 'Sunday at $1',
 +'today-at'     => '$1', # do not translate or duplicate this message to other languages
 +'yesterday-at' => 'Yesterday at $1',
 +
  # Bad image list
  'bad_image_list' => 'The format is as follows:
  
@@@ -3956,6 -3893,8 +3958,6 @@@ Any subsequent links on the same line a
  
  /*
  Short names for language variants used for language conversion links.
 -To disable showing a particular link, set it to 'disable', e.g.
 -'variantname-zh-sg' => 'disable',
  Variants for Chinese language
  */
  'variantname-zh-hans' => 'hans', # only translate this message to other languages if you have to change it
@@@ -4031,7 -3970,7 +4033,7 @@@ Others will be hidden by default
  'metadata-langitem'         => "'''$2:''' $1", # only translate this message to other languages if you have to change it
  'metadata-langitem-default' => '$1', # only translate this message to other languages if you have to change it
  
 -# EXIF tags
 +# Exif tags
  'exif-imagewidth'                  => 'Width',
  'exif-imagelength'                 => 'Height',
  'exif-bitspersample'               => 'Bits per component',
@@@ -4228,7 -4167,7 +4230,7 @@@ $4, $5, $6 $
  $8', # only translate this message to other languages if you have to change it
  'exif-subjectnewscode-value'  => '$2 ($1)', # only translate this message to other languages if you have to change it
  
 -# EXIF attributes
 +# Exif attributes
  'exif-compression-1'     => 'Uncompressed',
  'exif-compression-2'     => 'CCITT Group 3 1-Dimensional Modified Huffman run length encoding',
  'exif-compression-3'     => 'CCITT Group 3 fax encoding',
@@@ -4802,18 -4741,12 +4804,18 @@@ You should have received [{{SERVER}}{{S
  'version-entrypoints-api-php'           => '[https://www.mediawiki.org/wiki/Manual:api.php api.php]', # do not translate or duplicate this message to other languages
  '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:FilePath
 -'filepath'         => 'File path',
 -'filepath-page'    => 'File:',
 -'filepath-submit'  => 'Go',
 -'filepath-summary' => 'This special page returns the complete path for a file.
 -Images are shown in full resolution, other file types are started with their associated program directly.',
 +# Special:Redirect
 +'redirect'            => 'Redirect by file, user, 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).',
 +'redirect-submit'     => 'Go',
 +'redirect-lookup'     => 'Lookup:',
 +'redirect-value'      => 'Value:',
 +'redirect-user'       => 'User ID',
 +'redirect-revision'   => 'Page revision',
 +'redirect-file'       => 'File name',
 +'redirect-not-exists' => 'Value not found',
  
  # Special:FileDuplicateSearch
  'fileduplicatesearch'           => 'Search for duplicate files',
@@@ -4907,9 -4840,6 +4909,9 @@@ This site is experiencing technical dif
  'htmlform-submit'              => 'Submit',
  'htmlform-reset'               => 'Undo changes',
  'htmlform-selectorother-other' => 'Other',
 +'htmlform-no'                  => 'No',
 +'htmlform-yes'                 => 'Yes',
 +'htmlform-chosen-placeholder'  => 'Select an option',
  
  # SQLite database support
  'sqlite-has-fts' => '$1 with full-text search support',
@@@ -79,7 -79,6 +79,7 @@@
   * @author Mido
   * @author Mihai
   * @author Minh Nguyen
 + * @author Moha
   * @author Mormegil
   * @author Mpradeep
   * @author Murma174
   * @author Yyy
   * @author Žekřil71pl
   * @author פוילישער
 + * @author គីមស៊្រុន
   * @author 아라
   */
  
@@@ -187,6 -185,8 +187,6 @@@ Is only shown if {{msg-mw|tog-enotifuse
  'tog-shownumberswatching' => 'Toggle option used in [[Special:Preferences]], in the section for recent changes. When this option is activated, the entries in recent changes includes the number of users who watch pages. {{Gender}}',
  'tog-oldsig' => 'Used in [[Special:Preferences]], tab User profile. {{Gender}}',
  'tog-fancysig' => 'In user preferences under the signature box.  {{Gender}}',
 -'tog-externaleditor' => "[[Special:Preferences]], tab 'Edit'. Offers user to use an external editor by default. {{Gender}}",
 -'tog-externaldiff' => "[[Special:Preferences]], tab 'Edit'. Offers user to use an external diff program by default. {{Gender}}",
  'tog-showjumplinks' => 'Toggle option used in [[Special:Preferences]]. The "jump to" part should be the same with {{msg-mw|jumpto}} (or you can use <nowiki>{{int:jumpto}}</nowiki>). These links are shown in some of the older skins as "jump to: navigation, search" but they are hidden by default (you can enable them with this option). {{Gender}}',
  'tog-uselivepreview' => 'Toggle option used in [[Special:Preferences]]. Live preview is an experimental feature (unavailable by default) to use edit preview without loading the page again. {{Gender}}',
  'tog-forceeditsummary' => "Toggle option used in [[Special:Preferences]] to force an edit ''{{msg-mw|summary}}''. {{Gender}}",
  ''(the message is considered optional because it is only used in wikis with language variants)''",
  'tog-norollbackdiff' => "Option in [[Special:Preferences]], 'Misc' tab. Only shown for users with the rollback right. By default a diff is shown below the return screen of a rollback. Checking this preference toggle will suppress that. {{Gender}}
  {{Identical|Rollback}}",
 +'tog-useeditwarning' => 'Used as label for the checkbox in [[Special:Preferences#mw-prefsection-editing|Special:Preferences]].',
  
  'underline-always' => 'Used in [[Special:Preferences#mw-prefsection-rendering|Preferences]].
  
@@@ -510,8 -509,8 +510,8 @@@ See also
  'create' => 'The text on the tab of the edit form on unexisting pages starts editing them.
  
  {{Identical|Create}}',
 -'editthispage' => 'This is the "edit" link as used in the skins Classic/Standard, Cologne Blue and Nostalgia. See {{msg|create-this-page}} for when the page does not exist.',
 -'create-this-page' => 'In the skins Classic/Standard, Cologne Blue and Nostalgia this is the text for the link leading to the edit form on pages that have not yet been created. See {{msg-mw|editthispage}} for when the page already exists.
 +'editthispage' => 'This is the "edit" link as used in the Cologne Blue skin, at the bottom of the page. See {{msg|create-this-page}} for when the page does not exist.',
 +'create-this-page' => 'In the Cologne Blue skin this is the text for the link leading to the edit form on pages that have not yet been created, at the bottom of the page. See {{msg-mw|editthispage}} for when the page already exists.
  {{Identical|Createpage}}',
  'delete' => 'Name of the Delete tab shown for admins. Should be in the infinitive mood.
  
@@@ -520,7 -519,7 +520,7 @@@ See also
  * {{msg-mw|Accesskey-ca-delete}}
  * {{msg-mw|Tooltip-ca-delete}}
  {{Identical|Delete}}',
 -'deletethispage' => 'In the skins Classic/Standard, Cologne Blue and Nostalgia this is the text for link to delete the page in admin view.
 +'deletethispage' => 'In the Cologne Blue skin this is the text for link to delete the page in admin view, at the bottom of the page.
  {{Identical|Delete this page}}',
  'undelete_short' => "It is tab label. It's really can be named ''nstab-undelete''.",
  'viewdeleted_short' => 'Tab label for the undelete button when the user has permission to view the deleted history but not undelete.',
@@@ -533,7 -532,7 +533,7 @@@ See also
  {{Identical|Protect}}',
  'protect_change' => 'Text on links for each entry in [[Special:ProtectedPages]] to change the protection of pages (only displayed to admins).
  {{Identical|Change}}',
 -'protectthispage' => 'In the skins Classic/Standard, Cologne Blue and Nostalgia this is the text for link to protect the page in admin view.
 +'protectthispage' => 'In this Cologne Blue skin this is the text for link to protect the page in admin view, at the bottom of the page.
  {{Identical|Protect this page}}',
  'unprotect' => 'Name of unprotect tab displayed for admins
  
@@@ -542,10 -541,10 +542,10 @@@ See also
  * {{msg-mw|Accesskey-ca-unprotect}}
  * {{msg-mw|Tooltip-ca-unprotect}}
  {{Identical|Unprotect}}',
 -'unprotectthispage' => 'In the skins Classic/Standard, Cologne Blue and Nostalgia this is the anchor text for the link to unprotect the page in admin view.
 +'unprotectthispage' => 'In this Cologne Blue skin this is the anchor text for the link to unprotect the page in admin view, at the bottom of the page.
  {{Identical|Unprotect this page}}',
  'newpage' => '{{Identical|New page}}',
 -'talkpage' => 'In the skins Classic/Standard, Cologne Blue and Nostalgia this is the text for link to discuss the page.',
 +'talkpage' => 'In the Cologne Blue skin this is the text for link to discuss the page, at the bottom of the page.',
  'talkpagelinktext' => 'Used as name of links going to talk page in some places, like in [[Special:RecentChanges]], [[Special:Allmessages]], [[Special:Logs]], and [[Special:Watchlist/edit]].
  
  {{Identical|Talk}}',
  'postcomment' => 'Used as link text.
  
  The link points to the talk page and has the parameters "action=edit&section=new".',
 -'articlepage' => "'Content page' is used for NS_MAIN and any other non-standard namespace and this message is only used in skins Nostalgia, Cologneblue and Standard in the bottomLinks part.
 +'articlepage' => "'Content page' is used for NS_MAIN and any other non-standard namespaces. Only used in the Cologne Blue skin in the bottomLinks part.
  
  {{Identical|Content page}}",
  'talk' => 'Used as display name for the tab to all {{msg-mw|Talk}} pages. These pages accompany all content pages and can be used for discussing the content page. Example: [[Talk:Example]].
@@@ -611,8 -610,7 +611,8 @@@ For explanation of 'lock' see [[w:Lock_
  'pool-queuefull' => 'Part of {{msg-mw|view-pool-error}}
  
  "Pool" refers to a pool of processes.',
 -'pool-errorunknown' => 'Part of {{msg-mw|view-pool-error}}.',
 +'pool-errorunknown' => 'Part of {{msg-mw|view-pool-error}}.
 +{{Identical|Unknown error}}',
  
  # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
  'aboutsite' => 'Used as the label of the link that appears at the footer of every page on the wiki (in most of  the skins) and leads to the page that contains the site description. The link target is {{msg-mw|aboutpage}}.
@@@ -1043,50 -1041,18 +1043,50 @@@ Parameters
  'yourname' => "{{doc-important|<nowiki>{{</nowiki>[[Gender|GENDER]]<nowiki>}}</nowiki> is '''NOT''' supported.}}
  In user preferences.
  {{Identical|Username}}",
 +'userlogin-yourname' => 'In new vertical user login & create account forms, label for username field.
 +
 +See examples: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1] and [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
 +{{Identical|Username}}',
 +'userlogin-yourname-ph' => 'Placeholder text in new userlogin/create account form field.
 +
 +See example: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1] and [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
  'yourpassword' => 'In user preferences
  
  {{Identical|Password}}',
 +'userlogin-yourpassword' => 'In new vertical user login & create account forms, label for password field.
 +
 +See examples: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1] and [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
 +{{Identical|Password}}',
 +'userlogin-yourpassword-ph' => 'Placeholder text in new userlogin form for password field.
 +
 +See examples: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1] and [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
 +{{Identical|Enter password}}',
 +'createacct-yourpassword-ph' => 'Placeholder text in new create account form for password field.
 +
 +See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
 +{{Identical|Enter password}}',
  'yourpasswordagain' => 'In user preferences',
 +'createacct-yourpasswordagain' => 'In new create account form, label for field to re-enter password
 +
 +See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
 +{{Identical|Confirm password}}',
 +'createacct-yourpasswordagain-ph' => 'Placeholder text in new create account form for re-enter password field.
 +
 +See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
  'remembermypassword' => 'A check box in [[Special:UserLogin]]
  
  {{Identical|Remember my login on this computer}}',
 +'userlogin-remembermypassword' => 'The text for a check box in the new-style [[Special:UserLogin]].
 +
 +See example: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1]',
 +'userlogin-signwithsecure' => 'Text of link to HTTPS login form.
 +
 +See example: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1]',
  'securelogin-stick-https' => 'Used as label for checkbox.',
  'yourdomainname' => 'Used as label for listbox.',
  'password-change-forbidden' => 'Error message shown when an external authentication source does not allow the password to be changed.',
  'externaldberror' => 'This message is thrown when a valid attempt to change the wiki password for a user fails because of a database error or an error from an external system.',
 -'login' => "Shown as the caption of the button at [[Special:UserLogin]], and also to anonymous users in the upper right corner of the page when they can't create an account (otherwise the message {{msg-mw|nav-login-createaccount}} is shown there).
 +'login' => "Shown as the caption of the button at [[Special:UserLogin]], and also to anonymous users in the upper right corner of the page when they can't create an account (otherwise the message {{msg-mw|nav-login-createaccount}} is shown there). Also the title of the new login special page, which does not combine Log in & Create account.
  
  See also:
  * {{msg-mw|Login}}
@@@ -1114,16 -1080,8 +1114,16 @@@ See also
  'notloggedin' => 'This message is displayed in the standard skin when not logged in. The message is placed above the login link in the top right corner of pages.
  
  {{Identical|Not logged in}}',
 +'userlogin-noaccount' => 'In the new-style [[Special:Userlogin]] form, this is the text prior to button inviting user to join project.
 +
 +See example: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1]
 +{{Identical|Do not have an account}}',
 +'userlogin-joinproject' => 'Text of button inviting user to create an account.
 +
 +See example: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1]',
  'nologin' => 'A message shown in the log in form. Parameters:
 -* $1 - a link to the account creation form, and the text of it is {{msg-mw|Nologinlink}}',
 +* $1 - a link to the account creation form, and the text of it is {{msg-mw|Nologinlink}}
 +{{Identical|Do not have an account}}',
  'nologinlink' => 'Text of the link to the account creation form. Before that link, the message {{msg-mw|Nologin}} appears.
  {{Identical|Create an account}}',
  'createaccount' => '{{doc-special|CreateAccount}}
@@@ -1138,81 -1096,12 +1138,81 @@@ It is also used on the top of the page 
  'gotaccountlink' => 'Text of the link to the log in form. Before that link, the message {{msg-mw|Gotaccount}} appears.
  {{Identical|Log in}}',
  'userlogin-resetlink' => 'Used on the login page.',
 -'createaccountmail' => 'Button text for creating a new account and sending the new password to the specified e-mail address directly, as used on [[Special:UserLogin/signup]] if creating accounts by e-mail is allowed.',
 +'userlogin-resetpassword-link' => 'Text of link to [[Special:PasswordReset]] on new vertical-layout create account form.
 +
 +See example: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1]
 +
 +userlogin-resetpassword-link may have to be shorter than the old {{msg-mw|userlogin-resetlink}}',
 +'helplogin-url' => '{{doc-important|Do not translate the namespace name <code>Help</code>.}}
 +Used as name of the page that provides information about logging into the wiki.
 +
 +Used as a link target in the message {{msg-mw|Userlogin-helplink}}.',
 +'userlogin-helplink' => '{{doc-important|Do not change <code><nowiki>{{MediaWiki:helplogin-url}}</nowiki></code>.}}
 +Wikitext linking to login help.
 +
 +See example: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1]
 +
 +See also:
 +* {{msg-mw|Helplogin-url}}',
 +'createacct-join' => 'Subheading of vertical-layout create account form encouraging user to join the wiki.
 +
 +See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
 +'createacct-emailrequired' => 'Label in vertical-layout create account form for email field when it is required.
 +
 +See also:
 +* {{msg-mw|Createacct-emailoptional}}
 +{{Identical|E-mail address}}',
 +'createacct-emailoptional' => 'Label in vertical-layout create account form for email field when it is optional.
 +
 +See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
 +
 +See also:
 +* {{msg-mw|Createacct-emailrequired}}',
 +'createacct-email-ph' => 'Placeholder in vertical-layout create account form for email field.
 +
 +See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
 +'createaccountmail' => 'Used as label for the checkbox for creating a new account and sending the new password to the specified e-mail address directly, as used on [[Special:UserLogin/signup]] if creating accounts by e-mail is allowed.
 +
 +See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
 +'createacct-realname' => 'In vertical-layout create account form, label for field to enter optional real name.',
  'createaccountreason' => '{{Identical|Reason}}',
 +'createacct-reason' => 'In vertical-layout create account form, label for field to enter reason to create an account when already logged-in.
 +
 +See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
 +{{Identical|Reason}}',
 +'createacct-reason-ph' => 'Placeholder in vertical-layout create account form for reason field.
 +
 +See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
 +'createacct-captcha' => 'Label in vertical-layout create account form for CAPTCHA input field when repositioned by JavaScript.',
 +'createacct-imgcaptcha-ph' => 'Placehodler text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.',
 +'createacct-submit' => 'Submit button on vertical-layout create account form.
 +
 +See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
 +'createacct-benefit-heading' => 'In vertical-layout create account form, the heading for the section describing the benefits of creating an account.
 +
 +See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
 +'createacct-benefit-body1' => 'In vertical-layout create account form, the text for the first benefit.
 +
 +Preceded by the message {{msg-mw|Createacct-benefit-head1}} (number of edits).
 +
 +See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
 +{{Identical|Edit}}',
 +'createacct-benefit-body2' => 'In vertical-layout create account form, the text for the second benefit.
 +
 +Preceded by the message {{msg-mw|Createacct-benefit-head2}} (number of pages).
 +
 +See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
 +{{Identical|Page}}',
 +'createacct-benefit-body3' => 'In vertical-layout create account form, the text for the third benefit.
 +
 +Preceded by the message {{msg-mw|Createacct-benefit-head3}} (number of contributors).
 +
 +See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
  'badretype' => 'Used as error message when the new password and its retype do not match.',
  'userexists' => 'Used as error message in creating a user account.',
  'loginerror' => 'Used as title of error message.
  {{Identical|Login error}}',
 +'createacct-error' => 'Used as heading for the error message.',
  'createaccounterror' => 'Parameters:
  * $1 is an error message',
  'nocookiesnew' => "This message is displayed when a new account was successfully created, but the browser doesn't accept cookies.",
@@@ -1258,7 -1147,7 +1258,7 @@@ $1 is the minimum number of characters 
  
  Parameters:
  * $1 is a user name. This parameter can be used with GENDER.',
 -'noemailcreate' => 'Used as error message in [[Special:UserLogin]].',
 +'noemailcreate' => 'Used as error message when one user creates an account for another and there is no email.',
  'passwordsent' => '* $1 - username',
  'blocked-mailpassword' => 'Used as error message in password recovery.',
  'eauthentsent' => "This message appears after entering an e-mail address in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}, then clicking on '{{int:saveprefs}}'.",
@@@ -1331,7 -1220,6 +1331,7 @@@ See also
  {{Identical|Cancel}}',
  'resetpass-wrong-oldpass' => 'Error message shown on [[Special:ChangePassword]] when the old password is not valid.',
  'resetpass-temp-password' => 'The label of the input box for the temporary password (received by e-mail) on the form displayed after logging in with a temporary password.',
 +'resetpass-abort-generic' => 'Generic error message shown on [[Special:ChangePassword]] when an extension aborts a password change from a hook.',
  
  # Special:PasswordReset
  'passwordreset' => 'Title of [[Special:PasswordReset]].
  'passwordreset-text' => 'Text on [[Special:PasswordReset]]',
  'passwordreset-legend' => '{{Identical|Reset password}}',
  'passwordreset-disabled' => 'Used as error message in changing password.',
 +'passwordreset-emaildisabled' => "Used as error message in changing password when site's email feature is disabled.",
  'passwordreset-pretext' => 'These instructions are shown on the password reset dialogue, which can, in principle, take the user\'s email address as well as, or instead of, their username. This text displays above one or more fields, at least one of which needs to be completed, and the message does not know which routes are available, so it needs to refer to some vague noun rather than specifically "username".
  "One of the pieces of data" means "an info"/"a datum" (probably to be translatea with a singular noun in your language if available). Parameters:
  * $1 is the number of password reset routes. This is never 1, but always two or more. Thus, the first plural option is empty in English.',
@@@ -1376,9 -1263,8 +1376,9 @@@ See also
  See also:
  * {{msg-mw|Passwordreset-emailsent}}
  * {{msg-mw|Passwordreset-emailerror-capture}}',
 -'passwordreset-emailerror-capture' => 'Error message displayed in [[Special:PasswordReset]] when sending an e-mail fails. Parameters:
 +'passwordreset-emailerror-capture' => 'Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:
  * $1 - error message
 +* $2 - username, used for GENDER
  See also:
  * {{msg-mw|Passwordreset-emailsent}}
  * {{msg-mw|Passwordreset-emailsent-capture}}',
@@@ -1716,9 -1602,6 +1716,9 @@@ See also
  'content-not-allowed-here' => 'Error message indicating that the desired content model is not supported in given localtion.
  * $1 - the human readable name of the content model: {{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}
  * $2 - the title of the page in question',
 +'editwarning-warning' => "{{doc-important|Do ''not'' use <nowiki>{{int:prefs-editing}}</nowiki> for \"Editing\". It is forbidden in this message, see [[mwr:68405]].}}
 +
 +but you can see the text of that button here: {{msg-mw|Prefs-editing}}",
  
  # Content models
  'content-model-wikitext' => 'Name for the wikitext content model, used when decribing what type of content a page contains.
@@@ -2348,8 -2231,7 +2348,8 @@@ See also
  
  See also:
  * {{msg-mw|Searchprofile-images|message}}
 -* {{msg-mw|Searchprofile-images-tooltip|tooltip}}',
 +* {{msg-mw|Searchprofile-images-tooltip|tooltip}}
 +{{Identical|Muitimedia}}',
  'searchprofile-everything' => 'Used as an option in [[Special:Search]].
  
  See also:
@@@ -2445,8 -2327,15 +2445,8 @@@ See also
  In this sentence, "their indexes" refers to "Google\'s indexes".
  
  Shown on [[Special:Search]] when the internal search is disabled.',
 -
 -# Quickbar
 -'qbsettings' => 'The title of the section in [[Special:Preferences]], only shown when using the skins "Standard/Classic" or "Cologne Blue". The quicbar is the same as the sidebar.',
 -'qbsettings-none' => '{{Identical|None}}',
 -'qbsettings-fixedleft' => 'Position of the quickbar (sidebar). Used in the preferences.',
 -'qbsettings-fixedright' => 'Position of the quickbar (sidebar). Used in the preferences.',
 -'qbsettings-floatingleft' => 'Position of the quickbar (sidebar). Used in the preferences.',
 -'qbsettings-floatingright' => 'Position of the quickbar (sidebar). Used in the preferences.',
 -'qbsettings-directionality' => '"Fixed", as in the position "fixed left or right". For left-to-right languages, the quickbar will be positioned at the left, for right-to-left languages at the right.',
 +'search-error' => 'Shown when an error has occurred when performing a search
 +* $1 is the localized error that was returned',
  
  # Preferences page
  'preferences' => 'Title of the [[Special:Preferences]] page.
@@@ -2516,8 -2405,7 +2516,8 @@@ See also
  'resetprefs' => 'Button for resetting changes in the preferences page.',
  'restoreprefs' => 'Used in [[Special:Preferences]]',
  'prefs-editing' => 'Title of a tab in [[Special:Preferences]].
 -When changing this message, please also update {{msg-mw|vector-editwarning-warning}} which references to this message.',
 +When changing this message, please also update {{msg-mw|vector-editwarning-warning}} which references to this message.
 +{{Identical|Editing}}',
  'prefs-edit-boxsize' => 'Used on [[Special:Preferences]].',
  'rows' => 'Used on [[Special:Preferences]], "Editing" section in the "Size of editing window" fieldset',
  'columns' => 'Used on [[Special:Preferences]], "Editing" section in the "Size of editing window" fieldset',
  {{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]].',
 +'stub-threshold-disabled' => 'Used in [[Special:Preferences]].
 +{{Identical|Disabled}}',
  'recentchangesdays' => 'Used in [[Special:Preferences]], tab "Recent changes".',
  'recentchangesdays-max' => 'Shown as hint in [[Special:Preferences]], tab "Recent changes"',
  'recentchangescount' => 'Used in [[Special:Preferences]], tab "Recent changes".',
@@@ -2556,8 -2443,7 +2556,8 @@@ This option lets your time zone settin
  'timezoneregion-atlantic' => 'Used in "Time zone" listbox in [[Special:Preferences#mw-prefsection-datetime|preferences]], "date and time" tab.
  {{Related|Timezoneregion}}',
  'timezoneregion-australia' => 'Used in "Time zone" listbox in [[Special:Preferences#mw-prefsection-datetime|preferences]], "date and time" tab.
 -{{Related|Timezoneregion}}',
 +{{Related|Timezoneregion}}
 +{{Identical|Australia}}',
  'timezoneregion-europe' => 'Used in "Time zone" listbox in [[Special:Preferences#mw-prefsection-datetime|preferences]], "date and time" tab.
  {{Related|Timezoneregion}}',
  'timezoneregion-indian' => 'Used in "Time zone" listbox in [[Special:Preferences#mw-prefsection-datetime|preferences]], "date and time" tab.
  'prefs-emailconfirm-label' => 'Sub-heading in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.',
  'prefs-textboxsize' => "Header for the box specifying the size of the editing window, displayed on the 'editing' tab of the [[Special:Preferences|user preferences]] special page.",
  'youremail' => 'Label of the e-mail text box of the "E-mail options" section of [[Special:Preferences]].
 +Also used on create account form.
 +
  {{Identical|E-mail}}',
  'username' => 'Username field in [[Special:Preferences]]. $1 is the current user name for GENDER distinction (depends on sex setting).
  
@@@ -2728,7 -2612,6 +2728,7 @@@ Parameters
  Parameters:
  * $1 - optional, for PLURAL use, the number of items in the column following the message. Avoid PLURAL, if your language allows that.',
  'userrights-irreversible-marker' => '{{optional}}',
 +'userrights-conflict' => "Shown on [[Special:UserRights]] if the target's rights have been changed since the form was loaded.",
  
  # Groups
  'group' => '{{Identical|Group}}',
@@@ -3701,6 -3584,12 +3701,6 @@@ See also
  Known messages are:
  * {{msg-mw|http-host-unreachable}}
  * {{msg-mw|http-timed-out}}',
 -'http-host-unreachable' => 'Used as error message when executing HTTP request.
 -
 -See also:
 -* {{msg-mw|Http-request-error}}
 -* {{msg-mw|Http-read-error}}
 -* {{msg-mw|Http-timed-out|28}}',
  'http-bad-status' => 'Parameters:
  * $1 - an HTTP error code (e.g. 404)
  * $2 - the HTTP error message (e.g. File Not Found)',
@@@ -3902,8 -3791,7 +3902,8 @@@ $1 is the name of the shared repository
  * $1 - file title
  See also:
  * {{msg-mw|Filedelete-intro}}',
 -'filedelete-legend' => '{{Identical|Delete}}',
 +'filedelete-legend' => 'Used as fieldset label in the "Delete file" form.
 +{{Identical|Delete file}}',
  'filedelete-intro' => 'Used as introduction for FileDelete form.
  See also:
  * {{msg-mw|Filedelete|page title}}',
@@@ -3947,8 -3835,7 +3947,8 @@@ See also
  
  See also:
  * {{msg-mw|Mimesearch|page title}}
 -* {{msg-mw|Ilsubmit|Submit button text}}',
 +* {{msg-mw|Ilsubmit|Submit button text}}
 +{{Identical|MIME type}}',
  'download' => 'Direct download link in each line returned by [[Special:MIMESearch]]. Points to the actual file, rather than the image description page.
  {{Identical|Download}}',
  
@@@ -3996,7 -3883,7 +3996,7 @@@ Possible alternatives to the word 'cont
  
  {{Identical|Content page}}",
  'statistics-pages' => 'Used in [[Special:Statistics]]
 -{{Identical|Pages}}',
 +{{Identical|Page}}',
  'statistics-pages-desc' => "Tooltip shown over ''Pages'' (or as a note below it) in [[Special:Statistics]]",
  'statistics-files' => 'Used in [[Special:Statistics]]',
  'statistics-edits' => 'Used in [[Special:Statistics]]',
@@@ -4295,36 -4182,6 +4295,36 @@@ You can apparently use 'URL' instead o
  'listusers-blocked' => 'Used on [[Special:ActiveUsers]] when a user has been blocked.
  * $1 is a user name for use with GENDER (optional)',
  
 +# Special:ActiveUsers
 +'activeusers' => 'Title of [[Special:ActiveUsers]]',
 +'activeusers-intro' => 'Used as introduction in [[Special:ActiveUsers]]. Parameters:
 +* $1 - number of days (<code>$wgActiveUserDays</code>)',
 +'activeusers-count' => "Used in [[Special:ActiveUsers]] to show the active user's recent action count in brackets ([]).
 +* $1 is the number of recent actions
 +* $2 is the user's name for use with GENDER (optional)
 +* $3 is the maximum number of days of the RecentChangesList",
 +'activeusers-from' => 'Used as label for checkbox in the form on [[Special:ActiveUsers]].
 +
 +identical with {{msg-mw|listusersfrom}}
 +
 +See also:
 +* {{msg-mw|activeusers|legend for the form}}
 +* {{msg-mw|activeusers-hidebots|label for checkbox}}
 +* {{msg-mw|activeusers-hidesysops|label for checkbox}}',
 +'activeusers-hidebots' => 'Used as label for checkbox in the form on [[Special:ActiveUsers]].
 +
 +See also:
 +* {{msg-mw|activeusers|legend for the form}}
 +* {{msg-mw|activeusers-from|label for input box}}
 +* {{msg-mw|activeusers-hidesysops|label for checkbox}}',
 +'activeusers-hidesysops' => 'Used as label for checkbox in the form on [[Special:ActiveUsers]].
 +
 +See also:
 +* {{msg-mw|activeusers|legend for the form}}
 +* {{msg-mw|activeusers-from|label for input box}}
 +* {{msg-mw|activeusers-hidebots|label for checkbox}}',
 +'activeusers-noresult' => 'identical with {{msg-mw|listusers-noresult}}',
 +
  # Special:ListGroupRights
  'listgrouprights' => 'The name of the special page [[Special:ListGroupRights]].',
  'listgrouprights-summary' => 'The description used on [[Special:ListGroupRights]].',
@@@ -5045,13 -4902,9 +5045,13 @@@ See also
  'contribsub2' => 'Contributions for "user" (links)
  {{Identical|For $1}}',
  'nocontribs' => 'Optional parameter: $1 is the user name',
 -'uctop' => 'This message is used in [[Special:Contributions]]. It is used to show that a particular edit was the last made to a page. Example: 09:57, 11 February 2008 (hist) (diff) Pagename‎ (edit summary) (top)',
 +'uctop' => 'This message is used in [[Special:Contributions]]. It is used to show that a particular edit was the last made to a page. Example: 09:57, 11 February 2008 (hist) (diff) Pagename‎ (edit summary) (top)
 +{{Identical|Top}}',
  'month' => 'Used in [[Special:Contributions]] and history pages ([{{fullurl:Sandbox|action=history}} example]), as label for a dropdown box to select a specific month to view the edits made in that month, and the earlier months. See also {{msg-mw|year}}.',
 -'year' => 'Used in [[Special:Contributions]] and history pages ([{{fullurl:Sandbox|action=history}} example]), as label for a inputbox to select a specific year to view the edits made in that year, and the earlier years. See also {{msg-mw|month}}.',
 +'year' => 'Used in [[Special:Contributions]] and history pages ([{{fullurl:Sandbox|action=history}} example]), as label for an input box to select a specific year to view the edits made in that year, and the earlier years.
 +
 +See also:
 +* {{msg-mw|month}}',
  
  'sp-contributions-newbies' => 'Text of radio button on special page [[Special:Contributions]].',
  'sp-contributions-newbies-sub' => "Note at the top of the page of results for a search on [[Special:Contributions]] where 'Show contributions for new accounts only' has been selected.",
@@@ -6079,6 -5932,9 +6079,9 @@@ The reason $1 is one of the following m
  * {{msg-mw|Djvu page error}}
  * {{msg-mw|Svg-long-error}}
  * other custom string',
+ 'thumbnail_error_remote' => 'Message shown in a thumbnail frame when creation of the thumbnail fails. Parameters:
+ * $1 - is the name of the shared repository, see {{msg-mw|shardupload}}
+ * $2 - the reason, see {{msg-mw|thumbnail_error}}',
  'djvu_page_error' => 'Used as error message.
  
  See also:
@@@ -6732,9 -6588,14 +6735,9 @@@ See also
  # Stylesheets
  'common.css' => '{{optional}}
  CSS applied to all users.',
 -'standard.css' => '{{optional}}',
 -'nostalgia.css' => '{{optional}}',
  'cologneblue.css' => '{{optional}}',
  'monobook.css' => '{{optional}}
  CSS applied to users using Monobook skin.',
 -'myskin.css' => '{{optional}}',
 -'chick.css' => '{{optional}}',
 -'simple.css' => '{{optional}}',
  'modern.css' => '{{optional}}',
  'vector.css' => '{{optional}}',
  'print.css' => '{{optional}}',
@@@ -6749,9 -6610,14 +6752,9 @@@ Style that can be applied on [[w:handhe
  # Scripts
  'common.js' => '{{optional}}
  JS for all users.',
 -'standard.js' => '{{optional}}',
 -'nostalgia.js' => '{{optional}}',
  'cologneblue.js' => '{{optional}}',
  'monobook.js' => '{{optional}}
  JS for users using Monobook skin.',
 -'myskin.js' => '{{optional}}',
 -'chick.js' => '{{optional}}',
 -'simple.js' => '{{optional}}',
  'modern.js' => '{{optional}}',
  'vector.js' => '{{optional}}',
  'group-autoconfirmed.js' => '{{doc-group|autoconfirmed|js}}',
@@@ -6937,8 -6803,14 +6940,8 @@@ See also
  * {{msg-mw|Pageinfo-category-subcats}}',
  
  # Skin names
 -'skinname-standard' => '{{optional}}
 -{{Identical|Classic}}',
 -'skinname-nostalgia' => '{{optional}}',
  'skinname-cologneblue' => '{{optional}}',
  'skinname-monobook' => '{{optional}}',
 -'skinname-myskin' => '{{optional}}',
 -'skinname-chick' => '{{optional}}',
 -'skinname-simple' => '{{optional}}',
  'skinname-modern' => '{{optional}}',
  'skinname-vector' => '{{optional}}',
  
@@@ -7144,17 -7016,12 +7147,17 @@@ See also {{msg-mw|Days-abbrev}
  
  Part of variable $1 in {{msg-mw|Ago}}
  {{Identical|Day}}',
 +'weeks' => 'Full word for "weeks".
 +
 +Used as <code>$1</code> in {{msg-mw|Ago}}. Parameters:
 +* $1 - the number of weeks',
  'months' => 'Full word for "months". $1 is the number of months.
  
  Part of variable $1 in {{msg-mw|Ago}}',
 -'years' => 'Full word for "years". $1 is the number of years.
 +'years' => 'Full word for "years".
  
 -Part of variable $1 in {{msg-mw|Ago}}',
 +Used as <code>$1</code> in {{msg-mw|Ago}}. Parameters:
 +* $1 - the number of years',
  'ago' => 'Phrase for indicating how long ago something happened. $1 is something like "3 days 10 hours", taken from these messages:
  *{{msg-mw|Seconds}}
  *{{msg-mw|Minutes}}
  *{{msg-mw|Years}}',
  'just-now' => 'Phrase for indicating something happened just now.',
  
 +# Human-readable timestamps
 +'hours-ago' => 'Phrase for indicating that something occurred a certain number of hours ago',
 +'minutes-ago' => 'Phrase for indicating that something occurred a certain number of minutes ago',
 +'seconds-ago' => 'Phrase for indicating that something occurred a certain number of seconds ago',
 +'monday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Monday. $1 is the time.',
 +'tuesday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Tuesday. $1 is the time.',
 +'wednesday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Wednesday. $1 is the time.',
 +'thursday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Thursday. $1 is the time.',
 +'friday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Friday. $1 is the time.',
 +'saturday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Saturday. $1 is the time.',
 +'sunday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Sunday. $1 is the time.',
 +'yesterday-at' => 'Phrase for indicating that something occurred at a particular time yesterday. $1 is the time.',
 +
  # Bad image list
  'bad_image_list' => 'This message only appears to guide administrators to add links with the right format. This will not appear anywhere else in MediaWiki.',
  
  /*
  Short names for language variants used for language conversion links.
 -To disable showing a particular link, set it to 'disable', e.g.
 -'variantname-zh-sg' => 'disable',
  Variants for Chinese language
  */
  'variantname-zh-hans' => '{{Optional}}
@@@ -7285,7 -7141,7 +7288,7 @@@ $1 is the value of the property (in on
  'metadata-langitem-default' => '{{optional}}
  Similar to "metadata-langitem" but for the case where a multilingual property has a default specified that does not specify what language the default is in. $1 is the value of the property.',
  
 -# EXIF tags
 +# Exif tags
  'exif-imagewidth' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
  {{Identical|Width}}',
  'exif-imagelength' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
@@@ -7378,8 -7234,7 +7381,8 @@@ See also
  This contains how the information in the picture is stored. This is most commonly Y, Cr, Cb to specify luma, red, blue. RGB is also possible to specify Red, Green, Blue.
  {{Related|Exif-componentsconfiguration}}',
  'exif-compressedbitsperpixel' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
 -'exif-pixelydimension' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
 +'exif-pixelydimension' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
 +{{Identical|Image width}}',
  'exif-pixelxdimension' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
  'exif-usercomment' => "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
  
@@@ -7642,7 -7497,7 +7645,7 @@@ This is who originally owned the image 
  'exif-editstatus' => 'Editorial status of image. This is more intended for use with people making news papers. This denotes whether the image is on the main page, is part of a correction, etc. See 2:07 of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf',
  'exif-urgency' => 'Urgency. How urgent this image is. 1 is very urgent, 5 is normal, 8 is  very low priority.
  {{Related|Exif-urgency}}',
 -'exif-fixtureidentifier' => 'Fixture name. Identifies frequently occuring object data, for example a regular column in a news paper.',
 +'exif-fixtureidentifier' => 'Fixture name. Identifies frequently occurring object data, for example a regular column in a news paper.',
  'exif-locationdest' => 'Full printable name of location.',
  'exif-locationdestcode' => 'Code of location depicted. Typically this is an ISO country code, but the IPTC-iim standard also defines other codes like XSP for outer space. See appendix D (and tag 2:100) of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf',
  'exif-objectcycle' => 'Time of day that media is intended for. Either morning only, evening only, or all day. Typically only used for news related things that might only be broadcast at a specific time of day.
@@@ -7722,7 -7577,7 +7725,7 @@@ Note, not all fields are guaranteed to 
  *$1 is numeric IPTC subject news code (one of http://cv.iptc.org/newscodes/subjectcode )
  *$2 is one of 17 broad categories that the code falls into. For example any code starting with 15 has the contents of {{msg-mw|exif-iimcategory-spo}} for $2.',
  
 -# EXIF attributes
 +# Exif attributes
  'exif-compression-1' => '{{Related|Exif-compression}}',
  'exif-compression-2' => '{{Related|Exif-compression}}',
  'exif-compression-3' => '{{Related|Exif-compression}}',
@@@ -8050,8 -7905,7 +8053,8 @@@ See also
  {{Related|Exif-gpsdop}}',
  'exif-gpsdop-moderate' => 'Parameters:
  * $1 - the actual HDOP/PDOP value (5-10 for moderate). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)
 -{{Related|Exif-gpsdop}}',
 +{{Related|Exif-gpsdop}}
 +{{Identical|Moderate}}',
  'exif-gpsdop-fair' => 'Parameters:
  * $1 - the actual HDOP/PDOP value (10-20 for fair). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)
  {{Related|Exif-gpsdop}}',
@@@ -8608,29 -8462,14 +8611,29 @@@ A short description of the article pat
  'version-entrypoints-scriptpath' => '{{Optional}}
  A short description of the script path entry point. Links to the mediawiki.org documentation page for $wgScriptPath.',
  
 -# Special:FilePath
 -'filepath' => 'Legend of fieldset around input box in [[Special:FilePath]].',
 -'filepath-page' => 'Shown next to input box in [[Special:FilePath]]
 -
 -{{Identical|File}}',
 -'filepath-submit' => 'Button label in [[Special:FilePath]].
 +# Special:Redirect
 +'redirect' => "{{doc-special|Redirect}}
 +This means \"Redirect by file'''name''', user '''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]].
  {{Identical|Go}}',
 -'filepath-summary' => 'Shown in [[Special:FilePath]]',
 +'redirect-lookup' => 'First field label in [[Special:Redirect]].
 +
 +Followed by the select box which has the following options:
 +* {{msg-mw|Redirect-user}}
 +* {{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-revision' => "Description of lookup type for [[Special:Redirect]].
 +
 +This means \"Page revision '''ID'''\".",
 +'redirect-file' => 'Description of lookup type for [[Special:Redirect]].
 +{{Identical|Filename}}',
 +'redirect-not-exists' => 'Used as error message in [[Special:Redirect]]',
  
  # Special:FileDuplicateSearch
  'fileduplicatesearch' => 'Name of special page [[Special:FileDuplicateSearch]].',
@@@ -8813,11 -8652,6 +8816,11 @@@ See also
  * stub threshold (appearance tab)
  
  {{Identical|Other}}',
 +'htmlform-no' => 'Used in form, such as with radio buttons, for generic yes / no questions.
 +{{Identical|No}}',
 +'htmlform-yes' => 'Used in form, such as with radio buttons, for generic yes / no questions.
 +{{Identical|Yes}}',
 +'htmlform-chosen-placeholder' => 'Used as initial placeholder text in select multiple "chosen" input boxes',
  
  # SQLite database support
  'sqlite-has-fts' => 'Shown on [[Special:Version]].
@@@ -56,6 -56,8 +56,6 @@@ $wgMessageStructure = array
                'tog-shownumberswatching',
                'tog-oldsig',
                'tog-fancysig',
 -              'tog-externaleditor',
 -              'tog-externaldiff',
                'tog-showjumplinks',
                'tog-uselivepreview',
                'tog-forceeditsummary',
@@@ -70,7 -72,6 +70,7 @@@
                'tog-showhiddencats',
                'tog-noconvertlink',
                'tog-norollbackdiff',
 +              'tog-useeditwarning',
        ),
        'underline' => array(
                'underline-always',
                'welcomeuser',
                'welcomecreation-msg',
                'yourname',
 +              'userlogin-yourname',
 +              'userlogin-yourname-ph',
 +              'createacct-helpusername',
                'yourpassword',
 +              'userlogin-yourpassword',
 +              'userlogin-yourpassword-ph',
 +              'createacct-yourpassword-ph',
                'yourpasswordagain',
 +              'createacct-yourpasswordagain',
 +              'createacct-yourpasswordagain-ph',
                'remembermypassword',
 +              'userlogin-remembermypassword',
 +              'userlogin-signwithsecure',
                'securelogin-stick-https',
                'yourdomainname',
                'password-change-forbidden',
                'userlogout',
                'userlogout-summary',
                'notloggedin',
 +              'userlogin-noaccount',
 +              'userlogin-joinproject',
                'nologin',
                'nologinlink',
                'createaccount',
                'gotaccount',
                'gotaccountlink',
                'userlogin-resetlink',
 +              'userlogin-resetpassword-link',
 +              'helplogin-url',
 +              'userlogin-helplink',
 +              'createacct-join',
 +              'createacct-emailrequired',
 +              'createacct-emailoptional',
 +              'createacct-email-ph',
                'createaccountmail',
 +              'createacct-realname',
                'createaccountreason',
 +              'createacct-reason',
 +              'createacct-reason-ph',
 +              'createacct-captcha',
 +              'createacct-imgcaptcha-help',
 +              'createacct-imgcaptcha-ph',
 +              'createacct-submit',
 +              'createacct-benefit-heading',
 +              'createacct-benefit-icon1',
 +              'createacct-benefit-head1',
 +              'createacct-benefit-body1',
 +              'createacct-benefit-icon2',
 +              'createacct-benefit-head2',
 +              'createacct-benefit-body2',
 +              'createacct-benefit-icon3',
 +              'createacct-benefit-head3',
 +              'createacct-benefit-body3',
                'badretype',
                'userexists',
                'loginerror',
 +              'createacct-error',
                'createaccounterror',
                'nocookiesnew',
                'nocookieslogin',
                'resetpass-submit-cancel',
                'resetpass-wrong-oldpass',
                'resetpass-temp-password',
 +              'resetpass-abort-generic',
        ),
        'passwordreset' => array(
                'passwordreset',
                'passwordreset-text',
                'passwordreset-legend',
                'passwordreset-disabled',
 +              'passwordreset-emaildisabled',
                'passwordreset-pretext',
                'passwordreset-username',
                'passwordreset-domain',
                'content-failed-to-parse',
                'invalid-content-data',
                'content-not-allowed-here',
 +              'editwarning-warning',
        ),
        'contentmodels' => array(
                'content-model-wikitext',
                'search-external',
                'searchdisabled',
                'googlesearch',
 +              'search-error',
        ),
        'opensearch' => array(
                'opensearch-desc',
        ),
 -      'quickbar' => array(
 -              'qbsettings',
 -              'qbsettings-none',
 -              'qbsettings-fixedleft',
 -              'qbsettings-fixedright',
 -              'qbsettings-floatingleft',
 -              'qbsettings-floatingright',
 -              'qbsettings-directionality',
 -      ),
        'preferences' => array(
                'preferences',
                'preferences-summary',
                'userrights-changeable-col',
                'userrights-unchangeable-col',
                'userrights-irreversible-marker',
 +              'userrights-conflict',
        ),
        'group' => array(
                'group',
                'http-read-error',
                'http-timed-out',
                'http-curl-error',
 -              'http-host-unreachable',
                'http-bad-status',
        ),
  
                'listusers-noresult',
                'listusers-blocked',
        ),
 +      'activeusers' => array(
 +              'activeusers',
 +              'activeusers-summary',
 +              'activeusers-intro',
 +              'activeusers-count',
 +              'activeusers-from',
 +              'activeusers-hidebots',
 +              'activeusers-hidesysops',
 +              'activeusers-submit',
 +              'activeusers-noresult',
 +      ),
        'listgrouprights' => array(
                'listgrouprights',
                'listgrouprights-summary',
                'thumbnail-more',
                'filemissing',
                'thumbnail_error',
+               'thumbnail_error_remote',
                'djvu_page_error',
                'djvu_no_xml',
                'thumbnail-temp-create',
                'javascripttest-pagetext-noframework',
                'javascripttest-pagetext-unknownframework',
                'javascripttest-pagetext-frameworks',
 -              'javascripttest-pagetext-skins' ,
 +              'javascripttest-pagetext-skins',
                'javascripttest-qunit-name',
                'javascripttest-qunit-intro',
                'javascripttest-qunit-heading',
                'minutes',
                'hours',
                'days',
 +              'weeks',
                'months',
                'years',
                'ago',
                'just-now',
        ),
 +      'human-timestamps' => array(
 +              'hours-ago',
 +              'minutes-ago',
 +              'seconds-ago',
 +              'monday-at',
 +              'tuesday-at',
 +              'wednesday-at',
 +              'thursday-at',
 +              'friday-at',
 +              'saturday-at',
 +              'sunday-at',
 +              'today-at',
 +              'yesterday-at',
 +      ),
        'badimagelist' => array(
                'bad_image_list',
        ),
                'exif-lightsource-255',
        ),
        'exif-flash' => array(
 -              'exif-flash-fired-0' ,
 -              'exif-flash-fired-1' ,
 -              'exif-flash-return-0' ,
 -              'exif-flash-return-2' ,
 -              'exif-flash-return-3' ,
 -              'exif-flash-mode-1' ,
 -              'exif-flash-mode-2' ,
 -              'exif-flash-mode-3' ,
 -              'exif-flash-function-1' ,
 -              'exif-flash-redeye-1' ,
 +              'exif-flash-fired-0',
 +              'exif-flash-fired-1',
 +              'exif-flash-return-0',
 +              'exif-flash-return-2',
 +              'exif-flash-return-3',
 +              'exif-flash-mode-1',
 +              'exif-flash-mode-2',
 +              'exif-flash-mode-3',
 +              'exif-flash-function-1',
 +              'exif-flash-redeye-1',
        ),
        'exif-focalplaneresolutionunit' => array(
                'exif-focalplaneresolutionunit-2',
                'version-entrypoints-api-php',
                'version-entrypoints-load-php',
        ),
 -      'filepath' => array(
 -              'filepath',
 -              'filepath-page',
 -              'filepath-submit',
 -              'filepath-summary',
 +      'redirect' => array(
 +              'redirect',
 +              'redirect-legend',
 +              'redirect-text',
 +              'redirect-summary',
 +              'redirect-submit',
 +              'redirect-lookup',
 +              'redirect-value',
 +              'redirect-user',
 +              'redirect-revision',
 +              'redirect-file',
 +              'redirect-not-exists',
        ),
        'fileduplicatesearch' => array(
                'fileduplicatesearch',
                'htmlform-submit',
                'htmlform-reset',
                'htmlform-selectorother-other',
 +              'htmlform-no',
 +              'htmlform-yes',
 +              'htmlform-chosen-placeholder',
        ),
        'sqlite' => array(
                'sqlite-has-fts',
@@@ -3946,6 -3880,7 +3947,6 @@@ XHTML id names."
        'diffs'               => 'Diffs',
        'search'              => 'Search results',
        'opensearch'          => 'OpenSearch description',
 -      'quickbar'            => 'Quickbar',
        'preferences'         => 'Preferences page',
        'preferences-email'   => 'User preference: email validation using jQuery',
        'userrights'          => 'User rights',
        'deletedcontribs'     => 'Special:DeletedContributions',
        'linksearch'          => 'Special:LinkSearch',
        'listusers'           => 'Special:ListUsers',
 +      'activeusers'         => 'Special:ActiveUsers',
        'newuserlog'          => 'Special:Log/newusers',
        'listgrouprights'     => 'Special:ListGroupRights',
        'emailuser'           => 'Email user',
        'patrol-log'          => 'Patrol log',
        'imagedeletion'       => 'Image deletion',
        'browsediffs'         => 'Browsing diffs',
 -      'newfiles'           => 'Special:NewFiles',
 +      'newfiles'            => 'Special:NewFiles',
        'video-info'          => 'Video information, used by Language::formatTimePeriod() to format lengths in the above messages',
 +      'human-timestamps'    => 'Human-readable timestamps',
        'badimagelist'        => 'Bad image list',
        'variantname-zh'      => "Short names for language variants used for language conversion links.
 -To disable showing a particular link, set it to 'disable', e.g.
 -'variantname-zh-sg' => 'disable',
  Variants for Chinese language",
        'variantname-gan'      => 'Variants for Gan language',
        'variantname-sr'      => 'Variants for Serbian language',
        'variantname-shi'     => 'Variants for Tachelhit language',
        'media-info'          => 'Media information',
        'metadata'            => 'Metadata',
 -      'exif'                           => 'EXIF tags',
 +      'exif'                           => 'Exif tags',
        'exif-values'                    => 'Make & model, can be wikified in order to link to the camera and model name',
 -      'exif-compression'               => 'EXIF attributes',
 +      'exif-compression'               => 'Exif attributes',
        'exif-copyrighted'               => '',
        'exif-unknowndate'               => '',
        'exif-photometricinterpretation' => '',
        'signatures'            => 'Signatures',
        'CoreParserFunctions'   => 'Core parser functions',
        'version'               => 'Special:Version',
 -      'filepath'              => 'Special:FilePath',
 +      'redirect'              => 'Special:Redirect',
        'fileduplicatesearch'   => 'Special:FileDuplicateSearch',
        'special-specialpages'  => 'Special:SpecialPages',
        'special-blank'         => 'Special:BlankPage',