Add user profile reaction list
authorJoshua Rüsweg <josh@bastelstu.be>
Wed, 25 Jul 2018 21:21:10 +0000 (23:21 +0200)
committerJoshua Rüsweg <josh@bastelstu.be>
Wed, 25 Jul 2018 21:21:10 +0000 (23:21 +0200)
See #2508

com.woltlab.wcf/templates/userProfileLikes.tpl
wcfsetup/install/files/js/WCF.User.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Reaction/Profile/Loader.js [new file with mode: 0644]
wcfsetup/install/files/lib/data/reaction/ReactionAction.class.php
wcfsetup/install/files/lib/system/menu/user/profile/content/LikesUserProfileMenuContent.class.php
wcfsetup/install/files/lib/system/reaction/ReactionHandler.class.php
wcfsetup/install/lang/de.xml
wcfsetup/install/lang/en.xml

index 476a6b69978cc6aeb1421e4d63e026b3468430e5..de8b345ded3044e96d503af816a0c5711edd5892 100644 (file)
@@ -1,33 +1,26 @@
 <script data-relocate="true">
-       $(function() {
-               WCF.Language.addObject({
-                       'wcf.like.likes.more': '{lang}wcf.like.likes.more{/lang}',
-                       'wcf.like.likes.noMoreEntries': '{lang}wcf.like.likes.noMoreEntries{/lang}',
-                       'wcf.like.dislikes.more': '{lang}wcf.like.dislikes.more{/lang}',
-                       'wcf.like.dislikes.noMoreEntries': '{lang}wcf.like.dislikes.noMoreEntries{/lang}',
-                       'wcf.like.likesReceived': '{lang}wcf.like.likesReceived{/lang}',
-                       'wcf.like.likesGiven': '{lang}wcf.like.likesGiven{/lang}',
-                       'wcf.like.dislikesReceived': '{lang}wcf.like.dislikesReceived{/lang}',
-                       'wcf.like.dislikesGiven': '{lang}wcf.like.dislikesGiven{/lang}'
+       require(['WoltLabSuite/Core/Ui/Reaction/Profile/Loader', 'Language'], function(UiReactionProfileLoader, Language) {
+               Language.addObject({
+                       'wcf.like.reaction.noMoreEntries': '{lang}wcf.like.reaction.noMoreEntries{/lang}',
+                       'wcf.like.reaction.more': '{lang}wcf.like.reaction.more{/lang}'
                });
                
-               new WCF.User.LikeLoader({@$userID});
+               new UiReactionProfileLoader({@$userID}, {@$firstReactionTypeID});
        });
 </script>
 
 <ul id="likeList" class="containerList recentActivityList likeList" data-last-like-time="{@$lastLikeTime}">
        <li class="containerListButtonGroup likeTypeSelection">
                <ul class="buttonGroup" id="likeType">
-                       <li><a class="button small active" data-like-type="received">{lang}wcf.like.likesReceived{/lang}</a></li>
-                       <li><a class="button small" data-like-type="given">{lang}wcf.like.likesGiven{/lang}</a></li>
+                       <li><a class="button small active" data-like-type="received">{lang}wcf.like.reactionsReceived{/lang}</a></li>
+                       <li><a class="button small" data-like-type="given">{lang}wcf.like.reactionsGiven{/lang}</a></li>
                </ul>
                
-               {if LIKE_ENABLE_DISLIKE}
-                       <ul class="buttonGroup" id="likeValue">
-                               <li><a class="button small active" data-like-value="1">{lang}wcf.like.details.like{/lang}</a></li>
-                               <li><a class="button small" data-like-value="-1">{lang}wcf.like.details.dislike{/lang}</a></li>
-                       </ul>
-               {/if}
+               <ul class="buttonGroup" id="reactionType">
+                       {foreach from=$__wcf->getReactionHandler()->getReactionTypes() item=reactionType name=reactionTypeLoop}
+                               <li><a class="button small jsTooltip{if $tpl.foreach.reactionTypeLoop.first} active{/if}" data-reaction-type-id="{$reactionType->reactionTypeID}" title="{$reactionType->getTitle()}">{@$reactionType->renderIcon()} <span class="invisible">{$reactionType->getTitle()}</span></a></li>
+                       {/foreach}
+               </ul>
        </li>
        
        {include file='userProfileLikeItem'}
index caca89e870dba9a0fadc485e7f198fec8a898620..1e5ad4934e1c30894bc468a57e473d5115da4a66 100644 (file)
@@ -1949,6 +1949,7 @@ WCF.User.RecentActivityLoader = Class.extend({
  * Loads likes once the user scrolls to the very bottom.
  * 
  * @param      integer         userID
+ * @deprecated  since 3.2
  */
 WCF.User.LikeLoader = Class.extend({
        /**
diff --git a/wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Reaction/Profile/Loader.js b/wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Reaction/Profile/Loader.js
new file mode 100644 (file)
index 0000000..892523f
--- /dev/null
@@ -0,0 +1,182 @@
+/**
+ * Handles the reaction list in the user profile. 
+ *
+ * @author     Joshua Ruesweg
+ * @copyright  2001-2018 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @module     WoltLabSuite/Core/Ui/Reaction/Profile/Loader
+ * @since       3.2
+ */
+define(['Ajax', 'Core', 'Language'], function(Ajax, Core, Language) {
+       "use strict";
+       
+       /**
+        * @constructor
+        */
+       function UiReactionProfileLoader(userID, firstReactionTypeID) { this.init(userID, firstReactionTypeID); }
+       UiReactionProfileLoader.prototype = {
+               /**
+                * Initializes a new ReactionListLoader object.
+                *
+                * @param       integer         userID
+                */
+               init: function(userID, firstReactionTypeID) {
+                       this._container = elById('likeList');
+                       this._userID = userID;
+                       this._reactionTypeID = firstReactionTypeID;
+                       this._targetType = 'received';
+                       this._options = {
+                               parameters: []
+                       };
+                       
+                       if (!this._userID) {
+                               throw new Error("[WoltLabSuite/Core/Ui/Reaction/Profile/Loader] Invalid parameter 'userID' given.");
+                       }
+                       
+                       if (!this._reactionTypeID) {
+                               throw new Error("[WoltLabSuite/Core/Ui/Reaction/Profile/Loader] Invalid parameter 'firstReactionTypeID' given.");
+                       }
+                       
+                       var loadButtonList = elCreate('li');
+                       loadButtonList.className = 'likeListMore showMore';
+                       this._noMoreEntries = elCreate('small');
+                       this._noMoreEntries.innerHTML = Language.get('wcf.like.reaction.noMoreEntries');
+                       this._noMoreEntries.style.display = 'none';
+                       loadButtonList.appendChild(this._noMoreEntries);
+                       
+                       this._loadButton = elCreate('button');
+                       this._loadButton.className = 'small';
+                       this._loadButton.innerHTML = Language.get('wcf.like.reaction.more');
+                       this._loadButton.addEventListener(WCF_CLICK_EVENT, this._loadReactions.bind(this));
+                       this._loadButton.style.display = 'none';
+                       loadButtonList.appendChild(this._loadButton);
+                       this._container.appendChild(loadButtonList);
+                       
+                       if (elBySel('#likeList > li').length === 2) {
+                               this._noMoreEntries.style.display = '';
+                       }
+                       else {
+                               this._loadButton.style.display = '';
+                       }
+                       
+                       this._setupReactionTypeButtons();
+                       this._setupTargetTypeButtons();
+               },
+               
+               /**
+                * Set up the reaction type buttons. 
+                */
+               _setupReactionTypeButtons: function() {
+                       var element, elements = elBySelAll('#reactionType .button');
+                       for (var i = 0, length = elements.length; i < length; i++) {
+                               element = elements[i];
+                               element.addEventListener(WCF_CLICK_EVENT, this._changeReactionTypeValue.bind(this, ~~elData(element, 'reaction-type-id')));
+                       }
+               },
+               
+               /**
+                * Set up the target type buttons.
+                */
+               _setupTargetTypeButtons: function() {
+                       var element, elements = elBySelAll('#likeType .button');
+                       for (var i = 0, length = elements.length; i < length; i++) {
+                               element = elements[i];
+                               element.addEventListener(WCF_CLICK_EVENT, this._changeTargetType.bind(this, elData(element, 'like-type')));
+                       }
+               },
+               
+               /**
+                * Changes the reaction target type (given or received) and reload the entire element.
+                * 
+                * @param       {string}           targetType
+                */
+               _changeTargetType: function(targetType) {
+                       if (targetType !== 'given' && targetType !== 'received') {
+                               throw new Error("[WoltLabSuite/Core/Ui/Reaction/Profile/Loader] Invalid parameter 'targetType' given.");
+                       }
+                       
+                       if (targetType !== this._targetType) {
+                               // remove old active state
+                               elBySel('#likeType .button.active').classList.remove('active');
+                               
+                               // add active status to new button 
+                               elBySel('#likeType .button[data-like-type="'+ targetType +'"]').classList.add('active');
+                               
+                               this._targetType = targetType;
+                               this._reload();
+                       }
+               },
+               
+               /**
+                * Changes the reaction type value and reload the entire element. 
+                * 
+                * @param       {int}           reactionTypeID
+                */
+               _changeReactionTypeValue: function(reactionTypeID) {
+                       if (this._reactionTypeID !== reactionTypeID) {
+                               // remove old active state
+                               elBySel('#reactionType .button.active').classList.remove('active');
+                               
+                               // add active status to new button 
+                               elBySel('#reactionType .button[data-reaction-type-id="'+ reactionTypeID +'"]').classList.add('active');
+                               
+                               this._reactionTypeID = reactionTypeID;
+                               this._reload();
+                       }
+               },
+               
+               /**
+                * Handles reload.
+                */
+               _reload: function() {
+                       var elements = elBySelAll('#likeList > li:not(:first-child):not(:last-child)');
+                       
+                       for (var i = 0, length = elements.length; i < length; i++) {
+                               this._container.removeChild(elements[i]);
+                       }
+                       
+                       elData(this._container, 'last-like-time', 0);
+                       
+                       this._loadReactions();
+               },
+               
+               /**
+                * Load a list of reactions. 
+                */
+               _loadReactions: function() {
+                       this._options.parameters.userID = this._userID;
+                       this._options.parameters.lastLikeTime = elData(this._container, 'last-like-time');
+                       this._options.parameters.targetType = this._targetType;
+                       this._options.parameters.reactionTypeID = this._reactionTypeID;
+                       
+                       Ajax.api(this, {
+                               parameters: this._options.parameters
+                       });
+               },
+               
+               _ajaxSuccess: function(data) {
+                       if (data.returnValues.template) {
+                               elBySel('#likeList > li:nth-last-child(1)').insertAdjacentHTML('beforebegin', data.returnValues.template);
+                               
+                               elData(this._container, 'last-like-time', data.returnValues.lastLikeTime);
+                               this._noMoreEntries.style.display = 'none';
+                               this._loadButton.style.display = '';
+                       }
+                       else {
+                               this._noMoreEntries.style.display = '';
+                               this._loadButton.style.display = 'none';
+                       }
+               },
+               
+               _ajaxSetup: function() {
+                       return {
+                               data: {
+                                       actionName: 'load',
+                                       className: '\\wcf\\data\\reaction\\ReactionAction'
+                               }
+                       };
+               }
+       };
+       
+       return UiReactionProfileLoader;
+});
index c8ff8569abfe41a80723835c661a74970def76f0..1b649ec961565adb22038bdd6b5ee3381386061d 100644 (file)
@@ -188,4 +188,48 @@ class ReactionAction extends AbstractDatabaseObjectAction {
                        }
                }
        }
+       
+       /**
+       * Validates parameters to load reactions.
+       */
+       public function validateLoad() {
+               $this->readInteger('lastLikeTime', true);
+               $this->readInteger('userID');
+               $this->readInteger('reactionTypeID');
+               $this->readString('targetType');
+       }
+       
+       /**
+        * Loads a list of reactions.
+        *
+        * @return      array
+        */
+       public function load() {
+               $likeList = new ViewableLikeList();
+               if ($this->parameters['lastLikeTime']) {
+                       $likeList->getConditionBuilder()->add("like_table.time < ?", [$this->parameters['lastLikeTime']]);
+               }
+               if ($this->parameters['targetType'] == 'received') {
+                       $likeList->getConditionBuilder()->add("like_table.objectUserID = ?", [$this->parameters['userID']]);
+               }
+               else {
+                       $likeList->getConditionBuilder()->add("like_table.userID = ?", [$this->parameters['userID']]);
+               }
+               $likeList->getConditionBuilder()->add("like_table.reactionTypeID = ?", [$this->parameters['reactionTypeID']]);
+               $likeList->readObjects();
+               
+               if (!count($likeList)) {
+                       return [];
+               }
+               
+               // parse template
+               WCF::getTPL()->assign([
+                       'likeList' => $likeList
+               ]);
+               
+               return [
+                       'lastLikeTime' => $likeList->getLastLikeTime(),
+                       'template' => WCF::getTPL()->fetch('userProfileLikeItem')
+               ];
+       }
 }
index 5b4013b575ebbe084fba288c9e58867437ab3b3c..e20c8acafb5ee2a84d5c49e0673eda4bb3c08888 100644 (file)
@@ -1,8 +1,8 @@
 <?php
 declare(strict_types=1);
 namespace wcf\system\menu\user\profile\content;
-use wcf\data\like\Like;
 use wcf\data\like\ViewableLikeList;
+use wcf\system\reaction\ReactionHandler;
 use wcf\system\SingletonFactory;
 use wcf\system\WCF;
 
@@ -19,15 +19,19 @@ class LikesUserProfileMenuContent extends SingletonFactory implements IUserProfi
         * @inheritDoc
         */
        public function getContent($userID) {
+               $reactionTypes = ReactionHandler::getInstance()->getReactionTypes();
+               $firstReactionType = reset($reactionTypes);
+               
                $likeList = new ViewableLikeList();
                $likeList->getConditionBuilder()->add("like_table.objectUserID = ?", [$userID]);
-               $likeList->getConditionBuilder()->add("like_table.likeValue = ?", [Like::LIKE]);
+               $likeList->getConditionBuilder()->add("like_table.reactionTypeID = ?", [$firstReactionType->reactionTypeID]);
                $likeList->readObjects();
                
                WCF::getTPL()->assign([
                        'likeList' => $likeList,
                        'userID' => $userID,
-                       'lastLikeTime' => $likeList->getLastLikeTime()
+                       'lastLikeTime' => $likeList->getLastLikeTime(), 
+                       'firstReactionTypeID' => $firstReactionType->reactionTypeID
                ]);
                
                return WCF::getTPL()->fetch('userProfileLikes');
index 9aaa09e0c26fe68d5b50be65e643c891f5b75f03..68d00c36df6584e187d68e859d8befe97465506f 100644 (file)
@@ -78,6 +78,15 @@ class ReactionHandler extends SingletonFactory {
                return JSON::encode($returnValues);
        }
        
+       /**
+        * Returns all enabled reaction types. 
+        * 
+        * @return      ReactionType[]
+        */
+       public function getReactionTypes() {
+               return ReactionTypeCache::getInstance()->getEnabledReactionTypes();
+       }
+       
        /**
         * Returns a reaction type by id. 
         * 
index 5f7b4238708cd70406a3f4021891242132606b52..2014528c4becc8ce6401fa85a661ddb185e5812c 100644 (file)
@@ -3102,14 +3102,18 @@ E-Mail-Adresse: {@$emailAddress} {* this line ends with a space *}
                <item name="wcf.like.likes.noMoreEntries"><![CDATA[Keine weiteren Likes]]></item>
                <item name="wcf.like.dislikes.more"><![CDATA[Weitere Dislikes]]></item>
                <item name="wcf.like.dislikes.noMoreEntries"><![CDATA[Keine weiteren Dislikes]]></item>
-               <item name="wcf.like.title.com.woltlab.wcf.user.profileComment"><![CDATA[Mag den Kommentar {if $commentAuthor}<a href="{link controller='User' object=$commentAuthor}{/link}">von {$commentAuthor->username}</a>{else}eines Gasts{/if} an der <a href="{$comment->getLink()}">Pinnwand von {$user->username}</a>{if $like->isDislike()} nicht{/if}.]]></item>
-               <item name="wcf.like.title.com.woltlab.wcf.user.profileComment.response"><![CDATA[Mag die Antwort {if $responseAuthor}<a href="{link controller='User' object=$responseAuthor}{/link}">von {$responseAuthor->username}</a>{else}eines Gasts{/if} zum Kommentar {if $commentAuthor}von <a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}eines Gasts{/if} an der <a href="{$response->getLink()}">Pinnwand von {$user->username}</a>{if $like->isDislike()} nicht{/if}.]]></item>
+               <item name="wcf.like.title.com.woltlab.wcf.user.profileComment"><![CDATA[Hat mit „{$like->getReactionType()->getTitle()}“ auf den Kommentar {if $commentAuthor}<a href="{link controller='User' object=$commentAuthor}{/link}">von {$commentAuthor->username}</a>{else}eines Gasts{/if} an der <a href="{$comment->getLink()}">Pinnwand von {$user->username}</a> reagiert.]]></item>
+               <item name="wcf.like.title.com.woltlab.wcf.user.profileComment.response"><![CDATA[Hat mit „{$like->getReactionType()->getTitle()}“ auf die Antwort {if $responseAuthor}<a href="{link controller='User' object=$responseAuthor}{/link}">von {$responseAuthor->username}</a>{else}eines Gasts{/if} zum Kommentar {if $commentAuthor}von <a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}eines Gasts{/if} an der <a href="{$response->getLink()}">Pinnwand von {$user->username}</a> reagiert.]]></item>
                <item name="wcf.like.objectType.com.woltlab.wcf.likeableArticle"><![CDATA[Artikel]]></item>
-               <item name="wcf.like.title.com.woltlab.wcf.likeableArticle"><![CDATA[Mag den Artikel <a href="{$article->getLink()}">{$article->getTitle()}</a>{if $like->isDislike()} nicht{/if}.]]></item>
-               <item name="wcf.like.title.com.woltlab.wcf.articleComment"><![CDATA[Mag den Kommentar {if $commentAuthor}von <a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}eines Gasts{/if} zum Artikel <a href="{$comment->getLink()}">{$articleContent->getTitle()}</a>{if $like->isDislike()} nicht{/if}.]]></item>
-               <item name="wcf.like.title.com.woltlab.wcf.articleComment.response"><![CDATA[Mag die Antwort {if $responseAuthor}von <a href="{link controller='User' object=$responseAuthor}{/link}">{$responseAuthor->username}</a>{else}eines Gasts{/if} zum Kommentar {if $commentAuthor}von <a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}eines Gasts{/if} zum Artikel <a href="{$response->getLink()}">{$articleContent->getTitle()}</a>{if $like->isDislike()} nicht{/if}.]]></item>
-               <item name="wcf.like.title.com.woltlab.wcf.pageComment"><![CDATA[Mag den Kommentar {if $commentAuthor}von <a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}eines Gasts{/if} zu der Seite <a href="{$comment->getLink()}">{$page->getTitle()}</a>{if $like->isDislike()} nicht{/if}.]]></item>
-               <item name="wcf.like.title.com.woltlab.wcf.pageComment.response"><![CDATA[Mag die Antwort {if $responseAuthor}von <a href="{link controller='User' object=$responseAuthor}{/link}">{$responseAuthor->username}</a>{else}eines Gasts{/if} zum Kommentar {if $commentAuthor}von <a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}eines Gasts{/if} zu der Seite <a href="{$response->getLink()}">{$page->getTitle()}</a>{if $like->isDislike()} nicht{/if}.]]></item>
+               <item name="wcf.like.title.com.woltlab.wcf.likeableArticle"><![CDATA[Hat mit „{$like->getReactionType()->getTitle()}“ auf den Artikel <a href="{$article->getLink()}">{$article->getTitle()}</a> reagiert.]]></item>
+               <item name="wcf.like.title.com.woltlab.wcf.articleComment"><![CDATA[Hat mit „{$like->getReactionType()->getTitle()}“ auf den Kommentar {if $commentAuthor}von <a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}eines Gasts{/if} zum Artikel <a href="{$comment->getLink()}">{$articleContent->getTitle()}</a> reagiert.]]></item>
+               <item name="wcf.like.title.com.woltlab.wcf.articleComment.response"><![CDATA[Hat mit „{$like->getReactionType()->getTitle()}“ auf die Antwort {if $responseAuthor}von <a href="{link controller='User' object=$responseAuthor}{/link}">{$responseAuthor->username}</a>{else}eines Gasts{/if} zum Kommentar {if $commentAuthor}von <a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}eines Gasts{/if} zum Artikel <a href="{$response->getLink()}">{$articleContent->getTitle()}</a> reagiert.]]></item>
+               <item name="wcf.like.title.com.woltlab.wcf.pageComment"><![CDATA[Hat mit „{$like->getReactionType()->getTitle()}“ auf den Kommentar {if $commentAuthor}von <a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}eines Gasts{/if} zu der Seite <a href="{$comment->getLink()}">{$page->getTitle()}</a> reagiert.]]></item>
+               <item name="wcf.like.title.com.woltlab.wcf.pageComment.response"><![CDATA[Hat mit „{$like->getReactionType()->getTitle()}“ auf die Antwort {if $responseAuthor}von <a href="{link controller='User' object=$responseAuthor}{/link}">{$responseAuthor->username}</a>{else}eines Gasts{/if} zum Kommentar {if $commentAuthor}von <a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}eines Gasts{/if} zu der Seite <a href="{$response->getLink()}">{$page->getTitle()}</a> reagiert.]]></item>
+               <item name="wcf.like.reaction.noMoreEntries"><![CDATA[Keine weiteren Reaktionen]]></item>
+               <item name="wcf.like.reaction.more"><![CDATA[Weitere Reaktionen]]></item>
+               <item name="wcf.like.reactionsReceived"><![CDATA[Erhaltene Reaktionen]]></item>
+               <item name="wcf.like.reactionsGiven"><![CDATA[Vergebene Reaktionen]]></item>
        </category>
        
        <category name="wcf.map">
index 79f05baf9fadb8a4bae8c0fbce506bc8fcdf5b7e..b877d53f03983cffacb85d41da4808a24abf2a64 100644 (file)
@@ -3048,14 +3048,18 @@ Email: {@$emailAddress} {* this line ends with a space *}
                <item name="wcf.like.likes.noMoreEntries"><![CDATA[There are not any new likes at the moment.]]></item>
                <item name="wcf.like.dislikes.more"><![CDATA[More Dislikes]]></item>
                <item name="wcf.like.dislikes.noMoreEntries"><![CDATA[There are not any new dislikes at the moment.]]></item>
-               <item name="wcf.like.title.com.woltlab.wcf.user.profileComment"><![CDATA[{if $like->isDislike()}Dislikes{else}Likes{/if} the comment by {if $commentAuthor}<a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}a guest{/if} on <a href="{$comment->getLink()}">{$user->username}’s wall</a>.]]></item>
-               <item name="wcf.like.title.com.woltlab.wcf.user.profileComment.response"><![CDATA[{if $like->isDislike()}Dislikes{else}Likes{/if} the response by {if $responseAuthor}<a href="{link controller='User' object=$responseAuthor}{/link}">{$responseAuthor->username}</a>{else}a guest{/if} on the comment by {if $commentAuthor}<a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}a guest{/if} on <a href="{$response->getLink()}">{$user->username}’s wall</a>.]]></item>
+               <item name="wcf.like.title.com.woltlab.wcf.user.profileComment"><![CDATA[Reacted with “{$like->getReactionType()->getTitle()}” to the comment by {if $commentAuthor}<a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}a guest{/if} on <a href="{$comment->getLink()}">{$user->username}’s wall</a>.]]></item>
+               <item name="wcf.like.title.com.woltlab.wcf.user.profileComment.response"><![CDATA[Reacted with “{$like->getReactionType()->getTitle()}” to the response by {if $responseAuthor}<a href="{link controller='User' object=$responseAuthor}{/link}">{$responseAuthor->username}</a>{else}a guest{/if} on the comment by {if $commentAuthor}<a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}a guest{/if} on <a href="{$response->getLink()}">{$user->username}’s wall</a>.]]></item>
                <item name="wcf.like.objectType.com.woltlab.wcf.likeableArticle"><![CDATA[Article]]></item>
-               <item name="wcf.like.title.com.woltlab.wcf.likeableArticle"><![CDATA[{if $like->isDislike()}Dislikes{else}Likes{/if} the article <a href="{$article->getLink()}">{$article->getTitle()}</a>.]]></item>
-               <item name="wcf.like.title.com.woltlab.wcf.articleComment"><![CDATA[{if $like->isDislike()}Dislikes{else}Likes{/if} the comment by {if $commentAuthor}<a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}a guest{/if} on the article <a href="{$comment->getLink()}">{$articleContent->getTitle()}</a>.]]></item>
-               <item name="wcf.like.title.com.woltlab.wcf.articleComment.response"><![CDATA[{if $like->isDislike()}Dislikes{else}Likes{/if} the response by {if $responseAuthor}<a href="{link controller='User' object=$responseAuthor}{/link}">{$responseAuthor->username}</a>{else}a guest{/if} on the comment by {if $commentAuthor}<a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}a guest{/if} on the article <a href="{$response->getLink()}">{$articleContent->getTitle()}</a>.]]></item>
-               <item name="wcf.like.title.com.woltlab.wcf.pageComment"><![CDATA[{if $like->isDislike()}Dislikes{else}Likes{/if} the comment by {if $commentAuthor}<a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}a guest{/if} on the page <a href="{$comment->getLink()}">{$page->getTitle()}</a>.]]></item>
-               <item name="wcf.like.title.com.woltlab.wcf.pageComment.response"><![CDATA[{if $like->isDislike()}Dislikes{else}Likes{/if} the response by {if $responseAuthor}<a href="{link controller='User' object=$responseAuthor}{/link}">{$responseAuthor->username}</a>{else}a guest{/if} on the comment by {if $commentAuthor}<a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}a guest{/if} on the page <a href="{$response->getLink()}">{$page->getTitle()}</a>.]]></item>
+               <item name="wcf.like.title.com.woltlab.wcf.likeableArticle"><![CDATA[Reacted with “{$like->getReactionType()->getTitle()}” to the article <a href="{$article->getLink()}">{$article->getTitle()}</a>.]]></item>
+               <item name="wcf.like.title.com.woltlab.wcf.articleComment"><![CDATA[Reacted with “{$like->getReactionType()->getTitle()}” to the comment by {if $commentAuthor}<a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}a guest{/if} on the article <a href="{$comment->getLink()}">{$articleContent->getTitle()}</a>.]]></item>
+               <item name="wcf.like.title.com.woltlab.wcf.articleComment.response"><![CDATA[Reacted with “{$like->getReactionType()->getTitle()}” to the response by {if $responseAuthor}<a href="{link controller='User' object=$responseAuthor}{/link}">{$responseAuthor->username}</a>{else}a guest{/if} on the comment by {if $commentAuthor}<a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}a guest{/if} on the article <a href="{$response->getLink()}">{$articleContent->getTitle()}</a>.]]></item>
+               <item name="wcf.like.title.com.woltlab.wcf.pageComment"><![CDATA[Reacted with “{$like->getReactionType()->getTitle()}” to the comment by {if $commentAuthor}<a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}a guest{/if} on the page <a href="{$comment->getLink()}">{$page->getTitle()}</a>.]]></item>
+               <item name="wcf.like.title.com.woltlab.wcf.pageComment.response"><![CDATA[Reacted with “{$like->getReactionType()->getTitle()}” to the response by {if $responseAuthor}<a href="{link controller='User' object=$responseAuthor}{/link}">{$responseAuthor->username}</a>{else}a guest{/if} on the comment by {if $commentAuthor}<a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}a guest{/if} on the page <a href="{$response->getLink()}">{$page->getTitle()}</a>.]]></item>
+               <item name="wcf.like.reaction.noMoreEntries"><![CDATA[There are not any new reactions at the moment.]]></item>
+               <item name="wcf.like.reaction.more"><![CDATA[More Reactions]]></item>
+               <item name="wcf.like.reactionsReceived"><![CDATA[Reactions Received]]></item>
+               <item name="wcf.like.reactionsGiven"><![CDATA[Reactions Given]]></item>
        </category>
        
        <category name="wcf.map">