From 4b66bcfe047dc07c8b36c833efc8b0fa328efac8 Mon Sep 17 00:00:00 2001 From: Hannes Mannerheim Date: Sun, 29 Nov 2015 20:19:23 +0100 Subject: [PATCH] lists --- QvitterPlugin.php | 30 +++++ actions/apiqvitterlistmembers.php | 172 ++++++++++++++++++++++++++ actions/apiqvitterlistsubscribers.php | 172 ++++++++++++++++++++++++++ actions/apiqvittertimelinelist.php | 161 ++++++++++++++++++++++++ js/dom-functions.js | 5 + js/stream-router.js | 56 +++++++++ locale/ar.json | 7 +- locale/ast.json | 7 +- locale/ca.json | 7 +- locale/de.json | 7 +- locale/en.json | 7 +- locale/eo.json | 7 +- locale/es.json | 7 +- locale/es_ahorita.json | 7 +- locale/eu.json | 7 +- locale/fa.json | 7 +- locale/fi.json | 7 +- locale/fr.json | 7 +- locale/gl.json | 7 +- locale/he.json | 7 +- locale/io.json | 7 +- locale/it.json | 7 +- locale/no.json | 7 +- locale/pt_br.json | 7 +- locale/sv.json | 7 +- locale/zh_cn.json | 7 +- locale/zh_tw.json | 7 +- 27 files changed, 722 insertions(+), 21 deletions(-) create mode 100644 actions/apiqvitterlistmembers.php create mode 100644 actions/apiqvitterlistsubscribers.php create mode 100644 actions/apiqvittertimelinelist.php diff --git a/QvitterPlugin.php b/QvitterPlugin.php index 5fbeba6..1adebe4 100644 --- a/QvitterPlugin.php +++ b/QvitterPlugin.php @@ -141,6 +141,19 @@ class QvitterPlugin extends Plugin { public function onRouterInitialized($m) { + + $m->connect('api/qvitter/:nickname/lists/:id/subscribers.json', + array('action' => 'ApiQvitterListSubscribers', + 'nickname' => '[a-zA-Z0-9]+', + 'id' => '[a-zA-Z0-9]+')); + $m->connect('api/qvitter/:nickname/lists/:id/members.json', + array('action' => 'ApiQvitterListMembers', + 'nickname' => '[a-zA-Z0-9]+', + 'id' => '[a-zA-Z0-9]+')); + $m->connect('api/qvitter/:nickname/lists/:id/statuses.json', + array('action' => 'ApiQvitterTimelineList', + 'nickname' => '[a-zA-Z0-9]+', + 'id' => '[a-zA-Z0-9]+')); $m->connect('api/qvitter/blocks.json', array('action' => 'ApiQvitterBlocks')); $m->connect('api/qvitter/hello.json', @@ -277,6 +290,23 @@ class QvitterPlugin extends Plugin { array('action' => 'groupmembers'), array('nickname' => Nickname::DISPLAY_FMT), 'qvitter'); + URLMapperOverwrite::overwrite_variable($m, ':nickname/all/:tag', + array('action' => 'showprofiletag'), + array('nickname' => Nickname::DISPLAY_FMT, + 'tag' => Router::REGEX_TAG), + 'qvitter'); + URLMapperOverwrite::overwrite_variable($m, ':tagger/all/:tag/tagged', + array('action' => 'peopletagged'), + array('tagger' => Nickname::DISPLAY_FMT, + 'tag' => Router::REGEX_TAG), + 'qvitter'); + URLMapperOverwrite::overwrite_variable($m, ':tagger/all/:tag/subscribers', + array('action' => 'peopletagsubscribers'), + array('tagger' => Nickname::DISPLAY_FMT, + 'tag' => Router::REGEX_TAG), + 'qvitter'); + + $m->connect('group/:nickname/admins', array('action' => 'qvitter'), diff --git a/actions/apiqvitterlistmembers.php b/actions/apiqvitterlistmembers.php new file mode 100644 index 0000000..690d465 --- /dev/null +++ b/actions/apiqvitterlistmembers.php @@ -0,0 +1,172 @@ +. + * + * @category API + * @package GNUsocial + * @author Craig Andrews + * @author Evan Prodromou + * @author Jeffery To + * @author Zach Copley + * @author Hannes Mannerheim + * @copyright 2009 StatusNet, Inc. + * @copyright 2009 Free Software Foundation, Inc http://www.fsf.org + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://www.gnu.org/software/social/ + */ + +if (!defined('GNUSOCIAL')) { + exit(1); +} + +/** + * List 20 newest admins of the group specified by name or ID. + * + * @category API + * @package GNUsocial + * @author Craig Andrews + * @author Evan Prodromou + * @author Jeffery To + * @author Zach Copley + * @author Hannes Mannerheim + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://www.gnu.org/software/social/ + */ +class ApiQvitterListMembersAction extends ApiPrivateAuthAction +{ + var $list = null; + var $profiles = null; + + /** + * Take arguments for running + * + * @param array $args $_REQUEST args + * + * @return boolean success flag + */ + protected function prepare(array $args=array()) + { + parent::prepare($args); + + $this->list = $this->getTargetList($this->arg('nickname'), $this->arg('id')); + if (!$this->list instanceof Profile_list) { + // TRANS: Client error displayed trying to show list membership on a non-existing list. + $this->clientError(_('List not found.'), 404); + } + + $this->profiles = $this->getProfiles(); + + return true; + } + + /** + * Handle the request + * + * Show the admin of the group + * + * @param array $args $_REQUEST data (unused) + * + * @return void + */ + protected function handle() + { + parent::handle(); + $this->showJsonUsers($this->profiles); + } + + /** + * Fetch the admins of a group + * + * @return array $profiles list of profiles + */ + function getProfiles() + { + $profiles = array(); + + $profile = $this->list->getTagged( + ($this->page - 1) * $this->count, + $this->count, + $this->since_id, + $this->max_id + ); + + while ($profile->fetch()) { + $profiles[] = clone($profile); + } + + return $profiles; + } + + /** + * Is this action read only? + * + * @param array $args other arguments + * + * @return boolean true + */ + function isReadOnly($args) + { + return true; + } + + /** + * When was this list of profiles last modified? + * + * @return string datestamp of the lastest profile in the group + */ + function lastModified() + { + if (!empty($this->profiles) && (count($this->profiles) > 0)) { + return strtotime($this->profiles[0]->created); + } + + return null; + } + + /** + * An entity tag for this list of groups + * + * Returns an Etag based on the action name, language + * the group id, and timestamps of the first and last + * user who has joined the group + * + * @return string etag + */ + function etag() + { + if (!empty($this->profiles) && (count($this->profiles) > 0)) { + + $last = count($this->profiles) - 1; + + return '"' . implode( + ':', + array($this->arg('action'), + common_user_cache_hash($this->auth_user), + common_language(), + $this->group->id, + strtotime($this->profiles[0]->created), + strtotime($this->profiles[$last]->created)) + ) + . '"'; + } + + return null; + } +} diff --git a/actions/apiqvitterlistsubscribers.php b/actions/apiqvitterlistsubscribers.php new file mode 100644 index 0000000..38bf5ab --- /dev/null +++ b/actions/apiqvitterlistsubscribers.php @@ -0,0 +1,172 @@ +. + * + * @category API + * @package GNUsocial + * @author Craig Andrews + * @author Evan Prodromou + * @author Jeffery To + * @author Zach Copley + * @author Hannes Mannerheim + * @copyright 2009 StatusNet, Inc. + * @copyright 2009 Free Software Foundation, Inc http://www.fsf.org + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://www.gnu.org/software/social/ + */ + +if (!defined('GNUSOCIAL')) { + exit(1); +} + +/** + * List 20 newest admins of the group specified by name or ID. + * + * @category API + * @package GNUsocial + * @author Craig Andrews + * @author Evan Prodromou + * @author Jeffery To + * @author Zach Copley + * @author Hannes Mannerheim + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://www.gnu.org/software/social/ + */ +class ApiQvitterListSubscribersAction extends ApiPrivateAuthAction +{ + var $list = null; + var $profiles = null; + + /** + * Take arguments for running + * + * @param array $args $_REQUEST args + * + * @return boolean success flag + */ + protected function prepare(array $args=array()) + { + parent::prepare($args); + + $this->list = $this->getTargetList($this->arg('nickname'), $this->arg('id')); + if (!$this->list instanceof Profile_list) { + // TRANS: Client error displayed trying to show list membership on a non-existing list. + $this->clientError(_('List not found.'), 404); + } + + $this->profiles = $this->getProfiles(); + + return true; + } + + /** + * Handle the request + * + * Show the admin of the group + * + * @param array $args $_REQUEST data (unused) + * + * @return void + */ + protected function handle() + { + parent::handle(); + $this->showJsonUsers($this->profiles); + } + + /** + * Fetch the admins of a group + * + * @return array $profiles list of profiles + */ + function getProfiles() + { + $profiles = array(); + + $profile = $this->list->getSubscribers( + ($this->page - 1) * $this->count, + $this->count, + $this->since_id, + $this->max_id + ); + + while ($profile->fetch()) { + $profiles[] = clone($profile); + } + + return $profiles; + } + + /** + * Is this action read only? + * + * @param array $args other arguments + * + * @return boolean true + */ + function isReadOnly($args) + { + return true; + } + + /** + * When was this list of profiles last modified? + * + * @return string datestamp of the lastest profile in the group + */ + function lastModified() + { + if (!empty($this->profiles) && (count($this->profiles) > 0)) { + return strtotime($this->profiles[0]->created); + } + + return null; + } + + /** + * An entity tag for this list of groups + * + * Returns an Etag based on the action name, language + * the group id, and timestamps of the first and last + * user who has joined the group + * + * @return string etag + */ + function etag() + { + if (!empty($this->profiles) && (count($this->profiles) > 0)) { + + $last = count($this->profiles) - 1; + + return '"' . implode( + ':', + array($this->arg('action'), + common_user_cache_hash($this->auth_user), + common_language(), + $this->group->id, + strtotime($this->profiles[0]->created), + strtotime($this->profiles[$last]->created)) + ) + . '"'; + } + + return null; + } +} diff --git a/actions/apiqvittertimelinelist.php b/actions/apiqvittertimelinelist.php new file mode 100644 index 0000000..d999593 --- /dev/null +++ b/actions/apiqvittertimelinelist.php @@ -0,0 +1,161 @@ + \\\\_\ · + · \\) \____) · + · · + · · + · · + · Qvitter is free software: you can redistribute it and / or modify it · + · under the terms of the GNU Affero General Public License as published by · + · the Free Software Foundation, either version three of the License or (at · + · your option) any later version. · + · · + · Qvitter is distributed in hope that it will be useful but WITHOUT ANY · + · WARRANTY; without even the implied warranty of MERCHANTABILTY or FITNESS · + · FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for · + · more details. · + · · + · You should have received a copy of the GNU Affero General Public License · + · along with Qvitter. If not, see . · + · · + · Contact h@nnesmannerhe.im if you have any questions. · + · · + · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · */ + +if (!defined('STATUSNET')) { + exit(1); +} + +/** + * Returns the most recent notices (default 20) in the list + */ + +class ApiQvitterTimelineListAction extends ApiBareAuthAction +{ + var $notices = null; + var $list = null; + + /** + * Take arguments for running + * + * @param array $args $_REQUEST args + * + * @return boolean success flag + * + */ + protected function prepare(array $args=array()) + { + parent::prepare($args); + + $this->list = $this->getTargetList($this->arg('nickname'), $this->arg('id')); + if (!($this->list instanceof Profile_list)) { + // TRANS: Client error displayed when requesting a non existing list + $this->clientError(_('List not found.'), 404); + } + $this->notices = $this->getNotices(); + + return true; + } + + /** + * Handle the request + * + * Just show the notices + * + * @return void + */ + protected function handle() + { + parent::handle(); + $this->showJsonTimeline($this->notices); + } + + + /** + * Get notices + * + * @return array notices + */ + function getNotices() + { + $notices = array(); + + $stream = new PeopletagNoticeStream($this->list); + + $notice = $stream->getNotices(($this->page - 1) * $this->count, + $this->count, + $this->since_id, + $this->max_id); + + $notices = $notice->fetchAll(); + + NoticeList::prefill($notices); + + return $notices; + } + + /** + * Is this action read only? + * + * @param array $args other arguments + * + * @return boolean true + */ + function isReadOnly($args) + { + return true; + } + + /** + * When was this feed last modified? + * + * @return string datestamp of the latest notice in the stream + */ + function lastModified() + { + if (!empty($this->notices) && (count($this->notices) > 0)) { + return strtotime($this->notices[0]->created); + } + + return null; + } + + /** + * An entity tag for this stream + * + * Returns an Etag based on the action name, language, and + * timestamps of the first and last notice in the timeline + * + * @return string etag + */ + function etag() + { + if (!empty($this->notices) && (count($this->notices) > 0)) { + + $last = count($this->notices) - 1; + + return '"' . implode( + ':', + array($this->arg('action'), + common_user_cache_hash($this->auth_user), + common_language(), + strtotime($this->notices[0]->created), + strtotime($this->notices[$last]->created)) + ) + . '"'; + } + + return null; + } +} diff --git a/js/dom-functions.js b/js/dom-functions.js index 5599816..4c75a49 100644 --- a/js/dom-functions.js +++ b/js/dom-functions.js @@ -821,6 +821,11 @@ function setNewCurrentStream(streamObject,setLocation,fallbackId,actionOnSuccess || streamObject.name == 'group admin list') { showErrorMessage(window.sL.ERRORcouldNotFindGroupWithNickname.replace('{nickname}',replaceHtmlSpecialChars(streamObject.nickname))); } + else if(streamObject.name == 'list notice stream' + || streamObject.name == 'list members' + || streamObject.name == 'list subscribers') { + showErrorMessage(window.sL.ERRORcouldNotFindList); + } else { showErrorMessage(window.sL.ERRORcouldNotFindPage + '

url: ' + url); } diff --git a/js/stream-router.js b/js/stream-router.js index bfe978d..da647ea 100644 --- a/js/stream-router.js +++ b/js/stream-router.js @@ -426,6 +426,62 @@ function pathToStreamRouter(path) { return streamObject; } + // {screen_name}/all/{listname} + if(pathSplit.length == 3 && /^[a-zA-Z0-9]+$/.test(pathSplit[0]) && pathSplit[1] == 'all' && /^[a-zA-Z0-9]+$/.test(pathSplit[2])) { + streamObject.name = 'list notice stream'; + streamObject.nickname = pathSplit[2]; + streamObject.stream = 'qvitter/' + pathSplit[0] + '/lists/' + pathSplit[2] + '/statuses.json'; + streamObject.type = 'notices'; + if(window.loggedIn.screen_name == pathSplit[0]) { + streamObject.streamHeader = window.sL.myListWithListName.replace('{list-name}',streamObject.nickname); + streamObject.streamSubHeader = window.sL.myListWithListName.replace('{list-name}',streamObject.nickname) + ''; + } + else { + streamObject.streamHeader = window.sL.nicknamesListWithListName.replace('{list-name}',streamObject.nickname).replace('{nickname}',pathSplit[0]); + streamObject.streamSubHeader = window.sL.nicknamesListWithListName.replace('{list-name}',streamObject.nickname).replace('{nickname}',pathSplit[0]) + ''; + } + return streamObject; + } + + // {screen_name}/all/{listname}/members + if(pathSplit.length == 4 && /^[a-zA-Z0-9]+$/.test(pathSplit[0]) && pathSplit[1] == 'all' && /^[a-zA-Z0-9]+$/.test(pathSplit[2]) && pathSplit[3] == 'tagged') { + streamObject.name = 'list members'; + streamObject.nickname = pathSplit[2]; + streamObject.parentPath = pathSplit[0] + '/all/' + pathSplit[2]; + streamObject.stream = 'qvitter/' + pathSplit[0] + '/lists/' + pathSplit[2] + '/members.json'; + streamObject.maxIdOrPage = 'page'; + streamObject.type = 'users'; + if(window.loggedIn.screen_name == pathSplit[0]) { + streamObject.streamHeader = window.sL.myListWithListName.replace('{list-name}',streamObject.nickname); + streamObject.streamSubHeader = '' + window.sL.listMembers + ''; + } + else { + streamObject.streamHeader = window.sL.nicknamesListWithListName.replace('{list-name}',streamObject.nickname).replace('{nickname}',pathSplit[0]); + streamObject.streamSubHeader = '' + window.sL.listMembers + ''; + } + return streamObject; + } + + // {screen_name}/all/{listname}/subscribers + if(pathSplit.length == 4 && /^[a-zA-Z0-9]+$/.test(pathSplit[0]) && pathSplit[1] == 'all' && /^[a-zA-Z0-9]+$/.test(pathSplit[2]) && pathSplit[3] == 'subscribers') { + streamObject.name = 'list subscribers'; + streamObject.nickname = pathSplit[2]; + streamObject.parentPath = pathSplit[0] + '/all/' + pathSplit[2]; + streamObject.stream = 'qvitter/' + pathSplit[0] + '/lists/' + pathSplit[2] + '/subscribers.json'; + streamObject.maxIdOrPage = 'page'; + streamObject.type = 'users'; + if(window.loggedIn.screen_name == pathSplit[0]) { + streamObject.streamHeader = window.sL.myListWithListName.replace('{list-name}',streamObject.nickname); + streamObject.streamSubHeader = '' + window.sL.listSubscribers; + } + else { + streamObject.streamHeader = window.sL.nicknamesListWithListName.replace('{list-name}',streamObject.nickname).replace('{nickname}',pathSplit[0]); + streamObject.streamSubHeader = '' + window.sL.listSubscribers; + } + return streamObject; + } + + // other plugins can add streams to Qvitter if(window.pluginStreamObjects.length > 0) { $.each(window.pluginStreamObjects,function(k,pluginStreamObject) { diff --git a/locale/ar.json b/locale/ar.json index 7518642..8aed90c 100644 --- a/locale/ar.json +++ b/locale/ar.json @@ -151,5 +151,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.", "newNotification": "{new-notice-count} new notification", "newNotifications": "{new-notice-count} new notifications", - "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it." + "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it.", + "nicknamesListWithListName":"{nickname}’s list: {list-name}", + "myListWithListName":"My list: {list-name}", + "listMembers":"Members", + "listSubscribers":"Subscribers", + "ERRORcouldNotFindList":"There is no such list." } diff --git a/locale/ast.json b/locale/ast.json index 79a12f6..62a7bf8 100644 --- a/locale/ast.json +++ b/locale/ast.json @@ -151,5 +151,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.", "newNotification": "{new-notice-count} new notification", "newNotifications": "{new-notice-count} new notifications", - "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it." + "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it.", + "nicknamesListWithListName":"{nickname}’s list: {list-name}", + "myListWithListName":"My list: {list-name}", + "listMembers":"Members", + "listSubscribers":"Subscribers", + "ERRORcouldNotFindList":"There is no such list." } diff --git a/locale/ca.json b/locale/ca.json index 1e1a216..7c31575 100644 --- a/locale/ca.json +++ b/locale/ca.json @@ -151,5 +151,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.", "newNotification": "{new-notice-count} new notification", "newNotifications": "{new-notice-count} new notifications", - "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it." + "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it.", + "nicknamesListWithListName":"{nickname}’s list: {list-name}", + "myListWithListName":"My list: {list-name}", + "listMembers":"Members", + "listSubscribers":"Subscribers", + "ERRORcouldNotFindList":"There is no such list." } diff --git a/locale/de.json b/locale/de.json index f2e4490..e40eb8d 100644 --- a/locale/de.json +++ b/locale/de.json @@ -151,5 +151,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"Alle Benachrichtigungen als gelesen markieren fehlgeschlagen.", "newNotification": "{new-notice-count} neue Benachrichtigung", "newNotifications": "{new-notice-count} neue Benachrichtigungen", - "thisIsANoticeFromABlockedUser":"Achtung: Dies ist ein Queet von einem Nutzer, den du blockiert hast. Klicke um ihn anzuzeigen." + "thisIsANoticeFromABlockedUser":"Achtung: Dies ist ein Queet von einem Nutzer, den du blockiert hast. Klicke um ihn anzuzeigen.", + "nicknamesListWithListName":"{nickname}’s list: {list-name}", + "myListWithListName":"My list: {list-name}", + "listMembers":"Members", + "listSubscribers":"Subscribers", + "ERRORcouldNotFindList":"There is no such list." } diff --git a/locale/en.json b/locale/en.json index c108e7a..9a8dfcb 100644 --- a/locale/en.json +++ b/locale/en.json @@ -151,5 +151,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.", "newNotification": "{new-notice-count} new notification", "newNotifications": "{new-notice-count} new notifications", - "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it." + "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it.", + "nicknamesListWithListName":"{nickname}’s list: {list-name}", + "myListWithListName":"My list: {list-name}", + "listMembers":"Members", + "listSubscribers":"Subscribers", + "ERRORcouldNotFindList":"There is no such list." } diff --git a/locale/eo.json b/locale/eo.json index 7982c91..d88588b 100644 --- a/locale/eo.json +++ b/locale/eo.json @@ -151,5 +151,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.", "newNotification": "{new-notice-count} new notification", "newNotifications": "{new-notice-count} new notifications", - "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it." + "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it.", + "nicknamesListWithListName":"{nickname}’s list: {list-name}", + "myListWithListName":"My list: {list-name}", + "listMembers":"Members", + "listSubscribers":"Subscribers", + "ERRORcouldNotFindList":"There is no such list." } diff --git a/locale/es.json b/locale/es.json index 323cd34..823b2a3 100644 --- a/locale/es.json +++ b/locale/es.json @@ -151,5 +151,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"Error al marcar todas las notificaciones como vistas.", "newNotification": "{new-notice-count} nueva notificación", "newNotifications": "{new-notice-count} nuevas notificaciones", - "thisIsANoticeFromABlockedUser":"Atención: Ésta es una nota de un usuario que bloqueaste. Pulsa para mostrarla." + "thisIsANoticeFromABlockedUser":"Atención: Ésta es una nota de un usuario que bloqueaste. Pulsa para mostrarla.", + "nicknamesListWithListName":"{nickname}’s list: {list-name}", + "myListWithListName":"My list: {list-name}", + "listMembers":"Members", + "listSubscribers":"Subscribers", + "ERRORcouldNotFindList":"There is no such list." } diff --git a/locale/es_ahorita.json b/locale/es_ahorita.json index 2cf55fe..8e021c4 100644 --- a/locale/es_ahorita.json +++ b/locale/es_ahorita.json @@ -151,5 +151,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.", "newNotification": "{new-notice-count} new notification", "newNotifications": "{new-notice-count} new notifications", - "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it." + "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it.", + "nicknamesListWithListName":"{nickname}’s list: {list-name}", + "myListWithListName":"My list: {list-name}", + "listMembers":"Members", + "listSubscribers":"Subscribers", + "ERRORcouldNotFindList":"There is no such list." } diff --git a/locale/eu.json b/locale/eu.json index 0373175..6f9a2c3 100644 --- a/locale/eu.json +++ b/locale/eu.json @@ -151,5 +151,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.", "newNotification": "{new-notice-count} new notification", "newNotifications": "{new-notice-count} new notifications", - "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it." + "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it.", + "nicknamesListWithListName":"{nickname}’s list: {list-name}", + "myListWithListName":"My list: {list-name}", + "listMembers":"Members", + "listSubscribers":"Subscribers", + "ERRORcouldNotFindList":"There is no such list." } diff --git a/locale/fa.json b/locale/fa.json index 615756a..e995a3b 100644 --- a/locale/fa.json +++ b/locale/fa.json @@ -151,5 +151,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.", "newNotification": "{new-notice-count} new notification", "newNotifications": "{new-notice-count} new notifications", - "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it." + "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it.", + "nicknamesListWithListName":"{nickname}’s list: {list-name}", + "myListWithListName":"My list: {list-name}", + "listMembers":"Members", + "listSubscribers":"Subscribers", + "ERRORcouldNotFindList":"There is no such list." } diff --git a/locale/fi.json b/locale/fi.json index dda053e..fa3cfbf 100644 --- a/locale/fi.json +++ b/locale/fi.json @@ -151,5 +151,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.", "newNotification": "{new-notice-count} new notification", "newNotifications": "{new-notice-count} new notifications", - "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it." + "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it.", + "nicknamesListWithListName":"{nickname}’s list: {list-name}", + "myListWithListName":"My list: {list-name}", + "listMembers":"Members", + "listSubscribers":"Subscribers", + "ERRORcouldNotFindList":"There is no such list." } diff --git a/locale/fr.json b/locale/fr.json index df379e9..7bdf60a 100644 --- a/locale/fr.json +++ b/locale/fr.json @@ -151,5 +151,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"Échec du marquage de toutes les notifications comme vues", "newNotification": "{new-notice-count} nouvelle notification", "newNotifications": "{new-notice-count} nouvelles notifications", - "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it." + "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it.", + "nicknamesListWithListName":"{nickname}’s list: {list-name}", + "myListWithListName":"My list: {list-name}", + "listMembers":"Members", + "listSubscribers":"Subscribers", + "ERRORcouldNotFindList":"There is no such list." } diff --git a/locale/gl.json b/locale/gl.json index 714c73b..284ada2 100644 --- a/locale/gl.json +++ b/locale/gl.json @@ -151,5 +151,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.", "newNotification": "{new-notice-count} new notification", "newNotifications": "{new-notice-count} new notifications", - "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it." + "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it.", + "nicknamesListWithListName":"{nickname}’s list: {list-name}", + "myListWithListName":"My list: {list-name}", + "listMembers":"Members", + "listSubscribers":"Subscribers", + "ERRORcouldNotFindList":"There is no such list." } diff --git a/locale/he.json b/locale/he.json index 28aae93..8b9b9f2 100644 --- a/locale/he.json +++ b/locale/he.json @@ -151,5 +151,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.", "newNotification": "{new-notice-count} new notification", "newNotifications": "{new-notice-count} new notifications", - "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it." + "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it.", + "nicknamesListWithListName":"{nickname}’s list: {list-name}", + "myListWithListName":"My list: {list-name}", + "listMembers":"Members", + "listSubscribers":"Subscribers", + "ERRORcouldNotFindList":"There is no such list." } diff --git a/locale/io.json b/locale/io.json index e334319..0e5610a 100644 --- a/locale/io.json +++ b/locale/io.json @@ -151,5 +151,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"On faliis, ke on markizez omna notifiki kom vidita.", "newNotification": "{new-notice-count} nova notifiko", "newNotifications": "{new-notice-count} nova notifiki", - "thisIsANoticeFromABlockedUser":"Averto: Ita mesajo esas da uzero quan vu blokusis. Kliktigez por ke on montrez olu." + "thisIsANoticeFromABlockedUser":"Averto: Ita mesajo esas da uzero quan vu blokusis. Kliktigez por ke on montrez olu.", + "nicknamesListWithListName":"{nickname}’s list: {list-name}", + "myListWithListName":"My list: {list-name}", + "listMembers":"Members", + "listSubscribers":"Subscribers", + "ERRORcouldNotFindList":"There is no such list." } diff --git a/locale/it.json b/locale/it.json index 1caa3a2..4c7e335 100644 --- a/locale/it.json +++ b/locale/it.json @@ -151,5 +151,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.", "newNotification": "{new-notice-count} new notification", "newNotifications": "{new-notice-count} new notifications", - "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it." + "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it.", + "nicknamesListWithListName":"{nickname}’s list: {list-name}", + "myListWithListName":"My list: {list-name}", + "listMembers":"Members", + "listSubscribers":"Subscribers", + "ERRORcouldNotFindList":"There is no such list." } diff --git a/locale/no.json b/locale/no.json index 5cf0006..c180bdf 100644 --- a/locale/no.json +++ b/locale/no.json @@ -151,5 +151,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"Feilet ved forsøk å markere alle varsler som lest.", "newNotification": "{new-notice-count} nytt varsel", "newNotifications": "{new-notice-count} nye varsler", - "thisIsANoticeFromABlockedUser":"Advarsel: Dette er en notis fra en bruker du har blokkert. Klikk for å se den." + "thisIsANoticeFromABlockedUser":"Advarsel: Dette er en notis fra en bruker du har blokkert. Klikk for å se den.", + "nicknamesListWithListName":"{nickname}’s list: {list-name}", + "myListWithListName":"My list: {list-name}", + "listMembers":"Members", + "listSubscribers":"Subscribers", + "ERRORcouldNotFindList":"There is no such list." } diff --git a/locale/pt_br.json b/locale/pt_br.json index 93c44ed..a483b87 100644 --- a/locale/pt_br.json +++ b/locale/pt_br.json @@ -151,5 +151,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.", "newNotification": "{new-notice-count} new notification", "newNotifications": "{new-notice-count} new notifications", - "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it." + "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it.", + "nicknamesListWithListName":"{nickname}’s list: {list-name}", + "myListWithListName":"My list: {list-name}", + "listMembers":"Members", + "listSubscribers":"Subscribers", + "ERRORcouldNotFindList":"There is no such list." } diff --git a/locale/sv.json b/locale/sv.json index c5ca364..bfbbcf8 100644 --- a/locale/sv.json +++ b/locale/sv.json @@ -151,5 +151,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"Misslyckades med att markera alla notiser som lästa.", "newNotification": "{new-notice-count} ny notis", "newNotifications": "{new-notice-count} nya notiser", - "thisIsANoticeFromABlockedUser":"Varning! Det här är en qvittring från en användare som du har blockerat. Klicka för att visa den." + "thisIsANoticeFromABlockedUser":"Varning! Det här är en qvittring från en användare som du har blockerat. Klicka för att visa den.", + "nicknamesListWithListName":"Lista: {list-name} (av @{nickname})", + "myListWithListName":"Min lista: {list-name}", + "listMembers":"Listmedlemmar", + "listSubscribers":"Prenumeranter", + "ERRORcouldNotFindList":"Det finns ingen sådan lista." } diff --git a/locale/zh_cn.json b/locale/zh_cn.json index 0904ff7..9cd8660 100644 --- a/locale/zh_cn.json +++ b/locale/zh_cn.json @@ -150,5 +150,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.", "newNotification": "{new-notice-count} new notification", "newNotifications": "{new-notice-count} new notifications", - "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it." + "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it.", + "nicknamesListWithListName":"{nickname}’s list: {list-name}", + "myListWithListName":"My list: {list-name}", + "listMembers":"Members", + "listSubscribers":"Subscribers", + "ERRORcouldNotFindList":"There is no such list." } diff --git a/locale/zh_tw.json b/locale/zh_tw.json index ff87822..fea24d6 100644 --- a/locale/zh_tw.json +++ b/locale/zh_tw.json @@ -150,5 +150,10 @@ "ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.", "newNotification": "{new-notice-count} new notification", "newNotifications": "{new-notice-count} new notifications", - "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it." + "thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it.", + "nicknamesListWithListName":"{nickname}’s list: {list-name}", + "myListWithListName":"My list: {list-name}", + "listMembers":"Members", + "listSubscribers":"Subscribers", + "ERRORcouldNotFindList":"There is no such list." }