stream menus, mark all notifications as read, opt-out from certain notifications

This commit is contained in:
Hannes Mannerheim 2015-11-17 22:48:28 +01:00
parent 560b71d93b
commit fd43133f0f
33 changed files with 1071 additions and 177 deletions

View File

@ -141,6 +141,10 @@ class QvitterPlugin extends Plugin {
public function onRouterInitialized($m)
{
$m->connect('api/qvitter/hello.json',
array('action' => 'ApiQvitterHello'));
$m->connect('api/qvitter/mark_all_notifications_as_seen.json',
array('action' => 'ApiQvitterMarkAllNotificationsAsSeen'));
$m->connect('api/qvitter/favs_and_repeats/:notice_id.json',
array('action' => 'ApiFavsAndRepeats'),
array('notice_id' => '[0-9]+'));
@ -149,6 +153,8 @@ class QvitterPlugin extends Plugin {
'format' => '(xml|json|rss|atom|as)'));
$m->connect('api/qvitter/update_bookmarks.json',
array('action' => 'ApiQvitterUpdateBookmarks'));
$m->connect('api/qvitter/set_profile_pref.json',
array('action' => 'ApiQvitterSetProfilePref'));
$m->connect('api/qvitter/update_link_color.json',
array('action' => 'apiqvitterupdatelinkcolor'));
$m->connect('api/qvitter/update_background_color.json',
@ -1020,6 +1026,27 @@ class QvitterPlugin extends Plugin {
$notification->selectAdd('ntype');
$notification->selectAdd('count(id) as count');
$notification->whereAdd("(to_profile_id = '".$user_id."')");
// the user might have opted out from certain notification types
$current_profile = $user->getProfile();
$disable_notify_replies_and_mentions = Profile_prefs::getConfigData($current_profile, 'qvitter', 'disable_notify_replies_and_mentions');
$disable_notify_favs = Profile_prefs::getConfigData($current_profile, 'qvitter', 'disable_notify_favs');
$disable_notify_repeats = Profile_prefs::getConfigData($current_profile, 'qvitter', 'disable_notify_repeats');
$disable_notify_follows = Profile_prefs::getConfigData($current_profile, 'qvitter', 'disable_notify_follows');
if($disable_notify_replies_and_mentions == '1') {
$notification->whereAdd('qvitternotification.ntype != "mention"');
$notification->whereAdd('qvitternotification.ntype != "reply"');
}
if($disable_notify_favs == '1') {
$notification->whereAdd('qvitternotification.ntype != "like"');
}
if($disable_notify_repeats == '1') {
$notification->whereAdd('qvitternotification.ntype != "repeat"');
}
if($disable_notify_follows == '1') {
$notification->whereAdd('qvitternotification.ntype != "follow"');
}
$notification->groupBy('ntype');
$notification->whereAdd("(is_seen = '0')");
$notification->whereAdd("(notice_id IS NOT NULL)"); // sometimes notice_id is NULL, those notifications are corrupt and should be discarded

View File

@ -0,0 +1,78 @@
<?php
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· Say hello to the API ·
· (you will also get headers with e.g. unread notification count....) ·
· ·
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· ·
· Q V I T T E R ·
· ·
· http://github.com/hannesmannerheim/qvitter ·
· ·
· ·
· <o) ·
· /_//// ·
· (____/ ·
· (o< ·
· o> \\\\_\ ·
· \\) \____) ·
· ·
· ·
· ·
· 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 <http://www.gnu.org/licenses/>. ·
· ·
· Contact h@nnesmannerhe.im if you have any questions. ·
· ·
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · */
if (!defined('GNUSOCIAL')) { exit(1); }
class ApiQvitterHelloAction extends ApiAuthAction
{
/**
* Take arguments for running
*
* @param array $args $_REQUEST args
*
* @return boolean success flag
*/
protected function prepare(array $args=array())
{
parent::prepare($args);
return true;
}
/**
* Handle the request
*
* @param array $args $_REQUEST data (unused)
*
* @return void
*/
protected function handle()
{
parent::handle();
$this->initDocument('json');
$this->showJsonObjects('hello');
$this->endDocument('json');
}
}

View File

@ -0,0 +1,94 @@
<?php
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· Say hello to the API ·
· (you will also get headers with e.g. unread notification count....) ·
· ·
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· ·
· Q V I T T E R ·
· ·
· http://github.com/hannesmannerheim/qvitter ·
· ·
· ·
· <o) ·
· /_//// ·
· (____/ ·
· (o< ·
· o> \\\\_\ ·
· \\) \____) ·
· ·
· ·
· ·
· 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 <http://www.gnu.org/licenses/>. ·
· ·
· Contact h@nnesmannerhe.im if you have any questions. ·
· ·
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · */
if (!defined('GNUSOCIAL')) { exit(1); }
class ApiQvitterMarkAllNotificationsAsSeenAction extends ApiAuthAction
{
/**
* Take arguments for running
*
* @param array $args $_REQUEST args
*
* @return boolean success flag
*/
protected function prepare(array $args=array())
{
parent::prepare($args);
return true;
}
/**
* Handle the request
*
* @param array $args $_REQUEST data (unused)
*
* @return void
*/
protected function handle()
{
parent::handle();
$n = new QvitterNotification();
$n->selectAdd();
$n->selectAdd('id');
$n->whereAdd(sprintf('qvitternotification.to_profile_id = "%s"', $n->escape($this->auth_user->id)));
$ids = $n->fetchAll('id');
$notifications = QvitterNotification::pivotGet('id', $ids);
$notifications = new ArrayWrapper($notifications);
$notifications = $notifications->fetchAll();
foreach($notifications as $notification) {
if($notification->is_seen == 0) {
$orig = clone($notification);
$notification->is_seen = 1;
$notification->update($orig);
}
}
$this->initDocument('json');
$this->showJsonObjects(true);
$this->endDocument('json');
}
}

View File

@ -0,0 +1,88 @@
<?php
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· Set any topic in Profile_prefs ·
· ·
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· ·
· Q V I T T E R ·
· ·
· http://github.com/hannesmannerheim/qvitter ·
· ·
· ·
· <o) ·
· /_//// ·
· (____/ ·
· (o< ·
· o> \\\\_\ ·
· \\) \____) ·
· ·
· ·
· ·
· 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 <http://www.gnu.org/licenses/>. ·
· ·
· Contact h@nnesmannerhe.im if you have any questions. ·
· ·
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · */
if (!defined('GNUSOCIAL')) { exit(1); }
class ApiQvitterSetProfilePrefAction extends ApiAuthAction
{
var $prefNamespace = null;
var $prefTopic = null;
var $prefData = null;
protected $needPost = true;
/**
* Take arguments for running
*
* @param array $args $_REQUEST args
*
* @return boolean success flag
*/
protected function prepare(array $args=array())
{
parent::prepare($args);
$this->prefNamespace = $this->trimmed('namespace');
$this->prefTopic = $this->trimmed('topic');
$this->prefData = $this->trimmed('data');
return true;
}
/**
* Handle the request
*
* @param array $args $_REQUEST data (unused)
*
* @return void
*/
protected function handle()
{
parent::handle();
// save the new bookmarks
$saved = Profile_prefs::setData($this->scoped, $this->prefNamespace, $this->prefTopic, $this->prefData);
$this->initDocument('json');
$this->showJsonObjects($saved);
$this->endDocument('json');
}
}

View File

