From 175c15506f7fd98bb9916e392ca837d68a0dfe85 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 6 Jan 2024 17:27:42 +0000 Subject: [PATCH] New user account type "Channel Relay" --- .../Repository/UserDefinedChannel.php | 141 +++++- src/Core/L10n.php | 2 +- src/Model/Contact.php | 5 + src/Model/Item.php | 31 +- src/Model/Post/Engagement.php | 28 +- src/Model/User.php | 6 + src/Module/Conversation/Timeline.php | 10 +- src/Module/Settings/Account.php | 10 + src/Protocol/ActivityPub/Processor.php | 2 +- src/Protocol/Relay.php | 14 +- view/lang/C/messages.po | 416 +++++++++--------- view/templates/settings/pagetypes.tpl | 2 + 12 files changed, 420 insertions(+), 247 deletions(-) diff --git a/src/Content/Conversation/Repository/UserDefinedChannel.php b/src/Content/Conversation/Repository/UserDefinedChannel.php index 7815acdd8a..6572eda140 100644 --- a/src/Content/Conversation/Repository/UserDefinedChannel.php +++ b/src/Content/Conversation/Repository/UserDefinedChannel.php @@ -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; } } diff --git a/src/Core/L10n.php b/src/Core/L10n.php index 3fa48bed99..900bfa5e9e 100644 --- a/src/Core/L10n.php +++ b/src/Core/L10n.php @@ -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); diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 7873cb2dba..acf1a4dd83 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -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. diff --git a/src/Model/Item.php b/src/Model/Item.php index 3fea148b88..33cf61d61f 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -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 * diff --git a/src/Model/Post/Engagement.php b/src/Model/Post/Engagement.php index f2e890db49..a9e1bbfbda 100644 --- a/src/Model/Post/Engagement.php +++ b/src/Model/Post/Engagement.php @@ -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 diff --git a/src/Model/User.php b/src/Model/User.php index 3463437103..3f76da2043 100644 --- a/src/Model/User.php +++ b/src/Model/User.php @@ -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); diff --git a/src/Module/Conversation/Timeline.php b/src/Module/Conversation/Timeline.php index 1fdc9e0603..c351553e40 100644 --- a/src/Module/Conversation/Timeline.php +++ b/src/Module/Conversation/Timeline.php @@ -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; } diff --git a/src/Module/Settings/Account.php b/src/Module/Settings/Account.php index 41d4f0fc58..543762a7fd 100644 --- a/src/Module/Settings/Account.php +++ b/src/Module/Settings/Account.php @@ -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'), diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index 593c1e7836..f0fbf1185a 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -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); } /** diff --git a/src/Protocol/Relay.php b/src/Protocol/Relay.php index 611d66cf44..934d09651d 100644 --- a/src/Protocol/Relay.php +++ b/src/Protocol/Relay.php @@ -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); } /** diff --git a/view/lang/C/messages.po b/view/lang/C/messages.po index 72b7cadf39..be43370c59 100644 --- a/view/lang/C/messages.po +++ b/view/lang/C/messages.po @@ -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 "" "%2$s %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 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. %s)." 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 '%s' 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 "" diff --git a/view/templates/settings/pagetypes.tpl b/view/templates/settings/pagetypes.tpl index 8b285aea87..7128557279 100644 --- a/view/templates/settings/pagetypes.tpl +++ b/view/templates/settings/pagetypes.tpl @@ -18,6 +18,8 @@ {{include file="field_radio.tpl" field=$page_prvgroup}} +{{include file="field_radio.tpl" field=$account_relay}} +