]> git.mxchange.org Git - friendica.git/commitdiff
New user account type "Channel Relay"
authorMichael <heluecht@pirati.ca>
Sat, 6 Jan 2024 17:27:42 +0000 (17:27 +0000)
committerRoland Häder <roland@mxchange.org>
Sun, 28 Jan 2024 15:36:29 +0000 (16:36 +0100)
12 files changed:
src/Content/Conversation/Repository/UserDefinedChannel.php
src/Core/L10n.php
src/Model/Contact.php
src/Model/Item.php
src/Model/Post/Engagement.php
src/Model/User.php
src/Module/Conversation/Timeline.php
src/Module/Settings/Account.php
src/Protocol/ActivityPub/Processor.php
src/Protocol/Relay.php
view/lang/C/messages.po
view/templates/settings/pagetypes.tpl

index 7815acdd8a9a79649274b37eb39d6450fe08a004..6572eda140be1bfcc27cf3766c674f0b81d5b300 100644 (file)
@@ -25,24 +25,27 @@ use Friendica\BaseCollection;
 use Friendica\Content\Conversation\Collection\UserDefinedChannels;
 use Friendica\Content\Conversation\Entity;
 use Friendica\Content\Conversation\Factory;
-use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues;
+use Friendica\Core\Config\Capability\IManageConfigValues;
 use Friendica\Database\Database;
+use Friendica\Database\DBA;
+use Friendica\Model\Contact;
 use Friendica\Model\Post\Engagement;
 use Friendica\Model\User;