@ -251,14 +251,18 @@ class QvitterAction extends ApiAction
window.siteLocalOnlyDefaultPath = <?php print (common_config('public', 'localonly') ? 'true' : 'false'); ?>;
<?php
// bookmarks
// Get all topics in Qvitter's namespace in Profile_prefs
if($logged_in_user) {
$bookmarks = Profile_prefs::getConfigData(Profile::current(), 'qvitter', 'bookmarks');
if($bookmarks) {
print 'window.allBookmarks = '.$bookmarks.';';
$qvitter_profile_prefs = Profile_prefs::getNamespace(Profile::current(),'qvitter');
if(count($qvitter_profile_prefs)>0) {
$topic_data = new stdClass();
foreach($qvitter_profile_prefs as $pref) {
$topic_data->{$pref->topic} = $pref->data;
}
print 'window.qvitterProfilePrefs = '.json_encode($topic_data).';';
}
else {
print 'window.allBookmarks = false;';
print 'window.qvitterProfilePrefs = false;';
}
}
?>
@ -604,7 +608,7 @@ class QvitterAction extends ApiAction
color:/*COLORSTART*/<?php print QvitterPlugin::settings("defaultlinkcolor"); ?>/*COLOREND*/;
}
#unseen-notifications,
.stream-item.notification .not-seen,
.stream-item.notification .not-seen-disc,
#top-compose,
#logo,
.queet-toolbar button,
@ -618,7 +622,8 @@ class QvitterAction extends ApiAction
.save-profile-button,
.crop-and-save-button,
.topbar .global-nav.show-logo:before,
.topbar .global-nav.pulse-logo:before {
.topbar .global-nav.pulse-logo:before,
.dropdown-menu li:not(.dropdown-caret) a:hover {
background-color:/*BACKGROUNDCOLORSTART*/<?php print QvitterPlugin::settings("defaultlinkcolor"); ?>/*BACKGROUNDCOLOREND*/;
}
.queet-box-syntax[contenteditable="true"]:focus,

View File

@ -33,11 +33,33 @@ class NotificationStream
*/
function getNotificationIds($offset, $limit, $since_id, $max_id)
{
$notification = new QvitterNotification();
$notification->selectAdd();
$notification->selectAdd('id');
$notification->whereAdd(sprintf('qvitternotification.to_profile_id = "%s"', $notification->escape($this->target->id)));
$notification->whereAdd(sprintf('qvitternotification.created >= "%s"', $notification->escape($this->target->created)));
// the user might have opted out from certain notification types
$current_profile = Profile::current();
$disable_notify_replies_and_mentions = Profile_prefs::getConfigData($current_profile, 'qvitter', 'disable_notify_replies_and_mentions');
$disable_notify_favs = Profile_prefs::getConfigData($current_profile, 'qvitter', 'disable_notify_favs');
$disable_notify_repeats = Profile_prefs::getConfigData($current_profile, 'qvitter', 'disable_notify_repeats');
$disable_notify_follows = Profile_prefs::getConfigData($current_profile, 'qvitter', 'disable_notify_follows');
if($disable_notify_replies_and_mentions == '1') {
$notification->whereAdd('qvitternotification.ntype != "mention"');
$notification->whereAdd('qvitternotification.ntype != "reply"');
}
if($disable_notify_favs == '1') {
$notification->whereAdd('qvitternotification.ntype != "like"');
}
if($disable_notify_repeats == '1') {
$notification->whereAdd('qvitternotification.ntype != "repeat"');
}
if($disable_notify_follows == '1') {
$notification->whereAdd('qvitternotification.ntype != "follow"');
}
$notification->limit($offset, $limit);
$notification->orderBy('qvitternotification.created DESC');

View File

@ -481,20 +481,6 @@ body.rtl .dropdown-menu li:not(.dropdown-caret) {
text-decoration: none;
}
.dropdown-menu li:not(.dropdown-caret) a:hover {
background-color: #2271A9;
background: -moz-linear-gradient(top, #2f7eb6 0px, #2271a9 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0px,#2f7eb6), color-stop(100%,#2271a9)); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, #2f7eb6 0px,#2271a9 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, #2f7eb6 0px,#2271a9 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(top, #2f7eb6 0px,#2271a9 100%); /* IE10+ */
background: linear-gradient(to bottom, #2f7eb6 0px,#2271a9 100%); /* W3C */
background-repeat: repeat-x;
color: #FFFFFF;
text-decoration: none;
}
@ -516,6 +502,37 @@ body.rtl .dropdown-menu li:not(.dropdown-caret) {
width:auto;
}
.dropdown-menu .row-type-profile-prefs-toggle::before {
position: absolute;
height:24px;
width:18px;
text-align: center;
left: 3px;
font-family: fontAwesome;
content:'\f00c';
font-size:10px;
line-height: 18px;
}
.dropdown-menu .row-type-profile-prefs-toggle.disabled::before {
content:' ';
}
/* these toggles are inverted, they appear the the user as disabled when enabled,
since they are enabled by default....*/
.dropdown-menu a#disable_notify_replies_and_mentions.disabled::before,
.dropdown-menu a#disable_notify_favs.disabled::before,
.dropdown-menu a#disable_notify_repeats.disabled::before,
.dropdown-menu a#disable_notify_follows.disabled::before {
content:'\f00c';
}
.dropdown-menu a#disable_notify_replies_and_mentions.enabled::before,
.dropdown-menu a#disable_notify_favs.enabled::before,
.dropdown-menu a#disable_notify_repeats.enabled::before,
.dropdown-menu a#disable_notify_follows.enabled::before {
content:' ';
}
#invite-link {
font-weight:bold;
@ -1569,6 +1586,27 @@ body.rtl #footer-spinner-container {
line-height: 22px;
}
#stream-menu-cog {
display: inline-block;
font-size: 20px;
line-height: 20px;
margin-left: 9px;
opacity: 0.4;
position: relative;
cursor:pointer;
}
#stream-menu-cog::before {
content:'\f013';
font-family: fontAwesome;
}
#stream-menu-cog.dropped {
opacity:1;
}
#stream-menu-cog .dropdown-menu {
z-index:1000;
display:block;
}
.queet-streams {
bottom: 0;
color: #999999;
@ -1687,7 +1725,7 @@ body.rtl #footer-spinner-container {
background-color:#F6F6F6;
}
.stream-item.notification .not-seen {
.stream-item.notification .not-seen-disc {
position:absolute;
left:-5px;
top:50%;

View File

@ -186,6 +186,23 @@ function getFromAPI(stream, actionOnSuccess) {
});
}
/* ·
·
· Hello to the API! When saying hello you will e.g. also get headers
· with up-to-date unread notifications count to update etc
·
· @param callback: function to invoke when done
·
· · · · · · · · · · · · · */
function helloAPI(callback) {
getFromAPI('qvitter/hello.json',function(){
if(typeof callback == 'function') {
callback();
}
});
}
/* ·
·
@ -309,6 +326,34 @@ function postNewBackgroundColor(newBackgroundColor) {
}
/* ·
·
· Set a profile pref
·
· @param namespace: the namespace field in the db table, should be 'qvitter'
· @param topic: the topic field in the db table,
· @param data: the data to set
· @param callback: function to run when finished
·
· · · · · · · · · · · · · */
function postSetProfilePref(namespace, topic, data, callback) {
$.ajax({ url: window.apiRoot + 'qvitter/set_profile_pref.json',
cache: false,
type: "POST",
data: {
namespace: namespace,
topic: topic,
data: data
},
dataType:"json",
error: function(data){ callback(false); },
success: function(data) {
callback(data); }
});
}
/* ·
·

View File

@ -37,6 +37,104 @@
· ·
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · */
/* ·
·
· Build a menu for a stream, if there is any to build
·
· Stream menus currently support three row types: divider, functions and profile-prefs-toggles
· They are defined in stream-router.js. Function rows run the function in
· the function attribute when clicked. Profile-prefs-toggle rows toggles the
· preference in the attribute when clicked.
·
· @param streamObject: stream object returned by pathToStreamRouter()
·
· · · · · · · · · */
function streamObjectGetMenu(streamObject) {
if(typeof streamObject == 'undefined') {
return false;
}
if(streamObject.menu === false) {
return false;
}
var menuHTML = buildMenuTop();
$.each(streamObject.menu,function(){
if(this.type == 'divider') {
menuHTML = menuHTML + buildMenuDivider();
}
else if(this.type == 'function') {
menuHTML = menuHTML + buildMenuRowFullwidth(this.label, {
class: 'row-type-' + this.type,
'data-menu-row-type': this.type,
'data-function-name': this.functionName
});
}
else if(this.type == 'profile-prefs-toggle') {
// only prefs in the qvitter namespace is supported
if(this.namespace == 'qvitter') {
// enabled?
var prefEnabledOrDisabled = 'disabled';
if(typeof window.qvitterProfilePrefs[this.topic] != 'undefined'
&& window.qvitterProfilePrefs[this.topic] !== null
&& window.qvitterProfilePrefs[this.topic] != ''
&& window.qvitterProfilePrefs[this.topic] !== false
&& window.qvitterProfilePrefs[this.topic] != 0
&& window.qvitterProfilePrefs[this.topic] != '0') {
prefEnabledOrDisabled = 'enabled';
}
// get row html
menuHTML = menuHTML + buildMenuRowFullwidth(this.label, {
id: this.topic,
class: 'row-type-' + this.type + ' ' + prefEnabledOrDisabled,
'data-menu-row-type': this.type,
'data-profile-prefs-topic': this.topic,
'data-profile-prefs-namespace': this.namespace,
'data-profile-pref-state': prefEnabledOrDisabled
});
}
}
});
return menuHTML + buildMenuBottom();
}
/* ·
·
· Menu components
·
· · · · · · · · · */
function buildMenuTop() {
return '<ul class="dropdown-menu">\
<li class="dropdown-caret right">\
<span class="caret-outer"></span>\
<span class="caret-inner"></span>\
</li>';
}
function buildMenuBottom() {
return '</ul>';
}
function buildMenuDivider() {
return '<li class="fullwidth dropdown-divider"></li>';
}
function buildMenuRowFullwidth(label, attributes) {
var attributesHTML = '';
$.each(attributes,function(k,v){
attributesHTML = attributesHTML + ' ' + k + '="' + v + '"';
});
return '<li class="fullwidth"><a' + attributesHTML + '>' + replaceHtmlSpecialChars(label) + '</a></li>';
}
function alignMenuToParent(menu, parent) {
var menuLeft = parent.width()/2 - menu.width() + 15;
var menuTop = parent.height()+5;
menu.css('left', menuLeft + 'px');
menu.css('top', menuTop + 'px');
}
/* ·
·
@ -388,28 +486,6 @@ function addProfileCardToDOM(data) {
}
/* ·
·
· Adds a profile card before feed element, with data from the first object in the included object
·
· @param data: an object with one or more queet objects
·
· · · · · · · · · */
function profileCardFromFirstObject(data,screen_name) {
var first = new Object();
for (var i in data) {
if (data.hasOwnProperty(i) && typeof(i) !== 'function') {
first = data[i];
break;
}
}
if(typeof first.user != 'undefined') {
addProfileCardToDOM(first.user);
}
}
/* ·
@ -571,6 +647,9 @@ function setNewCurrentStream(streamObject,setLocation,fallbackId,actionOnSuccess
$('#feed-body').removeAttr('data-end-reached');
$('#feed-header-inner h2').css('opacity','0.2');
$('#feed-header-inner h2').html(h2FeedHeader); // update header (could be wrong in cache)
if(streamObject.menu && window.loggedIn) {
$('#feed-header-inner h2').append('<div id="stream-menu-cog" data-tooltip="' + window.sL.timelineOptions + '"></div>');
}
$('#feed-header-inner h2').animate({opacity:'1'},1000);
// set location bar from stream
@ -598,6 +677,9 @@ function setNewCurrentStream(streamObject,setLocation,fallbackId,actionOnSuccess
$('.profile-card,.hover-card,.hover-card-caret').remove();
$('#feed-body').html('');
$('#feed-header-inner h2').html(h2FeedHeader);
if(streamObject.menu && window.loggedIn) {
$('#feed-header-inner h2').append('<div id="stream-menu-cog" data-tooltip="' + window.sL.timelineOptions + '"></div>');
}
});
}
@ -718,6 +800,12 @@ function setNewCurrentStream(streamObject,setLocation,fallbackId,actionOnSuccess
groupProfileCard(streamObject.nickname);
}
// say hello to the api if this is notifications stream, to
// get correct unread notifcation count
if(window.currentStreamObject.name == 'notifications') {
helloAPI();
}
// start checking for new queets again
window.clearInterval(checkForNewQueetsInterval);
checkForNewQueetsInterval=window.setInterval(function(){checkForNewQueets()},window.timeBetweenPolling);
@ -1067,7 +1155,7 @@ function cleanUpAfterCollapseQueet(q) {
/* ·
·
· Get an inline queet box
· Get a queet box, mainly for popups
·
· @return the html for the queet box
·
@ -1499,7 +1587,7 @@ function addToFeed(feed, after, extraClasses, isReply) {
// add not seen notification circle
$.each($('.notification.not-seen .queet'),function(){
if($(this).children('.not-seen').length<1) {
$(this).prepend('<div class="not-seen"></div>');
$(this).prepend('<div class="not-seen-disc"></div>');
}
});
}

View File

@ -612,32 +612,20 @@ function appendUserToMentionsSuggestionsArray(user) {
function displayOrHideUnreadNotifications(notifications) {
var data = $.parseJSON(notifications);
// if this is notifications page, we use the info from the hidden items in the feed
if(window.currentStream == 'qvitter/statuses/notifications.json') {
var new_queets_num = $('#feed-body').find('.stream-item.notification.hidden').length;
if(new_queets_num == 0) {
document.title = window.siteTitle;
$('#unseen-notifications').hide();
}
else {
document.title = window.siteTitle + ' (' + new_queets_num + ')';
$('#unseen-notifications').html(new_queets_num);
$('#unseen-notifications').show();
}
}
// all other pages use the header info
else if(data === null || typeof data == 'undefined' || data.length == 0) {
$('#unseen-notifications').hide();
document.title = window.siteTitle;
}
else {
var totNotif = 0;
if(data !== null && typeof data != 'undefined') {
$.each(data,function(k,v){
totNotif = totNotif + parseInt(v,10);
});
}
if(window.currentStreamObject.name == 'notifications') {
var hiddenNotifications = $('#feed-body').find('.stream-item.hidden:not(.activity)').length;
if(hiddenNotifications>0) {
totNotif = totNotif + hiddenNotifications;
}
}
if(totNotif>0) {
$('#unseen-notifications').html(totNotif);
@ -648,10 +636,33 @@ function displayOrHideUnreadNotifications(notifications) {
$('#unseen-notifications').hide();
document.title = window.siteTitle;
}
}
}
/* ·
·
· Mark all notifications as seen
·
· · · · · · · · · · · · · */
function markAllNotificationsAsSeen() {
display_spinner();
getFromAPI('qvitter/mark_all_notifications_as_seen.json',function(data){
if(data === false) {
showErrorMessage(window.sL.ERRORfailedMarkingAllNotificationsAsRead);
}
else {
helloAPI(function(){
$('.not-seen-disc').remove();
$('#new-queets-bar').trigger('click'); // show any hidden notifications (this will also remove the dropdown menu)
remove_spinner();
});
}
});
}
/* ·
·
@ -1196,9 +1207,10 @@ function saveAllBookmarks() {
· · · · · · · · · · · · · */
function appendAllBookmarks(bookmarkContainer) {
if(bookmarkContainer) {
if(typeof bookmarkContainer != 'undefined' && bookmarkContainer) {
$('#bookmark-container').html('');
$.each(bookmarkContainer, function(key,obj) {
var bookmarkContainerParsed = JSON.parse(bookmarkContainer);
$.each(bookmarkContainerParsed, function(key,obj) {
$('#bookmark-container').append('<a class="stream-selection" href="' + obj.dataStreamHref + '">' + obj.dataStreamHeader + '</i><i class="chev-right" data-tooltip="' + window.sL.tooltipRemoveBookmark + '"></i></a>');
});
}

View File

@ -923,7 +923,7 @@ function doLogin(streamObjectToSet) {
loadHistoryFromLocalStorage();
// show bookmarks
appendAllBookmarks(window.allBookmarks);
appendAllBookmarks(window.qvitterProfilePrefs.bookmarks);
// set stream
setNewCurrentStream(streamObjectToSet,true,false,function(){
@ -1076,6 +1076,108 @@ $('#settingslink').click(function(){
});
/* ·
·
· Show/hide the stream menu dropdown on click
·
· · · · · · · · · · · · · */
$('body').on('click','#stream-menu-cog',function(e){
if(!$(e.target).is('#stream-menu-cog') && $(e.target).closest('#stream-menu-cog').length>0) {
// don't show/hide when clicking inside the menu
}
else if($(this).hasClass('dropped')) {
$(this).removeClass('dropped');
$(this).children('.dropdown-menu').remove();
}
else {
$(this).addClass('dropped');
var menu = $(streamObjectGetMenu(window.currentStreamObject)).appendTo(this);
alignMenuToParent(menu,$(this));
}
});
// hide the stream menu when clicking outside it
$('body').on('click',function(e){
if(!$(e.target).is('#stream-menu-cog') && $('#stream-menu-cog').hasClass('dropped') && !$(e.target).closest('#stream-menu-cog').length>0) {
$('#stream-menu-cog').children('.dropdown-menu').remove();
$('#stream-menu-cog').removeClass('dropped');
}
});
/* ·
·
· When clicking a function row in a stream menu  invoke the function
·
· · · · · · · · · · · · · */
$('body').on('click','.row-type-function',function(e){
window[$(this).attr('data-function-name')]();
});
/* ·
·
· When toggeling a a profile pref in a dropdown menu
·
· · · · · · · · · · · · · */
$('body').on('click','.row-type-profile-prefs-toggle',function(e){
var thisToggle = $(this);
// wait for last toggle to finish before toggeling again
if(thisToggle.hasClass('clicked')) {
return true;
}
if(thisToggle.attr('data-profile-pref-state') == 'disabled') {
var prefDataToSet = '1';
}
else if(thisToggle.attr('data-profile-pref-state') == 'enabled') {
var prefDataToSet = '0';
}
else { // invalid
return true;
}
thisToggle.addClass('clicked');
var prefNamespace = thisToggle.attr('data-profile-prefs-namespace');
var prefTopic = thisToggle.attr('data-profile-prefs-topic');
// only prefs in the 'qvitter' namespace allowed
if(prefNamespace != 'qvitter') {
return true;
}
// save pref to server
postSetProfilePref(prefNamespace,prefTopic,prefDataToSet,function(data){
if(data === false) { // error
showErrorMessage(window.sL.ERRORfailedSavingYourSetting + ' (' + prefTopic + ')');
}
else { // success
thisToggle.removeClass('clicked');
if(thisToggle.attr('data-profile-pref-state') == 'disabled') {
thisToggle.removeClass('disabled');
thisToggle.addClass('enabled');
thisToggle.attr('data-profile-pref-state','enabled');
window.qvitterProfilePrefs[prefTopic] = '1';
}
else if(thisToggle.attr('data-profile-pref-state') == 'enabled') {
thisToggle.removeClass('enabled');
thisToggle.addClass('disabled');
thisToggle.attr('data-profile-pref-state','disabled');
window.qvitterProfilePrefs[prefTopic] = '0';
}
}
});
});
/* ·
·
@ -1397,10 +1499,12 @@ $('body').on('click','a', function(e) {
$('body').on('click','.sm-ellipsis',function(){
// hide
if($(this).closest('.action-ellipsis-container').children('.dropdown-menu').length > 0) {
$(this).closest('.action-ellipsis-container').removeClass('dropped');
$(this).closest('.action-ellipsis-container').children('.dropdown-menu').remove();
}
// show
else {
$(this).closest('.action-ellipsis-container').addClass('dropped');
$('.action-ellipsis-container').children('.dropdown-menu').remove(); // remove menu from other queets
var streamItemUsername = $(this).closest('.queet').find('.stream-item-header').find('.screen-name').text();
var streamItemUserID = $(this).closest('.queet').find('.stream-item-header').find('.name').attr('data-user-id');
@ -1426,7 +1530,13 @@ $('body').on('click','.sm-ellipsis',function(){
}
});
// remove the ellipsis menu when clicking outside it
$('body').on('click',function(e){
if(!$(e.target).is('.action-ellipsis-container') && $('.action-ellipsis-container.dropped').length>0 && !$(e.target).closest('.action-ellipsis-container').length>0) {
$('.action-ellipsis-container').children('.dropdown-menu').remove();
$('.action-ellipsis-container').removeClass('dropped');
}
});
@ -1578,8 +1688,8 @@ function checkForNewQueets() {
if(!$('body').hasClass('loading-newer')) {
$('body').addClass('loading-newer');
// only of logged in and not user stream
if($('#user-container').css('display') == 'block' && $('.stream-item.user').length==0) {
// only if logged in and only for notice or notification streams
if(window.loggedIn && (window.currentStreamObject.type == 'notices' || window.currentStreamObject.type == 'notifications')) {
var lastId = $('#feed-body').children('.stream-item').not('.temp-post').attr('data-quitter-id-in-stream');
var addThisStream = window.currentStream;
var timeNow = new Date().getTime();
@ -1588,31 +1698,33 @@ function checkForNewQueets() {
$('body').removeClass('loading-newer');
if(addThisStream == window.currentStream) {
addToFeed(data, false, 'hidden');
}
}
});
}
// if we have hidden items, show new-queets-bar
var new_queets_num = $('#feed-body').find('.stream-item.hidden:not(.activity)').length;
if(new_queets_num > 0) {
// if this is notifications page, update site title with hidden notification count
if(window.currentStreamObject.name == 'notifications') {
document.title = window.siteTitle + ' (' + new_queets_num + ')';
}
$('#new-queets-bar').parent().removeClass('hidden');
// text plural
if(new_queets_num == 1) {
var q_txt = ' ' + window.sL.newQueet;
}
else {
var q_txt = ' ' + window.sL.newQueets;
// bar label
if(new_queets_num == 1) { var q_txt = window.sL.newQueet; }
else { var q_txt = window.sL.newQueets; }
if(window.currentStreamObject.name == 'notifications') {
if(new_queets_num == 1) { var q_txt = window.sL.newNotification; }
else { var q_txt = window.sL.newNotifications; }
}
$('#new-queets-bar').html(new_queets_num + q_txt);
$('#new-queets-bar').html(q_txt.replace('{new-notice-count}',new_queets_num));
// say hello to the api if this is notifications stream, to
// get correct unread notifcation count
if(window.currentStreamObject.name == 'notifications') {
helloAPI();
}
}
}
}
});
}
}
}
@ -1634,6 +1746,12 @@ $('body').on('click','#new-queets-bar',function(){
hiddenStreamItems.addClass('visible');
hiddenStreamItems.removeClass('hidden');
$('#new-queets-bar').parent().addClass('hidden');
// say hello to the api if this is notifications stream, to
// get correct unread notifcation count
if(window.currentStreamObject.name == 'notifications') {
helloAPI();
}
});
@ -1905,13 +2023,12 @@ function disableOrEnableNavigationButtonsInImagePopup(popUp) {
/* ·
·
· Collapse all open conversations, ellipsis menus and the welcome text on esc or when clicking the margin
· Collapse all open conversations and the welcome text on esc or when clicking the margin
·
· · · · · · · · · · · · · */
$('body').click(function(event){
if($(event.target).is('body')) {
$('.action-ellipsis-container').children('.dropdown-menu').remove();
if($(event.target).is('body') || $(event.target).is('#page-container')) {
$('.front-welcome-text.expanded > .show-full-welcome-text').trigger('click');
$.each($('.stream-item.expanded'),function(){
expand_queet($(this), false);
@ -1921,7 +2038,6 @@ $('body').click(function(event){
$(document).keyup(function(e){
if(e.keyCode==27) { // esc
$('.action-ellipsis-container').children('.dropdown-menu').remove();
$('.front-welcome-text.expanded > .show-full-welcome-text').trigger('click');
$.each($('.stream-item.expanded'),function(){
expand_queet($(this), false);

View File

@ -130,7 +130,9 @@ function pathToStreamRouter(path) {
stream: false, // the API path
nickname: false, // if we can read a nickname/screen_name from the path, add it to this property
id: false, // if we can read a id number string from the path, add it to this property
maxIdOrPage: 'maxId' // whether this stream uses 'maxId' or 'page' for paging (maxId is default)
maxIdOrPage: 'maxId', // whether this stream uses 'maxId' or 'page' for paging (maxId is default)
menu: false, // optional menu in the header
type: 'notices' // notices, notifications, users, groups, lists etc. notices is default
};
// instance's public timeline
@ -262,6 +264,7 @@ function pathToStreamRouter(path) {
streamObject.streamSubHeader = window.sL.memberCount;
streamObject.stream = 'statusnet/groups/membership/' + streamObject.nickname + '.json?count=20';
streamObject.maxIdOrPage = 'page';
streamObject.type = 'users';
return streamObject;
}
@ -274,6 +277,7 @@ function pathToStreamRouter(path) {
streamObject.streamSubHeader = window.sL.adminCount;
streamObject.stream = 'statusnet/groups/admins/' + streamObject.nickname + '.json?count=20';
streamObject.maxIdOrPage = 'page';
streamObject.type = 'users';
return streamObject;
}
@ -290,6 +294,14 @@ function pathToStreamRouter(path) {
streamObject.stream = 'statuses/friends_timeline.json?screen_name=' + streamObject.nickname + '&withuserarray=1';
streamObject.parentPath = streamObject.nickname;
}
streamObject.menu = [
{
type: 'profile-prefs-toggle',
namespace: 'qvitter',
topic: 'hide_replies',
label: window.sL.hideRepliesToPeopleIDoNotFollow
}
];
return streamObject;
}
@ -319,6 +331,41 @@ function pathToStreamRouter(path) {
streamObject.stream = 'qvitter/statuses/notifications.json';
streamObject.streamHeader = '@' + replaceHtmlSpecialChars(streamObject.nickname);
streamObject.streamSubHeader = window.sL.notifications;
streamObject.type = 'notifications';
streamObject.menu = [
{
type: 'function',
functionName: 'markAllNotificationsAsSeen',
label: window.sL.markAllNotificationsAsSeen
},
{
type: 'divider'
},
{
type: 'profile-prefs-toggle',
namespace: 'qvitter',
topic: 'disable_notify_replies_and_mentions',
label: window.sL.notifyRepliesAndMentions
},
{
type: 'profile-prefs-toggle',
namespace: 'qvitter',
topic: 'disable_notify_favs',
label: window.sL.notifyFavs
},
{
type: 'profile-prefs-toggle',
namespace: 'qvitter',
topic: 'disable_notify_repeats',
label: window.sL.notifyRepeats
},
{
type: 'profile-prefs-toggle',
namespace: 'qvitter',
topic: 'disable_notify_follows',
label: window.sL.notifyFollows
}
];
}
return streamObject;
}
@ -349,6 +396,7 @@ function pathToStreamRouter(path) {
streamObject.streamSubHeader = '<div class="queet-streams"><a class="queet-stream following" href="' + window.siteInstanceURL + streamObject.nickname + '/subscriptions">' + window.sL.following + '</a> / </div>' + window.sL.followers;
streamObject.stream = 'statuses/followers.json?count=20&screen_name=' + streamObject.nickname + '&withuserarray=1';
streamObject.maxIdOrPage = 'page';
streamObject.type = 'users';
return streamObject;
}
@ -361,6 +409,7 @@ function pathToStreamRouter(path) {
streamObject.streamSubHeader = window.sL.following + '<div class="queet-streams">/ <a class="queet-stream followers" href="' + window.siteInstanceURL + streamObject.nickname + '/subscribers">' + window.sL.followers + '</a></div>';
streamObject.stream = 'statuses/friends.json?count=20&screen_name=' + streamObject.nickname + '&withuserarray=1';
streamObject.maxIdOrPage = 'page';
streamObject.type = 'users';
return streamObject;
}
@ -373,6 +422,7 @@ function pathToStreamRouter(path) {
streamObject.streamSubHeader = window.sL.groups;
streamObject.stream = 'statusnet/groups/list.json?count=10&screen_name=' + streamObject.nickname + '&withuserarray=1';
streamObject.maxIdOrPage = 'page';
streamObject.type = 'groups';
return streamObject;
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "مفضّلة",
"requeetNoun": "إعادة تغريد",
"requeetsNoun": "إعادة تغريد",
"newQueet": "تغريدة جديدة",
"newQueets": "تغريدة جديدة",
"newQueet": "{new-notice-count} تغريدة جديدة",
"newQueets": "{new-notice-count} تغريدة جديدة",
"longmonthsJanuary": "يناير",
"longmonthsFebruary": "فبراير",
"longmonthsMars": "مارس",
@ -139,5 +139,16 @@
"ERRORcouldNotFindPage":"Could not find that page.",
"ERRORnoticeRemoved": "This notice has been removed.",
"ERRORnoContactWithServer": "Can not establish a connection to the server. The server could be overloaded, or there might be a problem with your internet connecton. Please try again later!",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large."
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
"hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
"markAllNotificationsAsSeen":"Mark all notifications as seen",
"notifyRepliesAndMentions":"Mentions and replies",
"notifyFavs":"Favorites",
"notifyRepeats":"Requeets",
"notifyFollows":"New followers",
"timelineOptions":"Timeline options",
"ERRORfailedSavingYourSetting":"Failed saving your setting",
"ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
"newNotification": "{new-notice-count} new notification",
"newNotifications": "{new-notice-count} new notifications"
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "Favoritos",
"requeetNoun": "Requeet",
"requeetsNoun": "Requeets",
"newQueet": "Queet nuevu",
"newQueets": "Queets nuevos",
"newQueet": "{new-notice-count} Queet nuevu",
"newQueets": "{new-notice-count} Queets nuevos",
"longmonthsJanuary": "xineru",
"longmonthsFebruary": "febreru",
"longmonthsMars": "marzu",
@ -139,5 +139,16 @@
"ERRORcouldNotFindPage":"Could not find that page.",
"ERRORnoticeRemoved": "This notice has been removed.",
"ERRORnoContactWithServer": "Can not establish a connection to the server. The server could be overloaded, or there might be a problem with your internet connecton. Please try again later!",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large."
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
"hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
"markAllNotificationsAsSeen":"Mark all notifications as seen",
"notifyRepliesAndMentions":"Mentions and replies",
"notifyFavs":"Favorites",
"notifyRepeats":"Requeets",
"notifyFollows":"New followers",
"timelineOptions":"Timeline options",
"ERRORfailedSavingYourSetting":"Failed saving your setting",
"ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
"newNotification": "{new-notice-count} new notification",
"newNotifications": "{new-notice-count} new notifications"
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "Preferits",
"requeetNoun": "Requeet",
"requeetsNoun": "Requeets",
"newQueet": "queet nou",
"newQueets": "queets nous",
"newQueet": "{new-notice-count} queet nou",
"newQueets": "{new-notice-count} queets nous",
"longmonthsJanuary": "gener",
"longmonthsFebruary": "febrer",
"longmonthsMars": "març",
@ -139,5 +139,16 @@
"ERRORcouldNotFindPage":"No s'ha pogut trobar aquesta pàgina",
"ERRORnoticeRemoved": "Aquest avís s'ha eliminat.",
"ERRORnoContactWithServer": "Can not establish a connection to the server. The server could be overloaded, or there might be a problem with your internet connecton. Please try again later!",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large."
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
"hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
"markAllNotificationsAsSeen":"Mark all notifications as seen",
"notifyRepliesAndMentions":"Mentions and replies",
"notifyFavs":"Favorites",
"notifyRepeats":"Requeets",
"notifyFollows":"New followers",
"timelineOptions":"Timeline options",
"ERRORfailedSavingYourSetting":"Failed saving your setting",
"ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
"newNotification": "{new-notice-count} new notification",
"newNotifications": "{new-notice-count} new notifications"
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "Favoriten",
"requeetNoun": "Requeet",
"requeetsNoun": "Requeets",
"newQueet": "neuer Queet",
"newQueets": "neue Queets",
"newQueet": "n{new-notice-count} euer Queet",
"newQueets": "{new-notice-count} neue Queets",
"longmonthsJanuary": "Januar",
"longmonthsFebruary": "Februar",
"longmonthsMars": "März",
@ -139,5 +139,16 @@
"ERRORcouldNotFindPage":"Konnte Seite nicht finden.",
"ERRORnoticeRemoved": "Dieser Queet wurde gelöscht.",
"ERRORnoContactWithServer": "Can not establish a connection to the server. The server could be overloaded, or there might be a problem with your internet connecton. Please try again later!",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large."
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
"hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
"markAllNotificationsAsSeen":"Mark all notifications as seen",
"notifyRepliesAndMentions":"Mentions and replies",
"notifyFavs":"Favorites",
"notifyRepeats":"Requeets",
"notifyFollows":"New followers",
"timelineOptions":"Timeline options",
"ERRORfailedSavingYourSetting":"Failed saving your setting",
"ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
"newNotification": "{new-notice-count} new notification",
"newNotifications": "{new-notice-count} new notifications"
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "Favorites",
"requeetNoun": "Repeat",
"requeetsNoun": "Repeats",
"newQueet": "new notice",
"newQueets": "new notices",
"newQueet": "{new-notice-count} new notice",
"newQueets": "{new-notice-count} new notices",
"longmonthsJanuary": "January",
"longmonthsFebruary": "February",
"longmonthsMars": "March",
@ -139,5 +139,16 @@
"ERRORcouldNotFindPage":"Could not find that page.",
"ERRORnoticeRemoved": "This notice has been removed.",
"ERRORnoContactWithServer": "Can not establish a connection to the server. The server could be overloaded, or there might be a problem with your internet connecton. Please try again later!",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large."
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
"hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
"markAllNotificationsAsSeen":"Mark all notifications as seen",
"notifyRepliesAndMentions":"Mentions and replies",
"notifyFavs":"Favorites",
"notifyRepeats":"Requeets",
"notifyFollows":"New followers",
"timelineOptions":"Timeline options",
"ERRORfailedSavingYourSetting":"Failed saving your setting",
"ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
"newNotification": "{new-notice-count} new notification",
"newNotifications": "{new-notice-count} new notifications"
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "Stelsignitaj",
"requeetNoun": "Repepo",
"requeetsNoun": "Repepoj",
"newQueet": "nova pepo",
"newQueets": "novaj pepoj",
"newQueet": "{new-notice-count} nova pepo",
"newQueets": "{new-notice-count} novaj pepoj",
"longmonthsJanuary": "januaro",
"longmonthsFebruary": "februaro",
"longmonthsMars": "marto",
@ -139,5 +139,16 @@
"ERRORcouldNotFindPage":"Could not find that page.",
"ERRORnoticeRemoved": "This notice has been removed.",
"ERRORnoContactWithServer": "Can not establish a connection to the server. The server could be overloaded, or there might be a problem with your internet connecton. Please try again later!",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large."
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
"hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
"markAllNotificationsAsSeen":"Mark all notifications as seen",
"notifyRepliesAndMentions":"Mentions and replies",
"notifyFavs":"Favorites",
"notifyRepeats":"Requeets",
"notifyFollows":"New followers",
"timelineOptions":"Timeline options",
"ERRORfailedSavingYourSetting":"Failed saving your setting",
"ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
"newNotification": "{new-notice-count} new notification",
"newNotifications": "{new-notice-count} new notifications"
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "Favoritos",
"requeetNoun": "Requeet",
"requeetsNoun": "Requeets",
"newQueet": "nuevo Queet",
"newQueets": "nuevos Queets",
"newQueet": "{new-notice-count} nuevo Queet",
"newQueets": "{new-notice-count} nuevos Queets",
"longmonthsJanuary": "enero",
"longmonthsFebruary": "febrero",
"longmonthsMars": "marzo",
@ -139,5 +139,16 @@
"ERRORcouldNotFindPage":"No se pudo encontrar la página.",
"ERRORnoticeRemoved": "Este aviso se ha eliminado.",
"ERRORnoContactWithServer": "Can not establish a connection to the server. The server could be overloaded, or there might be a problem with your internet connecton. Please try again later!",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large."
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
"hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
"markAllNotificationsAsSeen":"Mark all notifications as seen",
"notifyRepliesAndMentions":"Mentions and replies",
"notifyFavs":"Favorites",
"notifyRepeats":"Requeets",
"notifyFollows":"New followers",
"timelineOptions":"Timeline options",
"ERRORfailedSavingYourSetting":"Failed saving your setting",
"ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
"newNotification": "{new-notice-count} new notification",
"newNotifications": "{new-notice-count} new notifications"
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "Favoritos",
"requeetNoun": "Requeet",
"requeetsNoun": "Requeets",
"newQueet": "nuevo Queet",
"newQueets": "nuevos Queets",
"newQueet": "{new-notice-count} nuevo Queet",
"newQueets": "{new-notice-count} nuevos Queets",
"longmonthsJanuary": "enero",
"longmonthsFebruary": "febrero",
"longmonthsMars": "marzo",
@ -139,5 +139,16 @@
"ERRORcouldNotFindPage":"Could not find that page.",
"ERRORnoticeRemoved": "This notice has been removed.",
"ERRORnoContactWithServer": "Can not establish a connection to the server. The server could be overloaded, or there might be a problem with your internet connecton. Please try again later!",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large."
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
"hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
"markAllNotificationsAsSeen":"Mark all notifications as seen",
"notifyRepliesAndMentions":"Mentions and replies",
"notifyFavs":"Favorites",
"notifyRepeats":"Requeets",
"notifyFollows":"New followers",
"timelineOptions":"Timeline options",
"ERRORfailedSavingYourSetting":"Failed saving your setting",
"ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
"newNotification": "{new-notice-count} new notification",
"newNotifications": "{new-notice-count} new notifications"
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "Gogokoak",
"requeetNoun": "Bertxio",
"requeetsNoun": "Bertxioak",
"newQueet": "Txio berria",
"newQueets": "Txio berriak",
"newQueet": "{new-notice-count} Txio berria",
"newQueets": "{new-notice-count} Txio berriak",
"longmonthsJanuary": "Urtarrila",
"longmonthsFebruary": "Otsaila",
"longmonthsMars": "Martxoa",
@ -139,5 +139,16 @@
"ERRORcouldNotFindPage":"Could not find that page.",
"ERRORnoticeRemoved": "This notice has been removed.",
"ERRORnoContactWithServer": "Can not establish a connection to the server. The server could be overloaded, or there might be a problem with your internet connecton. Please try again later!",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large."
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
"hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
"markAllNotificationsAsSeen":"Mark all notifications as seen",
"notifyRepliesAndMentions":"Mentions and replies",
"notifyFavs":"Favorites",
"notifyRepeats":"Requeets",
"notifyFollows":"New followers",
"timelineOptions":"Timeline options",
"ERRORfailedSavingYourSetting":"Failed saving your setting",
"ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
"newNotification": "{new-notice-count} new notification",
"newNotifications": "{new-notice-count} new notifications"
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "برگزیده",
"requeetNoun": "بازتوییت",
"requeetsNoun": "بازتوییت",
"newQueet": "توییت جدید",
"newQueets": "توییت جدید",
"newQueet": "{new-notice-count} توییت جدید",
"newQueets": "{new-notice-count} توییت جدید",
"longmonthsJanuary": "ژانويه",
"longmonthsFebruary": "فوريه",
"longmonthsMars": "مارس",
@ -139,5 +139,16 @@
"ERRORcouldNotFindPage":"Could not find that page.",
"ERRORnoticeRemoved": "This notice has been removed.",
"ERRORnoContactWithServer": "Can not establish a connection to the server. The server could be overloaded, or there might be a problem with your internet connecton. Please try again later!",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large."
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
"hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
"markAllNotificationsAsSeen":"Mark all notifications as seen",
"notifyRepliesAndMentions":"Mentions and replies",
"notifyFavs":"Favorites",
"notifyRepeats":"Requeets",
"notifyFollows":"New followers",
"timelineOptions":"Timeline options",
"ERRORfailedSavingYourSetting":"Failed saving your setting",
"ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
"newNotification": "{new-notice-count} new notification",
"newNotifications": "{new-notice-count} new notifications"
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "Suosikit",
"requeetNoun": "Toista",
"requeetsNoun": "Toistot",
"newQueet": "uusi ilmoitus",
"newQueets": "uudet ilmoitukset",
"newQueet": "{new-notice-count} uusi ilmoitus",
"newQueets": "{new-notice-count} uudet ilmoitukset",
"longmonthsJanuary": "tammikuuta",
"longmonthsFebruary": "helmikuuta",
"longmonthsMars": "maaliskuuta",
@ -139,5 +139,16 @@
"ERRORcouldNotFindPage":"Could not find that page.",
"ERRORnoticeRemoved": "This notice has been removed.",
"ERRORnoContactWithServer": "Can not establish a connection to the server. The server could be overloaded, or there might be a problem with your internet connecton. Please try again later!",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large."
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
"hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
"markAllNotificationsAsSeen":"Mark all notifications as seen",
"notifyRepliesAndMentions":"Mentions and replies",
"notifyFavs":"Favorites",
"notifyRepeats":"Requeets",
"notifyFollows":"New followers",
"timelineOptions":"Timeline options",
"ERRORfailedSavingYourSetting":"Failed saving your setting",
"ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
"newNotification": "{new-notice-count} new notification",
"newNotifications": "{new-notice-count} new notifications"
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "Favoris",
"requeetNoun": "Repartage",
"requeetsNoun": "Repartages",
"newQueet": "nouvel avis",
"newQueets": "nouveaux avis",
"newQueet": "{new-notice-count} nouvel avis",
"newQueets": "{new-notice-count} nouveaux avis",
"longmonthsJanuary": "janvier",
"longmonthsFebruary": "février",
"longmonthsMars": "mars",
@ -139,5 +139,16 @@
"ERRORcouldNotFindPage":"Impossible de trouver cette page.",
"ERRORnoticeRemoved": "Cet avis a été supprimé.",
"ERRORnoContactWithServer": "Impossible d'établir une connexion avec le serveur. Il peut être surchargé, ou il peut y avoir un problème avec votre connexion. Réessayez plus tard !",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large."
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
"hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
"markAllNotificationsAsSeen":"Mark all notifications as seen",
"notifyRepliesAndMentions":"Mentions and replies",
"notifyFavs":"Favorites",
"notifyRepeats":"Requeets",
"notifyFollows":"New followers",
"timelineOptions":"Timeline options",
"ERRORfailedSavingYourSetting":"Failed saving your setting",
"ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
"newNotification": "{new-notice-count} new notification",
"newNotifications": "{new-notice-count} new notifications"
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "Favoritos",
"requeetNoun": "Rechouchío",
"requeetsNoun": "Rechouchíos",
"newQueet": "novo chío",
"newQueets": "novos chíos",
"newQueet": "{new-notice-count} novo chío",
"newQueets": "{new-notice-count} novos chíos",
"longmonthsJanuary": "xaneiro",
"longmonthsFebruary": "febreiro",
"longmonthsMars": "marzo",
@ -139,5 +139,16 @@
"ERRORcouldNotFindPage":"Could not find that page.",
"ERRORnoticeRemoved": "This notice has been removed.",
"ERRORnoContactWithServer": "Can not establish a connection to the server. The server could be overloaded, or there might be a problem with your internet connecton. Please try again later!",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large."
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
"hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
"markAllNotificationsAsSeen":"Mark all notifications as seen",
"notifyRepliesAndMentions":"Mentions and replies",
"notifyFavs":"Favorites",
"notifyRepeats":"Requeets",
"notifyFollows":"New followers",
"timelineOptions":"Timeline options",
"ERRORfailedSavingYourSetting":"Failed saving your setting",
"ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
"newNotification": "{new-notice-count} new notification",
"newNotifications": "{new-notice-count} new notifications"
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "מועדפות",
"requeetNoun": "חזרה",
"requeetsNoun": "חזרות",
"newQueet": "הודעה חדשה",
"newQueets": "הודעות חדשות",
"newQueet": "{new-notice-count} הודעה חדשה",
"newQueets": "{new-notice-count} הודעות חדשות",
"longmonthsJanuary": "ינואר",
"longmonthsFebruary": "פברואר",
"longmonthsMars": "מרץ",
@ -139,5 +139,16 @@
"ERRORcouldNotFindPage":"Could not find that page.",
"ERRORnoticeRemoved": "This notice has been removed.",
"ERRORnoContactWithServer": "Can not establish a connection to the server. The server could be overloaded, or there might be a problem with your internet connecton. Please try again later!",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large."
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
"hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
"markAllNotificationsAsSeen":"Mark all notifications as seen",
"notifyRepliesAndMentions":"Mentions and replies",
"notifyFavs":"Favorites",
"notifyRepeats":"Requeets",
"notifyFollows":"New followers",
"timelineOptions":"Timeline options",
"ERRORfailedSavingYourSetting":"Failed saving your setting",
"ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
"newNotification": "{new-notice-count} new notification",
"newNotifications": "{new-notice-count} new notifications"
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "Favorati",
"requeetNoun": "Repeto",
"requeetsNoun": "Repeti",
"newQueet": "nova mesajo",
"newQueets": "nova mesaji",
"newQueet": "{new-notice-count} nova mesajo",
"newQueets": "{new-notice-count} nova mesaji",
"longmonthsJanuary": "januaro",
"longmonthsFebruary": "februaro",
"longmonthsMars": "marto",
@ -139,5 +139,16 @@
"ERRORcouldNotFindPage":"On ne trovis ica pagino.",
"ERRORnoticeRemoved": "Ica mesajo esas supresita.",
"ERRORnoContactWithServer": "Can not establish a connection to the server. The server could be overloaded, or there might be a problem with your internet connecton. Please try again later!",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large."
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
"hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
"markAllNotificationsAsSeen":"Mark all notifications as seen",
"notifyRepliesAndMentions":"Mentions and replies",
"notifyFavs":"Favorites",
"notifyRepeats":"Requeets",
"notifyFollows":"New followers",
"timelineOptions":"Timeline options",
"ERRORfailedSavingYourSetting":"Failed saving your setting",
"ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
"newNotification": "{new-notice-count} new notification",
"newNotifications": "{new-notice-count} new notifications"
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "Favoriti",
"requeetNoun": "Requeet",
"requeetsNoun": "Requeet",
"newQueet": "nuovo Queet",
"newQueets": "nuovi Queet",
"newQueet": "{new-notice-count} nuovo Queet",
"newQueets": "{new-notice-count} nuovi Queet",
"longmonthsJanuary": "Gennaio",
"longmonthsFebruary": "Febbraio",
"longmonthsMars": "Marzo",
@ -139,5 +139,16 @@
"ERRORcouldNotFindPage":"Could not find that page.",
"ERRORnoticeRemoved": "This notice has been removed.",
"ERRORnoContactWithServer": "Can not establish a connection to the server. The server could be overloaded, or there might be a problem with your internet connecton. Please try again later!",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large."
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
"hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
"markAllNotificationsAsSeen":"Mark all notifications as seen",
"notifyRepliesAndMentions":"Mentions and replies",
"notifyFavs":"Favorites",
"notifyRepeats":"Requeets",
"notifyFollows":"New followers",
"timelineOptions":"Timeline options",
"ERRORfailedSavingYourSetting":"Failed saving your setting",
"ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
"newNotification": "{new-notice-count} new notification",
"newNotifications": "{new-notice-count} new notifications"
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "Favoritter",
"requeetNoun": "Requeet",
"requeetsNoun": "Requeeter",
"newQueet": "ny Queet",
"newQueets": "nye Queets",
"newQueet": "{new-notice-count} ny Queet",
"newQueets": "{new-notice-count} nye Queets",
"longmonthsJanuary": "Januar",
"longmonthsFebruary": "Februar",
"longmonthsMars": "Mars",
@ -139,5 +139,16 @@
"ERRORcouldNotFindPage":"Kan ikke finne siden.",
"ERRORnoticeRemoved": "Denne notisen er slettet.",
"ERRORnoContactWithServer": "Kan ikke etablere en kobling til instansen. Dette kan skyldes at den er overbelastet, eller det er et problem med din internet kobling. Vennligst forsøk senere.",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large."
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
"hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
"markAllNotificationsAsSeen":"Mark all notifications as seen",
"notifyRepliesAndMentions":"Mentions and replies",
"notifyFavs":"Favorites",
"notifyRepeats":"Requeets",
"notifyFollows":"New followers",
"timelineOptions":"Timeline options",
"ERRORfailedSavingYourSetting":"Failed saving your setting",
"ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
"newNotification": "{new-notice-count} new notification",
"newNotifications": "{new-notice-count} new notifications"
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "Favoritos",
"requeetNoun": "Requeet",
"requeetsNoun": "Requeets",
"newQueet": "novo Queet",
"newQueets": "novos Queets",
"newQueet": "{new-notice-count} novo Queet",
"newQueets": "{new-notice-count} novos Queets",
"longmonthsJanuary": "janeiro",
"longmonthsFebruary": "fevereiro",
"longmonthsMars": "março",
@ -139,5 +139,16 @@
"ERRORcouldNotFindPage":"Could not find that page.",
"ERRORnoticeRemoved": "This notice has been removed.",
"ERRORnoContactWithServer": "Can not establish a connection to the server. The server could be overloaded, or there might be a problem with your internet connecton. Please try again later!",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large."
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
"hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
"markAllNotificationsAsSeen":"Mark all notifications as seen",
"notifyRepliesAndMentions":"Mentions and replies",
"notifyFavs":"Favorites",
"notifyRepeats":"Requeets",
"notifyFollows":"New followers",
"timelineOptions":"Timeline options",
"ERRORfailedSavingYourSetting":"Failed saving your setting",
"ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
"newNotification": "{new-notice-count} new notification",
"newNotifications": "{new-notice-count} new notifications"
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "Favoriter",
"requeetNoun": "återqvittring",
"requeetsNoun": "återqvittringar",
"newQueet": "ny qvittring",
"newQueets": "nya qvittringar",
"newQueet": "{new-notice-count} ny qvittring",
"newQueets": "{new-notice-count} nya qvittringar",
"longmonthsJanuary": "januari",
"longmonthsFebruary": "februari",
"longmonthsMars": "mars",
@ -139,5 +139,16 @@
"ERRORcouldNotFindPage":"Sidan hittades inte.",
"ERRORnoticeRemoved": "Den här qvittringen är borttagen.",
"ERRORnoContactWithServer": "Kan inte ansluta till servern. Servern kanske är överbelastad, eller så har du ett problem med din internetuppkoppling. Försök igen senare!",
"ERRORattachmentUploadFailed": "Uppladdningen misslyckades. Filen är kanske för stor eller av en otillåten typ."
"ERRORattachmentUploadFailed": "Uppladdningen misslyckades. Filen är kanske för stor eller av en otillåten typ.",
"hideRepliesToPeopleIDoNotFollow":"Visa inte svar till folk jag inte följer",
"markAllNotificationsAsSeen":"Markera alla notiser som lästa",
"notifyRepliesAndMentions":"Svar och omnämnanden",
"notifyFavs":"Favoriter",
"notifyRepeats":"Återqvittringar",
"notifyFollows":"Nya följare",
"timelineOptions":"Inställningar för det här flödet",
"ERRORfailedSavingYourSetting":"Misslyckades med att spara din inställning",
"ERRORfailedMarkingAllNotificationsAsRead":"Misslyckades med att markera alla notiser som lästa.",
"newNotification": "{new-notice-count} ny notis",
"newNotifications": "{new-notice-count} nya notiser"
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "收藏",
"requeetNoun": "转推",
"requeetsNoun": "转推",
"newQueet": "条新推文",
"newQueets": "条新推文",
"newQueet": "{new-notice-count} 条新推文",
"newQueets": "{new-notice-count} 条新推文",
"longmonthsJanuary": "1",
"longmonthsFebruary": "2",
"longmonthsMars": "3",
@ -138,5 +138,16 @@
"ERRORcouldNotFindPage":"Could not find that page.",
"ERRORnoticeRemoved": "This notice has been removed.",
"ERRORnoContactWithServer": "Can not establish a connection to the server. The server could be overloaded, or there might be a problem with your internet connecton. Please try again later!",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large."
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
"hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
"markAllNotificationsAsSeen":"Mark all notifications as seen",
"notifyRepliesAndMentions":"Mentions and replies",
"notifyFavs":"Favorites",
"notifyRepeats":"Requeets",
"notifyFollows":"New followers",
"timelineOptions":"Timeline options",
"ERRORfailedSavingYourSetting":"Failed saving your setting",
"ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
"newNotification": "{new-notice-count} new notification",
"newNotifications": "{new-notice-count} new notifications"
}

View File

@ -31,8 +31,8 @@
"favoritesNoun": "收藏",
"requeetNoun": "轉推",
"requeetsNoun": "轉推",
"newQueet": "条新推文",
"newQueets": "条新推文",
"newQueet": "{new-notice-count} 条新推文",
"newQueets": "{new-notice-count} 条新推文",
"longmonthsJanuary": "1",
"longmonthsFebruary": "2",
"longmonthsMars": "3",
@ -138,5 +138,16 @@
"ERRORcouldNotFindPage":"Could not find that page.",
"ERRORnoticeRemoved": "This notice has been removed.",
"ERRORnoContactWithServer": "Can not establish a connection to the server. The server could be overloaded, or there might be a problem with your internet connecton. Please try again later!",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large."
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
"hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
"markAllNotificationsAsSeen":"Mark all notifications as seen",
"notifyRepliesAndMentions":"Mentions and replies",
"notifyFavs":"Favorites",
"notifyRepeats":"Requeets",
"notifyFollows":"New followers",
"timelineOptions":"Timeline options",
"ERRORfailedSavingYourSetting":"Failed saving your setting",
"ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
"newNotification": "{new-notice-count} new notification",
"newNotifications": "{new-notice-count} new notifications"
}