From 0ad904c18515f67ec7c052a1bc9621ba2ff2d76e Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 23 Sep 2021 21:18:36 +0000 Subject: [PATCH 01/54] The conversation functionality moved to a class --- composer.json | 1 - doc/Addons.md | 2 +- doc/de/Addons.md | 2 +- include/api.php | 2 +- include/conversation.php | 1462 ------------------------- mod/display.php | 4 +- mod/item.php | 2 +- mod/notes.php | 4 +- mod/photos.php | 6 +- src/Content/Conversation.php | 1226 +++++++++++++++++++++ src/Content/Item.php | 280 +++++ src/DI.php | 8 + src/Model/Contact.php | 4 +- src/Module/Bookmarklet.php | 3 +- src/Module/Contact.php | 2 +- src/Module/Conversation/Community.php | 5 +- src/Module/Conversation/Network.php | 4 +- src/Module/Profile/Status.php | 4 +- src/Module/Search/Filed.php | 2 +- src/Module/Search/Index.php | 2 +- src/Module/Update/Community.php | 2 +- src/Module/Update/Network.php | 2 +- src/Module/Update/Profile.php | 2 +- src/Object/Post.php | 8 +- 24 files changed, 1545 insertions(+), 1494 deletions(-) delete mode 100644 include/conversation.php create mode 100644 src/Content/Conversation.php diff --git a/composer.json b/composer.json index bf0559254..0efba3664 100644 --- a/composer.json +++ b/composer.json @@ -84,7 +84,6 @@ "Friendica\\Addon\\": "addon/" }, "files": [ - "include/conversation.php", "include/dba.php", "include/enotify.php", "boot.php" diff --git a/doc/Addons.md b/doc/Addons.md index 4a32dc09f..0257ccbf9 100644 --- a/doc/Addons.md +++ b/doc/Addons.md @@ -509,7 +509,7 @@ Here is a complete list of all hook callbacks with file locations (as of 24-Sep- Hook::callAll('enotify_mail', $datarray); Hook::callAll('check_item_notification', $notification_data); -### include/conversation.php +### src/Content/Conversation.php Hook::callAll('conversation_start', $cb); Hook::callAll('render_location', $locate); diff --git a/doc/de/Addons.md b/doc/de/Addons.md index 276f5ed1b..257333b9c 100644 --- a/doc/de/Addons.md +++ b/doc/de/Addons.md @@ -220,7 +220,7 @@ Eine komplette Liste aller Hook-Callbacks mit den zugehörigen Dateien (am 01-Ap Hook::callAll('enotify_mail', $datarray); Hook::callAll('check_item_notification', $notification_data); -### include/conversation.php +### src/Content/Conversation.php Hook::callAll('conversation_start', $cb); Hook::callAll('render_location', $locate); diff --git a/include/api.php b/include/api.php index e0cac831e..2ee118f40 100644 --- a/include/api.php +++ b/include/api.php @@ -2997,7 +2997,7 @@ function api_format_item($item, $type = "json", $status_user = null, $author_use list($status_user, $author_user, $owner_user) = api_item_get_user($a, $item); } - localize_item($item); + DI::contentItem()->localize($item); $in_reply_to = api_in_reply_to($item); diff --git a/include/conversation.php b/include/conversation.php deleted file mode 100644 index 507add97d..000000000 --- a/include/conversation.php +++ /dev/null @@ -1,1462 +0,0 @@ -. - * - */ - -use Friendica\App; -use Friendica\BaseModule; -use Friendica\Content\ContactSelector; -use Friendica\Content\Feature; -use Friendica\Core\ACL; -use Friendica\Core\Hook; -use Friendica\Core\Logger; -use Friendica\Core\Protocol; -use Friendica\Core\Renderer; -use Friendica\Core\Session; -use Friendica\Core\Theme; -use Friendica\Database\DBA; -use Friendica\DI; -use Friendica\Model\Contact; -use Friendica\Model\Item; -use Friendica\Model\Post; -use Friendica\Model\Tag; -use Friendica\Model\User; -use Friendica\Model\Verb; -use Friendica\Object\Post as PostObject; -use Friendica\Object\Thread; -use Friendica\Protocol\Activity; -use Friendica\Util\Crypto; -use Friendica\Util\DateTimeFormat; -use Friendica\Util\Proxy; -use Friendica\Util\Strings; -use Friendica\Util\Temporal; -use Friendica\Util\XML; - -/** - * Render actions localized - * - * @param $item - * @throws ImagickException - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - */ -function localize_item(&$item) -{ - DI::profiler()->startRecording('rendering'); - /// @todo The following functionality needs to be cleaned up. - if (!empty($item['verb'])) { - $activity = DI::activity(); - - $xmlhead = "<" . "?xml version='1.0' encoding='UTF-8' ?" . ">"; - - if (stristr($item['verb'], Activity::POKE)) { - $verb = urldecode(substr($item['verb'], strpos($item['verb'],'#') + 1)); - if (!$verb) { - DI::profiler()->stopRecording(); - return; - } - if ($item['object-type'] == "" || $item['object-type'] !== Activity\ObjectType::PERSON) { - DI::profiler()->stopRecording(); - return; - } - - $obj = XML::parseString($xmlhead . $item['object']); - - $Bname = $obj->title; - $Blink = $obj->id; - $Bphoto = ""; - - foreach ($obj->link as $l) { - $atts = $l->attributes(); - switch ($atts['rel']) { - case "alternate": $Blink = $atts['href']; - case "photo": $Bphoto = $atts['href']; - } - } - - $author = ['uid' => 0, 'id' => $item['author-id'], - 'network' => $item['author-network'], 'url' => $item['author-link']]; - $A = '[url=' . Contact::magicLinkByContact($author) . ']' . $item['author-name'] . '[/url]'; - - if (!empty($Blink)) { - $B = '[url=' . Contact::magicLink($Blink) . ']' . $Bname . '[/url]'; - } else { - $B = ''; - } - - if ($Bphoto != "" && !empty($Blink)) { - $Bphoto = '[url=' . Contact::magicLink($Blink) . '][img=80x80]' . $Bphoto . '[/img][/url]'; - } - - /* - * we can't have a translation string with three positions but no distinguishable text - * So here is the translate string. - */ - $txt = DI::l10n()->t('%1$s poked %2$s'); - - // now translate the verb - $poked_t = trim(sprintf($txt, '', '')); - $txt = str_replace($poked_t, DI::l10n()->t($verb), $txt); - - // then do the sprintf on the translation string - - $item['body'] = sprintf($txt, $A, $B) . "\n\n\n" . $Bphoto; - - } - - if ($activity->match($item['verb'], Activity::TAG)) { - $fields = ['author-id', 'author-link', 'author-name', 'author-network', - 'verb', 'object-type', 'resource-id', 'body', 'plink']; - $obj = Post::selectFirst($fields, ['uri' => $item['parent-uri']]); - if (!DBA::isResult($obj)) { - DI::profiler()->stopRecording(); - return; - } - - $author_arr = ['uid' => 0, 'id' => $item['author-id'], - 'network' => $item['author-network'], 'url' => $item['author-link']]; - $author = '[url=' . Contact::magicLinkByContact($author_arr) . ']' . $item['author-name'] . '[/url]'; - - $author_arr = ['uid' => 0, 'id' => $obj['author-id'], - 'network' => $obj['author-network'], 'url' => $obj['author-link']]; - $objauthor = '[url=' . Contact::magicLinkByContact($author_arr) . ']' . $obj['author-name'] . '[/url]'; - - switch ($obj['verb']) { - case Activity::POST: - switch ($obj['object-type']) { - case Activity\ObjectType::EVENT: - $post_type = DI::l10n()->t('event'); - break; - default: - $post_type = DI::l10n()->t('status'); - } - break; - default: - if ($obj['resource-id']) { - $post_type = DI::l10n()->t('photo'); - $m=[]; preg_match("/\[url=([^]]*)\]/", $obj['body'], $m); - $rr['plink'] = $m[1]; - } else { - $post_type = DI::l10n()->t('status'); - } - // Let's break everthing ... ;-) - break; - } - $plink = '[url=' . $obj['plink'] . ']' . $post_type . '[/url]'; - - $parsedobj = XML::parseString($xmlhead . $item['object']); - - $tag = sprintf('#[url=%s]%s[/url]', $parsedobj->id, $parsedobj->content); - $item['body'] = DI::l10n()->t('%1$s tagged %2$s\'s %3$s with %4$s', $author, $objauthor, $plink, $tag); - } - } - - $matches = null; - if (preg_match_all('/@\[url=(.*?)\]/is', $item['body'], $matches, PREG_SET_ORDER)) { - foreach ($matches as $mtch) { - if (!strpos($mtch[1], 'zrl=')) { - $item['body'] = str_replace($mtch[0], '@[url=' . Contact::magicLink($mtch[1]) . ']', $item['body']); - } - } - } - - // add sparkle links to appropriate permalinks - // Only create a redirection to a magic link when logged in - if (!empty($item['plink']) && Session::isAuthenticated()) { - $author = ['uid' => 0, 'id' => $item['author-id'], - 'network' => $item['author-network'], 'url' => $item['author-link']]; - $item['plink'] = Contact::magicLinkByContact($author, $item['plink']); - } - DI::profiler()->stopRecording(); -} - -/** - * Count the total of comments on this item and its desendants - * @TODO proper type-hint + doc-tag - * @param $item - * @return int - */ -function count_descendants($item) { - $total = count($item['children']); - - if ($total > 0) { - foreach ($item['children'] as $child) { - if (!visible_activity($child)) { - $total --; - } - $total += count_descendants($child); - } - } - - return $total; -} - -function visible_activity($item) { - - $activity = DI::activity(); - - if (empty($item['verb']) || $activity->isHidden($item['verb'])) { - return false; - } - - // @TODO below if() block can be rewritten to a single line: $isVisible = allConditionsHere; - if ($activity->match($item['verb'], Activity::FOLLOW) && - $item['object-type'] === Activity\ObjectType::NOTE && - empty($item['self']) && - $item['uid'] == local_user()) { - return false; - } - - return true; -} - -function conv_get_blocklist() -{ - if (!local_user()) { - return []; - } - - $str_blocked = str_replace(["\n", "\r"], ",", DI::pConfig()->get(local_user(), 'system', 'blocked')); - if (empty($str_blocked)) { - return []; - } - - $blocklist = []; - - foreach (explode(',', $str_blocked) as $entry) { - $cid = Contact::getIdForURL(trim($entry), 0, false); - if (!empty($cid)) { - $blocklist[] = $cid; - } - } - - return $blocklist; -} - -/** - * "Render" a conversation or list of items for HTML display. - * There are two major forms of display: - * - Sequential or unthreaded ("New Item View" or search results) - * - conversation view - * The $mode parameter decides between the various renderings and also - * figures out how to determine page owner and other contextual items - * that are based on unique features of the calling module. - * @param App $a - * @param array $items - * @param $mode - * @param $update - * @param bool $preview - * @param string $order - * @param int $uid - * @return string - * @throws ImagickException - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - */ -function conversation(App $a, array $items, $mode, $update, $preview = false, $order = 'commented', $uid = 0) -{ - DI::profiler()->startRecording('rendering'); - $page = DI::page(); - - $page->registerFooterScript(Theme::getPathForFile('asset/typeahead.js/dist/typeahead.bundle.js')); - $page->registerFooterScript(Theme::getPathForFile('js/friendica-tagsinput/friendica-tagsinput.js')); - $page->registerStylesheet(Theme::getPathForFile('js/friendica-tagsinput/friendica-tagsinput.css')); - $page->registerStylesheet(Theme::getPathForFile('js/friendica-tagsinput/friendica-tagsinput-typeahead.css')); - - $ssl_state = (local_user() ? true : false); - - $live_update_div = ''; - - $blocklist = conv_get_blocklist(); - - $previewing = (($preview) ? ' preview ' : ''); - - if ($mode === 'network') { - $items = conversation_add_children($items, false, $order, $uid); - if (!$update) { - /* - * The special div is needed for liveUpdate to kick in for this page. - * We only launch liveUpdate if you aren't filtering in some incompatible - * way and also you aren't writing a comment (discovered in javascript). - */ - $live_update_div = '
' . "\r\n" - . "\r\n"; - } - } elseif ($mode === 'profile') { - $items = conversation_add_children($items, false, $order, local_user()); - - if (!$update) { - $tab = 'posts'; - if (!empty($_GET['tab'])) { - $tab = Strings::escapeTags(trim($_GET['tab'])); - } - if ($tab === 'posts') { - /* - * This is ugly, but we can't pass the profile_uid through the session to the ajax updater, - * because browser prefetching might change it on us. We have to deliver it with the page. - */ - - $live_update_div = '
' . "\r\n" - . "\r\n"; - } - } - } elseif ($mode === 'notes') { - $items = conversation_add_children($items, false, $order, local_user()); - - if (!$update) { - $live_update_div = '
' . "\r\n" - . "\r\n"; - } - } elseif ($mode === 'display') { - $items = conversation_add_children($items, false, $order, $uid); - - if (!$update) { - $live_update_div = '
' . "\r\n" - . ""; - } - } elseif ($mode === 'community') { - $items = conversation_add_children($items, true, $order, $uid); - - if (!$update) { - $live_update_div = '
' . "\r\n" - . "\r\n"; - } - } elseif ($mode === 'contacts') { - $items = conversation_add_children($items, false, $order, $uid); - - if (!$update) { - $live_update_div = '
' . "\r\n" - . "\r\n"; - } - } elseif ($mode === 'search') { - $live_update_div = '' . "\r\n"; - } - - $page_dropping = ((local_user() && local_user() == $uid) ? true : false); - - if (!$update) { - $_SESSION['return_path'] = DI::args()->getQueryString(); - } - - $cb = ['items' => $items, 'mode' => $mode, 'update' => $update, 'preview' => $preview]; - Hook::callAll('conversation_start', $cb); - - $items = $cb['items']; - - $conv_responses = [ - 'like' => [], - 'dislike' => [], - 'attendyes' => [], - 'attendno' => [], - 'attendmaybe' => [], - 'announce' => [], - ]; - - if (DI::pConfig()->get(local_user(), 'system', 'hide_dislike')) { - unset($conv_responses['dislike']); - } - - // array with html for each thread (parent+comments) - $threads = []; - $threadsid = -1; - - $page_template = Renderer::getMarkupTemplate("conversation.tpl"); - $formSecurityToken = BaseModule::getFormSecurityToken('contact_action'); - - if (!empty($items)) { - if (in_array($mode, ['community', 'contacts', 'profile'])) { - $writable = true; - } else { - $writable = ($items[0]['uid'] == 0) && in_array($items[0]['network'], Protocol::FEDERATED); - } - - if (!local_user()) { - $writable = false; - } - - if (in_array($mode, ['filed', 'search', 'contact-posts'])) { - - /* - * "New Item View" on network page or search page results - * - just loop through the items and format them minimally for display - */ - - $tpl = 'search_item.tpl'; - - $uriids = []; - - foreach ($items as $item) { - if (in_array($item['uri-id'], $uriids)) { - continue; - } - - $uriids[] = $item['uri-id']; - - if (!visible_activity($item)) { - continue; - } - - if (in_array($item['author-id'], $blocklist)) { - continue; - } - - $threadsid++; - - // prevent private email from leaking. - if ($item['network'] === Protocol::MAIL && local_user() != $item['uid']) { - continue; - } - - $profile_name = $item['author-name']; - if (!empty($item['author-link']) && empty($item['author-name'])) { - $profile_name = $item['author-link']; - } - - $tags = Tag::populateFromItem($item); - - $author = ['uid' => 0, 'id' => $item['author-id'], - 'network' => $item['author-network'], 'url' => $item['author-link']]; - $profile_link = Contact::magicLinkByContact($author); - - $sparkle = ''; - if (strpos($profile_link, 'redir/') === 0) { - $sparkle = ' sparkle'; - } - - $locate = ['location' => $item['location'], 'coord' => $item['coord'], 'html' => '']; - Hook::callAll('render_location', $locate); - $location_html = $locate['html'] ?: Strings::escapeHtml($locate['location'] ?: $locate['coord'] ?: ''); - - localize_item($item); - if ($mode === 'filed') { - $dropping = true; - } else { - $dropping = false; - } - - $drop = [ - 'dropping' => $dropping, - 'pagedrop' => $page_dropping, - 'select' => DI::l10n()->t('Select'), - 'delete' => DI::l10n()->t('Delete'), - ]; - - $likebuttons = [ - 'like' => null, - 'dislike' => null, - 'share' => null, - 'announce' => null, - ]; - - if (DI::pConfig()->get(local_user(), 'system', 'hide_dislike')) { - unset($likebuttons['dislike']); - } - - $body_html = Item::prepareBody($item, true, $preview); - - list($categories, $folders) = DI::contentItem()->determineCategoriesTerms($item, local_user()); - - if (!empty($item['content-warning']) && DI::pConfig()->get(local_user(), 'system', 'disable_cw', false)) { - $title = ucfirst($item['content-warning']); - } else { - $title = $item['title']; - } - - $tmp_item = [ - 'template' => $tpl, - 'id' => ($preview ? 'P0' : $item['id']), - 'guid' => ($preview ? 'Q0' : $item['guid']), - 'commented' => $item['commented'], - 'received' => $item['received'], - 'created_date' => $item['created'], - 'uriid' => $item['uri-id'], - 'network' => $item['network'], - 'network_name' => ContactSelector::networkToName($item['author-network'], $item['author-link'], $item['network']), - 'network_icon' => ContactSelector::networkToIcon($item['network'], $item['author-link']), - 'linktitle' => DI::l10n()->t('View %s\'s profile @ %s', $profile_name, $item['author-link']), - 'profile_url' => $profile_link, - 'item_photo_menu_html' => item_photo_menu($item, $formSecurityToken), - 'name' => $profile_name, - 'sparkle' => $sparkle, - 'lock' => false, - 'thumb' => DI::baseUrl()->remove(Contact::getAvatarUrlForUrl($item['author-link'], $item['uid'], Proxy::SIZE_THUMB)), - 'title' => $title, - 'body_html' => $body_html, - 'tags' => $tags['tags'], - 'hashtags' => $tags['hashtags'], - 'mentions' => $tags['mentions'], - 'implicit_mentions' => $tags['implicit_mentions'], - 'txt_cats' => DI::l10n()->t('Categories:'), - 'txt_folders' => DI::l10n()->t('Filed under:'), - 'has_cats' => ((count($categories)) ? 'true' : ''), - 'has_folders' => ((count($folders)) ? 'true' : ''), - 'categories' => $categories, - 'folders' => $folders, - 'text' => strip_tags($body_html), - 'localtime' => DateTimeFormat::local($item['created'], 'r'), - 'ago' => (($item['app']) ? DI::l10n()->t('%s from %s', Temporal::getRelativeDate($item['created']), $item['app']) : Temporal::getRelativeDate($item['created'])), - 'location_html' => $location_html, - 'indent' => '', - 'owner_name' => '', - 'owner_url' => '', - 'owner_photo' => DI::baseUrl()->remove(Contact::getAvatarUrlForUrl($item['owner-link'], $item['uid'], Proxy::SIZE_THUMB)), - 'plink' => Item::getPlink($item), - 'edpost' => false, - 'isstarred' => 'unstarred', - 'star' => false, - 'drop' => $drop, - 'vote' => $likebuttons, - 'like_html' => '', - 'dislike_html' => '', - 'comment_html' => '', - 'conv' => (($preview) ? '' : ['href'=> 'display/'.$item['guid'], 'title'=> DI::l10n()->t('View in context')]), - 'previewing' => $previewing, - 'wait' => DI::l10n()->t('Please wait'), - 'thread_level' => 1, - ]; - - $arr = ['item' => $item, 'output' => $tmp_item]; - Hook::callAll('display_item', $arr); - - $threads[$threadsid]['id'] = $item['id']; - $threads[$threadsid]['network'] = $item['network']; - $threads[$threadsid]['items'] = [$arr['output']]; - - } - } else { - // Normal View - $page_template = Renderer::getMarkupTemplate("threaded_conversation.tpl"); - - $conv = new Thread($mode, $preview, $writable); - - /* - * get all the topmost parents - * this shouldn't be needed, as we should have only them in our array - * But for now, this array respects the old style, just in case - */ - foreach ($items as $item) { - if (in_array($item['author-id'], $blocklist)) { - continue; - } - - // Can we put this after the visibility check? - builtin_activity_puller($item, $conv_responses); - - // Only add what is visible - if ($item['network'] === Protocol::MAIL && local_user() != $item['uid']) { - continue; - } - - if (!visible_activity($item)) { - continue; - } - - /// @todo Check if this call is needed or not - $arr = ['item' => $item]; - Hook::callAll('display_item', $arr); - - $item['pagedrop'] = $page_dropping; - - if ($item['gravity'] == GRAVITY_PARENT) { - $item_object = new PostObject($item); - $conv->addParent($item_object); - } - } - - $threads = $conv->getTemplateData($conv_responses, $formSecurityToken); - if (!$threads) { - Logger::log('[ERROR] conversation : Failed to get template data.', Logger::DEBUG); - $threads = []; - } - } - } - - $o = Renderer::replaceMacros($page_template, [ - '$baseurl' => DI::baseUrl()->get($ssl_state), - '$return_path' => DI::args()->getQueryString(), - '$live_update' => $live_update_div, - '$remove' => DI::l10n()->t('remove'), - '$mode' => $mode, - '$update' => $update, - '$threads' => $threads, - '$dropping' => ($page_dropping ? DI::l10n()->t('Delete Selected Items') : False), - ]); - - DI::profiler()->stopRecording(); - return $o; -} - -/** - * Adds some information (Causer, post reason, direction) to the fetched post row. - * - * @param array $row Post row - * @param array $activity Contact data of the resharer - * - * @return array items with parents and comments - */ -function conversation_add_row_information(array $row, array $activity) { - DI::profiler()->startRecording('rendering'); - - if ($row['uid'] == 0) { - $row['writable'] = in_array($row['network'], Protocol::FEDERATED); - } - - if (!empty($activity)) { - if (($row['gravity'] == GRAVITY_PARENT)) { - $row['post-reason'] = Item::PR_ANNOUNCEMENT; - $row = array_merge($row, $activity); - $contact = Contact::getById($activity['causer-id'], ['url', 'name', 'thumb']); - $row['causer-link'] = $contact['url']; - $row['causer-avatar'] = $contact['thumb']; - $row['causer-name'] = $contact['name']; - } elseif (($row['gravity'] == GRAVITY_ACTIVITY) && ($row['verb'] == Activity::ANNOUNCE) && - ($row['author-id'] == $activity['causer-id'])) { - return $row; - } - } - - switch ($row['post-reason']) { - case Item::PR_TO: - $row['direction'] = ['direction' => 7, 'title' => DI::l10n()->t('You had been addressed (%s).', 'to')]; - break; - case Item::PR_CC: - $row['direction'] = ['direction' => 7, 'title' => DI::l10n()->t('You had been addressed (%s).', 'cc')]; - break; - case Item::PR_BTO: - $row['direction'] = ['direction' => 7, 'title' => DI::l10n()->t('You had been addressed (%s).', 'bto')]; - break; - case Item::PR_BCC: - $row['direction'] = ['direction' => 7, 'title' => DI::l10n()->t('You had been addressed (%s).', 'bcc')]; - break; - case Item::PR_FOLLOWER: - $row['direction'] = ['direction' => 6, 'title' => DI::l10n()->t('You are following %s.', $row['author-name'])]; - break; - case Item::PR_TAG: - $row['direction'] = ['direction' => 4, 'title' => DI::l10n()->t('Tagged')]; - break; - case Item::PR_ANNOUNCEMENT: - if (!empty($row['causer-id']) && DI::pConfig()->get(local_user(), 'system', 'display_resharer')) { - $row['owner-id'] = $row['causer-id']; - $row['owner-link'] = $row['causer-link']; - $row['owner-avatar'] = $row['causer-avatar']; - $row['owner-name'] = $row['causer-name']; - } - - if (($row['gravity'] == GRAVITY_PARENT) && !empty($row['causer-id'])) { - $causer = ['uid' => 0, 'id' => $row['causer-id'], - 'network' => $row['causer-network'], 'url' => $row['causer-link']]; - $row['reshared'] = DI::l10n()->t('%s reshared this.', '' . htmlentities($row['causer-name']) . ''); - } - $row['direction'] = ['direction' => 3, 'title' => (empty($row['causer-id']) ? DI::l10n()->t('Reshared') : DI::l10n()->t('Reshared by %s <%s>', $row['causer-name'], $row['causer-link']))]; - break; - case Item::PR_COMMENT: - $row['direction'] = ['direction' => 5, 'title' => DI::l10n()->t('%s is participating in this thread.', $row['author-name'])]; - break; - case Item::PR_STORED: - $row['direction'] = ['direction' => 8, 'title' => DI::l10n()->t('Stored')]; - break; - case Item::PR_GLOBAL: - $row['direction'] = ['direction' => 9, 'title' => DI::l10n()->t('Global')]; - break; - case Item::PR_RELAY: - $row['direction'] = ['direction' => 10, 'title' => (empty($row['causer-id']) ? DI::l10n()->t('Relayed') : DI::l10n()->t('Relayed by %s <%s>', $row['causer-name'], $row['causer-link']))]; - break; - case Item::PR_FETCHED: - $row['direction'] = ['direction' => 2, 'title' => (empty($row['causer-id']) ? DI::l10n()->t('Fetched') : DI::l10n()->t('Fetched because of %s <%s>', $row['causer-name'], $row['causer-link']))]; - break; - } - - DI::profiler()->stopRecording(); - return $row; -} - -/** - * Add comments to top level entries that had been fetched before - * - * The system will fetch the comments for the local user whenever possible. - * This behaviour is currently needed to allow commenting on Friendica posts. - * - * @param array $parents Parent items - * - * @param $block_authors - * @param $order - * @param $uid - * @return array items with parents and comments - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - */ -function conversation_add_children(array $parents, $block_authors, $order, $uid) { - DI::profiler()->startRecording('rendering'); - if (count($parents) > 1) { - $max_comments = DI::config()->get('system', 'max_comments', 100); - } else { - $max_comments = DI::config()->get('system', 'max_display_comments', 1000); - } - - $params = ['order' => ['uri-id' => true, 'uid' => true]]; - - $activities = []; - $uriids = []; - $commentcounter = []; - $activitycounter = []; - - foreach ($parents AS $parent) { - if (!empty($parent['thr-parent-id']) && !empty($parent['gravity']) && ($parent['gravity'] == GRAVITY_ACTIVITY)) { - $uriid = $parent['thr-parent-id']; - if (!empty($parent['author-id'])) { - $activities[$uriid] = ['causer-id' => $parent['author-id']]; - foreach (['commented', 'received', 'created'] as $orderfields) { - if (!empty($parent[$orderfields])) { - $activities[$uriid][$orderfields] = $parent[$orderfields]; - } - } - } - } else { - $uriid = $parent['uri-id']; - } - $uriids[] = $uriid; - - $commentcounter[$uriid] = 0; - $activitycounter[$uriid] = 0; - } - - $condition = ['parent-uri-id' => $uriids]; - if ($block_authors) { - $condition['author-hidden'] = false; - } - - $condition = DBA::mergeConditions($condition, - ["`uid` IN (0, ?) AND (`vid` != ? OR `vid` IS NULL)", $uid, Verb::getID(Activity::FOLLOW)]); - - $thread_items = Post::selectForUser(local_user(), array_merge(Item::DISPLAY_FIELDLIST, ['pinned', 'contact-uid', 'gravity', 'post-type', 'post-reason']), $condition, $params); - - $items = []; - - while ($row = Post::fetch($thread_items)) { - if (!empty($items[$row['uri-id']]) && ($row['uid'] == 0)) { - continue; - } - - if ($max_comments > 0) { - if (($row['gravity'] == GRAVITY_COMMENT) && (++$commentcounter[$row['parent-uri-id']] > $max_comments)) { - continue; - } - if (($row['gravity'] == GRAVITY_ACTIVITY) && (++$activitycounter[$row['parent-uri-id']] > $max_comments)) { - continue; - } - } - $items[$row['uri-id']] = conversation_add_row_information($row, $activities[$row['uri-id']] ?? []); - } - - DBA::close($thread_items); - - $items = conv_sort($items, $order); - - DI::profiler()->stopRecording(); - return $items; -} - -function item_photo_menu($item, string $formSecurityToken) -{ - DI::profiler()->startRecording('rendering'); - $sub_link = ''; - $poke_link = ''; - $contact_url = ''; - $pm_url = ''; - $status_link = ''; - $photos_link = ''; - $posts_link = ''; - $block_link = ''; - $ignore_link = ''; - - if (local_user() && local_user() == $item['uid'] && $item['gravity'] == GRAVITY_PARENT && !$item['self'] && !$item['mention']) { - $sub_link = 'javascript:doFollowThread(' . $item['id'] . '); return false;'; - } - - $author = ['uid' => 0, 'id' => $item['author-id'], - 'network' => $item['author-network'], 'url' => $item['author-link']]; - $profile_link = Contact::magicLinkByContact($author, $item['author-link']); - $sparkle = (strpos($profile_link, 'redir/') === 0); - - $cid = 0; - $pcid = $item['author-id']; - $network = ''; - $rel = 0; - $condition = ['uid' => local_user(), 'nurl' => Strings::normaliseLink($item['author-link'])]; - $contact = DBA::selectFirst('contact', ['id', 'network', 'rel'], $condition); - if (DBA::isResult($contact)) { - $cid = $contact['id']; - $network = $contact['network']; - $rel = $contact['rel']; - } - - if ($sparkle) { - $status_link = $profile_link . '/status'; - $photos_link = str_replace('/profile/', '/photos/', $profile_link); - $profile_link = $profile_link . '/profile'; - } - - if (!empty($pcid)) { - $contact_url = 'contact/' . $pcid; - $posts_link = $contact_url . '/posts'; - $block_link = $item['self'] ? '' : $contact_url . '/block?t=' . $formSecurityToken; - $ignore_link = $item['self'] ? '' : $contact_url . '/ignore?t=' . $formSecurityToken; - } - - if ($cid && !$item['self']) { - $contact_url = 'contact/' . $cid; - $poke_link = $contact_url . '/poke'; - $posts_link = $contact_url . '/posts'; - - if (in_array($network, [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA])) { - $pm_url = 'message/new/' . $cid; - } - } - - if (local_user()) { - $menu = [ - DI::l10n()->t('Follow Thread') => $sub_link, - DI::l10n()->t('View Status') => $status_link, - DI::l10n()->t('View Profile') => $profile_link, - DI::l10n()->t('View Photos') => $photos_link, - DI::l10n()->t('Network Posts') => $posts_link, - DI::l10n()->t('View Contact') => $contact_url, - DI::l10n()->t('Send PM') => $pm_url, - DI::l10n()->t('Block') => $block_link, - DI::l10n()->t('Ignore') => $ignore_link - ]; - - if (!empty($item['language'])) { - $menu[DI::l10n()->t('Languages')] = 'javascript:alert(\'' . Item::getLanguageMessage($item) . '\');'; - } - - if ($network == Protocol::DFRN) { - $menu[DI::l10n()->t("Poke")] = $poke_link; - } - - if ((($cid == 0) || ($rel == Contact::FOLLOWER)) && - in_array($item['network'], Protocol::FEDERATED)) { - $menu[DI::l10n()->t('Connect/Follow')] = 'follow?url=' . urlencode($item['author-link']) . '&auto=1'; - } - } else { - $menu = [DI::l10n()->t('View Profile') => $item['author-link']]; - } - - $args = ['item' => $item, 'menu' => $menu]; - - Hook::callAll('item_photo_menu', $args); - - $menu = $args['menu']; - - $o = ''; - foreach ($menu as $k => $v) { - if (strpos($v, 'javascript:') === 0) { - $v = substr($v, 11); - $o .= '
  • ' . $k . '
  • ' . PHP_EOL; - } elseif ($v) { - $o .= '
  • ' . $k . '
  • ' . PHP_EOL; - } - } - DI::profiler()->stopRecording(); - return $o; -} - -/** - * Checks item to see if it is one of the builtin activities (like/dislike, event attendance, consensus items, etc.) - * - * Increments the count of each matching activity and adds a link to the author as needed. - * - * @param array $activity - * @param array &$conv_responses (already created with builtin activity structure) - * @return void - * @throws ImagickException - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - */ -function builtin_activity_puller(array $activity, array &$conv_responses) -{ - foreach ($conv_responses as $mode => $v) { - $sparkle = ''; - - switch ($mode) { - case 'like': - $verb = Activity::LIKE; - break; - case 'dislike': - $verb = Activity::DISLIKE; - break; - case 'attendyes': - $verb = Activity::ATTEND; - break; - case 'attendno': - $verb = Activity::ATTENDNO; - break; - case 'attendmaybe': - $verb = Activity::ATTENDMAYBE; - break; - case 'announce': - $verb = Activity::ANNOUNCE; - break; - default: - return; - } - - if (!empty($activity['verb']) && DI::activity()->match($activity['verb'], $verb) && ($activity['gravity'] != GRAVITY_PARENT)) { - $author = [ - 'uid' => 0, - 'id' => $activity['author-id'], - 'network' => $activity['author-network'], - 'url' => $activity['author-link'] - ]; - $url = Contact::magicLinkByContact($author); - if (strpos($url, 'redir/') === 0) { - $sparkle = ' class="sparkle" '; - } - - $link = '' . htmlentities($activity['author-name']) . ''; - - if (empty($activity['thr-parent-id'])) { - $activity['thr-parent-id'] = $activity['parent-uri-id']; - } - - // Skip when the causer of the parent is the same than the author of the announce - if (($verb == Activity::ANNOUNCE) && Post::exists(['uri-id' => $activity['thr-parent-id'], - 'uid' => $activity['uid'], 'causer-id' => $activity['author-id'], 'gravity' => GRAVITY_PARENT])) { - continue; - } - - if (!isset($conv_responses[$mode][$activity['thr-parent-id']])) { - $conv_responses[$mode][$activity['thr-parent-id']] = [ - 'links' => [], - 'self' => 0, - ]; - } elseif (in_array($link, $conv_responses[$mode][$activity['thr-parent-id']]['links'])) { - // only list each unique author once - continue; - } - - if (public_contact() == $activity['author-id']) { - $conv_responses[$mode][$activity['thr-parent-id']]['self'] = 1; - } - - $conv_responses[$mode][$activity['thr-parent-id']]['links'][] = $link; - - // there can only be one activity verb per item so if we found anything, we can stop looking - return; - } - } -} - -/** - * Format the activity text for an item/photo/video - * - * @param array $links = array of pre-linked names of actors - * @param string $verb = one of 'like, 'dislike', 'attendyes', 'attendno', 'attendmaybe' - * @param int $id = item id - * @return string formatted text - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - */ -function format_activity(array $links, $verb, $id) { - DI::profiler()->startRecording('rendering'); - $o = ''; - $expanded = ''; - $phrase = ''; - - $total = count($links); - if ($total == 1) { - $likers = $links[0]; - - // Phrase if there is only one liker. In other cases it will be uses for the expanded - // list which show all likers - switch ($verb) { - case 'like' : - $phrase = DI::l10n()->t('%s likes this.', $likers); - break; - case 'dislike' : - $phrase = DI::l10n()->t('%s doesn\'t like this.', $likers); - break; - case 'attendyes' : - $phrase = DI::l10n()->t('%s attends.', $likers); - break; - case 'attendno' : - $phrase = DI::l10n()->t('%s doesn\'t attend.', $likers); - break; - case 'attendmaybe' : - $phrase = DI::l10n()->t('%s attends maybe.', $likers); - break; - case 'announce' : - $phrase = DI::l10n()->t('%s reshared this.', $likers); - break; - } - } elseif ($total > 1) { - if ($total < MAX_LIKERS) { - $likers = implode(', ', array_slice($links, 0, -1)); - $likers .= ' ' . DI::l10n()->t('and') . ' ' . $links[count($links)-1]; - } else { - $likers = implode(', ', array_slice($links, 0, MAX_LIKERS - 1)); - $likers .= ' ' . DI::l10n()->t('and %d other people', $total - MAX_LIKERS); - } - - $spanatts = "class=\"fakelink\" onclick=\"openClose('{$verb}list-$id');\""; - - $explikers = ''; - switch ($verb) { - case 'like': - $phrase = DI::l10n()->t('%2$d people like this', $spanatts, $total); - $explikers = DI::l10n()->t('%s like this.', $likers); - break; - case 'dislike': - $phrase = DI::l10n()->t('%2$d people don\'t like this', $spanatts, $total); - $explikers = DI::l10n()->t('%s don\'t like this.', $likers); - break; - case 'attendyes': - $phrase = DI::l10n()->t('%2$d people attend', $spanatts, $total); - $explikers = DI::l10n()->t('%s attend.', $likers); - break; - case 'attendno': - $phrase = DI::l10n()->t('%2$d people don\'t attend', $spanatts, $total); - $explikers = DI::l10n()->t('%s don\'t attend.', $likers); - break; - case 'attendmaybe': - $phrase = DI::l10n()->t('%2$d people attend maybe', $spanatts, $total); - $explikers = DI::l10n()->t('%s attend maybe.', $likers); - break; - case 'announce': - $phrase = DI::l10n()->t('%2$d people reshared this', $spanatts, $total); - $explikers = DI::l10n()->t('%s reshared this.', $likers); - break; - } - - $expanded .= "\t" . ''; - } - - $o .= Renderer::replaceMacros(Renderer::getMarkupTemplate('voting_fakelink.tpl'), [ - '$phrase' => $phrase, - '$type' => $verb, - '$id' => $id - ]); - $o .= $expanded; - - DI::profiler()->stopRecording(); - return $o; -} - -function status_editor(App $a, array $x = [], $notes_cid = 0, $popup = false) -{ - $user = User::getById($a->getLoggedInUserId(), ['uid', 'nickname', 'allow_location', 'default-location']); - if (empty($user['uid'])) { - return ''; - } - - DI::profiler()->startRecording('rendering'); - $o = ''; - - $x['allow_location'] = $x['allow_location'] ?? $user['allow_location']; - $x['default_location'] = $x['default_location'] ?? $user['default-location']; - $x['nickname'] = $x['nickname'] ?? $user['nickname']; - $x['lockstate'] = $x['lockstate'] ?? ACL::getLockstateForUserId($user['uid']) ? 'lock' : 'unlock'; - $x['acl'] = $x['acl'] ?? ACL::getFullSelectorHTML(DI::page(), $user['uid'], true); - $x['bang'] = $x['bang'] ?? ''; - $x['visitor'] = $x['visitor'] ?? 'block'; - $x['is_owner'] = $x['is_owner'] ?? true; - $x['profile_uid'] = $x['profile_uid'] ?? local_user(); - - - $geotag = !empty($x['allow_location']) ? Renderer::replaceMacros(Renderer::getMarkupTemplate('jot_geotag.tpl'), []) : ''; - - $tpl = Renderer::getMarkupTemplate('jot-header.tpl'); - DI::page()['htmlhead'] .= Renderer::replaceMacros($tpl, [ - '$newpost' => 'true', - '$baseurl' => DI::baseUrl()->get(true), - '$geotag' => $geotag, - '$nickname' => $x['nickname'], - '$ispublic' => DI::l10n()->t('Visible to everybody'), - '$linkurl' => DI::l10n()->t('Please enter a image/video/audio/webpage URL:'), - '$term' => DI::l10n()->t('Tag term:'), - '$fileas' => DI::l10n()->t('Save to Folder:'), - '$whereareu' => DI::l10n()->t('Where are you right now?'), - '$delitems' => DI::l10n()->t("Delete item\x28s\x29?"), - '$is_mobile' => DI::mode()->isMobile(), - ]); - - $jotplugins = ''; - Hook::callAll('jot_tool', $jotplugins); - - $tpl = Renderer::getMarkupTemplate("jot.tpl"); - - $o .= Renderer::replaceMacros($tpl, [ - '$new_post' => DI::l10n()->t('New Post'), - '$return_path' => DI::args()->getQueryString(), - '$action' => 'item', - '$share' => ($x['button'] ?? '') ?: DI::l10n()->t('Share'), - '$loading' => DI::l10n()->t('Loading...'), - '$upload' => DI::l10n()->t('Upload photo'), - '$shortupload' => DI::l10n()->t('upload photo'), - '$attach' => DI::l10n()->t('Attach file'), - '$shortattach' => DI::l10n()->t('attach file'), - '$edbold' => DI::l10n()->t('Bold'), - '$editalic' => DI::l10n()->t('Italic'), - '$eduline' => DI::l10n()->t('Underline'), - '$edquote' => DI::l10n()->t('Quote'), - '$edcode' => DI::l10n()->t('Code'), - '$edimg' => DI::l10n()->t('Image'), - '$edurl' => DI::l10n()->t('Link'), - '$edattach' => DI::l10n()->t('Link or Media'), - '$edvideo' => DI::l10n()->t('Video'), - '$setloc' => DI::l10n()->t('Set your location'), - '$shortsetloc' => DI::l10n()->t('set location'), - '$noloc' => DI::l10n()->t('Clear browser location'), - '$shortnoloc' => DI::l10n()->t('clear location'), - '$title' => $x['title'] ?? '', - '$placeholdertitle' => DI::l10n()->t('Set title'), - '$category' => $x['category'] ?? '', - '$placeholdercategory' => Feature::isEnabled(local_user(), 'categories') ? DI::l10n()->t("Categories \x28comma-separated list\x29") : '', - '$scheduled_at' => Temporal::getDateTimeField( - new DateTime(), - new DateTime('now + 6 months'), - null, - DI::l10n()->t('Scheduled at'), - 'scheduled_at' - ), - '$wait' => DI::l10n()->t('Please wait'), - '$permset' => DI::l10n()->t('Permission settings'), - '$shortpermset' => DI::l10n()->t('Permissions'), - '$wall' => $notes_cid ? 0 : 1, - '$posttype' => $notes_cid ? Item::PT_PERSONAL_NOTE : Item::PT_ARTICLE, - '$content' => $x['content'] ?? '', - '$post_id' => $x['post_id'] ?? '', - '$baseurl' => DI::baseUrl()->get(true), - '$defloc' => $x['default_location'], - '$visitor' => $x['visitor'], - '$pvisit' => $notes_cid ? 'none' : $x['visitor'], - '$public' => DI::l10n()->t('Public post'), - '$lockstate' => $x['lockstate'], - '$bang' => $x['bang'], - '$profile_uid' => $x['profile_uid'], - '$preview' => DI::l10n()->t('Preview'), - '$jotplugins' => $jotplugins, - '$notes_cid' => $notes_cid, - '$cancel' => DI::l10n()->t('Cancel'), - '$rand_num' => Crypto::randomDigits(12), - - // ACL permissions box - '$acl' => $x['acl'], - - //jot nav tab (used in some themes) - '$message' => DI::l10n()->t('Message'), - '$browser' => DI::l10n()->t('Browser'), - - '$compose_link_title' => DI::l10n()->t('Open Compose page'), - ]); - - - if ($popup == true) { - $o = ''; - } - - DI::profiler()->stopRecording(); - return $o; -} - -/** - * Plucks the children of the given parent from a given item list. - * - * @param array $item_list - * @param array $parent - * @param bool $recursive - * @return array - */ -function get_item_children(array &$item_list, array $parent, $recursive = true) -{ - DI::profiler()->startRecording('rendering'); - $children = []; - foreach ($item_list as $i => $item) { - if ($item['gravity'] != GRAVITY_PARENT) { - if ($recursive) { - // Fallback to parent-uri if thr-parent is not set - $thr_parent = $item['thr-parent-id']; - if ($thr_parent == '') { - $thr_parent = $item['parent-uri-id']; - } - - if ($thr_parent == $parent['uri-id']) { - $item['children'] = get_item_children($item_list, $item); - $children[] = $item; - unset($item_list[$i]); - } - } elseif ($item['parent-uri-id'] == $parent['uri-id']) { - $children[] = $item; - unset($item_list[$i]); - } - } - } - DI::profiler()->stopRecording(); - return $children; -} - -/** - * Recursively sorts a tree-like item array - * - * @param array $items - * @return array - */ -function sort_item_children(array $items) -{ - DI::profiler()->startRecording('rendering'); - $result = $items; - usort($result, 'sort_thr_received_rev'); - foreach ($result as $k => $i) { - if (isset($result[$k]['children'])) { - $result[$k]['children'] = sort_item_children($result[$k]['children']); - } - } - DI::profiler()->stopRecording(); - return $result; -} - -/** - * Recursively add all children items at the top level of a list - * - * @param array $children List of items to append - * @param array $item_list - */ -function add_children_to_list(array $children, array &$item_list) -{ - foreach ($children as $child) { - $item_list[] = $child; - if (isset($child['children'])) { - add_children_to_list($child['children'], $item_list); - } - } -} - -/** - * Selectively flattens a tree-like item structure to prevent threading stairs - * - * This recursive function takes the item tree structure created by conv_sort() and - * flatten the extraneous depth levels when people reply sequentially, removing the - * stairs effect in threaded conversations limiting the available content width. - * - * The basic principle is the following: if a post item has only one reply and is - * the last reply of its parent, then the reply is moved to the parent. - * - * This process is rendered somewhat more complicated because items can be either - * replies or likes, and these don't factor at all in the reply count/last reply. - * - * @param array $parent A tree-like array of items - * @return array - */ -function smart_flatten_conversation(array $parent) -{ - DI::profiler()->startRecording('rendering'); - if (!isset($parent['children']) || count($parent['children']) == 0) { - DI::profiler()->stopRecording(); - return $parent; - } - - // We use a for loop to ensure we process the newly-moved items - for ($i = 0; $i < count($parent['children']); $i++) { - $child = $parent['children'][$i]; - - if (isset($child['children']) && count($child['children'])) { - // This helps counting only the regular posts - $count_post_closure = function($var) { - DI::profiler()->stopRecording(); - return $var['verb'] === Activity::POST; - }; - - $child_post_count = count(array_filter($child['children'], $count_post_closure)); - - $remaining_post_count = count(array_filter(array_slice($parent['children'], $i), $count_post_closure)); - - // If there's only one child's children post and this is the last child post - if ($child_post_count == 1 && $remaining_post_count == 1) { - - // Searches the post item in the children - $j = 0; - while($child['children'][$j]['verb'] !== Activity::POST && $j < count($child['children'])) { - $j ++; - } - - $moved_item = $child['children'][$j]; - unset($parent['children'][$i]['children'][$j]); - $parent['children'][] = $moved_item; - } else { - $parent['children'][$i] = smart_flatten_conversation($child); - } - } - } - - DI::profiler()->stopRecording(); - return $parent; -} - - -/** - * Expands a flat list of items into corresponding tree-like conversation structures. - * - * sort the top-level posts either on "received" or "commented", and finally - * append all the items at the top level (???) - * - * @param array $item_list A list of items belonging to one or more conversations - * @param string $order Either on "received" or "commented" - * @return array - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - */ -function conv_sort(array $item_list, $order) -{ - DI::profiler()->startRecording('rendering'); - $parents = []; - - if (!(is_array($item_list) && count($item_list))) { - DI::profiler()->stopRecording(); - return $parents; - } - - $blocklist = conv_get_blocklist(); - - $item_array = []; - - // Dedupes the item list on the uri to prevent infinite loops - foreach ($item_list as $item) { - if (in_array($item['author-id'], $blocklist)) { - continue; - } - - $item_array[$item['uri-id']] = $item; - } - - // Extract the top level items - foreach ($item_array as $item) { - if ($item['gravity'] == GRAVITY_PARENT) { - $parents[] = $item; - } - } - - if (stristr($order, 'pinned_received')) { - usort($parents, 'sort_thr_pinned_received'); - } elseif (stristr($order, 'received')) { - usort($parents, 'sort_thr_received'); - } elseif (stristr($order, 'commented')) { - usort($parents, 'sort_thr_commented'); - } - - /* - * Plucks children from the item_array, second pass collects eventual orphan - * items and add them as children of their top-level post. - */ - foreach ($parents as $i => $parent) { - $parents[$i]['children'] = - array_merge(get_item_children($item_array, $parent, true), - get_item_children($item_array, $parent, false)); - } - - foreach ($parents as $i => $parent) { - $parents[$i]['children'] = sort_item_children($parents[$i]['children']); - } - - if (!DI::pConfig()->get(local_user(), 'system', 'no_smart_threading', 0)) { - foreach ($parents as $i => $parent) { - $parents[$i] = smart_flatten_conversation($parent); - } - } - - /// @TODO: Stop recusrsively adding all children back to the top level (!!!) - /// However, this apparently ensures responses (likes, attendance) display (?!) - foreach ($parents as $parent) { - if (count($parent['children'])) { - add_children_to_list($parent['children'], $parents); - } - } - - DI::profiler()->stopRecording(); - return $parents; -} - -/** - * usort() callback to sort item arrays by pinned and the received key - * - * @param array $a - * @param array $b - * @return int - */ -function sort_thr_pinned_received(array $a, array $b) -{ - if ($b['pinned'] && !$a['pinned']) { - return 1; - } elseif (!$b['pinned'] && $a['pinned']) { - return -1; - } - - return strcmp($b['received'], $a['received']); -} - -/** - * usort() callback to sort item arrays by the received key - * - * @param array $a - * @param array $b - * @return int - */ -function sort_thr_received(array $a, array $b) -{ - return strcmp($b['received'], $a['received']); -} - -/** - * usort() callback to reverse sort item arrays by the received key - * - * @param array $a - * @param array $b - * @return int - */ -function sort_thr_received_rev(array $a, array $b) -{ - return strcmp($a['received'], $b['received']); -} - -/** - * usort() callback to sort item arrays by the commented key - * - * @param array $a - * @param array $b - * @return int - */ -function sort_thr_commented(array $a, array $b) -{ - return strcmp($b['commented'], $a['commented']); -} diff --git a/mod/display.php b/mod/display.php index bb69a611c..d46517032 100644 --- a/mod/display.php +++ b/mod/display.php @@ -272,7 +272,7 @@ function display_content(App $a, $update = false, $update_uid = 0) // We need the editor here to be able to reshare an item. if ($is_owner && !$update) { - $o .= status_editor($a, [], 0, true); + $o .= DI::conversation()->statusEditor([], 0, true); } $sql_extra = Item::getPermissionsSQLByUserId($page_uid); @@ -306,7 +306,7 @@ function display_content(App $a, $update = false, $update_uid = 0) $o .= ""; } - $o .= conversation($a, [$item], 'display', $update_uid, false, 'commented', $item_uid); + $o .= DI::conversation()->create([$item], 'display', $update_uid, false, 'commented', $item_uid); // Preparing the meta header $description = trim(BBCode::toPlaintext($item['body'])); diff --git a/mod/item.php b/mod/item.php index 7693b28c6..00248df43 100644 --- a/mod/item.php +++ b/mod/item.php @@ -677,7 +677,7 @@ function item_post(App $a) { $datarray["uri-id"] = -1; $datarray["author-network"] = Protocol::DFRN; - $o = conversation($a, [array_merge($contact_record, $datarray)], 'search', false, true); + $o = DI::conversation()->create([array_merge($contact_record, $datarray)], 'search', false, true); System::jsonExit(['preview' => $o]); } diff --git a/mod/notes.php b/mod/notes.php index 11ec8a035..5996c140f 100644 --- a/mod/notes.php +++ b/mod/notes.php @@ -57,7 +57,7 @@ function notes_content(App $a, $update = false) 'acl_data' => '', ]; - $o .= status_editor($a, $x, $a->getContactId()); + $o .= DI::conversation()->statusEditor($x, $a->getContactId()); } $condition = ['uid' => local_user(), 'post-type' => Item::PT_PERSONAL_NOTE, 'gravity' => GRAVITY_PARENT, @@ -84,7 +84,7 @@ function notes_content(App $a, $update = false) $count = count($notes); - $o .= conversation($a, $notes, 'notes', $update); + $o .= DI::conversation()->create($notes, 'notes', $update); } $o .= $pager->renderMinimal($count); diff --git a/mod/photos.php b/mod/photos.php index 1c9e85be8..209b9fb7b 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -1394,15 +1394,15 @@ function photos_content(App $a) // display comments if (DBA::isResult($items)) { foreach ($items as $item) { - builtin_activity_puller($item, $conv_responses); + DI::conversation()->builtinActivityPuller($item, $conv_responses); } if (!empty($conv_responses['like'][$link_item['uri']])) { - $like = format_activity($conv_responses['like'][$link_item['uri']]['links'], 'like', $link_item['id']); + $like = DI::conversation()->formatActivity($conv_responses['like'][$link_item['uri']]['links'], 'like', $link_item['id']); } if (!empty($conv_responses['dislike'][$link_item['uri']])) { - $dislike = format_activity($conv_responses['dislike'][$link_item['uri']]['links'], 'dislike', $link_item['id']); + $dislike = DI::conversation()->formatActivity($conv_responses['dislike'][$link_item['uri']]['links'], 'dislike', $link_item['id']); } if (($can_post || Security::canWriteToUserWall($owner_uid))) { diff --git a/src/Content/Conversation.php b/src/Content/Conversation.php new file mode 100644 index 000000000..fbe88106a --- /dev/null +++ b/src/Content/Conversation.php @@ -0,0 +1,1226 @@ +. + * + */ + +namespace Friendica\Content; + +use Friendica\App; +use Friendica\App\Arguments; +use Friendica\App\BaseURL; +use Friendica\BaseModule; +use Friendica\Content\ContactSelector; +use Friendica\Content\Feature; +use Friendica\Content\Item; +use Friendica\Core\ACL; +use Friendica\Core\Config\IConfig; +use Friendica\Core\Hook; +use Friendica\Core\L10n; +use Friendica\Core\PConfig\IPConfig; +use Friendica\Core\Protocol; +use Friendica\Core\Renderer; +use Friendica\Core\Session; +use Friendica\Core\Theme; +use Friendica\Database\DBA; +use Friendica\Model\Contact; +use Friendica\Model\Item as ItemModel; +use Friendica\Model\Post; +use Friendica\Model\Tag; +use Friendica\Model\User; +use Friendica\Model\Verb; +use Friendica\Object\Post as PostObject; +use Friendica\Object\Thread; +use Friendica\Protocol\Activity; +use Friendica\Util\Crypto; +use Friendica\Util\DateTimeFormat; +use Friendica\Util\Profiler; +use Friendica\Util\Proxy; +use Friendica\Util\Strings; +use Friendica\Util\Temporal; +use Psr\Log\LoggerInterface; + +class Conversation +{ + /** @var Activity */ + private $activity; + /** @var L10n */ + private $l10n; + /** @var Profiler */ + private $profiler; + /** @var LoggerInterface */ + private $logger; + /** @var Item */ + private $item; + /** @var App\Arguments */ + private $args; + /** @var IPConfig */ + private $pConfig; + /** @var BaseURL */ + private $baseURL; + /** @var IConfig */ + private $config; + /** @var App */ + private $app; + /** @var App\Page */ + private $page; + /** @var App\Mode */ + private $mode; + + public function __construct(LoggerInterface $logger, Profiler $profiler, Activity $activity, L10n $l10n, Item $item, Arguments $args, BaseURL $baseURL, IConfig $config, IPConfig $pConfig, App\Page $page, App\Mode $mode, App $app) + { + $this->activity = $activity; + $this->item = $item; + $this->config = $config; + $this->mode = $mode; + $this->baseURL = $baseURL; + $this->profiler = $profiler; + $this->logger = $logger; + $this->l10n = $l10n; + $this->args = $args; + $this->pConfig = $pConfig; + $this->page = $page; + $this->app = $app; + } + + private function getBlocklist() + { + if (!local_user()) { + return []; + } + + $str_blocked = str_replace(["\n", "\r"], ",", $this->pConfig->get(local_user(), 'system', 'blocked')); + if (empty($str_blocked)) { + return []; + } + + $blocklist = []; + + foreach (explode(',', $str_blocked) as $entry) { + $cid = Contact::getIdForURL(trim($entry), 0, false); + if (!empty($cid)) { + $blocklist[] = $cid; + } + } + + return $blocklist; + } + + /** + * "Render" a conversation or list of items for HTML display. + * There are two major forms of display: + * - Sequential or unthreaded ("New Item View" or search results) + * - conversation view + * The $mode parameter decides between the various renderings and also + * figures out how to determine page owner and other contextual items + * that are based on unique features of the calling module. + * @param array $items + * @param $mode + * @param $update + * @param bool $preview + * @param string $order + * @param int $uid + * @return string + * @throws ImagickException + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + public function create(array $items, $mode, $update, $preview = false, $order = 'commented', $uid = 0) + { + $this->profiler->startRecording('rendering'); + + $this->page->registerFooterScript(Theme::getPathForFile('asset/typeahead.js/dist/typeahead.bundle.js')); + $this->page->registerFooterScript(Theme::getPathForFile('js/friendica-tagsinput/friendica-tagsinput.js')); + $this->page->registerStylesheet(Theme::getPathForFile('js/friendica-tagsinput/friendica-tagsinput.css')); + $this->page->registerStylesheet(Theme::getPathForFile('js/friendica-tagsinput/friendica-tagsinput-typeahead.css')); + + $ssl_state = (local_user() ? true : false); + + $live_update_div = ''; + + $blocklist = $this->getBlocklist(); + + $previewing = (($preview) ? ' preview ' : ''); + + if ($mode === 'network') { + $items = $this->addChildren($items, false, $order, $uid); + if (!$update) { + /* + * The special div is needed for liveUpdate to kick in for this page. + * We only launch liveUpdate if you aren't filtering in some incompatible + * way and also you aren't writing a comment (discovered in javascript). + */ + $live_update_div = '
    ' . "\r\n" + . "\r\n"; + } + } elseif ($mode === 'profile') { + $items = $this->addChildren($items, false, $order, local_user()); + + if (!$update) { + $tab = !empty($_GET['tab']) ? trim($_GET['tab']) : 'posts'; + + if ($tab === 'posts') { + /* + * This is ugly, but we can't pass the profile_uid through the session to the ajax updater, + * because browser prefetching might change it on us. We have to deliver it with the page. + */ + + $live_update_div = '
    ' . "\r\n" + . "\r\n"; + } + } + } elseif ($mode === 'notes') { + $items = $this->addChildren($items, false, $order, local_user()); + + if (!$update) { + $live_update_div = '
    ' . "\r\n" + . "\r\n"; + } + } elseif ($mode === 'display') { + $items = $this->addChildren($items, false, $order, $uid); + + if (!$update) { + $live_update_div = '
    ' . "\r\n" + . ""; + } + } elseif ($mode === 'community') { + $items = $this->addChildren($items, true, $order, $uid); + + if (!$update) { + $live_update_div = '
    ' . "\r\n" + . "\r\n"; + } + } elseif ($mode === 'contacts') { + $items = $this->addChildren($items, false, $order, $uid); + + if (!$update) { + $live_update_div = '
    ' . "\r\n" + . "\r\n"; + } + } elseif ($mode === 'search') { + $live_update_div = '' . "\r\n"; + } + + $page_dropping = ((local_user() && local_user() == $uid) ? true : false); + + if (!$update) { + $_SESSION['return_path'] = $this->args->getQueryString(); + } + + $cb = ['items' => $items, 'mode' => $mode, 'update' => $update, 'preview' => $preview]; + Hook::callAll('conversation_start', $cb); + + $items = $cb['items']; + + $conv_responses = [ + 'like' => [], + 'dislike' => [], + 'attendyes' => [], + 'attendno' => [], + 'attendmaybe' => [], + 'announce' => [], + ]; + + if ($this->pConfig->get(local_user(), 'system', 'hide_dislike')) { + unset($conv_responses['dislike']); + } + + // array with html for each thread (parent+comments) + $threads = []; + $threadsid = -1; + + $page_template = Renderer::getMarkupTemplate("conversation.tpl"); + $formSecurityToken = BaseModule::getFormSecurityToken('contact_action'); + + if (!empty($items)) { + if (in_array($mode, ['community', 'contacts', 'profile'])) { + $writable = true; + } else { + $writable = ($items[0]['uid'] == 0) && in_array($items[0]['network'], Protocol::FEDERATED); + } + + if (!local_user()) { + $writable = false; + } + + if (in_array($mode, ['filed', 'search', 'contact-posts'])) { + + /* + * "New Item View" on network page or search page results + * - just loop through the items and format them minimally for display + */ + + $tpl = 'search_item.tpl'; + + $uriids = []; + + foreach ($items as $item) { + if (in_array($item['uri-id'], $uriids)) { + continue; + } + + $uriids[] = $item['uri-id']; + + if (!$this->item->visibleActivity($item)) { + continue; + } + + if (in_array($item['author-id'], $blocklist)) { + continue; + } + + $threadsid++; + + // prevent private email from leaking. + if ($item['network'] === Protocol::MAIL && local_user() != $item['uid']) { + continue; + } + + $profile_name = $item['author-name']; + if (!empty($item['author-link']) && empty($item['author-name'])) { + $profile_name = $item['author-link']; + } + + $tags = Tag::populateFromItem($item); + + $author = ['uid' => 0, 'id' => $item['author-id'], + 'network' => $item['author-network'], 'url' => $item['author-link']]; + $profile_link = Contact::magicLinkByContact($author); + + $sparkle = ''; + if (strpos($profile_link, 'redir/') === 0) { + $sparkle = ' sparkle'; + } + + $locate = ['location' => $item['location'], 'coord' => $item['coord'], 'html' => '']; + Hook::callAll('render_location', $locate); + $location_html = $locate['html'] ?: Strings::escapeHtml($locate['location'] ?: $locate['coord'] ?: ''); + + $this->item->localize($item); + if ($mode === 'filed') { + $dropping = true; + } else { + $dropping = false; + } + + $drop = [ + 'dropping' => $dropping, + 'pagedrop' => $page_dropping, + 'select' => $this->l10n->t('Select'), + 'delete' => $this->l10n->t('Delete'), + ]; + + $likebuttons = [ + 'like' => null, + 'dislike' => null, + 'share' => null, + 'announce' => null, + ]; + + if ($this->pConfig->get(local_user(), 'system', 'hide_dislike')) { + unset($likebuttons['dislike']); + } + + $body_html = ItemModel::prepareBody($item, true, $preview); + + list($categories, $folders) = $this->item->determineCategoriesTerms($item, local_user()); + + if (!empty($item['content-warning']) && $this->pConfig->get(local_user(), 'system', 'disable_cw', false)) { + $title = ucfirst($item['content-warning']); + } else { + $title = $item['title']; + } + + $tmp_item = [ + 'template' => $tpl, + 'id' => ($preview ? 'P0' : $item['id']), + 'guid' => ($preview ? 'Q0' : $item['guid']), + 'commented' => $item['commented'], + 'received' => $item['received'], + 'created_date' => $item['created'], + 'uriid' => $item['uri-id'], + 'network' => $item['network'], + 'network_name' => ContactSelector::networkToName($item['author-network'], $item['author-link'], $item['network']), + 'network_icon' => ContactSelector::networkToIcon($item['network'], $item['author-link']), + 'linktitle' => $this->l10n->t('View %s\'s profile @ %s', $profile_name, $item['author-link']), + 'profile_url' => $profile_link, + 'item_photo_menu_html' => $this->item->photoMenu($item, $formSecurityToken), + 'name' => $profile_name, + 'sparkle' => $sparkle, + 'lock' => false, + 'thumb' => $this->baseURL->remove(Contact::getAvatarUrlForUrl($item['author-link'], $item['uid'], Proxy::SIZE_THUMB)), + 'title' => $title, + 'body_html' => $body_html, + 'tags' => $tags['tags'], + 'hashtags' => $tags['hashtags'], + 'mentions' => $tags['mentions'], + 'implicit_mentions' => $tags['implicit_mentions'], + 'txt_cats' => $this->l10n->t('Categories:'), + 'txt_folders' => $this->l10n->t('Filed under:'), + 'has_cats' => ((count($categories)) ? 'true' : ''), + 'has_folders' => ((count($folders)) ? 'true' : ''), + 'categories' => $categories, + 'folders' => $folders, + 'text' => strip_tags($body_html), + 'localtime' => DateTimeFormat::local($item['created'], 'r'), + 'ago' => (($item['app']) ? $this->l10n->t('%s from %s', Temporal::getRelativeDate($item['created']), $item['app']) : Temporal::getRelativeDate($item['created'])), + 'location_html' => $location_html, + 'indent' => '', + 'owner_name' => '', + 'owner_url' => '', + 'owner_photo' => $this->baseURL->remove(Contact::getAvatarUrlForUrl($item['owner-link'], $item['uid'], Proxy::SIZE_THUMB)), + 'plink' => ItemModel::getPlink($item), + 'edpost' => false, + 'isstarred' => 'unstarred', + 'star' => false, + 'drop' => $drop, + 'vote' => $likebuttons, + 'like_html' => '', + 'dislike_html' => '', + 'comment_html' => '', + 'conv' => (($preview) ? '' : ['href'=> 'display/'.$item['guid'], 'title'=> $this->l10n->t('View in context')]), + 'previewing' => $previewing, + 'wait' => $this->l10n->t('Please wait'), + 'thread_level' => 1, + ]; + + $arr = ['item' => $item, 'output' => $tmp_item]; + Hook::callAll('display_item', $arr); + + $threads[$threadsid]['id'] = $item['id']; + $threads[$threadsid]['network'] = $item['network']; + $threads[$threadsid]['items'] = [$arr['output']]; + + } + } else { + // Normal View + $page_template = Renderer::getMarkupTemplate("threaded_conversation.tpl"); + + $conv = new Thread($mode, $preview, $writable); + + /* + * get all the topmost parents + * this shouldn't be needed, as we should have only them in our array + * But for now, this array respects the old style, just in case + */ + foreach ($items as $item) { + if (in_array($item['author-id'], $blocklist)) { + continue; + } + + // Can we put this after the visibility check? + $this->builtinActivityPuller($item, $conv_responses); + + // Only add what is visible + if ($item['network'] === Protocol::MAIL && local_user() != $item['uid']) { + continue; + } + + if (!$this->item->visibleActivity($item)) { + continue; + } + + /// @todo Check if this call is needed or not + $arr = ['item' => $item]; + Hook::callAll('display_item', $arr); + + $item['pagedrop'] = $page_dropping; + + if ($item['gravity'] == GRAVITY_PARENT) { + $item_object = new PostObject($item); + $conv->addParent($item_object); + } + } + + $threads = $conv->getTemplateData($conv_responses, $formSecurityToken); + if (!$threads) { + $this->logger->info('[ERROR] conversation : Failed to get template data.'); + $threads = []; + } + } + } + + $o = Renderer::replaceMacros($page_template, [ + '$baseurl' => $this->baseURL->get($ssl_state), + '$return_path' => $this->args->getQueryString(), + '$live_update' => $live_update_div, + '$remove' => $this->l10n->t('remove'), + '$mode' => $mode, + '$update' => $update, + '$threads' => $threads, + '$dropping' => ($page_dropping ? $this->l10n->t('Delete Selected Items') : False), + ]); + + $this->profiler->stopRecording(); + return $o; + } + + /** + * Adds some information (Causer, post reason, direction) to the fetched post row. + * + * @param array $row Post row + * @param array $activity Contact data of the resharer + * + * @return array items with parents and comments + */ + private function addRowInformation(array $row, array $activity) { + $this->profiler->startRecording('rendering'); + + if ($row['uid'] == 0) { + $row['writable'] = in_array($row['network'], Protocol::FEDERATED); + } + + if (!empty($activity)) { + if (($row['gravity'] == GRAVITY_PARENT)) { + $row['post-reason'] = ItemModel::PR_ANNOUNCEMENT; + $row = array_merge($row, $activity); + $contact = Contact::getById($activity['causer-id'], ['url', 'name', 'thumb']); + $row['causer-link'] = $contact['url']; + $row['causer-avatar'] = $contact['thumb']; + $row['causer-name'] = $contact['name']; + } elseif (($row['gravity'] == GRAVITY_ACTIVITY) && ($row['verb'] == Activity::ANNOUNCE) && + ($row['author-id'] == $activity['causer-id'])) { + return $row; + } + } + + switch ($row['post-reason']) { + case ItemModel::PR_TO: + $row['direction'] = ['direction' => 7, 'title' => $this->l10n->t('You had been addressed (%s).', 'to')]; + break; + case ItemModel::PR_CC: + $row['direction'] = ['direction' => 7, 'title' => $this->l10n->t('You had been addressed (%s).', 'cc')]; + break; + case ItemModel::PR_BTO: + $row['direction'] = ['direction' => 7, 'title' => $this->l10n->t('You had been addressed (%s).', 'bto')]; + break; + case ItemModel::PR_BCC: + $row['direction'] = ['direction' => 7, 'title' => $this->l10n->t('You had been addressed (%s).', 'bcc')]; + break; + case ItemModel::PR_FOLLOWER: + $row['direction'] = ['direction' => 6, 'title' => $this->l10n->t('You are following %s.', $row['author-name'])]; + break; + case ItemModel::PR_TAG: + $row['direction'] = ['direction' => 4, 'title' => $this->l10n->t('Tagged')]; + break; + case ItemModel::PR_ANNOUNCEMENT: + if (!empty($row['causer-id']) && $this->pConfig->get(local_user(), 'system', 'display_resharer')) { + $row['owner-id'] = $row['causer-id']; + $row['owner-link'] = $row['causer-link']; + $row['owner-avatar'] = $row['causer-avatar']; + $row['owner-name'] = $row['causer-name']; + } + + if (($row['gravity'] == GRAVITY_PARENT) && !empty($row['causer-id'])) { + $causer = ['uid' => 0, 'id' => $row['causer-id'], + 'network' => $row['causer-network'], 'url' => $row['causer-link']]; + $row['reshared'] = $this->l10n->t('%s reshared this.', '' . htmlentities($row['causer-name']) . ''); + } + $row['direction'] = ['direction' => 3, 'title' => (empty($row['causer-id']) ? $this->l10n->t('Reshared') : $this->l10n->t('Reshared by %s <%s>', $row['causer-name'], $row['causer-link']))]; + break; + case ItemModel::PR_COMMENT: + $row['direction'] = ['direction' => 5, 'title' => $this->l10n->t('%s is participating in this thread.', $row['author-name'])]; + break; + case ItemModel::PR_STORED: + $row['direction'] = ['direction' => 8, 'title' => $this->l10n->t('Stored')]; + break; + case ItemModel::PR_GLOBAL: + $row['direction'] = ['direction' => 9, 'title' => $this->l10n->t('Global')]; + break; + case ItemModel::PR_RELAY: + $row['direction'] = ['direction' => 10, 'title' => (empty($row['causer-id']) ? $this->l10n->t('Relayed') : $this->l10n->t('Relayed by %s <%s>', $row['causer-name'], $row['causer-link']))]; + break; + case ItemModel::PR_FETCHED: + $row['direction'] = ['direction' => 2, 'title' => (empty($row['causer-id']) ? $this->l10n->t('Fetched') : $this->l10n->t('Fetched because of %s <%s>', $row['causer-name'], $row['causer-link']))]; + break; + } + + $this->profiler->stopRecording(); + return $row; + } + + /** + * Add comments to top level entries that had been fetched before + * + * The system will fetch the comments for the local user whenever possible. + * This behaviour is currently needed to allow commenting on Friendica posts. + * + * @param array $parents Parent items + * + * @param $block_authors + * @param $order + * @param $uid + * @return array items with parents and comments + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + private function addChildren(array $parents, $block_authors, $order, $uid) { + $this->profiler->startRecording('rendering'); + if (count($parents) > 1) { + $max_comments = $this->config->get('system', 'max_comments', 100); + } else { + $max_comments = $this->config->get('system', 'max_display_comments', 1000); + } + + $params = ['order' => ['uri-id' => true, 'uid' => true]]; + + $activities = []; + $uriids = []; + $commentcounter = []; + $activitycounter = []; + + foreach ($parents AS $parent) { + if (!empty($parent['thr-parent-id']) && !empty($parent['gravity']) && ($parent['gravity'] == GRAVITY_ACTIVITY)) { + $uriid = $parent['thr-parent-id']; + if (!empty($parent['author-id'])) { + $activities[$uriid] = ['causer-id' => $parent['author-id']]; + foreach (['commented', 'received', 'created'] as $orderfields) { + if (!empty($parent[$orderfields])) { + $activities[$uriid][$orderfields] = $parent[$orderfields]; + } + } + } + } else { + $uriid = $parent['uri-id']; + } + $uriids[] = $uriid; + + $commentcounter[$uriid] = 0; + $activitycounter[$uriid] = 0; + } + + $condition = ['parent-uri-id' => $uriids]; + if ($block_authors) { + $condition['author-hidden'] = false; + } + + $condition = DBA::mergeConditions($condition, + ["`uid` IN (0, ?) AND (`vid` != ? OR `vid` IS NULL)", $uid, Verb::getID(Activity::FOLLOW)]); + + $thread_items = Post::selectForUser(local_user(), array_merge(ItemModel::DISPLAY_FIELDLIST, ['pinned', 'contact-uid', 'gravity', 'post-type', 'post-reason']), $condition, $params); + + $items = []; + + while ($row = Post::fetch($thread_items)) { + if (!empty($items[$row['uri-id']]) && ($row['uid'] == 0)) { + continue; + } + + if ($max_comments > 0) { + if (($row['gravity'] == GRAVITY_COMMENT) && (++$commentcounter[$row['parent-uri-id']] > $max_comments)) { + continue; + } + if (($row['gravity'] == GRAVITY_ACTIVITY) && (++$activitycounter[$row['parent-uri-id']] > $max_comments)) { + continue; + } + } + $items[$row['uri-id']] = $this->addRowInformation($row, $activities[$row['uri-id']] ?? []); + } + + DBA::close($thread_items); + + $items = $this->convSort($items, $order); + + $this->profiler->stopRecording(); + return $items; + } + + /** + * Checks item to see if it is one of the builtin activities (like/dislike, event attendance, consensus items, etc.) + * + * Increments the count of each matching activity and adds a link to the author as needed. + * + * @param array $activity + * @param array &$conv_responses (already created with builtin activity structure) + * @return void + * @throws ImagickException + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + public function builtinActivityPuller(array $activity, array &$conv_responses) + { + foreach ($conv_responses as $mode => $v) { + $sparkle = ''; + + switch ($mode) { + case 'like': + $verb = Activity::LIKE; + break; + case 'dislike': + $verb = Activity::DISLIKE; + break; + case 'attendyes': + $verb = Activity::ATTEND; + break; + case 'attendno': + $verb = Activity::ATTENDNO; + break; + case 'attendmaybe': + $verb = Activity::ATTENDMAYBE; + break; + case 'announce': + $verb = Activity::ANNOUNCE; + break; + default: + return; + } + + if (!empty($activity['verb']) && $this->activity->match($activity['verb'], $verb) && ($activity['gravity'] != GRAVITY_PARENT)) { + $author = [ + 'uid' => 0, + 'id' => $activity['author-id'], + 'network' => $activity['author-network'], + 'url' => $activity['author-link'] + ]; + $url = Contact::magicLinkByContact($author); + if (strpos($url, 'redir/') === 0) { + $sparkle = ' class="sparkle" '; + } + + $link = '' . htmlentities($activity['author-name']) . ''; + + if (empty($activity['thr-parent-id'])) { + $activity['thr-parent-id'] = $activity['parent-uri-id']; + } + + // Skip when the causer of the parent is the same than the author of the announce + if (($verb == Activity::ANNOUNCE) && Post::exists(['uri-id' => $activity['thr-parent-id'], + 'uid' => $activity['uid'], 'causer-id' => $activity['author-id'], 'gravity' => GRAVITY_PARENT])) { + continue; + } + + if (!isset($conv_responses[$mode][$activity['thr-parent-id']])) { + $conv_responses[$mode][$activity['thr-parent-id']] = [ + 'links' => [], + 'self' => 0, + ]; + } elseif (in_array($link, $conv_responses[$mode][$activity['thr-parent-id']]['links'])) { + // only list each unique author once + continue; + } + + if (public_contact() == $activity['author-id']) { + $conv_responses[$mode][$activity['thr-parent-id']]['self'] = 1; + } + + $conv_responses[$mode][$activity['thr-parent-id']]['links'][] = $link; + + // there can only be one activity verb per item so if we found anything, we can stop looking + return; + } + } + } + + /** + * Format the activity text for an item/photo/video + * + * @param array $links = array of pre-linked names of actors + * @param string $verb = one of 'like, 'dislike', 'attendyes', 'attendno', 'attendmaybe' + * @param int $id = item id + * @return string formatted text + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + public function formatActivity(array $links, $verb, $id) { + $this->profiler->startRecording('rendering'); + $o = ''; + $expanded = ''; + $phrase = ''; + + $total = count($links); + if ($total == 1) { + $likers = $links[0]; + + // Phrase if there is only one liker. In other cases it will be uses for the expanded + // list which show all likers + switch ($verb) { + case 'like' : + $phrase = $this->l10n->t('%s likes this.', $likers); + break; + case 'dislike' : + $phrase = $this->l10n->t('%s doesn\'t like this.', $likers); + break; + case 'attendyes' : + $phrase = $this->l10n->t('%s attends.', $likers); + break; + case 'attendno' : + $phrase = $this->l10n->t('%s doesn\'t attend.', $likers); + break; + case 'attendmaybe' : + $phrase = $this->l10n->t('%s attends maybe.', $likers); + break; + case 'announce' : + $phrase = $this->l10n->t('%s reshared this.', $likers); + break; + } + } elseif ($total > 1) { + if ($total < MAX_LIKERS) { + $likers = implode(', ', array_slice($links, 0, -1)); + $likers .= ' ' . $this->l10n->t('and') . ' ' . $links[count($links)-1]; + } else { + $likers = implode(', ', array_slice($links, 0, MAX_LIKERS - 1)); + $likers .= ' ' . $this->l10n->t('and %d other people', $total - MAX_LIKERS); + } + + $spanatts = "class=\"fakelink\" onclick=\"openClose('{$verb}list-$id');\""; + + $explikers = ''; + switch ($verb) { + case 'like': + $phrase = $this->l10n->t('%2$d people like this', $spanatts, $total); + $explikers = $this->l10n->t('%s like this.', $likers); + break; + case 'dislike': + $phrase = $this->l10n->t('%2$d people don\'t like this', $spanatts, $total); + $explikers = $this->l10n->t('%s don\'t like this.', $likers); + break; + case 'attendyes': + $phrase = $this->l10n->t('%2$d people attend', $spanatts, $total); + $explikers = $this->l10n->t('%s attend.', $likers); + break; + case 'attendno': + $phrase = $this->l10n->t('%2$d people don\'t attend', $spanatts, $total); + $explikers = $this->l10n->t('%s don\'t attend.', $likers); + break; + case 'attendmaybe': + $phrase = $this->l10n->t('%2$d people attend maybe', $spanatts, $total); + $explikers = $this->l10n->t('%s attend maybe.', $likers); + break; + case 'announce': + $phrase = $this->l10n->t('%2$d people reshared this', $spanatts, $total); + $explikers = $this->l10n->t('%s reshared this.', $likers); + break; + } + + $expanded .= "\t" . ''; + } + + $o .= Renderer::replaceMacros(Renderer::getMarkupTemplate('voting_fakelink.tpl'), [ + '$phrase' => $phrase, + '$type' => $verb, + '$id' => $id + ]); + $o .= $expanded; + + $this->profiler->stopRecording(); + return $o; + } + + public function statusEditor(array $x = [], $notes_cid = 0, $popup = false) + { + $user = User::getById($this->app->getLoggedInUserId(), ['uid', 'nickname', 'allow_location', 'default-location']); + if (empty($user['uid'])) { + return ''; + } + + $this->profiler->startRecording('rendering'); + $o = ''; + + $x['allow_location'] = $x['allow_location'] ?? $user['allow_location']; + $x['default_location'] = $x['default_location'] ?? $user['default-location']; + $x['nickname'] = $x['nickname'] ?? $user['nickname']; + $x['lockstate'] = $x['lockstate'] ?? ACL::getLockstateForUserId($user['uid']) ? 'lock' : 'unlock'; + $x['acl'] = $x['acl'] ?? ACL::getFullSelectorHTML($this->page, $user['uid'], true); + $x['bang'] = $x['bang'] ?? ''; + $x['visitor'] = $x['visitor'] ?? 'block'; + $x['is_owner'] = $x['is_owner'] ?? true; + $x['profile_uid'] = $x['profile_uid'] ?? local_user(); + + + $geotag = !empty($x['allow_location']) ? Renderer::replaceMacros(Renderer::getMarkupTemplate('jot_geotag.tpl'), []) : ''; + + $tpl = Renderer::getMarkupTemplate('jot-header.tpl'); + $this->page['htmlhead'] .= Renderer::replaceMacros($tpl, [ + '$newpost' => 'true', + '$baseurl' => $this->baseURL->get(true), + '$geotag' => $geotag, + '$nickname' => $x['nickname'], + '$ispublic' => $this->l10n->t('Visible to everybody'), + '$linkurl' => $this->l10n->t('Please enter a image/video/audio/webpage URL:'), + '$term' => $this->l10n->t('Tag term:'), + '$fileas' => $this->l10n->t('Save to Folder:'), + '$whereareu' => $this->l10n->t('Where are you right now?'), + '$delitems' => $this->l10n->t("Delete item\x28s\x29?"), + '$is_mobile' => $this->mode->isMobile(), + ]); + + $jotplugins = ''; + Hook::callAll('jot_tool', $jotplugins); + + $tpl = Renderer::getMarkupTemplate("jot.tpl"); + + $o .= Renderer::replaceMacros($tpl, [ + '$new_post' => $this->l10n->t('New Post'), + '$return_path' => $this->args->getQueryString(), + '$action' => 'item', + '$share' => ($x['button'] ?? '') ?: $this->l10n->t('Share'), + '$loading' => $this->l10n->t('Loading...'), + '$upload' => $this->l10n->t('Upload photo'), + '$shortupload' => $this->l10n->t('upload photo'), + '$attach' => $this->l10n->t('Attach file'), + '$shortattach' => $this->l10n->t('attach file'), + '$edbold' => $this->l10n->t('Bold'), + '$editalic' => $this->l10n->t('Italic'), + '$eduline' => $this->l10n->t('Underline'), + '$edquote' => $this->l10n->t('Quote'), + '$edcode' => $this->l10n->t('Code'), + '$edimg' => $this->l10n->t('Image'), + '$edurl' => $this->l10n->t('Link'), + '$edattach' => $this->l10n->t('Link or Media'), + '$edvideo' => $this->l10n->t('Video'), + '$setloc' => $this->l10n->t('Set your location'), + '$shortsetloc' => $this->l10n->t('set location'), + '$noloc' => $this->l10n->t('Clear browser location'), + '$shortnoloc' => $this->l10n->t('clear location'), + '$title' => $x['title'] ?? '', + '$placeholdertitle' => $this->l10n->t('Set title'), + '$category' => $x['category'] ?? '', + '$placeholdercategory' => Feature::isEnabled(local_user(), 'categories') ? $this->l10n->t("Categories \x28comma-separated list\x29") : '', + '$scheduled_at' => Temporal::getDateTimeField( + new \DateTime(), + new \DateTime('now + 6 months'), + null, + $this->l10n->t('Scheduled at'), + 'scheduled_at' + ), + '$wait' => $this->l10n->t('Please wait'), + '$permset' => $this->l10n->t('Permission settings'), + '$shortpermset' => $this->l10n->t('Permissions'), + '$wall' => $notes_cid ? 0 : 1, + '$posttype' => $notes_cid ? ItemModel::PT_PERSONAL_NOTE : ItemModel::PT_ARTICLE, + '$content' => $x['content'] ?? '', + '$post_id' => $x['post_id'] ?? '', + '$baseurl' => $this->baseURL->get(true), + '$defloc' => $x['default_location'], + '$visitor' => $x['visitor'], + '$pvisit' => $notes_cid ? 'none' : $x['visitor'], + '$public' => $this->l10n->t('Public post'), + '$lockstate' => $x['lockstate'], + '$bang' => $x['bang'], + '$profile_uid' => $x['profile_uid'], + '$preview' => $this->l10n->t('Preview'), + '$jotplugins' => $jotplugins, + '$notes_cid' => $notes_cid, + '$cancel' => $this->l10n->t('Cancel'), + '$rand_num' => Crypto::randomDigits(12), + + // ACL permissions box + '$acl' => $x['acl'], + + //jot nav tab (used in some themes) + '$message' => $this->l10n->t('Message'), + '$browser' => $this->l10n->t('Browser'), + + '$compose_link_title' => $this->l10n->t('Open Compose page'), + ]); + + + if ($popup == true) { + $o = ''; + } + + $this->profiler->stopRecording(); + return $o; + } + + /** + * Plucks the children of the given parent from a given item list. + * + * @param array $item_list + * @param array $parent + * @param bool $recursive + * @return array + */ + private function getItemChildren(array &$item_list, array $parent, $recursive = true) + { + $this->profiler->startRecording('rendering'); + $children = []; + foreach ($item_list as $i => $item) { + if ($item['gravity'] != GRAVITY_PARENT) { + if ($recursive) { + // Fallback to parent-uri if thr-parent is not set + $thr_parent = $item['thr-parent-id']; + if ($thr_parent == '') { + $thr_parent = $item['parent-uri-id']; + } + + if ($thr_parent == $parent['uri-id']) { + $item['children'] = $this->getItemChildren($item_list, $item); + $children[] = $item; + unset($item_list[$i]); + } + } elseif ($item['parent-uri-id'] == $parent['uri-id']) { + $children[] = $item; + unset($item_list[$i]); + } + } + } + $this->profiler->stopRecording(); + return $children; + } + + /** + * Recursively sorts a tree-like item array + * + * @param array $items + * @return array + */ + private function sortItemChildren(array $items) + { + $this->profiler->startRecording('rendering'); + $result = $items; + usort($result, [$this, 'sortThrReceivedRev']); + foreach ($result as $k => $i) { + if (isset($result[$k]['children'])) { + $result[$k]['children'] = $this->sortItemChildren($result[$k]['children']); + } + } + $this->profiler->stopRecording(); + return $result; + } + + /** + * Recursively add all children items at the top level of a list + * + * @param array $children List of items to append + * @param array $item_list + */ + private function addChildrenToList(array $children, array &$item_list) + { + foreach ($children as $child) { + $item_list[] = $child; + if (isset($child['children'])) { + $this->addChildrenToList($child['children'], $item_list); + } + } + } + + /** + * Selectively flattens a tree-like item structure to prevent threading stairs + * + * This recursive function takes the item tree structure created by conv_sort() and + * flatten the extraneous depth levels when people reply sequentially, removing the + * stairs effect in threaded conversations limiting the available content width. + * + * The basic principle is the following: if a post item has only one reply and is + * the last reply of its parent, then the reply is moved to the parent. + * + * This process is rendered somewhat more complicated because items can be either + * replies or likes, and these don't factor at all in the reply count/last reply. + * + * @param array $parent A tree-like array of items + * @return array + */ + private function smartFlattenConversation(array $parent) + { + $this->profiler->startRecording('rendering'); + if (!isset($parent['children']) || count($parent['children']) == 0) { + $this->profiler->stopRecording(); + return $parent; + } + + // We use a for loop to ensure we process the newly-moved items + for ($i = 0; $i < count($parent['children']); $i++) { + $child = $parent['children'][$i]; + + if (isset($child['children']) && count($child['children'])) { + // This helps counting only the regular posts + $count_post_closure = function($var) { + $this->profiler->stopRecording(); + return $var['verb'] === Activity::POST; + }; + + $child_post_count = count(array_filter($child['children'], $count_post_closure)); + + $remaining_post_count = count(array_filter(array_slice($parent['children'], $i), $count_post_closure)); + + // If there's only one child's children post and this is the last child post + if ($child_post_count == 1 && $remaining_post_count == 1) { + + // Searches the post item in the children + $j = 0; + while($child['children'][$j]['verb'] !== Activity::POST && $j < count($child['children'])) { + $j ++; + } + + $moved_item = $child['children'][$j]; + unset($parent['children'][$i]['children'][$j]); + $parent['children'][] = $moved_item; + } else { + $parent['children'][$i] = $this->smartFlattenConversation($child); + } + } + } + + $this->profiler->stopRecording(); + return $parent; + } + + /** + * Expands a flat list of items into corresponding tree-like conversation structures. + * + * sort the top-level posts either on "received" or "commented", and finally + * append all the items at the top level (???) + * + * @param array $item_list A list of items belonging to one or more conversations + * @param string $order Either on "received" or "commented" + * @return array + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + private function convSort(array $item_list, $order) + { + $this->profiler->startRecording('rendering'); + $parents = []; + + if (!(is_array($item_list) && count($item_list))) { + $this->profiler->stopRecording(); + return $parents; + } + + $blocklist = $this->getBlocklist(); + + $item_array = []; + + // Dedupes the item list on the uri to prevent infinite loops + foreach ($item_list as $item) { + if (in_array($item['author-id'], $blocklist)) { + continue; + } + + $item_array[$item['uri-id']] = $item; + } + + // Extract the top level items + foreach ($item_array as $item) { + if ($item['gravity'] == GRAVITY_PARENT) { + $parents[] = $item; + } + } + + if (stristr($order, 'pinned_received')) { + usort($parents, [$this, 'sortThrPinnedReceived']); + } elseif (stristr($order, 'received')) { + usort($parents, [$this, 'sortThrReceived']); + } elseif (stristr($order, 'commented')) { + usort($parents, [$this, 'sortThrCommented']); + } + + /* + * Plucks children from the item_array, second pass collects eventual orphan + * items and add them as children of their top-level post. + */ + foreach ($parents as $i => $parent) { + $parents[$i]['children'] = + array_merge($this->getItemChildren($item_array, $parent, true), + $this->getItemChildren($item_array, $parent, false)); + } + + foreach ($parents as $i => $parent) { + $parents[$i]['children'] = $this->sortItemChildren($parents[$i]['children']); + } + + if (!$this->pConfig->get(local_user(), 'system', 'no_smart_threading', 0)) { + foreach ($parents as $i => $parent) { + $parents[$i] = $this->smartFlattenConversation($parent); + } + } + + /// @TODO: Stop recusrsively adding all children back to the top level (!!!) + /// However, this apparently ensures responses (likes, attendance) display (?!) + foreach ($parents as $parent) { + if (count($parent['children'])) { + $this->addChildrenToList($parent['children'], $parents); + } + } + + $this->profiler->stopRecording(); + return $parents; + } + + /** + * usort() callback to sort item arrays by pinned and the received key + * + * @param array $a + * @param array $b + * @return int + */ + private function sortThrPinnedReceived(array $a, array $b) + { + if ($b['pinned'] && !$a['pinned']) { + return 1; + } elseif (!$b['pinned'] && $a['pinned']) { + return -1; + } + + return strcmp($b['received'], $a['received']); + } + + /** + * usort() callback to sort item arrays by the received key + * + * @param array $a + * @param array $b + * @return int + */ + private function sortThrReceived(array $a, array $b) + { + return strcmp($b['received'], $a['received']); + } + + /** + * usort() callback to reverse sort item arrays by the received key + * + * @param array $a + * @param array $b + * @return int + */ + private function sortThrReceivedRev(array $a, array $b) + { + return strcmp($a['received'], $b['received']); + } + + /** + * usort() callback to sort item arrays by the commented key + * + * @param array $a + * @param array $b + * @return int + */ + private function sortThrCommented(array $a, array $b) + { + return strcmp($b['commented'], $a['commented']); + } +} diff --git a/src/Content/Item.php b/src/Content/Item.php index e3a61bfec..a59f1294e 100644 --- a/src/Content/Item.php +++ b/src/Content/Item.php @@ -21,16 +21,39 @@ namespace Friendica\Content; +use Friendica\Core\Hook; +use Friendica\Core\L10n; +use Friendica\Core\Protocol; +use Friendica\Core\Session; use Friendica\Database\DBA; use Friendica\Model\Contact; +use Friendica\Model\Item as ModelItem; use Friendica\Model\Tag; use Friendica\Model\Post; +use Friendica\Protocol\Activity; +use Friendica\Util\Profiler; +use Friendica\Util\Strings; +use Friendica\Util\XML; /** * A content helper class for displaying items */ class Item { + /** @var Activity */ + private $activity; + /** @var L10n */ + private $l10n; + /** @var Profiler */ + private $profiler; + + public function __construct(Profiler $profiler, Activity $activity, L10n $l10n) + { + $this->profiler = $profiler; + $this->activity = $activity; + $this->l10n = $l10n; + } + /** * Return array with details for categories and folders for an item * @@ -221,4 +244,261 @@ class Item return ['replaced' => $replaced, 'contact' => $contact]; } + + /** + * Render actions localized + * + * @param $item + * @throws ImagickException + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + public function localize(&$item) + { + $this->profiler->startRecording('rendering'); + /// @todo The following functionality needs to be cleaned up. + if (!empty($item['verb'])) { + $xmlhead = "<" . "?xml version='1.0' encoding='UTF-8' ?" . ">"; + + if (stristr($item['verb'], Activity::POKE)) { + $verb = urldecode(substr($item['verb'], strpos($item['verb'],'#') + 1)); + if (!$verb) { + $this->profiler->stopRecording(); + return; + } + if ($item['object-type'] == "" || $item['object-type'] !== Activity\ObjectType::PERSON) { + $this->profiler->stopRecording(); + return; + } + + $obj = XML::parseString($xmlhead . $item['object']); + + $Bname = $obj->title; + $Blink = $obj->id; + $Bphoto = ""; + + foreach ($obj->link as $l) { + $atts = $l->attributes(); + switch ($atts['rel']) { + case "alternate": $Blink = $atts['href']; + case "photo": $Bphoto = $atts['href']; + } + } + + $author = ['uid' => 0, 'id' => $item['author-id'], + 'network' => $item['author-network'], 'url' => $item['author-link']]; + $A = '[url=' . Contact::magicLinkByContact($author) . ']' . $item['author-name'] . '[/url]'; + + if (!empty($Blink)) { + $B = '[url=' . Contact::magicLink($Blink) . ']' . $Bname . '[/url]'; + } else { + $B = ''; + } + + if ($Bphoto != "" && !empty($Blink)) { + $Bphoto = '[url=' . Contact::magicLink($Blink) . '][img=80x80]' . $Bphoto . '[/img][/url]'; + } + + /* + * we can't have a translation string with three positions but no distinguishable text + * So here is the translate string. + */ + $txt = $this->l10n->t('%1$s poked %2$s'); + + // now translate the verb + $poked_t = trim(sprintf($txt, '', '')); + $txt = str_replace($poked_t, $this->l10n->t($verb), $txt); + + // then do the sprintf on the translation string + + $item['body'] = sprintf($txt, $A, $B) . "\n\n\n" . $Bphoto; + + } + + if ($this->activity->match($item['verb'], Activity::TAG)) { + $fields = ['author-id', 'author-link', 'author-name', 'author-network', + 'verb', 'object-type', 'resource-id', 'body', 'plink']; + $obj = Post::selectFirst($fields, ['uri' => $item['parent-uri']]); + if (!DBA::isResult($obj)) { + $this->profiler->stopRecording(); + return; + } + + $author_arr = ['uid' => 0, 'id' => $item['author-id'], + 'network' => $item['author-network'], 'url' => $item['author-link']]; + $author = '[url=' . Contact::magicLinkByContact($author_arr) . ']' . $item['author-name'] . '[/url]'; + + $author_arr = ['uid' => 0, 'id' => $obj['author-id'], + 'network' => $obj['author-network'], 'url' => $obj['author-link']]; + $objauthor = '[url=' . Contact::magicLinkByContact($author_arr) . ']' . $obj['author-name'] . '[/url]'; + + switch ($obj['verb']) { + case Activity::POST: + switch ($obj['object-type']) { + case Activity\ObjectType::EVENT: + $post_type = $this->l10n->t('event'); + break; + default: + $post_type = $this->l10n->t('status'); + } + break; + default: + if ($obj['resource-id']) { + $post_type = $this->l10n->t('photo'); + $m=[]; preg_match("/\[url=([^]]*)\]/", $obj['body'], $m); + $rr['plink'] = $m[1]; + } else { + $post_type = $this->l10n->t('status'); + } + // Let's break everthing ... ;-) + break; + } + $plink = '[url=' . $obj['plink'] . ']' . $post_type . '[/url]'; + + $parsedobj = XML::parseString($xmlhead . $item['object']); + + $tag = sprintf('#[url=%s]%s[/url]', $parsedobj->id, $parsedobj->content); + $item['body'] = $this->l10n->t('%1$s tagged %2$s\'s %3$s with %4$s', $author, $objauthor, $plink, $tag); + } + } + + $matches = null; + if (preg_match_all('/@\[url=(.*?)\]/is', $item['body'], $matches, PREG_SET_ORDER)) { + foreach ($matches as $mtch) { + if (!strpos($mtch[1], 'zrl=')) { + $item['body'] = str_replace($mtch[0], '@[url=' . Contact::magicLink($mtch[1]) . ']', $item['body']); + } + } + } + + // add sparkle links to appropriate permalinks + // Only create a redirection to a magic link when logged in + if (!empty($item['plink']) && Session::isAuthenticated()) { + $author = ['uid' => 0, 'id' => $item['author-id'], + 'network' => $item['author-network'], 'url' => $item['author-link']]; + $item['plink'] = Contact::magicLinkByContact($author, $item['plink']); + } + $this->profiler->stopRecording(); + } + + public function photoMenu($item, string $formSecurityToken) + { + $this->profiler->startRecording('rendering'); + $sub_link = ''; + $poke_link = ''; + $contact_url = ''; + $pm_url = ''; + $status_link = ''; + $photos_link = ''; + $posts_link = ''; + $block_link = ''; + $ignore_link = ''; + + if (local_user() && local_user() == $item['uid'] && $item['gravity'] == GRAVITY_PARENT && !$item['self'] && !$item['mention']) { + $sub_link = 'javascript:doFollowThread(' . $item['id'] . '); return false;'; + } + + $author = ['uid' => 0, 'id' => $item['author-id'], + 'network' => $item['author-network'], 'url' => $item['author-link']]; + $profile_link = Contact::magicLinkByContact($author, $item['author-link']); + $sparkle = (strpos($profile_link, 'redir/') === 0); + + $cid = 0; + $pcid = $item['author-id']; + $network = ''; + $rel = 0; + $condition = ['uid' => local_user(), 'nurl' => Strings::normaliseLink($item['author-link'])]; + $contact = DBA::selectFirst('contact', ['id', 'network', 'rel'], $condition); + if (DBA::isResult($contact)) { + $cid = $contact['id']; + $network = $contact['network']; + $rel = $contact['rel']; + } + + if ($sparkle) { + $status_link = $profile_link . '/status'; + $photos_link = str_replace('/profile/', '/photos/', $profile_link); + $profile_link = $profile_link . '/profile'; + } + + if (!empty($pcid)) { + $contact_url = 'contact/' . $pcid; + $posts_link = $contact_url . '/posts'; + $block_link = $item['self'] ? '' : $contact_url . '/block?t=' . $formSecurityToken; + $ignore_link = $item['self'] ? '' : $contact_url . '/ignore?t=' . $formSecurityToken; + } + + if ($cid && !$item['self']) { + $contact_url = 'contact/' . $cid; + $poke_link = $contact_url . '/poke'; + $posts_link = $contact_url . '/posts'; + + if (in_array($network, [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA])) { + $pm_url = 'message/new/' . $cid; + } + } + + if (local_user()) { + $menu = [ + $this->l10n->t('Follow Thread') => $sub_link, + $this->l10n->t('View Status') => $status_link, + $this->l10n->t('View Profile') => $profile_link, + $this->l10n->t('View Photos') => $photos_link, + $this->l10n->t('Network Posts') => $posts_link, + $this->l10n->t('View Contact') => $contact_url, + $this->l10n->t('Send PM') => $pm_url, + $this->l10n->t('Block') => $block_link, + $this->l10n->t('Ignore') => $ignore_link + ]; + + if (!empty($item['language'])) { + $menu[$this->l10n->t('Languages')] = 'javascript:alert(\'' . ModelItem::getLanguageMessage($item) . '\');'; + } + + if ($network == Protocol::DFRN) { + $menu[$this->l10n->t("Poke")] = $poke_link; + } + + if ((($cid == 0) || ($rel == Contact::FOLLOWER)) && + in_array($item['network'], Protocol::FEDERATED)) { + $menu[$this->l10n->t('Connect/Follow')] = 'follow?url=' . urlencode($item['author-link']) . '&auto=1'; + } + } else { + $menu = [$this->l10n->t('View Profile') => $item['author-link']]; + } + + $args = ['item' => $item, 'menu' => $menu]; + + Hook::callAll('item_photo_menu', $args); + + $menu = $args['menu']; + + $o = ''; + foreach ($menu as $k => $v) { + if (strpos($v, 'javascript:') === 0) { + $v = substr($v, 11); + $o .= '
  • ' . $k . '
  • ' . PHP_EOL; + } elseif ($v) { + $o .= '
  • ' . $k . '
  • ' . PHP_EOL; + } + } + $this->profiler->stopRecording(); + return $o; + } + + public function visibleActivity($item) { + + if (empty($item['verb']) || $this->activity->isHidden($item['verb'])) { + return false; + } + + // @TODO below if() block can be rewritten to a single line: $isVisible = allConditionsHere; + if ($this->activity->match($item['verb'], Activity::FOLLOW) && + $item['object-type'] === Activity\ObjectType::NOTE && + empty($item['self']) && + $item['uid'] == local_user()) { + return false; + } + + return true; + } } diff --git a/src/DI.php b/src/DI.php index 4645ea252..ed67efe00 100644 --- a/src/DI.php +++ b/src/DI.php @@ -134,6 +134,14 @@ abstract class DI return self::$dice->create(Content\Item::class); } + /** + * @return Content\Conversation + */ + public static function conversation() + { + return self::$dice->create(Content\Conversation::class); + } + /** * @return Content\Text\BBCode\Video */ diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 54fae63b6..5fee65546 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -1414,11 +1414,11 @@ class Contact if ($thread_mode) { $items = Post::toArray(Post::selectForUser(local_user(), ['uri-id', 'gravity', 'parent-uri-id', 'thr-parent-id', 'author-id'], $condition, $params)); - $o .= conversation($a, $items, 'contacts', $update, false, 'commented', local_user()); + $o .= DI::conversation()->create($items, 'contacts', $update, false, 'commented', local_user()); } else { $items = Post::toArray(Post::selectForUser(local_user(), Item::DISPLAY_FIELDLIST, $condition, $params)); - $o .= conversation($a, $items, 'contact-posts', $update); + $o .= DI::conversation()->create($items, 'contact-posts', $update); } if (!$update) { diff --git a/src/Module/Bookmarklet.php b/src/Module/Bookmarklet.php index d581b81e8..3551cfd17 100644 --- a/src/Module/Bookmarklet.php +++ b/src/Module/Bookmarklet.php @@ -38,7 +38,6 @@ class Bookmarklet extends BaseModule { $_GET['mode'] = 'minimal'; - $app = DI::app(); $config = DI::config(); if (!local_user()) { @@ -61,7 +60,7 @@ class Bookmarklet extends BaseModule 'title' => trim($_REQUEST['title'] ?? '', '*'), 'content' => $content ]; - $output = status_editor($app, $x, 0, false); + $output = DI::conversation()->statusEditor($x, 0, false); $output .= ""; } else { $output = '

    ' . DI::l10n()->t('The post was created') . '

    '; diff --git a/src/Module/Contact.php b/src/Module/Contact.php index 281e69008..ca895c5f4 100644 --- a/src/Module/Contact.php +++ b/src/Module/Contact.php @@ -951,7 +951,7 @@ class Contact extends BaseModule if (!$update) { // We need the editor here to be able to reshare an item. if (local_user()) { - $o = status_editor($a, [], 0, true); + $o = DI::conversation()->statusEditor([], 0, true); } } diff --git a/src/Module/Conversation/Community.php b/src/Module/Conversation/Community.php index d80c4aae2..f0ba058e5 100644 --- a/src/Module/Conversation/Community.php +++ b/src/Module/Conversation/Community.php @@ -127,7 +127,7 @@ class Community extends BaseModule // We need the editor here to be able to reshare an item. if (Session::isAuthenticated()) { - $o .= status_editor(DI::app(), [], 0, true); + $o .= DI::conversation()->statusEditor([], 0, true); } } @@ -138,7 +138,8 @@ class Community extends BaseModule return $o; } - $o .= conversation(DI::app(), $items, 'community', false, false, 'commented', local_user()); +// $o .= conversation(DI::app(), $items, 'community', false, false, 'commented', local_user()); + $o .= DI::conversation()->create($items, 'community', false, false, 'commented', local_user()); $pager = new BoundariesPager( DI::l10n(), diff --git a/src/Module/Conversation/Network.php b/src/Module/Conversation/Network.php index d9f34e3e8..3585d52ed 100644 --- a/src/Module/Conversation/Network.php +++ b/src/Module/Conversation/Network.php @@ -145,7 +145,7 @@ class Network extends BaseModule 'content' => $content, ]; - $o .= status_editor($a, $x); + $o .= DI::conversation()->statusEditor($x); } if (self::$groupId) { @@ -178,7 +178,7 @@ class Network extends BaseModule $ordering = '`commented`'; } - $o .= conversation(DI::app(), $items, 'network', false, false, $ordering, local_user()); + $o .= DI::conversation()->create($items, 'network', false, false, $ordering, local_user()); if (DI::pConfig()->get(local_user(), 'system', 'infinite_scroll')) { $o .= HTML::scrollLoader(); diff --git a/src/Module/Profile/Status.php b/src/Module/Profile/Status.php index c6a9e272a..3c1ed8c5a 100644 --- a/src/Module/Profile/Status.php +++ b/src/Module/Profile/Status.php @@ -132,7 +132,7 @@ class Status extends BaseProfile 'profile_uid' => $profile['uid'], ]; - $o .= status_editor($a, $x); + $o .= DI::conversation()->statusEditor($x); } // Get permissions SQL - if $remote_contact is true, our remote user has been pre-verified and we already have fetched his/her groups @@ -224,7 +224,7 @@ class Status extends BaseProfile $items = array_merge($items, $pinned); } - $o .= conversation($a, $items, 'profile', false, false, 'pinned_received', $profile['uid']); + $o .= DI::conversation()->create($items, 'profile', false, false, 'pinned_received', $profile['uid']); $o .= $pager->renderMinimal(count($items)); diff --git a/src/Module/Search/Filed.php b/src/Module/Search/Filed.php index f5ec0d70f..7bfc14f6f 100644 --- a/src/Module/Search/Filed.php +++ b/src/Module/Search/Filed.php @@ -79,7 +79,7 @@ class Filed extends BaseSearch $items = Post::toArray(Post::selectForUser(local_user(), Item::DISPLAY_FIELDLIST, $item_condition, $item_params)); - $o .= conversation(DI::app(), $items, 'filed', false, false, '', local_user()); + $o .= DI::conversation()->create($items, 'filed', false, false, '', local_user()); if (DI::pConfig()->get(local_user(), 'system', 'infinite_scroll')) { $o .= HTML::scrollLoader(); diff --git a/src/Module/Search/Index.php b/src/Module/Search/Index.php index 1a7d4bf61..7be5058c2 100644 --- a/src/Module/Search/Index.php +++ b/src/Module/Search/Index.php @@ -200,7 +200,7 @@ class Index extends BaseSearch Logger::info('Start Conversation.', ['q' => $search]); - $o .= conversation(DI::app(), $items, 'search', false, false, 'commented', local_user()); + $o .= DI::conversation()->create($items, 'search', false, false, 'commented', local_user()); if (DI::pConfig()->get(local_user(), 'system', 'infinite_scroll')) { $o .= HTML::scrollLoader(); diff --git a/src/Module/Update/Community.php b/src/Module/Update/Community.php index 0915cf7d4..78d6f0bd3 100644 --- a/src/Module/Update/Community.php +++ b/src/Module/Update/Community.php @@ -39,7 +39,7 @@ class Community extends CommunityModule $o = ''; if (!empty($_GET['force']) || !DI::pConfig()->get(local_user(), 'system', 'no_auto_update')) { - $o = conversation(DI::app(), self::getItems(), 'community', true, false, 'commented', local_user()); + $o = DI::conversation()->create(self::getItems(), 'community', true, false, 'commented', local_user()); } System::htmlUpdateExit($o); diff --git a/src/Module/Update/Network.php b/src/Module/Update/Network.php index dbde3bab6..df37c82a8 100644 --- a/src/Module/Update/Network.php +++ b/src/Module/Update/Network.php @@ -53,7 +53,7 @@ class Network extends NetworkModule $ordering = '`commented`'; } - $o = conversation(DI::app(), $items, 'network', $profile_uid, false, $ordering, local_user()); + $o = DI::conversation()->create($items, 'network', $profile_uid, false, $ordering, local_user()); } System::htmlUpdateExit($o); diff --git a/src/Module/Update/Profile.php b/src/Module/Update/Profile.php index e9e8681af..cc738f501 100644 --- a/src/Module/Update/Profile.php +++ b/src/Module/Update/Profile.php @@ -115,7 +115,7 @@ class Profile extends BaseModule $items = DBA::toArray($items_stmt); - $o .= conversation($a, $items, 'profile', $a->getProfileOwner(), false, 'received', $a->getProfileOwner()); + $o .= DI::conversation()->create($items, 'profile', $a->getProfileOwner(), false, 'received', $a->getProfileOwner()); System::htmlUpdateExit($o); } diff --git a/src/Object/Post.php b/src/Object/Post.php index 5722582d2..7a8e67404 100644 --- a/src/Object/Post.php +++ b/src/Object/Post.php @@ -105,7 +105,7 @@ class Post // Only add will be displayed if ($item['network'] === Protocol::MAIL && local_user() != $item['uid']) { continue; - } elseif (!visible_activity($item)) { + } elseif (!DI::contentItem()->visibleActivity($item)) { continue; } @@ -279,7 +279,7 @@ class Post foreach ($response_verbs as $value => $verb) { $responses[$verb] = [ 'self' => $conv_responses[$verb][$item['uri-id']]['self'] ?? 0, - 'output' => !empty($conv_responses[$verb][$item['uri-id']]) ? format_activity($conv_responses[$verb][$item['uri-id']]['links'], $verb, $item['uri-id']) : '', + 'output' => !empty($conv_responses[$verb][$item['uri-id']]) ? DI::conversation()->formatActivity($conv_responses[$verb][$item['uri-id']]['links'], $verb, $item['uri-id']) : '', ]; } @@ -363,7 +363,7 @@ class Post $shiny = 'shiny'; } - localize_item($item); + DI::contentItem()->localize($item); $body_html = Item::prepareBody($item, true); @@ -459,7 +459,7 @@ class Post 'vwall' => DI::l10n()->t('via Wall-To-Wall:'), 'profile_url' => $profile_link, 'name' => $profile_name, - 'item_photo_menu_html' => item_photo_menu($item, $formSecurityToken), + 'item_photo_menu_html' => DI::contentItem()->photoMenu($item, $formSecurityToken), 'thumb' => DI::baseUrl()->remove(Contact::getAvatarUrlForUrl($item['author-link'], $item['uid'], Proxy::SIZE_THUMB)), 'osparkle' => $osparkle, 'sparkle' => $sparkle, From 26fa5e8b3fd91a6cc8cebfd895d0080660aa28f5 Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 23 Sep 2021 21:29:36 +0000 Subject: [PATCH 02/54] Moved functions --- src/Content/Conversation.php | 620 +++++++++++++++++------------------ 1 file changed, 310 insertions(+), 310 deletions(-) diff --git a/src/Content/Conversation.php b/src/Content/Conversation.php index fbe88106a..1dca32164 100644 --- a/src/Content/Conversation.php +++ b/src/Content/Conversation.php @@ -98,27 +98,300 @@ class Conversation $this->app = $app; } - private function getBlocklist() + /** + * Checks item to see if it is one of the builtin activities (like/dislike, event attendance, consensus items, etc.) + * + * Increments the count of each matching activity and adds a link to the author as needed. + * + * @param array $activity + * @param array &$conv_responses (already created with builtin activity structure) + * @return void + * @throws ImagickException + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + public function builtinActivityPuller(array $activity, array &$conv_responses) { - if (!local_user()) { - return []; - } + foreach ($conv_responses as $mode => $v) { + $sparkle = ''; - $str_blocked = str_replace(["\n", "\r"], ",", $this->pConfig->get(local_user(), 'system', 'blocked')); - if (empty($str_blocked)) { - return []; - } + switch ($mode) { + case 'like': + $verb = Activity::LIKE; + break; + case 'dislike': + $verb = Activity::DISLIKE; + break; + case 'attendyes': + $verb = Activity::ATTEND; + break; + case 'attendno': + $verb = Activity::ATTENDNO; + break; + case 'attendmaybe': + $verb = Activity::ATTENDMAYBE; + break; + case 'announce': + $verb = Activity::ANNOUNCE; + break; + default: + return; + } - $blocklist = []; + if (!empty($activity['verb']) && $this->activity->match($activity['verb'], $verb) && ($activity['gravity'] != GRAVITY_PARENT)) { + $author = [ + 'uid' => 0, + 'id' => $activity['author-id'], + 'network' => $activity['author-network'], + 'url' => $activity['author-link'] + ]; + $url = Contact::magicLinkByContact($author); + if (strpos($url, 'redir/') === 0) { + $sparkle = ' class="sparkle" '; + } - foreach (explode(',', $str_blocked) as $entry) { - $cid = Contact::getIdForURL(trim($entry), 0, false); - if (!empty($cid)) { - $blocklist[] = $cid; + $link = '' . htmlentities($activity['author-name']) . ''; + + if (empty($activity['thr-parent-id'])) { + $activity['thr-parent-id'] = $activity['parent-uri-id']; + } + + // Skip when the causer of the parent is the same than the author of the announce + if (($verb == Activity::ANNOUNCE) && Post::exists(['uri-id' => $activity['thr-parent-id'], + 'uid' => $activity['uid'], 'causer-id' => $activity['author-id'], 'gravity' => GRAVITY_PARENT])) { + continue; + } + + if (!isset($conv_responses[$mode][$activity['thr-parent-id']])) { + $conv_responses[$mode][$activity['thr-parent-id']] = [ + 'links' => [], + 'self' => 0, + ]; + } elseif (in_array($link, $conv_responses[$mode][$activity['thr-parent-id']]['links'])) { + // only list each unique author once + continue; + } + + if (public_contact() == $activity['author-id']) { + $conv_responses[$mode][$activity['thr-parent-id']]['self'] = 1; + } + + $conv_responses[$mode][$activity['thr-parent-id']]['links'][] = $link; + + // there can only be one activity verb per item so if we found anything, we can stop looking + return; } } + } - return $blocklist; + /** + * Format the activity text for an item/photo/video + * + * @param array $links = array of pre-linked names of actors + * @param string $verb = one of 'like, 'dislike', 'attendyes', 'attendno', 'attendmaybe' + * @param int $id = item id + * @return string formatted text + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + public function formatActivity(array $links, $verb, $id) { + $this->profiler->startRecording('rendering'); + $o = ''; + $expanded = ''; + $phrase = ''; + + $total = count($links); + if ($total == 1) { + $likers = $links[0]; + + // Phrase if there is only one liker. In other cases it will be uses for the expanded + // list which show all likers + switch ($verb) { + case 'like' : + $phrase = $this->l10n->t('%s likes this.', $likers); + break; + case 'dislike' : + $phrase = $this->l10n->t('%s doesn\'t like this.', $likers); + break; + case 'attendyes' : + $phrase = $this->l10n->t('%s attends.', $likers); + break; + case 'attendno' : + $phrase = $this->l10n->t('%s doesn\'t attend.', $likers); + break; + case 'attendmaybe' : + $phrase = $this->l10n->t('%s attends maybe.', $likers); + break; + case 'announce' : + $phrase = $this->l10n->t('%s reshared this.', $likers); + break; + } + } elseif ($total > 1) { + if ($total < MAX_LIKERS) { + $likers = implode(', ', array_slice($links, 0, -1)); + $likers .= ' ' . $this->l10n->t('and') . ' ' . $links[count($links)-1]; + } else { + $likers = implode(', ', array_slice($links, 0, MAX_LIKERS - 1)); + $likers .= ' ' . $this->l10n->t('and %d other people', $total - MAX_LIKERS); + } + + $spanatts = "class=\"fakelink\" onclick=\"openClose('{$verb}list-$id');\""; + + $explikers = ''; + switch ($verb) { + case 'like': + $phrase = $this->l10n->t('%2$d people like this', $spanatts, $total); + $explikers = $this->l10n->t('%s like this.', $likers); + break; + case 'dislike': + $phrase = $this->l10n->t('%2$d people don\'t like this', $spanatts, $total); + $explikers = $this->l10n->t('%s don\'t like this.', $likers); + break; + case 'attendyes': + $phrase = $this->l10n->t('%2$d people attend', $spanatts, $total); + $explikers = $this->l10n->t('%s attend.', $likers); + break; + case 'attendno': + $phrase = $this->l10n->t('%2$d people don\'t attend', $spanatts, $total); + $explikers = $this->l10n->t('%s don\'t attend.', $likers); + break; + case 'attendmaybe': + $phrase = $this->l10n->t('%2$d people attend maybe', $spanatts, $total); + $explikers = $this->l10n->t('%s attend maybe.', $likers); + break; + case 'announce': + $phrase = $this->l10n->t('%2$d people reshared this', $spanatts, $total); + $explikers = $this->l10n->t('%s reshared this.', $likers); + break; + } + + $expanded .= "\t" . ''; + } + + $o .= Renderer::replaceMacros(Renderer::getMarkupTemplate('voting_fakelink.tpl'), [ + '$phrase' => $phrase, + '$type' => $verb, + '$id' => $id + ]); + $o .= $expanded; + + $this->profiler->stopRecording(); + return $o; + } + + public function statusEditor(array $x = [], $notes_cid = 0, $popup = false) + { + $user = User::getById($this->app->getLoggedInUserId(), ['uid', 'nickname', 'allow_location', 'default-location']); + if (empty($user['uid'])) { + return ''; + } + + $this->profiler->startRecording('rendering'); + $o = ''; + + $x['allow_location'] = $x['allow_location'] ?? $user['allow_location']; + $x['default_location'] = $x['default_location'] ?? $user['default-location']; + $x['nickname'] = $x['nickname'] ?? $user['nickname']; + $x['lockstate'] = $x['lockstate'] ?? ACL::getLockstateForUserId($user['uid']) ? 'lock' : 'unlock'; + $x['acl'] = $x['acl'] ?? ACL::getFullSelectorHTML($this->page, $user['uid'], true); + $x['bang'] = $x['bang'] ?? ''; + $x['visitor'] = $x['visitor'] ?? 'block'; + $x['is_owner'] = $x['is_owner'] ?? true; + $x['profile_uid'] = $x['profile_uid'] ?? local_user(); + + + $geotag = !empty($x['allow_location']) ? Renderer::replaceMacros(Renderer::getMarkupTemplate('jot_geotag.tpl'), []) : ''; + + $tpl = Renderer::getMarkupTemplate('jot-header.tpl'); + $this->page['htmlhead'] .= Renderer::replaceMacros($tpl, [ + '$newpost' => 'true', + '$baseurl' => $this->baseURL->get(true), + '$geotag' => $geotag, + '$nickname' => $x['nickname'], + '$ispublic' => $this->l10n->t('Visible to everybody'), + '$linkurl' => $this->l10n->t('Please enter a image/video/audio/webpage URL:'), + '$term' => $this->l10n->t('Tag term:'), + '$fileas' => $this->l10n->t('Save to Folder:'), + '$whereareu' => $this->l10n->t('Where are you right now?'), + '$delitems' => $this->l10n->t("Delete item\x28s\x29?"), + '$is_mobile' => $this->mode->isMobile(), + ]); + + $jotplugins = ''; + Hook::callAll('jot_tool', $jotplugins); + + $tpl = Renderer::getMarkupTemplate("jot.tpl"); + + $o .= Renderer::replaceMacros($tpl, [ + '$new_post' => $this->l10n->t('New Post'), + '$return_path' => $this->args->getQueryString(), + '$action' => 'item', + '$share' => ($x['button'] ?? '') ?: $this->l10n->t('Share'), + '$loading' => $this->l10n->t('Loading...'), + '$upload' => $this->l10n->t('Upload photo'), + '$shortupload' => $this->l10n->t('upload photo'), + '$attach' => $this->l10n->t('Attach file'), + '$shortattach' => $this->l10n->t('attach file'), + '$edbold' => $this->l10n->t('Bold'), + '$editalic' => $this->l10n->t('Italic'), + '$eduline' => $this->l10n->t('Underline'), + '$edquote' => $this->l10n->t('Quote'), + '$edcode' => $this->l10n->t('Code'), + '$edimg' => $this->l10n->t('Image'), + '$edurl' => $this->l10n->t('Link'), + '$edattach' => $this->l10n->t('Link or Media'), + '$edvideo' => $this->l10n->t('Video'), + '$setloc' => $this->l10n->t('Set your location'), + '$shortsetloc' => $this->l10n->t('set location'), + '$noloc' => $this->l10n->t('Clear browser location'), + '$shortnoloc' => $this->l10n->t('clear location'), + '$title' => $x['title'] ?? '', + '$placeholdertitle' => $this->l10n->t('Set title'), + '$category' => $x['category'] ?? '', + '$placeholdercategory' => Feature::isEnabled(local_user(), 'categories') ? $this->l10n->t("Categories \x28comma-separated list\x29") : '', + '$scheduled_at' => Temporal::getDateTimeField( + new \DateTime(), + new \DateTime('now + 6 months'), + null, + $this->l10n->t('Scheduled at'), + 'scheduled_at' + ), + '$wait' => $this->l10n->t('Please wait'), + '$permset' => $this->l10n->t('Permission settings'), + '$shortpermset' => $this->l10n->t('Permissions'), + '$wall' => $notes_cid ? 0 : 1, + '$posttype' => $notes_cid ? ItemModel::PT_PERSONAL_NOTE : ItemModel::PT_ARTICLE, + '$content' => $x['content'] ?? '', + '$post_id' => $x['post_id'] ?? '', + '$baseurl' => $this->baseURL->get(true), + '$defloc' => $x['default_location'], + '$visitor' => $x['visitor'], + '$pvisit' => $notes_cid ? 'none' : $x['visitor'], + '$public' => $this->l10n->t('Public post'), + '$lockstate' => $x['lockstate'], + '$bang' => $x['bang'], + '$profile_uid' => $x['profile_uid'], + '$preview' => $this->l10n->t('Preview'), + '$jotplugins' => $jotplugins, + '$notes_cid' => $notes_cid, + '$cancel' => $this->l10n->t('Cancel'), + '$rand_num' => Crypto::randomDigits(12), + + // ACL permissions box + '$acl' => $x['acl'], + + //jot nav tab (used in some themes) + '$message' => $this->l10n->t('Message'), + '$browser' => $this->l10n->t('Browser'), + + '$compose_link_title' => $this->l10n->t('Open Compose page'), + ]); + + + if ($popup == true) { + $o = ''; + } + + $this->profiler->stopRecording(); + return $o; } /** @@ -491,6 +764,29 @@ class Conversation return $o; } + private function getBlocklist() + { + if (!local_user()) { + return []; + } + + $str_blocked = str_replace(["\n", "\r"], ",", $this->pConfig->get(local_user(), 'system', 'blocked')); + if (empty($str_blocked)) { + return []; + } + + $blocklist = []; + + foreach (explode(',', $str_blocked) as $entry) { + $cid = Contact::getIdForURL(trim($entry), 0, false); + if (!empty($cid)) { + $blocklist[] = $cid; + } + } + + return $blocklist; + } + /** * Adds some information (Causer, post reason, direction) to the fetched post row. * @@ -660,302 +956,6 @@ class Conversation return $items; } - /** - * Checks item to see if it is one of the builtin activities (like/dislike, event attendance, consensus items, etc.) - * - * Increments the count of each matching activity and adds a link to the author as needed. - * - * @param array $activity - * @param array &$conv_responses (already created with builtin activity structure) - * @return void - * @throws ImagickException - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - */ - public function builtinActivityPuller(array $activity, array &$conv_responses) - { - foreach ($conv_responses as $mode => $v) { - $sparkle = ''; - - switch ($mode) { - case 'like': - $verb = Activity::LIKE; - break; - case 'dislike': - $verb = Activity::DISLIKE; - break; - case 'attendyes': - $verb = Activity::ATTEND; - break; - case 'attendno': - $verb = Activity::ATTENDNO; - break; - case 'attendmaybe': - $verb = Activity::ATTENDMAYBE; - break; - case 'announce': - $verb = Activity::ANNOUNCE; - break; - default: - return; - } - - if (!empty($activity['verb']) && $this->activity->match($activity['verb'], $verb) && ($activity['gravity'] != GRAVITY_PARENT)) { - $author = [ - 'uid' => 0, - 'id' => $activity['author-id'], - 'network' => $activity['author-network'], - 'url' => $activity['author-link'] - ]; - $url = Contact::magicLinkByContact($author); - if (strpos($url, 'redir/') === 0) { - $sparkle = ' class="sparkle" '; - } - - $link = '' . htmlentities($activity['author-name']) . ''; - - if (empty($activity['thr-parent-id'])) { - $activity['thr-parent-id'] = $activity['parent-uri-id']; - } - - // Skip when the causer of the parent is the same than the author of the announce - if (($verb == Activity::ANNOUNCE) && Post::exists(['uri-id' => $activity['thr-parent-id'], - 'uid' => $activity['uid'], 'causer-id' => $activity['author-id'], 'gravity' => GRAVITY_PARENT])) { - continue; - } - - if (!isset($conv_responses[$mode][$activity['thr-parent-id']])) { - $conv_responses[$mode][$activity['thr-parent-id']] = [ - 'links' => [], - 'self' => 0, - ]; - } elseif (in_array($link, $conv_responses[$mode][$activity['thr-parent-id']]['links'])) { - // only list each unique author once - continue; - } - - if (public_contact() == $activity['author-id']) { - $conv_responses[$mode][$activity['thr-parent-id']]['self'] = 1; - } - - $conv_responses[$mode][$activity['thr-parent-id']]['links'][] = $link; - - // there can only be one activity verb per item so if we found anything, we can stop looking - return; - } - } - } - - /** - * Format the activity text for an item/photo/video - * - * @param array $links = array of pre-linked names of actors - * @param string $verb = one of 'like, 'dislike', 'attendyes', 'attendno', 'attendmaybe' - * @param int $id = item id - * @return string formatted text - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - */ - public function formatActivity(array $links, $verb, $id) { - $this->profiler->startRecording('rendering'); - $o = ''; - $expanded = ''; - $phrase = ''; - - $total = count($links); - if ($total == 1) { - $likers = $links[0]; - - // Phrase if there is only one liker. In other cases it will be uses for the expanded - // list which show all likers - switch ($verb) { - case 'like' : - $phrase = $this->l10n->t('%s likes this.', $likers); - break; - case 'dislike' : - $phrase = $this->l10n->t('%s doesn\'t like this.', $likers); - break; - case 'attendyes' : - $phrase = $this->l10n->t('%s attends.', $likers); - break; - case 'attendno' : - $phrase = $this->l10n->t('%s doesn\'t attend.', $likers); - break; - case 'attendmaybe' : - $phrase = $this->l10n->t('%s attends maybe.', $likers); - break; - case 'announce' : - $phrase = $this->l10n->t('%s reshared this.', $likers); - break; - } - } elseif ($total > 1) { - if ($total < MAX_LIKERS) { - $likers = implode(', ', array_slice($links, 0, -1)); - $likers .= ' ' . $this->l10n->t('and') . ' ' . $links[count($links)-1]; - } else { - $likers = implode(', ', array_slice($links, 0, MAX_LIKERS - 1)); - $likers .= ' ' . $this->l10n->t('and %d other people', $total - MAX_LIKERS); - } - - $spanatts = "class=\"fakelink\" onclick=\"openClose('{$verb}list-$id');\""; - - $explikers = ''; - switch ($verb) { - case 'like': - $phrase = $this->l10n->t('%2$d people like this', $spanatts, $total); - $explikers = $this->l10n->t('%s like this.', $likers); - break; - case 'dislike': - $phrase = $this->l10n->t('%2$d people don\'t like this', $spanatts, $total); - $explikers = $this->l10n->t('%s don\'t like this.', $likers); - break; - case 'attendyes': - $phrase = $this->l10n->t('%2$d people attend', $spanatts, $total); - $explikers = $this->l10n->t('%s attend.', $likers); - break; - case 'attendno': - $phrase = $this->l10n->t('%2$d people don\'t attend', $spanatts, $total); - $explikers = $this->l10n->t('%s don\'t attend.', $likers); - break; - case 'attendmaybe': - $phrase = $this->l10n->t('%2$d people attend maybe', $spanatts, $total); - $explikers = $this->l10n->t('%s attend maybe.', $likers); - break; - case 'announce': - $phrase = $this->l10n->t('%2$d people reshared this', $spanatts, $total); - $explikers = $this->l10n->t('%s reshared this.', $likers); - break; - } - - $expanded .= "\t" . ''; - } - - $o .= Renderer::replaceMacros(Renderer::getMarkupTemplate('voting_fakelink.tpl'), [ - '$phrase' => $phrase, - '$type' => $verb, - '$id' => $id - ]); - $o .= $expanded; - - $this->profiler->stopRecording(); - return $o; - } - - public function statusEditor(array $x = [], $notes_cid = 0, $popup = false) - { - $user = User::getById($this->app->getLoggedInUserId(), ['uid', 'nickname', 'allow_location', 'default-location']); - if (empty($user['uid'])) { - return ''; - } - - $this->profiler->startRecording('rendering'); - $o = ''; - - $x['allow_location'] = $x['allow_location'] ?? $user['allow_location']; - $x['default_location'] = $x['default_location'] ?? $user['default-location']; - $x['nickname'] = $x['nickname'] ?? $user['nickname']; - $x['lockstate'] = $x['lockstate'] ?? ACL::getLockstateForUserId($user['uid']) ? 'lock' : 'unlock'; - $x['acl'] = $x['acl'] ?? ACL::getFullSelectorHTML($this->page, $user['uid'], true); - $x['bang'] = $x['bang'] ?? ''; - $x['visitor'] = $x['visitor'] ?? 'block'; - $x['is_owner'] = $x['is_owner'] ?? true; - $x['profile_uid'] = $x['profile_uid'] ?? local_user(); - - - $geotag = !empty($x['allow_location']) ? Renderer::replaceMacros(Renderer::getMarkupTemplate('jot_geotag.tpl'), []) : ''; - - $tpl = Renderer::getMarkupTemplate('jot-header.tpl'); - $this->page['htmlhead'] .= Renderer::replaceMacros($tpl, [ - '$newpost' => 'true', - '$baseurl' => $this->baseURL->get(true), - '$geotag' => $geotag, - '$nickname' => $x['nickname'], - '$ispublic' => $this->l10n->t('Visible to everybody'), - '$linkurl' => $this->l10n->t('Please enter a image/video/audio/webpage URL:'), - '$term' => $this->l10n->t('Tag term:'), - '$fileas' => $this->l10n->t('Save to Folder:'), - '$whereareu' => $this->l10n->t('Where are you right now?'), - '$delitems' => $this->l10n->t("Delete item\x28s\x29?"), - '$is_mobile' => $this->mode->isMobile(), - ]); - - $jotplugins = ''; - Hook::callAll('jot_tool', $jotplugins); - - $tpl = Renderer::getMarkupTemplate("jot.tpl"); - - $o .= Renderer::replaceMacros($tpl, [ - '$new_post' => $this->l10n->t('New Post'), - '$return_path' => $this->args->getQueryString(), - '$action' => 'item', - '$share' => ($x['button'] ?? '') ?: $this->l10n->t('Share'), - '$loading' => $this->l10n->t('Loading...'), - '$upload' => $this->l10n->t('Upload photo'), - '$shortupload' => $this->l10n->t('upload photo'), - '$attach' => $this->l10n->t('Attach file'), - '$shortattach' => $this->l10n->t('attach file'), - '$edbold' => $this->l10n->t('Bold'), - '$editalic' => $this->l10n->t('Italic'), - '$eduline' => $this->l10n->t('Underline'), - '$edquote' => $this->l10n->t('Quote'), - '$edcode' => $this->l10n->t('Code'), - '$edimg' => $this->l10n->t('Image'), - '$edurl' => $this->l10n->t('Link'), - '$edattach' => $this->l10n->t('Link or Media'), - '$edvideo' => $this->l10n->t('Video'), - '$setloc' => $this->l10n->t('Set your location'), - '$shortsetloc' => $this->l10n->t('set location'), - '$noloc' => $this->l10n->t('Clear browser location'), - '$shortnoloc' => $this->l10n->t('clear location'), - '$title' => $x['title'] ?? '', - '$placeholdertitle' => $this->l10n->t('Set title'), - '$category' => $x['category'] ?? '', - '$placeholdercategory' => Feature::isEnabled(local_user(), 'categories') ? $this->l10n->t("Categories \x28comma-separated list\x29") : '', - '$scheduled_at' => Temporal::getDateTimeField( - new \DateTime(), - new \DateTime('now + 6 months'), - null, - $this->l10n->t('Scheduled at'), - 'scheduled_at' - ), - '$wait' => $this->l10n->t('Please wait'), - '$permset' => $this->l10n->t('Permission settings'), - '$shortpermset' => $this->l10n->t('Permissions'), - '$wall' => $notes_cid ? 0 : 1, - '$posttype' => $notes_cid ? ItemModel::PT_PERSONAL_NOTE : ItemModel::PT_ARTICLE, - '$content' => $x['content'] ?? '', - '$post_id' => $x['post_id'] ?? '', - '$baseurl' => $this->baseURL->get(true), - '$defloc' => $x['default_location'], - '$visitor' => $x['visitor'], - '$pvisit' => $notes_cid ? 'none' : $x['visitor'], - '$public' => $this->l10n->t('Public post'), - '$lockstate' => $x['lockstate'], - '$bang' => $x['bang'], - '$profile_uid' => $x['profile_uid'], - '$preview' => $this->l10n->t('Preview'), - '$jotplugins' => $jotplugins, - '$notes_cid' => $notes_cid, - '$cancel' => $this->l10n->t('Cancel'), - '$rand_num' => Crypto::randomDigits(12), - - // ACL permissions box - '$acl' => $x['acl'], - - //jot nav tab (used in some themes) - '$message' => $this->l10n->t('Message'), - '$browser' => $this->l10n->t('Browser'), - - '$compose_link_title' => $this->l10n->t('Open Compose page'), - ]); - - - if ($popup == true) { - $o = ''; - } - - $this->profiler->stopRecording(); - return $o; - } - /** * Plucks the children of the given parent from a given item list. * From a6c85f61060f4e859527e74a3fa31bae52f95259 Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 23 Sep 2021 21:34:22 +0000 Subject: [PATCH 03/54] Updated "messages.po" --- view/lang/C/messages.po | 1610 +++++++++++++++++++-------------------- 1 file changed, 805 insertions(+), 805 deletions(-) diff --git a/view/lang/C/messages.po b/view/lang/C/messages.po index 953ead8bf..fbf305823 100644 --- a/view/lang/C/messages.po +++ b/view/lang/C/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 2021.09-rc\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-10 00:27+0000\n" +"POT-Creation-Date: 2021-09-23 21:34+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -38,8 +38,8 @@ msgid "Monthly posting limit of %d post reached. The post was rejected." msgstr "" #: include/api.php:4437 mod/photos.php:89 mod/photos.php:198 mod/photos.php:626 -#: mod/photos.php:1034 mod/photos.php:1051 mod/photos.php:1597 -#: src/Model/User.php:1118 src/Model/User.php:1126 src/Model/User.php:1134 +#: mod/photos.php:1035 mod/photos.php:1052 mod/photos.php:1599 +#: src/Model/User.php:1169 src/Model/User.php:1177 src/Model/User.php:1185 #: src/Module/Settings/Profile/Photo/Crop.php:101 #: src/Module/Settings/Profile/Photo/Crop.php:117 #: src/Module/Settings/Profile/Photo/Crop.php:133 @@ -49,458 +49,6 @@ msgstr "" msgid "Profile Photos" msgstr "" -#: include/conversation.php:109 -#, php-format -msgid "%1$s poked %2$s" -msgstr "" - -#: include/conversation.php:142 src/Model/Item.php:2609 -msgid "event" -msgstr "" - -#: include/conversation.php:145 include/conversation.php:154 mod/tagger.php:90 -msgid "status" -msgstr "" - -#: include/conversation.php:150 mod/tagger.php:90 src/Model/Item.php:2611 -msgid "photo" -msgstr "" - -#: include/conversation.php:164 mod/tagger.php:123 -#, php-format -msgid "%1$s tagged %2$s's %3$s with %4$s" -msgstr "" - -#: include/conversation.php:467 mod/photos.php:1459 src/Object/Post.php:226 -msgid "Select" -msgstr "" - -#: include/conversation.php:468 mod/photos.php:1460 mod/settings.php:573 -#: src/Module/Admin/Users/Active.php:139 src/Module/Admin/Users/Blocked.php:140 -#: src/Module/Admin/Users/Index.php:153 src/Module/Contact.php:849 -#: src/Module/Contact.php:1132 -msgid "Delete" -msgstr "" - -#: include/conversation.php:503 src/Object/Post.php:453 src/Object/Post.php:454 -#, php-format -msgid "View %s's profile @ %s" -msgstr "" - -#: include/conversation.php:516 src/Object/Post.php:441 -msgid "Categories:" -msgstr "" - -#: include/conversation.php:517 src/Object/Post.php:442 -msgid "Filed under:" -msgstr "" - -#: include/conversation.php:524 src/Object/Post.php:467 -#, php-format -msgid "%s from %s" -msgstr "" - -#: include/conversation.php:539 -msgid "View in context" -msgstr "" - -#: include/conversation.php:541 include/conversation.php:1146 -#: mod/editpost.php:107 mod/message.php:203 mod/message.php:368 -#: mod/photos.php:1524 mod/wallmessage.php:155 src/Module/Item/Compose.php:165 -#: src/Object/Post.php:501 -msgid "Please wait" -msgstr "" - -#: include/conversation.php:605 -msgid "remove" -msgstr "" - -#: include/conversation.php:609 -msgid "Delete Selected Items" -msgstr "" - -#: include/conversation.php:647 include/conversation.php:650 -#: include/conversation.php:653 include/conversation.php:656 -#, php-format -msgid "You had been addressed (%s)." -msgstr "" - -#: include/conversation.php:659 -#, php-format -msgid "You are following %s." -msgstr "" - -#: include/conversation.php:662 -msgid "Tagged" -msgstr "" - -#: include/conversation.php:675 include/conversation.php:1013 -#: include/conversation.php:1051 -#, php-format -msgid "%s reshared this." -msgstr "" - -#: include/conversation.php:677 -msgid "Reshared" -msgstr "" - -#: include/conversation.php:677 -#, php-format -msgid "Reshared by %s <%s>" -msgstr "" - -#: include/conversation.php:680 -#, php-format -msgid "%s is participating in this thread." -msgstr "" - -#: include/conversation.php:683 -msgid "Stored" -msgstr "" - -#: include/conversation.php:686 -msgid "Global" -msgstr "" - -#: include/conversation.php:689 -msgid "Relayed" -msgstr "" - -#: include/conversation.php:689 -#, php-format -msgid "Relayed by %s <%s>" -msgstr "" - -#: include/conversation.php:692 -msgid "Fetched" -msgstr "" - -#: include/conversation.php:692 -#, php-format -msgid "Fetched because of %s <%s>" -msgstr "" - -#: include/conversation.php:844 view/theme/frio/theme.php:323 -msgid "Follow Thread" -msgstr "" - -#: include/conversation.php:845 src/Model/Contact.php:1050 -msgid "View Status" -msgstr "" - -#: include/conversation.php:846 include/conversation.php:868 -#: src/Model/Contact.php:976 src/Model/Contact.php:1042 -#: src/Model/Contact.php:1051 src/Module/Directory.php:160 -#: src/Module/Settings/Profile/Index.php:223 -msgid "View Profile" -msgstr "" - -#: include/conversation.php:847 src/Model/Contact.php:1052 -msgid "View Photos" -msgstr "" - -#: include/conversation.php:848 src/Model/Contact.php:1043 -#: src/Model/Contact.php:1053 -msgid "Network Posts" -msgstr "" - -#: include/conversation.php:849 src/Model/Contact.php:1044 -#: src/Model/Contact.php:1054 -msgid "View Contact" -msgstr "" - -#: include/conversation.php:850 src/Model/Contact.php:1056 -msgid "Send PM" -msgstr "" - -#: include/conversation.php:851 src/Module/Admin/Blocklist/Contact.php:84 -#: src/Module/Admin/Users/Active.php:140 src/Module/Admin/Users/Index.php:154 -#: src/Module/Contact.php:587 src/Module/Contact.php:847 -#: src/Module/Contact.php:1115 -msgid "Block" -msgstr "" - -#: include/conversation.php:852 src/Module/Contact.php:588 -#: src/Module/Contact.php:848 src/Module/Contact.php:1123 -#: src/Module/Notifications/Introductions.php:113 -#: src/Module/Notifications/Introductions.php:185 -#: src/Module/Notifications/Notification.php:59 -msgid "Ignore" -msgstr "" - -#: include/conversation.php:856 src/Object/Post.php:428 -msgid "Languages" -msgstr "" - -#: include/conversation.php:860 src/Model/Contact.php:1057 -msgid "Poke" -msgstr "" - -#: include/conversation.php:865 mod/follow.php:138 src/Content/Widget.php:76 -#: src/Model/Contact.php:1045 src/Model/Contact.php:1058 -#: view/theme/vier/theme.php:172 -msgid "Connect/Follow" -msgstr "" - -#: include/conversation.php:998 -#, php-format -msgid "%s likes this." -msgstr "" - -#: include/conversation.php:1001 -#, php-format -msgid "%s doesn't like this." -msgstr "" - -#: include/conversation.php:1004 -#, php-format -msgid "%s attends." -msgstr "" - -#: include/conversation.php:1007 -#, php-format -msgid "%s doesn't attend." -msgstr "" - -#: include/conversation.php:1010 -#, php-format -msgid "%s attends maybe." -msgstr "" - -#: include/conversation.php:1019 -msgid "and" -msgstr "" - -#: include/conversation.php:1022 -#, php-format -msgid "and %d other people" -msgstr "" - -#: include/conversation.php:1030 -#, php-format -msgid "%2$d people like this" -msgstr "" - -#: include/conversation.php:1031 -#, php-format -msgid "%s like this." -msgstr "" - -#: include/conversation.php:1034 -#, php-format -msgid "%2$d people don't like this" -msgstr "" - -#: include/conversation.php:1035 -#, php-format -msgid "%s don't like this." -msgstr "" - -#: include/conversation.php:1038 -#, php-format -msgid "%2$d people attend" -msgstr "" - -#: include/conversation.php:1039 -#, php-format -msgid "%s attend." -msgstr "" - -#: include/conversation.php:1042 -#, php-format -msgid "%2$d people don't attend" -msgstr "" - -#: include/conversation.php:1043 -#, php-format -msgid "%s don't attend." -msgstr "" - -#: include/conversation.php:1046 -#, php-format -msgid "%2$d people attend maybe" -msgstr "" - -#: include/conversation.php:1047 -#, php-format -msgid "%s attend maybe." -msgstr "" - -#: include/conversation.php:1050 -#, php-format -msgid "%2$d people reshared this" -msgstr "" - -#: include/conversation.php:1098 -msgid "Visible to everybody" -msgstr "" - -#: include/conversation.php:1099 src/Module/Item/Compose.php:159 -#: src/Object/Post.php:972 -msgid "Please enter a image/video/audio/webpage URL:" -msgstr "" - -#: include/conversation.php:1100 -msgid "Tag term:" -msgstr "" - -#: include/conversation.php:1101 src/Module/Filer/SaveTag.php:68 -msgid "Save to Folder:" -msgstr "" - -#: include/conversation.php:1102 -msgid "Where are you right now?" -msgstr "" - -#: include/conversation.php:1103 -msgid "Delete item(s)?" -msgstr "" - -#: include/conversation.php:1113 -msgid "New Post" -msgstr "" - -#: include/conversation.php:1116 -msgid "Share" -msgstr "" - -#: include/conversation.php:1117 mod/editpost.php:92 mod/photos.php:1373 -#: src/Module/Contact/Poke.php:157 src/Object/Post.php:963 -msgid "Loading..." -msgstr "" - -#: include/conversation.php:1118 mod/editpost.php:93 mod/message.php:201 -#: mod/message.php:365 mod/wallmessage.php:153 -msgid "Upload photo" -msgstr "" - -#: include/conversation.php:1119 mod/editpost.php:94 -msgid "upload photo" -msgstr "" - -#: include/conversation.php:1120 mod/editpost.php:95 -msgid "Attach file" -msgstr "" - -#: include/conversation.php:1121 mod/editpost.php:96 -msgid "attach file" -msgstr "" - -#: include/conversation.php:1122 src/Module/Item/Compose.php:151 -#: src/Object/Post.php:964 -msgid "Bold" -msgstr "" - -#: include/conversation.php:1123 src/Module/Item/Compose.php:152 -#: src/Object/Post.php:965 -msgid "Italic" -msgstr "" - -#: include/conversation.php:1124 src/Module/Item/Compose.php:153 -#: src/Object/Post.php:966 -msgid "Underline" -msgstr "" - -#: include/conversation.php:1125 src/Module/Item/Compose.php:154 -#: src/Object/Post.php:967 -msgid "Quote" -msgstr "" - -#: include/conversation.php:1126 src/Module/Item/Compose.php:155 -#: src/Object/Post.php:968 -msgid "Code" -msgstr "" - -#: include/conversation.php:1127 src/Module/Item/Compose.php:156 -#: src/Object/Post.php:969 -msgid "Image" -msgstr "" - -#: include/conversation.php:1128 src/Module/Item/Compose.php:157 -#: src/Object/Post.php:970 -msgid "Link" -msgstr "" - -#: include/conversation.php:1129 src/Module/Item/Compose.php:158 -#: src/Object/Post.php:971 -msgid "Link or Media" -msgstr "" - -#: include/conversation.php:1130 -msgid "Video" -msgstr "" - -#: include/conversation.php:1131 mod/editpost.php:103 -#: src/Module/Item/Compose.php:161 -msgid "Set your location" -msgstr "" - -#: include/conversation.php:1132 mod/editpost.php:104 -msgid "set location" -msgstr "" - -#: include/conversation.php:1133 mod/editpost.php:105 -msgid "Clear browser location" -msgstr "" - -#: include/conversation.php:1134 mod/editpost.php:106 -msgid "clear location" -msgstr "" - -#: include/conversation.php:1136 mod/editpost.php:120 -#: src/Module/Item/Compose.php:166 -msgid "Set title" -msgstr "" - -#: include/conversation.php:1138 mod/editpost.php:122 -#: src/Module/Item/Compose.php:167 -msgid "Categories (comma-separated list)" -msgstr "" - -#: include/conversation.php:1143 src/Module/Item/Compose.php:172 -msgid "Scheduled at" -msgstr "" - -#: include/conversation.php:1147 mod/editpost.php:108 -msgid "Permission settings" -msgstr "" - -#: include/conversation.php:1148 mod/editpost.php:136 mod/events.php:583 -#: mod/photos.php:965 mod/photos.php:1326 -msgid "Permissions" -msgstr "" - -#: include/conversation.php:1157 mod/editpost.php:117 -msgid "Public post" -msgstr "" - -#: include/conversation.php:1161 mod/editpost.php:128 mod/events.php:578 -#: mod/photos.php:1372 mod/photos.php:1428 mod/photos.php:1502 -#: src/Module/Item/Compose.php:160 src/Object/Post.php:973 -msgid "Preview" -msgstr "" - -#: include/conversation.php:1164 mod/editpost.php:130 mod/fbrowser.php:105 -#: mod/fbrowser.php:134 mod/follow.php:144 mod/photos.php:1028 -#: mod/photos.php:1134 mod/tagrm.php:37 mod/tagrm.php:129 mod/unfollow.php:97 -#: src/Module/Contact.php:422 src/Module/RemoteFollow.php:116 -msgid "Cancel" -msgstr "" - -#: include/conversation.php:1171 mod/editpost.php:134 -#: src/Content/Widget/VCard.php:107 src/Model/Profile.php:459 -msgid "Message" -msgstr "" - -#: include/conversation.php:1172 mod/editpost.php:135 -#: src/Module/Settings/TwoFactor/Trusted.php:101 -msgid "Browser" -msgstr "" - -#: include/conversation.php:1174 mod/editpost.php:138 -msgid "Open Compose page" -msgstr "" - #: include/enotify.php:52 include/enotify.php:559 msgid "[Friendica:Notify]" msgstr "" @@ -763,16 +311,16 @@ msgstr "" #: mod/wallmessage.php:96 mod/wallmessage.php:120 src/Module/Attach.php:55 #: src/Module/BaseApi.php:79 src/Module/BaseApi.php:88 #: src/Module/BaseApi.php:97 src/Module/BaseApi.php:106 -#: src/Module/BaseNotifications.php:88 src/Module/Contact.php:346 -#: src/Module/Contact/Advanced.php:44 src/Module/Delegation.php:119 +#: src/Module/BaseNotifications.php:88 src/Module/Contact.php:356 +#: src/Module/Contact/Advanced.php:44 src/Module/Delegation.php:118 #: src/Module/FollowConfirm.php:16 src/Module/FriendSuggest.php:44 #: src/Module/Group.php:45 src/Module/Group.php:90 src/Module/Invite.php:41 #: src/Module/Invite.php:130 src/Module/Notifications/Notification.php:47 #: src/Module/Notifications/Notification.php:76 #: src/Module/Profile/Common.php:56 src/Module/Profile/Contacts.php:56 #: src/Module/Profile/Schedule.php:39 src/Module/Profile/Schedule.php:56 -#: src/Module/Register.php:62 src/Module/Register.php:75 -#: src/Module/Register.php:193 src/Module/Register.php:232 +#: src/Module/Register.php:64 src/Module/Register.php:77 +#: src/Module/Register.php:195 src/Module/Register.php:234 #: src/Module/Search/Directory.php:38 src/Module/Settings/Delegation.php:42 #: src/Module/Settings/Delegation.php:70 src/Module/Settings/Display.php:43 #: src/Module/Settings/Display.php:121 @@ -786,7 +334,7 @@ msgid "Permission denied." msgstr "" #: mod/cal.php:44 mod/cal.php:48 mod/follow.php:39 mod/redir.php:34 -#: mod/redir.php:175 src/Module/Conversation/Community.php:182 +#: mod/redir.php:175 src/Module/Conversation/Community.php:183 #: src/Module/Debug/ItemBody.php:37 src/Module/Diaspora/Receive.php:51 #: src/Module/Item/Follow.php:42 src/Module/Item/Ignore.php:41 #: src/Module/Item/Pin.php:42 src/Module/Item/Pin.php:57 @@ -799,7 +347,7 @@ msgstr "" #: src/Model/Profile.php:228 src/Module/HCard.php:52 #: src/Module/Profile/Common.php:41 src/Module/Profile/Common.php:52 #: src/Module/Profile/Contacts.php:40 src/Module/Profile/Contacts.php:50 -#: src/Module/Profile/Status.php:58 src/Module/Register.php:254 +#: src/Module/Profile/Status.php:58 src/Module/Register.php:256 #: src/Module/RemoteFollow.php:49 msgid "User not found." msgstr "" @@ -872,7 +420,7 @@ msgid "calendar" msgstr "" #: mod/display.php:165 mod/photos.php:828 mod/videos.php:115 -#: src/Module/Conversation/Community.php:176 src/Module/Debug/Probe.php:39 +#: src/Module/Conversation/Community.php:177 src/Module/Debug/Probe.php:39 #: src/Module/Debug/WebFinger.php:38 src/Module/Directory.php:49 #: src/Module/Search/Index.php:50 src/Module/Search/Index.php:55 msgid "Public access denied." @@ -899,6 +447,28 @@ msgstr "" msgid "Save" msgstr "" +#: mod/editpost.php:92 mod/photos.php:1375 src/Content/Conversation.php:328 +#: src/Module/Contact/Poke.php:157 src/Object/Post.php:964 +msgid "Loading..." +msgstr "" + +#: mod/editpost.php:93 mod/message.php:201 mod/message.php:365 +#: mod/wallmessage.php:153 src/Content/Conversation.php:329 +msgid "Upload photo" +msgstr "" + +#: mod/editpost.php:94 src/Content/Conversation.php:330 +msgid "upload photo" +msgstr "" + +#: mod/editpost.php:95 src/Content/Conversation.php:331 +msgid "Attach file" +msgstr "" + +#: mod/editpost.php:96 src/Content/Conversation.php:332 +msgid "attach file" +msgstr "" + #: mod/editpost.php:97 mod/message.php:202 mod/message.php:366 #: mod/wallmessage.php:154 msgid "Insert web link" @@ -924,14 +494,88 @@ msgstr "" msgid "audio link" msgstr "" +#: mod/editpost.php:103 src/Content/Conversation.php:342 +#: src/Module/Item/Compose.php:161 +msgid "Set your location" +msgstr "" + +#: mod/editpost.php:104 src/Content/Conversation.php:343 +msgid "set location" +msgstr "" + +#: mod/editpost.php:105 src/Content/Conversation.php:344 +msgid "Clear browser location" +msgstr "" + +#: mod/editpost.php:106 src/Content/Conversation.php:345 +msgid "clear location" +msgstr "" + +#: mod/editpost.php:107 mod/message.php:203 mod/message.php:368 +#: mod/photos.php:1526 mod/wallmessage.php:155 src/Content/Conversation.php:357 +#: src/Content/Conversation.php:692 src/Module/Item/Compose.php:165 +#: src/Object/Post.php:502 +msgid "Please wait" +msgstr "" + +#: mod/editpost.php:108 src/Content/Conversation.php:358 +msgid "Permission settings" +msgstr "" + #: mod/editpost.php:116 src/Core/ACL.php:327 msgid "CC: email addresses" msgstr "" +#: mod/editpost.php:117 src/Content/Conversation.php:368 +msgid "Public post" +msgstr "" + +#: mod/editpost.php:120 src/Content/Conversation.php:347 +#: src/Module/Item/Compose.php:166 +msgid "Set title" +msgstr "" + +#: mod/editpost.php:122 src/Content/Conversation.php:349 +#: src/Module/Item/Compose.php:167 +msgid "Categories (comma-separated list)" +msgstr "" + #: mod/editpost.php:123 src/Core/ACL.php:328 msgid "Example: bob@example.com, mary@example.com" msgstr "" +#: mod/editpost.php:128 mod/events.php:578 mod/photos.php:1374 +#: mod/photos.php:1430 mod/photos.php:1504 src/Content/Conversation.php:372 +#: src/Module/Item/Compose.php:160 src/Object/Post.php:974 +msgid "Preview" +msgstr "" + +#: mod/editpost.php:130 mod/fbrowser.php:105 mod/fbrowser.php:134 +#: mod/follow.php:144 mod/photos.php:1029 mod/photos.php:1136 mod/tagrm.php:37 +#: mod/tagrm.php:129 mod/unfollow.php:97 src/Content/Conversation.php:375 +#: src/Module/Contact.php:443 src/Module/RemoteFollow.php:116 +msgid "Cancel" +msgstr "" + +#: mod/editpost.php:134 src/Content/Conversation.php:382 +#: src/Content/Widget/VCard.php:107 src/Model/Profile.php:459 +msgid "Message" +msgstr "" + +#: mod/editpost.php:135 src/Content/Conversation.php:383 +#: src/Module/Settings/TwoFactor/Trusted.php:101 +msgid "Browser" +msgstr "" + +#: mod/editpost.php:136 mod/events.php:583 mod/photos.php:965 +#: mod/photos.php:1328 src/Content/Conversation.php:359 +msgid "Permissions" +msgstr "" + +#: mod/editpost.php:138 src/Content/Conversation.php:385 +msgid "Open Compose page" +msgstr "" + #: mod/events.php:138 mod/events.php:140 msgid "Event can not end before it has started." msgstr "" @@ -967,7 +611,7 @@ msgstr "" #: src/Module/Install.php:268 src/Module/Install.php:273 #: src/Module/Install.php:279 src/Module/Install.php:284 #: src/Module/Install.php:298 src/Module/Install.php:313 -#: src/Module/Install.php:340 src/Module/Register.php:135 +#: src/Module/Install.php:340 src/Module/Register.php:137 #: src/Module/Security/TwoFactor/Verify.php:100 #: src/Module/Settings/TwoFactor/Index.php:133 #: src/Module/Settings/TwoFactor/Verify.php:141 @@ -993,7 +637,7 @@ msgstr "" #: mod/events.php:568 src/Content/Widget/VCard.php:98 src/Model/Event.php:86 #: src/Model/Event.php:113 src/Model/Event.php:483 src/Model/Event.php:969 -#: src/Model/Profile.php:367 src/Module/Contact.php:608 +#: src/Model/Profile.php:367 src/Module/Contact.php:623 #: src/Module/Directory.php:150 src/Module/Notifications/Introductions.php:166 #: src/Module/Profile/Profile.php:194 msgid "Location:" @@ -1008,18 +652,18 @@ msgid "Share this event" msgstr "" #: mod/events.php:580 mod/message.php:204 mod/message.php:367 -#: mod/photos.php:947 mod/photos.php:1045 mod/photos.php:1330 -#: mod/photos.php:1371 mod/photos.php:1427 mod/photos.php:1501 -#: src/Module/Admin/Item/Source.php:65 src/Module/Contact.php:566 +#: mod/photos.php:947 mod/photos.php:1046 mod/photos.php:1332 +#: mod/photos.php:1373 mod/photos.php:1429 mod/photos.php:1503 +#: src/Module/Admin/Item/Source.php:65 src/Module/Contact.php:581 #: src/Module/Contact/Advanced.php:133 src/Module/Contact/Poke.php:158 #: src/Module/Debug/ActivityPubConversion.php:141 #: src/Module/Debug/Babel.php:313 src/Module/Debug/Localtime.php:64 #: src/Module/Debug/Probe.php:56 src/Module/Debug/WebFinger.php:53 -#: src/Module/Delegation.php:153 src/Module/FriendSuggest.php:129 +#: src/Module/Delegation.php:147 src/Module/FriendSuggest.php:129 #: src/Module/Install.php:245 src/Module/Install.php:287 #: src/Module/Install.php:324 src/Module/Invite.php:177 #: src/Module/Item/Compose.php:150 src/Module/Profile/Profile.php:247 -#: src/Module/Settings/Profile/Index.php:220 src/Object/Post.php:962 +#: src/Module/Settings/Profile/Index.php:220 src/Object/Post.php:963 #: view/theme/duepuntozero/config.php:69 view/theme/frio/config.php:160 #: view/theme/quattro/config.php:71 view/theme/vier/config.php:119 msgid "Submit" @@ -1029,7 +673,7 @@ msgstr "" msgid "Basic" msgstr "" -#: mod/events.php:582 src/Module/Admin/Site.php:505 src/Module/Contact.php:916 +#: mod/events.php:582 src/Module/Admin/Site.php:505 src/Module/Contact.php:932 #: src/Module/Profile/Profile.php:249 msgid "Advanced" msgstr "" @@ -1072,6 +716,12 @@ msgstr "" msgid "OStatus support is disabled. Contact can't be added." msgstr "" +#: mod/follow.php:138 src/Content/Item.php:463 src/Content/Widget.php:76 +#: src/Model/Contact.php:1045 src/Model/Contact.php:1058 +#: view/theme/vier/theme.php:172 +msgid "Connect/Follow" +msgstr "" + #: mod/follow.php:139 src/Module/RemoteFollow.php:114 msgid "Please answer the following:" msgstr "" @@ -1081,13 +731,13 @@ msgid "Your Identity Address:" msgstr "" #: mod/follow.php:141 mod/unfollow.php:100 -#: src/Module/Admin/Blocklist/Contact.php:100 src/Module/Contact.php:604 +#: src/Module/Admin/Blocklist/Contact.php:100 src/Module/Contact.php:619 #: src/Module/Notifications/Introductions.php:108 #: src/Module/Notifications/Introductions.php:177 msgid "Profile URL" msgstr "" -#: mod/follow.php:142 src/Module/Contact.php:616 +#: mod/follow.php:142 src/Module/Contact.php:631 #: src/Module/Notifications/Introductions.php:170 #: src/Module/Profile/Profile.php:207 msgid "Tags:" @@ -1103,7 +753,7 @@ msgid "Add a personal note:" msgstr "" #: mod/follow.php:163 mod/unfollow.php:109 src/Module/BaseProfile.php:59 -#: src/Module/Contact.php:894 +#: src/Module/Contact.php:910 msgid "Status Messages and Posts" msgstr "" @@ -1462,11 +1112,11 @@ msgstr "" msgid "Photo Albums" msgstr "" -#: mod/photos.php:112 mod/photos.php:1626 +#: mod/photos.php:112 mod/photos.php:1628 msgid "Recent Photos" msgstr "" -#: mod/photos.php:114 mod/photos.php:1096 mod/photos.php:1628 +#: mod/photos.php:114 mod/photos.php:1097 mod/photos.php:1630 msgid "Upload New Photos" msgstr "" @@ -1549,7 +1199,7 @@ msgstr "" msgid "Upload Photos" msgstr "" -#: mod/photos.php:961 mod/photos.php:1041 +#: mod/photos.php:961 mod/photos.php:1042 msgid "New album name: " msgstr "" @@ -1565,138 +1215,149 @@ msgstr "" msgid "Do you really want to delete this photo album and all its photos?" msgstr "" -#: mod/photos.php:1025 mod/photos.php:1046 +#: mod/photos.php:1025 mod/photos.php:1047 msgid "Delete Album" msgstr "" -#: mod/photos.php:1052 +#: mod/photos.php:1053 msgid "Edit Album" msgstr "" -#: mod/photos.php:1053 +#: mod/photos.php:1054 msgid "Drop Album" msgstr "" -#: mod/photos.php:1058 +#: mod/photos.php:1059 msgid "Show Newest First" msgstr "" -#: mod/photos.php:1060 +#: mod/photos.php:1061 msgid "Show Oldest First" msgstr "" -#: mod/photos.php:1081 mod/photos.php:1611 +#: mod/photos.php:1082 mod/photos.php:1613 msgid "View Photo" msgstr "" -#: mod/photos.php:1118 +#: mod/photos.php:1119 msgid "Permission denied. Access to this item may be restricted." msgstr "" -#: mod/photos.php:1120 +#: mod/photos.php:1121 msgid "Photo not available" msgstr "" -#: mod/photos.php:1130 +#: mod/photos.php:1131 msgid "Do you really want to delete this photo?" msgstr "" -#: mod/photos.php:1131 mod/photos.php:1331 +#: mod/photos.php:1132 mod/photos.php:1333 msgid "Delete Photo" msgstr "" -#: mod/photos.php:1222 +#: mod/photos.php:1224 msgid "View photo" msgstr "" -#: mod/photos.php:1224 +#: mod/photos.php:1226 msgid "Edit photo" msgstr "" -#: mod/photos.php:1225 +#: mod/photos.php:1227 msgid "Delete photo" msgstr "" -#: mod/photos.php:1226 +#: mod/photos.php:1228 msgid "Use as profile photo" msgstr "" -#: mod/photos.php:1233 +#: mod/photos.php:1235 msgid "Private Photo" msgstr "" -#: mod/photos.php:1239 +#: mod/photos.php:1241 msgid "View Full Size" msgstr "" -#: mod/photos.php:1299 +#: mod/photos.php:1301 msgid "Tags: " msgstr "" -#: mod/photos.php:1302 +#: mod/photos.php:1304 msgid "[Select tags to remove]" msgstr "" -#: mod/photos.php:1317 +#: mod/photos.php:1319 msgid "New album name" msgstr "" -#: mod/photos.php:1318 +#: mod/photos.php:1320 msgid "Caption" msgstr "" -#: mod/photos.php:1319 +#: mod/photos.php:1321 msgid "Add a Tag" msgstr "" -#: mod/photos.php:1319 +#: mod/photos.php:1321 msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping" msgstr "" -#: mod/photos.php:1320 +#: mod/photos.php:1322 msgid "Do not rotate" msgstr "" -#: mod/photos.php:1321 +#: mod/photos.php:1323 msgid "Rotate CW (right)" msgstr "" -#: mod/photos.php:1322 +#: mod/photos.php:1324 msgid "Rotate CCW (left)" msgstr "" -#: mod/photos.php:1368 mod/photos.php:1424 mod/photos.php:1498 -#: src/Module/Contact.php:1046 src/Module/Item/Compose.php:148 -#: src/Object/Post.php:959 +#: mod/photos.php:1370 mod/photos.php:1426 mod/photos.php:1500 +#: src/Module/Contact.php:1062 src/Module/Item/Compose.php:148 +#: src/Object/Post.php:960 msgid "This is you" msgstr "" -#: mod/photos.php:1370 mod/photos.php:1426 mod/photos.php:1500 -#: src/Object/Post.php:495 src/Object/Post.php:961 +#: mod/photos.php:1372 mod/photos.php:1428 mod/photos.php:1502 +#: src/Object/Post.php:496 src/Object/Post.php:962 msgid "Comment" msgstr "" -#: mod/photos.php:1521 src/Object/Post.php:348 -msgid "Like" +#: mod/photos.php:1461 src/Content/Conversation.php:618 src/Object/Post.php:227 +msgid "Select" msgstr "" -#: mod/photos.php:1522 src/Object/Post.php:348 -msgid "I like this (toggle)" +#: mod/photos.php:1462 mod/settings.php:573 src/Content/Conversation.php:619 +#: src/Module/Admin/Users/Active.php:139 src/Module/Admin/Users/Blocked.php:140 +#: src/Module/Admin/Users/Index.php:153 src/Module/Contact.php:865 +#: src/Module/Contact.php:1150 +msgid "Delete" msgstr "" #: mod/photos.php:1523 src/Object/Post.php:349 +msgid "Like" +msgstr "" + +#: mod/photos.php:1524 src/Object/Post.php:349 +msgid "I like this (toggle)" +msgstr "" + +#: mod/photos.php:1525 src/Object/Post.php:350 msgid "Dislike" msgstr "" -#: mod/photos.php:1525 src/Object/Post.php:349 +#: mod/photos.php:1527 src/Object/Post.php:350 msgid "I don't like this (toggle)" msgstr "" -#: mod/photos.php:1547 +#: mod/photos.php:1549 msgid "Map" msgstr "" -#: mod/photos.php:1617 mod/videos.php:243 +#: mod/photos.php:1619 mod/videos.php:243 msgid "View Album" msgstr "" @@ -2177,7 +1838,7 @@ msgstr "" msgid "Password Settings" msgstr "" -#: mod/settings.php:719 src/Module/Register.php:149 +#: mod/settings.php:719 src/Module/Register.php:151 msgid "New Password:" msgstr "" @@ -2187,7 +1848,7 @@ msgid "" "spaces, accentuated letters and colon (:)." msgstr "" -#: mod/settings.php:720 src/Module/Register.php:150 +#: mod/settings.php:720 src/Module/Register.php:152 msgid "Confirm:" msgstr "" @@ -2545,6 +2206,19 @@ msgstr "" msgid "Friend Suggestions" msgstr "" +#: mod/tagger.php:90 src/Content/Item.php:346 src/Model/Item.php:2624 +msgid "photo" +msgstr "" + +#: mod/tagger.php:90 src/Content/Item.php:341 src/Content/Item.php:350 +msgid "status" +msgstr "" + +#: mod/tagger.php:123 src/Content/Item.php:360 +#, php-format +msgid "%1$s tagged %2$s's %3$s with %4$s" +msgstr "" + #: mod/tagrm.php:115 msgid "Remove Item Tag" msgstr "" @@ -2562,13 +2236,13 @@ msgstr "" msgid "User imports on closed servers can only be done by an administrator." msgstr "" -#: mod/uimport.php:54 src/Module/Register.php:84 +#: mod/uimport.php:54 src/Module/Register.php:86 msgid "" "This site has exceeded the number of allowed daily account registrations. " "Please try again tomorrow." msgstr "" -#: mod/uimport.php:61 src/Module/Register.php:160 +#: mod/uimport.php:61 src/Module/Register.php:162 msgid "Import" msgstr "" @@ -2678,7 +2352,7 @@ msgid "" "your site allow private mail from unknown senders." msgstr "" -#: src/App.php:452 +#: src/App.php:453 msgid "No system theme config value set." msgstr "" @@ -2720,16 +2394,16 @@ msgid "All contacts" msgstr "" #: src/BaseModule.php:212 src/Content/Widget.php:238 src/Core/ACL.php:195 -#: src/Module/Contact.php:816 src/Module/PermissionTooltip.php:77 +#: src/Module/Contact.php:831 src/Module/PermissionTooltip.php:77 #: src/Module/PermissionTooltip.php:99 msgid "Followers" msgstr "" -#: src/BaseModule.php:217 src/Content/Widget.php:239 src/Module/Contact.php:817 +#: src/BaseModule.php:217 src/Content/Widget.php:239 src/Module/Contact.php:832 msgid "Following" msgstr "" -#: src/BaseModule.php:222 src/Content/Widget.php:240 src/Module/Contact.php:818 +#: src/BaseModule.php:222 src/Content/Widget.php:240 src/Module/Contact.php:833 msgid "Mutual friends" msgstr "" @@ -2947,6 +2621,268 @@ msgstr "" msgid "%s (via %s)" msgstr "" +#: src/Content/Conversation.php:209 +#, php-format +msgid "%s likes this." +msgstr "" + +#: src/Content/Conversation.php:212 +#, php-format +msgid "%s doesn't like this." +msgstr "" + +#: src/Content/Conversation.php:215 +#, php-format +msgid "%s attends." +msgstr "" + +#: src/Content/Conversation.php:218 +#, php-format +msgid "%s doesn't attend." +msgstr "" + +#: src/Content/Conversation.php:221 +#, php-format +msgid "%s attends maybe." +msgstr "" + +#: src/Content/Conversation.php:224 src/Content/Conversation.php:262 +#: src/Content/Conversation.php:849 +#, php-format +msgid "%s reshared this." +msgstr "" + +#: src/Content/Conversation.php:230 +msgid "and" +msgstr "" + +#: src/Content/Conversation.php:233 +#, php-format +msgid "and %d other people" +msgstr "" + +#: src/Content/Conversation.php:241 +#, php-format +msgid "%2$d people like this" +msgstr "" + +#: src/Content/Conversation.php:242 +#, php-format +msgid "%s like this." +msgstr "" + +#: src/Content/Conversation.php:245 +#, php-format +msgid "%2$d people don't like this" +msgstr "" + +#: src/Content/Conversation.php:246 +#, php-format +msgid "%s don't like this." +msgstr "" + +#: src/Content/Conversation.php:249 +#, php-format +msgid "%2$d people attend" +msgstr "" + +#: src/Content/Conversation.php:250 +#, php-format +msgid "%s attend." +msgstr "" + +#: src/Content/Conversation.php:253 +#, php-format +msgid "%2$d people don't attend" +msgstr "" + +#: src/Content/Conversation.php:254 +#, php-format +msgid "%s don't attend." +msgstr "" + +#: src/Content/Conversation.php:257 +#, php-format +msgid "%2$d people attend maybe" +msgstr "" + +#: src/Content/Conversation.php:258 +#, php-format +msgid "%s attend maybe." +msgstr "" + +#: src/Content/Conversation.php:261 +#, php-format +msgid "%2$d people reshared this" +msgstr "" + +#: src/Content/Conversation.php:309 +msgid "Visible to everybody" +msgstr "" + +#: src/Content/Conversation.php:310 src/Module/Item/Compose.php:159 +#: src/Object/Post.php:973 +msgid "Please enter a image/video/audio/webpage URL:" +msgstr "" + +#: src/Content/Conversation.php:311 +msgid "Tag term:" +msgstr "" + +#: src/Content/Conversation.php:312 src/Module/Filer/SaveTag.php:68 +msgid "Save to Folder:" +msgstr "" + +#: src/Content/Conversation.php:313 +msgid "Where are you right now?" +msgstr "" + +#: src/Content/Conversation.php:314 +msgid "Delete item(s)?" +msgstr "" + +#: src/Content/Conversation.php:324 +msgid "New Post" +msgstr "" + +#: src/Content/Conversation.php:327 +msgid "Share" +msgstr "" + +#: src/Content/Conversation.php:333 src/Module/Item/Compose.php:151 +#: src/Object/Post.php:965 +msgid "Bold" +msgstr "" + +#: src/Content/Conversation.php:334 src/Module/Item/Compose.php:152 +#: src/Object/Post.php:966 +msgid "Italic" +msgstr "" + +#: src/Content/Conversation.php:335 src/Module/Item/Compose.php:153 +#: src/Object/Post.php:967 +msgid "Underline" +msgstr "" + +#: src/Content/Conversation.php:336 src/Module/Item/Compose.php:154 +#: src/Object/Post.php:968 +msgid "Quote" +msgstr "" + +#: src/Content/Conversation.php:337 src/Module/Item/Compose.php:155 +#: src/Object/Post.php:969 +msgid "Code" +msgstr "" + +#: src/Content/Conversation.php:338 src/Module/Item/Compose.php:156 +#: src/Object/Post.php:970 +msgid "Image" +msgstr "" + +#: src/Content/Conversation.php:339 src/Module/Item/Compose.php:157 +#: src/Object/Post.php:971 +msgid "Link" +msgstr "" + +#: src/Content/Conversation.php:340 src/Module/Item/Compose.php:158 +#: src/Object/Post.php:972 +msgid "Link or Media" +msgstr "" + +#: src/Content/Conversation.php:341 +msgid "Video" +msgstr "" + +#: src/Content/Conversation.php:354 src/Module/Item/Compose.php:172 +msgid "Scheduled at" +msgstr "" + +#: src/Content/Conversation.php:654 src/Object/Post.php:454 +#: src/Object/Post.php:455 +#, php-format +msgid "View %s's profile @ %s" +msgstr "" + +#: src/Content/Conversation.php:667 src/Object/Post.php:442 +msgid "Categories:" +msgstr "" + +#: src/Content/Conversation.php:668 src/Object/Post.php:443 +msgid "Filed under:" +msgstr "" + +#: src/Content/Conversation.php:675 src/Object/Post.php:468 +#, php-format +msgid "%s from %s" +msgstr "" + +#: src/Content/Conversation.php:690 +msgid "View in context" +msgstr "" + +#: src/Content/Conversation.php:756 +msgid "remove" +msgstr "" + +#: src/Content/Conversation.php:760 +msgid "Delete Selected Items" +msgstr "" + +#: src/Content/Conversation.php:821 src/Content/Conversation.php:824 +#: src/Content/Conversation.php:827 src/Content/Conversation.php:830 +#, php-format +msgid "You had been addressed (%s)." +msgstr "" + +#: src/Content/Conversation.php:833 +#, php-format +msgid "You are following %s." +msgstr "" + +#: src/Content/Conversation.php:836 +msgid "Tagged" +msgstr "" + +#: src/Content/Conversation.php:851 +msgid "Reshared" +msgstr "" + +#: src/Content/Conversation.php:851 +#, php-format +msgid "Reshared by %s <%s>" +msgstr "" + +#: src/Content/Conversation.php:854 +#, php-format +msgid "%s is participating in this thread." +msgstr "" + +#: src/Content/Conversation.php:857 +msgid "Stored" +msgstr "" + +#: src/Content/Conversation.php:860 +msgid "Global" +msgstr "" + +#: src/Content/Conversation.php:863 +msgid "Relayed" +msgstr "" + +#: src/Content/Conversation.php:863 +#, php-format +msgid "Relayed by %s <%s>" +msgstr "" + +#: src/Content/Conversation.php:866 +msgid "Fetched" +msgstr "" + +#: src/Content/Conversation.php:866 +#, php-format +msgid "Fetched because of %s <%s>" +msgstr "" + #: src/Content/Feature.php:96 msgid "General Features" msgstr "" @@ -3052,6 +2988,70 @@ msgstr "" msgid "show more" msgstr "" +#: src/Content/Item.php:305 +#, php-format +msgid "%1$s poked %2$s" +msgstr "" + +#: src/Content/Item.php:338 src/Model/Item.php:2622 +msgid "event" +msgstr "" + +#: src/Content/Item.php:442 view/theme/frio/theme.php:323 +msgid "Follow Thread" +msgstr "" + +#: src/Content/Item.php:443 src/Model/Contact.php:1050 +msgid "View Status" +msgstr "" + +#: src/Content/Item.php:444 src/Content/Item.php:466 src/Model/Contact.php:976 +#: src/Model/Contact.php:1042 src/Model/Contact.php:1051 +#: src/Module/Directory.php:160 src/Module/Settings/Profile/Index.php:223 +msgid "View Profile" +msgstr "" + +#: src/Content/Item.php:445 src/Model/Contact.php:1052 +msgid "View Photos" +msgstr "" + +#: src/Content/Item.php:446 src/Model/Contact.php:1043 +#: src/Model/Contact.php:1053 +msgid "Network Posts" +msgstr "" + +#: src/Content/Item.php:447 src/Model/Contact.php:1044 +#: src/Model/Contact.php:1054 +msgid "View Contact" +msgstr "" + +#: src/Content/Item.php:448 src/Model/Contact.php:1056 +msgid "Send PM" +msgstr "" + +#: src/Content/Item.php:449 src/Module/Admin/Blocklist/Contact.php:84 +#: src/Module/Admin/Users/Active.php:140 src/Module/Admin/Users/Index.php:154 +#: src/Module/Contact.php:602 src/Module/Contact.php:863 +#: src/Module/Contact.php:1133 +msgid "Block" +msgstr "" + +#: src/Content/Item.php:450 src/Module/Contact.php:603 +#: src/Module/Contact.php:864 src/Module/Contact.php:1141 +#: src/Module/Notifications/Introductions.php:113 +#: src/Module/Notifications/Introductions.php:185 +#: src/Module/Notifications/Notification.php:59 +msgid "Ignore" +msgstr "" + +#: src/Content/Item.php:454 src/Object/Post.php:429 +msgid "Languages" +msgstr "" + +#: src/Content/Item.php:458 src/Model/Contact.php:1057 +msgid "Poke" +msgstr "" + #: src/Content/Nav.php:90 msgid "Nothing new here" msgstr "" @@ -3076,7 +3076,7 @@ msgstr "" msgid "End this session" msgstr "" -#: src/Content/Nav.php:185 src/Module/Bookmarklet.php:45 +#: src/Content/Nav.php:185 src/Module/Bookmarklet.php:44 #: src/Module/Security/Login.php:146 msgid "Login" msgstr "" @@ -3086,7 +3086,7 @@ msgid "Sign in" msgstr "" #: src/Content/Nav.php:190 src/Module/BaseProfile.php:56 -#: src/Module/Contact.php:619 src/Module/Contact.php:883 +#: src/Module/Contact.php:634 src/Module/Contact.php:899 #: src/Module/Settings/TwoFactor/Index.php:112 view/theme/frio/theme.php:226 msgid "Status" msgstr "" @@ -3097,8 +3097,8 @@ msgid "Your posts and conversations" msgstr "" #: src/Content/Nav.php:191 src/Module/BaseProfile.php:48 -#: src/Module/BaseSettings.php:57 src/Module/Contact.php:621 -#: src/Module/Contact.php:899 src/Module/Profile/Profile.php:241 +#: src/Module/BaseSettings.php:57 src/Module/Contact.php:636 +#: src/Module/Contact.php:915 src/Module/Profile/Profile.php:241 #: src/Module/Welcome.php:57 view/theme/frio/theme.php:227 msgid "Profile" msgstr "" @@ -3135,7 +3135,7 @@ msgstr "" msgid "Home" msgstr "" -#: src/Content/Nav.php:216 src/Module/Register.php:155 +#: src/Content/Nav.php:216 src/Module/Register.php:157 #: src/Module/Security/Login.php:106 msgid "Register" msgstr "" @@ -3184,8 +3184,8 @@ msgstr "" #: src/Content/Nav.php:235 src/Content/Nav.php:294 #: src/Content/Text/HTML.php:902 src/Module/BaseProfile.php:126 -#: src/Module/BaseProfile.php:129 src/Module/Contact.php:819 -#: src/Module/Contact.php:906 view/theme/frio/theme.php:237 +#: src/Module/BaseProfile.php:129 src/Module/Contact.php:834 +#: src/Module/Contact.php:922 view/theme/frio/theme.php:237 msgid "Contacts" msgstr "" @@ -3219,7 +3219,7 @@ msgid "Information about this friendica instance" msgstr "" #: src/Content/Nav.php:266 src/Module/Admin/Tos.php:59 -#: src/Module/BaseAdmin.php:96 src/Module/Register.php:163 +#: src/Module/BaseAdmin.php:96 src/Module/Register.php:165 #: src/Module/Tos.php:84 msgid "Terms of Service" msgstr "" @@ -3331,39 +3331,39 @@ msgstr "" msgid "last" msgstr "" -#: src/Content/Text/BBCode.php:980 src/Content/Text/BBCode.php:1768 -#: src/Content/Text/BBCode.php:1769 +#: src/Content/Text/BBCode.php:985 src/Content/Text/BBCode.php:1773 +#: src/Content/Text/BBCode.php:1774 msgid "Image/photo" msgstr "" -#: src/Content/Text/BBCode.php:1153 +#: src/Content/Text/BBCode.php:1158 #, php-format msgid "" "%2$s %3$s" msgstr "" -#: src/Content/Text/BBCode.php:1178 src/Model/Item.php:3139 -#: src/Model/Item.php:3145 src/Model/Item.php:3146 +#: src/Content/Text/BBCode.php:1183 src/Model/Item.php:3152 +#: src/Model/Item.php:3158 src/Model/Item.php:3159 msgid "Link to source" msgstr "" -#: src/Content/Text/BBCode.php:1686 src/Content/Text/HTML.php:943 +#: src/Content/Text/BBCode.php:1691 src/Content/Text/HTML.php:943 msgid "Click to open/close" msgstr "" -#: src/Content/Text/BBCode.php:1717 +#: src/Content/Text/BBCode.php:1722 msgid "$1 wrote:" msgstr "" -#: src/Content/Text/BBCode.php:1773 src/Content/Text/BBCode.php:1774 +#: src/Content/Text/BBCode.php:1778 src/Content/Text/BBCode.php:1779 msgid "Encrypted content" msgstr "" -#: src/Content/Text/BBCode.php:1990 +#: src/Content/Text/BBCode.php:1995 msgid "Invalid source protocol" msgstr "" -#: src/Content/Text/BBCode.php:2005 +#: src/Content/Text/BBCode.php:2010 msgid "Invalid link protocol" msgstr "" @@ -3415,7 +3415,7 @@ msgstr "" msgid "Examples: Robert Morgenstein, Fishing" msgstr "" -#: src/Content/Widget.php:78 src/Module/Contact.php:840 +#: src/Content/Widget.php:78 src/Module/Contact.php:855 #: src/Module/Directory.php:99 view/theme/vier/theme.php:174 msgid "Find" msgstr "" @@ -3442,7 +3442,7 @@ msgid "Local Directory" msgstr "" #: src/Content/Widget.php:214 src/Model/Group.php:535 -#: src/Module/Contact.php:803 src/Module/Welcome.php:76 +#: src/Module/Contact.php:818 src/Module/Welcome.php:76 msgid "Groups" msgstr "" @@ -3454,7 +3454,7 @@ msgstr "" msgid "Relationships" msgstr "" -#: src/Content/Widget.php:247 src/Module/Contact.php:755 +#: src/Content/Widget.php:247 src/Module/Contact.php:770 #: src/Module/Group.php:292 msgid "All Contacts" msgstr "" @@ -3518,18 +3518,18 @@ msgstr "" msgid "Export calendar as csv" msgstr "" -#: src/Content/Widget/ContactBlock.php:73 +#: src/Content/Widget/ContactBlock.php:79 msgid "No contacts" msgstr "" -#: src/Content/Widget/ContactBlock.php:105 +#: src/Content/Widget/ContactBlock.php:108 #, php-format msgid "%d Contact" msgid_plural "%d Contacts" msgstr[0] "" msgstr[1] "" -#: src/Content/Widget/ContactBlock.php:124 +#: src/Content/Widget/ContactBlock.php:125 msgid "View Contacts" msgstr "" @@ -3553,12 +3553,12 @@ msgid "More Trending Tags" msgstr "" #: src/Content/Widget/VCard.php:96 src/Model/Profile.php:372 -#: src/Module/Contact.php:610 src/Module/Profile/Profile.php:176 +#: src/Module/Contact.php:625 src/Module/Profile/Profile.php:176 msgid "XMPP:" msgstr "" #: src/Content/Widget/VCard.php:97 src/Model/Profile.php:373 -#: src/Module/Contact.php:612 src/Module/Profile/Profile.php:180 +#: src/Module/Contact.php:627 src/Module/Profile/Profile.php:180 msgid "Matrix:" msgstr "" @@ -4557,33 +4557,33 @@ msgstr "" msgid "Edit groups" msgstr "" -#: src/Model/Item.php:1663 +#: src/Model/Item.php:1676 #, php-format msgid "Detected languages in this post:\\n%s" msgstr "" -#: src/Model/Item.php:2613 +#: src/Model/Item.php:2626 msgid "activity" msgstr "" -#: src/Model/Item.php:2615 +#: src/Model/Item.php:2628 msgid "comment" msgstr "" -#: src/Model/Item.php:2618 +#: src/Model/Item.php:2631 msgid "post" msgstr "" -#: src/Model/Item.php:2755 +#: src/Model/Item.php:2768 #, php-format msgid "Content warning: %s" msgstr "" -#: src/Model/Item.php:3104 +#: src/Model/Item.php:3117 msgid "bytes" msgstr "" -#: src/Model/Item.php:3133 src/Model/Item.php:3134 +#: src/Model/Item.php:3146 src/Model/Item.php:3147 msgid "View on separate page" msgstr "" @@ -4710,7 +4710,7 @@ msgstr "" msgid "Homepage:" msgstr "" -#: src/Model/Profile.php:371 src/Module/Contact.php:614 +#: src/Model/Profile.php:371 src/Module/Contact.php:629 #: src/Module/Notifications/Introductions.php:168 msgid "About:" msgstr "" @@ -4770,7 +4770,7 @@ msgstr "" msgid "Enter a valid existing folder" msgstr "" -#: src/Model/User.php:208 src/Model/User.php:1004 +#: src/Model/User.php:208 src/Model/User.php:1055 msgid "SERIOUS ERROR: Generation of security keys failed." msgstr "" @@ -4801,107 +4801,107 @@ msgid "" "The password can't contain accentuated letters, white spaces or colons (:)" msgstr "" -#: src/Model/User.php:884 +#: src/Model/User.php:935 msgid "Passwords do not match. Password unchanged." msgstr "" -#: src/Model/User.php:891 +#: src/Model/User.php:942 msgid "An invitation is required." msgstr "" -#: src/Model/User.php:895 +#: src/Model/User.php:946 msgid "Invitation could not be verified." msgstr "" -#: src/Model/User.php:903 +#: src/Model/User.php:954 msgid "Invalid OpenID url" msgstr "" -#: src/Model/User.php:916 src/Security/Authentication.php:223 +#: src/Model/User.php:967 src/Security/Authentication.php:223 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:916 src/Security/Authentication.php:223 +#: src/Model/User.php:967 src/Security/Authentication.php:223 msgid "The error message was:" msgstr "" -#: src/Model/User.php:922 +#: src/Model/User.php:973 msgid "Please enter the required information." msgstr "" -#: src/Model/User.php:936 +#: src/Model/User.php:987 #, 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:943 +#: src/Model/User.php:994 #, 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:947 +#: src/Model/User.php:998 #, 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:955 +#: src/Model/User.php:1006 msgid "That doesn't appear to be your full (First Last) name." msgstr "" -#: src/Model/User.php:960 +#: src/Model/User.php:1011 msgid "Your email domain is not among those allowed on this site." msgstr "" -#: src/Model/User.php:964 +#: src/Model/User.php:1015 msgid "Not a valid email address." msgstr "" -#: src/Model/User.php:967 +#: src/Model/User.php:1018 msgid "The nickname was blocked from registration by the nodes admin." msgstr "" -#: src/Model/User.php:971 src/Model/User.php:979 +#: src/Model/User.php:1022 src/Model/User.php:1030 msgid "Cannot use that email." msgstr "" -#: src/Model/User.php:986 +#: src/Model/User.php:1037 msgid "Your nickname can only contain a-z, 0-9 and _." msgstr "" -#: src/Model/User.php:994 src/Model/User.php:1051 +#: src/Model/User.php:1045 src/Model/User.php:1102 msgid "Nickname is already registered. Please choose another." msgstr "" -#: src/Model/User.php:1038 src/Model/User.php:1042 +#: src/Model/User.php:1089 src/Model/User.php:1093 msgid "An error occurred during registration. Please try again." msgstr "" -#: src/Model/User.php:1065 +#: src/Model/User.php:1116 msgid "An error occurred creating your default profile. Please try again." msgstr "" -#: src/Model/User.php:1072 +#: src/Model/User.php:1123 msgid "An error occurred creating your self contact. Please try again." msgstr "" -#: src/Model/User.php:1077 +#: src/Model/User.php:1128 msgid "Friends" msgstr "" -#: src/Model/User.php:1081 +#: src/Model/User.php:1132 msgid "" "An error occurred creating your default contact group. Please try again." msgstr "" -#: src/Model/User.php:1310 +#: src/Model/User.php:1361 #, php-format msgid "" "\n" @@ -4909,7 +4909,7 @@ msgid "" "\t\t\tthe administrator of %2$s has set up an account for you." msgstr "" -#: src/Model/User.php:1313 +#: src/Model/User.php:1364 #, php-format msgid "" "\n" @@ -4946,12 +4946,12 @@ msgid "" "\t\tThank you and welcome to %4$s." msgstr "" -#: src/Model/User.php:1346 src/Model/User.php:1453 +#: src/Model/User.php:1397 src/Model/User.php:1504 #, php-format msgid "Registration details for %s" msgstr "" -#: src/Model/User.php:1366 +#: src/Model/User.php:1417 #, php-format msgid "" "\n" @@ -4967,12 +4967,12 @@ msgid "" "\t\t" msgstr "" -#: src/Model/User.php:1385 +#: src/Model/User.php:1436 #, php-format msgid "Registration at %s" msgstr "" -#: src/Model/User.php:1409 +#: src/Model/User.php:1460 #, php-format msgid "" "\n" @@ -4981,7 +4981,7 @@ msgid "" "\t\t\t" msgstr "" -#: src/Model/User.php:1417 +#: src/Model/User.php:1468 #, php-format msgid "" "\n" @@ -5050,7 +5050,7 @@ msgstr "" #: src/Module/Admin/Item/Delete.php:65 src/Module/Admin/Logs/Settings.php:80 #: src/Module/Admin/Logs/View.php:84 src/Module/Admin/Queue.php:72 #: src/Module/Admin/Site.php:497 src/Module/Admin/Storage.php:131 -#: src/Module/Admin/Summary.php:232 src/Module/Admin/Themes/Details.php:90 +#: src/Module/Admin/Summary.php:233 src/Module/Admin/Themes/Details.php:90 #: src/Module/Admin/Themes/Index.php:111 src/Module/Admin/Tos.php:58 #: src/Module/Admin/Users/Active.php:136 src/Module/Admin/Users/Blocked.php:137 #: src/Module/Admin/Users/Create.php:61 src/Module/Admin/Users/Deleted.php:85 @@ -5111,8 +5111,8 @@ msgstr "" msgid "List of active accounts" msgstr "" -#: src/Module/Admin/BaseUsers.php:66 src/Module/Contact.php:763 -#: src/Module/Contact.php:823 +#: src/Module/Admin/BaseUsers.php:66 src/Module/Contact.php:778 +#: src/Module/Contact.php:838 msgid "Pending" msgstr "" @@ -5120,8 +5120,8 @@ msgstr "" msgid "List of pending registrations" msgstr "" -#: src/Module/Admin/BaseUsers.php:74 src/Module/Contact.php:771 -#: src/Module/Contact.php:824 +#: src/Module/Admin/BaseUsers.php:74 src/Module/Contact.php:786 +#: src/Module/Contact.php:839 msgid "Blocked" msgstr "" @@ -5178,8 +5178,8 @@ msgstr "" #: src/Module/Admin/Blocklist/Contact.php:85 #: src/Module/Admin/Users/Blocked.php:142 src/Module/Admin/Users/Index.php:156 -#: src/Module/Contact.php:587 src/Module/Contact.php:847 -#: src/Module/Contact.php:1115 +#: src/Module/Contact.php:602 src/Module/Contact.php:863 +#: src/Module/Contact.php:1133 msgid "Unblock" msgstr "" @@ -5696,7 +5696,7 @@ msgstr "" msgid "Republish users to directory" msgstr "" -#: src/Module/Admin/Site.php:502 src/Module/Register.php:139 +#: src/Module/Admin/Site.php:502 src/Module/Register.php:141 msgid "Registration" msgstr "" @@ -6464,7 +6464,7 @@ msgid "" "received." msgstr "" -#: src/Module/Admin/Site.php:609 src/Module/Contact.php:516 +#: src/Module/Admin/Site.php:609 src/Module/Contact.php:531 #: src/Module/Settings/TwoFactor/Index.php:118 msgid "Disabled" msgstr "" @@ -6553,12 +6553,12 @@ msgstr "" msgid "Database (legacy)" msgstr "" -#: src/Module/Admin/Summary.php:53 +#: src/Module/Admin/Summary.php:54 #, php-format msgid "Template engine (%s) error: %s" msgstr "" -#: src/Module/Admin/Summary.php:57 +#: src/Module/Admin/Summary.php:58 #, php-format msgid "" "Your DB still runs with MyISAM tables. You should change the engine type to " @@ -6569,7 +6569,7 @@ msgid "" "automatic conversion.
    " msgstr "" -#: src/Module/Admin/Summary.php:62 +#: src/Module/Admin/Summary.php:63 #, php-format msgid "" "Your DB still runs with InnoDB tables in the Antelope file format. You " @@ -6580,7 +6580,7 @@ msgid "" "installation for an automatic conversion.
    " msgstr "" -#: src/Module/Admin/Summary.php:72 +#: src/Module/Admin/Summary.php:73 #, php-format msgid "" "Your table_definition_cache is too low (%d). This can lead to the database " @@ -6588,39 +6588,39 @@ msgid "" "to %d. See here for more information.
    " msgstr "" -#: src/Module/Admin/Summary.php:82 +#: src/Module/Admin/Summary.php:83 #, php-format msgid "" "There is a new version of Friendica available for download. Your current " "version is %1$s, upstream version is %2$s" msgstr "" -#: src/Module/Admin/Summary.php:91 +#: src/Module/Admin/Summary.php:92 msgid "" "The database update failed. Please run \"php bin/console.php dbstructure " "update\" from the command line and have a look at the errors that might " "appear." msgstr "" -#: src/Module/Admin/Summary.php:95 +#: src/Module/Admin/Summary.php:96 msgid "" "The last update failed. Please run \"php bin/console.php dbstructure update" "\" from the command line and have a look at the errors that might appear. " "(Some of the errors are possibly inside the logfile.)" msgstr "" -#: src/Module/Admin/Summary.php:100 +#: src/Module/Admin/Summary.php:101 msgid "The worker was never executed. Please check your database structure!" msgstr "" -#: src/Module/Admin/Summary.php:102 +#: src/Module/Admin/Summary.php:103 #, php-format msgid "" "The last worker execution was on %s UTC. This is older than one hour. Please " "check your crontab settings." msgstr "" -#: src/Module/Admin/Summary.php:107 +#: src/Module/Admin/Summary.php:108 #, php-format msgid "" "Friendica's configuration now is stored in config/local.config.php, please " @@ -6629,7 +6629,7 @@ msgid "" "with the transition." msgstr "" -#: src/Module/Admin/Summary.php:111 +#: src/Module/Admin/Summary.php:112 #, php-format msgid "" "Friendica's configuration now is stored in config/local.config.php, please " @@ -6638,7 +6638,7 @@ msgid "" "with the transition." msgstr "" -#: src/Module/Admin/Summary.php:117 +#: src/Module/Admin/Summary.php:118 #, php-format msgid "" "%s is not reachable on your system. This is a severe " @@ -6646,86 +6646,86 @@ msgid "" "href=\"%s\">the installation page for help." msgstr "" -#: src/Module/Admin/Summary.php:135 +#: src/Module/Admin/Summary.php:136 #, php-format msgid "The logfile '%s' is not usable. No logging possible (error: '%s')" msgstr "" -#: src/Module/Admin/Summary.php:149 +#: src/Module/Admin/Summary.php:150 #, php-format msgid "The debug logfile '%s' is not usable. No logging possible (error: '%s')" msgstr "" -#: src/Module/Admin/Summary.php:165 +#: src/Module/Admin/Summary.php:166 #, php-format msgid "" "Friendica's system.basepath was updated from '%s' to '%s'. Please remove the " "system.basepath from your db to avoid differences." msgstr "" -#: src/Module/Admin/Summary.php:173 +#: src/Module/Admin/Summary.php:174 #, php-format msgid "" "Friendica's current system.basepath '%s' is wrong and the config file '%s' " "isn't used." msgstr "" -#: src/Module/Admin/Summary.php:181 +#: src/Module/Admin/Summary.php:182 #, php-format msgid "" "Friendica's current system.basepath '%s' is not equal to the config file " "'%s'. Please fix your configuration." msgstr "" -#: src/Module/Admin/Summary.php:188 +#: src/Module/Admin/Summary.php:189 msgid "Normal Account" msgstr "" -#: src/Module/Admin/Summary.php:189 +#: src/Module/Admin/Summary.php:190 msgid "Automatic Follower Account" msgstr "" -#: src/Module/Admin/Summary.php:190 +#: src/Module/Admin/Summary.php:191 msgid "Public Forum Account" msgstr "" -#: src/Module/Admin/Summary.php:191 +#: src/Module/Admin/Summary.php:192 msgid "Automatic Friend Account" msgstr "" -#: src/Module/Admin/Summary.php:192 +#: src/Module/Admin/Summary.php:193 msgid "Blog Account" msgstr "" -#: src/Module/Admin/Summary.php:193 +#: src/Module/Admin/Summary.php:194 msgid "Private Forum Account" msgstr "" -#: src/Module/Admin/Summary.php:213 +#: src/Module/Admin/Summary.php:214 msgid "Message queues" msgstr "" -#: src/Module/Admin/Summary.php:219 +#: src/Module/Admin/Summary.php:220 msgid "Server Settings" msgstr "" -#: src/Module/Admin/Summary.php:233 src/Repository/ProfileField.php:285 +#: src/Module/Admin/Summary.php:234 src/Repository/ProfileField.php:285 msgid "Summary" msgstr "" -#: src/Module/Admin/Summary.php:235 +#: src/Module/Admin/Summary.php:236 msgid "Registered users" msgstr "" -#: src/Module/Admin/Summary.php:237 +#: src/Module/Admin/Summary.php:238 msgid "Pending registrations" msgstr "" -#: src/Module/Admin/Summary.php:238 +#: src/Module/Admin/Summary.php:239 msgid "Version" msgstr "" -#: src/Module/Admin/Summary.php:242 +#: src/Module/Admin/Summary.php:243 msgid "Active addons" msgstr "" @@ -7035,8 +7035,8 @@ msgstr "" msgid "Posts from %s can't be unshared" msgstr "" -#: src/Module/Api/Twitter/ContactEndpoint.php:63 src/Module/Contact.php:361 -#: src/Module/Contact.php:366 +#: src/Module/Api/Twitter/ContactEndpoint.php:63 src/Module/Contact.php:371 +#: src/Module/Contact.php:386 msgid "Contact not found" msgstr "" @@ -7157,7 +7157,7 @@ msgstr "" msgid "Too Many Requests" msgstr "" -#: src/Module/BaseProfile.php:51 src/Module/Contact.php:902 +#: src/Module/BaseProfile.php:51 src/Module/Contact.php:918 msgid "Profile Details" msgstr "" @@ -7216,373 +7216,373 @@ msgstr "" msgid "Remove account" msgstr "" -#: src/Module/Bookmarklet.php:55 +#: src/Module/Bookmarklet.php:54 msgid "This page is missing a url parameter." msgstr "" -#: src/Module/Bookmarklet.php:67 +#: src/Module/Bookmarklet.php:66 msgid "The post was created" msgstr "" -#: src/Module/Contact.php:93 +#: src/Module/Contact.php:97 #, php-format msgid "%d contact edited." msgid_plural "%d contacts edited." msgstr[0] "" msgstr[1] "" -#: src/Module/Contact.php:118 +#: src/Module/Contact.php:122 msgid "Could not access contact record." msgstr "" -#: src/Module/Contact.php:154 +#: src/Module/Contact.php:158 msgid "Failed to update contact record." msgstr "" -#: src/Module/Contact.php:383 +#: src/Module/Contact.php:403 msgid "You can't block yourself" msgstr "" -#: src/Module/Contact.php:389 +#: src/Module/Contact.php:409 msgid "Contact has been blocked" msgstr "" -#: src/Module/Contact.php:389 +#: src/Module/Contact.php:409 msgid "Contact has been unblocked" msgstr "" -#: src/Module/Contact.php:397 +#: src/Module/Contact.php:417 msgid "You can't ignore yourself" msgstr "" -#: src/Module/Contact.php:403 +#: src/Module/Contact.php:423 msgid "Contact has been ignored" msgstr "" -#: src/Module/Contact.php:403 +#: src/Module/Contact.php:423 msgid "Contact has been unignored" msgstr "" -#: src/Module/Contact.php:415 +#: src/Module/Contact.php:435 msgid "Drop contact" msgstr "" -#: src/Module/Contact.php:418 src/Module/Contact.php:843 +#: src/Module/Contact.php:438 src/Module/Contact.php:859 msgid "Do you really want to delete this contact?" msgstr "" -#: src/Module/Contact.php:419 src/Module/Notifications/Introductions.php:123 -#: src/Module/OAuth/Acknowledge.php:47 src/Module/Register.php:115 +#: src/Module/Contact.php:439 src/Module/Notifications/Introductions.php:123 +#: src/Module/OAuth/Acknowledge.php:47 src/Module/Register.php:117 msgid "Yes" msgstr "" -#: src/Module/Contact.php:431 +#: src/Module/Contact.php:452 msgid "Contact has been removed." msgstr "" -#: src/Module/Contact.php:458 +#: src/Module/Contact.php:473 #, php-format msgid "You are mutual friends with %s" msgstr "" -#: src/Module/Contact.php:462 +#: src/Module/Contact.php:477 #, php-format msgid "You are sharing with %s" msgstr "" -#: src/Module/Contact.php:466 +#: src/Module/Contact.php:481 #, php-format msgid "%s is sharing with you" msgstr "" -#: src/Module/Contact.php:490 +#: src/Module/Contact.php:505 msgid "Private communications are not available for this contact." msgstr "" -#: src/Module/Contact.php:492 +#: src/Module/Contact.php:507 msgid "Never" msgstr "" -#: src/Module/Contact.php:495 +#: src/Module/Contact.php:510 msgid "(Update was not successful)" msgstr "" -#: src/Module/Contact.php:495 +#: src/Module/Contact.php:510 msgid "(Update was successful)" msgstr "" -#: src/Module/Contact.php:497 src/Module/Contact.php:1086 +#: src/Module/Contact.php:512 src/Module/Contact.php:1104 msgid "Suggest friends" msgstr "" -#: src/Module/Contact.php:501 +#: src/Module/Contact.php:516 #, php-format msgid "Network type: %s" msgstr "" -#: src/Module/Contact.php:506 +#: src/Module/Contact.php:521 msgid "Communications lost with this contact!" msgstr "" -#: src/Module/Contact.php:512 +#: src/Module/Contact.php:527 msgid "Fetch further information for feeds" msgstr "" -#: src/Module/Contact.php:514 +#: src/Module/Contact.php:529 msgid "" "Fetch information like preview pictures, title and teaser from the feed " "item. You can activate this if the feed doesn't contain much text. Keywords " "are taken from the meta header in the feed item and are posted as hash tags." msgstr "" -#: src/Module/Contact.php:517 +#: src/Module/Contact.php:532 msgid "Fetch information" msgstr "" -#: src/Module/Contact.php:518 +#: src/Module/Contact.php:533 msgid "Fetch keywords" msgstr "" -#: src/Module/Contact.php:519 +#: src/Module/Contact.php:534 msgid "Fetch information and keywords" msgstr "" -#: src/Module/Contact.php:531 src/Module/Contact.php:535 -#: src/Module/Contact.php:538 src/Module/Contact.php:542 +#: src/Module/Contact.php:546 src/Module/Contact.php:550 +#: src/Module/Contact.php:553 src/Module/Contact.php:557 msgid "No mirroring" msgstr "" -#: src/Module/Contact.php:532 +#: src/Module/Contact.php:547 msgid "Mirror as forwarded posting" msgstr "" -#: src/Module/Contact.php:533 src/Module/Contact.php:539 -#: src/Module/Contact.php:543 +#: src/Module/Contact.php:548 src/Module/Contact.php:554 +#: src/Module/Contact.php:558 msgid "Mirror as my own posting" msgstr "" -#: src/Module/Contact.php:536 src/Module/Contact.php:540 +#: src/Module/Contact.php:551 src/Module/Contact.php:555 msgid "Native reshare" msgstr "" -#: src/Module/Contact.php:555 +#: src/Module/Contact.php:570 msgid "Contact Information / Notes" msgstr "" -#: src/Module/Contact.php:556 +#: src/Module/Contact.php:571 msgid "Contact Settings" msgstr "" -#: src/Module/Contact.php:564 +#: src/Module/Contact.php:579 msgid "Contact" msgstr "" -#: src/Module/Contact.php:568 +#: src/Module/Contact.php:583 msgid "Their personal note" msgstr "" -#: src/Module/Contact.php:570 +#: src/Module/Contact.php:585 msgid "Edit contact notes" msgstr "" -#: src/Module/Contact.php:573 src/Module/Contact.php:1054 +#: src/Module/Contact.php:588 src/Module/Contact.php:1070 #, php-format msgid "Visit %s's profile [%s]" msgstr "" -#: src/Module/Contact.php:574 +#: src/Module/Contact.php:589 msgid "Block/Unblock contact" msgstr "" -#: src/Module/Contact.php:575 +#: src/Module/Contact.php:590 msgid "Ignore contact" msgstr "" -#: src/Module/Contact.php:576 +#: src/Module/Contact.php:591 msgid "View conversations" msgstr "" -#: src/Module/Contact.php:581 +#: src/Module/Contact.php:596 msgid "Last update:" msgstr "" -#: src/Module/Contact.php:583 +#: src/Module/Contact.php:598 msgid "Update public posts" msgstr "" -#: src/Module/Contact.php:585 src/Module/Contact.php:1096 +#: src/Module/Contact.php:600 src/Module/Contact.php:1114 msgid "Update now" msgstr "" -#: src/Module/Contact.php:588 src/Module/Contact.php:848 -#: src/Module/Contact.php:1123 +#: src/Module/Contact.php:603 src/Module/Contact.php:864 +#: src/Module/Contact.php:1141 msgid "Unignore" msgstr "" -#: src/Module/Contact.php:592 +#: src/Module/Contact.php:607 msgid "Currently blocked" msgstr "" -#: src/Module/Contact.php:593 +#: src/Module/Contact.php:608 msgid "Currently ignored" msgstr "" -#: src/Module/Contact.php:594 +#: src/Module/Contact.php:609 msgid "Currently archived" msgstr "" -#: src/Module/Contact.php:595 +#: src/Module/Contact.php:610 msgid "Awaiting connection acknowledge" msgstr "" -#: src/Module/Contact.php:596 src/Module/Notifications/Introductions.php:171 +#: src/Module/Contact.php:611 src/Module/Notifications/Introductions.php:171 msgid "Hide this contact from others" msgstr "" -#: src/Module/Contact.php:596 +#: src/Module/Contact.php:611 msgid "" "Replies/likes to your public posts may still be visible" msgstr "" -#: src/Module/Contact.php:597 +#: src/Module/Contact.php:612 msgid "Notification for new posts" msgstr "" -#: src/Module/Contact.php:597 +#: src/Module/Contact.php:612 msgid "Send a notification of every new post of this contact" msgstr "" -#: src/Module/Contact.php:599 +#: src/Module/Contact.php:614 msgid "Keyword Deny List" msgstr "" -#: src/Module/Contact.php:599 +#: src/Module/Contact.php:614 msgid "" "Comma separated list of keywords that should not be converted to hashtags, " "when \"Fetch information and keywords\" is selected" msgstr "" -#: src/Module/Contact.php:617 src/Module/Settings/TwoFactor/Index.php:132 +#: src/Module/Contact.php:632 src/Module/Settings/TwoFactor/Index.php:132 msgid "Actions" msgstr "" -#: src/Module/Contact.php:624 +#: src/Module/Contact.php:639 msgid "Mirror postings from this contact" msgstr "" -#: src/Module/Contact.php:626 +#: src/Module/Contact.php:641 msgid "" "Mark this contact as remote_self, this will cause friendica to repost new " "entries from this contact." msgstr "" -#: src/Module/Contact.php:758 +#: src/Module/Contact.php:773 msgid "Show all contacts" msgstr "" -#: src/Module/Contact.php:766 +#: src/Module/Contact.php:781 msgid "Only show pending contacts" msgstr "" -#: src/Module/Contact.php:774 +#: src/Module/Contact.php:789 msgid "Only show blocked contacts" msgstr "" -#: src/Module/Contact.php:779 src/Module/Contact.php:826 -#: src/Object/Post.php:308 +#: src/Module/Contact.php:794 src/Module/Contact.php:841 +#: src/Object/Post.php:309 msgid "Ignored" msgstr "" -#: src/Module/Contact.php:782 +#: src/Module/Contact.php:797 msgid "Only show ignored contacts" msgstr "" -#: src/Module/Contact.php:787 src/Module/Contact.php:827 +#: src/Module/Contact.php:802 src/Module/Contact.php:842 msgid "Archived" msgstr "" -#: src/Module/Contact.php:790 +#: src/Module/Contact.php:805 msgid "Only show archived contacts" msgstr "" -#: src/Module/Contact.php:795 src/Module/Contact.php:825 +#: src/Module/Contact.php:810 src/Module/Contact.php:840 msgid "Hidden" msgstr "" -#: src/Module/Contact.php:798 +#: src/Module/Contact.php:813 msgid "Only show hidden contacts" msgstr "" -#: src/Module/Contact.php:806 +#: src/Module/Contact.php:821 msgid "Organize your contact groups" msgstr "" -#: src/Module/Contact.php:838 +#: src/Module/Contact.php:853 msgid "Search your contacts" msgstr "" -#: src/Module/Contact.php:839 src/Module/Search/Index.php:194 +#: src/Module/Contact.php:854 src/Module/Search/Index.php:194 #, php-format msgid "Results for: %s" msgstr "" -#: src/Module/Contact.php:846 +#: src/Module/Contact.php:862 msgid "Update" msgstr "" -#: src/Module/Contact.php:851 +#: src/Module/Contact.php:867 msgid "Batch Actions" msgstr "" -#: src/Module/Contact.php:886 +#: src/Module/Contact.php:902 msgid "Conversations started by this contact" msgstr "" -#: src/Module/Contact.php:891 +#: src/Module/Contact.php:907 msgid "Posts and Comments" msgstr "" -#: src/Module/Contact.php:909 +#: src/Module/Contact.php:925 msgid "View all known contacts" msgstr "" -#: src/Module/Contact.php:919 +#: src/Module/Contact.php:935 msgid "Advanced Contact Settings" msgstr "" -#: src/Module/Contact.php:1013 +#: src/Module/Contact.php:1029 msgid "Mutual Friendship" msgstr "" -#: src/Module/Contact.php:1017 +#: src/Module/Contact.php:1033 msgid "is a fan of yours" msgstr "" -#: src/Module/Contact.php:1021 +#: src/Module/Contact.php:1037 msgid "you are a fan of" msgstr "" -#: src/Module/Contact.php:1039 +#: src/Module/Contact.php:1055 msgid "Pending outgoing contact request" msgstr "" -#: src/Module/Contact.php:1041 +#: src/Module/Contact.php:1057 msgid "Pending incoming contact request" msgstr "" -#: src/Module/Contact.php:1106 +#: src/Module/Contact.php:1124 msgid "Refetch contact data" msgstr "" -#: src/Module/Contact.php:1117 +#: src/Module/Contact.php:1135 msgid "Toggle Blocked status" msgstr "" -#: src/Module/Contact.php:1125 +#: src/Module/Contact.php:1143 msgid "Toggle Ignored status" msgstr "" -#: src/Module/Contact.php:1134 +#: src/Module/Contact.php:1152 msgid "Delete contact" msgstr "" @@ -7758,17 +7758,17 @@ msgstr "" msgid "No results." msgstr "" -#: src/Module/Conversation/Community.php:162 +#: src/Module/Conversation/Community.php:163 msgid "" "This community stream shows all public posts received by this node. They may " "not reflect the opinions of this node’s users." msgstr "" -#: src/Module/Conversation/Community.php:200 +#: src/Module/Conversation/Community.php:201 msgid "Community option not available." msgstr "" -#: src/Module/Conversation/Community.php:216 +#: src/Module/Conversation/Community.php:217 msgid "Not available." msgstr "" @@ -7806,7 +7806,7 @@ msgstr "" msgid "Posts that mention or involve you" msgstr "" -#: src/Module/Conversation/Network.php:258 src/Object/Post.php:320 +#: src/Module/Conversation/Network.php:258 src/Object/Post.php:321 msgid "Starred" msgstr "" @@ -8083,21 +8083,21 @@ msgstr "" msgid "Lookup address:" msgstr "" -#: src/Module/Delegation.php:148 +#: src/Module/Delegation.php:142 msgid "Switch between your accounts" msgstr "" -#: src/Module/Delegation.php:149 +#: src/Module/Delegation.php:143 msgid "Manage your accounts" msgstr "" -#: src/Module/Delegation.php:150 +#: src/Module/Delegation.php:144 msgid "" "Toggle between different identities or community/group pages which share " "your account details or which you have been granted \"manage\" permissions" msgstr "" -#: src/Module/Delegation.php:151 +#: src/Module/Delegation.php:145 msgid "Select an identity to manage: " msgstr "" @@ -8629,7 +8629,7 @@ msgid "Claims to be known to you: " msgstr "" #: src/Module/Notifications/Introductions.php:123 -#: src/Module/OAuth/Acknowledge.php:48 src/Module/Register.php:116 +#: src/Module/OAuth/Acknowledge.php:48 src/Module/Register.php:118 msgid "No" msgstr "" @@ -8845,137 +8845,137 @@ msgstr "" msgid "Remove post" msgstr "" -#: src/Module/Register.php:69 +#: src/Module/Register.php:71 msgid "Only parent users can create additional accounts." msgstr "" -#: src/Module/Register.php:101 +#: src/Module/Register.php:103 msgid "" "You may (optionally) fill in this form via OpenID by supplying your OpenID " "and clicking \"Register\"." msgstr "" -#: src/Module/Register.php:102 +#: src/Module/Register.php:104 msgid "" "If you are not familiar with OpenID, please leave that field blank and fill " "in the rest of the items." msgstr "" -#: src/Module/Register.php:103 +#: src/Module/Register.php:105 msgid "Your OpenID (optional): " msgstr "" -#: src/Module/Register.php:112 +#: src/Module/Register.php:114 msgid "Include your profile in member directory?" msgstr "" -#: src/Module/Register.php:135 +#: src/Module/Register.php:137 msgid "Note for the admin" msgstr "" -#: src/Module/Register.php:135 +#: src/Module/Register.php:137 msgid "Leave a message for the admin, why you want to join this node" msgstr "" -#: src/Module/Register.php:136 +#: src/Module/Register.php:138 msgid "Membership on this site is by invitation only." msgstr "" -#: src/Module/Register.php:137 +#: src/Module/Register.php:139 msgid "Your invitation code: " msgstr "" -#: src/Module/Register.php:145 +#: src/Module/Register.php:147 msgid "Your Full Name (e.g. Joe Smith, real or real-looking): " msgstr "" -#: src/Module/Register.php:146 +#: src/Module/Register.php:148 msgid "" "Your Email Address: (Initial information will be send there, so this has to " "be an existing address.)" msgstr "" -#: src/Module/Register.php:147 +#: src/Module/Register.php:149 msgid "Please repeat your e-mail address:" msgstr "" -#: src/Module/Register.php:149 +#: src/Module/Register.php:151 msgid "Leave empty for an auto generated password." msgstr "" -#: src/Module/Register.php:151 +#: src/Module/Register.php:153 #, php-format msgid "" "Choose a profile nickname. This must begin with a text character. Your " "profile address on this site will then be \"nickname@%s\"." msgstr "" -#: src/Module/Register.php:152 +#: src/Module/Register.php:154 msgid "Choose a nickname: " msgstr "" -#: src/Module/Register.php:161 +#: src/Module/Register.php:163 msgid "Import your profile to this friendica instance" msgstr "" -#: src/Module/Register.php:168 +#: src/Module/Register.php:170 msgid "Note: This node explicitly contains adult content" msgstr "" -#: src/Module/Register.php:170 src/Module/Settings/Delegation.php:155 +#: src/Module/Register.php:172 src/Module/Settings/Delegation.php:155 msgid "Parent Password:" msgstr "" -#: src/Module/Register.php:170 src/Module/Settings/Delegation.php:155 +#: src/Module/Register.php:172 src/Module/Settings/Delegation.php:155 msgid "" "Please enter the password of the parent account to legitimize your request." msgstr "" -#: src/Module/Register.php:199 +#: src/Module/Register.php:201 msgid "Password doesn't match." msgstr "" -#: src/Module/Register.php:205 +#: src/Module/Register.php:207 msgid "Please enter your password." msgstr "" -#: src/Module/Register.php:247 +#: src/Module/Register.php:249 msgid "You have entered too much information." msgstr "" -#: src/Module/Register.php:270 +#: src/Module/Register.php:272 msgid "Please enter the identical mail address in the second field." msgstr "" -#: src/Module/Register.php:297 +#: src/Module/Register.php:299 msgid "The additional account was created." msgstr "" -#: src/Module/Register.php:322 +#: src/Module/Register.php:324 msgid "" "Registration successful. Please check your email for further instructions." msgstr "" -#: src/Module/Register.php:326 +#: src/Module/Register.php:328 #, php-format msgid "" "Failed to send email message. Here your accout details:
    login: %s
    " "password: %s

    You can change your password after login." msgstr "" -#: src/Module/Register.php:332 +#: src/Module/Register.php:334 msgid "Registration successful." msgstr "" -#: src/Module/Register.php:337 src/Module/Register.php:344 +#: src/Module/Register.php:339 src/Module/Register.php:346 msgid "Your registration can not be processed." msgstr "" -#: src/Module/Register.php:343 +#: src/Module/Register.php:345 msgid "You have to leave a request note for the admin." msgstr "" -#: src/Module/Register.php:389 +#: src/Module/Register.php:391 msgid "Your registration is pending approval by the site owner." msgstr "" @@ -10176,197 +10176,197 @@ msgstr "" msgid "%s posted an update." msgstr "" -#: src/Object/Post.php:148 +#: src/Object/Post.php:149 msgid "This entry was edited" msgstr "" -#: src/Object/Post.php:176 +#: src/Object/Post.php:177 msgid "Private Message" msgstr "" -#: src/Object/Post.php:192 src/Object/Post.php:194 +#: src/Object/Post.php:193 src/Object/Post.php:195 msgid "Edit" msgstr "" -#: src/Object/Post.php:214 +#: src/Object/Post.php:215 msgid "Pinned item" msgstr "" -#: src/Object/Post.php:218 +#: src/Object/Post.php:219 msgid "Delete globally" msgstr "" -#: src/Object/Post.php:218 +#: src/Object/Post.php:219 msgid "Remove locally" msgstr "" -#: src/Object/Post.php:234 +#: src/Object/Post.php:235 #, php-format msgid "Block %s" msgstr "" -#: src/Object/Post.php:239 +#: src/Object/Post.php:240 msgid "Save to folder" msgstr "" -#: src/Object/Post.php:273 +#: src/Object/Post.php:274 msgid "I will attend" msgstr "" -#: src/Object/Post.php:273 +#: src/Object/Post.php:274 msgid "I will not attend" msgstr "" -#: src/Object/Post.php:273 +#: src/Object/Post.php:274 msgid "I might attend" msgstr "" -#: src/Object/Post.php:303 +#: src/Object/Post.php:304 msgid "Ignore thread" msgstr "" -#: src/Object/Post.php:304 +#: src/Object/Post.php:305 msgid "Unignore thread" msgstr "" -#: src/Object/Post.php:305 +#: src/Object/Post.php:306 msgid "Toggle ignore status" msgstr "" -#: src/Object/Post.php:315 +#: src/Object/Post.php:316 msgid "Add star" msgstr "" -#: src/Object/Post.php:316 +#: src/Object/Post.php:317 msgid "Remove star" msgstr "" -#: src/Object/Post.php:317 +#: src/Object/Post.php:318 msgid "Toggle star status" msgstr "" -#: src/Object/Post.php:328 +#: src/Object/Post.php:329 msgid "Pin" msgstr "" -#: src/Object/Post.php:329 +#: src/Object/Post.php:330 msgid "Unpin" msgstr "" -#: src/Object/Post.php:330 +#: src/Object/Post.php:331 msgid "Toggle pin status" msgstr "" -#: src/Object/Post.php:333 +#: src/Object/Post.php:334 msgid "Pinned" msgstr "" -#: src/Object/Post.php:338 +#: src/Object/Post.php:339 msgid "Add tag" msgstr "" -#: src/Object/Post.php:351 +#: src/Object/Post.php:352 msgid "Quote share this" msgstr "" -#: src/Object/Post.php:351 +#: src/Object/Post.php:352 msgid "Quote Share" msgstr "" -#: src/Object/Post.php:354 +#: src/Object/Post.php:355 msgid "Reshare this" msgstr "" -#: src/Object/Post.php:354 +#: src/Object/Post.php:355 msgid "Reshare" msgstr "" -#: src/Object/Post.php:355 +#: src/Object/Post.php:356 msgid "Cancel your Reshare" msgstr "" -#: src/Object/Post.php:355 +#: src/Object/Post.php:356 msgid "Unshare" msgstr "" -#: src/Object/Post.php:400 +#: src/Object/Post.php:401 #, php-format msgid "%s (Received %s)" msgstr "" -#: src/Object/Post.php:405 +#: src/Object/Post.php:406 msgid "Comment this item on your system" msgstr "" -#: src/Object/Post.php:405 +#: src/Object/Post.php:406 msgid "Remote comment" msgstr "" -#: src/Object/Post.php:421 +#: src/Object/Post.php:422 msgid "Pushed" msgstr "" -#: src/Object/Post.php:421 +#: src/Object/Post.php:422 msgid "Pulled" msgstr "" -#: src/Object/Post.php:455 +#: src/Object/Post.php:456 msgid "to" msgstr "" -#: src/Object/Post.php:456 +#: src/Object/Post.php:457 msgid "via" msgstr "" -#: src/Object/Post.php:457 +#: src/Object/Post.php:458 msgid "Wall-to-Wall" msgstr "" -#: src/Object/Post.php:458 +#: src/Object/Post.php:459 msgid "via Wall-To-Wall:" msgstr "" -#: src/Object/Post.php:496 +#: src/Object/Post.php:497 #, php-format msgid "Reply to %s" msgstr "" -#: src/Object/Post.php:499 +#: src/Object/Post.php:500 msgid "More" msgstr "" -#: src/Object/Post.php:517 +#: src/Object/Post.php:518 msgid "Notifier task is pending" msgstr "" -#: src/Object/Post.php:518 +#: src/Object/Post.php:519 msgid "Delivery to remote servers is pending" msgstr "" -#: src/Object/Post.php:519 +#: src/Object/Post.php:520 msgid "Delivery to remote servers is underway" msgstr "" -#: src/Object/Post.php:520 +#: src/Object/Post.php:521 msgid "Delivery to remote servers is mostly done" msgstr "" -#: src/Object/Post.php:521 +#: src/Object/Post.php:522 msgid "Delivery to remote servers is done" msgstr "" -#: src/Object/Post.php:541 +#: src/Object/Post.php:542 #, php-format msgid "%d comment" msgid_plural "%d comments" msgstr[0] "" msgstr[1] "" -#: src/Object/Post.php:542 +#: src/Object/Post.php:543 msgid "Show more" msgstr "" -#: src/Object/Post.php:543 +#: src/Object/Post.php:544 msgid "Show fewer" msgstr "" From f696fce824e436acb5f603bbc521c096338b621d Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 23 Sep 2021 21:53:52 +0000 Subject: [PATCH 04/54] Reformatting --- src/Content/Conversation.php | 182 ++++++++++++++++++----------------- 1 file changed, 92 insertions(+), 90 deletions(-) diff --git a/src/Content/Conversation.php b/src/Content/Conversation.php index 1dca32164..8027bb23f 100644 --- a/src/Content/Conversation.php +++ b/src/Content/Conversation.php @@ -139,10 +139,10 @@ class Conversation if (!empty($activity['verb']) && $this->activity->match($activity['verb'], $verb) && ($activity['gravity'] != GRAVITY_PARENT)) { $author = [ - 'uid' => 0, - 'id' => $activity['author-id'], + 'uid' => 0, + 'id' => $activity['author-id'], 'network' => $activity['author-network'], - 'url' => $activity['author-link'] + 'url' => $activity['author-link'] ]; $url = Contact::magicLinkByContact($author); if (strpos($url, 'redir/') === 0) { @@ -164,7 +164,7 @@ class Conversation if (!isset($conv_responses[$mode][$activity['thr-parent-id']])) { $conv_responses[$mode][$activity['thr-parent-id']] = [ 'links' => [], - 'self' => 0, + 'self' => 0, ]; } elseif (in_array($link, $conv_responses[$mode][$activity['thr-parent-id']]['links'])) { // only list each unique author once @@ -238,11 +238,11 @@ class Conversation $explikers = ''; switch ($verb) { case 'like': - $phrase = $this->l10n->t('%2$d people like this', $spanatts, $total); + $phrase = $this->l10n->t('%2$d people like this', $spanatts, $total); $explikers = $this->l10n->t('%s like this.', $likers); break; case 'dislike': - $phrase = $this->l10n->t('%2$d people don\'t like this', $spanatts, $total); + $phrase = $this->l10n->t('%2$d people don\'t like this', $spanatts, $total); $explikers = $this->l10n->t('%s don\'t like this.', $likers); break; case 'attendyes': @@ -250,15 +250,15 @@ class Conversation $explikers = $this->l10n->t('%s attend.', $likers); break; case 'attendno': - $phrase = $this->l10n->t('%2$d people don\'t attend', $spanatts, $total); + $phrase = $this->l10n->t('%2$d people don\'t attend', $spanatts, $total); $explikers = $this->l10n->t('%s don\'t attend.', $likers); break; case 'attendmaybe': - $phrase = $this->l10n->t('%2$d people attend maybe', $spanatts, $total); + $phrase = $this->l10n->t('%2$d people attend maybe', $spanatts, $total); $explikers = $this->l10n->t('%s attend maybe.', $likers); break; case 'announce': - $phrase = $this->l10n->t('%2$d people reshared this', $spanatts, $total); + $phrase = $this->l10n->t('%2$d people reshared this', $spanatts, $total); $explikers = $this->l10n->t('%s reshared this.', $likers); break; } @@ -321,33 +321,33 @@ class Conversation $tpl = Renderer::getMarkupTemplate("jot.tpl"); $o .= Renderer::replaceMacros($tpl, [ - '$new_post' => $this->l10n->t('New Post'), - '$return_path' => $this->args->getQueryString(), - '$action' => 'item', - '$share' => ($x['button'] ?? '') ?: $this->l10n->t('Share'), - '$loading' => $this->l10n->t('Loading...'), - '$upload' => $this->l10n->t('Upload photo'), - '$shortupload' => $this->l10n->t('upload photo'), - '$attach' => $this->l10n->t('Attach file'), - '$shortattach' => $this->l10n->t('attach file'), - '$edbold' => $this->l10n->t('Bold'), - '$editalic' => $this->l10n->t('Italic'), - '$eduline' => $this->l10n->t('Underline'), - '$edquote' => $this->l10n->t('Quote'), - '$edcode' => $this->l10n->t('Code'), - '$edimg' => $this->l10n->t('Image'), - '$edurl' => $this->l10n->t('Link'), - '$edattach' => $this->l10n->t('Link or Media'), - '$edvideo' => $this->l10n->t('Video'), - '$setloc' => $this->l10n->t('Set your location'), - '$shortsetloc' => $this->l10n->t('set location'), - '$noloc' => $this->l10n->t('Clear browser location'), - '$shortnoloc' => $this->l10n->t('clear location'), - '$title' => $x['title'] ?? '', - '$placeholdertitle' => $this->l10n->t('Set title'), - '$category' => $x['category'] ?? '', + '$new_post' => $this->l10n->t('New Post'), + '$return_path' => $this->args->getQueryString(), + '$action' => 'item', + '$share' => ($x['button'] ?? '') ?: $this->l10n->t('Share'), + '$loading' => $this->l10n->t('Loading...'), + '$upload' => $this->l10n->t('Upload photo'), + '$shortupload' => $this->l10n->t('upload photo'), + '$attach' => $this->l10n->t('Attach file'), + '$shortattach' => $this->l10n->t('attach file'), + '$edbold' => $this->l10n->t('Bold'), + '$editalic' => $this->l10n->t('Italic'), + '$eduline' => $this->l10n->t('Underline'), + '$edquote' => $this->l10n->t('Quote'), + '$edcode' => $this->l10n->t('Code'), + '$edimg' => $this->l10n->t('Image'), + '$edurl' => $this->l10n->t('Link'), + '$edattach' => $this->l10n->t('Link or Media'), + '$edvideo' => $this->l10n->t('Video'), + '$setloc' => $this->l10n->t('Set your location'), + '$shortsetloc' => $this->l10n->t('set location'), + '$noloc' => $this->l10n->t('Clear browser location'), + '$shortnoloc' => $this->l10n->t('clear location'), + '$title' => $x['title'] ?? '', + '$placeholdertitle' => $this->l10n->t('Set title'), + '$category' => $x['category'] ?? '', '$placeholdercategory' => Feature::isEnabled(local_user(), 'categories') ? $this->l10n->t("Categories \x28comma-separated list\x29") : '', - '$scheduled_at' => Temporal::getDateTimeField( + '$scheduled_at' => Temporal::getDateTimeField( new \DateTime(), new \DateTime('now + 6 months'), null, @@ -641,56 +641,56 @@ class Conversation } $tmp_item = [ - 'template' => $tpl, - 'id' => ($preview ? 'P0' : $item['id']), - 'guid' => ($preview ? 'Q0' : $item['guid']), - 'commented' => $item['commented'], - 'received' => $item['received'], - 'created_date' => $item['created'], - 'uriid' => $item['uri-id'], - 'network' => $item['network'], - 'network_name' => ContactSelector::networkToName($item['author-network'], $item['author-link'], $item['network']), - 'network_icon' => ContactSelector::networkToIcon($item['network'], $item['author-link']), - 'linktitle' => $this->l10n->t('View %s\'s profile @ %s', $profile_name, $item['author-link']), - 'profile_url' => $profile_link, + 'template' => $tpl, + 'id' => ($preview ? 'P0' : $item['id']), + 'guid' => ($preview ? 'Q0' : $item['guid']), + 'commented' => $item['commented'], + 'received' => $item['received'], + 'created_date' => $item['created'], + 'uriid' => $item['uri-id'], + 'network' => $item['network'], + 'network_name' => ContactSelector::networkToName($item['author-network'], $item['author-link'], $item['network']), + 'network_icon' => ContactSelector::networkToIcon($item['network'], $item['author-link']), + 'linktitle' => $this->l10n->t('View %s\'s profile @ %s', $profile_name, $item['author-link']), + 'profile_url' => $profile_link, 'item_photo_menu_html' => $this->item->photoMenu($item, $formSecurityToken), - 'name' => $profile_name, - 'sparkle' => $sparkle, - 'lock' => false, - 'thumb' => $this->baseURL->remove(Contact::getAvatarUrlForUrl($item['author-link'], $item['uid'], Proxy::SIZE_THUMB)), - 'title' => $title, - 'body_html' => $body_html, - 'tags' => $tags['tags'], - 'hashtags' => $tags['hashtags'], - 'mentions' => $tags['mentions'], - 'implicit_mentions' => $tags['implicit_mentions'], - 'txt_cats' => $this->l10n->t('Categories:'), - 'txt_folders' => $this->l10n->t('Filed under:'), - 'has_cats' => ((count($categories)) ? 'true' : ''), - 'has_folders' => ((count($folders)) ? 'true' : ''), - 'categories' => $categories, - 'folders' => $folders, - 'text' => strip_tags($body_html), - 'localtime' => DateTimeFormat::local($item['created'], 'r'), - 'ago' => (($item['app']) ? $this->l10n->t('%s from %s', Temporal::getRelativeDate($item['created']), $item['app']) : Temporal::getRelativeDate($item['created'])), - 'location_html' => $location_html, - 'indent' => '', - 'owner_name' => '', - 'owner_url' => '', - 'owner_photo' => $this->baseURL->remove(Contact::getAvatarUrlForUrl($item['owner-link'], $item['uid'], Proxy::SIZE_THUMB)), - 'plink' => ItemModel::getPlink($item), - 'edpost' => false, - 'isstarred' => 'unstarred', - 'star' => false, - 'drop' => $drop, - 'vote' => $likebuttons, - 'like_html' => '', - 'dislike_html' => '', - 'comment_html' => '', - 'conv' => (($preview) ? '' : ['href'=> 'display/'.$item['guid'], 'title'=> $this->l10n->t('View in context')]), - 'previewing' => $previewing, - 'wait' => $this->l10n->t('Please wait'), - 'thread_level' => 1, + 'name' => $profile_name, + 'sparkle' => $sparkle, + 'lock' => false, + 'thumb' => $this->baseURL->remove(Contact::getAvatarUrlForUrl($item['author-link'], $item['uid'], Proxy::SIZE_THUMB)), + 'title' => $title, + 'body_html' => $body_html, + 'tags' => $tags['tags'], + 'hashtags' => $tags['hashtags'], + 'mentions' => $tags['mentions'], + 'implicit_mentions' => $tags['implicit_mentions'], + 'txt_cats' => $this->l10n->t('Categories:'), + 'txt_folders' => $this->l10n->t('Filed under:'), + 'has_cats' => ((count($categories)) ? 'true' : ''), + 'has_folders' => ((count($folders)) ? 'true' : ''), + 'categories' => $categories, + 'folders' => $folders, + 'text' => strip_tags($body_html), + 'localtime' => DateTimeFormat::local($item['created'], 'r'), + 'ago' => (($item['app']) ? $this->l10n->t('%s from %s', Temporal::getRelativeDate($item['created']), $item['app']) : Temporal::getRelativeDate($item['created'])), + 'location_html' => $location_html, + 'indent' => '', + 'owner_name' => '', + 'owner_url' => '', + 'owner_photo' => $this->baseURL->remove(Contact::getAvatarUrlForUrl($item['owner-link'], $item['uid'], Proxy::SIZE_THUMB)), + 'plink' => ItemModel::getPlink($item), + 'edpost' => false, + 'isstarred' => 'unstarred', + 'star' => false, + 'drop' => $drop, + 'vote' => $likebuttons, + 'like_html' => '', + 'dislike_html ' => '', + 'comment_html' => '', + 'conv' => (($preview) ? '' : ['href'=> 'display/'.$item['guid'], 'title'=> $this->l10n->t('View in context')]), + 'previewing' => $previewing, + 'wait' => $this->l10n->t('Please wait'), + 'thread_level' => 1, ]; $arr = ['item' => $item, 'output' => $tmp_item]; @@ -805,11 +805,13 @@ class Conversation if (!empty($activity)) { if (($row['gravity'] == GRAVITY_PARENT)) { $row['post-reason'] = ItemModel::PR_ANNOUNCEMENT; - $row = array_merge($row, $activity); + + $row = array_merge($row, $activity); $contact = Contact::getById($activity['causer-id'], ['url', 'name', 'thumb']); - $row['causer-link'] = $contact['url']; + + $row['causer-link'] = $contact['url']; $row['causer-avatar'] = $contact['thumb']; - $row['causer-name'] = $contact['name']; + $row['causer-name'] = $contact['name']; } elseif (($row['gravity'] == GRAVITY_ACTIVITY) && ($row['verb'] == Activity::ANNOUNCE) && ($row['author-id'] == $activity['causer-id'])) { return $row; @@ -837,10 +839,10 @@ class Conversation break; case ItemModel::PR_ANNOUNCEMENT: if (!empty($row['causer-id']) && $this->pConfig->get(local_user(), 'system', 'display_resharer')) { - $row['owner-id'] = $row['causer-id']; - $row['owner-link'] = $row['causer-link']; + $row['owner-id'] = $row['causer-id']; + $row['owner-link'] = $row['causer-link']; $row['owner-avatar'] = $row['causer-avatar']; - $row['owner-name'] = $row['causer-name']; + $row['owner-name'] = $row['causer-name']; } if (($row['gravity'] == GRAVITY_PARENT) && !empty($row['causer-id'])) { From 64d181c1ccba5c59cc2316d6e7c1471e9495dae8 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 24 Sep 2021 04:35:27 +0000 Subject: [PATCH 05/54] Code style --- src/Content/Conversation.php | 63 +++++++++++++-------------- src/Module/Conversation/Community.php | 1 - 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/src/Content/Conversation.php b/src/Content/Conversation.php index 8027bb23f..f0bc405f2 100644 --- a/src/Content/Conversation.php +++ b/src/Content/Conversation.php @@ -287,15 +287,15 @@ class Conversation $this->profiler->startRecording('rendering'); $o = ''; - $x['allow_location'] = $x['allow_location'] ?? $user['allow_location']; + $x['allow_location'] = $x['allow_location'] ?? $user['allow_location']; $x['default_location'] = $x['default_location'] ?? $user['default-location']; - $x['nickname'] = $x['nickname'] ?? $user['nickname']; - $x['lockstate'] = $x['lockstate'] ?? ACL::getLockstateForUserId($user['uid']) ? 'lock' : 'unlock'; - $x['acl'] = $x['acl'] ?? ACL::getFullSelectorHTML($this->page, $user['uid'], true); - $x['bang'] = $x['bang'] ?? ''; - $x['visitor'] = $x['visitor'] ?? 'block'; - $x['is_owner'] = $x['is_owner'] ?? true; - $x['profile_uid'] = $x['profile_uid'] ?? local_user(); + $x['nickname'] = $x['nickname'] ?? $user['nickname']; + $x['lockstate'] = $x['lockstate'] ?? ACL::getLockstateForUserId($user['uid']) ? 'lock' : 'unlock'; + $x['acl'] = $x['acl'] ?? ACL::getFullSelectorHTML($this->page, $user['uid'], true); + $x['bang'] = $x['bang'] ?? ''; + $x['visitor'] = $x['visitor'] ?? 'block'; + $x['is_owner'] = $x['is_owner'] ?? true; + $x['profile_uid'] = $x['profile_uid'] ?? local_user(); $geotag = !empty($x['allow_location']) ? Renderer::replaceMacros(Renderer::getMarkupTemplate('jot_geotag.tpl'), []) : ''; @@ -376,7 +376,7 @@ class Conversation '$rand_num' => Crypto::randomDigits(12), // ACL permissions box - '$acl' => $x['acl'], + '$acl' => $x['acl'], //jot nav tab (used in some themes) '$message' => $this->l10n->t('Message'), @@ -442,16 +442,16 @@ class Conversation . "; var netargs = '" . substr($this->args->getCommand(), 8) . '?f=' . (!empty($_GET['contactid']) ? '&contactid=' . rawurlencode($_GET['contactid']) : '') - . (!empty($_GET['search']) ? '&search=' . rawurlencode($_GET['search']) : '') - . (!empty($_GET['star']) ? '&star=' . rawurlencode($_GET['star']) : '') - . (!empty($_GET['order']) ? '&order=' . rawurlencode($_GET['order']) : '') - . (!empty($_GET['bmark']) ? '&bmark=' . rawurlencode($_GET['bmark']) : '') - . (!empty($_GET['liked']) ? '&liked=' . rawurlencode($_GET['liked']) : '') - . (!empty($_GET['conv']) ? '&conv=' . rawurlencode($_GET['conv']) : '') - . (!empty($_GET['nets']) ? '&nets=' . rawurlencode($_GET['nets']) : '') - . (!empty($_GET['cmin']) ? '&cmin=' . rawurlencode($_GET['cmin']) : '') - . (!empty($_GET['cmax']) ? '&cmax=' . rawurlencode($_GET['cmax']) : '') - . (!empty($_GET['file']) ? '&file=' . rawurlencode($_GET['file']) : '') + . (!empty($_GET['search']) ? '&search=' . rawurlencode($_GET['search']) : '') + . (!empty($_GET['star']) ? '&star=' . rawurlencode($_GET['star']) : '') + . (!empty($_GET['order']) ? '&order=' . rawurlencode($_GET['order']) : '') + . (!empty($_GET['bmark']) ? '&bmark=' . rawurlencode($_GET['bmark']) : '') + . (!empty($_GET['liked']) ? '&liked=' . rawurlencode($_GET['liked']) : '') + . (!empty($_GET['conv']) ? '&conv=' . rawurlencode($_GET['conv']) : '') + . (!empty($_GET['nets']) ? '&nets=' . rawurlencode($_GET['nets']) : '') + . (!empty($_GET['cmin']) ? '&cmin=' . rawurlencode($_GET['cmin']) : '') + . (!empty($_GET['cmax']) ? '&cmax=' . rawurlencode($_GET['cmax']) : '') + . (!empty($_GET['file']) ? '&file=' . rawurlencode($_GET['file']) : '') . "'; \r\n"; } @@ -535,10 +535,10 @@ class Conversation } // array with html for each thread (parent+comments) - $threads = []; + $threads = []; $threadsid = -1; - $page_template = Renderer::getMarkupTemplate("conversation.tpl"); + $page_template = Renderer::getMarkupTemplate("conversation.tpl"); $formSecurityToken = BaseModule::getFormSecurityToken('contact_action'); if (!empty($items)) { @@ -592,8 +592,7 @@ class Conversation $tags = Tag::populateFromItem($item); - $author = ['uid' => 0, 'id' => $item['author-id'], - 'network' => $item['author-network'], 'url' => $item['author-link']]; + $author = ['uid' => 0, 'id' => $item['author-id'], 'network' => $item['author-network'], 'url' => $item['author-link']]; $profile_link = Contact::magicLinkByContact($author); $sparkle = ''; @@ -615,8 +614,8 @@ class Conversation $drop = [ 'dropping' => $dropping, 'pagedrop' => $page_dropping, - 'select' => $this->l10n->t('Select'), - 'delete' => $this->l10n->t('Delete'), + 'select' => $this->l10n->t('Select'), + 'delete' => $this->l10n->t('Delete'), ]; $likebuttons = [ @@ -750,14 +749,14 @@ class Conversation } $o = Renderer::replaceMacros($page_template, [ - '$baseurl' => $this->baseURL->get($ssl_state), + '$baseurl' => $this->baseURL->get($ssl_state), '$return_path' => $this->args->getQueryString(), '$live_update' => $live_update_div, - '$remove' => $this->l10n->t('remove'), - '$mode' => $mode, - '$update' => $update, - '$threads' => $threads, - '$dropping' => ($page_dropping ? $this->l10n->t('Delete Selected Items') : False), + '$remove' => $this->l10n->t('remove'), + '$mode' => $mode, + '$update' => $update, + '$threads' => $threads, + '$dropping' => ($page_dropping ? $this->l10n->t('Delete Selected Items') : False), ]); $this->profiler->stopRecording(); @@ -902,7 +901,7 @@ class Conversation $commentcounter = []; $activitycounter = []; - foreach ($parents AS $parent) { + foreach ($parents as $parent) { if (!empty($parent['thr-parent-id']) && !empty($parent['gravity']) && ($parent['gravity'] == GRAVITY_ACTIVITY)) { $uriid = $parent['thr-parent-id']; if (!empty($parent['author-id'])) { diff --git a/src/Module/Conversation/Community.php b/src/Module/Conversation/Community.php index f0ba058e5..3a30f3799 100644 --- a/src/Module/Conversation/Community.php +++ b/src/Module/Conversation/Community.php @@ -138,7 +138,6 @@ class Community extends BaseModule return $o; } -// $o .= conversation(DI::app(), $items, 'community', false, false, 'commented', local_user()); $o .= DI::conversation()->create($items, 'community', false, false, 'commented', local_user()); $pager = new BoundariesPager( From 8fd8241797e92d714b80b78233c1e88b77623267 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 24 Sep 2021 04:46:30 +0000 Subject: [PATCH 06/54] Style again --- src/Content/Conversation.php | 55 +++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/src/Content/Conversation.php b/src/Content/Conversation.php index f0bc405f2..b5a9ab976 100644 --- a/src/Content/Conversation.php +++ b/src/Content/Conversation.php @@ -192,11 +192,12 @@ class Conversation * @return string formatted text * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - public function formatActivity(array $links, $verb, $id) { + public function formatActivity(array $links, $verb, $id) + { $this->profiler->startRecording('rendering'); - $o = ''; + $o = ''; $expanded = ''; - $phrase = ''; + $phrase = ''; $total = count($links); if ($total == 1) { @@ -205,30 +206,30 @@ class Conversation // Phrase if there is only one liker. In other cases it will be uses for the expanded // list which show all likers switch ($verb) { - case 'like' : + case 'like': $phrase = $this->l10n->t('%s likes this.', $likers); break; - case 'dislike' : + case 'dislike': $phrase = $this->l10n->t('%s doesn\'t like this.', $likers); break; - case 'attendyes' : + case 'attendyes': $phrase = $this->l10n->t('%s attends.', $likers); break; - case 'attendno' : + case 'attendno': $phrase = $this->l10n->t('%s doesn\'t attend.', $likers); break; - case 'attendmaybe' : + case 'attendmaybe': $phrase = $this->l10n->t('%s attends maybe.', $likers); break; - case 'announce' : + case 'announce': $phrase = $this->l10n->t('%s reshared this.', $likers); break; } } elseif ($total > 1) { if ($total < MAX_LIKERS) { $likers = implode(', ', array_slice($links, 0, -1)); - $likers .= ' ' . $this->l10n->t('and') . ' ' . $links[count($links)-1]; - } else { + $likers .= ' ' . $this->l10n->t('and') . ' ' . $links[count($links) - 1]; + } else { $likers = implode(', ', array_slice($links, 0, MAX_LIKERS - 1)); $likers .= ' ' . $this->l10n->t('and %d other people', $total - MAX_LIKERS); } @@ -246,7 +247,7 @@ class Conversation $explikers = $this->l10n->t('%s don\'t like this.', $likers); break; case 'attendyes': - $phrase = $this->l10n->t('%2$d people attend', $spanatts, $total); + $phrase = $this->l10n->t('%2$d people attend', $spanatts, $total); $explikers = $this->l10n->t('%s attend.', $likers); break; case 'attendno': @@ -268,8 +269,8 @@ class Conversation $o .= Renderer::replaceMacros(Renderer::getMarkupTemplate('voting_fakelink.tpl'), [ '$phrase' => $phrase, - '$type' => $verb, - '$id' => $id + '$type' => $verb, + '$id' => $id ]); $o .= $expanded; @@ -592,7 +593,7 @@ class Conversation $tags = Tag::populateFromItem($item); - $author = ['uid' => 0, 'id' => $item['author-id'], 'network' => $item['author-network'], 'url' => $item['author-link']]; + $author = ['uid' => 0, 'id' => $item['author-id'], 'network' => $item['author-network'], 'url' => $item['author-link']]; $profile_link = Contact::magicLinkByContact($author); $sparkle = ''; @@ -686,7 +687,7 @@ class Conversation 'like_html' => '', 'dislike_html ' => '', 'comment_html' => '', - 'conv' => (($preview) ? '' : ['href'=> 'display/'.$item['guid'], 'title'=> $this->l10n->t('View in context')]), + 'conv' => ($preview ? '' : ['href' => 'display/' . $item['guid'], 'title'=> $this->l10n->t('View in context')]), 'previewing' => $previewing, 'wait' => $this->l10n->t('Please wait'), 'thread_level' => 1, @@ -695,9 +696,9 @@ class Conversation $arr = ['item' => $item, 'output' => $tmp_item]; Hook::callAll('display_item', $arr); - $threads[$threadsid]['id'] = $item['id']; + $threads[$threadsid]['id'] = $item['id']; $threads[$threadsid]['network'] = $item['network']; - $threads[$threadsid]['items'] = [$arr['output']]; + $threads[$threadsid]['items'] = [$arr['output']]; } } else { @@ -756,7 +757,7 @@ class Conversation '$mode' => $mode, '$update' => $update, '$threads' => $threads, - '$dropping' => ($page_dropping ? $this->l10n->t('Delete Selected Items') : False), + '$dropping' => ($page_dropping ? $this->l10n->t('Delete Selected Items') : false), ]); $this->profiler->stopRecording(); @@ -794,7 +795,8 @@ class Conversation * * @return array items with parents and comments */ - private function addRowInformation(array $row, array $activity) { + private function addRowInformation(array $row, array $activity) + { $this->profiler->startRecording('rendering'); if ($row['uid'] == 0) { @@ -886,7 +888,8 @@ class Conversation * @return array items with parents and comments * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - private function addChildren(array $parents, $block_authors, $order, $uid) { + private function addChildren(array $parents, $block_authors, $order, $uid) + { $this->profiler->startRecording('rendering'); if (count($parents) > 1) { $max_comments = $this->config->get('system', 'max_comments', 100); @@ -980,6 +983,7 @@ class Conversation if ($thr_parent == $parent['uri-id']) { $item['children'] = $this->getItemChildren($item_list, $item); + $children[] = $item; unset($item_list[$i]); } @@ -1059,7 +1063,7 @@ class Conversation if (isset($child['children']) && count($child['children'])) { // This helps counting only the regular posts - $count_post_closure = function($var) { + $count_post_closure = function ($var) { $this->profiler->stopRecording(); return $var['verb'] === Activity::POST; }; @@ -1073,7 +1077,7 @@ class Conversation // Searches the post item in the children $j = 0; - while($child['children'][$j]['verb'] !== Activity::POST && $j < count($child['children'])) { + while ($child['children'][$j]['verb'] !== Activity::POST && $j < count($child['children'])) { $j ++; } @@ -1144,9 +1148,8 @@ class Conversation * items and add them as children of their top-level post. */ foreach ($parents as $i => $parent) { - $parents[$i]['children'] = - array_merge($this->getItemChildren($item_array, $parent, true), - $this->getItemChildren($item_array, $parent, false)); + $parents[$i]['children'] = array_merge($this->getItemChildren($item_array, $parent, true), + $this->getItemChildren($item_array, $parent, false)); } foreach ($parents as $i => $parent) { From 943f1961eabb0e69725c280309f1ce9d25d36bdb Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 24 Sep 2021 04:50:47 +0000 Subject: [PATCH 07/54] Style again --- src/Content/Conversation.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/Content/Conversation.php b/src/Content/Conversation.php index b5a9ab976..b31e0345f 100644 --- a/src/Content/Conversation.php +++ b/src/Content/Conversation.php @@ -25,9 +25,6 @@ use Friendica\App; use Friendica\App\Arguments; use Friendica\App\BaseURL; use Friendica\BaseModule; -use Friendica\Content\ContactSelector; -use Friendica\Content\Feature; -use Friendica\Content\Item; use Friendica\Core\ACL; use Friendica\Core\Config\IConfig; use Friendica\Core\Hook; @@ -687,7 +684,7 @@ class Conversation 'like_html' => '', 'dislike_html ' => '', 'comment_html' => '', - 'conv' => ($preview ? '' : ['href' => 'display/' . $item['guid'], 'title'=> $this->l10n->t('View in context')]), + 'conv' => ($preview ? '' : ['href' => 'display/' . $item['guid'], 'title' => $this->l10n->t('View in context')]), 'previewing' => $previewing, 'wait' => $this->l10n->t('Please wait'), 'thread_level' => 1, @@ -847,8 +844,8 @@ class Conversation } if (($row['gravity'] == GRAVITY_PARENT) && !empty($row['causer-id'])) { - $causer = ['uid' => 0, 'id' => $row['causer-id'], - 'network' => $row['causer-network'], 'url' => $row['causer-link']]; + $causer = ['uid' => 0, 'id' => $row['causer-id'], 'network' => $row['causer-network'], 'url' => $row['causer-link']]; + $row['reshared'] = $this->l10n->t('%s reshared this.', '' . htmlentities($row['causer-name']) . ''); } $row['direction'] = ['direction' => 3, 'title' => (empty($row['causer-id']) ? $this->l10n->t('Reshared') : $this->l10n->t('Reshared by %s <%s>', $row['causer-name'], $row['causer-link']))]; From 5cfb0cb58abdebb888a51548529480479ab5172f Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 24 Sep 2021 04:52:34 +0000 Subject: [PATCH 08/54] Last style stuff ... --- src/Content/Conversation.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Content/Conversation.php b/src/Content/Conversation.php index b31e0345f..f60aa3239 100644 --- a/src/Content/Conversation.php +++ b/src/Content/Conversation.php @@ -696,7 +696,6 @@ class Conversation $threads[$threadsid]['id'] = $item['id']; $threads[$threadsid]['network'] = $item['network']; $threads[$threadsid]['items'] = [$arr['output']]; - } } else { // Normal View From d4fd1512277b24f01da26fd0b4a57a259a595b7a Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 25 Sep 2021 08:06:38 +0000 Subject: [PATCH 09/54] Partly reverting formatting to cause a code style checker error --- src/Content/Conversation.php | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/Content/Conversation.php b/src/Content/Conversation.php index f60aa3239..879e47c24 100644 --- a/src/Content/Conversation.php +++ b/src/Content/Conversation.php @@ -285,15 +285,15 @@ class Conversation $this->profiler->startRecording('rendering'); $o = ''; - $x['allow_location'] = $x['allow_location'] ?? $user['allow_location']; + $x['allow_location'] = $x['allow_location'] ?? $user['allow_location']; $x['default_location'] = $x['default_location'] ?? $user['default-location']; - $x['nickname'] = $x['nickname'] ?? $user['nickname']; - $x['lockstate'] = $x['lockstate'] ?? ACL::getLockstateForUserId($user['uid']) ? 'lock' : 'unlock'; - $x['acl'] = $x['acl'] ?? ACL::getFullSelectorHTML($this->page, $user['uid'], true); - $x['bang'] = $x['bang'] ?? ''; - $x['visitor'] = $x['visitor'] ?? 'block'; - $x['is_owner'] = $x['is_owner'] ?? true; - $x['profile_uid'] = $x['profile_uid'] ?? local_user(); + $x['nickname'] = $x['nickname'] ?? $user['nickname']; + $x['lockstate'] = $x['lockstate'] ?? ACL::getLockstateForUserId($user['uid']) ? 'lock' : 'unlock'; + $x['acl'] = $x['acl'] ?? ACL::getFullSelectorHTML($this->page, $user['uid'], true); + $x['bang'] = $x['bang'] ?? ''; + $x['visitor'] = $x['visitor'] ?? 'block'; + $x['is_owner'] = $x['is_owner'] ?? true; + $x['profile_uid'] = $x['profile_uid'] ?? local_user(); $geotag = !empty($x['allow_location']) ? Renderer::replaceMacros(Renderer::getMarkupTemplate('jot_geotag.tpl'), []) : ''; @@ -440,16 +440,16 @@ class Conversation . "; var netargs = '" . substr($this->args->getCommand(), 8) . '?f=' . (!empty($_GET['contactid']) ? '&contactid=' . rawurlencode($_GET['contactid']) : '') - . (!empty($_GET['search']) ? '&search=' . rawurlencode($_GET['search']) : '') - . (!empty($_GET['star']) ? '&star=' . rawurlencode($_GET['star']) : '') - . (!empty($_GET['order']) ? '&order=' . rawurlencode($_GET['order']) : '') - . (!empty($_GET['bmark']) ? '&bmark=' . rawurlencode($_GET['bmark']) : '') - . (!empty($_GET['liked']) ? '&liked=' . rawurlencode($_GET['liked']) : '') - . (!empty($_GET['conv']) ? '&conv=' . rawurlencode($_GET['conv']) : '') - . (!empty($_GET['nets']) ? '&nets=' . rawurlencode($_GET['nets']) : '') - . (!empty($_GET['cmin']) ? '&cmin=' . rawurlencode($_GET['cmin']) : '') - . (!empty($_GET['cmax']) ? '&cmax=' . rawurlencode($_GET['cmax']) : '') - . (!empty($_GET['file']) ? '&file=' . rawurlencode($_GET['file']) : '') + . (!empty($_GET['search']) ? '&search=' . rawurlencode($_GET['search']) : '') + . (!empty($_GET['star']) ? '&star=' . rawurlencode($_GET['star']) : '') + . (!empty($_GET['order']) ? '&order=' . rawurlencode($_GET['order']) : '') + . (!empty($_GET['bmark']) ? '&bmark=' . rawurlencode($_GET['bmark']) : '') + . (!empty($_GET['liked']) ? '&liked=' . rawurlencode($_GET['liked']) : '') + . (!empty($_GET['conv']) ? '&conv=' . rawurlencode($_GET['conv']) : '') + . (!empty($_GET['nets']) ? '&nets=' . rawurlencode($_GET['nets']) : '') + . (!empty($_GET['cmin']) ? '&cmin=' . rawurlencode($_GET['cmin']) : '') + . (!empty($_GET['cmax']) ? '&cmax=' . rawurlencode($_GET['cmax']) : '') + . (!empty($_GET['file']) ? '&file=' . rawurlencode($_GET['file']) : '') . "'; \r\n"; } From f60c8225a6b66d9148378aaf74969bf462bae7b9 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 25 Sep 2021 18:40:11 +0000 Subject: [PATCH 10/54] Change code style rules --- .php_cs.dist | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.php_cs.dist b/.php_cs.dist index 1d16a11ef..037c4dd59 100644 --- a/.php_cs.dist +++ b/.php_cs.dist @@ -33,6 +33,9 @@ return $config 'operators' => [ '=>' => 'align_single_space_minimal', '=' => 'align_single_space_minimal', + '.' => 'align_single_space_minimal', + '?' => 'align_single_space_minimal', + ':' => 'align_single_space_minimal', ], ], 'blank_line_after_namespace' => true, From 6983f257c8edbf140df71091bbe1a3dcc2569657 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 25 Sep 2021 18:45:32 +0000 Subject: [PATCH 11/54] Updated messages.po --- view/lang/C/messages.po | 176 ++++++++++++++++++++-------------------- 1 file changed, 88 insertions(+), 88 deletions(-) diff --git a/view/lang/C/messages.po b/view/lang/C/messages.po index fbf305823..9f92d9f42 100644 --- a/view/lang/C/messages.po +++ b/view/lang/C/messages.po @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: 2021.09-rc\n" +"Project-Id-Version: 2021.12-dev\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-23 21:34+0000\n" +"POT-Creation-Date: 2021-09-25 18:44+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -334,7 +334,7 @@ msgid "Permission denied." msgstr "" #: mod/cal.php:44 mod/cal.php:48 mod/follow.php:39 mod/redir.php:34 -#: mod/redir.php:175 src/Module/Conversation/Community.php:183 +#: mod/redir.php:175 src/Module/Conversation/Community.php:182 #: src/Module/Debug/ItemBody.php:37 src/Module/Diaspora/Receive.php:51 #: src/Module/Item/Follow.php:42 src/Module/Item/Ignore.php:41 #: src/Module/Item/Pin.php:42 src/Module/Item/Pin.php:57 @@ -420,7 +420,7 @@ msgid "calendar" msgstr "" #: mod/display.php:165 mod/photos.php:828 mod/videos.php:115 -#: src/Module/Conversation/Community.php:177 src/Module/Debug/Probe.php:39 +#: src/Module/Conversation/Community.php:176 src/Module/Debug/Probe.php:39 #: src/Module/Debug/WebFinger.php:38 src/Module/Directory.php:49 #: src/Module/Search/Index.php:50 src/Module/Search/Index.php:55 msgid "Public access denied." @@ -447,25 +447,25 @@ msgstr "" msgid "Save" msgstr "" -#: mod/editpost.php:92 mod/photos.php:1375 src/Content/Conversation.php:328 +#: mod/editpost.php:92 mod/photos.php:1375 src/Content/Conversation.php:326 #: src/Module/Contact/Poke.php:157 src/Object/Post.php:964 msgid "Loading..." msgstr "" #: mod/editpost.php:93 mod/message.php:201 mod/message.php:365 -#: mod/wallmessage.php:153 src/Content/Conversation.php:329 +#: mod/wallmessage.php:153 src/Content/Conversation.php:327 msgid "Upload photo" msgstr "" -#: mod/editpost.php:94 src/Content/Conversation.php:330 +#: mod/editpost.php:94 src/Content/Conversation.php:328 msgid "upload photo" msgstr "" -#: mod/editpost.php:95 src/Content/Conversation.php:331 +#: mod/editpost.php:95 src/Content/Conversation.php:329 msgid "Attach file" msgstr "" -#: mod/editpost.php:96 src/Content/Conversation.php:332 +#: mod/editpost.php:96 src/Content/Conversation.php:330 msgid "attach file" msgstr "" @@ -494,31 +494,31 @@ msgstr "" msgid "audio link" msgstr "" -#: mod/editpost.php:103 src/Content/Conversation.php:342 +#: mod/editpost.php:103 src/Content/Conversation.php:340 #: src/Module/Item/Compose.php:161 msgid "Set your location" msgstr "" -#: mod/editpost.php:104 src/Content/Conversation.php:343 +#: mod/editpost.php:104 src/Content/Conversation.php:341 msgid "set location" msgstr "" -#: mod/editpost.php:105 src/Content/Conversation.php:344 +#: mod/editpost.php:105 src/Content/Conversation.php:342 msgid "Clear browser location" msgstr "" -#: mod/editpost.php:106 src/Content/Conversation.php:345 +#: mod/editpost.php:106 src/Content/Conversation.php:343 msgid "clear location" msgstr "" #: mod/editpost.php:107 mod/message.php:203 mod/message.php:368 -#: mod/photos.php:1526 mod/wallmessage.php:155 src/Content/Conversation.php:357 -#: src/Content/Conversation.php:692 src/Module/Item/Compose.php:165 +#: mod/photos.php:1526 mod/wallmessage.php:155 src/Content/Conversation.php:355 +#: src/Content/Conversation.php:689 src/Module/Item/Compose.php:165 #: src/Object/Post.php:502 msgid "Please wait" msgstr "" -#: mod/editpost.php:108 src/Content/Conversation.php:358 +#: mod/editpost.php:108 src/Content/Conversation.php:356 msgid "Permission settings" msgstr "" @@ -526,16 +526,16 @@ msgstr "" msgid "CC: email addresses" msgstr "" -#: mod/editpost.php:117 src/Content/Conversation.php:368 +#: mod/editpost.php:117 src/Content/Conversation.php:366 msgid "Public post" msgstr "" -#: mod/editpost.php:120 src/Content/Conversation.php:347 +#: mod/editpost.php:120 src/Content/Conversation.php:345 #: src/Module/Item/Compose.php:166 msgid "Set title" msgstr "" -#: mod/editpost.php:122 src/Content/Conversation.php:349 +#: mod/editpost.php:122 src/Content/Conversation.php:347 #: src/Module/Item/Compose.php:167 msgid "Categories (comma-separated list)" msgstr "" @@ -545,34 +545,34 @@ msgid "Example: bob@example.com, mary@example.com" msgstr "" #: mod/editpost.php:128 mod/events.php:578 mod/photos.php:1374 -#: mod/photos.php:1430 mod/photos.php:1504 src/Content/Conversation.php:372 +#: mod/photos.php:1430 mod/photos.php:1504 src/Content/Conversation.php:370 #: src/Module/Item/Compose.php:160 src/Object/Post.php:974 msgid "Preview" msgstr "" #: mod/editpost.php:130 mod/fbrowser.php:105 mod/fbrowser.php:134 #: mod/follow.php:144 mod/photos.php:1029 mod/photos.php:1136 mod/tagrm.php:37 -#: mod/tagrm.php:129 mod/unfollow.php:97 src/Content/Conversation.php:375 +#: mod/tagrm.php:129 mod/unfollow.php:97 src/Content/Conversation.php:373 #: src/Module/Contact.php:443 src/Module/RemoteFollow.php:116 msgid "Cancel" msgstr "" -#: mod/editpost.php:134 src/Content/Conversation.php:382 +#: mod/editpost.php:134 src/Content/Conversation.php:380 #: src/Content/Widget/VCard.php:107 src/Model/Profile.php:459 msgid "Message" msgstr "" -#: mod/editpost.php:135 src/Content/Conversation.php:383 +#: mod/editpost.php:135 src/Content/Conversation.php:381 #: src/Module/Settings/TwoFactor/Trusted.php:101 msgid "Browser" msgstr "" #: mod/editpost.php:136 mod/events.php:583 mod/photos.php:965 -#: mod/photos.php:1328 src/Content/Conversation.php:359 +#: mod/photos.php:1328 src/Content/Conversation.php:357 msgid "Permissions" msgstr "" -#: mod/editpost.php:138 src/Content/Conversation.php:385 +#: mod/editpost.php:138 src/Content/Conversation.php:383 msgid "Open Compose page" msgstr "" @@ -1326,11 +1326,11 @@ msgstr "" msgid "Comment" msgstr "" -#: mod/photos.php:1461 src/Content/Conversation.php:618 src/Object/Post.php:227 +#: mod/photos.php:1461 src/Content/Conversation.php:615 src/Object/Post.php:227 msgid "Select" msgstr "" -#: mod/photos.php:1462 mod/settings.php:573 src/Content/Conversation.php:619 +#: mod/photos.php:1462 mod/settings.php:573 src/Content/Conversation.php:616 #: src/Module/Admin/Users/Active.php:139 src/Module/Admin/Users/Blocked.php:140 #: src/Module/Admin/Users/Index.php:153 src/Module/Contact.php:865 #: src/Module/Contact.php:1150 @@ -2621,264 +2621,264 @@ msgstr "" msgid "%s (via %s)" msgstr "" -#: src/Content/Conversation.php:209 +#: src/Content/Conversation.php:207 #, php-format msgid "%s likes this." msgstr "" -#: src/Content/Conversation.php:212 +#: src/Content/Conversation.php:210 #, php-format msgid "%s doesn't like this." msgstr "" -#: src/Content/Conversation.php:215 +#: src/Content/Conversation.php:213 #, php-format msgid "%s attends." msgstr "" -#: src/Content/Conversation.php:218 +#: src/Content/Conversation.php:216 #, php-format msgid "%s doesn't attend." msgstr "" -#: src/Content/Conversation.php:221 +#: src/Content/Conversation.php:219 #, php-format msgid "%s attends maybe." msgstr "" -#: src/Content/Conversation.php:224 src/Content/Conversation.php:262 -#: src/Content/Conversation.php:849 +#: src/Content/Conversation.php:222 src/Content/Conversation.php:260 +#: src/Content/Conversation.php:848 #, php-format msgid "%s reshared this." msgstr "" -#: src/Content/Conversation.php:230 +#: src/Content/Conversation.php:228 msgid "and" msgstr "" -#: src/Content/Conversation.php:233 +#: src/Content/Conversation.php:231 #, php-format msgid "and %d other people" msgstr "" -#: src/Content/Conversation.php:241 +#: src/Content/Conversation.php:239 #, php-format msgid "%2$d people like this" msgstr "" -#: src/Content/Conversation.php:242 +#: src/Content/Conversation.php:240 #, php-format msgid "%s like this." msgstr "" -#: src/Content/Conversation.php:245 +#: src/Content/Conversation.php:243 #, php-format msgid "%2$d people don't like this" msgstr "" -#: src/Content/Conversation.php:246 +#: src/Content/Conversation.php:244 #, php-format msgid "%s don't like this." msgstr "" -#: src/Content/Conversation.php:249 +#: src/Content/Conversation.php:247 #, php-format msgid "%2$d people attend" msgstr "" -#: src/Content/Conversation.php:250 +#: src/Content/Conversation.php:248 #, php-format msgid "%s attend." msgstr "" -#: src/Content/Conversation.php:253 +#: src/Content/Conversation.php:251 #, php-format msgid "%2$d people don't attend" msgstr "" -#: src/Content/Conversation.php:254 +#: src/Content/Conversation.php:252 #, php-format msgid "%s don't attend." msgstr "" -#: src/Content/Conversation.php:257 +#: src/Content/Conversation.php:255 #, php-format msgid "%2$d people attend maybe" msgstr "" -#: src/Content/Conversation.php:258 +#: src/Content/Conversation.php:256 #, php-format msgid "%s attend maybe." msgstr "" -#: src/Content/Conversation.php:261 +#: src/Content/Conversation.php:259 #, php-format msgid "%2$d people reshared this" msgstr "" -#: src/Content/Conversation.php:309 +#: src/Content/Conversation.php:307 msgid "Visible to everybody" msgstr "" -#: src/Content/Conversation.php:310 src/Module/Item/Compose.php:159 +#: src/Content/Conversation.php:308 src/Module/Item/Compose.php:159 #: src/Object/Post.php:973 msgid "Please enter a image/video/audio/webpage URL:" msgstr "" -#: src/Content/Conversation.php:311 +#: src/Content/Conversation.php:309 msgid "Tag term:" msgstr "" -#: src/Content/Conversation.php:312 src/Module/Filer/SaveTag.php:68 +#: src/Content/Conversation.php:310 src/Module/Filer/SaveTag.php:68 msgid "Save to Folder:" msgstr "" -#: src/Content/Conversation.php:313 +#: src/Content/Conversation.php:311 msgid "Where are you right now?" msgstr "" -#: src/Content/Conversation.php:314 +#: src/Content/Conversation.php:312 msgid "Delete item(s)?" msgstr "" -#: src/Content/Conversation.php:324 +#: src/Content/Conversation.php:322 msgid "New Post" msgstr "" -#: src/Content/Conversation.php:327 +#: src/Content/Conversation.php:325 msgid "Share" msgstr "" -#: src/Content/Conversation.php:333 src/Module/Item/Compose.php:151 +#: src/Content/Conversation.php:331 src/Module/Item/Compose.php:151 #: src/Object/Post.php:965 msgid "Bold" msgstr "" -#: src/Content/Conversation.php:334 src/Module/Item/Compose.php:152 +#: src/Content/Conversation.php:332 src/Module/Item/Compose.php:152 #: src/Object/Post.php:966 msgid "Italic" msgstr "" -#: src/Content/Conversation.php:335 src/Module/Item/Compose.php:153 +#: src/Content/Conversation.php:333 src/Module/Item/Compose.php:153 #: src/Object/Post.php:967 msgid "Underline" msgstr "" -#: src/Content/Conversation.php:336 src/Module/Item/Compose.php:154 +#: src/Content/Conversation.php:334 src/Module/Item/Compose.php:154 #: src/Object/Post.php:968 msgid "Quote" msgstr "" -#: src/Content/Conversation.php:337 src/Module/Item/Compose.php:155 +#: src/Content/Conversation.php:335 src/Module/Item/Compose.php:155 #: src/Object/Post.php:969 msgid "Code" msgstr "" -#: src/Content/Conversation.php:338 src/Module/Item/Compose.php:156 +#: src/Content/Conversation.php:336 src/Module/Item/Compose.php:156 #: src/Object/Post.php:970 msgid "Image" msgstr "" -#: src/Content/Conversation.php:339 src/Module/Item/Compose.php:157 +#: src/Content/Conversation.php:337 src/Module/Item/Compose.php:157 #: src/Object/Post.php:971 msgid "Link" msgstr "" -#: src/Content/Conversation.php:340 src/Module/Item/Compose.php:158 +#: src/Content/Conversation.php:338 src/Module/Item/Compose.php:158 #: src/Object/Post.php:972 msgid "Link or Media" msgstr "" -#: src/Content/Conversation.php:341 +#: src/Content/Conversation.php:339 msgid "Video" msgstr "" -#: src/Content/Conversation.php:354 src/Module/Item/Compose.php:172 +#: src/Content/Conversation.php:352 src/Module/Item/Compose.php:172 msgid "Scheduled at" msgstr "" -#: src/Content/Conversation.php:654 src/Object/Post.php:454 +#: src/Content/Conversation.php:651 src/Object/Post.php:454 #: src/Object/Post.php:455 #, php-format msgid "View %s's profile @ %s" msgstr "" -#: src/Content/Conversation.php:667 src/Object/Post.php:442 +#: src/Content/Conversation.php:664 src/Object/Post.php:442 msgid "Categories:" msgstr "" -#: src/Content/Conversation.php:668 src/Object/Post.php:443 +#: src/Content/Conversation.php:665 src/Object/Post.php:443 msgid "Filed under:" msgstr "" -#: src/Content/Conversation.php:675 src/Object/Post.php:468 +#: src/Content/Conversation.php:672 src/Object/Post.php:468 #, php-format msgid "%s from %s" msgstr "" -#: src/Content/Conversation.php:690 +#: src/Content/Conversation.php:687 msgid "View in context" msgstr "" -#: src/Content/Conversation.php:756 +#: src/Content/Conversation.php:752 msgid "remove" msgstr "" -#: src/Content/Conversation.php:760 +#: src/Content/Conversation.php:756 msgid "Delete Selected Items" msgstr "" -#: src/Content/Conversation.php:821 src/Content/Conversation.php:824 -#: src/Content/Conversation.php:827 src/Content/Conversation.php:830 +#: src/Content/Conversation.php:820 src/Content/Conversation.php:823 +#: src/Content/Conversation.php:826 src/Content/Conversation.php:829 #, php-format msgid "You had been addressed (%s)." msgstr "" -#: src/Content/Conversation.php:833 +#: src/Content/Conversation.php:832 #, php-format msgid "You are following %s." msgstr "" -#: src/Content/Conversation.php:836 +#: src/Content/Conversation.php:835 msgid "Tagged" msgstr "" -#: src/Content/Conversation.php:851 +#: src/Content/Conversation.php:850 msgid "Reshared" msgstr "" -#: src/Content/Conversation.php:851 +#: src/Content/Conversation.php:850 #, php-format msgid "Reshared by %s <%s>" msgstr "" -#: src/Content/Conversation.php:854 +#: src/Content/Conversation.php:853 #, php-format msgid "%s is participating in this thread." msgstr "" -#: src/Content/Conversation.php:857 +#: src/Content/Conversation.php:856 msgid "Stored" msgstr "" -#: src/Content/Conversation.php:860 +#: src/Content/Conversation.php:859 msgid "Global" msgstr "" -#: src/Content/Conversation.php:863 +#: src/Content/Conversation.php:862 msgid "Relayed" msgstr "" -#: src/Content/Conversation.php:863 +#: src/Content/Conversation.php:862 #, php-format msgid "Relayed by %s <%s>" msgstr "" -#: src/Content/Conversation.php:866 +#: src/Content/Conversation.php:865 msgid "Fetched" msgstr "" -#: src/Content/Conversation.php:866 +#: src/Content/Conversation.php:865 #, php-format msgid "Fetched because of %s <%s>" msgstr "" @@ -7758,17 +7758,17 @@ msgstr "" msgid "No results." msgstr "" -#: src/Module/Conversation/Community.php:163 +#: src/Module/Conversation/Community.php:162 msgid "" "This community stream shows all public posts received by this node. They may " "not reflect the opinions of this node’s users." msgstr "" -#: src/Module/Conversation/Community.php:201 +#: src/Module/Conversation/Community.php:200 msgid "Community option not available." msgstr "" -#: src/Module/Conversation/Community.php:217 +#: src/Module/Conversation/Community.php:216 msgid "Not available." msgstr "" From 9369b026131597d4b74d957dd0128d00421c4255 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 25 Sep 2021 18:50:22 +0000 Subject: [PATCH 12/54] testing one operator less .. --- .php_cs.dist | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.php_cs.dist b/.php_cs.dist index 037c4dd59..42031dc5c 100644 --- a/.php_cs.dist +++ b/.php_cs.dist @@ -33,9 +33,8 @@ return $config 'operators' => [ '=>' => 'align_single_space_minimal', '=' => 'align_single_space_minimal', - '.' => 'align_single_space_minimal', '?' => 'align_single_space_minimal', - ':' => 'align_single_space_minimal', + ':' => 'align_single_space_minimal', ], ], 'blank_line_after_namespace' => true, From 8e979b4c9e69c8924e8d3337cd892fa2a24badd7 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 25 Sep 2021 18:53:35 +0000 Subject: [PATCH 13/54] And another operator ... --- .php_cs.dist | 1 - 1 file changed, 1 deletion(-) diff --git a/.php_cs.dist b/.php_cs.dist index 42031dc5c..135827c9c 100644 --- a/.php_cs.dist +++ b/.php_cs.dist @@ -33,7 +33,6 @@ return $config 'operators' => [ '=>' => 'align_single_space_minimal', '=' => 'align_single_space_minimal', - '?' => 'align_single_space_minimal', ':' => 'align_single_space_minimal', ], ], From 6836b1ea78270f3d29a43f92b0d204e0ef1f7ac2 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Wed, 22 Sep 2021 22:37:33 -0400 Subject: [PATCH 14/54] Limit /redir links to private posts - This allows to share public post links with anonymous users --- include/conversation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/conversation.php b/include/conversation.php index 507add97d..33a7ea5dd 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -177,7 +177,7 @@ function localize_item(&$item) // add sparkle links to appropriate permalinks // Only create a redirection to a magic link when logged in - if (!empty($item['plink']) && Session::isAuthenticated()) { + if (!empty($item['plink']) && Session::isAuthenticated() && $item['private'] == Item::PRIVATE) { $author = ['uid' => 0, 'id' => $item['author-id'], 'network' => $item['author-network'], 'url' => $item['author-link']]; $item['plink'] = Contact::magicLinkByContact($author, $item['plink']); From 49f9ac0e77354765229cbe8f900c2919a6ca233b Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 26 Sep 2021 03:54:54 +0000 Subject: [PATCH 15/54] Testing cs --- .php_cs.dist | 1 + 1 file changed, 1 insertion(+) diff --git a/.php_cs.dist b/.php_cs.dist index 135827c9c..d944bbedf 100644 --- a/.php_cs.dist +++ b/.php_cs.dist @@ -66,6 +66,7 @@ return $config 'single_import_per_statement' => true, 'single_line_after_imports' => true, 'switch_case_space' => true, + 'ternary_operator_spaces' => false, 'visibility_required' => [ 'elements' => ['property', 'method'] ], From 24078ad5f093f09ddf8a8583c2422e90ca728a80 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 26 Sep 2021 03:59:15 +0000 Subject: [PATCH 16/54] Testing cs ... --- .php_cs.dist | 1 - 1 file changed, 1 deletion(-) diff --git a/.php_cs.dist b/.php_cs.dist index d944bbedf..de2ff4ef1 100644 --- a/.php_cs.dist +++ b/.php_cs.dist @@ -33,7 +33,6 @@ return $config 'operators' => [ '=>' => 'align_single_space_minimal', '=' => 'align_single_space_minimal', - ':' => 'align_single_space_minimal', ], ], 'blank_line_after_namespace' => true, From 171cbf0512ee7508f5b2f37f06952313a326b186 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 26 Sep 2021 04:05:46 +0000 Subject: [PATCH 17/54] Removed spaces --- src/Content/Conversation.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Content/Conversation.php b/src/Content/Conversation.php index 879e47c24..8b7ba256f 100644 --- a/src/Content/Conversation.php +++ b/src/Content/Conversation.php @@ -285,15 +285,15 @@ class Conversation $this->profiler->startRecording('rendering'); $o = ''; - $x['allow_location'] = $x['allow_location'] ?? $user['allow_location']; + $x['allow_location'] = $x['allow_location'] ?? $user['allow_location']; $x['default_location'] = $x['default_location'] ?? $user['default-location']; - $x['nickname'] = $x['nickname'] ?? $user['nickname']; - $x['lockstate'] = $x['lockstate'] ?? ACL::getLockstateForUserId($user['uid']) ? 'lock' : 'unlock'; - $x['acl'] = $x['acl'] ?? ACL::getFullSelectorHTML($this->page, $user['uid'], true); - $x['bang'] = $x['bang'] ?? ''; - $x['visitor'] = $x['visitor'] ?? 'block'; - $x['is_owner'] = $x['is_owner'] ?? true; - $x['profile_uid'] = $x['profile_uid'] ?? local_user(); + $x['nickname'] = $x['nickname'] ?? $user['nickname']; + $x['lockstate'] = $x['lockstate'] ?? ACL::getLockstateForUserId($user['uid']) ? 'lock' : 'unlock'; + $x['acl'] = $x['acl'] ?? ACL::getFullSelectorHTML($this->page, $user['uid'], true); + $x['bang'] = $x['bang'] ?? ''; + $x['visitor'] = $x['visitor'] ?? 'block'; + $x['is_owner'] = $x['is_owner'] ?? true; + $x['profile_uid'] = $x['profile_uid'] ?? local_user(); $geotag = !empty($x['allow_location']) ? Renderer::replaceMacros(Renderer::getMarkupTemplate('jot_geotag.tpl'), []) : ''; From 1e583b4f3500b53649cfd73e49e2072542e2b419 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 26 Sep 2021 04:07:02 +0000 Subject: [PATCH 18/54] Space removed --- src/Content/Conversation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Content/Conversation.php b/src/Content/Conversation.php index 8b7ba256f..0d6a04298 100644 --- a/src/Content/Conversation.php +++ b/src/Content/Conversation.php @@ -285,7 +285,7 @@ class Conversation $this->profiler->startRecording('rendering'); $o = ''; - $x['allow_location'] = $x['allow_location'] ?? $user['allow_location']; + $x['allow_location'] = $x['allow_location'] ?? $user['allow_location']; $x['default_location'] = $x['default_location'] ?? $user['default-location']; $x['nickname'] = $x['nickname'] ?? $user['nickname']; $x['lockstate'] = $x['lockstate'] ?? ACL::getLockstateForUserId($user['uid']) ? 'lock' : 'unlock'; From e08c5ca2e07b0bfe70aa66cbc64e6bfb90e6ad7c Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 26 Sep 2021 04:16:21 +0000 Subject: [PATCH 19/54] Another try ... --- .php_cs.dist | 1 + src/Content/Conversation.php | 16 ++++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.php_cs.dist b/.php_cs.dist index de2ff4ef1..897c6f110 100644 --- a/.php_cs.dist +++ b/.php_cs.dist @@ -33,6 +33,7 @@ return $config 'operators' => [ '=>' => 'align_single_space_minimal', '=' => 'align_single_space_minimal', + '??' => 'align_single_space_minimal', ], ], 'blank_line_after_namespace' => true, diff --git a/src/Content/Conversation.php b/src/Content/Conversation.php index 0d6a04298..879e47c24 100644 --- a/src/Content/Conversation.php +++ b/src/Content/Conversation.php @@ -285,15 +285,15 @@ class Conversation $this->profiler->startRecording('rendering'); $o = ''; - $x['allow_location'] = $x['allow_location'] ?? $user['allow_location']; + $x['allow_location'] = $x['allow_location'] ?? $user['allow_location']; $x['default_location'] = $x['default_location'] ?? $user['default-location']; - $x['nickname'] = $x['nickname'] ?? $user['nickname']; - $x['lockstate'] = $x['lockstate'] ?? ACL::getLockstateForUserId($user['uid']) ? 'lock' : 'unlock'; - $x['acl'] = $x['acl'] ?? ACL::getFullSelectorHTML($this->page, $user['uid'], true); - $x['bang'] = $x['bang'] ?? ''; - $x['visitor'] = $x['visitor'] ?? 'block'; - $x['is_owner'] = $x['is_owner'] ?? true; - $x['profile_uid'] = $x['profile_uid'] ?? local_user(); + $x['nickname'] = $x['nickname'] ?? $user['nickname']; + $x['lockstate'] = $x['lockstate'] ?? ACL::getLockstateForUserId($user['uid']) ? 'lock' : 'unlock'; + $x['acl'] = $x['acl'] ?? ACL::getFullSelectorHTML($this->page, $user['uid'], true); + $x['bang'] = $x['bang'] ?? ''; + $x['visitor'] = $x['visitor'] ?? 'block'; + $x['is_owner'] = $x['is_owner'] ?? true; + $x['profile_uid'] = $x['profile_uid'] ?? local_user(); $geotag = !empty($x['allow_location']) ? Renderer::replaceMacros(Renderer::getMarkupTemplate('jot_geotag.tpl'), []) : ''; From 9d7795824765af61733e8e3a7022cad7404eb57b Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 25 Sep 2021 20:42:51 -0400 Subject: [PATCH 20/54] Ensure parent exists before adding reply to elements in OStatus and Feed - Address https://github.com/friendica/friendica/issues/10474#issuecomment-927118628 --- src/Protocol/Feed.php | 36 ++++++++++++++++++++---------------- src/Protocol/OStatus.php | 34 +++++++++++++++++++--------------- 2 files changed, 39 insertions(+), 31 deletions(-) diff --git a/src/Protocol/Feed.php b/src/Protocol/Feed.php index 06e70dba9..a32b460d5 100644 --- a/src/Protocol/Feed.php +++ b/src/Protocol/Feed.php @@ -1146,27 +1146,31 @@ class Feed if ($item['gravity'] != GRAVITY_PARENT) { $parent = Post::selectFirst(['guid', 'author-link', 'owner-link'], ['id' => $item['parent']]); - $thrparent = Post::selectFirst(['guid', 'author-link', 'owner-link', 'plink'], ['uid' => $owner["uid"], 'uri' => $item['thr-parent']]); + $thrparent = Post::selectFirst(['guid', 'author-link', 'owner-link', 'plink'], ['uid' => $owner['uid'], 'uri' => $item['thr-parent']]); if (DBA::isResult($thrparent)) { - $mentioned[$thrparent["author-link"]] = $thrparent["author-link"]; - $mentioned[$thrparent["owner-link"]] = $thrparent["owner-link"]; - $parent_plink = $thrparent["plink"]; + $mentioned[$thrparent['author-link']] = $thrparent['author-link']; + $mentioned[$thrparent['owner-link']] = $thrparent['owner-link']; + $parent_plink = $thrparent['plink']; + } elseif (DBA::isResult($parent)) { + $mentioned[$parent['author-link']] = $parent['author-link']; + $mentioned[$parent['owner-link']] = $parent['owner-link']; + $parent_plink = DI::baseUrl() . '/display/' . $parent['guid']; } else { - $mentioned[$parent["author-link"]] = $parent["author-link"]; - $mentioned[$parent["owner-link"]] = $parent["owner-link"]; - $parent_plink = DI::baseUrl()."/display/".$parent["guid"]; + DI::logger()->notice('Missing parent and thr-parent for child item', ['item' => $item]); } - $attributes = [ - "ref" => $item['thr-parent'], - "href" => $parent_plink]; - XML::addElement($doc, $entry, "thr:in-reply-to", "", $attributes); + if (isset($parent_plink)) { + $attributes = [ + 'ref' => $item['thr-parent'], + 'href' => $parent_plink]; + XML::addElement($doc, $entry, 'thr:in-reply-to', '', $attributes); - $attributes = [ - "rel" => "related", - "href" => $parent_plink]; - XML::addElement($doc, $entry, "link", "", $attributes); + $attributes = [ + 'rel' => 'related', + 'href' => $parent_plink]; + XML::addElement($doc, $entry, 'link', '', $attributes); + } } // uri-id isn't present for follow entry pseudo-items @@ -1177,7 +1181,7 @@ class Feed foreach ($tags as $tag) { if ($tag['type'] == Tag::HASHTAG) { - XML::addElement($doc, $entry, "category", "", ["term" => $tag['name']]); + XML::addElement($doc, $entry, 'category', '', ['term' => $tag['name']]); } } diff --git a/src/Protocol/OStatus.php b/src/Protocol/OStatus.php index 82dc17679..5b1f758b2 100644 --- a/src/Protocol/OStatus.php +++ b/src/Protocol/OStatus.php @@ -1931,27 +1931,31 @@ class OStatus if ($item['gravity'] != GRAVITY_PARENT) { $parent = Post::selectFirst(['guid', 'author-link', 'owner-link'], ['id' => $item['parent']]); - $thrparent = Post::selectFirst(['guid', 'author-link', 'owner-link', 'plink'], ['uid' => $owner["uid"], 'uri' => $item['thr-parent']]); + $thrparent = Post::selectFirst(['guid', 'author-link', 'owner-link', 'plink'], ['uid' => $owner['uid'], 'uri' => $item['thr-parent']]); if (DBA::isResult($thrparent)) { - $mentioned[$thrparent["author-link"]] = $thrparent["author-link"]; - $mentioned[$thrparent["owner-link"]] = $thrparent["owner-link"]; - $parent_plink = $thrparent["plink"]; + $mentioned[$thrparent['author-link']] = $thrparent['author-link']; + $mentioned[$thrparent['owner-link']] = $thrparent['owner-link']; + $parent_plink = $thrparent['plink']; + } elseif (DBA::isResult($parent)) { + $mentioned[$parent['author-link']] = $parent['author-link']; + $mentioned[$parent['owner-link']] = $parent['owner-link']; + $parent_plink = DI::baseUrl() . '/display/' . $parent['guid']; } else { - $mentioned[$parent["author-link"]] = $parent["author-link"]; - $mentioned[$parent["owner-link"]] = $parent["owner-link"]; - $parent_plink = DI::baseUrl()."/display/".$parent["guid"]; + DI::logger()->notice('Missing parent and thr-parent for child item', ['item' => $item]); } - $attributes = [ - "ref" => $item['thr-parent'], - "href" => $parent_plink]; - XML::addElement($doc, $entry, "thr:in-reply-to", "", $attributes); + if (isset($parent_plink)) { + $attributes = [ + 'ref' => $item['thr-parent'], + 'href' => $parent_plink]; + XML::addElement($doc, $entry, 'thr:in-reply-to', '', $attributes); - $attributes = [ - "rel" => "related", - "href" => $parent_plink]; - XML::addElement($doc, $entry, "link", "", $attributes); + $attributes = [ + 'rel' => 'related', + 'href' => $parent_plink]; + XML::addElement($doc, $entry, 'link', '', $attributes); + } } if (intval($item['parent']) > 0) { From 0bb169b4edc09a99d14fa9105412c114b1bcc6f6 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 25 Sep 2021 20:45:53 -0400 Subject: [PATCH 21/54] Check for reply existence before using its values in Model\Mail - Address https://github.com/friendica/friendica/issues/10474#issuecomment-925263894 --- src/Model/Mail.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Model/Mail.php b/src/Model/Mail.php index 7eaeb09b5..75515c5df 100644 --- a/src/Model/Mail.php +++ b/src/Model/Mail.php @@ -74,9 +74,7 @@ class Mail return false; } - if ($msg['reply']) { - $reply = DBA::selectFirst('mail', ['uri', 'uri-id'], ['parent-uri' => $msg['parent-uri'], 'reply' => false]); - + if ($msg['reply'] && DBA::isResult($reply = DBA::selectFirst('mail', ['uri', 'uri-id'], ['parent-uri' => $msg['parent-uri'], 'reply' => false]))) { $msg['thr-parent'] = $reply['uri']; $msg['thr-parent-id'] = $reply['uri-id']; } else { From 1bb25de287cf9a794f733d6ae140fd745c10eb6b Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 26 Sep 2021 12:17:30 +0000 Subject: [PATCH 22/54] Applied change from PR #10763 --- src/Content/Item.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Content/Item.php b/src/Content/Item.php index a59f1294e..91bf79f17 100644 --- a/src/Content/Item.php +++ b/src/Content/Item.php @@ -372,7 +372,7 @@ class Item // add sparkle links to appropriate permalinks // Only create a redirection to a magic link when logged in - if (!empty($item['plink']) && Session::isAuthenticated()) { + if (!empty($item['plink']) && Session::isAuthenticated() && $item['private'] == ModelItem::PRIVATE) { $author = ['uid' => 0, 'id' => $item['author-id'], 'network' => $item['author-network'], 'url' => $item['author-link']]; $item['plink'] = Contact::magicLinkByContact($author, $item['plink']); From f26226229a45af4053055b8a5ea7aa0f7aa33e0c Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 26 Sep 2021 17:13:26 +0000 Subject: [PATCH 23/54] Issue 10768: Avoid MySQL problems when upgrading both index and structure --- src/Database/DBStructure.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Database/DBStructure.php b/src/Database/DBStructure.php index d7f1179d0..f652272a4 100644 --- a/src/Database/DBStructure.php +++ b/src/Database/DBStructure.php @@ -673,6 +673,11 @@ class DBStructure $current_field_definition = DBA::cleanQuery(implode(",", $field_definition)); $new_field_definition = DBA::cleanQuery(implode(",", $parameters)); if ($current_field_definition != $new_field_definition) { + // When the field structure changes then we will not perform the special index handling for MySQL. + // See issue #10768 + $is_unique = false; + $temp_name = $name; + $sql2 = self::modifyTableField($fieldname, $parameters); if ($sql3 == "") { $sql3 = "ALTER" . $ignore . " TABLE `" . $temp_name . "` " . $sql2; From e4b8536c750378102436a893830b2b2cb4ccb520 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 26 Sep 2021 18:30:44 +0000 Subject: [PATCH 24/54] Removing MySQL workaround --- src/Database/DBStructure.php | 146 +++-------------------------------- 1 file changed, 10 insertions(+), 136 deletions(-) diff --git a/src/Database/DBStructure.php b/src/Database/DBStructure.php index f652272a4..02a29b404 100644 --- a/src/Database/DBStructure.php +++ b/src/Database/DBStructure.php @@ -593,10 +593,7 @@ class DBStructure // Compare it foreach ($definition AS $name => $structure) { $is_new_table = false; - $group_by = ""; $sql3 = ""; - $is_unique = false; - $temp_name = $name; if (!isset($database[$name])) { $r = self::createTable($name, $structure, $verbose, $action); if (!DBA::isResult($r)) { @@ -604,23 +601,6 @@ class DBStructure } $is_new_table = true; } else { - foreach ($structure["indexes"] AS $indexname => $fieldnames) { - if (isset($database[$name]["indexes"][$indexname])) { - $current_index_definition = implode(",", $database[$name]["indexes"][$indexname]); - } else { - $current_index_definition = "__NOT_SET__"; - } - $new_index_definition = implode(",", $fieldnames); - if ($current_index_definition != $new_index_definition) { - if ($fieldnames[0] == "UNIQUE") { - $is_unique = true; - if ($ignore == "") { - $temp_name = "temp-" . $name; - } - } - } - } - /* * Drop the index if it isn't present in the definition * or the definition differ from current status @@ -636,7 +616,7 @@ class DBStructure if ($current_index_definition != $new_index_definition && substr($indexname, 0, 6) != 'local_') { $sql2 = self::dropIndex($indexname); if ($sql3 == "") { - $sql3 = "ALTER" . $ignore . " TABLE `" . $temp_name . "` " . $sql2; + $sql3 = "ALTER" . $ignore . " TABLE `" . $name . "` " . $sql2; } else { $sql3 .= ", " . $sql2; } @@ -647,7 +627,7 @@ class DBStructure if (!isset($database[$name]["fields"][$fieldname])) { $sql2 = self::addTableField($fieldname, $parameters); if ($sql3 == "") { - $sql3 = "ALTER" . $ignore . " TABLE `" . $temp_name . "` " . $sql2; + $sql3 = "ALTER" . $ignore . " TABLE `" . $name . "` " . $sql2; } else { $sql3 .= ", " . $sql2; } @@ -673,14 +653,9 @@ class DBStructure $current_field_definition = DBA::cleanQuery(implode(",", $field_definition)); $new_field_definition = DBA::cleanQuery(implode(",", $parameters)); if ($current_field_definition != $new_field_definition) { - // When the field structure changes then we will not perform the special index handling for MySQL. - // See issue #10768 - $is_unique = false; - $temp_name = $name; - $sql2 = self::modifyTableField($fieldname, $parameters); if ($sql3 == "") { - $sql3 = "ALTER" . $ignore . " TABLE `" . $temp_name . "` " . $sql2; + $sql3 = "ALTER" . $ignore . " TABLE `" . $name . "` " . $sql2; } else { $sql3 .= ", " . $sql2; } @@ -705,11 +680,9 @@ class DBStructure if ($current_index_definition != $new_index_definition) { $sql2 = self::createIndex($indexname, $fieldnames); - // Fetch the "group by" fields for unique indexes - $group_by = self::groupBy($fieldnames); if ($sql2 != "") { if ($sql3 == "") { - $sql3 = "ALTER" . $ignore . " TABLE `" . $temp_name . "` " . $sql2; + $sql3 = "ALTER" . $ignore . " TABLE `" . $name . "` " . $sql2; } else { $sql3 .= ", " . $sql2; } @@ -734,7 +707,7 @@ class DBStructure $sql2 = self::addForeignKey($name, $fieldname, $parameters); if ($sql3 == "") { - $sql3 = "ALTER" . $ignore . " TABLE `" . $temp_name . "` " . $sql2; + $sql3 = "ALTER" . $ignore . " TABLE `" . $name . "` " . $sql2; } else { $sql3 .= ", " . $sql2; } @@ -745,7 +718,7 @@ class DBStructure $sql2 = self::dropForeignKey($param['CONSTRAINT_NAME']); if ($sql3 == "") { - $sql3 = "ALTER" . $ignore . " TABLE `" . $temp_name . "` " . $sql2; + $sql3 = "ALTER" . $ignore . " TABLE `" . $name . "` " . $sql2; } else { $sql3 .= ", " . $sql2; } @@ -757,7 +730,7 @@ class DBStructure $sql2 = "COMMENT = '" . DBA::escape($structurecomment) . "'"; if ($sql3 == "") { - $sql3 = "ALTER" . $ignore . " TABLE `" . $temp_name . "` " . $sql2; + $sql3 = "ALTER" . $ignore . " TABLE `" . $name . "` " . $sql2; } else { $sql3 .= ", " . $sql2; } @@ -769,7 +742,7 @@ class DBStructure $sql2 = "ENGINE = '" . DBA::escape($structure['engine']) . "'"; if ($sql3 == "") { - $sql3 = "ALTER" . $ignore . " TABLE `" . $temp_name . "` " . $sql2; + $sql3 = "ALTER" . $ignore . " TABLE `" . $name . "` " . $sql2; } else { $sql3 .= ", " . $sql2; } @@ -781,7 +754,7 @@ class DBStructure $sql2 = "DEFAULT COLLATE utf8mb4_general_ci"; if ($sql3 == "") { - $sql3 = "ALTER" . $ignore . " TABLE `" . $temp_name . "` " . $sql2; + $sql3 = "ALTER" . $ignore . " TABLE `" . $name . "` " . $sql2; } else { $sql3 .= ", " . $sql2; } @@ -808,7 +781,7 @@ class DBStructure if ($field_definition['Collation'] != $parameters['Collation']) { $sql2 = self::modifyTableField($fieldname, $parameters); if (($sql3 == "") || (substr($sql3, -2, 2) == "; ")) { - $sql3 .= "ALTER" . $ignore . " TABLE `" . $temp_name . "` " . $sql2; + $sql3 .= "ALTER" . $ignore . " TABLE `" . $name . "` " . $sql2; } else { $sql3 .= ", " . $sql2; } @@ -821,36 +794,8 @@ class DBStructure $sql3 .= ";"; } - $field_list = ''; - if ($is_unique && $ignore == '') { - foreach ($database[$name]["fields"] AS $fieldname => $parameters) { - $field_list .= 'ANY_VALUE(`' . $fieldname . '`),'; - } - $field_list = rtrim($field_list, ','); - } - if ($verbose) { - // Ensure index conversion to unique removes duplicates - if ($is_unique && ($temp_name != $name)) { - if ($ignore != "") { - echo "SET session old_alter_table=1;\n"; - } else { - echo "DROP TABLE IF EXISTS `" . $temp_name . "`;\n"; - echo "CREATE TABLE `" . $temp_name . "` LIKE `" . $name . "`;\n"; - } - } - echo $sql3 . "\n"; - - if ($is_unique && ($temp_name != $name)) { - if ($ignore != "") { - echo "SET session old_alter_table=0;\n"; - } else { - echo "INSERT INTO `" . $temp_name . "` SELECT " . DBA::anyValueFallback($field_list) . " FROM `" . $name . "`" . $group_by . ";\n"; - echo "DROP TABLE `" . $name . "`;\n"; - echo "RENAME TABLE `" . $temp_name . "` TO `" . $name . "`;\n"; - } - } } if ($action) { @@ -858,50 +803,10 @@ class DBStructure DI::config()->set('system', 'maintenance_reason', DI::l10n()->t('%s: updating %s table.', DateTimeFormat::utcNow() . ' ' . date('e'), $name)); } - // Ensure index conversion to unique removes duplicates - if ($is_unique && ($temp_name != $name)) { - if ($ignore != "") { - DBA::e("SET session old_alter_table=1;"); - } else { - $r = DBA::e("DROP TABLE IF EXISTS `" . $temp_name . "`;"); - if (!DBA::isResult($r)) { - $errors .= self::printUpdateError($sql3); - return $errors; - } - - $r = DBA::e("CREATE TABLE `" . $temp_name . "` LIKE `" . $name . "`;"); - if (!DBA::isResult($r)) { - $errors .= self::printUpdateError($sql3); - return $errors; - } - } - } - $r = DBA::e($sql3); if (!DBA::isResult($r)) { $errors .= self::printUpdateError($sql3); } - if ($is_unique && ($temp_name != $name)) { - if ($ignore != "") { - DBA::e("SET session old_alter_table=0;"); - } else { - $r = DBA::e("INSERT INTO `" . $temp_name . "` SELECT " . $field_list . " FROM `" . $name . "`" . $group_by . ";"); - if (!DBA::isResult($r)) { - $errors .= self::printUpdateError($sql3); - return $errors; - } - $r = DBA::e("DROP TABLE `" . $name . "`;"); - if (!DBA::isResult($r)) { - $errors .= self::printUpdateError($sql3); - return $errors; - } - $r = DBA::e("RENAME TABLE `" . $temp_name . "` TO `" . $name . "`;"); - if (!DBA::isResult($r)) { - $errors .= self::printUpdateError($sql3); - return $errors; - } - } - } } } } @@ -1065,37 +970,6 @@ class DBStructure return sprintf("DROP FOREIGN KEY `%s`", $constraint); } - /** - * Constructs a GROUP BY clause from a UNIQUE index definition. - * - * @param array $fieldnames - * @return string - */ - private static function groupBy(array $fieldnames) - { - if ($fieldnames[0] != "UNIQUE") { - return ""; - } - - array_shift($fieldnames); - - $names = ""; - foreach ($fieldnames AS $fieldname) { - if ($names != "") { - $names .= ","; - } - - if (preg_match('|(.+)\((\d+)\)|', $fieldname, $matches)) { - $names .= "`" . DBA::escape($matches[1]) . "`"; - } else { - $names .= "`" . DBA::escape($fieldname) . "`"; - } - } - - $sql = sprintf(" GROUP BY %s", $names); - return $sql; - } - /** * Renames columns or the primary key of a table * From eadcc8dc9338339f9790f580fc9c4be92b13e70b Mon Sep 17 00:00:00 2001 From: fabrixxm Date: Mon, 27 Sep 2021 12:14:19 +0200 Subject: [PATCH 25/54] Handle reading empty file in ReversedFileReader fix #10766 --- src/Util/ReversedFileReader.php | 3 +++ tests/datasets/log/empty.friendica.log.txt | 0 tests/src/Model/Log/ParsedLogIteratorTest.php | 12 ++++++++++++ 3 files changed, 15 insertions(+) create mode 100644 tests/datasets/log/empty.friendica.log.txt diff --git a/src/Util/ReversedFileReader.php b/src/Util/ReversedFileReader.php index bdc31f0cb..92c8cced1 100644 --- a/src/Util/ReversedFileReader.php +++ b/src/Util/ReversedFileReader.php @@ -95,6 +95,9 @@ class ReversedFileReader implements \Iterator if ($this->pos == 0) { return array_pop($buffer); } + if (is_null($buffer)) { + return null; + } if (count($buffer) > 1) { return array_pop($buffer); } diff --git a/tests/datasets/log/empty.friendica.log.txt b/tests/datasets/log/empty.friendica.log.txt new file mode 100644 index 000000000..e69de29bb diff --git a/tests/src/Model/Log/ParsedLogIteratorTest.php b/tests/src/Model/Log/ParsedLogIteratorTest.php index df9f8393a..2ac53661b 100644 --- a/tests/src/Model/Log/ParsedLogIteratorTest.php +++ b/tests/src/Model/Log/ParsedLogIteratorTest.php @@ -145,4 +145,16 @@ class ParsedLogIteratorTest extends TestCase $pls = iterator_to_array($this->pli, false); self::assertCount(0, $pls); } + + public function testEmptyLogFile() + { + $logfile = dirname(__DIR__) . '/../../datasets/log/empty.friendica.log.txt'; + + $reader = new ReversedFileReader(); + $pli = new ParsedLogIterator($reader); + $pli->open($logfile); + + $pls = iterator_to_array($pli, false); + self::assertCount(0, $pls); + } } From ab7de16aca7f6d45b1f73fbd693322a096da5919 Mon Sep 17 00:00:00 2001 From: fabrixxm Date: Mon, 27 Sep 2021 12:22:08 +0200 Subject: [PATCH 26/54] Fix code style --- tests/src/Model/Log/ParsedLogIteratorTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/src/Model/Log/ParsedLogIteratorTest.php b/tests/src/Model/Log/ParsedLogIteratorTest.php index 2ac53661b..3ed1a33aa 100644 --- a/tests/src/Model/Log/ParsedLogIteratorTest.php +++ b/tests/src/Model/Log/ParsedLogIteratorTest.php @@ -150,8 +150,8 @@ class ParsedLogIteratorTest extends TestCase { $logfile = dirname(__DIR__) . '/../../datasets/log/empty.friendica.log.txt'; - $reader = new ReversedFileReader(); - $pli = new ParsedLogIterator($reader); + $reader = new ReversedFileReader(); + $pli = new ParsedLogIterator($reader); $pli->open($logfile); $pls = iterator_to_array($pli, false); From 5a7bd4884a359c60e09e39538b870f5df23cad7e Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 27 Sep 2021 20:26:08 +0000 Subject: [PATCH 27/54] Issue 10772: Avoid duplicated links in AP posts --- src/Content/Text/BBCode.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Content/Text/BBCode.php b/src/Content/Text/BBCode.php index b2fb1da7a..d0c19c616 100644 --- a/src/Content/Text/BBCode.php +++ b/src/Content/Text/BBCode.php @@ -424,10 +424,12 @@ class BBCode public static function removeAttachment($body, $no_link_desc = false) { return preg_replace_callback("/\s*\[attachment (.*?)\](.*?)\[\/attachment\]\s*/ism", - function ($match) use ($no_link_desc) { + function ($match) use ($body, $no_link_desc) { $attach_data = self::getAttachmentData($match[0]); if (empty($attach_data['url'])) { return $match[0]; + } elseif (strpos(str_replace($match[0], '', $body), $attach_data['url']) !== false) { + return ''; } elseif (empty($attach_data['title']) || $no_link_desc) { return " \n[url]" . $attach_data['url'] . "[/url]\n"; } else { From dd6e321c97527c0a219b1aa26d52b5dbe02c3985 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 28 Sep 2021 03:36:48 +0000 Subject: [PATCH 28/54] Added test --- tests/src/Content/Text/BBCodeTest.php | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tests/src/Content/Text/BBCodeTest.php b/tests/src/Content/Text/BBCodeTest.php index e2c4d9288..3c047b7c9 100644 --- a/tests/src/Content/Text/BBCodeTest.php +++ b/tests/src/Content/Text/BBCodeTest.php @@ -228,14 +228,14 @@ class BBCodeTest extends MockedTest 'text' => '[size=xx-large]Test text[/size]', 'try_oembed' => false, // Triggers the diaspora compatible output - 'simpleHtml' => 3, + 'simpleHtml' => BBCode::DIASPORA, ], 'bug-2199-diaspora-no-numeric-size' => [ 'expectedHtml' => 'Test text', 'text' => '[size=24]Test text[/size]', 'try_oembed' => false, // Triggers the diaspora compatible output - 'simpleHtml' => 3, + 'simpleHtml' => BBCode::DIASPORA, ], 'bug-7665-audio-tag' => [ 'expectedHtml' => '', @@ -282,6 +282,16 @@ class BBCodeTest extends MockedTest 'expectedHTML' => 'Test', 'text' => '[class=arbitrary classes]Test[/class]', ], + 'bug-10772-duplicated-links' => [ + 'expectedHTML' => 'Jetzt wird mir klar, warum Kapitalisten jedes Mal durchdrehen wenn Marx und das Kapital ins Gespräch kommt. Soziopathen.
    Karl Marx - Die ursprüngliche Akkumulation
    https://wohlstandfueralle.podigee.io/107-urspruengliche-akkumulation
    #Podcast #Kapitalismus', + 'text' => "Jetzt wird mir klar, warum Kapitalisten jedes Mal durchdrehen wenn Marx und das Kapital ins Gespräch kommt. Soziopathen. + Karl Marx - Die ursprüngliche Akkumulation + [url=https://wohlstandfueralle.podigee.io/107-urspruengliche-akkumulation]https://wohlstandfueralle.podigee.io/107-urspruengliche-akkumulation[/url] + #[url=https://horche.demkontinuum.de/search?tag=Podcast]Podcast[/url] #[url=https://horche.demkontinuum.de/search?tag=Kapitalismus]Kapitalismus[/url] + [attachment type='link' url='https://wohlstandfueralle.podigee.io/107-urspruengliche-akkumulation' title='Ep. 107: Karl Marx #8 - Die ursprüngliche Akkumulation' publisher_name='Wohlstand für Alle' preview='https://images.podigee-cdn.net/0x,s6LXshYO7uhG23H431B30t4hxj1bQuzlTsUlze0F_-H8=/https://cdn.podigee.com/uploads/u8126/bd5fe4f4-38b7-4f3f-b269-6a0080144635.jpg']Wie der Kapitalismus funktioniert und inwieweit Menschen darin ausgebeutet werden, haben wir bereits besprochen. Immer wieder verweisen wir auch darauf, dass der Kapitalismus nicht immer schon existierte, sondern historisiert werden muss.[/attachment]", + 'try_oembed' => false, + 'simpleHtml' => BBCode::TWITTER, + ], ]; } From 0b333ef6bc94d7ee39ea5a2b1b37b47946684f91 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 28 Sep 2021 04:27:24 +0000 Subject: [PATCH 29/54] Fixed test error --- tests/src/Content/Text/BBCodeTest.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/src/Content/Text/BBCodeTest.php b/tests/src/Content/Text/BBCodeTest.php index 3c047b7c9..730e0b6da 100644 --- a/tests/src/Content/Text/BBCodeTest.php +++ b/tests/src/Content/Text/BBCodeTest.php @@ -285,10 +285,10 @@ class BBCodeTest extends MockedTest 'bug-10772-duplicated-links' => [ 'expectedHTML' => 'Jetzt wird mir klar, warum Kapitalisten jedes Mal durchdrehen wenn Marx und das Kapital ins Gespräch kommt. Soziopathen.
    Karl Marx - Die ursprüngliche Akkumulation
    https://wohlstandfueralle.podigee.io/107-urspruengliche-akkumulation
    #Podcast #Kapitalismus', 'text' => "Jetzt wird mir klar, warum Kapitalisten jedes Mal durchdrehen wenn Marx und das Kapital ins Gespräch kommt. Soziopathen. - Karl Marx - Die ursprüngliche Akkumulation - [url=https://wohlstandfueralle.podigee.io/107-urspruengliche-akkumulation]https://wohlstandfueralle.podigee.io/107-urspruengliche-akkumulation[/url] - #[url=https://horche.demkontinuum.de/search?tag=Podcast]Podcast[/url] #[url=https://horche.demkontinuum.de/search?tag=Kapitalismus]Kapitalismus[/url] - [attachment type='link' url='https://wohlstandfueralle.podigee.io/107-urspruengliche-akkumulation' title='Ep. 107: Karl Marx #8 - Die ursprüngliche Akkumulation' publisher_name='Wohlstand für Alle' preview='https://images.podigee-cdn.net/0x,s6LXshYO7uhG23H431B30t4hxj1bQuzlTsUlze0F_-H8=/https://cdn.podigee.com/uploads/u8126/bd5fe4f4-38b7-4f3f-b269-6a0080144635.jpg']Wie der Kapitalismus funktioniert und inwieweit Menschen darin ausgebeutet werden, haben wir bereits besprochen. Immer wieder verweisen wir auch darauf, dass der Kapitalismus nicht immer schon existierte, sondern historisiert werden muss.[/attachment]", +Karl Marx - Die ursprüngliche Akkumulation +[url=https://wohlstandfueralle.podigee.io/107-urspruengliche-akkumulation]https://wohlstandfueralle.podigee.io/107-urspruengliche-akkumulation[/url] +#[url=https://horche.demkontinuum.de/search?tag=Podcast]Podcast[/url] #[url=https://horche.demkontinuum.de/search?tag=Kapitalismus]Kapitalismus[/url] +[attachment type='link' url='https://wohlstandfueralle.podigee.io/107-urspruengliche-akkumulation' title='Ep. 107: Karl Marx #8 - Die ursprüngliche Akkumulation' publisher_name='Wohlstand für Alle' preview='https://images.podigee-cdn.net/0x,s6LXshYO7uhG23H431B30t4hxj1bQuzlTsUlze0F_-H8=/https://cdn.podigee.com/uploads/u8126/bd5fe4f4-38b7-4f3f-b269-6a0080144635.jpg']Wie der Kapitalismus funktioniert und inwieweit Menschen darin ausgebeutet werden, haben wir bereits besprochen. Immer wieder verweisen wir auch darauf, dass der Kapitalismus nicht immer schon existierte, sondern historisiert werden muss.[/attachment]", 'try_oembed' => false, 'simpleHtml' => BBCode::TWITTER, ], From 65b0b443b5e69fc058eeadd9bbd2ae14ddbd6325 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 28 Sep 2021 18:52:11 +0000 Subject: [PATCH 30/54] Fix commenting on profile pages --- mod/item.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mod/item.php b/mod/item.php index 00248df43..f40f6ad45 100644 --- a/mod/item.php +++ b/mod/item.php @@ -177,10 +177,11 @@ function item_post(App $a) { } // Allow commenting if it is an answer to a public post - $allow_comment = local_user() && ($profile_uid == 0) && $toplevel_item_id && in_array($toplevel_item['network'], Protocol::FEDERATED); + $allow_comment = local_user() && $toplevel_item_id && in_array($toplevel_item['private'], [Item::PUBLIC, Item::UNLISTED]) && in_array($toplevel_item['network'], Protocol::FEDERATED); // Now check that valid personal details have been provided if (!Security::canWriteToUserWall($profile_uid) && !$allow_comment) { + Logger::notice('Permission denied.', ['local' => local_user(), 'profile_uid' => $profile_uid, 'toplevel_item_id' => $toplevel_item_id, 'network' => $toplevel_item['network']]); notice(DI::l10n()->t('Permission denied.')); if ($return_path) { DI::baseUrl()->redirect($return_path); @@ -931,6 +932,7 @@ function drop_item(int $id, string $return = '') item_redirect_after_action($item, $return); } else { + Logger::notice('Permission denied.', ['local' => local_user(), 'uid' => $item['uid'], 'cid' => $contact_id]); notice(DI::l10n()->t('Permission denied.')); DI::baseUrl()->redirect('display/' . $item['guid']); //NOTREACHED From 2139e46d98e6acceae8ae0f4862a1c028ad37935 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Wed, 29 Sep 2021 07:37:38 +0200 Subject: [PATCH 31/54] RU translations THX Alexander An --- view/lang/ru/messages.po | 1650 +++++++++++++++++++------------------- view/lang/ru/strings.php | 182 +++-- 2 files changed, 918 insertions(+), 914 deletions(-) diff --git a/view/lang/ru/messages.po b/view/lang/ru/messages.po index acfe19679..149cdae0b 100644 --- a/view/lang/ru/messages.po +++ b/view/lang/ru/messages.po @@ -24,8 +24,8 @@ msgid "" msgstr "" "Project-Id-Version: friendica\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-10 00:27+0000\n" -"PO-Revision-Date: 2021-09-22 05:47+0000\n" +"POT-Creation-Date: 2021-09-26 03:57+0000\n" +"PO-Revision-Date: 2021-09-28 07:18+0000\n" "Last-Translator: Alexander An \n" "Language-Team: Russian (http://www.transifex.com/Friendica/friendica/language/ru/)\n" "MIME-Version: 1.0\n" @@ -59,9 +59,9 @@ msgid "Monthly posting limit of %d post reached. The post was rejected." msgstr "Месячный лимит в %d записей достигнут. Запись была отклонена." #: include/api.php:4437 mod/photos.php:89 mod/photos.php:198 -#: mod/photos.php:626 mod/photos.php:1034 mod/photos.php:1051 -#: mod/photos.php:1597 src/Model/User.php:1118 src/Model/User.php:1126 -#: src/Model/User.php:1134 src/Module/Settings/Profile/Photo/Crop.php:101 +#: mod/photos.php:626 mod/photos.php:1035 mod/photos.php:1052 +#: mod/photos.php:1599 src/Model/User.php:1169 src/Model/User.php:1177 +#: src/Model/User.php:1185 src/Module/Settings/Profile/Photo/Crop.php:101 #: src/Module/Settings/Profile/Photo/Crop.php:117 #: src/Module/Settings/Profile/Photo/Crop.php:133 #: src/Module/Settings/Profile/Photo/Crop.php:179 @@ -70,459 +70,6 @@ msgstr "Месячный лимит в %d записей достигнут. З msgid "Profile Photos" msgstr "Фотографии профиля" -#: include/conversation.php:109 -#, php-format -msgid "%1$s poked %2$s" -msgstr "%1$s ткнул %2$s" - -#: include/conversation.php:142 src/Model/Item.php:2609 -msgid "event" -msgstr "мероприятие" - -#: include/conversation.php:145 include/conversation.php:154 mod/tagger.php:90 -msgid "status" -msgstr "статус" - -#: include/conversation.php:150 mod/tagger.php:90 src/Model/Item.php:2611 -msgid "photo" -msgstr "фото" - -#: include/conversation.php:164 mod/tagger.php:123 -#, php-format -msgid "%1$s tagged %2$s's %3$s with %4$s" -msgstr "%1$s tagged %2$s's %3$s в %4$s" - -#: include/conversation.php:467 mod/photos.php:1459 src/Object/Post.php:226 -msgid "Select" -msgstr "Выберите" - -#: include/conversation.php:468 mod/photos.php:1460 mod/settings.php:573 -#: src/Module/Admin/Users/Active.php:139 -#: src/Module/Admin/Users/Blocked.php:140 src/Module/Admin/Users/Index.php:153 -#: src/Module/Contact.php:849 src/Module/Contact.php:1132 -msgid "Delete" -msgstr "Удалить" - -#: include/conversation.php:503 src/Object/Post.php:453 -#: src/Object/Post.php:454 -#, php-format -msgid "View %s's profile @ %s" -msgstr "Просмотреть профиль %s [@ %s]" - -#: include/conversation.php:516 src/Object/Post.php:441 -msgid "Categories:" -msgstr "Категории:" - -#: include/conversation.php:517 src/Object/Post.php:442 -msgid "Filed under:" -msgstr "В рубрике:" - -#: include/conversation.php:524 src/Object/Post.php:467 -#, php-format -msgid "%s from %s" -msgstr "%s из %s" - -#: include/conversation.php:539 -msgid "View in context" -msgstr "Смотреть в контексте" - -#: include/conversation.php:541 include/conversation.php:1146 -#: mod/editpost.php:107 mod/message.php:203 mod/message.php:368 -#: mod/photos.php:1524 mod/wallmessage.php:155 src/Module/Item/Compose.php:165 -#: src/Object/Post.php:501 -msgid "Please wait" -msgstr "Пожалуйста, подождите" - -#: include/conversation.php:605 -msgid "remove" -msgstr "удалить" - -#: include/conversation.php:609 -msgid "Delete Selected Items" -msgstr "Удалить выбранные позиции" - -#: include/conversation.php:647 include/conversation.php:650 -#: include/conversation.php:653 include/conversation.php:656 -#, php-format -msgid "You had been addressed (%s)." -msgstr "К вам обратились (%s)." - -#: include/conversation.php:659 -#, php-format -msgid "You are following %s." -msgstr "Вы подписаны на %s." - -#: include/conversation.php:662 -msgid "Tagged" -msgstr "Отмечено" - -#: include/conversation.php:675 include/conversation.php:1013 -#: include/conversation.php:1051 -#, php-format -msgid "%s reshared this." -msgstr "%s поделился этим." - -#: include/conversation.php:677 -msgid "Reshared" -msgstr "Репост" - -#: include/conversation.php:677 -#, php-format -msgid "Reshared by %s <%s>" -msgstr "" - -#: include/conversation.php:680 -#, php-format -msgid "%s is participating in this thread." -msgstr "%s участвует в этом обсуждении" - -#: include/conversation.php:683 -msgid "Stored" -msgstr "" - -#: include/conversation.php:686 -msgid "Global" -msgstr "" - -#: include/conversation.php:689 -msgid "Relayed" -msgstr "Ретранслировано" - -#: include/conversation.php:689 -#, php-format -msgid "Relayed by %s <%s>" -msgstr "" - -#: include/conversation.php:692 -msgid "Fetched" -msgstr "Загружено" - -#: include/conversation.php:692 -#, php-format -msgid "Fetched because of %s <%s>" -msgstr "" - -#: include/conversation.php:844 view/theme/frio/theme.php:323 -msgid "Follow Thread" -msgstr "Подписаться на обсуждение" - -#: include/conversation.php:845 src/Model/Contact.php:1050 -msgid "View Status" -msgstr "Просмотреть статус" - -#: include/conversation.php:846 include/conversation.php:868 -#: src/Model/Contact.php:976 src/Model/Contact.php:1042 -#: src/Model/Contact.php:1051 src/Module/Directory.php:160 -#: src/Module/Settings/Profile/Index.php:223 -msgid "View Profile" -msgstr "Просмотреть профиль" - -#: include/conversation.php:847 src/Model/Contact.php:1052 -msgid "View Photos" -msgstr "Просмотреть фото" - -#: include/conversation.php:848 src/Model/Contact.php:1043 -#: src/Model/Contact.php:1053 -msgid "Network Posts" -msgstr "Записи сети" - -#: include/conversation.php:849 src/Model/Contact.php:1044 -#: src/Model/Contact.php:1054 -msgid "View Contact" -msgstr "Просмотреть контакт" - -#: include/conversation.php:850 src/Model/Contact.php:1056 -msgid "Send PM" -msgstr "Отправить ЛС" - -#: include/conversation.php:851 src/Module/Admin/Blocklist/Contact.php:84 -#: src/Module/Admin/Users/Active.php:140 src/Module/Admin/Users/Index.php:154 -#: src/Module/Contact.php:587 src/Module/Contact.php:847 -#: src/Module/Contact.php:1115 -msgid "Block" -msgstr "Заблокировать" - -#: include/conversation.php:852 src/Module/Contact.php:588 -#: src/Module/Contact.php:848 src/Module/Contact.php:1123 -#: src/Module/Notifications/Introductions.php:113 -#: src/Module/Notifications/Introductions.php:185 -#: src/Module/Notifications/Notification.php:59 -msgid "Ignore" -msgstr "Игнорировать" - -#: include/conversation.php:856 src/Object/Post.php:428 -msgid "Languages" -msgstr "Языки" - -#: include/conversation.php:860 src/Model/Contact.php:1057 -msgid "Poke" -msgstr "потыкать" - -#: include/conversation.php:865 mod/follow.php:138 src/Content/Widget.php:76 -#: src/Model/Contact.php:1045 src/Model/Contact.php:1058 -#: view/theme/vier/theme.php:172 -msgid "Connect/Follow" -msgstr "Подключиться/Подписаться" - -#: include/conversation.php:998 -#, php-format -msgid "%s likes this." -msgstr "%s нравится это." - -#: include/conversation.php:1001 -#, php-format -msgid "%s doesn't like this." -msgstr "%s не нравится это." - -#: include/conversation.php:1004 -#, php-format -msgid "%s attends." -msgstr "%s посещает." - -#: include/conversation.php:1007 -#, php-format -msgid "%s doesn't attend." -msgstr "%s не посетит." - -#: include/conversation.php:1010 -#, php-format -msgid "%s attends maybe." -msgstr "%s может быть посетит." - -#: include/conversation.php:1019 -msgid "and" -msgstr "и" - -#: include/conversation.php:1022 -#, php-format -msgid "and %d other people" -msgstr "и еще %d человек" - -#: include/conversation.php:1030 -#, php-format -msgid "%2$d people like this" -msgstr "%2$d людям нравится это" - -#: include/conversation.php:1031 -#, php-format -msgid "%s like this." -msgstr "%s нравится это." - -#: include/conversation.php:1034 -#, php-format -msgid "%2$d people don't like this" -msgstr "%2$d людям не нравится это" - -#: include/conversation.php:1035 -#, php-format -msgid "%s don't like this." -msgstr "%s не нравится это" - -#: include/conversation.php:1038 -#, php-format -msgid "%2$d people attend" -msgstr "%2$d человека посетят" - -#: include/conversation.php:1039 -#, php-format -msgid "%s attend." -msgstr "%s посетит." - -#: include/conversation.php:1042 -#, php-format -msgid "%2$d people don't attend" -msgstr "%2$d человек не посетит" - -#: include/conversation.php:1043 -#, php-format -msgid "%s don't attend." -msgstr "%s не посетит" - -#: include/conversation.php:1046 -#, php-format -msgid "%2$d people attend maybe" -msgstr "%2$d человек может быть посетят" - -#: include/conversation.php:1047 -#, php-format -msgid "%s attend maybe." -msgstr "%s может быть посетит." - -#: include/conversation.php:1050 -#, php-format -msgid "%2$d people reshared this" -msgstr "%2$d людей поделились этим" - -#: include/conversation.php:1098 -msgid "Visible to everybody" -msgstr "Видимое всем" - -#: include/conversation.php:1099 src/Module/Item/Compose.php:159 -#: src/Object/Post.php:972 -msgid "Please enter a image/video/audio/webpage URL:" -msgstr "Пожалуйста, введите адрес картинки/видео/аудио/странички:" - -#: include/conversation.php:1100 -msgid "Tag term:" -msgstr "Тег:" - -#: include/conversation.php:1101 src/Module/Filer/SaveTag.php:68 -msgid "Save to Folder:" -msgstr "Сохранить в папку:" - -#: include/conversation.php:1102 -msgid "Where are you right now?" -msgstr "И где вы сейчас?" - -#: include/conversation.php:1103 -msgid "Delete item(s)?" -msgstr "Удалить елемент(ты)?" - -#: include/conversation.php:1113 -msgid "New Post" -msgstr "Новая запись" - -#: include/conversation.php:1116 -msgid "Share" -msgstr "Поделиться" - -#: include/conversation.php:1117 mod/editpost.php:92 mod/photos.php:1373 -#: src/Module/Contact/Poke.php:157 src/Object/Post.php:963 -msgid "Loading..." -msgstr "Загрузка..." - -#: include/conversation.php:1118 mod/editpost.php:93 mod/message.php:201 -#: mod/message.php:365 mod/wallmessage.php:153 -msgid "Upload photo" -msgstr "Загрузить фото" - -#: include/conversation.php:1119 mod/editpost.php:94 -msgid "upload photo" -msgstr "загрузить фото" - -#: include/conversation.php:1120 mod/editpost.php:95 -msgid "Attach file" -msgstr "Прикрепить файл" - -#: include/conversation.php:1121 mod/editpost.php:96 -msgid "attach file" -msgstr "приложить файл" - -#: include/conversation.php:1122 src/Module/Item/Compose.php:151 -#: src/Object/Post.php:964 -msgid "Bold" -msgstr "Жирный" - -#: include/conversation.php:1123 src/Module/Item/Compose.php:152 -#: src/Object/Post.php:965 -msgid "Italic" -msgstr "Kурсивный" - -#: include/conversation.php:1124 src/Module/Item/Compose.php:153 -#: src/Object/Post.php:966 -msgid "Underline" -msgstr "Подчеркнутый" - -#: include/conversation.php:1125 src/Module/Item/Compose.php:154 -#: src/Object/Post.php:967 -msgid "Quote" -msgstr "Цитата" - -#: include/conversation.php:1126 src/Module/Item/Compose.php:155 -#: src/Object/Post.php:968 -msgid "Code" -msgstr "Код" - -#: include/conversation.php:1127 src/Module/Item/Compose.php:156 -#: src/Object/Post.php:969 -msgid "Image" -msgstr "Изображение / Фото" - -#: include/conversation.php:1128 src/Module/Item/Compose.php:157 -#: src/Object/Post.php:970 -msgid "Link" -msgstr "Ссылка" - -#: include/conversation.php:1129 src/Module/Item/Compose.php:158 -#: src/Object/Post.php:971 -msgid "Link or Media" -msgstr "Ссылка или медиа" - -#: include/conversation.php:1130 -msgid "Video" -msgstr "" - -#: include/conversation.php:1131 mod/editpost.php:103 -#: src/Module/Item/Compose.php:161 -msgid "Set your location" -msgstr "Задать ваше местоположение" - -#: include/conversation.php:1132 mod/editpost.php:104 -msgid "set location" -msgstr "установить местонахождение" - -#: include/conversation.php:1133 mod/editpost.php:105 -msgid "Clear browser location" -msgstr "Очистить местонахождение браузера" - -#: include/conversation.php:1134 mod/editpost.php:106 -msgid "clear location" -msgstr "убрать местонахождение" - -#: include/conversation.php:1136 mod/editpost.php:120 -#: src/Module/Item/Compose.php:166 -msgid "Set title" -msgstr "Установить заголовок" - -#: include/conversation.php:1138 mod/editpost.php:122 -#: src/Module/Item/Compose.php:167 -msgid "Categories (comma-separated list)" -msgstr "Категории (список через запятую)" - -#: include/conversation.php:1143 src/Module/Item/Compose.php:172 -msgid "Scheduled at" -msgstr "Запланировано на" - -#: include/conversation.php:1147 mod/editpost.php:108 -msgid "Permission settings" -msgstr "Настройки разрешений" - -#: include/conversation.php:1148 mod/editpost.php:136 mod/events.php:583 -#: mod/photos.php:965 mod/photos.php:1326 -msgid "Permissions" -msgstr "Разрешения" - -#: include/conversation.php:1157 mod/editpost.php:117 -msgid "Public post" -msgstr "Публичное сообщение" - -#: include/conversation.php:1161 mod/editpost.php:128 mod/events.php:578 -#: mod/photos.php:1372 mod/photos.php:1428 mod/photos.php:1502 -#: src/Module/Item/Compose.php:160 src/Object/Post.php:973 -msgid "Preview" -msgstr "Просмотр" - -#: include/conversation.php:1164 mod/editpost.php:130 mod/fbrowser.php:105 -#: mod/fbrowser.php:134 mod/follow.php:144 mod/photos.php:1028 -#: mod/photos.php:1134 mod/tagrm.php:37 mod/tagrm.php:129 mod/unfollow.php:97 -#: src/Module/Contact.php:422 src/Module/RemoteFollow.php:116 -msgid "Cancel" -msgstr "Отмена" - -#: include/conversation.php:1171 mod/editpost.php:134 -#: src/Content/Widget/VCard.php:107 src/Model/Profile.php:459 -msgid "Message" -msgstr "Сообщение" - -#: include/conversation.php:1172 mod/editpost.php:135 -#: src/Module/Settings/TwoFactor/Trusted.php:101 -msgid "Browser" -msgstr "Браузер" - -#: include/conversation.php:1174 mod/editpost.php:138 -msgid "Open Compose page" -msgstr "Развернуть редактор" - #: include/enotify.php:52 include/enotify.php:559 msgid "[Friendica:Notify]" msgstr "[Friendica]" @@ -786,16 +333,16 @@ msgstr "%s %s поделился(-ась) новым сообщением" #: mod/wallmessage.php:96 mod/wallmessage.php:120 src/Module/Attach.php:55 #: src/Module/BaseApi.php:79 src/Module/BaseApi.php:88 #: src/Module/BaseApi.php:97 src/Module/BaseApi.php:106 -#: src/Module/BaseNotifications.php:88 src/Module/Contact.php:346 -#: src/Module/Contact/Advanced.php:44 src/Module/Delegation.php:119 +#: src/Module/BaseNotifications.php:88 src/Module/Contact.php:356 +#: src/Module/Contact/Advanced.php:44 src/Module/Delegation.php:118 #: src/Module/FollowConfirm.php:16 src/Module/FriendSuggest.php:44 #: src/Module/Group.php:45 src/Module/Group.php:90 src/Module/Invite.php:41 #: src/Module/Invite.php:130 src/Module/Notifications/Notification.php:47 #: src/Module/Notifications/Notification.php:76 #: src/Module/Profile/Common.php:56 src/Module/Profile/Contacts.php:56 #: src/Module/Profile/Schedule.php:39 src/Module/Profile/Schedule.php:56 -#: src/Module/Register.php:62 src/Module/Register.php:75 -#: src/Module/Register.php:193 src/Module/Register.php:232 +#: src/Module/Register.php:64 src/Module/Register.php:77 +#: src/Module/Register.php:195 src/Module/Register.php:234 #: src/Module/Search/Directory.php:38 src/Module/Settings/Delegation.php:42 #: src/Module/Settings/Delegation.php:70 src/Module/Settings/Display.php:43 #: src/Module/Settings/Display.php:121 @@ -822,7 +369,7 @@ msgstr "Доступ запрещен." #: src/Model/Profile.php:228 src/Module/HCard.php:52 #: src/Module/Profile/Common.php:41 src/Module/Profile/Common.php:52 #: src/Module/Profile/Contacts.php:40 src/Module/Profile/Contacts.php:50 -#: src/Module/Profile/Status.php:58 src/Module/Register.php:254 +#: src/Module/Profile/Status.php:58 src/Module/Register.php:256 #: src/Module/RemoteFollow.php:49 msgid "User not found." msgstr "Пользователь не найден." @@ -922,6 +469,28 @@ msgstr "Редактировать запись" msgid "Save" msgstr "Сохранить" +#: mod/editpost.php:92 mod/photos.php:1375 src/Content/Conversation.php:326 +#: src/Module/Contact/Poke.php:157 src/Object/Post.php:964 +msgid "Loading..." +msgstr "Загрузка..." + +#: mod/editpost.php:93 mod/message.php:201 mod/message.php:365 +#: mod/wallmessage.php:153 src/Content/Conversation.php:327 +msgid "Upload photo" +msgstr "Загрузить фото" + +#: mod/editpost.php:94 src/Content/Conversation.php:328 +msgid "upload photo" +msgstr "загрузить фото" + +#: mod/editpost.php:95 src/Content/Conversation.php:329 +msgid "Attach file" +msgstr "Прикрепить файл" + +#: mod/editpost.php:96 src/Content/Conversation.php:330 +msgid "attach file" +msgstr "приложить файл" + #: mod/editpost.php:97 mod/message.php:202 mod/message.php:366 #: mod/wallmessage.php:154 msgid "Insert web link" @@ -947,14 +516,88 @@ msgstr "Вставить ссылку аудио" msgid "audio link" msgstr "аудио-ссылка" +#: mod/editpost.php:103 src/Content/Conversation.php:340 +#: src/Module/Item/Compose.php:161 +msgid "Set your location" +msgstr "Задать ваше местоположение" + +#: mod/editpost.php:104 src/Content/Conversation.php:341 +msgid "set location" +msgstr "установить местонахождение" + +#: mod/editpost.php:105 src/Content/Conversation.php:342 +msgid "Clear browser location" +msgstr "Очистить местонахождение браузера" + +#: mod/editpost.php:106 src/Content/Conversation.php:343 +msgid "clear location" +msgstr "убрать местонахождение" + +#: mod/editpost.php:107 mod/message.php:203 mod/message.php:368 +#: mod/photos.php:1526 mod/wallmessage.php:155 +#: src/Content/Conversation.php:355 src/Content/Conversation.php:689 +#: src/Module/Item/Compose.php:165 src/Object/Post.php:502 +msgid "Please wait" +msgstr "Пожалуйста, подождите" + +#: mod/editpost.php:108 src/Content/Conversation.php:356 +msgid "Permission settings" +msgstr "Настройки разрешений" + #: mod/editpost.php:116 src/Core/ACL.php:327 msgid "CC: email addresses" msgstr "Копии на email адреса" +#: mod/editpost.php:117 src/Content/Conversation.php:366 +msgid "Public post" +msgstr "Публичное сообщение" + +#: mod/editpost.php:120 src/Content/Conversation.php:345 +#: src/Module/Item/Compose.php:166 +msgid "Set title" +msgstr "Установить заголовок" + +#: mod/editpost.php:122 src/Content/Conversation.php:347 +#: src/Module/Item/Compose.php:167 +msgid "Categories (comma-separated list)" +msgstr "Категории (список через запятую)" + #: mod/editpost.php:123 src/Core/ACL.php:328 msgid "Example: bob@example.com, mary@example.com" msgstr "Пример: bob@example.com, mary@example.com" +#: mod/editpost.php:128 mod/events.php:578 mod/photos.php:1374 +#: mod/photos.php:1430 mod/photos.php:1504 src/Content/Conversation.php:370 +#: src/Module/Item/Compose.php:160 src/Object/Post.php:974 +msgid "Preview" +msgstr "Просмотр" + +#: mod/editpost.php:130 mod/fbrowser.php:105 mod/fbrowser.php:134 +#: mod/follow.php:144 mod/photos.php:1029 mod/photos.php:1136 mod/tagrm.php:37 +#: mod/tagrm.php:129 mod/unfollow.php:97 src/Content/Conversation.php:373 +#: src/Module/Contact.php:443 src/Module/RemoteFollow.php:116 +msgid "Cancel" +msgstr "Отмена" + +#: mod/editpost.php:134 src/Content/Conversation.php:380 +#: src/Content/Widget/VCard.php:107 src/Model/Profile.php:459 +msgid "Message" +msgstr "Сообщение" + +#: mod/editpost.php:135 src/Content/Conversation.php:381 +#: src/Module/Settings/TwoFactor/Trusted.php:101 +msgid "Browser" +msgstr "Браузер" + +#: mod/editpost.php:136 mod/events.php:583 mod/photos.php:965 +#: mod/photos.php:1328 src/Content/Conversation.php:357 +msgid "Permissions" +msgstr "Разрешения" + +#: mod/editpost.php:138 src/Content/Conversation.php:383 +msgid "Open Compose page" +msgstr "Развернуть редактор" + #: mod/events.php:138 mod/events.php:140 msgid "Event can not end before it has started." msgstr "Эвент не может закончится до старта." @@ -990,7 +633,7 @@ msgstr "Начало мероприятия:" #: src/Module/Install.php:268 src/Module/Install.php:273 #: src/Module/Install.php:279 src/Module/Install.php:284 #: src/Module/Install.php:298 src/Module/Install.php:313 -#: src/Module/Install.php:340 src/Module/Register.php:135 +#: src/Module/Install.php:340 src/Module/Register.php:137 #: src/Module/Security/TwoFactor/Verify.php:100 #: src/Module/Settings/TwoFactor/Index.php:133 #: src/Module/Settings/TwoFactor/Verify.php:141 @@ -1016,7 +659,7 @@ msgstr "Описание:" #: mod/events.php:568 src/Content/Widget/VCard.php:98 src/Model/Event.php:86 #: src/Model/Event.php:113 src/Model/Event.php:483 src/Model/Event.php:969 -#: src/Model/Profile.php:367 src/Module/Contact.php:608 +#: src/Model/Profile.php:367 src/Module/Contact.php:623 #: src/Module/Directory.php:150 src/Module/Notifications/Introductions.php:166 #: src/Module/Profile/Profile.php:194 msgid "Location:" @@ -1031,18 +674,18 @@ msgid "Share this event" msgstr "Поделиться этим мероприятием" #: mod/events.php:580 mod/message.php:204 mod/message.php:367 -#: mod/photos.php:947 mod/photos.php:1045 mod/photos.php:1330 -#: mod/photos.php:1371 mod/photos.php:1427 mod/photos.php:1501 -#: src/Module/Admin/Item/Source.php:65 src/Module/Contact.php:566 +#: mod/photos.php:947 mod/photos.php:1046 mod/photos.php:1332 +#: mod/photos.php:1373 mod/photos.php:1429 mod/photos.php:1503 +#: src/Module/Admin/Item/Source.php:65 src/Module/Contact.php:581 #: src/Module/Contact/Advanced.php:133 src/Module/Contact/Poke.php:158 #: src/Module/Debug/ActivityPubConversion.php:141 #: src/Module/Debug/Babel.php:313 src/Module/Debug/Localtime.php:64 #: src/Module/Debug/Probe.php:56 src/Module/Debug/WebFinger.php:53 -#: src/Module/Delegation.php:153 src/Module/FriendSuggest.php:129 +#: src/Module/Delegation.php:147 src/Module/FriendSuggest.php:129 #: src/Module/Install.php:245 src/Module/Install.php:287 #: src/Module/Install.php:324 src/Module/Invite.php:177 #: src/Module/Item/Compose.php:150 src/Module/Profile/Profile.php:247 -#: src/Module/Settings/Profile/Index.php:220 src/Object/Post.php:962 +#: src/Module/Settings/Profile/Index.php:220 src/Object/Post.php:963 #: view/theme/duepuntozero/config.php:69 view/theme/frio/config.php:160 #: view/theme/quattro/config.php:71 view/theme/vier/config.php:119 msgid "Submit" @@ -1052,7 +695,7 @@ msgstr "Отправить" msgid "Basic" msgstr "Базовый" -#: mod/events.php:582 src/Module/Admin/Site.php:505 src/Module/Contact.php:916 +#: mod/events.php:582 src/Module/Admin/Site.php:505 src/Module/Contact.php:932 #: src/Module/Profile/Profile.php:249 msgid "Advanced" msgstr "Расширенный" @@ -1095,6 +738,12 @@ msgstr "Поддержка Diaspora не включена. Контакт не msgid "OStatus support is disabled. Contact can't be added." msgstr "Поддержка OStatus выключена. Контакт не может быть добавлен." +#: mod/follow.php:138 src/Content/Item.php:463 src/Content/Widget.php:76 +#: src/Model/Contact.php:1051 src/Model/Contact.php:1064 +#: view/theme/vier/theme.php:172 +msgid "Connect/Follow" +msgstr "Подключиться/Подписаться" + #: mod/follow.php:139 src/Module/RemoteFollow.php:114 msgid "Please answer the following:" msgstr "Пожалуйста, ответьте следующее:" @@ -1104,13 +753,13 @@ msgid "Your Identity Address:" msgstr "Ваш адрес:" #: mod/follow.php:141 mod/unfollow.php:100 -#: src/Module/Admin/Blocklist/Contact.php:100 src/Module/Contact.php:604 +#: src/Module/Admin/Blocklist/Contact.php:100 src/Module/Contact.php:619 #: src/Module/Notifications/Introductions.php:108 #: src/Module/Notifications/Introductions.php:177 msgid "Profile URL" msgstr "URL профиля" -#: mod/follow.php:142 src/Module/Contact.php:616 +#: mod/follow.php:142 src/Module/Contact.php:631 #: src/Module/Notifications/Introductions.php:170 #: src/Module/Profile/Profile.php:207 msgid "Tags:" @@ -1126,7 +775,7 @@ msgid "Add a personal note:" msgstr "Добавить личную заметку:" #: mod/follow.php:163 mod/unfollow.php:109 src/Module/BaseProfile.php:59 -#: src/Module/Contact.php:894 +#: src/Module/Contact.php:910 msgid "Status Messages and Posts" msgstr "Ваши записи" @@ -1483,11 +1132,11 @@ msgstr "Держать окно открытым до завершения." msgid "Photo Albums" msgstr "Фотоальбомы" -#: mod/photos.php:112 mod/photos.php:1626 +#: mod/photos.php:112 mod/photos.php:1628 msgid "Recent Photos" msgstr "Последние фото" -#: mod/photos.php:114 mod/photos.php:1096 mod/photos.php:1628 +#: mod/photos.php:114 mod/photos.php:1097 mod/photos.php:1630 msgid "Upload New Photos" msgstr "Загрузить новые фото" @@ -1570,7 +1219,7 @@ msgstr "Доступ к этому пункту ограничен." msgid "Upload Photos" msgstr "Загрузить фото" -#: mod/photos.php:961 mod/photos.php:1041 +#: mod/photos.php:961 mod/photos.php:1042 msgid "New album name: " msgstr "Название нового альбома: " @@ -1586,139 +1235,151 @@ msgstr "Не показывать статус-сообщение для это msgid "Do you really want to delete this photo album and all its photos?" msgstr "Вы действительно хотите удалить этот альбом и все его фотографии?" -#: mod/photos.php:1025 mod/photos.php:1046 +#: mod/photos.php:1025 mod/photos.php:1047 msgid "Delete Album" msgstr "Удалить альбом" -#: mod/photos.php:1052 +#: mod/photos.php:1053 msgid "Edit Album" msgstr "Редактировать альбом" -#: mod/photos.php:1053 +#: mod/photos.php:1054 msgid "Drop Album" msgstr "Удалить альбом" -#: mod/photos.php:1058 +#: mod/photos.php:1059 msgid "Show Newest First" msgstr "Показать новые первыми" -#: mod/photos.php:1060 +#: mod/photos.php:1061 msgid "Show Oldest First" msgstr "Показать старые первыми" -#: mod/photos.php:1081 mod/photos.php:1611 +#: mod/photos.php:1082 mod/photos.php:1613 msgid "View Photo" msgstr "Просмотр фото" -#: mod/photos.php:1118 +#: mod/photos.php:1119 msgid "Permission denied. Access to this item may be restricted." msgstr "Нет разрешения. Доступ к этому элементу ограничен." -#: mod/photos.php:1120 +#: mod/photos.php:1121 msgid "Photo not available" msgstr "Фото недоступно" -#: mod/photos.php:1130 +#: mod/photos.php:1131 msgid "Do you really want to delete this photo?" msgstr "Вы действительно хотите удалить эту фотографию?" -#: mod/photos.php:1131 mod/photos.php:1331 +#: mod/photos.php:1132 mod/photos.php:1333 msgid "Delete Photo" msgstr "Удалить фото" -#: mod/photos.php:1222 +#: mod/photos.php:1224 msgid "View photo" msgstr "Просмотр фото" -#: mod/photos.php:1224 +#: mod/photos.php:1226 msgid "Edit photo" msgstr "Редактировать фото" -#: mod/photos.php:1225 +#: mod/photos.php:1227 msgid "Delete photo" msgstr "Удалить фото" -#: mod/photos.php:1226 +#: mod/photos.php:1228 msgid "Use as profile photo" msgstr "Использовать как фото профиля" -#: mod/photos.php:1233 +#: mod/photos.php:1235 msgid "Private Photo" msgstr "Закрытое фото" -#: mod/photos.php:1239 +#: mod/photos.php:1241 msgid "View Full Size" msgstr "Просмотреть полный размер" -#: mod/photos.php:1299 +#: mod/photos.php:1301 msgid "Tags: " msgstr "Ключевые слова: " -#: mod/photos.php:1302 +#: mod/photos.php:1304 msgid "[Select tags to remove]" msgstr "[выберите тэги для удаления]" -#: mod/photos.php:1317 +#: mod/photos.php:1319 msgid "New album name" msgstr "Название нового альбома" -#: mod/photos.php:1318 +#: mod/photos.php:1320 msgid "Caption" msgstr "Подпись" -#: mod/photos.php:1319 +#: mod/photos.php:1321 msgid "Add a Tag" msgstr "Добавить тег" -#: mod/photos.php:1319 +#: mod/photos.php:1321 msgid "" "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping" msgstr "Пример: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping" -#: mod/photos.php:1320 +#: mod/photos.php:1322 msgid "Do not rotate" msgstr "Не поворачивать" -#: mod/photos.php:1321 +#: mod/photos.php:1323 msgid "Rotate CW (right)" msgstr "Поворот по часовой стрелке (направо)" -#: mod/photos.php:1322 +#: mod/photos.php:1324 msgid "Rotate CCW (left)" msgstr "Поворот против часовой стрелки (налево)" -#: mod/photos.php:1368 mod/photos.php:1424 mod/photos.php:1498 -#: src/Module/Contact.php:1046 src/Module/Item/Compose.php:148 -#: src/Object/Post.php:959 +#: mod/photos.php:1370 mod/photos.php:1426 mod/photos.php:1500 +#: src/Module/Contact.php:1062 src/Module/Item/Compose.php:148 +#: src/Object/Post.php:960 msgid "This is you" msgstr "Это вы" -#: mod/photos.php:1370 mod/photos.php:1426 mod/photos.php:1500 -#: src/Object/Post.php:495 src/Object/Post.php:961 +#: mod/photos.php:1372 mod/photos.php:1428 mod/photos.php:1502 +#: src/Object/Post.php:496 src/Object/Post.php:962 msgid "Comment" msgstr "Комментировать" -#: mod/photos.php:1521 src/Object/Post.php:348 +#: mod/photos.php:1461 src/Content/Conversation.php:615 +#: src/Object/Post.php:227 +msgid "Select" +msgstr "Выберите" + +#: mod/photos.php:1462 mod/settings.php:573 src/Content/Conversation.php:616 +#: src/Module/Admin/Users/Active.php:139 +#: src/Module/Admin/Users/Blocked.php:140 src/Module/Admin/Users/Index.php:153 +#: src/Module/Contact.php:865 src/Module/Contact.php:1150 +msgid "Delete" +msgstr "Удалить" + +#: mod/photos.php:1523 src/Object/Post.php:349 msgid "Like" msgstr "" -#: mod/photos.php:1522 src/Object/Post.php:348 +#: mod/photos.php:1524 src/Object/Post.php:349 msgid "I like this (toggle)" msgstr "Нравится" -#: mod/photos.php:1523 src/Object/Post.php:349 +#: mod/photos.php:1525 src/Object/Post.php:350 msgid "Dislike" msgstr "" -#: mod/photos.php:1525 src/Object/Post.php:349 +#: mod/photos.php:1527 src/Object/Post.php:350 msgid "I don't like this (toggle)" msgstr "Не нравится" -#: mod/photos.php:1547 +#: mod/photos.php:1549 msgid "Map" msgstr "Карта" -#: mod/photos.php:1617 mod/videos.php:243 +#: mod/photos.php:1619 mod/videos.php:243 msgid "View Album" msgstr "Просмотреть альбом" @@ -1949,7 +1610,7 @@ msgstr "Система автоматически загружает диало #: mod/settings.php:551 msgid "Enable Content Warning" -msgstr "" +msgstr "Включить предупреждение о контенте" #: mod/settings.php:551 msgid "" @@ -1957,7 +1618,7 @@ msgid "" " field which collapse their post by default. This enables the automatic " "collapsing instead of setting the content warning as the post title. Doesn't" " affect any other content filtering you eventually set up." -msgstr "" +msgstr "Пользователи некоторых сетей, таких как Mastodon или Pleroma, могут использовать \"предупреждение о контенте\", сворачивающее их записи. Эта настройка выключает это свёртывание вместо обычного помещения \"предупреждения о контенте\" в заголовок записи. Это не влияет на другие фильтры, которые вы можете настроить." #: mod/settings.php:552 msgid "Enable intelligent shortening" @@ -2203,7 +1864,7 @@ msgstr "Настройки аккаунта" msgid "Password Settings" msgstr "Смена пароля" -#: mod/settings.php:719 src/Module/Register.php:149 +#: mod/settings.php:719 src/Module/Register.php:151 msgid "New Password:" msgstr "Новый пароль:" @@ -2213,7 +1874,7 @@ msgid "" "spaces, accentuated letters and colon (:)." msgstr "Разрешенные символы: a-z, A-Z, 0-9 специальные символы за исключением пробелов, букв с акцентами и двоеточия (:)." -#: mod/settings.php:720 src/Module/Register.php:150 +#: mod/settings.php:720 src/Module/Register.php:152 msgid "Confirm:" msgstr "Подтвердите:" @@ -2571,6 +2232,19 @@ msgstr "Нет предложений. Если это новый сайт, по msgid "Friend Suggestions" msgstr "Предложения друзей" +#: mod/tagger.php:90 src/Content/Item.php:346 src/Model/Item.php:2624 +msgid "photo" +msgstr "фото" + +#: mod/tagger.php:90 src/Content/Item.php:341 src/Content/Item.php:350 +msgid "status" +msgstr "статус" + +#: mod/tagger.php:123 src/Content/Item.php:360 +#, php-format +msgid "%1$s tagged %2$s's %3$s with %4$s" +msgstr "%1$s tagged %2$s's %3$s в %4$s" + #: mod/tagrm.php:115 msgid "Remove Item Tag" msgstr "Удалить ключевое слово" @@ -2588,13 +2262,13 @@ msgstr "Удалить" msgid "User imports on closed servers can only be done by an administrator." msgstr "Импорт пользователей на закрытых серверах может быть произведён только администратором." -#: mod/uimport.php:54 src/Module/Register.php:84 +#: mod/uimport.php:54 src/Module/Register.php:86 msgid "" "This site has exceeded the number of allowed daily account registrations. " "Please try again tomorrow." msgstr "Этот сайт превысил допустимое количество ежедневных регистраций. Пожалуйста, повторите попытку завтра." -#: mod/uimport.php:61 src/Module/Register.php:160 +#: mod/uimport.php:61 src/Module/Register.php:162 msgid "Import" msgstr "Импорт" @@ -2704,7 +2378,7 @@ msgid "" "your site allow private mail from unknown senders." msgstr "Если Вы хотите ответить %s, пожалуйста, проверьте, позволяют ли настройки конфиденциальности на Вашем сайте принимать личные сообщения от неизвестных отправителей." -#: src/App.php:452 +#: src/App.php:453 msgid "No system theme config value set." msgstr "Настройки системной темы не установлены." @@ -2746,18 +2420,18 @@ msgid "All contacts" msgstr "Все контакты" #: src/BaseModule.php:212 src/Content/Widget.php:238 src/Core/ACL.php:195 -#: src/Module/Contact.php:816 src/Module/PermissionTooltip.php:77 +#: src/Module/Contact.php:831 src/Module/PermissionTooltip.php:77 #: src/Module/PermissionTooltip.php:99 msgid "Followers" msgstr "Подписаны на вас" #: src/BaseModule.php:217 src/Content/Widget.php:239 -#: src/Module/Contact.php:817 +#: src/Module/Contact.php:832 msgid "Following" msgstr "Ваши подписки" #: src/BaseModule.php:222 src/Content/Widget.php:240 -#: src/Module/Contact.php:818 +#: src/Module/Contact.php:833 msgid "Mutual friends" msgstr "Взаимные друзья" @@ -2975,6 +2649,268 @@ msgstr "pnut" msgid "%s (via %s)" msgstr "%s (через %s)" +#: src/Content/Conversation.php:207 +#, php-format +msgid "%s likes this." +msgstr "%s нравится это." + +#: src/Content/Conversation.php:210 +#, php-format +msgid "%s doesn't like this." +msgstr "%s не нравится это." + +#: src/Content/Conversation.php:213 +#, php-format +msgid "%s attends." +msgstr "%s посещает." + +#: src/Content/Conversation.php:216 +#, php-format +msgid "%s doesn't attend." +msgstr "%s не посетит." + +#: src/Content/Conversation.php:219 +#, php-format +msgid "%s attends maybe." +msgstr "%s может быть посетит." + +#: src/Content/Conversation.php:222 src/Content/Conversation.php:260 +#: src/Content/Conversation.php:848 +#, php-format +msgid "%s reshared this." +msgstr "%s поделился этим." + +#: src/Content/Conversation.php:228 +msgid "and" +msgstr "и" + +#: src/Content/Conversation.php:231 +#, php-format +msgid "and %d other people" +msgstr "и еще %d человек" + +#: src/Content/Conversation.php:239 +#, php-format +msgid "%2$d people like this" +msgstr "%2$d людям нравится это" + +#: src/Content/Conversation.php:240 +#, php-format +msgid "%s like this." +msgstr "%s нравится это." + +#: src/Content/Conversation.php:243 +#, php-format +msgid "%2$d people don't like this" +msgstr "%2$d людям не нравится это" + +#: src/Content/Conversation.php:244 +#, php-format +msgid "%s don't like this." +msgstr "%s не нравится это" + +#: src/Content/Conversation.php:247 +#, php-format +msgid "%2$d people attend" +msgstr "%2$d человека посетят" + +#: src/Content/Conversation.php:248 +#, php-format +msgid "%s attend." +msgstr "%s посетит." + +#: src/Content/Conversation.php:251 +#, php-format +msgid "%2$d people don't attend" +msgstr "%2$d человек не посетит" + +#: src/Content/Conversation.php:252 +#, php-format +msgid "%s don't attend." +msgstr "%s не посетит" + +#: src/Content/Conversation.php:255 +#, php-format +msgid "%2$d people attend maybe" +msgstr "%2$d человек может быть посетят" + +#: src/Content/Conversation.php:256 +#, php-format +msgid "%s attend maybe." +msgstr "%s может быть посетит." + +#: src/Content/Conversation.php:259 +#, php-format +msgid "%2$d people reshared this" +msgstr "%2$d людей поделились этим" + +#: src/Content/Conversation.php:307 +msgid "Visible to everybody" +msgstr "Видимое всем" + +#: src/Content/Conversation.php:308 src/Module/Item/Compose.php:159 +#: src/Object/Post.php:973 +msgid "Please enter a image/video/audio/webpage URL:" +msgstr "Пожалуйста, введите адрес картинки/видео/аудио/странички:" + +#: src/Content/Conversation.php:309 +msgid "Tag term:" +msgstr "Тег:" + +#: src/Content/Conversation.php:310 src/Module/Filer/SaveTag.php:68 +msgid "Save to Folder:" +msgstr "Сохранить в папку:" + +#: src/Content/Conversation.php:311 +msgid "Where are you right now?" +msgstr "И где вы сейчас?" + +#: src/Content/Conversation.php:312 +msgid "Delete item(s)?" +msgstr "Удалить елемент(ты)?" + +#: src/Content/Conversation.php:322 +msgid "New Post" +msgstr "Новая запись" + +#: src/Content/Conversation.php:325 +msgid "Share" +msgstr "Поделиться" + +#: src/Content/Conversation.php:331 src/Module/Item/Compose.php:151 +#: src/Object/Post.php:965 +msgid "Bold" +msgstr "Жирный" + +#: src/Content/Conversation.php:332 src/Module/Item/Compose.php:152 +#: src/Object/Post.php:966 +msgid "Italic" +msgstr "Kурсивный" + +#: src/Content/Conversation.php:333 src/Module/Item/Compose.php:153 +#: src/Object/Post.php:967 +msgid "Underline" +msgstr "Подчеркнутый" + +#: src/Content/Conversation.php:334 src/Module/Item/Compose.php:154 +#: src/Object/Post.php:968 +msgid "Quote" +msgstr "Цитата" + +#: src/Content/Conversation.php:335 src/Module/Item/Compose.php:155 +#: src/Object/Post.php:969 +msgid "Code" +msgstr "Код" + +#: src/Content/Conversation.php:336 src/Module/Item/Compose.php:156 +#: src/Object/Post.php:970 +msgid "Image" +msgstr "Изображение / Фото" + +#: src/Content/Conversation.php:337 src/Module/Item/Compose.php:157 +#: src/Object/Post.php:971 +msgid "Link" +msgstr "Ссылка" + +#: src/Content/Conversation.php:338 src/Module/Item/Compose.php:158 +#: src/Object/Post.php:972 +msgid "Link or Media" +msgstr "Ссылка или медиа" + +#: src/Content/Conversation.php:339 +msgid "Video" +msgstr "" + +#: src/Content/Conversation.php:352 src/Module/Item/Compose.php:172 +msgid "Scheduled at" +msgstr "Запланировано на" + +#: src/Content/Conversation.php:651 src/Object/Post.php:454 +#: src/Object/Post.php:455 +#, php-format +msgid "View %s's profile @ %s" +msgstr "Просмотреть профиль %s [@ %s]" + +#: src/Content/Conversation.php:664 src/Object/Post.php:442 +msgid "Categories:" +msgstr "Категории:" + +#: src/Content/Conversation.php:665 src/Object/Post.php:443 +msgid "Filed under:" +msgstr "В рубрике:" + +#: src/Content/Conversation.php:672 src/Object/Post.php:468 +#, php-format +msgid "%s from %s" +msgstr "%s из %s" + +#: src/Content/Conversation.php:687 +msgid "View in context" +msgstr "Смотреть в контексте" + +#: src/Content/Conversation.php:752 +msgid "remove" +msgstr "удалить" + +#: src/Content/Conversation.php:756 +msgid "Delete Selected Items" +msgstr "Удалить выбранные позиции" + +#: src/Content/Conversation.php:820 src/Content/Conversation.php:823 +#: src/Content/Conversation.php:826 src/Content/Conversation.php:829 +#, php-format +msgid "You had been addressed (%s)." +msgstr "К вам обратились (%s)." + +#: src/Content/Conversation.php:832 +#, php-format +msgid "You are following %s." +msgstr "Вы подписаны на %s." + +#: src/Content/Conversation.php:835 +msgid "Tagged" +msgstr "Отмечено" + +#: src/Content/Conversation.php:850 +msgid "Reshared" +msgstr "Репост" + +#: src/Content/Conversation.php:850 +#, php-format +msgid "Reshared by %s <%s>" +msgstr "" + +#: src/Content/Conversation.php:853 +#, php-format +msgid "%s is participating in this thread." +msgstr "%s участвует в этом обсуждении" + +#: src/Content/Conversation.php:856 +msgid "Stored" +msgstr "" + +#: src/Content/Conversation.php:859 +msgid "Global" +msgstr "" + +#: src/Content/Conversation.php:862 +msgid "Relayed" +msgstr "Ретранслировано" + +#: src/Content/Conversation.php:862 +#, php-format +msgid "Relayed by %s <%s>" +msgstr "" + +#: src/Content/Conversation.php:865 +msgid "Fetched" +msgstr "Загружено" + +#: src/Content/Conversation.php:865 +#, php-format +msgid "Fetched because of %s <%s>" +msgstr "" + #: src/Content/Feature.php:96 msgid "General Features" msgstr "Основные возможности" @@ -3080,6 +3016,70 @@ msgstr "" msgid "show more" msgstr "показать больше" +#: src/Content/Item.php:305 +#, php-format +msgid "%1$s poked %2$s" +msgstr "%1$s ткнул %2$s" + +#: src/Content/Item.php:338 src/Model/Item.php:2622 +msgid "event" +msgstr "мероприятие" + +#: src/Content/Item.php:442 view/theme/frio/theme.php:323 +msgid "Follow Thread" +msgstr "Подписаться на обсуждение" + +#: src/Content/Item.php:443 src/Model/Contact.php:1056 +msgid "View Status" +msgstr "Просмотреть статус" + +#: src/Content/Item.php:444 src/Content/Item.php:466 src/Model/Contact.php:982 +#: src/Model/Contact.php:1048 src/Model/Contact.php:1057 +#: src/Module/Directory.php:160 src/Module/Settings/Profile/Index.php:223 +msgid "View Profile" +msgstr "Просмотреть профиль" + +#: src/Content/Item.php:445 src/Model/Contact.php:1058 +msgid "View Photos" +msgstr "Просмотреть фото" + +#: src/Content/Item.php:446 src/Model/Contact.php:1049 +#: src/Model/Contact.php:1059 +msgid "Network Posts" +msgstr "Записи сети" + +#: src/Content/Item.php:447 src/Model/Contact.php:1050 +#: src/Model/Contact.php:1060 +msgid "View Contact" +msgstr "Просмотреть контакт" + +#: src/Content/Item.php:448 src/Model/Contact.php:1062 +msgid "Send PM" +msgstr "Отправить ЛС" + +#: src/Content/Item.php:449 src/Module/Admin/Blocklist/Contact.php:84 +#: src/Module/Admin/Users/Active.php:140 src/Module/Admin/Users/Index.php:154 +#: src/Module/Contact.php:602 src/Module/Contact.php:863 +#: src/Module/Contact.php:1133 +msgid "Block" +msgstr "Заблокировать" + +#: src/Content/Item.php:450 src/Module/Contact.php:603 +#: src/Module/Contact.php:864 src/Module/Contact.php:1141 +#: src/Module/Notifications/Introductions.php:113 +#: src/Module/Notifications/Introductions.php:185 +#: src/Module/Notifications/Notification.php:59 +msgid "Ignore" +msgstr "Игнорировать" + +#: src/Content/Item.php:454 src/Object/Post.php:429 +msgid "Languages" +msgstr "Языки" + +#: src/Content/Item.php:458 src/Model/Contact.php:1063 +msgid "Poke" +msgstr "потыкать" + #: src/Content/Nav.php:90 msgid "Nothing new here" msgstr "Ничего нового здесь" @@ -3104,7 +3104,7 @@ msgstr "Выход" msgid "End this session" msgstr "Завершить эту сессию" -#: src/Content/Nav.php:185 src/Module/Bookmarklet.php:45 +#: src/Content/Nav.php:185 src/Module/Bookmarklet.php:44 #: src/Module/Security/Login.php:146 msgid "Login" msgstr "Вход" @@ -3114,7 +3114,7 @@ msgid "Sign in" msgstr "Вход" #: src/Content/Nav.php:190 src/Module/BaseProfile.php:56 -#: src/Module/Contact.php:619 src/Module/Contact.php:883 +#: src/Module/Contact.php:634 src/Module/Contact.php:899 #: src/Module/Settings/TwoFactor/Index.php:112 view/theme/frio/theme.php:226 msgid "Status" msgstr "Записи" @@ -3125,8 +3125,8 @@ msgid "Your posts and conversations" msgstr "Ваши записи и диалоги" #: src/Content/Nav.php:191 src/Module/BaseProfile.php:48 -#: src/Module/BaseSettings.php:57 src/Module/Contact.php:621 -#: src/Module/Contact.php:899 src/Module/Profile/Profile.php:241 +#: src/Module/BaseSettings.php:57 src/Module/Contact.php:636 +#: src/Module/Contact.php:915 src/Module/Profile/Profile.php:241 #: src/Module/Welcome.php:57 view/theme/frio/theme.php:227 msgid "Profile" msgstr "Информация" @@ -3163,7 +3163,7 @@ msgstr "Ваши личные заметки" msgid "Home" msgstr "Мой профиль" -#: src/Content/Nav.php:216 src/Module/Register.php:155 +#: src/Content/Nav.php:216 src/Module/Register.php:157 #: src/Module/Security/Login.php:106 msgid "Register" msgstr "Регистрация" @@ -3212,8 +3212,8 @@ msgstr "Тэги" #: src/Content/Nav.php:235 src/Content/Nav.php:294 #: src/Content/Text/HTML.php:902 src/Module/BaseProfile.php:126 -#: src/Module/BaseProfile.php:129 src/Module/Contact.php:819 -#: src/Module/Contact.php:906 view/theme/frio/theme.php:237 +#: src/Module/BaseProfile.php:129 src/Module/Contact.php:834 +#: src/Module/Contact.php:922 view/theme/frio/theme.php:237 msgid "Contacts" msgstr "Контакты" @@ -3247,7 +3247,7 @@ msgid "Information about this friendica instance" msgstr "Информация об этом экземпляре Friendica" #: src/Content/Nav.php:266 src/Module/Admin/Tos.php:59 -#: src/Module/BaseAdmin.php:96 src/Module/Register.php:163 +#: src/Module/BaseAdmin.php:96 src/Module/Register.php:165 #: src/Module/Tos.php:84 msgid "Terms of Service" msgstr "Условия оказания услуг" @@ -3359,38 +3359,38 @@ msgstr "след." msgid "last" msgstr "последний" -#: src/Content/Text/BBCode.php:980 src/Content/Text/BBCode.php:1768 -#: src/Content/Text/BBCode.php:1769 +#: src/Content/Text/BBCode.php:985 src/Content/Text/BBCode.php:1773 +#: src/Content/Text/BBCode.php:1774 msgid "Image/photo" msgstr "Изображение / Фото" -#: src/Content/Text/BBCode.php:1153 +#: src/Content/Text/BBCode.php:1158 #, php-format msgid "%2$s %3$s" msgstr "%2$s %3$s" -#: src/Content/Text/BBCode.php:1178 src/Model/Item.php:3139 -#: src/Model/Item.php:3145 src/Model/Item.php:3146 +#: src/Content/Text/BBCode.php:1183 src/Model/Item.php:3152 +#: src/Model/Item.php:3158 src/Model/Item.php:3159 msgid "Link to source" msgstr "" -#: src/Content/Text/BBCode.php:1686 src/Content/Text/HTML.php:943 +#: src/Content/Text/BBCode.php:1691 src/Content/Text/HTML.php:943 msgid "Click to open/close" msgstr "Нажмите, чтобы открыть / закрыть" -#: src/Content/Text/BBCode.php:1717 +#: src/Content/Text/BBCode.php:1722 msgid "$1 wrote:" msgstr "$1 написал:" -#: src/Content/Text/BBCode.php:1773 src/Content/Text/BBCode.php:1774 +#: src/Content/Text/BBCode.php:1778 src/Content/Text/BBCode.php:1779 msgid "Encrypted content" msgstr "Зашифрованный контент" -#: src/Content/Text/BBCode.php:1990 +#: src/Content/Text/BBCode.php:1995 msgid "Invalid source protocol" msgstr "Неправильный протокол источника" -#: src/Content/Text/BBCode.php:2005 +#: src/Content/Text/BBCode.php:2010 msgid "Invalid link protocol" msgstr "Неправильная протокольная ссылка" @@ -3444,7 +3444,7 @@ msgstr "Введите имя или интерес" msgid "Examples: Robert Morgenstein, Fishing" msgstr "Примеры: Роберт Morgenstein, Рыбалка" -#: src/Content/Widget.php:78 src/Module/Contact.php:840 +#: src/Content/Widget.php:78 src/Module/Contact.php:855 #: src/Module/Directory.php:99 view/theme/vier/theme.php:174 msgid "Find" msgstr "Найти" @@ -3471,7 +3471,7 @@ msgid "Local Directory" msgstr "Локальный каталог" #: src/Content/Widget.php:214 src/Model/Group.php:535 -#: src/Module/Contact.php:803 src/Module/Welcome.php:76 +#: src/Module/Contact.php:818 src/Module/Welcome.php:76 msgid "Groups" msgstr "Группы" @@ -3483,7 +3483,7 @@ msgstr "Все" msgid "Relationships" msgstr "Отношения" -#: src/Content/Widget.php:247 src/Module/Contact.php:755 +#: src/Content/Widget.php:247 src/Module/Contact.php:770 #: src/Module/Group.php:292 msgid "All Contacts" msgstr "Все контакты" @@ -3529,7 +3529,7 @@ msgstr "Люди" msgid "Organisations" msgstr "Организации" -#: src/Content/Widget.php:529 src/Model/Contact.php:1474 +#: src/Content/Widget.php:529 src/Model/Contact.php:1480 msgid "News" msgstr "Новости" @@ -3549,11 +3549,11 @@ msgstr "Экспортировать календарь в формат ical" msgid "Export calendar as csv" msgstr "Экспортировать календарь в формат csv" -#: src/Content/Widget/ContactBlock.php:73 +#: src/Content/Widget/ContactBlock.php:79 msgid "No contacts" msgstr "Нет контактов" -#: src/Content/Widget/ContactBlock.php:105 +#: src/Content/Widget/ContactBlock.php:108 #, php-format msgid "%d Contact" msgid_plural "%d Contacts" @@ -3562,7 +3562,7 @@ msgstr[1] "%d контактов" msgstr[2] "%d контактов" msgstr[3] "%d контактов" -#: src/Content/Widget/ContactBlock.php:124 +#: src/Content/Widget/ContactBlock.php:125 msgid "View Contacts" msgstr "Просмотр контактов" @@ -3588,12 +3588,12 @@ msgid "More Trending Tags" msgstr "Больше популярных тэгов" #: src/Content/Widget/VCard.php:96 src/Model/Profile.php:372 -#: src/Module/Contact.php:610 src/Module/Profile/Profile.php:176 +#: src/Module/Contact.php:625 src/Module/Profile/Profile.php:176 msgid "XMPP:" msgstr "XMPP:" #: src/Content/Widget/VCard.php:97 src/Model/Profile.php:373 -#: src/Module/Contact.php:612 src/Module/Profile/Profile.php:180 +#: src/Module/Contact.php:627 src/Module/Profile/Profile.php:180 msgid "Matrix:" msgstr "" @@ -4399,85 +4399,85 @@ msgstr "%s теперь друзья с %s" msgid "Legacy module file not found: %s" msgstr "Legacy-модуль не найден: %s" -#: src/Model/Contact.php:1046 src/Model/Contact.php:1059 +#: src/Model/Contact.php:1052 src/Model/Contact.php:1065 msgid "UnFollow" msgstr "Отписаться" -#: src/Model/Contact.php:1055 +#: src/Model/Contact.php:1061 msgid "Drop Contact" msgstr "Удалить контакт" -#: src/Model/Contact.php:1065 src/Module/Admin/Users/Pending.php:107 +#: src/Model/Contact.php:1071 src/Module/Admin/Users/Pending.php:107 #: src/Module/Notifications/Introductions.php:111 #: src/Module/Notifications/Introductions.php:183 msgid "Approve" msgstr "Одобрить" -#: src/Model/Contact.php:1470 +#: src/Model/Contact.php:1476 msgid "Organisation" msgstr "Организация" -#: src/Model/Contact.php:1478 +#: src/Model/Contact.php:1484 msgid "Forum" msgstr "Форум" -#: src/Model/Contact.php:2334 +#: src/Model/Contact.php:2340 msgid "Disallowed profile URL." msgstr "Запрещенный URL профиля." -#: src/Model/Contact.php:2339 src/Module/Friendica.php:81 +#: src/Model/Contact.php:2345 src/Module/Friendica.php:81 msgid "Blocked domain" msgstr "Заблокированный домен" -#: src/Model/Contact.php:2344 +#: src/Model/Contact.php:2350 msgid "Connect URL missing." msgstr "Connect-URL отсутствует." -#: src/Model/Contact.php:2353 +#: src/Model/Contact.php:2359 msgid "" "The contact could not be added. Please check the relevant network " "credentials in your Settings -> Social Networks page." msgstr "Контакт не может быть добавлен. Пожалуйста проверьте учётные данные на странице Настройки -> Социальные сети." -#: src/Model/Contact.php:2390 +#: src/Model/Contact.php:2396 msgid "The profile address specified does not provide adequate information." msgstr "Указанный адрес профиля не дает адекватной информации." -#: src/Model/Contact.php:2392 +#: src/Model/Contact.php:2398 msgid "No compatible communication protocols or feeds were discovered." msgstr "Обнаружены несовместимые протоколы связи или каналы." -#: src/Model/Contact.php:2395 +#: src/Model/Contact.php:2401 msgid "An author or name was not found." msgstr "Автор или имя не найдены." -#: src/Model/Contact.php:2398 +#: src/Model/Contact.php:2404 msgid "No browser URL could be matched to this address." msgstr "Нет URL браузера, который соответствует этому адресу." -#: src/Model/Contact.php:2401 +#: src/Model/Contact.php:2407 msgid "" "Unable to match @-style Identity Address with a known protocol or email " "contact." msgstr "Не получается совместить этот адрес с известным протоколом или контактом электронной почты." -#: src/Model/Contact.php:2402 +#: src/Model/Contact.php:2408 msgid "Use mailto: in front of address to force email check." msgstr "Bcgjkmpeqnt mailto: перед адресом для быстрого доступа к email." -#: src/Model/Contact.php:2408 +#: src/Model/Contact.php:2414 msgid "" "The profile address specified belongs to a network which has been disabled " "on this site." msgstr "Указанный адрес профиля принадлежит сети, недоступной на этом сайта." -#: src/Model/Contact.php:2413 +#: src/Model/Contact.php:2419 msgid "" "Limited profile. This person will be unable to receive direct/personal " "notifications from you." msgstr "Ограниченный профиль. Этот человек не сможет получить прямые / личные уведомления от вас." -#: src/Model/Contact.php:2472 +#: src/Model/Contact.php:2478 msgid "Unable to retrieve contact information." msgstr "Невозможно получить контактную информацию." @@ -4594,33 +4594,33 @@ msgstr "Название группы: " msgid "Edit groups" msgstr "Редактировать группы" -#: src/Model/Item.php:1663 +#: src/Model/Item.php:1676 #, php-format msgid "Detected languages in this post:\\n%s" msgstr "Обнаруженные в этой записи языки:\\n%s" -#: src/Model/Item.php:2613 +#: src/Model/Item.php:2626 msgid "activity" msgstr "активность" -#: src/Model/Item.php:2615 +#: src/Model/Item.php:2628 msgid "comment" msgstr "" -#: src/Model/Item.php:2618 +#: src/Model/Item.php:2631 msgid "post" msgstr "пост" -#: src/Model/Item.php:2755 +#: src/Model/Item.php:2768 #, php-format msgid "Content warning: %s" msgstr "Предупреждение о контенте: %s" -#: src/Model/Item.php:3104 +#: src/Model/Item.php:3117 msgid "bytes" msgstr "байт" -#: src/Model/Item.php:3133 src/Model/Item.php:3134 +#: src/Model/Item.php:3146 src/Model/Item.php:3147 msgid "View on separate page" msgstr "Посмотреть в отдельной вкладке" @@ -4676,7 +4676,7 @@ msgstr "" #: src/Model/Notification.php:293 #, php-format msgid "%1$s replied to you on %2$s" -msgstr "" +msgstr "%1$s ответил(а) вам на %2$s" #: src/Model/Notification.php:297 #, php-format @@ -4747,7 +4747,7 @@ msgstr "Изменить фото профиля" msgid "Homepage:" msgstr "Домашняя страничка:" -#: src/Model/Profile.php:371 src/Module/Contact.php:614 +#: src/Model/Profile.php:371 src/Module/Contact.php:629 #: src/Module/Notifications/Introductions.php:168 msgid "About:" msgstr "О себе:" @@ -4807,7 +4807,7 @@ msgstr "Каталог, куда сохраняются загруженные msgid "Enter a valid existing folder" msgstr "Введите путь к существующему каталогу" -#: src/Model/User.php:208 src/Model/User.php:1004 +#: src/Model/User.php:208 src/Model/User.php:1055 msgid "SERIOUS ERROR: Generation of security keys failed." msgstr "СЕРЬЕЗНАЯ ОШИБКА: генерация ключей безопасности не удалась." @@ -4838,44 +4838,44 @@ msgid "" "The password can't contain accentuated letters, white spaces or colons (:)" msgstr "Пароль не может содержать символы с акцентами, пробелы или двоеточия (:)" -#: src/Model/User.php:884 +#: src/Model/User.php:935 msgid "Passwords do not match. Password unchanged." msgstr "Пароли не совпадают. Пароль не изменен." -#: src/Model/User.php:891 +#: src/Model/User.php:942 msgid "An invitation is required." msgstr "Требуется приглашение." -#: src/Model/User.php:895 +#: src/Model/User.php:946 msgid "Invitation could not be verified." msgstr "Приглашение не может быть проверено." -#: src/Model/User.php:903 +#: src/Model/User.php:954 msgid "Invalid OpenID url" msgstr "Неверный URL OpenID" -#: src/Model/User.php:916 src/Security/Authentication.php:223 +#: src/Model/User.php:967 src/Security/Authentication.php:223 msgid "" "We encountered a problem while logging in with the OpenID you provided. " "Please check the correct spelling of the ID." msgstr "Мы столкнулись с проблемой при входе с OpenID, который вы указали. Пожалуйста, проверьте правильность написания ID." -#: src/Model/User.php:916 src/Security/Authentication.php:223 +#: src/Model/User.php:967 src/Security/Authentication.php:223 msgid "The error message was:" msgstr "Сообщение об ошибке было:" -#: src/Model/User.php:922 +#: src/Model/User.php:973 msgid "Please enter the required information." msgstr "Пожалуйста, введите необходимую информацию." -#: src/Model/User.php:936 +#: src/Model/User.php:987 #, php-format msgid "" "system.username_min_length (%s) and system.username_max_length (%s) are " "excluding each other, swapping values." msgstr "system.username_min_length (%s) и system.username_max_length (%s) противоречат друг другу, меняем их местами." -#: src/Model/User.php:943 +#: src/Model/User.php:994 #, php-format msgid "Username should be at least %s character." msgid_plural "Username should be at least %s characters." @@ -4884,7 +4884,7 @@ msgstr[1] "Имя пользователя должно быть хотя бы % msgstr[2] "Имя пользователя должно быть хотя бы %s символов." msgstr[3] "Имя пользователя должно быть хотя бы %s символов." -#: src/Model/User.php:947 +#: src/Model/User.php:998 #, php-format msgid "Username should be at most %s character." msgid_plural "Username should be at most %s characters." @@ -4893,56 +4893,56 @@ msgstr[1] "Имя пользователя должно быть не больш msgstr[2] "Имя пользователя должно быть не больше %s символов." msgstr[3] "Имя пользователя должно быть не больше %s символов." -#: src/Model/User.php:955 +#: src/Model/User.php:1006 msgid "That doesn't appear to be your full (First Last) name." msgstr "Кажется, что это ваше неполное (Имя Фамилия) имя." -#: src/Model/User.php:960 +#: src/Model/User.php:1011 msgid "Your email domain is not among those allowed on this site." msgstr "Домен вашего адреса электронной почты не относится к числу разрешенных на этом сайте." -#: src/Model/User.php:964 +#: src/Model/User.php:1015 msgid "Not a valid email address." msgstr "Неверный адрес электронной почты." -#: src/Model/User.php:967 +#: src/Model/User.php:1018 msgid "The nickname was blocked from registration by the nodes admin." msgstr "Этот ник был заблокирован для регистрации администратором узла." -#: src/Model/User.php:971 src/Model/User.php:979 +#: src/Model/User.php:1022 src/Model/User.php:1030 msgid "Cannot use that email." msgstr "Нельзя использовать этот Email." -#: src/Model/User.php:986 +#: src/Model/User.php:1037 msgid "Your nickname can only contain a-z, 0-9 and _." msgstr "Ваш ник может содержать только символы a-z, 0-9 и _." -#: src/Model/User.php:994 src/Model/User.php:1051 +#: src/Model/User.php:1045 src/Model/User.php:1102 msgid "Nickname is already registered. Please choose another." msgstr "Такой ник уже зарегистрирован. Пожалуйста, выберите другой." -#: src/Model/User.php:1038 src/Model/User.php:1042 +#: src/Model/User.php:1089 src/Model/User.php:1093 msgid "An error occurred during registration. Please try again." msgstr "Ошибка при регистрации. Пожалуйста, попробуйте еще раз." -#: src/Model/User.php:1065 +#: src/Model/User.php:1116 msgid "An error occurred creating your default profile. Please try again." msgstr "Ошибка создания вашего профиля. Пожалуйста, попробуйте еще раз." -#: src/Model/User.php:1072 +#: src/Model/User.php:1123 msgid "An error occurred creating your self contact. Please try again." msgstr "При создании вашего контакта возникла проблема. Пожалуйста, попробуйте ещё раз." -#: src/Model/User.php:1077 +#: src/Model/User.php:1128 msgid "Friends" msgstr "Друзья" -#: src/Model/User.php:1081 +#: src/Model/User.php:1132 msgid "" "An error occurred creating your default contact group. Please try again." msgstr "При создании группы контактов по-умолчанию возникла ошибка. Пожалуйста, попробуйте ещё раз." -#: src/Model/User.php:1310 +#: src/Model/User.php:1361 #, php-format msgid "" "\n" @@ -4950,7 +4950,7 @@ msgid "" "\t\t\tthe administrator of %2$s has set up an account for you." msgstr "\n\t\tУважаемый(ая) %1$s,\n\t\t\tадминистратор %2$s создал для вас учётную запись." -#: src/Model/User.php:1313 +#: src/Model/User.php:1364 #, php-format msgid "" "\n" @@ -4982,12 +4982,12 @@ msgid "" "\t\tThank you and welcome to %4$s." msgstr "\n\t\tДанные для входа в систему:\n\n\t\tМестоположение сайта:\t%1$s\n\t\tЛогин:\t\t%2$s\n\t\tПароль:\t\t%3$s\n\n\t\tВы можете изменить пароль на странице \"Настройки\" после авторизации.\n\n\t\tПожалуйста, уделите время ознакомлению с другими другие настройками аккаунта на этой странице.\n\n\n\t\tВы также можете захотеть добавить немного базовой информации к вашему стандартному профилю\n\t\t(на странице \"Информация\") чтобы другим людям было проще вас найти.\n\n\t\tМы рекомендуем указать ваше полное имя, добавить фотографию,\n\t\tнемного \"ключевых слов\" (очень полезно, чтобы завести новых друзей)\n\t\tи возможно страну вашего проживания; если вы не хотите быть более конкретным.\n\n\t\tМы полностью уважаем ваше право на приватность, поэтому ничего из этого не является обязательным.\n\t\tЕсли же вы новичок и никого не знаете, это может помочь\n\t\tвам завести новых интересных друзей.\n\n\t\tЕсли вы когда-нибудь захотите удалить свой аккаунт, вы можете сделать это перейдя по ссылке %1$s/removeme\n\n\t\tСпасибо и добро пожаловать в %4$s." -#: src/Model/User.php:1346 src/Model/User.php:1453 +#: src/Model/User.php:1397 src/Model/User.php:1504 #, php-format msgid "Registration details for %s" msgstr "Подробности регистрации для %s" -#: src/Model/User.php:1366 +#: src/Model/User.php:1417 #, php-format msgid "" "\n" @@ -5002,12 +5002,12 @@ msgid "" "\t\t" msgstr "\n\t\t\tУважаемый %1$s,\n\t\t\t\tБлагодарим Вас за регистрацию на %2$s. Ваш аккаунт ожидает подтверждения администратором.\n\n\t\t\tВаши данные для входа в систему:\n\n\t\t\tМестоположение сайта:\t%3$s\n\t\t\tЛогин:\t\t%4$s\n\t\t\tПароль:\t\t%5$s\n\t\t" -#: src/Model/User.php:1385 +#: src/Model/User.php:1436 #, php-format msgid "Registration at %s" msgstr "Регистрация на %s" -#: src/Model/User.php:1409 +#: src/Model/User.php:1460 #, php-format msgid "" "\n" @@ -5016,7 +5016,7 @@ msgid "" "\t\t\t" msgstr "\n\t\t\t\tУважаемый(ая) %1$s,\n\t\t\t\tСпасибо за регистрацию на %2$s. Ваша учётная запись создана.\n\t\t\t" -#: src/Model/User.php:1417 +#: src/Model/User.php:1468 #, php-format msgid "" "\n" @@ -5079,7 +5079,7 @@ msgstr "Включить" #: src/Module/Admin/Federation.php:159 src/Module/Admin/Item/Delete.php:65 #: src/Module/Admin/Logs/Settings.php:80 src/Module/Admin/Logs/View.php:84 #: src/Module/Admin/Queue.php:72 src/Module/Admin/Site.php:497 -#: src/Module/Admin/Storage.php:131 src/Module/Admin/Summary.php:232 +#: src/Module/Admin/Storage.php:131 src/Module/Admin/Summary.php:233 #: src/Module/Admin/Themes/Details.php:90 #: src/Module/Admin/Themes/Index.php:111 src/Module/Admin/Tos.php:58 #: src/Module/Admin/Users/Active.php:136 @@ -5143,8 +5143,8 @@ msgstr "" msgid "List of active accounts" msgstr "" -#: src/Module/Admin/BaseUsers.php:66 src/Module/Contact.php:763 -#: src/Module/Contact.php:823 +#: src/Module/Admin/BaseUsers.php:66 src/Module/Contact.php:778 +#: src/Module/Contact.php:838 msgid "Pending" msgstr "В ожидании" @@ -5152,8 +5152,8 @@ msgstr "В ожидании" msgid "List of pending registrations" msgstr "" -#: src/Module/Admin/BaseUsers.php:74 src/Module/Contact.php:771 -#: src/Module/Contact.php:824 +#: src/Module/Admin/BaseUsers.php:74 src/Module/Contact.php:786 +#: src/Module/Contact.php:839 msgid "Blocked" msgstr "Заблокированы" @@ -5213,8 +5213,8 @@ msgstr "сбросить выбор" #: src/Module/Admin/Blocklist/Contact.php:85 #: src/Module/Admin/Users/Blocked.php:142 src/Module/Admin/Users/Index.php:156 -#: src/Module/Contact.php:587 src/Module/Contact.php:847 -#: src/Module/Contact.php:1115 +#: src/Module/Contact.php:602 src/Module/Contact.php:863 +#: src/Module/Contact.php:1133 msgid "Unblock" msgstr "Разблокировать" @@ -5732,7 +5732,7 @@ msgstr "" msgid "Republish users to directory" msgstr "Переопубликовать пользователей в каталог" -#: src/Module/Admin/Site.php:502 src/Module/Register.php:139 +#: src/Module/Admin/Site.php:502 src/Module/Register.php:141 msgid "Registration" msgstr "Регистрация" @@ -6501,7 +6501,7 @@ msgid "" "received." msgstr "Допустимые значения \"all\" или \"tags\". \"all\" означает, что любые публичные записи будут получены. \"tags\" включает приём публичных записей с выбранными тэгами." -#: src/Module/Admin/Site.php:609 src/Module/Contact.php:516 +#: src/Module/Admin/Site.php:609 src/Module/Contact.php:531 #: src/Module/Settings/TwoFactor/Index.php:118 msgid "Disabled" msgstr "Отключенный" @@ -6590,12 +6590,12 @@ msgstr "" msgid "Database (legacy)" msgstr "База данных (устаревшее)" -#: src/Module/Admin/Summary.php:53 +#: src/Module/Admin/Summary.php:54 #, php-format msgid "Template engine (%s) error: %s" msgstr "" -#: src/Module/Admin/Summary.php:57 +#: src/Module/Admin/Summary.php:58 #, php-format msgid "" "Your DB still runs with MyISAM tables. You should change the engine type to " @@ -6606,7 +6606,7 @@ msgid "" " an automatic conversion.
    " msgstr "" -#: src/Module/Admin/Summary.php:62 +#: src/Module/Admin/Summary.php:63 #, php-format msgid "" "Your DB still runs with InnoDB tables in the Antelope file format. You " @@ -6617,7 +6617,7 @@ msgid "" " installation for an automatic conversion.
    " msgstr "" -#: src/Module/Admin/Summary.php:72 +#: src/Module/Admin/Summary.php:73 #, php-format msgid "" "Your table_definition_cache is too low (%d). This can lead to the database " @@ -6625,39 +6625,39 @@ msgid "" " to %d. See here for more information.
    " msgstr "" -#: src/Module/Admin/Summary.php:82 +#: src/Module/Admin/Summary.php:83 #, php-format msgid "" "There is a new version of Friendica available for download. Your current " "version is %1$s, upstream version is %2$s" msgstr "" -#: src/Module/Admin/Summary.php:91 +#: src/Module/Admin/Summary.php:92 msgid "" "The database update failed. Please run \"php bin/console.php dbstructure " "update\" from the command line and have a look at the errors that might " "appear." msgstr "" -#: src/Module/Admin/Summary.php:95 +#: src/Module/Admin/Summary.php:96 msgid "" "The last update failed. Please run \"php bin/console.php dbstructure " "update\" from the command line and have a look at the errors that might " "appear. (Some of the errors are possibly inside the logfile.)" msgstr "" -#: src/Module/Admin/Summary.php:100 +#: src/Module/Admin/Summary.php:101 msgid "The worker was never executed. Please check your database structure!" msgstr "Фоновые задания ни разу не выполнялись. Пожалуйста, проверьте структуру базы данных!" -#: src/Module/Admin/Summary.php:102 +#: src/Module/Admin/Summary.php:103 #, php-format msgid "" "The last worker execution was on %s UTC. This is older than one hour. Please" " check your crontab settings." msgstr "Последний раз фоновое задание выполнялось %s UTC. Это более одного часа назад. Пожалуйста, проверьте настройки crontab." -#: src/Module/Admin/Summary.php:107 +#: src/Module/Admin/Summary.php:108 #, php-format msgid "" "Friendica's configuration now is stored in config/local.config.php, please " @@ -6666,7 +6666,7 @@ msgid "" "help with the transition." msgstr "" -#: src/Module/Admin/Summary.php:111 +#: src/Module/Admin/Summary.php:112 #, php-format msgid "" "Friendica's configuration now is stored in config/local.config.php, please " @@ -6675,7 +6675,7 @@ msgid "" "page for help with the transition." msgstr "" -#: src/Module/Admin/Summary.php:117 +#: src/Module/Admin/Summary.php:118 #, php-format msgid "" "%s is not reachable on your system. This is a severe " @@ -6683,87 +6683,87 @@ msgid "" "href=\"%s\">the installation page for help." msgstr "" -#: src/Module/Admin/Summary.php:135 +#: src/Module/Admin/Summary.php:136 #, php-format msgid "The logfile '%s' is not usable. No logging possible (error: '%s')" msgstr "" -#: src/Module/Admin/Summary.php:149 +#: src/Module/Admin/Summary.php:150 #, php-format msgid "" "The debug logfile '%s' is not usable. No logging possible (error: '%s')" msgstr "" -#: src/Module/Admin/Summary.php:165 +#: src/Module/Admin/Summary.php:166 #, php-format msgid "" "Friendica's system.basepath was updated from '%s' to '%s'. Please remove the" " system.basepath from your db to avoid differences." msgstr "" -#: src/Module/Admin/Summary.php:173 +#: src/Module/Admin/Summary.php:174 #, php-format msgid "" "Friendica's current system.basepath '%s' is wrong and the config file '%s' " "isn't used." msgstr "" -#: src/Module/Admin/Summary.php:181 +#: src/Module/Admin/Summary.php:182 #, php-format msgid "" "Friendica's current system.basepath '%s' is not equal to the config file " "'%s'. Please fix your configuration." msgstr "" -#: src/Module/Admin/Summary.php:188 +#: src/Module/Admin/Summary.php:189 msgid "Normal Account" msgstr "Обычный аккаунт" -#: src/Module/Admin/Summary.php:189 +#: src/Module/Admin/Summary.php:190 msgid "Automatic Follower Account" msgstr "" -#: src/Module/Admin/Summary.php:190 +#: src/Module/Admin/Summary.php:191 msgid "Public Forum Account" msgstr "Публичный форум" -#: src/Module/Admin/Summary.php:191 +#: src/Module/Admin/Summary.php:192 msgid "Automatic Friend Account" msgstr "\"Автоматический друг\" Аккаунт" -#: src/Module/Admin/Summary.php:192 +#: src/Module/Admin/Summary.php:193 msgid "Blog Account" msgstr "Аккаунт блога" -#: src/Module/Admin/Summary.php:193 +#: src/Module/Admin/Summary.php:194 msgid "Private Forum Account" msgstr "Закрытый форум" -#: src/Module/Admin/Summary.php:213 +#: src/Module/Admin/Summary.php:214 msgid "Message queues" msgstr "Очереди сообщений" -#: src/Module/Admin/Summary.php:219 +#: src/Module/Admin/Summary.php:220 msgid "Server Settings" msgstr "Настройки сервера" -#: src/Module/Admin/Summary.php:233 src/Repository/ProfileField.php:285 +#: src/Module/Admin/Summary.php:234 src/Repository/ProfileField.php:285 msgid "Summary" msgstr "Резюме" -#: src/Module/Admin/Summary.php:235 +#: src/Module/Admin/Summary.php:236 msgid "Registered users" msgstr "Зарегистрированные пользователи" -#: src/Module/Admin/Summary.php:237 +#: src/Module/Admin/Summary.php:238 msgid "Pending registrations" msgstr "Ожидающие регистрации" -#: src/Module/Admin/Summary.php:238 +#: src/Module/Admin/Summary.php:239 msgid "Version" msgstr "Версия" -#: src/Module/Admin/Summary.php:242 +#: src/Module/Admin/Summary.php:243 msgid "Active addons" msgstr "Активные дополнения" @@ -7086,8 +7086,8 @@ msgstr "" msgid "Posts from %s can't be unshared" msgstr "" -#: src/Module/Api/Twitter/ContactEndpoint.php:63 src/Module/Contact.php:361 -#: src/Module/Contact.php:366 +#: src/Module/Api/Twitter/ContactEndpoint.php:63 src/Module/Contact.php:371 +#: src/Module/Contact.php:386 msgid "Contact not found" msgstr "Контакт не найден" @@ -7208,7 +7208,7 @@ msgstr "" msgid "Too Many Requests" msgstr "" -#: src/Module/BaseProfile.php:51 src/Module/Contact.php:902 +#: src/Module/BaseProfile.php:51 src/Module/Contact.php:918 msgid "Profile Details" msgstr "Информация о вас" @@ -7267,15 +7267,15 @@ msgstr "Экспорт личных данных" msgid "Remove account" msgstr "Удалить аккаунт" -#: src/Module/Bookmarklet.php:55 +#: src/Module/Bookmarklet.php:54 msgid "This page is missing a url parameter." msgstr "" -#: src/Module/Bookmarklet.php:67 +#: src/Module/Bookmarklet.php:66 msgid "The post was created" msgstr "Запись создана" -#: src/Module/Contact.php:93 +#: src/Module/Contact.php:97 #, php-format msgid "%d contact edited." msgid_plural "%d contacts edited." @@ -7284,358 +7284,358 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: src/Module/Contact.php:118 +#: src/Module/Contact.php:122 msgid "Could not access contact record." msgstr "Не удалось получить доступ к записи контакта." -#: src/Module/Contact.php:154 +#: src/Module/Contact.php:158 msgid "Failed to update contact record." msgstr "Не удалось обновить запись контакта." -#: src/Module/Contact.php:383 +#: src/Module/Contact.php:403 msgid "You can't block yourself" msgstr "Вы не можете заблокировать сами себя" -#: src/Module/Contact.php:389 +#: src/Module/Contact.php:409 msgid "Contact has been blocked" msgstr "Контакт заблокирован" -#: src/Module/Contact.php:389 +#: src/Module/Contact.php:409 msgid "Contact has been unblocked" msgstr "Контакт разблокирован" -#: src/Module/Contact.php:397 +#: src/Module/Contact.php:417 msgid "You can't ignore yourself" msgstr "Вы не можете игнорировать сами себя" -#: src/Module/Contact.php:403 +#: src/Module/Contact.php:423 msgid "Contact has been ignored" msgstr "Контакт проигнорирован" -#: src/Module/Contact.php:403 +#: src/Module/Contact.php:423 msgid "Contact has been unignored" msgstr "У контакта отменено игнорирование" -#: src/Module/Contact.php:415 +#: src/Module/Contact.php:435 msgid "Drop contact" msgstr "Удалить контакт" -#: src/Module/Contact.php:418 src/Module/Contact.php:843 +#: src/Module/Contact.php:438 src/Module/Contact.php:859 msgid "Do you really want to delete this contact?" msgstr "Вы действительно хотите удалить этот контакт?" -#: src/Module/Contact.php:419 src/Module/Notifications/Introductions.php:123 -#: src/Module/OAuth/Acknowledge.php:47 src/Module/Register.php:115 +#: src/Module/Contact.php:439 src/Module/Notifications/Introductions.php:123 +#: src/Module/OAuth/Acknowledge.php:47 src/Module/Register.php:117 msgid "Yes" msgstr "Да" -#: src/Module/Contact.php:431 +#: src/Module/Contact.php:452 msgid "Contact has been removed." msgstr "Контакт удален." -#: src/Module/Contact.php:458 +#: src/Module/Contact.php:473 #, php-format msgid "You are mutual friends with %s" msgstr "У Вас взаимная дружба с %s" -#: src/Module/Contact.php:462 +#: src/Module/Contact.php:477 #, php-format msgid "You are sharing with %s" msgstr "Вы делитесь с %s" -#: src/Module/Contact.php:466 +#: src/Module/Contact.php:481 #, php-format msgid "%s is sharing with you" msgstr "%s делится с Вами" -#: src/Module/Contact.php:490 +#: src/Module/Contact.php:505 msgid "Private communications are not available for this contact." msgstr "Приватные коммуникации недоступны для этого контакта." -#: src/Module/Contact.php:492 +#: src/Module/Contact.php:507 msgid "Never" msgstr "Никогда" -#: src/Module/Contact.php:495 +#: src/Module/Contact.php:510 msgid "(Update was not successful)" msgstr "(Обновление не удалось)" -#: src/Module/Contact.php:495 +#: src/Module/Contact.php:510 msgid "(Update was successful)" msgstr "(Обновление было успешно)" -#: src/Module/Contact.php:497 src/Module/Contact.php:1086 +#: src/Module/Contact.php:512 src/Module/Contact.php:1104 msgid "Suggest friends" msgstr "Предложить друзей" -#: src/Module/Contact.php:501 +#: src/Module/Contact.php:516 #, php-format msgid "Network type: %s" msgstr "Сеть: %s" -#: src/Module/Contact.php:506 +#: src/Module/Contact.php:521 msgid "Communications lost with this contact!" msgstr "Связь с контактом утеряна!" -#: src/Module/Contact.php:512 +#: src/Module/Contact.php:527 msgid "Fetch further information for feeds" msgstr "Получить подробную информацию о фидах" -#: src/Module/Contact.php:514 +#: src/Module/Contact.php:529 msgid "" "Fetch information like preview pictures, title and teaser from the feed " "item. You can activate this if the feed doesn't contain much text. Keywords " "are taken from the meta header in the feed item and are posted as hash tags." msgstr "Извлекать картинки предпросмотра, заголовок и вступление из записи ленты. Вы можете включить эту опцию, если лента не содержит много текста. Ключевые слова берутся из метаданных записи и публикуются как теги." -#: src/Module/Contact.php:517 +#: src/Module/Contact.php:532 msgid "Fetch information" msgstr "Получить информацию" -#: src/Module/Contact.php:518 +#: src/Module/Contact.php:533 msgid "Fetch keywords" msgstr "Получить ключевые слова" -#: src/Module/Contact.php:519 +#: src/Module/Contact.php:534 msgid "Fetch information and keywords" msgstr "Получить информацию и ключевые слова" -#: src/Module/Contact.php:531 src/Module/Contact.php:535 -#: src/Module/Contact.php:538 src/Module/Contact.php:542 +#: src/Module/Contact.php:546 src/Module/Contact.php:550 +#: src/Module/Contact.php:553 src/Module/Contact.php:557 msgid "No mirroring" msgstr "Не зеркалировать" -#: src/Module/Contact.php:532 +#: src/Module/Contact.php:547 msgid "Mirror as forwarded posting" msgstr "Зеркалировать как переадресованные сообщения" -#: src/Module/Contact.php:533 src/Module/Contact.php:539 -#: src/Module/Contact.php:543 +#: src/Module/Contact.php:548 src/Module/Contact.php:554 +#: src/Module/Contact.php:558 msgid "Mirror as my own posting" msgstr "Зеркалировать как мои сообщения" -#: src/Module/Contact.php:536 src/Module/Contact.php:540 +#: src/Module/Contact.php:551 src/Module/Contact.php:555 msgid "Native reshare" msgstr "" -#: src/Module/Contact.php:555 +#: src/Module/Contact.php:570 msgid "Contact Information / Notes" msgstr "Информация о контакте / Заметки" -#: src/Module/Contact.php:556 +#: src/Module/Contact.php:571 msgid "Contact Settings" msgstr "Настройки контакта" -#: src/Module/Contact.php:564 +#: src/Module/Contact.php:579 msgid "Contact" msgstr "Контакт" -#: src/Module/Contact.php:568 +#: src/Module/Contact.php:583 msgid "Their personal note" msgstr "Персональная заметка" -#: src/Module/Contact.php:570 +#: src/Module/Contact.php:585 msgid "Edit contact notes" msgstr "Редактировать заметки контакта" -#: src/Module/Contact.php:573 src/Module/Contact.php:1054 +#: src/Module/Contact.php:588 src/Module/Contact.php:1070 #, php-format msgid "Visit %s's profile [%s]" msgstr "Посетить профиль %s [%s]" -#: src/Module/Contact.php:574 +#: src/Module/Contact.php:589 msgid "Block/Unblock contact" msgstr "Блокировать / Разблокировать контакт" -#: src/Module/Contact.php:575 +#: src/Module/Contact.php:590 msgid "Ignore contact" msgstr "Игнорировать контакт" -#: src/Module/Contact.php:576 +#: src/Module/Contact.php:591 msgid "View conversations" msgstr "Просмотр бесед" -#: src/Module/Contact.php:581 +#: src/Module/Contact.php:596 msgid "Last update:" msgstr "Последнее обновление: " -#: src/Module/Contact.php:583 +#: src/Module/Contact.php:598 msgid "Update public posts" msgstr "Обновить публичные сообщения" -#: src/Module/Contact.php:585 src/Module/Contact.php:1096 +#: src/Module/Contact.php:600 src/Module/Contact.php:1114 msgid "Update now" msgstr "Обновить сейчас" -#: src/Module/Contact.php:588 src/Module/Contact.php:848 -#: src/Module/Contact.php:1123 +#: src/Module/Contact.php:603 src/Module/Contact.php:864 +#: src/Module/Contact.php:1141 msgid "Unignore" msgstr "Не игнорировать" -#: src/Module/Contact.php:592 +#: src/Module/Contact.php:607 msgid "Currently blocked" msgstr "В настоящее время заблокирован" -#: src/Module/Contact.php:593 +#: src/Module/Contact.php:608 msgid "Currently ignored" msgstr "В настоящее время игнорируется" -#: src/Module/Contact.php:594 +#: src/Module/Contact.php:609 msgid "Currently archived" msgstr "В данный момент архивирован" -#: src/Module/Contact.php:595 +#: src/Module/Contact.php:610 msgid "Awaiting connection acknowledge" msgstr "Ожидаем подтверждения соединения" -#: src/Module/Contact.php:596 src/Module/Notifications/Introductions.php:171 +#: src/Module/Contact.php:611 src/Module/Notifications/Introductions.php:171 msgid "Hide this contact from others" msgstr "Скрыть этот контакт от других" -#: src/Module/Contact.php:596 +#: src/Module/Contact.php:611 msgid "" "Replies/likes to your public posts may still be visible" msgstr "Ответы/лайки ваших публичных сообщений будут видимы." -#: src/Module/Contact.php:597 +#: src/Module/Contact.php:612 msgid "Notification for new posts" msgstr "Уведомление о новых записях" -#: src/Module/Contact.php:597 +#: src/Module/Contact.php:612 msgid "Send a notification of every new post of this contact" msgstr "Отправлять уведомление о каждом новой записи контакта" -#: src/Module/Contact.php:599 +#: src/Module/Contact.php:614 msgid "Keyword Deny List" msgstr "Запретный список слов" -#: src/Module/Contact.php:599 +#: src/Module/Contact.php:614 msgid "" "Comma separated list of keywords that should not be converted to hashtags, " "when \"Fetch information and keywords\" is selected" msgstr "Список слов через запятую, которые не должны конвертироваться в хэштеги, когда включено \"Получать информацию и хэштеги\"" -#: src/Module/Contact.php:617 src/Module/Settings/TwoFactor/Index.php:132 +#: src/Module/Contact.php:632 src/Module/Settings/TwoFactor/Index.php:132 msgid "Actions" msgstr "Действия" -#: src/Module/Contact.php:624 +#: src/Module/Contact.php:639 msgid "Mirror postings from this contact" msgstr "Зекралировать сообщения от этого контакта" -#: src/Module/Contact.php:626 +#: src/Module/Contact.php:641 msgid "" "Mark this contact as remote_self, this will cause friendica to repost new " "entries from this contact." msgstr "Пометить этот контакт как remote_self, что заставит Friendica отправлять сообщения от этого контакта." -#: src/Module/Contact.php:758 +#: src/Module/Contact.php:773 msgid "Show all contacts" msgstr "Показать все контакты" -#: src/Module/Contact.php:766 +#: src/Module/Contact.php:781 msgid "Only show pending contacts" msgstr "Показать только контакты \"в ожидании\"" -#: src/Module/Contact.php:774 +#: src/Module/Contact.php:789 msgid "Only show blocked contacts" msgstr "Показать только блокированные контакты" -#: src/Module/Contact.php:779 src/Module/Contact.php:826 -#: src/Object/Post.php:308 +#: src/Module/Contact.php:794 src/Module/Contact.php:841 +#: src/Object/Post.php:309 msgid "Ignored" msgstr "Игнорируются" -#: src/Module/Contact.php:782 +#: src/Module/Contact.php:797 msgid "Only show ignored contacts" msgstr "Показать только игнорируемые контакты" -#: src/Module/Contact.php:787 src/Module/Contact.php:827 +#: src/Module/Contact.php:802 src/Module/Contact.php:842 msgid "Archived" msgstr "Архивированные" -#: src/Module/Contact.php:790 +#: src/Module/Contact.php:805 msgid "Only show archived contacts" msgstr "Показывать только архивные контакты" -#: src/Module/Contact.php:795 src/Module/Contact.php:825 +#: src/Module/Contact.php:810 src/Module/Contact.php:840 msgid "Hidden" msgstr "Скрытые" -#: src/Module/Contact.php:798 +#: src/Module/Contact.php:813 msgid "Only show hidden contacts" msgstr "Показывать только скрытые контакты" -#: src/Module/Contact.php:806 +#: src/Module/Contact.php:821 msgid "Organize your contact groups" msgstr "Настроить группы контактов" -#: src/Module/Contact.php:838 +#: src/Module/Contact.php:853 msgid "Search your contacts" msgstr "Поиск ваших контактов" -#: src/Module/Contact.php:839 src/Module/Search/Index.php:194 +#: src/Module/Contact.php:854 src/Module/Search/Index.php:194 #, php-format msgid "Results for: %s" msgstr "Результаты для: %s" -#: src/Module/Contact.php:846 +#: src/Module/Contact.php:862 msgid "Update" msgstr "Обновление" -#: src/Module/Contact.php:851 +#: src/Module/Contact.php:867 msgid "Batch Actions" msgstr "Пакетные действия" -#: src/Module/Contact.php:886 +#: src/Module/Contact.php:902 msgid "Conversations started by this contact" msgstr "Диалоги этого контакта" -#: src/Module/Contact.php:891 +#: src/Module/Contact.php:907 msgid "Posts and Comments" msgstr "Записи и комментарии" -#: src/Module/Contact.php:909 +#: src/Module/Contact.php:925 msgid "View all known contacts" msgstr "Показать все известные контакты" -#: src/Module/Contact.php:919 +#: src/Module/Contact.php:935 msgid "Advanced Contact Settings" msgstr "Дополнительные Настройки Контакта" -#: src/Module/Contact.php:1013 +#: src/Module/Contact.php:1029 msgid "Mutual Friendship" msgstr "Взаимная дружба" -#: src/Module/Contact.php:1017 +#: src/Module/Contact.php:1033 msgid "is a fan of yours" msgstr "является вашим поклонником" -#: src/Module/Contact.php:1021 +#: src/Module/Contact.php:1037 msgid "you are a fan of" msgstr "Вы - поклонник" -#: src/Module/Contact.php:1039 +#: src/Module/Contact.php:1055 msgid "Pending outgoing contact request" msgstr "Исходящий запрос на подписку" -#: src/Module/Contact.php:1041 +#: src/Module/Contact.php:1057 msgid "Pending incoming contact request" msgstr "Входящий запрос на подписку" -#: src/Module/Contact.php:1106 +#: src/Module/Contact.php:1124 msgid "Refetch contact data" msgstr "Обновить данные контакта" -#: src/Module/Contact.php:1117 +#: src/Module/Contact.php:1135 msgid "Toggle Blocked status" msgstr "Изменить статус блокированности (заблокировать/разблокировать)" -#: src/Module/Contact.php:1125 +#: src/Module/Contact.php:1143 msgid "Toggle Ignored status" msgstr "Изменить статус игнорирования" -#: src/Module/Contact.php:1134 +#: src/Module/Contact.php:1152 msgid "Delete contact" msgstr "Удалить контакт" @@ -7869,7 +7869,7 @@ msgstr "Личные" msgid "Posts that mention or involve you" msgstr "Записи, которые упоминают вас или в которых вы участвуете" -#: src/Module/Conversation/Network.php:258 src/Object/Post.php:320 +#: src/Module/Conversation/Network.php:258 src/Object/Post.php:321 msgid "Starred" msgstr "Избранное" @@ -8146,21 +8146,21 @@ msgstr "" msgid "Lookup address:" msgstr "" -#: src/Module/Delegation.php:148 +#: src/Module/Delegation.php:142 msgid "Switch between your accounts" msgstr "" -#: src/Module/Delegation.php:149 +#: src/Module/Delegation.php:143 msgid "Manage your accounts" msgstr "" -#: src/Module/Delegation.php:150 +#: src/Module/Delegation.php:144 msgid "" "Toggle between different identities or community/group pages which share " "your account details or which you have been granted \"manage\" permissions" msgstr "Переключайтесь между разными профилями или страницами сообществ/групп, которые зарегистрированы на одинаковые контактные данные, либо вам предоставлено право управления ими." -#: src/Module/Delegation.php:151 +#: src/Module/Delegation.php:145 msgid "Select an identity to manage: " msgstr "Выберите учётную запись:" @@ -8694,7 +8694,7 @@ msgid "Claims to be known to you: " msgstr "Утверждения, о которых должно быть вам известно: " #: src/Module/Notifications/Introductions.php:123 -#: src/Module/OAuth/Acknowledge.php:48 src/Module/Register.php:116 +#: src/Module/OAuth/Acknowledge.php:48 src/Module/Register.php:118 msgid "No" msgstr "Нет" @@ -8906,143 +8906,143 @@ msgstr "Запланировано" #: src/Module/Profile/Schedule.php:85 msgid "Content" -msgstr "" +msgstr "Содержание" #: src/Module/Profile/Schedule.php:86 msgid "Remove post" msgstr "" -#: src/Module/Register.php:69 +#: src/Module/Register.php:71 msgid "Only parent users can create additional accounts." msgstr "Только основные пользователи могут создавать дополнительные учётные записи." -#: src/Module/Register.php:101 +#: src/Module/Register.php:103 msgid "" "You may (optionally) fill in this form via OpenID by supplying your OpenID " "and clicking \"Register\"." msgstr "" -#: src/Module/Register.php:102 +#: src/Module/Register.php:104 msgid "" "If you are not familiar with OpenID, please leave that field blank and fill " "in the rest of the items." msgstr "Если вы не знакомы с OpenID, пожалуйста, оставьте это поле пустым и заполните остальные элементы." -#: src/Module/Register.php:103 +#: src/Module/Register.php:105 msgid "Your OpenID (optional): " msgstr "Ваш OpenID (необязательно):" -#: src/Module/Register.php:112 +#: src/Module/Register.php:114 msgid "Include your profile in member directory?" msgstr "Включить ваш профиль в каталог участников?" -#: src/Module/Register.php:135 +#: src/Module/Register.php:137 msgid "Note for the admin" msgstr "Сообщение для администратора" -#: src/Module/Register.php:135 +#: src/Module/Register.php:137 msgid "Leave a message for the admin, why you want to join this node" msgstr "Сообщения для администратора сайта на тему \"почему я хочу присоединиться к вам\"" -#: src/Module/Register.php:136 +#: src/Module/Register.php:138 msgid "Membership on this site is by invitation only." msgstr "Членство на сайте только по приглашению." -#: src/Module/Register.php:137 +#: src/Module/Register.php:139 msgid "Your invitation code: " msgstr "Ваш код приглашения:" -#: src/Module/Register.php:145 +#: src/Module/Register.php:147 msgid "Your Full Name (e.g. Joe Smith, real or real-looking): " msgstr "Ваше полное имя (например, Иван Иванов):" -#: src/Module/Register.php:146 +#: src/Module/Register.php:148 msgid "" "Your Email Address: (Initial information will be send there, so this has to " "be an existing address.)" msgstr "Ваш адрес электронной почты: (Информация для входа будет отправлена туда, это должен быть существующий адрес.)" -#: src/Module/Register.php:147 +#: src/Module/Register.php:149 msgid "Please repeat your e-mail address:" msgstr "Пожалуйста, введите адрес электронной почты ещё раз:" -#: src/Module/Register.php:149 +#: src/Module/Register.php:151 msgid "Leave empty for an auto generated password." msgstr "Оставьте пустым для автоматической генерации пароля." -#: src/Module/Register.php:151 +#: src/Module/Register.php:153 #, php-format msgid "" "Choose a profile nickname. This must begin with a text character. Your " "profile address on this site will then be \"nickname@%s\"." msgstr "" -#: src/Module/Register.php:152 +#: src/Module/Register.php:154 msgid "Choose a nickname: " msgstr "Выберите псевдоним: " -#: src/Module/Register.php:161 +#: src/Module/Register.php:163 msgid "Import your profile to this friendica instance" msgstr "Импорт своего профиля в этот экземпляр friendica" -#: src/Module/Register.php:168 +#: src/Module/Register.php:170 msgid "Note: This node explicitly contains adult content" msgstr "Внимание: на этом сервере размещаются материалы для взрослых." -#: src/Module/Register.php:170 src/Module/Settings/Delegation.php:155 +#: src/Module/Register.php:172 src/Module/Settings/Delegation.php:155 msgid "Parent Password:" msgstr "Родительский пароль:" -#: src/Module/Register.php:170 src/Module/Settings/Delegation.php:155 +#: src/Module/Register.php:172 src/Module/Settings/Delegation.php:155 msgid "" "Please enter the password of the parent account to legitimize your request." msgstr "" -#: src/Module/Register.php:199 +#: src/Module/Register.php:201 msgid "Password doesn't match." msgstr "Пароль не совпадает" -#: src/Module/Register.php:205 +#: src/Module/Register.php:207 msgid "Please enter your password." msgstr "Пожалуйста, введите ваш пароль." -#: src/Module/Register.php:247 +#: src/Module/Register.php:249 msgid "You have entered too much information." msgstr "Вы ввели слишком много информации." -#: src/Module/Register.php:270 +#: src/Module/Register.php:272 msgid "Please enter the identical mail address in the second field." msgstr "Пожалуйста, введите тот же самый адрес почты во второе поле." -#: src/Module/Register.php:297 +#: src/Module/Register.php:299 msgid "The additional account was created." msgstr "Дополнительная учётная запись создана." -#: src/Module/Register.php:322 +#: src/Module/Register.php:324 msgid "" "Registration successful. Please check your email for further instructions." msgstr "Регистрация успешна. Пожалуйста, проверьте свою электронную почту для получения дальнейших инструкций." -#: src/Module/Register.php:326 +#: src/Module/Register.php:328 #, php-format msgid "" "Failed to send email message. Here your accout details:
    login: %s
    " "password: %s

    You can change your password after login." msgstr "Ошибка отправки письма. Вот ваши учетные данные:
    логин: %s
    пароль: %s

    Вы сможете изменить пароль после входа." -#: src/Module/Register.php:332 +#: src/Module/Register.php:334 msgid "Registration successful." msgstr "Регистрация успешна." -#: src/Module/Register.php:337 src/Module/Register.php:344 +#: src/Module/Register.php:339 src/Module/Register.php:346 msgid "Your registration can not be processed." msgstr "Ваша регистрация не может быть обработана." -#: src/Module/Register.php:343 +#: src/Module/Register.php:345 msgid "You have to leave a request note for the admin." msgstr "" -#: src/Module/Register.php:389 +#: src/Module/Register.php:391 msgid "Your registration is pending approval by the site owner." msgstr "Ваша регистрация в ожидании одобрения владельцем сайта." @@ -10249,186 +10249,186 @@ msgstr "Пожалуйста, свяжитесь с отправителем, о msgid "%s posted an update." msgstr "%s отправил/а/ обновление." -#: src/Object/Post.php:148 +#: src/Object/Post.php:149 msgid "This entry was edited" msgstr "Эта запись была отредактирована" -#: src/Object/Post.php:176 +#: src/Object/Post.php:177 msgid "Private Message" msgstr "Личное сообщение" -#: src/Object/Post.php:192 src/Object/Post.php:194 +#: src/Object/Post.php:193 src/Object/Post.php:195 msgid "Edit" msgstr "Редактировать" -#: src/Object/Post.php:214 +#: src/Object/Post.php:215 msgid "Pinned item" msgstr "Закреплённая запись" -#: src/Object/Post.php:218 +#: src/Object/Post.php:219 msgid "Delete globally" msgstr "Удалить везде" -#: src/Object/Post.php:218 +#: src/Object/Post.php:219 msgid "Remove locally" msgstr "Убрать для себя" -#: src/Object/Post.php:234 +#: src/Object/Post.php:235 #, php-format msgid "Block %s" msgstr "Заблокировать %s" -#: src/Object/Post.php:239 +#: src/Object/Post.php:240 msgid "Save to folder" msgstr "Сохранить в папку" -#: src/Object/Post.php:273 +#: src/Object/Post.php:274 msgid "I will attend" msgstr "Я буду" -#: src/Object/Post.php:273 +#: src/Object/Post.php:274 msgid "I will not attend" msgstr "Меня не будет" -#: src/Object/Post.php:273 +#: src/Object/Post.php:274 msgid "I might attend" msgstr "Возможно" -#: src/Object/Post.php:303 +#: src/Object/Post.php:304 msgid "Ignore thread" msgstr "Игнорировать обсуждение" -#: src/Object/Post.php:304 +#: src/Object/Post.php:305 msgid "Unignore thread" msgstr "Не игнорировать обсуждение" -#: src/Object/Post.php:305 +#: src/Object/Post.php:306 msgid "Toggle ignore status" msgstr "Переключить игнорирование" -#: src/Object/Post.php:315 +#: src/Object/Post.php:316 msgid "Add star" msgstr "Добавить в Избранное" -#: src/Object/Post.php:316 +#: src/Object/Post.php:317 msgid "Remove star" msgstr "Убрать из Избранного" -#: src/Object/Post.php:317 +#: src/Object/Post.php:318 msgid "Toggle star status" msgstr "Добавить/убрать из Избранного" -#: src/Object/Post.php:328 +#: src/Object/Post.php:329 msgid "Pin" msgstr "Закрепить" -#: src/Object/Post.php:329 +#: src/Object/Post.php:330 msgid "Unpin" msgstr "Открепить" -#: src/Object/Post.php:330 +#: src/Object/Post.php:331 msgid "Toggle pin status" msgstr "Закрепить/открепить" -#: src/Object/Post.php:333 +#: src/Object/Post.php:334 msgid "Pinned" msgstr "Закреплено" -#: src/Object/Post.php:338 +#: src/Object/Post.php:339 msgid "Add tag" msgstr "Добавить тег" -#: src/Object/Post.php:351 +#: src/Object/Post.php:352 msgid "Quote share this" msgstr "Поделиться с комментарием" -#: src/Object/Post.php:351 +#: src/Object/Post.php:352 msgid "Quote Share" msgstr "Цитировать" -#: src/Object/Post.php:354 +#: src/Object/Post.php:355 msgid "Reshare this" msgstr "Поделиться этим с подписчиками" -#: src/Object/Post.php:354 +#: src/Object/Post.php:355 msgid "Reshare" msgstr "Поделиться" -#: src/Object/Post.php:355 +#: src/Object/Post.php:356 msgid "Cancel your Reshare" msgstr "Отменить репост" -#: src/Object/Post.php:355 +#: src/Object/Post.php:356 msgid "Unshare" msgstr "" -#: src/Object/Post.php:400 +#: src/Object/Post.php:401 #, php-format msgid "%s (Received %s)" msgstr "%s (Получено %s)" -#: src/Object/Post.php:405 +#: src/Object/Post.php:406 msgid "Comment this item on your system" msgstr "Прокомментировать это на вашем узле" -#: src/Object/Post.php:405 +#: src/Object/Post.php:406 msgid "Remote comment" msgstr "" -#: src/Object/Post.php:421 +#: src/Object/Post.php:422 msgid "Pushed" msgstr "" -#: src/Object/Post.php:421 +#: src/Object/Post.php:422 msgid "Pulled" msgstr "" -#: src/Object/Post.php:455 +#: src/Object/Post.php:456 msgid "to" msgstr "к" -#: src/Object/Post.php:456 +#: src/Object/Post.php:457 msgid "via" msgstr "через" -#: src/Object/Post.php:457 +#: src/Object/Post.php:458 msgid "Wall-to-Wall" msgstr "Стена-на-Стену" -#: src/Object/Post.php:458 +#: src/Object/Post.php:459 msgid "via Wall-To-Wall:" msgstr "через Стена-на-Стену:" -#: src/Object/Post.php:496 +#: src/Object/Post.php:497 #, php-format msgid "Reply to %s" msgstr "Ответ %s" -#: src/Object/Post.php:499 +#: src/Object/Post.php:500 msgid "More" msgstr "Ещё" -#: src/Object/Post.php:517 +#: src/Object/Post.php:518 msgid "Notifier task is pending" msgstr "Постановка в очередь" -#: src/Object/Post.php:518 +#: src/Object/Post.php:519 msgid "Delivery to remote servers is pending" msgstr "Ожидается отправка адресатам" -#: src/Object/Post.php:519 +#: src/Object/Post.php:520 msgid "Delivery to remote servers is underway" msgstr "Отправка адресатам в процессе" -#: src/Object/Post.php:520 +#: src/Object/Post.php:521 msgid "Delivery to remote servers is mostly done" msgstr "Отправка адресатам почти завершилась" -#: src/Object/Post.php:521 +#: src/Object/Post.php:522 msgid "Delivery to remote servers is done" msgstr "Отправка адресатам завершена" -#: src/Object/Post.php:541 +#: src/Object/Post.php:542 #, php-format msgid "%d comment" msgid_plural "%d comments" @@ -10437,11 +10437,11 @@ msgstr[1] "%d комментариев" msgstr[2] "%d комментариев" msgstr[3] "%d комментариев" -#: src/Object/Post.php:542 +#: src/Object/Post.php:543 msgid "Show more" msgstr "Показать больше" -#: src/Object/Post.php:543 +#: src/Object/Post.php:544 msgid "Show fewer" msgstr "Показать меньше" diff --git a/view/lang/ru/strings.php b/view/lang/ru/strings.php index a308cca7a..e41731a93 100644 --- a/view/lang/ru/strings.php +++ b/view/lang/ru/strings.php @@ -20,95 +20,6 @@ $a->strings["Weekly posting limit of %d post reached. The post was rejected."] = ]; $a->strings["Monthly posting limit of %d post reached. The post was rejected."] = "Месячный лимит в %d записей достигнут. Запись была отклонена."; $a->strings["Profile Photos"] = "Фотографии профиля"; -$a->strings["%1\$s poked %2\$s"] = "%1\$s ткнул %2\$s"; -$a->strings["event"] = "мероприятие"; -$a->strings["status"] = "статус"; -$a->strings["photo"] = "фото"; -$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s tagged %2\$s's %3\$s в %4\$s"; -$a->strings["Select"] = "Выберите"; -$a->strings["Delete"] = "Удалить"; -$a->strings["View %s's profile @ %s"] = "Просмотреть профиль %s [@ %s]"; -$a->strings["Categories:"] = "Категории:"; -$a->strings["Filed under:"] = "В рубрике:"; -$a->strings["%s from %s"] = "%s из %s"; -$a->strings["View in context"] = "Смотреть в контексте"; -$a->strings["Please wait"] = "Пожалуйста, подождите"; -$a->strings["remove"] = "удалить"; -$a->strings["Delete Selected Items"] = "Удалить выбранные позиции"; -$a->strings["You had been addressed (%s)."] = "К вам обратились (%s)."; -$a->strings["You are following %s."] = "Вы подписаны на %s."; -$a->strings["Tagged"] = "Отмечено"; -$a->strings["%s reshared this."] = "%s поделился этим."; -$a->strings["Reshared"] = "Репост"; -$a->strings["%s is participating in this thread."] = "%s участвует в этом обсуждении"; -$a->strings["Relayed"] = "Ретранслировано"; -$a->strings["Fetched"] = "Загружено"; -$a->strings["Follow Thread"] = "Подписаться на обсуждение"; -$a->strings["View Status"] = "Просмотреть статус"; -$a->strings["View Profile"] = "Просмотреть профиль"; -$a->strings["View Photos"] = "Просмотреть фото"; -$a->strings["Network Posts"] = "Записи сети"; -$a->strings["View Contact"] = "Просмотреть контакт"; -$a->strings["Send PM"] = "Отправить ЛС"; -$a->strings["Block"] = "Заблокировать"; -$a->strings["Ignore"] = "Игнорировать"; -$a->strings["Languages"] = "Языки"; -$a->strings["Poke"] = "потыкать"; -$a->strings["Connect/Follow"] = "Подключиться/Подписаться"; -$a->strings["%s likes this."] = "%s нравится это."; -$a->strings["%s doesn't like this."] = "%s не нравится это."; -$a->strings["%s attends."] = "%s посещает."; -$a->strings["%s doesn't attend."] = "%s не посетит."; -$a->strings["%s attends maybe."] = "%s может быть посетит."; -$a->strings["and"] = "и"; -$a->strings["and %d other people"] = "и еще %d человек"; -$a->strings["%2\$d people like this"] = "%2\$d людям нравится это"; -$a->strings["%s like this."] = "%s нравится это."; -$a->strings["%2\$d people don't like this"] = "%2\$d людям не нравится это"; -$a->strings["%s don't like this."] = "%s не нравится это"; -$a->strings["%2\$d people attend"] = "%2\$d человека посетят"; -$a->strings["%s attend."] = "%s посетит."; -$a->strings["%2\$d people don't attend"] = "%2\$d человек не посетит"; -$a->strings["%s don't attend."] = "%s не посетит"; -$a->strings["%2\$d people attend maybe"] = "%2\$d человек может быть посетят"; -$a->strings["%s attend maybe."] = "%s может быть посетит."; -$a->strings["%2\$d people reshared this"] = "%2\$d людей поделились этим"; -$a->strings["Visible to everybody"] = "Видимое всем"; -$a->strings["Please enter a image/video/audio/webpage URL:"] = "Пожалуйста, введите адрес картинки/видео/аудио/странички:"; -$a->strings["Tag term:"] = "Тег:"; -$a->strings["Save to Folder:"] = "Сохранить в папку:"; -$a->strings["Where are you right now?"] = "И где вы сейчас?"; -$a->strings["Delete item(s)?"] = "Удалить елемент(ты)?"; -$a->strings["New Post"] = "Новая запись"; -$a->strings["Share"] = "Поделиться"; -$a->strings["Loading..."] = "Загрузка..."; -$a->strings["Upload photo"] = "Загрузить фото"; -$a->strings["upload photo"] = "загрузить фото"; -$a->strings["Attach file"] = "Прикрепить файл"; -$a->strings["attach file"] = "приложить файл"; -$a->strings["Bold"] = "Жирный"; -$a->strings["Italic"] = "Kурсивный"; -$a->strings["Underline"] = "Подчеркнутый"; -$a->strings["Quote"] = "Цитата"; -$a->strings["Code"] = "Код"; -$a->strings["Image"] = "Изображение / Фото"; -$a->strings["Link"] = "Ссылка"; -$a->strings["Link or Media"] = "Ссылка или медиа"; -$a->strings["Set your location"] = "Задать ваше местоположение"; -$a->strings["set location"] = "установить местонахождение"; -$a->strings["Clear browser location"] = "Очистить местонахождение браузера"; -$a->strings["clear location"] = "убрать местонахождение"; -$a->strings["Set title"] = "Установить заголовок"; -$a->strings["Categories (comma-separated list)"] = "Категории (список через запятую)"; -$a->strings["Scheduled at"] = "Запланировано на"; -$a->strings["Permission settings"] = "Настройки разрешений"; -$a->strings["Permissions"] = "Разрешения"; -$a->strings["Public post"] = "Публичное сообщение"; -$a->strings["Preview"] = "Просмотр"; -$a->strings["Cancel"] = "Отмена"; -$a->strings["Message"] = "Сообщение"; -$a->strings["Browser"] = "Браузер"; -$a->strings["Open Compose page"] = "Развернуть редактор"; $a->strings["[Friendica:Notify]"] = "[Friendica]"; $a->strings["%s New mail received at %s"] = "%s Новая почта получена в %s"; $a->strings["%1\$s sent you a new private message at %2\$s."] = "%1\$s отправил вам новое личное сообщение на %2\$s."; @@ -181,14 +92,34 @@ $a->strings["The feed for this item is unavailable."] = "Лента недост $a->strings["Item not found"] = "Элемент не найден"; $a->strings["Edit post"] = "Редактировать запись"; $a->strings["Save"] = "Сохранить"; +$a->strings["Loading..."] = "Загрузка..."; +$a->strings["Upload photo"] = "Загрузить фото"; +$a->strings["upload photo"] = "загрузить фото"; +$a->strings["Attach file"] = "Прикрепить файл"; +$a->strings["attach file"] = "приложить файл"; $a->strings["Insert web link"] = "Вставить веб-ссылку"; $a->strings["web link"] = "веб-ссылка"; $a->strings["Insert video link"] = "Вставить ссылку видео"; $a->strings["video link"] = "видео-ссылка"; $a->strings["Insert audio link"] = "Вставить ссылку аудио"; $a->strings["audio link"] = "аудио-ссылка"; +$a->strings["Set your location"] = "Задать ваше местоположение"; +$a->strings["set location"] = "установить местонахождение"; +$a->strings["Clear browser location"] = "Очистить местонахождение браузера"; +$a->strings["clear location"] = "убрать местонахождение"; +$a->strings["Please wait"] = "Пожалуйста, подождите"; +$a->strings["Permission settings"] = "Настройки разрешений"; $a->strings["CC: email addresses"] = "Копии на email адреса"; +$a->strings["Public post"] = "Публичное сообщение"; +$a->strings["Set title"] = "Установить заголовок"; +$a->strings["Categories (comma-separated list)"] = "Категории (список через запятую)"; $a->strings["Example: bob@example.com, mary@example.com"] = "Пример: bob@example.com, mary@example.com"; +$a->strings["Preview"] = "Просмотр"; +$a->strings["Cancel"] = "Отмена"; +$a->strings["Message"] = "Сообщение"; +$a->strings["Browser"] = "Браузер"; +$a->strings["Permissions"] = "Разрешения"; +$a->strings["Open Compose page"] = "Развернуть редактор"; $a->strings["Event can not end before it has started."] = "Эвент не может закончится до старта."; $a->strings["Event title and start time are required."] = "Название мероприятия и время начала обязательны для заполнения."; $a->strings["Create New Event"] = "Создать новое мероприятие"; @@ -215,6 +146,7 @@ $a->strings["You already added this contact."] = "Вы уже добавили $a->strings["The network type couldn't be detected. Contact can't be added."] = "Тип сети не может быть определен. Контакт не может быть добавлен."; $a->strings["Diaspora support isn't enabled. Contact can't be added."] = "Поддержка Diaspora не включена. Контакт не может быть добавлен."; $a->strings["OStatus support is disabled. Contact can't be added."] = "Поддержка OStatus выключена. Контакт не может быть добавлен."; +$a->strings["Connect/Follow"] = "Подключиться/Подписаться"; $a->strings["Please answer the following:"] = "Пожалуйста, ответьте следующее:"; $a->strings["Your Identity Address:"] = "Ваш адрес:"; $a->strings["Profile URL"] = "URL профиля"; @@ -346,6 +278,8 @@ $a->strings["Rotate CW (right)"] = "Поворот по часовой стре $a->strings["Rotate CCW (left)"] = "Поворот против часовой стрелки (налево)"; $a->strings["This is you"] = "Это вы"; $a->strings["Comment"] = "Комментировать"; +$a->strings["Select"] = "Выберите"; +$a->strings["Delete"] = "Удалить"; $a->strings["I like this (toggle)"] = "Нравится"; $a->strings["I don't like this (toggle)"] = "Не нравится"; $a->strings["Map"] = "Карта"; @@ -403,6 +337,8 @@ $a->strings["Social Networks"] = "Социальные сети"; $a->strings["General Social Media Settings"] = "Общие настройки социальных медиа"; $a->strings["Accept only top level posts by contacts you follow"] = "Получать начальные записи только от ваших контактов"; $a->strings["The system does an auto completion of threads when a comment arrives. This has got the side effect that you can receive posts that had been started by a non-follower but had been commented by someone you follow. This setting deactivates this behaviour. When activated, you strictly only will receive posts from people you really do follow."] = "Система автоматически загружает диалоги, когда получает комментарии. Это может приводить к тому, что вы можете видеть записи от людей, на которых вы не подписаны, потому что их прокомментировал кто-то из ваших контактов. Эта настройка отключает такое поведение и вы будете видеть только записи тех людей, на которых подписаны."; +$a->strings["Enable Content Warning"] = "Включить предупреждение о контенте"; +$a->strings["Users on networks like Mastodon or Pleroma are able to set a content warning field which collapse their post by default. This enables the automatic collapsing instead of setting the content warning as the post title. Doesn't affect any other content filtering you eventually set up."] = "Пользователи некоторых сетей, таких как Mastodon или Pleroma, могут использовать \"предупреждение о контенте\", сворачивающее их записи. Эта настройка выключает это свёртывание вместо обычного помещения \"предупреждения о контенте\" в заголовок записи. Это не влияет на другие фильтры, которые вы можете настроить."; $a->strings["Attach the link title"] = "Присоединять заголовок ссылок"; $a->strings["When activated, the title of the attached link will be added as a title on posts to Diaspora. This is mostly helpful with \"remote-self\" contacts that share feed content."] = "Если включено. заголовок добавленной ссылки будет добавлен к записи в Диаспоре как заголовок. Это в основном нужно для контактов \"мой двойник\", которые публикуют содержимое ленты."; $a->strings["Repair OStatus subscriptions"] = "Починить подписки OStatus"; @@ -529,6 +465,9 @@ $a->strings["If you have moved this profile from another server, and some of you $a->strings["Resend relocate message to contacts"] = "Отправить перемещённые сообщения контактам"; $a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Нет предложений. Если это новый сайт, пожалуйста, попробуйте снова через 24 часа."; $a->strings["Friend Suggestions"] = "Предложения друзей"; +$a->strings["photo"] = "фото"; +$a->strings["status"] = "статус"; +$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s tagged %2\$s's %3\$s в %4\$s"; $a->strings["Remove Item Tag"] = "Удалить ключевое слово"; $a->strings["Select a tag to remove: "] = "Выберите ключевое слово для удаления: "; $a->strings["Remove"] = "Удалить"; @@ -614,6 +553,56 @@ $a->strings["GNU Social Connector"] = "GNU Social Connector"; $a->strings["ActivityPub"] = "ActivityPub"; $a->strings["pnut"] = "pnut"; $a->strings["%s (via %s)"] = "%s (через %s)"; +$a->strings["%s likes this."] = "%s нравится это."; +$a->strings["%s doesn't like this."] = "%s не нравится это."; +$a->strings["%s attends."] = "%s посещает."; +$a->strings["%s doesn't attend."] = "%s не посетит."; +$a->strings["%s attends maybe."] = "%s может быть посетит."; +$a->strings["%s reshared this."] = "%s поделился этим."; +$a->strings["and"] = "и"; +$a->strings["and %d other people"] = "и еще %d человек"; +$a->strings["%2\$d people like this"] = "%2\$d людям нравится это"; +$a->strings["%s like this."] = "%s нравится это."; +$a->strings["%2\$d people don't like this"] = "%2\$d людям не нравится это"; +$a->strings["%s don't like this."] = "%s не нравится это"; +$a->strings["%2\$d people attend"] = "%2\$d человека посетят"; +$a->strings["%s attend."] = "%s посетит."; +$a->strings["%2\$d people don't attend"] = "%2\$d человек не посетит"; +$a->strings["%s don't attend."] = "%s не посетит"; +$a->strings["%2\$d people attend maybe"] = "%2\$d человек может быть посетят"; +$a->strings["%s attend maybe."] = "%s может быть посетит."; +$a->strings["%2\$d people reshared this"] = "%2\$d людей поделились этим"; +$a->strings["Visible to everybody"] = "Видимое всем"; +$a->strings["Please enter a image/video/audio/webpage URL:"] = "Пожалуйста, введите адрес картинки/видео/аудио/странички:"; +$a->strings["Tag term:"] = "Тег:"; +$a->strings["Save to Folder:"] = "Сохранить в папку:"; +$a->strings["Where are you right now?"] = "И где вы сейчас?"; +$a->strings["Delete item(s)?"] = "Удалить елемент(ты)?"; +$a->strings["New Post"] = "Новая запись"; +$a->strings["Share"] = "Поделиться"; +$a->strings["Bold"] = "Жирный"; +$a->strings["Italic"] = "Kурсивный"; +$a->strings["Underline"] = "Подчеркнутый"; +$a->strings["Quote"] = "Цитата"; +$a->strings["Code"] = "Код"; +$a->strings["Image"] = "Изображение / Фото"; +$a->strings["Link"] = "Ссылка"; +$a->strings["Link or Media"] = "Ссылка или медиа"; +$a->strings["Scheduled at"] = "Запланировано на"; +$a->strings["View %s's profile @ %s"] = "Просмотреть профиль %s [@ %s]"; +$a->strings["Categories:"] = "Категории:"; +$a->strings["Filed under:"] = "В рубрике:"; +$a->strings["%s from %s"] = "%s из %s"; +$a->strings["View in context"] = "Смотреть в контексте"; +$a->strings["remove"] = "удалить"; +$a->strings["Delete Selected Items"] = "Удалить выбранные позиции"; +$a->strings["You had been addressed (%s)."] = "К вам обратились (%s)."; +$a->strings["You are following %s."] = "Вы подписаны на %s."; +$a->strings["Tagged"] = "Отмечено"; +$a->strings["Reshared"] = "Репост"; +$a->strings["%s is participating in this thread."] = "%s участвует в этом обсуждении"; +$a->strings["Relayed"] = "Ретранслировано"; +$a->strings["Fetched"] = "Загружено"; $a->strings["General Features"] = "Основные возможности"; $a->strings["Photo Location"] = "Место фотографирования"; $a->strings["Photo metadata is normally stripped. This extracts the location (if present) prior to stripping metadata and links it to a map."] = "Метаданные фотографий обычно вырезаются. Эта настройка получает местоположение (если есть) до вырезки метаданных и связывает с координатами на карте."; @@ -637,6 +626,19 @@ $a->strings["Display membership date in profile"] = "Дата вашей рег $a->strings["Forums"] = "Форумы"; $a->strings["External link to forum"] = "Внешняя ссылка на форум"; $a->strings["show more"] = "показать больше"; +$a->strings["%1\$s poked %2\$s"] = "%1\$s ткнул %2\$s"; +$a->strings["event"] = "мероприятие"; +$a->strings["Follow Thread"] = "Подписаться на обсуждение"; +$a->strings["View Status"] = "Просмотреть статус"; +$a->strings["View Profile"] = "Просмотреть профиль"; +$a->strings["View Photos"] = "Просмотреть фото"; +$a->strings["Network Posts"] = "Записи сети"; +$a->strings["View Contact"] = "Просмотреть контакт"; +$a->strings["Send PM"] = "Отправить ЛС"; +$a->strings["Block"] = "Заблокировать"; +$a->strings["Ignore"] = "Игнорировать"; +$a->strings["Languages"] = "Языки"; +$a->strings["Poke"] = "потыкать"; $a->strings["Nothing new here"] = "Ничего нового здесь"; $a->strings["Go back"] = "Назад"; $a->strings["Clear notifications"] = "Стереть уведомления"; @@ -977,6 +979,7 @@ $a->strings["bytes"] = "байт"; $a->strings["View on separate page"] = "Посмотреть в отдельной вкладке"; $a->strings["[no subject]"] = "[без темы]"; $a->strings["%1\$s had started following you"] = "%1\$s подписались на вас"; +$a->strings["%1\$s replied to you on %2\$s"] = "%1\$s ответил(а) вам на %2\$s"; $a->strings["%1\$s commented in your thread %2\$s"] = "%1\$s ответил в вашем обсуждении %2\$s"; $a->strings["%1\$s commented in their thread %2\$s"] = "%1\$s ответил в своём обсуждении %2\$s"; $a->strings["%1\$s commented in their thread"] = "%1\$s ответил в своём обсуждении"; @@ -1779,6 +1782,7 @@ $a->strings["%s's timeline"] = "Лента %s"; $a->strings["%s's posts"] = "Записи %s"; $a->strings["%s's comments"] = "Комментарии %s"; $a->strings["Scheduled"] = "Запланировано"; +$a->strings["Content"] = "Содержание"; $a->strings["Only parent users can create additional accounts."] = "Только основные пользователи могут создавать дополнительные учётные записи."; $a->strings["If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items."] = "Если вы не знакомы с OpenID, пожалуйста, оставьте это поле пустым и заполните остальные элементы."; $a->strings["Your OpenID (optional): "] = "Ваш OpenID (необязательно):"; From d8447469b6fc120b87575b118186c0fcba51352c Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 1 Oct 2021 05:26:13 +0000 Subject: [PATCH 32/54] Prefer the local user when displaying items --- mod/display.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/display.php b/mod/display.php index d46517032..d854be45e 100644 --- a/mod/display.php +++ b/mod/display.php @@ -246,11 +246,11 @@ function display_content(App $a, $update = false, $update_uid = 0) $page_uid = 0; $parent = null; - if (!empty($parent_uri_id)) { + if (!local_user() && !empty($parent_uri_id)) { $parent = Post::selectFirst(['uid'], ['uri-id' => $parent_uri_id, 'wall' => true]); } - if (DBA::isResult($parent)) { + if (!local_user() && DBA::isResult($parent)) { $page_uid = $page_uid ?? 0 ?: $parent['uid']; $is_remote_contact = Session::getRemoteContactID($page_uid); if ($is_remote_contact) { From 9858f86b21e79322965745a5e8e6c79d0db4d4e3 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 1 Oct 2021 08:35:09 +0200 Subject: [PATCH 33/54] Vagrant: Use Debian stable With the release of Debian 11 the Vagrant was still using _oldstable_ with this we are now using Debian stable again in the Vagrant VM. --- Vagrantfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Vagrantfile b/Vagrantfile index 81676df61..7d88beec2 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -6,8 +6,8 @@ server_timezone = "UTC" public_folder = "/vagrant" Vagrant.configure(2) do |config| - # Set server to Debian 10 / Buster 64bit - config.vm.box = "debian/buster64" + # Set server to Debian 11 / Bullseye 64bit + config.vm.box = "debian/bullseye64" # Disable automatic box update checking. If you disable this, then # boxes will only be checked for updates when the user runs From 93bbf27d525b702a00bd52eb1e9d5f3edbbb7990 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 1 Oct 2021 08:37:19 +0200 Subject: [PATCH 34/54] Vagrant: Do not pull PHP requirements during VM setup Don't pull the PHP requirements of Friendica with composer during the VM setup. First coding is done out side of the VM, so should be the management of the dependencies. Additionally if the _VirtualBox Guest Additions_ versions don't match on the guest and host systems, writing to the shared directory will not work, thus running composer will generate error messages during the initial setup and Friendica wont work. --- bin/dev/vagrant_provision.sh | 4 ---- 1 file changed, 4 deletions(-) diff --git a/bin/dev/vagrant_provision.sh b/bin/dev/vagrant_provision.sh index c8e62f291..a7cb7f308 100755 --- a/bin/dev/vagrant_provision.sh +++ b/bin/dev/vagrant_provision.sh @@ -94,11 +94,7 @@ rm -rf /var/www/ ln -fs /vagrant /var/www # install deps with composer -echo ">>> Installing php requirements" -apt install unzip cd /var/www -php bin/composer.phar install - echo ">>> Setup Friendica" From 7331e90c000f20ae903233f15e17ea692daae88d Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 1 Oct 2021 08:41:58 +0200 Subject: [PATCH 35/54] Vagrant: Avoid mis-leading error during setup With the use of Friendicas auto-installation feature and the pre-configured config file, the admin email address is set. Setting it again after the installation is compleated will generate a mis-leading error message. --- bin/dev/vagrant_provision.sh | 4 ---- 1 file changed, 4 deletions(-) diff --git a/bin/dev/vagrant_provision.sh b/bin/dev/vagrant_provision.sh index a7cb7f308..a9ce29320 100755 --- a/bin/dev/vagrant_provision.sh +++ b/bin/dev/vagrant_provision.sh @@ -116,10 +116,6 @@ bin/console user password "$ADMIN_NICK" "$ADMIN_PASSW" bin/console user add "$USER_NICK" "$USER_NICK" "$USER_NICK@friendica.local" en bin/console user password "$USER_NICK" "$USER_PASSW" -# set the admin -bin/console config config admin_email ""$ADMIN_NICK@friendica.local"" - - # create cronjob - activate if you have enough memory in you dev VM # cronjob runs as www-data user echo ">>> Installing cronjob" From d6f89da11ba9fdfa8f2d688f8b680fd2f1ff0564 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 1 Oct 2021 08:54:08 +0200 Subject: [PATCH 36/54] Vagrant: updating the docs --- doc/Vagrant.md | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/doc/Vagrant.md b/doc/Vagrant.md index 4040495ca..06c14ff76 100644 --- a/doc/Vagrant.md +++ b/doc/Vagrant.md @@ -10,27 +10,26 @@ Getting started No need to setup up a webserver, database etc. before actually starting. Vagrant creates a virtual machine for you that you can just run inside VirtualBox and start to work directly on Friendica. -It brings an Ubuntu Xenial (16.04) with PHP 7.0 and MySQL 5.7.16 +It brings an Debian Bullseye with PHP 7.4 and MariaDB 10.5.11. What you need to do: 1. Install VirtualBox and vagrant. Please use an up-to-date vagrant version from https://www.vagrantup.com/downloads.html. 2. Git clone your Friendica repository. -Inside, you'll find a "Vagrantfile" and some scripts in the utils folder. -3. Run "vagrant up" from inside the friendica clone: - $> vagrant up -Be patient: When it runs for the first time, it downloads an Ubuntu Server image. -4. Run "vagrant ssh" to log into the virtual machine to log in to the VM: - $> vagrant ssh +Inside, you'll find a `Vagrantfile` and some scripts in the `bin/dev` folder. +3. Run `vagrant up` from inside the friendica clone. +This will start the virtual machine. +Be patient: When it runs for the first time, it downloads an Debian Server image and installs Friendica. +4. Run `vagrant ssh` to log into the virtual machine to log in to the VM in case you need to debug something on the server. 5. Open you test installation in a browser. -Go to 192.168.22.10. +Go to friendica.local (or 192.168.22.10). +friendica.local is using a self-signed TLS certificate, so you will need to add an exception to trust the certificate the first time you are visiting the page. The mysql database is called "friendica", the mysql user and password both are "friendica". 6. Work on Friendica's code in your git clone on your machine (not in the VM). Your local working directory is set up as a shared directory with the VM (/vagrant). 7. Check the changes in your browser in the VM. -Debug via the "vagrant ssh" login. -Find the Friendica log file /vagrant/logfile.out. +Find the Friendica log file `/vagrant/logfile.out` on the VM or in the `logfile.out` in you local Friendica directory. 8. Commit and push your changes directly back to Github. If you want to stop vagrant after finishing your work, run the following command @@ -46,13 +45,22 @@ This will not delete the virtual machine. to make sure that you can start from scratch with another "vagrant up". -The vagrant Friendica instance contains a test database. -You will then have the following accounts to login: +Default User Accounts +--------------------- + +By default the provision script will setup two user accounts. * admin, password admin - * friendica1, password friendica1 - * friendica2, password friendica2 and so on until friendica5 - * friendica1 is connected to all others. friendica1 has two groups: group1 with friendica2 and friendica4, group2 with friendica3 and friendica5. - * friendica2 and friendica3 are connected. friendica4 and friendica5 are connected. + * friendica, password friendica -For further documentation of vagrant, please see [the vagrant*docs*](https://docs.vagrantup.com/v2/). +Trouble Shooting +---------------- + +If you see a version mis-match for the _VirtualBox Guest Additions_ between host and guest during the initial setup of the Vagrant VM, you will need to install an addon to Vagrant (ref. [Stack Overflow](https://stackoverflow.com/a/38010683)). +Stop the Vagrant VM and run the following command: + + $> vagrant plugin install vagrant-vbguest + +On the next Vagrant up, the version problem should be fixed. + +For further documentation of vagrant, please see [the vagrant*docs*](https://docs.vagrantup.com/v2/). \ No newline at end of file From e4dc2b8e1c0ef1a88d0f57fe98203e9be3150575 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 1 Oct 2021 09:38:51 +0200 Subject: [PATCH 37/54] Vagrant: Docs A typo and a note about resolving friendica.local --- doc/Vagrant.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/Vagrant.md b/doc/Vagrant.md index 06c14ff76..94cebd719 100644 --- a/doc/Vagrant.md +++ b/doc/Vagrant.md @@ -20,7 +20,7 @@ Please use an up-to-date vagrant version from https://www.vagrantup.com/download Inside, you'll find a `Vagrantfile` and some scripts in the `bin/dev` folder. 3. Run `vagrant up` from inside the friendica clone. This will start the virtual machine. -Be patient: When it runs for the first time, it downloads an Debian Server image and installs Friendica. +Be patient: When it runs for the first time, it downloads a Debian Server image and installs Friendica. 4. Run `vagrant ssh` to log into the virtual machine to log in to the VM in case you need to debug something on the server. 5. Open you test installation in a browser. Go to friendica.local (or 192.168.22.10). @@ -63,4 +63,6 @@ Stop the Vagrant VM and run the following command: On the next Vagrant up, the version problem should be fixed. +If `friendica.local` is not resolved, you may need to add an entry to the `/etc/hosts` file (or similar configuration depending on the OS you are using). + For further documentation of vagrant, please see [the vagrant*docs*](https://docs.vagrantup.com/v2/). \ No newline at end of file From 4960d0f438002176fde5265cb3e23bb42f6777fc Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 1 Oct 2021 09:42:08 +0200 Subject: [PATCH 38/54] Vagrant: Add the type to the synced folder in the Vagrantfile --- Vagrantfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Vagrantfile b/Vagrantfile index 7d88beec2..a7740d327 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -24,7 +24,7 @@ Vagrant.configure(2) do |config| # Share a folder between host and guest # config.vm.synced_folder ".", "/vagrant", id: "vagrant-root", owner: "www-data", group: "vagrant" - config.vm.synced_folder ".", "/vagrant", id: "vagrant-root", owner: "www-data", group: "www-data" + config.vm.synced_folder ".", "/vagrant", id: "vagrant-root", owner: "www-data", group: "www-data", type: "virtualbox" # Provider-specific configuration so you can fine-tune various # backing providers for Vagrant. These expose provider-specific options. From d52e2ab7915ae9819aa43932aa94f0ae5f3b320b Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 1 Oct 2021 10:00:01 +0200 Subject: [PATCH 39/54] Vagrant: Replace comment with more fitting one in provision --- bin/dev/vagrant_provision.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bin/dev/vagrant_provision.sh b/bin/dev/vagrant_provision.sh index a9ce29320..6eb9460bd 100755 --- a/bin/dev/vagrant_provision.sh +++ b/bin/dev/vagrant_provision.sh @@ -93,9 +93,8 @@ echo ">>> Symlink /var/www to /vagrant" rm -rf /var/www/ ln -fs /vagrant /var/www -# install deps with composer +# Setup Friendica cd /var/www - echo ">>> Setup Friendica" # copy the .htaccess-dist file to .htaccess so that rewrite rules work From 0b2fa63bcb8a1bbf5306ecab67d3ccb286091f21 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 1 Oct 2021 10:04:40 +0200 Subject: [PATCH 40/54] Vagrant: Docs add a note about the PHP dependencies --- doc/Vagrant.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/Vagrant.md b/doc/Vagrant.md index 94cebd719..3751b7bc0 100644 --- a/doc/Vagrant.md +++ b/doc/Vagrant.md @@ -18,6 +18,7 @@ What you need to do: Please use an up-to-date vagrant version from https://www.vagrantup.com/downloads.html. 2. Git clone your Friendica repository. Inside, you'll find a `Vagrantfile` and some scripts in the `bin/dev` folder. +Pull the PHP requirements with `bin/composer install`. 3. Run `vagrant up` from inside the friendica clone. This will start the virtual machine. Be patient: When it runs for the first time, it downloads a Debian Server image and installs Friendica. From 9b23ac578e183ce2dabc1ae11f5acea6e9d65ae0 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 1 Oct 2021 10:18:43 +0200 Subject: [PATCH 41/54] Vagrant: create the correct mail aliases during provision --- bin/dev/vagrant_provision.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/dev/vagrant_provision.sh b/bin/dev/vagrant_provision.sh index 6eb9460bd..2dc386a4b 100755 --- a/bin/dev/vagrant_provision.sh +++ b/bin/dev/vagrant_provision.sh @@ -82,7 +82,7 @@ echo ">>> Installing 'Local Only' postfix" debconf-set-selections <<< "postfix postfix/mailname string friendica.local" debconf-set-selections <<< "postfix postfix/main_mailer_type string 'Local Only'" apt-get install -qq postfix mailutils libmailutils-dev -echo -e "friendica1: vagrant\nfriendica2: vagrant\nfriendica3: vagrant\nfriendica4: vagrant\nfriendica5: vagrant" >> /etc/aliases && newaliases +echo -e "$ADMIN_NICK: vagrant\n$USER_NICK: vagrant" >> /etc/aliases && newaliases # Friendica needs git for fetching some dependencies echo ">>> Installing git" From 786596fec5e2d1300d551001fb525f935fbae5f5 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 1 Oct 2021 14:02:27 +0200 Subject: [PATCH 42/54] remove superfluous characters from warning messages in the admin panel \r\n was shown in the warning messages of the admin panel log view page. They have been removed. Additionally the messages.po file has been regenerated. --- src/Module/Admin/Logs/View.php | 4 ++-- view/lang/C/messages.po | 44 +++++++++++++++++----------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/Module/Admin/Logs/View.php b/src/Module/Admin/Logs/View.php index 222052380..bc9a769c6 100644 --- a/src/Module/Admin/Logs/View.php +++ b/src/Module/Admin/Logs/View.php @@ -68,7 +68,7 @@ class View extends BaseAdmin } if (!file_exists($f)) { - $error = DI::l10n()->t('Error trying to open %1$s log file.\r\n
    Check to see if file %1$s exist and is readable.', $f); + $error = DI::l10n()->t('Error trying to open %1$s log file.
    Check to see if file %1$s exist and is readable.', $f); } else { try { $data = DI::parsedLogIterator() @@ -77,7 +77,7 @@ class View extends BaseAdmin ->withFilters($filters) ->withSearch($search); } catch (Exception $e) { - $error = DI::l10n()->t('Couldn\'t open %1$s log file.\r\n
    Check to see if file %1$s is readable.', $f); + $error = DI::l10n()->t('Couldn\'t open %1$s log file.
    Check to see if file %1$s is readable.', $f); } } return Renderer::replaceMacros($t, [ diff --git a/view/lang/C/messages.po b/view/lang/C/messages.po index ac1984cef..8adf175ee 100644 --- a/view/lang/C/messages.po +++ b/view/lang/C/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 2021.12-dev\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-26 03:57+0000\n" +"POT-Creation-Date: 2021-10-01 13:53+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -300,7 +300,7 @@ msgid "%s %s shared a new post" msgstr "" #: mod/api.php:30 mod/editpost.php:38 mod/events.php:236 mod/follow.php:56 -#: mod/follow.php:130 mod/item.php:184 mod/item.php:189 mod/item.php:934 +#: mod/follow.php:130 mod/item.php:185 mod/item.php:190 mod/item.php:936 #: mod/message.php:69 mod/message.php:111 mod/notes.php:44 #: mod/ostatus_subscribe.php:32 mod/photos.php:163 mod/photos.php:917 #: mod/repair_ostatus.php:31 mod/settings.php:47 mod/settings.php:57 @@ -765,23 +765,23 @@ msgstr "" msgid "Unable to locate original post." msgstr "" -#: mod/item.php:340 mod/item.php:345 +#: mod/item.php:341 mod/item.php:346 msgid "Empty post discarded." msgstr "" -#: mod/item.php:741 +#: mod/item.php:742 msgid "Post updated." msgstr "" -#: mod/item.php:751 mod/item.php:756 +#: mod/item.php:752 mod/item.php:757 msgid "Item wasn't stored." msgstr "" -#: mod/item.php:767 +#: mod/item.php:768 msgid "Item couldn't be fetched." msgstr "" -#: mod/item.php:913 src/Module/Admin/Themes/Details.php:39 +#: mod/item.php:914 src/Module/Admin/Themes/Details.php:39 #: src/Module/Admin/Themes/Index.php:59 src/Module/Debug/ItemBody.php:41 #: src/Module/Debug/ItemBody.php:56 msgid "Item not found." @@ -3331,39 +3331,39 @@ msgstr "" msgid "last" msgstr "" -#: src/Content/Text/BBCode.php:985 src/Content/Text/BBCode.php:1773 -#: src/Content/Text/BBCode.php:1774 +#: src/Content/Text/BBCode.php:987 src/Content/Text/BBCode.php:1775 +#: src/Content/Text/BBCode.php:1776 msgid "Image/photo" msgstr "" -#: src/Content/Text/BBCode.php:1158 +#: src/Content/Text/BBCode.php:1160 #, php-format msgid "" "%2$s %3$s" msgstr "" -#: src/Content/Text/BBCode.php:1183 src/Model/Item.php:3152 +#: src/Content/Text/BBCode.php:1185 src/Model/Item.php:3152 #: src/Model/Item.php:3158 src/Model/Item.php:3159 msgid "Link to source" msgstr "" -#: src/Content/Text/BBCode.php:1691 src/Content/Text/HTML.php:943 +#: src/Content/Text/BBCode.php:1693 src/Content/Text/HTML.php:943 msgid "Click to open/close" msgstr "" -#: src/Content/Text/BBCode.php:1722 +#: src/Content/Text/BBCode.php:1724 msgid "$1 wrote:" msgstr "" -#: src/Content/Text/BBCode.php:1778 src/Content/Text/BBCode.php:1779 +#: src/Content/Text/BBCode.php:1780 src/Content/Text/BBCode.php:1781 msgid "Encrypted content" msgstr "" -#: src/Content/Text/BBCode.php:1995 +#: src/Content/Text/BBCode.php:1997 msgid "Invalid source protocol" msgstr "" -#: src/Content/Text/BBCode.php:2010 +#: src/Content/Text/BBCode.php:2012 msgid "Invalid link protocol" msgstr "" @@ -4276,7 +4276,7 @@ msgstr "" msgid "%s: Database update" msgstr "" -#: src/Database/DBStructure.php:853 +#: src/Database/DBStructure.php:803 #, php-format msgid "%s: updating %s table." msgstr "" @@ -4587,7 +4587,7 @@ msgstr "" msgid "View on separate page" msgstr "" -#: src/Model/Mail.php:136 src/Model/Mail.php:268 +#: src/Model/Mail.php:134 src/Model/Mail.php:266 msgid "[no subject]" msgstr "" @@ -5544,15 +5544,15 @@ msgstr "" #: src/Module/Admin/Logs/View.php:71 #, php-format msgid "" -"Error trying to open %1$s log file.\\r\\n
    Check to see " -"if file %1$s exist and is readable." +"Error trying to open %1$s log file.
    Check to see if " +"file %1$s exist and is readable." msgstr "" #: src/Module/Admin/Logs/View.php:80 #, php-format msgid "" -"Couldn't open %1$s log file.\\r\\n
    Check to see if file " -"%1$s is readable." +"Couldn't open %1$s log file.
    Check to see if file %1$s " +"is readable." msgstr "" #: src/Module/Admin/Logs/View.php:85 src/Module/BaseAdmin.php:110 From f51438c168872d165d9c5e99f613ac02dc0bbbed Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 1 Oct 2021 14:05:17 +0200 Subject: [PATCH 43/54] unescape HTML from the relocation warning message --- view/templates/admin/site.tpl | 2 +- view/theme/frio/templates/admin/site.tpl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/view/templates/admin/site.tpl b/view/templates/admin/site.tpl index 72fba2b80..a1226bdf8 100644 --- a/view/templates/admin/site.tpl +++ b/view/templates/admin/site.tpl @@ -152,7 +152,7 @@

    {{$relocate}}

    -

    {{$relocate_warning}}

    +

    {{$relocate_warning nofilter}}

    {{include file="field_input.tpl" field=$relocate_url}}
    diff --git a/view/theme/frio/templates/admin/site.tpl b/view/theme/frio/templates/admin/site.tpl index f043ea8ed..f9ba252f9 100644 --- a/view/theme/frio/templates/admin/site.tpl +++ b/view/theme/frio/templates/admin/site.tpl @@ -339,7 +339,7 @@
    - {{$relocate_warning}} + {{$relocate_warning nofilter}}
    {{include file="field_input.tpl" field=$relocate_url}}
    From fcc284577d06fa9e5aa9c5dbbf57a826907fabc1 Mon Sep 17 00:00:00 2001 From: fabrixxm Date: Fri, 1 Oct 2021 14:08:00 +0200 Subject: [PATCH 44/54] Fix typo in test for ParsedLogIterator --- tests/src/Model/Log/ParsedLogIteratorTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/src/Model/Log/ParsedLogIteratorTest.php b/tests/src/Model/Log/ParsedLogIteratorTest.php index 3ed1a33aa..c278621e7 100644 --- a/tests/src/Model/Log/ParsedLogIteratorTest.php +++ b/tests/src/Model/Log/ParsedLogIteratorTest.php @@ -19,7 +19,7 @@ * */ -namespace Friendica\Test\src\Object\Log; +namespace Friendica\Test\src\Model\Log; use Friendica\Util\ReversedFileReader; use Friendica\Model\Log\ParsedLogIterator; From 19d5987c9d5f4b49f1b7944803ea8b46d3f9aef7 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 1 Oct 2021 13:25:00 +0000 Subject: [PATCH 45/54] Sanitize the addon author if it is not a valid URL but a handle --- src/Core/Addon.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Core/Addon.php b/src/Core/Addon.php index db358db45..a1b35471f 100644 --- a/src/Core/Addon.php +++ b/src/Core/Addon.php @@ -23,6 +23,7 @@ namespace Friendica\Core; use Friendica\Database\DBA; use Friendica\DI; +use Friendica\Model\Contact; use Friendica\Util\Strings; /** @@ -257,6 +258,12 @@ class Addon if ($type == "author" || $type == "maintainer") { $r = preg_match("|([^<]+)<([^>]+)>|", $v, $m); if ($r) { + if (!empty($m[2]) && empty(parse_url($m[2], PHP_URL_SCHEME))) { + $contact = Contact::getByURL($m[2], false); + if (!empty($contact['url'])) { + $m[2] = $contact['url']; + } + } $info[$type][] = ['name' => $m[1], 'link' => $m[2]]; } else { $info[$type][] = ['name' => $v]; From 6a444d8e13006f586c77e7d40a753c3a950477c5 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Fri, 1 Oct 2021 16:28:33 +0200 Subject: [PATCH 46/54] Update mod/display.php Co-authored-by: Hypolite Petovan --- mod/display.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/display.php b/mod/display.php index d854be45e..87775126e 100644 --- a/mod/display.php +++ b/mod/display.php @@ -250,7 +250,7 @@ function display_content(App $a, $update = false, $update_uid = 0) $parent = Post::selectFirst(['uid'], ['uri-id' => $parent_uri_id, 'wall' => true]); } - if (!local_user() && DBA::isResult($parent)) { + if (DBA::isResult($parent)) { $page_uid = $page_uid ?? 0 ?: $parent['uid']; $is_remote_contact = Session::getRemoteContactID($page_uid); if ($is_remote_contact) { From 0638e23f7a857ed5e1cfc20e0152cf83b2cc1541 Mon Sep 17 00:00:00 2001 From: fabrixxm Date: Fri, 1 Oct 2021 16:45:34 +0200 Subject: [PATCH 47/54] Mark string translatable in View logs and update messages.po --- src/Module/Admin/Logs/View.php | 27 ++++++- view/lang/C/messages.po | 74 +++++++++++++++++-- view/templates/admin/logs/view.tpl | 18 ++--- view/theme/frio/templates/admin/logs/view.tpl | 48 ++++++------ 4 files changed, 123 insertions(+), 44 deletions(-) diff --git a/src/Module/Admin/Logs/View.php b/src/Module/Admin/Logs/View.php index bc9a769c6..a11108238 100644 --- a/src/Module/Admin/Logs/View.php +++ b/src/Module/Admin/Logs/View.php @@ -25,7 +25,6 @@ use Friendica\DI; use Friendica\Core\Renderer; use Friendica\Core\Theme; use Friendica\Module\BaseAdmin; -use Friendica\Model\Log\ParsedLogIterator; use Psr\Log\LogLevel; class View extends BaseAdmin @@ -81,13 +80,35 @@ class View extends BaseAdmin } } return Renderer::replaceMacros($t, [ - '$title' => DI::l10n()->t('Administration'), - '$page' => DI::l10n()->t('View Logs'), + '$title' => DI::l10n()->t('Administration'), + '$page' => DI::l10n()->t('View Logs'), + '$l10n' => [ + 'Search' => DI::l10n()->t('Search'), + 'Search_in_logs' => DI::l10n()->t('Search in logs'), + 'Show_all' => DI::l10n()->t('Show all'), + 'Date' => DI::l10n()->t('Date'), + 'Level' => DI::l10n()->t('Level'), + 'Context' => DI::l10n()->t('Context'), + 'Message' => DI::l10n()->t('Message'), + 'ALL' => DI::l10n()->t('ALL'), + 'View_details' => DI::l10n()->t('View details'), + 'Click_to_view_details' => DI::l10n()->t('Click to view details'), + 'Event_details' => DI::l10n()->t('Event details'), + 'Data' => DI::l10n()->t('Data'), + 'Source' => DI::l10n()->t('Source'), + 'File' => DI::l10n()->t('File'), + 'Line' => DI::l10n()->t('Line'), + 'Function' => DI::l10n()->t('Function'), + 'UID' => DI::l10n()->t('UID'), + 'Process_ID' => DI::l10n()->t('Process ID'), + 'Close' => DI::l10n()->t('Close'), + ], '$data' => $data, '$q' => $search, '$filters' => $filters, '$filtersvalues' => $filters_valid_values, '$error' => $error, + '$baseurl' => DI::baseUrl()->get(true), '$logname' => DI::config()->get('system', 'logfile'), ]); } diff --git a/view/lang/C/messages.po b/view/lang/C/messages.po index 8adf175ee..59799c01e 100644 --- a/view/lang/C/messages.po +++ b/view/lang/C/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 2021.12-dev\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-01 13:53+0200\n" +"POT-Creation-Date: 2021-10-01 16:40+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -559,6 +559,7 @@ msgstr "" #: mod/editpost.php:134 src/Content/Conversation.php:380 #: src/Content/Widget/VCard.php:107 src/Model/Profile.php:459 +#: src/Module/Admin/Logs/View.php:93 msgid "Message" msgstr "" @@ -588,7 +589,7 @@ msgstr "" msgid "Create New Event" msgstr "" -#: mod/events.php:536 +#: mod/events.php:536 src/Module/Admin/Logs/View.php:97 msgid "Event details" msgstr "" @@ -3165,7 +3166,7 @@ msgid "Addon applications, utilities, games" msgstr "" #: src/Content/Nav.php:230 src/Content/Text/HTML.php:891 -#: src/Module/Search/Index.php:99 +#: src/Module/Admin/Logs/View.php:87 src/Module/Search/Index.php:99 msgid "Search" msgstr "" @@ -5483,7 +5484,7 @@ msgstr "" msgid "Implicit Mention" msgstr "" -#: src/Module/Admin/Item/Source.php:73 +#: src/Module/Admin/Item/Source.php:73 src/Module/Admin/Logs/View.php:99 #: src/Module/Debug/ActivityPubConversion.php:62 msgid "Source" msgstr "" @@ -5559,6 +5560,67 @@ msgstr "" msgid "View Logs" msgstr "" +#: src/Module/Admin/Logs/View.php:88 +msgid "Search in logs" +msgstr "" + +#: src/Module/Admin/Logs/View.php:89 +#: src/Module/Notifications/Notifications.php:138 +msgid "Show all" +msgstr "" + +#: src/Module/Admin/Logs/View.php:90 +msgid "Date" +msgstr "" + +#: src/Module/Admin/Logs/View.php:91 +msgid "Level" +msgstr "" + +#: src/Module/Admin/Logs/View.php:92 +msgid "Context" +msgstr "" + +#: src/Module/Admin/Logs/View.php:94 +msgid "ALL" +msgstr "" + +#: src/Module/Admin/Logs/View.php:95 +msgid "View details" +msgstr "" + +#: src/Module/Admin/Logs/View.php:96 +msgid "Click to view details" +msgstr "" + +#: src/Module/Admin/Logs/View.php:98 +msgid "Data" +msgstr "" + +#: src/Module/Admin/Logs/View.php:100 +msgid "File" +msgstr "" + +#: src/Module/Admin/Logs/View.php:101 +msgid "Line" +msgstr "" + +#: src/Module/Admin/Logs/View.php:102 +msgid "Function" +msgstr "" + +#: src/Module/Admin/Logs/View.php:103 +msgid "UID" +msgstr "" + +#: src/Module/Admin/Logs/View.php:104 +msgid "Process ID" +msgstr "" + +#: src/Module/Admin/Logs/View.php:105 +msgid "Close" +msgstr "" + #: src/Module/Admin/Queue.php:50 msgid "Inspect Deferred Worker Queue" msgstr "" @@ -8693,10 +8755,6 @@ msgstr "" msgid "Show unread" msgstr "" -#: src/Module/Notifications/Notifications.php:138 -msgid "Show all" -msgstr "" - #: src/Module/OAuth/Acknowledge.php:44 msgid "Authorize application connection" msgstr "" diff --git a/view/templates/admin/logs/view.tpl b/view/templates/admin/logs/view.tpl index e15a4a01b..97b5c0625 100644 --- a/view/templates/admin/logs/view.tpl +++ b/view/templates/admin/logs/view.tpl @@ -9,16 +9,16 @@ {{else}}

    - - - clear + + + {{$l10n.Show_all}}

    - + - + {{foreach $data as $row}} + title="{{$l10n.Click_to_view_details}}"> - + {{foreach $row->getData() as $k=>$v}} @@ -63,7 +63,7 @@ {{/foreach}} - + {{foreach $row->getSource() as $k=>$v}} diff --git a/view/theme/frio/templates/admin/logs/view.tpl b/view/theme/frio/templates/admin/logs/view.tpl index 1e1123fbd..cab888268 100755 --- a/view/theme/frio/templates/admin/logs/view.tpl +++ b/view/theme/frio/templates/admin/logs/view.tpl @@ -8,33 +8,33 @@ {{else}} -
    +
    -
    Date{{$l10n.Date}} Message{{$l10n.Message}}
    - + - + {{foreach $data as $row}}
    Date{{$l10n.Date}} Message{{$l10n.Message}}