to stop it from replace an already existing default sort, and suppress error.
* (bug 30364) LanguageConverter now depends on the page content language
instead of the wiki content language
+* (bug 18578) Rewrote revision delete related messages to allow better
+ localisation
=== Bug fixes in 1.19 ===
* $wgUploadNavigationUrl should be used for file redlinks if
'ManualLogEntry' => 'includes/logging/LogEntry.php',
'LogFormatter' => 'includes/logging/LogFormatter.php',
'LegacyLogFormatter' => 'includes/logging/LogFormatter.php',
+ 'DeleteLogFormatter' => 'includes/logging/LogFormatter.php',
'MoveLogFormatter' => 'includes/logging/LogFormatter.php',
# includes/media
'protect/move_prot' => 'movedarticleprotection',
'rights/rights' => 'rightslogentry',
'rights/autopromote' => 'rightslogentry-autopromote',
- 'delete/delete' => 'deletedarticle',
- 'delete/restore' => 'undeletedarticle',
- 'delete/revision' => 'revdelete-logentry',
- 'delete/event' => 'logdelete-logentry',
'upload/upload' => 'uploadedimage',
'upload/overwrite' => 'overwroteimage',
'upload/revert' => 'uploadedimage',
'import/upload' => 'import-logentry-upload',
'import/interwiki' => 'import-logentry-interwiki',
'merge/merge' => 'pagemerge-logentry',
- 'suppress/revision' => 'revdelete-logentry',
- 'suppress/file' => 'revdelete-logentry',
- 'suppress/event' => 'logdelete-logentry',
- 'suppress/delete' => 'suppressedarticle',
'suppress/block' => 'blocklogentry',
'suppress/reblock' => 'reblock-logentry',
'patrol/patrol' => 'patrol-log-line',
*/
$wgLogActionsHandlers = array(
// move, move_redir
- 'move/*' => 'MoveLogFormatter',
+ 'move/*' => 'MoveLogFormatter',
+ // delete, restore, revision, event
+ 'delete/*' => 'DeleteLogFormatter',
+ 'suppress/revision' => 'DeleteLogFormatter',
+ 'suppress/event' => 'DeleteLogFormatter',
+ 'suppress/delete' => 'DeleteLogFormatter',
);
/**
if( $params[2] ) {
$details .= ' [' . wfMsgExt( 'protect-summary-cascade', array( 'parsemag', 'language' => $langObj ) ) . ']';
}
- // Page moves
- } elseif ( $type == 'move' && count( $params ) == 3 ) {
- if( $params[2] ) {
- $details .= ' [' . wfMsgExt( 'move-redirect-suppressed', array( 'parsemag', 'language' => $langObj ) ) . ']';
- }
- // Revision deletion
- } elseif ( preg_match( '/^(delete|suppress)\/revision$/', $key ) && count( $params ) == 5 ) {
- $count = substr_count( $params[2], ',' ) + 1; // revisions
- $ofield = intval( substr( $params[3], 7 ) ); // <ofield=x>
- $nfield = intval( substr( $params[4], 7 ) ); // <nfield=x>
- $details .= ': ' . RevisionDeleter::getLogMessage( $count, $nfield, $ofield, $langObj, false );
- // Log deletion
- } elseif ( preg_match( '/^(delete|suppress)\/event$/', $key ) && count( $params ) == 4 ) {
- $count = substr_count( $params[1], ',' ) + 1; // log items
- $ofield = intval( substr( $params[2], 7 ) ); // <ofield=x>
- $nfield = intval( substr( $params[3], 7 ) ); // <nfield=x>
- $details .= ': ' . RevisionDeleter::getLogMessage( $count, $nfield, $ofield, $langObj, true );
}
$rv = wfMsgExt( $wgLogActions[$key], array( 'parsemag', 'escape', 'replaceafter', 'language' => $langObj ), $params ) . $details;
# Log the deletion, if the page was suppressed, log it at Oversight instead
$logtype = $suppress ? 'suppress' : 'delete';
- $log = new LogPage( $logtype );
- # Make sure logging got through
- $log->addEntry( 'delete', $this->mTitle, $reason, array() );
+ $logEntry = new ManualLogEntry( $logtype, 'delete' );
+ $logEntry->setPerformer( $user );
+ $logEntry->setTarget( $this->mTitle );
+ $logEntry->setComment( $reason );
+ $logid = $logEntry->insert();
+ $logEntry->publish( $logid );
if ( $commit ) {
$dbw->commit();
* @return Message|pre-escaped html
*/
protected function getActionMessage() {
- $message = $this->msg( $this->getMessageKey() );
+ $message = $this->msg( $this->getMessageKey() );
$message->params( $this->getMessageParameters() );
return $message;
}
* @return array
*/
protected function getMessageParameters() {
+ if ( isset( $this->parsedParameters ) ) {
+ return $this->parsedParameters;
+ }
+
$entry = $this->entry;
$params = array();
}
}
- return $params;
+ return $this->parsedParameters = $params;
}
/**
return $params;
}
}
+
+/**
+ * This class formats delete log entries.
+ * @since 1.19
+ */
+class DeleteLogFormatter extends LogFormatter {
+ protected function getMessageKey() {
+ $key = parent::getMessageKey();
+ if ( in_array( $this->entry->getSubtype(), array( 'event', 'revision' ) ) ) {
+ if ( count( $this->getMessageParameters() ) < 5 ) {
+ return "$key-legacy";
+ }
+ }
+ return $key;
+ }
+
+ protected function getMessageParameters() {
+ if ( isset( $this->parsedParametersDeleteLog ) ) {
+ return $this->parsedParametersDeleteLog;
+ }
+
+ $params = parent::getMessageParameters();
+ $subtype = $this->entry->getSubtype();
+ if ( in_array( $subtype, array( 'event', 'revision' ) ) ) {
+ if ( count( $params ) > 5 ) {
+ $paramStart = $subtype === 'revision' ? 4 : 3;
+
+ $old = $this->parseBitField( $params[$paramStart+1] );
+ $new = $this->parseBitField( $params[$paramStart+2] );
+ list( $hid, $unhid, $extra ) = RevisionDeleter::getChanges( $new, $old );
+ $changes = array();
+ foreach ( $hid as $v ) {
+ $changes[] = $this->msg( "$v-hid" )->plain();
+ }
+ foreach ( $unhid as $v ) {
+ $changes[] = $this->msg( "$v-unhid" )->plain();
+ }
+ foreach ( $extra as $v ) {
+ $changes[] = $this->msg( $v )->plain();
+ }
+ $changeText = $this->context->getLang()->listToText( $changes );
+
+
+ $newParams = array_slice( $params, 0, 3 );
+ $newParams[3] = $changeText;
+ $count = count( explode( ',', $params[$paramStart] ) );
+ $newParams[4] = $this->context->getLang()->formatNum( $count );
+ return $this->parsedParametersDeleteLog = $newParams;
+ } else {
+ return $this->parsedParametersDeleteLog = array_slice( $params, 0, 3 );
+ }
+ }
+
+ return $this->parsedParametersDeleteLog = $params;
+ }
+
+ protected function parseBitField( $string ) {
+ // Input is like ofield=2134 or just the number
+ if ( strpos( $string, 'field=' ) === 1 ) {
+ list( , $field ) = explode( '=', $string );
+ return (int) $field;
+ } else {
+ return (int) $string;
+ }
+ }
+}
/**
* Gets an array of message keys describing the changes made to the visibility
* of the revision. If the resulting array is $arr, then $arr[0] will contain an
- * array of strings describing the items that were hidden, $arr[2] will contain
- * an array of strings describing the items that were unhidden, and $arr[3] will
+ * array of strings describing the items that were hidden, $arr[1] will contain
+ * an array of strings describing the items that were unhidden, and $arr[2] will
* contain an array with a single string, which can be one of "applied
* restrictions to sysops", "removed restrictions from sysops", or null.
*
* @param $n Integer: the new bitfield.
* @param $o Integer: the old bitfield.
* @return An array as described above.
+ * @since 1.19 public
*/
- protected static function getChanges( $n, $o ) {
+ public static function getChanges( $n, $o ) {
$diff = $n ^ $o;
$ret = array( 0 => array(), 1 => array(), 2 => array() );
// Build bitfield changes in language
return $ret;
}
- /**
- * Gets a log message to describe the given revision visibility change. This
- * message will be of the form "[hid {content, edit summary, username}];
- * [unhid {...}][applied restrictions to sysops] for $count revisions: $comment".
- *
- * @param $count Integer: The number of effected revisions.
- * @param $nbitfield Integer: The new bitfield for the revision.
- * @param $obitfield Integer: The old bitfield for the revision.
- * @param $language Language object to use
- * @param $isForLog Boolean
- */
- public static function getLogMessage( $count, $nbitfield, $obitfield, $language, $isForLog = false ) {
- $changes = self::getChanges( $nbitfield, $obitfield );
- array_walk( $changes, array( __CLASS__, 'expandMessageArray' ), $language );
-
- $changesText = array();
-
- if( count( $changes[0] ) ) {
- $changesText[] = wfMsgExt( 'revdelete-hid', array( 'parsemag', 'language' => $language ), $language->commaList( $changes[0] ) );
- }
- if( count( $changes[1] ) ) {
- $changesText[] = wfMsgExt( 'revdelete-unhid', array( 'parsemag', 'language' => $language ), $language->commaList( $changes[1] ) );
- }
-
- $s = $language->semicolonList( $changesText );
- if( count( $changes[2] ) ) {
- $s .= $s ? ' (' . $changes[2][0] . ')' : ' ' . $changes[2][0];
- }
-
- $msg = $isForLog ? 'logdelete-log-message' : 'revdelete-log-message';
- return wfMsgExt( $msg, array( 'parsemag', 'language' => $language ), $s, $language->formatNum($count) );
- }
-
- private static function expandMessageArray( &$msg, $key, $language ) {
- if ( is_array ( $msg ) ) {
- array_walk( $msg, array( __CLASS__, 'expandMessageArray' ), $language );
- } else {
- $msg = wfMsgExt( $msg, array( 'parsemag', 'language' => $language ) );
- }
- }
-
// Get DB field name for URL param...
// Future code for other things may also track
// other types of revision-specific changes.
'revdelete-unsuppress' => 'Remove restrictions on restored revisions',
'revdelete-log' => 'Reason:',
'revdelete-submit' => 'Apply to selected {{PLURAL:$1|revision|revisions}}',
-'revdelete-logentry' => 'changed revision visibility of "[[$1]]"',
-'logdelete-logentry' => 'changed event visibility of "[[$1]]"',
'revdelete-success' => "'''Revision visibility successfully updated.'''",
'revdelete-failure' => "'''Revision visibility could not be updated:'''
$1",
'revdel-restore-visible' => 'visible revisions',
'pagehist' => 'Page history',
'deletedhist' => 'Deleted history',
-'revdelete-content' => 'content',
-'revdelete-summary' => 'edit summary',
-'revdelete-uname' => 'username',
-'revdelete-restricted' => 'applied restrictions to administrators',
-'revdelete-unrestricted' => 'removed restrictions for administrators',
-'revdelete-hid' => 'hid $1',
-'revdelete-unhid' => 'unhid $1',
-'revdelete-log-message' => '$1 for $2 {{PLURAL:$2|revision|revisions}}',
-'logdelete-log-message' => '$1 for $2 {{PLURAL:$2|event|events}}',
'revdelete-hide-current' => 'Error hiding the item dated $2, $1: this is the current revision.
It cannot be hidden.',
'revdelete-show-no-access' => 'Error showing the item dated $2, $1: this item has been marked "restricted".
'actionfailed' => 'Action failed',
'deletedtext' => '"$1" has been deleted.
See $2 for a record of recent deletions.',
-'deletedarticle' => 'deleted "[[$1]]"',
-'suppressedarticle' => 'suppressed "[[$1]]"',
'dellogpage' => 'Deletion log',
'dellogpagetext' => 'Below is a list of the most recent deletions.',
'deletionlog' => 'deletion log',
'undeletereset' => 'Reset',
'undeleteinvert' => 'Invert selection',
'undeletecomment' => 'Reason:',
-'undeletedarticle' => 'restored "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|1 revision|$1 revisions}} restored',
'undeletedrevisions-files' => '{{PLURAL:$1|1 revision|$1 revisions}} and {{PLURAL:$2|1 file|$2 files}} restored',
'undeletedfiles' => '{{PLURAL:$1|1 file|$1 files}} restored',
'sqlite-no-fts' => '$1 without full-text search support',
# New logging system
+'logentry-delete-delete' => '$1 {{GENDER:$2|deleted}} page $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|restored}} page $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|changed}} visibility of log events on $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|changed}} visibility of revisions on page $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|supressed}} page $3',
+'logentry-suppress-event' => '$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4',
+'logentry-suppress-revision' => '$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4',
+'logentry-suppress-event-legacy' => '$1 secretly {{GENDER:$2|changed}} visibility of log events on $3',
+'logentry-suppress-revision-legacy' => '$1 secretly {{GENDER:$2|changed}} visibility of revisions on page $3',
+'revdelete-content-hid' => 'content hidden',
+'revdelete-summary-hid' => 'edit summary hidden',
+'revdelete-uname-hid' => 'username hidden',
+'revdelete-content-unhid' => 'content unhidden',
+'revdelete-summary-unhid' => 'edit summary unhidden',
+'revdelete-uname-unhid' => 'username unhidden',
+'revdelete-restricted' => 'applied restrictions to administrators',
+'revdelete-unrestricted' => 'removed restrictions for administrators',
'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',
'logentry-move-move_redir' => '$1 {{GENDER:$2|moved}} page $3 to $4 over redirect',
'revdelete-unsuppress' => 'Poista rajoitukset palautetuilta versiolta',
'revdelete-log' => 'Syy',
'revdelete-submit' => 'Toteuta {{PLURAL:$1|valittuun versioon|valittuihin versioihin}}',
-'revdelete-logentry' => 'muutti sivun [[$1]] version näkyvyyttä',
-'logdelete-logentry' => 'muutti sivun [[$1]] näkyvyyttä',
'revdelete-success' => "'''Version näkyvyys päivitetty.'''",
'revdelete-failure' => "'''Version näkyvyyttä ei voitu päivittää:'''
$1",
'revdel-restore-visible' => 'näkyvät muutokset',
'pagehist' => 'Sivun muutoshistoria',
'deletedhist' => 'Poistettujen versioiden historia',
-'revdelete-content' => 'sisällön',
-'revdelete-summary' => 'yhteenvedon',
-'revdelete-uname' => 'käyttäjänimen',
-'revdelete-restricted' => 'asetti rajoitukset ylläpitäjille',
-'revdelete-unrestricted' => 'poisti rajoitukset ylläpitäjiltä',
-'revdelete-hid' => 'piilotti $1',
-'revdelete-unhid' => 'palautti näkyviin $1',
-'revdelete-log-message' => '$1 koskien $2 {{PLURAL:$2|versiota}}',
-'logdelete-log-message' => '$1 koskien $2 {{PLURAL:$2|tapahtumaa}}',
'revdelete-hide-current' => 'Virhe tapahtui $2, $1 päivätyn kohteen piilottamisessa: tämä on nykyinen versio. Sitä ei voi piilottaa.',
'revdelete-show-no-access' => 'Virhe näyttäessä kohtaa $2 kello $1: kohta on merkitty ”rajoitetuksi”.
Sinulla ei ole oikeutta siihen.',
'actionfailed' => 'Toiminto epäonnistui',
'deletedtext' => '”$1” on poistettu.
Sivulla $2 on lista viimeaikaisista poistoista.',
-'deletedarticle' => 'poisti sivun [[$1]]',
-'suppressedarticle' => 'häivytti sivun [[$1]]',
'dellogpage' => 'Poistoloki',
'dellogpagetext' => 'Alla on loki viimeisimmistä poistoista.',
'deletionlog' => 'poistoloki',
'undeletereset' => 'Tyhjennä',
'undeleteinvert' => 'Käänteinen valinta',
'undeletecomment' => 'Syy',
-'undeletedarticle' => 'palautti sivun [[$1]]',
'undeletedrevisions' => '{{PLURAL:$1|Yksi versio|$1 versiota}} palautettiin',
'undeletedrevisions-files' => '{{PLURAL:$1|Yksi versio|$1 versiota}} ja {{PLURAL:$2|yksi tiedosto|$2 tiedostoa}} palautettiin',
'undeletedfiles' => '{{PLURAL:$1|1 tiedosto|$1 tiedostoa}} palautettiin',
'sqlite-has-fts' => '$1, jossa on tuki kokotekstihaulle',
'sqlite-no-fts' => '$1, jossa ei ole tukea kokotekstihaulle',
+# New logging system
+'logentry-delete-delete' => '$1 poisti sivun $3',
+'logentry-delete-restore' => '$1 palautti sivun $3',
+'logentry-delete-event' => '$1 muutti {{PLURAL:$5||$5}} lokitapahtuman näkyvyyttä $3: $4',
+'logentry-delete-revision' => '$1 muutti {{PLURAL:$5||$5}} muutoksen näkyvyyttä sivulla $3: $4',
+'logentry-delete-event-legacy' => '$1 muutti lokitapahtumien näkyvyyttä $3',
+'logentry-delete-revision-legacy' => '$1 muutti sivun $3 muutosten näkyvyyttä',
+'revdelete-content-hid' => 'sisältö piilotettu',
+'revdelete-summary-hid' => 'muokkausyhteenveto piilotettu',
+'revdelete-uname-hid' => 'käyttäjätunnus piilotettu',
+'revdelete-content-unhid' => 'sisältö palautettu näkyviin',
+'revdelete-summary-unhid' => 'muokkausyhteenveto palautettu näkyviin',
+'revdelete-uname-unhid' => 'käyttäjätunnus palautettu näkyviin',
+'revdelete-restricted' => 'asetti rajoitukset ylläpitäjille',
+'revdelete-unrestricted' => 'poisti rajoitukset ylläpitäjiltä',
+
);
'revdelete-unsuppress',
'revdelete-log',
'revdelete-submit',
- 'revdelete-logentry',
- 'logdelete-logentry',
- 'revdelete-logaction',
- 'logdelete-logaction',
'revdelete-success',
'revdelete-failure',
'logdelete-success',
'revdel-restore-visible',
'pagehist',
'deletedhist',
- 'revdelete-content',
- 'revdelete-summary',
- 'revdelete-uname',
- 'revdelete-restricted',
- 'revdelete-unrestricted',
- 'revdelete-hid',
- 'revdelete-unhid',
- 'revdelete-log-message',
- 'logdelete-log-message',
'revdelete-hide-current',
'revdelete-show-no-access',
'revdelete-modify-no-access',
'actioncomplete',
'actionfailed',
'deletedtext',
- 'deletedarticle',
- 'suppressedarticle',
'dellogpage',
'dellogpagetext',
'deletionlog',
'undeletereset',
'undeleteinvert',
'undeletecomment',
- 'undeletedarticle',
'undeletedrevisions',
'undeletedrevisions-files',
'undeletedfiles',
'confirm-unwatch-button',
),
'logging' => array(
+ 'logentry-delete-delete',
+ 'logentry-delete-restore',
+ 'logentry-delete-event',
+ 'logentry-delete-revision',
+ 'logentry-delete-event-legacy',
+ 'logentry-delete-revision-legacy',
+ 'logentry-suppress-delete',
+ 'logentry-suppress-event',
+ 'logentry-suppress-revision',
+ 'logentry-suppress-event-legacy',
+ 'logentry-suppress-revision-legacy',
+ 'revdelete-content-hid',
+ 'revdelete-summary-hid',
+ 'revdelete-uname-hid',
+ 'revdelete-content-unhid',
+ 'revdelete-summary-unhid',
+ 'revdelete-uname-unhid',
+ 'revdelete-restricted',
+ 'revdelete-unrestricted',
'logentry-move-move',
'logentry-move-move-noredirect',
'logentry-move-move_redir',