Merge remote-tracking branch 'upstream/2022.09-rc' into worker-timeout

This commit is contained in:
Michael 2022-09-26 13:26:56 +00:00
commit 5e51ab95fb
28 changed files with 533 additions and 224 deletions

View file

@ -410,13 +410,13 @@ Ex: Wed May 23 06:01:13 +0000 2007
</tr> </tr>
<tr> <tr>
<td><code>startTime</code></td> <td><code>start_time</code></td>
<td>String (UTC <code>YYYY-MM-DD HH:II:SS)</code>)</td> <td>String (UTC <code>YYYY-MM-DD HH:II:SS)</code>)</td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td><code>endTime</code></td> <td><code>end_time</code></td>
<td>String (UTC <code>YYYY-MM-DD HH:II:SS)</code>)</td> <td>String (UTC <code>YYYY-MM-DD HH:II:SS)</code>)</td>
<td>Optional (null date is <code>0001-01-01 00:00:00</code></td> <td>Optional (null date is <code>0001-01-01 00:00:00</code></td>
</tr> </tr>

View file

@ -24,6 +24,32 @@ Returns a list of [Event](help/API-Entities#Event) entities for the current logg
- `since_id`: (optional) minimum event id for pagination - `since_id`: (optional) minimum event id for pagination
- `count`: maximum number of items returned, default 20 - `count`: maximum number of items returned, default 20
### POST api/friendica/event_create
Create a new event for the current logged in user.
#### Parameters
- `id` : (optional) id of event, event will be amended if supplied
- `name` : name of the event (required)
- `start_time` : start of the event (ISO), required
- `end_time` : (optional) end of the event, event is open end, if not supplied
- `desc` : (optional) description of the event
- `place` : (optional) location of the event
- `publish` : (optional) create message for event
- `allow_cid` : (optional) ACL-formatted list of allowed contact ids if private event
- `allow_gid` : (optional) ACL-formatted list of disallowed contact ids if private event
- `deny_cid` : (optional) ACL-formatted list of allowed group ids if private event
- `deny_gid` : (optional) ACL-formatted list of disallowed group ids if private event
### POST api/friendica/event_delete
Delete event from calendar (not the message)
#### Parameters
- `id` : id of event to be deleted
### GET api/externalprofile/show ### GET api/externalprofile/show
Returns a [Contact](help/API-Entities#Contact) entity for the provided profile URL. Returns a [Contact](help/API-Entities#Contact) entity for the provided profile URL.

View file

@ -145,7 +145,7 @@ function pubsub_post(App $a)
} }
// We only import feeds from OStatus here // We only import feeds from OStatus here
if ($contact['network'] != Protocol::OSTATUS) { if (!in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::OSTATUS])) {
Logger::warning('Unexpected network', ['contact' => $contact]); Logger::warning('Unexpected network', ['contact' => $contact]);
hub_post_return(); hub_post_return();
} }

View file

