1
0
Fork 0

Merge remote-tracking branch 'upstream/develop' into logger-json

This commit is contained in:
Michael 2021-11-02 19:35:11 +00:00
commit 2785e4dab8
9 changed files with 1607 additions and 1193 deletions

View file

@ -289,13 +289,17 @@ class Photo extends BaseModule
$mimetext = '';
if (!empty($url)) {
$mime = ParseUrl::getContentType($url);
if (empty($mime) || ($mime[0] != 'image')) {
$url = '';
} else {
if (!empty($mime)) {
$mimetext = $mime[0] . '/' . $mime[1];
} else {
Logger::info('Invalid file', ['url' => $url]);
}
if (!empty($mimetext) && ($mime[0] != 'image') && ($mimetext != 'application/octet-stream')) {
Logger::info('Unexpected Content-Type', ['mime' => $mimetext, 'url' => $url]);
$mimetext = '';
}
}
if (empty($url)) {
if (empty($mimetext)) {
if ($customsize <= Proxy::PIXEL_MICRO) {
$url = Contact::getDefaultAvatar($contact, Proxy::SIZE_MICRO);
} elseif ($customsize <= Proxy::PIXEL_THUMB) {

View file

@ -0,0 +1,13 @@
<?php
namespace Friendica\Security\PermissionSet\Exception;
use Exception;
class PermissionSetNotFoundException extends \RuntimeException
{
public function __construct($message = '', Exception $previous = null)
{
parent::__construct($message, 404, $previous);
}
}

View file

@ -0,0 +1,13 @@
<?php
namespace Friendica\Security\PermissionSet\Exception;
use Throwable;
class PermissionSetPersistenceException extends \RuntimeException
{
public function __construct($message = "", Throwable $previous = null)
{
parent::__construct($message, 500, $previous);
}
}

View file

@ -27,6 +27,8 @@ use Friendica\Database\Database;
use Friendica\Model\Contact;
use Friendica\Model\Group;
use Friendica\Network\HTTPException\NotFoundException;
use Friendica\Security\PermissionSet\Exception\PermissionSetNotFoundException;
use Friendica\Security\PermissionSet\Exception\PermissionSetPersistenceException;
use Friendica\Security\PermissionSet\Factory;
use Friendica\Security\PermissionSet\Collection;
use Friendica\Security\PermissionSet\Entity;
@ -53,34 +55,22 @@ class PermissionSet extends BaseRepository
$this->aclFormatter = $aclFormatter;
}
/**
* replaces the PUBLIC id for the public permissionSet
* (no need to create the default permission set over and over again)
*
* @param $condition
*/
private function checkPublicSelect(&$condition)
{
if (empty($condition['allow_cid']) &&
empty($condition['allow_gid']) &&
empty($condition['deny_cid']) &&
empty($condition['deny_gid'])) {
$condition['uid'] = self::PUBLIC;
}
}
/**
* @param array $condition
* @param array $params
*
* @return Entity\PermissionSet
* @throws NotFoundException
* @throws Exception
*/
private function selectOne(array $condition, array $params = []): Entity\PermissionSet
{
return parent::_selectOne($condition, $params);
}
/**
* @throws Exception
*/
private function select(array $condition, array $params = []): Collection\PermissionSets
{
return new Collection\PermissionSets(parent::_select($condition, $params)->getArrayCopy());
@ -108,7 +98,9 @@ class PermissionSet extends BaseRepository
* @param int $id A PermissionSet table row id or self::PUBLIC
* @param int $uid The owner of the PermissionSet
* @return Entity\PermissionSet
* @throws NotFoundException
*
* @throws PermissionSetNotFoundException
* @throws PermissionSetPersistenceException
*/
public function selectOneById(int $id, int $uid): Entity\PermissionSet
{
@ -116,7 +108,13 @@ class PermissionSet extends BaseRepository
return $this->factory->createFromString($uid);
}
return $this->selectOne(['id' => $id, 'uid' => $uid]);
try {
return $this->selectOne(['id' => $id, 'uid' => $uid]);
} catch (NotFoundException $exception) {
throw new PermissionSetNotFoundException(sprintf('PermissionSet with id %d for user %u doesn\'t exist.', $id, $uid), $exception);
} catch (Exception $exception) {
throw new PermissionSetPersistenceException(sprintf('Cannot select PermissionSet %d for user %d', $id, $uid), $exception);
}
}
/**
@ -126,45 +124,51 @@ class PermissionSet extends BaseRepository
* @param int $uid User id whom the items belong, used for ownership check.
*
* @return Collection\PermissionSets
*
* @throws PermissionSetPersistenceException
*/
public function selectByContactId(int $cid, int $uid): Collection\PermissionSets
{
$cdata = Contact::getPublicAndUserContactID($cid, $uid);
if (!empty($cdata)) {
$public_contact_str = $this->aclFormatter->toString($cdata['public']);
$user_contact_str = $this->aclFormatter->toString($cdata['user']);
$cid = $cdata['user'];
} else {
$public_contact_str = $this->aclFormatter->toString($cid);
$user_contact_str = '';
}
try {
$cdata = Contact::getPublicAndUserContactID($cid, $uid);
if (!empty($cdata)) {
$public_contact_str = $this->aclFormatter->toString($cdata['public']);
$user_contact_str = $this->aclFormatter->toString($cdata['user']);
$cid = $cdata['user'];
} else {
$public_contact_str = $this->aclFormatter->toString($cid);
$user_contact_str = '';
}
$groups = [];
if (!empty($user_contact_str) && $this->db->exists('contact', [
'id' => $cid,
'uid' => $uid,
'blocked' => false
])) {
$groups = Group::getIdsByContactId($cid);
}
$groups = [];
if (!empty($user_contact_str) && $this->db->exists('contact', [
'id' => $cid,
'uid' => $uid,
'blocked' => false
])) {
$groups = Group::getIdsByContactId($cid);
}
$group_str = '<<>>'; // should be impossible to match
foreach ($groups as $group_id) {
$group_str .= '|<' . preg_quote($group_id) . '>';
}
$group_str = '<<>>'; // should be impossible to match
foreach ($groups as $group_id) {
$group_str .= '|<' . preg_quote($group_id) . '>';
}
if (!empty($user_contact_str)) {
$condition = ["`uid` = ? AND (NOT (`deny_cid` REGEXP ? OR `deny_cid` REGEXP ? OR deny_gid REGEXP ?)
AND (allow_cid REGEXP ? OR allow_cid REGEXP ? OR allow_gid REGEXP ? OR (allow_cid = '' AND allow_gid = '')))",
$uid, $user_contact_str, $public_contact_str, $group_str,
$user_contact_str, $public_contact_str, $group_str];
} else {
$condition = ["`uid` = ? AND (NOT (`deny_cid` REGEXP ? OR deny_gid REGEXP ?)
AND (allow_cid REGEXP ? OR allow_gid REGEXP ? OR (allow_cid = '' AND allow_gid = '')))",
$uid, $public_contact_str, $group_str, $public_contact_str, $group_str];
}
if (!empty($user_contact_str)) {
$condition = ["`uid` = ? AND (NOT (LOCATE(?, `deny_cid`) OR LOCATE(?, `deny_cid`) OR deny_gid REGEXP ?)
AND (LOCATE(?, allow_cid) OR LOCATE(?, allow_cid) OR allow_gid REGEXP ? OR (allow_cid = '' AND allow_gid = '')))",
$uid, $user_contact_str, $public_contact_str, $group_str,
$user_contact_str, $public_contact_str, $group_str];
} else {
$condition = ["`uid` = ? AND (NOT (LOCATE(?, `deny_cid`) OR deny_gid REGEXP ?)
AND (LOCATE(?, allow_cid) OR allow_gid REGEXP ? OR (allow_cid = '' AND allow_gid = '')))",
$uid, $public_contact_str, $group_str, $public_contact_str, $group_str];
}
return $this->select($condition);
return $this->select($condition);
} catch (Exception $exception) {
throw new PermissionSetPersistenceException(sprintf('Cannot select PermissionSet for contact %d and user %d', $cid, $uid), $exception);
}
}
/**
@ -173,11 +177,20 @@ class PermissionSet extends BaseRepository
* @param int $uid
*
* @return Entity\PermissionSet
* @throws Exception
*
* @throws PermissionSetPersistenceException
*/
public function selectDefaultForUser(int $uid): Entity\PermissionSet
{
$self_contact = Contact::selectFirst(['id'], ['uid' => $uid, 'self' => true]);
try {
$self_contact = Contact::selectFirst(['id'], ['uid' => $uid, 'self' => true]);
} catch (Exception $exception) {
throw new PermissionSetPersistenceException(sprintf('Cannot select Contact for user %d', $uid));
}
if (!$this->db->isResult($self_contact)) {
throw new PermissionSetPersistenceException(sprintf('No "self" contact found for user %d', $uid));
}
return $this->selectOrCreate($this->factory->createFromString(
$uid,
@ -203,6 +216,8 @@ class PermissionSet extends BaseRepository
* @param Entity\PermissionSet $permissionSet
*
* @return Entity\PermissionSet
*
* @throws PermissionSetPersistenceException
*/
public function selectOrCreate(Entity\PermissionSet $permissionSet): Entity\PermissionSet
{
@ -219,6 +234,8 @@ class PermissionSet extends BaseRepository
return $this->selectOne($this->convertToTableRow($permissionSet));
} catch (NotFoundException $exception) {
return $this->save($permissionSet);
} catch (Exception $exception) {
throw new PermissionSetPersistenceException(sprintf('Cannot select PermissionSet %d', $permissionSet->id ?? 0), $exception);
}
}
@ -226,7 +243,8 @@ class PermissionSet extends BaseRepository
* @param Entity\PermissionSet $permissionSet
*
* @return Entity\PermissionSet
* @throws NotFoundException
*
* @throws PermissionSetPersistenceException
*/
public function save(Entity\PermissionSet $permissionSet): Entity\PermissionSet
{
@ -237,12 +255,16 @@ class PermissionSet extends BaseRepository
$fields = $this->convertToTableRow($permissionSet);
if ($permissionSet->id) {
$this->db->update(self::$table_name, $fields, ['id' => $permissionSet->id]);
} else {
$this->db->insert(self::$table_name, $fields);
try {
if ($permissionSet->id) {
$this->db->update(self::$table_name, $fields, ['id' => $permissionSet->id]);
} else {
$this->db->insert(self::$table_name, $fields);
$permissionSet = $this->selectOneById($this->db->lastInsertId(), $permissionSet->uid);
$permissionSet = $this->selectOneById($this->db->lastInsertId(), $permissionSet->uid);
}
} catch (Exception $exception) {
throw new PermissionSetPersistenceException(sprintf('Cannot save PermissionSet %d', $permissionSet->id ?? 0), $exception);
}
return $permissionSet;

View file

@ -2,6 +2,9 @@
namespace Friendica\Test\src\Security\PermissionSet\Repository;
use Friendica\Database\Database;
use Friendica\Security\PermissionSet\Collection\PermissionSets;
use Friendica\Security\PermissionSet\Exception\PermissionSetNotFoundException;
use Friendica\Security\PermissionSet\Repository\PermissionSet as PermissionSetRepository;
use Friendica\Security\PermissionSet\Entity\PermissionSet;
use Friendica\Security\PermissionSet\Factory\PermissionSet as PermissionSetFactory;
@ -61,4 +64,333 @@ class PermissionSetTest extends FixtureTest
self::assertEquals($savedPermissionSet, $permissionSetSavedSelected);
}
/**
* Asserts that the actual permissionset is equal to the expected permissionset
* --> It skips the "id" fields
*
* @param PermissionSets $expected
* @param PermissionSets $actual
*/
public static function assertEqualPermissionSets(PermissionSets $expected, PermissionSets $actual)
{
self::assertEquals($expected->count(), $actual->count(), 'PermissionSets not even ' . PHP_EOL . 'expected: ' . print_r($expected, true) . 'actual: ' . print_r($actual, true));
foreach ($expected as $outputPermissionSet) {
self::assertCount(1, $actual->filter(function (PermissionSet $actualPermissionSet) use ($outputPermissionSet) {
return (
$actualPermissionSet->uid == $outputPermissionSet->uid &&
$actualPermissionSet->allow_cid == $outputPermissionSet->allow_cid &&
$actualPermissionSet->allow_gid == $outputPermissionSet->allow_gid &&
$actualPermissionSet->deny_cid == $outputPermissionSet->deny_cid &&
$actualPermissionSet->deny_gid == $outputPermissionSet->deny_gid
);
}), 'PermissionSet not found: ' . print_r($outputPermissionSet, true));
}
}
public function dataSet()
{
return [
'standard' => [
'group_member' => [],
'permissionSets' => [
[
'uid' => 42,
'allow_cid' => '<43>',
'allow_gid' => '',
'deny_cid' => '<44>',
'deny_gid' => '',
],
[
'uid' => 42,
'allow_cid' => '',
'allow_gid' => '',
'deny_cid' => '',
'deny_gid' => '',
],
[
'uid' => 42,
'allow_cid' => '<44>',
'allow_gid' => '',
'deny_cid' => '',
'deny_gid' => '',
],
],
'assertions' => [
[
'input' => [
'cid' => 43,
'uid' => 42,
],
'output' => new PermissionSets([
new PermissionSet(42, [43], [], [44], []),
new PermissionSet(42, [], [], [], []),
]),
],
[
'input' => [
'cid' => 44,
'uid' => 42,
],
'output' => new PermissionSets([
new PermissionSet(42, [], [], [], []),
new PermissionSet(42, [44], [], [], []),
]),
],
[
'input' => [
'cid' => 47,
'uid' => 42,
],
'output' => new PermissionSets([
new PermissionSet(42, [], [], [], []),
]),
],
],
],
'empty' => [
'group_member' => [],
'permissionSets' => [
[
'uid' => 42,
'allow_cid' => '',
'allow_gid' => '',
'deny_cid' => '',
'deny_gid' => '',
],
],
'assertions' => [
[
'input' => [
'cid' => 43,
'uid' => 42,
],
'output' => new PermissionSets([
new PermissionSet(42, [], [], [], []),
]),
],
[
'input' => [
'cid' => 44,
'uid' => 42,
],
'output' => new PermissionSets([
new PermissionSet(42, [], [], [], []),
]),
],
[
'input' => [
'cid' => 47,
'uid' => 42,
],
'output' => new PermissionSets([
new PermissionSet(42, [], [], [], []),
]),
],
]
],
'nothing' => [
'group_member' => [],
'permissionSets' => [
],
'assertions' => [
[
'input' => [
'cid' => 43,
'uid' => 42,
],
'output' => new PermissionSets(),
],
[
'input' => [
'cid' => 44,
'uid' => 42,
],
'output' => new PermissionSets(),
],
[
'input' => [
'cid' => 47,
'uid' => 42,
],
'output' => new PermissionSets(),
],
]
],
'with_groups' => [
'group_member' => [
[
'id' => 1,
'gid' => 1,
'contact-id' => 47,
],
[
'id' => 2,
'gid' => 1,
'contact-id' => 42,
],
[
'id' => 3,
'gid' => 2,
'contact-id' => 43,
],
],
'permissionSets' => [
[
'uid' => 42,
'allow_cid' => '<43>',
'allow_gid' => '<3>',
'deny_cid' => '<44>,<46>',
'deny_gid' => '',
],
[
'uid' => 42,
'allow_cid' => '',
'allow_gid' => '',
'deny_cid' => '',
'deny_gid' => '<2>',
],
[
'uid' => 42,
'allow_cid' => '<44>',
'allow_gid' => '',
'deny_cid' => '',
'deny_gid' => '',
],
[
'uid' => 42,
'allow_cid' => '',
'allow_gid' => '',
'deny_cid' => '',
'deny_gid' => '<1>',
],
[
'uid' => 42,
'allow_cid' => '<45>',
'allow_gid' => '',
'deny_cid' => '',
'deny_gid' => '<1><2>',
],
],
'assertions' => [
[
'input' => [
'cid' => 42,
'uid' => 42,
],
'output' => new PermissionSets([
new PermissionSet(42, [], [], [], [2]),
]),
],
[
'input' => [
'cid' => 43,
'uid' => 42,
],
'output' => new PermissionSets([
new PermissionSet(42, [43], [3], [44, 46], []),
new PermissionSet(42, [], [], [], [2]),
new PermissionSet(42, [], [], [], [1]),
]),
],
[
'input' => [
'cid' => 44,
'uid' => 42,
],
'output' => new PermissionSets([
new PermissionSet(42, [], [], [], [2]),
new PermissionSet(42, [44], [], [], []),
new PermissionSet(42, [], [], [], [1]),
new PermissionSet(42, [45], [], [], [1, 2]),
]),
],
[
'input' => [
'cid' => 45,
'uid' => 42,
],
'output' => new PermissionSets([
new PermissionSet(42, [], [], [], [2]),
new PermissionSet(42, [44], [], [], []),
new PermissionSet(42, [], [], [], [1]),
new PermissionSet(42, [45], [], [], [1, 2]),
]),
],
[
'input' => [
'cid' => 46,
'uid' => 42,
],
'output' => new PermissionSets([
new PermissionSet(42, [], [], [], [2]),
new PermissionSet(42, [], [], [], [1]),
]),
],
[
'input' => [
'cid' => 47,
'uid' => 42,
],
'output' => new PermissionSets([
new PermissionSet(42, [], [], [], [2]),
new PermissionSet(42, [], [], [], [1]),
]),
],
],
],
];
}
/**
* @dataProvider dataSet
*/
public function testSelectContactId(array $group_member, array $inputPermissionSets, array $assertions)
{
/** @var Database $db */
$db = $this->dice->create(Database::class);
foreach ($group_member as $gmember) {
$db->insert('group_member', $gmember, true);
}
foreach ($inputPermissionSets as $inputPermissionSet) {
$db->insert('permissionset', $inputPermissionSet, true);
}
foreach ($assertions as $assertion) {
$permissionSets = $this->repository->selectByContactId($assertion['input']['cid'], $assertion['input']['uid']);
self::assertInstanceOf(PermissionSets::class, $permissionSets);
self::assertEqualPermissionSets($assertion['output'], $permissionSets);
}
}
public function testSelectOneByIdInvalid()
{
self::expectException(PermissionSetNotFoundException::class);
self::expectExceptionMessage('PermissionSet with id -1 for user 42 doesn\'t exist.');
$this->repository->selectOneById(-1, 42);
}
/**
* @dataProvider dataSet
*/
public function testSelectOneById(array $group_member, array $inputPermissionSets, array $assertions)
{
if (count($inputPermissionSets) === 0) {
self::markTestSkipped('Nothing to assert.');
}
/** @var Database $db */
$db = $this->dice->create(Database::class);
foreach ($inputPermissionSets as $inputPermissionSet) {
$db->insert('permissionset', $inputPermissionSet);
$id = $db->lastInsertId();
self::assertInstanceOf(PermissionSet::class, $this->repository->selectOneById($id, $inputPermissionSet['uid']));
}
}
}

View file

@ -49,8 +49,8 @@ msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-23 21:51-0400\n"
"PO-Revision-Date: 2021-10-24 13:04+0000\n"
"POT-Creation-Date: 2021-10-27 20:01+0200\n"
"PO-Revision-Date: 2021-11-01 05:59+0000\n"
"Last-Translator: Tobias Diekershoff <tobias.diekershoff@gmx.net>\n"
"Language-Team: German (http://www.transifex.com/Friendica/friendica/language/de/)\n"
"MIME-Version: 1.0\n"
@ -2129,11 +2129,11 @@ msgid ""
"your site allow private mail from unknown senders."
msgstr "Wenn du möchtest, dass %s dir antworten kann, überprüfe deine Privatsphären-Einstellungen und erlaube private Nachrichten von unbekannten Absendern."
#: src/App.php:456
#: src/App.php:455
msgid "No system theme config value set."
msgstr "Es wurde kein Konfigurationswert für das systemweite Theme gesetzt."
#: src/App/Module.php:240
#: src/App/Module.php:241
msgid "You must be logged in to use addons. "
msgstr "Du musst angemeldet sein, um Addons benutzen zu können."
@ -3923,6 +3923,20 @@ msgstr "Die Template Engine kann nicht ohne einen Namen registriert werden."
msgid "template engine is not registered!"
msgstr "Template Engine wurde nicht registriert!"
#: src/Core/Storage/Type/FilesystemConfig.php:78
msgid "Storage base path"
msgstr "Dateipfad zum Speicher"
#: src/Core/Storage/Type/FilesystemConfig.php:80
msgid ""
"Folder where uploaded files are saved. For maximum security, This should be "
"a path outside web server folder tree"
msgstr "Verzeichnis, in das Dateien hochgeladen werden. Für maximale Sicherheit sollte dies ein Pfad außerhalb der Webserver-Verzeichnisstruktur sein"
#: src/Core/Storage/Type/FilesystemConfig.php:93
msgid "Enter a valid existing folder"
msgstr "Gib einen gültigen, existierenden Ordner ein"
#: src/Core/Update.php:67
#, php-format
msgid ""
@ -4168,10 +4182,9 @@ msgstr "Eingeschränktes Profil. Diese Person wird keine direkten/privaten Nachr
msgid "Unable to retrieve contact information."
msgstr "Konnte die Kontaktinformationen nicht empfangen."
#: src/Model/Event.php:52 src/Model/Event.php:853
#: src/Module/Debug/Localtime.php:38
msgid "l F d, Y \\@ g:i A"
msgstr "l, d. F Y\\, H:i"
#: src/Model/Event.php:52
msgid "l F d, Y \\@ g:i A \\G\\M\\TP (e)"
msgstr "l F d, Y \\@ g:i A \\G\\M\\TP (e)"
#: src/Model/Event.php:73 src/Model/Event.php:90 src/Model/Event.php:464
#: src/Model/Event.php:897
@ -4211,6 +4224,10 @@ msgstr "Veranstaltung kopieren"
msgid "Delete event"
msgstr "Veranstaltung löschen"
#: src/Model/Event.php:853 src/Module/Debug/Localtime.php:38
msgid "l F d, Y \\@ g:i A"
msgstr "l, d. F Y\\, H:i"
#: src/Model/Event.php:854
msgid "D g:i A"
msgstr "D H:i"
@ -4455,20 +4472,6 @@ msgstr "Schule/Ausbildung"
msgid "Contact information and Social Networks"
msgstr "Kontaktinformationen und Soziale Netzwerke"
#: src/Model/Storage/FilesystemConfig.php:77
msgid "Storage base path"
msgstr "Dateipfad zum Speicher"
#: src/Model/Storage/FilesystemConfig.php:79
msgid ""
"Folder where uploaded files are saved. For maximum security, This should be "
"a path outside web server folder tree"
msgstr "Verzeichnis, in das Dateien hochgeladen werden. Für maximale Sicherheit sollte dies ein Pfad außerhalb der Webserver-Verzeichnisstruktur sein"
#: src/Model/Storage/FilesystemConfig.php:92
msgid "Enter a valid existing folder"
msgstr "Gib einen gültigen, existierenden Ordner ein"
#: src/Model/User.php:208 src/Model/User.php:1050
msgid "SERIOUS ERROR: Generation of security keys failed."
msgstr "FATALER FEHLER: Sicherheitsschlüssel konnten nicht erzeugt werden."
@ -4516,13 +4519,13 @@ msgstr "Die Einladung konnte nicht überprüft werden."
msgid "Invalid OpenID url"
msgstr "Ungültige OpenID URL"
#: src/Model/User.php:962 src/Security/Authentication.php:223
#: src/Model/User.php:962 src/Security/Authentication.php:224
msgid ""
"We encountered a problem while logging in with the OpenID you provided. "
"Please check the correct spelling of the ID."
msgstr "Beim Versuch, dich mit der von dir angegebenen OpenID anzumelden, trat ein Problem auf. Bitte überprüfe, dass du die OpenID richtig geschrieben hast."
#: src/Model/User.php:962 src/Security/Authentication.php:223
#: src/Model/User.php:962 src/Security/Authentication.php:224
msgid "The error message was:"
msgstr "Die Fehlermeldung lautete:"
@ -8546,21 +8549,21 @@ msgstr "Entfernte Privatsphäreneinstellungen nicht verfügbar."
msgid "Visible to:"
msgstr "Sichtbar für:"
#: src/Module/Photo.php:122
#: src/Module/Photo.php:123
msgid "The Photo is not available."
msgstr "Das Foto ist nicht verfügbar."
#: src/Module/Photo.php:135
#: src/Module/Photo.php:136
#, php-format
msgid "The Photo with id %s is not available."
msgstr "Das Bild mit ID %s ist nicht verfügbar."
#: src/Module/Photo.php:168
#: src/Module/Photo.php:169
#, php-format
msgid "Invalid external resource with url %s."
msgstr "Ungültige externe Ressource mit der URL %s"
#: src/Module/Photo.php:170
#: src/Module/Photo.php:171
#, php-format
msgid "Invalid photo with id %s."
msgstr "Fehlerhaftes Foto mit der ID %s."
@ -10624,20 +10627,20 @@ msgstr "wird nicht mehr gefolgt"
msgid "The folder view/smarty3/ must be writable by webserver."
msgstr "Das Verzeichnis view/smarty3/ muss für den Web-Server beschreibbar sein."
#: src/Security/Authentication.php:209
#: src/Security/Authentication.php:210
msgid "Login failed."
msgstr "Anmeldung fehlgeschlagen."
#: src/Security/Authentication.php:250
#: src/Security/Authentication.php:251
msgid "Login failed. Please check your credentials."
msgstr "Anmeldung fehlgeschlagen. Bitte überprüfe deine Angaben."
#: src/Security/Authentication.php:348
#: src/Security/Authentication.php:349
#, php-format
msgid "Welcome %s"
msgstr "Willkommen %s"
#: src/Security/Authentication.php:349
#: src/Security/Authentication.php:350
msgid "Please upload a profile photo."
msgstr "Bitte lade ein Profilbild hoch."

View file

@ -933,6 +933,9 @@ $a->strings['rebuffed'] = 'abfuhrerteilte';
$a->strings['Friendica can\'t display this page at the moment, please contact the administrator.'] = 'Friendica kann die Seite im Moment nicht darstellen. Bitte kontaktiere das Administratoren Team.';
$a->strings['template engine cannot be registered without a name.'] = 'Die Template Engine kann nicht ohne einen Namen registriert werden.';
$a->strings['template engine is not registered!'] = 'Template Engine wurde nicht registriert!';
$a->strings['Storage base path'] = 'Dateipfad zum Speicher';
$a->strings['Folder where uploaded files are saved. For maximum security, This should be a path outside web server folder tree'] = 'Verzeichnis, in das Dateien hochgeladen werden. Für maximale Sicherheit sollte dies ein Pfad außerhalb der Webserver-Verzeichnisstruktur sein';
$a->strings['Enter a valid existing folder'] = 'Gib einen gültigen, existierenden Ordner ein';
$a->strings['Updates from version %s are not supported. Please update at least to version 2021.01 and wait until the postupdate finished version 1383.'] = 'Aktualisierungen von der Version %s werden nicht unterstützt. Bitte aktualisiere vorher auf die Version 2021.01 von Friendica und warte bis das Postupdate auf die Version 1383 abgeschlossen ist.';
$a->strings['Updates from postupdate version %s are not supported. Please update at least to version 2021.01 and wait until the postupdate finished version 1383.'] = 'Aktualisierungen von der Postupdate Version %s werden nicht unterstützt. Bitte aktualisiere zunächst auf die Friendica Version 2021.01 und warte bis das Postupdate 1383 abgeschlossen ist.';
$a->strings['%s: executing pre update %d'] = '%s: Pre-Update %d wird ausgeführt';
@ -1000,7 +1003,7 @@ $a->strings['Use mailto: in front of address to force email check.'] = 'Verwende
$a->strings['The profile address specified belongs to a network which has been disabled on this site.'] = 'Die Adresse dieses Profils gehört zu einem Netzwerk, mit dem die Kommunikation auf dieser Seite ausgeschaltet wurde.';
$a->strings['Limited profile. This person will be unable to receive direct/personal notifications from you.'] = 'Eingeschränktes Profil. Diese Person wird keine direkten/privaten Nachrichten von dir erhalten können.';
$a->strings['Unable to retrieve contact information.'] = 'Konnte die Kontaktinformationen nicht empfangen.';
$a->strings['l F d, Y \@ g:i A'] = 'l, d. F Y\, H:i';
$a->strings['l F d, Y \@ g:i A \G\M\TP (e)'] = 'l F d, Y \@ g:i A \G\M\TP (e)';
$a->strings['Starts:'] = 'Beginnt:';
$a->strings['Finishes:'] = 'Endet:';
$a->strings['all-day'] = 'ganztägig';
@ -1010,6 +1013,7 @@ $a->strings['l, F j'] = 'l, F j';
$a->strings['Edit event'] = 'Veranstaltung bearbeiten';
$a->strings['Duplicate event'] = 'Veranstaltung kopieren';
$a->strings['Delete event'] = 'Veranstaltung löschen';
$a->strings['l F d, Y \@ g:i A'] = 'l, d. F Y\, H:i';
$a->strings['D g:i A'] = 'D H:i';
$a->strings['g:i A'] = 'H:i';
$a->strings['Show map'] = 'Karte anzeigen';
@ -1068,9 +1072,6 @@ $a->strings['Love/romance'] = 'Liebe/Romantik';
$a->strings['Work/employment'] = 'Arbeit/Anstellung';
$a->strings['School/education'] = 'Schule/Ausbildung';
$a->strings['Contact information and Social Networks'] = 'Kontaktinformationen und Soziale Netzwerke';
$a->strings['Storage base path'] = 'Dateipfad zum Speicher';
$a->strings['Folder where uploaded files are saved. For maximum security, This should be a path outside web server folder tree'] = 'Verzeichnis, in das Dateien hochgeladen werden. Für maximale Sicherheit sollte dies ein Pfad außerhalb der Webserver-Verzeichnisstruktur sein';
$a->strings['Enter a valid existing folder'] = 'Gib einen gültigen, existierenden Ordner ein';
$a->strings['SERIOUS ERROR: Generation of security keys failed.'] = 'FATALER FEHLER: Sicherheitsschlüssel konnten nicht erzeugt werden.';
$a->strings['Login failed'] = 'Anmeldung fehlgeschlagen';
$a->strings['Not enough information to authenticate'] = 'Nicht genügend Informationen für die Authentifizierung';

File diff suppressed because it is too large Load diff

View file

@ -18,60 +18,6 @@ $a->strings['Weekly posting limit of %d post reached. The post was rejected.'] =
3 => 'Недельный лимит в %d записей достигнут. Запись была отклонена.',
];
$a->strings['Monthly posting limit of %d post reached. The post was rejected.'] = 'Месячный лимит в %d записей достигнут. Запись была отклонена.';
$a->strings['Profile Photos'] = 'Фотографии профиля';
$a->strings['[Friendica:Notify]'] = '[Friendica]';
$a->strings['%s New mail received at %s'] = '%s Новая почта получена в %s';
$a->strings['%1$s sent you a new private message at %2$s.'] = '%1$s отправил вам новое личное сообщение на %2$s.';
$a->strings['a private message'] = 'личное сообщение';
$a->strings['%1$s sent you %2$s.'] = '%1$s послал вам %2$s.';
$a->strings['Please visit %s to view and/or reply to your private messages.'] = 'Пожалуйста, посетите %s для просмотра и/или ответа на личные сообщения.';
$a->strings['%1$s commented on %2$s\'s %3$s %4$s'] = '%1$s прокомментировал(а) %2$s %3$s %4$s';
$a->strings['%1$s commented on your %2$s %3$s'] = '%1$s прокомментировал(а) ваш %2$s %3$s';
$a->strings['%1$s commented on their %2$s %3$s'] = '%1$s прокомментировал(а) свой %2$s %3$s';
$a->strings['%1$s Comment to conversation #%2$d by %3$s'] = '%1$s Комментариев к разговору #%2$d от %3$s';
$a->strings['%s commented on an item/conversation you have been following.'] = '%s оставил комментарий к элементу/беседе, за которой вы следите.';
$a->strings['Please visit %s to view and/or reply to the conversation.'] = 'Пожалуйста посетите %s для просмотра и/или ответа в беседу.';
$a->strings['%s %s posted to your profile wall'] = '%s %s размещены на стене вашего профиля';
$a->strings['%1$s posted to your profile wall at %2$s'] = '%1$s написал на вашей стене на %2$s';
$a->strings['%1$s posted to [url=%2$s]your wall[/url]'] = '%1$s написал на [url=%2$s]вашей стене[/url]';
$a->strings['%1$s %2$s poked you'] = '%1$s %2$s продвинул тебя';
$a->strings['%1$s poked you at %2$s'] = '%1$s потыкал вас на %2$s';
$a->strings['%1$s [url=%2$s]poked you[/url].'] = '%1$s [url=%2$s]потыкал вас[/url].';
$a->strings['%s Introduction received'] = '%s Входящих получено';
$a->strings['You\'ve received an introduction from \'%1$s\' at %2$s'] = 'Вы получили запрос от \'%1$s\' на %2$s';
$a->strings['You\'ve received [url=%1$s]an introduction[/url] from %2$s.'] = 'Вы получили [url=%1$s]запрос[/url] от %2$s.';
$a->strings['You may visit their profile at %s'] = 'Вы можете посмотреть его профиль здесь %s';
$a->strings['Please visit %s to approve or reject the introduction.'] = 'Посетите %s для подтверждения или отказа запроса.';
$a->strings['%s A new person is sharing with you'] = '%s Новый человек поделился с Вами';
$a->strings['%1$s is sharing with you at %2$s'] = '%1$s делится с вами на %2$s';
$a->strings['%s You have a new follower'] = '%s У Вас новый подписчик';
$a->strings['You have a new follower at %2$s : %1$s'] = 'У вас новый подписчик на %2$s : %1$s';
$a->strings['%s Friend suggestion received'] = '%s Получено дружеское приглашение';
$a->strings['You\'ve received a friend suggestion from \'%1$s\' at %2$s'] = 'Вы получили предложение дружбы от \'%1$s\' на %2$s';
$a->strings['You\'ve received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s.'] = 'У вас [url=%1$s]новое предложение дружбы[/url] для %2$s от %3$s.';
$a->strings['Name:'] = 'Имя:';
$a->strings['Photo:'] = 'Фото:';
$a->strings['Please visit %s to approve or reject the suggestion.'] = 'Пожалуйста, посетите %s для подтверждения, или отказа запроса.';
$a->strings['%s Connection accepted'] = '%s Соединение принято';
$a->strings['\'%1$s\' has accepted your connection request at %2$s'] = '\'%1$s\' принял соединение с вами на %2$s';
$a->strings['%2$s has accepted your [url=%1$s]connection request[/url].'] = '%2$s принял ваше [url=%1$s]предложение о соединении[/url].';
$a->strings['You are now mutual friends and may exchange status updates, photos, and email without restriction.'] = 'Вы теперь взаимные друзья и можете обмениваться статусами, фотографиями и письмами без ограничений.';
$a->strings['Please visit %s if you wish to make any changes to this relationship.'] = 'Посетите %s если вы хотите сделать изменения в этом отношении.';
$a->strings['\'%1$s\' has chosen to accept you a fan, which restricts some forms of communication - such as private messaging and some profile interactions. If this is a celebrity or community page, these settings were applied automatically.'] = '%1$s решил принять приглашение и пометил вас как фаната, что запрещает некоторые формы общения - например, личные сообщения и некоторые действия с профилем. Если эта страница знаменитости или сообщества, то эти настройки были применены автоматически.';
$a->strings['\'%1$s\' may choose to extend this into a two-way or more permissive relationship in the future.'] = '%1$s может расширить взаимоотношения до более мягких в будущем.';
$a->strings['Please visit %s if you wish to make any changes to this relationship.'] = 'Посетите %s если вы хотите сделать изменения в этом отношении.';
$a->strings['[Friendica System Notify]'] = '[Системное уведомление Friendica]';
$a->strings['registration request'] = 'запрос регистрации';
$a->strings['You\'ve received a registration request from \'%1$s\' at %2$s'] = 'Вы получили запрос на регистрацию от \'%1$s\' на %2$s';
$a->strings['You\'ve received a [url=%1$s]registration request[/url] from %2$s.'] = 'Вы получили [url=%1$s]запрос регистрации[/url] от %2$s.';
$a->strings['Full Name: %s
Site Location: %s
Login Name: %s (%s)'] = 'Полное имя: %s
Расположение: %s
Имя для входа: %s (%s)';
$a->strings['Please visit %s to approve or reject the request.'] = 'Пожалуйста, посетите %s чтобы подтвердить или отвергнуть запрос.';
$a->strings['%s %s tagged you'] = '%s %s отметил(и) Вас';
$a->strings['%s %s shared a new post'] = '%s %s поделился(-ась) новым сообщением';
$a->strings['Permission denied.'] = 'Нет разрешения.';
$a->strings['Access denied.'] = 'Доступ запрещен.';
$a->strings['User not found.'] = 'Пользователь не найден.';
@ -362,6 +308,7 @@ $a->strings['{0} wants to be your friend'] = '{0} хочет стать Ваши
$a->strings['{0} requested registration'] = '{0} требуемая регистрация';
$a->strings['Bad Request.'] = 'Ошибочный запрос.';
$a->strings['Contact not found.'] = 'Контакт не найден.';
$a->strings['[Friendica System Notify]'] = '[Системное уведомление Friendica]';
$a->strings['User deleted their account'] = 'Пользователь удалил свою учётную запись';
$a->strings['On your Friendica node an user deleted their account. Please ensure that their data is removed from the backups.'] = 'Пользователь удалил свою учётную запись на вашем сервере Friendica. Пожалуйста, убедитесь, что их данные будут удалены из резервных копий.';
$a->strings['The user id is %d'] = 'id пользователя: %d';
@ -521,6 +468,7 @@ $a->strings['You receive a private message'] = 'Вы получаете личн
$a->strings['You receive a friend suggestion'] = 'Вы полулили предложение о добавлении в друзья';
$a->strings['You are tagged in a post'] = 'Вы отмечены в записи';
$a->strings['You are poked/prodded/etc. in a post'] = 'Вас потыкали/подтолкнули/и т.д. в записи';
$a->strings['Someone liked your content'] = 'Ваш комментарий понравился';
$a->strings['Activate desktop notifications'] = 'Активировать уведомления на рабочем столе';
$a->strings['Show desktop popup on new notifications'] = 'Показывать уведомления на рабочем столе';
$a->strings['Text-only notification emails'] = 'Только текстовые письма';
@ -696,6 +644,7 @@ $a->strings['Display Membership Date'] = 'Показывать дату реги
$a->strings['Display membership date in profile'] = 'Дата вашей регистрации будет отображаться в вашем профиле';
$a->strings['Forums'] = 'Форумы';
$a->strings['External link to forum'] = 'Внешняя ссылка на форум';
$a->strings['show less'] = 'показать меньше';
$a->strings['show more'] = 'показать больше';
$a->strings['%1$s poked %2$s'] = '%1$s ткнул %2$s';
$a->strings['event'] = 'мероприятие';
@ -723,8 +672,6 @@ $a->strings['Your posts and conversations'] = 'Ваши записи и диал
$a->strings['Profile'] = 'Информация';
$a->strings['Your profile page'] = 'Информация о вас';
$a->strings['Your photos'] = 'Ваши фотографии';
$a->strings['Videos'] = 'Видео';
$a->strings['Your videos'] = 'Ваши видео';
$a->strings['Your events'] = 'Ваши события';
$a->strings['Personal notes'] = 'Личные заметки';
$a->strings['Your personal notes'] = 'Ваши личные заметки';
@ -963,6 +910,9 @@ $a->strings['fingered'] = 'пощупали';
$a->strings['rebuff'] = 'ребаф';
$a->strings['rebuffed'] = 'ребафнут';
$a->strings['Friendica can\'t display this page at the moment, please contact the administrator.'] = 'Friendica не может отобразить эту страницу в данный момент, пожалуйста, свяжитесь с администратором.';
$a->strings['Storage base path'] = 'Корневой каталог хранилища';
$a->strings['Folder where uploaded files are saved. For maximum security, This should be a path outside web server folder tree'] = 'Каталог, куда сохраняются загруженные файлы. Для максимальной безопасности этот каталог должен быть размещён вне каталогов веб-сервера.';
$a->strings['Enter a valid existing folder'] = 'Введите путь к существующему каталогу';
$a->strings['Update %s failed. See error logs.'] = 'Обновление %s не удалось. Смотрите журнал ошибок.';
$a->strings['
The friendica developers released update %s recently,
@ -1021,7 +971,6 @@ $a->strings['Use mailto: in front of address to force email check.'] = 'Bcgjkmpe
$a->strings['The profile address specified belongs to a network which has been disabled on this site.'] = 'Указанный адрес профиля принадлежит сети, недоступной на этом сайта.';
$a->strings['Limited profile. This person will be unable to receive direct/personal notifications from you.'] = 'Ограниченный профиль. Этот человек не сможет получить прямые / личные уведомления от вас.';
$a->strings['Unable to retrieve contact information.'] = 'Невозможно получить контактную информацию.';
$a->strings['l F d, Y \@ g:i A'] = 'l F d, Y \@ g:i A';
$a->strings['Starts:'] = 'Начало:';
$a->strings['Finishes:'] = 'Окончание:';
$a->strings['all-day'] = 'Весь день';
@ -1031,6 +980,7 @@ $a->strings['l, F j'] = 'l, j F';
$a->strings['Edit event'] = 'Редактировать мероприятие';
$a->strings['Duplicate event'] = 'Дубликат события';
$a->strings['Delete event'] = 'Удалить событие';
$a->strings['l F d, Y \@ g:i A'] = 'l F d, Y \@ g:i A';
$a->strings['D g:i A'] = 'D g:i A';
$a->strings['g:i A'] = 'g:i A';
$a->strings['Show map'] = 'Показать карту';
@ -1068,9 +1018,26 @@ $a->strings['[No description]'] = '[без описания]';
$a->strings['Event Reminders'] = 'Напоминания о мероприятиях';
$a->strings['Upcoming events the next 7 days:'] = 'События на ближайшие 7 дней:';
$a->strings['OpenWebAuth: %1$s welcomes %2$s'] = 'OpenWebAuth: %1$s приветствует %2$s';
$a->strings['Storage base path'] = 'Корневой каталог хранилища';
$a->strings['Folder where uploaded files are saved. For maximum security, This should be a path outside web server folder tree'] = 'Каталог, куда сохраняются загруженные файлы. Для максимальной безопасности этот каталог должен быть размещён вне каталогов веб-сервера.';
$a->strings['Enter a valid existing folder'] = 'Введите путь к существующему каталогу';
$a->strings['Hometown:'] = 'Родной город:';
$a->strings['Marital Status:'] = 'Семейное положение:';
$a->strings['With:'] = 'Вместе:';
$a->strings['Since:'] = 'С:';
$a->strings['Sexual Preference:'] = 'Сексуальные предпочтения:';
$a->strings['Political Views:'] = 'Политические взгляды:';
$a->strings['Religious Views:'] = 'Религиозные взгляды:';
$a->strings['Likes:'] = 'Нравится:';
$a->strings['Dislikes:'] = 'Не нравится:';
$a->strings['Title/Description:'] = 'Заголовок / Описание:';
$a->strings['Summary'] = 'Резюме';
$a->strings['Musical interests'] = 'Музыкальные интересы';
$a->strings['Books, literature'] = 'Книги, литература';
$a->strings['Television'] = 'Телевидение';
$a->strings['Film/dance/culture/entertainment'] = 'Кино / танцы / культура / развлечения';
$a->strings['Hobbies/Interests'] = 'Хобби / Интересы';
$a->strings['Love/romance'] = 'Любовь / романтика';
$a->strings['Work/employment'] = 'Работа / занятость';
$a->strings['School/education'] = 'Школа / образование';
$a->strings['Contact information and Social Networks'] = 'Контактная информация и социальные сети';
$a->strings['SERIOUS ERROR: Generation of security keys failed.'] = 'СЕРЬЕЗНАЯ ОШИБКА: генерация ключей безопасности не удалась.';
$a->strings['Login failed'] = 'Вход не удался';
$a->strings['Not enough information to authenticate'] = 'Недостаточно информации для входа';
@ -1110,6 +1077,7 @@ $a->strings['An error occurred creating your default profile. Please try again.'
$a->strings['An error occurred creating your self contact. Please try again.'] = 'При создании вашего контакта возникла проблема. Пожалуйста, попробуйте ещё раз.';
$a->strings['Friends'] = 'Друзья';
$a->strings['An error occurred creating your default contact group. Please try again.'] = 'При создании группы контактов по-умолчанию возникла ошибка. Пожалуйста, попробуйте ещё раз.';
$a->strings['Profile Photos'] = 'Фотографии профиля';
$a->strings['
Dear %1$s,
the administrator of %2$s has set up an account for you.'] = '
@ -1542,7 +1510,6 @@ $a->strings['Blog Account'] = 'Аккаунт блога';
$a->strings['Private Forum Account'] = 'Закрытый форум';
$a->strings['Message queues'] = 'Очереди сообщений';
$a->strings['Server Settings'] = 'Настройки сервера';
$a->strings['Summary'] = 'Резюме';
$a->strings['Registered users'] = 'Зарегистрированные пользователи';
$a->strings['Pending registrations'] = 'Ожидающие регистрации';
$a->strings['Version'] = 'Версия';
@ -2223,6 +2190,58 @@ $a->strings['%1$s shared the post %2$s from %3$s'] = '%1$s поделился з
$a->strings['%1$s shared a post from %3$s'] = '%1$s поделился записью от %3$s';
$a->strings['%1$s shared the post %2$s'] = '%1$s поделился записью %2$s';
$a->strings['%1$s shared a post'] = '%1$s поделился записью';
$a->strings['[Friendica:Notify]'] = '[Friendica]';
$a->strings['%s New mail received at %s'] = '%s Новая почта получена в %s';
$a->strings['%1$s sent you a new private message at %2$s.'] = '%1$s отправил вам новое личное сообщение на %2$s.';
$a->strings['a private message'] = 'личное сообщение';
$a->strings['%1$s sent you %2$s.'] = '%1$s послал вам %2$s.';
$a->strings['Please visit %s to view and/or reply to your private messages.'] = 'Пожалуйста, посетите %s для просмотра и/или ответа на личные сообщения.';
$a->strings['%1$s commented on %2$s\'s %3$s %4$s'] = '%1$s прокомментировал(а) %2$s %3$s %4$s';
$a->strings['%1$s commented on your %2$s %3$s'] = '%1$s прокомментировал(а) ваш %2$s %3$s';
$a->strings['%1$s commented on their %2$s %3$s'] = '%1$s прокомментировал(а) свой %2$s %3$s';
$a->strings['%1$s Comment to conversation #%2$d by %3$s'] = '%1$s Комментариев к разговору #%2$d от %3$s';
$a->strings['%s commented on an item/conversation you have been following.'] = '%s оставил комментарий к элементу/беседе, за которой вы следите.';
$a->strings['Please visit %s to view and/or reply to the conversation.'] = 'Пожалуйста посетите %s для просмотра и/или ответа в беседу.';
$a->strings['%s %s posted to your profile wall'] = '%s %s размещены на стене вашего профиля';
$a->strings['%1$s posted to your profile wall at %2$s'] = '%1$s написал на вашей стене на %2$s';
$a->strings['%1$s posted to [url=%2$s]your wall[/url]'] = '%1$s написал на [url=%2$s]вашей стене[/url]';
$a->strings['%1$s %2$s poked you'] = '%1$s %2$s продвинул тебя';
$a->strings['%1$s poked you at %2$s'] = '%1$s потыкал вас на %2$s';
$a->strings['%1$s [url=%2$s]poked you[/url].'] = '%1$s [url=%2$s]потыкал вас[/url].';
$a->strings['%s Introduction received'] = '%s Входящих получено';
$a->strings['You\'ve received an introduction from \'%1$s\' at %2$s'] = 'Вы получили запрос от \'%1$s\' на %2$s';
$a->strings['You\'ve received [url=%1$s]an introduction[/url] from %2$s.'] = 'Вы получили [url=%1$s]запрос[/url] от %2$s.';
$a->strings['You may visit their profile at %s'] = 'Вы можете посмотреть его профиль здесь %s';
$a->strings['Please visit %s to approve or reject the introduction.'] = 'Посетите %s для подтверждения или отказа запроса.';
$a->strings['%s A new person is sharing with you'] = '%s Новый человек поделился с Вами';
$a->strings['%1$s is sharing with you at %2$s'] = '%1$s делится с вами на %2$s';
$a->strings['%s You have a new follower'] = '%s У Вас новый подписчик';
$a->strings['You have a new follower at %2$s : %1$s'] = 'У вас новый подписчик на %2$s : %1$s';
$a->strings['%s Friend suggestion received'] = '%s Получено дружеское приглашение';
$a->strings['You\'ve received a friend suggestion from \'%1$s\' at %2$s'] = 'Вы получили предложение дружбы от \'%1$s\' на %2$s';
$a->strings['You\'ve received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s.'] = 'У вас [url=%1$s]новое предложение дружбы[/url] для %2$s от %3$s.';
$a->strings['Name:'] = 'Имя:';
$a->strings['Photo:'] = 'Фото:';
$a->strings['Please visit %s to approve or reject the suggestion.'] = 'Пожалуйста, посетите %s для подтверждения, или отказа запроса.';
$a->strings['%s Connection accepted'] = '%s Соединение принято';
$a->strings['\'%1$s\' has accepted your connection request at %2$s'] = '\'%1$s\' принял соединение с вами на %2$s';
$a->strings['%2$s has accepted your [url=%1$s]connection request[/url].'] = '%2$s принял ваше [url=%1$s]предложение о соединении[/url].';
$a->strings['You are now mutual friends and may exchange status updates, photos, and email without restriction.'] = 'Вы теперь взаимные друзья и можете обмениваться статусами, фотографиями и письмами без ограничений.';
$a->strings['Please visit %s if you wish to make any changes to this relationship.'] = 'Посетите %s если вы хотите сделать изменения в этом отношении.';
$a->strings['\'%1$s\' has chosen to accept you a fan, which restricts some forms of communication - such as private messaging and some profile interactions. If this is a celebrity or community page, these settings were applied automatically.'] = '%1$s решил принять приглашение и пометил вас как фаната, что запрещает некоторые формы общения - например, личные сообщения и некоторые действия с профилем. Если эта страница знаменитости или сообщества, то эти настройки были применены автоматически.';
$a->strings['\'%1$s\' may choose to extend this into a two-way or more permissive relationship in the future.'] = '%1$s может расширить взаимоотношения до более мягких в будущем.';
$a->strings['Please visit %s if you wish to make any changes to this relationship.'] = 'Посетите %s если вы хотите сделать изменения в этом отношении.';
$a->strings['registration request'] = 'запрос регистрации';
$a->strings['You\'ve received a registration request from \'%1$s\' at %2$s'] = 'Вы получили запрос на регистрацию от \'%1$s\' на %2$s';
$a->strings['You\'ve received a [url=%1$s]registration request[/url] from %2$s.'] = 'Вы получили [url=%1$s]запрос регистрации[/url] от %2$s.';
$a->strings['Full Name: %s
Site Location: %s
Login Name: %s (%s)'] = 'Полное имя: %s
Расположение: %s
Имя для входа: %s (%s)';
$a->strings['Please visit %s to approve or reject the request.'] = 'Пожалуйста, посетите %s чтобы подтвердить или отвергнуть запрос.';
$a->strings['%s %s tagged you'] = '%s %s отметил(и) Вас';
$a->strings['%s %s shared a new post'] = '%s %s поделился(-ась) новым сообщением';
$a->strings['This message was sent to you by %s, a member of the Friendica social network.'] = 'Это сообщение было отправлено вам %s, участником социальной сети Friendica.';
$a->strings['You may visit them online at %s'] = 'Вы можете посетить их в онлайне на %s';
$a->strings['Please contact the sender by replying to this post if you do not wish to receive these messages.'] = 'Пожалуйста, свяжитесь с отправителем, ответив на это сообщение, если вы не хотите получать эти сообщения.';
@ -2281,25 +2300,6 @@ $a->strings['%s is now following %s.'] = '%s теперь подписан на
$a->strings['following'] = 'следует';
$a->strings['%s stopped following %s.'] = '%s отписался от %s.';
$a->strings['stopped following'] = 'отписка от';
$a->strings['Hometown:'] = 'Родной город:';
$a->strings['Marital Status:'] = 'Семейное положение:';
$a->strings['With:'] = 'Вместе:';
$a->strings['Since:'] = 'С:';
$a->strings['Sexual Preference:'] = 'Сексуальные предпочтения:';
$a->strings['Political Views:'] = 'Политические взгляды:';
$a->strings['Religious Views:'] = 'Религиозные взгляды:';
$a->strings['Likes:'] = 'Нравится:';
$a->strings['Dislikes:'] = 'Не нравится:';
$a->strings['Title/Description:'] = 'Заголовок / Описание:';
$a->strings['Musical interests'] = 'Музыкальные интересы';
$a->strings['Books, literature'] = 'Книги, литература';
$a->strings['Television'] = 'Телевидение';
$a->strings['Film/dance/culture/entertainment'] = 'Кино / танцы / культура / развлечения';
$a->strings['Hobbies/Interests'] = 'Хобби / Интересы';
$a->strings['Love/romance'] = 'Любовь / романтика';
$a->strings['Work/employment'] = 'Работа / занятость';
$a->strings['School/education'] = 'Школа / образование';
$a->strings['Contact information and Social Networks'] = 'Контактная информация и социальные сети';
$a->strings['Login failed.'] = 'Войти не удалось.';
$a->strings['Login failed. Please check your credentials.'] = 'Ошибка входа. Пожалуйста, проверьте данные для входа.';
$a->strings['Welcome %s'] = 'Добро пожаловать, %s';