Merge "Migrate block log to new log system"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sun, 22 Feb 2015 00:46:35 +0000 (00:46 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sun, 22 Feb 2015 00:46:35 +0000 (00:46 +0000)
1  2 
autoload.php
includes/DefaultSettings.php
includes/logging/LogFormatter.php
languages/i18n/en.json
languages/i18n/qqq.json

diff --combined autoload.php
@@@ -18,7 -18,6 +18,7 @@@ $wgAutoloadLocalClasses = array
        'AnsiTermColorer' => __DIR__ . '/maintenance/term/MWTerm.php',
        'ApiBase' => __DIR__ . '/includes/api/ApiBase.php',
        'ApiBlock' => __DIR__ . '/includes/api/ApiBlock.php',
 +      'ApiCheckToken' => __DIR__ . '/includes/api/ApiCheckToken.php',
        'ApiClearHasMsg' => __DIR__ . '/includes/api/ApiClearHasMsg.php',
        'ApiComparePages' => __DIR__ . '/includes/api/ApiComparePages.php',
        'ApiCreateAccount' => __DIR__ . '/includes/api/ApiCreateAccount.php',
        'Blob' => __DIR__ . '/includes/db/DatabaseUtility.php',
        'Block' => __DIR__ . '/includes/Block.php',
        'BlockListPager' => __DIR__ . '/includes/specials/SpecialBlockList.php',
+       'BlockLogFormatter' => __DIR__ . '/includes/logging/BlockLogFormatter.php',
        'BloomCache' => __DIR__ . '/includes/cache/bloom/BloomCache.php',
        'BloomCacheRedis' => __DIR__ . '/includes/cache/bloom/BloomCacheRedis.php',
        'BloomFilterTitleHasLogs' => __DIR__ . '/includes/cache/bloom/BloomFilters.php',
        'DumpPipeOutput' => __DIR__ . '/includes/Export.php',
        'DumpRenderer' => __DIR__ . '/maintenance/renderDump.php',
        'DumpRev' => __DIR__ . '/maintenance/storage/dumpRev.php',
 -      'DumpSisterSites' => __DIR__ . '/maintenance/dumpSisterSites.php',
        'DuplicateJob' => __DIR__ . '/includes/jobqueue/jobs/DuplicateJob.php',
        'EditAction' => __DIR__ . '/includes/actions/EditAction.php',
        'EditCLI' => __DIR__ . '/maintenance/edit.php',
        'ImageQueryPage' => __DIR__ . '/includes/specialpage/ImageQueryPage.php',
        'ImportReporter' => __DIR__ . '/includes/specials/SpecialImport.php',
        'ImportSiteScripts' => __DIR__ . '/maintenance/importSiteScripts.php',
 +      'ImportSource' => __DIR__ . '/includes/Import.php',
        'ImportStreamSource' => __DIR__ . '/includes/Import.php',
        'ImportStringSource' => __DIR__ . '/includes/Import.php',
        'ImportTitleFactory' => __DIR__ . '/includes/title/ImportTitleFactory.php',
        'MWLoggerMonologProcessor' => __DIR__ . '/includes/debug/logger/monolog/Processor.php',
        'MWLoggerMonologSamplingHandler' => __DIR__ . '/includes/debug/logger/monolog/SamplingHandler.php',
        'MWLoggerMonologSpi' => __DIR__ . '/includes/debug/logger/monolog/Spi.php',
 +      'MWLoggerMonologSyslogHandler' => __DIR__ . '/includes/debug/logger/monolog/SyslogHandler.php',
        'MWLoggerNullSpi' => __DIR__ . '/includes/debug/logger/NullSpi.php',
        'MWLoggerSpi' => __DIR__ . '/includes/debug/logger/Spi.php',
        'MWMemcached' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
        'MediaHandler' => __DIR__ . '/includes/media/MediaHandler.php',
        'MediaStatisticsPage' => __DIR__ . '/includes/specials/SpecialMediaStatistics.php',
        'MediaTransformError' => __DIR__ . '/includes/media/MediaTransformOutput.php',
 +      'MediaTransformInvalidParametersException' => __DIR__ . '/includes/media/MediaTransformInvalidParametersException.php',
        'MediaTransformOutput' => __DIR__ . '/includes/media/MediaTransformOutput.php',
        'MediaWiki' => __DIR__ . '/includes/MediaWiki.php',
        'MediaWikiI18N' => __DIR__ . '/includes/skins/MediaWikiI18N.php',
        'MessageBlobStore' => __DIR__ . '/includes/MessageBlobStore.php',
        'MessageCache' => __DIR__ . '/includes/cache/MessageCache.php',
        'MessageContent' => __DIR__ . '/includes/content/MessageContent.php',
 +      'MessageSpecifier' => __DIR__ . '/includes/libs/MessageSpecifier.php',
        'MigrateUserGroup' => __DIR__ . '/maintenance/migrateUserGroup.php',
        'MimeMagic' => __DIR__ . '/includes/MimeMagic.php',
        'MinifyScript' => __DIR__ . '/maintenance/minify.php',
        'RebuildSitesCache' => __DIR__ . '/maintenance/rebuildSitesCache.php',
        'RebuildTextIndex' => __DIR__ . '/maintenance/rebuildtextindex.php',
        'RecentChange' => __DIR__ . '/includes/changes/RecentChange.php',
 +      'RecentChangesUpdateJob' => __DIR__ . '/includes/jobqueue/jobs/RecentChangesUpdateJob.php',
        'RecompressTracked' => __DIR__ . '/maintenance/storage/recompressTracked.php',
        'RedirectSpecialArticle' => __DIR__ . '/includes/specialpage/RedirectSpecialPage.php',
        'RedirectSpecialPage' => __DIR__ . '/includes/specialpage/RedirectSpecialPage.php',
        'RefreshImageMetadata' => __DIR__ . '/maintenance/refreshImageMetadata.php',
        'RefreshLinks' => __DIR__ . '/maintenance/refreshLinks.php',
        'RefreshLinksJob' => __DIR__ . '/includes/jobqueue/jobs/RefreshLinksJob.php',
 -      'RefreshLinksJob2' => __DIR__ . '/includes/jobqueue/jobs/RefreshLinksJob2.php',
        'RegexlikeReplacer' => __DIR__ . '/includes/libs/replacers/RegexlikeReplacer.php',
        'RemoveInvalidEmails' => __DIR__ . '/maintenance/removeInvalidEmails.php',
        'RemoveUnusedAccounts' => __DIR__ . '/maintenance/removeUnusedAccounts.php',
        'Site' => __DIR__ . '/includes/site/Site.php',
        'SiteArray' => __DIR__ . '/includes/site/SiteList.php',
        'SiteConfiguration' => __DIR__ . '/includes/SiteConfiguration.php',
 +      'SiteExporter' => __DIR__ . '/includes/site/SiteExporter.php',
 +      'SiteImporter' => __DIR__ . '/includes/site/SiteImporter.php',
        'SiteList' => __DIR__ . '/includes/site/SiteList.php',
        'SiteListFileCache' => __DIR__ . '/includes/site/SiteListFileCache.php',
        'SiteListFileCacheBuilder' => __DIR__ . '/includes/site/SiteListFileCacheBuilder.php',
        'StatCounter' => __DIR__ . '/includes/StatCounter.php',
        'StatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php',
        'Status' => __DIR__ . '/includes/Status.php',
 +      'StatusValue' => __DIR__ . '/includes/libs/StatusValue.php',
        'StorageTypeStats' => __DIR__ . '/maintenance/storage/storageTypeStats.php',
        'StoreFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
        'StreamFile' => __DIR__ . '/includes/StreamFile.php',
        'TablePager' => __DIR__ . '/includes/pager/TablePager.php',
        'TempFSFile' => __DIR__ . '/includes/filebackend/TempFSFile.php',
        'TempFileRepo' => __DIR__ . '/includes/filerepo/FileRepo.php',
 +      'TemplateParser' => __DIR__ . '/includes/TemplateParser.php',
        'TestFileOpPerformance' => __DIR__ . '/maintenance/fileOpPerfTest.php',
        'TextContent' => __DIR__ . '/includes/content/TextContent.php',
        'TextContentHandler' => __DIR__ . '/includes/content/TextContentHandler.php',
@@@ -1320,11 -1320,9 +1320,11 @@@ $wgDirectoryMode = 0777
   * Generate and use thumbnails suitable for screens with 1.5 and 2.0 pixel densities.
   *
   * This means a 320x240 use of an image on the wiki will also generate 480x360 and 640x480
 - * thumbnails, output via data-src-1-5 and data-src-2-0. Runtime JavaScript switches the
 - * images in after loading the original low-resolution versions depending on the reported
 - * window.devicePixelRatio.
 + * thumbnails, output via the srcset attribute.
 + *
 + * On older browsers, a JavaScript polyfill switches the appropriate images in after loading
 + * the original low-resolution versions depending on the reported window.devicePixelRatio.
 + * The polyfill can be found in the jquery.hidpi module.
   */
  $wgResponsiveImages = true;
  
@@@ -3543,9 -3541,6 +3543,9 @@@ $wgResourceLoaderExperimentalAsyncLoadi
   *
   * Changes to LESS variables do not trigger cache invalidation.
   *
 + * If the LESS variables need to be dynamic, you can use the
 + * ResourceLoaderGetLessVars hook (since 1.25).
 + *
   * @par Example:
   * @code
   *   $wgResourceLoaderLESSVars = array(
@@@ -6413,6 -6408,7 +6413,6 @@@ $wgHooks = array()
   */
  $wgJobClasses = array(
        'refreshLinks' => 'RefreshLinksJob',
 -      'refreshLinks2' => 'RefreshLinksJob2', // b/c
        'htmlCacheUpdate' => 'HTMLCacheUpdateJob',
        'sendMail' => 'EmaillingJob',
        'enotifNotify' => 'EnotifNotifyJob',
        'AssembleUploadChunks' => 'AssembleUploadChunksJob',
        'PublishStashedFile' => 'PublishStashedFileJob',
        'ThumbnailRender' => 'ThumbnailRenderJob',
 +      'recentChangesUpdate' => 'RecentChangesUpdateJob',
        'null' => 'NullJob'
  );
  
@@@ -6664,17 -6659,12 +6664,12 @@@ $wgLogHeaders = array
   * Extensions with custom log types may add to this array.
   */
  $wgLogActions = array(
-       'block/block' => 'blocklogentry',
-       'block/unblock' => 'unblocklogentry',
-       'block/reblock' => 'reblock-logentry',
        'protect/protect' => 'protectedarticle',
        'protect/modify' => 'modifiedarticleprotection',
        'protect/unprotect' => 'unprotectedarticle',
        'protect/move_prot' => 'movedarticleprotection',
        'import/upload' => 'import-logentry-upload',
        'import/interwiki' => 'import-logentry-interwiki',
-       'suppress/block' => 'blocklogentry',
-       'suppress/reblock' => 'reblock-logentry',
  );
  
  /**
@@@ -6704,6 -6694,11 +6699,11 @@@ $wgLogActionsHandlers = array
        'managetags/delete' => 'LogFormatter',
        'managetags/activate' => 'LogFormatter',
        'managetags/deactivate' => 'LogFormatter',
+       'block/block' => 'BlockLogFormatter',
+       'block/unblock' => 'BlockLogFormatter',
+       'block/reblock' => 'BlockLogFormatter',
+       'suppress/block' => 'BlockLogFormatter',
+       'suppress/reblock' => 'BlockLogFormatter',
  );
  
  /**
@@@ -80,9 -80,6 +80,9 @@@ class LogFormatter 
        /** @var int Constant for handling log_deleted */
        protected $audience = self::FOR_PUBLIC;
  
 +      /** @var IContextSource Context for logging */
 +      public $context;
 +
        /** @var bool Whether to output user tool links */
        protected $linkFlood = false;
  
                                        ->rawParams( $target, $parameters['4::dest'], $parameters['5::mergepoint'] )
                                        ->inContentLanguage()->escaped();
                                break;
+                       case 'block':
+                               switch ( $entry->getSubtype() ) {
+                                       case 'block':
+                                               global $wgContLang;
+                                               $duration = $wgContLang->translateBlockExpiry( $parameters['5::duration'] );
+                                               $flags = BlockLogFormatter::formatBlockFlags( $parameters['6::flags'], $wgContLang );
+                                               $text = wfMessage( 'blocklogentry' )
+                                                       ->rawParams( $target, $duration, $flags )->inContentLanguage()->escaped();
+                                               break;
+                                       case 'unblock':
+                                               $text = wfMessage( 'unblocklogentry' )
+                                                       ->rawParams( $target )->inContentLanguage()->escaped();
+                                               break;
+                                       case 'reblock':
+                                               global $wgContLang;
+                                               $duration = $wgContLang->translateBlockExpiry( $parameters['5::duration'] );
+                                               $flags = BlockLogFormatter::formatBlockFlags( $parameters['6::flags'], $wgContLang );
+                                               $text = wfMessage( 'reblock-logentry' )
+                                                       ->rawParams( $target, $duration, $flags )->inContentLanguage()->escaped();
+                                               break;
+                               }
+                               break;
                        // case 'suppress' --private log -- aaron  (so we know who to blame in a few years :-D)
                        // default:
                }
                return $this->context->msg( $key );
        }
  
