Merge remote-tracking branch 'upstream/2023.03-rc' into npf2

This commit is contained in:
Michael 2023-04-03 21:46:01 +00:00
commit ed875a80f7
13 changed files with 318 additions and 287 deletions

View File

@ -71,20 +71,19 @@ pipeline:
else
phpunit --configuration tests/phpunit.xml;
fi
codecov:
image: plugins/codecov
image: friendicaci/codecov
when:
matrix:
PHP_MAJOR_VERSION: 7.4
PHP_VERSION: 7.4.33
repo:
- friendica/friendica
settings:
token:
from_secret: codecov-token
files:
- clover.xml
commands:
- codecov -R '.' -Z -f 'clover.xml'
secrets:
- source: codecov-token
target: codecov_token
services:
mariadb:

View File

@ -24,6 +24,7 @@
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-openssl": "*",
"ext-posix": "*",
"ext-simplexml": "*",
"ext-xml": "*",
"asika/simple-console": "^1.0",
@ -34,6 +35,7 @@
"friendica/json-ld": "^1.0",
"geekwright/po": "^2.0",
"guzzlehttp/guzzle": "^6.5",
"kornrunner/blurhash": "^1.2",
"league/html-to-markdown": "^4.8",
"level-2/dice": "^4",
"lightopenid/lightopenid": "dev-master",
@ -49,6 +51,7 @@
"phpseclib/phpseclib": "^3.0",
"pragmarx/google2fa": "^5.0",
"pragmarx/recovery": "^0.2",
"psr/clock": "^1.0",
"psr/container": "^1.0",
"psr/log": "^1.1",
"seld/cli-prompt": "^1.0",
@ -71,9 +74,7 @@
"npm-asset/moment": "^2.24",
"npm-asset/perfect-scrollbar": "0.6.16",
"npm-asset/textcomplete": "^0.18.2",
"npm-asset/typeahead.js": "^0.11.1",
"kornrunner/blurhash": "^1.2",
"psr/clock": "^1.0"
"npm-asset/typeahead.js": "^0.11.1"
},
"repositories": [
{

3
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "c9e005c79c8556215c30a66c470659eb",
"content-hash": "456d14e3ad9be265c5c9e6172a0d18d8",
"packages": [
{
"name": "asika/simple-console",
@ -6474,6 +6474,7 @@
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-openssl": "*",
"ext-posix": "*",
"ext-simplexml": "*",
"ext-xml": "*"
},

View File

@ -41,6 +41,7 @@ use Friendica\Model\Post;
use Friendica\Model\Tag;
use Friendica\Model\User;
use Friendica\Model\Verb;
use Friendica\Network\HTTPException\InternalServerErrorException;
use Friendica\Object\Post as PostObject;
use Friendica\Object\Thread;
use Friendica\Protocol\Activity;
@ -193,6 +194,52 @@ class Conversation
}
}
/**
* Returns the liker phrase based on a list of likers
*
* @param string $verb the activity verb
* @param array $likers a list of likers
*
* @return string the liker phrase
*
* @throws InternalServerErrorException in case either the verb is invalid or the list of likers is empty
*/
private function getLikerPhrase(string $verb, array $likers): string
{
$total = count($likers);
if ($total === 0) {
throw new InternalServerErrorException(sprintf('There has to be at least one Liker for verb "%s"', $verb));
} else if ($total === 1) {
$likerString = $likers[0];
} else {
if ($total < $this->config->get('system', 'max_likers')) {
$likerString = implode(', ', array_slice($likers, 0, -1));
$likerString .= ' ' . $this->l10n->t('and') . ' ' . $likers[count($likers) - 1];
} else {
$likerString = implode(', ', array_slice($likers, 0, $this->config->get('system', 'max_likers') - 1));
$likerString .= ' ' . $this->l10n->t('and %d other people', $total - $this->config->get('system', 'max_likers'));
}
}
switch ($verb) {
case 'like':
return $this->l10n->tt('%2$s likes this.', '%2$s like this.', $total, $likerString);
case 'dislike':
return $this->l10n->tt('%2$s doesn\'t like this.', '%2$s don\'t like this.', $total, $likerString);
case 'attendyes':
return $this->l10n->tt('%2$s attends.', '%2$s attend.', $total, $likerString);
case 'attendno':
return $this->l10n->tt('%2$s doesn\'t attend.', '%2$s don\'t attend.', $total, $likerString);
case 'attendmaybe':
return $this->l10n->tt('%2$s attends maybe.', '%2$s attend maybe.', $total, $likerString);
case 'announce':
return $this->l10n->tt('%2$s reshared this.', '%2$s reshared this.', $total, $likerString);
default:
throw new InternalServerErrorException(sprintf('Unknown verb "%s"', $verb));
}
}
/**
* Format the activity text for an item/photo/video
*
@ -205,87 +252,48 @@ class Conversation
public function formatActivity(array $links, string $verb, int $id): string
{
$this->profiler->startRecording('rendering');
$o = '';
$expanded = '';
$phrase = '';
$total = count($links);
if ($total == 1) {
$likers = $links[0];
$phrase = $this->getLikerPhrase($verb, $links);
$total = count($links);
if ($total > 1) {
$spanatts = "class=\"btn btn-link fakelink\" onclick=\"openClose('{$verb}list-$id');\"";
$explikers = $phrase;
// Phrase if there is only one liker. In other cases it will be uses for the expanded
// list which show all likers
switch ($verb) {
case 'like':
$phrase = $this->l10n->t('%s likes this.', $likers);
$phrase = $this->l10n->tt('<button type="button" %2$s>%1$d person</button> likes this', '<button type="button" %2$s>%1$d people</button> like this', $total, $spanatts);
break;
case 'dislike':
$phrase = $this->l10n->t('%s doesn\'t like this.', $likers);
$phrase = $this->l10n->tt('<button type="button" %2$s>%1$d person</button> doesn\'t like this', '<button type="button" %2$s>%1$d peiple</button> don\'t like this', $total, $spanatts);
break;
case 'attendyes':
$phrase = $this->l10n->t('%s attends.', $likers);
$phrase = $this->l10n->tt('<button type="button" %2$s>%1$d person</button> attends', '<button type="button" %2$s>%1$d people</button> attend', $total, $spanatts);
break;
case 'attendno':
$phrase = $this->l10n->t('%s doesn\'t attend.', $likers);
$phrase = $this->l10n->tt('<button type="button" %2$s>%1$d person</button> doesn\'t attend','<button type="button" %2$s>%1$d people</button> don\'t attend', $total, $spanatts);
break;
case 'attendmaybe':
$phrase = $this->l10n->t('%s attends maybe.', $likers);
$phrase = $this->l10n->tt('<button type="button" %2$s>%1$d person</button> attends maybe', '<button type="button" %2$s>%1$d people</button> attend maybe', $total, $spanatts);
break;
case 'announce':
$phrase = $this->l10n->t('%s reshared this.', $likers);
break;
}
} elseif ($total > 1) {
if ($total < $this->config->get('system', 'max_likers')) {
$likers = implode(', ', array_slice($links, 0, -1));
$likers .= ' ' . $this->l10n->t('and') . ' ' . $links[count($links) - 1];
} else {
$likers = implode(', ', array_slice($links, 0, $this->config->get('system', 'max_likers') - 1));
$likers .= ' ' . $this->l10n->t('and %d other people', $total - $this->config->get('system', 'max_likers'));
}
$spanatts = "class=\"btn btn-link fakelink\" onclick=\"openClose('{$verb}list-$id');\"";
$explikers = '';
switch ($verb) {
case 'like':
$phrase = $this->l10n->t('<button type="button" %1$s>%2$d people</button> like this', $spanatts, $total);
$explikers = $this->l10n->t('%s like this.', $likers);
break;
case 'dislike':
$phrase = $this->l10n->t('<button type="button" %1$s>%2$d people</button> don\'t like this', $spanatts, $total);
$explikers = $this->l10n->t('%s don\'t like this.', $likers);
break;
case 'attendyes':
$phrase = $this->l10n->t('<button type="button" %1$s>%2$d people</button> attend', $spanatts, $total);
$explikers = $this->l10n->t('%s attend.', $likers);
break;
case 'attendno':
$phrase = $this->l10n->t('<button type="button" %1$s>%2$d people</button> don\'t attend', $spanatts, $total);
$explikers = $this->l10n->t('%s don\'t attend.', $likers);
break;
case 'attendmaybe':
$phrase = $this->l10n->t('<button type="button" %1$s>%2$d people</button> attend maybe', $spanatts, $total);
$explikers = $this->l10n->t('%s attend maybe.', $likers);
break;
case 'announce':
$phrase = $this->l10n->t('<button type="button" %1$s>%2$d people</button> reshared this', $spanatts, $total);
$explikers = $this->l10n->t('%s reshared this.', $likers);
$phrase = $this->l10n->tt('<button type="button" %2$s>%1$d person</button> reshared this', '<button type="button" %2$s>%1$d people</button> reshared this', $total, $spanatts);
break;
}
$expanded .= "\t" . '<p class="wall-item-' . $verb . '-expanded" id="' . $verb . 'list-' . $id . '" style="display: none;" >' . $explikers . '</p>';
}
$o .= Renderer::replaceMacros(Renderer::getMarkupTemplate('voting_fakelink.tpl'), [
$output = Renderer::replaceMacros(Renderer::getMarkupTemplate('voting_fakelink.tpl'), [
'$phrase' => $phrase,
'$type' => $verb,
'$id' => $id
]);
$o .= $expanded;
$output .= $expanded;
$this->profiler->stopRecording();
return $o;
return $output;
}
public function statusEditor(array $x = [], int $notes_cid = 0, bool $popup = false): string

View File

@ -523,19 +523,18 @@ class System
* Checks if a given directory is usable for the system
*
* @param $directory
* @param bool $check_writable
*
* @return boolean the directory is usable
*/
private static function isDirectoryUsable($directory, $check_writable = true)
private static function isDirectoryUsable(string $directory): bool
{
if ($directory == '') {
if (empty($directory)) {
Logger::warning('Directory is empty. This shouldn\'t happen.');
return false;
}
if (!file_exists($directory)) {
Logger::warning('Path does not exist', ['directory' => $directory, 'user' => static::getUser()]);
Logger::info('Path does not exist', ['directory' => $directory, 'user' => static::getUser()]);
return false;
}
@ -549,7 +548,7 @@ class System
return false;
}
if ($check_writable && !is_writable($directory)) {
if (!is_writable($directory)) {
Logger::warning('Path is not writable', ['directory' => $directory, 'user' => static::getUser()]);
return false;
}
@ -601,7 +600,7 @@ class System
$new_temppath = $temppath . "/" . DI::baseUrl()->getHost();
if (!is_dir($new_temppath)) {
/// @TODO There is a mkdir()+chmod() upwards, maybe generalize this (+ configurable) into a function/method?
mkdir($new_temppath);
@mkdir($new_temppath);
}
if (self::isDirectoryUsable($new_temppath)) {

View File

@ -112,7 +112,7 @@ class Process extends BaseRepository
try {
$processes = $this->db->select(static::$table_name, ['pid'], ['hostname' => $this->currentHost]);
while ($process = $this->db->fetch($processes)) {
if (!posix_kill($process['pid'], 0)) {
if (!\posix_kill($process['pid'], 0)) {
$this->db->delete(static::$table_name, ['pid' => $process['pid']]);
}
}

View File

@ -39,6 +39,7 @@ use Friendica\Object\Api\Mastodon\Status\FriendicaExtension;
use Friendica\Object\Api\Mastodon\Status\FriendicaVisibility;
use Friendica\Protocol\Activity;
use Friendica\Protocol\ActivityPub;
use Friendica\Util\ACLFormatter;
use ImagickException;
use Psr\Log\LoggerInterface;
@ -62,6 +63,8 @@ class Status extends BaseFactory
private $mstdnPollFactory;
/** @var ContentItem */
private $contentItem;
/** @var ACLFormatter */
private $aclFormatter;
public function __construct(
LoggerInterface $logger,
@ -73,7 +76,8 @@ class Status extends BaseFactory
Attachment $mstdnAttachmentFactory,
Error $mstdnErrorFactory,
Poll $mstdnPollFactory,
ContentItem $contentItem
ContentItem $contentItem,
ACLFormatter $aclFormatter
) {
parent::__construct($logger);
$this->dba = $dba;
@ -85,6 +89,7 @@ class Status extends BaseFactory
$this->mstdnErrorFactory = $mstdnErrorFactory;
$this->mstdnPollFactory = $mstdnPollFactory;
$this->contentItem = $contentItem;
$this->aclFormatter = $aclFormatter;
}
/**
@ -169,7 +174,7 @@ class Status extends BaseFactory
$count_dislike
);
$origin_like = ($count_like == 0) ? false : Post::exists([
$origin_like = $count_like > 0 && Post::exists([
'thr-parent-id' => $uriId,
'uid' => $uid,
'origin' => true,
@ -177,7 +182,7 @@ class Status extends BaseFactory
'vid' => Verb::getID(Activity::LIKE),
'deleted' => false
]);
$origin_dislike = ($count_dislike == 0) ? false : Post::exists([
$origin_dislike = $count_dislike > 0 && Post::exists([
'thr-parent-id' => $uriId,
'uid' => $uid,
'origin' => true,
@ -185,7 +190,7 @@ class Status extends BaseFactory
'vid' => Verb::getID(Activity::DISLIKE),
'deleted' => false
]);
$origin_announce = ($count_announce == 0) ? false : Post::exists([
$origin_announce = $count_announce > 0 && (Post::exists([
'thr-parent-id' => $uriId,
'uid' => $uid,
'origin' => true,
@ -194,16 +199,16 @@ class Status extends BaseFactory
'deleted' => false
]) || Post::exists([
'quote-uri-id' => $uriId,
'uid' => $uid,
'origin' => true,
'body' => '',
'deleted' => false
]);
'uid' => $uid,
'origin' => true,
'body' => '',
'deleted' => false
]));
$userAttributes = new \Friendica\Object\Api\Mastodon\Status\UserAttributes(
$origin_like,
$origin_announce,
Post\ThreadUser::getIgnored($uriId, $uid),
(bool)($item['starred'] && ($item['gravity'] == Item::GRAVITY_PARENT)),
$item['starred'] && $item['gravity'] == Item::GRAVITY_PARENT,
$item['featured']
);
@ -300,10 +305,9 @@ class Status extends BaseFactory
$in_reply = [];
}
$aclFormatter = DI::aclFormatter();
$delivery_data = $uid != $item['uid'] ? null : new FriendicaDeliveryData($item['delivery_queue_count'], $item['delivery_queue_done'], $item['delivery_queue_failed']);
$visibility_data = $uid != $item['uid'] ? null : new FriendicaVisibility($aclFormatter->expand($item['allow_cid']), $aclFormatter->expand($item['deny_cid']), $aclFormatter->expand($item['allow_gid']), $aclFormatter->expand($item['deny_gid']));
$friendica = new FriendicaExtension($item['title'], $item['changed'], $item['commented'], $item['received'], $counts->dislikes, $origin_dislike, $delivery_data, $visibility_data);
$visibility_data = $uid != $item['uid'] ? null : new FriendicaVisibility($this->aclFormatter->expand($item['allow_cid']), $this->aclFormatter->expand($item['deny_cid']), $this->aclFormatter->expand($item['allow_gid']), $this->aclFormatter->expand($item['deny_gid']));
$friendica = new FriendicaExtension($item['title'] ?? '', $item['changed'], $item['commented'], $item['received'], $counts->dislikes, $origin_dislike, $delivery_data, $visibility_data);
return new \Friendica\Object\Api\Mastodon\Status($item, $account, $counts, $userAttributes, $sensitive, $application, $mentions, $tags, $card, $attachments, $in_reply, $reshare, $friendica, $quote, $poll);
}

View File

@ -31,6 +31,7 @@ use Friendica\Core\System;
use Friendica\Core\Worker;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Network\HTTPException\InternalServerErrorException;
use Friendica\Protocol\Activity;
use Friendica\Protocol\ActivityPub;
use Friendica\Protocol\Delivery;
@ -1394,10 +1395,16 @@ class Item
*
* @param integer $uri_id
* @return void
* @throws InternalServerErrorException
* @throws \ImagickException
*/
public static function updateDisplayCache(int $uri_id)
{
$item = Post::selectFirst(self::DISPLAY_FIELDLIST, ['uri-id' => $uri_id]);
if (!$item) {
return;
}
self::prepareBody($item, false, false, true);
}
@ -3042,7 +3049,11 @@ class Item
}
if (!empty($quote_uri_id)) {
$item['body'] .= "\n" . DI::contentItem()->createSharedBlockByArray($shared_item);
if (isset($shared_item['plink'])) {
$item['body'] .= "\n" . DI::contentItem()->createSharedBlockByArray($shared_item);
} else {
DI::logger()->warning('Missing plink in shared item', ['item' => $item, 'shared' => $shared, 'quote_uri_id' => $quote_uri_id, 'shared_item' => $shared_item]);
}
}
if (!empty($shared_item['uri-id'])) {

View File

@ -35,7 +35,7 @@ use Friendica\Core\System;
use Friendica\Core\Worker;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Module\Register;
use Friendica\Module;
use Friendica\Network\HTTPClient\Client\HttpClientAccept;
use Friendica\Security\TwoFactor\Model\AppSpecificPassword;
use Friendica\Network\HTTPException;
@ -1890,17 +1890,17 @@ class User
}
$register_policy = DI::config()->get('config', 'register_policy');
if (!in_array($register_policy, [Register::OPEN, Register::CLOSED])) {
if (!in_array($register_policy, [Module\Register::OPEN, Module\Register::CLOSED])) {
Logger::debug('Unsupported register policy.', ['policy' => $register_policy]);
return;
}
$users = DBA::count('user', ['blocked' => false, 'account_removed' => false, 'account_expired' => false]);
if (($users >= $max_registered_users) && ($register_policy == Register::OPEN)) {
DI::config()->set('config', 'register_policy', Register::CLOSED);
if (($users >= $max_registered_users) && ($register_policy == Module\Register::OPEN)) {
DI::config()->set('config', 'register_policy', Module\Register::CLOSED);
Logger::notice('Max users reached, registration is closed.', ['users' => $users, 'max' => $max_registered_users]);
} elseif (($users < $max_registered_users) && ($register_policy == Register::CLOSED)) {
DI::config()->set('config', 'register_policy', Register::OPEN);
} elseif (($users < $max_registered_users) && ($register_policy == Module\Register::CLOSED)) {
DI::config()->set('config', 'register_policy', Module\Register::OPEN);
Logger::notice('Below maximum users, registration is opened.', ['users' => $users, 'max' => $max_registered_users]);
} else {
Logger::debug('Unchanged register policy', ['policy' => $register_policy, 'users' => $users, 'max' => $max_registered_users]);

View File

@ -62,15 +62,15 @@ class FriendicaExtension extends BaseDataTransferObject
/**
* Creates a FriendicaExtension object
*
* @param string $title
* @param string|null $changed_at
* @param string|null $commented_at
* @param string|null $edited_at
* @param string|null $received_at
* @param int $dislikes_count
* @param bool $disliked
* @param FriendicaDeliveryData|null $delivery_data
* @param FriendicaVisibility|null $visibility
* @param string $title
* @param ?string $changed_at
* @param ?string $commented_at
* @param ?string $received_at
* @param int $dislikes_count
* @param bool $disliked
* @param ?FriendicaDeliveryData $delivery_data
* @param ?FriendicaVisibility $visibility
* @throws \Exception
*/
public function __construct(
string $title,

View File

@ -182,8 +182,8 @@ class DateTimeFormat
*/
public static function fix(string $dateString): string
{
$search = ['Mär', 'März', 'Mai', 'Juni', 'Juli', 'Okt', 'Dez', 'ET' , 'ZZ', ' - ', '&#x2B;', '&amp;#43;', ' (Coordinated Universal Time)'];
$replace = ['Mar', 'Mar' , 'May', 'Jun' , 'Jul' , 'Oct', 'Dec', 'EST', 'Z' , ', ' , '+' , '+' , ''];
$search = ['Mär', 'März', 'Mai', 'Juni', 'Juli', 'Okt', 'Dez', 'ET' , 'ZZ', ' - ', '&#x2B;', '&amp;#43;', ' (Coordinated Universal Time)', '\\'];
$replace = ['Mar', 'Mar' , 'May', 'Jun' , 'Jul' , 'Oct', 'Dec', 'EST', 'Z' , ', ' , '+' , '+' , '' , ''];
$dateString = str_replace($search, $replace, $dateString);

View File

@ -134,7 +134,11 @@ class DateTimeFormatTest extends MockedTest
'Double HTML encode' => [
'expectedDate' => '2015-05-22T08:48:00+12:00',
'dateString' => '2015-05-22T08:48:00&amp;#43;12:00'
]
],
'2023-04-02\T17:22:42+05:30' => [
'expectedDate' => '2023-04-02T17:22:42+05:30',
'dateString' => '2023-04-02\T17:22:42+05:30'
],
];
}

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2023.03-rc\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-28 17:42+0000\n"
"POT-Creation-Date: 2023-04-02 09:34+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -50,8 +50,8 @@ msgstr ""
#: src/Module/BaseNotifications.php:98 src/Module/BaseSettings.php:52
#: src/Module/Calendar/Event/API.php:88 src/Module/Calendar/Event/Form.php:84
#: src/Module/Calendar/Export.php:82 src/Module/Calendar/Show.php:82
#: src/Module/Contact/Advanced.php:60 src/Module/Contact/Follow.php:86
#: src/Module/Contact/Follow.php:159 src/Module/Contact/MatchInterests.php:86
#: src/Module/Contact/Advanced.php:60 src/Module/Contact/Follow.php:87
#: src/Module/Contact/Follow.php:160 src/Module/Contact/MatchInterests.php:86
#: src/Module/Contact/Suggestions.php:54 src/Module/Contact/Unfollow.php:66
#: src/Module/Contact/Unfollow.php:80 src/Module/Contact/Unfollow.php:112
#: src/Module/Delegation.php:118 src/Module/FollowConfirm.php:38
@ -281,7 +281,7 @@ msgstr ""
msgid "Your message:"
msgstr ""
#: mod/message.php:200 mod/message.php:355 src/Content/Conversation.php:352
#: mod/message.php:200 mod/message.php:355 src/Content/Conversation.php:360
#: src/Module/Post/Edit.php:131
msgid "Upload photo"
msgstr ""
@ -292,7 +292,7 @@ msgid "Insert web link"
msgstr ""
#: mod/message.php:202 mod/message.php:358 mod/photos.php:1291
#: src/Content/Conversation.php:381 src/Content/Conversation.php:725
#: src/Content/Conversation.php:389 src/Content/Conversation.php:733
#: src/Module/Item/Compose.php:204 src/Module/Post/Edit.php:145
#: src/Module/Profile/UnkMail.php:154 src/Object/Post.php:545
msgid "Please wait"
@ -475,7 +475,7 @@ msgstr ""
msgid "Do not show a status post for this upload"
msgstr ""
#: mod/photos.php:733 mod/photos.php:1093 src/Content/Conversation.php:383
#: mod/photos.php:733 mod/photos.php:1093 src/Content/Conversation.php:391
#: src/Module/Calendar/Event/Form.php:253 src/Module/Post/Edit.php:182
msgid "Permissions"
msgstr ""
@ -488,8 +488,8 @@ msgstr ""
msgid "Delete Album"
msgstr ""
#: mod/photos.php:798 mod/photos.php:899 src/Content/Conversation.php:399
#: src/Module/Contact/Follow.php:172 src/Module/Contact/Revoke.php:109
#: mod/photos.php:798 mod/photos.php:899 src/Content/Conversation.php:407
#: src/Module/Contact/Follow.php:173 src/Module/Contact/Revoke.php:109
#: src/Module/Contact/Unfollow.php:126
#: src/Module/Media/Attachment/Browser.php:77
#: src/Module/Media/Photo/Browser.php:88 src/Module/Post/Edit.php:167
@ -606,22 +606,22 @@ msgid "Comment"
msgstr ""
#: mod/photos.php:1139 mod/photos.php:1195 mod/photos.php:1269
#: src/Content/Conversation.php:396 src/Module/Calendar/Event/Form.php:248
#: src/Content/Conversation.php:404 src/Module/Calendar/Event/Form.php:248
#: src/Module/Item/Compose.php:199 src/Module/Post/Edit.php:165
#: src/Object/Post.php:1069
msgid "Preview"
msgstr ""
#: mod/photos.php:1140 src/Content/Conversation.php:351
#: mod/photos.php:1140 src/Content/Conversation.php:359
#: src/Module/Post/Edit.php:130 src/Object/Post.php:1059
msgid "Loading..."
msgstr ""
#: mod/photos.php:1226 src/Content/Conversation.php:641 src/Object/Post.php:256
#: mod/photos.php:1226 src/Content/Conversation.php:649 src/Object/Post.php:256
msgid "Select"
msgstr ""
#: mod/photos.php:1227 src/Content/Conversation.php:642
#: mod/photos.php:1227 src/Content/Conversation.php:650
#: src/Module/Moderation/Users/Active.php:136
#: src/Module/Moderation/Users/Blocked.php:136
#: src/Module/Moderation/Users/Index.php:151
@ -1064,355 +1064,359 @@ msgstr ""
msgid "%s (via %s)"
msgstr ""
#: src/Content/Conversation.php:220
#, php-format
msgid "%s likes this."
msgstr ""
#: src/Content/Conversation.php:223
#, php-format
msgid "%s doesn't like this."
msgstr ""
#: src/Content/Conversation.php:226
#, php-format
msgid "%s attends."
msgstr ""
#: src/Content/Conversation.php:229
#, php-format
msgid "%s doesn't attend."
msgstr ""
#: src/Content/Conversation.php:232
#, php-format
msgid "%s attends maybe."
msgstr ""
#: src/Content/Conversation.php:235 src/Content/Conversation.php:273
#: src/Content/Conversation.php:885
#, php-format
msgid "%s reshared this."
msgstr ""
#: src/Content/Conversation.php:241
#: src/Content/Conversation.php:218
msgid "and"
msgstr ""
#: src/Content/Conversation.php:244
#: src/Content/Conversation.php:221
#, php-format
msgid "and %d other people"
msgstr ""
#: src/Content/Conversation.php:252
#: src/Content/Conversation.php:227
#, php-format
msgid "<button type=\"button\" %1$s>%2$d people</button> like this"
msgstr ""
msgid "%2$s likes this."
msgid_plural "%2$s like this."
msgstr[0] ""
msgstr[1] ""
#: src/Content/Conversation.php:253
#: src/Content/Conversation.php:229
#, php-format
msgid "%s like this."
msgstr ""
msgid "%2$s doesn't like this."
msgid_plural "%2$s don't like this."
msgstr[0] ""
msgstr[1] ""
#: src/Content/Conversation.php:256
#: src/Content/Conversation.php:231
#, php-format
msgid "<button type=\"button\" %1$s>%2$d people</button> don't like this"
msgstr ""
msgid "%2$s attends."
msgid_plural "%2$s attend."
msgstr[0] ""
msgstr[1] ""
#: src/Content/Conversation.php:257
#: src/Content/Conversation.php:233
#, php-format
msgid "%s don't like this."
msgstr ""
msgid "%2$s doesn't attend."
msgid_plural "%2$s don't attend."
msgstr[0] ""
msgstr[1] ""
#: src/Content/Conversation.php:260
#: src/Content/Conversation.php:235
#, php-format
msgid "<button type=\"button\" %1$s>%2$d people</button> attend"
msgstr ""
msgid "%2$s attends maybe."
msgid_plural "%2$s attend maybe."
msgstr[0] ""
msgstr[1] ""
#: src/Content/Conversation.php:261
#: src/Content/Conversation.php:237
#, php-format
msgid "%s attend."
msgstr ""
msgid "%2$s reshared this."
msgid_plural "%2$s reshared this."
msgstr[0] ""
msgstr[1] ""
#: src/Content/Conversation.php:264
#: src/Content/Conversation.php:266
#, php-format
msgid "<button type=\"button\" %1$s>%2$d people</button> don't attend"
msgstr ""
#: src/Content/Conversation.php:265
#, php-format
msgid "%s don't attend."
msgstr ""
#: src/Content/Conversation.php:268
#, php-format
msgid "<button type=\"button\" %1$s>%2$d people</button> attend maybe"
msgstr ""
msgid "<button type=\"button\" %2$s>%1$d person</button> likes this"
msgid_plural "<button type=\"button\" %2$s>%1$d people</button> like this"
msgstr[0] ""
msgstr[1] ""
#: src/Content/Conversation.php:269
#, php-format
msgid "%s attend maybe."
msgstr ""
msgid "<button type=\"button\" %2$s>%1$d person</button> doesn't like this"
msgid_plural ""
"<button type=\"button\" %2$s>%1$d peiple</button> don't like this"
msgstr[0] ""
msgstr[1] ""
#: src/Content/Conversation.php:272
#, php-format
msgid "<button type=\"button\" %1$s>%2$d people</button> reshared this"
msgstr ""
msgid "<button type=\"button\" %2$s>%1$d person</button> attends"
msgid_plural "<button type=\"button\" %2$s>%1$d people</button> attend"
msgstr[0] ""
msgstr[1] ""
#: src/Content/Conversation.php:320
#: src/Content/Conversation.php:275
#, php-format
msgid "<button type=\"button\" %2$s>%1$d person</button> doesn't attend"
msgid_plural "<button type=\"button\" %2$s>%1$d people</button> don't attend"
msgstr[0] ""
msgstr[1] ""
#: src/Content/Conversation.php:278
#, php-format
msgid "<button type=\"button\" %2$s>%1$d person</button> attends maybe"
msgid_plural "<button type=\"button\" %2$s>%1$d people</button> attend maybe"
msgstr[0] ""
msgstr[1] ""
#: src/Content/Conversation.php:281
#, php-format
msgid "<button type=\"button\" %2$s>%1$d person</button> reshared this"
msgid_plural "<button type=\"button\" %2$s>%1$d people</button> reshared this"
msgstr[0] ""
msgstr[1] ""
#: src/Content/Conversation.php:328
msgid "Visible to <strong>everybody</strong>"
msgstr ""
#: src/Content/Conversation.php:321 src/Module/Item/Compose.php:198
#: src/Content/Conversation.php:329 src/Module/Item/Compose.php:198
#: src/Object/Post.php:1068
msgid "Please enter a image/video/audio/webpage URL:"
msgstr ""
#: src/Content/Conversation.php:322
#: src/Content/Conversation.php:330
msgid "Tag term:"
msgstr ""
#: src/Content/Conversation.php:323 src/Module/Filer/SaveTag.php:73
#: src/Content/Conversation.php:331 src/Module/Filer/SaveTag.php:73
msgid "Save to Folder:"
msgstr ""
#: src/Content/Conversation.php:324
#: src/Content/Conversation.php:332
msgid "Where are you right now?"
msgstr ""
#: src/Content/Conversation.php:325
#: src/Content/Conversation.php:333
msgid "Delete item(s)?"
msgstr ""
#: src/Content/Conversation.php:337 src/Module/Item/Compose.php:175
#: src/Content/Conversation.php:345 src/Module/Item/Compose.php:175
msgid "Created at"
msgstr ""
#: src/Content/Conversation.php:347
#: src/Content/Conversation.php:355
msgid "New Post"
msgstr ""
#: src/Content/Conversation.php:350
#: src/Content/Conversation.php:358
msgid "Share"
msgstr ""
#: src/Content/Conversation.php:353 src/Module/Post/Edit.php:132
#: src/Content/Conversation.php:361 src/Module/Post/Edit.php:132
msgid "upload photo"
msgstr ""
#: src/Content/Conversation.php:354 src/Module/Post/Edit.php:133
#: src/Content/Conversation.php:362 src/Module/Post/Edit.php:133
msgid "Attach file"
msgstr ""
#: src/Content/Conversation.php:355 src/Module/Post/Edit.php:134
#: src/Content/Conversation.php:363 src/Module/Post/Edit.php:134
msgid "attach file"
msgstr ""
#: src/Content/Conversation.php:356 src/Module/Item/Compose.php:190
#: src/Content/Conversation.php:364 src/Module/Item/Compose.php:190
#: src/Module/Post/Edit.php:171 src/Object/Post.php:1060
msgid "Bold"
msgstr ""
#: src/Content/Conversation.php:357 src/Module/Item/Compose.php:191
#: src/Content/Conversation.php:365 src/Module/Item/Compose.php:191
#: src/Module/Post/Edit.php:172 src/Object/Post.php:1061
msgid "Italic"
msgstr ""
#: src/Content/Conversation.php:358 src/Module/Item/Compose.php:192
#: src/Content/Conversation.php:366 src/Module/Item/Compose.php:192
#: src/Module/Post/Edit.php:173 src/Object/Post.php:1062
msgid "Underline"
msgstr ""
#: src/Content/Conversation.php:359 src/Module/Item/Compose.php:193
#: src/Content/Conversation.php:367 src/Module/Item/Compose.php:193
#: src/Module/Post/Edit.php:174 src/Object/Post.php:1063
msgid "Quote"
msgstr ""
#: src/Content/Conversation.php:360 src/Module/Item/Compose.php:194
#: src/Content/Conversation.php:368 src/Module/Item/Compose.php:194
#: src/Module/Post/Edit.php:175 src/Object/Post.php:1064
msgid "Code"
msgstr ""
#: src/Content/Conversation.php:361 src/Module/Item/Compose.php:195
#: src/Content/Conversation.php:369 src/Module/Item/Compose.php:195
#: src/Object/Post.php:1065
msgid "Image"
msgstr ""
#: src/Content/Conversation.php:362 src/Module/Item/Compose.php:196
#: src/Content/Conversation.php:370 src/Module/Item/Compose.php:196
#: src/Module/Post/Edit.php:176 src/Object/Post.php:1066
msgid "Link"
msgstr ""
#: src/Content/Conversation.php:363 src/Module/Item/Compose.php:197
#: src/Content/Conversation.php:371 src/Module/Item/Compose.php:197
#: src/Module/Post/Edit.php:177 src/Object/Post.php:1067
msgid "Link or Media"
msgstr ""
#: src/Content/Conversation.php:364
#: src/Content/Conversation.php:372
msgid "Video"
msgstr ""
#: src/Content/Conversation.php:365 src/Module/Item/Compose.php:200
#: src/Content/Conversation.php:373 src/Module/Item/Compose.php:200
#: src/Module/Post/Edit.php:141
msgid "Set your location"
msgstr ""
#: src/Content/Conversation.php:366 src/Module/Post/Edit.php:142
#: src/Content/Conversation.php:374 src/Module/Post/Edit.php:142
msgid "set location"
msgstr ""
#: src/Content/Conversation.php:367 src/Module/Post/Edit.php:143
#: src/Content/Conversation.php:375 src/Module/Post/Edit.php:143
msgid "Clear browser location"
msgstr ""
#: src/Content/Conversation.php:368 src/Module/Post/Edit.php:144
#: src/Content/Conversation.php:376 src/Module/Post/Edit.php:144
msgid "clear location"
msgstr ""
#: src/Content/Conversation.php:370 src/Module/Item/Compose.php:205
#: src/Content/Conversation.php:378 src/Module/Item/Compose.php:205
#: src/Module/Post/Edit.php:157
msgid "Set title"
msgstr ""
#: src/Content/Conversation.php:372 src/Module/Item/Compose.php:206
#: src/Content/Conversation.php:380 src/Module/Item/Compose.php:206
#: src/Module/Post/Edit.php:159
msgid "Categories (comma-separated list)"
msgstr ""
#: src/Content/Conversation.php:377 src/Module/Item/Compose.php:222
#: src/Content/Conversation.php:385 src/Module/Item/Compose.php:222
msgid "Scheduled at"
msgstr ""
#: src/Content/Conversation.php:382 src/Module/Post/Edit.php:146
#: src/Content/Conversation.php:390 src/Module/Post/Edit.php:146
msgid "Permission settings"
msgstr ""
#: src/Content/Conversation.php:392 src/Module/Post/Edit.php:155
#: src/Content/Conversation.php:400 src/Module/Post/Edit.php:155
msgid "Public post"
msgstr ""
#: src/Content/Conversation.php:406 src/Content/Widget/VCard.php:113
#: src/Content/Conversation.php:414 src/Content/Widget/VCard.php:113
#: src/Model/Profile.php:469 src/Module/Admin/Logs/View.php:92
#: src/Module/Post/Edit.php:180
msgid "Message"
msgstr ""
#: src/Content/Conversation.php:407 src/Module/Post/Edit.php:181
#: src/Content/Conversation.php:415 src/Module/Post/Edit.php:181
#: src/Module/Settings/TwoFactor/Trusted.php:140
msgid "Browser"
msgstr ""
#: src/Content/Conversation.php:409 src/Module/Post/Edit.php:184
#: src/Content/Conversation.php:417 src/Module/Post/Edit.php:184
msgid "Open Compose page"
msgstr ""
#: src/Content/Conversation.php:669 src/Object/Post.php:243
#: src/Content/Conversation.php:677 src/Object/Post.php:243
msgid "Pinned item"
msgstr ""
#: src/Content/Conversation.php:685 src/Object/Post.php:491
#: src/Content/Conversation.php:693 src/Object/Post.php:491
#: src/Object/Post.php:492
#, php-format
msgid "View %s's profile @ %s"
msgstr ""
#: src/Content/Conversation.php:698 src/Object/Post.php:479
#: src/Content/Conversation.php:706 src/Object/Post.php:479
msgid "Categories:"
msgstr ""
#: src/Content/Conversation.php:699 src/Object/Post.php:480
#: src/Content/Conversation.php:707 src/Object/Post.php:480
msgid "Filed under:"
msgstr ""
#: src/Content/Conversation.php:707 src/Object/Post.php:505
#: src/Content/Conversation.php:715 src/Object/Post.php:505
#, php-format
msgid "%s from %s"
msgstr ""
#: src/Content/Conversation.php:723
#: src/Content/Conversation.php:731
msgid "View in context"
msgstr ""
#: src/Content/Conversation.php:788
#: src/Content/Conversation.php:796
msgid "remove"
msgstr ""
#: src/Content/Conversation.php:792
#: src/Content/Conversation.php:800
msgid "Delete Selected Items"
msgstr ""
#: src/Content/Conversation.php:857 src/Content/Conversation.php:860
#: src/Content/Conversation.php:863 src/Content/Conversation.php:866
#: src/Content/Conversation.php:865 src/Content/Conversation.php:868
#: src/Content/Conversation.php:871 src/Content/Conversation.php:874
#, php-format
msgid "You had been addressed (%s)."
msgstr ""
#: src/Content/Conversation.php:869
#: src/Content/Conversation.php:877
#, php-format
msgid "You are following %s."
msgstr ""
#: src/Content/Conversation.php:872
#: src/Content/Conversation.php:880
msgid "You subscribed to one or more tags in this post."
msgstr ""
#: src/Content/Conversation.php:887
#: src/Content/Conversation.php:893
#, php-format
msgid "%s reshared this."
msgstr ""
#: src/Content/Conversation.php:895
msgid "Reshared"
msgstr ""
#: src/Content/Conversation.php:887
#: src/Content/Conversation.php:895
#, php-format
msgid "Reshared by %s <%s>"
msgstr ""
#: src/Content/Conversation.php:890
#: src/Content/Conversation.php:898
#, php-format
msgid "%s is participating in this thread."
msgstr ""
#: src/Content/Conversation.php:893
#: src/Content/Conversation.php:901
msgid "Stored for general reasons"
msgstr ""
#: src/Content/Conversation.php:896
#: src/Content/Conversation.php:904
msgid "Global post"
msgstr ""
#: src/Content/Conversation.php:899
#: src/Content/Conversation.php:907
msgid "Sent via an relay server"
msgstr ""
#: src/Content/Conversation.php:899
#: src/Content/Conversation.php:907
#, php-format
msgid "Sent via the relay server %s <%s>"
msgstr ""
#: src/Content/Conversation.php:902
#: src/Content/Conversation.php:910
msgid "Fetched"
msgstr ""
#: src/Content/Conversation.php:902
#: src/Content/Conversation.php:910
#, php-format
msgid "Fetched because of %s <%s>"
msgstr ""
#: src/Content/Conversation.php:905
#: src/Content/Conversation.php:913
msgid "Stored because of a child post to complete this thread."
msgstr ""
#: src/Content/Conversation.php:908
#: src/Content/Conversation.php:916
msgid "Local delivery"
msgstr ""
#: src/Content/Conversation.php:911
#: src/Content/Conversation.php:919
msgid "Stored because of your activity (like, comment, star, ...)"
msgstr ""
#: src/Content/Conversation.php:914
#: src/Content/Conversation.php:922
msgid "Distributed"
msgstr ""
#: src/Content/Conversation.php:917
#: src/Content/Conversation.php:925
msgid "Pushed to us"
msgstr ""
@ -1623,7 +1627,7 @@ msgstr ""
#: src/Content/Item.php:438 src/Content/Widget.php:80
#: src/Model/Contact.php:1199 src/Model/Contact.php:1210
#: src/Module/Contact/Follow.php:166 view/theme/vier/theme.php:196
#: src/Module/Contact/Follow.php:167 view/theme/vier/theme.php:196
msgid "Connect/Follow"
msgstr ""
@ -3275,89 +3279,89 @@ msgstr ""
msgid "Upcoming events the next 7 days:"
msgstr ""
#: src/Model/Profile.php:873
#: src/Model/Profile.php:875
#, php-format
msgid "OpenWebAuth: %1$s welcomes %2$s"
msgstr ""
#: src/Model/Profile.php:1013
#: src/Model/Profile.php:1015
msgid "Hometown:"
msgstr ""
#: src/Model/Profile.php:1014
#: src/Model/Profile.php:1016
msgid "Marital Status:"
msgstr ""
#: src/Model/Profile.php:1015
#: src/Model/Profile.php:1017
msgid "With:"
msgstr ""
#: src/Model/Profile.php:1016
#: src/Model/Profile.php:1018
msgid "Since:"
msgstr ""
#: src/Model/Profile.php:1017
#: src/Model/Profile.php:1019
msgid "Sexual Preference:"
msgstr ""
#: src/Model/Profile.php:1018
#: src/Model/Profile.php:1020
msgid "Political Views:"
msgstr ""
#: src/Model/Profile.php:1019
#: src/Model/Profile.php:1021
msgid "Religious Views:"
msgstr ""
#: src/Model/Profile.php:1020
#: src/Model/Profile.php:1022
msgid "Likes:"
msgstr ""
#: src/Model/Profile.php:1021
#: src/Model/Profile.php:1023
msgid "Dislikes:"
msgstr ""
#: src/Model/Profile.php:1022
#: src/Model/Profile.php:1024
msgid "Title/Description:"
msgstr ""
#: src/Model/Profile.php:1023 src/Module/Admin/Summary.php:221
#: src/Model/Profile.php:1025 src/Module/Admin/Summary.php:221
#: src/Module/Moderation/Summary.php:77
msgid "Summary"
msgstr ""
#: src/Model/Profile.php:1024
#: src/Model/Profile.php:1026
msgid "Musical interests"
msgstr ""
#: src/Model/Profile.php:1025
#: src/Model/Profile.php:1027
msgid "Books, literature"
msgstr ""
#: src/Model/Profile.php:1026
#: src/Model/Profile.php:1028
msgid "Television"
msgstr ""
#: src/Model/Profile.php:1027
#: src/Model/Profile.php:1029
msgid "Film/dance/culture/entertainment"
msgstr ""
#: src/Model/Profile.php:1028
#: src/Model/Profile.php:1030
msgid "Hobbies/Interests"
msgstr ""
#: src/Model/Profile.php:1029
#: src/Model/Profile.php:1031
msgid "Love/romance"
msgstr ""
#: src/Model/Profile.php:1030
#: src/Model/Profile.php:1032
msgid "Work/employment"
msgstr ""
#: src/Model/Profile.php:1031
#: src/Model/Profile.php:1033
msgid "School/education"
msgstr ""
#: src/Model/Profile.php:1032
#: src/Model/Profile.php:1034
msgid "Contact information and Social Networks"
msgstr ""
@ -5852,28 +5856,28 @@ msgstr ""
msgid "No common contacts."
msgstr ""
#: src/Module/Contact/Contacts.php:115 src/Module/Profile/Contacts.php:132
#: src/Module/Contact/Contacts.php:115 src/Module/Profile/Contacts.php:135
#, php-format
msgid "Follower (%s)"
msgid_plural "Followers (%s)"
msgstr[0] ""
msgstr[1] ""
#: src/Module/Contact/Contacts.php:119 src/Module/Profile/Contacts.php:135
#: src/Module/Contact/Contacts.php:119 src/Module/Profile/Contacts.php:138
#, php-format
msgid "Following (%s)"
msgid_plural "Following (%s)"
msgstr[0] ""
msgstr[1] ""
#: src/Module/Contact/Contacts.php:123 src/Module/Profile/Contacts.php:138
#: src/Module/Contact/Contacts.php:123 src/Module/Profile/Contacts.php:141
#, php-format
msgid "Mutual friend (%s)"
msgid_plural "Mutual friends (%s)"
msgstr[0] ""
msgstr[1] ""
#: src/Module/Contact/Contacts.php:125 src/Module/Profile/Contacts.php:140
#: src/Module/Contact/Contacts.php:125 src/Module/Profile/Contacts.php:143
#, php-format
msgid "These contacts both follow and are followed by <strong>%s</strong>."
msgstr ""
@ -5892,14 +5896,14 @@ msgid ""
"contacts (follow, comment or likes on public posts)."
msgstr ""
#: src/Module/Contact/Contacts.php:139 src/Module/Profile/Contacts.php:146
#: src/Module/Contact/Contacts.php:139 src/Module/Profile/Contacts.php:149
#, php-format
msgid "Contact (%s)"
msgid_plural "Contacts (%s)"
msgstr[0] ""
msgstr[1] ""
#: src/Module/Contact/Follow.php:69 src/Module/Contact/Redir.php:62
#: src/Module/Contact/Follow.php:70 src/Module/Contact/Redir.php:62
#: src/Module/Contact/Redir.php:222 src/Module/Conversation/Community.php:194
#: src/Module/Debug/ItemBody.php:38 src/Module/Diaspora/Receive.php:57
#: src/Module/Item/Display.php:96 src/Module/Item/Feed.php:59
@ -5909,36 +5913,36 @@ msgstr[1] ""
msgid "Access denied."
msgstr ""
#: src/Module/Contact/Follow.php:104 src/Module/Contact/Unfollow.php:125
#: src/Module/Contact/Follow.php:105 src/Module/Contact/Unfollow.php:125
#: src/Module/Profile/RemoteFollow.php:133
msgid "Submit Request"
msgstr ""
#: src/Module/Contact/Follow.php:114
#: src/Module/Contact/Follow.php:115
msgid "You already added this contact."
msgstr ""
#: src/Module/Contact/Follow.php:129
#: src/Module/Contact/Follow.php:130
msgid "The network type couldn't be detected. Contact can't be added."
msgstr ""
#: src/Module/Contact/Follow.php:137
#: src/Module/Contact/Follow.php:138
msgid "Diaspora support isn't enabled. Contact can't be added."
msgstr ""
#: src/Module/Contact/Follow.php:142
#: src/Module/Contact/Follow.php:143
msgid "OStatus support is disabled. Contact can't be added."
msgstr ""
#: src/Module/Contact/Follow.php:167 src/Module/Profile/RemoteFollow.php:132
#: src/Module/Contact/Follow.php:168 src/Module/Profile/RemoteFollow.php:132
msgid "Please answer the following:"
msgstr ""
#: src/Module/Contact/Follow.php:168 src/Module/Contact/Unfollow.php:123
#: src/Module/Contact/Follow.php:169 src/Module/Contact/Unfollow.php:123
msgid "Your Identity Address:"
msgstr ""
#: src/Module/Contact/Follow.php:169 src/Module/Contact/Profile.php:375
#: src/Module/Contact/Follow.php:170 src/Module/Contact/Profile.php:375
#: src/Module/Contact/Unfollow.php:129
#: src/Module/Moderation/Blocklist/Contact.php:133
#: src/Module/Notifications/Introductions.php:129
@ -5946,26 +5950,26 @@ msgstr ""
msgid "Profile URL"
msgstr ""
#: src/Module/Contact/Follow.php:170 src/Module/Contact/Profile.php:387
#: src/Module/Contact/Follow.php:171 src/Module/Contact/Profile.php:387
#: src/Module/Notifications/Introductions.php:191
#: src/Module/Profile/Profile.php:234
msgid "Tags:"
msgstr ""
#: src/Module/Contact/Follow.php:181
#: src/Module/Contact/Follow.php:182
#, php-format
msgid "%s knows you"
msgstr ""
#: src/Module/Contact/Follow.php:182
#: src/Module/Contact/Follow.php:183
msgid "Add a personal note:"
msgstr ""
#: src/Module/Contact/Follow.php:191 src/Module/Contact/Unfollow.php:138
#: src/Module/Contact/Follow.php:192 src/Module/Contact/Unfollow.php:138
msgid "Posts and Replies"
msgstr ""
#: src/Module/Contact/Follow.php:220
#: src/Module/Contact/Follow.php:221
msgid "The contact could not be added."
msgstr ""
@ -8260,7 +8264,7 @@ msgstr ""
msgid "Remove"
msgstr ""
#: src/Module/Profile/Contacts.php:156
#: src/Module/Profile/Contacts.php:159
msgid "No contacts."
msgstr ""
@ -11433,12 +11437,12 @@ msgstr ""
msgid "Login failed. Please check your credentials."
msgstr ""
#: src/Security/Authentication.php:389
#: src/Security/Authentication.php:391
#, php-format
msgid "Welcome %s"
msgstr ""
#: src/Security/Authentication.php:390
#: src/Security/Authentication.php:392
msgid "Please upload a profile photo."
msgstr ""