Ejemplo n.º 1
0
 /**
  * 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 );
	}