+use Friendica\Util\DateTimeFormat;
 use Psr\Log\LoggerInterface;
 
 class UserDefinedChannel extends \Friendica\BaseRepository
 {
        protected static $table_name = 'channel';
 
-       /** @var IManagePersonalConfigValues */
-       private $pConfig;
+       /** @var IManageConfigValues */
+       private $config;
 
-       public function __construct(Database $database, LoggerInterface $logger, Factory\UserDefinedChannel $factory, IManagePersonalConfigValues $pConfig)
+       public function __construct(Database $database, LoggerInterface $logger, Factory\UserDefinedChannel $factory, IManageConfigValues $config)
        {
                parent::__construct($database, $logger, $factory);
 
-               $this->pConfig = $pConfig;
+               $this->config = $config;
        }
 
        /**
@@ -63,6 +66,11 @@ class UserDefinedChannel extends \Friendica\BaseRepository
                return $Entities;
        }
 
+       public function select(array $condition, array $params = []): BaseCollection
+       {
+               return $this->_select($condition, $params);
+       }
+
        /**
         * Fetch a single user channel
         *
@@ -146,34 +154,127 @@ class UserDefinedChannel extends \Friendica\BaseRepository
         *
         * @param string $searchtext
         * @param string $language
+        * @param array  $tags
+        * @param int    $media_type
         * @return boolean
         */
-       public function match(string $searchtext, string $language): bool
+       public function match(string $searchtext, string $language, array $tags, int $media_type): bool
+       {
+               $condition = ["`verified` AND NOT `blocked` AND NOT `account_removed` AND NOT `account_expired` AND `user`.`uid` > ?", 0];
+
+               $abandon_days = intval($this->config->get('system', 'account_abandon_days'));
+               if (!empty($abandon_days)) {
+                       $condition = DBA::mergeConditions($condition, ["`last-activity` > ?", DateTimeFormat::utc('now - ' . $abandon_days . ' days')]);
+               }
+
+               $users = $this->db->selectToArray('user', ['uid'], $condition);
+               if (empty($users)) {
+                       return [];
+               }
+
+               return !empty($this->getMatches($searchtext, $language, $tags, $media_type, 0, array_column($users, 'uid'), false));
+       }
+
+       /**
+        * Fetch the channel users that have got matching channels
+        *
+        * @param string $searchtext
+        * @param string $language
+        * @param array $tags
+        * @param integer $media_type
+        * @return array
+        */
+       public function getMatchingChannelUsers(string $searchtext, string $language, array $tags, int $media_type, int $author_id): array
+       {
+               $users = $this->db->selectToArray('user', ['uid'], ["`account-type` = ? AND `uid` != ?", User::ACCOUNT_TYPE_RELAY, 0]);
+               if (empty($users)) {
+                       return [];
+               }
+               return $this->getMatches($searchtext, $language, $tags, $media_type, $author_id, array_column($users, 'uid'), true);
+       }
+
+       private function getMatches(string $searchtext, string $language, array $tags, int $media_type, int $author_id, array $channelUids, bool $relayMode): array
        {
                if (!in_array($language, User::getLanguages())) {
                        $this->logger->debug('Unwanted language found. No matched channel found.', ['language' => $language, 'searchtext' => $searchtext]);
-                       return false;
+                       return [];
                }
 
-               $store = false;
                $this->db->insert('check-full-text-search', ['pid' => getmypid(), 'searchtext' => $searchtext], Database::INSERT_UPDATE);
-               $channels = $this->db->select(self::$table_name, ['full-text-search', 'uid', 'label'], ["`full-text-search` != ? AND `circle` = ?", '', 0]);
-               while ($channel = $this->db->fetch($channels)) {
-                       $channelsearchtext = $channel['full-text-search'];
-                       foreach (Engagement::KEYWORDS as $keyword) {
-                               $channelsearchtext = preg_replace('~(' . $keyword . ':.[\w@\.-]+)~', '"$1"', $channelsearchtext);
+
+               $uids = [];
+
+               $condition = ['uid' => $channelUids];
+               if (!$relayMode) {
+                       $condition = DBA::mergeConditions($condition, ["`full-text-search` != ?", '']);
+               }
+
+               foreach ($this->select($condition) as $channel) {
+                       if (in_array($channel->uid, $uids)) {
+                               continue;
+                       }
+                       if (!empty($channel->circle) && ($channel->circle > 0) && !in_array($channel->uid, $uids)) {
+                               $account = Contact::selectFirstAccountUser(['id'], ['pid' => $author_id, 'uid' => $channel->uid]);
+                               if (empty($account['id']) || !$this->db->exists('group_member', ['gid' => $channel->circle, 'contact-id' => $account['id']])) {
+                                       continue;
+                               }
+                       }
+                       if (!empty($channel->languages) && !in_array($channel->uid, $uids)) {
+                               if (!in_array($language, $channel->languages)) {
+                                       continue;
+                               }
+                       } elseif (!in_array($language, User::getWantedLanguages($channel->uid))) {
+                               continue;
                        }
-                       if ($this->db->exists('check-full-text-search', ["`pid` = ? AND MATCH (`searchtext`) AGAINST (? IN BOOLEAN MODE)", getmypid(), $channelsearchtext])) {
-                               if (in_array($language, $this->pConfig->get($channel['uid'], 'channel', 'languages', [User::getLanguageCode($channel['uid'])]))) {
-                                       $store = true;
-                                       $this->logger->debug('Matching channel found.', ['uid' => $channel['uid'], 'label' => $channel['label'], 'language' => $language, 'channelsearchtext' => $channelsearchtext, 'searchtext' => $searchtext]);
-                                       break;
+                       if (!empty($channel->includeTags) && !in_array($channel->uid, $uids)) {
+                               if (empty($tags)) {
+                                       continue;
+                               }
+                               $match = false;
+                               foreach (explode(',', $channel->includeTags) as $tag) {
+                                       if (in_array($tag, $tags)) {
+                                               $match = true;
+                                               break;
+                                       }
+                               }
+                               if (!$match) {
+                                       continue;
                                }
                        }
+                       if (!empty($tags) && !empty($channel->excludeTags) && !in_array($channel->uid, $uids)) {
+                               $match = false;
+                               foreach (explode(',', $channel->excludeTags) as $tag) {
+                                       if (in_array($tag, $tags)) {
+                                               $match = true;
+                                               break;
+                                       }
+                               }
+                               if ($match) {
+                                       continue;
+                               }
+                       }
+                       if (!empty($channel->mediaType) && !in_array($channel->uid, $uids)) {
+                               if (!($channel->mediaType & $media_type)) {
+                                       continue;
+                               }
+                       }
+                       if (!empty($channel->fullTextSearch) && !in_array($channel->uid, $uids)) {
+                               $channelsearchtext = $channel->fullTextSearch;
+                               foreach (Engagement::KEYWORDS as $keyword) {
+                                       $channelsearchtext = preg_replace('~(' . $keyword . ':.[\w@\.-]+)~', '"$1"', $channelsearchtext);
+                               }
+                               if (!$this->db->exists('check-full-text-search', ["`pid` = ? AND MATCH (`searchtext`) AGAINST (? IN BOOLEAN MODE)", getmypid(), $channelsearchtext])) {
+                                       continue;
+                               }
+                       }
+                       $uids[] = $channel->uid;
+                       $this->logger->debug('Matching channel found.', ['uid' => $channel->uid, 'label' => $channel->label, 'language' => $language, 'tags' => $tags, 'media_type' => $media_type, 'searchtext' => $searchtext]);
+                       if (!$relayMode) {
+                               return $uids;
+                       }
                }
-               $this->db->close($channels);
 
                $this->db->delete('check-full-text-search', ['pid' => getmypid()]);
-               return $store;
+               return $uids;
        }
 }
index 3fa48bed99943aabce04b4cd7b19990c591e1fde..900bfa5e9e1db2d9428623213df4301a65b40a1b 100644 (file)
@@ -436,7 +436,7 @@ class L10n
        {
                $iso639 = new \Matriphe\ISO639\ISO639;
 
-               $languages = [];
+               $languages = ['un' => $this->t('Undeteced Language')];
 
                foreach ($this->getDetectableLanguages() as $code) {
                        $code     = $this->toISO6391($code);
index 7873cb2dbab2a3ead687469dcfe4661895212bd0..acf1a4dd83c0625204a7bf5c5bd5513ccf038d8d 100644 (file)
@@ -172,6 +172,11 @@ class Contact
                return DBA::selectFirst('account-view', $fields, $condition, $params);
        }
 
+       public static function selectFirstAccountUser(array $fields = [], array $condition = [], array $params = [])
+       {
+               return DBA::selectFirst('account-user-view', $fields, $condition, $params);
+       }
+
        /**
         * Insert a row into the contact table
         * Important: You can't use DBA::lastInsertId() after this call since it will be set to 0.
index 3fea148b88a747fbe033fb6a9303b540eac7c1c3..33cf61d61f1f983fe8394e9dd0517d1afb3040ba 100644 (file)
@@ -1440,12 +1440,41 @@ class Item
                        if (in_array($posted_item['gravity'], [self::GRAVITY_ACTIVITY, self::GRAVITY_COMMENT])) {
                                Post\Counts::update($posted_item['thr-parent-id'], $posted_item['parent-uri-id'], $posted_item['vid'], $posted_item['verb'], $posted_item['body']);
                        }
-                       Post\Engagement::storeFromItem($posted_item);
+
+                       $engagement_uri_id = Post\Engagement::storeFromItem($posted_item);
+                       if ($engagement_uri_id) {
+                               self::reshareChannelPost($engagement_uri_id);
+                       }
                }
 
                return $post_user_id;
        }
 
+       private static function reshareChannelPost(int $uri_id)
+       {
+               $item = Post::selectFirst(['id', 'private', 'network', 'language', 'author-id'], ['uri-id' => $uri_id, 'uid' => 0]);
+               if (empty($item['id'])) {
+                       return;
+               }
+
+               if (($item['private'] != self::PUBLIC) || !in_array($item['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN])) {
+                       return;
+               }
+
+               $engagement = DBA::selectFirst('post-engagement', ['searchtext', 'media-type'], ['uri-id' => $uri_id]);
+               if (empty($engagement['searchtext'])) {
+                       return;
+               }
+
+               $language = !empty($item['language']) ? array_key_first(json_decode($item['language'], true)) : '';
+               $tags     = array_column(Tag::getByURIId($uri_id, [Tag::HASHTAG]), 'name');
+
+               foreach (DI::userDefinedChannel()->getMatchingChannelUsers($engagement['searchtext'], $language, $tags, $engagement['media-type'], $item['author-id']) as $uid) {
+                       Logger::debug('Reshare post', ['uid' => $uid, 'uri-id' => $uri_id, 'language' => $language, 'tags' => $tags, 'searchtext' => $engagement['searchtext'], 'media_type' => $engagement['media-type']]);
+                       self::performActivity($item['id'], 'announce', $uid);
+               }
+       }
+
        /**
         * Fetch the post reason for a given item array
         *
index f2e890db49ae49e35bc9f51912bc8f7654068ba7..a9e1bbfbda50239316890dad98be497f488dcaad 100644 (file)
@@ -45,13 +45,13 @@ class Engagement
         * Store engagement data from an item array
         *
         * @param array $item
-        * @return void
+        * @return int uri-id of the engagement post if newly inserted, 0 on update
         */
-       public static function storeFromItem(array $item)
+       public static function storeFromItem(array $item): int
        {
                if (in_array($item['verb'], [Activity::FOLLOW, Activity::VIEW, Activity::READ])) {
                        Logger::debug('Technical activities are not stored', ['uri-id' => $item['uri-id'], 'parent-uri-id' => $item['parent-uri-id'], 'verb' => $item['verb']]);
-                       return;
+                       return 0;
                }
 
                $parent = Post::selectFirst(['uri-id', 'created', 'author-id', 'owner-id', 'uid', 'private', 'contact-contact-type', 'language', 'network',
@@ -60,7 +60,7 @@ class Engagement
 
                if ($parent['created'] < self::getCreationDateLimit(false)) {
                        Logger::debug('Post is too old', ['uri-id' => $item['uri-id'], 'parent-uri-id' => $item['parent-uri-id'], 'created' => $parent['created']]);
-                       return;
+                       return 0;
                }
 
                $store = ($item['gravity'] != Item::GRAVITY_PARENT);
@@ -87,10 +87,9 @@ class Engagement
 
                $searchtext = self::getSearchTextForItem($parent);
                if (!$store) {
-                       $content   = trim(($parent['title'] ?? '') . ' ' . ($parent['content-warning'] ?? '') . ' ' . ($parent['body'] ?? ''));
-                       $languages = Item::getLanguageArray($content, 1, 0, $parent['author-id']);
-                       $language  = !empty($languages) ? array_key_first($languages) : '';
-                       $store     = DI::userDefinedChannel()->match($searchtext, $language);
+                       $tags     = array_column(Tag::getByURIId($item['parent-uri-id'], [Tag::HASHTAG]), 'name');
+                       $language = !empty($parent['language']) ? array_key_first(json_decode($parent['language'], true)) : '';
+                       $store    = DI::userDefinedChannel()->match($searchtext, $language, $tags, $mediatype);
                }
 
                $engagement = [
@@ -111,10 +110,17 @@ class Engagement
                ];
                if (!$store && ($engagement['comments'] == 0) && ($engagement['activities'] == 0)) {
                        Logger::debug('No media, follower, subscribed tags, comments or activities. Engagement not stored', ['fields' => $engagement]);
-                       return;
+                       return 0;
+               }
+               $exists = DBA::exists('post-engagement', ['uri-id' => $engagement['uri-id']]);
+               if ($exists) {
+                       $ret = DBA::update('post-engagement', $engagement, ['uri-id' => $engagement['uri-id']]);
+                       Logger::debug('Engagement updated', ['uri-id' => $engagement['uri-id'], 'ret' => $ret]);
+               } else {
+                       $ret = DBA::insert('post-engagement', $engagement);
+                       Logger::debug('Engagement inserted', ['uri-id' => $engagement['uri-id'], 'ret' => $ret]);
                }
-               $ret = DBA::insert('post-engagement', $engagement, Database::INSERT_UPDATE);
-               Logger::debug('Engagement stored', ['fields' => $engagement, 'ret' => $ret]);
+               return ($ret || !$exists) ? $engagement['uri-id'] : 0;
        }
 
        public static function getSearchTextForActivity(string $content, int $author_id, array $tags, array $receivers): string
index 3463437103de113e58a83c639d775fed5dda6c27..3f76da20431d2d22cec9e5d7af54a59ec425c52c 100644 (file)
@@ -638,6 +638,12 @@ class User
                }
                DBA::close($channels);
 
+               foreach (DI::userDefinedChannel()->select(["NOT `languages` IS NULL"]) as $channel) {
+                       foreach ($channel->languages ?? [] as $language) {
+                               $languages[$language] = $language;
+                       }
+               }
+
                ksort($languages);
                $languages = array_keys($languages);
                DI::cache()->set($cachekey, $languages);
index 1fdc9e0603ae1cc84e36b7ea6f05f624339b11f0..c351553e40f249188896a9299912f16ffe2b4955 100644 (file)
@@ -432,11 +432,15 @@ class Timeline extends BaseModule
                $conditions = [];
                $languages  = $languages ?: User::getWantedLanguages($uid);
                foreach ($languages as $language) {
-                       $conditions[] = "JSON_EXTRACT(JSON_KEYS(language), '$[0]') = ?";
-                       $condition[]  = $language;
+                       if ($language == 'un') {
+                               $conditions[] = "`language` IS NULL";
+                       } else {
+                               $conditions[] = "JSON_EXTRACT(JSON_KEYS(language), '$[0]') = ?";
+                               $condition[]  = $language;
+                       }
                }
                if (!empty($conditions)) {
-                       $condition[0] .= " AND (`language` IS NULL OR " . implode(' OR ', $conditions) . ")";
+                       $condition[0] .= " AND (" . implode(' OR ', $conditions) . ")";
                }
                return $condition;
        }
index 41d4f0fc587fd204cec18c06c84c5297cb646fa7..543762a7fdee5045f6b7fea0211dff16253338e1 100644 (file)
@@ -316,6 +316,8 @@ class Account extends BaseSettings
                                $page_flags = User::PAGE_FLAGS_SOAPBOX;
                        } elseif ($account_type == User::ACCOUNT_TYPE_COMMUNITY && !in_array($page_flags, [User::PAGE_FLAGS_COMMUNITY, User::PAGE_FLAGS_PRVGROUP])) {
                                $page_flags = User::PAGE_FLAGS_COMMUNITY;
+                       } elseif ($account_type == User::ACCOUNT_TYPE_RELAY && $page_flags != User::PAGE_FLAGS_SOAPBOX) {
+                               $page_flags = User::PAGE_FLAGS_SOAPBOX;
                        }
 
                        $fields = [
@@ -433,6 +435,7 @@ class Account extends BaseSettings
                        '$type_organisation' => User::ACCOUNT_TYPE_ORGANISATION,
                        '$type_news'         => User::ACCOUNT_TYPE_NEWS,
                        '$type_community'    => User::ACCOUNT_TYPE_COMMUNITY,
+                       '$type_relay'        => User::ACCOUNT_TYPE_RELAY,
                        '$account_person'    => [
                                'account-type',
                                DI::l10n()->t('Personal Page'),
@@ -461,6 +464,13 @@ class Account extends BaseSettings
                                DI::l10n()->t('Account for community discussions.'),
                                $user['account-type'] == User::ACCOUNT_TYPE_COMMUNITY
                        ],
+                       '$account_relay' => [
+                               'account-type',
+                               DI::l10n()->t('Channel Relay'),
+                               User::ACCOUNT_TYPE_RELAY,
+                               DI::l10n()->t('Account for a service that automatically shares content based on user defined channels.'),
+                               $user['account-type'] == User::ACCOUNT_TYPE_RELAY
+                       ],
                        '$page_normal' => [
                                'page-flags',
                                DI::l10n()->t('Normal Account Page'),
index 593c1e783622743d0474d60275e5f424372c4f22..f0fbf1185aeee974718efca0eb37cb33a62eb56f 100644 (file)
@@ -1787,7 +1787,7 @@ class Processor
                $searchtext = Engagement::getSearchTextForActivity($content, $authorid, $messageTags, $receivers);
                $languages  = Item::getLanguageArray($content, 1, 0, $authorid);
                $language   = !empty($languages) ? array_key_first($languages) : '';
-               return DI::userDefinedChannel()->match($searchtext, $language);
+               return DI::userDefinedChannel()->match($searchtext, $language, $messageTags, 0);
        }
 
        /**
index 611d66cf44c299e464e22196925f5c8e000c1519..934d09651db2d9a75de13ba87d4ab55faebc8105 100644 (file)
@@ -157,20 +157,16 @@ class Relay
         */
        public static function getSubscribedTags(): array
        {
-               $systemTags  = [];
-               $server_tags = DI::config()->get('system', 'relay_server_tags');
-
-               foreach (explode(',', mb_strtolower($server_tags)) as $tag) {
-                       $systemTags[] = trim($tag, '# ');
+               $tags  = [];
+               foreach (explode(',', mb_strtolower(DI::config()->get('system', 'relay_server_tags'))) as $tag) {
+                       $tags[] = trim($tag, '# ');
                }
 
                if (DI::config()->get('system', 'relay_user_tags')) {
-                       $userTags = Search::getUserTags();
-               } else {
-                       $userTags = [];
+                       $tags = array_merge($tags, Search::getUserTags());
                }
 
-               return array_unique(array_merge($systemTags, $userTags));
+               return array_unique($tags);
        }
 
        /**
index 72b7cadf397cda7bf1b81be342f7a12a7e423961..be43370c5941f09587b5e4ed1301fdc896ebf5d4 100644 (file)
@@ -66,7 +66,7 @@ msgstr ""
 #: src/Module/Register.php:77 src/Module/Register.php:90
 #: src/Module/Register.php:206 src/Module/Register.php:245
 #: src/Module/Search/Directory.php:37 src/Module/Settings/Account.php:50
-#: src/Module/Settings/Account.php:384 src/Module/Settings/Channels.php:57
+#: src/Module/Settings/Account.php:386 src/Module/Settings/Channels.php:57
 #: src/Module/Settings/Channels.php:125 src/Module/Settings/Delegation.php:90
 #: src/Module/Settings/Display.php:90 src/Module/Settings/Display.php:197
 #: src/Module/Settings/Profile/Photo/Crop.php:165
@@ -957,7 +957,7 @@ msgstr ""
 msgid "Enter user nickname: "
 msgstr ""
 
-#: src/Console/User.php:182 src/Model/User.php:806
+#: src/Console/User.php:182 src/Model/User.php:812
 #: src/Module/Api/Twitter/ContactEndpoint.php:74
 #: src/Module/Moderation/Users/Active.php:71
 #: src/Module/Moderation/Users/Blocked.php:71
@@ -1749,7 +1749,7 @@ msgstr ""
 
 #: src/Content/GroupManager.php:147 src/Content/Nav.php:278
 #: src/Content/Text/HTML.php:880 src/Content/Widget.php:537
-#: src/Model/User.php:1368
+#: src/Model/User.php:1374
 msgid "Groups"
 msgstr ""
 
@@ -1770,7 +1770,7 @@ msgstr ""
 msgid "Create new group"
 msgstr ""
 
-#: src/Content/Item.php:332 src/Model/Item.php:3166
+#: src/Content/Item.php:332 src/Model/Item.php:3195
 msgid "event"
 msgstr ""
 
@@ -1778,7 +1778,7 @@ msgstr ""
 msgid "status"
 msgstr ""
 
-#: src/Content/Item.php:341 src/Model/Item.php:3168
+#: src/Content/Item.php:341 src/Model/Item.php:3197
 #: src/Module/Post/Tag/Add.php:123
 msgid "photo"
 msgstr ""
@@ -1792,31 +1792,31 @@ msgstr ""
 msgid "Follow Thread"
 msgstr ""
 
-#: src/Content/Item.php:430 src/Model/Contact.php:1242
+#: src/Content/Item.php:430 src/Model/Contact.php:1247
 msgid "View Status"
 msgstr ""
 
-#: src/Content/Item.php:431 src/Content/Item.php:452 src/Model/Contact.php:1176
-#: src/Model/Contact.php:1233 src/Model/Contact.php:1243
+#: src/Content/Item.php:431 src/Content/Item.php:452 src/Model/Contact.php:1181
+#: src/Model/Contact.php:1238 src/Model/Contact.php:1248
 #: src/Module/Directory.php:157 src/Module/Settings/Profile/Index.php:259
 msgid "View Profile"
 msgstr ""
 
-#: src/Content/Item.php:432 src/Model/Contact.php:1244
+#: src/Content/Item.php:432 src/Model/Contact.php:1249
 msgid "View Photos"
 msgstr ""
 
-#: src/Content/Item.php:433 src/Model/Contact.php:1211
+#: src/Content/Item.php:433 src/Model/Contact.php:1216
 #: src/Model/Profile.php:468
 msgid "Network Posts"
 msgstr ""
 
-#: src/Content/Item.php:434 src/Model/Contact.php:1235
-#: src/Model/Contact.php:1246
+#: src/Content/Item.php:434 src/Model/Contact.php:1240
+#: src/Model/Contact.php:1251
 msgid "View Contact"
 msgstr ""
 
-#: src/Content/Item.php:435 src/Model/Contact.php:1247
+#: src/Content/Item.php:435 src/Model/Contact.php:1252
 msgid "Send PM"
 msgstr ""
 
@@ -1852,7 +1852,7 @@ msgid "Languages"
 msgstr ""
 
 #: src/Content/Item.php:449 src/Content/Widget.php:80
-#: src/Model/Contact.php:1236 src/Model/Contact.php:1248
+#: src/Model/Contact.php:1241 src/Model/Contact.php:1253
 #: src/Module/Contact/Follow.php:167 view/theme/vier/theme.php:195
 msgid "Connect/Follow"
 msgstr ""
@@ -2191,8 +2191,8 @@ msgid ""
 "<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s"
 msgstr ""
 
-#: src/Content/Text/BBCode.php:994 src/Model/Item.php:3899
-#: src/Model/Item.php:3905 src/Model/Item.php:3906
+#: src/Content/Text/BBCode.php:994 src/Model/Item.php:3928
+#: src/Model/Item.php:3934 src/Model/Item.php:3935
 msgid "Link to source"
 msgstr ""
 
@@ -2360,11 +2360,11 @@ msgstr ""
 msgid "Organisations"
 msgstr ""
 
-#: src/Content/Widget.php:536 src/Model/Contact.php:1738
+#: src/Content/Widget.php:536 src/Model/Contact.php:1743
 msgid "News"
 msgstr ""
 
-#: src/Content/Widget.php:542 src/Module/Settings/Account.php:428
+#: src/Content/Widget.php:542 src/Module/Settings/Account.php:430
 msgid "Account Types"
 msgstr ""
 
@@ -2855,6 +2855,10 @@ msgstr ""
 msgid "Could not connect to database."
 msgstr ""
 
+#: src/Core/L10n.php:439
+msgid "Undeteced Language"
+msgstr ""
+
 #: src/Core/L10n.php:446
 #, php-format
 msgid "%s (%s)"
@@ -3229,82 +3233,82 @@ msgstr ""
 msgid "Edit circles"
 msgstr ""
 
-#: src/Model/Contact.php:1256 src/Module/Moderation/Users/Pending.php:102
+#: src/Model/Contact.php:1261 src/Module/Moderation/Users/Pending.php:102
 #: src/Module/Notifications/Introductions.php:132
 #: src/Module/Notifications/Introductions.php:204
 msgid "Approve"
 msgstr ""
 
-#: src/Model/Contact.php:1734
+#: src/Model/Contact.php:1739
 msgid "Organisation"
 msgstr ""
 
-#: src/Model/Contact.php:1742
+#: src/Model/Contact.php:1747
 msgid "Group"
 msgstr ""
 
-#: src/Model/Contact.php:3045
+#: src/Model/Contact.php:3050
 msgid "Disallowed profile URL."
 msgstr ""
 
-#: src/Model/Contact.php:3050 src/Module/Friendica.php:101
+#: src/Model/Contact.php:3055 src/Module/Friendica.php:101
 msgid "Blocked domain"
 msgstr ""
 
-#: src/Model/Contact.php:3055
+#: src/Model/Contact.php:3060
 msgid "Connect URL missing."
 msgstr ""
 
-#: src/Model/Contact.php:3064
+#: src/Model/Contact.php:3069
 msgid ""
 "The contact could not be added. Please check the relevant network "
 "credentials in your Settings -> Social Networks page."
 msgstr ""
 
-#: src/Model/Contact.php:3082
+#: src/Model/Contact.php:3087
 #, php-format
 msgid "Expected network %s does not match actual network %s"
 msgstr ""
 
-#: src/Model/Contact.php:3099
+#: src/Model/Contact.php:3104
 msgid "The profile address specified does not provide adequate information."
 msgstr ""
 
-#: src/Model/Contact.php:3101
+#: src/Model/Contact.php:3106
 msgid "No compatible communication protocols or feeds were discovered."
 msgstr ""
 
-#: src/Model/Contact.php:3104
+#: src/Model/Contact.php:3109
 msgid "An author or name was not found."
 msgstr ""
 
-#: src/Model/Contact.php:3107
+#: src/Model/Contact.php:3112
 msgid "No browser URL could be matched to this address."
 msgstr ""
 
-#: src/Model/Contact.php:3110
+#: src/Model/Contact.php:3115
 msgid ""
 "Unable to match @-style Identity Address with a known protocol or email "
 "contact."
 msgstr ""
 
-#: src/Model/Contact.php:3111
+#: src/Model/Contact.php:3116
 msgid "Use mailto: in front of address to force email check."
 msgstr ""
 
-#: src/Model/Contact.php:3117
+#: src/Model/Contact.php:3122
 msgid ""
 "The profile address specified belongs to a network which has been disabled "
 "on this site."
 msgstr ""
 
-#: src/Model/Contact.php:3122
+#: src/Model/Contact.php:3127
 msgid ""
 "Limited profile. This person will be unable to receive direct/personal "
 "notifications from you."
 msgstr ""
 
-#: src/Model/Contact.php:3188
+#: src/Model/Contact.php:3193
 msgid "Unable to retrieve contact information."
 msgstr ""
 
@@ -3409,95 +3413,95 @@ msgstr ""
 msgid "Happy Birthday %s"
 msgstr ""
 
-#: src/Model/Item.php:2217
+#: src/Model/Item.php:2246
 #, php-format
 msgid "%s (%s - %s): %s"
 msgstr ""
 
-#: src/Model/Item.php:2219
+#: src/Model/Item.php:2248
 #, php-format
 msgid "%s (%s): %s"
 msgstr ""
 
-#: src/Model/Item.php:2222
+#: src/Model/Item.php:2251
 #, php-format
 msgid "Detected languages in this post:\\n%s"
 msgstr ""
 
-#: src/Model/Item.php:3170
+#: src/Model/Item.php:3199
 msgid "activity"
 msgstr ""
 
-#: src/Model/Item.php:3172
+#: src/Model/Item.php:3201
 msgid "comment"
 msgstr ""
 
-#: src/Model/Item.php:3175 src/Module/Post/Tag/Add.php:123
+#: src/Model/Item.php:3204 src/Module/Post/Tag/Add.php:123
 msgid "post"
 msgstr ""
 
-#: src/Model/Item.php:3345
+#: src/Model/Item.php:3374
 #, php-format
 msgid "%s is blocked"
 msgstr ""
 
-#: src/Model/Item.php:3347
+#: src/Model/Item.php:3376
 #, php-format
 msgid "%s is ignored"
 msgstr ""
 
-#: src/Model/Item.php:3349
+#: src/Model/Item.php:3378
 #, php-format
 msgid "Content from %s is collapsed"
 msgstr ""
 
-#: src/Model/Item.php:3353
+#: src/Model/Item.php:3382
 #, php-format
 msgid "Content warning: %s"
 msgstr ""
 
-#: src/Model/Item.php:3806
+#: src/Model/Item.php:3835
 msgid "bytes"
 msgstr ""
 
-#: src/Model/Item.php:3837
+#: src/Model/Item.php:3866
 #, php-format
 msgid "%2$s (%3$d%%, %1$d vote)"
 msgid_plural "%2$s (%3$d%%, %1$d votes)"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Model/Item.php:3839
+#: src/Model/Item.php:3868
 #, php-format
 msgid "%2$s (%1$d vote)"
 msgid_plural "%2$s (%1$d votes)"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Model/Item.php:3844
+#: src/Model/Item.php:3873
 #, php-format
 msgid "%d voter. Poll end: %s"
 msgid_plural "%d voters. Poll end: %s"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Model/Item.php:3846
+#: src/Model/Item.php:3875
 #, php-format
 msgid "%d voter."
 msgid_plural "%d voters."
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Model/Item.php:3848
+#: src/Model/Item.php:3877
 #, php-format
 msgid "Poll end: %s"
 msgstr ""
 
-#: src/Model/Item.php:3882 src/Model/Item.php:3883
+#: src/Model/Item.php:3911 src/Model/Item.php:3912
 msgid "View on separate page"
 msgstr ""
 
-#: src/Model/Mail.php:137 src/Model/Mail.php:266
+#: src/Model/Mail.php:135
 msgid "[no subject]"
 msgstr ""
 
@@ -3651,141 +3655,141 @@ msgstr ""
 msgid "Contact information and Social Networks"
 msgstr ""
 
-#: src/Model/User.php:225 src/Model/User.php:1281
+#: src/Model/User.php:225 src/Model/User.php:1287
 msgid "SERIOUS ERROR: Generation of security keys failed."
 msgstr ""
 
-#: src/Model/User.php:715 src/Model/User.php:748
+#: src/Model/User.php:721 src/Model/User.php:754
 msgid "Login failed"
 msgstr ""
 
-#: src/Model/User.php:780
+#: src/Model/User.php:786
 msgid "Not enough information to authenticate"
 msgstr ""
 
-#: src/Model/User.php:901
+#: src/Model/User.php:907
 msgid "Password can't be empty"
 msgstr ""
 
-#: src/Model/User.php:943
+#: src/Model/User.php:949
 msgid "Empty passwords are not allowed."
 msgstr ""
 
-#: src/Model/User.php:947
+#: src/Model/User.php:953
 msgid ""
 "The new password has been exposed in a public data dump, please choose "
 "another."
 msgstr ""
 
-#: src/Model/User.php:951
+#: src/Model/User.php:957
 msgid "The password length is limited to 72 characters."
 msgstr ""
 
-#: src/Model/User.php:955
+#: src/Model/User.php:961
 msgid "The password can't contain white spaces nor accentuated letters"
 msgstr ""
 
-#: src/Model/User.php:1164
+#: src/Model/User.php:1170
 msgid "Passwords do not match. Password unchanged."
 msgstr ""
 
-#: src/Model/User.php:1171
+#: src/Model/User.php:1177
 msgid "An invitation is required."
 msgstr ""
 
-#: src/Model/User.php:1175
+#: src/Model/User.php:1181
 msgid "Invitation could not be verified."
 msgstr ""
 
-#: src/Model/User.php:1183
+#: src/Model/User.php:1189
 msgid "Invalid OpenID url"
 msgstr ""
 
-#: src/Model/User.php:1196 src/Security/Authentication.php:241
+#: src/Model/User.php:1202 src/Security/Authentication.php:241
 msgid ""
 "We encountered a problem while logging in with the OpenID you provided. "
 "Please check the correct spelling of the ID."
 msgstr ""
 
-#: src/Model/User.php:1196 src/Security/Authentication.php:241
+#: src/Model/User.php:1202 src/Security/Authentication.php:241
 msgid "The error message was:"
 msgstr ""
 
-#: src/Model/User.php:1202
+#: src/Model/User.php:1208
 msgid "Please enter the required information."
 msgstr ""
 
-#: src/Model/User.php:1216
+#: src/Model/User.php:1222
 #, php-format
 msgid ""
 "system.username_min_length (%s) and system.username_max_length (%s) are "
 "excluding each other, swapping values."
 msgstr ""
 
-#: src/Model/User.php:1223
+#: src/Model/User.php:1229
 #, php-format
 msgid "Username should be at least %s character."
 msgid_plural "Username should be at least %s characters."
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Model/User.php:1227
+#: src/Model/User.php:1233
 #, php-format
 msgid "Username should be at most %s character."
 msgid_plural "Username should be at most %s characters."
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Model/User.php:1235
+#: src/Model/User.php:1241
 msgid "That doesn't appear to be your full (First Last) name."
 msgstr ""
 
-#: src/Model/User.php:1240
+#: src/Model/User.php:1246
 msgid "Your email domain is not among those allowed on this site."
 msgstr ""
 
-#: src/Model/User.php:1244
+#: src/Model/User.php:1250
 msgid "Not a valid email address."
 msgstr ""
 
-#: src/Model/User.php:1247
+#: src/Model/User.php:1253
 msgid "The nickname was blocked from registration by the nodes admin."
 msgstr ""
 
-#: src/Model/User.php:1251 src/Model/User.php:1257
+#: src/Model/User.php:1257 src/Model/User.php:1263
 msgid "Cannot use that email."
 msgstr ""
 
-#: src/Model/User.php:1263
+#: src/Model/User.php:1269
 msgid "Your nickname can only contain a-z, 0-9 and _."
 msgstr ""
 
-#: src/Model/User.php:1271 src/Model/User.php:1328
+#: src/Model/User.php:1277 src/Model/User.php:1334
 msgid "Nickname is already registered. Please choose another."
 msgstr ""
 
-#: src/Model/User.php:1315 src/Model/User.php:1319
+#: src/Model/User.php:1321 src/Model/User.php:1325
 msgid "An error occurred during registration. Please try again."
 msgstr ""
 
-#: src/Model/User.php:1342
+#: src/Model/User.php:1348
 msgid "An error occurred creating your default profile. Please try again."
 msgstr ""
 
-#: src/Model/User.php:1349
+#: src/Model/User.php:1355
 msgid "An error occurred creating your self contact. Please try again."
 msgstr ""
 
-#: src/Model/User.php:1354
+#: src/Model/User.php:1360
 msgid "Friends"
 msgstr ""
 
-#: src/Model/User.php:1358
+#: src/Model/User.php:1364
 msgid ""
 "An error occurred creating your default contact circle. Please try again."
 msgstr ""
 
-#: src/Model/User.php:1402
+#: src/Model/User.php:1408
 msgid "Profile Photos"
 msgstr ""
 
@@ -3978,7 +3982,7 @@ msgstr ""
 #: src/Module/Admin/Addons/Index.php:69 src/Module/Admin/Features.php:86
 #: src/Module/Admin/Logs/Settings.php:87 src/Module/Admin/Site.php:452
 #: src/Module/Admin/Themes/Index.php:113 src/Module/Admin/Tos.php:86
-#: src/Module/Settings/Account.php:535 src/Module/Settings/Addons.php:78
+#: src/Module/Settings/Account.php:545 src/Module/Settings/Addons.php:78
 #: src/Module/Settings/Connectors.php:160
 #: src/Module/Settings/Connectors.php:246
 #: src/Module/Settings/Delegation.php:193 src/Module/Settings/Display.php:309
@@ -7811,19 +7815,19 @@ msgstr ""
 msgid "List of pending user deletions"
 msgstr ""
 
-#: src/Module/Moderation/BaseUsers.php:119 src/Module/Settings/Account.php:466
+#: src/Module/Moderation/BaseUsers.php:119 src/Module/Settings/Account.php:476
 msgid "Normal Account Page"
 msgstr ""
 
-#: src/Module/Moderation/BaseUsers.php:120 src/Module/Settings/Account.php:473
+#: src/Module/Moderation/BaseUsers.php:120 src/Module/Settings/Account.php:483
 msgid "Soapbox Page"
 msgstr ""
 
-#: src/Module/Moderation/BaseUsers.php:121 src/Module/Settings/Account.php:480
+#: src/Module/Moderation/BaseUsers.php:121 src/Module/Settings/Account.php:490
 msgid "Public Group"
 msgstr ""
 
-#: src/Module/Moderation/BaseUsers.php:122 src/Module/Settings/Account.php:487
+#: src/Module/Moderation/BaseUsers.php:122 src/Module/Settings/Account.php:497
 msgid "Automatic Friend Page"
 msgstr ""
 
@@ -7831,19 +7835,19 @@ msgstr ""
 msgid "Private Group"
 msgstr ""
 
-#: src/Module/Moderation/BaseUsers.php:126 src/Module/Settings/Account.php:438
+#: src/Module/Moderation/BaseUsers.php:126 src/Module/Settings/Account.php:441
 msgid "Personal Page"
 msgstr ""
 
-#: src/Module/Moderation/BaseUsers.php:127 src/Module/Settings/Account.php:445
+#: src/Module/Moderation/BaseUsers.php:127 src/Module/Settings/Account.php:448
 msgid "Organisation Page"
 msgstr ""
 
-#: src/Module/Moderation/BaseUsers.php:128 src/Module/Settings/Account.php:452
+#: src/Module/Moderation/BaseUsers.php:128 src/Module/Settings/Account.php:455
 msgid "News Page"
 msgstr ""
 
-#: src/Module/Moderation/BaseUsers.php:129 src/Module/Settings/Account.php:459
+#: src/Module/Moderation/BaseUsers.php:129 src/Module/Settings/Account.php:462
 msgid "Community Group"
 msgstr ""
 
@@ -9269,7 +9273,7 @@ msgid "Please repeat your e-mail address:"
 msgstr ""
 
 #: src/Module/Register.php:162 src/Module/Security/PasswordTooLong.php:100
-#: src/Module/Settings/Account.php:541
+#: src/Module/Settings/Account.php:551
 msgid "New Password:"
 msgstr ""
 
@@ -9278,7 +9282,7 @@ msgid "Leave empty for an auto generated password."
 msgstr ""
 
 #: src/Module/Register.php:163 src/Module/Security/PasswordTooLong.php:101
-#: src/Module/Settings/Account.php:542
+#: src/Module/Settings/Account.php:552
 msgid "Confirm:"
 msgstr ""
 
@@ -9496,24 +9500,24 @@ msgid "Update Password"
 msgstr ""
 
 #: src/Module/Security/PasswordTooLong.php:99
-#: src/Module/Settings/Account.php:543
+#: src/Module/Settings/Account.php:553
 msgid "Current Password:"
 msgstr ""
 
 #: src/Module/Security/PasswordTooLong.php:99
-#: src/Module/Settings/Account.php:543
+#: src/Module/Settings/Account.php:553
 msgid "Your current password to confirm the changes"
 msgstr ""
 
 #: src/Module/Security/PasswordTooLong.php:100
-#: src/Module/Settings/Account.php:527
+#: src/Module/Settings/Account.php:537
 msgid ""
 "Allowed characters are a-z, A-Z, 0-9 and special characters except white "
 "spaces and accentuated letters."
 msgstr ""
 
 #: src/Module/Security/PasswordTooLong.php:100
-#: src/Module/Settings/Account.php:528
+#: src/Module/Settings/Account.php:538
 msgid "Password length is limited to 72 characters."
 msgstr ""
 
@@ -9640,97 +9644,107 @@ msgstr ""
 
 #: src/Module/Settings/Account.php:146 src/Module/Settings/Account.php:195
 #: src/Module/Settings/Account.php:216 src/Module/Settings/Account.php:300
-#: src/Module/Settings/Account.php:327
+#: src/Module/Settings/Account.php:329
 msgid "Settings were not updated."
 msgstr ""
 
-#: src/Module/Settings/Account.php:340
+#: src/Module/Settings/Account.php:342
 msgid "Contact CSV file upload error"
 msgstr ""
 
-#: src/Module/Settings/Account.php:359
+#: src/Module/Settings/Account.php:361
 msgid "Importing Contacts done"
 msgstr ""
 
-#: src/Module/Settings/Account.php:372
+#: src/Module/Settings/Account.php:374
 msgid "Relocate message has been send to your contacts"
 msgstr ""
 
-#: src/Module/Settings/Account.php:389
+#: src/Module/Settings/Account.php:391
 msgid "Unable to find your profile. Please contact your admin."
 msgstr ""
 
-#: src/Module/Settings/Account.php:429
+#: src/Module/Settings/Account.php:431
 msgid "Personal Page Subtypes"
 msgstr ""
 
-#: src/Module/Settings/Account.php:430
+#: src/Module/Settings/Account.php:432
 msgid "Community Group Subtypes"
 msgstr ""
 
-#: src/Module/Settings/Account.php:440
+#: src/Module/Settings/Account.php:443
 msgid "Account for a personal profile."
 msgstr ""
 
-#: src/Module/Settings/Account.php:447
+#: src/Module/Settings/Account.php:450
 msgid ""
 "Account for an organisation that automatically approves contact requests as "
 "\"Followers\"."
 msgstr ""
 
-#: src/Module/Settings/Account.php:454
+#: src/Module/Settings/Account.php:457
 msgid ""
 "Account for a news reflector that automatically approves contact requests as "
 "\"Followers\"."
 msgstr ""
 
-#: src/Module/Settings/Account.php:461
+#: src/Module/Settings/Account.php:464
 msgid "Account for community discussions."
 msgstr ""
 
-#: src/Module/Settings/Account.php:468
+#: src/Module/Settings/Account.php:469
+msgid "Channel Relay"
+msgstr ""
+
+#: src/Module/Settings/Account.php:471
+msgid ""
+"Account for a service that automatically shares content based on user "
+"defined channels."
+msgstr ""
+
+#: src/Module/Settings/Account.php:478
 msgid ""
 "Account for a regular personal profile that requires manual approval of "
 "\"Friends\" and \"Followers\"."
 msgstr ""
 
-#: src/Module/Settings/Account.php:475
+#: src/Module/Settings/Account.php:485
 msgid ""
 "Account for a public profile that automatically approves contact requests as "
 "\"Followers\"."
 msgstr ""
 
-#: src/Module/Settings/Account.php:482
+#: src/Module/Settings/Account.php:492
 msgid "Automatically approves all contact requests."
 msgstr ""
 
-#: src/Module/Settings/Account.php:489
+#: src/Module/Settings/Account.php:499
 msgid ""
 "Account for a popular profile that automatically approves contact requests "
 "as \"Friends\"."
 msgstr ""
 
-#: src/Module/Settings/Account.php:494
+#: src/Module/Settings/Account.php:504
 msgid "Private Group [Experimental]"
 msgstr ""
 
-#: src/Module/Settings/Account.php:496
+#: src/Module/Settings/Account.php:506
 msgid "Requires manual approval of contact requests."
 msgstr ""
 
-#: src/Module/Settings/Account.php:505
+#: src/Module/Settings/Account.php:515
 msgid "OpenID:"
 msgstr ""
 
-#: src/Module/Settings/Account.php:505
+#: src/Module/Settings/Account.php:515
 msgid "(Optional) Allow this OpenID to login to this account."
 msgstr ""
 
-#: src/Module/Settings/Account.php:513
+#: src/Module/Settings/Account.php:523
 msgid "Publish your profile in your local site directory?"
 msgstr ""
 
-#: src/Module/Settings/Account.php:513
+#: src/Module/Settings/Account.php:523
 #, php-format
 msgid ""
 "Your profile will be published in this node's <a href=\"%s\">local "
@@ -9738,94 +9752,94 @@ msgid ""
 "system settings."
 msgstr ""
 
-#: src/Module/Settings/Account.php:519
+#: src/Module/Settings/Account.php:529
 #, php-format
 msgid ""
 "Your profile will also be published in the global friendica directories (e."
 "g. <a href=\"%s\">%s</a>)."
 msgstr ""
 
-#: src/Module/Settings/Account.php:532
+#: src/Module/Settings/Account.php:542
 msgid "Account Settings"
 msgstr ""
 
-#: src/Module/Settings/Account.php:533
+#: src/Module/Settings/Account.php:543
 #, php-format
 msgid "Your Identity Address is <strong>'%s'</strong> or '%s'."
 msgstr ""
 
-#: src/Module/Settings/Account.php:540
+#: src/Module/Settings/Account.php:550
 msgid "Password Settings"
 msgstr ""
 
-#: src/Module/Settings/Account.php:542
+#: src/Module/Settings/Account.php:552
 msgid "Leave password fields blank unless changing"
 msgstr ""
 
-#: src/Module/Settings/Account.php:544
+#: src/Module/Settings/Account.php:554
 msgid "Password:"
 msgstr ""
 
-#: src/Module/Settings/Account.php:544
+#: src/Module/Settings/Account.php:554
 msgid "Your current password to confirm the changes of the email address"
 msgstr ""
 
-#: src/Module/Settings/Account.php:547
+#: src/Module/Settings/Account.php:557
 msgid "Delete OpenID URL"
 msgstr ""
 
-#: src/Module/Settings/Account.php:549
+#: src/Module/Settings/Account.php:559
 msgid "Basic Settings"
 msgstr ""
 
-#: src/Module/Settings/Account.php:550
+#: src/Module/Settings/Account.php:560
 #: src/Module/Settings/Profile/Index.php:283
 msgid "Display name:"
 msgstr ""
 
-#: src/Module/Settings/Account.php:551
+#: src/Module/Settings/Account.php:561
 msgid "Email Address:"
 msgstr ""
 
-#: src/Module/Settings/Account.php:552
+#: src/Module/Settings/Account.php:562
 msgid "Your Timezone:"
 msgstr ""
 
-#: src/Module/Settings/Account.php:553
+#: src/Module/Settings/Account.php:563
 msgid "Your Language:"
 msgstr ""
 
-#: src/Module/Settings/Account.php:553
+#: src/Module/Settings/Account.php:563
 msgid ""
 "Set the language we use to show you friendica interface and to send you "
 "emails"
 msgstr ""
 
-#: src/Module/Settings/Account.php:554
+#: src/Module/Settings/Account.php:564
 msgid "Default Post Location:"
 msgstr ""
 
-#: src/Module/Settings/Account.php:555
+#: src/Module/Settings/Account.php:565
 msgid "Use Browser Location:"
 msgstr ""
 
-#: src/Module/Settings/Account.php:557
+#: src/Module/Settings/Account.php:567
 msgid "Security and Privacy Settings"
 msgstr ""
 
-#: src/Module/Settings/Account.php:559
+#: src/Module/Settings/Account.php:569
 msgid "Maximum Friend Requests/Day:"
 msgstr ""
 
-#: src/Module/Settings/Account.php:559
+#: src/Module/Settings/Account.php:569
 msgid "(to prevent spam abuse)"
 msgstr ""
 
-#: src/Module/Settings/Account.php:561
+#: src/Module/Settings/Account.php:571
 msgid "Allow your profile to be searchable globally?"
 msgstr ""
 
-#: src/Module/Settings/Account.php:561
+#: src/Module/Settings/Account.php:571
 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 "
@@ -9833,43 +9847,43 @@ msgid ""
 "indexed or not."
 msgstr ""
 
-#: src/Module/Settings/Account.php:562
+#: src/Module/Settings/Account.php:572
 msgid "Hide your contact/friend list from viewers of your profile?"
 msgstr ""
 
-#: src/Module/Settings/Account.php:562
+#: src/Module/Settings/Account.php:572
 msgid ""
 "A list of your contacts is displayed on your profile page. Activate this "
 "option to disable the display of your contact list."
 msgstr ""
 
-#: src/Module/Settings/Account.php:563
+#: src/Module/Settings/Account.php:573
 msgid "Hide your public content from anonymous viewers"
 msgstr ""
 
-#: src/Module/Settings/Account.php:563
+#: src/Module/Settings/Account.php:573
 msgid ""
 "Anonymous visitors will only see your basic profile details. Your public "
 "posts and replies will still be freely accessible on the remote servers of "
 "your followers and through relays."
 msgstr ""
 
-#: src/Module/Settings/Account.php:564
+#: src/Module/Settings/Account.php:574
 msgid "Make public posts unlisted"
 msgstr ""
 
-#: src/Module/Settings/Account.php:564
+#: src/Module/Settings/Account.php:574
 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 ""
 
-#: src/Module/Settings/Account.php:565
+#: src/Module/Settings/Account.php:575
 msgid "Make all posted pictures accessible"
 msgstr ""
 
-#: src/Module/Settings/Account.php:565
+#: src/Module/Settings/Account.php:575
 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 "
@@ -9877,227 +9891,227 @@ msgid ""
 "public on your photo albums though."
 msgstr ""
 
-#: src/Module/Settings/Account.php:566
+#: src/Module/Settings/Account.php:576
 msgid "Allow friends to post to your profile page?"
 msgstr ""
 
-#: src/Module/Settings/Account.php:566
+#: src/Module/Settings/Account.php:576
 msgid ""
 "Your contacts may write posts on your profile wall. These posts will be "
 "distributed to your contacts"
 msgstr ""
 
-#: src/Module/Settings/Account.php:567
+#: src/Module/Settings/Account.php:577
 msgid "Allow friends to tag your posts?"
 msgstr ""
 
-#: src/Module/Settings/Account.php:567
+#: src/Module/Settings/Account.php:577
 msgid "Your contacts can add additional tags to your posts."
 msgstr ""
 
-#: src/Module/Settings/Account.php:568
+#: src/Module/Settings/Account.php:578
 msgid "Default privacy circle for new contacts"
 msgstr ""
 
-#: src/Module/Settings/Account.php:569
+#: src/Module/Settings/Account.php:579
 msgid "Default privacy circle for new group contacts"
 msgstr ""
 
-#: src/Module/Settings/Account.php:570
+#: src/Module/Settings/Account.php:580
 msgid "Default Post Permissions"
 msgstr ""
 
-#: src/Module/Settings/Account.php:574
+#: src/Module/Settings/Account.php:584
 msgid "Expiration settings"
 msgstr ""
 
-#: src/Module/Settings/Account.php:575
+#: src/Module/Settings/Account.php:585
 msgid "Automatically expire posts after this many days:"
 msgstr ""
 
-#: src/Module/Settings/Account.php:575
+#: src/Module/Settings/Account.php:585
 msgid "If empty, posts will not expire. Expired posts will be deleted"
 msgstr ""
 
-#: src/Module/Settings/Account.php:576
+#: src/Module/Settings/Account.php:586
 msgid "Expire posts"
 msgstr ""
 
-#: src/Module/Settings/Account.php:576
+#: src/Module/Settings/Account.php:586
 msgid "When activated, posts and comments will be expired."
 msgstr ""
 
-#: src/Module/Settings/Account.php:577
+#: src/Module/Settings/Account.php:587
 msgid "Expire personal notes"
 msgstr ""
 
-#: src/Module/Settings/Account.php:577
+#: src/Module/Settings/Account.php:587
 msgid ""
 "When activated, the personal notes on your profile page will be expired."
 msgstr ""
 
-#: src/Module/Settings/Account.php:578
+#: src/Module/Settings/Account.php:588
 msgid "Expire starred posts"
 msgstr ""
 
-#: src/Module/Settings/Account.php:578
+#: src/Module/Settings/Account.php:588
 msgid ""
 "Starring posts keeps them from being expired. That behaviour is overwritten "
 "by this setting."
 msgstr ""
 
-#: src/Module/Settings/Account.php:579
+#: src/Module/Settings/Account.php:589
 msgid "Only expire posts by others"
 msgstr ""
 
-#: src/Module/Settings/Account.php:579
+#: src/Module/Settings/Account.php:589
 msgid ""
 "When activated, your own posts never expire. Then the settings above are "
 "only valid for posts you received."
 msgstr ""
 
-#: src/Module/Settings/Account.php:582
+#: src/Module/Settings/Account.php:592
 msgid "Notification Settings"
 msgstr ""
 
-#: src/Module/Settings/Account.php:583
+#: src/Module/Settings/Account.php:593
 msgid "Send a notification email when:"
 msgstr ""
 
-#: src/Module/Settings/Account.php:584
+#: src/Module/Settings/Account.php:594
 msgid "You receive an introduction"
 msgstr ""
 
-#: src/Module/Settings/Account.php:585
+#: src/Module/Settings/Account.php:595
 msgid "Your introductions are confirmed"
 msgstr ""
 
-#: src/Module/Settings/Account.php:586
+#: src/Module/Settings/Account.php:596
 msgid "Someone writes on your profile wall"
 msgstr ""
 
-#: src/Module/Settings/Account.php:587
+#: src/Module/Settings/Account.php:597
 msgid "Someone writes a followup comment"
 msgstr ""
 
-#: src/Module/Settings/Account.php:588
+#: src/Module/Settings/Account.php:598
 msgid "You receive a private message"
 msgstr ""
 
-#: src/Module/Settings/Account.php:589
+#: src/Module/Settings/Account.php:599
 msgid "You receive a friend suggestion"
 msgstr ""
 
-#: src/Module/Settings/Account.php:590
+#: src/Module/Settings/Account.php:600
 msgid "You are tagged in a post"
 msgstr ""
 
-#: src/Module/Settings/Account.php:592
+#: src/Module/Settings/Account.php:602
 msgid "Create a desktop notification when:"
 msgstr ""
 
-#: src/Module/Settings/Account.php:593
+#: src/Module/Settings/Account.php:603
 msgid "Someone tagged you"
 msgstr ""
 
-#: src/Module/Settings/Account.php:594
+#: src/Module/Settings/Account.php:604
 msgid "Someone directly commented on your post"
 msgstr ""
 
-#: src/Module/Settings/Account.php:595
+#: src/Module/Settings/Account.php:605
 msgid "Someone liked your content"
 msgstr ""
 
-#: src/Module/Settings/Account.php:595 src/Module/Settings/Account.php:596
+#: src/Module/Settings/Account.php:605 src/Module/Settings/Account.php:606
 msgid "Can only be enabled, when the direct comment notification is enabled."
 msgstr ""
 
-#: src/Module/Settings/Account.php:596
+#: src/Module/Settings/Account.php:606
 msgid "Someone shared your content"
 msgstr ""
 
-#: src/Module/Settings/Account.php:597
+#: src/Module/Settings/Account.php:607
 msgid "Someone commented in your thread"
 msgstr ""
 
-#: src/Module/Settings/Account.php:598
+#: src/Module/Settings/Account.php:608
 msgid "Someone commented in a thread where you commented"
 msgstr ""
 
-#: src/Module/Settings/Account.php:599
+#: src/Module/Settings/Account.php:609
 msgid "Someone commented in a thread where you interacted"
 msgstr ""
 
-#: src/Module/Settings/Account.php:601
+#: src/Module/Settings/Account.php:611
 msgid "Activate desktop notifications"
 msgstr ""
 
-#: src/Module/Settings/Account.php:601
+#: src/Module/Settings/Account.php:611
 msgid "Show desktop popup on new notifications"
 msgstr ""
 
-#: src/Module/Settings/Account.php:605
+#: src/Module/Settings/Account.php:615
 msgid "Text-only notification emails"
 msgstr ""
 
-#: src/Module/Settings/Account.php:607
+#: src/Module/Settings/Account.php:617
 msgid "Send text only notification emails, without the html part"
 msgstr ""
 
-#: src/Module/Settings/Account.php:611
+#: src/Module/Settings/Account.php:621
 msgid "Show detailled notifications"
 msgstr ""
 
-#: src/Module/Settings/Account.php:613
+#: src/Module/Settings/Account.php:623
 msgid ""
 "Per default, notifications are condensed to a single notification per item. "
 "When enabled every notification is displayed."
 msgstr ""
 
-#: src/Module/Settings/Account.php:617
+#: src/Module/Settings/Account.php:627
 msgid "Show notifications of ignored contacts"
 msgstr ""
 
-#: src/Module/Settings/Account.php:619
+#: src/Module/Settings/Account.php:629
 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 ""
 
-#: src/Module/Settings/Account.php:622
+#: src/Module/Settings/Account.php:632
 msgid "Advanced Account/Page Type Settings"
 msgstr ""
 
-#: src/Module/Settings/Account.php:623
+#: src/Module/Settings/Account.php:633
 msgid "Change the behaviour of this account for special situations"
 msgstr ""
 
-#: src/Module/Settings/Account.php:626
+#: src/Module/Settings/Account.php:636
 msgid "Import Contacts"
 msgstr ""
 
-#: src/Module/Settings/Account.php:627
+#: src/Module/Settings/Account.php:637
 msgid ""
 "Upload a CSV file that contains the handle of your followed accounts in the "
 "first column you exported from the old account."
 msgstr ""
 
-#: src/Module/Settings/Account.php:628
+#: src/Module/Settings/Account.php:638
 msgid "Upload File"
 msgstr ""
 
-#: src/Module/Settings/Account.php:631
+#: src/Module/Settings/Account.php:641
 msgid "Relocate"
 msgstr ""
 
-#: src/Module/Settings/Account.php:632
+#: src/Module/Settings/Account.php:642
 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 ""
 
-#: src/Module/Settings/Account.php:633
+#: src/Module/Settings/Account.php:643
 msgid "Resend relocate message to contacts"
 msgstr ""
 
index 8b285aea87876c78e0f04a6472598bf42852e8f0..71285572792e47476c1833cd7f4ee867630b449d 100644 (file)
@@ -18,6 +18,8 @@
        {{include file="field_radio.tpl" field=$page_prvgroup}}
 </div>
 
+{{include file="field_radio.tpl" field=$account_relay}}
+
 <script language="javascript" type="text/javascript">
        // This js part changes the state of page-flags radio buttons according
        // to the selected account type.