/** * Purge message group stats when set of keys have changed. * @param $old array * @param $new array */ protected function clearMessageGroupStats(array $old, array $new) { $changes = array(); foreach (array_diff_assoc($new, $old) as $groups) { foreach ((array) $groups as $group) { $changes[$group] = true; } } foreach (array_diff_assoc($old, $new) as $groups) { foreach ((array) $groups as $group) { $changes[$group] = true; } } MessageGroupStats::clearGroup(array_keys($changes)); }
public function execute($parameters) { $this->setHeaders(); $user = $this->getUser(); $request = $this->getRequest(); $target = $request->getText('target', $parameters); $revision = $request->getInt('revision', 0); $action = $request->getVal('do'); $out = $this->getOutput(); TranslateUtils::addSpecialHelpLink($out, 'Help:Extension:Translate/Page_translation_example'); // No specific page or invalid input $title = Title::newFromText($target); if (!$title) { if ($target !== '') { $out->addWikiMsg('tpt-badtitle'); } else { $this->listPages(); } return; } // Check permissions if (!$user->isAllowed('pagetranslation')) { throw new PermissionsError('pagetranslation'); } // Check permissions if ($request->wasPosted() && !$user->matchEditToken($request->getText('token'))) { throw new PermissionsError('pagetranslation'); } // We are processing some specific page if (!$title->exists()) { $out->addWikiMsg('tpt-nosuchpage', $title->getPrefixedText()); return; } if ($action === 'discourage' || $action === 'encourage') { $id = TranslatablePage::getMessageGroupIdFromTitle($title); $current = MessageGroups::getPriority($id); if ($action === 'encourage') { $new = ''; } else { $new = 'discouraged'; } if ($new !== $current) { MessageGroups::setPriority($id, $new); $entry = new ManualLogEntry('pagetranslation', $action); $entry->setPerformer($user); $entry->setTarget($title); $logid = $entry->insert(); $entry->publish($logid); } $this->listPages(); $group = MessageGroups::getGroup($id); $parents = MessageGroups::getSharedGroups($group); MessageGroupStats::clearGroup($parents); return; } if ($action === 'unlink') { if (!$request->wasPosted()) { $this->showUnlinkConfirmation($title); return; } else { $page = TranslatablePage::newFromTitle($title); $content = ContentHandler::makeContent(self::getStrippedSourcePageText($page->getParse()), $title); $status = WikiPage::factory($title)->doEditContent($content, $this->msg('tpt-unlink-summary')->inContentLanguage()->text(), EDIT_FORCE_BOT | EDIT_UPDATE); if (!$status->isOK()) { $out->wrapWikiMsg('<div class="errorbox">$1</div>', array('tpt-edit-failed', $status->getWikiText())); return; } $page = TranslatablePage::newFromTitle($title); $this->unmarkPage($page, $user); $out->wrapWikiMsg('<div class="successbox">$1</div>', array('tpt-unmarked', $title->getPrefixedText())); $this->listPages(); return; } } if ($action === 'unmark') { $page = TranslatablePage::newFromTitle($title); $this->unmarkPage($page, $user); $out->wrapWikiMsg('<div class="successbox">$1</div>', array('tpt-unmarked', $title->getPrefixedText())); $this->listPages(); return; } if ($revision === 0) { // Get the latest revision $revision = intval($title->getLatestRevID()); } $page = TranslatablePage::newFromRevision($title, $revision); if (!$page instanceof TranslatablePage) { $out->wrapWikiMsg('<div class="errorbox">$1</div>', array('tpt-notsuitable', $title->getPrefixedText(), $revision)); return; } if ($revision !== intval($title->getLatestRevID())) { // We do want to notify the reviewer if the underlying page changes during review $target = $title->getFullUrl(array('oldid' => $revision)); $link = "<span class='plainlinks'>[{$target} {$revision}]</span>"; $out->wrapWikiMsg('<div class="warningbox">$1</div>', array('tpt-oldrevision', $title->getPrefixedText(), $link)); $this->listPages(); return; } $lastrev = $page->getMarkedTag(); if ($lastrev !== false && $lastrev === $revision) { $out->wrapWikiMsg('<div class="warningbox">$1</div>', array('tpt-already-marked')); $this->listPages(); return; } // This will modify the sections to include name property $error = false; $sections = $this->checkInput($page, $error); // Non-fatal error which prevents saving if ($error === false && $request->wasPosted()) { // Check if user wants to translate title // If not, remove it from the list of sections if (!$request->getCheck('translatetitle')) { $sections = array_filter($sections, function ($s) { return $s->id !== 'Page display title'; }); } $err = $this->markForTranslation($page, $sections); if ($err) { call_user_func_array(array($out, 'addWikiMsg'), $err); } else { $this->showSuccess($page); $this->listPages(); } return; } $this->showPage($page, $sections); }
/** * Purge message group stats when set of keys have changed. * @param array $old * @param array $new */ protected function clearMessageGroupStats(array $old, array $new) { $changes = array(); foreach ($new as $key => $groups) { // Using != here on purpose to ignore order of items if (!isset($old[$key])) { $changes[$key] = array(array(), (array) $groups); } elseif ($groups != $old[$key]) { $changes[$key] = array((array) $old[$key], (array) $groups); } } foreach ($old as $key => $groups) { if (!isset($new[$key])) { $changes[$key] = array((array) $groups, array()); } // We already checked for diffs above } $changedGroups = array(); foreach ($changes as $data) { foreach ($data[0] as $group) { $changedGroups[$group] = true; } foreach ($data[1] as $group) { $changedGroups[$group] = true; } } MessageGroupStats::clearGroup(array_keys($changedGroups)); foreach ($changes as $key => $data) { list($ns, $pagename) = explode(':', $key, 2); $title = Title::makeTitle($ns, $pagename); $handle = new MessageHandle($title); list($oldGroups, $newGroups) = $data; Hooks::run('TranslateEventMessageMembershipChange', array($handle, $oldGroups, $newGroups)); } }
/** * Overwriten from SpecialLanguageStats * * @return string */ function getTable() { $table = $this->table; $this->addWorkflowStatesColumn(); $out = ''; if ($this->purge) { MessageGroupStats::clearGroup($this->target); } MessageGroupStats::setTimeLimit($this->timelimit); $cache = MessageGroupStats::forGroup($this->target); $languages = array_keys(TranslateUtils::getLanguageNames($this->getLanguage()->getCode())); sort($languages); $this->filterPriorityLangs($languages, $this->target, $cache); foreach ($languages as $code) { if ($table->isBlacklisted($this->target, $code) !== null) { continue; } $out .= $this->makeRow($code, $cache); } if ($out) { $table->setMainColumnHeader($this->msg('translate-mgs-column-language')); $out = $table->createHeader() . "\n" . $out; $out .= Html::closeElement('tbody'); $out .= Html::openElement('tfoot'); $out .= $table->makeTotalRow($this->msg('translate-mgs-totals'), $this->totals); $out .= Html::closeElement('tfoot'); $out .= Html::closeElement('table'); return $out; } else { $this->nothing = true; return ''; } }
public function execute( $parameters ) { $this->setHeaders(); global $wgRequest, $wgOut, $wgUser; $this->user = $wgUser; $request = $wgRequest; $target = $wgRequest->getText( 'target', $parameters ); $revision = $wgRequest->getInt( 'revision', 0 ); $action = $request->getVal( 'do' ); // No specific page or invalid input $title = Title::newFromText( $target ); if ( !$title ) { if ( $target !== '' ) { $wgOut->addWikiMsg( 'tpt-badtitle' ); } else { $this->listPages(); } return; } // Check permissions if ( !$this->user->isAllowed( 'pagetranslation' ) ) { $wgOut->permissionRequired( 'pagetranslation' ); return; } // Check permissions if ( $wgRequest->wasPosted() && !$this->user->matchEditToken( $wgRequest->getText( 'token' ) ) ) { self::superDebug( __METHOD__, "token failure", $this->user ); $wgOut->permissionRequired( 'pagetranslation' ); return; } // We are processing some specific page if ( !$title->exists() ) { $wgOut->addWikiMsg( 'tpt-nosuchpage', $title->getPrefixedText() ); return; } if ( $action === 'discourage' || $action === 'encourage' ) { $id = TranslatablePage::getMessageGroupIdFromTitle( $title ); $dbw = wfGetDB( DB_MASTER ); $table = 'translate_groupreviews'; $row = array( 'tgr_group' => $id, 'tgr_lang' => '*priority', 'tgr_state' => 'discouraged', ); if ( $action === 'encourage' ) { $dbw->delete( $table, $row, __METHOD__ ); } else { $index = array( 'tgr_group', 'tgr_lang' ); $dbw->replace( $table, array( $index ), $row, __METHOD__ ); } $this->listPages(); $group = MessageGroups::getGroup( $id ); $parents = MessageGroups::getParentGroups( $group ); MessageGroupStats::clearGroup( $parents ); return; } if ( $action === 'unmark' ) { $page = TranslatablePage::newFromTitle( $title ); $page->removeTags(); $page->getTitle()->invalidateCache(); $logger = new LogPage( 'pagetranslation' ); $params = array( 'user' => $wgUser->getName() ); $logger->addEntry( 'unmark', $page->getTitle(), null, array( serialize( $params ) ) ); $wgOut->addWikiMsg( 'tpt-unmarked', $title->getPrefixedText() ); self::superDebug( __METHOD__, "unmarked page", $this->user, $title ); return; } if ( $revision === 0 ) { // Get the latest revision $revision = intval( $title->getLatestRevID() ); } $page = TranslatablePage::newFromRevision( $title, $revision ); if ( !$page instanceof TranslatablePage ) { $wgOut->addWikiMsg( 'tpt-notsuitable', $title->getPrefixedText(), $revision ); return; } if ( $revision !== intval( $title->getLatestRevID() ) ) { // We do want to notify the reviewer if the underlying page changes during review $target = $title->getFullUrl( array( 'oldid' => $revision ) ); $link = "<span class='plainlinks'>[$target $revision]</span>"; $wgOut->addWikiMsg( 'tpt-oldrevision', $title->getPrefixedText(), $link ); self::superDebug( __METHOD__, "revision mismatch while marking", $this->user, $title, $revision, intval( $title->getLatestRevID() ) ); return; } $lastrev = $page->getMarkedTag(); if ( $lastrev !== false && $lastrev === $revision ) { $wgOut->addWikiMsg( 'tpt-already-marked' ); $this->listPages(); return; } // This will modify the sections to include name property $error = false; $sections = $this->checkInput( $page, $error ); // Non-fatal error which prevents saving if ( $error === false && $wgRequest->wasPosted() ) { $err = $this->markForTranslation( $page, $sections ); if ( $err ) { call_user_func_array( array( $wgOut, 'addWikiMsg' ), $err ); } else { $this->showSuccess( $page ); $this->listPages(); } return; } self::superDebug( __METHOD__, "marking page", $this->user, $title, $revision ); $this->showPage( $page, $sections ); }