mirror of
https://github.com/friendica/friendica
synced 2024-12-23 02:00:17 +00:00
Merge remote-tracking branch 'upstream/develop' into logger-json
This commit is contained in:
commit
2785e4dab8
9 changed files with 1607 additions and 1193 deletions
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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']));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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."
|
||||
|
||||
|
|
|
@ -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
|
@ -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';
|
||||
|
|
Loading…
Reference in a new issue