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 // route/reroute urls
public function onRouterInitialized($m) 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', $m->connect('api/qvitter/sandboxed.:format',
array('action' => 'ApiQvitterSandboxed', array('action' => 'ApiQvitterSandboxed',
'format' => '(xml|json)')); 'format' => '(xml|json)'));
$m->connect('api/qvitter/silenced.:format', $m->connect('api/qvitter/silenced.:format',
array('action' => 'ApiQvitterSilenced', array('action' => 'ApiQvitterSilenced',
'format' => '(xml|json)')); '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', $m->connect('api/qvitter/silence/create.json',
array('action' => 'ApiQvitterSilenceCreate')); array('action' => 'ApiQvitterSilenceCreate'));
$m->connect('api/qvitter/silence/destroy.json',
array('action' => 'ApiQvitterSilenceDestroy'));
$m->connect('services/oembed.:format', $m->connect('services/oembed.:format',
array('action' => 'apiqvitteroembednotice', array('action' => 'apiqvitteroembednotice',
'format' => '(xml|json)')); '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)); $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 // the user might have opted out from certain notification types
$current_profile = $user->getProfile(); $current_profile = $user->getProfile();
$disable_notify_replies_and_mentions = Profile_prefs::getConfigData($current_profile, 'qvitter', 'disable_notify_replies_and_mentions'); $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 * @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( $profile = $this->getSandboxed(
($this->page - 1) * $this->count, ($this->page - 1) * $this->count,
$this->count, $this->count);
$this->since_id,
$this->max_id
);
while ($profile->fetch()) { while ($profile->fetch()) {
$profiles[] = clone($profile); $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 function getSandboxed($offset=null, $limit=null) // offset is null because DataObject wants it, 0 would mean no results
{ {
$profiles = new Profile(); $profiles = new Profile();
$profiles->joinAdd(array('id', 'profile_role:profile_id')); $profiles->joinAdd(array('id', 'profile_role:profile_id'));
$profiles->whereAdd(sprintf('profile_role.role = \'%s\'', Profile_role::SANDBOXED)); $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 class ApiQvitterSilenceCreateAction extends ApiAuthAction
{ {
protected $needPost = true;
/** /**
* Take arguments for running * Take arguments for running
@ -56,6 +57,8 @@ class ApiQvitterSilenceCreateAction extends ApiAuthAction
{ {
parent::prepare($args); parent::prepare($args);
$this->format = 'json';
$this->other = $this->getTargetProfile($this->arg('id')); $this->other = $this->getTargetProfile($this->arg('id'));
return true; return true;
@ -82,6 +85,10 @@ class ApiQvitterSilenceCreateAction extends ApiAuthAction
try { try {
$this->other->silenceAs($this->scoped); $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) { } catch (Exception $e) {
$this->clientError($e->getMessage(), $e->getCode()); $this->clientError($e->getMessage(), $e->getCode());
} }

View File

@ -110,10 +110,7 @@ class ApiQvitterSilencedAction extends ApiPrivateAuthAction
$profile = $this->getSilenced( $profile = $this->getSilenced(
($this->page - 1) * $this->count, ($this->page - 1) * $this->count,
$this->count, $this->count);
$this->since_id,
$this->max_id
);
while ($profile->fetch()) { while ($profile->fetch()) {
$profiles[] = clone($profile); $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> </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 <?php
// add an accessibility toggle link to switch to standard UI, if we're logged in // 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-outer"></span>
<span class="caret-inner"></span> <span class="caret-inner"></span>
</li> </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 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="faq-link"></a></li>
<li class="fullwidth"><a id="tou-link"></a></li> <li class="fullwidth"><a id="tou-link"></a></li>
<li class="fullwidth"><a id="shortcuts-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> <li class="fullwidth"><a id="invite-link" href="<?php print $instanceurl; ?>main/invite"></a></li>
<?php } ?> <?php } ?>
<li class="fullwidth"><a id="classic-link"></a></li> <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> <li class="fullwidth language dropdown-divider"></li>
<?php <?php
@ -589,7 +600,7 @@ class QvitterAction extends ApiAction
if($logged_in_user) { ?> if($logged_in_user) { ?>
<div id="user-container" style="display:none;"> <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="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 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-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> <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)); $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 // 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_replies_and_mentions = Profile_prefs::getConfigData($current_profile, 'qvitter', 'disable_notify_replies_and_mentions');
$disable_notify_favs = Profile_prefs::getConfigData($current_profile, 'qvitter', 'disable_notify_favs'); $disable_notify_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%; top: 100%;
z-index: 900; z-index: 900;
} }
.user-menu-cog .dropdown-menu {
width:180px;
}
.quitter-settings.dropdown-menu { .quitter-settings.dropdown-menu {
margin-right: -400px; margin-right: -400px;
right: 50%; right: 50%;
@ -488,6 +491,7 @@ button.icon.nav-search span {
.dropdown-menu li.fullwidth:not(.dropdown-caret) { .dropdown-menu li.fullwidth:not(.dropdown-caret) {
width:100%; width:100%;
text-align:left; text-align:left;
margin-left: 0;
} }
body.rtl .dropdown-menu li:not(.dropdown-caret) { body.rtl .dropdown-menu li:not(.dropdown-caret) {
text-align:right; text-align:right;
@ -514,11 +518,32 @@ body.rtl .dropdown-menu li:not(.dropdown-caret) {
width: 100%; width: 100%;
box-sizing:border-box; box-sizing:border-box;
} }
.dropdown-menu li:not(.dropdown-caret) a:hover { .dropdown-menu li:not(.dropdown-caret) a:hover {
color: #FFFFFF; color: #FFFFFF;
text-decoration: none; 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 */ /* dropdown menu from ellipsis button */
.action-ellipsis-container { .action-ellipsis-container {
position:relative; position:relative;
@ -546,6 +571,10 @@ body.rtl .dropdown-menu li:not(.dropdown-caret) {
content:' '; 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, /* these toggles are inverted, they appear the the user as disabled when enabled,
since they are enabled by default....*/ since they are enabled by default....*/
.dropdown-menu a#disable_notify_replies_and_mentions.disabled::before, .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; display:none;
} }
#stream-menu-cog { #stream-menu-cog,
.user-menu-cog {
display: inline-block; display: inline-block;
font-size: 20px; font-size: 20px;
line-height: 20px; line-height: 20px;
@ -1664,18 +1694,69 @@ body.rtl #history-container.menu-container a .chev-right {
position: relative; position: relative;
cursor:pointer; 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'; content:'\f013';
font-family: fontAwesome; font-family: fontAwesome;
} }
#stream-menu-cog.dropped { #stream-menu-cog.dropped,
.user-menu-cog.dropped {
opacity:1; opacity:1;
} }
#stream-menu-cog .dropdown-menu { #stream-menu-cog .dropdown-menu,
.user-menu-cog .dropdown-menu {
z-index:1000; z-index:1000;
display:block; 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 { .queet-streams {
bottom: 0; bottom: 0;
color: #999999; color: #999999;
@ -1897,8 +1978,8 @@ background-repeat: no-repeat;
.stream-item .account-group span.sandboxed-flag { .stream-item .account-group span.sandboxed-flag {
background-color: #00ccff; background-color: #00ccff;
} }
.stream-item.silenced .account-group span.silenced-flag, body.has-right-to-silence .stream-item.silenced .account-group span.silenced-flag,
.stream-item.sandboxed .account-group span.sandboxed-flag { body.has-right-to-sandbox .stream-item.sandboxed .account-group span.sandboxed-flag {
display:inline-block;; display:inline-block;;
} }
.profile-card .profile-header-inner span.silenced-flag, .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 { .hover-card .profile-card .profile-header-inner span.sandboxed-flag {
line-height: 15px; line-height: 15px;
} }
.profile-card .profile-header-inner.silenced span.silenced-flag, body.has-right-to-silence .profile-card .profile-header-inner.silenced span.silenced-flag,
.profile-card .profile-header-inner.sandboxed span.sandboxed-flag { body.has-right-to-sandbox .profile-card .profile-header-inner.sandboxed span.sandboxed-flag {
display: inline-block; display: inline-block;
} }
@ -2015,8 +2096,8 @@ background-repeat: no-repeat;
body.rtl .queet.rtl .expanded-content { body.rtl .queet.rtl .expanded-content {
direction:rtl; direction:rtl;
} }
.stream-item.expanded > div:first-child, .stream-item.expanded > div.first-visible,
.stream-item.expanded > div:first-child > .queet { .stream-item.expanded > div.first-visible > .queet {
border-top-left-radius:6px; border-top-left-radius:6px;
border-top-right-radius:6px; border-top-right-radius:6px;
} }
@ -2048,11 +2129,15 @@ body.rtl .queet.rtl .expanded-content {
color:#999999; 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; height:15px;
overflow:hidden; 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; display: block;
position: absolute; position: absolute;
left:0; left:0;
@ -2066,12 +2151,16 @@ body.rtl .queet.rtl .expanded-content {
box-sizing: border-box; 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; width:20px;
position:absolute; position:absolute;
right:0; 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; display: block;
position: absolute; position: absolute;
left:0; left:0;
@ -2090,17 +2179,14 @@ body.rtl .queet.rtl .expanded-content {
border-bottom:1px solid #ddd; border-bottom:1px solid #ddd;
box-sizing: border-box; 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 { #feed-body > .stream-item.activity {
display:none; display:none;
} }
.stream-item > .stream-item.activity:first-child {
display:block;
}
.quoted-notices, .quoted-notices,
.oembed-data { .oembed-data {
@ -3457,18 +3543,18 @@ span.inline-reply-caret .caret-inner {
content:'@'; content:'@';
} }
#mini-edit-profile-button { #mini-logged-in-user-cog-wheel {
width:30px; width:30px;
height:30px; height:30px;
position:absolute; position:absolute;
z-index:102; z-index:201;
right:5px; right:5px;
top:5px; top:5px;
} }
#mini-edit-profile-button:before { #mini-logged-in-user-cog-wheel:before {
font-family: 'FontAwesome'; font-family: 'FontAwesome';
font-size:17px; font-size:17px;
content:'\f044'; content:'\f013';
display:block; display:block;
position:absolute; position:absolute;
width:30px; width:30px;
@ -3476,10 +3562,10 @@ span.inline-reply-caret .caret-inner {
line-height:30px; line-height:30px;
text-align:center; text-align:center;
text-shadow:none; text-shadow:none;
color:rgba(255,255,255,0.7); color:rgba(255,255,255,0.9);
z-index:102; z-index:102;
} }
#mini-edit-profile-button:hover:before { #mini-logged-in-user-cog-wheel:hover:before {
color:rgba(255,255,255,1); color:rgba(255,255,255,1);
} }
@ -4617,7 +4703,6 @@ background:rgba(0,0,0,0.2);
border-radius: 6px; border-radius: 6px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4), 0 1px 0 rgba(255, 255, 255, 0.5) inset; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4), 0 1px 0 rgba(255, 255, 255, 0.5) inset;
position: relative; position: relative;
overflow: hidden;
} }
.modal-close { .modal-close {
margin: 0; margin: 0;
@ -4690,14 +4775,16 @@ background:rgba(0,0,0,0.2);
content: " "; content: " ";
clear: both; clear: both;
} }
.modal-container[id*="popup-reply-"] .modal-footer { .modal-container[id*="popup-reply-"] .modal-footer,
#queet-thumb-popup .modal-footer {
padding:0; padding:0;
} }
.modal-container[id*="popup-reply-"] .modal-footer {}
.modal-footer .queet, .modal-footer .queet,
.modal-footer .stream-item { .modal-footer .stream-item {
border:0 none; border:0 none;
cursor:auto; cursor:auto;
border-radius: 0 0 5px 5px;
} }
.modal-footer .queet:hover { .modal-footer .queet:hover {
background-color:#fff; background-color:#fff;
@ -5549,11 +5636,14 @@ body.rtl #feed-header-inner h2 {
z-index: 1; z-index: 1;
} }
#feed, #feed {
.profile-card {
position:relative; position:relative;
z-index:10; z-index:10;
} }
.profile-card {
position:relative;
z-index:11;
}
#search-query-hint { #search-query-hint {
display:none; display:none;

View File

@ -261,6 +261,7 @@ function getAllFollowsMembershipsAndBlocks(callback) {
if(data.blocks) { if(data.blocks) {
window.allBlocking = data.blocks; window.allBlocking = data.blocks;
markAllNoticesFromBlockedUsersAsBlockedInJQueryObject($('body'));
} }
if(typeof callback == 'function') { 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 blockOrUnblock: either 'block' or 'unblock'
· @param user_id: the user id of the user we want to follow · @param user_id: the user id of the user we want to block/unblock
· @param actionOnSuccess: callback function, false on error, data on success · @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? // enabled?
var prefEnabledOrDisabled = 'disabled'; var prefEnabledOrDisabled = 'disabled';
if(typeof window.qvitterProfilePrefs[this.topic] != 'undefined' if(isQvitterProfilePrefEnabled(this.topic)) {
&& window.qvitterProfilePrefs[this.topic] !== null
&& window.qvitterProfilePrefs[this.topic] != ''
&& window.qvitterProfilePrefs[this.topic] !== false
&& window.qvitterProfilePrefs[this.topic] != 0
&& window.qvitterProfilePrefs[this.topic] != '0') {
prefEnabledOrDisabled = 'enabled'; 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 // get row html
menuHTML = menuHTML + buildMenuRowFullwidth(this.label, { menuHTML = menuHTML + buildMenuRowFullwidth(labelToUse, {
id: this.topic, id: this.topic,
class: 'row-type-' + this.type + ' ' + prefEnabledOrDisabled, class: 'row-type-' + this.type + ' ' + prefEnabledOrDisabled + disableTickClass,
'data-menu-row-type': this.type, 'data-menu-row-type': this.type,
'data-profile-prefs-topic': this.topic, 'data-profile-prefs-topic': this.topic,
'data-profile-prefs-namespace': this.namespace, '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-state': prefEnabledOrDisabled,
'data-profile-pref-callback': this.callback 'data-profile-pref-callback': this.callback
}); });
@ -358,6 +367,18 @@ function buildProfileCard(data) {
var follows_you = '<span class="follows-you">' + window.sL.followsYou + '</span>'; 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? // silenced?
var is_silenced = ''; var is_silenced = '';
if(data.is_silenced === true) { if(data.is_silenced === true) {
@ -368,6 +389,11 @@ function buildProfileCard(data) {
if(data.is_sandboxed === true) { if(data.is_sandboxed === true) {
is_sandboxed = ' sandboxed'; is_sandboxed = ' sandboxed';
} }
// muted?
var is_muted = '';
if(isUserMuted(data.id)) {
is_muted = ' user-muted';
}
var followButton = ''; var followButton = '';
@ -394,8 +420,8 @@ function buildProfileCard(data) {
// full card html // full card html
data.profileCardHtml = '\ data.profileCardHtml = '\
<div class="profile-card">\ <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 + '">\ <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>\ <div class="profile-header-inner-overlay"></div>\
<a class="profile-picture" href="' + data.profile_image_url_original + '">\ <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 + '" />\ <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>\ <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>\ </ul>\
' + followButton + '\ ' + 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 class="clearfix"></div>\
</div>\ </div>\
</div>\ </div>\
@ -458,6 +485,18 @@ function buildExternalProfileCard(data) {
var followButton = buildFollowBlockbutton(data.local); 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? // silenced?
var is_silenced = ''; var is_silenced = '';
if(data.local.is_silenced === true) { if(data.local.is_silenced === true) {
@ -470,8 +509,15 @@ function buildExternalProfileCard(data) {
is_sandboxed = ' sandboxed'; 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 localUserId = data.local.id;
var localUserScreenName = data.local.screen_name;
// empty strings and zeros instead of null // empty strings and zeros instead of null
data = cleanUpUserObject(data.external); data = cleanUpUserObject(data.external);
@ -506,8 +552,8 @@ function buildExternalProfileCard(data) {
data.screenNameWithServer = '@' + data.screen_name + '@' + serverUrl; data.screenNameWithServer = '@' + data.screen_name + '@' + serverUrl;
data.profileCardHtml = '\ data.profileCardHtml = '\
<div class="profile-card">\ <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 + '">\ <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>\ <div class="profile-header-inner-overlay"></div>\
<a class="profile-picture"><img src="' + data.profile_image_url_profile_size + '" /></a>\ <a class="profile-picture"><img src="' + data.profile_image_url_profile_size + '" /></a>\
<div class="profile-card-inner">\ <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>\ <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>\ </ul>\
' + followButton + '\ ' + 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 class="clearfix"></div>\
</div>\ </div>\
</div>\ </div>\
@ -783,12 +830,13 @@ function setNewCurrentStream(streamObject,setLocation,fallbackId,actionOnSuccess
// hide all notices from blocked users (not for user lists) // hide all notices from blocked users (not for user lists)
if(window.currentStreamObject.type != 'users' && typeof window.allBlocking != 'undefined') { if(window.currentStreamObject.type != 'users' && typeof window.allBlocking != 'undefined') {
$.each(window.allBlocking,function(){ markAllNoticesFromBlockedUsersAsBlockedInJQueryObject(oldStreamState);
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);
});
} }
// 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 // hide dublicate repeats, only show the first/oldest instance of a notice
oldStreamState = hideAllButOldestInstanceOfStreamItem(oldStreamState); oldStreamState = hideAllButOldestInstanceOfStreamItem(oldStreamState);
@ -1343,7 +1391,7 @@ function cleanUpAfterCollapseQueet(streamItem) {
streamItem.find('.view-more-container-top').remove(); streamItem.find('.view-more-container-top').remove();
streamItem.find('.view-more-container-bottom').remove(); streamItem.find('.view-more-container-bottom').remove();
streamItem.find('.inline-reply-queetbox').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.find('.show-full-conversation').remove();
streamItem.removeAttr('style'); streamItem.removeAttr('style');
queet.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) { function findAndMarkLastVisibleInConversation(streamItem) {
streamItem.children().removeClass('last-visible'); streamItem.children().removeClass('last-visible');
streamItem.children().removeClass('first-visible-after-parent'); streamItem.children().removeClass('first-visible-after-parent');
streamItem.children().not('.hidden-conversation').last().addClass('last-visible'); streamItem.children().not('.hidden-conversation').not('.always-hidden').last().addClass('last-visible');
streamItem.children('.queet').nextAll().not('.hidden-conversation').first().addClass('first-visible-after-parent'); 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'); reply_found.css('opacity','1');
if(only_first && reply_found_reply_to.length>0) { if(only_first && reply_found_reply_to.length>0) {
if(q.children('.view-more-container-top').length < 1) { 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>'); 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(only_first && reply_founds_reply.length>0) {
if(q.children('.view-more-container-bottom').length < 1) { 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>'); 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 // helper function for the above recursive functions
function checkForHiddenConversationQueets(q, qid) { 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 // 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) { 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>'); 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); var notificationTime = parseTwitterDate(obj.created_at);
if(obj.is_seen == '0') { if(obj.is_seen == '0') {
extraClassesThisRun += ' not-seen' extraClassesThisRun += ' not-seen';
}
if(isUserMuted(obj.from_profile.id)) {
extraClassesThisRun += ' user-muted';
} }
// external // 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>'; ostatusHtml = '<a target="_blank" data-tooltip="' + window.sL.goToOriginalNotice + '" class="ostatus-link" href="' + obj.from_profile.statusnet_profile_url + '"></a>';
} }
if(obj.ntype == 'like') { if(obj.ntype == 'like') {
var noticeTime = parseTwitterDate(obj.notice.created_at); 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="queet">\
<div class="dogear"></div>\ <div class="dogear"></div>\
' + ostatusHtml + '\ ' + ostatusHtml + '\
@ -1746,7 +1799,7 @@ function addToFeed(feed, after, extraClasses) {
} }
else if(obj.ntype == 'repeat') { else if(obj.ntype == 'repeat') {
var noticeTime = parseTwitterDate(obj.notice.created_at); 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="queet">\
<div class="dogear"></div>\ <div class="dogear"></div>\
' + ostatusHtml + '\ ' + ostatusHtml + '\
@ -1777,7 +1830,7 @@ function addToFeed(feed, after, extraClasses) {
var notificationHtml = buildQueetHtml(obj.notice, obj.id, extraClassesThisRun + ' notification reply'); var notificationHtml = buildQueetHtml(obj.notice, obj.id, extraClassesThisRun + ' notification reply');
} }
else if(obj.ntype == 'follow') { 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">\
<div class="queet-content">\ <div class="queet-content">\
' + ostatusHtml + '\ ' + ostatusHtml + '\
@ -1984,6 +2037,16 @@ function buildUserStreamItemHtml(obj) {
if(obj.is_sandboxed === true) { if(obj.is_sandboxed === true) {
sandboxedClass = ' sandboxed'; 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 = ''; var followButton = '';
if(typeof window.loggedIn.screen_name != 'undefined' // if logged in 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 + '">\ <div class="queet ' + rtlOrNot + '">\
' + followButton + '\ ' + 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="queet-content">\
<div class="stream-item-header">\ <div class="stream-item-header">\
<a class="account-group" href="' + obj.statusnet_profile_url + '" data-user-id="' + obj.id + '">\ <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? // silenced?
if(obj.user.is_silenced === true) { if(obj.user.is_silenced === true) {
extraClasses += ' silenced'; extraClasses += ' silenced';

View File

@ -117,9 +117,15 @@ function removeOldestLocalStorageEntries(callback) {
} }
}); });
console.log('removed 100 old localstorage items'); console.log('removed ' + i + ' old localstorage items');
if(i>0) {
callback(); callback();
return true;
}
else {
return false;
}
} }
@ -290,9 +296,18 @@ function localStorageIsEnabled() {
} }
catch(e) { 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') { 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 { else {
return false; return false;
@ -301,6 +316,8 @@ function localStorageIsEnabled() {
} }
/* · /* ·
· ·
· Block/unblock user and do necessary stuff · Block/unblock user and do necessary stuff
@ -309,6 +326,8 @@ function localStorageIsEnabled() {
function blockUser(arg, callback) { 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 // arguments is sent as an object, for easier use with a menu's function-row
var userId = arg.userId; var userId = arg.userId;
var blockButton_jQueryElement = arg.blockButton_jQueryElement; var blockButton_jQueryElement = arg.blockButton_jQueryElement;
@ -337,6 +356,8 @@ function blockUser(arg, callback) {
} }
function unblockUser(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 // arguments is sent as an object, for easier use with a menu's function-row
var userId = arg.userId; var userId = arg.userId;
var blockButton_jQueryElement = arg.blockButton_jQueryElement; var blockButton_jQueryElement = arg.blockButton_jQueryElement;
@ -398,9 +419,11 @@ function markUserAsUnblockedInDOM(userId, following) {
} }
// hide the user from lists of blocked users // hide the user from lists of blocked users
if(window.currentStreamObject.name == 'user blocks' && window.currentStreamObject.nickname == window.loggedIn.screen_name) {
$.each($('.stream-item.user[data-user-id="' + userId + '"]'),function(){ $.each($('.stream-item.user[data-user-id="' + userId + '"]'),function(){
slideUpAndRemoveStreamItem($(this)); slideUpAndRemoveStreamItem($(this));
}); });
}
// unhide notices from the blocked user // unhide notices from the blocked user
$.each($('.stream-item[data-quitter-id-in-stream][data-user-id="' + userId + '"]'),function(){ $.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() { 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'); $('#new-queets-bar').parent().removeClass('hidden');
// bar label // 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; } else { var q_txt = window.sL.newQueets; }
if(window.currentStreamObject.name == 'notifications') { 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; } 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) { if(userArray.local.is_silenced === true) {
$('.stream-item[data-user-id=' + userArray.local.id + ']').addClass('silenced'); $('.stream-item[data-user-id=' + userArray.local.id + ']').addClass('silenced');
$('.profile-card .profile-header-inner[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 { else {
$('.stream-item[data-user-id=' + userArray.local.id + ']').removeClass('silenced') $('.stream-item[data-user-id=' + userArray.local.id + ']').removeClass('silenced')
$('.profile-card .profile-header-inner[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) // profile size avatars (notices, users)
@ -1168,19 +1435,9 @@ function rememberStreamStateInLocalStorage() {
var feed = $('<div/>').append(firstTwentyVisibleHTML); var feed = $('<div/>').append(firstTwentyVisibleHTML);
// we add these again (with updated blocking list) when the notices are fetched from the cache // we add some of these things again when the notices are fetched from the cache
feed.children('.stream-item').removeClass('profile-blocked-by-me'); cleanStreamItemsFromClassesAndConversationElements(feed);
feed.children('.stream-item').children('.queet').removeAttr('data-tooltip'); // can contain tooltip about blocked user
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 feedHtml = feed.html();
var profileCardHtml = $('#feed').siblings('.profile-card').outerHTML(); var profileCardHtml = $('#feed').siblings('.profile-card').outerHTML();
var streamData = { 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; return obj;
} }
function replaceHtmlSpecialChars(text) { function replaceHtmlSpecialChars(text) {
// don't do anything if the text is undefined
if(typeof text == 'undefined') {
return text;
}
var map = { var map = {
'&': '&amp;', '&': '&amp;',
'<': '&lt;', '<': '&lt;',

View File

@ -258,6 +258,11 @@ $('body').on('mouseover',function (e) {
return true; 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 // no hovercard for anchor links
if(hrefAttr.substring(0,1) == '#') { if(hrefAttr.substring(0,1) == '#') {
return true; return true;
@ -943,15 +948,16 @@ function proceedToSetLanguageAndLogin(data){
$('#invite-link').html(window.sL.inviteAFriend); $('#invite-link').html(window.sL.inviteAFriend);
$('#classic-link').html(window.sL.classicInterface); $('#classic-link').html(window.sL.classicInterface);
$('#edit-profile-header-link').html(window.sL.editMyProfile); $('#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); $('#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); $('#top-compose').attr('data-tooltip',window.sL.compose);
$('button.upload-image').attr('data-tooltip',window.sL.tooltipAttachImage); $('button.upload-image').attr('data-tooltip',window.sL.tooltipAttachImage);
$('button.shorten').attr('data-tooltip',window.sL.tooltipShortenUrls); $('button.shorten').attr('data-tooltip',window.sL.tooltipShortenUrls);
$('.reload-stream').attr('data-tooltip',window.sL.tooltipReloadStream); $('.reload-stream').attr('data-tooltip',window.sL.tooltipReloadStream);
$('#clear-history').html(window.sL.clearHistory); $('#clear-history').html(window.sL.clearHistory);
$('#user-screen-name, #user-avatar, #user-name').attr('data-tooltip', window.sL.viewMyProfilePage); $('#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 // show site body now
$('#user-container').css('display','block'); $('#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 · Show/hide the stream menu dropdown on click
@ -1231,9 +1324,12 @@ $('body').on('click','.sm-ellipsis',function(e){
else { else {
$(this).addClass('dropped'); $(this).addClass('dropped');
var streamItemUsername = $(this).closest('.queet').find('.stream-item-header').find('.screen-name').text(); var closestStreamItem = $(this).closest('.queet').parent('.stream-item');
var streamItemUserID = $(this).closest('.queet').find('.stream-item-header').find('.name').attr('data-user-id'); var streamItemUsername = closestStreamItem.attr('data-user-screen-name');
var streamItemID = $(this).closest('.queet').parent('.stream-item').attr('data-quitter-id'); 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 // menu
var menuArray = []; var menuArray = [];
@ -1271,8 +1367,22 @@ $('body').on('click','.sm-ellipsis',function(e){
label: window.sL.blockUser.replace('{username}',streamItemUsername) 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 // add menu to DOM and align it
var menu = $(getMenu(menuArray)).appendTo(this); var menu = $(getMenu(menuArray)).appendTo(this);
alignMenuToParent(menu,$(this)); alignMenuToParent(menu,$(this));
@ -1306,7 +1416,7 @@ $('body').on('click','.row-type-function',function(e){
thisFunctionRow.addClass('clicked'); thisFunctionRow.addClass('clicked');
var functionName = $(this).attr('data-function-name'); 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; var functionArguments = false;
} }
else { else {
@ -1349,6 +1459,8 @@ $('body').on('click','.row-type-profile-prefs-toggle',function(e){
var prefNamespace = thisToggle.attr('data-profile-prefs-namespace'); var prefNamespace = thisToggle.attr('data-profile-prefs-namespace');
var prefTopic = thisToggle.attr('data-profile-prefs-topic'); 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 // only prefs in the 'qvitter' namespace allowed
if(prefNamespace != 'qvitter') { if(prefNamespace != 'qvitter') {
@ -1366,12 +1478,18 @@ $('body').on('click','.row-type-profile-prefs-toggle',function(e){
thisToggle.removeClass('disabled'); thisToggle.removeClass('disabled');
thisToggle.addClass('enabled'); thisToggle.addClass('enabled');
thisToggle.attr('data-profile-pref-state','enabled'); thisToggle.attr('data-profile-pref-state','enabled');
if(prefEnabledLabel != 'undefined') {
thisToggle.html(prefEnabledLabel);
}
window.qvitterProfilePrefs[prefTopic] = '1'; window.qvitterProfilePrefs[prefTopic] = '1';
} }
else if(thisToggle.attr('data-profile-pref-state') == 'enabled') { else if(thisToggle.attr('data-profile-pref-state') == 'enabled') {
thisToggle.removeClass('enabled'); thisToggle.removeClass('enabled');
thisToggle.addClass('disabled'); thisToggle.addClass('disabled');
thisToggle.attr('data-profile-pref-state','disabled'); thisToggle.attr('data-profile-pref-state','disabled');
if(prefEnabledLabel != 'undefined') {
thisToggle.html(prefLabel);
}
window.qvitterProfilePrefs[prefTopic] = '0'; window.qvitterProfilePrefs[prefTopic] = '0';
} }
@ -1423,15 +1541,11 @@ function showOrHideEmbeddedContentInTimelineFromProfilePref() {
var showHide = window.qvitterProfilePrefs['hide_embedded_in_timeline:' + window.currentStreamObject.path]; var showHide = window.qvitterProfilePrefs['hide_embedded_in_timeline:' + window.currentStreamObject.path];
if(parseInt(showHide,10) == 1) { if(parseInt(showHide,10) == 1) {
$('#feed-body').addClass('embedded-content-hidden-by-user'); $('#feed-body').addClass('embedded-content-hidden-by-user');
return;
}
} }
else {
$('#feed-body').removeClass('embedded-content-hidden-by-user'); $('#feed-body').removeClass('embedded-content-hidden-by-user');
} }
}
else {
$('#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]; var showHide = window.qvitterProfilePrefs['hide_quotes_in_timeline:' + window.currentStreamObject.path];
if(parseInt(showHide,10) == 1) { if(parseInt(showHide,10) == 1) {
$('#feed-body').addClass('quotes-hidden-by-user'); $('#feed-body').addClass('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;
} }
else {
$('#feed-body').removeClass('quotes-hidden-by-user');
} }
$('#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){ $('#user-header').on('click',function(e){
// not if we're clicking the mini-edit-profile-button // not if we're clicking the mini-logged-in-user-cog-wheel
if($(e.target).is('#mini-edit-profile-button')) { if($(e.target).is('#mini-logged-in-user-cog-wheel')) {
return; return;
} }
setNewCurrentStream(pathToStreamRouter(window.loggedIn.screen_name),true,false); 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 thisAttachmentThumbSrc = $(this).attr('src');
var parentStreamItem = $(this).closest('.stream-item'); var parentStreamItem = $(this).closest('.stream-item');
var $parentStreamItemClone = $('<div/>').append(parentStreamItem.outerHTML()); 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()); var $queetThumbsClone = $('<div/>').append($parentStreamItemClone.find('.queet-thumbs').outerHTML());
$parentStreamItemClone.find('.queet-thumbs, .expanded-content, .inline-reply-queetbox, .stream-item-footer').remove(); // cleaned version of the stream item to show in the footer
var footerHTML = $parentStreamItemClone.find('.queet').outerHTML(); cleanStreamItemsFromClassesAndConversationElements($parentStreamItemClone);
$parentStreamItemClone.find('.context,.stream-item-footer').remove();
var parentStreamItemHTMLWithoutFooter = $parentStreamItemClone.outerHTML();
$thumbToDisplay = $queetThumbsClone.find('img.attachment-thumb[src="' + thisAttachmentThumbSrc + '"]'); $thumbToDisplay = $queetThumbsClone.find('img.attachment-thumb[src="' + thisAttachmentThumbSrc + '"]');
$thumbToDisplay.parent().addClass('display-this-thumb'); $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); $thisImgInQueetThumbsClone.parent('.thumb-container').children('iframe').attr('height',calculatedDimensions.displayImgHeight);
// open popup // open popup
popUpAction('queet-thumb-popup', '', '' + $queetThumbsClone.outerHTML() + '', footerHTML, calculatedDimensions.popUpWidth); popUpAction('queet-thumb-popup', '', '' + $queetThumbsClone.outerHTML() + '', parentStreamItemHTMLWithoutFooter, calculatedDimensions.popUpWidth);
disableOrEnableNavigationButtonsInImagePopup($('#queet-thumb-popup')); 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'); var this_stream_item_id = this_stream_item.attr('data-quitter-id');
this_stream_item.addClass('replying-to'); this_stream_item.addClass('replying-to');
// grabbing the queet and view it in the popup, stripped of footer, reply box and other sruff // grabbing the stream-item and view it in the popup, stripped of conversation footer, reply box and other sruff
var $queetHtml = $(this_stream_item.outerHTML()); var streamItemHTML = $('<div/>').html(this_stream_item.outerHTML());
$queetHtml.children('.stream-item.conversation').remove(); cleanStreamItemsFromClassesAndConversationElements(streamItemHTML);
$queetHtml.find('.context,.stream-item-footer,.inline-reply-queetbox,.expanded-content').remove(); streamItemHTML.find('.context,.stream-item-footer').remove();
var queetHtmlWithoutFooter = $queetHtml.outerHTML(); 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),queetHtmlWithoutFooter);
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 $('#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') { if(window.currentStreamObject.name == 'my profile') {
$('#page-container > .profile-card .edit-profile-button').trigger('click'); $('#page-container > .profile-card .edit-profile-button').trigger('click');
if(typeof callback == 'function') {
callback(true);
}
} }
else { else {
setNewCurrentStream(pathToStreamRouter(window.loggedIn.screen_name), true, false, function(){ setNewCurrentStream(pathToStreamRouter(window.loggedIn.screen_name), true, false, function(){
$('#page-container > .profile-card .edit-profile-button').trigger('click'); $('#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, label: window.sL.onlyShowNotificationsFromUsersIFollow,
callback: 'reloadCurrentStreamAndClearCache' callback: 'reloadCurrentStreamAndClearCache'
}, },
{
type: 'profile-prefs-toggle',
namespace: 'qvitter',
topic: 'hide_notifications_from_muted_users',
label: window.sL.hideNotificationsFromMutedUsers,
callback: 'showOrHideNoticesFromMutedUsersInNotifications'
},
{ {
type: 'divider' type: 'divider'
}, },
@ -617,7 +624,8 @@ function pathToStreamRouter(path) {
]; ];
streamObject.callbacks = [ streamObject.callbacks = [
'showOrHideEmbeddedContentInTimelineFromProfilePref', 'showOrHideEmbeddedContentInTimelineFromProfilePref',
'showOrHideQuotesInTimelineFromProfilePref' 'showOrHideQuotesInTimelineFromProfilePref',
'showOrHideNoticesFromMutedUsersInNotifications'
]; ];
} }
return streamObject; return streamObject;
@ -692,8 +700,7 @@ function pathToStreamRouter(path) {
if(pathSplit.length == 2 && /^[a-zA-Z0-9]+$/.test(pathSplit[0]) && pathSplit[1] == 'blocks') { if(pathSplit.length == 2 && /^[a-zA-Z0-9]+$/.test(pathSplit[0]) && pathSplit[1] == 'blocks') {
streamObject.name = 'user blocks'; streamObject.name = 'user blocks';
streamObject.nickname = pathSplit[0]; streamObject.nickname = pathSplit[0];
streamObject.parentPath = streamObject.nickname; streamObject.streamHeader = window.sL.userBlocked;
streamObject.streamHeader = '@' + replaceHtmlSpecialChars(streamObject.nickname);
streamObject.streamSubHeader = window.sL.userBlocks; streamObject.streamSubHeader = window.sL.userBlocks;
streamObject.stream = 'qvitter/blocks.json?count=20&id=' + streamObject.nickname + '&withuserarray=1'; streamObject.stream = 'qvitter/blocks.json?count=20&id=' + streamObject.nickname + '&withuserarray=1';
streamObject.maxIdOrPage = 'page'; streamObject.maxIdOrPage = 'page';
@ -701,6 +708,19 @@ function pathToStreamRouter(path) {
return streamObject; 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 // {screen_name}/groups
if(pathSplit.length == 2 && /^[a-zA-Z0-9]+$/.test(pathSplit[0]) && pathSplit[1] == 'groups') { if(pathSplit.length == 2 && /^[a-zA-Z0-9]+$/.test(pathSplit[0]) && pathSplit[1] == 'groups') {
streamObject.name = 'user group list'; streamObject.name = 'user group list';

View File

@ -118,7 +118,7 @@
"cropAndSave": "قُص و احفظ.", "cropAndSave": "قُص و احفظ.",
"showTerms": "Read our Terms of Use", "showTerms": "Read our Terms of Use",
"ellipsisMore": "More", "ellipsisMore": "More",
"blockUser": "Block {username}", "blockUser": "Block",
"goToOriginalNotice": "Go to original notice", "goToOriginalNotice": "Go to original notice",
"goToTheUsersRemoteProfile": "Go to the user's remote profile", "goToTheUsersRemoteProfile": "Go to the user's remote profile",
"clickToDrag":"Click to drag", "clickToDrag":"Click to drag",
@ -169,7 +169,7 @@
"buttonUnblock":"Unblock", "buttonUnblock":"Unblock",
"failedBlockingUser":"Failed to block the user.", "failedBlockingUser":"Failed to block the user.",
"failedUnblockingUser":"Failed to unblock the user.", "failedUnblockingUser":"Failed to unblock the user.",
"unblockUser": "Unblock {username}", "unblockUser": "Unblock",
"tooltipBlocksYou":"You are blocked from following {username}.", "tooltipBlocksYou":"You are blocked from following {username}.",
"silenced":"Silenced", "silenced":"Silenced",
"silencedPlural":"Silenced profiles", "silencedPlural":"Silenced profiles",
@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}", "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.", "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.", "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}", "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.", "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.", "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}", "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.", "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.", "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}", "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.", "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.", "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", "cropAndSave": "Crop and save",
"showTerms": "Read our Terms of Use", "showTerms": "Read our Terms of Use",
"ellipsisMore": "More", "ellipsisMore": "More",
"blockUser": "Block {username}", "blockUser": "Block",
"goToOriginalNotice": "Go to the original quip", "goToOriginalNotice": "Go to the original quip",
"goToTheUsersRemoteProfile": "Go to the user's remote profile", "goToTheUsersRemoteProfile": "Go to the user's remote profile",
"clickToDrag":"Click to drag", "clickToDrag":"Click to drag",
@ -169,7 +169,7 @@
"buttonUnblock":"Unblock", "buttonUnblock":"Unblock",
"failedBlockingUser":"Failed to block the user.", "failedBlockingUser":"Failed to block the user.",
"failedUnblockingUser":"Failed to unblock the user.", "failedUnblockingUser":"Failed to unblock the user.",
"unblockUser": "Unblock {username}", "unblockUser": "Unblock",
"tooltipBlocksYou":"You are blocked from following {username}.", "tooltipBlocksYou":"You are blocked from following {username}.",
"silenced":"Silenced", "silenced":"Silenced",
"silencedPlural":"Silenced profiles", "silencedPlural":"Silenced profiles",
@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}", "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.", "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.", "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,20 +164,37 @@
"continueRant":"Daŭrigi la plendon", "continueRant":"Daŭrigi la plendon",
"hideEmbeddedInTimeline":"Kaŝi enkorpigitajn enhavojn en ĉi tiu tempolinio", "hideEmbeddedInTimeline":"Kaŝi enkorpigitajn enhavojn en ĉi tiu tempolinio",
"hideQuotesInTimeline":"Kaŝi citaĵojn en ĉi tiu tempolinio", "hideQuotesInTimeline":"Kaŝi citaĵojn en ĉi tiu tempolinio",
"userBlocks":"Accounts you're blocking", "userBlocks":"Blokaj kontoj",
"buttonBlocked":"Blocked", "buttonBlocked":"Blokita",
"buttonUnblock":"Unblock", "buttonUnblock":"Malbloki",
"failedBlockingUser":"Failed to block the user.", "failedBlockingUser":"Malsukcesis bloki la uzanto.",
"failedUnblockingUser":"Failed to unblock the user.", "failedUnblockingUser":"Malsukcesis malbloki la uzanto.",
"unblockUser": "Unblock {username}", "unblockUser": "Malbloki {username}",
"tooltipBlocksYou":"You are blocked from following {username}.", "tooltipBlocksYou":"Vi blokitas de sekvato al {username}.",
"silenced":"Silenced", "silenced":"Silentiĝa",
"silencedPlural":"Silenced profiles", "silencedPlural":"Silentiĝaj profiloj",
"silencedUsersOnThisInstance":"Silenced profiles on {site-title}", "silencedUsersOnThisInstance":"Silenctiĝaj profiloj sur {site-title}",
"sandboxed":"Sandboxed", "sandboxed":"Sablokesta",
"sandboxedPlural":"Sandboxed profiles", "sandboxedPlural":"Sablokestaj profiloj",
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}", "sandboxedUsersOnThisInstance":"Sablokestaj profiloj sur {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.", "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":"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.", "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":"Only show notifications from users I follow" "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}", "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.", "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.", "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}", "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.", "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.", "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}", "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.", "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.", "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}", "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.", "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.", "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}", "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.", "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.", "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}", "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.", "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.", "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}", "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.", "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.", "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}", "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.", "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.", "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}", "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.", "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.", "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}", "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.", "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.", "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": "サインイン", "loginSignIn": "サインイン",
"loginRememberMe": "記憶する", "loginRememberMe": "記憶する",
"loginForgotPassword": "パスワードを忘れましたか?", "loginForgotPassword": "パスワードを忘れましたか?",
"notices": "クイート", "notices": "クイップ",
"followers": "フォロワー", "followers": "フォロワー",
"following": "フォロー", "following": "フォロー",
"groups": "グループ", "groups": "グループ",
"compose": "クイートする", "compose": "クイップする",
"queetVerb": "送る", "queetVerb": "送る",
"queetsNounPlural": "クイート", "queetsNounPlural": "クイップ",
"logout": "サインアウト", "logout": "サインアウト",
"languageSelected": "言語:", "languageSelected": "言語:",
"viewMyProfilePage": "自分のプロフィールページを見る", "viewMyProfilePage": "自分のプロフィールページを見る",
@ -21,18 +21,18 @@
"details": "詳細", "details": "詳細",
"expandFullConversation": "会話を全て表示する", "expandFullConversation": "会話を全て表示する",
"replyVerb": "返信する", "replyVerb": "返信する",
"requeetVerb": "リクイートする", "requeetVerb": "リクイップする",
"favoriteVerb": "お気に入りに追加する", "favoriteVerb": "お気に入りに追加する",
"requeetedVerb": "リクイートされました", "requeetedVerb": "リクイップされました",
"favoritedVerb": "お気に入りに追加されました", "favoritedVerb": "お気に入りに追加されました",
"replyTo": "返信先は", "replyTo": "返信先は",
"requeetedBy": "リクイートした人は {requeeted-by}", "requeetedBy": "リクイップした人は {requeeted-by}",
"favoriteNoun": "お気に入り", "favoriteNoun": "お気に入り",
"favoritesNoun": "お気に入り", "favoritesNoun": "お気に入り",
"requeetNoun": "リクイート", "requeetNoun": "リクイップ",
"requeetsNoun": "リクイート", "requeetsNoun": "リクイップ",
"newQueet": "{new-notice-count} 件の新着クイートを表示", "newQueet": "{new-notice-count} 件の新着クイップを表示",
"newQueets": "{new-notice-count} 件の新着クイートを表示", "newQueets": "{new-notice-count} 件の新着クイップを表示",
"longmonthsJanuary": "1月", "longmonthsJanuary": "1月",
"longmonthsFebruary": "2月", "longmonthsFebruary": "2月",
"longmonthsMars": "3月", "longmonthsMars": "3月",
@ -69,14 +69,14 @@
"posting": "投稿中", "posting": "投稿中",
"viewMoreInConvBefore": "← 会話を詳しく見る", "viewMoreInConvBefore": "← 会話を詳しく見る",
"viewMoreInConvAfter": "会話を詳しく見る →", "viewMoreInConvAfter": "会話を詳しく見る →",
"mentions": "@クイート", "mentions": "@クイップ",
"timeline": "タイムライン", "timeline": "タイムライン",
"publicTimeline": "パブリックタイムライン", "publicTimeline": "パブリックタイムライン",
"publicAndExtTimeline": "関連ネットワーク全体", "publicAndExtTimeline": "関連ネットワーク全体",
"searchVerb": "検索する", "searchVerb": "検索する",
"deleteVerb": "削除する", "deleteVerb": "削除する",
"cancelVerb": "キャンセル", "cancelVerb": "キャンセル",
"deleteConfirmation": "このクイートを本当に削除しますか?", "deleteConfirmation": "このクイップを本当に削除しますか?",
"userExternalFollow": "リモートフォロー", "userExternalFollow": "リモートフォロー",
"userExternalFollowHelp": "あなたのアカウントID (例: user@rainbowdash.net).", "userExternalFollowHelp": "あなたのアカウントID (例: user@rainbowdash.net).",
"userFollow": "フォロー", "userFollow": "フォロー",
@ -108,8 +108,8 @@
"otherServers": "もしくはGNU socialネットワークの別のサーバーでアカウントを作ることができます。<a href=\"http://federation.skilledtests.com/select_your_server.html\">サーバーの比較</a>", "otherServers": "もしくはGNU socialネットワークの別のサーバーでアカウントを作ることができます。<a href=\"http://federation.skilledtests.com/select_your_server.html\">サーバーの比較</a>",
"editMyProfile": "プロフィールを編集する", "editMyProfile": "プロフィールを編集する",
"notifications": "お知らせ", "notifications": "お知らせ",
"xFavedYourQueet": "があなたのクイートをお気に入りに追加しました", "xFavedYourQueet": "があなたのクイップをお気に入りに追加しました",
"xRepeatedYourQueet": "があなたをリクイートしました", "xRepeatedYourQueet": "があなたをリクイップしました",
"xStartedFollowingYou": "があなたをフォローしました", "xStartedFollowingYou": "があなたをフォローしました",
"followsYou": "フォローされています", "followsYou": "フォローされています",
"FAQ": "よくある質問", "FAQ": "よくある質問",
@ -119,7 +119,7 @@
"showTerms": "利用条件を読む", "showTerms": "利用条件を読む",
"ellipsisMore": "もっと", "ellipsisMore": "もっと",
"blockUser": "{username}をブロックする", "blockUser": "{username}をブロックする",
"goToOriginalNotice": "元のクイートを見る", "goToOriginalNotice": "元のクイップを見る",
"goToTheUsersRemoteProfile": "このユーザーのリモートにあるプロフィールを見る", "goToTheUsersRemoteProfile": "このユーザーのリモートにあるプロフィールを見る",
"clickToDrag":"クリックしてドラッグ", "clickToDrag":"クリックしてドラッグ",
"keyboardShortcuts":"キーボードショートカット", "keyboardShortcuts":"キーボードショートカット",
@ -128,7 +128,7 @@
"tooltipBookmarkStream":"このストリームをブックマークに保存する", "tooltipBookmarkStream":"このストリームをブックマークに保存する",
"tooltipTopMenu":"メニューと設定", "tooltipTopMenu":"メニューと設定",
"tooltipAttachImage":"画像を添付", "tooltipAttachImage":"画像を添付",
"tooltipShortenUrls":"クイート中の全てのURLを短縮する", "tooltipShortenUrls":"クイップ中の全てのURLを短縮する",
"tooltipReloadStream":"このストリームを再読み込みする", "tooltipReloadStream":"このストリームを再読み込みする",
"tooltipRemoveBookmark":"このブックマークを削除する", "tooltipRemoveBookmark":"このブックマークを削除する",
"clearHistory":"閲覧履歴を消去する", "clearHistory":"閲覧履歴を消去する",
@ -137,21 +137,21 @@
"ERRORcouldNotFindUserWithNickname":"\"{nickname}\"というニックネームのユーザーはこのサーバーでは見付かりませんでした。", "ERRORcouldNotFindUserWithNickname":"\"{nickname}\"というニックネームのユーザーはこのサーバーでは見付かりませんでした。",
"ERRORcouldNotFindGroupWithNickname":"\"{nickname}\"というニックネームのグループはこのサーバーでは見付かりませんでした。", "ERRORcouldNotFindGroupWithNickname":"\"{nickname}\"というニックネームのグループはこのサーバーでは見付かりませんでした。",
"ERRORcouldNotFindPage":"そのようなページは見付かりませんでした。", "ERRORcouldNotFindPage":"そのようなページは見付かりませんでした。",
"ERRORnoticeRemoved": "このクイートは削除されています。", "ERRORnoticeRemoved": "このクイップは削除されています。",
"ERRORnoContactWithServer": "サーバーへの接続を確立できませんでした。サーバーが混雑しているもしくはインターネットの接続に問題がある可能性があります。後でまたお試しください。", "ERRORnoContactWithServer": "サーバーへの接続を確立できませんでした。サーバーが混雑しているもしくはインターネットの接続に問題がある可能性があります。後でまたお試しください。",
"ERRORattachmentUploadFailed": "アップロードに失敗しました。ファイル形式がサポートされていないか、ファイルサイズが大きすぎます。", "ERRORattachmentUploadFailed": "アップロードに失敗しました。ファイル形式がサポートされていないか、ファイルサイズが大きすぎます。",
"hideRepliesToPeopleIDoNotFollow":"フォローしていない人からの返信を隠す", "hideRepliesToPeopleIDoNotFollow":"フォローしていない人からの返信を隠す",
"markAllNotificationsAsSeen":"全てのお知らせを既読にする", "markAllNotificationsAsSeen":"全てのお知らせを既読にする",
"notifyRepliesAndMentions":"@クイートと返信", "notifyRepliesAndMentions":"@クイップと返信",
"notifyFavs":"お気に入り", "notifyFavs":"お気に入り",
"notifyRepeats":"リクイート", "notifyRepeats":"リクイップ",
"notifyFollows":"新しいフォロワー", "notifyFollows":"新しいフォロワー",
"timelineOptions":"タイムラインの設定", "timelineOptions":"タイムラインの設定",
"ERRORfailedSavingYourSetting":"設定の保存に失敗しました。", "ERRORfailedSavingYourSetting":"設定の保存に失敗しました。",
"ERRORfailedMarkingAllNotificationsAsRead":"全てのお知らせを既読にすることに失敗しました。", "ERRORfailedMarkingAllNotificationsAsRead":"全てのお知らせを既読にすることに失敗しました。",
"newNotification": "{new-notice-count}件の新しいお知らせ", "newNotification": "{new-notice-count}件の新しいお知らせ",
"newNotifications": "{new-notice-count}件の新しいお知らせ", "newNotifications": "{new-notice-count}件の新しいお知らせ",
"thisIsANoticeFromABlockedUser":"警告: これはあなたがブロックしているユーザーからのクイートです。表示するにはクリックしてください。", "thisIsANoticeFromABlockedUser":"警告: これはあなたがブロックしているユーザーからのクイップです。表示するにはクリックしてください。",
"nicknamesListWithListName":"{nickname}のリスト: {list-name}", "nicknamesListWithListName":"{nickname}のリスト: {list-name}",
"myListWithListName":"マイリスト: {list-name}", "myListWithListName":"マイリスト: {list-name}",
"listMembers":"メンバー", "listMembers":"メンバー",
@ -164,20 +164,37 @@
"continueRant":"連投を続ける", "continueRant":"連投を続ける",
"hideEmbeddedInTimeline":"タイムライン上の埋め込まれたコンテンツを隠す", "hideEmbeddedInTimeline":"タイムライン上の埋め込まれたコンテンツを隠す",
"hideQuotesInTimeline":"タイムライン上の引用を隠す", "hideQuotesInTimeline":"タイムライン上の引用を隠す",
"userBlocks":"Accounts you're blocking", "userBlocks":"あなたがブロックしているユーザー",
"buttonBlocked":"Blocked", "buttonBlocked":"ブロック中",
"buttonUnblock":"Unblock", "buttonUnblock":"アンブロック",
"failedBlockingUser":"Failed to block the user.", "failedBlockingUser":"このユーザーをブロックするのに失敗しました。",
"failedUnblockingUser":"Failed to unblock the user.", "failedUnblockingUser":"このユーザーをブロックするのに失敗しました。",
"unblockUser": "Unblock {username}", "unblockUser": "{username} をアンブロックする",
"tooltipBlocksYou":"You are blocked from following {username}.", "tooltipBlocksYou":"ブロックされているため、 {username} をフォローできません。",
"silenced":"Silenced", "silenced":"サイレンス中",
"silencedPlural":"Silenced profiles", "silencedPlural":"サイレンスされているユーザー",
"silencedUsersOnThisInstance":"Silenced profiles on {site-title}", "silencedUsersOnThisInstance":"{site-title} でサイレンスされているユーザー",
"sandboxed":"Sandboxed", "sandboxed":"サンドボックス中",
"sandboxedPlural":"Sandboxed profiles", "sandboxedPlural":"サンドボックスされているユーザー",
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}", "sandboxedUsersOnThisInstance":"{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.", "silencedStreamDescription":"サイレンスされたユーザーはログインおよびクイップの投稿ができなくなり、そのユーザーの既に投稿されたクイップは非表示になります。ローカルユーザーにとっては復旧可能な削除のような状態で、リモートユーザーにとっては全サイトでブロックされているような状態になります。",
"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.", "sandboxedStreamDescription":"サンドボックスされたユーザーからのクイップは「パブリックタイムライン」および「関連ネットワーク全体」から除外されます。アンサンドボックスされたユーザーのサンドボックス期間中に投稿されたクイップはパブリックタイムラインに含まれません",
"onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow" "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}", "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.", "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.", "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", "startRant":"Start een tirade",
"continueRant":"Verolg de tirade", "continueRant":"Verolg de tirade",
"hideEmbeddedInTimeline":"Verberg ingebedde inhoud in deze tijdlijn", "hideEmbeddedInTimeline":"Verberg ingebedde inhoud in deze tijdlijn",
"hideQuotesInTimeline":"Verberg quotes in deze tijdlijn", "hideQuotesInTimeline":"Verberg citaten in deze tijdlijn",
"userBlocks":"Accounts die je blokkeert", "userBlocks":"Accounts die je blokkeert",
"buttonBlocked":"Geblokkeerd", "buttonBlocked":"Geblokkeerd",
"buttonUnblock":"Deblokkeer", "buttonUnblock":"Deblokkeer",
@ -171,13 +171,30 @@
"failedUnblockingUser":"Gefaald om de gebruiker te deblokkeren.", "failedUnblockingUser":"Gefaald om de gebruiker te deblokkeren.",
"unblockUser": "Deblokkeer {username}", "unblockUser": "Deblokkeer {username}",
"tooltipBlocksYou":"Je wordt geblokkeerd van het volgen van {username}.", "tooltipBlocksYou":"Je wordt geblokkeerd van het volgen van {username}.",
"silenced":"Silenced", "silenced":"Gedempt",
"silencedPlural":"Silenced profiles", "silencedPlural":"Gedempte profielen",
"silencedUsersOnThisInstance":"Silenced profiles on {site-title}", "silencedUsersOnThisInstance":"Gedempte profielen op {site-title}",
"sandboxed":"Sandboxed", "sandboxed":"Beperkt",
"sandboxedPlural":"Sandboxed profiles", "sandboxedPlural":"Beperkte profielen",
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}", "sandboxedUsersOnThisInstance":"Beperkte profielen op {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.", "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":"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.", "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":"Only show notifications from users I follow" "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}", "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.", "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.", "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", "loginSignIn": "Entrar",
"loginRememberMe": "Lembrar-me", "loginRememberMe": "Lembrar-me",
"loginForgotPassword": "Esqueceu sua senha?", "loginForgotPassword": "Esqueceu sua senha?",
"notices": "Mensagens", "notices": "Quips",
"followers": "Seguidores", "followers": "Seguidores",
"following": "Seguindo", "following": "Seguindo",
"groups": "Grupos", "groups": "Grupos",
"compose": "Escrever um novo Queet...", "compose": "Escrever um novo quip...",
"queetVerb": "Queetar", "queetVerb": "Enviar",
"queetsNounPlural": "Queets", "queetsNounPlural": "Quips",
"logout": "Sair", "logout": "Sair",
"languageSelected": "Idioma:", "languageSelected": "Idioma:",
"viewMyProfilePage": "Ver minha página de perfil", "viewMyProfilePage": "Ver minha página de perfil",
@ -22,17 +22,17 @@
"expandFullConversation": "Expandir toda a conversa", "expandFullConversation": "Expandir toda a conversa",
"replyVerb": "Responder", "replyVerb": "Responder",
"requeetVerb": "Requeetar", "requeetVerb": "Requeetar",
"favoriteVerb": "Favorito", "favoriteVerb": "Curtir",
"requeetedVerb": "Requeetado", "requeetedVerb": "Requipado",
"favoritedVerb": "Marcado como favorito", "favoritedVerb": "Curtida",
"replyTo": "Responder para", "replyTo": "Responder para",
"requeetedBy": "Requeetado por {requeeted-by}", "requeetedBy": "Requipado por {requeeted-by}",
"favoriteNoun": "Favorito", "favoriteNoun": "Curtida",
"favoritesNoun": "Favoritos", "favoritesNoun": "Curtidas",
"requeetNoun": "Requeet", "requeetNoun": "Requipar",
"requeetsNoun": "Requeets", "requeetsNoun": "Requips",
"newQueet": "{new-notice-count} novo Queet", "newQueet": "{new-notice-count} novo quip",
"newQueets": "{new-notice-count} novos Queets", "newQueets": "{new-notice-count} novos quips",
"longmonthsJanuary": "janeiro", "longmonthsJanuary": "janeiro",
"longmonthsFebruary": "fevereiro", "longmonthsFebruary": "fevereiro",
"longmonthsMars": "março", "longmonthsMars": "março",
@ -66,7 +66,7 @@
"shortDateFormatDate": "{day} de {month}", "shortDateFormatDate": "{day} de {month}",
"shortDateFormatDateAndY": "{day} de {month} de {year}", "shortDateFormatDateAndY": "{day} de {month} de {year}",
"now": "agora", "now": "agora",
"posting": "publicando", "posting": "postando",
"viewMoreInConvBefore": "← Ver mais na conversa", "viewMoreInConvBefore": "← Ver mais na conversa",
"viewMoreInConvAfter": "Ver mais na conversa →", "viewMoreInConvAfter": "Ver mais na conversa →",
"mentions": "Menções", "mentions": "Menções",
@ -76,9 +76,9 @@
"searchVerb": "Buscar", "searchVerb": "Buscar",
"deleteVerb": "Apagar", "deleteVerb": "Apagar",
"cancelVerb": "Cancelar", "cancelVerb": "Cancelar",
"deleteConfirmation": "Tem certeza de que deseja apagar este queet?", "deleteConfirmation": "Tem certeza de que deseja apagar este quip?",
"userExternalFollow": "Seguir remotamente", "userExternalFollow": "Seguir remotamente",
"userExternalFollowHelp": "Identificador da sua conta (ex.: usuario@rainbowdash.net)", "userExternalFollowHelp": "ID de sua conta (ex.: usuario@rainbowdash.net)",
"userFollow": "Seguir", "userFollow": "Seguir",
"userFollowing": "Seguindo", "userFollowing": "Seguindo",
"userUnfollow": "Deixar de seguir", "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>", "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", "editMyProfile": "Editar perfil",
"notifications": "Notificações", "notifications": "Notificações",
"xFavedYourQueet": "curtiu seu Queet", "xFavedYourQueet": "curtiu seu quip",
"xRepeatedYourQueet": "requeetou você", "xRepeatedYourQueet": "requipou você",
"xStartedFollowingYou": "seguiu você", "xStartedFollowingYou": "seguiu você",
"followsYou": "segue você", "followsYou": "segue você",
"FAQ": "FAQ", "FAQ": "FAQ",
@ -119,7 +119,7 @@
"showTerms": "Leia nossos Termos de Uso", "showTerms": "Leia nossos Termos de Uso",
"ellipsisMore": "Mais", "ellipsisMore": "Mais",
"blockUser": "Bloquear {username}", "blockUser": "Bloquear {username}",
"goToOriginalNotice": "Ir para mensagem original", "goToOriginalNotice": "Ir para quip original",
"goToTheUsersRemoteProfile": "Ir para o perfil do usuário", "goToTheUsersRemoteProfile": "Ir para o perfil do usuário",
"clickToDrag":"Clique para arrastar", "clickToDrag":"Clique para arrastar",
"keyboardShortcuts":"Atalhos do teclado", "keyboardShortcuts":"Atalhos do teclado",
@ -128,7 +128,7 @@
"tooltipBookmarkStream":"Adicione este fluxo aos favoritos", "tooltipBookmarkStream":"Adicione este fluxo aos favoritos",
"tooltipTopMenu":"Menu e configurações", "tooltipTopMenu":"Menu e configurações",
"tooltipAttachImage":"Anexar uma imagem", "tooltipAttachImage":"Anexar uma imagem",
"tooltipShortenUrls":"Encurtar todas as URLs no Queet", "tooltipShortenUrls":"Encurtar todas as URLs no quip",
"tooltipReloadStream":"Atualizar este fluxo", "tooltipReloadStream":"Atualizar este fluxo",
"tooltipRemoveBookmark":"Remover este favorito", "tooltipRemoveBookmark":"Remover este favorito",
"clearHistory":"Limpar histórico de navegação", "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", "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", "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.", "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!", "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.", "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", "hideRepliesToPeopleIDoNotFollow":"Ocultar respostas para pessoas que eu não sigo",
"markAllNotificationsAsSeen":"Marcar todas notificações como vistas", "markAllNotificationsAsSeen":"Marcar todas notificações como vistas",
"notifyRepliesAndMentions":"Menções e respostas", "notifyRepliesAndMentions":"Menções e respostas",
"notifyFavs":"Favoritos", "notifyFavs":"Curtidas",
"notifyRepeats":"Requeets", "notifyRepeats":"Requips",
"notifyFollows":"Novos seguidores", "notifyFollows":"Novos seguidores",
"timelineOptions":"Opções da linha do tempo", "timelineOptions":"Opções da linha do tempo",
"ERRORfailedSavingYourSetting":"Falha ao salvar suas configurações", "ERRORfailedSavingYourSetting":"Falha ao salvar suas configurações",
@ -171,13 +171,30 @@
"failedUnblockingUser":"Falha ao desbloquear usuário.", "failedUnblockingUser":"Falha ao desbloquear usuário.",
"unblockUser": "Desbloquear {username}", "unblockUser": "Desbloquear {username}",
"tooltipBlocksYou":"Você está impedido de seguir {username}.", "tooltipBlocksYou":"Você está impedido de seguir {username}.",
"silenced":"Silenced", "silenced":"Silenciado",
"silencedPlural":"Silenced profiles", "silencedPlural":"Perfis silenciados",
"silencedUsersOnThisInstance":"Silenced profiles on {site-title}", "silencedUsersOnThisInstance":"Perfis silenciados em {site-title}",
"sandboxed":"Sandboxed", "sandboxed":"Restringido",
"sandboxedPlural":"Sandboxed profiles", "sandboxedPlural":"Perfis restringidos",
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}", "sandboxedUsersOnThisInstance":"Perfis restringidos em {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.", "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 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.", "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":"Only show notifications from users I follow" "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}", "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.", "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.", "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}", "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.", "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.", "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", "continueRant":"Fortsätt harangen",
"hideEmbeddedInTimeline":"Dölj inbäddat innehåll i detta flöde", "hideEmbeddedInTimeline":"Dölj inbäddat innehåll i detta flöde",
"hideQuotesInTimeline":"Dölj citat i detta flöde", "hideQuotesInTimeline":"Dölj citat i detta flöde",
"userBlocks":"Konton du blockerar", "userBlocks":"Konton som du blockerar",
"buttonBlocked":"Blockerad", "buttonBlocked":"Blockerad",
"buttonUnblock":"Avblockera", "buttonUnblock":"Avblockera",
"failedBlockingUser":"Misslyckades med att blockera användaren.", "failedBlockingUser":"Misslyckades med att blockera användaren.",
@ -179,5 +179,22 @@
"sandboxedUsersOnThisInstance":"Användare i sandlådan på {site-title}", "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.", "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.", "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}", "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.", "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.", "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}", "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.", "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.", "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}", "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.", "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.", "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"
} }