This localize the protect type, level and expiry on Special:Log/protect. To allow i18n there are some details stored in the log params of new log items, these details also shown on API output. The details cannot get from the old existing data, because there are containing L10n strings therefore i18n works only for new items. In the api and for IRC the old description text is still stored in the log params for backward compatibility. This allows use of gender on Special:Log. Old messages are kept for use in IRC. Tests already exists to ensure an unchanged IRC message. Bug: T47988 Change-Id: I3bb85c61b857972e66c99c499d7d785c88cafb25
213 lines
6.1 KiB
PHP
213 lines
6.1 KiB
PHP
<?php
|
|
/**
|
|
* Formatter for protect log entries.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
* http://www.gnu.org/copyleft/gpl.html
|
|
*
|
|
* @file
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
|
|
* @since 1.26
|
|
*/
|
|
|
|
/**
|
|
* This class formats protect log entries.
|
|
*
|
|
* @since 1.26
|
|
*/
|
|
class ProtectLogFormatter extends LogFormatter {
|
|
public function getPreloadTitles() {
|
|
$subtype = $this->entry->getSubtype();
|
|
if ( $subtype === 'move_prot' ) {
|
|
$params = $this->extractParameters();
|
|
return array( Title::newFromText( $params[3] ) );
|
|
}
|
|
return array();
|
|
}
|
|
|
|
protected function getMessageKey() {
|
|
$key = parent::getMessageKey();
|
|
$params = $this->extractParameters();
|
|
if ( isset( $params[4] ) && $params[4] ) {
|
|
// Messages: logentry-protect-protect-cascade, logentry-protect-modify-cascade
|
|
$key .= '-cascade';
|
|
}
|
|
|
|
return $key;
|
|
}
|
|
|
|
protected function getMessageParameters() {
|
|
$params = parent::getMessageParameters();
|
|
|
|
$subtype = $this->entry->getSubtype();
|
|
if ( $subtype === 'protect' || $subtype === 'modify' ) {
|
|
$rawParams = $this->entry->getParameters();
|
|
if ( isset( $rawParams['details'] ) ) {
|
|
$params[3] = $this->createProtectDescription( $rawParams['details'] );
|
|
} elseif ( isset( $params[3] ) ) {
|
|
// Old way of Restrictions and expiries
|
|
$params[3] = $this->context->getLanguage()->getDirMark() . $params[3];
|
|
} else {
|
|
// Very old way (nothing set)
|
|
$params[3] = '';
|
|
}
|
|
// Cascading flag
|
|
if ( isset( $params[4] ) ) {
|
|
// handled in getMessageKey
|
|
unset( $params[4] );
|
|
}
|
|
} elseif ( $subtype === 'move_prot' ) {
|
|
$oldname = $this->makePageLink( Title::newFromText( $params[3] ), array( 'redirect' => 'no' ) );
|
|
$params[3] = Message::rawParam( $oldname );
|
|
}
|
|
|
|
return $params;
|
|
}
|
|
|
|
public function getActionLinks() {
|
|
$subtype = $this->entry->getSubtype();
|
|
if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
|
|
|| $subtype === 'move_prot' // the move log entry has the right action link
|
|
) {
|
|
return '';
|
|
}
|
|
|
|
// Show history link for all changes after the protection
|
|
$title = $this->entry->getTarget();
|
|
$links = array(
|
|
Linker::link( $title,
|
|
$this->msg( 'hist' )->escaped(),
|
|
array(),
|
|
array(
|
|
'action' => 'history',
|
|
'offset' => $this->entry->getTimestamp(),
|
|
)
|
|
)
|
|
);
|
|
|
|
// Show change protection link
|
|
if ( $this->context->getUser()->isAllowed( 'protect' ) ) {
|
|
$links[] = Linker::linkKnown(
|
|
$title,
|
|
$this->msg( 'protect_change' )->escaped(),
|
|
array(),
|
|
array( 'action' => 'protect' )
|
|
);
|
|
}
|
|
|
|
return $this->msg( 'parentheses' )->rawParams(
|
|
$this->context->getLanguage()->pipeList( $links ) )->escaped();
|
|
}
|
|
|
|
protected function getParametersForApi() {
|
|
$entry = $this->entry;
|
|
$subtype = $this->entry->getSubtype();
|
|
$params = $entry->getParameters();
|
|
|
|
$map = array();
|
|
if ( $subtype === 'protect' || $subtype === 'modify' ) {
|
|
$map = array(
|
|
'4::description',
|
|
'5:bool:cascade',
|
|
'details' => ':array:details',
|
|
);
|
|
} elseif ( $subtype === 'move_prot' ) {
|
|
$map = array(
|
|
'4:title:oldtitle',
|
|
'4::oldtitle' => '4:title:oldtitle',
|
|
);
|
|
}
|
|
foreach ( $map as $index => $key ) {
|
|
if ( isset( $params[$index] ) ) {
|
|
$params[$key] = $params[$index];
|
|
unset( $params[$index] );
|
|
}
|
|
}
|
|
|
|
// Change string to explicit boolean
|
|
if ( isset( $params['5:bool:cascade'] ) && is_string( $params['5:bool:cascade'] ) ) {
|
|
$params['5:bool:cascade'] = $params['5:bool:cascade'] === 'cascade';
|
|
}
|
|
|
|
return $params;
|
|
}
|
|
|
|
public function formatParametersForApi() {
|
|
global $wgContLang;
|
|
|
|
$ret = parent::formatParametersForApi();
|
|
if ( isset( $ret['details'] ) && is_array( $ret['details'] ) ) {
|
|
foreach ( $ret['details'] as &$detail ) {
|
|
if ( isset( $detail['expiry'] ) ) {
|
|
$detail['expiry'] = $wgContLang->formatExpiry( $detail['expiry'], TS_ISO_8601, 'infinite' );
|
|
}
|
|
}
|
|
}
|
|
|
|
return $ret;
|
|
}
|
|
|
|
/**
|
|
* Create the protect description to show in the log formatter
|
|
*
|
|
* @param array $details
|
|
* @return string
|
|
*/
|
|
public function createProtectDescription( array $details ) {
|
|
$protectDescription = '';
|
|
|
|
foreach ( $details as $param ) {
|
|
$expiryText = $this->formatExpiry( $param['expiry'] );
|
|
|
|
// Messages: restriction-edit, restriction-move, restriction-create,
|
|
// restriction-upload
|
|
$action = $this->context->msg( 'restriction-' . $param['type'] )->escaped();
|
|
|
|
$protectionLevel = $param['level'];
|
|
// Messages: protect-level-autoconfirmed, protect-level-sysop
|
|
$message = $this->context->msg( 'protect-level-' . $protectionLevel );
|
|
if ( $message->isDisabled() ) {
|
|
// Require "$1" permission
|
|
$restrictions = $this->context->msg( "protect-fallback", $protectionLevel )->parse();
|
|
} else {
|
|
$restrictions = $message->escaped();
|
|
}
|
|
|
|
if ( $protectDescription !== '' ) {
|
|
$protectDescription .= $this->context->msg( 'word-separator' )->escaped();
|
|
}
|
|
|
|
$protectDescription .= $this->context->msg( 'protect-summary-desc' )
|
|
->params( $action, $restrictions, $expiryText )->escaped();
|
|
}
|
|
|
|
return $protectDescription;
|
|
}
|
|
|
|
private function formatExpiry( $expiry ) {
|
|
if ( wfIsInfinity( $expiry ) ) {
|
|
return $this->context->msg( 'protect-expiry-indefinite' )->text();
|
|
}
|
|
$lang = $this->context->getLanguage();
|
|
$user = $this->context->getUser();
|
|
return $this->context->msg(
|
|
'protect-expiring-local',
|
|
$lang->userTimeAndDate( $expiry, $user ),
|
|
$lang->userDate( $expiry, $user ),
|
|
$lang->userTime( $expiry, $user )
|
|
)->text();
|
|
}
|
|
|
|
}
|