Compare commits

..

33 Commits

Author SHA1 Message Date
Hannes Mannerheim
a36628edc7 Merge branch 'master' of git.gnu.io:h2p/Qvitter 2017-02-05 13:39:49 +01:00
Hannes Mannerheim
d4fa67cc8e merge from git.gnu.io 2016-12-30 13:48:54 +01:00
Hannes Mannerheim
51740e4d49 merge from git.gnu.io 2016-11-21 22:47:25 +01:00
Hannes Mannerheim
d7ab9cd72e Merge branch 'master' of git.gnu.io:h2p/Qvitter 2016-10-31 01:07:06 +01:00
Hannes Mannerheim
e5f22390dc merge from git.gnu.io 2016-03-10 13:53:08 +01:00
Hannes Mannerheim
e9df9b7bdb Merge branch 'master' of git.gnu.io:h2p/Qvitter 2016-03-05 16:54:26 +01:00
Hannes Mannerheim
05825ecc93 from git.gnu.io 2016-03-05 14:51:01 +01:00
Hannes Mannerheim
34b25e032e mute etc 2016-03-04 00:22:25 +01:00
Hannes Mannerheim
e6a8cad494 from git.gnu.io 2016-02-29 16:08:06 +01:00
Hannes Mannerheim
2570877580 update from git.gnu.io 2016-02-25 11:10:55 +01:00
Hannes Mannerheim
8dc071c955 favicons and fixes 2016-02-16 13:38:40 +01:00
Hannes Mannerheim
0e99f04c43 update from git.gnu.io 2016-02-16 11:54:47 +01:00
Hannes Mannerheim
f5acc4a386 german update 2016-02-12 14:56:59 +01:00
Hannes Mannerheim
3ab4b1cdb6 twitter cards and opengraph 2016-02-11 17:49:02 +01:00
Hannes Mannerheim
596b4b8e02 don't flash the no-javascript message while loading 2016-02-11 14:55:20 +01:00
Hannes Mannerheim
45b50d3387 turkish 2016-02-11 14:47:58 +01:00
Hannes Mannerheim
6f6a593984 fixes 2016-02-11 14:30:20 +01:00
Hannes Mannerheim
e1c8080e8f pt-br fixes 2016-02-10 14:18:26 +01:00
Hannes Mannerheim
b3eef26174 finnish finished 2016-02-09 20:22:12 +01:00
Hannes Mannerheim
a855c98834 pt-br fixes 2016-02-09 15:21:13 +01:00
Hannes Mannerheim
3037794b6d pt_br update 2016-02-08 11:13:10 +01:00
Hannes Mannerheim
cc5739918e spanish faq addition by @simsa01@quitter.se 2016-02-08 11:09:02 +01:00
Hannes Mannerheim
23ecdf2a07 nl update 2016-02-08 11:04:13 +01:00
Hannes Mannerheim
182ae843ca no > nb 2016-02-08 11:00:32 +01:00
Hannes Mannerheim
13256d2a66 spanish translation 2016-02-08 10:56:46 +01:00
Hannes Mannerheim
fabdad7dc7 terms addition 2016-02-07 14:37:44 +01:00
Hannes Mannerheim
7df7eb1aeb terms for logged in users 2016-02-07 14:17:37 +01:00
Hannes Mannerheim
2590528d63 xss fix, thx @chc4@quitter.se 2016-02-07 02:23:38 +01:00
Hannes Mannerheim
b4f45b8537 sort twkn by id, since we scroll using max_id 2016-02-04 13:52:16 +01:00
Hannes Mannerheim
077a5a04a2 Updated norwegian translation 2016-02-04 02:06:52 +01:00
Hannes Mannerheim
c01906055e blocking 2016-02-02 16:25:34 +01:00
Hannes Mannerheim
d247c08aeb set api format so client errors work 2016-02-01 18:22:41 +01:00
Hannes Mannerheim
4c0f42984c Updated norwegian translation 2016-01-31 02:22:18 +01:00
53 changed files with 5258 additions and 2257 deletions

View File