-       protected function makeUserLink( User $user ) {
+       protected function makeUserLink( User $user, $toolFlags = 0 ) {
                if ( $this->plaintext ) {
                        $element = $user->getName();
                } else {
                        );
  
                        if ( $this->linkFlood ) {
-                               $element .= Linker::userToolLinksRedContribs(
+                               $element .= Linker::userToolLinks(
                                        $user->getId(),
                                        $user->getName(),
+                                       true, // redContribsWhenNoEdits
+                                       $toolFlags,
                                        $user->getEditCount()
                                );
                        }
@@@ -758,29 -780,7 +783,7 @@@ class LegacyLogFormatter extends LogFor
                $type = $this->entry->getType();
                $subtype = $this->entry->getSubtype();
  
-               // Show unblock/change block link
-               if ( ( $type == 'block' || $type == 'suppress' )
-                       && ( $subtype == 'block' || $subtype == 'reblock' )
-               ) {
-                       if ( !$this->context->getUser()->isAllowed( 'block' ) ) {
-                               return '';
-                       }
-                       $links = array(
-                               Linker::linkKnown(
-                                       SpecialPage::getTitleFor( 'Unblock', $title->getDBkey() ),
-                                       $this->msg( 'unblocklink' )->escaped()
-                               ),
-                               Linker::linkKnown(
-                                       SpecialPage::getTitleFor( 'Block', $title->getDBkey() ),
-                                       $this->msg( 'change-blocklink' )->escaped()
-                               )
-                       );
-                       return $this->msg( 'parentheses' )->rawParams(
-                               $this->context->getLanguage()->pipeList( $links ) )->escaped();
-               // Show change protection link
-               } elseif ( $type == 'protect'
+               if ( $type == 'protect'
                        && ( $subtype == 'protect' || $subtype == 'modify' || $subtype == 'unprotect' )
                ) {
                        $links = array(
diff --combined languages/i18n/en.json
        "revdelete-uname-unhid": "username unhidden",
        "revdelete-restricted": "applied restrictions to administrators",
        "revdelete-unrestricted": "removed restrictions for administrators",
+       "logentry-block-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} with an expiry time of $5 $6",
+       "logentry-block-unblock": "$1 {{GENDER:$2|unblocked}} {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiry time of $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} with an expiry time of $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiry time of $5 $6",
        "logentry-merge-merge": "$1 {{GENDER:$2|merged}} $3 into $4 (revisions up to $5)",
        "logentry-move-move": "$1 {{GENDER:$2|moved}} page $3 to $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|moved}} page $3 to $4 without leaving a redirect",
        "json-error-utf8": "Malformed UTF-8 characters, possibly incorrectly encoded",
        "json-error-recursion": "One or more recursive references in the value to be encoded",
        "json-error-inf-or-nan": "One or more NAN or INF values in the value to be encoded",
 -      "json-error-unsupported-type": "A value of a type that cannot be encoded was given"
 +      "json-error-unsupported-type": "A value of a type that cannot be encoded was given",
 +      "headline-anchor-title": "Link to this section",
 +      "section-symbol": "ยง"
  }
diff --combined languages/i18n/qqq.json
        "textmatches": "When displaying search results",
        "notextmatches": "Error message when there are no results",
        "prevn": "This is part of the navigation message on the top and bottom of Special pages (lists of things in alphabetical order, i.e. the '[[Special:Categories]]' page), where it is used as the first argument of {{msg-mw|Viewprevnext}}.\nIt is also used by Category pages (which do ''not'' use {{msg-mw|Viewprevnext}}).\n{{PLURAL:$1|$1}} is the number of items shown per page. It is not used when {{PLURAL:$1|$1}} is zero; not sure what happens when {{PLURAL:$1|$1}} is one.\n[[Special:WhatLinksHere|Whatlinkshere]] pages use {{msg-mw|Whatlinkshere-prev}} instead (still as an argument to {{msg-mw|Viewprevnext}}).\n\n{{Identical|Previous}}",
 -      "nextn": "This is part of the navigation message on the top and bottom of Special pages (lists of things in alphabetical order, i.e. the '[[Special:Categories]]' page), where it is used as the second argument of {{msg-mw|Viewprevnext}}.\n\nIt is also used by Category pages (which do ''not'' use {{msg-mw|Viewprevnext}}).\n\nParameters:\n* $1 - the number of items shown per page. It is not used when $1 is zero; not sure what happens when $1 is one.\n[[Special:WhatLinksHere|Whatlinkshere]] pages use {{msg-mw|Whatlinkshere-next}} instead (still as an argument to {{msg-mw|Viewprevnext}}).\n\n{{Identical|Next $1}}",
 +      "nextn": "This is part of the navigation message on the top and bottom of Special pages (lists of things in alphabetical order, i.e. the '[[Special:Categories]]' page), where it is used as the second argument of {{msg-mw|Viewprevnext}}.\n\nIt is also used by Category pages (which do ''not'' use {{msg-mw|Viewprevnext}}).\n\nParameters:\n* $1 - the number of items shown per page. It is not used when $1 is zero; not sure what happens when $1 is one.\n[[Special:WhatLinksHere|Whatlinkshere]] pages use {{msg-mw|Whatlinkshere-next}} instead (still as an argument to {{msg-mw|Viewprevnext}}).\n\n{{Identical|Next}}",
        "prevn-title": "Parameters:\n* $1 - number of search results\nSee also:\n* {{msg-mw|Viewprevnext}}",
        "nextn-title": "Parameters:\n* $1 - number of search results\nSee also:\n* {{msg-mw|Viewprevnext}}",
        "shown-title": "Parameters:\n* $1 - number of search results",
        "usermessage-summary": "This message is used as an edit summary for any message that is posted because of a system event. Translate \"leaving a message\" in the sense of: to give a message to someone; to deliver a message somewhere; to deposit.",
        "usermessage-editor": "The user name for the user that is the editor of system messages. See [{{canonicalurl:Thread:Support/Message_info_please}} discussion on Support].",
        "usermessage-template": "{{optional}}",
 -      "watchlist": "{{Identical|Watchlist}}",
 +      "watchlist": "Title of the Special:Watchlist page.\n\n{{Identical|Watchlist}}",
        "watchlist-summary": "{{doc-specialpagesummary|watchlist}}",
        "mywatchlist": "Link at the upper right corner of the screen.\n\nSee also:\n* {{msg-mw|Mywatchlist}}\n* {{msg-mw|Accesskey-pt-watchlist}}\n* {{msg-mw|Tooltip-pt-watchlist}}\n{{Identical|Watchlist}}",
        "watchlistfor2": "Subtitle on [[Special:Watchlist]].\nParameters:\n* $1 - Username of current user\n* $2 - Tool links (View relevant changes | View and edit watchlist | Edit raw watchlist)\n{{Identical|For $1}}",
        "blocklogpage": "{{doc-logpage}}\n\nThe page name of [[Special:Log/block]]. Also appears in the drop down menu of [[Special:Log]] pages and in the action links of Special:Contributions/''Username'' pages (e.g. \"For Somebody (talk | block log | logs)\").\n\n{{Identical|Block log}}",
        "blocklog-showlog": "Parameters:\n* $1 - (Optional) the blocked user. Can be used for GENDER\nSee also:\n* {{msg-mw|Blocklog-showsuppresslog}}\n* {{msg-mw|Globalblocking-showlog}}",
        "blocklog-showsuppresslog": "Parameters:\n* $1 - (Optional) the blocked user. Can be used for GENDER",
-       "blocklogentry": "This is the text of an entry in the Block log, and recent changes, after hour (and date, only in the Block log) and sysop name:\n* $1 - the blocked user or IP (with link to contributions and talk)\n* $2 - the duration of the block (hours, days etc.) or the specified expiry date\n* $3 - contains \"(details) (''reason'')\", or empty string\nSee also:\n* {{msg-mw|Unblocklogentry}}\n* {{msg-mw|Reblock-logentry}}",
-       "reblock-logentry": "This is the text of an entry in the Block log (and Recent Changes), after hour (and date, only in the Block log) and sysop name.\n\nParameters:\n* $1 - the user being reblocked\n* $2 - the expiry time of the block\n* $3 - extra parameters like \"account creation blocked\" (they are automatically between brackets)",
+       "blocklogentry": "This is ''logentry'' message only used on IRC.\n* $1 - the blocked user or IP (with link to contributions and talk)\n* $2 - the duration of the block (hours, days etc.) or the specified expiry date\n* $3 - contains \"(details) (''reason'')\", or empty string\nSee also:\n* {{msg-mw|Unblocklogentry}}\n* {{msg-mw|Reblock-logentry}}",
+       "reblock-logentry": "This is ''logentry'' message only used on IRC.\n\nParameters:\n* $1 - the user being reblocked\n* $2 - the expiry time of the block\n* $3 - extra parameters like \"account creation blocked\" (they are automatically between brackets)",
        "blocklogtext": "Appears on top of [[Special:Log/block]].",
-       "unblocklogentry": "This is the text of an entry in the Block log (and Recent Changes), after hour (and date, only in the Block log) and sysop name:\n* $1 is the user being unblocked",
+       "unblocklogentry": "This is ''logentry'' message only used on IRC.\n* $1 is the user being unblocked",
        "block-log-flags-anononly": "Used as a block log flag in [[Special:Log/block]] and in [[Special:Block]].\n\nSee also:\n* {{msg-mw|Anononlyblock}}\n{{Related|Block-log-flags}}",
        "block-log-flags-nocreate": "Used as a block log flag in [[Special:Log/block]] and in [[Special:Block]].\n\nSee also:\n* {{msg-mw|Createaccountblock}}\n{{Related|Block-log-flags}}",
        "block-log-flags-noautoblock": "Used as a block log flag in [[Special:Log/block]] and in [[Special:Block]].\n{{Related|Block-log-flags}}\n{{Identical|Autoblock disabled}}",
        "tags-tag": "Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
        "tags-display-header": "Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
        "tags-description-header": "Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
 -      "tags-source-header": "Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
 +      "tags-source-header": "Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].\n{{Identical|Source}}",
        "tags-active-header": "Caption of a column in [[Special:Tags]]. Values are \"Yes\" or \"No\" to indicate if a tag that was ever used is current still registered.\n\nSee example: [[mw:Special:Tags]].\n\nFor more information on tags see [[mw:Manual:Tags|MediaWiki]].\n{{Identical|Active}}",
        "tags-hitcount-header": "Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
 -      "tags-actions-header": "Caption of a column in [[Special:Tags]]. The column contains action links like \"delete\". For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
 +      "tags-actions-header": "Caption of a column in [[Special:Tags]]. The column contains action links like \"delete\". For more information on tags see [[mw:Manual:Tags|MediaWiki]].\n{{Identical|Action}}",
        "tags-active-yes": "Table cell contents if given tag is \"active\".\n\nSee also:\n* {{msg-mw|Tags-active-no}}\n{{Identical|Yes}}",
        "tags-active-no": "Table cell contents if given tag is not \"active\".\n\nSee also:\n* {{msg-mw|Tags-active-yes}}\n{{Identical|No}}",
        "tags-source-extension": "Table cell contents if given tag can be applied automatically by a software [[mw:Manual:Extensions|extension]].\n\nSee also:\n* {{msg-mw|Tags-source-manual}}\n* {{msg-mw|Tags-source-none}}",
        "tags-create-explanation": "The first paragraph of an explanation to tell users what they are about to do.",
        "tags-create-tag-name": "Form field label for the name of the tag to be created.",
        "tags-create-reason": "{{Identical|Reason}}",
 -      "tags-create-submit": "The label of the form \"submit\" button when the user is about to create a tag.",
 +      "tags-create-submit": "The label of the form \"submit\" button when the user is about to create a tag.\n{{Identical|Create}}",
        "tags-create-no-name": "Error message on [[Special:Tags]]",
        "tags-create-invalid-chars": "Error message on [[Special:Tags]]",
        "tags-create-invalid-title-chars": "Error message on [[Special:Tags]]",
        "tags-activate-reason": "{{Identical|Reason}}",
        "tags-activate-not-allowed": "Error message on [[Special:Tags]]",
        "tags-activate-not-found": "Error message on [[Special:Tags]]",
 -      "tags-activate-submit": "The label of the form \"submit\" button when the user is about to activate a tag.",
 +      "tags-activate-submit": "The label of the form \"submit\" button when the user is about to activate a tag.\n{{Identical|Activate}}",
        "tags-deactivate-title": "The title of a page used to deactivate a tag. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
        "tags-deactivate-question": "An explanation to tell users what they are about to do.\n\nParameters:\n* $1 - the code name of the tag that is about to be deactivated",
        "tags-deactivate-reason": "{{Identical|Reason}}",
        "tags-deactivate-not-allowed": "Error message on [[Special:Tags]]",
 -      "tags-deactivate-submit": "The label of the form \"submit\" button when the user is about to deactivate a tag.",
 +      "tags-deactivate-submit": "The label of the form \"submit\" button when the user is about to deactivate a tag.\n{{Identical|Deactivate}}",
        "comparepages": "The title of [[Special:ComparePages]]",
        "comparepages-summary": "{{doc-specialpagesummary|comparepages}}",
        "compare-page1": "Label for the field of the 1st page in the comparison for [[Special:ComparePages]]\n{{Identical|Page}}",
        "revdelete-uname-unhid": "Used on\n* {{msg-mw|logentry-delete-event}}\n* {{msg-mw|logentry-delete-revision}}\n* {{msg-mw|logentry-suppress-event}}\n* {{msg-mw|logentry-suppress-event}}",
        "revdelete-restricted": "Used as <code>$4</code> in the following messages when setting visibility restrictions for administrators:\n* {{msg-mw|Logentry-delete-event}}\n* {{msg-mw|Logentry-delete-revision}}\n* {{msg-mw|Logentry-suppress-event}}\n* {{msg-mw|Logentry-suppress-event}}",
        "revdelete-unrestricted": "Used as <code>$4</code> in the following messages when setting visibility restrictions for administrators:\n* {{msg-mw|Logentry-delete-event}}\n* {{msg-mw|Logentry-delete-revision}}\n* {{msg-mw|Logentry-suppress-event}}\n* {{msg-mw|Logentry-suppress-event}}",
+       "logentry-block-block": "{{Logentry|[[Special:Log/block]]}}\n* $4 - user name for gender or empty string for autoblocks\n* $5 - the block duration, localized and formatted with the english tooltip\n* $6 - block detail flags or empty string",
+       "logentry-block-unblock": "{{Logentry|[[Special:Log/block]]}}\n* $4 - user name for gender or empty string for autoblocks",
+       "logentry-block-reblock": "{{Logentry|[[Special:Log/block]]}}\n* $4 - user name for gender or empty string for autoblocks\n* $5 - the block duration, localized and formatted with the english tooltip\n* $6 - block detail flags or empty string",
+       "logentry-suppress-block": "{{Logentry}}\n* $4 - user name for gender or empty string for autoblocks\n* $5 - the block duration, localized and formatted with the english tooltip\n* $6 - block detail flags or empty string",
+       "logentry-suppress-reblock": "{{Logentry}}\n* $4 - user name for gender or empty string for autoblocks\n* $5 - the block duration, localized and formatted with the english tooltip\n* $6 - block detail flags or empty string",
        "logentry-merge-merge": "{{Logentry|[[Special:Log/merge]]}}\n* $4 - the page into which the content is merged\n* $5 - a timestamp of limit\n\nThe log and its associated special page 'MergeHistory' is not enabled by default.\n\nPlease note that the parameters in a log entry will appear in the log only in the default language of the wiki. View [[Special:Log]] for examples on translatewiki.net with English default language.",
        "logentry-move-move": "{{Logentry|[[Special:Log/move]]}}\nParameter $4, the target page, is also not visible to parser functions.",
        "logentry-move-move-noredirect": "{{Logentry|[[Special:Log/move]]}}\nParameter $4, the target page, is also not visible to parser functions.",