diff --git a/public/mod/forum/amd/build/forum_overview_toggle.min.js b/public/mod/forum/amd/build/forum_overview_toggle.min.js index ab44a373170..65d2e3e3400 100644 --- a/public/mod/forum/amd/build/forum_overview_toggle.min.js +++ b/public/mod/forum/amd/build/forum_overview_toggle.min.js @@ -1,10 +1,10 @@ -define("mod_forum/forum_overview_toggle",["exports","core/notification","core/str","mod_forum/repository"],(function(_exports,_notification,_str,_repository){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} +define("mod_forum/forum_overview_toggle",["exports","core/notification","core/str","core/local/reactive/srlogger","mod_forum/repository"],(function(_exports,_notification,_str,_srlogger,_repository){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} /** * Handle forum subscription/tracking toggling. * * @module mod_forum/forum_overview_toggle * @copyright 2025 Sara Arjona * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */function registerEventListeners(toggleElement){toggleElement.addEventListener("change",(()=>{"forum-subscription-toggle"===toggleElement.dataset.type&&async function(toggleElement){const forumId=toggleElement.dataset.forumid,newState=toggleElement.dataset.targetstate;if(!forumId||!newState)return;try{const newTargetState=!!(await _repository.default.setForumSubscriptionState(forumId,newState)).userstate.subscribed;updateSwitchState(toggleElement,newTargetState,newTargetState?"subscribe":"unsubscribe")}catch(error){_notification.default.exception(error)}}(toggleElement),"forum-track-toggle"===toggleElement.dataset.type&&async function(toggleElement){const forumId=toggleElement.dataset.forumid,newState=toggleElement.dataset.targetstate;if(!forumId||!newState)return;try{const newTargetState=!!(await _repository.default.setForumTrackingState(forumId,newState)).userstate.tracked;updateSwitchState(toggleElement,newTargetState,newTargetState?"trackingon":"trackingoff")}catch(error){_notification.default.exception(error)}}(toggleElement)}))}async function updateSwitchState(toggleElement,newTargetState,stringKey){toggleElement.dataset.targetstate=newTargetState?0:1;const string=await(0,_str.getString)(stringKey,"mod_forum");toggleElement.closest("td").querySelector('label[for="'.concat(toggleElement.id,'"] span')).textContent=string}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_notification=_interopRequireDefault(_notification),_repository=_interopRequireDefault(_repository);_exports.init=toggleSelector=>{const toggleElement=document.querySelector(toggleSelector);toggleElement&®isterEventListeners(toggleElement)}})); + */function registerEventListeners(toggleElement){toggleElement.addEventListener("change",(()=>{"forum-subscription-toggle"===toggleElement.dataset.type&&async function(toggleElement){const forumId=toggleElement.dataset.forumid,forumName=toggleElement.dataset.forumname,newState=toggleElement.dataset.targetstate;if(!forumId||!newState)return;try{const newTargetState=!!(await _repository.default.setForumSubscriptionState(forumId,newState)).userstate.subscribed;await updateSwitchState(toggleElement,newTargetState,newTargetState?"subscribe":"unsubscribe");const feedbackMessage=await(0,_str.getString)(newTargetState?"subscribedtoforum":"unsubscribedfromforum","mod_forum",forumName);(new _srlogger.default).add({feedbackMessage:feedbackMessage})}catch(error){_notification.default.exception(error)}}(toggleElement),"forum-track-toggle"===toggleElement.dataset.type&&async function(toggleElement){const forumId=toggleElement.dataset.forumid,forumName=toggleElement.dataset.forumname,newState=toggleElement.dataset.targetstate;if(!forumId||!newState)return;try{const newTargetState=!!(await _repository.default.setForumTrackingState(forumId,newState)).userstate.tracked;await updateSwitchState(toggleElement,newTargetState,newTargetState?"trackingon":"trackingoff");const feedbackMessage=await(0,_str.getString)(newTargetState?"trackedforforum":"untrackedforforum","mod_forum",forumName);(new _srlogger.default).add({feedbackMessage:feedbackMessage})}catch(error){_notification.default.exception(error)}}(toggleElement)}))}async function updateSwitchState(toggleElement,newTargetState,stringKey){toggleElement.dataset.targetstate=newTargetState?0:1;const string=await(0,_str.getString)(stringKey,"mod_forum");toggleElement.closest("td").querySelector('label[for="'.concat(toggleElement.id,'"] span')).textContent=string}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_notification=_interopRequireDefault(_notification),_srlogger=_interopRequireDefault(_srlogger),_repository=_interopRequireDefault(_repository);_exports.init=toggleSelector=>{const toggleElement=document.querySelector(toggleSelector);toggleElement&®isterEventListeners(toggleElement)}})); //# sourceMappingURL=forum_overview_toggle.min.js.map \ No newline at end of file diff --git a/public/mod/forum/amd/build/forum_overview_toggle.min.js.map b/public/mod/forum/amd/build/forum_overview_toggle.min.js.map index 9c518ecb86b..231e2aea7a4 100644 --- a/public/mod/forum/amd/build/forum_overview_toggle.min.js.map +++ b/public/mod/forum/amd/build/forum_overview_toggle.min.js.map @@ -1 +1 @@ -{"version":3,"file":"forum_overview_toggle.min.js","sources":["../src/forum_overview_toggle.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Handle forum subscription/tracking toggling.\n *\n * @module mod_forum/forum_overview_toggle\n * @copyright 2025 Sara Arjona \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Notification from 'core/notification';\nimport {getString} from 'core/str';\nimport Repository from 'mod_forum/repository';\n\n/**\n * Register event listeners for the subscription/tracking toggles in the overview.\n * @param {HTMLElement} toggleElement The toggle root element\n */\nfunction registerEventListeners(toggleElement) {\n toggleElement.addEventListener('change', () => {\n if (toggleElement.dataset.type === 'forum-subscription-toggle') {\n subscriptionToggleClickHandler(toggleElement);\n }\n if (toggleElement.dataset.type === 'forum-track-toggle') {\n trackToggleClickHanldler(toggleElement);\n }\n });\n}\n\n/**\n * Toggle subscription element click handler.\n *\n * @param {HTMLElement} toggleElement The toggle element that was clicked\n * @return {Promise}\n */\nasync function subscriptionToggleClickHandler(toggleElement) {\n const forumId = toggleElement.dataset.forumid;\n const newState = toggleElement.dataset.targetstate;\n if (!forumId || !newState) {\n return;\n }\n try {\n const context = await Repository.setForumSubscriptionState(forumId, newState);\n const newTargetState = !!context.userstate.subscribed;\n\n updateSwitchState(\n toggleElement,\n newTargetState,\n newTargetState ? 'subscribe' : 'unsubscribe',\n );\n } catch (error) {\n Notification.exception(error);\n }\n}\n\n/**\n * Toggle track element click handler.\n *\n * @param {HTMLElement} toggleElement The toggle element that was clicked\n * @return {Promise}\n */\nasync function trackToggleClickHanldler(toggleElement) {\n const forumId = toggleElement.dataset.forumid;\n const newState = toggleElement.dataset.targetstate;\n if (!forumId || !newState) {\n return;\n }\n try {\n const context = await Repository.setForumTrackingState(forumId, newState);\n const newTargetState = !!context.userstate.tracked;\n\n updateSwitchState(\n toggleElement,\n newTargetState,\n newTargetState ? 'trackingon' : 'trackingoff',\n );\n } catch (error) {\n Notification.exception(error);\n }\n}\n\n/**\n * Update the switch state of the toggle element.\n *\n * @param {HTMLElement} toggleElement The toggle element to update\n * @param {Boolean} newTargetState The new target state to set (true for subscribed, false for unsubscribed)\n * @param {string} stringKey The string key to retrieve the label text\n * @return {Promise}\n */\nasync function updateSwitchState(toggleElement, newTargetState, stringKey) {\n toggleElement.dataset.targetstate = newTargetState ? 0 : 1;\n const string = await getString(stringKey, 'mod_forum');\n const label = toggleElement.closest('td').querySelector(`label[for=\"${toggleElement.id}\"] span`);\n label.textContent = string;\n}\n\n/**\n * Initialize the forum overview toggle functionality.\n *\n * @param {string} toggleSelector The CSS selector for the toggle element to initialize\n * @throws {Error} If no elements are found with the provided selector\n */\nexport const init = (toggleSelector) => {\n const toggleElement = document.querySelector(toggleSelector);\n if (!toggleElement) {\n // If the user cannot track/subscribe to any course forum, the toggle will not be present.\n return;\n }\n registerEventListeners(toggleElement);\n};\n"],"names":["registerEventListeners","toggleElement","addEventListener","dataset","type","forumId","forumid","newState","targetstate","newTargetState","Repository","setForumSubscriptionState","userstate","subscribed","updateSwitchState","error","exception","subscriptionToggleClickHandler","setForumTrackingState","tracked","trackToggleClickHanldler","stringKey","string","closest","querySelector","id","textContent","toggleSelector","document"],"mappings":";;;;;;;cA+BSA,uBAAuBC,eAC5BA,cAAcC,iBAAiB,UAAU,KACF,8BAA/BD,cAAcE,QAAQC,qBAeYH,qBACpCI,QAAUJ,cAAcE,QAAQG,QAChCC,SAAWN,cAAcE,QAAQK,gBAClCH,UAAYE,0BAKPE,wBADgBC,oBAAWC,0BAA0BN,QAASE,WACnCK,UAAUC,WAE3CC,kBACIb,cACAQ,eACAA,eAAiB,YAAc,eAErC,MAAOM,6BACQC,UAAUD,QA9BnBE,CAA+BhB,eAEA,uBAA/BA,cAAcE,QAAQC,qBAsCMH,qBAC9BI,QAAUJ,cAAcE,QAAQG,QAChCC,SAAWN,cAAcE,QAAQK,gBAClCH,UAAYE,0BAKPE,wBADgBC,oBAAWQ,sBAAsBb,QAASE,WAC/BK,UAAUO,QAE3CL,kBACIb,cACAQ,eACAA,eAAiB,aAAe,eAEtC,MAAOM,6BACQC,UAAUD,QArDnBK,CAAyBnB,iCAiEtBa,kBAAkBb,cAAeQ,eAAgBY,WAC5DpB,cAAcE,QAAQK,YAAcC,eAAiB,EAAI,QACnDa,aAAe,kBAAUD,UAAW,aAC5BpB,cAAcsB,QAAQ,MAAMC,mCAA4BvB,cAAcwB,eAC9EC,YAAcJ,sMASHK,uBACX1B,cAAgB2B,SAASJ,cAAcG,gBACxC1B,eAILD,uBAAuBC"} \ No newline at end of file +{"version":3,"file":"forum_overview_toggle.min.js","sources":["../src/forum_overview_toggle.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Handle forum subscription/tracking toggling.\n *\n * @module mod_forum/forum_overview_toggle\n * @copyright 2025 Sara Arjona \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Notification from 'core/notification';\nimport {getString} from 'core/str';\nimport SRLogger from 'core/local/reactive/srlogger';\nimport Repository from 'mod_forum/repository';\n\n/**\n * Register event listeners for the subscription/tracking toggles in the overview.\n * @param {HTMLElement} toggleElement The toggle root element\n */\nfunction registerEventListeners(toggleElement) {\n toggleElement.addEventListener('change', () => {\n if (toggleElement.dataset.type === 'forum-subscription-toggle') {\n subscriptionToggleClickHandler(toggleElement);\n }\n if (toggleElement.dataset.type === 'forum-track-toggle') {\n trackToggleClickHanldler(toggleElement);\n }\n });\n}\n\n/**\n * Toggle subscription element click handler.\n *\n * @param {HTMLElement} toggleElement The toggle element that was clicked\n * @return {Promise}\n */\nasync function subscriptionToggleClickHandler(toggleElement) {\n const forumId = toggleElement.dataset.forumid;\n const forumName = toggleElement.dataset.forumname;\n const newState = toggleElement.dataset.targetstate;\n if (!forumId || !newState) {\n return;\n }\n try {\n const context = await Repository.setForumSubscriptionState(forumId, newState);\n const newTargetState = !!context.userstate.subscribed;\n\n await updateSwitchState(\n toggleElement,\n newTargetState,\n newTargetState ? 'subscribe' : 'unsubscribe',\n );\n\n const feedbackMessage = await getString(\n newTargetState ? 'subscribedtoforum' : 'unsubscribedfromforum',\n 'mod_forum',\n forumName,\n );\n new SRLogger().add({feedbackMessage});\n } catch (error) {\n Notification.exception(error);\n }\n}\n\n/**\n * Toggle track element click handler.\n *\n * @param {HTMLElement} toggleElement The toggle element that was clicked\n * @return {Promise}\n */\nasync function trackToggleClickHanldler(toggleElement) {\n const forumId = toggleElement.dataset.forumid;\n const forumName = toggleElement.dataset.forumname;\n const newState = toggleElement.dataset.targetstate;\n if (!forumId || !newState) {\n return;\n }\n try {\n const context = await Repository.setForumTrackingState(forumId, newState);\n const newTargetState = !!context.userstate.tracked;\n\n await updateSwitchState(\n toggleElement,\n newTargetState,\n newTargetState ? 'trackingon' : 'trackingoff',\n );\n\n const feedbackMessage = await getString(\n newTargetState ? 'trackedforforum' : 'untrackedforforum',\n 'mod_forum',\n forumName,\n );\n new SRLogger().add({feedbackMessage});\n } catch (error) {\n Notification.exception(error);\n }\n}\n\n/**\n * Update the switch state of the toggle element.\n *\n * @param {HTMLElement} toggleElement The toggle element to update\n * @param {Boolean} newTargetState The new target state to set (true for subscribed, false for unsubscribed)\n * @param {string} stringKey The string key to retrieve the label text\n * @return {Promise}\n */\nasync function updateSwitchState(toggleElement, newTargetState, stringKey) {\n toggleElement.dataset.targetstate = newTargetState ? 0 : 1;\n const string = await getString(stringKey, 'mod_forum');\n const label = toggleElement.closest('td').querySelector(`label[for=\"${toggleElement.id}\"] span`);\n label.textContent = string;\n}\n\n/**\n * Initialize the forum overview toggle functionality.\n *\n * @param {string} toggleSelector The CSS selector for the toggle element to initialize\n * @throws {Error} If no elements are found with the provided selector\n */\nexport const init = (toggleSelector) => {\n const toggleElement = document.querySelector(toggleSelector);\n if (!toggleElement) {\n // If the user cannot track/subscribe to any course forum, the toggle will not be present.\n return;\n }\n registerEventListeners(toggleElement);\n};\n"],"names":["registerEventListeners","toggleElement","addEventListener","dataset","type","forumId","forumid","forumName","forumname","newState","targetstate","newTargetState","Repository","setForumSubscriptionState","userstate","subscribed","updateSwitchState","feedbackMessage","SRLogger","add","error","exception","subscriptionToggleClickHandler","setForumTrackingState","tracked","trackToggleClickHanldler","stringKey","string","closest","querySelector","id","textContent","toggleSelector","document"],"mappings":";;;;;;;cAgCSA,uBAAuBC,eAC5BA,cAAcC,iBAAiB,UAAU,KACF,8BAA/BD,cAAcE,QAAQC,qBAeYH,qBACpCI,QAAUJ,cAAcE,QAAQG,QAChCC,UAAYN,cAAcE,QAAQK,UAClCC,SAAWR,cAAcE,QAAQO,gBAClCL,UAAYI,0BAKPE,wBADgBC,oBAAWC,0BAA0BR,QAASI,WACnCK,UAAUC,iBAErCC,kBACFf,cACAU,eACAA,eAAiB,YAAc,qBAG7BM,sBAAwB,kBAC1BN,eAAiB,oBAAsB,wBACvC,YACAJ,gBAEAW,mBAAWC,IAAI,CAACF,gBAAAA,kBACtB,MAAOG,6BACQC,UAAUD,QAtCnBE,CAA+BrB,eAEA,uBAA/BA,cAAcE,QAAQC,qBA8CMH,qBAC9BI,QAAUJ,cAAcE,QAAQG,QAChCC,UAAYN,cAAcE,QAAQK,UAClCC,SAAWR,cAAcE,QAAQO,gBAClCL,UAAYI,0BAKPE,wBADgBC,oBAAWW,sBAAsBlB,QAASI,WAC/BK,UAAUU,cAErCR,kBACFf,cACAU,eACAA,eAAiB,aAAe,qBAG9BM,sBAAwB,kBAC1BN,eAAiB,kBAAoB,oBACrC,YACAJ,gBAEAW,mBAAWC,IAAI,CAACF,gBAAAA,kBACtB,MAAOG,6BACQC,UAAUD,QArEnBK,CAAyBxB,iCAiFtBe,kBAAkBf,cAAeU,eAAgBe,WAC5DzB,cAAcE,QAAQO,YAAcC,eAAiB,EAAI,QACnDgB,aAAe,kBAAUD,UAAW,aAC5BzB,cAAc2B,QAAQ,MAAMC,mCAA4B5B,cAAc6B,eAC9EC,YAAcJ,kPASHK,uBACX/B,cAAgBgC,SAASJ,cAAcG,gBACxC/B,eAILD,uBAAuBC"} \ No newline at end of file diff --git a/public/mod/forum/amd/src/forum_overview_toggle.js b/public/mod/forum/amd/src/forum_overview_toggle.js index c1c10826671..a91f24f91d8 100644 --- a/public/mod/forum/amd/src/forum_overview_toggle.js +++ b/public/mod/forum/amd/src/forum_overview_toggle.js @@ -23,6 +23,7 @@ import Notification from 'core/notification'; import {getString} from 'core/str'; +import SRLogger from 'core/local/reactive/srlogger'; import Repository from 'mod_forum/repository'; /** @@ -48,6 +49,7 @@ function registerEventListeners(toggleElement) { */ async function subscriptionToggleClickHandler(toggleElement) { const forumId = toggleElement.dataset.forumid; + const forumName = toggleElement.dataset.forumname; const newState = toggleElement.dataset.targetstate; if (!forumId || !newState) { return; @@ -56,11 +58,18 @@ async function subscriptionToggleClickHandler(toggleElement) { const context = await Repository.setForumSubscriptionState(forumId, newState); const newTargetState = !!context.userstate.subscribed; - updateSwitchState( + await updateSwitchState( toggleElement, newTargetState, newTargetState ? 'subscribe' : 'unsubscribe', ); + + const feedbackMessage = await getString( + newTargetState ? 'subscribedtoforum' : 'unsubscribedfromforum', + 'mod_forum', + forumName, + ); + new SRLogger().add({feedbackMessage}); } catch (error) { Notification.exception(error); } @@ -74,6 +83,7 @@ async function subscriptionToggleClickHandler(toggleElement) { */ async function trackToggleClickHanldler(toggleElement) { const forumId = toggleElement.dataset.forumid; + const forumName = toggleElement.dataset.forumname; const newState = toggleElement.dataset.targetstate; if (!forumId || !newState) { return; @@ -82,11 +92,18 @@ async function trackToggleClickHanldler(toggleElement) { const context = await Repository.setForumTrackingState(forumId, newState); const newTargetState = !!context.userstate.tracked; - updateSwitchState( + await updateSwitchState( toggleElement, newTargetState, newTargetState ? 'trackingon' : 'trackingoff', ); + + const feedbackMessage = await getString( + newTargetState ? 'trackedforforum' : 'untrackedforforum', + 'mod_forum', + forumName, + ); + new SRLogger().add({feedbackMessage}); } catch (error) { Notification.exception(error); } diff --git a/public/mod/forum/classes/courseformat/overview.php b/public/mod/forum/classes/courseformat/overview.php index 36718ba77a2..f2ff8b0d80c 100644 --- a/public/mod/forum/classes/courseformat/overview.php +++ b/public/mod/forum/classes/courseformat/overview.php @@ -201,12 +201,18 @@ class overview extends \core_courseformat\activityoverviewbase { $label = get_string('trackforum', 'mod_forum'); } + $arialabel = $tracked + ? get_string('untrackforforum', 'mod_forum', $this->forum->name) + : get_string('trackforforum', 'mod_forum', $this->forum->name); + $renderer = $this->rendererhelper->get_renderer('mod_forum'); - $dataattributes = [ + $extraattributes = [ ['name' => 'data-type', 'value' => 'forum-track-toggle'], ['name' => 'data-action', 'value' => 'toggle'], ['name' => 'data-forumid', 'value' => $this->forum->id], + ['name' => 'data-forumname', 'value' => $this->forum->name], ['name' => 'data-targetstate', 'value' => !$tracked], + ['name' => 'aria-label', 'value' => $arialabel], ]; $content = $renderer->render_from_template( 'core/toggle', @@ -214,7 +220,7 @@ class overview extends \core_courseformat\activityoverviewbase { 'id' => 'forum-track-toggle-' . $this->forum->id, 'checked' => $tracked, 'disabled' => $disabled, - 'extraattributes' => $dataattributes, + 'extraattributes' => $extraattributes, 'label' => $label, 'labelclasses' => 'visually-hidden', ], @@ -265,20 +271,27 @@ class overview extends \core_courseformat\activityoverviewbase { } } + $arialabel = $subscribed + ? get_string('unsubscribefromforum', 'mod_forum', $this->forum->name) + : get_string('subscribetoforum', 'mod_forum', $this->forum->name); + $renderer = $this->rendererhelper->get_renderer('mod_forum'); - $dataattributes = [ + $extraattributes = [ ['name' => 'data-type', 'value' => 'forum-subscription-toggle'], ['name' => 'data-action', 'value' => 'toggle'], ['name' => 'data-forumid', 'value' => $this->forum->id], + ['name' => 'data-forumname', 'value' => $this->forum->name], ['name' => 'data-targetstate', 'value' => !$subscribed], + ['name' => 'aria-label', 'value' => $arialabel], ]; + $content = $renderer->render_from_template( 'core/toggle', [ 'id' => 'forum-subscription-toggle-' . $this->forum->id, 'checked' => $subscribed, 'disabled' => $disabled, - 'extraattributes' => $dataattributes, + 'extraattributes' => $extraattributes, 'label' => $label, 'labelclasses' => 'visually-hidden', ], diff --git a/public/mod/forum/lang/en/forum.php b/public/mod/forum/lang/en/forum.php index ddd02e88aa6..bb22a48fd49 100644 --- a/public/mod/forum/lang/en/forum.php +++ b/public/mod/forum/lang/en/forum.php @@ -677,6 +677,8 @@ $string['subject'] = 'Subject'; $string['subplugintype_forumreport'] = 'Forum report'; $string['subplugintype_forumreport_plural'] = 'Forum reports'; $string['subscribe'] = 'Subscribe to forum'; +$string['subscribedtoforum'] = 'Subscribed to {$a}'; +$string['subscribetoforum'] = 'Subscribe to forum {$a}'; $string['subscribediscussion'] = 'Subscribe to this discussion'; $string['subscribeall'] = 'Subscribe everyone to this forum'; $string['subscribeenrolledonly'] = 'Sorry, only enrolled users are allowed to subscribe to forum post notifications.'; @@ -715,6 +717,8 @@ $string['timestartenderror'] = 'Display end date cannot be earlier than the star $string['togglediscussionmenu'] = 'Toggle the discussion menu'; $string['togglefullscreen'] = 'Toggle full screen'; $string['togglesettingsdrawer'] = 'Toggle settings drawer'; +$string['trackedforforum'] = 'Tracking on for {$a}'; +$string['trackforforum'] = 'Track new posts for forum {$a}'; $string['trackforum'] = 'Track unread posts'; $string['trackreadposts_header'] = 'Forum tracking'; $string['tracking'] = 'Track'; @@ -734,6 +738,7 @@ $string['unreadposts'] = 'Unread posts'; $string['unreadpostsnumber'] = '{$a} unread posts'; $string['unreadpostsone'] = '1 unread post'; $string['unsubscribe'] = 'Unsubscribe from forum'; +$string['unsubscribefromforum'] = 'Unsubscribe from forum {$a}'; $string['unsubscribelink'] = 'Unsubscribe from this forum: {$a}'; $string['unsubscribediscussion'] = 'Unsubscribe from this discussion'; $string['unsubscribediscussionlink'] = 'Unsubscribe from this discussion: {$a}'; @@ -744,7 +749,10 @@ $string['unsubscribeallconfirmdiscussions'] = 'You are currently subscribed to { $string['unsubscribealldone'] = 'All optional forum subscriptions were removed. You will still receive notifications from forums with forced subscription. To manage forum notifications go to Messaging in My Profile Settings.'; $string['unsubscribeallempty'] = 'You are not subscribed to any forums. To disable all notifications from this server go to Messaging in My Profile Settings.'; $string['unsubscribed'] = 'Unsubscribed'; +$string['unsubscribedfromforum'] = 'Unsubscribed from {$a}'; $string['unsubscribeshort'] = 'Unsubscribe'; +$string['untrackedforforum'] = 'Tracking off for {$a}'; +$string['untrackforforum'] = 'Do not track new posts for forum {$a}'; $string['useexperimentalui'] = 'Use experimental nested discussion view'; $string['usermarksread'] = 'Manual message read marking'; $string['usernavigation'] = 'User navigation';