@ -131,7 +131,7 @@ class QvitterPlugin extends Plugin {
}
function onCheckSchema(): bool
function onCheckSchema()
{
$schema = Schema::get();
@ -151,7 +151,7 @@ class QvitterPlugin extends Plugin {
return true;
}
public function onBeforePluginCheckSchema(): bool
public function onBeforePluginCheckSchema()
{
QvitterNotification::beforeSchemaUpdate();
return true;
@ -160,10 +160,6 @@ class QvitterPlugin extends Plugin {
// route/reroute urls
public function onRouterInitialized($m)
{
$m->connect('api/qvitter/statuses/user_timeline.:format',
array('action' => 'ApiQvitterTimelineUser',
'format' => '(xml|json|rss|atom|as)'));
$m->connect(':nickname/mutes',
array('action' => 'qvitter',
'nickname' => Nickname::INPUT_FMT));
@ -375,10 +371,6 @@ class QvitterPlugin extends Plugin {
array('action' => 'shownotice'),
array('notice' => '[0-9]+'),
'qvitter');
URLMapperOverwrite::overwrite_variable($m, 'user/:id',
array('action' => 'userbyid'),
array('id' => '[0-9]+'),
'qvitter');
URLMapperOverwrite::overwrite_variable($m, 'conversation/:id',
array('action' => 'conversation'),
array('id' => '[0-9]+'),
@ -405,7 +397,6 @@ class QvitterPlugin extends Plugin {
case 'api/favorites.json':
case 'api/statuses/friends_timeline.json':
case 'api/statuses/user_timeline.json':
case 'api/qvitter/statuses/user_timeline.json':
// add logged in user's user array
if (common_logged_in() && !isset($_GET['screen_name']) && !isset($_GET['id'])) {
@ -418,17 +409,13 @@ class QvitterPlugin extends Plugin {
if(isset($_GET['screen_name'])) {
$user = User::getKV('nickname', $_GET['screen_name']);
if($user instanceof User) {
$profile = $user->getProfile();
}
}
elseif(isset($_GET['id'])) {
$profile = Profile::getKV('id', $_GET['id']);
$user = User::getKV('id', $_GET['id']);
}
if(isset($profile) && $profile instanceof Profile) {
header('Qvitter-User-Array: '.json_encode($this->qvitterTwitterUserArray($profile)));
if($user instanceof User) {
header('Qvitter-User-Array: '.json_encode($this->qvitterTwitterUserArray($user->getProfile())));
}
}
break;
@ -436,6 +423,16 @@ class QvitterPlugin extends Plugin {
}
/**
* Remove CSRF cookie on logout
*
*/
function onEndLogout($action) {
common_set_cookie('Qvitter-CSRF', '', 0);
return true;
}
/**
* Add script to default ui, to be able to toggle Qvitter with one click
@ -485,7 +482,7 @@ class QvitterPlugin extends Plugin {
* @return boolean hook return
*/
function onEndAccountSettingsNav($action): bool
function onEndAccountSettingsNav($action)
{
$action_name = $action->trimmed('action');
@ -507,7 +504,7 @@ class QvitterPlugin extends Plugin {
* @return boolean hook return
*/
function onEndAdminPanelNav($action): bool
function onEndAdminPanelNav($action)
{
$action_name = $action->trimmed('action');
@ -568,7 +565,7 @@ class QvitterPlugin extends Plugin {
$enclosure_o = $attachment->getEnclosure();
// Oembed
if(array_key_exists('Oembed', GNUsocial::getActiveModules())) {
if(array_key_exists('Oembed', StatusNet::getActivePlugins())) {
$oembed = File_oembed::getKV('file_id',$attachment->id);
if($oembed instanceof File_oembed) {
$oembed_html = str_replace('<!--//-->','',$oembed->html); // trash left of wordpress' javascript after htmLawed removed the tags
@ -675,8 +672,8 @@ class QvitterPlugin extends Plugin {
// if this attachment has an url this might be a notice url
if (isset($attachment['url'])) {
$noticeurl = common_path('notice/', GNUsocial::isHTTPS());
$instanceurl = common_path('', GNUsocial::isHTTPS());
$noticeurl = common_path('notice/', StatusNet::isHTTPS());
$instanceurl = common_path('', StatusNet::isHTTPS());
// remove protocol for the comparison below
$noticeurl_wo_protocol = preg_replace('(^https?://)', '', $noticeurl);
@ -829,7 +826,7 @@ class QvitterPlugin extends Plugin {
* @return boolean hook return
*/
function onTwitterUserArray($profile, &$twitter_user, $scoped): bool
function onTwitterUserArray($profile, &$twitter_user, $scoped)
{
$twitter_user['cover_photo'] = Profile_prefs::getConfigData($profile, 'qvitter', 'cover_photo');
@ -944,7 +941,7 @@ class QvitterPlugin extends Plugin {
/**
* Mark single notification as seen
*/
public static function markNotificationAsSeen($notice_id, $to_profile_id, $ntype)
public function markNotificationAsSeen($notice_id, $to_profile_id, $ntype)
{
$notification_to_mark_as_seen = QvitterNotification::pkeyGet(array(
'is_seen' => 0,
@ -964,7 +961,7 @@ class QvitterPlugin extends Plugin {
/**
* Remove likes in notification table on dislike
*/
public function onEndDisfavorNotice($profile, $notice): bool
public function onEndDisfavorNotice($profile, $notice)
{
$notif = new QvitterNotification();
$notif->from_profile_id = $profile->id;
@ -981,7 +978,7 @@ class QvitterPlugin extends Plugin {
*
* @return boolean hook flag
*/
function onStartNoticeDistribute($notice): bool {
function onStartNoticeDistribute($notice) {
assert($notice->id > 0); // since we removed tests below
@ -1061,7 +1058,7 @@ class QvitterPlugin extends Plugin {
*
* @return boolean hook flag
*/
public function onNoticeDeleteRelated($notice): bool
public function onNoticeDeleteRelated($notice)
{
$notif = new QvitterNotification();
@ -1093,7 +1090,7 @@ class QvitterPlugin extends Plugin {
$user_is_deleted = true;
}
if(!$user_is_deleted && class_exists('GNUsocial') && !array_key_exists('ActivityModeration', GNUsocial::getActiveModules())) {
if(!$user_is_deleted && class_exists('StatusNet') && !array_key_exists('ActivityModeration', StatusNet::getActivePlugins())) {
$rendered = sprintf(_m('<a href="%1$s">%2$s</a> deleted notice <a href="%3$s">{{%4$s}}</a>.'),
htmlspecialchars($profile->getUrl()),
htmlspecialchars($profile->getBestName()),
@ -1129,9 +1126,9 @@ class QvitterPlugin extends Plugin {
* @return boolean hook flag
*/
public function onEndHandleFeedEntry($activity): bool {
public function onEndHandleFeedEntry($activity) {
if($activity->verb == 'qvitter-delete-notice' && class_exists('GNUsocial') && !array_key_exists('ActivityModeration', GNUsocial::getActiveModules())) {
if($activity->verb == 'qvitter-delete-notice' && class_exists('StatusNet') && !array_key_exists('ActivityModeration', StatusNet::getActivePlugins())) {
$deleter_profile_uri = $activity->actor->id;
$deleted_notice_uri = $activity->objects[0]->objects[0]->content;
@ -1170,7 +1167,7 @@ class QvitterPlugin extends Plugin {
*
* @return boolean hook flag
*/
public function onEndSubscribe($subscriber, $other): bool
public function onEndSubscribe($subscriber, $other)
{
if(Subscription::exists($subscriber, $other)) {
$this->insertNotification($other->id, $subscriber->id, 'follow', 1);
@ -1178,7 +1175,7 @@ class QvitterPlugin extends Plugin {
return true;
}
public function onEndUnsubscribe($subscriber, $other): bool
public function onEndUnsubscribe($subscriber, $other)
{
if(!Subscription::exists($subscriber, $other)) {
$notif = new QvitterNotification();
@ -1196,7 +1193,7 @@ class QvitterPlugin extends Plugin {
*
* @return boolean hook flag
*/
public function onEndLoadDoc($title, &$output): bool
public function onEndLoadDoc($title, &$output)
{
if($title == 'faq') {
@ -1221,7 +1218,7 @@ class QvitterPlugin extends Plugin {
*
* @return boolean hook flag
*/
public function onStartPrimaryNav($action): bool
public function onStartPrimaryNav($action)
{
$action->menuItem(common_local_url('doc', array('title' => 'faq')),
@ -1241,7 +1238,7 @@ class QvitterPlugin extends Plugin {
*
* @return boolean hook flag
*/
public function onStartUserRegister($profile): bool
public function onStartUserRegister($profile)
{
if(is_array(self::settings("blocked_ips"))) {
@ -1260,7 +1257,7 @@ class QvitterPlugin extends Plugin {
*
* @return boolean hook flag
*/
public function onEndFindMentions($sender, $text, &$mentions): bool {
public function onEndFindMentions($sender, $text, &$mentions) {
// get the correct group profiles
if(isset($_POST['post_to_groups'])) {
@ -1298,7 +1295,25 @@ class QvitterPlugin extends Plugin {
*
* @return boolean hook flag
*/
public function onEndSetApiUser($user): bool {
public function onEndSetApiUser($user) {
// if we're POST:ing and are logged in using a regular session (i.e. not basic auth or oauth)
// check that we have a correct csrf cookie and header, otherwise deny
if(common_logged_in() && $_SERVER['REQUEST_METHOD'] === 'POST') {
if(!isset($_COOKIE['Qvitter-CSRF'])) {
throw new ServerException(_('Error setting user. Missing authorization cookie data. Please logout and login again.'));
}
$csrf_token = sha1(common_config('qvitter', 'appid').session_id());
if($_COOKIE['Qvitter-CSRF'] != $csrf_token) {
throw new ServerException(_('Error setting user. Invalid authorization cookie data. Please logout and login again.'));
}
if(!isset($_SERVER['HTTP_X_QVITTER_CSRF'])) {
throw new ServerException(_('Error setting user. Missing authorization header data. Please logout and login again.'));
}
if($_SERVER['HTTP_X_QVITTER_CSRF'] != $csrf_token) {
throw new ServerException(_('Error setting user. Invalid authorization header data. Please logout and login again.'));
}
}
// cleanup sessions, to allow for simultaneous http-requests,
// e.g. if posting a notice takes a very long time
@ -1369,7 +1384,7 @@ class QvitterPlugin extends Plugin {
}
function onPluginVersion(array &$versions): bool
function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Qvitter',
'version' => '5-alpha',
@ -1417,7 +1432,7 @@ class QvitterPlugin extends Plugin {
}
}
if($largest_avatar['size']>0) {
$origurl = common_path('', GNUsocial::isHTTPS()).$largest_avatar['name'];
$origurl = common_path('', StatusNet::isHTTPS()).$largest_avatar['name'];
} else {
$origurl = $twitter_user['profile_image_url_profile_size'];
}

View File

@ -37,7 +37,6 @@
· ·
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · */
require_once INSTALLDIR . '/lib/util/tempfile.php';
if (!defined('GNUSOCIAL')) {
exit(1);
@ -94,13 +93,12 @@ class ApiAccountUpdateProfileBannerAction extends ApiAuthAction
$this->img = str_replace(' ', '+', $this->img);
$this->img = base64_decode($this->img, true);
$fh = new TemporaryFile('gs-mediaupload');
fwrite($fh->getResource(), $this->img);
$fh = tmpfile();
fwrite($fh, $this->img);
unset($this->img);
fseek($fh, 0);
fflush($fh->getResouce());
$mediafile = MediaFile::fromFileInfo($fh, $this->scoped);
unset($fh);
$mediafile = MediaFile::fromFilehandle($fh, $this->scoped);
}
// maybe resize

View File

@ -46,23 +46,15 @@ class ApiExternalUserShowAction extends ApiPrivateAuthAction
{
parent::prepare($args);
$this->format = 'json';
$this->format = 'json';
$profileurl = urldecode($this->arg('profileurl'));
$nickname = urldecode($this->arg('nickname'));
$this->profile = new stdClass();
$this->profile->external = null;
$this->profile->external = null;
$this->profile->local = null;
// the user might not exist in our db yet, try to use the Ostatus plugin
// to get it in there
$validate = new Validate();
if ($validate->uri($profileurl)) {
$ostatus_profile = Ostatus_profile::ensureProfileURL($profileurl);
$local_profile = Profile::getKV('id',$ostatus_profile->profile_id);
}
// we can get urls of two types of urls (1) ://instance/nickname
// (2) ://instance/user/1234
//
@ -105,14 +97,10 @@ class ApiExternalUserShowAction extends ApiPrivateAuthAction
}
// case (1)
if(!isset($local_profile)) {
$local_profile = Profile::getKV('profileurl',$profileurl);
}
$local_profile = Profile::getKV('profileurl',$profileurl);
if($local_profile instanceof Profile) {
$this->profile->local = $this->twitterUserArray($local_profile);
// if profile url is not ending with nickname, this is probably a single user instance
if(!substr($local_profile->profileurl, -strlen($local_profile->nickname))===$local_profile->nickname) {
$external_instance_url = $local_profile->profileurl;
@ -129,6 +117,7 @@ class ApiExternalUserShowAction extends ApiPrivateAuthAction
}
$this->profile->external = $external_profile;
$this->profile->local = $this->twitterUserArray($local_profile);
return true;
}
@ -149,9 +138,13 @@ class ApiExternalUserShowAction extends ApiPrivateAuthAction
{
parent::handle();
$this->initDocument('json');
$this->showJsonObjects($this->profile);
$this->endDocument('json');
if(is_null($this->profile->local) && is_null($this->profile->external)) {
$this->clientError(_('List not found.'), 404);
} else {
$this->initDocument('json');
$this->showJsonObjects($this->profile);
$this->endDocument('json');
}
}
/**

View File

@ -74,7 +74,7 @@ class ApiQvitterMutesAction extends ApiPrivateAuthAction
{
parent::handle();
$this->target = $this->scoped;
$this->target = Profile::current();
if(!$this->target instanceof Profile) {
$this->clientError(_('You have to be logged in to view your mutes.'), 403);

View File

@ -74,8 +74,8 @@ class ApiQvitterOembedNoticeAction extends ApiAction
{
parent::handle();
$noticeurl = common_path('notice/', GNUsocial::isHTTPS());
$instanceurl = common_path('', GNUsocial::isHTTPS());
$noticeurl = common_path('notice/', StatusNet::isHTTPS());
$instanceurl = common_path('', StatusNet::isHTTPS());
// remove protocol for the comparison below
$noticeurl_wo_protocol = preg_replace('(^https?://)', '', $noticeurl);

View File

@ -1,181 +0,0 @@
<?php
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· Show timelines for both local and remote users ·
· ·
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· ·
· 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 ApiQvitterTimelineUserAction extends ApiBareAuthAction
{
var $notices = null;
var $next_id = null;
/**
* Take arguments for running
*
* @param array $args $_REQUEST args
*
* @return boolean success flag
*/
protected function prepare(array $args=array())
{
parent::prepare($args);
$this->target = $this->getTargetProfile($this->arg('id'));
if (!($this->target instanceof Profile)) {
// TRANS: Client error displayed requesting most recent notices for a non-existing user.
$this->clientError(_('No such user.'), 404);
}
// if (!$this->target->isLocal()) {
// $this->serverError(_('Remote user timelines are not available here yet.'), 501);
// }
$this->notices = $this->getNotices();
return true;
}
/**
* Handle the request
*
* Just show the notices
*
* @return void
*/
protected function handle()
{
parent::handle();
$this->showTimeline();
}
/**
* Show the timeline of notices
*
* @return void
*/
function showTimeline()
{
$this->showJsonTimeline($this->notices);
}
/**
* Get notices
*
* @return array notices
*/
function getNotices()
{
$notices = array();
$notice = $this->target->getNotices(($this->page-1) * $this->count,
$this->count + 1,
$this->since_id,
$this->max_id,
$this->scoped);
while ($notice->fetch()) {
if (count($notices) < $this->count) {
$notices[] = clone($notice);
} else {
$this->next_id = $notice->id;
break;
}
}
return $notices;
}
/**
* We expose AtomPub here, so non-GET/HEAD reqs must be read/write.
*
* @param array $args other arguments
*
* @return boolean true
*/
function isReadOnly($args)
{
return true;
}
/**
* When was this feed last modified?
*
* @return string datestamp of the latest notice in the stream
*/
function lastModified()
{
if (!empty($this->notices) && (count($this->notices) > 0)) {
return strtotime($this->notices[0]->created);
}
return null;
}
/**
* An entity tag for this stream
*
* Returns an Etag based on the action name, language, user ID, and
* timestamps of the first and last notice in the timeline
*
* @return string etag
*/
function etag()
{
if (!empty($this->notices) && (count($this->notices) > 0)) {
$last = count($this->notices) - 1;
return '"' . implode(
':',
array($this->arg('action'),
common_user_cache_hash($this->scoped),
common_language(),
$this->target->getID(),
strtotime($this->notices[0]->created),
strtotime($this->notices[$last]->created))
)
. '"';
}
return null;
}
}

View File

@ -37,7 +37,6 @@
· ·
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · */
require_once INSTALLDIR . '/lib/util/tempfile.php';
if (!defined('GNUSOCIAL')) {
exit(1);
@ -91,14 +90,15 @@ class ApiUpdateAvatarAction extends ApiAuthAction
$imagefile = null;
// write the image to a temporary file
$fh = new TemporaryFile('gs-mediaupload');
fwrite($fh->getResource(), $this->img);
$fh = tmpfile();
fwrite($fh, $this->img);
unset($this->img); // no need to keep it in memory
// seek back to position 0, so we don't read EOF directly
fseek($fh, 0);
// read the temporary file as an uploaded image, will store File object
fflush($fh->getResource());
$mediafile = MediaFile::fromFileInfo($fh, $this->scoped);
// Deletes the temporary file, if it was needed we stored it in fromFileInfo
unset($fh);
$mediafile = MediaFile::fromFilehandle($fh, $this->scoped);
// Deletes the temporary file, if it was needed we stored it in fromFilehandle
fclose($fh);
// Now try to get it as an ImageFile since it has some handy functions
$imagefile = ImageFile::fromFileObject($mediafile->fileRecord);

View File

@ -37,7 +37,6 @@
· ·
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · */
require_once INSTALLDIR . '/lib/util/tempfile.php';
if (!defined('GNUSOCIAL')) {
exit(1);
@ -92,15 +91,15 @@ class ApiUpdateBackgroundImageAction extends ApiAuthAction
$imagefile = null;
// put the image data in a temporary file
$fh = new TemporaryFile('gs-mediaupload')
fwrite($fh->getResource(), $this->img);
$fh = tmpfile();
fwrite($fh, $this->img);
unset($this->img);
fseek($fh, 0); // go to beginning just to be sure the content is read properly
// We get a MediaFile with a File object using the filehandle
fflush($fh->getResource());
$mediafile = MediaFile::fromFileInfo($fh, $this->scoped);
$mediafile = MediaFile::fromFilehandle($fh, $this->scoped);
// and can dispose of the temporary filehandle since we're certain we have a File on disk now
unset($fh);
fclose($fh);
$imagefile = ImageFile::fromFileObject($mediafile->fileRecord);
unset($mediafile); // No need to keep the MediaFile around anymore, everything we need is in ImageFile

View File

@ -45,17 +45,12 @@ class QvitterAction extends ApiAction
{
parent::prepare($args);
// redirect user/:id for local users to their nickname url
if(substr($_SERVER['REQUEST_URI'],0,6) == '/user/') {
$user_id = substr($_SERVER['REQUEST_URI'],6);
try {
$user = User::getKV('id', $user_id);
if($user instanceof User) {
$nickname = $user->nickname;
common_redirect(common_local_url('showstream',array('nickname'=>$nickname)), 303);
}
} catch (Exception $e) {
//
// if we're logged in but we have missing or incorrect csrf cookie, logout
if(common_logged_in()) {
$csrf_token = sha1(common_config('qvitter', 'appid').session_id());
if(!isset($_COOKIE['Qvitter-CSRF']) || $_COOKIE['Qvitter-CSRF'] != $csrf_token) {
header('Location: '.common_path('').'main/logout');
die();
}
}
@ -97,34 +92,16 @@ class QvitterAction extends ApiAction
$sitetitle = common_config('site','name');
$siterootdomain = common_config('site','server');
$qvitterpath = Plugin::staticPath('Qvitter', '');
$apiroot = common_path('api/', GNUsocial::isHTTPS());
$instanceurl = common_path('', GNUsocial::isHTTPS());
$favicon_path = QvitterPlugin::settings("favicon_path");
$attachmentconfig=common_config('attachments');
if(GNUsocial::isHTTPS() && $attachmentconfig['sslserver']){
$attachmentroot ='https://'.$attachmentconfig['sslserver'].$attachmentconfig['path'];
} elseif(!GNUsocial::isHTTPS() && $attachmentconfig['server']) {
$attachmentroot ='http://'.$attachmentconfig['server'].$attachmentconfig['path'];
} else {
$attachmentroot = $instanceurl.$attachmentconfig['path'];
}
$avatarconfig=common_config('avatar');
if($avatarconfig['server']) {
if(GNUsocial::isHTTPS() ){
$avatarroot ='https://'.$avatarconfig['server'].$avatarconfig['path'];
} else {
$avatarroot ='http://'.$avatarconfig['server'].$avatarconfig['path'];
}
} else {
$avatarroot = $instanceurl.$avatarconfig['path'];
}
$apiroot = common_path('api/', StatusNet::isHTTPS());
$attachmentroot = common_path('attachment/', StatusNet::isHTTPS());
$instanceurl = common_path('', StatusNet::isHTTPS());
$favicon_path = QvitterPlugin::settings("favicon_path");
// user's browser's language setting
$user_browser_language = 'en'; // use english if we can't find the browser language
if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
$user_browser_language = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
}
// user's browser's language setting
$user_browser_language = 'en'; // use english if we can't find the browser language
if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
$user_browser_language = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
}
common_set_returnto(''); // forget this
@ -206,7 +183,7 @@ class QvitterAction extends ApiAction
}
// maybe openid
if (array_key_exists('OpenID', GNUsocial::getActiveModules())) {
if (array_key_exists('OpenID', StatusNet::getActivePlugins())) {
print ' <link rel="openid2.provider" href="'.common_local_url('openidserver').'"/>'."\n";
print ' <link rel="openid2.local_id" href="'.$user->getProfile()->profileurl.'"/>'."\n";
print ' <link rel="openid2.server" href="'.common_local_url('openidserver').'"/>'."\n";
@ -246,7 +223,7 @@ class QvitterAction extends ApiAction
// oembed discovery for local notices, and twitter cards
if(substr($_SERVER['REQUEST_URI'],0,8) == '/notice/'
&& $this->arg('notice')
&& array_key_exists('Oembed', GNUsocial::getActiveModules())) {
&& array_key_exists('Oembed', StatusNet::getActivePlugins())) {
$notice = Notice::getKV('id', $this->arg('notice'));
if($notice instanceof Notice) {
@ -312,8 +289,10 @@ class QvitterAction extends ApiAction
}
}
?>
<script>
/*
@licstart The following is the entire license notice for the
JavaScript code in this page.
@ -371,7 +350,7 @@ class QvitterAction extends ApiAction
window.timeBetweenPolling = <?php print QvitterPlugin::settings("timebetweenpolling"); ?>;
window.apiRoot = <?php
$api_root = common_path("api/", GNUsocial::isHTTPS());
$api_root = common_path("api/", StatusNet::isHTTPS());
if($this_site_thinks_it_is_http_but_is_actually_https) {
$api_root = str_replace('http://','https://',$api_root);
}
@ -381,7 +360,6 @@ class QvitterAction extends ApiAction
window.fullUrlToThisQvitterApp = '<?php print $qvitterpath; ?>';
window.siteRootDomain = '<?php print $siterootdomain; ?>';
window.siteInstanceURL = '<?php print $instanceurl; ?>';
window.avatarServer= <?php print json_encode(common_config('avatar', 'server')) ?>;
window.defaultLinkColor = '<?php print QvitterPlugin::settings("defaultlinkcolor"); ?>';
window.defaultBackgroundColor = '<?php print QvitterPlugin::settings("defaultbackgroundcolor"); ?>';
window.siteBackground = '<?php print QvitterPlugin::settings("sitebackground"); ?>';
@ -389,16 +367,15 @@ class QvitterAction extends ApiAction
window.customWelcomeText = <?php print json_encode(QvitterPlugin::settings("customwelcometext")); ?>;
window.urlShortenerAPIURL = '<?php print QvitterPlugin::settings("urlshortenerapiurl"); ?>';
window.urlShortenerSignature = '<?php print QvitterPlugin::settings("urlshortenersignature"); ?>';
window.urlshortenerFormat = '<?php print QvitterPlugin::settings("urlshortenerformat"); ?>';
window.urlshortenerFormat = '<?php print QvitterPlugin::settings("urlshortenerformat"); ?>';
window.commonSessionToken = '<?php print common_session_token(); ?>';
window.siteMaxThumbnailSize = <?php print common_config('thumbnail', 'maxsize'); ?>;
window.siteAttachmentURLBase = '<?php print $attachmentroot; ?>';
window.siteAvatarURLBase = '<?php print $avatarroot; ?>';
window.siteEmail = '<?php print common_config('site', 'email'); ?>';
window.siteLicenseTitle = '<?php print common_config('license', 'title'); ?>';
window.siteLicenseURL = '<?php print common_config('license', 'url'); ?>';
window.customTermsOfUse = <?php print json_encode(QvitterPlugin::settings("customtermsofuse")); ?>;
window.siteLocalOnlyDefaultPath = <?php print (common_config('public', 'localonly') ? 'true' : 'false'); ?>;
window.siteLocalOnlyDefaultPath = <?php print (common_config('public', 'localonly') ? 'true' : 'false'); ?>;
<?php
// Get all topics in Qvitter's namespace in Profile_prefs
@ -430,9 +407,6 @@ class QvitterAction extends ApiAction
if($disable_keyboard_shortcuts == '1' || $disable_keyboard_shortcuts == 1) {
$disable_keyboard_shortcuts = true;
}
if (is_null($disable_keyboard_shortcuts)) {
$disable_keyboard_shortcuts = false;
}
} catch (Exception $e) {
//
}
@ -648,7 +622,7 @@ class QvitterAction extends ApiAction
<input type="hidden" id="token" name="token" value="<?php print common_session_token(); ?>">
<?php
if (array_key_exists('OpenID', GNUsocial::getActiveModules())) {
if (array_key_exists('OpenID', StatusNet::getActivePlugins())) {
print '<a href="'.$instanceurl.'main/openid" id="openid-login" title="OpenID" donthijack>OpenID</a>';
}
@ -721,7 +695,6 @@ class QvitterAction extends ApiAction
?>
</div>
<div class="menu-container" id="bookmark-container"></div>
<div id="find-someone"><input id="find-someone-input" placeholder="" data-tooltip=""/></div>
<div class="menu-container" id="history-container"></div>
<div id="clear-history"></div>
<div id="qvitter-notice"><?php print common_config('site', 'qvitternotice'); ?></div><?php
@ -845,8 +818,7 @@ class QvitterAction extends ApiAction
}
#user-footer-inner,
.inline-reply-queetbox,
#popup-faq #faq-container p.indent,
#find-someone {
#popup-faq #faq-container p.indent {
background-color:/*LIGHTERBACKGROUNDCOLORSTART*/rgb(205,230,239)/*LIGHTERBACKGROUNDCOLOREND*/;
}
#user-footer-inner,
@ -860,8 +832,7 @@ class QvitterAction extends ApiAction
.quoted-notice:hover,
.oembed-item:hover,
.stream-item:hover:not(.expanded) .quoted-notice:hover,
.stream-item:hover:not(.expanded) .oembed-item:hover,
#find-someone input:focus {
.stream-item:hover:not(.expanded) .oembed-item:hover {
border-color:/*LIGHTERBORDERCOLORSTART*/rgb(155,206,224)/*LIGHTERBORDERCOLOREND*/;
}
span.inline-reply-caret .caret-inner {

View File

@ -112,6 +112,17 @@ class QvitterLoginAction extends FormAction
common_rememberme($user);
}
// make sure we have a unique app id for this Qvitter installation in config
// to use for creating a csrf token
if(common_config('qvitter', 'appid') == false) {
Config::save('qvitter', 'appid', sha1(common_random_hexstr(16)));
}
// set csrf-cookie
$csrf_token = sha1(common_config('qvitter', 'appid').session_id());
common_set_cookie('Qvitter-CSRF', $csrf_token, time() + 60*60*24*30); // 1 month
$url = common_get_returnto();
if ($url) {

View File

@ -114,7 +114,7 @@ class NotificationStream
$all = array_merge($all, $notifications);
if (count($notifications) < count($ids)) {
if (count($notifications < count($ids))) {
$offset += $limit;
$limit -= count($notifications);
}

View File

@ -40,11 +40,8 @@
font-style: normal;
}
@import url(https://fonts.bunny.net/css?family=noto-sans-jp:400,500,700);
body {
font-family:"Helvetica Neue",Arial,"Noto Sans JP",sans-serif;
font-family:"Helvetica Neue",Arial,sans-serif;
}
html {
@ -242,8 +239,10 @@ body.rtl .discard-error-message {
}
#top-compose {
border: 1px solid rgba(0, 0, 0, 0.0);
border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: 4px;
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.15) inset;
box-sizing: border-box;
cursor: pointer;
display: block;
height: 32px;
@ -259,7 +258,7 @@ body.rtl .discard-error-message {
cursor: pointer;
display: block;
height: 32px;
margin-top: -4px;
margin-top: -3px;
position: absolute;
width: 32px;
z-index: 101;
@ -276,6 +275,7 @@ body.rtl .discard-error-message {
background-image: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.05));
}
.topbar {
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
left: 0;
position: fixed;
right: 0;
@ -506,7 +506,7 @@ body.rtl .dropdown-menu li:not(.dropdown-caret) {
font-weight: normal;
line-height: 18px;
overflow: hidden;
padding: 3px 12px 3px 22px;
padding: 3px 0 3px 22px;
position: relative;
text-decoration: none;
text-overflow: ellipsis;
@ -655,12 +655,13 @@ body.rtl .dropdown-menu .row-type-profile-prefs-toggle::before {
#site-notice {
color: #EEEEEE;
font-size: 20px;
font-size: 30px;
font-weight: 300;
line-height: 25px;
line-height: 32px;
margin: 0;
padding: 20px;
text-align: left;
text-shadow: 0 1px 2px #000000;
display:none;
}
@ -811,11 +812,17 @@ body.rtl #login-register-container {
}
#login-content,
.front-signup {
font-family: Arial,âsans-serif;
font-family: Arial,sans-serif;
font-size: 14px;
color: #333333;
line-height: 18px;
background: #ffffff; /* Old browsers */
background: -moz-linear-gradient(top, #ffffff 0px, #dddddd 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0px,#ffffff), color-stop(100%,#dddddd)); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, #ffffff 0px,#dddddd 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, #ffffff 0px,#dddddd 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(top, #ffffff 0px,#dddddd 100%); /* IE10+ */
background: linear-gradient(to bottom, #ffffff 0px,#dddddd 100%); /* W3C */
background-clip: border-box;
background-origin: padding-box;
background-size: auto auto;
@ -850,7 +857,7 @@ body.rtl #login-register-container {
.front-signup input,
#login-content input#nickname,
#login-content input#password {
font-family: Arial,âsans-serif;
font-family: Arial,sans-serif;
font-size: 13px;
color: #000000;
line-height: 15.4333px;
@ -967,7 +974,19 @@ button#submit-login {
font-weight: 700;
color: #FFFFFF;
line-height: 18px;
background: #019ad2;
background: -moz-linear-gradient(top, #33bcef 0%, #019ad2 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#33bcef), color-stop(100%,#019ad2)); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, #33bcef 0%,#019ad2 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, #33bcef 0%,#019ad2 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(top, #33bcef 0%,#019ad2 100%); /* IE10+ */
background: linear-gradient(to bottom, #33bcef 0%,#019ad2 100%); /* W3C */
background-repeat: repeat-x;
height: 30px;
margin-top: 0px;
margin-right: 0px;
@ -977,7 +996,18 @@ button#submit-login {
padding-right: 10px;
padding-bottom: 5px;
padding-left: 10px;
border: none;
border-top-width: 1px;
border-right-width: 1px;
border-bottom-width: 1px;
border-left-width: 1px;
border-top-color: #057ED0;
border-right-color: #057ED0;
border-bottom-color: #057ED0;
border-left-color: #057ED0;
border-top-style: solid;
border-right-style: solid;
border-bottom-style: solid;
border-left-style: solid;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
border-bottom-left-radius: 4px;
@ -994,11 +1024,23 @@ button#submit-login {
border-image-width: 1 1 1 1;
border-spacing: 0px 0px;
cursor: pointer;
transition-duration: 200ms;
text-shadow: rgba(0, 0, 0, 0.25) 0px -1px 1px;
}
button#submit-login:hover {
background: #0271bf;
background: -moz-linear-gradient(top, #2daddc 0%, #0271bf 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#2daddc), color-stop(100%,#0271bf)); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, #2daddc 0%,#0271bf 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, #2daddc 0%,#0271bf 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(top, #2daddc 0%,#0271bf 100%); /* IE10+ */
background: linear-gradient(to bottom, #2daddc 0%,#0271bf 100%); /* W3C */
background-repeat: repeat-x;
border-color:#096eb3;
color:#fff;
}
@ -1053,7 +1095,7 @@ button#submit-login:hover {
text-decoration:none;
}
#remember-forgot #openid-login:before {
content: " · ";
content: " · ";
font-size:11px;
}
#remember-forgot #openid-login:after {
@ -1105,9 +1147,16 @@ button#submit-login:hover {
}
.front-signup .signup-btn {
background: #FFAA22;
border: none;
background-color: #FD9A0F;
background: -moz-linear-gradient(top, rgba(254,233,79,1) 0px, rgba(253,154,15,1) 100%);
background: -webkit-gradient(linear, left top, left bottom, color-stop(0px,rgba(254,233,79,1)), color-stop(100%,rgba(253,154,15,1)));
background: -webkit-linear-gradient(top, rgba(254,233,79,1) 0px,rgba(253,154,15,1) 100%);
background: -o-linear-gradient(top, rgba(254,233,79,1) 0px,rgba(253,154,15,1) 100%);
background: -ms-linear-gradient(top, rgba(254,233,79,1) 0px,rgba(253,154,15,1) 100%);
background: linear-gradient(to bottom, rgba(254,233,79,1) 0px,rgba(253,154,15,1) 100%);
border: 1px solid #ffaa22;
border-radius: 4px;
box-shadow: 0 1px 0 #ffffff;
color: #333333;
cursor: pointer;
display: inline-block;
@ -1120,10 +1169,17 @@ button#submit-login:hover {
padding-right: 12px;
position: relative;
right: 12px;
transition-duration: 200ms;
text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
}
.front-signup .signup-btn:hover, .front-signup .signup-btn:focus {
background: #EC8B11;
background-color: #FD9512;
background: -moz-linear-gradient(top, rgba(254,220,77,1) 0px, rgba(253,149,18,1) 100%);
background: -webkit-gradient(linear, left top, left bottom, color-stop(0px,rgba(254,220,77,1)), color-stop(100%,rgba(253,149,18,1)));
background: -webkit-linear-gradient(top, rgba(254,220,77,1) 0px,rgba(253,149,18,1) 100%);
background: -o-linear-gradient(top, rgba(254,220,77,1) 0px,rgba(253,149,18,1) 100%);
background: -ms-linear-gradient(top, rgba(254,220,77,1) 0px,rgba(253,149,18,1) 100%);
background: linear-gradient(to bottom, rgba(254,220,77,1) 0px,rgba(253,149,18,1) 100%);
border-color: #EC8B11;
}
@ -1212,7 +1268,7 @@ button#submit-login:hover {
#page-container {
width:890px;
padding:17px 14px 0 14px;
background-color:rgba(0,0,0,0.5);
background-color:rgba(0,0,0,0.2);
margin-left:-459px;
opacity:0;
}
@ -1285,8 +1341,8 @@ body.rtl #footer-spinner-container {
position: relative;
background-color: #F9F9F9;
border-top: 1px solid #E8E8E8;
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25) inset;
font-size: 14px;
transition-duration: 200ms;
}
.menu-container a:first-child {
border-top:0 none;
@ -1301,47 +1357,6 @@ body.rtl #footer-spinner-container {
top: 9px;
width: 12px;
}
#find-someone {
border: 1px solid rgba(0, 0, 0, 0.1);
text-shadow: 0 1px 0 #FFFFFF;
background-clip: padding-box;
border-radius: 6px;
line-height: 16px;
margin-bottom: 10px;
overflow:hidden;
position: relative;
padding-top: 10px;
padding-right: 12px;
padding-bottom: 10px;
padding-left: 12px;
background-color: #F9F9F9;
}
#find-someone input {
padding: 6px 8px 5px 8px;
position: relative;
border-radius: 3px;
border: 1px solid #ccc;
width: 248px;
font-size: 13px;
color:#333;
line-height: 18px;
background-color: #fff;
margin:0;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05) inset, 0 1px 0 rgba(255, 255, 255, 0.075);
outline-color: #aaa;
display: block;
outline: none;
}
#find-someone input[disabled="disabled"] {
background-color: #eee;
color:#aaa;
}
#bookmark-container a:hover .chev-right {
background-position:-18px -508px;
}
@ -1849,7 +1864,6 @@ body.rtl .profile-card.user-muted .user-menu-cog::after,
list-style-image: none;
list-style-position: outside;
list-style-type: none;
transition-duration: 200ms;
height:auto;
position:relative;
}
@ -2380,7 +2394,7 @@ body.rtl .queet.rtl .expanded-content {
font-style:italic;
}
.oembed-item-provider-url:not(:empty)::before {
content:' · ';
content:' · ';
}
.oembed-item-header,
.oembed-item-body,
@ -2848,7 +2862,7 @@ body.rtl .view-more-container-bottom { direction:rtl; }
text-decoration: underline;
}
.stream-item-header .created-at:before {
content: "·";
content: "·";
display: inline-block;
margin-left: 4px;
}
@ -3028,7 +3042,6 @@ ul.queet-actions > li .icon:before {
text-align: center;
vertical-align:text-top;
width:21px;
transition-duration: 200ms;
}
.stream-item.temp-post ul.queet-actions > li .icon:before {
color:rgba(0,0,0,0.05);
@ -3217,7 +3230,6 @@ ul.queet-actions > li .icon.is-mine:before {
top: 0;
width: 30px;
outline:none;
transition-duration: 200ms;
}
.queet.rtl .ostatus-link {
right:auto;
@ -4008,8 +4020,9 @@ body.rtl .queet-box-extras {
font-weight: 700;
color: #FFFFFF;
line-height: 16px;
border: 1px solid rgba(0, 0, 0, 0.0);
border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: 4px;
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.15) inset;
box-sizing: border-box;
margin-top: 0px;
margin-right: 0px;
@ -4027,7 +4040,7 @@ body.rtl .queet-box-extras {
border-image-source: none;
border-image-width: 1 1 1 1;
cursor: pointer;
transition-duration: 200ms;
text-shadow: rgba(0, 0, 0, 0.25) 0px -1px 1px;
}
button.signup-btn.disabled:hover,
button.signup-btn.disabled:focus,
@ -4045,7 +4058,7 @@ button.signup-btn.disabled {
cursor: default;
}
.queet-toolbar button.enabled:hover {
background: #005D7F;
background-image: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.05));
}
#settingslink .dropdown-toggle {
@ -4083,27 +4096,6 @@ div.nav-session {
width: 588px;
}
.profile-card.local-user > .ostatus-link,
.profile-card.local-user .username .screen-name-with-server,
.profile-card.remote-user .username .screen-name,
.profile-card.remote-user ul.stats {
display:none;
}
.profile-card .remote-user-info {
background-color: pink;
color: #333;
text-shadow: none;
border: 10px solid #fff;
padding: 10px;
}
.profile-card .remote-user-info a {
text-decoration: underline;
color:#333;
}
.hover-card .profile-card .remote-user-info {
display:none;
}
.hover-card .profile-card {
width:290px;
margin-bottom:0;
@ -4361,7 +4353,7 @@ div.nav-session {
float:left;
}
.profile-banner-footer ul.stats li a {
padding: 0 9px 8px 12px;
padding: 0 15px 8px 12px;
}
.hover-card .profile-banner-footer ul.stats li a {
padding-bottom: 5px;
@ -4401,8 +4393,9 @@ div.clearfix {
font-weight: 700;
color: #333;
line-height: 16px;
border: 1px solid rgba(0, 0, 0, 0);
border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: 4px;
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.15) inset;
box-sizing: border-box;
margin-top: 0px;
margin-right: 0px;
@ -4420,21 +4413,16 @@ div.clearfix {
border-image-source: none;
border-image-width: 1 1 1 1;
cursor: pointer;
transition-duration: 200ms;
text-shadow: rgba(0, 0, 0, 0.15) 0px -1px 1px;
}
.qvitter-follow-button,
.edit-profile-button,
.abort-edit-profile-button,
.member-button {
background-color:#e2e2e2;
text-shadow: rgba(255, 255, 255, 0.15) 0px -1px 1px;
color:#333;
}
.member-button:not(.disabled):not(.member):hover,
.qvitter-follow-button:not(.disabled):not(.following):hover,
.edit-profile-button:hover,
.abort-edit-profile-button:hover {
background-color:#c9c9c9;
}
.external-member-button.disabled,
.member-button.disabled,
.external-follow-button.disabled,
@ -4451,6 +4439,17 @@ div.clearfix {
.qvitter-follow-button.disabled i {
opacity:0.2;
}
.external-member-button:not(.disabled):not(.member):hover,
.member-button:not(.disabled):not(.member):hover,
.external-follow-button:not(.disabled):not(.following):hover,
.qvitter-follow-button:not(.disabled):not(.following):hover,
.edit-profile-button:hover,
.abort-edit-profile-button:hover,
button.shorten:not(.disabled):hover,
.save-profile-button:not(.disabled):hover,
.crop-and-save-button:not(.disabled):hover {
background-image: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.05));
}
.external-member-button:not(.disabled):not(.member):active,
.member-button:not(.disabled):not(.member):active,
.external-follow-button:not(.disabled):not(.following):active,
@ -4673,7 +4672,6 @@ body.rtl #feed-header-inner .loader {
top:5px;
opacity:0.5;
cursor:pointer;
transition-duration: 200ms;
}
.reload-stream:hover {
opacity:1;
@ -5011,7 +5009,7 @@ body.rtl .modal-footer button {
box-shadow: 0 1px 0 #EEEEEE inset, 0 1px 0 #FFFFFF;
color: #000000;
display: block;
font-family: Arial,âsans-serif;
font-family: Arial,sans-serif;
font-size: 13px;
height: 20px;
line-height: 15.4333px;
@ -5362,8 +5360,11 @@ content:"\f068";
}
#popup-shortcuts #shortcuts-container span.shortcut {
background-color: #eee;
background-image: linear-gradient(#fff, #eee);
background-repeat: repeat-x;
border: 1px solid #ccc;
border-radius: 3px;
box-shadow: 0 1px 0 #fff inset, 0 0.5px 0 #ccc;
color: #666;
display: inline-block;
font-size: 12px;
@ -5671,6 +5672,11 @@ body.rtl #feed-header-inner h2 {
}
@media (max-width: 910px) {
body {
background:none !important;
}
.upload-background-image {
display:none;
}
@ -5680,12 +5686,7 @@ body.rtl #feed-header-inner h2 {
}
.topbar .global-nav:before {
top: 8px;
margin-left: -40px;
background-position: 0 0;
width: 83px;
height: 34px;
border-radius: 10px;
background:none !important;
}
#site-notice,
@ -5701,7 +5702,7 @@ body.rtl #feed-header-inner h2 {
.language-dropdown {
width:170px;
right:50%;
margin-right:-95px;
margin-right:-85px;
margin-top:5px;
}
@ -5722,7 +5723,7 @@ body.rtl #feed-header-inner h2 {
height:35px;
}
#page-container {
margin-top:59px;
margin-top:69px;
background-color:transparent;
}
@ -5761,7 +5762,7 @@ body.rtl #feed-header-inner h2 {
outline: 0 none;
padding: 6px 27px 6px 12px;
position: fixed;
right: 45px;
right: 60px;
top: 0;
transition: all 0.2s ease-in-out 0s;
width: 60px;
@ -5805,16 +5806,16 @@ body.rtl #feed-header-inner h2 {
#top-compose {
border: 2px solid #fff;
border: 3px solid #fff;
box-shadow: none;
cursor: pointer;
display: block;
height: 35px;
height: 41px;
margin: 0;
position: fixed;
right: 6px;
top: 5px;
width: 35px;
width: 41px;
z-index: 100;
}
#top-compose.hidden {
@ -5822,7 +5823,7 @@ body.rtl #feed-header-inner h2 {
}
#top-compose:before {
font-size:25px;
line-height: 44px;
line-height: 41px;
padding-left: 2px;
}
@ -5949,7 +5950,7 @@ body.rtl #feed-header-inner h2 {
}
body {
background-color:#fff !important;
background-color:#000 !important;
}
#logo {
display:none;
@ -6023,7 +6024,7 @@ body.rtl #feed-header-inner h2 {
}
.menu-container {
margin:0;
height:47px;
height:59px;
border:0 none !important;
border-radius:0 0 0 0 !important;
box-shadow: 0 25px 55px 0 rgba(255, 255, 255, 0.5) inset;
@ -6046,7 +6047,7 @@ body.rtl #feed-header-inner h2 {
float:left;
font-size:0;
color:transparent;
height:47px;
height:55px;
padding:0 !important;
margin:0;
border-radius:0 0 0 0 !important;
@ -6062,7 +6063,7 @@ body.rtl #feed-header-inner h2 {
border:0 none !important;
}
.menu-container a:not(.current) {
height:47px;
height:63px;
}
.menu-container a:after,
.menu-container a.current:after {
@ -6082,7 +6083,7 @@ body.rtl #feed-header-inner h2 {
left: 50%;
margin-left: -35px;
width: 70px;
height: 47px;
height: 55px;
background-size: 500px 1329px;
background-color:#ccc;
}
@ -6398,4 +6399,4 @@ body.rtl #feed-header-inner h2 {
}
}

View File

@ -1,16 +0,0 @@
<h3>Действия</h3>
<p><span class="shortcut">n</span><span class="description">Новый квит</span></p>
<p><span class="shortcut">f</span><span class="description">Добавить в избранное</span></p>
<p><span class="shortcut">r</span><span class="description">Ответить</span></p>
<p><span class="shortcut">t</span><span class="description">Реквит</span></p>
<p><span class="shortcut">Enter</span><span class="description">Раскрыть квит</span></p>
<p><span class="shortcut">Ctrl</span><span class="shortcut">Enter</span>или <span class="shortcut">Cmd ⌘</span><span class="shortcut">Enter</span><span class="description">Опубликовать квит</span></p>
<p><span class="shortcut">Esc</span><span class="description">Закрыть все раскрытые квиты</span></p>
<h3>Навигация</h3>
<p><span class="shortcut">?</span><span class="description">Это меню</span></p>
<p><span class="shortcut">j</span><span class="description">Следующий квит</span></p>
<p><span class="shortcut">k</span><span class="description">Предыдущий квит</span></p>
<h3>Отключить</h3>
<p>Отключить горячие клавиши можно в <a href="{instance-url-with-protocol}settings/qvitter">настройках</a>.</p>

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 48 KiB

View File

@ -334,6 +334,9 @@ function postUpdateBookmarks(newBookmarks) {
$.ajax({ url: window.apiRoot + 'qvitter/update_bookmarks.json',
cache: false,
type: "POST",
beforeSend: function (xhr) {
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
},
data: {
bookmarks: bookmarksString
},
@ -358,6 +361,9 @@ function postNewLinkColor(newLinkColor) {
$.ajax({ url: window.apiRoot + 'qvitter/update_link_color.json',
cache: false,
type: "POST",
beforeSend: function (xhr) {
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
},
data: {
linkcolor: newLinkColor
},
@ -383,6 +389,9 @@ function postNewBackgroundColor(newBackgroundColor) {
$.ajax({ url: window.apiRoot + 'qvitter/update_background_color.json',
cache: false,
type: "POST",
beforeSend: function (xhr) {
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
},
data: {
backgroundcolor: newBackgroundColor
},
@ -412,6 +421,9 @@ function postSetProfilePref(namespace, topic, data, callback) {
$.ajax({ url: window.apiRoot + 'qvitter/set_profile_pref.json',
cache: false,
type: "POST",
beforeSend: function (xhr) {
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
},
data: {
namespace: namespace,
topic: topic,
@ -448,6 +460,9 @@ function APIFollowOrUnfollowUser(followOrUnfollow,user_id,this_element,actionOnS
$.ajax({ url: window.apiRoot + postRequest,
cache: false,
type: "POST",
beforeSend: function (xhr) {
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
},
data: {
user_id: user_id
},
@ -485,6 +500,9 @@ function APIBlockOrUnblockUser(blockOrUnblock,user_id,actionOnSuccess) {
$.ajax({ url: window.apiRoot + postRequest,
cache: false,
type: "POST",
beforeSend: function (xhr) {
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
},
data: {
id: user_id
},
@ -515,6 +533,9 @@ function APISandboxCreateOrDestroy(createOrDestroy,userId,actionOnSuccess) {
$.ajax({ url: window.apiRoot + 'qvitter/sandbox/' + createOrDestroy + '.json',
cache: false,
type: "POST",
beforeSend: function (xhr) {
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
},
data: {
id: userId
},
@ -545,6 +566,9 @@ function APISilenceCreateOrDestroy(createOrDestroy,userId,actionOnSuccess) {
$.ajax({ url: window.apiRoot + 'qvitter/silence/' + createOrDestroy + '.json',
cache: false,
type: "POST",
beforeSend: function (xhr) {
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
},
data: {
id: userId
},
@ -577,6 +601,9 @@ function APIJoinOrLeaveGroup(joinOrLeave,group_id,this_element,actionOnSuccess)
$.ajax({ url: window.apiRoot + 'statusnet/groups/' + joinOrLeave + '.json',
cache: false,
type: "POST",
beforeSend: function (xhr) {
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
},
data: {
id: group_id
},
@ -608,6 +635,9 @@ function postQueetToAPI(queetText_txt, in_reply_to_status_id, postToGroups, acti
$.ajax({ url: window.apiRoot + 'qvitter/statuses/update.json',
cache: false,
type: "POST",
beforeSend: function (xhr) {
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
},
data: {
status: queetText_txt,
source: 'Qvitter',
@ -643,6 +673,9 @@ function postActionToAPI(action, actionOnSuccess) {
$.ajax({ url: window.apiRoot + action,
cache: false,
type: "POST",
beforeSend: function (xhr) {
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
},
data: {
source: 'Qvitter'
},

View File

@ -394,18 +394,6 @@ function buildProfileCard(data) {
if(isUserMuted(data.id)) {
is_muted = ' user-muted';
}
// local or remote user?
var local_or_remote = '';
var remote_user_info = '';
var serverUrl = guessInstanceUrlWithoutProtocolFromProfileUrlAndNickname(data.statusnet_profile_url, data.screen_name);
data.screenNameWithServer = '@' + data.screen_name + '@' + serverUrl;
if(data.is_local !== true) {
remote_user_info = '<div class="remote-user-info">' + window.sL.thisIsARemoteUser.replace('{remote-profile-url}',data.statusnet_profile_url) + '</div>'
local_or_remote = ' remote-user';
}
else {
local_or_remote = ' local-user';
}
var followButton = '';
@ -432,9 +420,8 @@ function buildProfileCard(data) {
// full card html
var profileCardHtml = '\
<div class="profile-card' + is_me + logged_in + is_muted + local_or_remote + '">\
<div class="profile-card' + is_me + logged_in + is_muted + '">\
<script class="profile-json" type="application/json">' + JSON.stringify(data) + '</script>\
<a href="' + data.statusnet_profile_url + '" class="ostatus-link" data-tooltip="' + window.sL.goToTheUsersRemoteProfile + '" donthijack></a>\
<div class="profile-header-inner' + is_silenced + is_sandboxed + '" style="' + coverPhotoHtml + '" data-user-id="' + data.id + '" data-screen-name="' + data.screen_name + '">\
<div class="profile-header-inner-overlay"></div>\
<a class="profile-picture" href="' + data.profile_image_url_original + '">\
@ -445,7 +432,6 @@ function buildProfileCard(data) {
<span class="silenced-flag" data-tooltip="' + window.sL.silencedStreamDescription + '">' + window.sL.silenced + '</span>\
<span class="sandboxed-flag" data-tooltip="' + window.sL.sandboxedStreamDescription + '">' + window.sL.sandboxed + '</span>\
<h2 class="username">\
<span class="screen-name-with-server" data-user-id="' + data.id + '">' + data.screenNameWithServer + '</span>\
<span class="screen-name" data-user-id="' + data.id + '">@' + data.screen_name + '</span>\
' + follows_you + '\
</h2>\
@ -460,7 +446,6 @@ function buildProfileCard(data) {
</div>\
</div>\
<div class="profile-banner-footer">\
' + remote_user_info + '\
<ul class="stats">\
<li class="tweet-num"><a href="' + data.statusnet_profile_url + '" class="tweet-stats">' + window.sL.notices + '<strong>' + data.statuses_count + '</strong></a></li>\
<li class="following-num"><a href="' + data.statusnet_profile_url + '/subscriptions" class="following-stats">' + window.sL.following + '<strong>' + data.friends_count + '</strong></a></li>\
@ -488,6 +473,7 @@ function buildProfileCard(data) {
· · · · · · · · · */
function buildExternalProfileCard(data) {
// follows me?
var follows_you = '';
if(data.local !== null && data.local.follows_you === true && window.loggedIn.id != data.local.id) {
@ -496,7 +482,7 @@ function buildExternalProfileCard(data) {
// follow button
var followButton = '';
if(window.loggedIn !== false && typeof data.local != 'undefined' && data.local) {
if(window.loggedIn !== false && typeof data.local != 'undefined' && data.local !== null) {
var followButton = buildFollowBlockbutton(data.local);
}
@ -578,7 +564,7 @@ function buildExternalProfileCard(data) {
<span class="sandboxed-flag" data-tooltip="' + window.sL.sandboxedStreamDescription + '">' + window.sL.sandboxed + '</span>\
<h2 class="username">\
<span class="screen-name">' + data.screenNameWithServer + '</span>\
<span class="ostatus-link" data-tooltip="' + window.sL.goToTheUsersRemoteProfile + '" donthijack>' + window.sL.goToTheUsersRemoteProfile + '</span>\
<span class="ostatus-link" data-tooltip="' + window.sL.goToTheUsersRemoteProfile + '">' + window.sL.goToTheUsersRemoteProfile + '</span>\
' + follows_you + '\
</h2>\
</a>\
@ -959,13 +945,6 @@ function setNewCurrentStream(streamObject,setLocation,fallbackId,actionOnSuccess
}
}
// local for local users requested by id, we want to go to the nickname-url instead
else if(streamObject.name == 'profile by id' && userArray && userArray.is_local === true) {
removeHistoryContainerItemByHref(window.siteInstanceURL + 'user/' + userArray.id);
setNewCurrentStream(pathToStreamRouter('/' + userArray.screen_name),true,false,actionOnSuccess);
}
// getting stream failed, and we don't have a fallback id
else if(queet_data === false) {
@ -1035,25 +1014,9 @@ function setNewCurrentStream(streamObject,setLocation,fallbackId,actionOnSuccess
setUrlFromStream(streamObject);
}
// add this stream to the history menu
addStreamToHistoryMenuAndMarkAsCurrent(streamObject);
// profile card from user array
if(userArray) {
addProfileCardToDOM(buildProfileCard(userArray));
// set remote users username in the browsing history container
// (because stream-router can't know username from the URL, that only have id:s)
if(userArray.is_local !== true) {
var serverUrl = guessInstanceUrlWithoutProtocolFromProfileUrlAndNickname(userArray.statusnet_profile_url, userArray.screen_name);
var screenNameWithServer = '@' + userArray.screen_name + '@' + serverUrl;
updateHistoryContainerItemByHref(window.siteInstanceURL + 'user/' + userArray.id, screenNameWithServer);
updateHistoryContainerItemByHref(userArray.statusnet_profile_url, screenNameWithServer);
}
// if we for some reason have visited a local user's profile by id, adjust the history container
else {
updateHistoryContainerItemByHref(window.siteInstanceURL + 'user/' + userArray.id, userArray.screen_name);
}
}
// remove any trailing profile cards
else {
@ -1077,6 +1040,9 @@ function setNewCurrentStream(streamObject,setLocation,fallbackId,actionOnSuccess
window.clearInterval(checkForNewQueetsInterval);
checkForNewQueetsInterval=window.setInterval(function(){checkForNewQueets()},window.timeBetweenPolling);
// add this stream to the history menu
addStreamToHistoryMenuAndMarkAsCurrent(streamObject);
remove_spinner();
// some streams, e.g. /statuses/show/1234.json is not enclosed in an array, make sure it is
@ -1464,7 +1430,7 @@ function queetBoxPopUpHtml() {
}
var startText = encodeURIComponent(window.sL.compose);
return '<div class="inline-reply-queetbox"><div id="pop-up-queet-box" class="queet-box queet-box-syntax" data-start-text="' + startText + '" data-cached-text="' + cachedText + '">' + decodeURIComponent(startText) + '</div><div class="syntax-middle"></div><div class="syntax-two" contenteditable="true"></div><div class="mentions-suggestions"></div><div class="queet-toolbar toolbar-reply"><div class="queet-box-extras"><button data-tooltip="' + window.sL.tooltipAttachFile + '" class="upload-image"></button><button data-tooltip="' + window.sL.tooltipShortenUrls + '" class="shorten disabled">URL</button></div><div class="queet-button"><span class="queet-counter"></span><button>' + window.sL.queetVerb + '</button></div></div></div>';
return '<div class="inline-reply-queetbox"><div id="pop-up-queet-box" class="queet-box queet-box-syntax" data-start-text="' + startText + '" data-cached-text="' + cachedText + '">' + decodeURIComponent(startText) + '</div><div class="syntax-middle"></div><div class="syntax-two" contenteditable="true"></div><div class="mentions-suggestions"></div><div class="queet-toolbar toolbar-reply"><div class="queet-box-extras"><button data-tooltip="' + window.sL.tooltipAttachImage + '" class="upload-image"></button><button data-tooltip="' + window.sL.tooltipShortenUrls + '" class="shorten disabled">URL</button></div><div class="queet-button"><span class="queet-counter"></span><button>' + window.sL.queetVerb + '</button></div></div></div>';
}
@ -1549,7 +1515,7 @@ function replyFormHtml(streamItem,qid) {
startText = encodeURIComponent(startText);
repliesText = encodeURIComponent(repliesText);
return '<div class="inline-reply-queetbox"><span class="inline-reply-caret"><span class="caret-inner"></span></span><img class="reply-avatar" src="' + $('#user-avatar').attr('src') + '" /><div class="queet-box queet-box-syntax" id="queet-box-' + qid + '" data-start-text="' + startText + '" data-replies-text="' + repliesText + '" data-cached-text="' + cachedText + '">' + decodeURIComponent(startText) + '</div><div class="syntax-middle"></div><div class="syntax-two" contenteditable="true"></div><div class="mentions-suggestions"></div><div class="queet-toolbar toolbar-reply"><div class="queet-box-extras"><button data-tooltip="' + window.sL.tooltipAttachFile + '" class="upload-image"></button><button data-tooltip="' + window.sL.tooltipShortenUrls + '" class="shorten disabled">URL</button></div><div class="queet-button"><span class="queet-counter"></span><button>' + window.sL.queetVerb + '</button></div></div></div>';
return '<div class="inline-reply-queetbox"><span class="inline-reply-caret"><span class="caret-inner"></span></span><img class="reply-avatar" src="' + $('#user-avatar').attr('src') + '" /><div class="queet-box queet-box-syntax" id="queet-box-' + qid + '" data-start-text="' + startText + '" data-replies-text="' + repliesText + '" data-cached-text="' + cachedText + '">' + decodeURIComponent(startText) + '</div><div class="syntax-middle"></div><div class="syntax-two" contenteditable="true"></div><div class="mentions-suggestions"></div><div class="queet-toolbar toolbar-reply"><div class="queet-box-extras"><button data-tooltip="' + window.sL.tooltipAttachImage + '" class="upload-image"></button><button data-tooltip="' + window.sL.tooltipShortenUrls + '" class="shorten disabled">URL</button></div><div class="queet-button"><span class="queet-counter"></span><button>' + window.sL.queetVerb + '</button></div></div></div>';
}
@ -1815,7 +1781,7 @@ function addToFeed(feed, after, extraClasses) {
// external
var ostatusHtml = '';
if(obj.from_profile.is_local === false) {
ostatusHtml = '<a target="_blank" data-tooltip="' + window.sL.goToOriginalNotice + '" class="ostatus-link" href="' + obj.from_profile.statusnet_profile_url + '" donthijack></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') {
@ -2061,7 +2027,7 @@ function buildUserStreamItemHtml(obj) {
// external
var ostatusHtml = '';
if(obj.is_local === false) {
ostatusHtml = '<a target="_blank" title="' + window.sL.goToTheUsersRemoteProfile + '" class="ostatus-link" href="' + obj.statusnet_profile_url + '" donthijack></a>';
ostatusHtml = '<a target="_blank" title="' + window.sL.goToTheUsersRemoteProfile + '" class="ostatus-link" href="' + obj.statusnet_profile_url + '"></a>';
}
// rtl or not
@ -2308,9 +2274,9 @@ function buildQueetHtml(obj, idInStream, extraClasses, requeeted_by, isConversat
});
// if statusnetHTML is contains <p>:s, unwrap those (diaspora..)
/*statusnetHTML.children('p').each(function(){
statusnetHTML.children('p').each(function(){
$(this).contents().unwrap();
});*/
});
// bookmarks created by the bookmark plugin get's a tooltip
statusnetHTML.find('.xfolkentry').each(function(){
@ -2330,7 +2296,7 @@ function buildQueetHtml(obj, idInStream, extraClasses, requeeted_by, isConversat
// external
var ostatusHtml = '';
if(obj.user.is_local === false) {
ostatusHtml = '<a target="_blank" data-tooltip="' + window.sL.goToOriginalNotice + '" class="ostatus-link" href="' + obj.external_url + '" donthijack></a>';
ostatusHtml = '<a target="_blank" data-tooltip="' + window.sL.goToOriginalNotice + '" class="ostatus-link" href="' + obj.external_url + '"></a>';
var qSource = '<a href="' + obj.external_url + '">' + getHost(obj.external_url) + '</a>';
}
else {
@ -2615,11 +2581,6 @@ function buildAttachmentHTML(attachments){
noCoverClass=' no-cover';
}
// After uploading media, until creating thumbnail, thumbnail url is null.
if (!this.url) {
this.url = '';
}
// play button for videos and animated gifs
var playButtonClass = '';
if(typeof this.animated != 'undefined' && this.animated === true

View File

@ -37,6 +37,18 @@
· ·
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · */
/* ·
·
· Get cookie by name
·
· @param a: cookie name
·
· · · · · · · · · */
function getCookieValue(a) {
var b = document.cookie.match('(^|;)\\s*' + a + '\\s*=\\s*([^;]+)');
return b ? b.pop() : '';
}
/* ·
·
@ -726,13 +738,12 @@ function updateAllQueetsTimes() {
· · · · · · · · · */
function isLocalURL(url) {
if(url.substring(0,window.siteInstanceURL.length) == window.siteInstanceURL // site url
|| url.substring(0,window.siteAttachmentURLBase.length) == window.siteAttachmentURLBase // attachment url
|| url.substring(0,window.siteAvatarURLBase.length) == window.siteAvatarURLBase // avatar url
) {
if(url.substring(0,window.siteInstanceURL.length) == window.siteInstanceURL) {
return true;
}
return false;
else {
return false;
}
}
@ -889,7 +900,6 @@ function cacheSyntaxHighlightingGroups() {
window.userArrayCache = new Object();
window.convertUriToUserArrayCacheKey = new Object();
window.convertStatusnetProfileUrlToUserArrayCacheKey = new Object();
window.convertLocalIdToUserArrayCacheKey = new Object();
function userArrayCacheStore(data) {
@ -946,7 +956,6 @@ function userArrayCacheStore(data) {
window.userArrayCache[key].modified = Date.now();
// easy conversion between URI and statusnet_profile_url and the key we're using in window.userArrayCache
window.convertLocalIdToUserArrayCacheKey[parseInt(dataToStore.local.id, 10)] = key;
window.convertUriToUserArrayCacheKey[dataToStore.local.ostatus_uri] = key;
window.convertStatusnetProfileUrlToUserArrayCacheKey[dataToStore.local.statusnet_profile_url] = key;
}
@ -961,7 +970,6 @@ function userArrayCacheStore(data) {
window.userArrayCache[key].local = dataToStore.local;
// easy conversion between URI and statusnet_profile_url and the key we're using in window.userArrayCache
window.convertLocalIdToUserArrayCacheKey[dataToStore.local.id] = key;
window.convertUriToUserArrayCacheKey[dataToStore.local.ostatus_uri] = key;
window.convertStatusnetProfileUrlToUserArrayCacheKey[dataToStore.local.statusnet_profile_url] = key;
}
@ -992,13 +1000,9 @@ function userArrayCacheGetByLocalNickname(localNickname) {
}
function userArrayCacheGetByProfileUrlAndNickname(profileUrl, nickname) {
var possibleLocalId = false;
if(nickname.substring(0,1) == '@') {
nickname = nickname.substring(1);
}
if(profileUrl.indexOf(window.siteInstanceURL + 'user/') == 0) {
possibleLocalId = parseInt(profileUrl.substring(window.siteInstanceURL.length+5),10);
}
// the url might match a known profile uri
if(typeof window.convertUriToUserArrayCacheKey[profileUrl] != 'undefined') {
if(typeof window.userArrayCache[window.convertUriToUserArrayCacheKey[profileUrl]] != 'undefined') {
@ -1011,12 +1015,6 @@ function userArrayCacheGetByProfileUrlAndNickname(profileUrl, nickname) {
return window.userArrayCache[window.convertStatusnetProfileUrlToUserArrayCacheKey[profileUrl]];
}
}
// or the local id might match a known id
else if(typeof window.convertLocalIdToUserArrayCacheKey[possibleLocalId] != 'undefined') {
if(typeof window.userArrayCache[window.convertLocalIdToUserArrayCacheKey[possibleLocalId]] != 'undefined') {
return window.userArrayCache[window.convertLocalIdToUserArrayCacheKey[possibleLocalId]];
}
}
// or we try to guess the instance url, and see if we have a match in our cache
else if(typeof window.userArrayCache[guessInstanceUrlWithoutProtocolFromProfileUrlAndNickname(profileUrl, nickname) + '/' + nickname] != 'undefined') {
return window.userArrayCache[guessInstanceUrlWithoutProtocolFromProfileUrlAndNickname(profileUrl, nickname) + '/' + nickname];
@ -1048,10 +1046,12 @@ function userArrayCacheGetUserNicknameById(id) {
· · · · · · · · · */
function detectLocalOrExternalUserObject(userObject) {
if(isLocalURL(userObject.profile_image_url) ) {
var dataProfileImageUrlWithoutProtocol = removeProtocolFromUrl(userObject.profile_image_url);
var siteInstanceURLWithoutProtocol = removeProtocolFromUrl(window.siteInstanceURL);
if(dataProfileImageUrlWithoutProtocol.substring(0,siteInstanceURLWithoutProtocol.length) == siteInstanceURLWithoutProtocol){
return 'local';
} else {
}
else {
return 'external';
}
}
@ -1090,11 +1090,6 @@ function guessInstanceUrlWithoutProtocolFromProfileUrlAndNickname(profileUrl, ni
guessedInstanceUrl = guessedInstanceUrl.slice(0,-1);
}
// fix new mastodon style profile urls
if(guessedInstanceUrl.indexOf('/@') > -1) {
guessedInstanceUrl = guessedInstanceUrl.substring(0, guessedInstanceUrl.indexOf('/@'));
}
return guessedInstanceUrl;
}
@ -1256,7 +1251,7 @@ function updateUserDataInStream() {
// profile urls
// try to find the last account group with this id, if the statusnet_profile_url seems to
// be changed we replace it wherever we can find it, even in list urls etc that starts with statusnet_profile_url
if(userArray.local.is_local === true && $('a.account-group[data-user-id="' + userArray.local.id + '"]').last().attr('href') != userArray.local.statusnet_profile_url) {
if($('a.account-group[data-user-id="' + userArray.local.id + '"]').last().attr('href') != userArray.local.statusnet_profile_url) {
var oldStatusnetProfileURL = $('a.account-group[data-user-id="' + userArray.local.id + '"]').last().attr('href');
// all links with the exact statusnet_profile_url
$.each($('[href="' + oldStatusnetProfileURL + '"]'),function(){
@ -2248,29 +2243,6 @@ function appendAllBookmarks(bookmarkContainer) {
}
/* ·
·
· Change the header of an item in the history container by href attribute
·
· · · · · · · · · · · · · */
function updateHistoryContainerItemByHref(href, streamHeader) {
$('#history-container .stream-selection[href="' + href + '"]').html(streamHeader + '<i class="chev-right" data-tooltip="' + window.sL.tooltipBookmarkStream + '"></i>');
updateHistoryLocalStorage();
}
/* ·
·
· Remove items in the history container by href attribute
·
· · · · · · · · · · · · · */
function removeHistoryContainerItemByHref(href) {
$('#history-container .stream-selection[href="' + href + '"]').remove();
updateHistoryLocalStorage();
}
/* ·
·
· Updates the browsing history local storage

View File

@ -50,14 +50,9 @@ checkLocalStorage();
window.loggedIn = iterateRecursiveReplaceHtmlSpecialChars(window.loggedIn);
// hack to supress basic auth popup, e.g. if the user has to tabs open and
// log out in one of them. but microsoft browsers and chrome 59+ doesn't support this
if(typeof bowser != 'undefined') {
var bowserIntVersion = parseInt(bowser.version,10);
if(typeof bowser.msie == 'undefined'
&& typeof bowser.msedge == 'undefined'
&& !(typeof bowser.chrome != 'undefined' && bowser.chrome === true && bowserIntVersion <= 59)) {
window.apiRoot = window.apiRoot.replace('://','://x:x@');
}
// log out in one of them. but microsoft browsers doesn't support this
if(typeof bowser.msie == 'undefined' && typeof bowser.msedge == 'undefined') {
window.apiRoot = window.apiRoot.replace('://','://x:x@');
}
@ -285,6 +280,7 @@ $('body').on('mouseover',function (e) {
possibleNickname = $(e.target).text();
}
}
// see if we have it in cache, otherwise query server
getUserArrayData(hrefAttr, possibleNickname, timeNow, targetElement, function(userArray, timeOut){
@ -327,8 +323,9 @@ $('body').on('mouseover',function (e) {
// we query it for the lastest data
if((typeof window.userArrayLastRetrieved[hrefAttr] == 'undefined') || (timeNow - window.userArrayLastRetrieved[hrefAttr]) > 60000) {
window.userArrayLastRetrieved[hrefAttr] = timeNow;
// local users
if(userArray.local && userArray.local.is_local === true) {
if(userArray.local !== null && userArray.local.is_local === true) {
getFromAPI('users/show.json?id=' + userArray.local.screen_name, function(data){
if(data) {
var newProfileCard = buildProfileCard(data);
@ -339,7 +336,7 @@ $('body').on('mouseover',function (e) {
}
// external users
else if(!userArray.local || userArray.local.is_local === false) {
else if(userArray.local === null || userArray.local.is_local === false) {
getFromAPI('qvitter/external_user_show.json?profileurl=' + encodeURIComponent(hrefAttr),function(data){
if(data && data.external !== null) {
var newProfileCard = buildExternalProfileCard(data);
@ -386,7 +383,7 @@ function getUserArrayData(maybeProfileUrl,maybeNickname,timeNow,targetElement,ca
if((typeof window.userArrayLastRetrieved[maybeProfileUrl] == 'undefined') || (timeNow - window.userArrayLastRetrieved[maybeProfileUrl]) > 60000) {
window.userArrayLastRetrieved[maybeProfileUrl] = timeNow;
getFromAPI('qvitter/external_user_show.json?profileurl=' + encodeURIComponent(maybeProfileUrl),function(data){
if(data) {
if(data && data.external !== null) {
// we want hover cards to appear _at least_ 600ms after hover (see below)
var timeAfterServerQuery = new Date().getTime();
@ -484,105 +481,6 @@ $('body').on('mouseleave','.hover-card', function(e) {
});
/* ·
·
· find someone tool
·
· · · · · · · · · · · · · */
$('#find-someone input').keyup(function(e){
var thisFindSomeoneInput = $(this);
if(e.keyCode==13 && !thisFindSomeoneInput.hasClass('submitted')) {
thisFindSomeoneInput.addClass('submitted');
thisFindSomeoneInput.attr('disabled','disabled');
var val = $.trim(thisFindSomeoneInput.val());
// if this is a simple text input, we assume it is a local user
if(val.length>1 && /^(@)?[a-zA-Z0-9]+$/.test(val)) {
if(val.indexOf('@') == 0) {
val = val.replace('@','');
}
setNewCurrentStream(pathToStreamRouter(val),true,false,function(){
foundSomeone(thisFindSomeoneInput);
});
}
// urls might be a remote user
else if(val.length==0 || /^(ftp|http|https):\/\/[^ "]+$/.test(val)) {
getFromAPI('qvitter/external_user_show.json?profileurl=' + encodeURIComponent(val),function(data){
if(data && data.local !== null) {
setNewCurrentStream(pathToStreamRouter('user/' + data.local.id),true,false,function(){
foundSomeone(thisFindSomeoneInput);
});
}
else {
cantFindSomeone(thisFindSomeoneInput);
}
});
}
// @user@instance.domain style syntax
else if(val.length==0 || /^(@)?[a-zA-Z0-9]+@[a-zA-Z0-9\-]+(\.)(.*)+$/.test(val)) {
if(val.indexOf('@') == 0) {
val = val.substring(1)
}
var username = val.substring(0, val.indexOf('@'));
var domain = val.substring(val.indexOf('@')+1);
var urlToTry = 'https://' + domain + '/' + username;
var secondUrlToTry = 'http://' + domain + '/' + username;
var thirdUrlToTry = 'https://' + domain + '/@' + username; // mastodon
getFromAPI('qvitter/external_user_show.json?profileurl=' + encodeURIComponent(urlToTry),function(data){
if(data && data.local !== null) {
setNewCurrentStream(pathToStreamRouter('user/' + data.local.id),true,false,function(){
foundSomeone(thisFindSomeoneInput);
});
}
else {
getFromAPI('qvitter/external_user_show.json?profileurl=' + encodeURIComponent(secondUrlToTry),function(data){
if(data && data.local !== null) {
setNewCurrentStream(pathToStreamRouter('user/' + data.local.id),true,false,function(){
foundSomeone(thisFindSomeoneInput);
});
}
else {
getFromAPI('qvitter/external_user_show.json?profileurl=' + encodeURIComponent(thirdUrlToTry),function(data){
if(data && data.local !== null) {
setNewCurrentStream(pathToStreamRouter('user/' + data.local.id),true,false,function(){
foundSomeone(thisFindSomeoneInput);
});
}
else {
cantFindSomeone(thisFindSomeoneInput);
}
});
}
});
}
});
}
else {
cantFindSomeone(thisFindSomeoneInput);
}
}
});
function cantFindSomeone(thisFindSomeoneInput) {
thisFindSomeoneInput.css('background-color','pink');
thisFindSomeoneInput.effect('shake',{distance:5,times:3,duration:700},function(){
thisFindSomeoneInput.animate({backgroundColor:'#fff'},1000);
thisFindSomeoneInput.removeAttr('disabled');
thisFindSomeoneInput.removeClass('submitted');
thisFindSomeoneInput.focus();
});
}
function foundSomeone(thisFindSomeoneInput) {
thisFindSomeoneInput.removeAttr('disabled');
thisFindSomeoneInput.val('');
thisFindSomeoneInput.blur();
thisFindSomeoneInput.removeClass('submitted');
}
/* ·
@ -979,7 +877,7 @@ function proceedToSetLanguageAndLogin(data){
// suggest user to help translate if their browsers language does't exist
if(typeof window.availableLanguages[window.usersLanguageCode] == 'undefined' && !localStorageObjectCache_GET('languageErrorMessageDiscarded',window.usersLanguageNameInEnglish)) { // but don't nag
$('#page-container').prepend('<div class="language-error-message" data-language-name="' + window.usersLanguageNameInEnglish + '">' + window.siteTitle + ' is not availible in your language (' + replaceHtmlSpecialChars(window.usersLanguageNameInEnglish) + '). Visit <a href="https://git.wmsci.com/wamo/Qvitter/src/branch/develop/locale">Qvitter\'s repository homepage</a> if you want to help us to translate the interface. <span class="discard-error-message"></span></div>');
$('#page-container').prepend('<div class="language-error-message" data-language-name="' + window.usersLanguageNameInEnglish + '">' + window.siteTitle + ' is not availible in your language (' + replaceHtmlSpecialChars(window.usersLanguageNameInEnglish) + '). Visit <a href="https://git.gnu.io/h2p/Qvitter/tree/master/locale">Qvitter\'s repository homepage</a> if you want to help us to translate the interface. <span class="discard-error-message"></span></div>');
}
// if selected language is too similar to english, we display a message telling people to help with the translation
@ -1061,15 +959,12 @@ function proceedToSetLanguageAndLogin(data){
$('#accessibility-toggle-link').html(window.sL.accessibilityToggleLink);
$('#settingslink .nav-session').attr('data-tooltip',window.sL.profileAndSettings);
$('#top-compose').attr('data-tooltip',window.sL.compose);
$('button.upload-image').attr('data-tooltip',window.sL.tooltipAttachFile);
$('button.upload-image').attr('data-tooltip',window.sL.tooltipAttachImage);
$('button.shorten').attr('data-tooltip',window.sL.tooltipShortenUrls);
$('.reload-stream').attr('data-tooltip',window.sL.tooltipReloadStream);
$('#clear-history').html(window.sL.clearHistory);
$('#user-screen-name, #user-avatar, #user-name').attr('data-tooltip', window.sL.viewMyProfilePage);
$('#top-menu-profile-link-view-profile').html(window.sL.viewMyProfilePage);
$('#find-someone input').attr('placeholder',window.sL.findSomeone);
$('#find-someone input').attr('data-tooltip',window.sL.findSomeoneTooltip);
// show site body now
$('#user-container').css('display','block');
@ -1093,7 +988,7 @@ function proceedToSetLanguageAndLogin(data){
function proceedLoggedOut() {
display_spinner();
setNewCurrentStream(getStreamFromUrl(),true,false,function(){
// $('input#nickname').focus(); --> maybe not a good idea on mobile?
$('input#nickname').focus();
$('#page-container').css('opacity','1');
});
}
@ -1941,34 +1836,42 @@ $('body').on('click','a', function(e) {
}
// hijack link if we find a matching link that qvitter can handle
else {
var hrefAttr = $(this).attr('href');
// this might be a remote profile that we want to reroute to a local instance/user/id url, let's check our cache
if(typeof window.convertStatusnetProfileUrlToUserArrayCacheKey[hrefAttr] != 'undefined') {
if(typeof window.userArrayCache[window.convertStatusnetProfileUrlToUserArrayCacheKey[hrefAttr]] != 'undefined') {
var cachedUserArray = window.userArrayCache[window.convertStatusnetProfileUrlToUserArrayCacheKey[hrefAttr]];
if(cachedUserArray.local.is_local === false) {
hrefAttr = window.siteInstanceURL + 'user/' + cachedUserArray.local.id;
}
}
}
else if(typeof window.convertUriToUserArrayCacheKey[hrefAttr] != 'undefined') {
if(typeof window.userArrayCache[window.convertUriToUserArrayCacheKey[hrefAttr]] != 'undefined') {
var cachedUserArray = window.userArrayCache[window.convertUriToUserArrayCacheKey[hrefAttr]];
if(cachedUserArray.local.is_local === false) {
hrefAttr = window.siteInstanceURL + 'user/' + cachedUserArray.local.id;
}
}
}
var streamObject = URLtoStreamRouter(hrefAttr);
var streamObject = URLtoStreamRouter($(this).attr('href'));
if(streamObject && streamObject.stream) {
e.preventDefault();
// if this is a user/{id} type link but we know the nickname already
if(streamObject.name == 'profile by id' && streamObject.nickname !== false) {
setNewCurrentStream(pathToStreamRouter(streamObject.nickname),true,streamObject.id);
// if this is a user/{id} type link we want to find the nickname before setting a new stream
// the main reason is that we want to update the browsers location bar and the .stream-selecton
// links as fast as we can. we rather not wait for the server response
if(streamObject.name == 'profile by id') {
// pathToStreamRouter() might have found a cached nickname
if(streamObject.nickname) {
setNewCurrentStream(pathToStreamRouter(streamObject.nickname),true,streamObject.id);
}
// otherwise we might follow the user and thereby already know its nickname
else if (typeof window.following != 'undefined' && typeof window.following[streamObject.id] != 'undefined') {
setNewCurrentStream(pathToStreamRouter(window.following[streamObject.id].username),true,streamObject.id);
}
// if the text() of the clicked element looks like a user nickname, use that (but send id to setNewCurrentStream() in case this is bad data)
else if(/^@[a-zA-Z0-9]+$/.test($(e.target).text()) || /^[a-zA-Z0-9]+$/.test($(e.target).text())) {
var nickname = $(e.target).text();
if(nickname.indexOf('@') == 0) {
nickname = nickname.substring(1); // remove any starting @
}
setNewCurrentStream(pathToStreamRouter(nickname),true,streamObject.id);
}
// if we can't figure out or guess a nickname, query the server for it
else {
getNicknameByUserIdFromAPI(streamObject.id,function(nickname) {
if(nickname) {
setNewCurrentStream(pathToStreamRouter(nickname),true,false);
}
else {
alert('user not found');
}
});
}
}
// same with group/{id}/id links
else if(streamObject.name == 'group notice stream by id') {
@ -2156,9 +2059,10 @@ function checkForNewQueets() {
if(window.loggedIn && (window.currentStreamObject.type == 'notices' || window.currentStreamObject.type == 'notifications')) {
var lastId = $('#feed-body').children('.stream-item').not('.temp-post').not('.posted-from-form').attr('data-quitter-id-in-stream');
var addThisStream = window.currentStreamObject.stream;
var timeNow = new Date().getTime();
getFromAPI(addThisStream + qOrAmp(window.currentStreamObject.stream) + 'since_id=' + lastId,function(data){
$('body').removeClass('loading-newer');
if(data) {
$('body').removeClass('loading-newer');
if(addThisStream == window.currentStreamObject.stream) {
addToFeed(data, false, 'hidden');
@ -2178,6 +2082,7 @@ function checkForNewQueets() {
}
}
/* ·
·
· Show hidden queets when user clicks on new-queets-bar
@ -2848,13 +2753,10 @@ $('body').on('click', '.queet-toolbar button',function () {
var queetBoxID = queetBox.attr('id');
// jquery's .text() function is not consistent in converting <br>:s to \n:s,
// so we do this detour to make sure line breaks are preserved.
// In firefox (and maybe some other browsers), queetBox.html() may have <div>s
// and may or may not have <br> in them.
// To deal with this, remove any <br>s right before </div> and then add ones.
queetBox.html(queetBox.html().replace(/(<br>)*<\/div>/g, '<br></div>').replace(/({|})/g, '!$1').replace(/<br>/g, '{{{lb}}}'));
// so we do this detour to make sure line breaks are preserved
queetBox.html(queetBox.html().replace(/<br>/g, '{{{lb}}}'));
var queetText = $.trim(queetBox.text().replace(/^\s+|\s+$/g, '').replace(/\n/g, ''));
queetText = queetText.replace(/{{{lb}}}/g, "\n").replace(/!({|})/g, '$1');
queetText = queetText.replace(/{{{lb}}}/g, "\n");
var queetTempText = replaceHtmlSpecialChars(queetText.replace(/\n/g,'<br>')); // no xss
queetTempText = queetTempText.replace(/&lt;br&gt;/g,'<br>'); // but preserve line breaks
@ -3213,10 +3115,6 @@ $('body').on('keyup paste input', 'div.queet-box-syntax', function() {
currentVal = currentVal.replace(/<br>$/, '').replace(/&nbsp;$/, '').replace(/ $/, ''); // fix
$(this).siblings('.syntax-two').html(currentVal);
// If user click post area before load finished (top gnu logo), this is undefined.
if (!window.syntaxHighlightingRegexps) {
window.syntaxHighlightingRegexps = Object();
}
// loop through the regexps and highlight
$.each(window.syntaxHighlightingRegexps,function(k,v){
@ -3381,66 +3279,48 @@ $('body').on('keyup', 'div.queet-box-syntax', function(e) {
});
});
window.lastMention = new Object();
// check for user mentions
$('body').on('keyup', 'div.queet-box-syntax', function(e) { checkMentions(e, true);});
// check for group mentions
$('body').on('keyup', 'div.queet-box-syntax', function(e) { checkMentions(e, false);});
window.lastMention = new Object();
$('body').on('keyup', 'div.queet-box-syntax', function(e) {
/**
* check for user/group mentions
*
* @param {Object} e: Event object
* @param {boolean} isUser
*/
function checkMentions(e, isUser) {
var mark = '!';
var prefix = 'group';
if (isUser) {
mark = '@';
prefix = 'user';
}
// var queetBox = $(this);
var queetBox = $('body div.queet-box-syntax');
var queetBox = $(this);
var cursorPosArray = getSelectionInElement(queetBox[0]);
var cursorPos = cursorPosArray[0];
if(e.keyCode != '40' && e.keyCode != '38' && e.keyCode != '13' && e.keyCode != '9') {
// add space before linebreaks (to separate mentions in beginning of new lines when .text():ing later)
if(e.keyCode == '13') {
e.preventDefault();
var range = createRangeFromCharacterIndices(queetBox[0], cursorPos, cursorPos);
range.insertNode(document.createTextNode(" \n"));
}
else if(e.keyCode != '40' && e.keyCode != '38' && e.keyCode != '13' && e.keyCode != '9') {
var contents = queetBox.text().substring(0,cursorPos);
var mentionPos = contents.lastIndexOf(mark);
var mentionPos = contents.lastIndexOf('@');
var check_contents = contents.substring(mentionPos - 1, cursorPos);
var regex = new RegExp('(^|\s|\.|\n)(' + mark + ')[a-zA-Z0-9]+');
var regex = /(^|\s|\.|\n)(@)[a-zA-Z0-9]+/;
var match = check_contents.match(regex);
if (contents.indexOf(mark) >= 0 && match) {
if (contents.indexOf('@') >= 0 && match) {
if(contents.lastIndexOf(mark) > 1) {
if(contents.lastIndexOf('@') > 1) {
match[0] = match[0].substring(1,match[0].length);
}
if((contents.lastIndexOf(mark)+match[0].length) == cursorPos) {
if((contents.lastIndexOf('@')+match[0].length) == cursorPos) {
queetBox.siblings('.mentions-suggestions').children('.' + prefix + '-suggestion').remove();
queetBox.siblings('.mentions-suggestions').children('.user-suggestion').remove();
queetBox.siblings('.mentions-suggestions').css('top',(queetBox.height()+20) + 'px');
var term = match[0].substring(match[0].lastIndexOf(mark)+1, match[0].length).toLowerCase();
var term = match[0].substring(match[0].lastIndexOf('@')+1, match[0].length).toLowerCase();
window.lastMention.mentionPos = mentionPos;
window.lastMention.cursorPos = cursorPos;
// see if any user/group we're following matches
// see if anyone we're following matches
var suggestionsToShow = [];
var suggestionsUsernameCount = {};
if (isUser) {
suggestionsUsernameCount[window.loggedIn.screen_name] = 1; // any suggestions with the same screen name as mine will get their server url added
}
var targets = isUser ? (window.following) : (window.groupMemberships);
$.each(targets, function(){
suggestionsUsernameCount[window.loggedIn.screen_name] = 1; // any suggestions with the same screen name as mine will get their server url added
$.each(window.following,function(){
var userregex = new RegExp(term);
if(this.username.toLowerCase().match(userregex) || this.name.toLowerCase().match(userregex)) {
var suggestion = {avatar:this.avatar, name:this.name, username:this.username,url:this.url};
if (!isUser) {
suggestion.id = this.id;
}
suggestionsToShow.push(suggestion);
suggestionsToShow.push({avatar:this.avatar, name:this.name, username:this.username,url:this.url});
// count the usernames to see if we need to show the server for any of them
if(typeof suggestionsUsernameCount[this.username] != 'undefined') {
@ -3456,27 +3336,96 @@ function checkMentions(e, isUser) {
$.each(suggestionsToShow,function(){
var serverHtml = '';
if(suggestionsUsernameCount[this.username]>1 && this.url !== false) {
serverHtml = isUser ? ('@' + this.url) : (this.url + '/group/');
}
if (isUser) {
queetBox.siblings('.mentions-suggestions').append('<div class="user-suggestion" title="@' + this.username + serverHtml + '"><img height="24" width="24" src="' + this.avatar + '" /><strong>' + this.name + '</strong> @<span>' + this.username + serverHtml + '</span></div>')
}
else {
queetBox.siblings('.mentions-suggestions').append('<div class="group-suggestion" title="' + serverHtml + this.username + '" data-group-id="' + this.id + '"><img height="24" width="24" src="' + this.avatar + '" /><strong>' + this.name + '</strong> !<span>' + this.username + '</span></div>')
serverHtml = '@' + this.url;
}
queetBox.siblings('.mentions-suggestions').append('<div class="user-suggestion" title="@' + this.username + serverHtml + '"><img height="24" width="24" src="' + this.avatar + '" /><strong>' + this.name + '</strong> @<span>' + this.username + serverHtml + '</span></div>')
});
}
else {
queetBox.siblings('.mentions-suggestions').children('.' + prefix + '-suggestion').remove();
queetBox.siblings('.mentions-suggestions').children('.user-suggestion').remove();
}
}
else {
queetBox.siblings('.mentions-suggestions').children('.' + prefix + '-suggestion').remove();
queetBox.siblings('.mentions-suggestions').children('.user-suggestion').remove();
}
}
}
});
// check for group mentions
$('body').on('keyup', 'div.queet-box-syntax', function(e) {
var queetBox = $(this);
var cursorPosArray = getSelectionInElement(queetBox[0]);
var cursorPos = cursorPosArray[0];
// add space before linebreaks (to separate mentions in beginning of new lines when .text():ing later)
if(e.keyCode == '13') {
e.preventDefault();
var range = createRangeFromCharacterIndices(queetBox[0], cursorPos, cursorPos);
range.insertNode(document.createTextNode(" \n"));
}
else if(e.keyCode != '40' && e.keyCode != '38' && e.keyCode != '13' && e.keyCode != '9') {
var contents = queetBox.text().substring(0,cursorPos);
var mentionPos = contents.lastIndexOf('!');
var check_contents = contents.substring(mentionPos - 1, cursorPos);
var regex = /(^|\s|\.|\n)(!)[a-zA-Z0-9]+/;
var match = check_contents.match(regex);
if (contents.indexOf('!') >= 0 && match) {
if(contents.lastIndexOf('!') > 1) {
match[0] = match[0].substring(1,match[0].length);
}
if((contents.lastIndexOf('!')+match[0].length) == cursorPos) {
queetBox.siblings('.mentions-suggestions').children('.group-suggestion').remove();
queetBox.siblings('.mentions-suggestions').css('top',(queetBox.height()+20) + 'px');
var term = match[0].substring(match[0].lastIndexOf('!')+1, match[0].length).toLowerCase();
window.lastMention.mentionPos = mentionPos;
window.lastMention.cursorPos = cursorPos;
// see if any group we're member of matches
var suggestionsToShow = [];
var suggestionsUsernameCount = {};
$.each(window.groupMemberships,function(){
var userregex = new RegExp(term);
if(this.username.toLowerCase().match(userregex) || this.name.toLowerCase().match(userregex)) {
suggestionsToShow.push({id:this.id, avatar:this.avatar, name:this.name, username:this.username,url:this.url});
// count the usernames to see if we need to show the server for any of them
if(typeof suggestionsUsernameCount[this.username] != 'undefined') {
suggestionsUsernameCount[this.username] = suggestionsUsernameCount[this.username] + 1;
}
else {
suggestionsUsernameCount[this.username] = 1;
}
}
});
// show matches
$.each(suggestionsToShow,function(){
var serverHtml = '';
if(suggestionsUsernameCount[this.username]>1 && this.url !== false) {
serverHtml = this.url + '/group/';
}
queetBox.siblings('.mentions-suggestions').append('<div class="group-suggestion" title="' + serverHtml + this.username + '" data-group-id="' + this.id + '"><img height="24" width="24" src="' + this.avatar + '" /><strong>' + this.name + '</strong> !<span>' + this.username + '</span></div>')
});
}
else {
queetBox.siblings('.mentions-suggestions').children('.group-suggestion').remove();
}
}
else {
queetBox.siblings('.mentions-suggestions').children('.group-suggestion').remove();
}
}
});
/* ·
·

View File

@ -57,14 +57,7 @@ window.pluginStreamObjects = [];
· · · · · · · · · */
function setUrlFromStream(streamObject) {
// if we know the nickname for profiles, go with that instead of the id
if(streamObject.name == 'profile by id' && streamObject.nickname !== false) {
history.pushState({strm:streamObject.nickname},'','/' + streamObject.nickname);
}
else {
history.pushState({strm:streamObject.path},'','/' + streamObject.path);
}
history.pushState({strm:streamObject.path},'','/' + streamObject.path);
}
@ -394,7 +387,7 @@ function pathToStreamRouter(path) {
streamObject.streamSubHeader = window.sL.notices + '<div class="queet-streams">/ <a class="queet-stream mentions" href="' + window.siteInstanceURL + streamObject.nickname + '/replies">' + window.sL.mentions + '</a> / <a class="queet-stream favorites" href="' + window.siteInstanceURL + streamObject.nickname + '/favorites">' + window.sL.favoritesNoun +'</a></div>';
}
streamObject.id = pathSplit[1];
streamObject.stream = 'qvitter/statuses/user_timeline.json?id=' + streamObject.id + '&withuserarray=1';
streamObject.stream = 'statuses/user_timeline.json?id=' + streamObject.id + '&withuserarray=1';
return streamObject;
}

View File

@ -197,9 +197,5 @@
"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",
"thisIsABookmark":"This is a bookmark created in the Classic interface",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"Find someone",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"Attach a file"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -197,9 +197,5 @@
"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",
"thisIsABookmark":"This is a bookmark created in the Classic interface",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"Find someone",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"Attach a file"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -156,50 +156,46 @@
"myListWithListName":"La meva llista: {list-name}",
"listMembers":"Membres",
"listSubscribers":"Subscriptors",
"ERRORcouldNotFindList":"La llista no existeix.",
"emailAlreadyInUse":"Ja en ús",
"ERRORcouldNotFindList":"There is no such list.",
"emailAlreadyInUse":"Already in use",
"addEditLanguageLink":"Ajuda a traduir {site-title} a un altre idioma",
"onlyPartlyTranslated":"{site-title} està només traduït parcialment a <em>{language-name}</em> ({percent}%). Tu pots ajudar a completar la traducció a <a href=\"https://git.gnu.io/h2p/Qvitter/tree/master/locale\">Qvitter's repository homepage</a>",
"startRant":"Iniciar una conversa",
"continueRant":"Continuar la conversa",
"hideEmbeddedInTimeline":"Amagar el contingut incrustat en aquesta línia temporal",
"hideQuotesInTimeline":"Amagar cites en aquesta línia temporal",
"userBlocks":"Usuaris als qui has bloquejat",
"startRant":"Start a rant",
"continueRant":"Continue the rant",
"hideEmbeddedInTimeline":"Hide embedded content in this timeline",
"hideQuotesInTimeline":"Hide quotes in this timeline",
"userBlocks":"Accounts you're blocking",
"buttonBlocked":"Bloquejat",
"buttonUnblock":"Desbloqueja",
"failedBlockingUser":"Va fallar el bloqueig a l'usuari.",
"failedUnblockingUser":"Va fallar el desbloqueig a l'usuari.",
"failedBlockingUser":"Failed to block the user.",
"failedUnblockingUser":"Failed to unblock the user.",
"unblockUser": "Desbloqueja {username}",
"tooltipBlocksYou":"Estàs bloquejat de seguir {username}.",
"silenced":"Silenciat",
"silencedPlural":"Perfils silenciats",
"silencedUsersOnThisInstance":"Perfils silenciats a {site-title}",
"sandboxed":"Aïllat",
"sandboxedPlural":"Perfils aïllats",
"sandboxedUsersOnThisInstance":"Perfils aïllats en {site-title}",
"silencedStreamDescription":"Els usuaris prohibits no poden iniciar sessió ni publicar queets i els ja publicats s'ocultaran. Per a usuaris locals és com una eliminació reversible; per a usuaris remots és com un bloqueig global.",
"sandboxedStreamDescription":"Els queets d'usuaris aïllats estan exclosos de la línia temporal pública i de tota la xarxa coneguda. Els queets publicats durant l'aïllament no s'inclouran en les línies temporals públiques encara que es desactivi l'aïllament a l'usuari.",
"onlyShowNotificationsFromUsersIFollow":"Només mostrar notificacions d'usuaris als qui segueixo",
"userOptions":"Més opcions d'usuari",
"silenceThisUser":"Prohibir a {nickname}",
"sandboxThisUser":"Aïllar a {nickname}",
"unSilenceThisUser":"Desactivar la prohibició de {nickname}",
"unSandboxThisUser":"Desactivar l'aïllament de {nickname}",
"ERRORfailedSandboxingUser":"Va fallar l'aïllament o la seva desactivació de l'usuari",
"ERRORfailedSilencingUser":"Va fallar la prohibició o la seva desactivació de l'usuari",
"muteUser":"Silenciar",
"unmuteUser":"Desactivar silenci",
"hideNotificationsFromMutedUsers":"Amagar notificacions d'usuaris silenciats",
"thisIsANoticeFromAMutedUser":"Has silenciat a l'autor d'aquest queet. Fes clic per mostrar-ho igualment.",
"userMutes":"Usuaris que has silenciat",
"userBlocked":"Comptes bloquejats",
"userMuted":"Comptes silenciats",
"mutedStreamDescription":"Has ocultat aquests comptes de la teva línia temporal. Seguiràs rebent notificacions d'aquests comptes tret que seleccions &quot;Amagar notificacions d'usuaris silenciats&quot; des del menú amb forma de roda dentada a la pàgina de notificacions.",
"profileAndSettings":"Perfil i ajustos",
"profileSettings":"Ajustos del perfil",
"thisIsABookmark":"Això és un marcador va crear en l'interfície Clàssic",
"thisIsARemoteUser":"<strong>Atenció!</strong>Est és un usuari remot. Aquesta pàgina és només una còpia en caché del seu perfil, i inclou només dades conegudes per aquesta instància social de GNU.Aneu a la <a href=\"{remote-profile-url}\" donthijack>perfil de l'usuari en el seu servidor</a> per veure el seu perfil complet.",
"findSomeone":"Troba a algú",
"findSomeoneTooltip":"Introdueixi un nom d'usuari o una adreça URL de perfil, per exemple @localuser o https://remote.instance/nickname",
"tooltipAttachFile":"Adjuntar un arxiu"
"sandboxed":"Sandboxed",
"sandboxedPlural":"Sandboxed profiles",
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Apart from that, they can use the site like any other user.",
"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",
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -125,11 +125,11 @@
"keyboardShortcuts": "Tastatur-Kürzel",
"classicInterface": "Klassische Ansicht: {site-title}",
"accessibilityToggleLink": "Nutzer von Screenreadern klicken bitte hier, um zur klassischen Version von {site-title} zu gelangen.",
"tooltipBookmarkStream": "Diesen Stream zu den Lesezeichen hinzufügen",
"tooltipBookmarkStream": "Diesen Datenstrom zu den Lesezeichen beifügen",
"tooltipTopMenu": "Menü und Einstellungen",
"tooltipAttachImage": "Bild anfügen",
"tooltipShortenUrls": "Alle URLs im Queet kürzen",
"tooltipReloadStream": "Diesen Stream aktualisieren",
"tooltipReloadStream": "Diesen Datenstrom aktualisieren",
"tooltipRemoveBookmark": "Dieses Lesezeichen löschen",
"clearHistory": "Verlauf löschen",
"ERRORsomethingWentWrong": "Irgendetwas ging da schief.",
@ -197,9 +197,5 @@
"mutedStreamDescription":"Du hast diese Nutzer in Deiner Timeline ausgeblendet. Benachrichtigungen von diesen Nutzern werden werden weiterhin angezeigt. Um sie ebenfalls zu verbergen, wähle im Zahnradmenu der Benachrichtigungsseite die Option &quot;Benachrichtigungen von ausgeblendeten Benutzern verbergen&quot;.",
"profileAndSettings":"Profil und Einstellungen",
"profileSettings":"Profileinstellungen",
"thisIsABookmark":"Dies ist ein Lesezeichen das in der Klassischen Ansicht erstellt wurde",
"thisIsARemoteUser":"<strong>Achtung!</strong> Dies ist ein entfernter Nutzer. Diese Seite ist nur eine zwischengespeicherte Kopie des Profils und enthält nur Daten, welcher dieser GNU Social Instanz bekannt sind. Gehe zum <a href=\"{remote-profile-url}\" donthijack>Profil des Nutzers auf seinem Server</a> um das gesamte Profile zu sehen.",
"findSomeone":"Suche jemanden",
"findSomeoneTooltip":"Gib einen Benutzernamen oder eine Profil-URL ein, z.B. @lokalernutzer oder https://entfernte.instanz/nickname",
"tooltipAttachFile":"Datei anhängen"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -197,9 +197,5 @@
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still receive 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",
"thisIsABookmark":"This is a bookmark created in the Classic interface",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"Find someone",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"Attach a file"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -187,19 +187,14 @@
"unSandboxThisUser":"Malsablokesti {nickname}",
"ERRORfailedSandboxingUser":"Malsukcesis sablokestigi/malsablokestigi la uzanton",
"ERRORfailedSilencingUser":"Malsukcesis silentigi/malsilentigi la uzanton",
"muteUser":"Mutigi",
"unmuteUser":"Mlmutigi",
"hideNotificationsFromMutedUsers":"Kaŝi sciigojn el mutigitaj uzantoj",
"thisIsANoticeFromAMutedUser":"Vi mutigis la verkinton de ĉi tiu mesaĝo. Alklaku ĉi tien por montri ĝi ĉiaokaze.",
"userMutes":"Mutigitaj kontoj",
"userBlocked":"Blokitaj kontoj",
"userMuted":"Mutigitaj kontoj",
"mutedStreamDescription":"Vi kaŝis ĉi tiujn kontojn el via tempolinio. Vi ankoraŭ ricevos sciigojn el tiuj kontoj, krom se vi elektu &quot;Kaŝi sciigojn el mutigitaj uzantoj&quot; el la dentorado-menuo en la paĝoj pri sciigoj.",
"profileAndSettings":"Profilo kaj agordoj",
"profileSettings":"Profilaj agordoj",
"thisIsABookmark":"Ĉi tio estas paĝosigno kreita en la klasika interfaco",
"thisIsARemoteUser":"<strong>Atentu!</strong> Ĉi tiu estas fora uzanto. Ĉi tiu paĝo estas nur konservita kopio el ĝia profilo, kaj enhavas nur datumojn konatajn de ĉi tiu GNU social-retejo. Vizitu <a href=\"{remote-profile-url}\" donthijack>la uzantprofilon ĉi ĝia servilo</a> por vidi la tutan profilon.",
"findSomeone":"Trovu iun",
"findSomeoneTooltip":"Enigu uzantnomon aŭ profilo-adreson, ekz. @lokauzanto aŭ https://fora.retejo/kromnomo",
"tooltipAttachFile":"Attach a file"
"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

@ -196,9 +196,5 @@
"mutedStreamDescription":"Has ocultado estas cuentas de tu línea temporal. Seguirás recibiendo notificaciones de dichas cuentas a menos que selecciones &quot;Ocultar notificaciones de usuarios silencioados&quot; desde el menú con forma de rueda dentada en la página de notificaciones.",
"profileAndSettings":"Perfil y ajustes",
"profileSettings":"Ajustes del perfil",
"thisIsABookmark":"Este es un marcador creado en la interfaz Classic",
"thisIsARemoteUser":"<strong>Atención!</strong> Este es un usuario remoto. Esta página es sólo una copia en caché de su perfil, e incluye sólo datos conocidos por esta instancia social de GNU. Ve a la <a href=\"{remote-profile-url}\" donthijack>perfil de usuario en su servidor</a> para ver su perfil completo.",
"findSomeone":"Encuentra a alguien",
"findSomeoneTooltip":"Introduzca un nombre de usuario o una dirección URL de perfil, por ejemplo @localuser o https://remote.instance/nickname",
"tooltipAttachFile":"Adjuntar un archivo"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -197,9 +197,5 @@
"mutedStreamDescription":"Haz ocultado esas cuentas de tu línea temporal. Igualmente recibirás notificaciones de esas cuentas, a menos que selecciones &quot;Hide notifications from muted users&quot; desde el menú de la rueda dentada en la página de notificaciones.",
"profileAndSettings":"Perfiles y configuraciones",
"profileSettings":"Perfil y configuración",
"thisIsABookmark":"This is a bookmark created in the Classic interface",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"Find someone",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"Attach a file"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -197,9 +197,5 @@
"mutedStreamDescription":"Has ocultado estas cuentas de tu línea temporal. Seguirás recibiendo notificaciones de dichas cuentas a menos que selecciones &quot;Ocultar notificaciones de usuarios silencioados&quot; desde el menú con forma de rueda dentada en la página de notificaciones.",
"profileAndSettings":"Perfil y ajustes",
"profileSettings":"Ajustes del perfil",
"thisIsABookmark":"This is a bookmark created in the Classic interface",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"Find someone",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"Attach a file"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -197,9 +197,5 @@
"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",
"thisIsABookmark":"This is a bookmark created in the Classic interface",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"Find someone",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"Attach a file"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -115,19 +115,19 @@
"FAQ": "FAQ",
"inviteAFriend": "دعوت از دوستانتان",
"goToExternalProfile": "رفتن به نمایه کامل",
"cropAndSave": "برش و ذخیره",
"cropAndSave": "Crop and save",
"showTerms": "Read our Terms of Use",
"ellipsisMore": "بیشتر",
"ellipsisMore": "More",
"blockUser": "Block {username}",
"goToOriginalNotice": "Go to original notice",
"goToTheUsersRemoteProfile": "Go to the user's remote profile",
"clickToDrag":"کلیک برای کشیدن",
"keyboardShortcuts":"میانبرهای کیبورد",
"classicInterface":"کلاسیک {site-title}",
"clickToDrag":"Click to drag",
"keyboardShortcuts":"Keyboard shortcuts",
"classicInterface":"Classic {site-title}",
"accessibilityToggleLink":"For better accessibility, click this link to switch to the classic interface",
"tooltipBookmarkStream":"Add this stream to your bookmarks",
"tooltipTopMenu":"منو و تنظیمات",
"tooltipAttachImage":"پیوست عکس",
"tooltipTopMenu":"Menu and settings",
"tooltipAttachImage":"Attach an image",
"tooltipShortenUrls":"Shorten all URLs in the Queet",
"tooltipReloadStream":"Refresh this stream",
"tooltipRemoveBookmark":"Remove this bookmark",
@ -136,7 +136,7 @@
"ERRORmustBeLoggedIn":"You must be logged in to view this stream.",
"ERRORcouldNotFindUserWithNickname":"Could not find a user with nickname \"{nickname}\" on this server",
"ERRORcouldNotFindGroupWithNickname":"Could not find a group with nickname \"{nickname}\" on this server",
"ERRORcouldNotFindPage":"برگه پیدا نشد",
"ERRORcouldNotFindPage":"Could not find that page.",
"ERRORnoticeRemoved": "This notice has been removed.",
"ERRORnoContactWithServer": "Can not establish a connection to the server. The server could be overloaded, or there might be a problem with your internet connecton. Please try again later!",
"ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
@ -153,7 +153,7 @@
"newNotifications": "{new-notice-count} new notifications",
"thisIsANoticeFromABlockedUser":"Warning: This is a notice from a user you have blocked. Click to show it.",
"nicknamesListWithListName":"{nickname}s list: {list-name}",
"myListWithListName":"لیست من: {list-name}",
"myListWithListName":"My list: {list-name}",
"listMembers":"Members",
"listSubscribers":"Subscribers",
"ERRORcouldNotFindList":"There is no such list.",
@ -197,9 +197,5 @@
"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",
"thisIsABookmark":"This is a bookmark created in the Classic interface",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"پیداکردن کسی",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"پیوست فایل"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -198,9 +198,5 @@
"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",
"thisIsABookmark":"This is a bookmark created in the Classic interface",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"Find someone",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"Attach a file"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -197,9 +197,5 @@
"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",
"thisIsABookmark":"This is a bookmark created in the Classic interface",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"Find someone",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"Attach a file"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -197,9 +197,5 @@
"mutedStreamDescription":"Ocultaches estas contas da túa liña de tempo. Continuarás a recibir notificacións destas contas, a non ser que selecciones &quot;Agochar notificacións de usuarias acaladas&quot; na roda dentada do menú da páxina de notificacións.",
"profileAndSettings":"Perfil e axustes",
"profileSettings":"Axustes do perfil",
"thisIsABookmark":"This is a bookmark created in the Classic interface",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"Find someone",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"Attach a file"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -197,9 +197,5 @@
"mutedStreamDescription":"הסתרת את חשבונות אלה מתוך ציר הזמן שלך. You will still recieve notifications from these accounts, unless you select &quot;הסתר התרעות ממשתמשים מוסתרים&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"פרופיל והגדרות",
"profileSettings":"הגדרות פרופיל",
"thisIsABookmark":"זוהי סימנייה שנוצרה בתוך הממשק הקלאסי",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"Find someone",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"Attach a file"
"thisIsABookmark":"זוהי סימנייה שנוצרה בתוך הממשק הקלאסי"
}

View File

@ -194,9 +194,5 @@
"mutedStreamDescription":"Դուք թացրել եք այս օգտատերերին Ձեր հոսքից։ Դուք կշարունակեք ստանալ այս օգտատերերից ծանուցումներ, եթե չընտրեք &quot;Թաքցնել արհամարհվող օգտատերերի ծանուցումները &quot; Ծանուցումների էջի մենյուի կարգավորումներում",
"profileAndSettings":"Էջ և կարգավորումներ",
"profileSettings":"Էջի կարգավորումներ",
"thisIsABookmark":"This is a bookmark created in the Classic interface",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"Find someone",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"Attach a file"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -1,205 +0,0 @@
{
"directionality":"ltr",
"languageName": "Interlingua",
"loginUsername": "Nomine de usator o adresse de e-mail",
"loginPassword": "Contrasigno",
"loginSignIn": "Aperir session",
"loginRememberMe": "Memorar me",
"loginForgotPassword": "Contrasigno oblidate?",
"notices": "Granas",
"followers": "Sequitores",
"following": "Sequente",
"groups": "Gruppos",
"compose": "Que passa?",
"queetVerb": "Inviar",
"queetsNounPlural": "Granas",
"logout": "Clauder session",
"languageSelected": "Lingua:",
"viewMyProfilePage": "Vider mi pagina de profilo",
"expand": "Displicar",
"collapse": "Plicar",
"details": "Detalios",
"expandFullConversation": "Displicar tote le conversation",
"replyVerb": "Responder",
"requeetVerb": "Disseminar",
"favoriteVerb": "Favorir",
"requeetedVerb": "Disseminate",
"favoritedVerb": "Favorite",
"replyTo": "Responder a",
"requeetedBy": "Disseminate per {requeeted-by}",
"favoriteNoun": "Favorite",
"favoritesNoun": "Favorites",
"requeetNoun": "Dissemination",
"requeetsNoun": "Disseminationes",
"newQueet": "{new-notice-count} nove grana",
"newQueets": "{new-notice-count} nove granas",
"longmonthsJanuary": "januario",
"longmonthsFebruary": "februario",
"longmonthsMars": "martio",
"longmonthsApril": "april",
"longmonthsMay": "mai",
"longmonthsJune": "junio",
"longmonthsJuly": "julio",
"longmonthsAugust": "augusto",
"longmonthsSeptember": "septembre",
"longmonthsOctober": "octobre",
"longmonthsNovember": "novembre",
"longmonthsDecember": "decembre",
"shortmonthsJanuary": "jan",
"shortmonthsFebruary": "feb",
"shortmonthsMars": "mar",
"shortmonthsApril": "apr",
"shortmonthsMay": "mai",
"shortmonthsJune": "jun",
"shortmonthsJuly": "jul",
"shortmonthsAugust": "aug",
"shortmonthsSeptember": "sep",
"shortmonthsOctober": "oct",
"shortmonthsNovember": "nov",
"shortmonthsDecember": "dec",
"time12am": "{time} am",
"time12pm": "{time} pm",
"longDateFormat": "{time12} le {day} de {month} {year}",
"shortDateFormatSeconds": "{seconds}s",
"shortDateFormatMinutes": "{minutes}m",
"shortDateFormatHours": "{hours}h",
"shortDateFormatDate": "{day} {month}",
"shortDateFormatDateAndY": "{day} {month} {year}",
"now": "ora",
"posting": "entrata",
"viewMoreInConvBefore": "← Vider plus in conversation",
"viewMoreInConvAfter": "Vider plus in conversation →",
"mentions": "Mentiones",
"timeline": "Chronologia",
"publicTimeline": "Chronologia public",
"publicAndExtTimeline": "Tote le rete cognoscite",
"searchVerb": "Cercar",
"deleteVerb": "Deler",
"cancelVerb": "Cancellar",
"deleteConfirmation": "Es tu secur de voler deler iste grana?",
"userExternalFollow": "Sequer a distantia",
"userExternalFollowHelp": "ID de tu conto (p.ex. usator@example.net).",
"userFollow": "Sequer",
"userFollowing": "Sequente",
"userUnfollow": "Non plus sequer",
"joinGroup": "Adherer",
"joinExternalGroup": "Adherer a distantia",
"isMemberOfGroup": "Membro",
"leaveGroup": "Quitar",
"memberCount": "Membros",
"adminCount": "Administratores",
"settings": "Configuration",
"saveChanges": "Salveguardar",
"linkColor": "Color de ligamines",
"backgroundColor": "Color de fundo",
"newToQuitter": "Nove a {site-title}?",
"signUp": "Crear conto",
"signUpFullName": "Nomine complete",
"signUpEmail": "E-mail",
"signUpButtonText": "Crear conto sur {site-title}",
"welcomeHeading": "Benvenite a {site-title}.",
"welcomeText": "Nos es un <span id=\"federated-tooltip\"><div id=\"what-is-federation\">\"Federation\" vole dicer que non es necessari un conto de {site-title} pro poter sequer, esser sequite per, o interager con usatores de {site-title}. On pote crear un conto sur qualcunque servitor de StatusNet o GNU Social o altere servicio basate sur le protocollo <a href=\"http://www.w3.org/community/ostatus/wiki/Main_Page\">Ostatus</a>! Non mesmo es necessari adherer a un servitor essaya installar le elegante software <a href=\"http://www.gnu.org/software/social/\">GNU social</a> sur le prorpie servitor! :)</div>federation</span> de microblogatores qui se preoccupa de justitia social e solidaritate e vole quitar le servicios capitalista centralisate.",
"registerNickname": "Pseudonymo",
"registerHomepage": "Pagina personal",
"registerBio": "Biographia",
"registerLocation": "Loco",
"registerRepeatPassword": "Repete contrasigno",
"moreSettings": "Altere parametros",
"otherServers": "Alternativemente, crea un conto sur un altere servitor del rete GNU Social. <a href=\"http://federation.skilledtests.com/select_your_server.html\">Comparation</a>",
"editMyProfile": "Modificar profilo",
"notifications": "Notificationes",
"xFavedYourQueet": "ha favorite tu grana",
"xRepeatedYourQueet": "ha disseminate tu grana",
"xStartedFollowingYou": "ha comenciate a sequer te",
"followsYou": "te seque",
"FAQ": "FAQ",
"inviteAFriend": "Invita un amico!",
"goToExternalProfile": "Visitar le profilo complete",
"cropAndSave": "Taliar e salveguardar",
"showTerms": "Leger nostre conditiones de uso",
"ellipsisMore": "Plus",
"blockUser": "Blocar",
"goToOriginalNotice": "Visitar le grana original",
"goToTheUsersRemoteProfile": "Visitar le profilo distante del usator",
"clickToDrag":"Clicca pro traher",
"keyboardShortcuts":"Claves accelerator",
"classicInterface":"{site-title} classic",
"accessibilityToggleLink":"Pro melior accessibilitate, clicca sur iste ligamine pro cambiar al interfacie classic",
"tooltipBookmarkStream":"Adder iste fluxo a tu marcapaginas",
"tooltipTopMenu":"Menu e configuration",
"tooltipAttachImage":"Attachar un imagine",
"tooltipShortenUrls":"Abbreviar tote le URLs in le grana",
"tooltipReloadStream":"Refrescar iste fluxo",
"tooltipRemoveBookmark":"Remover iste marcapginas",
"clearHistory":"Rader historia de navigation",
"ERRORsomethingWentWrong":"Un error ha occurrite.",
"ERRORmustBeLoggedIn":"Es necessari aperir session pro vider iste fluxo.",
"ERRORcouldNotFindUserWithNickname":"Non se trova un usator con pseudonymo \"{nickname}\" sur iste servitor",
"ERRORcouldNotFindGroupWithNickname":"Non se trova un gruppo con pseudonymo \"{nickname}\" sur iste servitor",
"ERRORcouldNotFindPage":"Le pagina non ha essite trovate.",
"ERRORnoticeRemoved": "Iste grana ha essite removite.",
"ERRORnoContactWithServer": "Impossibile establir un connexion al servitor. Le servitor poterea esser supercargate, o il poterea haber un problema con tu connextion a internet. Per favor, reproba plus tarde!",
"ERRORattachmentUploadFailed": "Le incargamento ha fallite. Le formato pote esser non supportate o le dimension pote esser troppo grande.",
"hideRepliesToPeopleIDoNotFollow":"Celar responsas a personas que io non seque",
"markAllNotificationsAsSeen":"Marcar tote le notificationes como vidite",
"notifyRepliesAndMentions":"Mentiones e responsas",
"notifyFavs":"Favorites",
"notifyRepeats":"Disseminationes",
"notifyFollows":"Nove sequitores",
"timelineOptions":"Optiones de chronologia",
"ERRORfailedSavingYourSetting":"Error al salveguardar le configuration",
"ERRORfailedMarkingAllNotificationsAsRead":"Error al marcar tote le notificationes como vidite.",
"newNotification": "{new-notice-count} nove notification",
"newNotifications": "{new-notice-count} nove notificationes",
"thisIsANoticeFromABlockedUser":"Nota ben: Iste es un grana de un usator que tu ha blocate. Clicca pro monstrar lo.",
"nicknamesListWithListName":"Lista de {nickname}: {list-name}",
"myListWithListName":"Mi lista: {list-name}",
"listMembers":"Membros",
"listSubscribers":"Abonatos",
"ERRORcouldNotFindList":"Il non ha tal lista.",
"emailAlreadyInUse":"Jam in uso",
"addEditLanguageLink":"Adjuta a traducer {site-title} in un altere lingua",
"onlyPartlyTranslated":"{site-title} ha essite traducite in <em>{language-name}</em> solmente in parte ({percent}%). Tu pote adjutar a completar le traduction al <a href=\"https://git.gnu.io/h2p/Qvitter/tree/master/locale\">pagina principal del repositorio de Qvitter</a>",
"startRant":"Comenciar un discurso",
"continueRant":"Continuar le discurso",
"hideEmbeddedInTimeline":"Celar contento incastrate in iste chronologia",
"hideQuotesInTimeline":"Celar citatos in iste chronologia",
"userBlocks":"Contos que tu ha blocate",
"buttonBlocked":"Blocate",
"buttonUnblock":"Disblocar",
"failedBlockingUser":"Error al blocar le usator.",
"failedUnblockingUser":"Error al disblocar le usator.",
"unblockUser": "Disblocar",
"tooltipBlocksYou":"Tu es blocate de sequer {username}.",
"silenced":"Silentiate",
"silencedPlural":"Profilos silentiate",
"silencedUsersOnThisInstance":"Profilos silentiate sur {site-title}",
"sandboxed":"In cassa a sablo",
"sandboxedPlural":"Profilos in cassa a sablo",
"sandboxedUsersOnThisInstance":"Profilos in cassa a sablo sur {site-title}",
"silencedStreamDescription":"Usatores silentiate non pote aperir session ni publicar granas e le granas que illes ha jam publicate es celate. Pro usatores local es como un deletion reversibile, pro usatores remote es como un blocada de tote le sito.",
"sandboxedStreamDescription":"Le granas de usatores in cassa a sablo es excludite del Chronologia Public e de Tote Le Rete Cognoscite. Pro le resto, illes pote usar le sito como omne altere usator.",
"onlyShowNotificationsFromUsersIFollow":"Solmente monstrar notificationes de usatores que io seque",
"userOptions":"Altere actiones de usator",
"silenceThisUser":"Silentiar {nickname}",
"sandboxThisUser":"Mitter {nickname} in cassa a sablo",
"unSilenceThisUser":"Non plus silentiar {nickname}",
"unSandboxThisUser":"Liberar {nickname} del cassa a sablo",
"ERRORfailedSandboxingUser":"Error al cambiar le stato de cassa a sablo del usator",
"ERRORfailedSilencingUser":"Error al cambiar le stato de silentiamento del usator",
"muteUser":"Ignorar",
"unmuteUser":"Non plus ignorar",
"hideNotificationsFromMutedUsers":"Celar notificationes de usatores ignorate",
"thisIsANoticeFromAMutedUser":"Tu ha ignorate le autor de iste grana. Clicca hic pro monstrar lo in omne caso.",
"userMutes":"Contos que tu ignora",
"userBlocked":"Contos blocate",
"userMuted":"Contos ignorate",
"mutedStreamDescription":"Tu ha celate iste contos de tu chronologia. Tu recipera totevia notificationes de iste contos, excepte si tu selige &quot;Celar notificationes de usatores ignorate&quot; ab le menu de rota dentate sur le pagina de notificationes.",
"profileAndSettings":"Profilo e configuration",
"profileSettings":"Configuration del profilo",
"thisIsABookmark":"Iste es un marcapaginas create in le interfacie Classic",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"Find someone",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"Attach a file"
}

View File

@ -6,7 +6,7 @@
"loginSignIn": "Enirar",
"loginRememberMe": "Memorar me",
"loginForgotPassword": "Ka vu obliviis vua pasvorto?",
"notices": "Pipii",
"notices": "Pepii",
"followers": "Sequanti",
"following": "Vu sequas",
"groups": "Grupi",
@ -197,9 +197,5 @@
"mutedStreamDescription":"Vu celis ca konti de vua tempolineo. Vu recevos ankore notifiki de ca konti, ecepte se vu selektus &quot;Celar notifiki de muta uzeri&quot; per la menuo dentorota en la pagino di notifiki.",
"profileAndSettings":"Profilo ed ajusti",
"profileSettings":"Ajusti di profilo",
"thisIsABookmark":"Ca esas markorubando kreita en la interfacio klasika",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"Find someone",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"Attach a file"
"thisIsABookmark":"Ca esas markorubando kreita en la interfacio klasika"
}

View File

@ -1,205 +0,0 @@
{
"directionality": "ltr",
"languageName": "Íslenska",
"loginUsername": "Notandanafn eða netfang",
"loginPassword": "Lykilorð",
"loginSignIn": "Skrá inn",
"loginRememberMe": "Muna eftir mér",
"loginForgotPassword": "Gleymt lykilorð?",
"notices": "Umsagnir",
"followers": "Fylgjendur",
"following": "Fylgist með",
"groups": "Hópar",
"compose": "Skrifa nýja umsögn",
"queetVerb": "Senda",
"queetsNounPlural": "Umsagnir",
"logout": "Skrá út",
"languageSelected": "Tungumál:",
"viewMyProfilePage": "Skoða forsíðuna mína",
"expand": "Þenja út",
"collapse": "Fella saman",
"details": "Nánar",
"expandFullConversation": "Fletta út öllum samskiptaþræðinum",
"replyVerb": "Svara",
"requeetVerb": "Endurvarpa",
"favoriteVerb": "Eftirlæti",
"requeetedVerb": "Endurvarpað",
"favoritedVerb": "Sett í eftirlæti",
"replyTo": "Svara",
"requeetedBy": "Endurvarpað af {requeeted-by}",
"favoriteNoun": "Eftirlæti",
"favoritesNoun": "Eftirlæti",
"requeetNoun": "Endurvarpa",
"requeetsNoun": "Endurvarpanir",
"newQueet": "{new-notice-count} ný umsögn",
"newQueets": "{new-notice-count} nýjar umsagnir",
"longmonthsJanuary": "Janúar",
"longmonthsFebruary": "Febrúar",
"longmonthsMars": "Mars",
"longmonthsApril": "Apríl",
"longmonthsMay": "Maí",
"longmonthsJune": "Júní",
"longmonthsJuly": "Júlí",
"longmonthsAugust": "Ágúst",
"longmonthsSeptember": "September",
"longmonthsOctober": "Október",
"longmonthsNovember": "Nóvember",
"longmonthsDecember": "Desember",
"shortmonthsJanuary": "jan",
"shortmonthsFebruary": "feb",
"shortmonthsMars": "mar",
"shortmonthsApril": "apr",
"shortmonthsMay": "maí",
"shortmonthsJune": "jún",
"shortmonthsJuly": "júl",
"shortmonthsAugust": "ágú",
"shortmonthsSeptember": "sep",
"shortmonthsOctober": "okt",
"shortmonthsNovember": "nóv",
"shortmonthsDecember": "des",
"time12am": "{time} fh",
"time12pm": "{time} eh",
"longDateFormat": "{time24} - {day} {month} {year}",
"shortDateFormatSeconds": "{seconds} sek",
"shortDateFormatMinutes": "{minutes}m",
"shortDateFormatHours": "{hours} klst",
"shortDateFormatDate": "{day} {month}",
"shortDateFormatDateAndY": "{day} {month} {year}",
"now": "núna",
"posting": "sendir inn",
"viewMoreInConvBefore": "← Skoða meira í samskiptaþræði",
"viewMoreInConvAfter": "Skoða meira í samskiptaþræði →",
"mentions": "Tilvísanir",
"timeline": "Tímalína",
"publicTimeline": "Opinber tímalína",
"publicAndExtTimeline": "Allt þekkta netkerfið",
"searchVerb": "Leita",
"deleteVerb": "Eyða",
"cancelVerb": "Hætta við",
"deleteConfirmation": "Ertu viss um að þú viljir eyða þessari umsögn?",
"userExternalFollow": "Fylgjast með fjartengt",
"userExternalFollowHelp": "Auðkenni aðgangsins þíns (t.d. notandi@lén.is).",
"userFollow": "Fylgja",
"userFollowing": "Fylgir",
"userUnfollow": "Hætta að fylgja",
"joinGroup": "Taka þátt",
"joinExternalGroup": "Taka þátt fjartengt",
"isMemberOfGroup": "Meðlimur",
"leaveGroup": "Ganga úr",
"memberCount": "Meðlimir",
"adminCount": "Stjórnendur",
"settings": "Stillingar",
"saveChanges": "Vista breytingar",
"linkColor": "Litur tengils",
"backgroundColor": "Bakgrunnslitur",
"newToQuitter": "Nýr á {site-title}?",
"signUp": "Nýskrá",
"signUpFullName": "Fullt nafn",
"signUpEmail": "Tölvupóstur",
"signUpButtonText": "Nýskrá inn á {site-title}",
"welcomeHeading": "Velkomin í {site-title}.",
"welcomeText": "Við erum <span id=\"federated-tooltip\"><div id=\"what-is-federation\">\"Samband (federation)\" þýðir að þú þarft ekki sérstakan aðgang á {site-title} til að fylgjast með, vera fylgt eða hafa samskipti við notendur á {site-title}. Þú getur verið skráð(ur) á hvaða StatusNet eða GNU samfélagsþjóni sem er, eða í hverja þá þjónustu sem notar <a href=\"http://www.w3.org/community/ostatus/wiki/Main_Page\">Ostatus</a> samskiptamátann! Þú þarft ekki einusinni að skrá þig í neina þjónustu prófaðu að setja upp hinn ástsamlega <a href=\"http://www.gnu.org/software/social/\">GNU social</a> hugbúnað á þínum eigin vefþjóni! :)</div>samband</span> örbloggara sem er annt um félagslegt réttlæti og samstöðu - fólk sem vill komast undan miðstýrðum kapítalískum þjónustum.",
"registerNickname": "Stuttnefni",
"registerHomepage": "Heimasíða",
"registerBio": "Æviágrip",
"registerLocation": "Staðsetning",
"registerRepeatPassword": "Endurtaka lykilorð",
"moreSettings": "Fleiri stillingar",
"otherServers": "Þú getur einnig stofnað aðgang á einhverjum öðrum þjóni á GNU samfélagsmiðlanetinu. <a href=\"http://federation.skilledtests.com/select_your_server.html\">Samanburður</a>",
"editMyProfile": "Breyta sniði",
"notifications": "Tilkynningar",
"xFavedYourQueet": "setti umsögn frá þér í eftirlæti",
"xRepeatedYourQueet": "endurvarpaði frá þér",
"xStartedFollowingYou": "fylgdi þér",
"followsYou": "fylgir þér",
"FAQ": "FAQ / Algengar spurningar",
"inviteAFriend": "Bjóða vini!",
"goToExternalProfile": "Skoða fullt notandasnið",
"cropAndSave": "Utanskera og vista",
"showTerms": "Lestu notkunarskilmálana okkar",
"ellipsisMore": "Meira",
"blockUser": "Loka á",
"goToOriginalNotice": "Fara á upprunalegu umsögnina",
"goToTheUsersRemoteProfile": "Fara á fjartengt upplýsingasnið um notandann",
"clickToDrag": "Smelltu til að draga",
"keyboardShortcuts": "Flýtilyklar",
"classicInterface": "Klassískt {site-title}",
"accessibilityToggleLink": "Til að fá aukið aðgengi fyrir notendur, smelltu á þennan tengil til að skipta yfir í klassíska viðmótið",
"tooltipBookmarkStream": "Bæta þessu streymi í bókamerkin þín",
"tooltipTopMenu": "Valmynd og stillingar",
"tooltipAttachImage": "Hengja við myndskrá",
"tooltipShortenUrls": "Stytta allar vefslóðir í umsögninni",
"tooltipReloadStream": "Uppfæra þetta streymi",
"tooltipRemoveBookmark": "Fjarlægja þetta bókamerki",
"clearHistory": "Hreinsa vafurferil",
"ERRORsomethingWentWrong": "Eitthvað fór úrskeiðis.",
"ERRORmustBeLoggedIn": "Þú verður að vera skráður inn til að skoða þetta streymi.",
"ERRORcouldNotFindUserWithNickname": "Fann ekki notanda með stuttnefnið \"{nickname}\" á þessum þjóni",
"ERRORcouldNotFindGroupWithNickname": "Fann ekki hóp með stuttnefnið \"{nickname}\" á þessum þjóni",
"ERRORcouldNotFindPage": "Fann ekki þessa síðu.",
"ERRORnoticeRemoved": "Þessi umsögn hefur verið fjarlægð.",
"ERRORnoContactWithServer": "Tekst ekki að ná tengingu við þjóninn. Þjónninn gæti verið undir of miklu álagi, eða að vandamál séu með internettenginguna þína. Prófaðu aftur síðar!",
"ERRORattachmentUploadFailed": "Innsending skráar mistókst. Annað hvort er hún of stór eða að skráasnið hennar er ekki stutt.",
"hideRepliesToPeopleIDoNotFollow": "Fela svör til fólks sem ég fylgist ekki með",
"markAllNotificationsAsSeen": "Merkja allar tilkynningar sem séðar",
"notifyRepliesAndMentions": "Tilvísanir og svör",
"notifyFavs": "Eftirlæti",
"notifyRepeats": "Endurvarpanir",
"notifyFollows": "Nýir fylgjendur",
"timelineOptions": "Valkostir tímalínu",
"ERRORfailedSavingYourSetting": "Mistókst að vista stillingarnar þínar",
"ERRORfailedMarkingAllNotificationsAsRead": "Tókst ekki að merkja allar tilkynningar sem séðar.",
"newNotification": "{new-notice-count} ný tilkynning",
"newNotifications": "{new-notice-count} nýjar tilkynningar",
"thisIsANoticeFromABlockedUser": "Aðvörun: Þetta er umsögn frá notanda sem þú hefur útilokað. Smelltu til að birta hana.",
"nicknamesListWithListName": "Listi eftir {nickname}: {list-name}",
"myListWithListName": "Listinn minn: {list-name}",
"listMembers": "Meðlimir",
"listSubscribers": "Áskrifendur",
"ERRORcouldNotFindList": "Það er enginn slíkur listi.",
"emailAlreadyInUse": "Þegar í notkun",
"addEditLanguageLink": "Hjálpaðu til við að þýða {site-title} á annað tungumál",
"onlyPartlyTranslated": "{site-title} er aðeins þýtt af hluta til yfir á <em>{language-name}</em> ({percent}%). Þú getur hjálpað til við að klára þýðinguna á <a href=\"https://git.gnu.io/h2p/Qvitter/tree/master/locale\">vefsíðu hugbúnaðarsafns Qvitter</a>",
"startRant": "Byrja nöldur",
"continueRant": "Halda áfram með nöldur",
"hideEmbeddedInTimeline": "Fela innbyggt efni í þessari tímalínu",
"hideQuotesInTimeline": "Fela tilvitnanir í þessari tímalínu",
"userBlocks": "Aðgangar sem þú útilokar",
"buttonBlocked": "Útilokaður",
"buttonUnblock": "Opna á",
"failedBlockingUser": "Tókst ekki að útiloka þennan notanda.",
"failedUnblockingUser": "Tókst ekki að opna á þennan notanda.",
"unblockUser": "Opna á",
"tooltipBlocksYou": "Þú ert útilokaður frá því að fylgja {username}.",
"silenced": "Þaggaður",
"silencedPlural": "Niðurþögguð notendasnið",
"silencedUsersOnThisInstance": "Niðurþögguð notendasnið á {site-title}",
"sandboxed": "Einangrað",
"sandboxedPlural": "Einangruð notendasnið",
"sandboxedUsersOnThisInstance": "Einangruð notendasnið á {site-title}",
"silencedStreamDescription": "Þaggaðir notendur geta ekki skráð sig inn eða sent inn umsagnir, og umsagnir sem þeir hafa þegar sent inn eru faldar. Fyrir staðværa notendur er þetta eins og eyðing sem hægt er að afturkalla, fyrir fjartengda notendur er þetta eins og bann á vefsvæðinu.",
"sandboxedStreamDescription": "Umsagnir frá einöngruðum notendum eru útilokaðar frá opinberu tímalínunni og frá öllu þekkta netinu. Að þessu undanskildu geta þessir notendur notað vefsvæðið rétt eins og hver annar notandi.",
"onlyShowNotificationsFromUsersIFollow": "Einungis birta tilkynningar frá notendum sem ég fylgi",
"userOptions": "Fleiri notandaaðgerðir",
"silenceThisUser": "Þagga niður í {nickname}",
"sandboxThisUser": "Einangra {nickname}",
"unSilenceThisUser": "Hætta að þagga niður í {nickname}",
"unSandboxThisUser": "Taka {nickname} úr einangrun",
"ERRORfailedSandboxingUser": "Tókst ekki að setja þennan notanda í/út einangrun",
"ERRORfailedSilencingUser": "Tókst ekki að þagga/afþagga þennan notanda",
"muteUser": "Þagga niður",
"unmuteUser": "Hætta þöggun",
"hideNotificationsFromMutedUsers": "Fela tilkynningar frá þögguðum notendum",
"thisIsANoticeFromAMutedUser": "Þú hefur þaggað niður í höfundi þessarar umsagnar. Smelltu hér til að birta hana samt.",
"userMutes": "Aðgangar sem þú þaggar niður í",
"userBlocked": "Útilokaðir aðgangar",
"userMuted": "Þaggaðir aðgangar",
"mutedStreamDescription": "Þú hefur falið þessa aðganga á tímalínunni þinni. Þú munt áfram fá tilkynningar frá þessum aðgöngum, nema ef þú velur &quot;Fela tilkynningar frá þögguðum notendum&quot; úr valmyndinni á tilkynningasíðunni.",
"profileAndSettings": "Persónusnið og stillingar",
"profileSettings": "Sniðstillingar",
"thisIsABookmark": "Þetta er bókamerki sem búið var til í klassíska viðmótinu",
"thisIsARemoteUser": "<strong>Aðvörun!</strong> Þetta er fjartengdur notandi. Þessi síða er einungis afrit af notandasniði hans og inniheldur einungis þau gögn sem tiltæk eru þessum þjóni á GNU samfélagsnetinu. Farðu á <a href=\"{remote-profile-url}\" donthijack>notandasniðið á þeirra eigin þjóni</a> til að skoða allt notandasniðið.",
"findSomeone": "Finna einhvern",
"findSomeoneTooltip": "Settu inn notandanafn eða slóð á notandasnið, t.d. @notandi eða https://fjartengt.kerfi/stuttnefni",
"tooltipAttachFile": "Hengja við skrá"
}

View File

@ -126,7 +126,7 @@
"classicInterface":"Classic {site-title}",
"accessibilityToggleLink":"Passare all'interfaccia classica (Accessibilità)",
"tooltipBookmarkStream":"Aggiungi ai preferiti",
"tooltipTopMenu":"Menu e impostazioni",
"tooltipTopMenu":"Menu and settings",
"tooltipAttachImage":"Carica un'immagine",
"tooltipShortenUrls":"Shorten all URLs in the Queet",
"tooltipReloadStream":"Aggiorna",
@ -162,7 +162,7 @@
"onlyPartlyTranslated":"{site-title} è solo parzialmente tradotto in <em>{language-name}</em> ({percent}%). Puoi completare la traduzione sul <a href=\"https://git.gnu.io/h2p/Qvitter/tree/master/locale\">repository di Qvitter</a>",
"startRant":"Start a rant",
"continueRant":"Continue the rant",
"hideEmbeddedInTimeline":"Nascondi anteprime da questa bacheca",
"hideEmbeddedInTimeline":"Hide embedded content in this timeline",
"hideQuotesInTimeline":"Hide quotes in this timeline",
"userBlocks":"Account bloccati",
"buttonBlocked":"Bloccato",
@ -170,17 +170,17 @@
"failedBlockingUser":"Tentativo di bloccare l'utente non riuscito.",
"failedUnblockingUser":"Tentativo di sblocco dell'utente non riuscito.",
"unblockUser": "Sblocca {username}",
"tooltipBlocksYou":"Sei stato bloccato da {username}.",
"tooltipBlocksYou":"You are blocked from following {username}.",
"silenced":"Silenziati",
"silencedPlural":"Silenziati",
"silencedUsersOnThisInstance":"Account silenziati su {site-title}",
"sandboxed":"Sandboxati",
"sandboxedPlural":"Account sandboxati",
"sandboxedUsersOnThisInstance":"Account sandboxati su {site-title}",
"silencedStreamDescription":"Utenti silenziati non possono accedere o postare queet e i queet che hanno già postato sono nascosti per gli utenti locali è come una cancellazione reversibile, per gli utenti remoti costituisce un blocco all'intero sito.",
"sandboxedStreamDescription":"Queet da utenti sandboxati sono esclusi dalla bacheca pubblica e dal resto del network. a parte questo possono usare il sito come ogni altro utente",
"silencedStreamDescription":"Utenti silenziati non possono accedere o postare quips e i quips che hanno già postato sono nascosti per gli utenti locali è come una cancellazione reversibile, per gli utenti remoti costituisce un blocco all'intero sito.",
"sandboxedStreamDescription":"Quips da utenti sandboxati sono esclusi dalla bacheca pubblica e dal resto del network. a parte questo possono usare il sito come ogni altro utente",
"onlyShowNotificationsFromUsersIFollow":"Mostrami le notifiche solo dagli utenti che seguo",
"userOptions":"Mostra più opzioni",
"userOptions":"More user actions",
"silenceThisUser":"Nascondi notifiche da {nickname}",
"sandboxThisUser":"Aggiungi alla sandbox {nickname}",
"unSilenceThisUser":"Mostra notifiche da {nickname}",
@ -190,17 +190,12 @@
"muteUser":"Togli voce",
"unmuteUser":"Ridai voce",
"hideNotificationsFromMutedUsers":"Nascondi notifiche dagli account senza voce",
"thisIsANoticeFromAMutedUser":"Hai nascosto dalla bacheca i queet di questo account. Clicca qui per mostrare ugualmente.",
"thisIsANoticeFromAMutedUser":"Hai nascosto dalla bacheca i quip di questo account. Clicca qui per mostrare ugualmente.",
"userMutes":"Account a cui hai tolto la voce",
"userBlocked":"Account bloccati",
"userMuted":"Account a cui hai tolto la voce",
"mutedStreamDescription":"Hai nascosto questi account dalla tua bacheca. Riceverai comunque le loro notifiche, per disabilitarle seleziona &quot;Nascondi notifiche dagli account senza voce&quot; dal menu delle impostazioni sulla pagina relativa alle notifiche.",
"profileAndSettings":"Profilo e impostazioni",
"profileSettings":"Impostazioni del profilo",
"thisIsABookmark":"Questo è un segnalibro creato nell'interfaccia classica",
"thisIsARemoteUser":"<strong>Attenzione!</strong> Questo è un utente remoto. Questa pagina è solo una copia mantenuta nella cache, e include solo i dati presenti al momento dell'operazione di caching effettuata da GNU social. Vai al <a href=\"{remote-profile-url}\" donthijack>profilo dell'utente sul suo server</a> per vedere il profilo completo.",
"findSomeone":"Cerca qualcuno",
"findSomeoneTooltip":"Inserisci l'username o l'url del profilo, es. @localuser o https://remote.instance/nickname",
"tooltipAttachFile":"Allega un file"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -197,9 +197,5 @@
"mutedStreamDescription":"あなたのタイムラインから、選択されたユーザーを隠しました。あなたがお知らせページの歯車のメニューにある&quot;ミュートしたユーザーからのお知らせを隠す&quot;を選択しなかったユーザー以外からは、まだお知らせを受け取ります。",
"profileAndSettings":"プロフィールと設定",
"profileSettings":"プロフィール設定",
"thisIsABookmark":"これはクラシックインターフェースで作られたブックマークです",
"thisIsARemoteUser":"<strong>注意!</strong> これはリモートユーザーです。このページはリモートユーザーのプロフィールのキャッシュされている複製であり、このGNU socialインスタンスに保存されたデータのみを含みます。<a href=\"{remote-profile-url}\" donthijack>このユーザーが所属するサーバーのプロフィール</a>で完全なプロフィールを閲覧できます。",
"findSomeone":"誰かを検索",
"findSomeoneTooltip":"ユーザー名またはプロフィールURLを入力 (例: @localuser または https://remote.instance/nickname)",
"tooltipAttachFile":"Attach a file"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -1,7 +1,7 @@
{
"directionality":"ltr",
"languageName": "Norsk",
"loginUsername": "Brukernavn eller epost",
"loginUsername": "Brukernavn eller e-Post",
"loginPassword": "Passord",
"loginSignIn": "Logg inn",
"loginRememberMe": "Husk meg",
@ -33,18 +33,18 @@
"requeetsNoun": "Requeeter",
"newQueet": "{new-notice-count} ny Queet",
"newQueets": "{new-notice-count} nye Queets",
"longmonthsJanuary": "januar",
"longmonthsFebruary": "februar",
"longmonthsMars": "mars",
"longmonthsApril": "april",
"longmonthsMay": "mai",
"longmonthsJune": "juni",
"longmonthsJuly": "juli",
"longmonthsAugust": "august",
"longmonthsSeptember": "september",
"longmonthsOctober": "oktober",
"longmonthsNovember": "november",
"longmonthsDecember": "desember",
"longmonthsJanuary": "Januar",
"longmonthsFebruary": "Februar",
"longmonthsMars": "Mars",
"longmonthsApril": "April",
"longmonthsMay": "Mai",
"longmonthsJune": "Juni",
"longmonthsJuly": "Juli",
"longmonthsAugust": "August",
"longmonthsSeptember": "September",
"longmonthsOctober": "Oktober",
"longmonthsNovember": "November",
"longmonthsDecember": "Desember",
"shortmonthsJanuary": "jan",
"shortmonthsFebruary": "feb",
"shortmonthsMars": "mar",
@ -59,7 +59,7 @@
"shortmonthsDecember": "des",
"time12am": "{time} am",
"time12pm": "{time} pm",
"longDateFormat": "{time24} - {day} {month} {year}",
"longDateFormat": "{time12} - {day} {month} {year}",
"shortDateFormatSeconds": "{seconds}s",
"shortDateFormatMinutes": "{minutes}m",
"shortDateFormatHours": "{hours}t",
@ -94,8 +94,8 @@
"backgroundColor": "Bakgrunds farge",
"newToQuitter": "Ny på {site-title}?",
"signUp": "Registrere deg",
"signUpFullName": "Fullt navn",
"signUpEmail": "epost",
"signUpFullName": "Fult navn",
"signUpEmail": "e-Post",
"signUpButtonText": "Registrere deg på {site-title}",
"welcomeHeading": "Velkommen til {site-title}.",
"welcomeText": "Vi er en <span id=\"federated-tooltip\"><div id=\"what-is-federation\">\"Forenet eller (Federation)\" betyr i denne konteksten at du ikke behøver å ha en {site-title}-konto for å følge eller følges av andre og prate med andre i nettverket. Du kan registrere deg på hvilken som helst instans/server som støtter protokollen <a href=\"http://www.w3.org/community/ostatus/wiki/Main_Page\">Ostatus</a>, eller mikroblogge på en helt egen server, med den frie programvaren <a href=\"http://www.gnu.org/software/social/\">GNU social</a> (som {site-title} bygger på).</div>forenet</span> allmenhet, der du som har hoppet av de sentraliserte tjenestene kan mikroblogge etisk og solidarisk.",
@ -122,23 +122,23 @@
"goToOriginalNotice": "Gå til den opprinnelige queeten",
"goToTheUsersRemoteProfile": "Vis brukerens profil",
"clickToDrag":"Klikk - dra og slipp",
"keyboardShortcuts":"Tastatursnarveier",
"keyboardShortcuts":"Tastatur snarveier",
"classicInterface":"Klassisk {site-title}",
"accessibilityToggleLink":"For bedre synlighet, klikk denne lenken for å bytte til klassisk grensesnitt",
"tooltipBookmarkStream":"Legg denne strømmen til i dine bokmerker",
"tooltipBookmarkStream":"Legg til denne strømmen til dine bokmerker",
"tooltipTopMenu":"Meny og innstillinger",
"tooltipAttachImage":"Legg til et bilde",
"tooltipShortenUrls":"Krympe alle URLer i din Queet",
"tooltipReloadStream":"Last denne strømmen inn på nytt",
"tooltipReloadStream":"Laste inn på nytt denne strømmen",
"tooltipRemoveBookmark":"Slett dette bokmerket",
"clearHistory":"Slett besøkshistorie",
"clearHistory":"Slett nettleser historie",
"ERRORsomethingWentWrong":"Noe gikk galt.",
"ERRORmustBeLoggedIn":"Du må være pålogget for å vise denne strømmen.",
"ERRORcouldNotFindUserWithNickname":"Kan ikke finne en bruker med brukerid \"{nickname}\" på denne instansen",
"ERRORcouldNotFindGroupWithNickname":"Kan ikke finne en gruppe med gruppenavnet \"{nickname}\" på denne instansen",
"ERRORcouldNotFindPage":"Kan ikke finne siden.",
"ERRORnoticeRemoved": "Denne notisen er slettet.",
"ERRORnoContactWithServer": "Kan ikke etablere en kobling til instansen. Dette kan skyldes at den er overbelastet, eller det er et problem med din internettt-tilkobling. Vennligst forsøk senere.",
"ERRORnoContactWithServer": "Kan ikke etablere en kobling til instansen. Dette kan skyldes at den er overbelastet, eller det er et problem med din internet kobling. Vennligst forsøk senere.",
"ERRORattachmentUploadFailed": "Opplasting feilet. Formatet er muligens ikke supportert, eller filen er for stor.",
"hideRepliesToPeopleIDoNotFollow":"Skjul svar fra profiler jeg ikke følger.",
"markAllNotificationsAsSeen":"Marker alle varsler som lest",
@ -162,7 +162,7 @@
"onlyPartlyTranslated":"{site-title} er kun delvis oversatt til <em>{language-name}</em> ({percent}%). Du kan hjelpe å oversette i følgende lenke <a href=\"https://git.gnu.io/h2p/Qvitter/tree/master/locale\">Qvitter's repository hjemmeside</a>",
"startRant":"Start en utblåsning",
"continueRant":"Fortsett utblåsningen",
"hideEmbeddedInTimeline":"Skjul innebygget innhold i denne tidslinjen",
"hideEmbeddedInTimeline":"Skjul inkluderende innhold i denne tidslinjen",
"hideQuotesInTimeline":"Skjul sitater i denne tidslinjen",
"userBlocks":"Brukere du blokkerer",
"buttonBlocked":"Blokkert",
@ -197,9 +197,5 @@
"mutedStreamDescription":"Du har skjul disse kontoene fra din tidslinje. Du vil alikevel motta notifikasjoner fra disse kontoene, hvis da du ikke velger &quot;Skjul notifikasjoner fra forstummede brukere&quot; fra tannhjul menyen på notifikasjons siden.",
"profileAndSettings":"Profiler og innstillinger",
"profileSettings":"Profil innstillinger",
"thisIsABookmark":"Dette er et bokmerke som ble laget i det klassiske grensesnittet",
"thisIsARemoteUser":"<strong>Advarsel!</strong> Dette er en ekstern bruker. Denne siden er en hurtiglagret versjon av profilen som bare inneholder data kjent for denne GNU social instansen. Gå til <a href=\"{remote-profile-url}\" donthijack>brukerens profil på egen instans</a> for å vise hele profilen.",
"findSomeone":"Finn noen",
"findSomeoneTooltip":"Skriv inn et brukernavn, eller en profil url, for eksempel. @lokalbruker eller https://ekstern.instans/brukernavn",
"tooltipAttachFile":"Legg ved fil"
"thisIsABookmark":"Dette er et bokmerke som ble laget i det klassiske grensesnittet"
}

View File

@ -197,9 +197,5 @@
"mutedStreamDescription":"Je negeert deze gebruikers in je tijdlijn. Je krijgt wel nog mededelingen van deze gebruikers, tenzij je &quot;Geen mededelingen van genegeerde gebruikers.&quot; kiest van het instellingen icoon op de mededelingen pagina.",
"profileAndSettings":"Profiel en instellingen",
"profileSettings":"Profiel instellingen",
"thisIsABookmark":"This is a bookmark created in the Classic interface",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"Find someone",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"Attach a file"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -1,205 +1,201 @@
{
"directionality":"ltr",
"languageName": "Polish",
"loginUsername": "Nazwa użytkownika lub email",
"loginPassword": "Hasło",
"loginSignIn": "Zaloguj się",
"loginRememberMe": "Zapamiętaj mnie",
"loginForgotPassword": "Nie pamiętasz hasła?",
"notices": "Queety",
"followers": "Obserwujący",
"following": "Obserwowani",
"groups": "Grupy",
"compose": "Co się dzieje?",
"queetVerb": "Wyślij",
"queetsNounPlural": "Queety",
"logout": "Wyloguj się",
"languageSelected": "Język:",
"viewMyProfilePage": "Zobacz swój profil",
"expand": "Rozwiń",
"collapse": "Zwiń",
"details": "Szczegóły",
"expandFullConversation": "Rozwiń całą rozmowę",
"replyVerb": "Odpowiedź",
"requeetVerb": "Podaj dalej",
"favoriteVerb": "Ulubiony",
"requeetedVerb": "Podany dalej",
"favoritedVerb": "Polubione",
"replyTo": "Odpowiedz",
"requeetedBy": "Podany dalej przez {requeeted-by}",
"favoriteNoun": "Ulubiony",
"favoritesNoun": "Ulubione",
"requeetNoun": "Podaj dalej",
"requeetsNoun": "Podane dalej",
"newQueet": "{new-notice-count} nowy queet",
"newQueets": "{new-notice-count} nowych queetów",
"longmonthsJanuary": "styczeń",
"longmonthsFebruary": "luty",
"longmonthsMars": "marzec",
"longmonthsApril": "kwiecień",
"longmonthsMay": "maj",
"longmonthsJune": "czerwiec",
"longmonthsJuly": "lipiec",
"longmonthsAugust": "sierpień",
"longmonthsSeptember": "wrzesień",
"longmonthsOctober": "październik",
"longmonthsNovember": "listopad",
"longmonthsDecember": "grudzień",
"shortmonthsJanuary": "styczeń",
"shortmonthsFebruary": "luty",
"shortmonthsMars": "marzec",
"shortmonthsApril": "kwiecien",
"shortmonthsMay": "maj",
"shortmonthsJune": "czerwiec",
"shortmonthsJuly": "lipiec",
"shortmonthsAugust": "sierpień",
"shortmonthsSeptember": "wrzesień",
"shortmonthsOctober": "październik",
"shortmonthsNovember": "listopad",
"shortmonthsDecember": "grudzień",
"time12am": "{time} am",
"time12pm": "{time} pm",
"longDateFormat": "{time12} - {day} {month} {year}",
"shortDateFormatSeconds": "{seconds}s",
"shortDateFormatMinutes": "{minutes}m",
"shortDateFormatHours": "{hours}godz.",
"shortDateFormatDate": "{day} {month}",
"shortDateFormatDateAndY": "{day} {month} {year}",
"now": "teraz",
"posting": "dodawanie",
"viewMoreInConvBefore": " zobacz więcej w rozmowie",
"viewMoreInConvAfter": "Zobacz więcej w rozmowie ",
"mentions": "Wzmianki",
"timeline": "Oś czasu",
"publicTimeline": "Publiczna oś czasu",
"publicAndExtTimeline": "Cała znana sieć",
"searchVerb": "Szukaj",
"deleteVerb": "Usuń",
"cancelVerb": "Anuluj",
"deleteConfirmation": "Czy na pewno chcesz usunąć ten queet?",
"userExternalFollow": "Zdalne obserwowanie",
"userExternalFollowHelp": "ID Twojego konta (np user@rainbowdash.net).",
"userFollow": "Obserwuj",
"userFollowing": "Obserwowany",
"userUnfollow": "Przestań obserwować",
"joinGroup": "Dołącz",
"joinExternalGroup": "Dołącz zdalnie",
"isMemberOfGroup": "Użytkownik",
"leaveGroup": "Opuść",
"memberCount": "Członkowie",
"adminCount": "Administratorzy",
"settings": "Ustawienia",
"saveChanges": "Zapisz zmiany",
"linkColor": "Kolor linku",
"backgroundColor": "Kolor tła",
"newToQuitter": "Nowy na {site-title}?",
"signUp": "Zarejestruj się",
"signUpFullName": "Imię i nazwisko",
"signUpEmail": "Email",
"signUpButtonText": "Zarejestruj się na {site-title}",
"welcomeHeading": "Witamy na {site-title}.",
"welcomeText": "Jesteśmy społecznością mikroblogerów, złożoną z globalnej <span id=\"federated-tooltip\"><div id=\"what-is-federation\">Oznacza to, że nie musisz posiadać konta na {site-title} aby komunikować się z użytkownikami {site-title}, obserwować lub aby mieć obserwujących na {site-title}. Możesz się także rejestrować na innych serwerach <a href=\"http://www.gnu.org/software/social/\">GNU social</a> lub na innej usłudze, która obsługuje protokół <a href=\"http://www.w3.org/community/ostatus/wiki/Main_Page\">OStatus</a>. Możesz nawet uczestniczyć bez rejestracji, jeśli zainstalujesz GNU social na własnym serwerze. </div>Sieci</span> niezależnych serwerów Gnu social, znanych również jako StatusNet. Jesteśmy idealnym miejscem dla <strong>ludzi takich jak Ty</strong>, dla których etyka i solidarność coś znaczy, a które nie chcą uczestniczyć w scentralizowanych usługach komercyjnych.",
"registerNickname": "Nick",
"registerHomepage": "Strona internetowa",
"registerBio": "O mnie",
"registerLocation": "Lokalizacja",
"registerRepeatPassword": "Powtórz hasło",
"moreSettings": "Więcej ustawień",
"otherServers": "Alternatywnie można utworzyć konto na innym serwerze GNU social <a href=\"http://federation.skilledtests.com/select_your_server.html\">Porównanie</a>",
"editMyProfile": "Edytuj profil",
"notifications": "Powiadomienia",
"xFavedYourQueet": "dodał do ulubionych twój Queet",
"xRepeatedYourQueet": "podał dalej Twojego Queeta",
"xStartedFollowingYou": "zaczął Cię obserwować",
"followsYou": "obserwuje Cię",
"FAQ": "FAQ",
"inviteAFriend": "Zaproś przyjaciół!",
"goToExternalProfile": "Pokaż pełny profil",
"cropAndSave": "Przytnij i zapisz",
"showTerms": "Przeczytaj nasze Warunki korzystania",
"ellipsisMore": "Więcej",
"blockUser": "Zablokuj",
"goToOriginalNotice": "Idź do pierwotnego queeta",
"goToTheUsersRemoteProfile": "Idź do zdalnego profilu użytkownika",
"clickToDrag":"Kliknij, aby przeciągnąć",
"keyboardShortcuts":"Skróty klawiszowe",
"classicInterface":"Klasyczny {site-title}",
"accessibilityToggleLink":"Dla lepszej dostępności należy kliknąć ten link, aby przejść do klasycznego interfejsu",
"tooltipBookmarkStream":"Dodaj ten strumień do zakładek",
"tooltipTopMenu":"Menu i ustawienia",
"tooltipAttachImage":"Dodaj zdjęcie",
"tooltipShortenUrls":"Skrócić wszystkie adresy URL w tym queecie",
"tooltipReloadStream":"Odśwież strumień",
"tooltipRemoveBookmark":"Usuń tę zakładkę",
"clearHistory":"Wyczyść historię przeglądania",
"ERRORsomethingWentWrong":"Coś poszło nie tak.",
"ERRORmustBeLoggedIn":"Musisz być zalogowany, aby zobaczyć ten strumień.",
"ERRORcouldNotFindUserWithNickname":"Nie można znaleźć użytkownika o nicku \"{nickname}\" na tym serwerze",
"ERRORcouldNotFindGroupWithNickname":"Nie można znaleźć grupy o nazie \"{nickname}\" na tym serwerze",
"ERRORcouldNotFindPage":"Nie można znaleźć podanej strony.",
"ERRORnoticeRemoved": "Ten queet został usunięty.",
"ERRORnoContactWithServer": "Nie można nawiązać połączenia z serwerem. Serwer może być przeciążony lub możesz mieć problemy z połączeniem internetowym. Spróbuj ponownie później.",
"ERRORattachmentUploadFailed": "Przesyłanie nie powiodło się. Format może być nieobsługiwany lub rozmiar jest zbyt duży.",
"hideRepliesToPeopleIDoNotFollow":"Ukryj odpowiedzieci od ludzi, których nie obserwuję",
"markAllNotificationsAsSeen":"Oznacz wszystkie powiadomienia jako przeczytane",
"notifyRepliesAndMentions":"Wzmianki i odpowiedzi",
"notifyFavs":"Ulubione",
"notifyRepeats":"Podane dalej",
"notifyFollows":"Nowi obserwujący",
"timelineOptions":"Ustawienia osi czasu",
"ERRORfailedSavingYourSetting":"Błąd podczas zapisywania Twoich ustawień",
"ERRORfailedMarkingAllNotificationsAsRead":"Błąd podczas ozanczania powiadomień jako przeczytane.",
"newNotification": "{new-notice-count} nowe powiadomienie",
"newNotifications": "{new-notice-count} nowych powiadomień",
"thisIsANoticeFromABlockedUser":"Ostrzeżenie: To queet od użytkownika, którego zablokowałeś. Kliknij, by zobaczyć.",
"nicknamesListWithListName":"Lista użytkownika {nickname}: {list-name}",
"myListWithListName":"Moja lista: {list-name}",
"listMembers":"Użytkownicy",
"listSubscribers":"Subskrybujący",
"ERRORcouldNotFindList":"Nie ma takiej listy.",
"emailAlreadyInUse":"Już w użyciu",
"addEditLanguageLink":"Pomóż przetłumaczyć {site-title} na inny język",
"onlyPartlyTranslated":"{site-title} został przetłumaczony częściowo na język <em>{language-name}</em> ({percent}%).Możesz pomóc w ukończeniu tłumaczenia na <a href=\"https://git.gnu.io/h2p/Qvitter/tree/master/locale\">Qvitter's repository homepage</a>",
"startRant":"Rozpocznij przemówienie",
"continueRant":"Kontynuuj przemówienie",
"hideEmbeddedInTimeline":"Ukryj osadzony kontent na tej osi czasu",
"hideQuotesInTimeline":"Ukryj cytaty na tej osi czasu",
"userBlocks":"Konta, które blokujesz",
"buttonBlocked":"Zablokowany",
"buttonUnblock":"Odblokuj",
"failedBlockingUser":"Nie udało się zablokować użytkownika.",
"failedUnblockingUser":"Nie udało się odblokować użytkownika.",
"unblockUser": "Odblokuj",
"tooltipBlocksYou":"Jesteś zablokowany przez {username}.",
"silenced":"Wyciszony",
"silencedPlural":"Wyciszone profile",
"silencedUsersOnThisInstance":"Wyciszone profile na {site-title}",
"sandboxed":"Zsandboksowany",
"sandboxedPlural":"Zsandboksowane profile",
"sandboxedUsersOnThisInstance":"Zsandboksowane profile na {site-title}",
"silencedStreamDescription":"Wyciszeni użytkownicy nie mogą się zalogować ani dodawać nowych queetów, a te, które już dodali, są ukryte. Dla użytkowników lokalnych jest to podobne do usunięcia, które można cofnąć, zaś dla użytkowników zdalnych jest to zablokowanie całej strony.",
"sandboxedStreamDescription":"Queety od zsandboksowanych użytkowników są wyłączone z publicznej osi czasu oraz całej sieci. Poza tym mogą oni używać strony jak każdy inny użytkownik.",
"onlyShowNotificationsFromUsersIFollow":"Pokazuj tylko powiadomienia od użytkowników, których obserwuję",
"userOptions":"Więcej opcji",
"silenceThisUser":"Wycisz {nickname}",
"sandboxThisUser":"Zsandboksuj użytkownika {nickname}",
"unSilenceThisUser":"Odcisz {nickname}",
"unSandboxThisUser":"Odsandboksuj użytkownika {nickname}",
"ERRORfailedSandboxingUser":"Błąd poczas sandboksowania/odsandboksowywania użytkownika",
"ERRORfailedSilencingUser":"Błąd podczas uciszania/odciszania użytkownika",
"muteUser":"Wycisz",
"unmuteUser":"Odcisz",
"hideNotificationsFromMutedUsers":"Ukryj powiadomienia od wycziszonych użytkowników",
"thisIsANoticeFromAMutedUser":"Wyciszyłeś autora tego queeta. Kliknij tu, aby go pokazać.",
"userMutes":"Użytkownicy, których wyciszyłeś",
"userBlocked":"Zablokowani użytkownicy",
"userMuted":"Wyciszeni użytkownicy",
"mutedStreamDescription":"Ukryłeś te konta na swojej osi czasu. Nadal będziesz otrzymywać powiadomienia od tych użytkowników, chyba że wybierzesz opcję &quot;Ukryj powiadomienia od wyciszonych użytkowników&quot;, znajdującą się w rozwijanym menu na stronie powiadomień.",
"profileAndSettings":"Profil i ustawienia",
"profileSettings":"Ustawienia profilu",
"thisIsABookmark":"To jest zakładka stworzona w klasycznym interfejsie",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"Find someone",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"Attach a file"
}
"directionality":"ltr",
"languageName": "Polish",
"loginUsername": "Nazwa użytkownika lub email",
"loginPassword": "Hasło",
"loginSignIn": "Zaloguj się",
"loginRememberMe": "Zapamiętaj mnie",
"loginForgotPassword": "Nie pamiętasz hasła?",
"notices": "Queety",
"followers": "Obserwujący",
"following": "Obserwowani",
"groups": "Grupy",
"compose": "Co się dzieje?",
"queetVerb": "Wyślij",
"queetsNounPlural": "Queety",
"logout": "Wyloguj się",
"languageSelected": "Język:",
"viewMyProfilePage": "Zobacz swój profil",
"expand": "Rozwiń",
"collapse": "Zwiń",
"details": "Szczegóły",
"expandFullConversation": "Rozwiń całą rozmowę",
"replyVerb": "Odpowiedź",
"requeetVerb": "Podaj dalej",
"favoriteVerb": "Ulubiony",
"requeetedVerb": "Podany dalej",
"favoritedVerb": "Polubione",
"replyTo": "Odpowiedz",
"requeetedBy": "Podany dalej przez {requeeted-by}",
"favoriteNoun": "Ulubiony",
"favoritesNoun": "Ulubione",
"requeetNoun": "Podaj dalej",
"requeetsNoun": "Podane dalej",
"newQueet": "{new-notice-count} nowy queet",
"newQueets": "{new-notice-count} nowych queetów",
"longmonthsJanuary": "styczeń",
"longmonthsFebruary": "luty",
"longmonthsMars": "marzec",
"longmonthsApril": "kwiecień",
"longmonthsMay": "maj",
"longmonthsJune": "czerwiec",
"longmonthsJuly": "lipiec",
"longmonthsAugust": "sierpień",
"longmonthsSeptember": "wrzesień",
"longmonthsOctober": "październik",
"longmonthsNovember": "listopad",
"longmonthsDecember": "grudzień",
"shortmonthsJanuary": "styczeń",
"shortmonthsFebruary": "luty",
"shortmonthsMars": "marzec",
"shortmonthsApril": "kwiecien",
"shortmonthsMay": "maj",
"shortmonthsJune": "czerwiec",
"shortmonthsJuly": "lipiec",
"shortmonthsAugust": "sierpień",
"shortmonthsSeptember": "wrzesień",
"shortmonthsOctober": "październik",
"shortmonthsNovember": "listopad",
"shortmonthsDecember": "grudzień",
"time12am": "{time} am",
"time12pm": "{time} pm",
"longDateFormat": "{time12} - {day} {month} {year}",
"shortDateFormatSeconds": "{seconds}s",
"shortDateFormatMinutes": "{minutes}m",
"shortDateFormatHours": "{hours}godz.",
"shortDateFormatDate": "{day} {month}",
"shortDateFormatDateAndY": "{day} {month} {year}",
"now": "teraz",
"posting": "dodawanie",
"viewMoreInConvBefore": " zobacz więcej w rozmowie",
"viewMoreInConvAfter": "Zobacz więcej w rozmowie ",
"mentions": "Wzmianki",
"timeline": "Oś czasu",
"publicTimeline": "Publiczna oś czasu",
"publicAndExtTimeline": "Cała znana sieć",
"searchVerb": "Szukaj",
"deleteVerb": "Usuń",
"cancelVerb": "Anuluj",
"deleteConfirmation": "Czy na pewno chcesz usunąć ten queet?",
"userExternalFollow": "Zdalne obserwowanie",
"userExternalFollowHelp": "ID Twojego konta (np user@rainbowdash.net).",
"userFollow": "Obserwuj",
"userFollowing": "Obserwowany",
"userUnfollow": "Przestań obserwować",
"joinGroup": "Dołącz",
"joinExternalGroup": "Dołącz zdalnie",
"isMemberOfGroup": "Użytkownik",
"leaveGroup": "Opuść",
"memberCount": "Członkowie",
"adminCount": "Administratorzy",
"settings": "Ustawienia",
"saveChanges": "Zapisz zmiany",
"linkColor": "Kolor linku",
"backgroundColor": "Kolor tła",
"newToQuitter": "Nowy na {site-title}?",
"signUp": "Zarejestruj się",
"signUpFullName": "Imię i nazwisko",
"signUpEmail": "Email",
"signUpButtonText": "Zarejestruj się na {site-title}",
"welcomeHeading": "Witamy na {site-title}.",
"welcomeText": "Jesteśmy społecznością mikroblogerów, złożoną z globalnej <span id=\"federated-tooltip\"><div id=\"what-is-federation\">Oznacza to, że nie musisz posiadać konta na {site-title} aby komunikować się z użytkownikami {site-title}, obserwować lub aby mieć obserwujących na {site-title}. Możesz się także rejestrować na innych serwerach <a href=\"http://www.gnu.org/software/social/\">GNU social</a> lub na innej usłudze, która obsługuje protokół <a href=\"http://www.w3.org/community/ostatus/wiki/Main_Page\">OStatus</a>. Możesz nawet uczestniczyć bez rejestracji, jeśli zainstalujesz GNU social na własnym serwerze. </div>Sieci</span> niezależnych serwerów Gnu social, znanych również jako StatusNet. Jesteśmy idealnym miejscem dla <strong>ludzi takich jak Ty</strong>, dla których etyka i solidarność coś znaczy, a które nie chcą uczestniczyć w scentralizowanych usługach komercyjnych.",
"registerNickname": "Nick",
"registerHomepage": "Strona internetowa",
"registerBio": "O mnie",
"registerLocation": "Lokalizacja",
"registerRepeatPassword": "Powtórz hasło",
"moreSettings": "Więcej ustawień",
"otherServers": "Alternatywnie można utworzyć konto na innym serwerze GNU social <a href=\"http://federation.skilledtests.com/select_your_server.html\">Porównanie</a>",
"editMyProfile": "Edytuj profil",
"notifications": "Powiadomienia",
"xFavedYourQueet": "dodał do ulubionych twój Queet",
"xRepeatedYourQueet": "podał dalej Twojego Queeta",
"xStartedFollowingYou": "zaczął Cię obserwować",
"followsYou": "obserwuje Cię",
"FAQ": "FAQ",
"inviteAFriend": "Zaproś przyjaciół!",
"goToExternalProfile": "Pokaż pełny profil",
"cropAndSave": "Przytnij i zapisz",
"showTerms": "Przeczytaj nasze Warunki korzystania",
"ellipsisMore": "Więcej",
"blockUser": "Zablokuj",
"goToOriginalNotice": "Idź do pierwotnego queeta",
"goToTheUsersRemoteProfile": "Idź do zdalnego profilu użytkownika",
"clickToDrag":"Kliknij, aby przeciągnąć",
"keyboardShortcuts":"Skróty klawiszowe",
"classicInterface":"Klasyczny {site-title}",
"accessibilityToggleLink":"Dla lepszej dostępności należy kliknąć ten link, aby przejść do klasycznego interfejsu",
"tooltipBookmarkStream":"Dodaj ten strumień do zakładek",
"tooltipTopMenu":"Menu i ustawienia",
"tooltipAttachImage":"Dodaj zdjęcie",
"tooltipShortenUrls":"Skrócić wszystkie adresy URL w tym queecie",
"tooltipReloadStream":"Odśwież strumień",
"tooltipRemoveBookmark":"Usuń tę zakładkę",
"clearHistory":"Wyczyść historię przeglądania",
"ERRORsomethingWentWrong":"Coś poszło nie tak.",
"ERRORmustBeLoggedIn":"Musisz być zalogowany, aby zobaczyć ten strumień.",
"ERRORcouldNotFindUserWithNickname":"Nie można znaleźć użytkownika o nicku \"{nickname}\" na tym serwerze",
"ERRORcouldNotFindGroupWithNickname":"Nie można znaleźć grupy o nazie \"{nickname}\" na tym serwerze",
"ERRORcouldNotFindPage":"Nie można znaleźć podanej strony.",
"ERRORnoticeRemoved": "Ten queet został usunięty.",
"ERRORnoContactWithServer": "Nie można nawiązać połączenia z serwerem. Serwer może być przeciążony lub możesz mieć problemy z połączeniem internetowym. Spróbuj ponownie później.",
"ERRORattachmentUploadFailed": "Przesyłanie nie powiodło się. Format może być nieobsługiwany lub rozmiar jest zbyt duży.",
"hideRepliesToPeopleIDoNotFollow":"Ukryj odpowiedzieci od ludzi, których nie obserwuję",
"markAllNotificationsAsSeen":"Oznacz wszystkie powiadomienia jako przeczytane",
"notifyRepliesAndMentions":"Wzmianki i odpowiedzi",
"notifyFavs":"Ulubione",
"notifyRepeats":"Podane dalej",
"notifyFollows":"Nowi obserwujący",
"timelineOptions":"Ustawienia osi czasu",
"ERRORfailedSavingYourSetting":"Błąd podczas zapisywania Twoich ustawień",
"ERRORfailedMarkingAllNotificationsAsRead":"Błąd podczas ozanczania powiadomień jako przeczytane.",
"newNotification": "{new-notice-count} nowe powiadomienie",
"newNotifications": "{new-notice-count} nowych powiadomień",
"thisIsANoticeFromABlockedUser":"Ostrzeżenie: To queet od użytkownika, którego zablokowałeś. Kliknij, by zobaczyć.",
"nicknamesListWithListName":"Lista użytkownika {nickname}: {list-name}",
"myListWithListName":"Moja lista: {list-name}",
"listMembers":"Użytkownicy",
"listSubscribers":"Subskrybujący",
"ERRORcouldNotFindList":"Nie ma takiej listy.",
"emailAlreadyInUse":"Już w użyciu",
"addEditLanguageLink":"Pomóż przetłumaczyć {site-title} na inny język",
"onlyPartlyTranslated":"{site-title} został przetłumaczony częściowo na język <em>{language-name}</em> ({percent}%).Możesz pomóc w ukończeniu tłumaczenia na <a href=\"https://git.gnu.io/h2p/Qvitter/tree/master/locale\">Qvitter's repository homepage</a>",
"startRant":"Rozpocznij przemówienie",
"continueRant":"Kontynuuj przemówienie",
"hideEmbeddedInTimeline":"Ukryj osadzony kontent na tej osi czasu",
"hideQuotesInTimeline":"Ukryj cytaty na tej osi czasu",
"userBlocks":"Konta, które blokujesz",
"buttonBlocked":"Zablokowany",
"buttonUnblock":"Odblokuj",
"failedBlockingUser":"Nie udało się zablokować użytkownika.",
"failedUnblockingUser":"Nie udało się odblokować użytkownika.",
"unblockUser": "Odblokuj",
"tooltipBlocksYou":"Jesteś zablokowany przez {username}.",
"silenced":"Wyciszony",
"silencedPlural":"Wyciszone profile",
"silencedUsersOnThisInstance":"Wyciszone profile na {site-title}",
"sandboxed":"Zsandboksowany",
"sandboxedPlural":"Zsandboksowane profile",
"sandboxedUsersOnThisInstance":"Zsandboksowane profile na {site-title}",
"silencedStreamDescription":"Wyciszeni użytkownicy nie mogą się zalogować ani dodawać nowych queetów, a te, które już dodali, są ukryte. Dla użytkowników lokalnych jest to podobne do usunięcia, które można cofnąć, zaś dla użytkowników zdalnych jest to zablokowanie całej strony.",
"sandboxedStreamDescription":"Queety od zsandboksowanych użytkowników są wyłączone z publicznej osi czasu oraz całej sieci. Poza tym mogą oni używać strony jak każdy inny użytkownik.",
"onlyShowNotificationsFromUsersIFollow":"Pokazuj tylko powiadomienia od użytkowników, których obserwuję",
"userOptions":"Więcej opcji",
"silenceThisUser":"Wycisz {nickname}",
"sandboxThisUser":"Zsandboksuj użytkownika {nickname}",
"unSilenceThisUser":"Odcisz {nickname}",
"unSandboxThisUser":"Odsandboksuj użytkownika {nickname}",
"ERRORfailedSandboxingUser":"Błąd poczas sandboksowania/odsandboksowywania użytkownika",
"ERRORfailedSilencingUser":"Błąd podczas uciszania/odciszania użytkownika",
"muteUser":"Wycisz",
"unmuteUser":"Odcisz",
"hideNotificationsFromMutedUsers":"Ukryj powiadomienia od wycziszonych użytkowników",
"thisIsANoticeFromAMutedUser":"Wyciszyłeś autora tego queeta. Kliknij tu, aby go pokazać.",
"userMutes":"Użytkownicy, których wyciszyłeś",
"userBlocked":"Zablokowani użytkownicy",
"userMuted":"Wyciszeni użytkownicy",
"mutedStreamDescription":"Ukryłeś te konta na swojej osi czasu. Nadal będziesz otrzymywać powiadomienia od tych użytkowników, chyba że wybierzesz opcję &quot;Ukryj powiadomienia od wyciszonych użytkowników&quot;, znajdującą się w rozwijanym menu na stronie powiadomień.",
"profileAndSettings":"Profil i ustawienia",
"profileSettings":"Ustawienia profilu",
"thisIsABookmark":"To jest zakładka stworzona w klasycznym interfejsie"
}

View File

@ -197,9 +197,5 @@
"mutedStreamDescription":"Você escondeu estas contas da sua linha do tempo. Irá continuar a receber notificações delas, a não ser que selecione a opção \"Esconder notificações de utilizadores calados\" a partir do menu da roldana na página de notificações.",
"profileAndSettings":"Perfil e Definições",
"profileSettings":"Definições do Perfil",
"thisIsABookmark":"This is a bookmark created in the Classic interface",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"Find someone",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"Attach a file"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -197,9 +197,5 @@
"mutedStreamDescription":"Você escondeu estas contas de sua linha do tempo. Você ainda receberá notificações destas contas, a menos que você selecione &quot;Esconder notificações de usuários calados&quot; no menu de engrenagem na página de notificações.",
"profileAndSettings":"Perfil e ajustes",
"profileSettings":"Ajustes de perfil",
"thisIsABookmark":"Este é um favorito criado na interface clássica",
"thisIsARemoteUser":"<strong>Atenção!</strong> Este é um usuário remoto. Esta página é apenas uma cópia preservada do perfil do usuário, e inclui apenas dados conhecidos por esta instância do GNU social. Visite <a href=\"{remote-profile-url}\" donthijack>o perfil deste usuário no servidor dele</a> para ver o perfil completo.",
"findSomeone":"Encontrar alguém",
"findSomeoneTooltip":"Escreva o nome de usuário ou url do perfil, por exemplo @usuariolocal ou https://instancia.remota/apelido",
"tooltipAttachFile":"Attach a file"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -15,7 +15,7 @@
"queetsNounPlural": "Квиты",
"logout": "Выйти",
"languageSelected": "Язык:",
"viewMyProfilePage": "Мой профиль",
"viewMyProfilePage": "Просмотр моего профиля",
"expand": "Развернуть",
"collapse": "Свернуть",
"details": "Подробно",
@ -112,18 +112,18 @@
"xRepeatedYourQueet": "реквитнули",
"xStartedFollowingYou": "теперь читают вас",
"followsYou": "читают вас",
"FAQ": "ЧаВо",
"FAQ": "FAQ",
"inviteAFriend": "Пригласите друзей!",
"goToExternalProfile": "Перейти к полному профилю",
"cropAndSave": "Обрезать и сохранить",
"showTerms": "Прочтите условия использования",
"showTerms": "Прочтите наши Условия использования",
"ellipsisMore": "Больше",
"blockUser": "Заблокировать {username}",
"goToOriginalNotice": "Перейти к оригинальному квиту",
"goToTheUsersRemoteProfile": "Перейти к удалённому профилю пользователя",
"clickToDrag":"Нажмите для перетаскивания",
"keyboardShortcuts":"Горячие клавиши",
"classicInterface":"Классический вид: {site-title}",
"classicInterface":"Классический {site-title}",
"accessibilityToggleLink":"Для большего удобства, нажмите на эту ссылку, чтобы переключиться на классический интерфейс",
"tooltipBookmarkStream":"Добавить эту ленту в закладки",
"tooltipTopMenu":"Меню и настройки",
@ -179,12 +179,12 @@
"sandboxedStreamDescription":"Квиты пользователей в \"песочнице\" исключаются из Публичной Ленты и Всей известной сети. В остальном такие пользователи могут пользоваться сайтом так же, как остальные.",
"onlyShowNotificationsFromUsersIFollow":"Показывать уведомления от только читаемых мной пользователей",
"userOptions":"Пользовательские опции",
"silenceThisUser":"Заблокировать пользователя {nickname}",
"silenceThisUser":"Silence {nickname}",
"sandboxThisUser":"Поместить {nickname} в \"песочницу\"",
"unSilenceThisUser":"Разблокировать {nickname}",
"unSilenceThisUser":"Разбанить {nickname}",
"unSandboxThisUser":"Удалить {nickname} из \"песочницы\"",
"ERRORfailedSandboxingUser":"Ошибка при помещении пользователя в \"песочницу\" или удалении из неё",
"ERRORfailedSilencingUser":"Ошибка при блокировки/разблокировки пользователя.",
"ERRORfailedSilencingUser":"Ошибка при бане/разбане пользователя.",
"muteUser":"Игнорировать",
"unmuteUser":"Прекратить игнорировать",
"hideNotificationsFromMutedUsers":"Скрыть уведомления от игнорируемых пользователей",
@ -195,11 +195,5 @@
"mutedStreamDescription":"Вы скрыли этих пользователей из вашей ленты. Вы будете продолжать получать уведомления от этих пользователей, если не выберете &quot;Скрыть уведомления от игнорируемых пользователей&quot; в меню с шестерёнкой на странице уведомлений",
"profileAndSettings":"Профиль и настройки",
"profileSettings":"Настройки профиля",
"thisIsABookmark":"Это закладка, созданная в классическом интерфейсе",
"thisIsARemoteUser":"<strong>Внимание!</strong> Это удаленный пользователь. Эта страница - кешированная копия его профиля, и включает только данные известные этой инстанции GNU social. Перейдите на <a href=\"{remote-profile-url}\" donthijack>профиль пользователя на этом серверсе</a> чтобы просмотреть полный профиль.",
"findSomeone":"Найти кого-нибудь",
"findSomeoneTooltip":"Введите имя пользователя или url профиля, например @localuser или https://remote.instance/nickname",
"tooltipAttachFile":"Прикрепить файл",
"hideEmbeddedInTimeline": "Не показывать предварительный просмотр встроенного контента",
"hideQuotesInTimeline": "Скрыть цитаты"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -197,9 +197,5 @@
"mutedStreamDescription":"Këto llogari i keni fshehur prej rrjedhës suaj kohore. Do të merrni, prapëseprapë, njoftime nga këto llogari, veç në përzgjedhshi &quot;Fshihi njoftimet prej përdorues me zë të hequr&quot;, te menuja me ikonën e ingranazhit te faqja e njoftimeve.",
"profileAndSettings":"Profil dhe rregullime",
"profileSettings":"Rregullime profili",
"thisIsABookmark":"Ky është një faqerojtës i krijuar nën ndërfaqen Klasike",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"Find someone",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"Attach a file"
"thisIsABookmark":"Ky është një faqerojtës i krijuar nën ndërfaqen Klasike"
}

View File

@ -197,9 +197,5 @@
"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",
"thisIsABookmark":"Detta är ett bokmärke som skapats i GNU socials standardgränssnitt",
"thisIsARemoteUser":"<strong>Obs!</strong> Detta är en extern användare. Den här sidan visar bara en cachad version av deras profil. Gå till <a href=\"{remote-profile-url}\" donthijack>användarens profil på deras server</a> för att se hela deras profil.",
"findSomeone":"Hitta en användare",
"findSomeoneTooltip":"Skriv in ett användarnamn eller en url till en profil, t ex @anvandarnamn eller https://extern.server/anvandarnamn",
"tooltipAttachFile":"Bifoga en fil"
"thisIsABookmark":"Detta är ett bokmärke som skapats i GNU socials standardgränssnitt"
}

View File

@ -95,17 +95,17 @@
"newToQuitter": "{site-title}'da yeni misin?",
"signUp": "Kayıt ol",
"signUpFullName": "Ad ve soyad",
"signUpEmail": "E-posta",
"signUpEmail": "Eposta",
"signUpButtonText": "{site-title}'a kaydol",
"welcomeHeading": "{site-title} a hoşgeldin.",
"welcomeText": "Biz bir <span id=\"federated-tooltip\"><div id=\"what-is-federation\">\"Federasyon\" bunun anlamı, {site-title} 'yi izleyebilmen için bir hesaba ihtiyacın yok.{site-title}'daki kullanıcılarla iletişim kurabilirsin. Herhangi bir StatusNet veya GNU social sunucusuna üye olabilir, ya da <a href=\"http://www.w3.org/community/ostatus/wiki/Main_Page\">Ostatus</a> tabanlı protokol üyesi olabilirsin! Herhangi bir servise bağlanmadan <a href=\"http://www.gnu.org/software/social/\">GNU social</a> bağlantısında bulunan yazılımı kendi sunucunda deneyebilirsin! :)</div>federation</span> sosyal adalet ve dayanışmaya önem veren ve merkezi kapitalist hizmetleri bırakmak isteyen mikroblogcuların topluluğudur.",
"welcomeText": "We are a <span id=\"federated-tooltip\"><div id=\"what-is-federation\">\"Federation\" means that you don't need a {site-title} account to be able to follow, be followed by or interact with {site-title} users. You can register on any StatusNet or GNU social server or any service based on the the <a href=\"http://www.w3.org/community/ostatus/wiki/Main_Page\">Ostatus</a> protocol! You don't even have to join a service try installing the lovely <a href=\"http://www.gnu.org/software/social/\">GNU social</a> software on your own server! :)</div>federation</span> of microbloggers who care about ethics and solidarity and want to quit the centralised capitalist services.",
"registerNickname": "Kullanıcı adı",
"registerHomepage": "İnternet Sitesi",
"registerBio": "Kişisel Bilgiler",
"registerLocation": "Konum",
"registerRepeatPassword": "Şifreni tekrar gir",
"moreSettings": "Diğer ayarlar",
"otherServers": "Alternatif olarak GNU sosyal ında başka bir sunucuda hesap oluşturabilirsiniz. <a href=\"http://federation.skilledtests.com/select_your_server.html\">Karşılaştırın</a>",
"otherServers": "Alternatif olarak GNU sosyal networkünde başka bir sunucu da hesap oluşturabilirsiniz. <a href=\"http://federation.skilledtests.com/select_your_server.html\">Karşılaştırın</a>",
"editMyProfile": "Profili düzenle",
"notifications": "Bildirimler",
"xFavedYourQueet": "Queet'ini favorilerine ekledi",
@ -118,11 +118,11 @@
"cropAndSave": "Kırp ve kaydet",
"showTerms": "Kullanım Şartlarını okuyun",
"ellipsisMore": "Daha fazla",
"blockUser": "{username}'i engelle",
"blockUser": "Engelle {username}",
"goToOriginalNotice": "Orijinal iletiye git",
"goToTheUsersRemoteProfile": "Kullanıcının uzak profiline git",
"clickToDrag":"Sürüklemek için tıklayın",
"keyboardShortcuts":"Klavye kısayolları",
"keyboardShortcuts":"Kılavye kısayolları",
"classicInterface":"Klasik {site-title}",
"accessibilityToggleLink":"Daha iyi erişilebilirlik için klasik arayüze geçin.",
"tooltipBookmarkStream":"Akışı yer imlerinize ekleyin",
@ -134,10 +134,10 @@
"clearHistory":"Arama geçmişini temizle",
"ERRORsomethingWentWrong":"Bir şeyler yanlış gitti.",
"ERRORmustBeLoggedIn":"Bu akışı görmek için giriş yapmalısınız.",
"ERRORcouldNotFindUserWithNickname":"Sunucuda \"{nickname}\" kullanıcı adına sahip bir kullanıcı yok.",
"ERRORcouldNotFindGroupWithNickname":"Sunucuda \"{nickname}\" kullanıcı adına sahip bir grup yok.",
"ERRORcouldNotFindPage":"Sayfa bulunamadı.",
"ERRORnoticeRemoved": "İleti kaldırıldı.",
"ERRORcouldNotFindUserWithNickname":"Sunucuda böyle bir kullanıcı adına sahip \"{nickname}\" kullanıcı yok.",
"ERRORcouldNotFindGroupWithNickname":"Sunucuda böyle bir kulanıcı adına sahip \"{nickname}\" grup yok.",
"ERRORcouldNotFindPage":"Sayfayı bulamadım.",
"ERRORnoticeRemoved": "ileti kaldırıldı.",
"ERRORnoContactWithServer": "Sunucuyla bağlantı kurulamıyor. Sunucu aşırı yüklenmiş veya internet bağlantısıyla ilgili bir sorun olabilir. Lütfen daha sonra tekrar deneyin!",
"ERRORattachmentUploadFailed": "Yükleme başarısız oldu. Biçimi desteklenmiyor veya boyutu çok büyük olabilir.",
"hideRepliesToPeopleIDoNotFollow":"Takip etmediğim kullanıcıların cevaplarını gizle",
@ -147,7 +147,7 @@
"notifyRepeats":"Requeets",
"notifyFollows":"Yeni takipçiler",
"timelineOptions":"Akış ayarları",
"ERRORfailedSavingYourSetting":"Ayarlar kaydedilirken bir hata oluştu.",
"ERRORfailedSavingYourSetting":"Ayarlar kaydedilemedi.",
"ERRORfailedMarkingAllNotificationsAsRead":"Tüm bildirimler görüntülenemedi.",
"newNotification": "{new-notice-count} yeni bildirim",
"newNotifications": "{new-notice-count} yeni bildirimler",
@ -164,42 +164,38 @@
"continueRant":"Konuşmaya devam et",
"hideEmbeddedInTimeline":"Bu akışta gömülü içeriği gizle",
"hideQuotesInTimeline":"Bu akışta alıntıları gizle",
"userBlocks":"Engellediğin hesaplar",
"userBlocks":"Hesabın engellendi",
"buttonBlocked":"Engellenmiş",
"buttonUnblock":"Engeli kaldır",
"failedBlockingUser":"Kullanıcı engellenemedi.",
"failedUnblockingUser":"Kullanıcının engeli kaldırılamadı.",
"unblockUser": "{username} engelini kaldır",
"tooltipBlocksYou":"{username} kullanıcısı tarafından engellendiniz",
"silenced":"Sessizleştirildi",
"silencedPlural":"Sessizleştirilen profiller",
"silencedUsersOnThisInstance":"{site-title}'da sessizleştirilen profiller",
"sandboxed":"Karantinaya alınmış",
"sandboxedPlural":"Karantinaya alınan profiller",
"sandboxedUsersOnThisInstance":"{site-title}'da karantinaya alınan profiller",
"silencedStreamDescription":"Sessizleştirilen kullanıcılar giriş yapamaz ve quip gönderemezler. Yerel kullanıcılar için bu tersine çevrilebilecek bir silme gibidir, dolaylı kullanıcılar için ise bu site çapında bir blok gibidir.",
"sandboxedStreamDescription":"Karantinaya alınan kullanıcılar tarafından gönderiler quipler Herkese açık akış ve bilinen bütün ağlardan kovulurlar. Onun dışında, siteyi diğer kullanıcılar gibi kullanabilirler.",
"onlyShowNotificationsFromUsersIFollow":"Sadece takip ettiğim kullanıcılardan gelen bildirimleri göster",
"userOptions":"Daha fazla kullanıcı ayarları",
"silenceThisUser":"{nickname}'ı sessizleştir",
"sandboxThisUser":"{nickname}'ı karantinaya al",
"unSilenceThisUser":"{nickname}'in sessizleştirmesini kaldır",
"unSandboxThisUser":"{nickname}'i karantinadan çıkar",
"ERRORfailedSandboxingUser":"Kullanıcıyı karantinaya almada/karantinadan çıkarmada bir hata oluştu",
"ERRORfailedSilencingUser":"Kullanıcıyı sessizleştirme/sessizleştirmesini kaldırmada bir hata oluştu",
"muteUser":"Kullanıcıyı sustur",
"unmuteUser":"Susturmayı kaldır",
"hideNotificationsFromMutedUsers":"Susturulan kullanıcılardan gelen bildirimleri gizle",
"thisIsANoticeFromAMutedUser":"Bu quipin yazarını susturmuşsunuz. Yine de görüntülemek için tıklayın",
"userMutes":"Susturduğun hesaplar",
"userBlocked":"Engellenmiş hesaplar",
"userMuted":"Susturulmuş hesaplar",
"mutedStreamDescription":"Bu hesapları zaman akışından gizledin. Bildirimler sayfasındaki dişli çark menüsünden &quot;Susturulan kullanıcılardan gelen bildirimleri gizle&quot; seçeneğini seçmediğin sürece bu kullanıcılardan bildirim almaya devam edeceksin.",
"profileAndSettings":"Profil ve ayarlar",
"profileSettings":"Profil ayarları",
"thisIsABookmark":"This is a bookmark created in the Classic interface",
"thisIsARemoteUser":"<strong>Dikkat!</strong>Bu dolaylı bir kullanıcı. Bu sayfa kullanıcının sadece bir önbellek kopyasını ve sadece bu GNU social örneğinde bilinen verileri içerir. Bu kullanıcının profilinin tamamını görmek için <a href=\"{remote-profile-url}\" donthijack>kendi sunucularındaki profilini</a> ziyaret edin.",
"findSomeone":"Bir kullanıcı ara",
"findSomeoneTooltip":"Bir kullanıcı adı veya profil URL'si gir (ör. @localuser veya https://remote.instance/nickname)",
"tooltipAttachFile":"Dosya ekle"
"tooltipBlocksYou":"{username} kullanıcısını engellediniz.",
"silenced":"Susturuldu",
"silencedPlural":"Susturulan profiller",
"silencedUsersOnThisInstance":"Silenced profiles on {site-title}",
"sandboxed":"Sandboxed",
"sandboxedPlural":"Sandboxed profiles",
"sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
"silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
"sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Apart from that, they can use the site like any other user.",
"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",
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -197,9 +197,5 @@
"mutedStreamDescription":"Ви сховали ці облікови записи з вашей стрічкі. Ви будете одержувати оголошення від цих облікових записів, доки Ви не виберіте &quot;Сховати оголошення від корістувачей котрих я ігнорую&quot; в меню з шестернею на сторінкі оголошень.",
"profileAndSettings":"Профіль та налаштування",
"profileSettings":"Налаштування профіля",
"thisIsABookmark":"This is a bookmark created in the Classic interface",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"Find someone",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"Attach a file"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}

View File

@ -196,9 +196,5 @@
"mutedStreamDescription":"你已从你的时间线中隐藏了这些用户。但你仍将收到这些用户的通知,除非你在设置页的齿轮菜单中选择“隐藏被忽略用户的通知”。",
"profileAndSettings":"个人档案及设置",
"profileSettings":"个人设置",
"thisIsABookmark":"该书签系在旧版视图下创建。",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"Find someone",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"Attach a file"
"thisIsABookmark":"该书签系在旧版视图下创建。"
}

View File

@ -196,9 +196,5 @@
"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",
"thisIsABookmark":"This is a bookmark created in the Classic interface",
"thisIsARemoteUser":"<strong>Attention!</strong> This is a remote user. This page is only a cached copy of their profile, and includes only data known to this GNU social instance. Go to the <a href=\"{remote-profile-url}\" donthijack>user's profile on their server</a> to view their full profile.",
"findSomeone":"Find someone",
"findSomeoneTooltip":"Input a username or a profile url, e.g. @localuser or https://remote.instance/nickname",
"tooltipAttachFile":"Attach a file"
"thisIsABookmark":"This is a bookmark created in the Classic interface"
}