This commit is contained in:
Hannes Mannerheim 2016-03-04 00:22:25 +01:00
parent e6a8cad494
commit 34b25e032e
46 changed files with 2103 additions and 271 deletions

View File

@ -153,14 +153,25 @@ class QvitterPlugin extends Plugin {
// route/reroute urls
public function onRouterInitialized($m)
{
$m->connect(':nickname/mutes',
array('action' => 'qvitter',
'nickname' => Nickname::INPUT_FMT));
$m->connect('api/qvitter/mutes.json',
array('action' => 'ApiQvitterMutes'));
$m->connect('api/qvitter/sandboxed.:format',
array('action' => 'ApiQvitterSandboxed',
'format' => '(xml|json)'));
$m->connect('api/qvitter/silenced.:format',
array('action' => 'ApiQvitterSilenced',
'format' => '(xml|json)'));
$m->connect('api/qvitter/sandbox/create.json',
array('action' => 'ApiQvitterSandboxCreate'));
$m->connect('api/qvitter/sandbox/destroy.json',
array('action' => 'ApiQvitterSandboxDestroy'));
$m->connect('api/qvitter/silence/create.json',
array('action' => 'ApiQvitterSilenceCreate'));
$m->connect('api/qvitter/silence/destroy.json',
array('action' => 'ApiQvitterSilenceDestroy'));
$m->connect('services/oembed.:format',
array('action' => 'apiqvitteroembednotice',
'format' => '(xml|json)'));
@ -1285,6 +1296,16 @@ class QvitterPlugin extends Plugin {
$notification->whereAdd(sprintf('qvitternotification.from_profile_id IN (SELECT subscribed FROM subscription WHERE subscriber = %u)', $user_id));
}
// the user might have opted out from notifications from profiles they have muted
$hide_notifications_from_muted_users = Profile_prefs::getConfigData($profile, 'qvitter', 'hide_notifications_from_muted_users');
if($hide_notifications_from_muted_users == '1') {
$muted_ids = QvitterMuted::getMutedIDs($profile->id,0,10000); // get all (hopefully not more than 10 000...)
if($muted_ids !== false && count($muted_ids) > 0) {
$ids_imploded = implode(',',$muted_ids);
$notification->whereAdd('qvitternotification.from_profile_id NOT IN ('.$ids_imploded.')');
}
}
// 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');

View File

@ -96,7 +96,7 @@ class ApiQvitterBlocksAction extends ApiPrivateAuthAction
}
/**
* Get the user's subscribers (followers) as an array of profiles
* Get the user's blocked profiles
*
* @return array Profiles
*/

182
actions/apiqvittermutes.php Normal file
View File

@ -0,0 +1,182 @@
<?php
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· API for getting all muted profiles for a profile ·
· ·
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· ·
· Q V I T T E R ·
· ·
· https://git.gnu.io/h2p/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 ApiQvitterMutesAction extends ApiPrivateAuthAction
{
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->format = 'json';
$this->count = (int)$this->arg('count', 100);
return true;
}
/**
* Handle the request
*
* Show the profiles
*
* @return void
*/
protected function handle()
{
parent::handle();
$this->target = Profile::current();
if(!$this->target instanceof Profile) {
$this->clientError(_('You have to be logged in to view your mutes.'), 403);
}
$this->profiles = $this->getProfiles();
$this->initDocument('json');
print json_encode($this->showProfiles());
$this->endDocument('json');
}
/**
* Get the user's muted profiles
*
* @return array Profiles
*/
protected function getProfiles()
{
$offset = ($this->page - 1) * $this->count;
$limit = $this->count;
$mutes = QvitterMuted::getMutedProfiles($this->target->id, $offset, $limit);
if($mutes) {
return $mutes;
} else {
return false;
}
}
/**
* 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 profile in the stream
*/
function lastModified()
{
if (!empty($this->profiles) && (count($this->profiles) > 0)) {
return strtotime($this->profiles[0]->modified);
}
return null;
}
/**
* An entity tag for this action
*
* Returns an Etag based on the action name, language, user ID, and
* timestamps of the first and last profiles in the subscriptions list
* There's also an indicator to show whether this action is being called
* as /api/statuses/(friends|followers) or /api/(friends|followers)/ids
*
* @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->target->id,
'Profiles',
strtotime($this->profiles[0]->modified),
strtotime($this->profiles[$last]->modified))
)
. '"';
}
return null;
}
/**
* Show the profiles as Twitter-style useres and statuses
*
* @return void
*/
function showProfiles()
{
$user_arrays = array();
if($this->profiles !== false) {
foreach ($this->profiles as $profile) {
$user_arrays[] = $this->twitterUserArray($profile, false );
}
}
return $user_arrays;
}
}

View File

@ -0,0 +1,107 @@
<?php
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· Sandbox a user ·
· ·
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· ·
· Q V I T T E R ·
· ·
· https://git.gnu.io/h2p/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 ApiQvitterSandboxCreateAction extends ApiAuthAction
{
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->format = 'json';
$this->other = $this->getTargetProfile($this->arg('id'));
return true;
}
/**
* Handle the request
*
* @param array $args $_REQUEST data (unused)
*
* @return void
*/
protected function handle()
{
parent::handle();
if (!$this->other instanceof Profile) {
$this->clientError(_('No such user.'), 404);
}
if ($this->scoped->id == $this->other->id) {
$this->clientError(_("You cannot sandbox yourself!"), 403);
}
if (!$this->scoped->hasRight(Right::SANDBOXUSER)) {
$this->clientError(_('You cannot sandbox users on this site.'), 403);
}
// Only administrators can sandbox other privileged users (such as others who have the right to sandbox).
if ($this->scoped->isPrivileged() && !$this->scoped->hasRole(Profile_role::ADMINISTRATOR)) {
$this->clientError(_('You cannot sandbox other privileged users.'), 403);
}
// only sandbox of the user isn't sandboxed
if (!$this->other->isSandboxed()) {
try {
$this->other->sandbox();
} catch (Exception $e) {
$this->clientError($e->getMessage(), $e->getCode());
}
}
$this->initDocument('json');
$this->showJsonObjects($this->twitterUserArray($this->other));
$this->endDocument('json');
}
}

View File

@ -0,0 +1,103 @@
<?php
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· Unsandbox a user ·
· ·
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· ·
· Q V I T T E R ·
· ·
· https://git.gnu.io/h2p/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 ApiQvitterSandboxDestroyAction extends ApiAuthAction
{
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->format = 'json';
$this->other = $this->getTargetProfile($this->arg('id'));
return true;
}
/**
* Handle the request
*
* @param array $args $_REQUEST data (unused)
*
* @return void
*/
protected function handle()
{
parent::handle();
if (!$this->other instanceof Profile) {
$this->clientError(_('No such user.'), 404);
}
if ($this->scoped->id == $this->other->id) {
$this->clientError(_("You cannot unsandbox yourself!"), 403);
}
if (!$this->scoped->hasRight(Right::SANDBOXUSER)) {
$this->clientError(_('You cannot unsandbox users on this site.'), 403);
}
// only unsandbox if the user is sandboxed
if ($this->other->isSandboxed()) {
try {
$this->other->unsandbox();
} catch (Exception $e) {
$this->clientError($e->getMessage(), $e->getCode());
}
}
$this->initDocument('json');
$this->showJsonObjects($this->twitterUserArray($this->other));
$this->endDocument('json');
}
}

View File

