<permissions>admin.system.canManageApplication</permissions>
</acpmenuitem>
+ <acpmenuitem name="wcf.acp.menu.link.maintenance.rebuildData">
+ <controller><![CDATA[wcf\acp\page\RebuildDataPage]]></controller>
+ <parent>wcf.acp.menu.link.maintenance</parent>
+ <permissions>admin.system.canRebuildData</permissions>
+ </acpmenuitem>
+
<acpmenuitem name="wcf.acp.menu.link.maintenance.import">
- <controller><![CDATA[wcf\acp\form\DataImport]]></controller>
+ <controller><![CDATA[wcf\acp\form\DataImportForm]]></controller>
<parent>wcf.acp.menu.link.maintenance</parent>
<permissions>admin.system.canImportData</permissions>
</acpmenuitem>
<classname><![CDATA[wcf\system\importer\LabelImporter]]></classname>
</type>
<!-- /importers -->
+
+ <!-- rebuild data workers -->
+ <type>
+ <name>com.woltlab.wcf.user</name>
+ <definitionname>com.woltlab.wcf.rebuildData</definitionname>
+ <classname><![CDATA[wcf\system\worker\UserRebuildDataWorker]]></classname>
+ </type>
+ <!-- /rebuild data workers -->
</import>
</data>
\ No newline at end of file
<name>com.woltlab.wcf.exporter</name>
<interfacename><![CDATA[wcf\system\exporter\IExporter]]></interfacename>
</definition>
+
+ <definition>
+ <name>com.woltlab.wcf.rebuildData</name>
+ <interfacename><![CDATA[wcf\system\worker\IRebuildDataWorker]]></interfacename>
+ </definition>
</import>
</data>
<defaultvalue>0</defaultvalue>
<admindefaultvalue>1</admindefaultvalue>
</option>
+ <option name="admin.system.canRebuildData">
+ <categoryname>admin.system</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
<option name="admin.system.canManageCronjob">
<categoryname>admin.system</categoryname>
<optiontype>boolean</optiontype>
--- /dev/null
+{include file='header' pageTitle='wcf.acp.rebuildData'}
+
+<header class="boxHeadline">
+ <h1>{lang}wcf.acp.rebuildData{/lang}</h1>
+</header>
+
+<div class="contentNavigation">
+ {hascontent}
+ <nav>
+ <ul>
+ {content}
+ {event name='contentNavigationButtonsTop'}
+ {/content}
+ </ul>
+ </nav>
+ {/hascontent}
+</div>
+
+<div class="container containerPadding marginTop">
+ <fieldset>
+ <legend>{lang}wcf.acp.rebuildData{/lang}</legend>
+ <small>{lang}wcf.acp.rebuildData.description{/lang}</small>
+
+ {foreach from=$objectTypes item=objectType}
+ <dl class="wide">
+ <dd>
+ <a class="button small" id="rebuildData{@$objectType->objectTypeID}">{lang}wcf.acp.rebuildData.{@$objectType->objectType}{/lang}</a>
+ <small>{lang}wcf.acp.rebuildData.{@$objectType->objectType}.description{/lang}</small>
+
+ <script>
+ //<![CDATA[
+ $(function() {
+ $('#rebuildData{@$objectType->objectTypeID}').click(function () {
+ new WCF.ACP.Worker('cache', '{@$objectType->className|encodeJS}', '{lang}wcf.acp.rebuildData.{@$objectType->objectType}{/lang}');
+ });
+ });
+ //]]>
+ </script>
+ </dd>
+ </dl>
+ {/foreach}
+ </fieldset>
+</div>
+
+<div class="contentNavigation">
+ {hascontent}
+ <nav>
+ <ul>
+ {content}
+ {event name='contentNavigationButtonsBottom'}
+ {/content}
+ </ul>
+ </nav>
+ {/hascontent}
+</div>
+
+{include file='footer'}
\ No newline at end of file
<script>
//<![CDATA[
$(function() {
- $('#updateCache').click(function () {
- new WCF.ACP.Worker('cache', 'wcf\\system\\worker\\UserActivityPointUpdateCacheWorker', '{lang}wcf.acp.user.activityPoint.updateCache{/lang}');
- });
$('#updateEvents').click(function () {
new WCF.ACP.Worker('events', 'wcf\\system\\worker\\UserActivityPointUpdateEventsWorker', '{lang}wcf.acp.user.activityPoint.updateEvents{/lang}');
});
<div class="contentNavigation">
<nav>
<ul>
- <li><a id="updateCache" class="button"><span class="icon icon16 icon-repeat"></span> <span>{lang}wcf.acp.user.activityPoint.updateCache{/lang}</span></a></li>
<li><a id="updateEvents" class="button"><span class="icon icon16 icon-repeat"></span> <span>{lang}wcf.acp.user.activityPoint.updateEvents{/lang}</span></a></li>
{event name='contentNavigationButtons'}
<legend>{lang}wcf.user.activityPoint.pointsPerObject{/lang}</legend>
{foreach from=$objectTypes item='objectType'}
<dl{if $errorField == $objectType->objectTypeID} class="formError"{/if}>
- <dt><label for="{$objectType->objectType}">{lang}wcf.user.activityPoint.objectType.{$objectType->objectType}{/lang}</label></dt>
+ <dt><label for="{@$objectType->objectType}">{lang}wcf.user.activityPoint.objectType.{$objectType->objectType}{/lang}</label></dt>
<dd>
- <input type="number" id="{$objectType->objectType}" name="points[{$objectType->objectTypeID}]" value="{$points[$objectType->objectTypeID]}" required="required" min="0" class="tiny" />
+ <input type="number" id="{@$objectType->objectType}" name="points[{@$objectType->objectTypeID}]" value="{$points[@$objectType->objectTypeID]}" required="required" min="0" class="tiny" />
{if $errorField == $objectType->objectTypeID}
<small class="innerError">
{lang}wcf.acp.user.activityPoint.option.notValid{/lang}
<header class="boxHeadline">
<h1>{lang}wcf.acp.user.rank.list{/lang}</h1>
-
- <script>
- //<![CDATA[
- $(function() {
- new WCF.Action.Delete('wcf\\data\\user\\rank\\UserRankAction', '.jsUserRankRow');
-
- $('#updateUserRanks').click(function () {
- $('#updateUserRanks').unbind('click');
- new WCF.ACP.Worker('updateUserRanks', 'wcf\\system\\worker\\UserRankUpdateWorker');
- });
- });
- //]]>
- </script>
</header>
<div class="contentNavigation">
<nav>
<ul>
- <li><a id="updateUserRanks" class="button"><span class="icon icon16 icon-repeat"></span> <span>{lang}wcf.acp.user.rank.updateRanks{/lang}</span></a></li>
<li><a href="{link controller='UserRankAdd'}{/link}" class="button"><span class="icon icon16 icon-plus"></span> <span>{lang}wcf.acp.user.rank.add{/lang}</span></a></li>
{event name='contentNavigationButtonsTop'}
--- /dev/null
+<?php
+namespace wcf\acp\page;
+use wcf\data\object\type\ObjectTypeCache;
+use wcf\page\AbstractPage;
+use wcf\system\WCF;
+
+/**
+ * Show the list of available rebuild data options.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2013 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.page
+ * @category Community Framework
+ */
+class RebuildDataPage extends AbstractPage {
+ /**
+ * @see wcf\page\AbstractPage::$activeMenuItem
+ */
+ public $activeMenuItem = 'wcf.acp.menu.link.maintenance.rebuildData';
+
+ /**
+ * @see wcf\page\AbstractPage::$neededPermissions
+ */
+ public $neededPermissions = array('admin.system.canRebuildData');
+
+ /**
+ * object types
+ * @var array
+ */
+ public $objectTypes = array();
+
+ /**
+ * @see wcf\page\IPage::readData()
+ */
+ public function readData() {
+ parent::readData();
+
+ // get object types
+ $this->objectTypes = ObjectTypeCache::getInstance()->getObjectTypes('com.woltlab.wcf.rebuildData');
+
+ // @todo: sort object types
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ WCF::getTPL()->assign(array(
+ 'objectTypes' => $this->objectTypes
+ ));
+ }
+}
--- /dev/null
+<?php
+namespace wcf\system\worker;
+use wcf\system\event\EventHandler;
+use wcf\system\exception\SystemException;
+use wcf\system\request\LinkHandler;
+use wcf\system\WCF;
+use wcf\util\ClassUtil;
+
+/**
+ * Abstract implementation of rebuild data worker.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2013 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.worker
+ * @category Community Framework
+ */
+abstract class AbstractRebuildDataWorker extends AbstractWorker implements IRebuildDataWorker {
+ /**
+ * class name for DatabaseObjectList
+ * @var string
+ */
+ protected $objectListClassName = '';
+
+ /**
+ * database object list
+ * @var wcf\data\DatabaseObjectList
+ */
+ protected $objectList = null;
+
+ /**
+ * @see wcf\system\worker\IRebuildDataWorker::getObjectList()
+ */
+ public function getObjectList() {
+ return $this->objectList;
+ }
+
+ /**
+ * @see wcf\system\worker\IWorker::getLoopCount()
+ */
+ public function setLoopCount($loopCount) {
+ parent::setLoopCount($loopCount);
+
+ $this->initObjectList();
+ }
+
+ /**
+ * @see wcf\system\worker\IWorker::validate()
+ */
+ public function validate() {
+ WCF::getSession()->checkPermissions(array('admin.system.canRebuildData'));
+ }
+
+ /**
+ * @see wcf\system\worker\IWorker::countObjects()
+ */
+ public function countObjects() {
+ $this->count = $this->objectList->countObjects();
+ }
+
+ /**
+ * @see wcf\system\worker\IWorker::execute()
+ */
+ public function execute() {
+ $this->objectList->readObjects();
+
+ EventHandler::getInstance()->fireAction($this, 'execute');
+ }
+
+ /**
+ * @see wcf\system\worker\IWorker::getProceedURL()
+ */
+ public function getProceedURL() {
+ return LinkHandler::getInstance()->getLink('RebuildData');
+ }
+
+ /**
+ * Initializes DatabaseObjectList instance.
+ */
+ protected function initObjectList() {
+ if (empty($this->objectListClassName)) {
+ throw new SystemException('DatabaseObjectList class name not specified.');
+ }
+
+ if (!ClassUtil::isInstanceOf($this->objectListClassName, 'wcf\data\DatabaseObjectList')) {
+ throw new SystemException("'".$this->objectListClassName."' does not extend 'wcf\data\DatabaseObjectList'");
+ }
+
+ $this->objectList = new $this->objectListClassName();
+ $this->objectList->sqlLimit = $this->limit;
+ $this->objectList->sqlOffset = $this->limit * $this->loopCount;
+ }
+}
--- /dev/null
+<?php
+namespace wcf\system\worker;
+
+/**
+ * Every rebuild data worker has to implement this interface.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2013 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.worker
+ * @category Community Framework
+ */
+interface IRebuildDataWorker extends IWorker {
+ /**
+ * Returns the list of objects.
+ *
+ * @return wcf\data\DatabaseObjectList
+ */
+ public function getObjectList();
+}
+++ /dev/null
-<?php
-namespace wcf\system\worker;
-use wcf\system\request\LinkHandler;
-use wcf\system\user\activity\point\UserActivityPointHandler;
-use wcf\system\WCF;
-
-/**
- * Worker implementation for updating user activity point caches.
- *
- * @author Tim Duesterhus
- * @copyright 2001-2013 WoltLab GmbH
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
- * @package com.woltlab.wcf
- * @subpackage system.worker
- * @category Community Framework
- */
-class UserActivityPointUpdateCacheWorker extends AbstractWorker {
- /**
- * @see wcf\system\worker\AbstractWorker::$limit
- */
- protected $limit = 50;
-
- /**
- * @see wcf\system\worker\IWorker::validate()
- */
- public function validate() {
- WCF::getSession()->checkPermissions(array('admin.user.canEditActivityPoints'));
- }
-
- /**
- * @see wcf\system\worker\IWorker::countObjects()
- */
- public function countObjects() {
- $sql = "SELECT COUNT(*) AS count
- FROM wcf".WCF_N."_user user";
- $statement = WCF::getDB()->prepareStatement($sql);
- $statement->execute();
- $row = $statement->fetchArray();
-
- $this->count = $row['count'];
- }
-
- /**
- * @see wcf\system\worker\IWorker::execute()
- */
- public function execute() {
- // get users
- $sql = "SELECT userID
- FROM wcf".WCF_N."_user user
- ORDER BY user.userID";
- $statement = WCF::getDB()->prepareStatement($sql, $this->limit, ($this->limit * $this->loopCount));
- $statement->execute();
-
- $userIDs = array();
- while ($row = $statement->fetchArray()) {
- $userIDs[] = $row['userID'];
- }
-
- UserActivityPointHandler::getInstance()->updateUsers($userIDs);
- }
-
- /**
- * @see wcf\system\worker\IWorker::getProceedURL()
- */
- public function getProceedURL() {
- return LinkHandler::getInstance()->getLink('UserActivityPointOption');
- }
-}
+++ /dev/null
-<?php
-namespace wcf\system\worker;
-use wcf\data\user\UserEditor;
-use wcf\data\user\UserList;
-use wcf\data\user\UserProfileAction;
-use wcf\system\request\LinkHandler;
-use wcf\system\WCF;
-
-/**
- * Worker implementation for updating user ranks.
- *
- * @author Marcel Werk
- * @copyright 2001-2013 WoltLab GmbH
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
- * @package com.woltlab.wcf
- * @subpackage system.worker
- * @category Community Framework
- */
-class UserRankUpdateWorker extends AbstractWorker {
- /**
- * @see wcf\system\worker\AbstractWorker::$limit
- */
- protected $limit = 100;
-
- /**
- * @see wcf\system\worker\IWorker::validate()
- */
- public function validate() {
- WCF::getSession()->checkPermissions(array('admin.user.rank.canManageRank'));
- }
-
- /**
- * @see wcf\system\worker\IWorker::countObjects()
- */
- public function countObjects() {
- $sql = "SELECT COUNT(*) AS count
- FROM wcf".WCF_N."_user user";
- $statement = WCF::getDB()->prepareStatement($sql);
- $statement->execute();
- $row = $statement->fetchArray();
-
- $this->count = $row['count'];
- }
-
- /**
- * @see wcf\system\worker\IWorker::execute()
- */
- public function execute() {
- // get users
- $userList = new UserList();
- $userList->sqlLimit = $this->limit;
- $userList->sqlOffset = $this->limit * $this->loopCount;
- $userList->sqlOrderBy = 'user_table.userID';
- $userList->readObjects();
-
- $users = array();
- foreach ($userList as $user) {
- $users[] = new UserEditor($user);
- }
-
- if (!empty($users)) {
- $action = new UserProfileAction($users, 'updateUserRank');
- $action->executeAction();
- $action = new UserProfileAction($users, 'updateUserOnlineMarking');
- $action->executeAction();
- }
- }
-
- /**
- * @see wcf\system\worker\IWorker::getProceedURL()
- */
- public function getProceedURL() {
- return LinkHandler::getInstance()->getLink('UserRankList');
- }
-}
--- /dev/null
+<?php
+namespace wcf\system\worker;
+use wcf\data\like\Like;
+use wcf\data\user\UserEditor;
+use wcf\data\user\UserProfileAction;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\user\activity\point\UserActivityPointHandler;
+use wcf\system\WCF;
+
+/**
+ * Worker implementation for updating users.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2013 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.worker
+ * @category Community Framework
+ */
+class UserRebuildDataWorker extends AbstractRebuildDataWorker {
+ /**
+ * @see wcf\system\worker\AbstractRebuildDataWorker::$objectListClassName
+ */
+ protected $objectListClassName = 'wcf\data\user\UserList';
+
+ /**
+ * @see wcf\system\worker\AbstractWorker::$limit
+ */
+ protected $limit = 50;
+
+ /**
+ * @see wcf\system\worker\AbstractRebuildDataWorker::initObjectList
+ */
+ protected function initObjectList() {
+ parent::initObjectList();
+
+ $this->objectList->sqlOrderBy = 'user_table.userID';
+ }
+
+ /**
+ * @see wcf\system\worker\IWorker::execute()
+ */
+ public function execute() {
+ parent::execute();
+
+ $users = $userIDs = array();
+ foreach ($this->getObjectList() as $user) {
+ $users[] = new UserEditor($user);
+ $userIDs[] = $user->userID;
+ }
+
+ // update user ranks
+ if (!empty($users)) {
+ $action = new UserProfileAction($users, 'updateUserOnlineMarking');
+ $action->executeAction();
+ }
+
+ if (!empty($userIDs)) {
+ // update activity points
+ UserActivityPointHandler::getInstance()->updateUsers($userIDs);
+
+ // update like counter
+ if (MODULE_LIKE) {
+ $conditionBuilder = new PreparedStatementConditionBuilder();
+ $conditionBuilder->add('user_table.userID IN (?)', array($userIDs));
+ $sql = "UPDATE wcf".WCF_N."_user user_table
+ SET likesReceived = (
+ SELECT COUNT(*)
+ FROM wcf".WCF_N."_like
+ WHERE objectUserID = user_table.userID
+ AND likeValue = ".Like::LIKE."
+ )
+ ".$conditionBuilder;
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute($conditionBuilder->getParameters());
+ }
+ }
+ }
+}
<item name="wcf.acp.group.option.category.admin.content.tag"><![CDATA[Tags]]></item>
<item name="wcf.acp.group.option.admin.content.tag.canManageTag"><![CDATA[Kann Tags verwalten]]></item>
<item name="wcf.acp.group.option.user.signature.maxLength"><![CDATA[Maximale Signaturlänge]]></item>
+ <item name="wcf.acp.group.option.admin.system.canImportData"><![CDATA[Kann Daten importieren]]></item>
+ <item name="wcf.acp.group.option.admin.system.canRebuildData"><![CDATA[Kann Anzeigen aktualisieren]]></item>
</category>
<category name="wcf.acp.index">
<item name="wcf.acp.menu.link.tag.add"><![CDATA[Tag hinzufügen]]></item>
<item name="wcf.acp.menu.link.tag.list"><![CDATA[Tags auflisten]]></item>
<item name="wcf.acp.menu.link.maintenance.import"><![CDATA[Datenimport]]></item>
+ <item name="wcf.acp.menu.link.maintenance.rebuildData"><![CDATA[Anzeigen aktualisieren]]></item>
</category>
<category name="wcf.acp.option">
<item name="wcf.acp.pageMenu.showOrder"><![CDATA[Reihenfolge]]></item>
</category>
+ <category name="wcf.acp.rebuildData">
+ <item name="wcf.acp.rebuildData"><![CDATA[Anzeigen aktualisieren]]></item>
+ <item name="wcf.acp.rebuildData.description"><![CDATA[Für eine vollständige Aktualisierung aller Daten (z.B. nach einem Datenimport) führen Sie die Aktionen bitte in der hier angegebenen Reihenfolge durch.]]></item>
+ <item name="wcf.acp.rebuildData.com.woltlab.wcf.user"><![CDATA[Benutzer aktualisieren]]></item>
+ </category>
+
<category name="wcf.acp.search">
<item name="wcf.acp.search.noResults"><![CDATA[Keine Treffer]]></item>
<item name="wcf.acp.search.provider.com.woltlab.wcf.menuItem"><![CDATA[Seiten]]></item>
<item name="wcf.acp.user.search.conditions.state.banned"><![CDATA[Gesperrt]]></item>
<item name="wcf.acp.user.search.conditions.state.notBanned"><![CDATA[Nicht gesperrt]]></item>
<item name="wcf.acp.user.activityPoint.option"><![CDATA[Aktivitätspunkte]]></item>
- <item name="wcf.acp.user.activityPoint.updateCache"><![CDATA[Aktivitätspunkte neu vergeben]]></item>
<item name="wcf.acp.user.activityPoint.updateEvents"><![CDATA[Punkte pro Aktivität aktualisieren]]></item>
<item name="wcf.acp.user.delete"><![CDATA[Benutzer löschen]]></item>
<item name="wcf.acp.user.general"><![CDATA[Benutzer]]></item>
<item name="wcf.acp.user.rank.repeatImage.description"><![CDATA[Bestimmt, wie oft die Grafik wiederholt wird.]]></item>
<item name="wcf.acp.user.rank.title"><![CDATA[Rangbezeichnung]]></item>
<item name="wcf.acp.user.rank.userGroup.description"><![CDATA[Dieser Benutzerrang steht ausschließlich den Mitgliedern der ausgewählten Benutzergruppe zur Verfügung.]]></item>
- <item name="wcf.acp.user.rank.updateRanks"><![CDATA[Benutzerränge aktualisieren]]></item>
<item name="wcf.acp.user.disableSignature"><![CDATA[Signatur sperren]]></item>
<item name="wcf.acp.user.disableSignatureReason"><![CDATA[Begründung]]></item>
<item name="wcf.acp.user.disableAvatar"><![CDATA[Avatar sperren]]></item>
<item name="wcf.acp.group.option.category.admin.content.tag"><![CDATA[Tags]]></item>
<item name="wcf.acp.group.option.admin.content.tag.canManageTag"><![CDATA[Can manage tags]]></item>
<item name="wcf.acp.group.option.user.signature.maxLength"><![CDATA[Maximum Signature Length]]></item>
+ <item name="wcf.acp.group.option.admin.system.canImportData"><![CDATA[TODO: Kann Daten importieren]]></item>
+ <item name="wcf.acp.group.option.admin.system.canRebuildData"><![CDATA[TODO: Kann Anzeigen aktualisieren]]></item>
</category>
<category name="wcf.acp.index">
<item name="wcf.acp.menu.link.tag.add"><![CDATA[Add Tag]]></item>
<item name="wcf.acp.menu.link.tag.list"><![CDATA[List Tags]]></item>
<item name="wcf.acp.menu.link.maintenance.import"><![CDATA[TODO: Datenimport]]></item>
+ <item name="wcf.acp.menu.link.maintenance.rebuildData"><![CDATA[TODO: Anzeigen aktualisieren]]></item>
</category>
<category name="wcf.acp.option">
<item name="wcf.acp.pageMenu.showOrder"><![CDATA[Display Order]]></item>
</category>
+ <category name="wcf.acp.rebuildData">
+ <item name="wcf.acp.rebuildData"><![CDATA[TODO: Anzeigen aktualisieren]]></item>
+ <item name="wcf.acp.rebuildData.description"><![CDATA[TODO: Für eine vollständige Aktualisierung aller Daten (z.B. nach einem Datenimport) führen Sie die Aktionen bitte in der hier angegebenen Reihenfolge durch.]]></item>
+ <item name="wcf.acp.rebuildData.com.woltlab.wcf.user"><![CDATA[TODO: Benutzer aktualisieren]]></item>
+ </category>
+
<category name="wcf.acp.search">
<item name="wcf.acp.search.noResults"><![CDATA[No results]]></item>
<item name="wcf.acp.search.provider.com.woltlab.wcf.menuItem"><![CDATA[ACP Menu]]></item>
<item name="wcf.acp.user.search.conditions.state.banned"><![CDATA[Banned]]></item>
<item name="wcf.acp.user.search.conditions.state.notBanned"><![CDATA[Not banned]]></item>
<item name="wcf.acp.user.activityPoint.option"><![CDATA[Activity Points]]></item>
- <item name="wcf.acp.user.activityPoint.updateCache"><![CDATA[Update Activity Point Cache]]></item>
<item name="wcf.acp.user.activityPoint.updateEvents"><![CDATA[Update Points Per Activity]]></item>
<item name="wcf.acp.user.delete"><![CDATA[Delete user(s)]]></item>
<item name="wcf.acp.user.general"><![CDATA[User]]></item>
<item name="wcf.acp.user.rank.repeatImage.description"><![CDATA[Number of times the rank image will be repeated.]]></item>
<item name="wcf.acp.user.rank.title"><![CDATA[Title]]></item>
<item name="wcf.acp.user.rank.userGroup.description"><![CDATA[Rank is restricted to members of the selected user groups.]]></item>
- <item name="wcf.acp.user.rank.updateRanks"><![CDATA[Update User Ranks]]></item>
<item name="wcf.acp.user.disableSignature"><![CDATA[Block signature]]></item>
<item name="wcf.acp.user.disableSignatureReason"><![CDATA[Reason]]></item>
<item name="wcf.acp.user.disableAvatar"><![CDATA[Block avatar]]></item>