diff --git a/CHANGELOG b/CHANGELOG index 96638b7e0..41929396c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,6 @@ Version 2022.05 (unreleased) Friendica Core + Breaking: The distribution of _private forums_ was moved to ActivityPub, making them incompatible with older versions of Friendica [annando] Friendica Addons diff --git a/composer.json b/composer.json index d8d93b63f..cc3a0db5f 100644 --- a/composer.json +++ b/composer.json @@ -51,7 +51,7 @@ "pragmarx/recovery": "^0.2", "psr/container": "^1.0", "seld/cli-prompt": "^1.0", - "smarty/smarty": "^3.1", + "smarty/smarty": "^4", "ua-parser/uap-php": "^3.9", "xemlock/htmlpurifier-html5": "^0.1.11", "fxp/composer-asset-plugin": "^1.4", diff --git a/composer.lock b/composer.lock index c0e14fe52..fa2018825 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3d221e30c9cb7e3f34d8d8141b6fea6c", + "content-hash": "f5922f03b367e68a5930df6ed80c5c2f", "packages": [ { "name": "asika/simple-console", @@ -1152,6 +1152,24 @@ "html", "markdown" ], + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://www.patreon.com/colinodell", + "type": "patreon" + } + ], "time": "2020-07-01T00:34:03+00:00" }, { @@ -1481,6 +1499,12 @@ "mobile detector", "php mobile detect" ], + "funding": [ + { + "url": "https://github.com/serbanghita", + "type": "github" + } + ], "time": "2021-02-19T21:22:57+00:00" }, { @@ -1553,6 +1577,16 @@ "logging", "psr-3" ], + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], "time": "2021-05-28T08:32:12+00:00" }, { @@ -3647,29 +3681,29 @@ }, { "name": "smarty/smarty", - "version": "v3.1.43", + "version": "v4.1.0", "source": { "type": "git", "url": "https://github.com/smarty-php/smarty.git", - "reference": "273f7e00fec034f6d61112552e9caf08d19565b7" + "reference": "9e0536de18b53ba193364291ef0303b0ab9903e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/smarty-php/smarty/zipball/273f7e00fec034f6d61112552e9caf08d19565b7", - "reference": "273f7e00fec034f6d61112552e9caf08d19565b7", + "url": "https://api.github.com/repos/smarty-php/smarty/zipball/9e0536de18b53ba193364291ef0303b0ab9903e1", + "reference": "9e0536de18b53ba193364291ef0303b0ab9903e1", "shasum": "" }, "require": { - "php": ">=5.2" + "php": "^7.1 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^7.5 || ^6.5 || ^5.7 || ^4.8", + "phpunit/phpunit": "^8.5 || ^7.5", "smarty/smarty-lexer": "^3.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1.x-dev" + "dev-master": "4.0.x-dev" } }, "autoload": { @@ -3693,14 +3727,18 @@ { "name": "Rodney Rehm", "email": "rodney.rehm@medialize.de" + }, + { + "name": "Simon Wisselink", + "homepage": "https://www.iwink.nl/" } ], "description": "Smarty - the compiling PHP template engine", - "homepage": "http://www.smarty.net", + "homepage": "https://smarty-php.github.io/smarty/", "keywords": [ "templating" ], - "time": "2022-01-10T09:52:40+00:00" + "time": "2022-02-06T20:34:27+00:00" }, { "name": "spomky-labs/base64url", @@ -3751,6 +3789,16 @@ "safe", "url" ], + "funding": [ + { + "url": "https://github.com/Spomky", + "type": "github" + }, + { + "url": "https://www.patreon.com/FlorentMorselli", + "type": "patreon" + } + ], "time": "2020-11-03T09:10:25+00:00" }, { @@ -4613,6 +4661,20 @@ "constructor", "instantiate" ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], "time": "2020-11-10T18:47:58+00:00" }, { @@ -4822,6 +4884,12 @@ "object", "object graph" ], + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], "time": "2020-11-13T09:40:50+00:00" }, { @@ -6547,6 +6615,20 @@ "polyfill", "portable" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-02-19T12:13:01+00:00" }, { @@ -6587,6 +6669,12 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], "time": "2021-07-28T10:34:58+00:00" }, { diff --git a/database.sql b/database.sql index ea129109d..a36adad01 100644 --- a/database.sql +++ b/database.sql @@ -1,6 +1,6 @@ -- ------------------------------------------ -- Friendica 2022.05-dev (Siberian Iris) --- DB_UPDATE_VERSION 1451 +-- DB_UPDATE_VERSION 1452 -- ------------------------------------------ @@ -1277,7 +1277,7 @@ CREATE TABLE IF NOT EXISTS `post-thread-user` ( `wall` boolean NOT NULL DEFAULT '0' COMMENT 'This item was posted to the wall of uid', `mention` boolean NOT NULL DEFAULT '0' COMMENT '', `pubmail` boolean NOT NULL DEFAULT '0' COMMENT '', - `forum_mode` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '', + `forum_mode` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'Deprecated', `contact-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'contact.id', `unseen` boolean NOT NULL DEFAULT '1' COMMENT 'post has not been seen', `hidden` boolean NOT NULL DEFAULT '0' COMMENT 'Marker to hide the post from the user', @@ -1612,7 +1612,6 @@ CREATE VIEW `post-user-view` AS SELECT `post-user`.`deleted` AS `deleted`, `post-user`.`origin` AS `origin`, `post-thread-user`.`origin` AS `parent-origin`, - `post-thread-user`.`forum_mode` AS `forum_mode`, `post-thread-user`.`mention` AS `mention`, `post-user`.`global` AS `global`, `post-user`.`network` AS `network`, @@ -1773,7 +1772,6 @@ CREATE VIEW `post-thread-user-view` AS SELECT `post-thread-user`.`unseen` AS `unseen`, `post-user`.`deleted` AS `deleted`, `post-thread-user`.`origin` AS `origin`, - `post-thread-user`.`forum_mode` AS `forum_mode`, `post-thread-user`.`mention` AS `mention`, `post-user`.`global` AS `global`, `post-thread-user`.`network` AS `network`, diff --git a/doc/database/db_post-thread-user.md b/doc/database/db_post-thread-user.md index 7307dc78d..0b7483741 100644 --- a/doc/database/db_post-thread-user.md +++ b/doc/database/db_post-thread-user.md @@ -24,7 +24,7 @@ Fields | wall | This item was posted to the wall of uid | boolean | NO | | 0 | | | mention | | boolean | NO | | 0 | | | pubmail | | boolean | NO | | 0 | | -| forum_mode | | tinyint unsigned | NO | | 0 | | +| forum_mode | Deprecated | tinyint unsigned | NO | | 0 | | | contact-id | contact.id | int unsigned | NO | | 0 | | | unseen | post has not been seen | boolean | NO | | 1 | | | hidden | Marker to hide the post from the user | boolean | NO | | 0 | | diff --git a/mod/display.php b/mod/display.php index 118645819..da41c8656 100644 --- a/mod/display.php +++ b/mod/display.php @@ -23,7 +23,6 @@ use Friendica\App; use Friendica\Content\Text\BBCode; use Friendica\Content\Widget; use Friendica\Core\Logger; -use Friendica\Core\Protocol; use Friendica\Core\Renderer; use Friendica\Core\Session; use Friendica\Database\DBA; @@ -36,6 +35,7 @@ use Friendica\Module\ActivityPub\Objects; use Friendica\Network\HTTPException; use Friendica\Protocol\ActivityPub; use Friendica\Protocol\DFRN; +use Friendica\Protocol\Diaspora; function display_init(App $a) { @@ -108,55 +108,23 @@ function display_init(App $a) $item = $parent ?: $item; } - $profiledata = display_fetchauthor($item); - - DI::page()['aside'] = Widget\VCard::getHTML($profiledata); + DI::page()['aside'] = Widget\VCard::getHTML(display_fetchauthor($item)); } function display_fetchauthor($item) { - $profiledata = Contact::getByURLForUser($item['author-link'], local_user()); - - // Check for a repeated message - $shared = Item::getShareArray($item); - if (!empty($shared) && empty($shared['comment'])) { - $profiledata = [ - 'uid' => 0, - 'id' => -1, - 'nickname' => '', - 'name' => '', - 'picdate' => '', - 'photo' => '', - 'url' => '', - 'network' => '', - ]; - - if (!empty($shared['author'])) { - $profiledata['name'] = $shared['author']; - } - + if (Diaspora::isReshare($item['body'], true)) { + $shared = Item::getShareArray($item); if (!empty($shared['profile'])) { - $profiledata['url'] = $shared['profile']; + $contact = Contact::getByURLForUser($shared['profile'], local_user()); } - - if (!empty($shared['avatar'])) { - $profiledata['photo'] = $shared['avatar']; - } - - $profiledata['nickname'] = $profiledata['name']; - $profiledata['network'] = Protocol::PHANTOM; - - $profiledata['address'] = ''; - $profiledata['about'] = ''; - - $profiledata = Contact::getByURLForUser($profiledata['url'], local_user()) ?: $profiledata; } - if (!empty($profiledata['photo'])) { - $profiledata['photo'] = DI::baseUrl()->remove($profiledata['photo']); + if (empty($contact)) { + $contact = Contact::getById($item['author-id']); } - return $profiledata; + return $contact; } function display_content(App $a, $update = false, $update_uid = 0) diff --git a/mod/item.php b/mod/item.php index 7cf2e53d4..bc35282e3 100644 --- a/mod/item.php +++ b/mod/item.php @@ -29,7 +29,6 @@ */ use Friendica\App; -use Friendica\Content\Item as ItemHelper; use Friendica\Content\PageInfo; use Friendica\Content\Text\BBCode; use Friendica\Core\Hook; @@ -40,11 +39,11 @@ use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBA; use Friendica\DI; -use Friendica\Model\APContact; use Friendica\Model\Attach; use Friendica\Model\Contact; use Friendica\Model\Conversation; use Friendica\Model\FileTag; +use Friendica\Model\Group; use Friendica\Model\Item; use Friendica\Model\ItemURI; use Friendica\Model\Notification; @@ -404,7 +403,7 @@ function item_post(App $a) { } $inform .= 'cid:' . $contact['id']; - if (!$toplevel_item_id || empty($contact['cid']) || ($contact['contact-type'] != Contact::TYPE_COMMUNITY)) { + if ($toplevel_item_id || empty($contact['cid']) || ($contact['contact-type'] != Contact::TYPE_COMMUNITY)) { continue; } @@ -437,26 +436,15 @@ function item_post(App $a) { $postopts = ''; } - if (!$private_forum) { + $str_contact_deny = ''; + $str_group_deny = ''; + + if ($private_forum) { + $str_contact_allow = '<' . $private_id . '>'; + $str_group_allow = '<' . Group::getIdForForum($forum_contact['id']) . '>'; + } else { $str_contact_allow = ''; $str_group_allow = ''; - $str_contact_deny = ''; - $str_group_deny = ''; - } - - if ($private_forum || !APContact::getByURL($forum_contact['url'])) { - $str_group_allow = ''; - $str_contact_deny = ''; - $str_group_deny = ''; - if ($private_forum) { - $str_contact_allow = '<' . $private_id . '>'; - } else { - $str_contact_allow = ''; - } - $contact_id = $private_id; - $contact_record = $forum_contact; - $_REQUEST['origin'] = false; - $wall = 0; } } diff --git a/mod/settings.php b/mod/settings.php index 111e52330..2c9dcac12 100644 --- a/mod/settings.php +++ b/mod/settings.php @@ -31,6 +31,7 @@ use Friendica\Core\Worker; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Group; +use Friendica\Model\Item; use Friendica\Model\Notification; use Friendica\Model\Profile; use Friendica\Model\User; @@ -239,7 +240,6 @@ function settings_post(App $a) $allow_location = ((!empty($_POST['allow_location']) && (intval($_POST['allow_location']) == 1)) ? 1: 0); $publish = ((!empty($_POST['profile_in_directory']) && (intval($_POST['profile_in_directory']) == 1)) ? 1: 0); $net_publish = ((!empty($_POST['profile_in_netdirectory']) && (intval($_POST['profile_in_netdirectory']) == 1)) ? 1: 0); - $old_visibility = ((!empty($_POST['visibility']) && (intval($_POST['visibility']) == 1)) ? 1 : 0); $account_type = ((!empty($_POST['account-type']) && (intval($_POST['account-type']))) ? intval($_POST['account-type']) : 0); $page_flags = ((!empty($_POST['page-flags']) && (intval($_POST['page-flags']))) ? intval($_POST['page-flags']) : 0); $blockwall = ((!empty($_POST['blockwall']) && (intval($_POST['blockwall']) == 1)) ? 0: 1); // this setting is inverted! @@ -361,16 +361,21 @@ function settings_post(App $a) DI::pConfig()->set(local_user(), 'system', 'unlisted', $unlisted); DI::pConfig()->set(local_user(), 'system', 'accessible-photos', $accessiblephotos); + if ($account_type == User::ACCOUNT_TYPE_COMMUNITY) { + $str_group_allow = ''; + $str_contact_allow = ''; + $str_group_deny = ''; + $str_contact_deny = ''; + + DI::pConfig()->set(local_user(), 'system', 'unlisted', true); + + $blockwall = true; + $blocktags = true; + $hide_friends = true; + } + if ($page_flags == User::PAGE_FLAGS_PRVGROUP) { - $hidewall = 1; - if (!$str_contact_allow && !$str_group_allow && !$str_contact_deny && !$str_group_deny) { - if ($def_gid) { - info(DI::l10n()->t('Private forum has no privacy permissions. Using default privacy group.')); - $str_group_allow = '<' . $def_gid . '>'; - } else { - notice(DI::l10n()->t('Private forum has no privacy permissions and no default privacy group.')); - } - } + $str_group_allow = '<' . Group::FOLLOWERS . '>'; } $fields = ['username' => $username, 'email' => $email, 'timezone' => $timezone, @@ -570,7 +575,17 @@ function settings_content(App $a) '$ostat_enabled' => $ostat_enabled, '$general_settings' => DI::l10n()->t('General Social Media Settings'), - '$accept_only_sharer' => ['accept_only_sharer', DI::l10n()->t('Accept only top level posts by contacts you follow'), $accept_only_sharer, DI::l10n()->t('The system does an auto completion of threads when a comment arrives. This has got the side effect that you can receive posts that had been started by a non-follower but had been commented by someone you follow. This setting deactivates this behaviour. When activated, you strictly only will receive posts from people you really do follow.')], + '$accept_only_sharer' => [ + 'accept_only_sharer', + DI::l10n()->t('Followed content scope'), + $accept_only_sharer, + DI::l10n()->t('By default, conversations in which your follows participated but didn\'t start will be shown in your timeline. You can turn this behavior off, or expand it to the conversations in which your follows liked a post.'), + [ + Item::COMPLETION_NONE => DI::l10n()->t('Only conversations my follows started'), + Item::COMPLETION_COMMENT => DI::l10n()->t('Conversations my follows started or commented on (default)'), + Item::COMPLETION_LIKE => DI::l10n()->t('Any conversation my follows interacted with, including likes'), + ] + ], '$enable_cw' => ['enable_cw', DI::l10n()->t('Enable Content Warning'), $enable_cw, DI::l10n()->t('Users on networks like Mastodon or Pleroma are able to set a content warning field which collapse their post by default. This enables the automatic collapsing instead of setting the content warning as the post title. Doesn\'t affect any other content filtering you eventually set up.')], '$enable_smart_shortening' => ['enable_smart_shortening', DI::l10n()->t('Enable intelligent shortening'), $enable_smart_shortening, DI::l10n()->t('Normally the system tries to find the best link to add to shortened posts. If disabled, every shortened post will always point to the original friendica post.')], '$simple_shortening' => ['simple_shortening', DI::l10n()->t('Enable simple text shortening'), $simple_shortening, DI::l10n()->t('Normally the system shortens posts at the next line feed. If this option is enabled then the system will shorten the text at the maximum character limit.')], @@ -756,7 +771,7 @@ function settings_content(App $a) '$allowloc' => ['allow_location', DI::l10n()->t('Use Browser Location:'), ($user['allow_location'] == 1), ''], '$h_prv' => DI::l10n()->t('Security and Privacy Settings'), - '$visibility' => $profile['net-publish'], + '$is_community' => ($user['account-type'] == User::ACCOUNT_TYPE_COMMUNITY), '$maxreq' => ['maxreq', DI::l10n()->t('Maximum Friend Requests/Day:'), $maxreq , DI::l10n()->t("\x28to prevent spam abuse\x29")], '$profile_in_dir' => $profile_in_dir, '$profile_in_net_dir' => ['profile_in_netdirectory', DI::l10n()->t('Allow your profile to be searchable globally?'), $profile['net-publish'], DI::l10n()->t("Activate this setting if you want others to easily find and follow you. Your profile will be searchable on remote systems. This setting also determines whether Friendica will inform search engines that your profile should be indexed or not.") . $net_pub_desc], diff --git a/src/Console/Config.php b/src/Console/Config.php index 0a38f607f..e32983a68 100644 --- a/src/Console/Config.php +++ b/src/Console/Config.php @@ -151,7 +151,7 @@ HELP; $this->out("{$cat}.{$key}[{$k}] => " . (is_array($v) ? implode(', ', $v) : $v)); } } else { - $this->out("{$cat}.{$key} => " . $value); + $this->out("{$cat}.{$key} => " . ($value ?? 'NULL')); } } diff --git a/src/Content/Widget.php b/src/Content/Widget.php index b5ccd6f14..863399287 100644 --- a/src/Content/Widget.php +++ b/src/Content/Widget.php @@ -318,23 +318,20 @@ class Widget /** * Return categories widget * - * @param string $baseurl baseurl - * @param string $selected optional, default empty + * @param int $uid Id of the user owning the categories + * @param string $baseurl Base page URL + * @param string $selected Selected category * @return string|void * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - public static function categories($baseurl, $selected = '') + public static function categories(int $uid, string $baseurl, string $selected = '') { - $a = DI::app(); - - $uid = intval($a->getProfileOwner()); - if (!Feature::isEnabled($uid, 'categories')) { return ''; } $terms = array(); - foreach (Post\Category::getArray(local_user(), Post\Category::CATEGORY) as $savedFolderName) { + foreach (Post\Category::getArray($uid, Post\Category::CATEGORY) as $savedFolderName) { $terms[] = ['ref' => $savedFolderName, 'name' => $savedFolderName]; } diff --git a/src/Core/Cache/Type/RedisCache.php b/src/Core/Cache/Type/RedisCache.php index a58936cfc..a3a5cf7c8 100644 --- a/src/Core/Cache/Type/RedisCache.php +++ b/src/Core/Cache/Type/RedisCache.php @@ -59,13 +59,13 @@ class RedisCache extends AbstractCache implements ICanCacheInMemory $redis_pw = $config->get('system', 'redis_password'); $redis_db = $config->get('system', 'redis_db', 0); - if (isset($redis_port) && !@$this->redis->connect($redis_host, $redis_port)) { + if (!empty($redis_port) && !@$this->redis->connect($redis_host, $redis_port)) { throw new CachePersistenceException('Expected Redis server at ' . $redis_host . ':' . $redis_port . ' isn\'t available'); } elseif (!@$this->redis->connect($redis_host)) { throw new CachePersistenceException('Expected Redis server at ' . $redis_host . ' isn\'t available'); } - if (isset($redis_pw) && !$this->redis->auth($redis_pw)) { + if (!empty($redis_pw) && !$this->redis->auth($redis_pw)) { throw new CachePersistenceException('Cannot authenticate redis server at ' . $redis_host . ':' . $redis_port); } diff --git a/src/Database/PostUpdate.php b/src/Database/PostUpdate.php index ff60fff7b..777d54196 100644 --- a/src/Database/PostUpdate.php +++ b/src/Database/PostUpdate.php @@ -25,6 +25,7 @@ use Friendica\Core\Logger; use Friendica\Core\Protocol; use Friendica\DI; use Friendica\Model\Contact; +use Friendica\Model\Conversation; use Friendica\Model\GServer; use Friendica\Model\Item; use Friendica\Model\ItemURI; @@ -33,6 +34,9 @@ use Friendica\Model\Post; use Friendica\Model\Post\Category; use Friendica\Model\Tag; use Friendica\Model\Verb; +use Friendica\Protocol\ActivityPub\Processor; +use Friendica\Protocol\ActivityPub\Receiver; +use Friendica\Util\JsonLD; use Friendica\Util\Strings; /** @@ -46,7 +50,7 @@ class PostUpdate // Needed for the helper function to read from the legacy term table const OBJECT_TYPE_POST = 1; - const VERSION = 1427; + const VERSION = 1452; /** * Calls the post update functions @@ -104,6 +108,9 @@ class PostUpdate if (!self::update1427()) { return false; } + if (!self::update1452()) { + return false; + } return true; } @@ -1012,4 +1019,70 @@ class PostUpdate return false; } + + /** + * Fill the receivers of the post via the raw source + * + * @return bool "true" when the job is done + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @throws \ImagickException + */ + private static function update1452() + { + // Was the script completed? + if (DI::config()->get('system', 'post_update_version') >= 1452) { + return true; + } + + $id = DI::config()->get('system', 'post_update_version_1452_id', 0); + + Logger::info('Start', ['uri-id' => $id]); + + $start_id = $id; + $rows = 0; + + $conversations = DBA::p("SELECT `post-view`.`uri-id`, `conversation`.`source`, `conversation`.`received` FROM `conversation` + INNER JOIN `post-view` ON `post-view`.`uri` = `conversation`.`item-uri` + WHERE NOT `source` IS NULL AND `conversation`.`protocol` = ? AND `uri-id` > ? LIMIT ?", + Conversation::PARCEL_ACTIVITYPUB, $id, 1000); + + if (DBA::errorNo() != 0) { + Logger::error('Database error', ['no' => DBA::errorNo(), 'message' => DBA::errorMessage()]); + return false; + } + + while ($conversation = DBA::fetch($conversations)) { + $id = $conversation['uri-id']; + $received = $conversation['received']; + + $raw = json_decode($conversation['source'], true); + if (empty($raw)) { + continue; + } + $activity = JsonLD::compact($raw); + + $urls = Receiver::getReceiverURL($activity); + Processor::storeReceivers($conversation['uri-id'], $urls); + + if (!empty($activity['as:object'])) { + $urls = array_merge($urls, Receiver::getReceiverURL($activity['as:object'])); + Processor::storeReceivers($conversation['uri-id'], $urls); + } + ++$rows; + } + + DBA::close($conversations); + + DI::config()->set('system', 'post_update_version_1452_id', $id); + + Logger::info('Processed', ['rows' => $rows, 'last' => $id, 'last-received' => $received]); + + if ($start_id == $id) { + DI::config()->set('system', 'post_update_version', 1452); + Logger::info('Done'); + return true; + } + + return false; + } } diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 1b39247f4..d80827c93 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -685,7 +685,7 @@ class Contact */ public static function updateSelfFromUserID($uid, $update_avatar = false) { - $fields = ['id', 'name', 'nick', 'location', 'about', 'keywords', 'avatar', 'prvkey', 'pubkey', + $fields = ['id', 'name', 'nick', 'location', 'about', 'keywords', 'avatar', 'prvkey', 'pubkey', 'manually-approve', 'xmpp', 'matrix', 'contact-type', 'forum', 'prv', 'avatar-date', 'url', 'nurl', 'unsearchable', 'photo', 'thumb', 'micro', 'header', 'addr', 'request', 'notify', 'poll', 'confirm', 'poco', 'network']; $self = DBA::selectFirst('contact', $fields, ['uid' => $uid, 'self' => true]); @@ -757,6 +757,7 @@ class Contact $fields['forum'] = $user['page-flags'] == User::PAGE_FLAGS_COMMUNITY; $fields['prv'] = $user['page-flags'] == User::PAGE_FLAGS_PRVGROUP; $fields['unsearchable'] = !$profile['net-publish']; + $fields['manually-approve'] = in_array($user['page-flags'], [User::PAGE_FLAGS_NORMAL, User::PAGE_FLAGS_PRVGROUP]); $update = false; diff --git a/src/Model/Group.php b/src/Model/Group.php index 390ed532e..fa41d2646 100644 --- a/src/Model/Group.php +++ b/src/Model/Group.php @@ -41,7 +41,7 @@ class Group public static function getByUserId($uid, $includesDeleted = false) { - $conditions = ['uid' => $uid]; + $conditions = ['uid' => $uid, 'cid' => null]; if (!$includesDeleted) { $conditions['deleted'] = false; @@ -310,6 +310,68 @@ class Group return DBA::delete('group_member', ['gid' => $gid, 'contact-id' => $cid]); } + /** + * Adds contacts to a group + * + * @param int $gid + * @param array $contacts + * @throws \Exception + */ + public static function addMembers(int $gid, array $contacts) + { + if (!$gid || !$contacts) { + return false; + } + + // @TODO Backward compatibility with user contacts, remove by version 2022.03 + $group = DBA::selectFirst('group', ['uid'], ['id' => $gid]); + if (empty($group)) { + throw new HTTPException\NotFoundException('Group not found.'); + } + + foreach ($contacts as $cid) { + $cdata = Contact::getPublicAndUserContactID($cid, $group['uid']); + if (empty($cdata['user'])) { + throw new HTTPException\NotFoundException('Invalid contact.'); + } + + DBA::insert('group_member', ['gid' => $gid, 'contact-id' => $cdata['user']], Database::INSERT_IGNORE); + } + } + + /** + * Removes contacts from a group + * + * @param int $gid + * @param array $contacts + * @throws \Exception + */ + public static function removeMembers(int $gid, array $contacts) + { + if (!$gid || !$contacts) { + return false; + } + + // @TODO Backward compatibility with user contacts, remove by version 2022.03 + $group = DBA::selectFirst('group', ['uid'], ['id' => $gid]); + if (empty($group)) { + throw new HTTPException\NotFoundException('Group not found.'); + } + + $contactIds = []; + + foreach ($contacts as $cid) { + $cdata = Contact::getPublicAndUserContactID($cid, $group['uid']); + if (empty($cdata['user'])) { + throw new HTTPException\NotFoundException('Invalid contact.'); + } + + $contactIds[] = $cdata['user']; + } + + DBA::delete('group_member', ['gid' => $gid, 'contact-id' => $contactIds]); + } + /** * Returns the combined list of contact ids from a group id list * @@ -408,7 +470,7 @@ class Group ] ]; - $stmt = DBA::select('group', [], ['deleted' => 0, 'uid' => $uid], ['order' => ['name']]); + $stmt = DBA::select('group', [], ['deleted' => false, 'uid' => $uid, 'cid' => null], ['order' => ['name']]); while ($group = DBA::fetch($stmt)) { $display_groups[] = [ 'name' => $group['name'], @@ -465,7 +527,7 @@ class Group $member_of = self::getIdsByContactId($cid); } - $stmt = DBA::select('group', [], ['deleted' => 0, 'uid' => local_user()], ['order' => ['name']]); + $stmt = DBA::select('group', [], ['deleted' => false, 'uid' => local_user(), 'cid' => null], ['order' => ['name']]); while ($group = DBA::fetch($stmt)) { $selected = (($group_id == $group['id']) ? ' group-selected' : ''); @@ -522,21 +584,19 @@ class Group } /** - * Fetch the followers of a given contact id and store them as group members + * Fetch the group id for the given contact id * * @param integer $id Contact ID + * @return integer Group IO */ - public static function getMembersForForum(int $id) { - $contact = Contact::getById($id, ['uid', 'url', 'name']); - if (empty($contact)) { - return; + public static function getIdForForum(int $id) + { + Logger::info('Get id for forum id', ['id' => $id]); + $contact = Contact::getById($id, ['uid', 'name', 'contact-type', 'manually-approve']); + if (empty($contact) || ($contact['contact-type'] != Contact::TYPE_COMMUNITY) || !$contact['manually-approve']) { + return 0; } - - $apcontact = APContact::getByURL($contact['url']); - if (empty($apcontact['followers'])) { - return; - } - + $group = DBA::selectFirst('group', ['id'], ['uid' => $contact['uid'], 'cid' => $id]); if (empty($group)) { $fields = [ @@ -549,15 +609,42 @@ class Group } else { $gid = $group['id']; } - + + return $gid; + } + + /** + * Fetch the followers of a given contact id and store them as group members + * + * @param integer $id Contact ID + */ + public static function updateMembersForForum(int $id) + { + Logger::info('Update forum members', ['id' => $id]); + + $contact = Contact::getById($id, ['uid', 'url']); + if (empty($contact)) { + return; + } + + $apcontact = APContact::getByURL($contact['url']); + if (empty($apcontact['followers'])) { + return; + } + + $gid = self::getIdForForum($id); + if (empty($gid)) { + return; + } + $group_members = DBA::selectToArray('group_member', ['contact-id'], ['gid' => $gid]); if (!empty($group_members)) { $current = array_unique(array_column($group_members, 'contact-id')); } else { $current = []; } - - foreach (ActivityPub::fetchItems($apcontact['followers']) as $follower) { + + foreach (ActivityPub::fetchItems($apcontact['followers'], $contact['uid']) as $follower) { $id = Contact::getIdForURL($follower); if (!in_array($id, $current)) { DBA::insert('group_member', ['gid' => $gid, 'contact-id' => $id]); @@ -566,7 +653,8 @@ class Group unset($current[$key]); } } - + DBA::delete('group_member', ['gid' => $gid, 'contact-id' => $current]); + Logger::info('Updated forum members', ['id' => $id, 'count' => DBA::count('group_member', ['gid' => $gid])]); } } diff --git a/src/Model/Item.php b/src/Model/Item.php index bf1f2585a..4a3b6ed58 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -74,6 +74,11 @@ class Item const PR_RELAY = 74; const PR_FETCHED = 75; + // system.accept_only_sharer setting values + const COMPLETION_NONE = 1; + const COMPLETION_COMMENT = 0; + const COMPLETION_LIKE = 2; + // Field list that is used to display the items const DISPLAY_FIELDLIST = [ 'uid', 'id', 'parent', 'guid', 'network', 'gravity', @@ -100,7 +105,7 @@ class Item 'inform', 'deleted', 'extid', 'post-type', 'post-reason', 'gravity', 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid', 'author-id', 'author-link', 'author-name', 'author-avatar', 'owner-id', 'owner-link', 'contact-uid', - 'signed_text', 'network', 'wall', 'contact-id', 'plink', 'forum_mode', 'origin', + 'signed_text', 'network', 'wall', 'contact-id', 'plink', 'origin', 'thr-parent-id', 'parent-uri-id', 'postopts', 'pubmail', 'event-created', 'event-edited', 'event-start', 'event-finish', 'event-summary', 'event-desc', 'event-location', 'event-type', @@ -114,7 +119,7 @@ class Item 'postopts', 'plink', 'resource-id', 'event-id', 'inform', 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid', 'post-type', 'post-reason', 'private', 'pubmail', 'visible', 'starred', - 'unseen', 'deleted', 'origin', 'forum_mode', 'mention', 'global', 'network', + 'unseen', 'deleted', 'origin', 'mention', 'global', 'network', 'title', 'content-warning', 'body', 'location', 'coord', 'app', 'rendered-hash', 'rendered-html', 'object-type', 'object', 'target-type', 'target', 'author-id', 'author-link', 'author-name', 'author-avatar', 'author-network', @@ -655,7 +660,7 @@ class Item $fields = ['uid', 'uri', 'parent-uri', 'id', 'deleted', 'uri-id', 'parent-uri-id', 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid', - 'wall', 'private', 'forum_mode', 'origin', 'author-id']; + 'wall', 'private', 'origin', 'author-id']; $condition = ['uri-id' => $item['thr-parent-id'], 'uid' => $item['uid']]; $params = ['order' => ['id' => false]]; $parent = Post::selectFirst($fields, $condition, $params); @@ -818,6 +823,15 @@ class Item $item['inform'] = trim($item['inform'] ?? ''); $item['file'] = trim($item['file'] ?? ''); + // Communities aren't working with the Diaspora protoccol + if (($uid != 0) && ($item['network'] == Protocol::DIASPORA)) { + $user = User::getById($uid, ['account-type']); + if ($user['account-type'] == Contact::TYPE_COMMUNITY) { + Logger::info('Community posts are not supported via Diaspora'); + return 0; + } + } + // Items cannot be stored before they happen ... if ($item['created'] > DateTimeFormat::utcNow()) { $item['created'] = DateTimeFormat::utcNow(); @@ -881,10 +895,15 @@ class Item $item['parent-uri'] = $toplevel_parent['uri']; $item['parent-uri-id'] = $toplevel_parent['uri-id']; $item['deleted'] = $toplevel_parent['deleted']; - $item['allow_cid'] = $toplevel_parent['allow_cid']; - $item['allow_gid'] = $toplevel_parent['allow_gid']; - $item['deny_cid'] = $toplevel_parent['deny_cid']; - $item['deny_gid'] = $toplevel_parent['deny_gid']; + + // Reshares have to keep their permissions to allow forums to work + if (!$item['origin'] || ($item['verb'] != Activity::ANNOUNCE)) { + $item['allow_cid'] = $toplevel_parent['allow_cid']; + $item['allow_gid'] = $toplevel_parent['allow_gid']; + $item['deny_cid'] = $toplevel_parent['deny_cid']; + $item['deny_gid'] = $toplevel_parent['deny_gid']; + } + $parent_origin = $toplevel_parent['origin']; // Don't federate received participation messages @@ -905,15 +924,6 @@ class Item $item['private'] = $toplevel_parent['private']; } - /* - * Edge case. We host a public forum that was originally posted to privately. - * The original author commented, but as this is a comment, the permissions - * weren't fixed up so it will still show the comment as private unless we fix it here. - */ - if ((intval($toplevel_parent['forum_mode']) == 1) && ($toplevel_parent['private'] != self::PUBLIC)) { - $item['private'] = self::PUBLIC; - } - // If its a post that originated here then tag the thread as "mention" if ($item['origin'] && $item['uid']) { DBA::update('post-thread-user', ['mention' => true], ['uri-id' => $item['parent-uri-id'], 'uid' => $item['uid']]); @@ -1226,8 +1236,11 @@ class Item return; } + $self_contact = Contact::selectFirst(['id'], ['uid' => $item['uid'], 'self' => true]); + $self = !empty($self_contact) ? $self_contact['id'] : 0; + $cid = Contact::getIdForURL($author['url'], $item['uid']); - if (empty($cid) || !Contact::isSharing($cid, $item['uid'])) { + if (empty($cid) || (!Contact::isSharing($cid, $item['uid']) && ($cid != $self))) { Logger::info('The resharer is not a following contact: quit', ['resharer' => $author['url'], 'uid' => $item['uid'], 'cid' => $cid]); return; } @@ -1398,7 +1411,7 @@ class Item $is_reshare = ($item['gravity'] == GRAVITY_ACTIVITY) && ($item['verb'] == Activity::ANNOUNCE); if ((($item['gravity'] == GRAVITY_PARENT) || $is_reshare) && - DI::pConfig()->get($uid, 'system', 'accept_only_sharer') && + DI::pConfig()->get($uid, 'system', 'accept_only_sharer') == self::COMPLETION_NONE && !Contact::isSharingByURL($item['author-link'], $uid) && !Contact::isSharingByURL($item['owner-link'], $uid)) { Logger::info('Contact is not a follower, thread will not be stored', ['author' => $item['author-link'], 'uid' => $uid]); @@ -1406,9 +1419,15 @@ class Item } if ((($item['gravity'] == GRAVITY_COMMENT) || $is_reshare) && !Post::exists(['uri-id' => $item['thr-parent-id'], 'uid' => $uid])) { - // Only do an auto complete with the source uid "0" to prevent privavy problems + // Fetch the origin user for the post + $origin_uid = self::GetOriginUidForUriId($item['thr-parent-id'], $uid); + if (is_null($origin_uid)) { + Logger::info('Origin item was not found', ['uid' => $uid, 'uri-id' => $item['thr-parent-id']]); + return 0; + } + $causer = $item['causer-id'] ?: $item['author-id']; - $result = self::storeForUserByUriId($item['thr-parent-id'], $uid, ['causer-id' => $causer, 'post-reason' => self::PR_FETCHED]); + $result = self::storeForUserByUriId($item['thr-parent-id'], $uid, ['causer-id' => $causer, 'post-reason' => self::PR_FETCHED], $origin_uid); Logger::info('Fetched thread parent', ['uri-id' => $item['thr-parent-id'], 'uid' => $uid, 'causer' => $causer, 'result' => $result]); } @@ -1417,6 +1436,56 @@ class Item return $stored; } + /** + * Returns the origin uid of a post if the given user is allowed to see it. + * + * @param int $uriid + * @param int $uid + * @return int + */ + private static function GetOriginUidForUriId(int $uriid, int $uid) + { + if (Post::exists(['uri-id' => $uriid, 'uid' => $uid])) { + return $uid; + } + + $post = Post::selectFirst(['uid', 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid', 'private'], ['uri-id' => $uriid, 'origin' => true]); + if (!empty($post)) { + if (in_array($post['private'], [Item::PUBLIC, Item::UNLISTED])) { + return $post['uid']; + } + + $pcid = Contact::getPublicIdByUserId($uid); + if (empty($pcid)) { + return null; + } + + foreach (Item::enumeratePermissions($post, true) as $receiver) { + if ($receiver == $pcid) { + return $post['uid']; + } + } + + return null; + } + + if (Post::exists(['uri-id' => $uriid, 'uid' => 0])) { + return 0; + } + + // When the post belongs to a a forum then all forum users are allowed to access it + foreach (Tag::getByURIId($uriid, [Tag::MENTION, Tag::EXCLUSIVE_MENTION]) as $tag) { + if (DBA::exists('contact', ['uid' => $uid, 'nurl' => Strings::normaliseLink($tag['url']), 'contact-type' => Contact::TYPE_COMMUNITY])) { + $target_uid = User::getIdForURL($tag['url']); + if (!empty($target_uid)) { + return $target_uid; + } + } + } + + return null; + } + /** * Store a public item array for the given users * @@ -1443,6 +1512,7 @@ class Item return 0; } + // Data from the "post-user" table unset($item['id']); unset($item['mention']); unset($item['starred']); @@ -1451,11 +1521,14 @@ class Item unset($item['pinned']); unset($item['ignored']); unset($item['pubmail']); - unset($item['forum_mode']); - unset($item['event-id']); unset($item['hidden']); unset($item['notification-type']); + unset($item['post-reason']); + + // Data from the "post-delivery-data" table + unset($item['postopts']); + unset($item['inform']); $item['uid'] = $uid; $item['origin'] = 0; @@ -1875,7 +1948,7 @@ class Item $owner = User::getOwnerDataById($uid); if (!DBA::isResult($owner)) { - Logger::warning('User not found, quitting.', ['uid' => $uid]); + Logger::warning('User not found, quitting here.', ['uid' => $uid]); return false; } @@ -1884,85 +1957,57 @@ class Item return false; } - $item = Post::selectFirst(self::ITEM_FIELDLIST, ['id' => $item_id]); + $item = Post::selectFirst(self::ITEM_FIELDLIST, ['id' => $item_id, 'gravity' => [GRAVITY_PARENT, GRAVITY_COMMENT], 'origin' => false]); if (!DBA::isResult($item)) { - Logger::warning('Post not found, quitting.', ['id' => $item_id]); + Logger::debug('Post is an activity or origin or not found at all, quitting here.', ['id' => $item_id]); return false; } - if ($item['wall'] || $item['origin'] || ($item['gravity'] != GRAVITY_PARENT)) { - Logger::debug('Wall item, origin item or no parent post, quitting here.', ['wall' => $item['wall'], 'origin' => $item['origin'], 'gravity' => $item['gravity'], 'id' => $item_id, 'uri-id' => $item['uri-id'], 'guid' => $item['guid']]); - return false; - } - - $tags = Tag::getByURIId($item['uri-id'], [Tag::MENTION, Tag::EXCLUSIVE_MENTION]); - foreach ($tags as $tag) { - if (Strings::compareLink($owner['url'], $tag['url'])) { - $mention = true; - Logger::info('Mention found in tag.', ['url' => $tag['url'], 'uri' => $item['uri'], 'uid' => $uid, 'id' => $item_id, 'uri-id' => $item['uri-id'], 'guid' => $item['guid']]); - } - } - - // This check can most likely be removed since we always are having the tags - if (!$mention) { - $cnt = preg_match_all('/[\@\!]\[url\=(.*?)\](.*?)\[\/url\]/ism', $item['body'], $matches, PREG_SET_ORDER); - if ($cnt) { - foreach ($matches as $mtch) { - if (Strings::compareLink($owner['url'], $mtch[1])) { - $mention = true; - Logger::notice('Mention found in body.', ['mention' => $mtch[2], 'uri' => $item['uri'], 'uid' => $uid, 'id' => $item_id, 'uri-id' => $item['uri-id'], 'guid' => $item['guid']]); - } + if ($item['gravity'] == GRAVITY_PARENT) { + $tags = Tag::getByURIId($item['uri-id'], [Tag::MENTION, Tag::EXCLUSIVE_MENTION]); + foreach ($tags as $tag) { + if (Strings::compareLink($owner['url'], $tag['url'])) { + $mention = true; + Logger::info('Mention found in tag.', ['url' => $tag['url'], 'uri' => $item['uri'], 'uid' => $uid, 'id' => $item_id, 'uri-id' => $item['uri-id'], 'guid' => $item['guid']]); } } + + if (!$mention) { + Logger::info('Top-level post without mention is deleted.', ['uri' => $item['uri'], $uid, 'id' => $item_id, 'uri-id' => $item['uri-id'], 'guid' => $item['guid']]); + Post\User::delete(['uri-id' => $item['uri-id'], 'uid' => $item['uid']]); + return true; + } + + $arr = ['item' => $item, 'user' => $owner]; + + Hook::callAll('tagged', $arr); + } else { + $tags = Tag::getByURIId($item['parent-uri-id'], [Tag::MENTION, Tag::EXCLUSIVE_MENTION]); + foreach ($tags as $tag) { + if (Strings::compareLink($owner['url'], $tag['url'])) { + $mention = true; + Logger::info('Mention found in parent tag.', ['url' => $tag['url'], 'uri' => $item['uri'], 'uid' => $uid, 'id' => $item_id, 'uri-id' => $item['uri-id'], 'guid' => $item['guid']]); + } + } + + if (!$mention) { + Logger::debug('No mentions found in parent, quitting here.', ['id' => $item_id, 'uri-id' => $item['uri-id'], 'guid' => $item['guid']]); + return false; + } } - if (!$mention) { - Logger::info('Top-level post without mention is deleted.', ['uri' => $item['uri'], $uid, 'id' => $item_id, 'uri-id' => $item['uri-id'], 'guid' => $item['guid']]); - Post\User::delete(['uri-id' => $item['uri-id'], 'uid' => $item['uid']]); - return true; - } - - $arr = ['item' => $item, 'user' => $owner]; - - Hook::callAll('tagged', $arr); - Logger::info('Community post will be distributed', ['uri' => $item['uri'], 'uid' => $uid, 'id' => $item_id, 'uri-id' => $item['uri-id'], 'guid' => $item['guid']]); - self::performActivity($item['id'], 'announce', $uid); - - /** - * All the following lines are only needed for private forums and compatibility to older systems without AP support. - * A possible way would be that the followers list of a forum would always be readable by all followers. - * So this would mean that the comment distribution could be done exactly for the intended audience. - * Or possibly we could store the receivers that had been in the "announce" message above and use this. - */ - - // also reset all the privacy bits to the forum default permissions - if ($owner['allow_cid'] || $owner['allow_gid'] || $owner['deny_cid'] || $owner['deny_gid']) { - $private = self::PRIVATE; - } elseif (DI::pConfig()->get($owner['uid'], 'system', 'unlisted')) { - $private = self::UNLISTED; + if ($owner['page-flags'] == User::PAGE_FLAGS_PRVGROUP) { + $allow_cid = ''; + $allow_gid = '<' . Group::FOLLOWERS . '>'; + $deny_cid = ''; + $deny_gid = ''; + self::performActivity($item['id'], 'announce', $uid, $allow_cid, $allow_gid, $deny_cid, $deny_gid); } else { - $private = self::PUBLIC; + self::performActivity($item['id'], 'announce', $uid); } - $permissionSet = DI::permissionSet()->selectOrCreate( - DI::permissionSetFactory()->createFromString( - $owner['uid'], - $owner['allow_cid'], - $owner['allow_gid'], - $owner['deny_cid'], - $owner['deny_gid'] - )); - - $forum_mode = ($owner['page-flags'] == User::PAGE_FLAGS_PRVGROUP) ? 2 : 1; - - $fields = ['wall' => true, 'origin' => true, 'forum_mode' => $forum_mode, 'contact-id' => $owner['id'], - 'owner-id' => Contact::getPublicIdByUserId($uid), 'private' => $private, 'psid' => $permissionSet->id]; - self::update($fields, ['id' => $item['id']]); - - Worker::add(['priority' => PRIORITY_HIGH, 'dont_fork' => true], 'Notifier', Delivery::POST, (int)$item['uri-id'], (int)$item['uid']); - Logger::info('Community post had been distributed', ['uri' => $item['uri'], 'uid' => $uid, 'id' => $item_id, 'uri-id' => $item['uri-id'], 'guid' => $item['guid']]); return false; } @@ -2325,12 +2370,17 @@ class Item * * Toggle activities as like,dislike,attend of an item * - * @param int $item_id + * @param int $item_id * @param string $verb * Activity verb. One of * like, unlike, dislike, undislike, attendyes, unattendyes, * attendno, unattendno, attendmaybe, unattendmaybe, * announce, unannouce + * @param int $uid + * @param string $allow_cid + * @param string $allow_gid + * @param string $deny_cid + * @param string $deny_gid * @return bool * @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \ImagickException @@ -2338,7 +2388,7 @@ class Item * array $arr * 'post_id' => ID of posted item */ - public static function performActivity(int $item_id, string $verb, int $uid) + public static function performActivity(int $item_id, string $verb, int $uid, string $allow_cid = null, string $allow_gid = null, string $deny_cid = null, string $deny_gid = null) { if (empty($uid)) { return false; @@ -2499,10 +2549,10 @@ class Item 'body' => $activity, 'verb' => $activity, 'object-type' => $objtype, - 'allow_cid' => $item['allow_cid'], - 'allow_gid' => $item['allow_gid'], - 'deny_cid' => $item['deny_cid'], - 'deny_gid' => $item['deny_gid'], + 'allow_cid' => $allow_cid ?? $item['allow_cid'], + 'allow_gid' => $allow_gid ?? $item['allow_gid'], + 'deny_cid' => $deny_cid ?? $item['deny_cid'], + 'deny_gid' => $deny_gid ?? $item['deny_gid'], 'visible' => 1, 'unseen' => 1, ]; @@ -3163,30 +3213,20 @@ class Item } /** - * Is the given item array a post that is sent as starting post to a forum? + * Does the given uri-id belongs to a post that is sent as starting post to a forum? * - * @param array $item - * @param array $owner + * @param int $uri_id * * @return boolean "true" when it is a forum post */ - public static function isForumPost(array $item, array $owner = []) + public static function isForumPost(int $uri_id) { - if (empty($owner)) { - $owner = User::getOwnerDataById($item['uid']); - if (empty($owner)) { - return false; + foreach (Tag::getByURIId($uri_id, [Tag::EXCLUSIVE_MENTION]) as $tag) { + if (DBA::exists('contact', ['uid' => 0, 'nurl' => Strings::normaliseLink($tag['url']), 'contact-type' => Contact::TYPE_COMMUNITY])) { + return true; } } - - if (($item['author-id'] == $item['owner-id']) || - ($owner['id'] == $item['contact-id']) || - ($item['uri-id'] != $item['parent-uri-id']) || - $item['origin']) { - return false; - } - - return Contact::isForum($item['contact-id']); + return false; } /** diff --git a/src/Model/Post/Media.php b/src/Model/Post/Media.php index 07cad9cf6..254b88115 100644 --- a/src/Model/Post/Media.php +++ b/src/Model/Post/Media.php @@ -518,7 +518,7 @@ class Media $condition = DBA::mergeConditions($condition, ['type' => $types]); } - return DBA::selectToArray('post-media', [], $condition); + return DBA::selectToArray('post-media', [], $condition, ['order' => ['id']]); } /** diff --git a/src/Model/Post/UserNotification.php b/src/Model/Post/UserNotification.php index ad7b9c490..806dfe26e 100644 --- a/src/Model/Post/UserNotification.php +++ b/src/Model/Post/UserNotification.php @@ -33,6 +33,7 @@ use Friendica\Model\Contact; use Friendica\Model\Post; use Friendica\Model\Subscription; use Friendica\Model\Tag; +use Friendica\Model\User; use Friendica\Navigation\Notifications; use Friendica\Network\HTTPException; use Friendica\Protocol\Activity; @@ -176,6 +177,16 @@ class UserNotification return; } + $user = User::getById($uid, ['account-type']); + if (in_array($user['account-type'], [User::ACCOUNT_TYPE_COMMUNITY, User::ACCOUNT_TYPE_RELAY])) { + return; + } + + $author = Contact::getById($item['author-id'], ['contact-type']); + if (empty($author)) { + return; + } + $notification_type = self::TYPE_NONE; if (self::checkShared($item, $uid)) { @@ -189,11 +200,16 @@ class UserNotification $profiles = self::getProfileForUser($uid); // Fetch all contacts for the given profiles - $contacts = []; + $contacts = []; + $iscommunity = false; - $ret = DBA::select('contact', ['id'], ['uid' => 0, 'nurl' => $profiles]); + $ret = DBA::select('contact', ['id', 'contact-type'], ['uid' => 0, 'nurl' => $profiles]); while ($contact = DBA::fetch($ret)) { $contacts[] = $contact['id']; + + if ($contact['contact-type'] == Contact::TYPE_COMMUNITY) { + $iscommunity = true; + } } DBA::close($ret); @@ -226,7 +242,7 @@ class UserNotification } } - if (self::checkDirectCommentedThread($item, $contacts)) { + if (!$iscommunity && self::checkDirectCommentedThread($item, $contacts)) { $notification_type = $notification_type | self::TYPE_DIRECT_THREAD_COMMENT; if (!$notified) { self::insertNotificationByItem(self::TYPE_DIRECT_THREAD_COMMENT, $uid, $item); diff --git a/src/Model/Tag.php b/src/Model/Tag.php index 17a68f120..cff678d60 100644 --- a/src/Model/Tag.php +++ b/src/Model/Tag.php @@ -48,10 +48,15 @@ class Tag */ const IMPLICIT_MENTION = 8; /** - * An exclusive mention transfers the ownership of the post to the target account, usually a forum. + * An exclusive mention transmits the post only to the target account without transmitting it to the followers, usually a forum. */ const EXCLUSIVE_MENTION = 9; + const TO = 10; + const CC = 11; + const BTO = 12; + const BCC = 13; + const TAG_CHARACTER = [ self::HASHTAG => '#', self::MENTION => '@', @@ -66,9 +71,8 @@ class Tag * @param integer $type * @param string $name * @param string $url - * @param boolean $probing */ - public static function store(int $uriid, int $type, string $name, string $url = '', $probing = true) + public static function store(int $uriid, int $type, string $name, string $url = '') { if ($type == self::HASHTAG) { // Trim Unicode non-word characters @@ -77,7 +81,7 @@ class Tag $tags = explode(self::TAG_CHARACTER[self::HASHTAG], $name); if (count($tags) > 1) { foreach ($tags as $tag) { - self::store($uriid, $type, $tag, $url, $probing); + self::store($uriid, $type, $tag, $url); } return; } @@ -90,7 +94,7 @@ class Tag $cid = 0; $tagid = 0; - if (in_array($type, [self::MENTION, self::EXCLUSIVE_MENTION, self::IMPLICIT_MENTION])) { + if (in_array($type, [self::MENTION, self::EXCLUSIVE_MENTION, self::IMPLICIT_MENTION, self::TO, self::CC, self::BTO, self::BCC])) { if (empty($url)) { // No mention without a contact url return; @@ -100,32 +104,13 @@ class Tag Logger::notice('Wrong scheme in url', ['url' => $url, 'callstack' => System::callstack(20)]); } - if (!$probing) { - $condition = ['nurl' => Strings::normaliseLink($url), 'uid' => 0, 'deleted' => false]; - $contact = DBA::selectFirst('contact', ['id'], $condition, ['order' => ['id']]); - if (DBA::isResult($contact)) { - $cid = $contact['id']; - Logger::info('Got id for contact url', ['cid' => $cid, 'url' => $url]); - } - - if (empty($cid)) { - $ssl_url = str_replace('http://', 'https://', $url); - $condition = ['`alias` IN (?, ?, ?) AND `uid` = ? AND NOT `deleted`', $url, Strings::normaliseLink($url), $ssl_url, 0]; - $contact = DBA::selectFirst('contact', ['id'], $condition, ['order' => ['id']]); - if (DBA::isResult($contact)) { - $cid = $contact['id']; - Logger::info('Got id for contact alias', ['cid' => $cid, 'url' => $url]); - } - } - } else { - $cid = Contact::getIdForURL($url, 0, false); - Logger::info('Got id by probing', ['cid' => $cid, 'url' => $url]); - } + $cid = Contact::getIdForURL($url, 0, false); + Logger::debug('Got id for contact', ['cid' => $cid, 'url' => $url]); if (empty($cid)) { // The contact wasn't found in the system (most likely some dead account) // We ensure that we only store a single entry by overwriting the previous name - Logger::info('Contact not found, updating tag', ['url' => $url, 'name' => $name]); + Logger::info('URL is not a known contact, updating tag', ['url' => $url, 'name' => $name]); if (!DBA::exists('tag', ['name' => substr($name, 0, 96), 'url' => $url])) { DBA::update('tag', ['name' => substr($name, 0, 96)], ['url' => $url]); } @@ -133,10 +118,12 @@ class Tag } if (empty($cid)) { - if (($type != self::HASHTAG) && !empty($url) && ($url != $name)) { - $url = strtolower($url); - } else { - $url = ''; + if (!in_array($type, [self::TO, self::CC, self::BTO, self::BCC])) { + if (($type != self::HASHTAG) && !empty($url) && ($url != $name)) { + $url = strtolower($url); + } else { + $url = ''; + } } $tagid = self::getID($name, $url); diff --git a/src/Module/ActivityPub/Objects.php b/src/Module/ActivityPub/Objects.php index c085d8683..f3a37b7da 100644 --- a/src/Module/ActivityPub/Objects.php +++ b/src/Module/ActivityPub/Objects.php @@ -70,9 +70,7 @@ class Objects extends BaseModule } } - $item = Post::selectFirst(['id', 'uid', 'origin', 'author-link', 'changed', 'private', 'psid', 'gravity', 'deleted', 'parent-uri-id'], - ['uri-id' => $itemuri['id']], ['order' => ['origin' => true]]); - + $item = Post::selectFirst([], ['uri-id' => $itemuri['id'], 'origin' => true]); if (!DBA::isResult($item)) { throw new HTTPException\NotFoundException(); } @@ -81,25 +79,17 @@ class Objects extends BaseModule if (!$validated) { $requester = HTTPSignature::getSigner('', $_SERVER); - if (!empty($requester) && $item['origin']) { - $requester_id = Contact::getIdForURL($requester, $item['uid']); - if (!empty($requester_id)) { - $permissionSets = DI::permissionSet()->selectByContactId($requester_id, $item['uid']); - $psids = array_merge($permissionSets->column('id'), [PermissionSet::PUBLIC]); - $validated = in_array($item['psid'], $psids); + if (!empty($requester)) { + $receivers = Item::enumeratePermissions($item, false); + $receivers[] = $item['contact-id']; + + $validated = in_array(Contact::getIdForURL($requester, $item['uid']), $receivers); + if (!$validated) { + $validated = in_array(Contact::getIdForURL($requester), $receivers); } } } - if ($validated) { - // Valid items are original post or posted from this node (including in the case of a forum) - $validated = ($item['origin'] || (parse_url($item['author-link'], PHP_URL_HOST) == parse_url(DI::baseUrl()->get(), PHP_URL_HOST))); - - if (!$validated && $item['deleted']) { - $validated = Post::exists(['origin' => true, 'uri-id' => $item['parent-uri-id']]); - } - } - if (!$validated) { throw new HTTPException\NotFoundException(); } diff --git a/src/Module/Api/Mastodon/Lists/Accounts.php b/src/Module/Api/Mastodon/Lists/Accounts.php index 6dcde12b7..413cacae2 100644 --- a/src/Module/Api/Mastodon/Lists/Accounts.php +++ b/src/Module/Api/Mastodon/Lists/Accounts.php @@ -36,12 +36,32 @@ class Accounts extends BaseApi { protected function delete(array $request = []) { - $this->response->unsupported(Router::DELETE, $request); + self::checkAllowedScope(self::SCOPE_WRITE); + + $request = $this->getRequest([ + 'account_ids' => [], // Array of account IDs to remove from the list + ], $request); + + if (empty($request['account_ids']) || empty($this->parameters['id'])) { + DI::mstdnError()->UnprocessableEntity(); + } + + return Group::removeMembers($this->parameters['id'], $request['account_ids']); } protected function post(array $request = []) { - $this->response->unsupported(Router::POST, $request); + self::checkAllowedScope(self::SCOPE_WRITE); + + $request = $this->getRequest([ + 'account_ids' => [], // Array of account IDs to add to the list + ], $request); + + if (empty($request['account_ids']) || empty($this->parameters['id'])) { + DI::mstdnError()->UnprocessableEntity(); + } + + return Group::addMembers($this->parameters['id'], $request['account_ids']); } /** diff --git a/src/Module/Api/Twitter/Lists/Ownership.php b/src/Module/Api/Twitter/Lists/Ownership.php index e5aca1ad5..c3ff0030b 100644 --- a/src/Module/Api/Twitter/Lists/Ownership.php +++ b/src/Module/Api/Twitter/Lists/Ownership.php @@ -56,7 +56,7 @@ class Ownership extends BaseApi BaseApi::checkAllowedScope(BaseApi::SCOPE_READ); $uid = BaseApi::getCurrentUserID(); - $groups = $this->dba->select('group', [], ['deleted' => false, 'uid' => $uid]); + $groups = $this->dba->select('group', [], ['deleted' => false, 'uid' => $uid, 'cid' => null]); // loop through all groups $lists = []; diff --git a/src/Module/Diaspora/Receive.php b/src/Module/Diaspora/Receive.php index 498d1b13e..19de0873f 100644 --- a/src/Module/Diaspora/Receive.php +++ b/src/Module/Diaspora/Receive.php @@ -93,6 +93,12 @@ class Receive extends BaseModule $importer = User::getByGuid($this->parameters['guid']); + if ($importer['account-type'] == User::ACCOUNT_TYPE_COMMUNITY) { + // Communities aren't working with the Diaspora protoccol + // We throw an "accepted" here, so that the sender doesn't repeat the delivery + throw new HTTPException\AcceptedException(); + } + $msg = $this->decodePost(false, $importer['prvkey'] ?? ''); $this->logger->info('Diaspora: Dispatching.'); diff --git a/src/Module/Photo.php b/src/Module/Photo.php index c67520b55..3d3110fd8 100644 --- a/src/Module/Photo.php +++ b/src/Module/Photo.php @@ -288,9 +288,10 @@ class Photo extends BaseModule } } - If (($contact['uid'] != 0) && empty($contact['photo']) && empty($contact['avatar'])) { + if (!empty($contact['uid']) && empty($contact['photo']) && empty($contact['avatar'])) { $contact = Contact::getByURL($contact['url'], false, ['avatar', 'photo', 'xmpp', 'addr']); } + if (!empty($contact['photo']) && !empty($contact['avatar'])) { // Fetch photo directly $resourceid = MPhoto::ridFromURI($contact['photo']); diff --git a/src/Module/Profile/Status.php b/src/Module/Profile/Status.php index 1c07281b2..bb4537d6c 100644 --- a/src/Module/Profile/Status.php +++ b/src/Module/Profile/Status.php @@ -118,7 +118,7 @@ class Status extends BaseProfile $commvisitor = $commpage && $remote_contact; DI::page()['aside'] .= Widget::postedByYear(DI::baseUrl() . '/profile/' . $profile['nickname'] . '/status', $profile['profile_uid'] ?? 0, true); - DI::page()['aside'] .= Widget::categories(DI::baseUrl() . '/profile/' . $profile['nickname'] . '/status', XML::escape($category)); + DI::page()['aside'] .= Widget::categories($profile['uid'], DI::baseUrl() . '/profile/' . $profile['nickname'] . '/status', $category); DI::page()['aside'] .= Widget::tagCloud($profile['uid']); if (Security::canWriteToUserWall($profile['uid'])) { diff --git a/src/Navigation/Notifications/Factory/Notification.php b/src/Navigation/Notifications/Factory/Notification.php index 657823834..7cc17f8fe 100644 --- a/src/Navigation/Notifications/Factory/Notification.php +++ b/src/Navigation/Notifications/Factory/Notification.php @@ -82,7 +82,7 @@ class Notification extends BaseFactory implements ICanCreateFromTableRow { $message = []; - $causer = $author = Contact::getById($Notification->actorId, ['id', 'name', 'url', 'pending']); + $causer = $author = Contact::getById($Notification->actorId, ['id', 'name', 'url', 'contact-type', 'pending']); if (empty($causer)) { $this->logger->info('Causer not found', ['contact' => $Notification->actorId]); return $message; @@ -124,7 +124,7 @@ class Notification extends BaseFactory implements ICanCreateFromTableRow } if (in_array($Notification->type, [Post\UserNotification::TYPE_COMMENT_PARTICIPATION, Post\UserNotification::TYPE_ACTIVITY_PARTICIPATION, Post\UserNotification::TYPE_SHARED])) { - $author = Contact::getById($item['author-id'], ['id', 'name', 'url']); + $author = Contact::getById($item['author-id'], ['id', 'name', 'url', 'contact-type']); if (empty($author)) { $this->logger->info('Author not found', ['author' => $item['author-id']]); return $message; diff --git a/src/Object/Api/Mastodon/ScheduledStatus.php b/src/Object/Api/Mastodon/ScheduledStatus.php index e93c1c07b..759cd6e4e 100644 --- a/src/Object/Api/Mastodon/ScheduledStatus.php +++ b/src/Object/Api/Mastodon/ScheduledStatus.php @@ -71,7 +71,7 @@ class ScheduledStatus extends BaseDataTransferObject 'media_ids' => $media_ids, 'sensitive' => null, 'spoiler_text' => $parameters['item']['title'] ?? '', - 'visibility' => $visibility[$parameters['item']['private']], + 'visibility' => $visibility[$parameters['item']['private'] ?? 1], 'scheduled_at' => $this->scheduled_at, 'poll' => null, 'idempotency' => null, diff --git a/src/Object/Post.php b/src/Object/Post.php index 0561f5506..17303bd62 100644 --- a/src/Object/Post.php +++ b/src/Object/Post.php @@ -416,12 +416,6 @@ class Post $direction = []; if (!empty($item['direction'])) { $direction = $item['direction']; - } elseif (DI::config()->get('debug', 'show_direction')) { - $conversation = DBA::selectFirst('conversation', ['direction'], ['item-uri' => $item['uri']]); - if (!empty($conversation['direction']) && in_array($conversation['direction'], [1, 2])) { - $direction_title = [1 => DI::l10n()->t('Pushed'), 2 => DI::l10n()->t('Pulled')]; - $direction = ['direction' => $conversation['direction'], 'title' => $direction_title[$conversation['direction']]]; - } } $languages = []; diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index 76f8cdb85..79d24d160 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -306,7 +306,7 @@ class Processor } else { // Store the original actor in the "causer" fields to enable the check for ignored or blocked contacts $item['causer-link'] = $item['owner-link']; - $item['causer-id'] = $item['owner-id']; + $item['causer-id'] = $item['owner-id']; Logger::info('Use actor as causer.', ['id' => $item['owner-id'], 'actor' => $item['owner-link']]); } @@ -526,6 +526,8 @@ class Processor self::storeFromBody($item); self::storeTags($item['uri-id'], $activity['tags']); + self::storeReceivers($item['uri-id'], $activity['receiver_urls'] ?? []); + $item['location'] = $activity['location']; if (!empty($activity['latitude']) && !empty($activity['longitude'])) { @@ -642,10 +644,21 @@ class Processor continue; } - if (!($item['isForum'] ?? false) && ($receiver != 0) && ($item['gravity'] == GRAVITY_PARENT) && - ($item['post-reason'] == Item::PR_BCC) && !Contact::isSharingByURL($activity['author'], $receiver)) { - Logger::info('Top level post via BCC from a non sharer, ignoring', ['uid' => $receiver, 'contact' => $item['contact-id']]); - continue; + if (!($item['isForum'] ?? false) && ($receiver != 0) && ($item['gravity'] == GRAVITY_PARENT) && !Contact::isSharingByURL($activity['author'], $receiver)) { + if ($item['post-reason'] == Item::PR_BCC) { + Logger::info('Top level post via BCC from a non sharer, ignoring', ['uid' => $receiver, 'contact' => $item['contact-id']]); + continue; + } + + if ( + !empty($activity['thread-children-type']) + && in_array($activity['thread-children-type'], Receiver::ACTIVITY_TYPES) + && DI::pConfig()->get($receiver, 'system', 'accept_only_sharer') != Item::COMPLETION_LIKE + ) { + Logger::info('Top level post from thread completion from a non sharer had been initiated via an activity, ignoring', + ['type' => $activity['thread-children-type'], 'user' => $item['uid'], 'causer' => $item['causer-link'], 'author' => $activity['author'], 'url' => $item['uri']]); + continue; + } } $is_forum = false; @@ -657,7 +670,7 @@ class Processor } } - if (!$is_forum && DI::pConfig()->get($receiver, 'system', 'accept_only_sharer', false) && ($receiver != 0) && ($item['gravity'] == GRAVITY_PARENT)) { + if (!$is_forum && DI::pConfig()->get($receiver, 'system', 'accept_only_sharer') == Item::COMPLETION_NONE && ($receiver != 0) && ($item['gravity'] == GRAVITY_PARENT)) { $skip = !Contact::isSharingByURL($activity['author'], $receiver); if ($skip && (($activity['type'] == 'as:Announce') || ($item['isForum'] ?? false))) { @@ -745,6 +758,22 @@ class Processor } } + public static function storeReceivers(int $uriid, array $receivers) + { + foreach (['as:to' => Tag::TO, 'as:cc' => Tag::CC, 'as:bto' => Tag::BTO, 'as:bcc' => Tag::BCC] as $element => $type) { + if (!empty($receivers[$element])) { + foreach ($receivers[$element] as $receiver) { + if ($receiver == ActivityPub::PUBLIC_COLLECTION) { + $name = Receiver::PUBLIC_COLLECTION; + } else { + $name = trim(parse_url($receiver, PHP_URL_PATH), '/'); + } + Tag::store($uriid, $type, $name, $receiver); + } + } + } + } + /** * Creates an mail post * @@ -887,6 +916,10 @@ class Processor $ldactivity['thread-completion'] = Contact::getIdForURL($actor); } + if (!empty($child['type'])) { + $ldactivity['thread-children-type'] = $child['type']; + } + if (!empty($relay_actor) && !self::acceptIncomingMessage($ldactivity, $object['id'])) { return ''; } diff --git a/src/Protocol/ActivityPub/Receiver.php b/src/Protocol/ActivityPub/Receiver.php index a28cc9617..e82745b75 100644 --- a/src/Protocol/ActivityPub/Receiver.php +++ b/src/Protocol/ActivityPub/Receiver.php @@ -263,7 +263,9 @@ class Receiver { $id = JsonLD::fetchElement($activity, '@id'); if (!empty($id) && !$trust_source) { - $fetched_activity = ActivityPub::fetchContent($id, $uid ?? 0); + $fetch_uid = $uid ?: self::getBestUserForActivity($activity); + + $fetched_activity = ActivityPub::fetchContent($id, $fetch_uid); if (!empty($fetched_activity)) { $object = JsonLD::compact($fetched_activity); $fetched_id = JsonLD::fetchElement($object, '@id'); @@ -295,19 +297,25 @@ class Receiver $reception_types[$data['uid']] = $data['type'] ?? self::TARGET_UNKNOWN; } + $urls = self::getReceiverURL($activity); + // When it is a delivery to a personal inbox we add that user to the receivers if (!empty($uid)) { $additional = [$uid => $uid]; $receivers = array_replace($receivers, $additional); if (empty($activity['thread-completion']) && (empty($reception_types[$uid]) || in_array($reception_types[$uid], [self::TARGET_UNKNOWN, self::TARGET_FOLLOWER, self::TARGET_ANSWER, self::TARGET_GLOBAL]))) { $reception_types[$uid] = self::TARGET_BCC; + $owner = User::getOwnerDataById($uid); + if (!empty($owner['url'])) { + $urls['as:bcc'][] = $owner['url']; + } } - } else { - // We possibly need some user to fetch private content, - // so we fetch the first out ot the list. - $uid = self::getFirstUserFromReceivers($receivers); } + // We possibly need some user to fetch private content, + // so we fetch one out of the receivers if no uid is provided. + $fetch_uid = $uid ?: self::getBestUserForActivity($activity); + $object_id = JsonLD::fetchElement($activity, 'as:object', '@id'); if (empty($object_id)) { Logger::info('No object found'); @@ -319,11 +327,11 @@ class Receiver return []; } - $object_type = self::fetchObjectType($activity, $object_id, $uid); + $object_type = self::fetchObjectType($activity, $object_id, $fetch_uid); // Fetch the activity on Lemmy "Announce" messages (announces of activities) if (($type == 'as:Announce') && in_array($object_type, array_merge(self::ACTIVITY_TYPES, ['as:Delete', 'as:Undo', 'as:Update']))) { - $data = ActivityPub::fetchContent($object_id, $uid); + $data = ActivityPub::fetchContent($object_id, $fetch_uid); if (!empty($data)) { $type = $object_type; $activity = JsonLD::compact($data); @@ -331,7 +339,7 @@ class Receiver // Some variables need to be refetched since the activity changed $actor = JsonLD::fetchElement($activity, 'as:actor', '@id'); $object_id = JsonLD::fetchElement($activity, 'as:object', '@id'); - $object_type = self::fetchObjectType($activity, $object_id, $uid); + $object_type = self::fetchObjectType($activity, $object_id, $fetch_uid); } } @@ -348,7 +356,7 @@ class Receiver // Fetch the content only on activities where this matters // We can receive "#emojiReaction" when fetching content from Hubzilla systems // Always fetch on "Announce" - $object_data = self::fetchObject($object_id, $activity['as:object'], $trust_source && ($type != 'as:Announce'), $uid); + $object_data = self::fetchObject($object_id, $activity['as:object'], $trust_source && ($type != 'as:Announce'), $fetch_uid); if (empty($object_data)) { Logger::info("Object data couldn't be processed"); return []; @@ -396,7 +404,7 @@ class Receiver // An Undo is done on the object of an object, so we need that type as well if (($type == 'as:Undo') && !empty($object_data['object_object'])) { - $object_data['object_object_type'] = self::fetchObjectType([], $object_data['object_object'], $uid); + $object_data['object_object_type'] = self::fetchObjectType([], $object_data['object_object'], $fetch_uid); } } @@ -406,6 +414,12 @@ class Receiver $object_data['object_type'] = $object_type; } + foreach (['as:to', 'as:cc', 'as:bto', 'as:bcc'] as $element) { + if (!empty($urls[$element])) { + $object_data['receiver_urls'][$element] = array_unique(array_merge($object_data['receiver_urls'][$element] ?? [], $urls[$element])); + } + } + $object_data['type'] = $type; $object_data['actor'] = $actor; $object_data['item_receiver'] = $receivers; @@ -515,6 +529,9 @@ class Receiver if (!empty($activity['thread-completion'])) { $object_data['thread-completion'] = $activity['thread-completion']; } + if (!empty($activity['thread-children-type'])) { + $object_data['thread-children-type'] = $activity['thread-children-type']; + } // Internal flag for posts that arrived via relay if (!empty($activity['from-relay'])) { @@ -640,6 +657,61 @@ class Receiver } } + /** + * Fetch a user id from an activity array + * + * @param array $activity + * @param string $actor + * + * @return int user id + */ + public static function getBestUserForActivity(array $activity) + { + $uid = 0; + $actor = JsonLD::fetchElement($activity, 'as:actor', '@id') ?? ''; + + $receivers = self::getReceivers($activity, $actor); + foreach ($receivers as $receiver) { + if ($receiver['type'] == self::TARGET_GLOBAL) { + return 0; + } + if (empty($uid) || ($receiver['type'] == self::TARGET_TO)) { + $uid = $receiver['uid']; + } + } + + // When we haven't found any user yet, we just chose a user who most likely could have access to the content + if (empty($uid)) { + $contact = Contact::selectFirst(['uid'], ['nurl' => Strings::normaliseLink($actor), 'rel' => [Contact::SHARING, Contact::FRIEND]]); + if (!empty($contact['uid'])) { + $uid = $contact['uid']; + } + } + + return $uid; + } + + public static function getReceiverURL($activity) + { + $urls = []; + + foreach (['as:to', 'as:cc', 'as:bto', 'as:bcc'] as $element) { + $receiver_list = JsonLD::fetchElementArray($activity, $element, '@id'); + if (empty($receiver_list)) { + continue; + } + + foreach ($receiver_list as $receiver) { + if ($receiver == self::PUBLIC_COLLECTION) { + $receiver = ActivityPub::PUBLIC_COLLECTION; + } + $urls[$element][] = $receiver; + } + } + + return $urls; + } + /** * Fetch the receiver list from an activity array * @@ -1469,7 +1541,8 @@ class Receiver $reception_types[$data['uid']] = $data['type'] ?? 0; } - $object_data['receiver'] = $receivers; + $object_data['receiver_urls'] = self::getReceiverURL($object); + $object_data['receiver'] = $receivers; $object_data['reception_type'] = $reception_types; $object_data['unlisted'] = in_array(-1, $object_data['receiver']); diff --git a/src/Protocol/ActivityPub/Transmitter.php b/src/Protocol/ActivityPub/Transmitter.php index aafeee1e2..c65265396 100644 --- a/src/Protocol/ActivityPub/Transmitter.php +++ b/src/Protocol/ActivityPub/Transmitter.php @@ -184,7 +184,7 @@ class Transmitter // Allow fetching the contact list when the requester is part of the list. if (($owner['page-flags'] == User::PAGE_FLAGS_PRVGROUP) && !empty($requester)) { - $show_contacts = DBA::exists('contact', ['nurl' => Strings::normaliseLink($requester), 'rel' => $rel]); + $show_contacts = DBA::exists('contact', ['nurl' => Strings::normaliseLink($requester), 'uid' => $owner['uid'], 'blocked' => false]); } if (!$show_contacts) { @@ -424,7 +424,7 @@ class Transmitter } /** - * Returns an array with permissions of a given item array + * Returns an array with permissions of the thread parent of the given item array * * @param array $item * @@ -432,34 +432,25 @@ class Transmitter * @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \ImagickException */ - private static function fetchPermissionBlockFromConversation($item) + public static function fetchPermissionBlockFromThreadParent($item) { - if (empty($item['thr-parent'])) { + if (empty($item['thr-parent-id'])) { return []; } - $condition = ['item-uri' => $item['thr-parent'], 'protocol' => Conversation::PARCEL_ACTIVITYPUB]; - $conversation = DBA::selectFirst('conversation', ['source'], $condition); - if (!DBA::isResult($conversation)) { + $parent = Post::selectFirstPost(['author-link'], ['uri-id' => $item['thr-parent-id']]); + if (empty($parent)) { return []; } $permissions = [ - 'to' => [], + 'to' => [$parent['author-link']], 'cc' => [], 'bto' => [], 'bcc' => [], ]; - $activity = json_decode($conversation['source'], true); - - $actor = JsonLD::fetchElement($activity, 'actor', 'id'); - if (!empty($actor)) { - $permissions['to'][] = $actor; - $profile = APContact::getByURL($actor); - } else { - $profile = []; - } + $parent_profile = APContact::getByURL($parent['author-link']); $item_profile = APContact::getByURL($item['author-link']); $exclude[] = $item['author-link']; @@ -468,26 +459,15 @@ class Transmitter $exclude[] = $item['owner-link']; } - foreach (['to', 'cc', 'bto', 'bcc'] as $element) { - if (empty($activity[$element])) { - continue; - } - if (is_string($activity[$element])) { - $activity[$element] = [$activity[$element]]; - } - - foreach ($activity[$element] as $receiver) { - if (empty($receiver)) { - continue; - } - - if (!empty($profile['followers']) && $receiver == $profile['followers'] && !empty($item_profile['followers'])) { - $permissions[$element][] = $item_profile['followers']; - } elseif (!in_array($receiver, $exclude)) { - $permissions[$element][] = $receiver; - } + $type = [Tag::TO => 'to', Tag::CC => 'cc', Tag::BTO => 'bto', Tag::BCC => 'bcc']; + foreach (Tag::getByURIId($item['thr-parent-id'], [Tag::TO, Tag::CC, Tag::BTO, Tag::BCC]) as $receiver) { + if (!empty($parent_profile['followers']) && $receiver['url'] == $parent_profile['followers'] && !empty($item_profile['followers'])) { + $permissions[$type[$receiver['type']]][] = $item_profile['followers']; + } elseif (!in_array($receiver['url'], $exclude)) { + $permissions[$type[$receiver['type']]][] = $receiver['url']; } } + return $permissions; } @@ -509,28 +489,33 @@ class Transmitter /** * Creates an array of permissions from an item thread * - * @param array $item Item array - * @param boolean $blindcopy addressing via "bcc" or "cc"? - * @param integer $last_id Last item id for adding receivers - * @param boolean $forum_post "true" means that we are sending content to a forum + * @param array $item Item array + * @param boolean $blindcopy addressing via "bcc" or "cc"? + * @param integer $last_id Last item id for adding receivers * * @return array with permission data * @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \ImagickException */ - private static function createPermissionBlockForItem($item, $blindcopy, $last_id = 0, $forum_post = false) + private static function createPermissionBlockForItem($item, $blindcopy, $last_id = 0) { if ($last_id == 0) { $last_id = $item['id']; } $always_bcc = false; + $is_forum = false; + $follower = ''; // Check if we should always deliver our stuff via BCC if (!empty($item['uid'])) { - $profile = User::getOwnerDataById($item['uid']); - if (!empty($profile)) { - $always_bcc = $profile['hide-friends']; + $owner = User::getOwnerDataById($item['uid']); + if (!empty($owner)) { + $always_bcc = $owner['hide-friends']; + $is_forum = ($owner['account-type'] == User::ACCOUNT_TYPE_COMMUNITY) && $owner['manually-approve']; + + $profile = APContact::getByURL($owner['url'], false); + $follower = $profile['followers'] ?? ''; } } @@ -568,7 +553,7 @@ class Transmitter $data['cc'][] = $announce['actor']['url']; } - $data = array_merge($data, self::fetchPermissionBlockFromConversation($item)); + $data = array_merge($data, self::fetchPermissionBlockFromThreadParent($item)); // Check if the item is completely public or unlisted if ($item['private'] == Item::PUBLIC) { @@ -600,23 +585,34 @@ class Transmitter continue; } - if (!empty($profile = APContact::getByURL($contact['url'], false))) { + $profile = APContact::getByURL($term['url'], false); + if (!empty($profile)) { + if ($term['type'] == Tag::EXCLUSIVE_MENTION) { + $exclusive = true; + if (!empty($profile['followers']) && ($profile['type'] == 'Group')) { + $data['cc'][] = $profile['followers']; + } + } $data['to'][] = $profile['url']; } } } - foreach ($receiver_list as $receiver) { - $contact = DBA::selectFirst('contact', ['url', 'hidden', 'network', 'protocol', 'gsid'], ['id' => $receiver, 'network' => Protocol::FEDERATED]); - if (!DBA::isResult($contact) || !self::isAPContact($contact, $networks)) { - continue; - } + if ($is_forum && !$exclusive && !empty($follower)) { + $data['cc'][] = $follower; + } elseif (!$exclusive) { + foreach ($receiver_list as $receiver) { + $contact = DBA::selectFirst('contact', ['url', 'hidden', 'network', 'protocol', 'gsid'], ['id' => $receiver, 'network' => Protocol::FEDERATED]); + if (!DBA::isResult($contact) || !self::isAPContact($contact, $networks)) { + continue; + } - if (!empty($profile = APContact::getByURL($contact['url'], false))) { - if ($contact['hidden'] || $always_bcc) { - $data['bcc'][] = $profile['url']; - } else { - $data['cc'][] = $profile['url']; + if (!empty($profile = APContact::getByURL($contact['url'], false))) { + if ($contact['hidden'] || $always_bcc) { + $data['bcc'][] = $profile['url']; + } else { + $data['cc'][] = $profile['url']; + } } } } @@ -643,9 +639,7 @@ class Transmitter } } elseif (!$exclusive) { // Public thread parent post always are directed to the followers. - // This mustn't be done by posts that are directed to forum servers via the exclusive mention. - // But possibly in that case we could add the "followers" collection of the forum to the message. - if (($item['private'] != Item::PRIVATE) && !$forum_post) { + if ($item['private'] != Item::PRIVATE) { $data['cc'][] = $actor_profile['followers']; } } @@ -707,6 +701,19 @@ class Transmitter unset($receivers['bcc']); } + foreach (['to' => Tag::TO, 'cc' => Tag::CC, 'bcc' => Tag::BCC] as $element => $type) { + if (!empty($receivers[$element])) { + foreach ($receivers[$element] as $receiver) { + if ($receiver == ActivityPub::PUBLIC_COLLECTION) { + $name = Receiver::PUBLIC_COLLECTION; + } else { + $name = trim(parse_url($receiver, PHP_URL_PATH), '/'); + } + Tag::store($item['uri-id'], $type, $name, $receiver); + } + } + } + return $receivers; } @@ -811,18 +818,17 @@ class Transmitter /** * Fetches an array of inboxes for the given item and user * - * @param array $item Item array - * @param integer $uid User ID - * @param boolean $personal fetch personal inboxes - * @param integer $last_id Last item id for adding receivers - * @param boolean $forum_post "true" means that we are sending content to a forum + * @param array $item Item array + * @param integer $uid User ID + * @param boolean $personal fetch personal inboxes + * @param integer $last_id Last item id for adding receivers * @return array with inboxes * @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \ImagickException */ - public static function fetchTargetInboxes($item, $uid, $personal = false, $last_id = 0, $forum_post = false) + public static function fetchTargetInboxes($item, $uid, $personal = false, $last_id = 0) { - $permissions = self::createPermissionBlockForItem($item, true, $last_id, $forum_post); + $permissions = self::createPermissionBlockForItem($item, true, $last_id); if (empty($permissions)) { return []; } @@ -1079,20 +1085,6 @@ class Transmitter return false; } - // In case of a forum post ensure to return the original post if author and forum are on the same machine - if (($item['gravity'] == GRAVITY_PARENT) && !empty($item['forum_mode'])) { - $author = Contact::getById($item['author-id'], ['nurl']); - if (!empty($author['nurl'])) { - $self = Contact::selectFirst(['uid'], ['nurl' => $author['nurl'], 'self' => true]); - if (!empty($self['uid'])) { - $forum_item = Post::selectFirst(Item::DELIVER_FIELDLIST, ['uri-id' => $item['uri-id'], 'uid' => $self['uid']]); - if (DBA::isResult($forum_item)) { - $item = $forum_item; - } - } - } - } - if (empty($item['uri-id'])) { Logger::warning('Item without uri-id', ['item' => $item]); return false; diff --git a/src/Protocol/DFRN.php b/src/Protocol/DFRN.php index 94b1b1689..50faf987a 100644 --- a/src/Protocol/DFRN.php +++ b/src/Protocol/DFRN.php @@ -1557,22 +1557,11 @@ class DFRN // was the top-level post for this action written by somebody on this site? // Specifically, the recipient? - $parent = Post::selectFirst(['forum_mode', 'wall'], + $parent = Post::selectFirst(['wall'], ["`uri` = ? AND `uid` = ?" . $sql_extra, $item["thr-parent"], $importer["importer_uid"]]); $is_a_remote_action = DBA::isResult($parent); - /* - * Does this have the characteristics of a community or private group action? - * If it's an action to a wall post on a community/prvgroup page it's a - * valid community action. Also forum_mode makes it valid for sure. - * If neither, it's not. - */ - if ($is_a_remote_action && $community && (!$parent["forum_mode"]) && (!$parent["wall"])) { - $is_a_remote_action = false; - Logger::notice("not a community action"); - } - if ($is_a_remote_action) { return DFRN::REPLY_RC; } else { diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index aba79364f..ea0b2b674 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -858,10 +858,6 @@ class Diaspora } elseif (($contact["rel"] == Contact::SHARING) || ($contact["rel"] == Contact::FRIEND)) { // Yes, then it is fine. return true; - // Is it a post to a community? - } elseif (($contact["rel"] == Contact::FOLLOWER) && ($importer['account-type'] == User::ACCOUNT_TYPE_COMMUNITY)) { - // That's good - return true; // Is the message a global user or a comment? } elseif (($importer["uid"] == 0) || $is_comment) { // Messages for the global users and comments are always accepted @@ -3473,9 +3469,8 @@ class Diaspora private static function prependParentAuthorMention($body, $profile_url) { - $profile = Contact::getByURL($profile_url, false, ['addr', 'name', 'contact-type']); + $profile = Contact::getByURL($profile_url, false, ['addr', 'name']); if (!empty($profile['addr']) - && $profile['contact-type'] != Contact::TYPE_COMMUNITY && !strstr($body, $profile['addr']) && !strstr($body, $profile_url) ) { diff --git a/src/Protocol/OStatus.php b/src/Protocol/OStatus.php index 86716e993..a2c9a8447 100644 --- a/src/Protocol/OStatus.php +++ b/src/Protocol/OStatus.php @@ -494,19 +494,22 @@ class OStatus if ($initialize && (count(self::$itemlist) > 0)) { if (self::$itemlist[0]['uri'] == self::$itemlist[0]['thr-parent']) { + $uid = self::$itemlist[0]['uid']; // We will import it everytime, when it is started by our contacts - $valid = Contact::isSharingByURL(self::$itemlist[0]['author-link'], self::$itemlist[0]['uid']); + $valid = Contact::isSharingByURL(self::$itemlist[0]['author-link'], $uid); if (!$valid) { // If not, then it depends on this setting - $valid = ((self::$itemlist[0]['uid'] == 0) || !DI::pConfig()->get(self::$itemlist[0]['uid'], 'system', 'accept_only_sharer', false)); + $valid = !$uid || DI::pConfig()->get($uid, 'system', 'accept_only_sharer') != Item::COMPLETION_NONE; + if ($valid) { Logger::info("Item with uri ".self::$itemlist[0]['uri']." will be imported due to the system settings."); } } else { Logger::info("Item with uri ".self::$itemlist[0]['uri']." belongs to a contact (".self::$itemlist[0]['contact-id']."). It will be imported."); } - if ($valid) { + + if ($valid && DI::pConfig()->get($uid, 'system', 'accept_only_sharer') != Item::COMPLETION_LIKE) { // Never post a thread when the only interaction by our contact was a like $valid = false; $verbs = [Activity::POST, Activity::SHARE]; @@ -1728,6 +1731,7 @@ class OStatus if ($owner['contact-type'] == Contact::TYPE_COMMUNITY) { $contact = Contact::getByURL($item['author-link']) ?: $owner; + $contact['nickname'] = $contact['nickname'] ?? $contact['nick']; $author = self::addAuthor($doc, $contact, false); $entry->appendChild($author); } diff --git a/src/Render/FriendicaSmarty.php b/src/Render/FriendicaSmarty.php index 44a741d7c..50dda5eba 100644 --- a/src/Render/FriendicaSmarty.php +++ b/src/Render/FriendicaSmarty.php @@ -58,5 +58,7 @@ class FriendicaSmarty extends Smarty // Don't report errors so verbosely $this->error_reporting = E_ALL & ~E_NOTICE; + + $this->muteUndefinedOrNullWarnings(); } } diff --git a/src/Util/HTTPSignature.php b/src/Util/HTTPSignature.php index 7603b622b..68f6cb1dd 100644 --- a/src/Util/HTTPSignature.php +++ b/src/Util/HTTPSignature.php @@ -627,7 +627,8 @@ class HTTPSignature if (!empty($created)) { $current = time(); - if ($created > $current) { + // Calculate with a grace period of 60 seconds to avoid slight time differences between the servers + if (($created - 60) > $current) { Logger::notice('Signature created in the future', ['created' => date(DateTimeFormat::MYSQL, $created), 'expired' => date(DateTimeFormat::MYSQL, $expired), 'current' => date(DateTimeFormat::MYSQL, $current)]); return false; } diff --git a/src/Util/Images.php b/src/Util/Images.php index 077509d3c..d7a58b52a 100644 --- a/src/Util/Images.php +++ b/src/Util/Images.php @@ -184,12 +184,14 @@ class Images return $data; } - $data = DI::cache()->get($url); + $cacheKey = 'getInfoFromURL:' . sha1($url); + + $data = DI::cache()->get($cacheKey); if (empty($data) || !is_array($data)) { $data = self::getInfoFromURL($url); - DI::cache()->set($url, $data); + DI::cache()->set($cacheKey, $data); } return $data; diff --git a/src/Worker/Delivery.php b/src/Worker/Delivery.php index 3be49a38f..c09181d3e 100644 --- a/src/Worker/Delivery.php +++ b/src/Worker/Delivery.php @@ -46,7 +46,6 @@ class Delivery const DELETION = 'drop'; const POST = 'wall-new'; const POKE = 'poke'; - const UPLINK = 'uplink'; const REMOVAL = 'removeme'; const PROFILEUPDATE = 'profileupdate'; diff --git a/src/Worker/Notifier.php b/src/Worker/Notifier.php index f46b1b0d9..488ade222 100644 --- a/src/Worker/Notifier.php +++ b/src/Worker/Notifier.php @@ -153,7 +153,7 @@ class Notifier } // Should the post be transmitted to Diaspora? - $diaspora_delivery = true; + $diaspora_delivery = ($owner['account-type'] != User::ACCOUNT_TYPE_COMMUNITY); // If this is a public conversation, notify the feed hub $public_message = true; @@ -223,10 +223,6 @@ class Notifier $relay_to_owner = true; } - if (($cmd === Delivery::UPLINK) && (intval($parent['forum_mode']) == 1) && !$top_level) { - $relay_to_owner = true; - } - // until the 'origin' flag has been in use for several months // we will just use it as a fallback test // later we will be able to use it as the primary test of whether or not to relay. @@ -239,13 +235,13 @@ class Notifier } // Special treatment for forum posts - if (Item::isForumPost($target_item, $owner)) { + if (Item::isForumPost($target_item['uri-id'])) { $relay_to_owner = true; $direct_forum_delivery = true; } // Avoid that comments in a forum thread are sent to OStatus - if (Item::isForumPost($parent, $owner)) { + if (Item::isForumPost($parent['uri-id'])) { $direct_forum_delivery = true; } @@ -333,15 +329,6 @@ class Notifier $deny_people = $aclFormatter->expand($parent['deny_cid']); $deny_groups = Group::expand($uid, $aclFormatter->expand($parent['deny_gid'])); - // if our parent is a public forum (forum_mode == 1), uplink to the origional author causing - // a delivery fork. private groups (forum_mode == 2) do not uplink - /// @todo Possibly we should not uplink when the author is the forum itself? - - if ((intval($parent['forum_mode']) == 1) && !$top_level && ($cmd !== Delivery::UPLINK) - && ($target_item['verb'] != Activity::ANNOUNCE)) { - Worker::add($a->getQueueValue('priority'), 'Notifier', Delivery::UPLINK, $post_uriid, $sender_uid); - } - foreach ($items as $item) { $recipients[] = $item['contact-id']; // pull out additional tagged people to notify (if public message) @@ -742,6 +729,14 @@ class Notifier $uid = $target_item['contact-uid'] ?: $target_item['uid']; + // Update the locally stored follower list when we deliver to a forum + foreach (Tag::getByURIId($target_item['uri-id'], [Tag::MENTION, Tag::EXCLUSIVE_MENTION]) as $tag) { + $target_contact = Contact::getByURL(Strings::normaliseLink($tag['url']), null, [], $uid); + if ($target_contact && $target_contact['contact-type'] == Contact::TYPE_COMMUNITY && $target_contact['manually-approve']) { + Group::updateMembersForForum($target_contact['id']); + } + } + if ($target_item['origin']) { $inboxes = ActivityPub\Transmitter::fetchTargetInboxes($target_item, $uid); @@ -751,9 +746,6 @@ class Notifier } Logger::info('Origin item ' . $target_item['id'] . ' with URL ' . $target_item['uri'] . ' will be distributed.'); - } elseif (Item::isForumPost($target_item, $owner)) { - $inboxes = ActivityPub\Transmitter::fetchTargetInboxes($target_item, $uid, false, 0, true); - Logger::info('Forum item ' . $target_item['id'] . ' with URL ' . $target_item['uri'] . ' will be distributed.'); } elseif (!DBA::exists('conversation', ['item-uri' => $target_item['uri'], 'protocol' => Conversation::PARCEL_ACTIVITYPUB])) { Logger::info('Remote item ' . $target_item['id'] . ' with URL ' . $target_item['uri'] . ' is no AP post. It will not be distributed.'); return ['count' => 0, 'contacts' => []]; @@ -813,15 +805,4 @@ class Notifier return ['count' => $delivery_queue_count, 'contacts' => $contacts]; } - - /** - * Check if the delivered item is a forum post - * - * @param array $item - * @return boolean - */ - public static function isForumPost(array $item) - { - return ($item['gravity'] == GRAVITY_PARENT) && !empty($item['forum_mode']); - } } diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php index 0cf854371..f7e02b10b 100644 --- a/static/dbstructure.config.php +++ b/static/dbstructure.config.php @@ -55,7 +55,7 @@ use Friendica\Database\DBA; if (!defined('DB_UPDATE_VERSION')) { - define('DB_UPDATE_VERSION', 1451); + define('DB_UPDATE_VERSION', 1452); } return [ @@ -1301,7 +1301,7 @@ return [ "wall" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "This item was posted to the wall of uid"], "mention" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], "pubmail" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], - "forum_mode" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""], + "forum_mode" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "Deprecated"], "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "foreign" => ["contact" => "id"], "comment" => "contact.id"], "unseen" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => "post has not been seen"], "hidden" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Marker to hide the post from the user"], diff --git a/static/dbview.config.php b/static/dbview.config.php index 4188c7726..014973de2 100644 --- a/static/dbview.config.php +++ b/static/dbview.config.php @@ -91,7 +91,6 @@ "deleted" => ["post-user", "deleted"], "origin" => ["post-user", "origin"], "parent-origin" => ["post-thread-user", "origin"], - "forum_mode" => ["post-thread-user", "forum_mode"], "mention" => ["post-thread-user", "mention"], "global" => ["post-user", "global"], "network" => ["post-user", "network"], @@ -250,7 +249,6 @@ "unseen" => ["post-thread-user", "unseen"], "deleted" => ["post-user", "deleted"], "origin" => ["post-thread-user", "origin"], - "forum_mode" => ["post-thread-user", "forum_mode"], "mention" => ["post-thread-user", "mention"], "global" => ["post-user", "global"], "network" => ["post-thread-user", "network"], diff --git a/static/defaults.config.php b/static/defaults.config.php index 3cde0bfd4..c31446cfe 100644 --- a/static/defaults.config.php +++ b/static/defaults.config.php @@ -616,10 +616,6 @@ return [ // Logs every call to /inbox as a JSON file in Friendica's temporary directory 'ap_inbox_log' => false, - // show_direction (Boolean) - // Display if a post had been fetched or had been pushed towards our server - 'show_direction' => false, - // total_ap_delivery (Boolean) // Deliver via AP to every possible receiver and we suppress the delivery to these contacts with other protocols 'total_ap_delivery' => false, diff --git a/tests/src/Console/ConfigConsoleTest.php b/tests/src/Console/ConfigConsoleTest.php index dd7925ed9..eae622725 100644 --- a/tests/src/Console/ConfigConsoleTest.php +++ b/tests/src/Console/ConfigConsoleTest.php @@ -102,7 +102,7 @@ class ConfigConsoleTest extends ConsoleTest $console->setArgument(0, 'config'); $console->setArgument(1, 'test'); $txt = $this->dumpExecute($console); - self::assertEquals("config.test => \n", $txt); + self::assertEquals("config.test => NULL\n", $txt); } public function testSetArrayValue() diff --git a/view/lang/C/messages.po b/view/lang/C/messages.po index af98956ec..7b8fb5ea0 100644 --- a/view/lang/C/messages.po +++ b/view/lang/C/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 2022.05-dev\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-02-10 09:02+0100\n" +"POT-Creation-Date: 2022-02-19 13:54+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -36,7 +36,7 @@ msgstr "" msgid "User not found." msgstr "" -#: mod/cal.php:120 mod/display.php:270 src/Module/Profile/Profile.php:94 +#: mod/cal.php:120 mod/display.php:238 src/Module/Profile/Profile.php:94 #: src/Module/Profile/Profile.php:109 src/Module/Profile/Status.php:109 #: src/Module/Update/Profile.php:56 msgid "Access to this profile has been restricted." @@ -103,25 +103,25 @@ msgstr "" msgid "calendar" msgstr "" -#: mod/display.php:165 mod/photos.php:808 +#: mod/display.php:133 mod/photos.php:808 #: src/Module/Conversation/Community.php:175 src/Module/Directory.php:48 #: src/Module/Search/Index.php:49 msgid "Public access denied." msgstr "" -#: mod/display.php:221 mod/display.php:295 +#: mod/display.php:189 mod/display.php:263 msgid "The requested item doesn't exist or has been deleted." msgstr "" -#: mod/display.php:375 +#: mod/display.php:343 msgid "The feed for this item is unavailable." msgstr "" #: mod/editpost.php:38 mod/events.php:220 mod/follow.php:56 mod/follow.php:130 -#: mod/item.php:185 mod/item.php:190 mod/item.php:930 mod/message.php:69 +#: mod/item.php:184 mod/item.php:189 mod/item.php:918 mod/message.php:69 #: mod/message.php:111 mod/notes.php:44 mod/ostatus_subscribe.php:32 #: mod/photos.php:160 mod/photos.php:897 mod/repair_ostatus.php:31 -#: mod/settings.php:46 mod/settings.php:56 mod/settings.php:412 +#: mod/settings.php:47 mod/settings.php:57 mod/settings.php:417 #: mod/suggest.php:34 mod/uimport.php:33 mod/unfollow.php:35 #: mod/unfollow.php:50 mod/unfollow.php:82 mod/wall_attach.php:68 #: mod/wall_attach.php:71 mod/wall_upload.php:90 mod/wall_upload.php:93 @@ -163,7 +163,7 @@ msgid "Save" msgstr "" #: mod/editpost.php:92 mod/photos.php:1344 src/Content/Conversation.php:326 -#: src/Module/Contact/Poke.php:176 src/Object/Post.php:966 +#: src/Module/Contact/Poke.php:176 src/Object/Post.php:960 msgid "Loading..." msgstr "" @@ -229,7 +229,7 @@ msgstr "" #: mod/editpost.php:107 mod/message.php:200 mod/message.php:358 #: mod/photos.php:1495 mod/wallmessage.php:142 src/Content/Conversation.php:355 #: src/Content/Conversation.php:690 src/Module/Item/Compose.php:165 -#: src/Object/Post.php:504 +#: src/Object/Post.php:498 msgid "Please wait" msgstr "" @@ -261,7 +261,7 @@ msgstr "" #: mod/editpost.php:128 mod/events.php:517 mod/photos.php:1343 #: mod/photos.php:1399 mod/photos.php:1473 src/Content/Conversation.php:370 -#: src/Module/Item/Compose.php:160 src/Object/Post.php:976 +#: src/Module/Item/Compose.php:160 src/Object/Post.php:970 msgid "Preview" msgstr "" @@ -273,37 +273,37 @@ msgid "Cancel" msgstr "" #: mod/editpost.php:134 src/Content/Conversation.php:331 -#: src/Module/Item/Compose.php:151 src/Object/Post.php:967 +#: src/Module/Item/Compose.php:151 src/Object/Post.php:961 msgid "Bold" msgstr "" #: mod/editpost.php:135 src/Content/Conversation.php:332 -#: src/Module/Item/Compose.php:152 src/Object/Post.php:968 +#: src/Module/Item/Compose.php:152 src/Object/Post.php:962 msgid "Italic" msgstr "" #: mod/editpost.php:136 src/Content/Conversation.php:333 -#: src/Module/Item/Compose.php:153 src/Object/Post.php:969 +#: src/Module/Item/Compose.php:153 src/Object/Post.php:963 msgid "Underline" msgstr "" #: mod/editpost.php:137 src/Content/Conversation.php:334 -#: src/Module/Item/Compose.php:154 src/Object/Post.php:970 +#: src/Module/Item/Compose.php:154 src/Object/Post.php:964 msgid "Quote" msgstr "" #: mod/editpost.php:138 src/Content/Conversation.php:335 -#: src/Module/Item/Compose.php:155 src/Object/Post.php:971 +#: src/Module/Item/Compose.php:155 src/Object/Post.php:965 msgid "Code" msgstr "" #: mod/editpost.php:139 src/Content/Conversation.php:337 -#: src/Module/Item/Compose.php:157 src/Object/Post.php:973 +#: src/Module/Item/Compose.php:157 src/Object/Post.php:967 msgid "Link" msgstr "" #: mod/editpost.php:140 src/Content/Conversation.php:338 -#: src/Module/Item/Compose.php:158 src/Object/Post.php:974 +#: src/Module/Item/Compose.php:158 src/Object/Post.php:968 msgid "Link or Media" msgstr "" @@ -411,7 +411,7 @@ msgstr "" #: src/Module/Install.php:252 src/Module/Install.php:294 #: src/Module/Install.php:331 src/Module/Invite.php:177 #: src/Module/Item/Compose.php:150 src/Module/Profile/Profile.php:247 -#: src/Module/Settings/Profile/Index.php:222 src/Object/Post.php:965 +#: src/Module/Settings/Profile/Index.php:222 src/Object/Post.php:959 #: view/theme/duepuntozero/config.php:69 view/theme/frio/config.php:160 #: view/theme/quattro/config.php:71 view/theme/vier/config.php:119 msgid "Submit" @@ -465,7 +465,7 @@ msgid "OStatus support is disabled. Contact can't be added." msgstr "" #: mod/follow.php:138 src/Content/Item.php:452 src/Content/Widget.php:76 -#: src/Model/Contact.php:1056 src/Model/Contact.php:1068 +#: src/Model/Contact.php:1057 src/Model/Contact.php:1069 #: view/theme/vier/theme.php:172 msgid "Connect/Follow" msgstr "" @@ -510,27 +510,27 @@ msgstr "" msgid "The contact could not be added." msgstr "" -#: mod/item.php:135 mod/item.php:139 +#: mod/item.php:134 mod/item.php:138 msgid "Unable to locate original post." msgstr "" -#: mod/item.php:341 mod/item.php:346 +#: mod/item.php:340 mod/item.php:345 msgid "Empty post discarded." msgstr "" -#: mod/item.php:736 +#: mod/item.php:724 msgid "Post updated." msgstr "" -#: mod/item.php:746 mod/item.php:751 +#: mod/item.php:734 mod/item.php:739 msgid "Item wasn't stored." msgstr "" -#: mod/item.php:762 +#: mod/item.php:750 msgid "Item couldn't be fetched." msgstr "" -#: mod/item.php:908 src/Module/Admin/Themes/Details.php:39 +#: mod/item.php:896 src/Module/Admin/Themes/Details.php:39 #: src/Module/Admin/Themes/Index.php:59 src/Module/Debug/ItemBody.php:41 #: src/Module/Debug/ItemBody.php:56 msgid "Item not found." @@ -1066,12 +1066,12 @@ msgstr "" #: mod/photos.php:1339 mod/photos.php:1395 mod/photos.php:1469 #: src/Module/Contact.php:544 src/Module/Item/Compose.php:148 -#: src/Object/Post.php:962 +#: src/Object/Post.php:956 msgid "This is you" msgstr "" #: mod/photos.php:1341 mod/photos.php:1397 mod/photos.php:1471 -#: src/Object/Post.php:498 src/Object/Post.php:964 +#: src/Object/Post.php:492 src/Object/Post.php:958 msgid "Comment" msgstr "" @@ -1079,7 +1079,7 @@ msgstr "" msgid "Select" msgstr "" -#: mod/photos.php:1431 mod/settings.php:596 src/Content/Conversation.php:616 +#: mod/photos.php:1431 mod/settings.php:611 src/Content/Conversation.php:616 #: src/Module/Admin/Users/Active.php:139 src/Module/Admin/Users/Blocked.php:140 #: src/Module/Admin/Users/Index.php:153 msgid "Delete" @@ -1183,35 +1183,35 @@ msgid_plural "Errors" msgstr[0] "" msgstr[1] "" -#: mod/settings.php:128 +#: mod/settings.php:129 msgid "Failed to connect with email account using the settings provided." msgstr "" -#: mod/settings.php:158 +#: mod/settings.php:159 msgid "Contact CSV file upload error" msgstr "" -#: mod/settings.php:177 +#: mod/settings.php:178 msgid "Importing Contacts done" msgstr "" -#: mod/settings.php:190 +#: mod/settings.php:191 msgid "Relocate message has been send to your contacts" msgstr "" -#: mod/settings.php:202 +#: mod/settings.php:203 msgid "Passwords do not match." msgstr "" -#: mod/settings.php:210 src/Console/User.php:210 +#: mod/settings.php:211 src/Console/User.php:210 msgid "Password update failed. Please try again." msgstr "" -#: mod/settings.php:213 src/Console/User.php:213 +#: mod/settings.php:214 src/Console/User.php:213 msgid "Password changed." msgstr "" -#: mod/settings.php:216 +#: mod/settings.php:217 msgid "Password unchanged." msgstr "" @@ -1235,23 +1235,15 @@ msgstr "" msgid "Cannot change to that email." msgstr "" -#: mod/settings.php:368 -msgid "Private forum has no privacy permissions. Using default privacy group." -msgstr "" - -#: mod/settings.php:371 -msgid "Private forum has no privacy permissions and no default privacy group." -msgstr "" - -#: mod/settings.php:390 +#: mod/settings.php:395 msgid "Settings were not updated." msgstr "" -#: mod/settings.php:431 +#: mod/settings.php:436 msgid "Connected Apps" msgstr "" -#: mod/settings.php:432 src/Module/Admin/Blocklist/Contact.php:106 +#: mod/settings.php:437 src/Module/Admin/Blocklist/Contact.php:106 #: src/Module/Admin/Users/Active.php:129 src/Module/Admin/Users/Blocked.php:130 #: src/Module/Admin/Users/Create.php:71 src/Module/Admin/Users/Deleted.php:88 #: src/Module/Admin/Users/Index.php:142 src/Module/Admin/Users/Index.php:162 @@ -1259,20 +1251,20 @@ msgstr "" msgid "Name" msgstr "" -#: mod/settings.php:433 src/Content/Nav.php:212 +#: mod/settings.php:438 src/Content/Nav.php:212 msgid "Home Page" msgstr "" -#: mod/settings.php:434 src/Module/Admin/Queue.php:78 +#: mod/settings.php:439 src/Module/Admin/Queue.php:78 msgid "Created" msgstr "" -#: mod/settings.php:435 +#: mod/settings.php:440 msgid "Remove authorization" msgstr "" -#: mod/settings.php:461 mod/settings.php:493 mod/settings.php:524 -#: mod/settings.php:598 mod/settings.php:735 +#: mod/settings.php:466 mod/settings.php:498 mod/settings.php:529 +#: mod/settings.php:613 mod/settings.php:750 #: src/Module/Admin/Addons/Index.php:69 src/Module/Admin/Features.php:87 #: src/Module/Admin/Logs/Settings.php:81 src/Module/Admin/Site.php:501 #: src/Module/Admin/Themes/Index.php:113 src/Module/Admin/Tos.php:83 @@ -1280,73 +1272,83 @@ msgstr "" msgid "Save Settings" msgstr "" -#: mod/settings.php:469 +#: mod/settings.php:474 msgid "Addon Settings" msgstr "" -#: mod/settings.php:470 +#: mod/settings.php:475 msgid "No Addon settings configured" msgstr "" -#: mod/settings.php:491 +#: mod/settings.php:496 msgid "Additional Features" msgstr "" -#: mod/settings.php:529 +#: mod/settings.php:534 msgid "Diaspora (Socialhome, Hubzilla)" msgstr "" -#: mod/settings.php:529 mod/settings.php:530 +#: mod/settings.php:534 mod/settings.php:535 msgid "enabled" msgstr "" -#: mod/settings.php:529 mod/settings.php:530 +#: mod/settings.php:534 mod/settings.php:535 msgid "disabled" msgstr "" -#: mod/settings.php:529 mod/settings.php:530 +#: mod/settings.php:534 mod/settings.php:535 #, php-format msgid "Built-in support for %s connectivity is %s" msgstr "" -#: mod/settings.php:530 +#: mod/settings.php:535 msgid "OStatus (GNU Social)" msgstr "" -#: mod/settings.php:556 +#: mod/settings.php:561 msgid "Email access is disabled on this site." msgstr "" -#: mod/settings.php:561 mod/settings.php:596 +#: mod/settings.php:566 mod/settings.php:611 msgid "None" msgstr "" -#: mod/settings.php:567 src/Module/BaseSettings.php:78 +#: mod/settings.php:572 src/Module/BaseSettings.php:78 msgid "Social Networks" msgstr "" -#: mod/settings.php:572 +#: mod/settings.php:577 msgid "General Social Media Settings" msgstr "" -#: mod/settings.php:573 -msgid "Accept only top level posts by contacts you follow" +#: mod/settings.php:580 +msgid "Followed content scope" msgstr "" -#: mod/settings.php:573 +#: mod/settings.php:582 msgid "" -"The system does an auto completion of threads when a comment arrives. This " -"has got the side effect that you can receive posts that had been started by " -"a non-follower but had been commented by someone you follow. This setting " -"deactivates this behaviour. When activated, you strictly only will receive " -"posts from people you really do follow." +"By default, conversations in which your follows participated but didn't " +"start will be shown in your timeline. You can turn this behavior off, or " +"expand it to the conversations in which your follows liked a post." msgstr "" -#: mod/settings.php:574 +#: mod/settings.php:584 +msgid "Only conversations my follows started" +msgstr "" + +#: mod/settings.php:585 +msgid "Conversations my follows started or commented on (default)" +msgstr "" + +#: mod/settings.php:586 +msgid "Any conversation my follows interacted with, including likes" +msgstr "" + +#: mod/settings.php:589 msgid "Enable Content Warning" msgstr "" -#: mod/settings.php:574 +#: mod/settings.php:589 msgid "" "Users on networks like Mastodon or Pleroma are able to set a content warning " "field which collapse their post by default. This enables the automatic " @@ -1354,222 +1356,222 @@ msgid "" "affect any other content filtering you eventually set up." msgstr "" -#: mod/settings.php:575 +#: mod/settings.php:590 msgid "Enable intelligent shortening" msgstr "" -#: mod/settings.php:575 +#: mod/settings.php:590 msgid "" "Normally the system tries to find the best link to add to shortened posts. " "If disabled, every shortened post will always point to the original " "friendica post." msgstr "" -#: mod/settings.php:576 +#: mod/settings.php:591 msgid "Enable simple text shortening" msgstr "" -#: mod/settings.php:576 +#: mod/settings.php:591 msgid "" "Normally the system shortens posts at the next line feed. If this option is " "enabled then the system will shorten the text at the maximum character limit." msgstr "" -#: mod/settings.php:577 +#: mod/settings.php:592 msgid "Attach the link title" msgstr "" -#: mod/settings.php:577 +#: mod/settings.php:592 msgid "" "When activated, the title of the attached link will be added as a title on " "posts to Diaspora. This is mostly helpful with \"remote-self\" contacts that " "share feed content." msgstr "" -#: mod/settings.php:578 +#: mod/settings.php:593 msgid "Your legacy ActivityPub/GNU Social account" msgstr "" -#: mod/settings.php:578 +#: mod/settings.php:593 msgid "" "If you enter your old account name from an ActivityPub based system or your " "GNU Social/Statusnet account name here (in the format user@domain.tld), your " "contacts will be added automatically. The field will be emptied when done." msgstr "" -#: mod/settings.php:581 +#: mod/settings.php:596 msgid "Repair OStatus subscriptions" msgstr "" -#: mod/settings.php:585 +#: mod/settings.php:600 msgid "Email/Mailbox Setup" msgstr "" -#: mod/settings.php:586 +#: mod/settings.php:601 msgid "" "If you wish to communicate with email contacts using this service " "(optional), please specify how to connect to your mailbox." msgstr "" -#: mod/settings.php:587 +#: mod/settings.php:602 msgid "Last successful email check:" msgstr "" -#: mod/settings.php:589 +#: mod/settings.php:604 msgid "IMAP server name:" msgstr "" -#: mod/settings.php:590 +#: mod/settings.php:605 msgid "IMAP port:" msgstr "" -#: mod/settings.php:591 +#: mod/settings.php:606 msgid "Security:" msgstr "" -#: mod/settings.php:592 +#: mod/settings.php:607 msgid "Email login name:" msgstr "" -#: mod/settings.php:593 +#: mod/settings.php:608 msgid "Email password:" msgstr "" -#: mod/settings.php:594 +#: mod/settings.php:609 msgid "Reply-to address:" msgstr "" -#: mod/settings.php:595 +#: mod/settings.php:610 msgid "Send public posts to all email contacts:" msgstr "" -#: mod/settings.php:596 +#: mod/settings.php:611 msgid "Action after import:" msgstr "" -#: mod/settings.php:596 src/Content/Nav.php:280 +#: mod/settings.php:611 src/Content/Nav.php:280 msgid "Mark as seen" msgstr "" -#: mod/settings.php:596 +#: mod/settings.php:611 msgid "Move to folder" msgstr "" -#: mod/settings.php:597 +#: mod/settings.php:612 msgid "Move to folder:" msgstr "" -#: mod/settings.php:611 +#: mod/settings.php:626 msgid "Unable to find your profile. Please contact your admin." msgstr "" -#: mod/settings.php:649 src/Content/Widget.php:526 +#: mod/settings.php:664 src/Content/Widget.php:526 msgid "Account Types" msgstr "" -#: mod/settings.php:650 +#: mod/settings.php:665 msgid "Personal Page Subtypes" msgstr "" -#: mod/settings.php:651 +#: mod/settings.php:666 msgid "Community Forum Subtypes" msgstr "" -#: mod/settings.php:658 src/Module/Admin/BaseUsers.php:107 +#: mod/settings.php:673 src/Module/Admin/BaseUsers.php:107 msgid "Personal Page" msgstr "" -#: mod/settings.php:659 +#: mod/settings.php:674 msgid "Account for a personal profile." msgstr "" -#: mod/settings.php:662 src/Module/Admin/BaseUsers.php:108 +#: mod/settings.php:677 src/Module/Admin/BaseUsers.php:108 msgid "Organisation Page" msgstr "" -#: mod/settings.php:663 +#: mod/settings.php:678 msgid "" "Account for an organisation that automatically approves contact requests as " "\"Followers\"." msgstr "" -#: mod/settings.php:666 src/Module/Admin/BaseUsers.php:109 +#: mod/settings.php:681 src/Module/Admin/BaseUsers.php:109 msgid "News Page" msgstr "" -#: mod/settings.php:667 +#: mod/settings.php:682 msgid "" "Account for a news reflector that automatically approves contact requests as " "\"Followers\"." msgstr "" -#: mod/settings.php:670 src/Module/Admin/BaseUsers.php:110 +#: mod/settings.php:685 src/Module/Admin/BaseUsers.php:110 msgid "Community Forum" msgstr "" -#: mod/settings.php:671 +#: mod/settings.php:686 msgid "Account for community discussions." msgstr "" -#: mod/settings.php:674 src/Module/Admin/BaseUsers.php:100 +#: mod/settings.php:689 src/Module/Admin/BaseUsers.php:100 msgid "Normal Account Page" msgstr "" -#: mod/settings.php:675 +#: mod/settings.php:690 msgid "" "Account for a regular personal profile that requires manual approval of " "\"Friends\" and \"Followers\"." msgstr "" -#: mod/settings.php:678 src/Module/Admin/BaseUsers.php:101 +#: mod/settings.php:693 src/Module/Admin/BaseUsers.php:101 msgid "Soapbox Page" msgstr "" -#: mod/settings.php:679 +#: mod/settings.php:694 msgid "" "Account for a public profile that automatically approves contact requests as " "\"Followers\"." msgstr "" -#: mod/settings.php:682 src/Module/Admin/BaseUsers.php:102 +#: mod/settings.php:697 src/Module/Admin/BaseUsers.php:102 msgid "Public Forum" msgstr "" -#: mod/settings.php:683 +#: mod/settings.php:698 msgid "Automatically approves all contact requests." msgstr "" -#: mod/settings.php:686 src/Module/Admin/BaseUsers.php:103 +#: mod/settings.php:701 src/Module/Admin/BaseUsers.php:103 msgid "Automatic Friend Page" msgstr "" -#: mod/settings.php:687 +#: mod/settings.php:702 msgid "" "Account for a popular profile that automatically approves contact requests " "as \"Friends\"." msgstr "" -#: mod/settings.php:690 +#: mod/settings.php:705 msgid "Private Forum [Experimental]" msgstr "" -#: mod/settings.php:691 +#: mod/settings.php:706 msgid "Requires manual approval of contact requests." msgstr "" -#: mod/settings.php:702 +#: mod/settings.php:717 msgid "OpenID:" msgstr "" -#: mod/settings.php:702 +#: mod/settings.php:717 msgid "(Optional) Allow this OpenID to login to this account." msgstr "" -#: mod/settings.php:710 +#: mod/settings.php:725 msgid "Publish your profile in your local site directory?" msgstr "" -#: mod/settings.php:710 +#: mod/settings.php:725 #, php-format msgid "" "Your profile will be published in this node's local " @@ -1577,115 +1579,115 @@ msgid "" "system settings." msgstr "" -#: mod/settings.php:716 +#: mod/settings.php:731 #, php-format msgid "" "Your profile will also be published in the global friendica directories (e." "g. %s)." msgstr "" -#: mod/settings.php:722 +#: mod/settings.php:737 #, php-format msgid "Your Identity Address is '%s' or '%s'." msgstr "" -#: mod/settings.php:733 +#: mod/settings.php:748 msgid "Account Settings" msgstr "" -#: mod/settings.php:741 +#: mod/settings.php:756 msgid "Password Settings" msgstr "" -#: mod/settings.php:742 src/Module/Register.php:162 +#: mod/settings.php:757 src/Module/Register.php:162 msgid "New Password:" msgstr "" -#: mod/settings.php:742 +#: mod/settings.php:757 msgid "" "Allowed characters are a-z, A-Z, 0-9 and special characters except white " "spaces, accentuated letters and colon (:)." msgstr "" -#: mod/settings.php:743 src/Module/Register.php:163 +#: mod/settings.php:758 src/Module/Register.php:163 msgid "Confirm:" msgstr "" -#: mod/settings.php:743 +#: mod/settings.php:758 msgid "Leave password fields blank unless changing" msgstr "" -#: mod/settings.php:744 +#: mod/settings.php:759 msgid "Current Password:" msgstr "" -#: mod/settings.php:744 +#: mod/settings.php:759 msgid "Your current password to confirm the changes" msgstr "" -#: mod/settings.php:745 +#: mod/settings.php:760 msgid "Password:" msgstr "" -#: mod/settings.php:745 +#: mod/settings.php:760 msgid "Your current password to confirm the changes of the email address" msgstr "" -#: mod/settings.php:748 +#: mod/settings.php:763 msgid "Delete OpenID URL" msgstr "" -#: mod/settings.php:750 +#: mod/settings.php:765 msgid "Basic Settings" msgstr "" -#: mod/settings.php:751 src/Module/Profile/Profile.php:144 +#: mod/settings.php:766 src/Module/Profile/Profile.php:144 msgid "Full Name:" msgstr "" -#: mod/settings.php:752 +#: mod/settings.php:767 msgid "Email Address:" msgstr "" -#: mod/settings.php:753 +#: mod/settings.php:768 msgid "Your Timezone:" msgstr "" -#: mod/settings.php:754 +#: mod/settings.php:769 msgid "Your Language:" msgstr "" -#: mod/settings.php:754 +#: mod/settings.php:769 msgid "" "Set the language we use to show you friendica interface and to send you " "emails" msgstr "" -#: mod/settings.php:755 +#: mod/settings.php:770 msgid "Default Post Location:" msgstr "" -#: mod/settings.php:756 +#: mod/settings.php:771 msgid "Use Browser Location:" msgstr "" -#: mod/settings.php:758 +#: mod/settings.php:773 msgid "Security and Privacy Settings" msgstr "" -#: mod/settings.php:760 +#: mod/settings.php:775 msgid "Maximum Friend Requests/Day:" msgstr "" -#: mod/settings.php:760 mod/settings.php:770 +#: mod/settings.php:775 mod/settings.php:785 msgid "(to prevent spam abuse)" msgstr "" -#: mod/settings.php:762 +#: mod/settings.php:777 msgid "Allow your profile to be searchable globally?" msgstr "" -#: mod/settings.php:762 +#: mod/settings.php:777 msgid "" "Activate this setting if you want others to easily find and follow you. Your " "profile will be searchable on remote systems. This setting also determines " @@ -1693,43 +1695,43 @@ msgid "" "indexed or not." msgstr "" -#: mod/settings.php:763 +#: mod/settings.php:778 msgid "Hide your contact/friend list from viewers of your profile?" msgstr "" -#: mod/settings.php:763 +#: mod/settings.php:778 msgid "" "A list of your contacts is displayed on your profile page. Activate this " "option to disable the display of your contact list." msgstr "" -#: mod/settings.php:764 +#: mod/settings.php:779 msgid "Hide your profile details from anonymous viewers?" msgstr "" -#: mod/settings.php:764 +#: mod/settings.php:779 msgid "" "Anonymous visitors will only see your profile picture, your display name and " "the nickname you are using on your profile page. Your public posts and " "replies will still be accessible by other means." msgstr "" -#: mod/settings.php:765 +#: mod/settings.php:780 msgid "Make public posts unlisted" msgstr "" -#: mod/settings.php:765 +#: mod/settings.php:780 msgid "" "Your public posts will not appear on the community pages or in search " "results, nor be sent to relay servers. However they can still appear on " "public feeds on remote servers." msgstr "" -#: mod/settings.php:766 +#: mod/settings.php:781 msgid "Make all posted pictures accessible" msgstr "" -#: mod/settings.php:766 +#: mod/settings.php:781 msgid "" "This option makes every posted picture accessible via the direct link. This " "is a workaround for the problem that most other networks can't handle " @@ -1737,221 +1739,221 @@ msgid "" "public on your photo albums though." msgstr "" -#: mod/settings.php:767 +#: mod/settings.php:782 msgid "Allow friends to post to your profile page?" msgstr "" -#: mod/settings.php:767 +#: mod/settings.php:782 msgid "" "Your contacts may write posts on your profile wall. These posts will be " "distributed to your contacts" msgstr "" -#: mod/settings.php:768 +#: mod/settings.php:783 msgid "Allow friends to tag your posts?" msgstr "" -#: mod/settings.php:768 +#: mod/settings.php:783 msgid "Your contacts can add additional tags to your posts." msgstr "" -#: mod/settings.php:769 +#: mod/settings.php:784 msgid "Permit unknown people to send you private mail?" msgstr "" -#: mod/settings.php:769 +#: mod/settings.php:784 msgid "" "Friendica network users may send you private messages even if they are not " "in your contact list." msgstr "" -#: mod/settings.php:770 +#: mod/settings.php:785 msgid "Maximum private messages per day from unknown people:" msgstr "" -#: mod/settings.php:772 +#: mod/settings.php:787 msgid "Default Post Permissions" msgstr "" -#: mod/settings.php:776 +#: mod/settings.php:791 msgid "Expiration settings" msgstr "" -#: mod/settings.php:777 +#: mod/settings.php:792 msgid "Automatically expire posts after this many days:" msgstr "" -#: mod/settings.php:777 +#: mod/settings.php:792 msgid "If empty, posts will not expire. Expired posts will be deleted" msgstr "" -#: mod/settings.php:778 +#: mod/settings.php:793 msgid "Expire posts" msgstr "" -#: mod/settings.php:778 +#: mod/settings.php:793 msgid "When activated, posts and comments will be expired." msgstr "" -#: mod/settings.php:779 +#: mod/settings.php:794 msgid "Expire personal notes" msgstr "" -#: mod/settings.php:779 +#: mod/settings.php:794 msgid "" "When activated, the personal notes on your profile page will be expired." msgstr "" -#: mod/settings.php:780 +#: mod/settings.php:795 msgid "Expire starred posts" msgstr "" -#: mod/settings.php:780 +#: mod/settings.php:795 msgid "" "Starring posts keeps them from being expired. That behaviour is overwritten " "by this setting." msgstr "" -#: mod/settings.php:781 +#: mod/settings.php:796 msgid "Expire photos" msgstr "" -#: mod/settings.php:781 +#: mod/settings.php:796 msgid "When activated, photos will be expired." msgstr "" -#: mod/settings.php:782 +#: mod/settings.php:797 msgid "Only expire posts by others" msgstr "" -#: mod/settings.php:782 +#: mod/settings.php:797 msgid "" "When activated, your own posts never expire. Then the settings above are " "only valid for posts you received." msgstr "" -#: mod/settings.php:785 +#: mod/settings.php:800 msgid "Notification Settings" msgstr "" -#: mod/settings.php:786 +#: mod/settings.php:801 msgid "Send a notification email when:" msgstr "" -#: mod/settings.php:787 +#: mod/settings.php:802 msgid "You receive an introduction" msgstr "" -#: mod/settings.php:788 +#: mod/settings.php:803 msgid "Your introductions are confirmed" msgstr "" -#: mod/settings.php:789 +#: mod/settings.php:804 msgid "Someone writes on your profile wall" msgstr "" -#: mod/settings.php:790 +#: mod/settings.php:805 msgid "Someone writes a followup comment" msgstr "" -#: mod/settings.php:791 +#: mod/settings.php:806 msgid "You receive a private message" msgstr "" -#: mod/settings.php:792 +#: mod/settings.php:807 msgid "You receive a friend suggestion" msgstr "" -#: mod/settings.php:793 +#: mod/settings.php:808 msgid "You are tagged in a post" msgstr "" -#: mod/settings.php:794 +#: mod/settings.php:809 msgid "You are poked/prodded/etc. in a post" msgstr "" -#: mod/settings.php:796 +#: mod/settings.php:811 msgid "Create a desktop notification when:" msgstr "" -#: mod/settings.php:797 +#: mod/settings.php:812 msgid "Someone liked your content" msgstr "" -#: mod/settings.php:798 +#: mod/settings.php:813 msgid "Someone shared your content" msgstr "" -#: mod/settings.php:800 +#: mod/settings.php:815 msgid "Activate desktop notifications" msgstr "" -#: mod/settings.php:800 +#: mod/settings.php:815 msgid "Show desktop popup on new notifications" msgstr "" -#: mod/settings.php:802 +#: mod/settings.php:817 msgid "Text-only notification emails" msgstr "" -#: mod/settings.php:804 +#: mod/settings.php:819 msgid "Send text only notification emails, without the html part" msgstr "" -#: mod/settings.php:806 +#: mod/settings.php:821 msgid "Show detailled notifications" msgstr "" -#: mod/settings.php:808 +#: mod/settings.php:823 msgid "" "Per default, notifications are condensed to a single notification per item. " "When enabled every notification is displayed." msgstr "" -#: mod/settings.php:810 +#: mod/settings.php:825 msgid "Show notifications of ignored contacts" msgstr "" -#: mod/settings.php:812 +#: mod/settings.php:827 msgid "" "You don't see posts from ignored contacts. But you still see their comments. " "This setting controls if you want to still receive regular notifications " "that are caused by ignored contacts or not." msgstr "" -#: mod/settings.php:814 +#: mod/settings.php:829 msgid "Advanced Account/Page Type Settings" msgstr "" -#: mod/settings.php:815 +#: mod/settings.php:830 msgid "Change the behaviour of this account for special situations" msgstr "" -#: mod/settings.php:818 +#: mod/settings.php:833 msgid "Import Contacts" msgstr "" -#: mod/settings.php:819 +#: mod/settings.php:834 msgid "" "Upload a CSV file that contains the handle of your followed accounts in the " "first column you exported from the old account." msgstr "" -#: mod/settings.php:820 +#: mod/settings.php:835 msgid "Upload File" msgstr "" -#: mod/settings.php:822 +#: mod/settings.php:837 msgid "Relocate" msgstr "" -#: mod/settings.php:823 +#: mod/settings.php:838 msgid "" "If you have moved this profile from another server, and some of your " "contacts don't receive your updates, try pushing this button." msgstr "" -#: mod/settings.php:824 +#: mod/settings.php:839 msgid "Resend relocate message to contacts" msgstr "" @@ -1965,7 +1967,7 @@ msgstr "" msgid "Friend Suggestions" msgstr "" -#: mod/tagger.php:78 src/Content/Item.php:335 src/Model/Item.php:2620 +#: mod/tagger.php:78 src/Content/Item.php:335 src/Model/Item.php:2670 msgid "photo" msgstr "" @@ -2482,7 +2484,7 @@ msgid "Visible to everybody" msgstr "" #: src/Content/Conversation.php:308 src/Module/Item/Compose.php:159 -#: src/Object/Post.php:975 +#: src/Object/Post.php:969 msgid "Please enter a image/video/audio/webpage URL:" msgstr "" @@ -2506,12 +2508,12 @@ msgstr "" msgid "New Post" msgstr "" -#: src/Content/Conversation.php:325 src/Object/Post.php:481 +#: src/Content/Conversation.php:325 src/Object/Post.php:475 msgid "Share" msgstr "" #: src/Content/Conversation.php:336 src/Module/Item/Compose.php:156 -#: src/Object/Post.php:972 +#: src/Object/Post.php:966 msgid "Image" msgstr "" @@ -2523,21 +2525,21 @@ msgstr "" msgid "Scheduled at" msgstr "" -#: src/Content/Conversation.php:651 src/Object/Post.php:454 -#: src/Object/Post.php:455 +#: src/Content/Conversation.php:651 src/Object/Post.php:448 +#: src/Object/Post.php:449 #, php-format msgid "View %s's profile @ %s" msgstr "" -#: src/Content/Conversation.php:664 src/Object/Post.php:442 +#: src/Content/Conversation.php:664 src/Object/Post.php:436 msgid "Categories:" msgstr "" -#: src/Content/Conversation.php:665 src/Object/Post.php:443 +#: src/Content/Conversation.php:665 src/Object/Post.php:437 msgid "Filed under:" msgstr "" -#: src/Content/Conversation.php:673 src/Object/Post.php:468 +#: src/Content/Conversation.php:673 src/Object/Post.php:462 #, php-format msgid "%s from %s" msgstr "" @@ -2719,7 +2721,7 @@ msgstr "" msgid "%1$s poked %2$s" msgstr "" -#: src/Content/Item.php:327 src/Model/Item.php:2618 +#: src/Content/Item.php:327 src/Model/Item.php:2668 msgid "event" msgstr "" @@ -2727,31 +2729,31 @@ msgstr "" msgid "Follow Thread" msgstr "" -#: src/Content/Item.php:432 src/Model/Contact.php:1061 +#: src/Content/Item.php:432 src/Model/Contact.php:1062 msgid "View Status" msgstr "" -#: src/Content/Item.php:433 src/Content/Item.php:455 src/Model/Contact.php:995 -#: src/Model/Contact.php:1053 src/Model/Contact.php:1062 +#: src/Content/Item.php:433 src/Content/Item.php:455 src/Model/Contact.php:996 +#: src/Model/Contact.php:1054 src/Model/Contact.php:1063 #: src/Module/Directory.php:157 src/Module/Settings/Profile/Index.php:225 msgid "View Profile" msgstr "" -#: src/Content/Item.php:434 src/Model/Contact.php:1063 +#: src/Content/Item.php:434 src/Model/Contact.php:1064 msgid "View Photos" msgstr "" -#: src/Content/Item.php:435 src/Model/Contact.php:1054 -#: src/Model/Contact.php:1064 +#: src/Content/Item.php:435 src/Model/Contact.php:1055 +#: src/Model/Contact.php:1065 msgid "Network Posts" msgstr "" -#: src/Content/Item.php:436 src/Model/Contact.php:1055 -#: src/Model/Contact.php:1065 +#: src/Content/Item.php:436 src/Model/Contact.php:1056 +#: src/Model/Contact.php:1066 msgid "View Contact" msgstr "" -#: src/Content/Item.php:437 src/Model/Contact.php:1066 +#: src/Content/Item.php:437 src/Model/Contact.php:1067 msgid "Send PM" msgstr "" @@ -2770,11 +2772,11 @@ msgstr "" msgid "Ignore" msgstr "" -#: src/Content/Item.php:443 src/Object/Post.php:429 +#: src/Content/Item.php:443 src/Object/Post.php:423 msgid "Languages" msgstr "" -#: src/Content/Item.php:447 src/Model/Contact.php:1067 +#: src/Content/Item.php:447 src/Model/Contact.php:1068 msgid "Poke" msgstr "" @@ -3070,8 +3072,8 @@ msgid "" "%2$s %3$s" msgstr "" -#: src/Content/Text/BBCode.php:1185 src/Model/Item.php:3149 -#: src/Model/Item.php:3155 src/Model/Item.php:3156 +#: src/Content/Text/BBCode.php:1185 src/Model/Item.php:3199 +#: src/Model/Item.php:3205 src/Model/Item.php:3206 msgid "Link to source" msgstr "" @@ -3226,7 +3228,7 @@ msgstr "" msgid "Organisations" msgstr "" -#: src/Content/Widget.php:522 src/Model/Contact.php:1471 +#: src/Content/Widget.php:522 src/Model/Contact.php:1472 msgid "News" msgstr "" @@ -4049,81 +4051,81 @@ msgstr "" msgid "Legacy module file not found: %s" msgstr "" -#: src/Model/Contact.php:1057 src/Model/Contact.php:1069 +#: src/Model/Contact.php:1058 src/Model/Contact.php:1070 msgid "UnFollow" msgstr "" -#: src/Model/Contact.php:1075 src/Module/Admin/Users/Pending.php:107 +#: src/Model/Contact.php:1076 src/Module/Admin/Users/Pending.php:107 #: src/Module/Notifications/Introductions.php:130 #: src/Module/Notifications/Introductions.php:202 msgid "Approve" msgstr "" -#: src/Model/Contact.php:1467 +#: src/Model/Contact.php:1468 msgid "Organisation" msgstr "" -#: src/Model/Contact.php:1475 +#: src/Model/Contact.php:1476 msgid "Forum" msgstr "" -#: src/Model/Contact.php:2410 +#: src/Model/Contact.php:2411 msgid "Disallowed profile URL." msgstr "" -#: src/Model/Contact.php:2415 src/Module/Friendica.php:81 +#: src/Model/Contact.php:2416 src/Module/Friendica.php:81 msgid "Blocked domain" msgstr "" -#: src/Model/Contact.php:2420 +#: src/Model/Contact.php:2421 msgid "Connect URL missing." msgstr "" -#: src/Model/Contact.php:2429 +#: src/Model/Contact.php:2430 msgid "" "The contact could not be added. Please check the relevant network " "credentials in your Settings -> Social Networks page." msgstr "" -#: src/Model/Contact.php:2466 +#: src/Model/Contact.php:2467 msgid "The profile address specified does not provide adequate information." msgstr "" -#: src/Model/Contact.php:2468 +#: src/Model/Contact.php:2469 msgid "No compatible communication protocols or feeds were discovered." msgstr "" -#: src/Model/Contact.php:2471 +#: src/Model/Contact.php:2472 msgid "An author or name was not found." msgstr "" -#: src/Model/Contact.php:2474 +#: src/Model/Contact.php:2475 msgid "No browser URL could be matched to this address." msgstr "" -#: src/Model/Contact.php:2477 +#: src/Model/Contact.php:2478 msgid "" "Unable to match @-style Identity Address with a known protocol or email " "contact." msgstr "" -#: src/Model/Contact.php:2478 +#: src/Model/Contact.php:2479 msgid "Use mailto: in front of address to force email check." msgstr "" -#: src/Model/Contact.php:2484 +#: src/Model/Contact.php:2485 msgid "" "The profile address specified belongs to a network which has been disabled " "on this site." msgstr "" -#: src/Model/Contact.php:2489 +#: src/Model/Contact.php:2490 msgid "" "Limited profile. This person will be unable to receive direct/personal " "notifications from you." msgstr "" -#: src/Model/Contact.php:2548 +#: src/Model/Contact.php:2549 msgid "Unable to retrieve contact information." msgstr "" @@ -4243,33 +4245,33 @@ msgstr "" msgid "Edit groups" msgstr "" -#: src/Model/Item.php:1691 +#: src/Model/Item.php:1764 #, php-format msgid "Detected languages in this post:\\n%s" msgstr "" -#: src/Model/Item.php:2622 +#: src/Model/Item.php:2672 msgid "activity" msgstr "" -#: src/Model/Item.php:2624 +#: src/Model/Item.php:2674 msgid "comment" msgstr "" -#: src/Model/Item.php:2627 +#: src/Model/Item.php:2677 msgid "post" msgstr "" -#: src/Model/Item.php:2764 +#: src/Model/Item.php:2814 #, php-format msgid "Content warning: %s" msgstr "" -#: src/Model/Item.php:3114 +#: src/Model/Item.php:3164 msgid "bytes" msgstr "" -#: src/Model/Item.php:3143 src/Model/Item.php:3144 +#: src/Model/Item.php:3193 src/Model/Item.php:3194 msgid "View on separate page" msgstr "" @@ -8651,19 +8653,19 @@ msgstr "" #: src/Module/Profile/Profile.php:326 src/Module/Profile/Profile.php:329 #: src/Module/Profile/Status.php:65 src/Module/Profile/Status.php:68 -#: src/Protocol/Feed.php:990 src/Protocol/OStatus.php:1242 +#: src/Protocol/Feed.php:990 src/Protocol/OStatus.php:1245 #, php-format msgid "%s's timeline" msgstr "" #: src/Module/Profile/Profile.php:327 src/Module/Profile/Status.php:66 -#: src/Protocol/Feed.php:994 src/Protocol/OStatus.php:1246 +#: src/Protocol/Feed.php:994 src/Protocol/OStatus.php:1249 #, php-format msgid "%s's posts" msgstr "" #: src/Module/Profile/Profile.php:328 src/Module/Profile/Status.php:67 -#: src/Protocol/Feed.php:997 src/Protocol/OStatus.php:1249 +#: src/Protocol/Feed.php:997 src/Protocol/OStatus.php:1252 #, php-format msgid "%s's comments" msgstr "" @@ -10525,89 +10527,81 @@ msgstr "" msgid "Remote comment" msgstr "" -#: src/Object/Post.php:422 -msgid "Pushed" -msgstr "" - -#: src/Object/Post.php:422 -msgid "Pulled" -msgstr "" - -#: src/Object/Post.php:456 +#: src/Object/Post.php:450 msgid "to" msgstr "" -#: src/Object/Post.php:457 +#: src/Object/Post.php:451 msgid "via" msgstr "" -#: src/Object/Post.php:458 +#: src/Object/Post.php:452 msgid "Wall-to-Wall" msgstr "" -#: src/Object/Post.php:459 +#: src/Object/Post.php:453 msgid "via Wall-To-Wall:" msgstr "" -#: src/Object/Post.php:499 +#: src/Object/Post.php:493 #, php-format msgid "Reply to %s" msgstr "" -#: src/Object/Post.php:502 +#: src/Object/Post.php:496 msgid "More" msgstr "" -#: src/Object/Post.php:520 +#: src/Object/Post.php:514 msgid "Notifier task is pending" msgstr "" -#: src/Object/Post.php:521 +#: src/Object/Post.php:515 msgid "Delivery to remote servers is pending" msgstr "" -#: src/Object/Post.php:522 +#: src/Object/Post.php:516 msgid "Delivery to remote servers is underway" msgstr "" -#: src/Object/Post.php:523 +#: src/Object/Post.php:517 msgid "Delivery to remote servers is mostly done" msgstr "" -#: src/Object/Post.php:524 +#: src/Object/Post.php:518 msgid "Delivery to remote servers is done" msgstr "" -#: src/Object/Post.php:544 +#: src/Object/Post.php:538 #, php-format msgid "%d comment" msgid_plural "%d comments" msgstr[0] "" msgstr[1] "" -#: src/Object/Post.php:545 +#: src/Object/Post.php:539 msgid "Show more" msgstr "" -#: src/Object/Post.php:546 +#: src/Object/Post.php:540 msgid "Show fewer" msgstr "" -#: src/Protocol/OStatus.php:1645 +#: src/Protocol/OStatus.php:1648 #, php-format msgid "%s is now following %s." msgstr "" -#: src/Protocol/OStatus.php:1646 +#: src/Protocol/OStatus.php:1649 msgid "following" msgstr "" -#: src/Protocol/OStatus.php:1649 +#: src/Protocol/OStatus.php:1652 #, php-format msgid "%s stopped following %s." msgstr "" -#: src/Protocol/OStatus.php:1650 +#: src/Protocol/OStatus.php:1653 msgid "stopped following" msgstr "" @@ -10726,7 +10720,7 @@ msgstr "" msgid "%1$d %2$s ago" msgstr "" -#: src/Worker/Delivery.php:525 +#: src/Worker/Delivery.php:524 msgid "(no subject)" msgstr "" diff --git a/view/lang/de/messages.po b/view/lang/de/messages.po index d1421e82b..c7ce06c9a 100644 --- a/view/lang/de/messages.po +++ b/view/lang/de/messages.po @@ -49,8 +49,8 @@ msgid "" msgstr "" "Project-Id-Version: friendica\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-02-07 19:20+0000\n" -"PO-Revision-Date: 2022-02-09 06:14+0000\n" +"POT-Creation-Date: 2022-02-19 13:54+0000\n" +"PO-Revision-Date: 2022-02-20 06:51+0000\n" "Last-Translator: Tobias Diekershoff \n" "Language-Team: German (http://www.transifex.com/Friendica/friendica/language/de/)\n" "MIME-Version: 1.0\n" @@ -77,7 +77,7 @@ msgstr "Zugriff verweigert." msgid "User not found." msgstr "Benutzer nicht gefunden." -#: mod/cal.php:120 mod/display.php:270 src/Module/Profile/Profile.php:94 +#: mod/cal.php:120 mod/display.php:238 src/Module/Profile/Profile.php:94 #: src/Module/Profile/Profile.php:109 src/Module/Profile/Status.php:109 #: src/Module/Update/Profile.php:56 msgid "Access to this profile has been restricted." @@ -144,25 +144,25 @@ msgstr "Keine exportierbaren Daten gefunden" msgid "calendar" msgstr "Kalender" -#: mod/display.php:165 mod/photos.php:808 +#: mod/display.php:133 mod/photos.php:808 #: src/Module/Conversation/Community.php:175 src/Module/Directory.php:48 #: src/Module/Search/Index.php:49 msgid "Public access denied." msgstr "Öffentlicher Zugriff verweigert." -#: mod/display.php:221 mod/display.php:295 +#: mod/display.php:189 mod/display.php:263 msgid "The requested item doesn't exist or has been deleted." msgstr "Der angeforderte Beitrag existiert nicht oder wurde gelöscht." -#: mod/display.php:375 +#: mod/display.php:343 msgid "The feed for this item is unavailable." msgstr "Der Feed für diesen Beitrag ist nicht verfügbar." #: mod/editpost.php:38 mod/events.php:220 mod/follow.php:56 mod/follow.php:130 -#: mod/item.php:185 mod/item.php:190 mod/item.php:930 mod/message.php:69 +#: mod/item.php:184 mod/item.php:189 mod/item.php:918 mod/message.php:69 #: mod/message.php:111 mod/notes.php:44 mod/ostatus_subscribe.php:32 #: mod/photos.php:160 mod/photos.php:897 mod/repair_ostatus.php:31 -#: mod/settings.php:46 mod/settings.php:56 mod/settings.php:412 +#: mod/settings.php:47 mod/settings.php:57 mod/settings.php:417 #: mod/suggest.php:34 mod/uimport.php:33 mod/unfollow.php:35 #: mod/unfollow.php:50 mod/unfollow.php:82 mod/wall_attach.php:68 #: mod/wall_attach.php:71 mod/wall_upload.php:90 mod/wall_upload.php:93 @@ -204,7 +204,7 @@ msgid "Save" msgstr "Speichern" #: mod/editpost.php:92 mod/photos.php:1344 src/Content/Conversation.php:326 -#: src/Module/Contact/Poke.php:176 src/Object/Post.php:966 +#: src/Module/Contact/Poke.php:176 src/Object/Post.php:960 msgid "Loading..." msgstr "lädt..." @@ -270,7 +270,7 @@ msgstr "Ort löschen" #: mod/editpost.php:107 mod/message.php:200 mod/message.php:358 #: mod/photos.php:1495 mod/wallmessage.php:142 #: src/Content/Conversation.php:355 src/Content/Conversation.php:690 -#: src/Module/Item/Compose.php:165 src/Object/Post.php:504 +#: src/Module/Item/Compose.php:165 src/Object/Post.php:498 msgid "Please wait" msgstr "Bitte warten" @@ -302,7 +302,7 @@ msgstr "Z.B.: bob@example.com, mary@example.com" #: mod/editpost.php:128 mod/events.php:517 mod/photos.php:1343 #: mod/photos.php:1399 mod/photos.php:1473 src/Content/Conversation.php:370 -#: src/Module/Item/Compose.php:160 src/Object/Post.php:976 +#: src/Module/Item/Compose.php:160 src/Object/Post.php:970 msgid "Preview" msgstr "Vorschau" @@ -314,37 +314,37 @@ msgid "Cancel" msgstr "Abbrechen" #: mod/editpost.php:134 src/Content/Conversation.php:331 -#: src/Module/Item/Compose.php:151 src/Object/Post.php:967 +#: src/Module/Item/Compose.php:151 src/Object/Post.php:961 msgid "Bold" msgstr "Fett" #: mod/editpost.php:135 src/Content/Conversation.php:332 -#: src/Module/Item/Compose.php:152 src/Object/Post.php:968 +#: src/Module/Item/Compose.php:152 src/Object/Post.php:962 msgid "Italic" msgstr "Kursiv" #: mod/editpost.php:136 src/Content/Conversation.php:333 -#: src/Module/Item/Compose.php:153 src/Object/Post.php:969 +#: src/Module/Item/Compose.php:153 src/Object/Post.php:963 msgid "Underline" msgstr "Unterstrichen" #: mod/editpost.php:137 src/Content/Conversation.php:334 -#: src/Module/Item/Compose.php:154 src/Object/Post.php:970 +#: src/Module/Item/Compose.php:154 src/Object/Post.php:964 msgid "Quote" msgstr "Zitat" #: mod/editpost.php:138 src/Content/Conversation.php:335 -#: src/Module/Item/Compose.php:155 src/Object/Post.php:971 +#: src/Module/Item/Compose.php:155 src/Object/Post.php:965 msgid "Code" msgstr "Code" #: mod/editpost.php:139 src/Content/Conversation.php:337 -#: src/Module/Item/Compose.php:157 src/Object/Post.php:973 +#: src/Module/Item/Compose.php:157 src/Object/Post.php:967 msgid "Link" msgstr "Link" #: mod/editpost.php:140 src/Content/Conversation.php:338 -#: src/Module/Item/Compose.php:158 src/Object/Post.php:974 +#: src/Module/Item/Compose.php:158 src/Object/Post.php:968 msgid "Link or Media" msgstr "Link oder Mediendatei" @@ -452,7 +452,7 @@ msgstr "Veranstaltung teilen" #: src/Module/Install.php:252 src/Module/Install.php:294 #: src/Module/Install.php:331 src/Module/Invite.php:177 #: src/Module/Item/Compose.php:150 src/Module/Profile/Profile.php:247 -#: src/Module/Settings/Profile/Index.php:222 src/Object/Post.php:965 +#: src/Module/Settings/Profile/Index.php:222 src/Object/Post.php:959 #: view/theme/duepuntozero/config.php:69 view/theme/frio/config.php:160 #: view/theme/quattro/config.php:71 view/theme/vier/config.php:119 msgid "Submit" @@ -506,7 +506,7 @@ msgid "OStatus support is disabled. Contact can't be added." msgstr "OStatus-Unterstützung ist nicht aktiviert. Der Kontakt kann nicht zugefügt werden." #: mod/follow.php:138 src/Content/Item.php:452 src/Content/Widget.php:76 -#: src/Model/Contact.php:1056 src/Model/Contact.php:1068 +#: src/Model/Contact.php:1057 src/Model/Contact.php:1069 #: view/theme/vier/theme.php:172 msgid "Connect/Follow" msgstr "Verbinden/Folgen" @@ -551,27 +551,27 @@ msgstr "Statusnachrichten und Beiträge" msgid "The contact could not be added." msgstr "Der Kontakt konnte nicht hinzugefügt werden." -#: mod/item.php:135 mod/item.php:139 +#: mod/item.php:134 mod/item.php:138 msgid "Unable to locate original post." msgstr "Konnte den Originalbeitrag nicht finden." -#: mod/item.php:341 mod/item.php:346 +#: mod/item.php:340 mod/item.php:345 msgid "Empty post discarded." msgstr "Leerer Beitrag wurde verworfen." -#: mod/item.php:736 +#: mod/item.php:724 msgid "Post updated." msgstr "Beitrag aktualisiert." -#: mod/item.php:746 mod/item.php:751 +#: mod/item.php:734 mod/item.php:739 msgid "Item wasn't stored." msgstr "Eintrag wurde nicht gespeichert" -#: mod/item.php:762 +#: mod/item.php:750 msgid "Item couldn't be fetched." msgstr "Eintrag konnte nicht geholt werden." -#: mod/item.php:908 src/Module/Admin/Themes/Details.php:39 +#: mod/item.php:896 src/Module/Admin/Themes/Details.php:39 #: src/Module/Admin/Themes/Index.php:59 src/Module/Debug/ItemBody.php:41 #: src/Module/Debug/ItemBody.php:56 msgid "Item not found." @@ -1104,12 +1104,12 @@ msgstr "Drehen EUS (links)" #: mod/photos.php:1339 mod/photos.php:1395 mod/photos.php:1469 #: src/Module/Contact.php:544 src/Module/Item/Compose.php:148 -#: src/Object/Post.php:962 +#: src/Object/Post.php:956 msgid "This is you" msgstr "Das bist du" #: mod/photos.php:1341 mod/photos.php:1397 mod/photos.php:1471 -#: src/Object/Post.php:498 src/Object/Post.php:964 +#: src/Object/Post.php:492 src/Object/Post.php:958 msgid "Comment" msgstr "Kommentar" @@ -1118,7 +1118,7 @@ msgstr "Kommentar" msgid "Select" msgstr "Auswählen" -#: mod/photos.php:1431 mod/settings.php:596 src/Content/Conversation.php:616 +#: mod/photos.php:1431 mod/settings.php:611 src/Content/Conversation.php:616 #: src/Module/Admin/Users/Active.php:139 #: src/Module/Admin/Users/Blocked.php:140 src/Module/Admin/Users/Index.php:153 msgid "Delete" @@ -1222,35 +1222,35 @@ msgid_plural "Errors" msgstr[0] "Fehler" msgstr[1] "Fehler" -#: mod/settings.php:128 +#: mod/settings.php:129 msgid "Failed to connect with email account using the settings provided." msgstr "Verbindung zum E-Mail-Konto mit den angegebenen Einstellungen nicht möglich." -#: mod/settings.php:158 +#: mod/settings.php:159 msgid "Contact CSV file upload error" msgstr "Fehler beim Hochladen der Kontakt CSV Datei" -#: mod/settings.php:177 +#: mod/settings.php:178 msgid "Importing Contacts done" msgstr "Kontakte wurden importiert." -#: mod/settings.php:190 +#: mod/settings.php:191 msgid "Relocate message has been send to your contacts" msgstr "Die Umzugsbenachrichtigung wurde an Deine Kontakte versendet." -#: mod/settings.php:202 +#: mod/settings.php:203 msgid "Passwords do not match." msgstr "Die Passwörter stimmen nicht überein." -#: mod/settings.php:210 src/Console/User.php:210 +#: mod/settings.php:211 src/Console/User.php:210 msgid "Password update failed. Please try again." msgstr "Aktualisierung des Passworts gescheitert, bitte versuche es noch einmal." -#: mod/settings.php:213 src/Console/User.php:213 +#: mod/settings.php:214 src/Console/User.php:213 msgid "Password changed." msgstr "Passwort geändert." -#: mod/settings.php:216 +#: mod/settings.php:217 msgid "Password unchanged." msgstr "Passwort unverändert." @@ -1274,23 +1274,15 @@ msgstr "Ungültige E-Mail-Adresse." msgid "Cannot change to that email." msgstr "Ändern der E-Mail nicht möglich. " -#: mod/settings.php:368 -msgid "Private forum has no privacy permissions. Using default privacy group." -msgstr "Für das private Forum sind keine Zugriffsrechte eingestellt. Die voreingestellte Gruppe für neue Kontakte wird benutzt." - -#: mod/settings.php:371 -msgid "Private forum has no privacy permissions and no default privacy group." -msgstr "Für das private Forum sind keine Zugriffsrechte eingestellt, und es gibt keine voreingestellte Gruppe für neue Kontakte." - -#: mod/settings.php:390 +#: mod/settings.php:395 msgid "Settings were not updated." msgstr "Einstellungen nicht aktualisiert" -#: mod/settings.php:431 +#: mod/settings.php:436 msgid "Connected Apps" msgstr "Verbundene Programme" -#: mod/settings.php:432 src/Module/Admin/Blocklist/Contact.php:106 +#: mod/settings.php:437 src/Module/Admin/Blocklist/Contact.php:106 #: src/Module/Admin/Users/Active.php:129 #: src/Module/Admin/Users/Blocked.php:130 src/Module/Admin/Users/Create.php:71 #: src/Module/Admin/Users/Deleted.php:88 src/Module/Admin/Users/Index.php:142 @@ -1299,20 +1291,20 @@ msgstr "Verbundene Programme" msgid "Name" msgstr "Name" -#: mod/settings.php:433 src/Content/Nav.php:212 +#: mod/settings.php:438 src/Content/Nav.php:212 msgid "Home Page" msgstr "Homepage" -#: mod/settings.php:434 src/Module/Admin/Queue.php:78 +#: mod/settings.php:439 src/Module/Admin/Queue.php:78 msgid "Created" msgstr "Erstellt" -#: mod/settings.php:435 +#: mod/settings.php:440 msgid "Remove authorization" msgstr "Autorisierung entziehen" -#: mod/settings.php:461 mod/settings.php:493 mod/settings.php:524 -#: mod/settings.php:598 mod/settings.php:735 +#: mod/settings.php:466 mod/settings.php:498 mod/settings.php:529 +#: mod/settings.php:613 mod/settings.php:750 #: src/Module/Admin/Addons/Index.php:69 src/Module/Admin/Features.php:87 #: src/Module/Admin/Logs/Settings.php:81 src/Module/Admin/Site.php:501 #: src/Module/Admin/Themes/Index.php:113 src/Module/Admin/Tos.php:83 @@ -1320,73 +1312,83 @@ msgstr "Autorisierung entziehen" msgid "Save Settings" msgstr "Einstellungen speichern" -#: mod/settings.php:469 +#: mod/settings.php:474 msgid "Addon Settings" msgstr "Addon Einstellungen" -#: mod/settings.php:470 +#: mod/settings.php:475 msgid "No Addon settings configured" msgstr "Keine Addon-Einstellungen konfiguriert" -#: mod/settings.php:491 +#: mod/settings.php:496 msgid "Additional Features" msgstr "Zusätzliche Features" -#: mod/settings.php:529 +#: mod/settings.php:534 msgid "Diaspora (Socialhome, Hubzilla)" msgstr "Diaspora (Socialhome, Hubzilla)" -#: mod/settings.php:529 mod/settings.php:530 +#: mod/settings.php:534 mod/settings.php:535 msgid "enabled" msgstr "eingeschaltet" -#: mod/settings.php:529 mod/settings.php:530 +#: mod/settings.php:534 mod/settings.php:535 msgid "disabled" msgstr "ausgeschaltet" -#: mod/settings.php:529 mod/settings.php:530 +#: mod/settings.php:534 mod/settings.php:535 #, php-format msgid "Built-in support for %s connectivity is %s" msgstr "Eingebaute Unterstützung für Verbindungen zu %s ist %s" -#: mod/settings.php:530 +#: mod/settings.php:535 msgid "OStatus (GNU Social)" msgstr "OStatus (GNU Social)" -#: mod/settings.php:556 +#: mod/settings.php:561 msgid "Email access is disabled on this site." msgstr "Zugriff auf E-Mails für diese Seite deaktiviert." -#: mod/settings.php:561 mod/settings.php:596 +#: mod/settings.php:566 mod/settings.php:611 msgid "None" msgstr "Keine" -#: mod/settings.php:567 src/Module/BaseSettings.php:78 +#: mod/settings.php:572 src/Module/BaseSettings.php:78 msgid "Social Networks" msgstr "Soziale Netzwerke" -#: mod/settings.php:572 +#: mod/settings.php:577 msgid "General Social Media Settings" msgstr "Allgemeine Einstellungen zu Sozialen Medien" -#: mod/settings.php:573 -msgid "Accept only top level posts by contacts you follow" -msgstr "Ausschließlich Unterhaltungen von meinen Kontakten anzeigen" +#: mod/settings.php:580 +msgid "Followed content scope" +msgstr "Umfang zu folgender Inhalte" -#: mod/settings.php:573 +#: mod/settings.php:582 msgid "" -"The system does an auto completion of threads when a comment arrives. This " -"has got the side effect that you can receive posts that had been started by " -"a non-follower but had been commented by someone you follow. This setting " -"deactivates this behaviour. When activated, you strictly only will receive " -"posts from people you really do follow." -msgstr "Wenn neue Kommentare empfangen werden führt das System eine Vervollständigung der Unterhaltung durch. Die hat den Nebeneffekt, dass Unterhaltungen in denen einer deiner Kontakte kommentiert haben, die aber nicht von einem deiner Kontakte begonnen wurden in deinem Netzwerk-Stream angezeigt werden können. Diese Option unterbindet dieses Verhalten. Ist sie aktiviert, wirst du ausschließlich die Unterhaltungen angezeigt bekommen, die von deinen Kontakten begonnen wurden." +"By default, conversations in which your follows participated but didn't " +"start will be shown in your timeline. You can turn this behavior off, or " +"expand it to the conversations in which your follows liked a post." +msgstr "Normalerweise werden Unterhaltungen an denen deine Kontakte beteiligt sind, sie aber nicht begonnen haben, in deiner Timeline angezeigt. Mit dieser Einstellung kann dieses Vorgehen kontrolliert werden. Es kann entweder dahin erweitert werden, dass auch Unterhaltungen angezeigt werden in denen deine Kontakte einen Kommentar mögen, oder komplett ausgeschaltet werden, so dass nur noch die Unterhaltungen angezeigt werden, die von deinen Kontakten gestartet wurden." -#: mod/settings.php:574 +#: mod/settings.php:584 +msgid "Only conversations my follows started" +msgstr "Nur Unterhaltungen, die meine Kontakte gestartet haben" + +#: mod/settings.php:585 +msgid "Conversations my follows started or commented on (default)" +msgstr "Unterhaltungen an denen meine Kontakte beteiligt sind (Grundeinstellung)" + +#: mod/settings.php:586 +msgid "Any conversation my follows interacted with, including likes" +msgstr "Unterhaltungen mit denen meine Kontakte interagiert haben, inklusive likes" + +#: mod/settings.php:589 msgid "Enable Content Warning" msgstr "Inhaltswarnungen einschalten" -#: mod/settings.php:574 +#: mod/settings.php:589 msgid "" "Users on networks like Mastodon or Pleroma are able to set a content warning" " field which collapse their post by default. This enables the automatic " @@ -1394,223 +1396,223 @@ msgid "" " affect any other content filtering you eventually set up." msgstr "Benutzer in Netzwerken wie Mastodon oder Pleroma können eine Warnung für sensitive Inhalte ihrer Beiträge erstellen. Mit dieser Option werden derart markierte Beiträge automatisch zusammengeklappt und die Inhaltswarnung wird als Titel des Beitrags angezeigt. Diese Option hat keinen Einfluss auf andere Inhaltsfilterungen, die du eventuell eingerichtet hast." -#: mod/settings.php:575 +#: mod/settings.php:590 msgid "Enable intelligent shortening" msgstr "Intelligentes kürzen einschalten" -#: mod/settings.php:575 +#: mod/settings.php:590 msgid "" "Normally the system tries to find the best link to add to shortened posts. " "If disabled, every shortened post will always point to the original " "friendica post." msgstr "Normalerweise versucht das System, den besten Link zu finden, um ihn zum gekürzten Postings hinzuzufügen. Wird diese Option ausgewählt, wird stets ein Link auf die originale Friendica-Nachricht beigefügt." -#: mod/settings.php:576 +#: mod/settings.php:591 msgid "Enable simple text shortening" msgstr "Einfache Textkürzung aktivieren" -#: mod/settings.php:576 +#: mod/settings.php:591 msgid "" "Normally the system shortens posts at the next line feed. If this option is " "enabled then the system will shorten the text at the maximum character " "limit." msgstr "Normalerweise kürzt das System Beiträge bei Zeilenumbrüchen. Ist diese Option aktiv, wird das System die Kürzung beim Erreichen der maximalen Zeichenzahl vornehmen." -#: mod/settings.php:577 +#: mod/settings.php:592 msgid "Attach the link title" msgstr "Link Titel hinzufügen" -#: mod/settings.php:577 +#: mod/settings.php:592 msgid "" "When activated, the title of the attached link will be added as a title on " "posts to Diaspora. This is mostly helpful with \"remote-self\" contacts that" " share feed content." msgstr "Ist dies aktiviert, wird der Titel von angehangenen Links bei Beiträgen nach Diaspora* angefügt. Dies ist vorallem bei Entfernten Konten nützlich die Beiträge von Feeds weiterleiten." -#: mod/settings.php:578 +#: mod/settings.php:593 msgid "Your legacy ActivityPub/GNU Social account" msgstr "Dein alter ActivityPub/GNU Social-Account" -#: mod/settings.php:578 +#: mod/settings.php:593 msgid "" "If you enter your old account name from an ActivityPub based system or your " "GNU Social/Statusnet account name here (in the format user@domain.tld), your" " contacts will be added automatically. The field will be emptied when done." msgstr "Wenn du deinen alten ActivityPub oder GNU Social/Statusnet-Account-Namen hier angibst (Format name@domain.tld), werden deine Kontakte automatisch hinzugefügt. Dieses Feld wird geleert, wenn die Kontakte hinzugefügt wurden." -#: mod/settings.php:581 +#: mod/settings.php:596 msgid "Repair OStatus subscriptions" msgstr "OStatus-Abonnements reparieren" -#: mod/settings.php:585 +#: mod/settings.php:600 msgid "Email/Mailbox Setup" msgstr "E-Mail/Postfach-Einstellungen" -#: mod/settings.php:586 +#: mod/settings.php:601 msgid "" "If you wish to communicate with email contacts using this service " "(optional), please specify how to connect to your mailbox." msgstr "Wenn du mit E-Mail-Kontakten über diesen Service kommunizieren möchtest (optional), gib bitte die Einstellungen für dein Postfach an." -#: mod/settings.php:587 +#: mod/settings.php:602 msgid "Last successful email check:" msgstr "Letzter erfolgreicher E-Mail-Check" -#: mod/settings.php:589 +#: mod/settings.php:604 msgid "IMAP server name:" msgstr "IMAP-Server-Name:" -#: mod/settings.php:590 +#: mod/settings.php:605 msgid "IMAP port:" msgstr "IMAP-Port:" -#: mod/settings.php:591 +#: mod/settings.php:606 msgid "Security:" msgstr "Sicherheit:" -#: mod/settings.php:592 +#: mod/settings.php:607 msgid "Email login name:" msgstr "E-Mail-Login-Name:" -#: mod/settings.php:593 +#: mod/settings.php:608 msgid "Email password:" msgstr "E-Mail-Passwort:" -#: mod/settings.php:594 +#: mod/settings.php:609 msgid "Reply-to address:" msgstr "Reply-to Adresse:" -#: mod/settings.php:595 +#: mod/settings.php:610 msgid "Send public posts to all email contacts:" msgstr "Sende öffentliche Beiträge an alle E-Mail-Kontakte:" -#: mod/settings.php:596 +#: mod/settings.php:611 msgid "Action after import:" msgstr "Aktion nach Import:" -#: mod/settings.php:596 src/Content/Nav.php:280 +#: mod/settings.php:611 src/Content/Nav.php:280 msgid "Mark as seen" msgstr "Als gelesen markieren" -#: mod/settings.php:596 +#: mod/settings.php:611 msgid "Move to folder" msgstr "In einen Ordner verschieben" -#: mod/settings.php:597 +#: mod/settings.php:612 msgid "Move to folder:" msgstr "In diesen Ordner verschieben:" -#: mod/settings.php:611 +#: mod/settings.php:626 msgid "Unable to find your profile. Please contact your admin." msgstr "Konnte dein Profil nicht finden. Bitte kontaktiere den Admin." -#: mod/settings.php:649 src/Content/Widget.php:526 +#: mod/settings.php:664 src/Content/Widget.php:526 msgid "Account Types" msgstr "Kontenarten" -#: mod/settings.php:650 +#: mod/settings.php:665 msgid "Personal Page Subtypes" msgstr "Unterarten der persönlichen Seite" -#: mod/settings.php:651 +#: mod/settings.php:666 msgid "Community Forum Subtypes" msgstr "Unterarten des Gemeinschaftsforums" -#: mod/settings.php:658 src/Module/Admin/BaseUsers.php:107 +#: mod/settings.php:673 src/Module/Admin/BaseUsers.php:107 msgid "Personal Page" msgstr "Persönliche Seite" -#: mod/settings.php:659 +#: mod/settings.php:674 msgid "Account for a personal profile." msgstr "Konto für ein persönliches Profil." -#: mod/settings.php:662 src/Module/Admin/BaseUsers.php:108 +#: mod/settings.php:677 src/Module/Admin/BaseUsers.php:108 msgid "Organisation Page" msgstr "Organisationsseite" -#: mod/settings.php:663 +#: mod/settings.php:678 msgid "" "Account for an organisation that automatically approves contact requests as " "\"Followers\"." msgstr "Konto für eine Organisation, das Kontaktanfragen automatisch als \"Follower\" annimmt." -#: mod/settings.php:666 src/Module/Admin/BaseUsers.php:109 +#: mod/settings.php:681 src/Module/Admin/BaseUsers.php:109 msgid "News Page" msgstr "Nachrichtenseite" -#: mod/settings.php:667 +#: mod/settings.php:682 msgid "" "Account for a news reflector that automatically approves contact requests as" " \"Followers\"." msgstr "Konto für einen Feedspiegel, das Kontaktanfragen automatisch als \"Follower\" annimmt." -#: mod/settings.php:670 src/Module/Admin/BaseUsers.php:110 +#: mod/settings.php:685 src/Module/Admin/BaseUsers.php:110 msgid "Community Forum" msgstr "Gemeinschaftsforum" -#: mod/settings.php:671 +#: mod/settings.php:686 msgid "Account for community discussions." msgstr "Konto für Diskussionsforen. " -#: mod/settings.php:674 src/Module/Admin/BaseUsers.php:100 +#: mod/settings.php:689 src/Module/Admin/BaseUsers.php:100 msgid "Normal Account Page" msgstr "Normales Konto" -#: mod/settings.php:675 +#: mod/settings.php:690 msgid "" "Account for a regular personal profile that requires manual approval of " "\"Friends\" and \"Followers\"." msgstr "Konto für ein normales, persönliches Profil. Kontaktanfragen müssen manuell als \"Friend\" oder \"Follower\" bestätigt werden." -#: mod/settings.php:678 src/Module/Admin/BaseUsers.php:101 +#: mod/settings.php:693 src/Module/Admin/BaseUsers.php:101 msgid "Soapbox Page" msgstr "Marktschreier-Konto" -#: mod/settings.php:679 +#: mod/settings.php:694 msgid "" "Account for a public profile that automatically approves contact requests as" " \"Followers\"." msgstr "Konto für ein öffentliches Profil, das Kontaktanfragen automatisch als \"Follower\" annimmt." -#: mod/settings.php:682 src/Module/Admin/BaseUsers.php:102 +#: mod/settings.php:697 src/Module/Admin/BaseUsers.php:102 msgid "Public Forum" msgstr "Öffentliches Forum" -#: mod/settings.php:683 +#: mod/settings.php:698 msgid "Automatically approves all contact requests." msgstr "Bestätigt alle Kontaktanfragen automatisch." -#: mod/settings.php:686 src/Module/Admin/BaseUsers.php:103 +#: mod/settings.php:701 src/Module/Admin/BaseUsers.php:103 msgid "Automatic Friend Page" msgstr "Automatische Freunde-Seite" -#: mod/settings.php:687 +#: mod/settings.php:702 msgid "" "Account for a popular profile that automatically approves contact requests " "as \"Friends\"." msgstr "Konto für ein gefragtes Profil, das Kontaktanfragen automatisch als \"Friend\" annimmt." -#: mod/settings.php:690 +#: mod/settings.php:705 msgid "Private Forum [Experimental]" msgstr "Privates Forum [Versuchsstadium]" -#: mod/settings.php:691 +#: mod/settings.php:706 msgid "Requires manual approval of contact requests." msgstr "Kontaktanfragen müssen manuell bestätigt werden." -#: mod/settings.php:702 +#: mod/settings.php:717 msgid "OpenID:" msgstr "OpenID:" -#: mod/settings.php:702 +#: mod/settings.php:717 msgid "(Optional) Allow this OpenID to login to this account." msgstr "(Optional) Erlaube die Anmeldung für dieses Konto mit dieser OpenID." -#: mod/settings.php:710 +#: mod/settings.php:725 msgid "Publish your profile in your local site directory?" msgstr "Darf dein Profil im lokalen Verzeichnis dieses Servers veröffentlicht werden?" -#: mod/settings.php:710 +#: mod/settings.php:725 #, php-format msgid "" "Your profile will be published in this node's local " @@ -1618,115 +1620,115 @@ msgid "" " system settings." msgstr "Dein Profil wird im lokalen Verzeichnis dieses Knotens veröffentlicht. Je nach Systemeinstellungen kann es öffentlich auffindbar sein." -#: mod/settings.php:716 +#: mod/settings.php:731 #, php-format msgid "" "Your profile will also be published in the global friendica directories " "(e.g. %s)." msgstr "Dein Profil wird auch in den globalen Friendica Verzeichnissen (z.B. %s) veröffentlicht werden." -#: mod/settings.php:722 +#: mod/settings.php:737 #, php-format msgid "Your Identity Address is '%s' or '%s'." msgstr "Die Adresse deines Profils lautet '%s' oder '%s'." -#: mod/settings.php:733 +#: mod/settings.php:748 msgid "Account Settings" msgstr "Kontoeinstellungen" -#: mod/settings.php:741 +#: mod/settings.php:756 msgid "Password Settings" msgstr "Passwort-Einstellungen" -#: mod/settings.php:742 src/Module/Register.php:162 +#: mod/settings.php:757 src/Module/Register.php:162 msgid "New Password:" msgstr "Neues Passwort:" -#: mod/settings.php:742 +#: mod/settings.php:757 msgid "" "Allowed characters are a-z, A-Z, 0-9 and special characters except white " "spaces, accentuated letters and colon (:)." msgstr "Erlaubte Zeichen sind a-z, A-Z, 0-9 und Sonderzeichen, abgesehen von Leerzeichen, Doppelpunkten (:) und akzentuierten Buchstaben." -#: mod/settings.php:743 src/Module/Register.php:163 +#: mod/settings.php:758 src/Module/Register.php:163 msgid "Confirm:" msgstr "Bestätigen:" -#: mod/settings.php:743 +#: mod/settings.php:758 msgid "Leave password fields blank unless changing" msgstr "Lass die Passwort-Felder leer, außer du willst das Passwort ändern" -#: mod/settings.php:744 +#: mod/settings.php:759 msgid "Current Password:" msgstr "Aktuelles Passwort:" -#: mod/settings.php:744 +#: mod/settings.php:759 msgid "Your current password to confirm the changes" msgstr "Dein aktuelles Passwort um die Änderungen zu bestätigen" -#: mod/settings.php:745 +#: mod/settings.php:760 msgid "Password:" msgstr "Passwort:" -#: mod/settings.php:745 +#: mod/settings.php:760 msgid "Your current password to confirm the changes of the email address" msgstr "Dein aktuelles Passwort um die Änderungen deiner E-Mail Adresse zu bestätigen" -#: mod/settings.php:748 +#: mod/settings.php:763 msgid "Delete OpenID URL" msgstr "OpenID URL löschen" -#: mod/settings.php:750 +#: mod/settings.php:765 msgid "Basic Settings" msgstr "Grundeinstellungen" -#: mod/settings.php:751 src/Module/Profile/Profile.php:144 +#: mod/settings.php:766 src/Module/Profile/Profile.php:144 msgid "Full Name:" msgstr "Kompletter Name:" -#: mod/settings.php:752 +#: mod/settings.php:767 msgid "Email Address:" msgstr "E-Mail-Adresse:" -#: mod/settings.php:753 +#: mod/settings.php:768 msgid "Your Timezone:" msgstr "Deine Zeitzone:" -#: mod/settings.php:754 +#: mod/settings.php:769 msgid "Your Language:" msgstr "Deine Sprache:" -#: mod/settings.php:754 +#: mod/settings.php:769 msgid "" "Set the language we use to show you friendica interface and to send you " "emails" msgstr "Wähle die Sprache, in der wir dir die Friendica-Oberfläche präsentieren sollen und dir E-Mail schicken" -#: mod/settings.php:755 +#: mod/settings.php:770 msgid "Default Post Location:" msgstr "Standardstandort:" -#: mod/settings.php:756 +#: mod/settings.php:771 msgid "Use Browser Location:" msgstr "Standort des Browsers verwenden:" -#: mod/settings.php:758 +#: mod/settings.php:773 msgid "Security and Privacy Settings" msgstr "Sicherheits- und Privatsphäre-Einstellungen" -#: mod/settings.php:760 +#: mod/settings.php:775 msgid "Maximum Friend Requests/Day:" msgstr "Maximale Anzahl von Kontaktanfragen/Tag:" -#: mod/settings.php:760 mod/settings.php:770 +#: mod/settings.php:775 mod/settings.php:785 msgid "(to prevent spam abuse)" msgstr "(um SPAM zu vermeiden)" -#: mod/settings.php:762 +#: mod/settings.php:777 msgid "Allow your profile to be searchable globally?" msgstr "Darf dein Profil bei Suchanfragen gefunden werden?" -#: mod/settings.php:762 +#: mod/settings.php:777 msgid "" "Activate this setting if you want others to easily find and follow you. Your" " profile will be searchable on remote systems. This setting also determines " @@ -1734,43 +1736,43 @@ msgid "" "indexed or not." msgstr "Aktiviere diese Einstellung, wenn du von anderen einfach gefunden und gefolgt werden möchtest. Dei Profil wird dann auf anderen Systemen leicht durchsuchbar. Außerdem regelt diese Einstellung ob Friendica Suchmaschinen mitteilen soll, ob dein Profil indiziert werden soll oder nicht." -#: mod/settings.php:763 +#: mod/settings.php:778 msgid "Hide your contact/friend list from viewers of your profile?" msgstr "Liste der Kontakte vor Betrachtern des Profil verbergen?" -#: mod/settings.php:763 +#: mod/settings.php:778 msgid "" "A list of your contacts is displayed on your profile page. Activate this " "option to disable the display of your contact list." msgstr "Auf deiner Profilseite wird eine Liste deiner Kontakte angezeigt. Aktiviere diese Option wenn du das nicht möchtest." -#: mod/settings.php:764 +#: mod/settings.php:779 msgid "Hide your profile details from anonymous viewers?" msgstr "Profil-Details vor unbekannten Betrachtern verbergen?" -#: mod/settings.php:764 +#: mod/settings.php:779 msgid "" "Anonymous visitors will only see your profile picture, your display name and" " the nickname you are using on your profile page. Your public posts and " "replies will still be accessible by other means." msgstr "Anonyme Besucher deines Profils werden ausschließlich dein Profilbild, deinen Namen sowie deinen Spitznamen sehen. Deine öffentlichen Beiträge und Kommentare werden weiterhin sichtbar sein." -#: mod/settings.php:765 +#: mod/settings.php:780 msgid "Make public posts unlisted" msgstr "Öffentliche Beiträge nicht listen" -#: mod/settings.php:765 +#: mod/settings.php:780 msgid "" "Your public posts will not appear on the community pages or in search " "results, nor be sent to relay servers. However they can still appear on " "public feeds on remote servers." msgstr "Deine öffentlichen Beiträge werden nicht auf der Gemeinschaftsseite oder in den Suchergebnissen erscheinen, außerdem werden sie nicht an Relay-Server geschickt. Sie werden aber weiterhin in allen öffentlichen Feeds, auch auf entfernten Servern, erscheinen." -#: mod/settings.php:766 +#: mod/settings.php:781 msgid "Make all posted pictures accessible" msgstr "Alle geposteten Bilder zugreifbar machen" -#: mod/settings.php:766 +#: mod/settings.php:781 msgid "" "This option makes every posted picture accessible via the direct link. This " "is a workaround for the problem that most other networks can't handle " @@ -1778,221 +1780,221 @@ msgid "" "public on your photo albums though." msgstr "Diese Option macht jedes veröffentlichte Bild über den direkten Link zugänglich. Dies ist eine Problemumgehung für das Problem, dass die meisten anderen Netzwerke keine Berechtigungen für Bilder verarbeiten können. Nicht öffentliche Bilder sind in Ihren Fotoalben jedoch immer noch nicht für die Öffentlichkeit sichtbar." -#: mod/settings.php:767 +#: mod/settings.php:782 msgid "Allow friends to post to your profile page?" msgstr "Dürfen deine Kontakte auf deine Pinnwand schreiben?" -#: mod/settings.php:767 +#: mod/settings.php:782 msgid "" "Your contacts may write posts on your profile wall. These posts will be " "distributed to your contacts" msgstr "Deine Kontakte können Beiträge auf deiner Pinnwand hinterlassen. Diese werden an deine Kontakte verteilt." -#: mod/settings.php:768 +#: mod/settings.php:783 msgid "Allow friends to tag your posts?" msgstr "Dürfen deine Kontakte deine Beiträge mit Schlagwörtern versehen?" -#: mod/settings.php:768 +#: mod/settings.php:783 msgid "Your contacts can add additional tags to your posts." msgstr "Deine Kontakte dürfen deine Beiträge mit zusätzlichen Schlagworten versehen." -#: mod/settings.php:769 +#: mod/settings.php:784 msgid "Permit unknown people to send you private mail?" msgstr "Dürfen dir Unbekannte private Nachrichten schicken?" -#: mod/settings.php:769 +#: mod/settings.php:784 msgid "" "Friendica network users may send you private messages even if they are not " "in your contact list." msgstr "Nutzer des Friendica Netzwerks können dir private Nachrichten senden, selbst wenn sie nicht in deine Kontaktliste sind." -#: mod/settings.php:770 +#: mod/settings.php:785 msgid "Maximum private messages per day from unknown people:" msgstr "Maximale Anzahl privater Nachrichten von Unbekannten pro Tag:" -#: mod/settings.php:772 +#: mod/settings.php:787 msgid "Default Post Permissions" msgstr "Standard-Zugriffsrechte für Beiträge" -#: mod/settings.php:776 +#: mod/settings.php:791 msgid "Expiration settings" msgstr "Verfalls-Einstellungen" -#: mod/settings.php:777 +#: mod/settings.php:792 msgid "Automatically expire posts after this many days:" msgstr "Beiträge verfallen automatisch nach dieser Anzahl von Tagen:" -#: mod/settings.php:777 +#: mod/settings.php:792 msgid "If empty, posts will not expire. Expired posts will be deleted" msgstr "Wenn leer, verfallen Beiträge nie automatisch. Verfallene Beiträge werden gelöscht." -#: mod/settings.php:778 +#: mod/settings.php:793 msgid "Expire posts" msgstr "Beiträge verfallen lassen" -#: mod/settings.php:778 +#: mod/settings.php:793 msgid "When activated, posts and comments will be expired." msgstr "Ist dies aktiviert, werden Beiträge und Kommentare verfallen." -#: mod/settings.php:779 +#: mod/settings.php:794 msgid "Expire personal notes" msgstr "Persönliche Notizen verfallen lassen" -#: mod/settings.php:779 +#: mod/settings.php:794 msgid "" "When activated, the personal notes on your profile page will be expired." msgstr "Ist dies aktiviert, werden persönliche Notizen auf deiner Pinnwand verfallen." -#: mod/settings.php:780 +#: mod/settings.php:795 msgid "Expire starred posts" msgstr "Markierte Beiträge verfallen lassen" -#: mod/settings.php:780 +#: mod/settings.php:795 msgid "" "Starring posts keeps them from being expired. That behaviour is overwritten " "by this setting." msgstr "Markierte Beiträge verfallen eigentlich nicht. Mit dieser Option kannst du sie verfallen lassen." -#: mod/settings.php:781 +#: mod/settings.php:796 msgid "Expire photos" msgstr "Fotos verfallen lassen" -#: mod/settings.php:781 +#: mod/settings.php:796 msgid "When activated, photos will be expired." msgstr "Wenn aktiviert, verfallen Fotos." -#: mod/settings.php:782 +#: mod/settings.php:797 msgid "Only expire posts by others" msgstr "Nur Beiträge anderer verfallen lassen." -#: mod/settings.php:782 +#: mod/settings.php:797 msgid "" "When activated, your own posts never expire. Then the settings above are " "only valid for posts you received." msgstr "Wenn aktiviert werden deine eigenen Beiträge niemals verfallen. Die obigen Einstellungen betreffen dann ausschließlich die Beiträge von anderen Accounts." -#: mod/settings.php:785 +#: mod/settings.php:800 msgid "Notification Settings" msgstr "Benachrichtigungseinstellungen" -#: mod/settings.php:786 +#: mod/settings.php:801 msgid "Send a notification email when:" msgstr "Benachrichtigungs-E-Mail senden, wenn:" -#: mod/settings.php:787 +#: mod/settings.php:802 msgid "You receive an introduction" msgstr "– du eine Kontaktanfrage erhältst" -#: mod/settings.php:788 +#: mod/settings.php:803 msgid "Your introductions are confirmed" msgstr "– eine Deiner Kontaktanfragen akzeptiert wurde" -#: mod/settings.php:789 +#: mod/settings.php:804 msgid "Someone writes on your profile wall" msgstr "– jemand etwas auf Deine Pinnwand schreibt" -#: mod/settings.php:790 +#: mod/settings.php:805 msgid "Someone writes a followup comment" msgstr "– jemand auch einen Kommentar verfasst" -#: mod/settings.php:791 +#: mod/settings.php:806 msgid "You receive a private message" msgstr "– du eine private Nachricht erhältst" -#: mod/settings.php:792 +#: mod/settings.php:807 msgid "You receive a friend suggestion" msgstr "– du eine Empfehlung erhältst" -#: mod/settings.php:793 +#: mod/settings.php:808 msgid "You are tagged in a post" msgstr "– du in einem Beitrag erwähnt wirst" -#: mod/settings.php:794 +#: mod/settings.php:809 msgid "You are poked/prodded/etc. in a post" msgstr "– du von jemandem angestupst oder sonstwie behandelt wirst" -#: mod/settings.php:796 +#: mod/settings.php:811 msgid "Create a desktop notification when:" msgstr "Benachrichtigungen anzeigen wenn:" -#: mod/settings.php:797 +#: mod/settings.php:812 msgid "Someone liked your content" msgstr "Einer deiner Beiträge gemocht wurde" -#: mod/settings.php:798 +#: mod/settings.php:813 msgid "Someone shared your content" msgstr "Einer deiner Beiträge geteilt wurde" -#: mod/settings.php:800 +#: mod/settings.php:815 msgid "Activate desktop notifications" msgstr "Desktop-Benachrichtigungen einschalten" -#: mod/settings.php:800 +#: mod/settings.php:815 msgid "Show desktop popup on new notifications" msgstr "Desktop-Benachrichtigungen einschalten" -#: mod/settings.php:802 +#: mod/settings.php:817 msgid "Text-only notification emails" msgstr "Benachrichtigungs-E-Mail als Rein-Text." -#: mod/settings.php:804 +#: mod/settings.php:819 msgid "Send text only notification emails, without the html part" msgstr "Sende Benachrichtigungs-E-Mail als Rein-Text - ohne HTML-Teil" -#: mod/settings.php:806 +#: mod/settings.php:821 msgid "Show detailled notifications" msgstr "Detaillierte Benachrichtigungen anzeigen" -#: mod/settings.php:808 +#: mod/settings.php:823 msgid "" "Per default, notifications are condensed to a single notification per item. " "When enabled every notification is displayed." msgstr "Normalerweise werden alle Benachrichtigungen zu einem Thema in einer einzigen Benachrichtigung zusammengefasst. Wenn diese Option aktiviert ist, wird jede Benachrichtigung einzeln angezeigt." -#: mod/settings.php:810 +#: mod/settings.php:825 msgid "Show notifications of ignored contacts" msgstr "Zeige Benachrichtigungen von ignorierten Kontakten" -#: mod/settings.php:812 +#: mod/settings.php:827 msgid "" "You don't see posts from ignored contacts. But you still see their comments." " This setting controls if you want to still receive regular notifications " "that are caused by ignored contacts or not." msgstr "Beiträge von ignorierten Kontakten werden dir nicht angezeigt. Aber du siehst immer noch ihre Kommentare. Diese Einstellung legt fest, ob du dazu weiterhin Benachrichtigungen erhalten willst oder ob diese einfach verworfen werden sollen." -#: mod/settings.php:814 +#: mod/settings.php:829 msgid "Advanced Account/Page Type Settings" msgstr "Erweiterte Konto-/Seitentyp-Einstellungen" -#: mod/settings.php:815 +#: mod/settings.php:830 msgid "Change the behaviour of this account for special situations" msgstr "Verhalten dieses Kontos in bestimmten Situationen:" -#: mod/settings.php:818 +#: mod/settings.php:833 msgid "Import Contacts" msgstr "Kontakte Importieren" -#: mod/settings.php:819 +#: mod/settings.php:834 msgid "" "Upload a CSV file that contains the handle of your followed accounts in the " "first column you exported from the old account." msgstr "Lade eine CSV Datei hoch, die das Handle der Kontakte deines alten Nutzerkontos in der ersten Spalte enthält." -#: mod/settings.php:820 +#: mod/settings.php:835 msgid "Upload File" msgstr "Datei hochladen" -#: mod/settings.php:822 +#: mod/settings.php:837 msgid "Relocate" msgstr "Umziehen" -#: mod/settings.php:823 +#: mod/settings.php:838 msgid "" "If you have moved this profile from another server, and some of your " "contacts don't receive your updates, try pushing this button." msgstr "Wenn du dein Profil von einem anderen Server umgezogen hast und einige deiner Kontakte deine Beiträge nicht erhalten, verwende diesen Button." -#: mod/settings.php:824 +#: mod/settings.php:839 msgid "Resend relocate message to contacts" msgstr "Umzugsbenachrichtigung erneut an Kontakte senden" @@ -2006,7 +2008,7 @@ msgstr "Keine Vorschläge verfügbar. Falls der Server frisch aufgesetzt wurde, msgid "Friend Suggestions" msgstr "Kontaktvorschläge" -#: mod/tagger.php:78 src/Content/Item.php:335 src/Model/Item.php:2620 +#: mod/tagger.php:78 src/Content/Item.php:335 src/Model/Item.php:2670 msgid "photo" msgstr "Foto" @@ -2525,7 +2527,7 @@ msgid "Visible to everybody" msgstr "Für jedermann sichtbar" #: src/Content/Conversation.php:308 src/Module/Item/Compose.php:159 -#: src/Object/Post.php:975 +#: src/Object/Post.php:969 msgid "Please enter a image/video/audio/webpage URL:" msgstr "Bitte gib eine Bild/Video/Audio/Webseiten-URL ein:" @@ -2549,12 +2551,12 @@ msgstr "Einträge löschen?" msgid "New Post" msgstr "Neuer Beitrag" -#: src/Content/Conversation.php:325 src/Object/Post.php:481 +#: src/Content/Conversation.php:325 src/Object/Post.php:475 msgid "Share" msgstr "Teilen" #: src/Content/Conversation.php:336 src/Module/Item/Compose.php:156 -#: src/Object/Post.php:972 +#: src/Object/Post.php:966 msgid "Image" msgstr "Bild" @@ -2566,21 +2568,21 @@ msgstr "Video" msgid "Scheduled at" msgstr "Geplant für" -#: src/Content/Conversation.php:651 src/Object/Post.php:454 -#: src/Object/Post.php:455 +#: src/Content/Conversation.php:651 src/Object/Post.php:448 +#: src/Object/Post.php:449 #, php-format msgid "View %s's profile @ %s" msgstr "Das Profil von %s auf %s betrachten." -#: src/Content/Conversation.php:664 src/Object/Post.php:442 +#: src/Content/Conversation.php:664 src/Object/Post.php:436 msgid "Categories:" msgstr "Kategorien:" -#: src/Content/Conversation.php:665 src/Object/Post.php:443 +#: src/Content/Conversation.php:665 src/Object/Post.php:437 msgid "Filed under:" msgstr "Abgelegt unter:" -#: src/Content/Conversation.php:673 src/Object/Post.php:468 +#: src/Content/Conversation.php:673 src/Object/Post.php:462 #, php-format msgid "%s from %s" msgstr "%s von %s" @@ -2762,7 +2764,7 @@ msgstr "mehr anzeigen" msgid "%1$s poked %2$s" msgstr "%1$s stupste %2$s" -#: src/Content/Item.php:327 src/Model/Item.php:2618 +#: src/Content/Item.php:327 src/Model/Item.php:2668 msgid "event" msgstr "Veranstaltung" @@ -2770,31 +2772,31 @@ msgstr "Veranstaltung" msgid "Follow Thread" msgstr "Folge der Unterhaltung" -#: src/Content/Item.php:432 src/Model/Contact.php:1061 +#: src/Content/Item.php:432 src/Model/Contact.php:1062 msgid "View Status" msgstr "Status anschauen" -#: src/Content/Item.php:433 src/Content/Item.php:455 src/Model/Contact.php:995 -#: src/Model/Contact.php:1053 src/Model/Contact.php:1062 +#: src/Content/Item.php:433 src/Content/Item.php:455 src/Model/Contact.php:996 +#: src/Model/Contact.php:1054 src/Model/Contact.php:1063 #: src/Module/Directory.php:157 src/Module/Settings/Profile/Index.php:225 msgid "View Profile" msgstr "Profil anschauen" -#: src/Content/Item.php:434 src/Model/Contact.php:1063 +#: src/Content/Item.php:434 src/Model/Contact.php:1064 msgid "View Photos" msgstr "Bilder anschauen" -#: src/Content/Item.php:435 src/Model/Contact.php:1054 -#: src/Model/Contact.php:1064 +#: src/Content/Item.php:435 src/Model/Contact.php:1055 +#: src/Model/Contact.php:1065 msgid "Network Posts" msgstr "Netzwerkbeiträge" -#: src/Content/Item.php:436 src/Model/Contact.php:1055 -#: src/Model/Contact.php:1065 +#: src/Content/Item.php:436 src/Model/Contact.php:1056 +#: src/Model/Contact.php:1066 msgid "View Contact" msgstr "Kontakt anzeigen" -#: src/Content/Item.php:437 src/Model/Contact.php:1066 +#: src/Content/Item.php:437 src/Model/Contact.php:1067 msgid "Send PM" msgstr "Private Nachricht senden" @@ -2813,11 +2815,11 @@ msgstr "Sperren" msgid "Ignore" msgstr "Ignorieren" -#: src/Content/Item.php:443 src/Object/Post.php:429 +#: src/Content/Item.php:443 src/Object/Post.php:423 msgid "Languages" msgstr "Sprachen" -#: src/Content/Item.php:447 src/Model/Contact.php:1067 +#: src/Content/Item.php:447 src/Model/Contact.php:1068 msgid "Poke" msgstr "Anstupsen" @@ -3112,8 +3114,8 @@ msgstr "Bild/Foto" msgid "%2$s %3$s" msgstr "%2$s%3$s" -#: src/Content/Text/BBCode.php:1185 src/Model/Item.php:3149 -#: src/Model/Item.php:3155 src/Model/Item.php:3156 +#: src/Content/Text/BBCode.php:1185 src/Model/Item.php:3199 +#: src/Model/Item.php:3205 src/Model/Item.php:3206 msgid "Link to source" msgstr "Link zum Originalbeitrag" @@ -3211,7 +3213,7 @@ msgstr "Weltweites Verzeichnis" msgid "Local Directory" msgstr "Lokales Verzeichnis" -#: src/Content/Widget.php:207 src/Model/Group.php:507 +#: src/Content/Widget.php:207 src/Model/Group.php:508 #: src/Module/Contact.php:354 src/Module/Welcome.php:76 msgid "Groups" msgstr "Gruppen" @@ -3268,7 +3270,7 @@ msgstr "Personen" msgid "Organisations" msgstr "Organisationen" -#: src/Content/Widget.php:522 src/Model/Contact.php:1494 +#: src/Content/Widget.php:522 src/Model/Contact.php:1472 msgid "News" msgstr "Nachrichten" @@ -4091,81 +4093,81 @@ msgstr "Interner Serverfehler" msgid "Legacy module file not found: %s" msgstr "Legacy-Moduldatei nicht gefunden: %s" -#: src/Model/Contact.php:1057 src/Model/Contact.php:1069 +#: src/Model/Contact.php:1058 src/Model/Contact.php:1070 msgid "UnFollow" msgstr "Entfolgen" -#: src/Model/Contact.php:1075 src/Module/Admin/Users/Pending.php:107 +#: src/Model/Contact.php:1076 src/Module/Admin/Users/Pending.php:107 #: src/Module/Notifications/Introductions.php:130 #: src/Module/Notifications/Introductions.php:202 msgid "Approve" msgstr "Genehmigen" -#: src/Model/Contact.php:1490 +#: src/Model/Contact.php:1468 msgid "Organisation" msgstr "Organisation" -#: src/Model/Contact.php:1498 +#: src/Model/Contact.php:1476 msgid "Forum" msgstr "Forum" -#: src/Model/Contact.php:2433 +#: src/Model/Contact.php:2411 msgid "Disallowed profile URL." msgstr "Nicht erlaubte Profil-URL." -#: src/Model/Contact.php:2438 src/Module/Friendica.php:81 +#: src/Model/Contact.php:2416 src/Module/Friendica.php:81 msgid "Blocked domain" msgstr "Blockierte Domain" -#: src/Model/Contact.php:2443 +#: src/Model/Contact.php:2421 msgid "Connect URL missing." msgstr "Connect-URL fehlt" -#: src/Model/Contact.php:2452 +#: src/Model/Contact.php:2430 msgid "" "The contact could not be added. Please check the relevant network " "credentials in your Settings -> Social Networks page." msgstr "Der Kontakt konnte nicht hinzugefügt werden. Bitte überprüfe die Einstellungen unter Einstellungen -> Soziale Netzwerke" -#: src/Model/Contact.php:2489 +#: src/Model/Contact.php:2467 msgid "The profile address specified does not provide adequate information." msgstr "Die angegebene Profiladresse liefert unzureichende Informationen." -#: src/Model/Contact.php:2491 +#: src/Model/Contact.php:2469 msgid "No compatible communication protocols or feeds were discovered." msgstr "Es wurden keine kompatiblen Kommunikationsprotokolle oder Feeds gefunden." -#: src/Model/Contact.php:2494 +#: src/Model/Contact.php:2472 msgid "An author or name was not found." msgstr "Es wurde kein Autor oder Name gefunden." -#: src/Model/Contact.php:2497 +#: src/Model/Contact.php:2475 msgid "No browser URL could be matched to this address." msgstr "Zu dieser Adresse konnte keine passende Browser-URL gefunden werden." -#: src/Model/Contact.php:2500 +#: src/Model/Contact.php:2478 msgid "" "Unable to match @-style Identity Address with a known protocol or email " "contact." msgstr "Konnte die @-Adresse mit keinem der bekannten Protokolle oder Email-Kontakte abgleichen." -#: src/Model/Contact.php:2501 +#: src/Model/Contact.php:2479 msgid "Use mailto: in front of address to force email check." msgstr "Verwende mailto: vor der E-Mail-Adresse, um eine Überprüfung der E-Mail-Adresse zu erzwingen." -#: src/Model/Contact.php:2507 +#: src/Model/Contact.php:2485 msgid "" "The profile address specified belongs to a network which has been disabled " "on this site." msgstr "Die Adresse dieses Profils gehört zu einem Netzwerk, mit dem die Kommunikation auf dieser Seite ausgeschaltet wurde." -#: src/Model/Contact.php:2512 +#: src/Model/Contact.php:2490 msgid "" "Limited profile. This person will be unable to receive direct/personal " "notifications from you." msgstr "Eingeschränktes Profil. Diese Person wird keine direkten/privaten Nachrichten von dir erhalten können." -#: src/Model/Contact.php:2571 +#: src/Model/Contact.php:2549 msgid "Unable to retrieve contact information." msgstr "Konnte die Kontaktinformationen nicht empfangen." @@ -4241,77 +4243,77 @@ msgstr "%ss Geburtstag" msgid "Happy Birthday %s" msgstr "Herzlichen Glückwunsch, %s" -#: src/Model/Group.php:94 +#: src/Model/Group.php:95 msgid "" "A deleted group with this name was revived. Existing item permissions " "may apply to this group and any future members. If this is " "not what you intended, please create another group with a different name." msgstr "Eine gelöschte Gruppe mit diesem Namen wurde wiederbelebt. Bestehende Berechtigungseinstellungen könnten auf diese Gruppe oder zukünftige Mitglieder angewandt werden. Falls du dies nicht möchtest, erstelle bitte eine andere Gruppe mit einem anderen Namen." -#: src/Model/Group.php:423 +#: src/Model/Group.php:424 msgid "Default privacy group for new contacts" msgstr "Voreingestellte Gruppe für neue Kontakte" -#: src/Model/Group.php:455 +#: src/Model/Group.php:456 msgid "Everybody" msgstr "Alle Kontakte" -#: src/Model/Group.php:474 +#: src/Model/Group.php:475 msgid "edit" msgstr "bearbeiten" -#: src/Model/Group.php:506 +#: src/Model/Group.php:507 msgid "add" msgstr "hinzufügen" -#: src/Model/Group.php:511 +#: src/Model/Group.php:512 msgid "Edit group" msgstr "Gruppe bearbeiten" -#: src/Model/Group.php:512 src/Module/Group.php:194 +#: src/Model/Group.php:513 src/Module/Group.php:194 msgid "Contacts not in any group" msgstr "Kontakte in keiner Gruppe" -#: src/Model/Group.php:514 +#: src/Model/Group.php:515 msgid "Create a new group" msgstr "Neue Gruppe erstellen" -#: src/Model/Group.php:515 src/Module/Group.php:179 src/Module/Group.php:202 +#: src/Model/Group.php:516 src/Module/Group.php:179 src/Module/Group.php:202 #: src/Module/Group.php:277 msgid "Group Name: " msgstr "Gruppenname:" -#: src/Model/Group.php:516 +#: src/Model/Group.php:517 msgid "Edit groups" msgstr "Gruppen bearbeiten" -#: src/Model/Item.php:1691 +#: src/Model/Item.php:1764 #, php-format msgid "Detected languages in this post:\\n%s" msgstr "Erkannte Sprachen in diesem Beitrag:\\n%s" -#: src/Model/Item.php:2622 +#: src/Model/Item.php:2672 msgid "activity" msgstr "Aktivität" -#: src/Model/Item.php:2624 +#: src/Model/Item.php:2674 msgid "comment" msgstr "Kommentar" -#: src/Model/Item.php:2627 +#: src/Model/Item.php:2677 msgid "post" msgstr "Beitrag" -#: src/Model/Item.php:2764 +#: src/Model/Item.php:2814 #, php-format msgid "Content warning: %s" msgstr "Inhaltswarnung: %s" -#: src/Model/Item.php:3114 +#: src/Model/Item.php:3164 msgid "bytes" msgstr "Byte" -#: src/Model/Item.php:3143 src/Model/Item.php:3144 +#: src/Model/Item.php:3193 src/Model/Item.php:3194 msgid "View on separate page" msgstr "Auf separater Seite ansehen" @@ -6060,10 +6062,20 @@ msgstr "Wenn gewollt, kann man hier eine strenge Zertifikatskontrolle einstellen msgid "Proxy user" msgstr "Proxy-Nutzer" +#: src/Module/Admin/Site.php:573 +msgid "User name for the proxy server." +msgstr "Nutzername für den Proxy-Server" + #: src/Module/Admin/Site.php:574 msgid "Proxy URL" msgstr "Proxy-URL" +#: src/Module/Admin/Site.php:574 +msgid "" +"If you want to use a proxy server that Friendica should use to connect to " +"the network, put the URL of the proxy here." +msgstr "Wenn Friendica einen Proxy-Server verwenden soll um das Netzwerk zu erreichen, füge hier die URL des Proxys ein." + #: src/Module/Admin/Site.php:575 msgid "Network timeout" msgstr "Netzwerk-Wartezeit" @@ -8680,19 +8692,19 @@ msgstr "Betrachten als" #: src/Module/Profile/Profile.php:326 src/Module/Profile/Profile.php:329 #: src/Module/Profile/Status.php:65 src/Module/Profile/Status.php:68 -#: src/Protocol/Feed.php:990 src/Protocol/OStatus.php:1242 +#: src/Protocol/Feed.php:990 src/Protocol/OStatus.php:1245 #, php-format msgid "%s's timeline" msgstr "Timeline von %s" #: src/Module/Profile/Profile.php:327 src/Module/Profile/Status.php:66 -#: src/Protocol/Feed.php:994 src/Protocol/OStatus.php:1246 +#: src/Protocol/Feed.php:994 src/Protocol/OStatus.php:1249 #, php-format msgid "%s's posts" msgstr "Beiträge von %s" #: src/Module/Profile/Profile.php:328 src/Module/Profile/Status.php:67 -#: src/Protocol/Feed.php:997 src/Protocol/OStatus.php:1249 +#: src/Protocol/Feed.php:997 src/Protocol/OStatus.php:1252 #, php-format msgid "%s's comments" msgstr "Kommentare von %s" @@ -10559,89 +10571,81 @@ msgstr "Kommentiere diesen Beitrag von deinem System aus" msgid "Remote comment" msgstr "Entfernter Kommentar" -#: src/Object/Post.php:422 -msgid "Pushed" -msgstr "Pushed" - -#: src/Object/Post.php:422 -msgid "Pulled" -msgstr "Pulled" - -#: src/Object/Post.php:456 +#: src/Object/Post.php:450 msgid "to" msgstr "zu" -#: src/Object/Post.php:457 +#: src/Object/Post.php:451 msgid "via" msgstr "via" -#: src/Object/Post.php:458 +#: src/Object/Post.php:452 msgid "Wall-to-Wall" msgstr "Wall-to-Wall" -#: src/Object/Post.php:459 +#: src/Object/Post.php:453 msgid "via Wall-To-Wall:" msgstr "via Wall-To-Wall:" -#: src/Object/Post.php:499 +#: src/Object/Post.php:493 #, php-format msgid "Reply to %s" msgstr "Antworte %s" -#: src/Object/Post.php:502 +#: src/Object/Post.php:496 msgid "More" msgstr "Mehr" -#: src/Object/Post.php:520 +#: src/Object/Post.php:514 msgid "Notifier task is pending" msgstr "Die Benachrichtigungsaufgabe ist ausstehend" -#: src/Object/Post.php:521 +#: src/Object/Post.php:515 msgid "Delivery to remote servers is pending" msgstr "Die Auslieferung an Remote-Server steht noch aus" -#: src/Object/Post.php:522 +#: src/Object/Post.php:516 msgid "Delivery to remote servers is underway" msgstr "Die Auslieferung an Remote-Server ist unterwegs" -#: src/Object/Post.php:523 +#: src/Object/Post.php:517 msgid "Delivery to remote servers is mostly done" msgstr "Die Zustellung an Remote-Server ist fast erledigt" -#: src/Object/Post.php:524 +#: src/Object/Post.php:518 msgid "Delivery to remote servers is done" msgstr "Die Zustellung an die Remote-Server ist erledigt" -#: src/Object/Post.php:544 +#: src/Object/Post.php:538 #, php-format msgid "%d comment" msgid_plural "%d comments" msgstr[0] "%d Kommentar" msgstr[1] "%d Kommentare" -#: src/Object/Post.php:545 +#: src/Object/Post.php:539 msgid "Show more" msgstr "Zeige mehr" -#: src/Object/Post.php:546 +#: src/Object/Post.php:540 msgid "Show fewer" msgstr "Zeige weniger" -#: src/Protocol/OStatus.php:1645 +#: src/Protocol/OStatus.php:1648 #, php-format msgid "%s is now following %s." msgstr "%s folgt nun %s" -#: src/Protocol/OStatus.php:1646 +#: src/Protocol/OStatus.php:1649 msgid "following" msgstr "folgen" -#: src/Protocol/OStatus.php:1649 +#: src/Protocol/OStatus.php:1652 #, php-format msgid "%s stopped following %s." msgstr "%s hat aufgehört %s, zu folgen" -#: src/Protocol/OStatus.php:1650 +#: src/Protocol/OStatus.php:1653 msgid "stopped following" msgstr "wird nicht mehr gefolgt" @@ -10760,7 +10764,7 @@ msgstr "in %1$d %2$s" msgid "%1$d %2$s ago" msgstr "%1$d %2$s her" -#: src/Worker/Delivery.php:525 +#: src/Worker/Delivery.php:524 msgid "(no subject)" msgstr "(kein Betreff)" diff --git a/view/lang/de/strings.php b/view/lang/de/strings.php index 603ee81dc..9e480c20f 100644 --- a/view/lang/de/strings.php +++ b/view/lang/de/strings.php @@ -326,8 +326,6 @@ $a->strings['Name too short.'] = 'Der Name ist zu kurz.'; $a->strings['Wrong Password.'] = 'Falsches Passwort'; $a->strings['Invalid email.'] = 'Ungültige E-Mail-Adresse.'; $a->strings['Cannot change to that email.'] = 'Ändern der E-Mail nicht möglich. '; -$a->strings['Private forum has no privacy permissions. Using default privacy group.'] = 'Für das private Forum sind keine Zugriffsrechte eingestellt. Die voreingestellte Gruppe für neue Kontakte wird benutzt.'; -$a->strings['Private forum has no privacy permissions and no default privacy group.'] = 'Für das private Forum sind keine Zugriffsrechte eingestellt, und es gibt keine voreingestellte Gruppe für neue Kontakte.'; $a->strings['Settings were not updated.'] = 'Einstellungen nicht aktualisiert'; $a->strings['Connected Apps'] = 'Verbundene Programme'; $a->strings['Name'] = 'Name'; @@ -347,8 +345,11 @@ $a->strings['Email access is disabled on this site.'] = 'Zugriff auf E-Mails fü $a->strings['None'] = 'Keine'; $a->strings['Social Networks'] = 'Soziale Netzwerke'; $a->strings['General Social Media Settings'] = 'Allgemeine Einstellungen zu Sozialen Medien'; -$a->strings['Accept only top level posts by contacts you follow'] = 'Ausschließlich Unterhaltungen von meinen Kontakten anzeigen'; -$a->strings['The system does an auto completion of threads when a comment arrives. This has got the side effect that you can receive posts that had been started by a non-follower but had been commented by someone you follow. This setting deactivates this behaviour. When activated, you strictly only will receive posts from people you really do follow.'] = 'Wenn neue Kommentare empfangen werden führt das System eine Vervollständigung der Unterhaltung durch. Die hat den Nebeneffekt, dass Unterhaltungen in denen einer deiner Kontakte kommentiert haben, die aber nicht von einem deiner Kontakte begonnen wurden in deinem Netzwerk-Stream angezeigt werden können. Diese Option unterbindet dieses Verhalten. Ist sie aktiviert, wirst du ausschließlich die Unterhaltungen angezeigt bekommen, die von deinen Kontakten begonnen wurden.'; +$a->strings['Followed content scope'] = 'Umfang zu folgender Inhalte'; +$a->strings['By default, conversations in which your follows participated but didn\'t start will be shown in your timeline. You can turn this behavior off, or expand it to the conversations in which your follows liked a post.'] = 'Normalerweise werden Unterhaltungen an denen deine Kontakte beteiligt sind, sie aber nicht begonnen haben, in deiner Timeline angezeigt. Mit dieser Einstellung kann dieses Vorgehen kontrolliert werden. Es kann entweder dahin erweitert werden, dass auch Unterhaltungen angezeigt werden in denen deine Kontakte einen Kommentar mögen, oder komplett ausgeschaltet werden, so dass nur noch die Unterhaltungen angezeigt werden, die von deinen Kontakten gestartet wurden.'; +$a->strings['Only conversations my follows started'] = 'Nur Unterhaltungen, die meine Kontakte gestartet haben'; +$a->strings['Conversations my follows started or commented on (default)'] = 'Unterhaltungen an denen meine Kontakte beteiligt sind (Grundeinstellung)'; +$a->strings['Any conversation my follows interacted with, including likes'] = 'Unterhaltungen mit denen meine Kontakte interagiert haben, inklusive likes'; $a->strings['Enable Content Warning'] = 'Inhaltswarnungen einschalten'; $a->strings['Users on networks like Mastodon or Pleroma are able to set a content warning field which collapse their post by default. This enables the automatic collapsing instead of setting the content warning as the post title. Doesn\'t affect any other content filtering you eventually set up.'] = 'Benutzer in Netzwerken wie Mastodon oder Pleroma können eine Warnung für sensitive Inhalte ihrer Beiträge erstellen. Mit dieser Option werden derart markierte Beiträge automatisch zusammengeklappt und die Inhaltswarnung wird als Titel des Beitrags angezeigt. Diese Option hat keinen Einfluss auf andere Inhaltsfilterungen, die du eventuell eingerichtet hast.'; $a->strings['Enable intelligent shortening'] = 'Intelligentes kürzen einschalten'; @@ -1534,7 +1535,9 @@ $a->strings['Enable built-in Diaspora network compatibility for communicating wi $a->strings['Verify SSL'] = 'SSL Überprüfen'; $a->strings['If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites.'] = 'Wenn gewollt, kann man hier eine strenge Zertifikatskontrolle einstellen. Das bedeutet, dass man zu keinen Seiten mit selbst unterzeichnetem SSL-Zertifikat eine Verbindung herstellen kann.'; $a->strings['Proxy user'] = 'Proxy-Nutzer'; +$a->strings['User name for the proxy server.'] = 'Nutzername für den Proxy-Server'; $a->strings['Proxy URL'] = 'Proxy-URL'; +$a->strings['If you want to use a proxy server that Friendica should use to connect to the network, put the URL of the proxy here.'] = 'Wenn Friendica einen Proxy-Server verwenden soll um das Netzwerk zu erreichen, füge hier die URL des Proxys ein.'; $a->strings['Network timeout'] = 'Netzwerk-Wartezeit'; $a->strings['Value is in seconds. Set to 0 for unlimited (not recommended).'] = 'Der Wert ist in Sekunden. Setze 0 für unbegrenzt (nicht empfohlen).'; $a->strings['Maximum Load Average'] = 'Maximum Load Average'; @@ -2586,8 +2589,6 @@ $a->strings['Unshare'] = 'Nicht mehr teilen'; $a->strings['%s (Received %s)'] = '%s (Empfangen %s)'; $a->strings['Comment this item on your system'] = 'Kommentiere diesen Beitrag von deinem System aus'; $a->strings['Remote comment'] = 'Entfernter Kommentar'; -$a->strings['Pushed'] = 'Pushed'; -$a->strings['Pulled'] = 'Pulled'; $a->strings['to'] = 'zu'; $a->strings['via'] = 'via'; $a->strings['Wall-to-Wall'] = 'Wall-to-Wall'; diff --git a/view/templates/search_item.tpl b/view/templates/search_item.tpl index c6938e29e..0c1d63503 100644 --- a/view/templates/search_item.tpl +++ b/view/templates/search_item.tpl @@ -47,9 +47,9 @@
- {{if $item.drop.dropping}}{{/if}} + {{if $item.drop && $item.drop.dropping}}{{/if}}
- {{if $item.drop.pagedrop}}{{/if}} + {{if $item.drop && $item.drop.pagedrop}}{{/if}}
diff --git a/view/templates/settings/connectors.tpl b/view/templates/settings/connectors.tpl index 0479e99d9..8010cc982 100644 --- a/view/templates/settings/connectors.tpl +++ b/view/templates/settings/connectors.tpl @@ -11,7 +11,7 @@ diff --git a/view/theme/frio/templates/search_item.tpl b/view/theme/frio/templates/search_item.tpl index 2fbff14d7..39e66751f 100644 --- a/view/theme/frio/templates/search_item.tpl +++ b/view/theme/frio/templates/search_item.tpl @@ -1,6 +1,6 @@ @@ -245,7 +245,7 @@ {{/if}} - {{if $item.drop.dropping}} + {{if $item.drop && $item.drop.dropping}}
  • {{$item.drop.delete}}
  • @@ -270,7 +270,7 @@ {{/if}} - {{if $item.drop.pagedrop}} + {{if $item.drop && $item.drop.pagedrop}} {{/if}} diff --git a/view/theme/frio/templates/settings/connectors.tpl b/view/theme/frio/templates/settings/connectors.tpl index 069b9d3d1..dc32c174f 100644 --- a/view/theme/frio/templates/settings/connectors.tpl +++ b/view/theme/frio/templates/settings/connectors.tpl @@ -18,7 +18,7 @@
    - {{include file="field_checkbox.tpl" field=$accept_only_sharer}} + {{include file="field_select.tpl" field=$accept_only_sharer}} {{include file="field_checkbox.tpl" field=$enable_cw}} diff --git a/view/theme/frio/templates/settings/settings.tpl b/view/theme/frio/templates/settings/settings.tpl index bf129cc12..b9e105e88 100644 --- a/view/theme/frio/templates/settings/settings.tpl +++ b/view/theme/frio/templates/settings/settings.tpl @@ -70,28 +70,29 @@
    - - - {{include file="field_input.tpl" field=$maxreq}} {{$profile_in_dir nofilter}} {{include file="field_checkbox.tpl" field=$profile_in_net_dir}} - {{include file="field_checkbox.tpl" field=$hide_friends}} + {{if not $is_community}}{{include file="field_checkbox.tpl" field=$hide_friends}}{{/if}} {{include file="field_checkbox.tpl" field=$hide_wall}} - {{include file="field_checkbox.tpl" field=$unlisted}} + {{if not $is_community}}{{include file="field_checkbox.tpl" field=$unlisted}}{{/if}} {{include file="field_checkbox.tpl" field=$accessiblephotos}} + {{if not $is_community}} {{include file="field_checkbox.tpl" field=$blockwall}} {{include file="field_checkbox.tpl" field=$blocktags}} + {{/if}} {{include file="field_checkbox.tpl" field=$unkmail}} {{include file="field_input.tpl" field=$cntunkmail}} {{$group_select nofilter}} + {{if not $is_community}}

    {{$permissions}}

    {{$aclselect nofilter}} + {{/if}}
    {{/if}} - {{if $item.edpost || $item.tagger || $item.filer || $item.pin || $item.star || $item.follow_thread || $item.ignore || $item.drop.dropping}} + {{if $item.edpost || $item.tagger || $item.filer || $item.pin || $item.star || $item.follow_thread || $item.ignore || ($item.drop && $item.drop.dropping)}} {{/if}} - {{if $item.drop.pagedrop}} + {{if $item.drop && $item.drop.pagedrop}} {{/if}} diff --git a/view/theme/quattro/templates/search_item.tpl b/view/theme/quattro/templates/search_item.tpl index 903138874..b5c6af7e7 100644 --- a/view/theme/quattro/templates/search_item.tpl +++ b/view/theme/quattro/templates/search_item.tpl @@ -71,10 +71,10 @@
    - {{if $item.drop.pagedrop}} + {{if $item.drop && $item.drop.pagedrop}} {{/if}} - {{if $item.drop.dropping}} + {{if $item.drop && $item.drop.dropping}} {{$item.drop.delete}} {{/if}} {{if $item.edpost}} diff --git a/view/theme/quattro/templates/wall_item_tag.tpl b/view/theme/quattro/templates/wall_item_tag.tpl index 5f2021b3e..3aa9d3ad4 100644 --- a/view/theme/quattro/templates/wall_item_tag.tpl +++ b/view/theme/quattro/templates/wall_item_tag.tpl @@ -40,10 +40,10 @@ {{$item.ago}} {{$item.body_html nofilter}}
    - {{if $item.drop.pagedrop}} + {{if $item.drop && $item.drop.pagedrop}} {{/if}} - {{if $item.drop.dropping}} + {{if $item.drop && $item.drop.dropping}} {{$item.drop.delete}} {{/if}}
    diff --git a/view/theme/quattro/templates/wall_thread.tpl b/view/theme/quattro/templates/wall_thread.tpl index 29dae72b4..1382222c1 100644 --- a/view/theme/quattro/templates/wall_thread.tpl +++ b/view/theme/quattro/templates/wall_thread.tpl @@ -145,10 +145,10 @@
    - {{if $item.drop.pagedrop}} + {{if $item.drop && $item.drop.pagedrop}} {{/if}} - {{if $item.drop.dropping}} + {{if $item.drop && $item.drop.dropping}} {{$item.drop.delete}} {{/if}} {{if $item.edpost}} diff --git a/view/theme/smoothly/templates/search_item.tpl b/view/theme/smoothly/templates/search_item.tpl index 7675c2db1..94d713267 100644 --- a/view/theme/smoothly/templates/search_item.tpl +++ b/view/theme/smoothly/templates/search_item.tpl @@ -26,9 +26,9 @@
    - {{if $item.drop.dropping}}{{/if}} + {{if $item.drop && $item.drop.dropping}}{{/if}}
    - {{if $item.drop.pagedrop}}{{/if}} + {{if $item.drop && $item.drop.pagedrop}}{{/if}}
    diff --git a/view/theme/smoothly/templates/wall_thread.tpl b/view/theme/smoothly/templates/wall_thread.tpl index 773938f3c..53602cc8f 100644 --- a/view/theme/smoothly/templates/wall_thread.tpl +++ b/view/theme/smoothly/templates/wall_thread.tpl @@ -135,12 +135,12 @@ {{/if}}
    - {{if $item.drop.dropping}} + {{if $item.drop && $item.drop.dropping}} {{/if}}
    - {{if $item.drop.pagedrop}} + {{if $item.drop && $item.drop.pagedrop}} {{/if}} diff --git a/view/theme/vier/templates/search_item.tpl b/view/theme/vier/templates/search_item.tpl index 44fb6804d..2441c80fe 100644 --- a/view/theme/vier/templates/search_item.tpl +++ b/view/theme/vier/templates/search_item.tpl @@ -75,10 +75,10 @@
    - {{if $item.drop.pagedrop}} + {{if $item.drop && $item.drop.pagedrop}} {{/if}} - {{if $item.drop.dropping}} + {{if $item.drop && $item.drop.dropping}} {{$item.drop.delete}} {{/if}} {{if $item.edpost}} diff --git a/view/theme/vier/templates/wall_item_tag.tpl b/view/theme/vier/templates/wall_item_tag.tpl index 01207ab11..c12cb7085 100644 --- a/view/theme/vier/templates/wall_item_tag.tpl +++ b/view/theme/vier/templates/wall_item_tag.tpl @@ -40,10 +40,10 @@ {{$item.ago}} {{$item.body_html nofilter}}
    - {{if $item.drop.pagedrop}} + {{if $item.drop && $item.drop.pagedrop}} {{/if}} - {{if $item.drop.dropping}} + {{if $item.drop && $item.drop.dropping}} {{$item.drop.delete}} {{/if}}
    diff --git a/view/theme/vier/templates/wall_thread.tpl b/view/theme/vier/templates/wall_thread.tpl index f2bd02e7e..7d851d001 100644 --- a/view/theme/vier/templates/wall_thread.tpl +++ b/view/theme/vier/templates/wall_thread.tpl @@ -162,10 +162,10 @@
    - {{if $item.drop.pagedrop}} + {{if $item.drop && $item.drop.pagedrop}} {{/if}} - {{if $item.drop.dropping}} + {{if $item.drop && $item.drop.dropping}} {{$item.drop.delete}} {{/if}} {{if $item.edpost}}