@ -110,10 +110,7 @@ class ApiQvitterSandboxedAction extends ApiPrivateAuthAction
$profile = $this->getSandboxed(
($this->page - 1) * $this->count,
$this->count,
$this->since_id,
$this->max_id
);
$this->count);
while ($profile->fetch()) {
$profiles[] = clone($profile);
@ -130,6 +127,7 @@ class ApiQvitterSandboxedAction extends ApiPrivateAuthAction
function getSandboxed($offset=null, $limit=null) // offset is null because DataObject wants it, 0 would mean no results
{
$profiles = new Profile();
$profiles->joinAdd(array('id', 'profile_role:profile_id'));
$profiles->whereAdd(sprintf('profile_role.role = \'%s\'', Profile_role::SANDBOXED));

View File

@ -44,6 +44,7 @@ if (!defined('GNUSOCIAL')) { exit(1); }
class ApiQvitterSilenceCreateAction extends ApiAuthAction
{
protected $needPost = true;
/**
* Take arguments for running
@ -56,6 +57,8 @@ class ApiQvitterSilenceCreateAction extends ApiAuthAction
{
parent::prepare($args);
$this->format = 'json';
$this->other = $this->getTargetProfile($this->arg('id'));
return true;
@ -82,6 +85,10 @@ class ApiQvitterSilenceCreateAction extends ApiAuthAction
try {
$this->other->silenceAs($this->scoped);
} catch (AlreadyFulfilledException $e) {
// don't throw client error here, just return the user array like
// if we successfully silenced the user. the client is only interested
// in making sure the user is silenced.
} catch (Exception $e) {
$this->clientError($e->getMessage(), $e->getCode());
}

View File

@ -110,10 +110,7 @@ class ApiQvitterSilencedAction extends ApiPrivateAuthAction
$profile = $this->getSilenced(
($this->page - 1) * $this->count,
$this->count,
$this->since_id,
$this->max_id
);
$this->count);
while ($profile->fetch()) {
$profiles[] = clone($profile);

View File

@ -0,0 +1,100 @@
<?php
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· Unsilence a user ·
· ·
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· ·
· Q V I T T E R ·
· ·
· https://git.gnu.io/h2p/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 ApiQvitterSilenceDestroyAction extends ApiAuthAction
{
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->format = 'json';
$this->other = $this->getTargetProfile($this->arg('id'));
return true;
}
/**
* Handle the request
*
* @param array $args $_REQUEST data (unused)
*
* @return void
*/
protected function handle()
{
parent::handle();
if (!$this->other instanceof Profile) {
$this->clientError(_('No such user.'), 404);
}
if ($this->scoped->id == $this->other->id) {
$this->clientError(_("You cannot unsilence yourself!"), 403);
}
try {
$this->other->unsilenceAs($this->scoped);
} catch (AlreadyFulfilledException $e) {
// don't throw client error here, just return the user array like
// if we successfully unsilenced the user. the client is only interested
// in making sure the user is unsilenced.
} catch (Exception $e) {
$this->clientError($e->getMessage(), $e->getCode());
}
$this->initDocument('json');
$this->showJsonObjects($this->twitterUserArray($this->other));
$this->endDocument('json');
}
}

View File

@ -429,7 +429,19 @@ class QvitterAction extends ApiAction
?>
</head>
<body style="background-color:<?php print QvitterPlugin::settings("defaultbackgroundcolor"); ?>">
<body class="<?php
// rights as body classes
if($logged_in_user) {
if($logged_in_user_obj['rights']['silence']){
print 'has-right-to-silence';
}
if($logged_in_user_obj['rights']['sandbox']){
print ' has-right-to-sandbox';
}
}
?>" style="background-color:<?php print QvitterPlugin::settings("defaultbackgroundcolor"); ?>">
<?php
// add an accessibility toggle link to switch to standard UI, if we're logged in
@ -468,11 +480,8 @@ class QvitterAction extends ApiAction
<span class="caret-outer"></span>
<span class="caret-inner"></span>
</li>
<li class="fullwidth"><a id="logout"></a></li>
<li class="fullwidth"><a id="top-menu-profile-link" class="no-hover-card" href="<?php print $instanceurl.$logged_in_user_obj['screen_name']; ?>"><div id="top-menu-profile-link-fullname"><?php print $logged_in_user_obj['name']; ?></div><div id="top-menu-profile-link-view-profile"></div></a></li>
<li class="fullwidth dropdown-divider"></li>
<li class="fullwidth"><a id="edit-profile-header-link"></a></li>
<li class="fullwidth"><a id="settings" href="<?php print $instanceurl; ?>settings/profile" donthijack></a></li>
<li class="fullwidth"><a id="blocking-link" href="<?php print $instanceurl.$logged_in_user_obj['screen_name'].'/blocks'; ?>"></a></li>
<li class="fullwidth"><a id="faq-link"></a></li>
<li class="fullwidth"><a id="tou-link"></a></li>
<li class="fullwidth"><a id="shortcuts-link"></a></li>
@ -480,6 +489,8 @@ class QvitterAction extends ApiAction
<li class="fullwidth"><a id="invite-link" href="<?php print $instanceurl; ?>main/invite"></a></li>
<?php } ?>
<li class="fullwidth"><a id="classic-link"></a></li>
<li class="fullwidth dropdown-divider"></li>
<li class="fullwidth"><a id="logout"></a></li>
<li class="fullwidth language dropdown-divider"></li>
<?php
@ -589,7 +600,7 @@ class QvitterAction extends ApiAction
if($logged_in_user) { ?>
<div id="user-container" style="display:none;">
<div id="user-header" style="background-image:url('<?php print htmlspecialchars($logged_in_user_obj['cover_photo']) ?>')">
<div id="mini-edit-profile-button"></div>
<div id="mini-logged-in-user-cog-wheel"></div>
<div class="profile-header-inner-overlay"></div>
<div id="user-avatar-container"><img id="user-avatar" src="<?php print htmlspecialchars($logged_in_user_obj['profile_image_url_profile_size']) ?>" /></div>
<div id="user-name"><?php print htmlspecialchars($logged_in_user_obj['name']) ?></div>

View File

@ -48,6 +48,16 @@ class NotificationStream
$notification->whereAdd(sprintf('qvitternotification.from_profile_id IN (SELECT subscribed FROM subscription WHERE subscriber = %u)', $current_profile->id));
}
// the user might have opted out from notifications from profiles they have muted
$hide_notifications_from_muted_users = Profile_prefs::getConfigData($current_profile, 'qvitter', 'hide_notifications_from_muted_users');
if($hide_notifications_from_muted_users == '1') {
$muted_ids = QvitterMuted::getMutedIDs($current_profile->id,0,10000); // get all (hopefully not more than 10 000...)
if($muted_ids !== false && count($muted_ids) > 0) {
$ids_imploded = implode(',',$muted_ids);
$notification->whereAdd('qvitternotification.from_profile_id NOT IN ('.$ids_imploded.')');
}
}
// the user might have opted out from certain notification types
$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');

105
classes/QvitterMuted.php Normal file
View File

@ -0,0 +1,105 @@
<?php
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· Get muted profiles for a profile ·
· ·
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· ·
· Q V I T T E R ·
· ·
· https://git.gnu.io/h2p/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 QvitterMuted
{
public static function getMutedProfiles($profile_id, $offset = 0, $limit = PROFILES_PER_PAGE)
{
$ids = self::getMutedIDs($profile_id, $offset, $limit);
if(count($ids) === 0) {
return false;
} else {
$profiles = array();
foreach($ids as $id) {
try {
$profiles[] = Profile::getByID($id);
} catch (Exception $e) {
//
}
}
if(count($profiles) === 0) {
return false;
} else {
return $profiles;
}
}
}
public static function getMutedIDs($profile_id, $offset, $limit)
{
if(!is_numeric($profile_id)) {
return false;
}
$mutes = new Profile_prefs();
$mutes->selectAdd('topic');
$mutes->whereAdd("profile_id = ".$profile_id);
$mutes->whereAdd("namespace = 'qvitter'");
$mutes->whereAdd("data = '1'");
$mutes->whereAdd("topic LIKE 'mute:%'");
$mutes->orderBy('modified DESC');
$mutes->limit($offset, $limit);
if (!$mutes->find()) {
return array();
}
$topics = $mutes->fetchAll('topic');
$ids = array();
foreach($topics as $topic) {
$topic_exploded = explode(':',$topic);
if(is_numeric($topic_exploded[1])) {
$ids[] = $topic_exploded[1];
}
}
return $ids;
}
}

View File

@ -424,6 +424,9 @@ button.icon.nav-search span {
top: 100%;
z-index: 900;
}
.user-menu-cog .dropdown-menu {
width:180px;
}
.quitter-settings.dropdown-menu {
margin-right: -400px;
right: 50%;
@ -488,6 +491,7 @@ button.icon.nav-search span {
.dropdown-menu li.fullwidth:not(.dropdown-caret) {
width:100%;
text-align:left;
margin-left: 0;
}
body.rtl .dropdown-menu li:not(.dropdown-caret) {
text-align:right;
@ -514,11 +518,32 @@ body.rtl .dropdown-menu li:not(.dropdown-caret) {
width: 100%;
box-sizing:border-box;
}
.dropdown-menu li:not(.dropdown-caret) a:hover {
color: #FFFFFF;
text-decoration: none;
}
#top-menu-profile-link-fullname,
#top-menu-profile-link-view-profile {
width:100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size:11px;
color:#999;
}
#top-menu-profile-link-fullname {
font-size:13px;
font-weight:700;
color:#292f33;
margin-top:5px;
}
#top-menu-profile-link:hover div {
color:#fff;
}
/* dropdown menu from ellipsis button */
.action-ellipsis-container {
position:relative;
@ -546,6 +571,10 @@ body.rtl .dropdown-menu li:not(.dropdown-caret) {
content:' ';
}
.dropdown-menu .row-type-profile-prefs-toggle.tick-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,
@ -1655,7 +1684,8 @@ body.rtl #history-container.menu-container a .chev-right {
display:none;
}
#stream-menu-cog {
#stream-menu-cog,
.user-menu-cog {
display: inline-block;
font-size: 20px;
line-height: 20px;
@ -1664,18 +1694,69 @@ body.rtl #history-container.menu-container a .chev-right {
position: relative;
cursor:pointer;
}
#stream-menu-cog::before {
.user-menu-cog {
float: right;
line-height: 26px;
margin: 13px 0 0;
opacity: 0.6;
padding: 0 5px 12px 10px;
}
.hover-card .user-menu-cog {
color: #fff;
display: block;
float: none;
font-size: 16px;
margin: -32px 0 0;
opacity: 0.8;
position: absolute;
text-shadow: none;
}
.user-menu-cog:not(.logged-in) {
display:none !important;
}
#stream-menu-cog::before,
.user-menu-cog::before {
content:'\f013';
font-family: fontAwesome;
}
#stream-menu-cog.dropped {
#stream-menu-cog.dropped,
.user-menu-cog.dropped {
opacity:1;
}
#stream-menu-cog .dropdown-menu {
#stream-menu-cog .dropdown-menu,
.user-menu-cog .dropdown-menu {
z-index:1000;
display:block;
}
.stream-item.user.user-muted > .queet > .user-menu-cog::after,
.profile-card.user-muted .user-menu-cog::after,
.stream-item.notice.user-muted > .queet .account-group .name::after,
.stream-item.notification.user-muted > .queet .account-group .name::after {
display:block;
position: absolute;
width: 20px;
height: 20px;
left:-20px;
top:0;
color:#e81c4f;
content:'\f070';
font-family: fontAwesome;
}
.hover-card .profile-card.user-muted .user-menu-cog::after {
left:auto;
right:-25px;
}
.stream-item.notice.user-muted > .queet .account-group .name::after,
.stream-item.notification.user-muted > .queet .account-group .name::after {
display: inline-block;
height: auto;
left: auto;
margin: 0 5px;
position: relative;
width: auto;
}
.queet-streams {
bottom: 0;
color: #999999;
@ -1897,8 +1978,8 @@ background-repeat: no-repeat;
.stream-item .account-group span.sandboxed-flag {
background-color: #00ccff;
}
.stream-item.silenced .account-group span.silenced-flag,
.stream-item.sandboxed .account-group span.sandboxed-flag {
body.has-right-to-silence .stream-item.silenced .account-group span.silenced-flag,
body.has-right-to-sandbox .stream-item.sandboxed .account-group span.sandboxed-flag {
display:inline-block;;
}
.profile-card .profile-header-inner span.silenced-flag,
@ -1921,8 +2002,8 @@ background-repeat: no-repeat;
.hover-card .profile-card .profile-header-inner span.sandboxed-flag {
line-height: 15px;
}
.profile-card .profile-header-inner.silenced span.silenced-flag,
.profile-card .profile-header-inner.sandboxed span.sandboxed-flag {
body.has-right-to-silence .profile-card .profile-header-inner.silenced span.silenced-flag,
body.has-right-to-sandbox .profile-card .profile-header-inner.sandboxed span.sandboxed-flag {
display: inline-block;
}
@ -2015,8 +2096,8 @@ background-repeat: no-repeat;
body.rtl .queet.rtl .expanded-content {
direction:rtl;
}
.stream-item.expanded > div:first-child,
.stream-item.expanded > div:first-child > .queet {
.stream-item.expanded > div.first-visible,
.stream-item.expanded > div.first-visible > .queet {
border-top-left-radius:6px;
border-top-right-radius:6px;
}
@ -2048,11 +2129,15 @@ body.rtl .queet.rtl .expanded-content {
color:#999999;
}
.stream-item:not(.expanded).profile-blocked-by-me {
.stream-item:not(.expanded):not(.user).profile-blocked-by-me,
.stream-item:not(.expanded):not(.user):not(.notification).user-muted,
#feed-body.hide-notifications-from-muted-users .stream-item:not(.expanded).user-muted {
height:15px;
overflow:hidden;
}
.stream-item:not(.expanded).profile-blocked-by-me::before {
.stream-item:not(.expanded):not(.user).profile-blocked-by-me::before,
.stream-item:not(.expanded):not(.user):not(.notification).user-muted::before,
#feed-body.hide-notifications-from-muted-users .stream-item:not(.expanded).user-muted::before {
display: block;
position: absolute;
left:0;
@ -2066,12 +2151,16 @@ body.rtl .queet.rtl .expanded-content {
box-sizing: border-box;
}
.stream-item:not(.expanded).profile-blocked-by-me .queet {
.stream-item:not(.expanded):not(.user).profile-blocked-by-me .queet,
.stream-item:not(.expanded):not(.user):not(.notification).user-muted .queet,
#feed-body.hide-notifications-from-muted-users .stream-item:not(.expanded).user-muted .queet {
width:20px;
position:absolute;
right:0;
}
.stream-item:not(.expanded).profile-blocked-by-me .queet::before {
.stream-item:not(.expanded):not(.user).profile-blocked-by-me .queet::before,
.stream-item:not(.expanded):not(.user):not(.notification).user-muted .queet::before,
#feed-body.hide-notifications-from-muted-users .stream-item:not(.expanded).user-muted .queet::before {
display: block;
position: absolute;
left:0;
@ -2090,17 +2179,14 @@ body.rtl .queet.rtl .expanded-content {
border-bottom:1px solid #ddd;
box-sizing: border-box;
}
.stream-item:not(.expanded):not(.user):not(.notification).user-muted .queet::before,
#feed-body.hide-notifications-from-muted-users .stream-item:not(.expanded).user-muted .queet::before {
content: '\f070';
}
/* only show activity notices if they are conversation starters
we never need to see these, but sometimes someone replies to
an activity notice, and then it can be good to know what the
user is replying to... */
#feed-body > .stream-item.activity {
display:none;
}
.stream-item > .stream-item.activity:first-child {
display:block;
}
.quoted-notices,
.oembed-data {
@ -3457,18 +3543,18 @@ span.inline-reply-caret .caret-inner {
content:'@';
}
#mini-edit-profile-button {
#mini-logged-in-user-cog-wheel {
width:30px;
height:30px;
position:absolute;
z-index:102;
z-index:201;
right:5px;
top:5px;
}
#mini-edit-profile-button:before {
#mini-logged-in-user-cog-wheel:before {
font-family: 'FontAwesome';
font-size:17px;
content:'\f044';
content:'\f013';
display:block;
position:absolute;
width:30px;
@ -3476,10 +3562,10 @@ span.inline-reply-caret .caret-inner {
line-height:30px;
text-align:center;
text-shadow:none;
color:rgba(255,255,255,0.7);
color:rgba(255,255,255,0.9);
z-index:102;
}
#mini-edit-profile-button:hover:before {
#mini-logged-in-user-cog-wheel:hover:before {
color:rgba(255,255,255,1);
}
@ -4617,7 +4703,6 @@ background:rgba(0,0,0,0.2);
border-radius: 6px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4), 0 1px 0 rgba(255, 255, 255, 0.5) inset;
position: relative;
overflow: hidden;
}
.modal-close {
margin: 0;
@ -4690,14 +4775,16 @@ background:rgba(0,0,0,0.2);
content: " ";
clear: both;
}
.modal-container[id*="popup-reply-"] .modal-footer {
.modal-container[id*="popup-reply-"] .modal-footer,
#queet-thumb-popup .modal-footer {
padding:0;
}
.modal-container[id*="popup-reply-"] .modal-footer {}
.modal-footer .queet,
.modal-footer .stream-item {
border:0 none;
cursor:auto;
border-radius: 0 0 5px 5px;
}
.modal-footer .queet:hover {
background-color:#fff;
@ -5549,11 +5636,14 @@ body.rtl #feed-header-inner h2 {
z-index: 1;
}
#feed,
.profile-card {
#feed {
position:relative;
z-index:10;
}
.profile-card {
position:relative;
z-index:11;
}
#search-query-hint {
display:none;

View File

@ -261,6 +261,7 @@ function getAllFollowsMembershipsAndBlocks(callback) {
if(data.blocks) {
window.allBlocking = data.blocks;
markAllNoticesFromBlockedUsersAsBlockedInJQueryObject($('body'));
}
if(typeof callback == 'function') {
@ -462,10 +463,10 @@ function APIFollowOrUnfollowUser(followOrUnfollow,user_id,this_element,actionOnS
/* ·
·
· Post follow or unfollow user request
· Post block or unblock user request
·
· @param followOrUnfollow: either 'follow' or 'unfollow'
· @param user_id: the user id of the user we want to follow
· @param blockOrUnblock: either 'block' or 'unblock'
· @param user_id: the user id of the user we want to block/unblock
· @param actionOnSuccess: callback function, false on error, data on success
·
· · · · · · · · · · · · · */
@ -498,6 +499,67 @@ function APIBlockOrUnblockUser(blockOrUnblock,user_id,actionOnSuccess) {
}
/* ·
·
· Post sandbox or unsandbox user request
·
· @param createOrDestroy: either 'create' or 'destroy'
· @param userId: the user id of the user we want to sandbox/unsandbox
· @param actionOnSuccess: callback function, false on error, data on success
·
· · · · · · · · · · · · · */
function APISandboxCreateOrDestroy(createOrDestroy,userId,actionOnSuccess) {
$.ajax({ url: window.apiRoot + 'qvitter/sandbox/' + createOrDestroy + '.json',
cache: false,
type: "POST",
data: {
id: userId
},
dataType:"json",
error: function(data){ actionOnSuccess(false); console.log('sandbox error'); console.log(data); },
success: function(data) {
data = convertEmptyObjectToEmptyArray(data);
data = iterateRecursiveReplaceHtmlSpecialChars(data);
searchForUserDataToCache(data);
updateUserDataInStream();
rememberStreamStateInLocalStorage();
actionOnSuccess(data);
}
});
}
/* ·
·
· Post silence or unsilence user request
·
· @param createOrDestroy: either 'create' or 'destroy'
· @param userId: the user id of the user we want to silence/unsilence
· @param actionOnSuccess: callback function, false on error, data on success
·
· · · · · · · · · · · · · */
function APISilenceCreateOrDestroy(createOrDestroy,userId,actionOnSuccess) {
$.ajax({ url: window.apiRoot + 'qvitter/silence/' + createOrDestroy + '.json',
cache: false,
type: "POST",
data: {
id: userId
},
dataType:"json",
error: function(data){ actionOnSuccess(false); console.log('silence error'); console.log(data); },
success: function(data) {
data = convertEmptyObjectToEmptyArray(data);
data = iterateRecursiveReplaceHtmlSpecialChars(data);
searchForUserDataToCache(data);
updateUserDataInStream();
rememberStreamStateInLocalStorage();
actionOnSuccess(data);
}
});
}
/* ·
·

View File

@ -81,22 +81,31 @@ function getMenu(menuArray) {
// 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') {
if(isQvitterProfilePrefEnabled(this.topic)) {
prefEnabledOrDisabled = 'enabled';
}
// sometimes we want another label when the toggle is enabled
var labelToUse = this.label;
if(isQvitterProfilePrefEnabled(this.topic) && typeof this.enabledLabel != 'undefined') {
labelToUse = this.enabledLabel;
}
// the tick can be disabled
var disableTickClass = '';
if(typeof this.tickDisabled != 'undefined' && this.tickDisabled === true) {
var disableTickClass = ' tick-disabled';
}
// get row html
menuHTML = menuHTML + buildMenuRowFullwidth(this.label, {
menuHTML = menuHTML + buildMenuRowFullwidth(labelToUse, {
id: this.topic,
class: 'row-type-' + this.type + ' ' + prefEnabledOrDisabled,
class: 'row-type-' + this.type + ' ' + prefEnabledOrDisabled + disableTickClass,
'data-menu-row-type': this.type,
'data-profile-prefs-topic': this.topic,
'data-profile-prefs-namespace': this.namespace,
'data-profile-prefs-label': replaceHtmlSpecialChars(this.label),
'data-profile-prefs-enabled-label': replaceHtmlSpecialChars(this.enabledLabel),
'data-profile-pref-state': prefEnabledOrDisabled,
'data-profile-pref-callback': this.callback
});
@ -358,6 +367,18 @@ function buildProfileCard(data) {
var follows_you = '<span class="follows-you">' + window.sL.followsYou + '</span>';
}
// me?
var is_me = '';
if(window.loggedIn !== false && window.loggedIn.id == data.id) {
var is_me = ' is-me';
}
// logged in?
var logged_in = '';
if(window.loggedIn !== false) {
var logged_in = ' logged-in';
}
// silenced?
var is_silenced = '';
if(data.is_silenced === true) {
@ -368,6 +389,11 @@ function buildProfileCard(data) {
if(data.is_sandboxed === true) {
is_sandboxed = ' sandboxed';
}
// muted?
var is_muted = '';
if(isUserMuted(data.id)) {
is_muted = ' user-muted';
}
var followButton = '';
@ -394,8 +420,8 @@ function buildProfileCard(data) {
// full card html
data.profileCardHtml = '\
<div class="profile-card">\
<div class="profile-header-inner' + is_silenced + is_sandboxed + '" style="' + coverPhotoHtml + '" data-user-id="' + data.id + '">\
<div class="profile-card' + is_me + logged_in + is_muted + '">\
<div class="profile-header-inner' + is_silenced + is_sandboxed + '" style="' + coverPhotoHtml + '" data-user-id="' + data.id + '" data-screen-name="' + data.screen_name + '">\
<div class="profile-header-inner-overlay"></div>\
<a class="profile-picture" href="' + data.profile_image_url_original + '">\
<img class="avatar profile-size" src="' + data.profile_image_url_profile_size + '" data-user-id="' + data.id + '" />\
@ -426,6 +452,7 @@ function buildProfileCard(data) {
<li class="groups-num"><a href="' + data.statusnet_profile_url + '/groups" class="groups-stats">' + window.sL.groups + '<strong>' + data.groups_count + '</strong></a></li>\
</ul>\
' + followButton + '\
<div class="user-menu-cog' + is_silenced + is_sandboxed + logged_in + '" data-tooltip="' + window.sL.userOptions + '" data-user-id="' + data.id + '" data-screen-name="' + data.screen_name + '"></div>\
<div class="clearfix"></div>\
</div>\
</div>\
@ -458,6 +485,18 @@ function buildExternalProfileCard(data) {
var followButton = buildFollowBlockbutton(data.local);
}
// me?
var is_me = '';
if(window.loggedIn !== false && window.loggedIn.id == data.local.id) {
var is_me = ' is-me';
}
// logged in?
var logged_in = '';
if(window.loggedIn !== false) {
var logged_in = ' logged-in';
}
// silenced?
var is_silenced = '';
if(data.local.is_silenced === true) {
@ -470,8 +509,15 @@ function buildExternalProfileCard(data) {
is_sandboxed = ' sandboxed';
}
// local id
// muted?
var is_muted = '';
if(isUserMuted(data.local.id)) {
is_muted = ' user-muted';
}
// local id/screen_name
var localUserId = data.local.id;
var localUserScreenName = data.local.screen_name;
// empty strings and zeros instead of null
data = cleanUpUserObject(data.external);
@ -506,8 +552,8 @@ function buildExternalProfileCard(data) {
data.screenNameWithServer = '@' + data.screen_name + '@' + serverUrl;
data.profileCardHtml = '\
<div class="profile-card">\
<div class="profile-header-inner' + is_silenced + is_sandboxed + '" style="background-image:url(\'' + cover_photo + '\')" data-user-id="' + localUserId + '">\
<div class="profile-card' + is_me + logged_in + is_muted + '">\
<div class="profile-header-inner' + is_silenced + is_sandboxed + '" style="background-image:url(\'' + cover_photo + '\')" data-user-id="' + localUserId + '" data-screen-name="' + localUserScreenName + '">\
<div class="profile-header-inner-overlay"></div>\
<a class="profile-picture"><img src="' + data.profile_image_url_profile_size + '" /></a>\
<div class="profile-card-inner">\
@ -538,6 +584,7 @@ function buildExternalProfileCard(data) {
<li class="follower-num"><a class="follower-stats" target="_blank" href="' + data.statusnet_profile_url + '/subscribers">' + window.sL.followers + '<strong>' + data.followers_count + '</strong></a></li>\
</ul>\
' + followButton + '\
<div class="user-menu-cog' + is_silenced + is_sandboxed + logged_in + '" data-tooltip="' + window.sL.userOptions + '" data-user-id="' + localUserId + '" data-screen-name="' + localUserScreenName + '"></div>\
<div class="clearfix"></div>\
</div>\
</div>\
@ -783,12 +830,13 @@ function setNewCurrentStream(streamObject,setLocation,fallbackId,actionOnSuccess
// hide all notices from blocked users (not for user lists)
if(window.currentStreamObject.type != 'users' && typeof window.allBlocking != 'undefined') {
$.each(window.allBlocking,function(){
oldStreamState.find('strong.name[data-user-id="' + this + '"]').closest('.stream-item').addClass('profile-blocked-by-me');
oldStreamState.find('strong.name[data-user-id="' + this + '"]').closest('.stream-item').children('.queet').attr('data-tooltip',window.sL.thisIsANoticeFromABlockedUser);
});
markAllNoticesFromBlockedUsersAsBlockedInJQueryObject(oldStreamState);
}
// mark all notices and profile cards from muted users as muted
markAllNoticesFromMutedUsersAsMutedInJQueryObject(oldStreamState);
markAllProfileCardsFromMutedUsersAsMutedInDOM();
// hide dublicate repeats, only show the first/oldest instance of a notice
oldStreamState = hideAllButOldestInstanceOfStreamItem(oldStreamState);
@ -1343,7 +1391,7 @@ function cleanUpAfterCollapseQueet(streamItem) {
streamItem.find('.view-more-container-top').remove();
streamItem.find('.view-more-container-bottom').remove();
streamItem.find('.inline-reply-queetbox').remove();
streamItem.find('.stream-item.conversation').remove();
streamItem.children('.stream-item.conversation').remove();
streamItem.find('.show-full-conversation').remove();
streamItem.removeAttr('style');
queet.removeAttr('style');
@ -1588,14 +1636,16 @@ function showConversation(q, qid, data, offsetScroll) {
/* ·
·
· Add last visible class, since that's not possible to select in pure css
· Add last&first visible class, since that's not possible to select in pure css
·
· · · · · · · · · · · · · */
function findAndMarkLastVisibleInConversation(streamItem) {
streamItem.children().removeClass('last-visible');
streamItem.children().removeClass('first-visible-after-parent');
streamItem.children().not('.hidden-conversation').last().addClass('last-visible');
streamItem.children('.queet').nextAll().not('.hidden-conversation').first().addClass('first-visible-after-parent');
streamItem.children().not('.hidden-conversation').not('.always-hidden').last().addClass('last-visible');
streamItem.children('.queet').nextAll().not('.hidden-conversation').not('.always-hidden').first().addClass('first-visible-after-parent');
streamItem.children().removeClass('first-visible');
streamItem.children().not('.hidden-conversation').not('.always-hidden').first().addClass('first-visible');
}
@ -1613,7 +1663,7 @@ function findInReplyToStatusAndShow(q, qid,reply,only_first,onlyINreplyto) {
reply_found.css('opacity','1');
if(only_first && reply_found_reply_to.length>0) {
if(q.children('.view-more-container-top').length < 1) {
if(q.children('.queet').prevAll('.hidden-conversation').length>0) {
if(q.children('.queet').prevAll('.hidden-conversation:not(.always-hidden)').length>0) {
q.prepend('<div class="view-more-container-top" data-trace-from="' + reply + '"><a>' + window.sL.viewMoreInConvBefore + '</a></div>');
}
}
@ -1647,7 +1697,7 @@ function findReplyToStatusAndShow(q, qid,this_id,only_first) {
}
if(only_first && reply_founds_reply.length>0) {
if(q.children('.view-more-container-bottom').length < 1) {
if(q.children('.queet').nextAll('.hidden-conversation').length>0) {
if(q.children('.queet').nextAll('.hidden-conversation:not(.always-hidden)').length>0) {
q.append('<div class="view-more-container-bottom" data-replies-after="' + qid + '"><a>' + window.sL.viewMoreInConvAfter + '</a></div>');
}
}
@ -1660,7 +1710,7 @@ function findReplyToStatusAndShow(q, qid,this_id,only_first) {
// helper function for the above recursive functions
function checkForHiddenConversationQueets(q, qid) {
// here we check if there are any remaining hidden queets in conversation, if there are, we put a "show full conversation"-link
if(q.find('.hidden-conversation').length>0) {
if(q.find('.hidden-conversation:not(.always-hidden)').length>0) {
if(q.children('.queet').find('.show-full-conversation').length == 0) {
q.children('.queet').find('.stream-item-footer').append('<span class="show-full-conversation" data-stream-item-id="' + qid + '">' + window.sL.expandFullConversation + '</span>');
}
@ -1708,7 +1758,11 @@ function addToFeed(feed, after, extraClasses) {
var notificationTime = parseTwitterDate(obj.created_at);
if(obj.is_seen == '0') {
extraClassesThisRun += ' not-seen'
extraClassesThisRun += ' not-seen';
}
if(isUserMuted(obj.from_profile.id)) {
extraClassesThisRun += ' user-muted';
}
// external
@ -1717,10 +1771,9 @@ function addToFeed(feed, after, extraClasses) {
ostatusHtml = '<a target="_blank" data-tooltip="' + window.sL.goToOriginalNotice + '" class="ostatus-link" href="' + obj.from_profile.statusnet_profile_url + '"></a>';
}
if(obj.ntype == 'like') {
var noticeTime = parseTwitterDate(obj.notice.created_at);
var notificationHtml = '<div data-quitter-id-in-stream="' + obj.id + '" id="stream-item-n-' + obj.id + '" class="stream-item ' + extraClassesThisRun + ' notification like">\
var notificationHtml = '<div data-user-id="' + obj.from_profile.id + '" data-quitter-id-in-stream="' + obj.id + '" id="stream-item-n-' + obj.id + '" class="stream-item ' + extraClassesThisRun + ' notification like">\
<div class="queet">\
<div class="dogear"></div>\
' + ostatusHtml + '\
@ -1746,7 +1799,7 @@ function addToFeed(feed, after, extraClasses) {
}
else if(obj.ntype == 'repeat') {
var noticeTime = parseTwitterDate(obj.notice.created_at);
var notificationHtml = '<div data-quitter-id-in-stream="' + obj.id + '" id="stream-item-n-' + obj.id + '" class="stream-item ' + extraClassesThisRun + ' notification repeat">\
var notificationHtml = '<div data-user-id="' + obj.from_profile.id + '" data-quitter-id-in-stream="' + obj.id + '" id="stream-item-n-' + obj.id + '" class="stream-item ' + extraClassesThisRun + ' notification repeat">\
<div class="queet">\
<div class="dogear"></div>\
' + ostatusHtml + '\
@ -1777,7 +1830,7 @@ function addToFeed(feed, after, extraClasses) {
var notificationHtml = buildQueetHtml(obj.notice, obj.id, extraClassesThisRun + ' notification reply');
}
else if(obj.ntype == 'follow') {
var notificationHtml = '<div data-quitter-id-in-stream="' + obj.id + '" id="stream-item-n-' + obj.id + '" class="stream-item ' + extraClassesThisRun + ' notification follow">\
var notificationHtml = '<div data-user-id="' + obj.from_profile.id + '" data-quitter-id-in-stream="' + obj.id + '" id="stream-item-n-' + obj.id + '" class="stream-item ' + extraClassesThisRun + ' notification follow">\
<div class="queet">\
<div class="queet-content">\
' + ostatusHtml + '\
@ -1984,6 +2037,16 @@ function buildUserStreamItemHtml(obj) {
if(obj.is_sandboxed === true) {
sandboxedClass = ' sandboxed';
}
// logged in?
var loggedInClass = '';
if(window.loggedIn !== false) {
loggedInClass = ' logged-in';
}
// muted?
var mutedClass = '';
if(isUserMuted(obj.id)) {
mutedClass = ' user-muted';
}
var followButton = '';
if(typeof window.loggedIn.screen_name != 'undefined' // if logged in
@ -1993,9 +2056,10 @@ function buildUserStreamItemHtml(obj) {
}
}
return '<div id="stream-item-' + obj.id + '" class="stream-item user' + silencedClass + sandboxedClass + '" data-user-id="' + obj.id + '">\
return '<div id="stream-item-' + obj.id + '" class="stream-item user' + silencedClass + sandboxedClass + mutedClass + '" data-user-id="' + obj.id + '">\
<div class="queet ' + rtlOrNot + '">\
' + followButton + '\
<div class="user-menu-cog' + silencedClass + sandboxedClass + loggedInClass + '" data-tooltip="' + window.sL.userOptions + '" data-user-id="' + obj.id + '" data-screen-name="' + obj.screen_name + '"></div>\
<div class="queet-content">\
<div class="stream-item-header">\
<a class="account-group" href="' + obj.statusnet_profile_url + '" data-user-id="' + obj.id + '">\
@ -2037,6 +2101,11 @@ function buildQueetHtml(obj, idInStream, extraClasses, requeeted_by, isConversat
});
}
// muted? (if class is not already added)
if(isUserMuted(obj.user.id) && extraClasses.indexOf(' user-muted') == -1) {
extraClasses += ' user-muted';
blockingTooltip = ' data-tooltip="' + window.sL.thisIsANoticeFromAMutedUser + '"';
}
// silenced?
if(obj.user.is_silenced === true) {
extraClasses += ' silenced';

View File

@ -3,4 +3,4 @@
* https://github.com/ded/bowser
* MIT License | (c) Dustin Diaz 2015
*/
!function(e,t){typeof module!="undefined"&&module.exports?module.exports=t():typeof define=="function"&&define.amd?define(t):this[e]=t()}("bowser",function(){function t(t){function n(e){var n=t.match(e);return n&&n.length>1&&n[1]||""}function r(e){var n=t.match(e);return n&&n.length>1&&n[2]||""}var i=n(/(ipod|iphone|ipad)/i).toLowerCase(),s=/like android/i.test(t),o=!s&&/android/i.test(t),u=/CrOS/.test(t),a=n(/edge\/(\d+(\.\d+)?)/i),f=n(/version\/(\d+(\.\d+)?)/i),l=/tablet/i.test(t),c=!l&&/[^-]mobi/i.test(t),h;/opera|opr/i.test(t)?h={name:"Opera",opera:e,version:f||n(/(?:opera|opr)[\s\/](\d+(\.\d+)?)/i)}:/yabrowser/i.test(t)?h={name:"Yandex Browser",yandexbrowser:e,version:f||n(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i)}:/windows phone/i.test(t)?(h={name:"Windows Phone",windowsphone:e},a?(h.msedge=e,h.version=a):(h.msie=e,h.version=n(/iemobile\/(\d+(\.\d+)?)/i))):/msie|trident/i.test(t)?h={name:"Internet Explorer",msie:e,version:n(/(?:msie |rv:)(\d+(\.\d+)?)/i)}:u?h={name:"Chrome",chromeBook:e,chrome:e,version:n(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)}:/chrome.+? edge/i.test(t)?h={name:"Microsoft Edge",msedge:e,version:a}:/chrome|crios|crmo/i.test(t)?h={name:"Chrome",chrome:e,version:n(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)}:i?(h={name:i=="iphone"?"iPhone":i=="ipad"?"iPad":"iPod"},f&&(h.version=f)):/sailfish/i.test(t)?h={name:"Sailfish",sailfish:e,version:n(/sailfish\s?browser\/(\d+(\.\d+)?)/i)}:/seamonkey\//i.test(t)?h={name:"SeaMonkey",seamonkey:e,version:n(/seamonkey\/(\d+(\.\d+)?)/i)}:/firefox|iceweasel/i.test(t)?(h={name:"Firefox",firefox:e,version:n(/(?:firefox|iceweasel)[ \/](\d+(\.\d+)?)/i)},/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(t)&&(h.firefoxos=e)):/silk/i.test(t)?h={name:"Amazon Silk",silk:e,version:n(/silk\/(\d+(\.\d+)?)/i)}:o?h={name:"Android",version:f}:/phantom/i.test(t)?h={name:"PhantomJS",phantom:e,version:n(/phantomjs\/(\d+(\.\d+)?)/i)}:/blackberry|\bbb\d+/i.test(t)||/rim\stablet/i.test(t)?h={name:"BlackBerry",blackberry:e,version:f||n(/blackberry[\d]+\/(\d+(\.\d+)?)/i)}:/(web|hpw)os/i.test(t)?(h={name:"WebOS",webos:e,version:f||n(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i)},/touchpad\//i.test(t)&&(h.touchpad=e)):/bada/i.test(t)?h={name:"Bada",bada:e,version:n(/dolfin\/(\d+(\.\d+)?)/i)}:/tizen/i.test(t)?h={name:"Tizen",tizen:e,version:n(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i)||f}:/safari/i.test(t)?h={name:"Safari",safari:e,version:f}:h={name:n(/^(.*)\/(.*) /),version:r(/^(.*)\/(.*) /)},!h.msedge&&/(apple)?webkit/i.test(t)?(h.name=h.name||"Webkit",h.webkit=e,!h.version&&f&&(h.version=f)):!h.opera&&/gecko\//i.test(t)&&(h.name=h.name||"Gecko",h.gecko=e,h.version=h.version||n(/gecko\/(\d+(\.\d+)?)/i)),!h.msedge&&(o||h.silk)?h.android=e:i&&(h[i]=e,h.ios=e);var p="";h.windowsphone?p=n(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i):i?(p=n(/os (\d+([_\s]\d+)*) like mac os x/i),p=p.replace(/[_\s]/g,".")):o?p=n(/android[ \/-](\d+(\.\d+)*)/i):h.webos?p=n(/(?:web|hpw)os\/(\d+(\.\d+)*)/i):h.blackberry?p=n(/rim\stablet\sos\s(\d+(\.\d+)*)/i):h.bada?p=n(/bada\/(\d+(\.\d+)*)/i):h.tizen&&(p=n(/tizen[\/\s](\d+(\.\d+)*)/i)),p&&(h.osversion=p);var d=p.split(".")[0];if(l||i=="ipad"||o&&(d==3||d==4&&!c)||h.silk)h.tablet=e;else if(c||i=="iphone"||i=="ipod"||o||h.blackberry||h.webos||h.bada)h.mobile=e;return h.msedge||h.msie&&h.version>=10||h.yandexbrowser&&h.version>=15||h.chrome&&h.version>=20||h.firefox&&h.version>=20||h.safari&&h.version>=6||h.opera&&h.version>=10||h.ios&&h.osversion&&h.osversion.split(".")[0]>=6||h.blackberry&&h.version>=10.1?h.a=e:h.msie&&h.version<10||h.chrome&&h.version<20||h.firefox&&h.version<20||h.safari&&h.version<6||h.opera&&h.version<10||h.ios&&h.osversion&&h.osversion.split(".")[0]<6?h.c=e:h.x=e,h}var e=!0,n=t(typeof navigator!="undefined"?navigator.userAgent:"");return n.test=function(e){for(var t=0;t<e.length;++t){var r=e[t];if(typeof r=="string"&&r in n)return!0}return!1},n._detect=t,n})
!function(e,t){typeof module!="undefined"&&module.exports?module.exports=t():typeof define=="function"&&define.amd?define(t):this[e]=t()}("bowser",function(){function t(t){function n(e){var n=t.match(e);return n&&n.length>1&&n[1]||""}function r(e){var n=t.match(e);return n&&n.length>1&&n[2]||""}var i=n(/(ipod|iphone|ipad)/i).toLowerCase(),s=/like android/i.test(t),o=!s&&/android/i.test(t),u=/CrOS/.test(t),a=n(/edge\/(\d+(\.\d+)?)/i),f=n(/version\/(\d+(\.\d+)?)/i),l=/tablet/i.test(t),c=!l&&/[^-]mobi/i.test(t),h;/opera|opr/i.test(t)?h={name:"Opera",opera:e,version:f||n(/(?:opera|opr)[\s\/](\d+(\.\d+)?)/i)}:/yabrowser/i.test(t)?h={name:"Yandex Browser",yandexbrowser:e,version:f||n(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i)}:/windows phone/i.test(t)?(h={name:"Windows Phone",windowsphone:e},a?(h.msedge=e,h.version=a):(h.msie=e,h.version=n(/iemobile\/(\d+(\.\d+)?)/i))):/msie|trident/i.test(t)?h={name:"Internet Explorer",msie:e,version:n(/(?:msie |rv:)(\d+(\.\d+)?)/i)}:u?h={name:"Chrome",chromeBook:e,chrome:e,version:n(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)}:/chrome.+? edge/i.test(t)?h={name:"Microsoft Edge",msedge:e,version:a}:/chrome|crios|crmo/i.test(t)?h={name:"Chrome",chrome:e,version:n(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)}:i?(h={name:i=="iphone"?"iPhone":i=="ipad"?"iPad":"iPod"},f&&(h.version=f)):/sailfish/i.test(t)?h={name:"Sailfish",sailfish:e,version:n(/sailfish\s?browser\/(\d+(\.\d+)?)/i)}:/seamonkey\//i.test(t)?h={name:"SeaMonkey",seamonkey:e,version:n(/seamonkey\/(\d+(\.\d+)?)/i)}:/firefox|iceweasel/i.test(t)?(h={name:"Firefox",firefox:e,version:n(/(?:firefox|iceweasel)[ \/](\d+(\.\d+)?)/i)},/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(t)&&(h.firefoxos=e)):/silk/i.test(t)?h={name:"Amazon Silk",silk:e,version:n(/silk\/(\d+(\.\d+)?)/i)}:o?h={name:"Android",version:f}:/phantom/i.test(t)?h={name:"PhantomJS",phantom:e,version:n(/phantomjs\/(\d+(\.\d+)?)/i)}:/blackberry|\bbb\d+/i.test(t)||/rim\stablet/i.test(t)?h={name:"BlackBerry",blackberry:e,version:f||n(/blackberry[\d]+\/(\d+(\.\d+)?)/i)}:/(web|hpw)os/i.test(t)?(h={name:"WebOS",webos:e,version:f||n(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i)},/touchpad\//i.test(t)&&(h.touchpad=e)):/bada/i.test(t)?h={name:"Bada",bada:e,version:n(/dolfin\/(\d+(\.\d+)?)/i)}:/tizen/i.test(t)?h={name:"Tizen",tizen:e,version:n(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i)||f}:/safari/i.test(t)?h={name:"Safari",safari:e,version:f}:h={name:n(/^(.*)\/(.*) /),version:r(/^(.*)\/(.*) /)},!h.msedge&&/(apple)?webkit/i.test(t)?(h.name=h.name||"Webkit",h.webkit=e,!h.version&&f&&(h.version=f)):!h.opera&&/gecko\//i.test(t)&&(h.name=h.name||"Gecko",h.gecko=e,h.version=h.version||n(/gecko\/(\d+(\.\d+)?)/i)),!h.msedge&&(o||h.silk)?h.android=e:i&&(h[i]=e,h.ios=e);var p="";h.windowsphone?p=n(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i):i?(p=n(/os (\d+([_\s]\d+)*) like mac os x/i),p=p.replace(/[_\s]/g,".")):o?p=n(/android[ \/-](\d+(\.\d+)*)/i):h.webos?p=n(/(?:web|hpw)os\/(\d+(\.\d+)*)/i):h.blackberry?p=n(/rim\stablet\sos\s(\d+(\.\d+)*)/i):h.bada?p=n(/bada\/(\d+(\.\d+)*)/i):h.tizen&&(p=n(/tizen[\/\s](\d+(\.\d+)*)/i)),p&&(h.osversion=p);var d=p.split(".")[0];if(l||i=="ipad"||o&&(d==3||d==4&&!c)||h.silk)h.tablet=e;else if(c||i=="iphone"||i=="ipod"||o||h.blackberry||h.webos||h.bada)h.mobile=e;return h.msedge||h.msie&&h.version>=10||h.yandexbrowser&&h.version>=15||h.chrome&&h.version>=20||h.firefox&&h.version>=20||h.safari&&h.version>=6||h.opera&&h.version>=10||h.ios&&h.osversion&&h.osversion.split(".")[0]>=6||h.blackberry&&h.version>=10.1?h.a=e:h.msie&&h.version<10||h.chrome&&h.version<20||h.firefox&&h.version<20||h.safari&&h.version<6||h.opera&&h.version<10||h.ios&&h.osversion&&h.osversion.split(".")[0]<6?h.c=e:h.x=e,h}var e=!0,n=t(typeof navigator!="undefined"?navigator.userAgent:"");return n.test=function(e){for(var t=0;t<e.length;++t){var r=e[t];if(typeof r=="string"&&r in n)return!0}return!1},n._detect=t,n})

View File

@ -117,9 +117,15 @@ function removeOldestLocalStorageEntries(callback) {
}
});
console.log('removed 100 old localstorage items');
console.log('removed ' + i + ' old localstorage items');
callback();
if(i>0) {
callback();
return true;
}
else {
return false;
}
}
@ -290,9 +296,18 @@ function localStorageIsEnabled() {
}
catch(e) {
if (e.name == 'QUOTA_EXCEEDED_ERR' || e.name == 'NS_ERROR_DOM_QUOTA_REACHED' || e.name == 'QuotaExceededError' || e.name == 'W3CException_DOM_QUOTA_EXCEEDED_ERR') {
removeOldestLocalStorageEntries(function(){
localStorageIsEnabled();
// if localstorage is empty but returns a full error, we assume it's disabled (in an ugly way)
if(localStorage.length === 0) {
return false;
}
var successfulRemoval = removeOldestLocalStorageEntries(function(){
return localStorageIsEnabled();
});
if(successfulRemoval === false) {
return false;
}
}
else {
return false;
@ -301,6 +316,8 @@ function localStorageIsEnabled() {
}
/* ·
·
· Block/unblock user and do necessary stuff
@ -309,6 +326,8 @@ function localStorageIsEnabled() {
function blockUser(arg, callback) {
$('body').click(); // a click somewhere hides any open menus
// arguments is sent as an object, for easier use with a menu's function-row
var userId = arg.userId;
var blockButton_jQueryElement = arg.blockButton_jQueryElement;
@ -337,6 +356,8 @@ function blockUser(arg, callback) {
}
function unblockUser(arg, callback) {
$('body').click(); // a click somewhere hides any open menus
// arguments is sent as an object, for easier use with a menu's function-row
var userId = arg.userId;
var blockButton_jQueryElement = arg.blockButton_jQueryElement;
@ -398,9 +419,11 @@ function markUserAsUnblockedInDOM(userId, following) {
}
// hide the user from lists of blocked users
$.each($('.stream-item.user[data-user-id="' + userId + '"]'),function(){
slideUpAndRemoveStreamItem($(this));
});
if(window.currentStreamObject.name == 'user blocks' && window.currentStreamObject.nickname == window.loggedIn.screen_name) {
$.each($('.stream-item.user[data-user-id="' + userId + '"]'),function(){
slideUpAndRemoveStreamItem($(this));
});
}
// unhide notices from the blocked user
$.each($('.stream-item[data-quitter-id-in-stream][data-user-id="' + userId + '"]'),function(){
@ -431,6 +454,219 @@ function userIsBlocked(userId) {
}
}
/* ·
·
· Marks all notices from blocked users in an jQuery object as blocked
·
· · · · · · · · · */
function markAllNoticesFromBlockedUsersAsBlockedInJQueryObject(obj) {
$.each(window.allBlocking,function(){
obj.find('.stream-item[data-user-id="' + this + '"]').addClass('profile-blocked-by-me');
obj.find('.stream-item[data-user-id="' + this + '"]').children('.queet').attr('data-tooltip',window.sL.thisIsANoticeFromABlockedUser);
});
}
/* ·
·
· Marks all notices from muted users in an jQuery object as muted
·
· · · · · · · · · */
function markAllNoticesFromMutedUsersAsMutedInJQueryObject(obj) {
$.each(obj.find('.stream-item'),function(){
if(isUserMuted($(this).attr('data-user-id'))) {
$(this).addClass('user-muted');
$(this).children('.queet').attr('data-tooltip',window.sL.thisIsANoticeFromAMutedUser);
}
else {
$(this).children('.queet').removeAttr('data-tooltip');
$(this).removeClass('user-muted');
}
});
}
/* ·
·
· Marks all profile cards from muted users as muted in DOM
·
· · · · · · · · · */
function markAllProfileCardsFromMutedUsersAsMutedInDOM() {
$.each($('body').find('.profile-header-inner'),function(){
if(isUserMuted($(this).attr('data-user-id'))) {
$(this).parent('.profile-card').addClass('user-muted');
}
else {
$(this).parent('.profile-card').removeClass('user-muted');
}
});
}
/* ·
·
· Function invoked after mute and unmute
·
· · · · · · · · · */
function hideOrShowNoticesAfterMuteOrUnmute() {
markAllNoticesFromMutedUsersAsMutedInJQueryObject($('#feed-body'));
markAllProfileCardsFromMutedUsersAsMutedInDOM();
}
/* ·
·
· Sandbox/unsandbox user and do necessary stuff
·
· · · · · · · · · */
function sandboxCreateOrDestroy(arg, callback) {
$('body').click(); // a click somewhere hides any open menus
display_spinner();
APISandboxCreateOrDestroy(arg.createOrDestroy, arg.userId, function(data) {
remove_spinner();
if(!data) {
// failed!
showErrorMessage(window.sL.ERRORfailedSandboxingUser);
}
});
}
/* ·
·
· Sandbox/unsandbox user and do necessary stuff
·
· · · · · · · · · */
function silenceCreateOrDestroy(arg, callback) {
$('body').click(); // a click somewhere hides any open menus
display_spinner();
APISilenceCreateOrDestroy(arg.createOrDestroy, arg.userId, function(data) {
remove_spinner();
if(!data) {
// failed!
showErrorMessage(window.sL.ERRORfailedSilencingUser);
}
});
}
/* ·
·
· Get the logged in user's menu array
·
· · · · · · · · · */
function loggedInUsersMenuArray() {
return [
{
type: 'function',
functionName: 'goToEditProfile',
label: window.sL.editMyProfile
},
{
type: 'link',
href: window.siteInstanceURL + 'settings/profile',
label: window.sL.settings
},
{
type:'divider'
},
{
type: 'link',
href: window.siteInstanceURL + window.loggedIn.screen_name + '/mutes',
label: window.sL.userMuted
},
{
type: 'link',
href: window.siteInstanceURL + window.loggedIn.screen_name + '/blocks',
label: window.sL.userBlocked
}];
}
/* ·
·
· Append moderator user actions to menu array
·
· @param menuArray: array used to build menus in getMenu()
· @param userID: the user id of the user to act on
· @param userScreenName: the screen_name/nickname/username of the user to act on
· @param sandboxed: is the user sandboxed?
· @param silenced: is the user silenced?
·
· · · · · · · · · */
function appendModeratorUserActionsToMenuArray(menuArray,userID,userScreenName,sandboxed,silenced) {
// not if it's me
if(window.loggedIn.id == userID) {
return menuArray;
}
if(window.loggedIn !== false && window.loggedIn.rights.sandbox === true) {
menuArray.push({type:'divider'});
if(sandboxed === true) {
menuArray.push({
type: 'function',
functionName: 'sandboxCreateOrDestroy',
functionArguments: {
userId: userID,
createOrDestroy: 'destroy'
},
label: window.sL.unSandboxThisUser.replace('{nickname}','@' + userScreenName)
});
}
else {
menuArray.push({
type: 'function',
functionName: 'sandboxCreateOrDestroy',
functionArguments: {
userId: userID,
createOrDestroy: 'create'
},
label: window.sL.sandboxThisUser.replace('{nickname}','@' + userScreenName)
});
}
}
if(window.loggedIn !== false && window.loggedIn.rights.silence === true) {
if(silenced === true) {
menuArray.push({
type: 'function',
functionName: 'silenceCreateOrDestroy',
functionArguments: {
userId: userID,
createOrDestroy: 'destroy'
},
label: window.sL.unSilenceThisUser.replace('{nickname}','@' + userScreenName)
});
}
else {
menuArray.push({
type: 'function',
functionName: 'silenceCreateOrDestroy',
functionArguments: {
userId: userID,
createOrDestroy: 'create'
},
label: window.sL.silenceThisUser.replace('{nickname}','@' + userScreenName)
});
}
}
return menuArray;
}
/* ·
·
@ -475,20 +711,36 @@ function isLocalURL(url) {
· · · · · · · · · */
function maybeShowTheNewQueetsBar() {
var new_queets_num = $('#feed-body').find('.stream-item.hidden:not(.always-hidden):not(.hidden-repeat)').length;
if(new_queets_num > 0) {
var newQueetsNum = $('#feed-body').find('.stream-item.hidden:not(.always-hidden):not(.hidden-repeat)').length;
// subtract the number of hidden notices from muted users if this isn't the notifications stream,
// or if this is the notifications stream but the user has opted out of seeing notifications from muted users
var mutedHiddenNum = 0;
if(window.currentStreamObject.name == 'notifications') {
if($('#feed-body').hasClass('hide-notifications-from-muted-users')) {
mutedHiddenNum = $('#feed-body').find('.stream-item.hidden.user-muted:not(.always-hidden):not(.hidden-repeat)').length;
}
}
else {
var mutedHiddenNum = $('#feed-body').find('.stream-item.hidden.user-muted:not(.always-hidden):not(.hidden-repeat)').length;
}
newQueetsNum = newQueetsNum - mutedHiddenNum;
if(newQueetsNum > 0) {
$('#new-queets-bar').parent().removeClass('hidden');
// bar label
if(new_queets_num == 1) { var q_txt = window.sL.newQueet; }
if(newQueetsNum == 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; }
if(newQueetsNum == 1) { var q_txt = window.sL.newNotification; }
else { var q_txt = window.sL.newNotifications; }
}
$('#new-queets-bar').html(q_txt.replace('{new-notice-count}',new_queets_num));
$('#new-queets-bar').html(q_txt.replace('{new-notice-count}',newQueetsNum));
}
}
@ -903,10 +1155,25 @@ function updateUserDataInStream() {
if(userArray.local.is_silenced === true) {
$('.stream-item[data-user-id=' + userArray.local.id + ']').addClass('silenced');
$('.profile-card .profile-header-inner[data-user-id=' + userArray.local.id + ']').addClass('silenced');
$('.user-menu-cog[data-user-id=' + userArray.local.id + ']').addClass('silenced');
}
else {
$('.stream-item[data-user-id=' + userArray.local.id + ']').removeClass('silenced')
$('.profile-card .profile-header-inner[data-user-id=' + userArray.local.id + ']').removeClass('silenced');
$('.user-menu-cog[data-user-id=' + userArray.local.id + ']').removeClass('silenced');
}
// add/remove sandboxed class to stream items and profile cards
if(userArray.local.is_sandboxed === true) {
$('.stream-item[data-user-id=' + userArray.local.id + ']').addClass('sandboxed');
$('.profile-card .profile-header-inner[data-user-id=' + userArray.local.id + ']').addClass('sandboxed');
$('.user-menu-cog[data-user-id=' + userArray.local.id + ']').addClass('sandboxed');
}
else {
$('.stream-item[data-user-id=' + userArray.local.id + ']').removeClass('sandboxed')
$('.profile-card .profile-header-inner[data-user-id=' + userArray.local.id + ']').removeClass('sandboxed');
$('.user-menu-cog[data-user-id=' + userArray.local.id + ']').removeClass('sandboxed');
}
// profile size avatars (notices, users)
@ -1168,19 +1435,9 @@ function rememberStreamStateInLocalStorage() {
var feed = $('<div/>').append(firstTwentyVisibleHTML);
// we add these again (with updated blocking list) when the notices are fetched from the cache
feed.children('.stream-item').removeClass('profile-blocked-by-me');
feed.children('.stream-item').children('.queet').removeAttr('data-tooltip'); // can contain tooltip about blocked user
// we add some of these things again when the notices are fetched from the cache
cleanStreamItemsFromClassesAndConversationElements(feed);
feed.find('.temp-post').remove();
feed.children('.stream-item').removeClass('not-seen');
feed.children('.stream-item').removeClass('hidden-repeat'); // this means we need hide repeats when adding cached notices to feed later
feed.children('.stream-item').removeClass('selected-by-keyboard');
feed.find('.dropdown-menu').remove();
feed.find('.stream-item').removeClass('expanded').removeClass('next-expanded').removeClass('hidden').removeClass('collapsing').addClass('visible');
feed.children('.stream-item').each(function() {
cleanUpAfterCollapseQueet($(this));
});
var feedHtml = feed.html();
var profileCardHtml = $('#feed').siblings('.profile-card').outerHTML();
var streamData = {
@ -1192,6 +1449,30 @@ function rememberStreamStateInLocalStorage() {
}
}
/* ·
·
· Clean stream items from classes and conversation elements,
· to use e.g. for caching and including in popup footers
·
· @param streamItems: jQuery object with stream items as children
·
· · · · · · · · · */
function cleanStreamItemsFromClassesAndConversationElements(streamItems) {
streamItems.children('.stream-item').removeClass('profile-blocked-by-me');
streamItems.children('.stream-item').children('.queet').removeAttr('data-tooltip'); // can contain tooltip about blocked user
streamItems.find('.temp-post').remove();
streamItems.children('.stream-item').removeClass('not-seen');
streamItems.children('.stream-item').removeClass('hidden-repeat'); // this means we need hide repeats when adding cached notices to feed later
streamItems.children('.stream-item').removeClass('selected-by-keyboard');
streamItems.find('.dropdown-menu').remove();
streamItems.find('.stream-item').removeClass('expanded').removeClass('next-expanded').removeClass('hidden').removeClass('collapsing').addClass('visible');
streamItems.children('.stream-item').each(function() {
cleanUpAfterCollapseQueet($(this));
});
}
/* ·
·
@ -1289,6 +1570,38 @@ function appendUserToMentionsSuggestionsArray(user) {
}
/* ·
·
· Is a profile pref in the qvitter namespace enabled?
·
· · · · · · · · · */
function isQvitterProfilePrefEnabled(topic) {
if(typeof window.qvitterProfilePrefs != 'undefined' && typeof window.qvitterProfilePrefs[topic] != 'undefined'
&& window.qvitterProfilePrefs[topic] !== null
&& window.qvitterProfilePrefs[topic] != ''
&& window.qvitterProfilePrefs[topic] !== false
&& window.qvitterProfilePrefs[topic] != 0
&& window.qvitterProfilePrefs[topic] != '0') {
return true;
}
return false;
}
/* ·
·
· Is this user muted?
·
· · · · · · · · · */
function isUserMuted(userID) {
if(isQvitterProfilePrefEnabled('mute:' + userID)) {
return true;
}
else {
return false;
}
}
/* ·
@ -1357,6 +1670,12 @@ function iterateRecursiveReplaceHtmlSpecialChars(obj) {
return obj;
}
function replaceHtmlSpecialChars(text) {
// don't do anything if the text is undefined
if(typeof text == 'undefined') {
return text;
}
var map = {
'&': '&amp;',
'<': '&lt;',

View File

@ -258,6 +258,11 @@ $('body').on('mouseover',function (e) {
return true;
}
// no hover card if the element has the no-hover-card class
if(targetElement.hasClass('no-hover-card')) {
return true;
}
// no hovercard for anchor links
if(hrefAttr.substring(0,1) == '#') {
return true;
@ -943,15 +948,16 @@ function proceedToSetLanguageAndLogin(data){
$('#invite-link').html(window.sL.inviteAFriend);
$('#classic-link').html(window.sL.classicInterface);
$('#edit-profile-header-link').html(window.sL.editMyProfile);
$('#mini-edit-profile-button').attr('data-tooltip',window.sL.editMyProfile);
$('#mini-logged-in-user-cog-wheel').attr('data-tooltip',window.sL.profileSettings);
$('#accessibility-toggle-link').html(window.sL.accessibilityToggleLink);
$('#settingslink .nav-session').attr('data-tooltip',window.sL.tooltipTopMenu);
$('#settingslink .nav-session').attr('data-tooltip',window.sL.profileAndSettings);
$('#top-compose').attr('data-tooltip',window.sL.compose);
$('button.upload-image').attr('data-tooltip',window.sL.tooltipAttachImage);
$('button.shorten').attr('data-tooltip',window.sL.tooltipShortenUrls);
$('.reload-stream').attr('data-tooltip',window.sL.tooltipReloadStream);
$('#clear-history').html(window.sL.clearHistory);
$('#user-screen-name, #user-avatar, #user-name').attr('data-tooltip', window.sL.viewMyProfilePage);
$('#top-menu-profile-link-view-profile').html(window.sL.viewMyProfilePage);
// show site body now
$('#user-container').css('display','block');
@ -1174,6 +1180,93 @@ $('#settingslink').click(function(){
});
/* ·
·
· Show/hide the user menu dropdown on click
·
· · · · · · · · · · · · · */
$('body').on('click','.user-menu-cog',function(e){
if(!$(e.target).is($(this))) {
// don't show/hide when clicking inside the menu
}
// hide
else if($(this).hasClass('dropped')) {
$(this).removeClass('dropped');
$(this).children('.dropdown-menu').remove();
}
// show
else {
$(this).addClass('dropped');
var userID = $(this).attr('data-user-id');
var userScreenName = $(this).attr('data-screen-name');
var silenced = $(this).hasClass('silenced');
var sandboxed = $(this).hasClass('sandboxed');
// menu
var menuArray = [];
// settings etc if it's me
if(userID == window.loggedIn.id) {
menuArray = loggedInUsersMenuArray();
}
// block etc if it not me
else {
if(userIsBlocked(userID)) {
menuArray.push({
type: 'function',
functionName: 'unblockUser',
functionArguments: {
userId: userID
},
label: window.sL.unblockUser.replace('{username}','@' + userScreenName)
});
}
else {
menuArray.push({
type: 'function',
functionName: 'blockUser',
functionArguments: {
userId: userID
},
label: window.sL.blockUser.replace('{username}','@' + userScreenName)
});
}
// mute profile pref
menuArray.push({
type: 'profile-prefs-toggle',
namespace: 'qvitter',
topic: 'mute:' + userID,
label: window.sL.muteUser,
enabledLabel: window.sL.unmuteUser,
tickDisabled: true,
callback: 'hideOrShowNoticesAfterMuteOrUnmute'
});
// moderator actions
menuArray = appendModeratorUserActionsToMenuArray(menuArray,userID,userScreenName,sandboxed,silenced);
}
var menu = $(getMenu(menuArray)).appendTo(this);
alignMenuToParent(menu,$(this));
}
});
// hide the stream menu when clicking outside it
$('body').on('click',function(e){
if(!$(e.target).is('.user-menu-cog') && $('.user-menu-cog').hasClass('dropped') && !$(e.target).closest('.user-menu-cog').length>0) {
$('.user-menu-cog').children('.dropdown-menu').remove();
$('.user-menu-cog').removeClass('dropped');
}
});
/* ·
·
· Show/hide the stream menu dropdown on click
@ -1231,9 +1324,12 @@ $('body').on('click','.sm-ellipsis',function(e){
else {
$(this).addClass('dropped');
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');
var streamItemID = $(this).closest('.queet').parent('.stream-item').attr('data-quitter-id');
var closestStreamItem = $(this).closest('.queet').parent('.stream-item');
var streamItemUsername = closestStreamItem.attr('data-user-screen-name');
var streamItemUserID = closestStreamItem.attr('data-user-id');
var streamItemID = closestStreamItem.attr('data-quitter-id');
var streamItemUserSandboxed = closestStreamItem.hasClass('sandboxed');
var streamItemUserSilenced = closestStreamItem.hasClass('silenced');
// menu
var menuArray = [];
@ -1271,8 +1367,22 @@ $('body').on('click','.sm-ellipsis',function(e){
label: window.sL.blockUser.replace('{username}',streamItemUsername)
});
}
// mute profile pref
menuArray.push({
type: 'profile-prefs-toggle',
namespace: 'qvitter',
topic: 'mute:' + streamItemUserID,
label: window.sL.muteUser,
enabledLabel: window.sL.unmuteUser,
tickDisabled: true,
callback: 'hideOrShowNoticesAfterMuteOrUnmute'
});
}
// moderator actions
menuArray = appendModeratorUserActionsToMenuArray(menuArray,streamItemUserID,streamItemUsername,streamItemUserSandboxed,streamItemUserSilenced);
// add menu to DOM and align it
var menu = $(getMenu(menuArray)).appendTo(this);
alignMenuToParent(menu,$(this));
@ -1306,7 +1416,7 @@ $('body').on('click','.row-type-function',function(e){
thisFunctionRow.addClass('clicked');
var functionName = $(this).attr('data-function-name');
if($(this).attr('data-function-arguments') == 'undefined') {
if(typeof $(this).attr('data-function-arguments') == 'undefined' || $(this).attr('data-function-arguments') == 'undefined') {
var functionArguments = false;
}
else {
@ -1349,6 +1459,8 @@ $('body').on('click','.row-type-profile-prefs-toggle',function(e){
var prefNamespace = thisToggle.attr('data-profile-prefs-namespace');
var prefTopic = thisToggle.attr('data-profile-prefs-topic');
var prefLabel = thisToggle.attr('data-profile-prefs-label');
var prefEnabledLabel = thisToggle.attr('data-profile-prefs-enabled-label');
// only prefs in the 'qvitter' namespace allowed
if(prefNamespace != 'qvitter') {
@ -1366,12 +1478,18 @@ $('body').on('click','.row-type-profile-prefs-toggle',function(e){
thisToggle.removeClass('disabled');
thisToggle.addClass('enabled');
thisToggle.attr('data-profile-pref-state','enabled');
if(prefEnabledLabel != 'undefined') {
thisToggle.html(prefEnabledLabel);
}
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');
if(prefEnabledLabel != 'undefined') {
thisToggle.html(prefLabel);
}
window.qvitterProfilePrefs[prefTopic] = '0';
}
@ -1423,14 +1541,10 @@ function showOrHideEmbeddedContentInTimelineFromProfilePref() {
var showHide = window.qvitterProfilePrefs['hide_embedded_in_timeline:' + window.currentStreamObject.path];
if(parseInt(showHide,10) == 1) {
$('#feed-body').addClass('embedded-content-hidden-by-user');
}
else {
$('#feed-body').removeClass('embedded-content-hidden-by-user');
return;
}
}
else {
$('#feed-body').removeClass('embedded-content-hidden-by-user');
}
$('#feed-body').removeClass('embedded-content-hidden-by-user');
}
/* ·
@ -1444,14 +1558,28 @@ function showOrHideQuotesInTimelineFromProfilePref() {
var showHide = window.qvitterProfilePrefs['hide_quotes_in_timeline:' + window.currentStreamObject.path];
if(parseInt(showHide,10) == 1) {
$('#feed-body').addClass('quotes-hidden-by-user');
}
else {
$('#feed-body').removeClass('quotes-hidden-by-user');
return;
}
}
else {
$('#feed-body').removeClass('quotes-hidden-by-user');
$('#feed-body').removeClass('quotes-hidden-by-user');
}
/* ·
·
· Show or hide notices from muted users in notifications?
·
· · · · · · · · · · · · · */
function showOrHideNoticesFromMutedUsersInNotifications() {
if(typeof window.qvitterProfilePrefs['hide_notifications_from_muted_users'] != 'undefined') {
var showHide = window.qvitterProfilePrefs['hide_notifications_from_muted_users'];
if(parseInt(showHide,10) == 1) {
$('#feed-body').addClass('hide-notifications-from-muted-users');
return;
}
}
$('#feed-body').removeClass('hide-notifications-from-muted-users')
}
@ -1628,8 +1756,8 @@ $('body').on('click','.member-button',function(event){
· · · · · · · · · · · · · */
$('#user-header').on('click',function(e){
// not if we're clicking the mini-edit-profile-button
if($(e.target).is('#mini-edit-profile-button')) {
// not if we're clicking the mini-logged-in-user-cog-wheel
if($(e.target).is('#mini-logged-in-user-cog-wheel')) {
return;
}
setNewCurrentStream(pathToStreamRouter(window.loggedIn.screen_name),true,false);
@ -2041,15 +2169,13 @@ $('body').on('click','.stream-item .queet img.attachment-thumb',function (event)
var thisAttachmentThumbSrc = $(this).attr('src');
var parentStreamItem = $(this).closest('.stream-item');
var $parentStreamItemClone = $('<div/>').append(parentStreamItem.outerHTML());
if(!parentStreamItem.hasClass('conversation')) {
$parentStreamItemClone.find('.stream-item.conversation').remove();
}
var $queetThumbsClone = $('<div/>').append($parentStreamItemClone.find('.queet-thumbs').outerHTML());
$parentStreamItemClone.find('.queet-thumbs, .expanded-content, .inline-reply-queetbox, .stream-item-footer').remove();
var footerHTML = $parentStreamItemClone.find('.queet').outerHTML();
// cleaned version of the stream item to show in the footer
cleanStreamItemsFromClassesAndConversationElements($parentStreamItemClone);
$parentStreamItemClone.find('.context,.stream-item-footer').remove();
var parentStreamItemHTMLWithoutFooter = $parentStreamItemClone.outerHTML();
$thumbToDisplay = $queetThumbsClone.find('img.attachment-thumb[src="' + thisAttachmentThumbSrc + '"]');
$thumbToDisplay.parent().addClass('display-this-thumb');
@ -2092,7 +2218,7 @@ $('body').on('click','.stream-item .queet img.attachment-thumb',function (event)
$thisImgInQueetThumbsClone.parent('.thumb-container').children('iframe').attr('height',calculatedDimensions.displayImgHeight);
// open popup
popUpAction('queet-thumb-popup', '', '' + $queetThumbsClone.outerHTML() + '', footerHTML, calculatedDimensions.popUpWidth);
popUpAction('queet-thumb-popup', '', '' + $queetThumbsClone.outerHTML() + '', parentStreamItemHTMLWithoutFooter, calculatedDimensions.popUpWidth);
disableOrEnableNavigationButtonsInImagePopup($('#queet-thumb-popup'));
}
}
@ -2501,12 +2627,13 @@ $('body').on('click','.action-reply-container',function(){
var this_stream_item_id = this_stream_item.attr('data-quitter-id');
this_stream_item.addClass('replying-to');
// grabbing the queet and view it in the popup, stripped of footer, reply box and other sruff
var $queetHtml = $(this_stream_item.outerHTML());
$queetHtml.children('.stream-item.conversation').remove();
$queetHtml.find('.context,.stream-item-footer,.inline-reply-queetbox,.expanded-content').remove();
var queetHtmlWithoutFooter = $queetHtml.outerHTML();
popUpAction('popup-reply-' + this_stream_item_id, window.sL.replyTo + ' ' + this_stream_item.children('.queet').find('.screen-name').html(),replyFormHtml(this_stream_item,this_stream_item_id),queetHtmlWithoutFooter);
// grabbing the stream-item and view it in the popup, stripped of conversation footer, reply box and other sruff
var streamItemHTML = $('<div/>').html(this_stream_item.outerHTML());
cleanStreamItemsFromClassesAndConversationElements(streamItemHTML);
streamItemHTML.find('.context,.stream-item-footer').remove();
var streamItemHTMLWithoutFooter = streamItemHTML.outerHTML();
popUpAction('popup-reply-' + this_stream_item_id, window.sL.replyTo + ' ' + this_stream_item.children('.queet').find('.screen-name').html(),replyFormHtml(this_stream_item,this_stream_item_id),streamItemHTMLWithoutFooter);
$('#popup-reply-' + this_stream_item_id).find('.modal-body').find('.queet-box').trigger('click'); // expand
@ -4044,17 +4171,62 @@ function uploadAttachment(e, thisUploadButton) {
/* ·
·
· Small edit profile button on mini-card. Go-to user stream and hit edit button
· Small edit profile button on hover cards goes to edit profile
·
· · · · · · · · · · · · · */
$('body').on('click','#mini-edit-profile-button, #edit-profile-header-link, .hover-card .edit-profile-button',function(){
$('body').on('click','.hover-card .edit-profile-button',function(){
goToEditProfile();
});
/* ·
·
· User menu when clicking the mini cog wheel in the logged in mini card
·
· · · · · · · · · · · · · */
$('body').on('click','#mini-logged-in-user-cog-wheel:not(.dropped)',function(){
var menu = $(getMenu(loggedInUsersMenuArray())).appendTo(this);
alignMenuToParent(menu,$(this));
$(this).addClass('dropped');
});
// hide when clicking it again
$('body').on('click','#mini-logged-in-user-cog-wheel.dropped',function(e){
if($(e.target).is('#mini-logged-in-user-cog-wheel')) {
$('#mini-logged-in-user-cog-wheel').children('.dropdown-menu').remove();
$('#mini-logged-in-user-cog-wheel').removeClass('dropped');
}
});
// hide the menu when clicking outside it
$('body').on('click',function(e){
if($('#mini-logged-in-user-cog-wheel').hasClass('dropped') && !$(e.target).closest('#mini-logged-in-user-cog-wheel').length>0) {
$('#mini-logged-in-user-cog-wheel').children('.dropdown-menu').remove();
$('#mini-logged-in-user-cog-wheel').removeClass('dropped');
}
});
/* ·
·
· Goes to edit profile
·
· · · · · · · · · · · · · */
function goToEditProfile(arg, callback) {
if(window.currentStreamObject.name == 'my profile') {
$('#page-container > .profile-card .edit-profile-button').trigger('click');
if(typeof callback == 'function') {
callback(true);
}
}
else {
setNewCurrentStream(pathToStreamRouter(window.loggedIn.screen_name), true, false, function(){
$('#page-container > .profile-card .edit-profile-button').trigger('click');
if(typeof callback == 'function') {
callback(true);
}
});
}
});
}

View File

@ -583,6 +583,13 @@ function pathToStreamRouter(path) {
label: window.sL.onlyShowNotificationsFromUsersIFollow,
callback: 'reloadCurrentStreamAndClearCache'
},
{
type: 'profile-prefs-toggle',
namespace: 'qvitter',
topic: 'hide_notifications_from_muted_users',
label: window.sL.hideNotificationsFromMutedUsers,
callback: 'showOrHideNoticesFromMutedUsersInNotifications'
},
{
type: 'divider'
},
@ -617,7 +624,8 @@ function pathToStreamRouter(path) {
];
streamObject.callbacks = [
'showOrHideEmbeddedContentInTimelineFromProfilePref',
'showOrHideQuotesInTimelineFromProfilePref'
'showOrHideQuotesInTimelineFromProfilePref',
'showOrHideNoticesFromMutedUsersInNotifications'
];
}
return streamObject;
@ -692,8 +700,7 @@ function pathToStreamRouter(path) {
if(pathSplit.length == 2 && /^[a-zA-Z0-9]+$/.test(pathSplit[0]) && pathSplit[1] == 'blocks') {
streamObject.name = 'user blocks';
streamObject.nickname = pathSplit[0];
streamObject.parentPath = streamObject.nickname;
streamObject.streamHeader = '@' + replaceHtmlSpecialChars(streamObject.nickname);
streamObject.streamHeader = window.sL.userBlocked;
streamObject.streamSubHeader = window.sL.userBlocks;
streamObject.stream = 'qvitter/blocks.json?count=20&id=' + streamObject.nickname + '&withuserarray=1';
streamObject.maxIdOrPage = 'page';
@ -701,6 +708,19 @@ function pathToStreamRouter(path) {
return streamObject;
}
// {screen_name}/mutes
if(pathSplit.length == 2 && /^[a-zA-Z0-9]+$/.test(pathSplit[0]) && pathSplit[1] == 'mutes') {
streamObject.name = 'user mutes';
streamObject.nickname = pathSplit[0];
streamObject.streamHeader = window.sL.userMuted;
streamObject.streamSubHeader = window.sL.userMutes;
streamObject.streamDescription = window.sL.mutedStreamDescription;
streamObject.stream = 'qvitter/mutes.json?count=20&withuserarray=1';
streamObject.maxIdOrPage = 'page';
streamObject.type = 'users';
return streamObject;
}
// {screen_name}/groups
if(pathSplit.length == 2 && /^[a-zA-Z0-9]+$/.test(pathSplit[0]) && pathSplit[1] == 'groups') {
streamObject.name = 'user group list';

View File

@ -118,7 +118,7 @@
"cropAndSave": "قُص و احفظ.",
"showTerms": "Read our Terms of Use",
"ellipsisMore": "More",
"blockUser": "Block {username}",
"blockUser": "Block",
"goToOriginalNotice": "Go to original notice",
"goToTheUsersRemoteProfile": "Go to the user's remote profile",
"clickToDrag":"Click to drag",
@ -169,7 +169,7 @@
"buttonUnblock":"Unblock",
"failedBlockingUser":"Failed to block the user.",
"failedUnblockingUser":"Failed to unblock the user.",
"unblockUser": "Unblock {username}",
"unblockUser": "Unblock",
"tooltipBlocksYou":"You are blocked from following {username}.",
"silenced":"Silenced",
"silencedPlural":"Silenced profiles",
@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -118,7 +118,7 @@
"cropAndSave": "Crop and save",
"showTerms": "Read our Terms of Use",
"ellipsisMore": "More",
"blockUser": "Block {username}",
"blockUser": "Block",
"goToOriginalNotice": "Go to the original quip",
"goToTheUsersRemoteProfile": "Go to the user's remote profile",
"clickToDrag":"Click to drag",
@ -169,7 +169,7 @@
"buttonUnblock":"Unblock",
"failedBlockingUser":"Failed to block the user.",
"failedUnblockingUser":"Failed to unblock the user.",
"unblockUser": "Unblock {username}",
"unblockUser": "Unblock",
"tooltipBlocksYou":"You are blocked from following {username}.",
"silenced":"Silenced",
"silencedPlural":"Silenced profiles",
@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -78,7 +78,7 @@
"cancelVerb": "Nuligi",
"deleteConfirmation": "Ĉu vi certas, ke vi volas forigi tiun ĉi pepon?",
"userExternalFollow": "Sekvi",
"userExternalFollowHelp": "Identigilo de via konto(Ekz. uzanto@rainbowdash.net)",
"userExternalFollowHelp": "Identigilo de via konto (Ekz. uzanto@rainbowdash.net)",
"userFollow": "Sekvi",
"userFollowing": "Sekvato",
"userUnfollow": "Malsekvi",
@ -164,20 +164,37 @@
"continueRant":"Daŭrigi la plendon",
"hideEmbeddedInTimeline":"Kaŝi enkorpigitajn enhavojn en ĉi tiu tempolinio",
"hideQuotesInTimeline":"Kaŝi citaĵojn en ĉi tiu tempolinio",
"userBlocks":"Accounts you're blocking",
"buttonBlocked":"Blocked",
"buttonUnblock":"Unblock",
"failedBlockingUser":"Failed to block the user.",
"failedUnblockingUser":"Failed to unblock the user.",
"unblockUser": "Unblock {username}",
"tooltipBlocksYou":"You are blocked from following {username}.",
"silenced":"Silenced",
"silencedPlural":"Silenced profiles",
"silencedUsersOnThisInstance":"Silenced profiles on {site-title}",
"sandboxed":"Sandboxed",
"sandboxedPlural":"Sandboxed profiles",
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"userBlocks":"Blokaj kontoj",
"buttonBlocked":"Blokita",
"buttonUnblock":"Malbloki",
"failedBlockingUser":"Malsukcesis bloki la uzanto.",
"failedUnblockingUser":"Malsukcesis malbloki la uzanto.",
"unblockUser": "Malbloki {username}",
"tooltipBlocksYou":"Vi blokitas de sekvato al {username}.",
"silenced":"Silentiĝa",
"silencedPlural":"Silentiĝaj profiloj",
"silencedUsersOnThisInstance":"Silenctiĝaj profiloj sur {site-title}",
"sandboxed":"Sablokesta",
"sandboxedPlural":"Sablokestaj profiloj",
"sandboxedUsersOnThisInstance":"Sablokestaj profiloj sur {site-title}",
"silencedStreamDescription":"Silencaj uzantoj ne povas ensaluti aŭ sendadi pepoj, kaj la pepoj ili jam sendadis kasxan. Por loka uzantoj, ĝi estas simila al forigo, kiu povas inversi, sed por fora uzantoj estas simila al loko-larĝa bloko.",
"sandboxedStreamDescription":"Pepoj de sablokesta uzantoj ekskludas de la publika tempolinio kaj la tuta konata reto. Pepoj sendadis dum sablokesta ne enhavos en la publikaj tempolinioj se la uzantoj malsablokesti.",
"onlyShowNotificationsFromUsersIFollow":"Nur montri sciigoj de uzantoj mi sekvas",
"userOptions":"Pli ukazo agoj",
"silenceThisUser":"Silentiĝi {nickname}",
"sandboxThisUser":"Sablokesti {nickname}",
"unSilenceThisUser":"Malsilentiĝi {nickname}",
"unSandboxThisUser":"Malsablokesti {nickname}",
"ERRORfailedSandboxingUser":"Malsukcesis sablokesti/malsablokesti la uzanto",
"ERRORfailedSilencingUser":"Malsukcesis silentiĝi/malsilentiĝi la uzanto",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -180,5 +180,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Profils dans le bac à sable sur {site-title}",
"silencedStreamDescription":"Le profils réduits au silence ne peuvent pas se connecter, commencer des diatribes et celles déjà postées sont cachées. Pour les comptes locaux, le résultat est similaire à une suppression de compte qui peut être annulée. Pour les comptes distants, cest un blocage sur lentièreté du site.",
"sandboxedStreamDescription":"Les mises à jour des profils du bac à sable sont exclues de lAccueil et de lEnsemble de la Fédération. Les messages postés tout en étant dans le bac à sable ne seront pas inclus dans les flux publics si le profil est remis en dehors du bac à sable.",
"onlyShowNotificationsFromUsersIFollow":"Afficher uniquement les notifications des utilisateurs que je suis"
"onlyShowNotificationsFromUsersIFollow":"Afficher uniquement les notifications des utilisateurs que je suis",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -6,13 +6,13 @@
"loginSignIn": "サインイン",
"loginRememberMe": "記憶する",
"loginForgotPassword": "パスワードを忘れましたか?",
"notices": "クイート",
"notices": "クイップ",
"followers": "フォロワー",
"following": "フォロー",
"groups": "グループ",
"compose": "クイートする",
"compose": "クイップする",
"queetVerb": "送る",
"queetsNounPlural": "クイート",
"queetsNounPlural": "クイップ",
"logout": "サインアウト",
"languageSelected": "言語:",
"viewMyProfilePage": "自分のプロフィールページを見る",
@ -21,18 +21,18 @@
"details": "詳細",
"expandFullConversation": "会話を全て表示する",
"replyVerb": "返信する",
"requeetVerb": "リクイートする",
"requeetVerb": "リクイップする",
"favoriteVerb": "お気に入りに追加する",
"requeetedVerb": "リクイートされました",
"requeetedVerb": "リクイップされました",
"favoritedVerb": "お気に入りに追加されました",
"replyTo": "返信先は",
"requeetedBy": "リクイートした人は {requeeted-by}",
"requeetedBy": "リクイップした人は {requeeted-by}",
"favoriteNoun": "お気に入り",
"favoritesNoun": "お気に入り",
"requeetNoun": "リクイート",
"requeetsNoun": "リクイート",
"newQueet": "{new-notice-count} 件の新着クイートを表示",
"newQueets": "{new-notice-count} 件の新着クイートを表示",
"requeetNoun": "リクイップ",
"requeetsNoun": "リクイップ",
"newQueet": "{new-notice-count} 件の新着クイップを表示",
"newQueets": "{new-notice-count} 件の新着クイップを表示",
"longmonthsJanuary": "1月",
"longmonthsFebruary": "2月",
"longmonthsMars": "3月",
@ -69,14 +69,14 @@
"posting": "投稿中",
"viewMoreInConvBefore": "← 会話を詳しく見る",
"viewMoreInConvAfter": "会話を詳しく見る →",
"mentions": "@クイート",
"mentions": "@クイップ",
"timeline": "タイムライン",
"publicTimeline": "パブリックタイムライン",
"publicAndExtTimeline": "関連ネットワーク全体",
"searchVerb": "検索する",
"deleteVerb": "削除する",
"cancelVerb": "キャンセル",
"deleteConfirmation": "このクイートを本当に削除しますか?",
"deleteConfirmation": "このクイップを本当に削除しますか?",
"userExternalFollow": "リモートフォロー",
"userExternalFollowHelp": "あなたのアカウントID (例: user@rainbowdash.net).",
"userFollow": "フォロー",
@ -108,8 +108,8 @@
"otherServers": "もしくはGNU socialネットワークの別のサーバーでアカウントを作ることができます。<a href=\"http://federation.skilledtests.com/select_your_server.html\">サーバーの比較</a>",
"editMyProfile": "プロフィールを編集する",
"notifications": "お知らせ",
"xFavedYourQueet": "があなたのクイートをお気に入りに追加しました",
"xRepeatedYourQueet": "があなたをリクイートしました",
"xFavedYourQueet": "があなたのクイップをお気に入りに追加しました",
"xRepeatedYourQueet": "があなたをリクイップしました",
"xStartedFollowingYou": "があなたをフォローしました",
"followsYou": "フォローされています",
"FAQ": "よくある質問",
@ -119,7 +119,7 @@
"showTerms": "利用条件を読む",
"ellipsisMore": "もっと",
"blockUser": "{username}をブロックする",
"goToOriginalNotice": "元のクイートを見る",
"goToOriginalNotice": "元のクイップを見る",
"goToTheUsersRemoteProfile": "このユーザーのリモートにあるプロフィールを見る",
"clickToDrag":"クリックしてドラッグ",
"keyboardShortcuts":"キーボードショートカット",
@ -128,7 +128,7 @@
"tooltipBookmarkStream":"このストリームをブックマークに保存する",
"tooltipTopMenu":"メニューと設定",
"tooltipAttachImage":"画像を添付",
"tooltipShortenUrls":"クイート中の全てのURLを短縮する",
"tooltipShortenUrls":"クイップ中の全てのURLを短縮する",
"tooltipReloadStream":"このストリームを再読み込みする",
"tooltipRemoveBookmark":"このブックマークを削除する",
"clearHistory":"閲覧履歴を消去する",
@ -137,21 +137,21 @@
"ERRORcouldNotFindUserWithNickname":"\"{nickname}\"というニックネームのユーザーはこのサーバーでは見付かりませんでした。",
"ERRORcouldNotFindGroupWithNickname":"\"{nickname}\"というニックネームのグループはこのサーバーでは見付かりませんでした。",
"ERRORcouldNotFindPage":"そのようなページは見付かりませんでした。",
"ERRORnoticeRemoved": "このクイートは削除されています。",
"ERRORnoticeRemoved": "このクイップは削除されています。",
"ERRORnoContactWithServer": "サーバーへの接続を確立できませんでした。サーバーが混雑しているもしくはインターネットの接続に問題がある可能性があります。後でまたお試しください。",
"ERRORattachmentUploadFailed": "アップロードに失敗しました。ファイル形式がサポートされていないか、ファイルサイズが大きすぎます。",
"hideRepliesToPeopleIDoNotFollow":"フォローしていない人からの返信を隠す",
"markAllNotificationsAsSeen":"全てのお知らせを既読にする",
"notifyRepliesAndMentions":"@クイートと返信",
"notifyRepliesAndMentions":"@クイップと返信",
"notifyFavs":"お気に入り",
"notifyRepeats":"リクイート",
"notifyRepeats":"リクイップ",
"notifyFollows":"新しいフォロワー",
"timelineOptions":"タイムラインの設定",
"ERRORfailedSavingYourSetting":"設定の保存に失敗しました。",
"ERRORfailedMarkingAllNotificationsAsRead":"全てのお知らせを既読にすることに失敗しました。",
"newNotification": "{new-notice-count}件の新しいお知らせ",
"newNotifications": "{new-notice-count}件の新しいお知らせ",
"thisIsANoticeFromABlockedUser":"警告: これはあなたがブロックしているユーザーからのクイートです。表示するにはクリックしてください。",
"thisIsANoticeFromABlockedUser":"警告: これはあなたがブロックしているユーザーからのクイップです。表示するにはクリックしてください。",
"nicknamesListWithListName":"{nickname}のリスト: {list-name}",
"myListWithListName":"マイリスト: {list-name}",
"listMembers":"メンバー",
@ -164,20 +164,37 @@
"continueRant":"連投を続ける",
"hideEmbeddedInTimeline":"タイムライン上の埋め込まれたコンテンツを隠す",
"hideQuotesInTimeline":"タイムライン上の引用を隠す",
"userBlocks":"Accounts you're blocking",
"buttonBlocked":"Blocked",
"buttonUnblock":"Unblock",
"failedBlockingUser":"Failed to block the user.",
"failedUnblockingUser":"Failed to unblock the user.",
"unblockUser": "Unblock {username}",
"tooltipBlocksYou":"You are blocked from following {username}.",
"silenced":"Silenced",
"silencedPlural":"Silenced profiles",
"silencedUsersOnThisInstance":"Silenced profiles on {site-title}",
"sandboxed":"Sandboxed",
"sandboxedPlural":"Sandboxed profiles",
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"userBlocks":"あなたがブロックしているユーザー",
"buttonBlocked":"ブロック中",
"buttonUnblock":"アンブロック",
"failedBlockingUser":"このユーザーをブロックするのに失敗しました。",
"failedUnblockingUser":"このユーザーをブロックするのに失敗しました。",
"unblockUser": "{username} をアンブロックする",
"tooltipBlocksYou":"ブロックされているため、 {username} をフォローできません。",
"silenced":"サイレンス中",
"silencedPlural":"サイレンスされているユーザー",
"silencedUsersOnThisInstance":"{site-title} でサイレンスされているユーザー",
"sandboxed":"サンドボックス中",
"sandboxedPlural":"サンドボックスされているユーザー",
"sandboxedUsersOnThisInstance":"{site-title} でサンドボックスされているユーザー",
"silencedStreamDescription":"サイレンスされたユーザーはログインおよびクイップの投稿ができなくなり、そのユーザーの既に投稿されたクイップは非表示になります。ローカルユーザーにとっては復旧可能な削除のような状態で、リモートユーザーにとっては全サイトでブロックされているような状態になります。",
"sandboxedStreamDescription":"サンドボックスされたユーザーからのクイップは「パブリックタイムライン」および「関連ネットワーク全体」から除外されます。アンサンドボックスされたユーザーのサンドボックス期間中に投稿されたクイップはパブリックタイムラインに含まれません",
"onlyShowNotificationsFromUsersIFollow":"フォローしているユーザーのお知らせのみ表示する",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Profiler satt i lekekasse på {site-title}",
"silencedStreamDescription":"Forstummede brukere can ikke logge på tjenesten, sende status meldinger, samt allerede status meldinger er skjult. For lokale brukere vil dette oppleves som å bli slettet, men beslutnignen kan reverseres. For brukere på andre instanser vil det oppleves som en utvidet blokkering.",
"sandboxedStreamDescription":"Statusmeldinger fra brukere satt i lekekassen, så vil meldingene bli ekskludert fra den offentlige tidslinjen og hele nettverks tidslinjen. Statusmeldinger send når man er i lekekasse vil ikke bli inkludert i den offentlige tidslinjen hvis brukeren blir tatt ut av lekekassen.",
"onlyShowNotificationsFromUsersIFollow":"Vis kun notifikasjoner fra brukere jeg følger"
"onlyShowNotificationsFromUsersIFollow":"Vis kun notifikasjoner fra brukere jeg følger",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -163,7 +163,7 @@
"startRant":"Start een tirade",
"continueRant":"Verolg de tirade",
"hideEmbeddedInTimeline":"Verberg ingebedde inhoud in deze tijdlijn",
"hideQuotesInTimeline":"Verberg quotes in deze tijdlijn",
"hideQuotesInTimeline":"Verberg citaten in deze tijdlijn",
"userBlocks":"Accounts die je blokkeert",
"buttonBlocked":"Geblokkeerd",
"buttonUnblock":"Deblokkeer",
@ -171,13 +171,30 @@
"failedUnblockingUser":"Gefaald om de gebruiker te deblokkeren.",
"unblockUser": "Deblokkeer {username}",
"tooltipBlocksYou":"Je wordt geblokkeerd van het volgen van {username}.",
"silenced":"Silenced",
"silencedPlural":"Silenced profiles",
"silencedUsersOnThisInstance":"Silenced profiles on {site-title}",
"sandboxed":"Sandboxed",
"sandboxedPlural":"Sandboxed profiles",
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"silenced":"Gedempt",
"silencedPlural":"Gedempte profielen",
"silencedUsersOnThisInstance":"Gedempte profielen op {site-title}",
"sandboxed":"Beperkt",
"sandboxedPlural":"Beperkte profielen",
"sandboxedUsersOnThisInstance":"Beperkte profielen op {site-title}",
"silencedStreamDescription":"Gedempte gebruikers kunnen niet inloggen of queets posten en de queets die ze al gepost hebben zijn verborgen. voor lokale gebruikers is het als een verwijdering die kan worden teruggedraaid, voor externe gebruikers is het als een blok voor de hele site.",
"sandboxedStreamDescription":"Queets van gebruikers met beperking worden niet getoond in de publieke tijdlijn en het volledige netwerk. Queets gepost tijdens de beperking komen niet in de publieke tijdlijnen als de beperking ongedaan wordt gemaakt.",
"onlyShowNotificationsFromUsersIFollow":"Alleen meldingen tonen van gebruikers die ik volg",
"userOptions":"Meer gebruiker akties",
"silenceThisUser":"Demp {nickname}",
"sandboxThisUser":"Beperk {nickname}",
"unSilenceThisUser":"Ontdemp {nickname}",
"unSandboxThisUser":"Beperking opheffen {nickname}",
"ERRORfailedSandboxingUser":"Beperking/beperking opheffen voor gebruiker gefaald.",
"ERRORfailedSilencingUser":"Dempen/ontdempen gebruiker gefaald.",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -6,13 +6,13 @@
"loginSignIn": "Entrar",
"loginRememberMe": "Lembrar-me",
"loginForgotPassword": "Esqueceu sua senha?",
"notices": "Mensagens",
"notices": "Quips",
"followers": "Seguidores",
"following": "Seguindo",
"groups": "Grupos",
"compose": "Escrever um novo Queet...",
"queetVerb": "Queetar",
"queetsNounPlural": "Queets",
"compose": "Escrever um novo quip...",
"queetVerb": "Enviar",
"queetsNounPlural": "Quips",
"logout": "Sair",
"languageSelected": "Idioma:",
"viewMyProfilePage": "Ver minha página de perfil",
@ -22,17 +22,17 @@
"expandFullConversation": "Expandir toda a conversa",
"replyVerb": "Responder",
"requeetVerb": "Requeetar",
"favoriteVerb": "Favorito",
"requeetedVerb": "Requeetado",
"favoritedVerb": "Marcado como favorito",
"favoriteVerb": "Curtir",
"requeetedVerb": "Requipado",
"favoritedVerb": "Curtida",
"replyTo": "Responder para",
"requeetedBy": "Requeetado por {requeeted-by}",
"favoriteNoun": "Favorito",
"favoritesNoun": "Favoritos",
"requeetNoun": "Requeet",
"requeetsNoun": "Requeets",
"newQueet": "{new-notice-count} novo Queet",
"newQueets": "{new-notice-count} novos Queets",
"requeetedBy": "Requipado por {requeeted-by}",
"favoriteNoun": "Curtida",
"favoritesNoun": "Curtidas",
"requeetNoun": "Requipar",
"requeetsNoun": "Requips",
"newQueet": "{new-notice-count} novo quip",
"newQueets": "{new-notice-count} novos quips",
"longmonthsJanuary": "janeiro",
"longmonthsFebruary": "fevereiro",
"longmonthsMars": "março",
@ -60,13 +60,13 @@
"time12am": "{time} AM",
"time12pm": "{time} PM",
"longDateFormat": "{time24} - {day} de {month} de {year}",
"shortDateFormatSeconds": "{seconds} s",
"shortDateFormatMinutes": "{minutes} min",
"shortDateFormatHours": "{hours} h",
"shortDateFormatSeconds": "{seconds}s",
"shortDateFormatMinutes": "{minutes}min",
"shortDateFormatHours": "{hours}h",
"shortDateFormatDate": "{day} de {month}",
"shortDateFormatDateAndY": "{day} de {month} de {year}",
"now": "agora",
"posting": "publicando",
"posting": "postando",
"viewMoreInConvBefore": "← Ver mais na conversa",
"viewMoreInConvAfter": "Ver mais na conversa →",
"mentions": "Menções",
@ -76,9 +76,9 @@
"searchVerb": "Buscar",
"deleteVerb": "Apagar",
"cancelVerb": "Cancelar",
"deleteConfirmation": "Tem certeza de que deseja apagar este queet?",
"deleteConfirmation": "Tem certeza de que deseja apagar este quip?",
"userExternalFollow": "Seguir remotamente",
"userExternalFollowHelp": "Identificador da sua conta (ex.: usuario@rainbowdash.net)",
"userExternalFollowHelp": "ID de sua conta (ex.: usuario@rainbowdash.net)",
"userFollow": "Seguir",
"userFollowing": "Seguindo",
"userUnfollow": "Deixar de seguir",
@ -108,8 +108,8 @@
"otherServers": "Alternativamente, você pode criar uma conta em outro servidor da rede GNU social. <a href=\"http://federation.skilledtests.com/select_your_server.html\">Comparativo</a>",
"editMyProfile": "Editar perfil",
"notifications": "Notificações",
"xFavedYourQueet": "curtiu seu Queet",
"xRepeatedYourQueet": "requeetou você",
"xFavedYourQueet": "curtiu seu quip",
"xRepeatedYourQueet": "requipou você",
"xStartedFollowingYou": "seguiu você",
"followsYou": "segue você",
"FAQ": "FAQ",
@ -119,7 +119,7 @@
"showTerms": "Leia nossos Termos de Uso",
"ellipsisMore": "Mais",
"blockUser": "Bloquear {username}",
"goToOriginalNotice": "Ir para mensagem original",
"goToOriginalNotice": "Ir para quip original",
"goToTheUsersRemoteProfile": "Ir para o perfil do usuário",
"clickToDrag":"Clique para arrastar",
"keyboardShortcuts":"Atalhos do teclado",
@ -128,7 +128,7 @@
"tooltipBookmarkStream":"Adicione este fluxo aos favoritos",
"tooltipTopMenu":"Menu e configurações",
"tooltipAttachImage":"Anexar uma imagem",
"tooltipShortenUrls":"Encurtar todas as URLs no Queet",
"tooltipShortenUrls":"Encurtar todas as URLs no quip",
"tooltipReloadStream":"Atualizar este fluxo",
"tooltipRemoveBookmark":"Remover este favorito",
"clearHistory":"Limpar histórico de navegação",
@ -137,14 +137,14 @@
"ERRORcouldNotFindUserWithNickname":"Não foi possível encontrar um usuário com o apelido \"{nickname}\" neste servidor",
"ERRORcouldNotFindGroupWithNickname":"Não foi possível encontrar um grupo com o nome \"{nickname}\" neste servidor",
"ERRORcouldNotFindPage":"Não foi possível encontrar aquela página.",
"ERRORnoticeRemoved": "Esta mensagem foi removida.",
"ERRORnoticeRemoved": "Este quip foi removido.",
"ERRORnoContactWithServer": "Não foi possível estabelecer uma conexão com o servidor. O servidor pode estar sobrecarregado, ou pode haver um problema com sua conexão de internet. Por favor tente novamente mais tarde!",
"ERRORattachmentUploadFailed": "O envio falhou. O formato pode não ser suportado ou o tamanho é muito grande.",
"hideRepliesToPeopleIDoNotFollow":"Ocultar respostas para pessoas que eu não sigo",
"markAllNotificationsAsSeen":"Marcar todas notificações como vistas",
"notifyRepliesAndMentions":"Menções e respostas",
"notifyFavs":"Favoritos",
"notifyRepeats":"Requeets",
"notifyFavs":"Curtidas",
"notifyRepeats":"Requips",
"notifyFollows":"Novos seguidores",
"timelineOptions":"Opções da linha do tempo",
"ERRORfailedSavingYourSetting":"Falha ao salvar suas configurações",
@ -171,13 +171,30 @@
"failedUnblockingUser":"Falha ao desbloquear usuário.",
"unblockUser": "Desbloquear {username}",
"tooltipBlocksYou":"Você está impedido de seguir {username}.",
"silenced":"Silenced",
"silencedPlural":"Silenced profiles",
"silencedUsersOnThisInstance":"Silenced profiles on {site-title}",
"sandboxed":"Sandboxed",
"sandboxedPlural":"Sandboxed profiles",
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"silenced":"Silenciado",
"silencedPlural":"Perfis silenciados",
"silencedUsersOnThisInstance":"Perfis silenciados em {site-title}",
"sandboxed":"Restringido",
"sandboxedPlural":"Perfis restringidos",
"sandboxedUsersOnThisInstance":"Perfis restringidos em {site-title}",
"silencedStreamDescription":"Usuários silenciados não podem logar ou postar quips e os quips postados por eles estão ocultos. Para usuários locais é como uma remoção que pode ser anulada, para usuários remotos é como se fosse um bloqueio do site inteiro.",
"sandboxedStreamDescription":"Quips de usuários restringidos são excluídos da Linha do Tempo Pública e de Toda a Rede Conhecida. Quips postados enquanto um perfil estiver restringido não serão incluídos nas linhas do tempo públicas.",
"onlyShowNotificationsFromUsersIFollow":"Mostrar notificações somente de usuários que eu sigo",
"userOptions":"Mais ações do usuário",
"silenceThisUser":"Silenciar {nickname}",
"sandboxThisUser":"Restringir {nickname}",
"unSilenceThisUser":"Permitir {nickname}",
"unSandboxThisUser":"Liberar {nickname}",
"ERRORfailedSandboxingUser":"Falha ao restringir/liberar o usuário",
"ERRORfailedSilencingUser":"Falha ao silenciar/permitir o usuário",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -177,5 +177,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -164,7 +164,7 @@
"continueRant":"Fortsätt harangen",
"hideEmbeddedInTimeline":"Dölj inbäddat innehåll i detta flöde",
"hideQuotesInTimeline":"Dölj citat i detta flöde",
"userBlocks":"Konton du blockerar",
"userBlocks":"Konton som du blockerar",
"buttonBlocked":"Blockerad",
"buttonUnblock":"Avblockera",
"failedBlockingUser":"Misslyckades med att blockera användaren.",
@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Användare i sandlådan på {site-title}",
"silencedStreamDescription":"Nedtystade användare kan inte logga in eller skriva qvittringar. Qvittringar som de redan skrivit är dolda. För lokala användare är det som en borttagning som kan ångras, och för externa användare är det som att blockera användaren från instansen.",
"sandboxedStreamDescription":"Qvittringar från användare som är i sandlådan visas inte i &quot;Hela sajtens flöde&quot; eller &quot;Hela det kända nätverket&quot;. Qvittringar som användaren skriver under tiden den är i sandlådan kommer inte visas i de offentliga flödena om hen tas ur sandlådan senare.",
"onlyShowNotificationsFromUsersIFollow":"Visa bara notiser från användare som jag följer"
"onlyShowNotificationsFromUsersIFollow":"Visa bara notiser från användare som jag följer",
"userOptions":"Fler användaråtgärder",
"silenceThisUser":"Tysta ner {nickname}",
"sandboxThisUser":"Sätt {nickname} i sandlådan",
"unSilenceThisUser":"Ta bort nedtystning av {nickname}",
"unSandboxThisUser":"Ta {nickname} ur sandlådan",
"ERRORfailedSandboxingUser":"Misslyckades med att sätta/ta ur användaren i sandlådan",
"ERRORfailedSilencingUser":"Misslyckades med att tysta ner eller ta bort nedtystning",
"muteUser":"Ignorera",
"unmuteUser":"Sluta ignorera",
"hideNotificationsFromMutedUsers":"Dölj notiser från användare som du ignorerar",
"thisIsANoticeFromAMutedUser":"Det här är en qvittring från en användare som du ignorerar. Klicka här för att visa kvittringen.",
"userMutes":"Konton som du ignorerar",
"userBlocked":"Blockerade konton",
"userMuted":"Ignorerade konton",
"mutedStreamDescription":"Du har dolt dessa användare från dina flöden. Du kommer fortfarande få notiser från dem, om du inte väljer &quot;Dölj notiser från användare som du ignorerar&quot; från kugghjulsmenyn på notissidan.",
"profileAndSettings":"Profil och inställningar",
"profileSettings":"Profilinställningar"
}

View File

@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -178,5 +178,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -178,5 +178,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Quips posted while being in the sandbox will not be included in the public timelines if the user is unsandboxed.",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow"
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
"userOptions":"More user actions",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Sandbox {nickname}",
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}