@ -1867,11 +1867,13 @@ class BBCode
if ($try_oembed) { if ($try_oembed) {
$text = preg_replace_callback("/\[youtube\](https?:\/\/www.youtube.com\/watch\?v\=.*?)\[\/youtube\]/ism", $try_oembed_callback, $text); $text = preg_replace_callback("/\[youtube\](https?:\/\/www.youtube.com\/watch\?v\=.*?)\[\/youtube\]/ism", $try_oembed_callback, $text);
$text = preg_replace_callback("/\[youtube\](www.youtube.com\/watch\?v\=.*?)\[\/youtube\]/ism", $try_oembed_callback, $text); $text = preg_replace_callback("/\[youtube\](www.youtube.com\/watch\?v\=.*?)\[\/youtube\]/ism", $try_oembed_callback, $text);
$text = preg_replace_callback("/\[youtube\](https?:\/\/www.youtube.com\/shorts\/.*?)\[\/youtube\]/ism", $try_oembed_callback, $text);
$text = preg_replace_callback("/\[youtube\](https?:\/\/youtu.be\/.*?)\[\/youtube\]/ism", $try_oembed_callback, $text); $text = preg_replace_callback("/\[youtube\](https?:\/\/youtu.be\/.*?)\[\/youtube\]/ism", $try_oembed_callback, $text);
} }
$text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $text); $text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $text);
$text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/embed\/(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $text); $text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/embed\/(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $text);
$text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/shorts\/(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $text);
$text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $text); $text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $text);
if ($try_oembed) { if ($try_oembed) {

View file

@ -114,7 +114,7 @@ class HTML
/** @var \DOMNode $child */ /** @var \DOMNode $child */
foreach ($node->childNodes as $key => $child) { foreach ($node->childNodes as $key => $child) {
/* Remove empty text nodes at the start or at the end of the children list */ /* Remove empty text nodes at the start or at the end of the children list */
if ($key > 0 && $key < $node->childNodes->length - 1 || $child->nodeName != '#text' || trim($child->nodeValue)) { if ($key > 0 && $key < $node->childNodes->length - 1 || $child->nodeName != '#text' || trim($child->nodeValue) !== '') {
$newNode = $child->cloneNode(true); $newNode = $child->cloneNode(true);
$node->parentNode->insertBefore($newNode, $node); $node->parentNode->insertBefore($newNode, $node);
} }
@ -144,10 +144,10 @@ class HTML
public static function toBBCode(string $message, string $basepath = ''): string public static function toBBCode(string $message, string $basepath = ''): string
{ {
/* /*
* Check if message is empty to prevent a lot code below being executed * Check if message is empty to prevent a lot of code below from being executed
* for just an empty message. * for just an empty message.
*/ */
if (empty($message)) { if ($message === '') {
return ''; return '';
} }

View file

@ -126,6 +126,7 @@ class Markdown
//$s = preg_replace("/([^\]\=]|^)(https?\:\/\/)(vimeo|youtu|www\.youtube|soundcloud)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url=$2$3$4]$2$3$4[/url]',$s); //$s = preg_replace("/([^\]\=]|^)(https?\:\/\/)(vimeo|youtu|www\.youtube|soundcloud)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url=$2$3$4]$2$3$4[/url]',$s);
$s = BBCode::pregReplaceInTag('/\[url\=?(.*?)\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/url\]/ism', '[youtube]$2[/youtube]', 'url', $s); $s = BBCode::pregReplaceInTag('/\[url\=?(.*?)\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/url\]/ism', '[youtube]$2[/youtube]', 'url', $s);
$s = BBCode::pregReplaceInTag('/\[url\=https?:\/\/www.youtube.com\/watch\?v\=(.*?)\].*?\[\/url\]/ism' , '[youtube]$1[/youtube]', 'url', $s); $s = BBCode::pregReplaceInTag('/\[url\=https?:\/\/www.youtube.com\/watch\?v\=(.*?)\].*?\[\/url\]/ism' , '[youtube]$1[/youtube]', 'url', $s);
$s = BBCode::pregReplaceInTag('/\[url\=https?:\/\/www.youtube.com\/shorts\/(.*?)\].*?\[\/url\]/ism' , '[youtube]$1[/youtube]', 'url', $s);
$s = BBCode::pregReplaceInTag('/\[url\=?(.*?)\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/url\]/ism' , '[vimeo]$2[/vimeo]' , 'url', $s); $s = BBCode::pregReplaceInTag('/\[url\=?(.*?)\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/url\]/ism' , '[vimeo]$2[/vimeo]' , 'url', $s);
$s = BBCode::pregReplaceInTag('/\[url\=https?:\/\/vimeo.com\/([0-9]+)\](.*?)\[\/url\]/ism' , '[vimeo]$1[/vimeo]' , 'url', $s); $s = BBCode::pregReplaceInTag('/\[url\=https?:\/\/vimeo.com\/([0-9]+)\](.*?)\[\/url\]/ism' , '[vimeo]$1[/vimeo]' , 'url', $s);

View file

@ -193,7 +193,7 @@ class Cron
*/ */
private static function addIntros() private static function addIntros()
{ {
$contacts = DBA::p("SELECT `uid`, `id`, `created` FROM `contact` WHERE `rel` = ? AND `pending` AND NOT EXISTS (SELECT `id` FROM `intro` WHERE `contact-id` = `contact`.`id`)", Contact::FOLLOWER); $contacts = DBA::p("SELECT `uid`, `id`, `created` FROM `contact` WHERE `rel` = ? AND `pending` AND NOT `id` IN (SELECT `contact-id` FROM `intro`)", Contact::FOLLOWER);
while ($contact = DBA::fetch($contacts)) { while ($contact = DBA::fetch($contacts)) {
$fields = [ $fields = [
'uid' => $contact['uid'], 'uid' => $contact['uid'],

View file

@ -1153,6 +1153,10 @@ class PostUpdate
while ($contact = DBA::fetch($contacts)) { while ($contact = DBA::fetch($contacts)) {
$id = $contact['id']; $id = $contact['id'];
if (is_null($contact['uri-id'])) {
$contact['uri-id'] = ItemURI::getIdByURI($contact['url']);
DBA::update('contact', ['uri-id' => $contact['uri-id']], ['id' => $contact['id']]);
}
Contact::setAccountUser($contact['id'], $contact['uid'], $contact['uri-id'], $contact['url']); Contact::setAccountUser($contact['id'], $contact['uid'], $contact['uri-id'], $contact['url']);
++$rows; ++$rows;
} }

View file

@ -577,15 +577,15 @@ class APContact
*/ */
public static function isRelay(array $apcontact): bool public static function isRelay(array $apcontact): bool
{ {
if ($apcontact['nick'] != 'relay') { if (empty($apcontact['nick']) || $apcontact['nick'] != 'relay') {
return false; return false;
} }
if ($apcontact['type'] == 'Application') { if (!empty($apcontact['type']) && $apcontact['type'] == 'Application') {
return true; return true;
} }
if (in_array($apcontact['type'], ['Group', 'Service']) && is_null($apcontact['outbox'])) { if (!empty($apcontact['type']) && in_array($apcontact['type'], ['Group', 'Service']) && is_null($apcontact['outbox'])) {
return true; return true;
} }

View file

@ -3388,7 +3388,7 @@ class Contact
if (empty($contact['id']) && Network::isValidHttpUrl($url)) { if (empty($contact['id']) && Network::isValidHttpUrl($url)) {
Worker::add(PRIORITY_LOW, 'AddContact', 0, $url); Worker::add(PRIORITY_LOW, 'AddContact', 0, $url);
++$added; ++$added;
} elseif (Probe::isProbable($contact['network']) && ($contact['next-update'] < DateTimeFormat::utcNow())) { } elseif (!empty($contact['network']) && Probe::isProbable($contact['network']) && ($contact['next-update'] < DateTimeFormat::utcNow())) {
Worker::add(['priority' => PRIORITY_LOW, 'dont_fork' => true], 'UpdateContact', $contact['id']); Worker::add(['priority' => PRIORITY_LOW, 'dont_fork' => true], 'UpdateContact', $contact['id']);
++$updated; ++$updated;
} else { } else {

View file

@ -61,8 +61,8 @@ class Nodeinfo
$logger->info('user statistics', $userStats); $logger->info('user statistics', $userStats);
$posts = DBA::count('post-thread', ["EXISTS(SELECT `uri-id` FROM `post-user` WHERE NOT `deleted` AND `origin` AND `uri-id` = `post-thread`.`uri-id`)"]); $posts = DBA::count('post-thread', ["`uri-id` IN (SELECT `uri-id` FROM `post-user` WHERE NOT `deleted` AND `origin`)"]);
$comments = DBA::count('post', ["NOT `deleted` AND `gravity` = ? AND EXISTS(SELECT `uri-id` FROM `post-user` WHERE `origin` AND `uri-id` = `post`.`uri-id`)", GRAVITY_COMMENT]); $comments = DBA::count('post', ["NOT `deleted` AND `gravity` = ? AND `uri-id` IN (SELECT `uri-id` FROM `post-user` WHERE `origin`)", GRAVITY_COMMENT]);
$config->set('nodeinfo', 'local_posts', $posts); $config->set('nodeinfo', 'local_posts', $posts);
$config->set('nodeinfo', 'local_comments', $comments); $config->set('nodeinfo', 'local_comments', $comments);

View file

@ -0,0 +1,115 @@
<?php
/**
* @copyright Copyright (C) 2010-2022, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
* This program 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 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY 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 this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
namespace Friendica\Module\Api\Friendica\Events;
use Friendica\Core\Protocol;
use Friendica\Core\Worker;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model\Event;
use Friendica\Model\Conversation;
use Friendica\Model\Item;
use Friendica\Module\BaseApi;
use Friendica\Network\HTTPException;
use Friendica\Util\DateTimeFormat;
use Friendica\Worker\Delivery;
/**
* API endpoint: /api/friendica/event_create
*/
class Create extends BaseApi
{
protected function post(array $request = [])
{
BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE);
$uid = BaseApi::getCurrentUserID();
// params
$request = $this->getRequest([
'id' => 0, //if provided, event will be amended
'name' => '', //summary of the event
'desc' => '', //description in BBCode
'start_time' => '', //start_time, required
'end_time' => '', //endtime, required if nofinish false
'place' => '', //location of the event
'publish' => 0, //publish message
'allow_cid' => '', //array of allowed person, if access restricted
'allow_gid' => '', //array of allowed groups, if access restricted
'deny_cid' => '', //array of denied person, if access restricted
'deny_gid' => '', //array of denied groups, if access restricted
], $request);
// error if no name specified
if (empty($request['name'])) {
throw new HTTPException\BadRequestException('event name not specified');
}
// error startDate is not specified
if (empty($request['start_time'])) {
throw new HTTPException\BadRequestException('startDate not specified');
}
// nofinish if end_time is not specified
if (empty($request['end_time'])) {
$finish = DBA::NULL_DATETIME;
$nofinish = true;
} else {
$finish = DateTimeFormat::convert($request['end_time'], 'UTC', DI::app()->getTimeZone());
$nofinish = false;
}
$start = DateTimeFormat::convert($request['start_time'], 'UTC', DI::app()->getTimeZone());
// create event
$event = [];
$event['id'] = $request['id'];
$event['uid'] = $uid;
$event['type'] = 'event';
$event['summary'] = $request['name'];
$event['desc'] = $request['desc'];
$event['location'] = $request['place'];
$event['start_time'] = $start;
$event['end_time'] = $finish;
$event['nofinish'] = $nofinish;
$event['allow_cid'] = $request['allow_cid'];
$event['allow_gid'] = $request['allow_gid'];
$event['deny_cid'] = $request['deny_cid'];
$event['deny_gid'] = $request['deny_gid'];
$event['publish'] = $request['publish'];
$event_id = Event::store($event);
if (!empty($request['publish'])) {
$item = ['network' => Protocol::DFRN, 'protocol' => Conversation::PARCEL_DIRECT, 'direction' => Conversation::PUSH];
$item = Event::getItemArrayForId($event_id, $item);
if (Item::insert($item)) {
Worker::add(PRIORITY_HIGH, "Notifier", Delivery::POST, (int)$item['uri-id'], $uid);
}
}
$result = ['success' => true, 'event_id' => $event_id, 'event' => $event];
$this->response->exit('event_create', ['$result' => $result], $this->parameters['extension'] ?? null);
}
}

View file

@ -0,0 +1,64 @@
<?php
/**
* @copyright Copyright (C) 2010-2022, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
* This program 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 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY 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 this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
namespace Friendica\Module\Api\Friendica\Events;
use Friendica\Database\DBA;
use Friendica\Model\Event;
use Friendica\Module\BaseApi;
use Friendica\Network\HTTPException;
/**
* API endpoint: /api/friendica/event_delete
*/
class Delete extends BaseApi
{
protected function post(array $request = [])
{
self::checkAllowedScope(self::SCOPE_WRITE);
$uid = self::getCurrentUserID();
$request = $this->getRequest([
'id' => 0
], $request);
// params
// error if no id specified
if ($request['id'] == 0) {
throw new HTTPException\BadRequestException('id not specified');
}
// error message if specified id is not in database
if (!DBA::exists('event', ['uid' => $uid, 'id' => $request['id']])) {
throw new HTTPException\BadRequestException('id not available');
}
// delete event
$eventid = $request['id'];
Event::delete($eventid);
$success = ['id' => $eventid, 'status' => 'deleted'];
$this->response->exit('event_delete', ['$result' => $success], $this->parameters['extension'] ?? null);
}
}

View file

@ -55,8 +55,8 @@ class Index extends BaseApi
'uri' => $event['uri'], 'uri' => $event['uri'],
'name' => $event['summary'], 'name' => $event['summary'],
'desc' => BBCode::convertForUriId($event['uri-id'], $event['desc']), 'desc' => BBCode::convertForUriId($event['uri-id'], $event['desc']),
'startTime' => $event['start'], 'start_time' => $event['start'],
'endTime' => $event['finish'], 'end_time' => $event['finish'],
'type' => $event['type'], 'type' => $event['type'],
'nofinish' => $event['nofinish'], 'nofinish' => $event['nofinish'],
'place' => $event['location'], 'place' => $event['location'],

View file

@ -79,13 +79,13 @@ class Notifications extends BaseApi
if (in_array(Notification::TYPE_INTRODUCTION, $request['exclude_types'])) { if (in_array(Notification::TYPE_INTRODUCTION, $request['exclude_types'])) {
$condition = DBA::mergeConditions($condition, $condition = DBA::mergeConditions($condition,
["(`vid` != ? OR `type` != ? OR NOT EXISTS (SELECT `id` FROM `contact` WHERE `id` = `actor-id` AND `pending`))", ["(`vid` != ? OR `type` != ? OR NOT `actor-id` IN (SELECT `id` FROM `contact` WHERE `pending`))",
Verb::getID(Activity::FOLLOW), Post\UserNotification::TYPE_NONE]); Verb::getID(Activity::FOLLOW), Post\UserNotification::TYPE_NONE]);
} }
if (in_array(Notification::TYPE_FOLLOW, $request['exclude_types'])) { if (in_array(Notification::TYPE_FOLLOW, $request['exclude_types'])) {
$condition = DBA::mergeConditions($condition, $condition = DBA::mergeConditions($condition,
["(`vid` != ? OR `type` != ? OR NOT EXISTS (SELECT `id` FROM `contact` WHERE `id` = `actor-id` AND NOT `pending`))", ["(`vid` != ? OR `type` != ? OR NOT `actor-id` IN (SELECT `id` FROM `contact` WHERE NOT `pending`))",
Verb::getID(Activity::FOLLOW), Post\UserNotification::TYPE_NONE]); Verb::getID(Activity::FOLLOW), Post\UserNotification::TYPE_NONE]);
} }

View file

@ -21,19 +21,36 @@
namespace Friendica\Module\Api\Mastodon; namespace Friendica\Module\Api\Mastodon;
use Friendica\Core\Logger; use Friendica\App;
use Friendica\Core\System; use Friendica\Core\L10n;
use Friendica\DI; use Friendica\Factory\Api\Mastodon\Error;
use Friendica\Factory\Api\Mastodon\Subscription as SubscriptionFactory;
use Friendica\Model\Subscription; use Friendica\Model\Subscription;
use Friendica\Module\Api\ApiResponse;
use Friendica\Module\BaseApi; use Friendica\Module\BaseApi;
use Friendica\Object\Api\Mastodon\Notification; use Friendica\Object\Api\Mastodon\Notification;
use Friendica\Util\Profiler;
use Psr\Log\LoggerInterface;
/** /**
* @see https://docs.joinmastodon.org/methods/notifications/push/ * @see https://docs.joinmastodon.org/methods/notifications/push/
*/ */
class PushSubscription extends BaseApi class PushSubscription extends BaseApi
{ {
protected function post(array $request = []) /** @var SubscriptionFactory */
protected $subscriptionFac;
/** @var Error */
protected $errorFac;
public function __construct(App $app, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, ApiResponse $response, SubscriptionFactory $subscriptionFac, Error $errorFac, array $server, array $parameters = [])
{
parent::__construct($app, $l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters);
$this->subscriptionFac = $subscriptionFac;
$this->errorFac = $errorFac;
}
protected function post(array $request = []): void
{ {
self::checkAllowedScope(self::SCOPE_PUSH); self::checkAllowedScope(self::SCOPE_PUSH);
$uid = self::getCurrentUserID(); $uid = self::getCurrentUserID();
@ -61,12 +78,13 @@ class PushSubscription extends BaseApi
$ret = Subscription::replace($subscription); $ret = Subscription::replace($subscription);
Logger::info('Subscription stored', ['ret' => $ret, 'subscription' => $subscription]); $this->logger->info('Subscription stored', ['ret' => $ret, 'subscription' => $subscription]);
return DI::mstdnSubscription()->createForApplicationIdAndUserId($application['id'], $uid)->toArray(); $subscriptionObj = $this->subscriptionFac->createForApplicationIdAndUserId($application['id'], $uid);
$this->response->exitWithJson($subscriptionObj->toArray());
} }
public function put(array $request = []) public function put(array $request = []): void
{ {
self::checkAllowedScope(self::SCOPE_PUSH); self::checkAllowedScope(self::SCOPE_PUSH);
$uid = self::getCurrentUserID(); $uid = self::getCurrentUserID();
@ -78,8 +96,8 @@ class PushSubscription extends BaseApi
$subscription = Subscription::select($application['id'], $uid, ['id']); $subscription = Subscription::select($application['id'], $uid, ['id']);
if (empty($subscription)) { if (empty($subscription)) {
Logger::info('Subscription not found', ['application-id' => $application['id'], 'uid' => $uid]); $this->logger->info('Subscription not found', ['application-id' => $application['id'], 'uid' => $uid]);
DI::mstdnError()->RecordNotFound(); $this->errorFac->RecordNotFound();
} }
$fields = [ $fields = [
@ -94,12 +112,18 @@ class PushSubscription extends BaseApi
$ret = Subscription::update($application['id'], $uid, $fields); $ret = Subscription::update($application['id'], $uid, $fields);
Logger::info('Subscription updated', ['result' => $ret, 'application-id' => $application['id'], 'uid' => $uid, 'fields' => $fields]); $this->logger->info('Subscription updated', [
'result' => $ret,
'application-id' => $application['id'],
'uid' => $uid,
'fields' => $fields,
]);
return DI::mstdnSubscription()->createForApplicationIdAndUserId($application['id'], $uid)->toArray(); $subscriptionObj = $this->subscriptionFac->createForApplicationIdAndUserId($application['id'], $uid);
$this->response->exitWithJson($subscriptionObj->toArray());
} }
protected function delete(array $request = []) protected function delete(array $request = []): void
{ {
self::checkAllowedScope(self::SCOPE_PUSH); self::checkAllowedScope(self::SCOPE_PUSH);
$uid = self::getCurrentUserID(); $uid = self::getCurrentUserID();
@ -107,24 +131,29 @@ class PushSubscription extends BaseApi
$ret = Subscription::delete($application['id'], $uid); $ret = Subscription::delete($application['id'], $uid);
Logger::info('Subscription deleted', ['result' => $ret, 'application-id' => $application['id'], 'uid' => $uid]); $this->logger->info('Subscription deleted', [
'result' => $ret,
'application-id' => $application['id'],
'uid' => $uid,
]);
System::jsonExit([]); $this->response->exitWithJson([]);
} }
protected function rawContent(array $request = []) protected function rawContent(array $request = []): void
{ {
self::checkAllowedScope(self::SCOPE_PUSH); self::checkAllowedScope(self::SCOPE_PUSH);
$uid = self::getCurrentUserID(); $uid = self::getCurrentUserID();
$application = self::getCurrentApplication(); $application = self::getCurrentApplication();
if (!Subscription::exists($application['id'], $uid)) { if (!Subscription::exists($application['id'], $uid)) {
Logger::info('Subscription not found', ['application-id' => $application['id'], 'uid' => $uid]); $this->logger->info('Subscription not found', ['application-id' => $application['id'], 'uid' => $uid]);
DI::mstdnError()->RecordNotFound(); $this->errorFac->RecordNotFound();
} }
Logger::info('Fetch subscription', ['application-id' => $application['id'], 'uid' => $uid]); $this->logger->info('Fetch subscription', ['application-id' => $application['id'], 'uid' => $uid]);
return DI::mstdnSubscription()->createForApplicationIdAndUserId($application['id'], $uid)->toArray(); $subscriptionObj = $this->subscriptionFac->createForApplicationIdAndUserId($application['id'], $uid);
$this->response->exitWithJson($subscriptionObj->toArray());
} }
} }

View file

@ -180,7 +180,7 @@ class Search extends BaseApi
$params = ['order' => ['name'], 'limit' => [$offset, $limit]]; $params = ['order' => ['name'], 'limit' => [$offset, $limit]];
$condition = ["EXISTS(SELECT `tid` FROM `post-tag` WHERE `type` = ? AND `tid` = `id`) AND `name` LIKE ?", Tag::HASHTAG, $q . '%']; $condition = ["`id` IN (SELECT `tid` FROM `post-tag` WHERE `type` = ?) AND `name` LIKE ?", Tag::HASHTAG, $q . '%'];
$tags = DBA::select('tag', ['name'], $condition, $params); $tags = DBA::select('tag', ['name'], $condition, $params);

View file

@ -92,7 +92,7 @@ class PublicTimeline extends BaseApi
if (!empty($uid)) { if (!empty($uid)) {
$condition = DBA::mergeConditions($condition, $condition = DBA::mergeConditions($condition,
["NOT EXISTS (SELECT `cid` FROM `user-contact` WHERE `uid` = ? AND `cid` = `parent-author-id` AND (`blocked` OR `ignored`))", $uid]); ["NOT `parent-author-id` IN (SELECT `cid` FROM `user-contact` WHERE `uid` = ? AND (`blocked` OR `ignored`))", $uid]);
} }
$items = Post::selectPostsForUser($uid, ['uri-id'], $condition, $params); $items = Post::selectPostsForUser($uid, ['uri-id'], $condition, $params);

View file

@ -210,7 +210,7 @@ class Contact extends BaseModule
switch ($type) { switch ($type) {
case 'blocked': case 'blocked':
$sql_extra = " AND EXISTS(SELECT `id` from `user-contact` WHERE `contact`.`id` = `user-contact`.`cid` and `user-contact`.`uid` = ? and `user-contact`.`blocked`)"; $sql_extra = " AND `id` IN (SELECT `cid` FROM `user-contact` WHERE `user-contact`.`uid` = ? AND `user-contact`.`blocked`)";
// This makes the query look for contact.uid = 0 // This makes the query look for contact.uid = 0
array_unshift($sql_values, 0); array_unshift($sql_values, 0);
break; break;
@ -218,7 +218,7 @@ class Contact extends BaseModule
$sql_extra = " AND `hidden` AND NOT `blocked` AND NOT `pending`"; $sql_extra = " AND `hidden` AND NOT `blocked` AND NOT `pending`";
break; break;
case 'ignored': case 'ignored':
$sql_extra = " AND EXISTS(SELECT `id` from `user-contact` WHERE `contact`.`id` = `user-contact`.`cid` and `user-contact`.`uid` = ? and `user-contact`.`ignored`)"; $sql_extra = " AND `id` IN (SELECT `cid` FROM `user-contact` WHERE `user-contact`.`uid` = ? AND `user-contact`.`ignored`)";
// This makes the query look for contact.uid = 0 // This makes the query look for contact.uid = 0
array_unshift($sql_values, 0); array_unshift($sql_values, 0);
break; break;
@ -227,8 +227,9 @@ class Contact extends BaseModule
break; break;
case 'pending': case 'pending':
$sql_extra = " AND `pending` AND NOT `archive` AND NOT `failed` AND ((`rel` = ?) $sql_extra = " AND `pending` AND NOT `archive` AND NOT `failed` AND ((`rel` = ?)
OR EXISTS (SELECT `id` FROM `intro` WHERE `contact-id` = `contact`.`id` AND NOT `ignore`))"; OR `id` IN (SELECT `contact-id` FROM `intro` WHERE `intro`.`uid` = ? AND NOT `ignore`))";
$sql_values[] = Model\Contact::SHARING; $sql_values[] = Model\Contact::SHARING;
$sql_values[] = local_user();
break; break;
default: default:
$sql_extra = " AND NOT `archive` AND NOT `blocked` AND NOT `pending`"; $sql_extra = " AND NOT `archive` AND NOT `blocked` AND NOT `pending`";
@ -275,7 +276,7 @@ class Contact extends BaseModule
} }
if ($group) { if ($group) {
$sql_extra .= " AND EXISTS(SELECT `id` FROM `group_member` WHERE `gid` = ? AND `contact`.`id` = `contact-id`)"; $sql_extra .= " AND `id` IN (SELECT `contact-id` FROM `group_member` WHERE `gid` = ?)";
$sql_values[] = $group; $sql_values[] = $group;
} }

View file

@ -53,11 +53,17 @@ class Community extends BaseModule
{ {
$this->parseRequest(); $this->parseRequest();
$t = Renderer::getMarkupTemplate("community.tpl");
$o = Renderer::replaceMacros($t, [
'$content' => '',
'$header' => '',
'$show_global_community_hint' => (self::$content == 'global') && DI::config()->get('system', 'show_global_community_hint'),
'$global_community_hint' => DI::l10n()->t("This community stream shows all public posts received by this node. They may not reflect the opinions of this nodes users.")
]);
if (DI::pConfig()->get(local_user(), 'system', 'infinite_scroll')) { if (DI::pConfig()->get(local_user(), 'system', 'infinite_scroll')) {
$tpl = Renderer::getMarkupTemplate('infinite_scroll_head.tpl'); $tpl = Renderer::getMarkupTemplate('infinite_scroll_head.tpl');
$o = Renderer::replaceMacros($tpl, ['$reload_uri' => DI::args()->getQueryString()]); $o .= Renderer::replaceMacros($tpl, ['$reload_uri' => DI::args()->getQueryString()]);
} else {
$o = '';
} }
if (empty($_GET['mode']) || ($_GET['mode'] != 'raw')) { if (empty($_GET['mode']) || ($_GET['mode'] != 'raw')) {
@ -154,13 +160,7 @@ class Community extends BaseModule
$o .= $pager->renderMinimal(count($items)); $o .= $pager->renderMinimal(count($items));
} }
$t = Renderer::getMarkupTemplate("community.tpl"); return $o;
return Renderer::replaceMacros($t, [
'$content' => $o,
'$header' => '',
'$show_global_community_hint' => (self::$content == 'global') && DI::config()->get('system', 'show_global_community_hint'),
'$global_community_hint' => DI::l10n()->t("This community stream shows all public posts received by this node. They may not reflect the opinions of this nodes users.")
]);
} }
/** /**
@ -323,7 +323,7 @@ class Community extends BaseModule
$condition[] = $item_id; $condition[] = $item_id;
} else { } else {
if (local_user() && !empty($_REQUEST['no_sharer'])) { if (local_user() && !empty($_REQUEST['no_sharer'])) {
$condition[0] .= " AND NOT EXISTS (SELECT `uri-id` FROM `post-user` WHERE `post-user`.`uri-id` = `post-thread-user-view`.`uri-id` AND `post-user`.`uid` = ?)"; $condition[0] .= " AND NOT `uri-id` IN (SELECT `uri-id` FROM `post-user` WHERE `post-user`.`uid` = ?)";
$condition[] = local_user(); $condition[] = local_user();
} }

View file

@ -413,7 +413,7 @@ class Network extends BaseModule
$conditionStrings = DBA::mergeConditions($conditionStrings, ["`contact-id` IN (SELECT `contact-id` FROM `group_member` WHERE `gid` = ?)", self::$groupId]); $conditionStrings = DBA::mergeConditions($conditionStrings, ["`contact-id` IN (SELECT `contact-id` FROM `group_member` WHERE `gid` = ?)", self::$groupId]);
} elseif (self::$forumContactId) { } elseif (self::$forumContactId) {
$conditionStrings = DBA::mergeConditions($conditionStrings, $conditionStrings = DBA::mergeConditions($conditionStrings,
["((`contact-id` = ?) OR EXISTS(SELECT `uri-id` FROM `post-user-view` WHERE `post-user-view`.`parent-uri-id` = " . DBA::quoteIdentifier($table) . ".`uri-id` AND (`contact-id` = ? AND `gravity` = ? AND `vid` = ? AND `uid` = ?)))", ["((`contact-id` = ?) OR `uri-id` IN (SELECT `parent-uri-id` FROM `post-user-view` WHERE (`contact-id` = ? AND `gravity` = ? AND `vid` = ? AND `uid` = ?)))",
self::$forumContactId, self::$forumContactId, GRAVITY_ACTIVITY, Verb::getID(Activity::ANNOUNCE), local_user()]); self::$forumContactId, self::$forumContactId, GRAVITY_ACTIVITY, Verb::getID(Activity::ANNOUNCE), local_user()]);
} }

View file

@ -175,10 +175,8 @@ class Status extends BaseProfile
$condition = DBA::mergeConditions($condition, ["((`gravity` = ? AND `wall`) OR $condition = DBA::mergeConditions($condition, ["((`gravity` = ? AND `wall`) OR
(`gravity` = ? AND `vid` = ? AND `origin` (`gravity` = ? AND `vid` = ? AND `origin`
AND EXISTS(SELECT `uri-id` FROM `post` WHERE `gravity` = ? AND `network` IN (?, ?, ?, ?) AND `thr-parent-id` IN (SELECT `uri-id` FROM `post` WHERE `gravity` = ? AND `network` = ?)))",
AND `uri-id` = `post-user-view`.`thr-parent-id`)))", GRAVITY_PARENT, GRAVITY_ACTIVITY, Verb::getID(Activity::ANNOUNCE), GRAVITY_PARENT, Protocol::ACTIVITYPUB]);
GRAVITY_PARENT, GRAVITY_ACTIVITY, Verb::getID(Activity::ANNOUNCE), GRAVITY_PARENT,
Protocol::DFRN, Protocol::ACTIVITYPUB, Protocol::DIASPORA, Protocol::OSTATUS]);
$condition = DBA::mergeConditions($condition, ['uid' => $profile['uid'], 'network' => Protocol::FEDERATED, $condition = DBA::mergeConditions($condition, ['uid' => $profile['uid'], 'network' => Protocol::FEDERATED,
'visible' => true, 'deleted' => false]); 'visible' => true, 'deleted' => false]);

View file

@ -77,7 +77,7 @@ class Probe
public static function cleanURI(string $rawUri): string public static function cleanURI(string $rawUri): string
{ {
// At first remove leading and trailing junk // At first remove leading and trailing junk
$rawUri = trim($rawUri, "@#?:/ \t\n\r\0\x0B"); $rawUri = trim($rawUri, "@#?: \t\n\r\0\x0B");
$rawUri = Network::convertToIdn($rawUri); $rawUri = Network::convertToIdn($rawUri);

View file

@ -22,6 +22,7 @@
namespace Friendica\Worker; namespace Friendica\Worker;
use Friendica\Core\Logger; use Friendica\Core\Logger;
use Friendica\Core\Worker;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\DI; use Friendica\DI;
use Friendica\Model\GServer; use Friendica\Model\GServer;

View file

@ -82,6 +82,8 @@ $apiRoutes = [
'/direct_messages_setseen[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\DirectMessages\Setseen::class, [ R::POST]], '/direct_messages_setseen[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\DirectMessages\Setseen::class, [ R::POST]],
'/direct_messages_search[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\DirectMessages\Search ::class, [R::GET ]], '/direct_messages_search[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\DirectMessages\Search ::class, [R::GET ]],
'/events[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Events\Index::class, [R::GET ]], '/events[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Events\Index::class, [R::GET ]],
'/event_create[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Events\Create::class, [ R::POST]],
'/event_delete[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Events\Delete::class, [ R::POST]],
'/group_show[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Group\Show::class, [R::GET ]], '/group_show[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Group\Show::class, [R::GET ]],
'/group_create[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Group\Create::class, [ R::POST]], '/group_create[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Group\Create::class, [ R::POST]],
'/group_delete[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Group\Delete::class, [ R::POST]], '/group_delete[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Group\Delete::class, [ R::POST]],

View file

@ -82,6 +82,10 @@ its surprisingly good",
'html' => "<p>Now playing</p><pre><code>echo &quot;main(i){for(i=0;;i++)putchar(((i*(i&gt;&gt;8|i&gt;&gt;9)&amp;46&amp;i&gt;&gt;8))^(i&amp;i&gt;&gt;13|i&gt;&gt;6));}&quot; | gcc -o a.out -x c - 2&gt; /dev/null 'html' => "<p>Now playing</p><pre><code>echo &quot;main(i){for(i=0;;i++)putchar(((i*(i&gt;&gt;8|i&gt;&gt;9)&amp;46&amp;i&gt;&gt;8))^(i&amp;i&gt;&gt;13|i&gt;&gt;6));}&quot; | gcc -o a.out -x c - 2&gt; /dev/null
./a.out | aplay -q 2&gt; /dev/null</code></pre><p>its surprisingly good</p>", ./a.out | aplay -q 2&gt; /dev/null</code></pre><p>its surprisingly good</p>",
], ],
'bug-11851-content-0' => [
'expectedBBCode' => '[url=https://dev-friendica.mrpetovan.com/profile/hypolite]@hypolite[/url] 0',
'html' => '<p><span class="h-card"><a href="https://dev-friendica.mrpetovan.com/profile/hypolite" class="u-url mention">@<span>hypolite</span></a></span> 0</p>',
],
]; ];
} }

View file

@ -0,0 +1,62 @@
<?php
/**
* @copyright Copyright (C) 2010-2022, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
* This program 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 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY 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 this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
namespace Friendica\Test\src\Module\Api\Mastodon;
use Friendica\Test\src\Module\Api\ApiTest;
class PushSubscriptionTest extends ApiTest
{
/**
* Test the api_account_verify_credentials() function.
*
* @return void
*/
public function testApiAccountVerifyCredentials(): void
{
$this->markTestIncomplete('Needs mocking of whole applictaions/Apps first');
// $this->useHttpMethod(Router::POST);
//
// $response = (new PushSubscription(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), DI::mstdnSubscription(), DI::mstdnError(), []))
// ->run();
//
// $json = $this->toJson($response);
// print_r($json);
//
// $this->assertEquals(1,1);
}
/**
* Test the api_account_verify_credentials() function without an authenticated user.
*
* @return void
*/
public function testApiAccountVerifyCredentialsWithoutAuthenticatedUser(): void
{
self::markTestIncomplete('Needs dynamic BasicAuth first');
// $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
// BasicAuth::setCurrentUserID();
// $_SESSION['authenticated'] = false;
// api_account_verify_credentials('json');
}
}

View file

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: 2022.09-rc\n" "Project-Id-Version: 2022.09-rc\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-09-11 02:40-0400\n" "POT-Creation-Date: 2022-09-25 07:08+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -19,7 +19,7 @@ msgstr ""
#: mod/cal.php:46 mod/cal.php:50 mod/follow.php:39 mod/redir.php:36 #: mod/cal.php:46 mod/cal.php:50 mod/follow.php:39 mod/redir.php:36
#: mod/redir.php:177 src/Module/Conversation/Community.php:181 #: mod/redir.php:177 src/Module/Conversation/Community.php:183
#: src/Module/Debug/ItemBody.php:38 src/Module/Diaspora/Receive.php:57 #: src/Module/Debug/ItemBody.php:38 src/Module/Diaspora/Receive.php:57
#: src/Module/Item/Follow.php:42 src/Module/Item/Ignore.php:41 #: src/Module/Item/Follow.php:42 src/Module/Item/Ignore.php:41
#: src/Module/Item/Pin.php:42 src/Module/Item/Pin.php:57 #: src/Module/Item/Pin.php:42 src/Module/Item/Pin.php:57
@ -105,7 +105,7 @@ msgid "calendar"
msgstr "" msgstr ""
#: mod/display.php:143 mod/photos.php:802 #: mod/display.php:143 mod/photos.php:802
#: src/Module/Conversation/Community.php:175 src/Module/Directory.php:49 #: src/Module/Conversation/Community.php:177 src/Module/Directory.php:49
#: src/Module/Search/Index.php:65 #: src/Module/Search/Index.php:65
msgid "Public access denied." msgid "Public access denied."
msgstr "" msgstr ""
@ -426,7 +426,7 @@ msgstr ""
msgid "Basic" msgid "Basic"
msgstr "" msgstr ""
#: mod/events.php:517 src/Module/Admin/Site.php:441 src/Module/Contact.php:474 #: mod/events.php:517 src/Module/Admin/Site.php:441 src/Module/Contact.php:475
#: src/Module/Profile/Profile.php:249 #: src/Module/Profile/Profile.php:249
msgid "Advanced" msgid "Advanced"
msgstr "" msgstr ""
@ -470,7 +470,7 @@ msgid "OStatus support is disabled. Contact can't be added."
msgstr "" msgstr ""
#: mod/follow.php:138 src/Content/Item.php:397 src/Content/Widget.php:80 #: mod/follow.php:138 src/Content/Item.php:397 src/Content/Widget.php:80
#: src/Model/Contact.php:1121 src/Model/Contact.php:1132 #: src/Model/Contact.php:1146 src/Model/Contact.php:1157
#: view/theme/vier/theme.php:181 #: view/theme/vier/theme.php:181
msgid "Connect/Follow" msgid "Connect/Follow"
msgstr "" msgstr ""
@ -507,7 +507,7 @@ msgid "Add a personal note:"
msgstr "" msgstr ""
#: mod/follow.php:163 mod/unfollow.php:109 src/Module/BaseProfile.php:59 #: mod/follow.php:163 mod/unfollow.php:109 src/Module/BaseProfile.php:59
#: src/Module/Contact.php:444 #: src/Module/Contact.php:445
msgid "Status Messages and Posts" msgid "Status Messages and Posts"
msgstr "" msgstr ""
@ -1070,7 +1070,7 @@ msgid "Rotate CCW (left)"
msgstr "" msgstr ""
#: mod/photos.php:1333 mod/photos.php:1389 mod/photos.php:1463 #: mod/photos.php:1333 mod/photos.php:1389 mod/photos.php:1463
#: src/Module/Contact.php:544 src/Module/Item/Compose.php:160 #: src/Module/Contact.php:545 src/Module/Item/Compose.php:160
#: src/Object/Post.php:989 #: src/Object/Post.php:989
msgid "This is you" msgid "This is you"
msgstr "" msgstr ""
@ -1411,7 +1411,7 @@ msgstr ""
msgid "Friend Suggestions" msgid "Friend Suggestions"
msgstr "" msgstr ""
#: mod/tagger.php:78 src/Content/Item.php:297 src/Model/Item.php:2834 #: mod/tagger.php:78 src/Content/Item.php:297 src/Model/Item.php:2846
msgid "photo" msgid "photo"
msgstr "" msgstr ""
@ -1557,17 +1557,17 @@ msgstr ""
msgid "Apologies but the website is unavailable at the moment." msgid "Apologies but the website is unavailable at the moment."
msgstr "" msgstr ""
#: src/App/Page.php:276 #: src/App/Page.php:281
msgid "Delete this item?" msgid "Delete this item?"
msgstr "" msgstr ""
#: src/App/Page.php:277 #: src/App/Page.php:282
msgid "" msgid ""
"Block this author? They won't be able to follow you nor see your public " "Block this author? They won't be able to follow you nor see your public "
"posts, and you won't be able to see their posts and their notifications." "posts, and you won't be able to see their posts and their notifications."
msgstr "" msgstr ""
#: src/App/Page.php:347 #: src/App/Page.php:352
msgid "toggle mobile" msgid "toggle mobile"
msgstr "" msgstr ""
@ -1595,16 +1595,16 @@ msgid "All contacts"
msgstr "" msgstr ""
#: src/BaseModule.php:424 src/Content/Widget.php:235 src/Core/ACL.php:194 #: src/BaseModule.php:424 src/Content/Widget.php:235 src/Core/ACL.php:194
#: src/Module/Contact.php:367 src/Module/PermissionTooltip.php:122 #: src/Module/Contact.php:368 src/Module/PermissionTooltip.php:122
#: src/Module/PermissionTooltip.php:144 #: src/Module/PermissionTooltip.php:144
msgid "Followers" msgid "Followers"
msgstr "" msgstr ""
#: src/BaseModule.php:429 src/Content/Widget.php:236 src/Module/Contact.php:368 #: src/BaseModule.php:429 src/Content/Widget.php:236 src/Module/Contact.php:369
msgid "Following" msgid "Following"
msgstr "" msgstr ""
#: src/BaseModule.php:434 src/Content/Widget.php:237 src/Module/Contact.php:369 #: src/BaseModule.php:434 src/Content/Widget.php:237 src/Module/Contact.php:370
msgid "Mutual friends" msgid "Mutual friends"
msgstr "" msgstr ""
@ -1644,63 +1644,63 @@ msgstr ""
msgid "The contact has been blocked from the node" msgid "The contact has been blocked from the node"
msgstr "" msgstr ""
#: src/Console/MergeContacts.php:74 #: src/Console/MergeContacts.php:75
#, php-format #, php-format
msgid "%d %s, %d duplicates." msgid "%d %s, %d duplicates."
msgstr "" msgstr ""
#: src/Console/MergeContacts.php:77 #: src/Console/MergeContacts.php:78
#, php-format #, php-format
msgid "uri-id is empty for contact %s." msgid "uri-id is empty for contact %s."
msgstr "" msgstr ""
#: src/Console/MergeContacts.php:90 #: src/Console/MergeContacts.php:91
#, php-format #, php-format
msgid "No valid first contact found for uri-id %d." msgid "No valid first contact found for uri-id %d."
msgstr "" msgstr ""
#: src/Console/MergeContacts.php:101 #: src/Console/MergeContacts.php:102
#, php-format #, php-format
msgid "Wrong duplicate found for uri-id %d in %d (url: %s != %s)." msgid "Wrong duplicate found for uri-id %d in %d (url: %s != %s)."
msgstr "" msgstr ""
#: src/Console/MergeContacts.php:105 #: src/Console/MergeContacts.php:106
#, php-format #, php-format
msgid "Wrong duplicate found for uri-id %d in %d (nurl: %s != %s)." msgid "Wrong duplicate found for uri-id %d in %d (nurl: %s != %s)."
msgstr "" msgstr ""
#: src/Console/MergeContacts.php:141 #: src/Console/MergeContacts.php:142
#, php-format #, php-format
msgid "Deletion of id %d failed" msgid "Deletion of id %d failed"
msgstr "" msgstr ""
#: src/Console/MergeContacts.php:143 #: src/Console/MergeContacts.php:144
#, php-format #, php-format
msgid "Deletion of id %d was successful" msgid "Deletion of id %d was successful"
msgstr "" msgstr ""
#: src/Console/MergeContacts.php:149 #: src/Console/MergeContacts.php:150
#, php-format #, php-format
msgid "Updating \"%s\" in \"%s\" from %d to %d" msgid "Updating \"%s\" in \"%s\" from %d to %d"
msgstr "" msgstr ""
#: src/Console/MergeContacts.php:151 #: src/Console/MergeContacts.php:152
msgid " - found" msgid " - found"
msgstr "" msgstr ""
#: src/Console/MergeContacts.php:158 #: src/Console/MergeContacts.php:159
msgid " - failed" msgid " - failed"
msgstr "" msgstr ""
#: src/Console/MergeContacts.php:160 #: src/Console/MergeContacts.php:161
msgid " - success" msgid " - success"
msgstr "" msgstr ""
#: src/Console/MergeContacts.php:164 #: src/Console/MergeContacts.php:165
msgid " - deleted" msgid " - deleted"
msgstr "" msgstr ""
#: src/Console/MergeContacts.php:167 #: src/Console/MergeContacts.php:168
msgid " - done" msgid " - done"
msgstr "" msgstr ""
@ -2292,7 +2292,7 @@ msgstr ""
msgid "show more" msgid "show more"
msgstr "" msgstr ""
#: src/Content/Item.php:288 src/Model/Item.php:2832 #: src/Content/Item.php:288 src/Model/Item.php:2844
msgid "event" msgid "event"
msgstr "" msgstr ""
@ -2300,42 +2300,42 @@ msgstr ""
msgid "Follow Thread" msgid "Follow Thread"
msgstr "" msgstr ""
#: src/Content/Item.php:381 src/Model/Contact.php:1126 #: src/Content/Item.php:381 src/Model/Contact.php:1151
msgid "View Status" msgid "View Status"
msgstr "" msgstr ""
#: src/Content/Item.php:382 src/Content/Item.php:400 src/Model/Contact.php:1064 #: src/Content/Item.php:382 src/Content/Item.php:400 src/Model/Contact.php:1089
#: src/Model/Contact.php:1118 src/Model/Contact.php:1127 #: src/Model/Contact.php:1143 src/Model/Contact.php:1152
#: src/Module/Directory.php:158 src/Module/Settings/Profile/Index.php:225 #: src/Module/Directory.php:158 src/Module/Settings/Profile/Index.php:225
msgid "View Profile" msgid "View Profile"
msgstr "" msgstr ""
#: src/Content/Item.php:383 src/Model/Contact.php:1128 #: src/Content/Item.php:383 src/Model/Contact.php:1153
msgid "View Photos" msgid "View Photos"
msgstr "" msgstr ""
#: src/Content/Item.php:384 src/Model/Contact.php:1119 #: src/Content/Item.php:384 src/Model/Contact.php:1144
#: src/Model/Contact.php:1129 #: src/Model/Contact.php:1154
msgid "Network Posts" msgid "Network Posts"
msgstr "" msgstr ""
#: src/Content/Item.php:385 src/Model/Contact.php:1120 #: src/Content/Item.php:385 src/Model/Contact.php:1145
#: src/Model/Contact.php:1130 #: src/Model/Contact.php:1155
msgid "View Contact" msgid "View Contact"
msgstr "" msgstr ""
#: src/Content/Item.php:386 src/Model/Contact.php:1131 #: src/Content/Item.php:386 src/Model/Contact.php:1156
msgid "Send PM" msgid "Send PM"
msgstr "" msgstr ""
#: src/Content/Item.php:387 src/Module/Admin/Blocklist/Contact.php:100 #: src/Content/Item.php:387 src/Module/Admin/Blocklist/Contact.php:100
#: src/Module/Admin/Users/Active.php:140 src/Module/Admin/Users/Index.php:154 #: src/Module/Admin/Users/Active.php:140 src/Module/Admin/Users/Index.php:154
#: src/Module/Contact.php:398 src/Module/Contact/Profile.php:348 #: src/Module/Contact.php:399 src/Module/Contact/Profile.php:348
#: src/Module/Contact/Profile.php:449 #: src/Module/Contact/Profile.php:449
msgid "Block" msgid "Block"
msgstr "" msgstr ""
#: src/Content/Item.php:388 src/Module/Contact.php:399 #: src/Content/Item.php:388 src/Module/Contact.php:400
#: src/Module/Contact/Profile.php:349 src/Module/Contact/Profile.php:457 #: src/Module/Contact/Profile.php:349 src/Module/Contact/Profile.php:457
#: src/Module/Notifications/Introductions.php:132 #: src/Module/Notifications/Introductions.php:132
#: src/Module/Notifications/Introductions.php:204 #: src/Module/Notifications/Introductions.php:204
@ -2381,7 +2381,7 @@ msgid "Sign in"
msgstr "" msgstr ""
#: src/Content/Nav.php:192 src/Module/BaseProfile.php:56 #: src/Content/Nav.php:192 src/Module/BaseProfile.php:56
#: src/Module/Contact.php:433 src/Module/Contact/Profile.php:380 #: src/Module/Contact.php:434 src/Module/Contact/Profile.php:380
#: src/Module/Settings/TwoFactor/Index.php:120 view/theme/frio/theme.php:236 #: src/Module/Settings/TwoFactor/Index.php:120 view/theme/frio/theme.php:236
msgid "Status" msgid "Status"
msgstr "" msgstr ""
@ -2392,7 +2392,7 @@ msgid "Your posts and conversations"
msgstr "" msgstr ""
#: src/Content/Nav.php:193 src/Module/BaseProfile.php:48 #: src/Content/Nav.php:193 src/Module/BaseProfile.php:48
#: src/Module/BaseSettings.php:55 src/Module/Contact.php:457 #: src/Module/BaseSettings.php:55 src/Module/Contact.php:458
#: src/Module/Contact/Profile.php:382 src/Module/Profile/Profile.php:241 #: src/Module/Contact/Profile.php:382 src/Module/Profile/Profile.php:241
#: src/Module/Welcome.php:57 view/theme/frio/theme.php:237 #: src/Module/Welcome.php:57 view/theme/frio/theme.php:237
msgid "Profile" msgid "Profile"
@ -2407,7 +2407,7 @@ msgid "Your photos"
msgstr "" msgstr ""
#: src/Content/Nav.php:195 src/Module/BaseProfile.php:72 #: src/Content/Nav.php:195 src/Module/BaseProfile.php:72
#: src/Module/BaseProfile.php:75 src/Module/Contact.php:449 #: src/Module/BaseProfile.php:75 src/Module/Contact.php:450
#: view/theme/frio/theme.php:239 #: view/theme/frio/theme.php:239
msgid "Media" msgid "Media"
msgstr "" msgstr ""
@ -2481,8 +2481,8 @@ msgstr ""
#: src/Content/Nav.php:237 src/Content/Nav.php:296 #: src/Content/Nav.php:237 src/Content/Nav.php:296
#: src/Content/Text/HTML.php:899 src/Module/BaseProfile.php:125 #: src/Content/Text/HTML.php:899 src/Module/BaseProfile.php:125
#: src/Module/BaseProfile.php:128 src/Module/Contact.php:370 #: src/Module/BaseProfile.php:128 src/Module/Contact.php:371
#: src/Module/Contact.php:464 view/theme/frio/theme.php:247 #: src/Module/Contact.php:465 view/theme/frio/theme.php:247
msgid "Contacts" msgid "Contacts"
msgstr "" msgstr ""
@ -2639,8 +2639,8 @@ msgid ""
"<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s" "<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s"
msgstr "" msgstr ""
#: src/Content/Text/BBCode.php:1213 src/Model/Item.php:3408 #: src/Content/Text/BBCode.php:1213 src/Model/Item.php:3420
#: src/Model/Item.php:3414 src/Model/Item.php:3415 #: src/Model/Item.php:3426 src/Model/Item.php:3427
msgid "Link to source" msgid "Link to source"
msgstr "" msgstr ""
@ -2712,7 +2712,7 @@ msgstr ""
msgid "Examples: Robert Morgenstein, Fishing" msgid "Examples: Robert Morgenstein, Fishing"
msgstr "" msgstr ""
#: src/Content/Widget.php:82 src/Module/Contact.php:391 #: src/Content/Widget.php:82 src/Module/Contact.php:392
#: src/Module/Directory.php:97 view/theme/vier/theme.php:183 #: src/Module/Directory.php:97 view/theme/vier/theme.php:183
msgid "Find" msgid "Find"
msgstr "" msgstr ""
@ -2739,7 +2739,7 @@ msgid "Local Directory"
msgstr "" msgstr ""
#: src/Content/Widget.php:211 src/Model/Group.php:587 #: src/Content/Widget.php:211 src/Model/Group.php:587
#: src/Module/Contact.php:354 src/Module/Welcome.php:76 #: src/Module/Contact.php:355 src/Module/Welcome.php:76
msgid "Groups" msgid "Groups"
msgstr "" msgstr ""
@ -2751,7 +2751,7 @@ msgstr ""
msgid "Relationships" msgid "Relationships"
msgstr "" msgstr ""
#: src/Content/Widget.php:244 src/Module/Contact.php:306 #: src/Content/Widget.php:244 src/Module/Contact.php:307
#: src/Module/Group.php:293 #: src/Module/Group.php:293
msgid "All Contacts" msgid "All Contacts"
msgstr "" msgstr ""
@ -2795,7 +2795,7 @@ msgstr ""
msgid "Organisations" msgid "Organisations"
msgstr "" msgstr ""
#: src/Content/Widget.php:523 src/Model/Contact.php:1553 #: src/Content/Widget.php:523 src/Model/Contact.php:1582
msgid "News" msgid "News"
msgstr "" msgstr ""
@ -3588,81 +3588,81 @@ msgstr ""
msgid "Legacy module file not found: %s" msgid "Legacy module file not found: %s"
msgstr "" msgstr ""
#: src/Model/Contact.php:1122 src/Model/Contact.php:1133 #: src/Model/Contact.php:1147 src/Model/Contact.php:1158
msgid "UnFollow" msgid "UnFollow"
msgstr "" msgstr ""
#: src/Model/Contact.php:1139 src/Module/Admin/Users/Pending.php:107 #: src/Model/Contact.php:1164 src/Module/Admin/Users/Pending.php:107
#: src/Module/Notifications/Introductions.php:130 #: src/Module/Notifications/Introductions.php:130
#: src/Module/Notifications/Introductions.php:202 #: src/Module/Notifications/Introductions.php:202
msgid "Approve" msgid "Approve"
msgstr "" msgstr ""
#: src/Model/Contact.php:1549 #: src/Model/Contact.php:1578
msgid "Organisation" msgid "Organisation"
msgstr "" msgstr ""
#: src/Model/Contact.php:1557 #: src/Model/Contact.php:1586
msgid "Forum" msgid "Forum"
msgstr "" msgstr ""
#: src/Model/Contact.php:2710 #: src/Model/Contact.php:2774
msgid "Disallowed profile URL." msgid "Disallowed profile URL."
msgstr "" msgstr ""
#: src/Model/Contact.php:2715 src/Module/Friendica.php:81 #: src/Model/Contact.php:2779 src/Module/Friendica.php:81
msgid "Blocked domain" msgid "Blocked domain"
msgstr "" msgstr ""
#: src/Model/Contact.php:2720 #: src/Model/Contact.php:2784
msgid "Connect URL missing." msgid "Connect URL missing."
msgstr "" msgstr ""
#: src/Model/Contact.php:2729 #: src/Model/Contact.php:2793
msgid "" msgid ""
"The contact could not be added. Please check the relevant network " "The contact could not be added. Please check the relevant network "
"credentials in your Settings -> Social Networks page." "credentials in your Settings -> Social Networks page."
msgstr "" msgstr ""
#: src/Model/Contact.php:2771 #: src/Model/Contact.php:2835
msgid "The profile address specified does not provide adequate information." msgid "The profile address specified does not provide adequate information."
msgstr "" msgstr ""
#: src/Model/Contact.php:2773 #: src/Model/Contact.php:2837
msgid "No compatible communication protocols or feeds were discovered." msgid "No compatible communication protocols or feeds were discovered."
msgstr "" msgstr ""
#: src/Model/Contact.php:2776 #: src/Model/Contact.php:2840
msgid "An author or name was not found." msgid "An author or name was not found."
msgstr "" msgstr ""
#: src/Model/Contact.php:2779 #: src/Model/Contact.php:2843
msgid "No browser URL could be matched to this address." msgid "No browser URL could be matched to this address."
msgstr "" msgstr ""
#: src/Model/Contact.php:2782 #: src/Model/Contact.php:2846
msgid "" msgid ""
"Unable to match @-style Identity Address with a known protocol or email " "Unable to match @-style Identity Address with a known protocol or email "
"contact." "contact."
msgstr "" msgstr ""
#: src/Model/Contact.php:2783 #: src/Model/Contact.php:2847
msgid "Use mailto: in front of address to force email check." msgid "Use mailto: in front of address to force email check."
msgstr "" msgstr ""
#: src/Model/Contact.php:2789 #: src/Model/Contact.php:2853
msgid "" msgid ""
"The profile address specified belongs to a network which has been disabled " "The profile address specified belongs to a network which has been disabled "
"on this site." "on this site."
msgstr "" msgstr ""
#: src/Model/Contact.php:2794 #: src/Model/Contact.php:2858
msgid "" msgid ""
"Limited profile. This person will be unable to receive direct/personal " "Limited profile. This person will be unable to receive direct/personal "
"notifications from you." "notifications from you."
msgstr "" msgstr ""
#: src/Model/Contact.php:2853 #: src/Model/Contact.php:2917
msgid "Unable to retrieve contact information." msgid "Unable to retrieve contact information."
msgstr "" msgstr ""
@ -3782,66 +3782,66 @@ msgstr ""
msgid "Edit groups" msgid "Edit groups"
msgstr "" msgstr ""
#: src/Model/Item.php:1944 #: src/Model/Item.php:1956
#, php-format #, php-format
msgid "Detected languages in this post:\\n%s" msgid "Detected languages in this post:\\n%s"
msgstr "" msgstr ""
#: src/Model/Item.php:2836 #: src/Model/Item.php:2848
msgid "activity" msgid "activity"
msgstr "" msgstr ""
#: src/Model/Item.php:2838 #: src/Model/Item.php:2850
msgid "comment" msgid "comment"
msgstr "" msgstr ""
#: src/Model/Item.php:2841 #: src/Model/Item.php:2853
msgid "post" msgid "post"
msgstr "" msgstr ""
#: src/Model/Item.php:2957 #: src/Model/Item.php:2969
#, php-format #, php-format
msgid "Content warning: %s" msgid "Content warning: %s"
msgstr "" msgstr ""
#: src/Model/Item.php:3320 #: src/Model/Item.php:3332
msgid "bytes" msgid "bytes"
msgstr "" msgstr ""
#: src/Model/Item.php:3351 #: src/Model/Item.php:3363
#, php-format #, php-format
msgid "%2$s (%3$d%%, %1$d vote)" msgid "%2$s (%3$d%%, %1$d vote)"
msgid_plural "%2$s (%3$d%%, %1$d votes)" msgid_plural "%2$s (%3$d%%, %1$d votes)"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/Model/Item.php:3353 #: src/Model/Item.php:3365
#, php-format #, php-format
msgid "%2$s (%1$d vote)" msgid "%2$s (%1$d vote)"
msgid_plural "%2$s (%1$d votes)" msgid_plural "%2$s (%1$d votes)"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/Model/Item.php:3358 #: src/Model/Item.php:3370
#, php-format #, php-format
msgid "%d voter. Poll end: %s" msgid "%d voter. Poll end: %s"
msgid_plural "%d voters. Poll end: %s" msgid_plural "%d voters. Poll end: %s"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/Model/Item.php:3360 #: src/Model/Item.php:3372
#, php-format #, php-format
msgid "%d voter." msgid "%d voter."
msgid_plural "%d voters." msgid_plural "%d voters."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/Model/Item.php:3362 #: src/Model/Item.php:3374
#, php-format #, php-format
msgid "Poll end: %s" msgid "Poll end: %s"
msgstr "" msgstr ""
#: src/Model/Item.php:3396 src/Model/Item.php:3397 #: src/Model/Item.php:3408 src/Model/Item.php:3409
msgid "View on separate page" msgid "View on separate page"
msgstr "" msgstr ""
@ -4357,8 +4357,8 @@ msgstr ""
msgid "List of active accounts" msgid "List of active accounts"
msgstr "" msgstr ""
#: src/Module/Admin/BaseUsers.php:67 src/Module/Contact.php:314 #: src/Module/Admin/BaseUsers.php:67 src/Module/Contact.php:315
#: src/Module/Contact.php:374 #: src/Module/Contact.php:375
msgid "Pending" msgid "Pending"
msgstr "" msgstr ""
@ -4366,8 +4366,8 @@ msgstr ""
msgid "List of pending registrations" msgid "List of pending registrations"
msgstr "" msgstr ""
#: src/Module/Admin/BaseUsers.php:75 src/Module/Contact.php:322 #: src/Module/Admin/BaseUsers.php:75 src/Module/Contact.php:323
#: src/Module/Contact.php:375 #: src/Module/Contact.php:376
msgid "Blocked" msgid "Blocked"
msgstr "" msgstr ""
@ -4460,7 +4460,7 @@ msgstr ""
#: src/Module/Admin/Blocklist/Contact.php:101 #: src/Module/Admin/Blocklist/Contact.php:101
#: src/Module/Admin/Users/Blocked.php:142 src/Module/Admin/Users/Index.php:156 #: src/Module/Admin/Users/Blocked.php:142 src/Module/Admin/Users/Index.php:156
#: src/Module/Contact.php:398 src/Module/Contact/Profile.php:348 #: src/Module/Contact.php:399 src/Module/Contact/Profile.php:348
#: src/Module/Contact/Profile.php:449 #: src/Module/Contact/Profile.php:449
msgid "Unblock" msgid "Unblock"
msgstr "" msgstr ""
@ -6733,7 +6733,7 @@ msgid_plural ""
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/Module/BaseProfile.php:51 src/Module/Contact.php:460 #: src/Module/BaseProfile.php:51 src/Module/Contact.php:461
msgid "Profile Details" msgid "Profile Details"
msgstr "" msgstr ""
@ -6807,110 +6807,110 @@ msgid_plural "%d contacts edited."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/Module/Contact.php:309 #: src/Module/Contact.php:310
msgid "Show all contacts" msgid "Show all contacts"
msgstr "" msgstr ""
#: src/Module/Contact.php:317 #: src/Module/Contact.php:318
msgid "Only show pending contacts" msgid "Only show pending contacts"
msgstr "" msgstr ""
#: src/Module/Contact.php:325 #: src/Module/Contact.php:326
msgid "Only show blocked contacts" msgid "Only show blocked contacts"
msgstr "" msgstr ""
#: src/Module/Contact.php:330 src/Module/Contact.php:377 #: src/Module/Contact.php:331 src/Module/Contact.php:378
#: src/Object/Post.php:339 #: src/Object/Post.php:339
msgid "Ignored" msgid "Ignored"
msgstr "" msgstr ""
#: src/Module/Contact.php:333 #: src/Module/Contact.php:334
msgid "Only show ignored contacts" msgid "Only show ignored contacts"
msgstr "" msgstr ""
#: src/Module/Contact.php:338 src/Module/Contact.php:378 #: src/Module/Contact.php:339 src/Module/Contact.php:379
msgid "Archived" msgid "Archived"
msgstr "" msgstr ""
#: src/Module/Contact.php:341 #: src/Module/Contact.php:342
msgid "Only show archived contacts" msgid "Only show archived contacts"
msgstr "" msgstr ""
#: src/Module/Contact.php:346 src/Module/Contact.php:376 #: src/Module/Contact.php:347 src/Module/Contact.php:377
msgid "Hidden" msgid "Hidden"
msgstr "" msgstr ""
#: src/Module/Contact.php:349 #: src/Module/Contact.php:350
msgid "Only show hidden contacts" msgid "Only show hidden contacts"
msgstr "" msgstr ""
#: src/Module/Contact.php:357 #: src/Module/Contact.php:358
msgid "Organize your contact groups" msgid "Organize your contact groups"
msgstr "" msgstr ""
#: src/Module/Contact.php:389 #: src/Module/Contact.php:390
msgid "Search your contacts" msgid "Search your contacts"
msgstr "" msgstr ""
#: src/Module/Contact.php:390 src/Module/Search/Index.php:207 #: src/Module/Contact.php:391 src/Module/Search/Index.php:207
#, php-format #, php-format
msgid "Results for: %s" msgid "Results for: %s"
msgstr "" msgstr ""
#: src/Module/Contact.php:397 #: src/Module/Contact.php:398
msgid "Update" msgid "Update"
msgstr "" msgstr ""
#: src/Module/Contact.php:399 src/Module/Contact/Profile.php:349 #: src/Module/Contact.php:400 src/Module/Contact/Profile.php:349
#: src/Module/Contact/Profile.php:457 #: src/Module/Contact/Profile.php:457
msgid "Unignore" msgid "Unignore"
msgstr "" msgstr ""
#: src/Module/Contact.php:401 #: src/Module/Contact.php:402
msgid "Batch Actions" msgid "Batch Actions"
msgstr "" msgstr ""
#: src/Module/Contact.php:436 #: src/Module/Contact.php:437
msgid "Conversations started by this contact" msgid "Conversations started by this contact"
msgstr "" msgstr ""
#: src/Module/Contact.php:441 #: src/Module/Contact.php:442
msgid "Posts and Comments" msgid "Posts and Comments"
msgstr "" msgstr ""
#: src/Module/Contact.php:452 #: src/Module/Contact.php:453
msgid "Posts containing media objects" msgid "Posts containing media objects"
msgstr "" msgstr ""
#: src/Module/Contact.php:467 #: src/Module/Contact.php:468
msgid "View all known contacts" msgid "View all known contacts"
msgstr "" msgstr ""
#: src/Module/Contact.php:477 #: src/Module/Contact.php:478
msgid "Advanced Contact Settings" msgid "Advanced Contact Settings"
msgstr "" msgstr ""
#: src/Module/Contact.php:511 #: src/Module/Contact.php:512
msgid "Mutual Friendship" msgid "Mutual Friendship"
msgstr "" msgstr ""
#: src/Module/Contact.php:515 #: src/Module/Contact.php:516
msgid "is a fan of yours" msgid "is a fan of yours"
msgstr "" msgstr ""
#: src/Module/Contact.php:519 #: src/Module/Contact.php:520
msgid "you are a fan of" msgid "you are a fan of"
msgstr "" msgstr ""
#: src/Module/Contact.php:537 #: src/Module/Contact.php:538
msgid "Pending outgoing contact request" msgid "Pending outgoing contact request"
msgstr "" msgstr ""
#: src/Module/Contact.php:539 #: src/Module/Contact.php:540
msgid "Pending incoming contact request" msgid "Pending incoming contact request"
msgstr "" msgstr ""
#: src/Module/Contact.php:552 src/Module/Contact/Profile.php:334 #: src/Module/Contact.php:553 src/Module/Contact/Profile.php:334
#, php-format #, php-format
msgid "Visit %s's profile [%s]" msgid "Visit %s's profile [%s]"
msgstr "" msgstr ""
@ -7256,50 +7256,50 @@ msgstr ""
msgid "Yes" msgid "Yes"
msgstr "" msgstr ""
#: src/Module/Conversation/Community.php:68 #: src/Module/Conversation/Community.php:61
msgid "Local Community"
msgstr ""
#: src/Module/Conversation/Community.php:71
msgid "Posts from local users on this server"
msgstr ""
#: src/Module/Conversation/Community.php:79
msgid "Global Community"
msgstr ""
#: src/Module/Conversation/Community.php:82
msgid "Posts from users of the whole federated network"
msgstr ""
#: src/Module/Conversation/Community.php:115
msgid "Own Contacts"
msgstr ""
#: src/Module/Conversation/Community.php:119
msgid "Include"
msgstr ""
#: src/Module/Conversation/Community.php:120
msgid "Hide"
msgstr ""
#: src/Module/Conversation/Community.php:137 src/Module/Search/Index.php:152
#: src/Module/Search/Index.php:194
msgid "No results."
msgstr ""
#: src/Module/Conversation/Community.php:162
msgid "" msgid ""
"This community stream shows all public posts received by this node. They may " "This community stream shows all public posts received by this node. They may "
"not reflect the opinions of this nodes users." "not reflect the opinions of this nodes users."
msgstr "" msgstr ""
#: src/Module/Conversation/Community.php:199 #: src/Module/Conversation/Community.php:76
msgid "Local Community"
msgstr ""
#: src/Module/Conversation/Community.php:79
msgid "Posts from local users on this server"
msgstr ""
#: src/Module/Conversation/Community.php:87
msgid "Global Community"
msgstr ""
#: src/Module/Conversation/Community.php:90
msgid "Posts from users of the whole federated network"
msgstr ""
#: src/Module/Conversation/Community.php:123
msgid "Own Contacts"
msgstr ""
#: src/Module/Conversation/Community.php:127
msgid "Include"
msgstr ""
#: src/Module/Conversation/Community.php:128
msgid "Hide"
msgstr ""
#: src/Module/Conversation/Community.php:145 src/Module/Search/Index.php:152
#: src/Module/Search/Index.php:194
msgid "No results."
msgstr ""
#: src/Module/Conversation/Community.php:201
msgid "Community option not available." msgid "Community option not available."
msgstr "" msgstr ""
#: src/Module/Conversation/Community.php:215 #: src/Module/Conversation/Community.php:217
msgid "Not available." msgid "Not available."
msgstr "" msgstr ""
@ -11079,11 +11079,11 @@ msgstr ""
msgid "(no subject)" msgid "(no subject)"
msgstr "" msgstr ""
#: src/Worker/PushSubscription.php:111 #: src/Worker/PushSubscription.php:110
msgid "Notification from Friendica" msgid "Notification from Friendica"
msgstr "" msgstr ""
#: src/Worker/PushSubscription.php:112 #: src/Worker/PushSubscription.php:111
msgid "Empty Post" msgid "Empty Post"
msgstr "" msgstr ""