From 96deae43faed34878da136846257e531c3133f46 Mon Sep 17 00:00:00 2001 From: zotlabs Date: Thu, 17 Jan 2019 11:47:55 -0800 Subject: [PATCH 01/80] this should fix the rest of the event stuff --- include/event.php | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/include/event.php b/include/event.php index a34250e7a..fdb9e1415 100644 --- a/include/event.php +++ b/include/event.php @@ -6,6 +6,10 @@ use Sabre\VObject; +use Ramsey\Uuid\Uuid; +use Ramsey\Uuid\Exception\UnsatisfiedDependencyException; + + require_once('include/bbcode.php'); /** @@ -463,8 +467,13 @@ function event_store_event($arr) { $hash = $arr['external_id']; elseif(array_key_exists('event_hash',$arr)) $hash = $arr['event_hash']; - else - $hash = random_string() . '@' . App::get_hostname(); + else { + try { + $hash = Uuid::uuid4()->toString(); + } catch (UnsatisfiedDependencyException $e) { + $hash = random_string(48); + } + } $r = q("INSERT INTO event ( uid,aid,event_xchan,event_hash,created,edited,dtstart,dtend,summary,description,location,etype, adjust,nofinish, event_status, event_status_date, event_percent, event_repeat, event_sequence, event_priority, event_vdata, allow_cid,allow_gid,deny_cid,deny_gid) @@ -1126,8 +1135,8 @@ function event_store_item($arr, $event) { } if(! $arr['mid']) { - $arr['uuid'] = item_message_id(); - $arr['mid'] = z_root() . '/item/' . $arr['uuid']; + $arr['uuid'] = $event['event_hash']; + $arr['mid'] = z_root() . '/event/' . $event['event_hash']; } $item_arr['aid'] = $z[0]['channel_account_id']; From 52305ca91b49f8a8f0380234879ac4e5be1705fb Mon Sep 17 00:00:00 2001 From: zotlabs Date: Thu, 17 Jan 2019 14:45:53 -0800 Subject: [PATCH 02/80] more specific network checking in several places and remove some old debugging crud --- Zotlabs/Lib/Libzot.php | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/Zotlabs/Lib/Libzot.php b/Zotlabs/Lib/Libzot.php index 268622430..7dc6b411d 100644 --- a/Zotlabs/Lib/Libzot.php +++ b/Zotlabs/Lib/Libzot.php @@ -271,7 +271,7 @@ class Libzot { // correct hubloc. If this doesn't work we may have to re-write this section to try them all. if(array_key_exists('xchan_addr',$them) && $them['xchan_addr']) { - $r = q("select hubloc_id_url, hubloc_primary from hubloc where hubloc_addr = '%s' order by hubloc_id desc", + $r = q("select hubloc_id_url, hubloc_primary from hubloc where hubloc_addr = '%s' and hubloc_network = 'zot6' order by hubloc_id desc", dbesc($them['xchan_addr']) ); } @@ -356,7 +356,7 @@ class Libzot { ); if($r) { -logger('4'); + // connection exists // if the dob is the same as what we have stored (disregarding the year), keep the one @@ -1193,7 +1193,7 @@ logger('4'); //logger($AS->debug()); - $r = q("select hubloc_hash from hubloc where hubloc_id_url = '%s' limit 1", + $r = q("select hubloc_hash from hubloc where hubloc_id_url = '%s' and hubloc_network = 'zot6' limit 1", dbesc($AS->actor['id']) ); @@ -1202,7 +1202,7 @@ logger('4'); } - $s = q("select hubloc_hash from hubloc where hubloc_id_url = '%s' limit 1", + $s = q("select hubloc_hash from hubloc where hubloc_id_url = '%s' and hubloc_network = 'zot6' limit 1", dbesc($env['sender']) ); @@ -1512,10 +1512,12 @@ logger('4'); } } -logger('item: ' . print_r($arr,true), LOGGER_DATA); + logger('item: ' . print_r($arr,true), LOGGER_DATA); if($arr['mid'] !== $arr['parent_mid']) { -logger('checking source: "' . $arr['mid'] . '" != "' . $arr['parent_mid'] . '"'); + + logger('checking source: "' . $arr['mid'] . '" != "' . $arr['parent_mid'] . '"'); + // check source route. // We are only going to accept comments from this sender if the comment has the same route as the top-level-post, // this is so that permissions mismatches between senders apply to the entire conversation @@ -1600,7 +1602,7 @@ logger('checking source: "' . $arr['mid'] . '" != "' . $arr['parent_mid'] . '"') $arr['route'] = $last_prior_route; } } -logger('hey'); + $ab = q("select * from abook where abook_channel = %d and abook_xchan = '%s'", intval($channel['channel_id']), dbesc($arr['owner_xchan']) @@ -1778,14 +1780,14 @@ logger('hey'); logger($AS->debug()); - $r = q("select hubloc_hash from hubloc where hubloc_id_url = '%s' limit 1", + $r = q("select hubloc_hash from hubloc where hubloc_id_url = '%s' and hubloc_network = 'zot6' limit 1", dbesc($AS->actor['id']) ); if(! $r) { $y = import_author_xchan([ 'url' => $AS->actor['id'] ]); if($y) { - $r = q("select hubloc_hash from hubloc where hubloc_id_url = '%s' limit 1", + $r = q("select hubloc_hash from hubloc where hubloc_id_url = '%s' and hubloc_network = 'zot6' limit 1", dbesc($AS->actor['id']) ); } @@ -1808,7 +1810,7 @@ logger('hey'); $arr['author_xchan'] = $r[0]['hubloc_hash']; } - $s = q("select hubloc_hash from hubloc where hubloc_id_url = '%s' limit 1", + $s = q("select hubloc_hash from hubloc where hubloc_id_url = '%s' and hubloc_network = 'zot6' limit 1", dbesc($a['signature']['signer']) ); @@ -2593,7 +2595,7 @@ logger('hey'); $feed = ((x($arr,'feed')) ? intval($arr['feed']) : 0); if($ztarget) { - $t = q("select * from hubloc where hubloc_id_url = '%s' limit 1", + $t = q("select * from hubloc where hubloc_id_url = '%s' and hubloc_network = 'zot6' limit 1", dbesc($ztarget) ); if($t) { From 1b5dd8bbd7a751cf84f65403197d0dae5be4a8a0 Mon Sep 17 00:00:00 2001 From: zotlabs Date: Sun, 20 Jan 2019 15:09:35 -0800 Subject: [PATCH 03/80] comment permission fix --- Zotlabs/Lib/Libzot.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zotlabs/Lib/Libzot.php b/Zotlabs/Lib/Libzot.php index 7dc6b411d..00dd13afb 100644 --- a/Zotlabs/Lib/Libzot.php +++ b/Zotlabs/Lib/Libzot.php @@ -1496,7 +1496,7 @@ class Libzot { intval($channel['channel_id']) ); if ($parent) { - $allowed = can_comment_on_post($d,$parent[0]); + $allowed = can_comment_on_post($sender,$parent[0]); } } if($request) { From b1e05b48327232d45275fb918252e9a3737b86e7 Mon Sep 17 00:00:00 2001 From: Klaus Weidenbach Date: Sat, 19 Jan 2019 23:13:16 +0100 Subject: [PATCH 04/80] Try to fix some warnings in Zotlabs\Module\Embedphotos. $phototypes was undefined, hope this is correct selection to fix it. Correct Doxygen and clean up some variables and refactoring. --- Zotlabs/Module/Embedphotos.php | 122 +++++++++++++++++++-------------- 1 file changed, 69 insertions(+), 53 deletions(-) diff --git a/Zotlabs/Module/Embedphotos.php b/Zotlabs/Module/Embedphotos.php index bcbb0e116..2df14c239 100644 --- a/Zotlabs/Module/Embedphotos.php +++ b/Zotlabs/Module/Embedphotos.php @@ -3,8 +3,10 @@ namespace Zotlabs\Module; /** - * @brief + * @brief Embedphoto endpoint. * + * Provide an AJAX endpoint to fill the embedPhotoModal with folders and photos + * selection. */ class Embedphotos extends \Zotlabs\Web\Controller { @@ -13,42 +15,42 @@ class Embedphotos extends \Zotlabs\Web\Controller { } /** + * @brief This is the POST destination for the embedphotos button. * - * This is the POST destination for the embedphotos button - * + * @return string A JSON string. */ - function post() { + public function post() { if (argc() > 1 && argv(1) === 'album') { // API: /embedphotos/album - $name = (x($_POST,'name') ? $_POST['name'] : null ); - if(!$name) { + $name = (x($_POST, 'name') ? $_POST['name'] : null ); + if (!$name) { json_return_and_die(array('errormsg' => 'Error retrieving album', 'status' => false)); } $album = $this->embedphotos_widget_album(array('channel' => \App::get_channel(), 'album' => $name)); json_return_and_die(array('status' => true, 'content' => $album)); } - if(argc() > 1 && argv(1) === 'albumlist') { + if (argc() > 1 && argv(1) === 'albumlist') { // API: /embedphotos/albumlist - $album_list = $this->embedphotos_album_list($a); + $album_list = $this->embedphotos_album_list(); json_return_and_die(array('status' => true, 'albumlist' => $album_list)); } - if(argc() > 1 && argv(1) === 'photolink') { + if (argc() > 1 && argv(1) === 'photolink') { // API: /embedphotos/photolink - $href = (x($_POST,'href') ? $_POST['href'] : null ); - if(!$href) { + $href = (x($_POST, 'href') ? $_POST['href'] : null ); + if (!$href) { json_return_and_die(array('errormsg' => 'Error retrieving link ' . $href, 'status' => false)); } - $resource_id = array_pop(explode("/", $href)); + $resource_id = array_pop(explode('/', $href)); $r = q("SELECT obj from item where resource_type = 'photo' and resource_id = '%s' limit 1", dbesc($resource_id) ); - if(!$r) { + if (!$r) { json_return_and_die(array('errormsg' => 'Error retrieving resource ' . $resource_id, 'status' => false)); } $obj = json_decode($r[0]['obj'], true); - if(x($obj,'body')) { + if (x($obj, 'body')) { $photolink = $obj['body']; - } elseif (x($obj,'bbcode')) { + } elseif (x($obj, 'bbcode')) { $photolink = $obj['bbcode']; } else { json_return_and_die(array('errormsg' => 'Error retrieving resource ' . $resource_id, 'status' => false)); @@ -58,48 +60,51 @@ class Embedphotos extends \Zotlabs\Web\Controller { } /** - * Copied from include/widgets.php::widget_album() with a modification to get the profile_uid from - * the input array as in widget_item() + * @brief Get photos from an album. * - * @param array $args - * @return string with HTML + * @see \\Zotlabs\\Widget\\Album::widget() + * + * @param array $args associative array with + * * \e array \b channel + * * \e string \b album + * @return string with HTML code from 'photo_album.tpl' */ - function embedphotos_widget_album($args) { - + protected function embedphotos_widget_album($args) { $channel_id = 0; - if(array_key_exists('channel', $args)) + + if (array_key_exists('channel', $args)) { $channel = $args['channel']; - $channel_id = intval($channel['channel_id']); - if(! $channel_id) + $channel_id = intval($channel['channel_id']); + } + if (! $channel_id) $channel_id = \App::$profile_uid; - if(! $channel_id) + if (! $channel_id) return ''; - $owner_uid = $channel_id; require_once('include/security.php'); $sql_extra = permissions_sql($channel_id); - if(! perm_is_allowed($channel_id,get_observer_hash(),'view_storage')) + if (! perm_is_allowed($channel_id, get_observer_hash(), 'view_storage')) return ''; - if($args['album']) + if (isset($args['album'])) $album = (($args['album'] === '/') ? '' : $args['album']); - if($args['title']) + if (isset($args['title'])) $title = $args['title']; /** - * This may return incorrect permissions if you have multiple directories of the same name. + * @note This may return incorrect permissions if you have multiple directories of the same name. * It is a limitation of the photo table using a name for a photo album instead of a folder hash */ - if($album) { + if ($album) { require_once('include/attach.php'); $x = q("select hash from attach where filename = '%s' and uid = %d limit 1", dbesc($album), - intval($owner_uid) + intval($channel_id) ); - if($x) { - $y = attach_can_view_folder($owner_uid,get_observer_hash(),$x[0]['hash']); - if(! $y) + if ($x) { + $y = attach_can_view_folder($channel_id, get_observer_hash(), $x[0]['hash']); + if (! $y) return ''; } } @@ -110,30 +115,33 @@ class Embedphotos extends \Zotlabs\Web\Controller { (SELECT resource_id, max(imgscale) imgscale FROM photo WHERE uid = %d AND album = '%s' AND imgscale <= 4 AND photo_usage IN ( %d, %d ) $sql_extra GROUP BY resource_id) ph ON (p.resource_id = ph.resource_id AND p.imgscale = ph.imgscale) ORDER BY created $order", - intval($owner_uid), + intval($channel_id), dbesc($album), intval(PHOTO_NORMAL), intval(PHOTO_PROFILE) ); - $photos = array(); - if(count($r)) { + $photos = []; + if (count($r)) { $twist = 'rotright'; - foreach($r as $rr) { - if($twist == 'rotright') + foreach ($r as $rr) { + if ($twist == 'rotright') $twist = 'rotleft'; else $twist = 'rotright'; + $ph = photo_factory(''); + $phototypes = $ph->supportedTypes(); + $ext = $phototypes[$rr['mimetype']]; $imgalt_e = $rr['filename']; $desc_e = $rr['description']; - $imagelink = (z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/image/' . $rr['resource_id'] + $imagelink = (z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $rr['resource_id'] . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '')); - $photos[] = array( + $photos[] = [ 'id' => $rr['id'], 'twist' => ' ' . $twist . rand(2,4), 'link' => $imagelink, @@ -143,35 +151,43 @@ class Embedphotos extends \Zotlabs\Web\Controller { 'desc'=> $desc_e, 'ext' => $ext, 'hash'=> $rr['resource_id'], - 'unknown' => t('Unknown') - ); + 'unknown' => t('Unknown'), + ]; } } $tpl = get_markup_template('photo_album.tpl'); - $o .= replace_macros($tpl, array( + $o = replace_macros($tpl, [ '$photos' => $photos, '$album' => (($title) ? $title : $album), '$album_id' => rand(), - '$album_edit' => array(t('Edit Album'), $album_edit), + '$album_edit' => array(t('Edit Album'), false), '$can_post' => false, '$upload' => array(t('Upload'), z_root() . '/photos/' . \App::$profile['channel_address'] . '/upload/' . bin2hex($album)), '$order' => false, - '$upload_form' => $upload_form, - '$no_fullscreen_btn' => true - )); + '$upload_form' => '', + '$no_fullscreen_btn' => true, + ]); return $o; } - function embedphotos_album_list($a) { + /** + * @brief Get albums observer is allowed to see. + * + * @see photos_albums_list() + * + * @return NULL|array + */ + protected function embedphotos_album_list() { require_once('include/photos.php'); $p = photos_albums_list(\App::get_channel(), \App::get_observer()); - if($p['success']) { + + if ($p['success']) { return $p['albums']; - } else { - return null; } + + return null; } } From cd8a0f33b5df4ae556bfcf274cfb3c4bd5fcdbf7 Mon Sep 17 00:00:00 2001 From: "M. Dent" Date: Tue, 22 Jan 2019 12:13:16 +0100 Subject: [PATCH 05/80] Add remaining hook insertions --- Zotlabs/Module/Group.php | 11 +++++++++-- view/tpl/group_edit.tpl | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Zotlabs/Module/Group.php b/Zotlabs/Module/Group.php index 3dcf903ad..12edf8428 100644 --- a/Zotlabs/Module/Group.php +++ b/Zotlabs/Module/Group.php @@ -66,6 +66,9 @@ class Group extends Controller { $groupname = notags(trim($_POST['groupname'])); $public = intval($_POST['public']); + $hookinfo = [ 'pgrp_extras' => '', 'group'=>$group['id'] ]; + call_hooks ('privacygroup_extras_post',$hookinfo); + if((strlen($groupname)) && (($groupname != $group['gname']) || ($public != $group['visible']))) { $r = q("UPDATE pgrp SET gname = '%s', visible = %d WHERE uid = %d AND id = %d", dbesc($groupname), @@ -76,8 +79,6 @@ class Group extends Controller { if($r) info( t('Privacy group updated.') . EOL ); - $hookinfo = [ 'pgrp_extras' => '', 'group'=>$group['id'] ]; - call_hooks ('privacygroup_extras_post',$hookinfo); build_sync_packet(local_channel(),null,true); } @@ -242,6 +243,10 @@ class Group extends Controller { } } + $hookinfo = [ 'pgrp_extras' => '', 'group'=>$group['id'] ]; + call_hooks ('privacygroup_extras',$hookinfo); + $pgrp_extras = $hookinfo['pgrp_extras']; + $context = $context + array( '$title' => sprintf(t('Privacy Group: %s'), $group['gname']), '$details_label' => t('Edit'), @@ -252,6 +257,7 @@ class Group extends Controller { '$form_security_token_edit' => get_form_security_token('group_edit'), '$delete' => t('Delete Group'), '$form_security_token_drop' => get_form_security_token("group_drop"), + '$pgrp_extras' => $pgrp_extras, ); } @@ -295,6 +301,7 @@ class Group extends Controller { $context['$groupeditor'] = $groupeditor; $context['$desc'] = t('Click a channel to toggle membership'); + $context['$pgrp_extras'] = $pgrp_extras; if($change) { $tpl = get_markup_template('groupeditor.tpl'); diff --git a/view/tpl/group_edit.tpl b/view/tpl/group_edit.tpl index 88f037abe..60038701e 100755 --- a/view/tpl/group_edit.tpl +++ b/view/tpl/group_edit.tpl @@ -13,6 +13,7 @@ {{include file="field_input.tpl" field=$gname}} {{include file="field_checkbox.tpl" field=$public}} + {{$pgrp_extras}} {{$delete}} From 66f443fd00d3da9df0104e9ed2485d902767fe41 Mon Sep 17 00:00:00 2001 From: Max Kostikov Date: Tue, 22 Jan 2019 16:23:44 +0100 Subject: [PATCH 06/80] Skip tags detection in URL --- include/text.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/text.php b/include/text.php index 3cc21e4ce..7d253e3d7 100644 --- a/include/text.php +++ b/include/text.php @@ -825,6 +825,9 @@ function get_tags($s) { // ignore anything in [color= ], because it may contain color codes which are mistaken for tags $s = preg_replace('/\[color=(.*?)\]/sm','',$s); + + // skip anchors in URL + $s = preg_replace('/\[url=(.*?)\]/sm','',$s); // match any double quoted tags From ae538a225942e61256db246431bb9c6f902ba7fa Mon Sep 17 00:00:00 2001 From: Klaus Weidenbach Date: Tue, 22 Jan 2019 23:25:30 +0100 Subject: [PATCH 07/80] Correct parameter in include/text.php prepare_text() Also extend documentation. --- include/text.php | 61 +++++++++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/include/text.php b/include/text.php index 26cb61977..d03d36741 100644 --- a/include/text.php +++ b/include/text.php @@ -983,7 +983,7 @@ function contact_block() { // There is no setting to discover if you are bi-directionally connected // Use the ability to post comments as an indication that this relationship is more - // than wishful thinking; even though soapbox channels and feeds will disable it. + // than wishful thinking; even though soapbox channels and feeds will disable it. if(! intval(get_abconfig(App::$profile['uid'],$rr['xchan_hash'],'their_perms','post_comments'))) { $rr['oneway'] = true; @@ -1109,19 +1109,19 @@ function linkify($s, $me = false) { * @returns string */ function sslify($s) { - + // Local photo cache $str = array( 'body' => $s, 'uid' => local_channel() ); call_hooks('cache_body_hook', $str); - + $s = $str['body']; if (strpos(z_root(),'https:') === false) return $s; - + // By default we'll only sslify img tags because media files will probably choke. // You can set sslify_everything if you want - but it will likely white-screen if it hits your php memory limit. // The downside is that http: media files will likely be blocked by your browser @@ -1452,7 +1452,7 @@ function theme_attachments(&$item) { foreach($arr as $r) { $icon = getIconFromType($r['type']); - + if($r['title']) $label = urldecode(htmlspecialchars($r['title'], ENT_COMPAT, 'UTF-8')); @@ -1729,17 +1729,24 @@ function prepare_binary($item) { /** - * @brief Given a text string, convert from bbcode to html and add smilie icons. + * @brief Given a text string, convert from content_type to HTML. + * + * Take a text in plain text, html, markdown, bbcode, PDL or PHP and prepare + * it to return HTML. + * + * In bbcode this function will add smilie icons. * * @param string $text - * @param string $content_type (optional) default text/bbcode - * @param boolean $cache (optional) default false - * + * @param string $content_type (optional) + * default 'text/bbcode', other values are 'text/plain', 'text/html', + * 'text/markdown', 'application/x-pdl', 'application/x-php' + * @param boolean|array $opts (optional) + * default false, otherwise configuration array for bbcode() * @return string + * The parsed $text as prepared HTML. */ function prepare_text($text, $content_type = 'text/bbcode', $opts = false) { - switch($content_type) { case 'text/plain': $s = escape_tags($text); @@ -1779,8 +1786,8 @@ function prepare_text($text, $content_type = 'text/bbcode', $opts = false) { default: require_once('include/bbcode.php'); - if(stristr($text,'[nosmile]')) - $s = bbcode($text, [ 'cache' => $cache ]); + if(stristr($text, '[nosmile]')) + $s = bbcode($text, ((is_array($opts)) ? $opts : [] )); else $s = smilies(bbcode($text, ((is_array($opts)) ? $opts : [] ))); @@ -2140,7 +2147,7 @@ function legal_webbie($s) { return ''; // WARNING: This regex may not work in a federated environment. - // You will probably want something like + // You will probably want something like // preg_replace('/([^a-z0-9\_])/','',strtolower($s)); $r = preg_replace('/([^a-z0-9\-\_])/','',strtolower($s)); @@ -2240,7 +2247,7 @@ function ids_to_querystr($arr,$idx = 'id',$quote = false) { /** * @brief array_elm_to_str($arr,$elm,$delim = ',') extract unique individual elements from an array of arrays and return them as a string separated by a delimiter - * similar to ids_to_querystr, but allows a different delimiter instead of a db-quote option + * similar to ids_to_querystr, but allows a different delimiter instead of a db-quote option * empty elements (evaluated after trim()) are ignored. * @param $arr array * @param $elm array key to extract from sub-array @@ -2666,7 +2673,7 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $i // get the channel name // First extract the name or name fragment we are going to replace - $name = substr($tag,(($exclusive) ? 2 : 1)); + $name = substr($tag,(($exclusive) ? 2 : 1)); $newname = $name; // make a copy that we can mess with $tagcid = 0; @@ -2709,7 +2716,7 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $i // select anybody by full hubloc_addr if((! $r) && strpos($newname,'@')) { - $r = q("SELECT * FROM xchan left join hubloc on xchan_hash = hubloc_hash + $r = q("SELECT * FROM xchan left join hubloc on xchan_hash = hubloc_hash WHERE hubloc_addr = '%s' LIMIT 1", dbesc($newname) ); @@ -2730,7 +2737,7 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $i // $r is set if we found something $channel = App::get_channel(); - + if($r) { $profile = $r[0]['xchan_url']; $newname = $r[0]['xchan_name']; @@ -2875,7 +2882,7 @@ function getIconFromType($type) { 'video/x-matroska' => 'fa-file-video-o' ); - $catMap = [ + $catMap = [ 'application' => 'fa-file-code-o', 'multipart' => 'fa-folder', 'audio' => 'fa-file-audio-o', @@ -2883,7 +2890,7 @@ function getIconFromType($type) { 'text' => 'fa-file-text-o', 'image' => 'fa=file-picture-o', 'message' => 'fa-file-text-o' - ]; + ]; $iconFromType = ''; @@ -2893,7 +2900,7 @@ function getIconFromType($type) { } else { $parts = explode('/',$type); - if($parts[0] && $catMap[$parts[0]]) { + if($parts[0] && $catMap[$parts[0]]) { $iconFromType = $catMap[$parts[0]]; } } @@ -3149,7 +3156,7 @@ function flatten_array_recursive($arr) { * @param string $lang Which language should be highlighted * @return string * Important: The returned text has the text pattern 'http' translated to '%eY9-!' which should be converted back - * after further processing. This was done to prevent oembed links from occurring inside code blocks. + * after further processing. This was done to prevent oembed links from occurring inside code blocks. * See include/bbcode.php */ function text_highlight($s, $lang) { @@ -3383,7 +3390,7 @@ function unique_multidim_array($array, $key) { $temp_array = array(); $i = 0; $key_array = array(); - + foreach($array as $val) { if (!in_array($val[$key], $key_array)) { $key_array[$i] = $val[$key]; @@ -3411,7 +3418,7 @@ function get_forum_channels($uid) { intval($uid) ); - if($x2) { + if($x2) { $xf = ids_to_querystr($x2,'xchan',true); // private forums @@ -3424,7 +3431,7 @@ function get_forum_channels($uid) { } } - $sql_extra = (($xf) ? " and ( xchan_hash in (" . $xf . ") or xchan_pubforum = 1 ) " : " and xchan_pubforum = 1 "); + $sql_extra = (($xf) ? " and ( xchan_hash in (" . $xf . ") or xchan_pubforum = 1 ) " : " and xchan_pubforum = 1 "); $r = q("select abook_id, xchan_hash, xchan_name, xchan_url, xchan_addr, xchan_photo_s from abook left join xchan on abook_xchan = xchan_hash where xchan_deleted = 0 and abook_channel = %d and abook_pending = 0 and abook_ignored = 0 and abook_blocked = 0 and abook_archived = 0 $sql_extra order by xchan_name", intval($uid) @@ -3460,14 +3467,14 @@ function print_array($arr, $level = 0) { $o .= $tabs . '[' . $k . '] => ' . print_array($v, $level + 1) . "\n"; } else { - $o .= $tabs . '[' . $k . '] => ' . print_val($v) . ",\n"; + $o .= $tabs . '[' . $k . '] => ' . print_val($v) . ",\n"; } } } $o .= substr($tabs,0,-1) . ']' . (($level) ? ',' : ';' ). "\n"; return $o; } - + } function print_val($v) { @@ -3494,7 +3501,7 @@ function array_path_exists($str,$arr) { } else { return false; - } + } } return true; } From 54806f6ee882d1d29a800f31eb42508221e59dc3 Mon Sep 17 00:00:00 2001 From: Mario Vavti Date: Wed, 23 Jan 2019 15:36:34 +0100 Subject: [PATCH 08/80] fix page jumping when liking a collapsed/expanded post --- view/js/main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/view/js/main.js b/view/js/main.js index ee11ab1c6..d88133b23 100644 --- a/view/js/main.js +++ b/view/js/main.js @@ -845,10 +845,10 @@ function collapseHeight() { }); var collapsedContentHeight = Math.ceil($("#region_2").height()); - contentHeightDiff = origContentHeight - collapsedContentHeight; + contentHeightDiff = liking ? 0 : origContentHeight - collapsedContentHeight; console.log('collapseHeight() - contentHeightDiff: ' + contentHeightDiff + 'px'); - if(i){ + if(i && !liking){ var sval = position - cDiff + ($(".divgrow-showmore").outerHeight() * i); console.log('collapsed above viewport count: ' + i); $(window).scrollTop(sval); From 13e0151cd2569832588cc9a973bcf40d850edd53 Mon Sep 17 00:00:00 2001 From: Klaus Weidenbach Date: Fri, 18 Jan 2019 22:17:10 +0100 Subject: [PATCH 09/80] Correct and extend Doxygen comments. Correct some documentation errors for Doxygen and add more comments. Document some undefined variables with @FIXME. --- Zotlabs/Lib/Libzot.php | 228 ++++++++++++++++++----------------- Zotlabs/Lib/PConfig.php | 9 +- Zotlabs/Module/Cards.php | 16 ++- Zotlabs/Zot6/Zot6Handler.php | 36 +++--- include/attach.php | 60 +++++---- include/feedutils.php | 20 ++- include/help.php | 30 +++-- include/import.php | 9 +- include/items.php | 30 ++--- include/plugin.php | 17 +-- include/text.php | 147 ++++++++++++++-------- include/zot.php | 22 ++-- 12 files changed, 351 insertions(+), 273 deletions(-) diff --git a/Zotlabs/Lib/Libzot.php b/Zotlabs/Lib/Libzot.php index a0f6e077a..167e2d67d 100644 --- a/Zotlabs/Lib/Libzot.php +++ b/Zotlabs/Lib/Libzot.php @@ -2,11 +2,6 @@ namespace Zotlabs\Lib; -/** - * @brief lowlevel implementation of Zot6 protocol. - * - */ - use Zotlabs\Zot6\HTTPSig; use Zotlabs\Access\Permissions; use Zotlabs\Access\PermissionLimits; @@ -14,14 +9,17 @@ use Zotlabs\Daemon\Master; require_once('include/crypto.php'); - +/** + * @brief Lowlevel implementation of Zot6 protocol. + * + */ class Libzot { /** * @brief Generates a unique string for use as a zot guid. * - * Generates a unique string for use as a zot guid using our DNS-based url, the - * channel nickname and some entropy. + * Generates a unique string for use as a zot guid using our DNS-based url, + * the channel nickname and some entropy. * The entropy ensures uniqueness against re-installs where the same URL and * nickname are chosen. * @@ -32,9 +30,8 @@ class Libzot { * immediate universe. * * @param string $channel_nick a unique nickname of controlling entity - * @returns string + * @return string */ - static function new_uid($channel_nick) { $rawstr = z_root() . '/' . $channel_nick . '.' . mt_rand(); return(base64url_encode(hash('whirlpool', $rawstr, true), true)); @@ -52,8 +49,8 @@ class Libzot { * * @param string $guid * @param string $pubkey + * @return string */ - static function make_xchan_hash($guid, $pubkey) { return base64url_encode(hash('whirlpool', $guid . $pubkey, true)); } @@ -65,10 +62,8 @@ class Libzot { * should only be used by channels which are defined on this hub. * * @param string $hash - xchan_hash - * @returns array of hubloc (hub location structures) - * + * @return array of hubloc (hub location structures) */ - static function get_hublocs($hash) { /* Only search for active hublocs - e.g. those that haven't been marked deleted */ @@ -92,16 +87,17 @@ class Libzot { * packet type: one of 'ping', 'pickup', 'purge', 'refresh', 'keychange', 'force_refresh', 'notify', 'auth_check' * @param array $recipients * envelope recipients, array of portable_id's; empty for public posts - * @param string msg + * @param string $msg * optional message + * @param string $encoding + * optional encoding, default 'activitystreams' * @param string $remote_key * optional public site key of target hub used to encrypt entire packet * NOTE: remote_key and encrypted packets are required for 'auth_check' packets, optional for all others * @param string $methods - * optional comma separated list of encryption methods @ref self::best_algorithm() + * optional comma separated list of encryption methods @ref best_algorithm() * @returns string json encoded zot packet */ - static function build_packet($channel, $type = 'activity', $recipients = null, $msg = '', $encoding = 'activitystreams', $remote_key = null, $methods = '') { $sig_method = get_config('system','signature_algorithm','sha256'); @@ -146,11 +142,10 @@ class Libzot { * @brief Choose best encryption function from those available on both sites. * * @param string $methods - * comma separated list of encryption methods + * Comma separated list of encryption methods * @return string first match from our site method preferences crypto_methods() array - * of a method which is common to both sites; or 'aes256cbc' if no matches are found. + * of a method which is common to both sites; or 'aes256cbc' if no matches are found. */ - static function best_algorithm($methods) { $x = [ @@ -164,7 +159,6 @@ class Libzot { * * \e string \b methods - comma separated list of encryption methods * * \e string \b result - the algorithm to return */ - call_hooks('zot_best_algorithm', $x); if($x['result']) @@ -190,7 +184,7 @@ class Libzot { /** - * @brief send a zot message + * @brief Send a zot message. * * @see z_post_url() * @@ -200,18 +194,17 @@ class Libzot { * @param array $crypto (required if encrypted httpsig, requires hubloc_sitekey and site_crypto elements) * @return array see z_post_url() for returned data format */ - static function zot($url, $data, $channel = null,$crypto = null) { if($channel) { - $headers = [ - 'X-Zot-Token' => random_string(), - 'Digest' => HTTPSig::generate_digest_header($data), + $headers = [ + 'X-Zot-Token' => random_string(), + 'Digest' => HTTPSig::generate_digest_header($data), 'Content-type' => 'application/x-zot+json', '(request-target)' => 'post ' . get_request_string($url) ]; - $h = HTTPSig::create_sig($headers,$channel['channel_prvkey'],channel_url($channel),false,'sha512', + $h = HTTPSig::create_sig($headers,$channel['channel_prvkey'],channel_url($channel),false,'sha512', (($crypto) ? [ 'key' => $crypto['hubloc_sitekey'], 'algorithm' => self::best_algorithm($crypto['site_crypto']) ] : false)); } else { @@ -227,7 +220,6 @@ class Libzot { /** * @brief Refreshes after permission changed or friending, etc. * - * * refresh is typically invoked when somebody has changed permissions of a channel and they are notified * to fetch new permissions via a finger/discovery operation. This may result in a new connection * (abook entry) being added to a local channel and it may result in auto-permissions being granted. @@ -251,7 +243,6 @@ class Libzot { * * \b true if successful * * otherwise \b false */ - static function refresh($them, $channel = null, $force = false) { logger('them: ' . print_r($them,true), LOGGER_DATA, LOG_DEBUG); @@ -265,7 +256,7 @@ class Libzot { } else { $r = null; - + // if they re-installed the server we could end up with the wrong record - pointing to the old install. // We'll order by reverse id to try and pick off the newest one first and hopefully end up with the // correct hubloc. If this doesn't work we may have to re-write this section to try them all. @@ -317,6 +308,7 @@ class Libzot { if(! $hsig_valid) { logger('http signature not valid: ' . print_r($hsig,true)); + /// @FIXME $result is undefined return $result; } @@ -416,7 +408,7 @@ class Libzot { if($y) { logger("New introduction received for {$channel['channel_name']}"); $new_perms = get_all_perms($channel['channel_id'],$x['hash'],false); - + // Send a clone sync packet and a permissions update if permissions have changed $new_connection = q("select * from abook left join xchan on abook_xchan = xchan_hash where abook_xchan = '%s' and abook_channel = %d and abook_self = 0 order by abook_created desc limit 1", @@ -524,10 +516,14 @@ class Libzot { return false; } - - - - static function valid_hub($sender,$site_id) { + /** + * @brief + * + * @param string $sender + * @param string $site_id + * @return null|array + */ + static function valid_hub($sender, $site_id) { $r = q("select hubloc.*, site.site_crypto from hubloc left join site on hubloc_url = site_url where hubloc_hash = '%s' and hubloc_site_id = '%s' limit 1", dbesc($sender), @@ -548,7 +544,6 @@ class Libzot { } return $r[0]; - } /** @@ -559,21 +554,14 @@ class Libzot { * origination address. This will fetch the discovery packet of the sender, * which contains the public key we need to verify our guid and url signatures. * - * @param array $arr an associative array which must contain: - * * \e string \b guid => guid of conversant - * * \e string \b guid_sig => guid signed with conversant's private key - * * \e string \b url => URL of the origination hub of this communication - * * \e string \b url_sig => URL signed with conversant's private key + * @param string $id * * @return array An associative array with - * * \b success boolean true or false - * * \b message (optional) error string only if success is false + * * \e boolean \b success + * * \e string \b message (optional, unused) error string only if success is false */ - static function register_hub($id) { - $id_hash = false; - $valid = false; $hsig_valid = false; $result = [ 'success' => false ]; @@ -807,7 +795,7 @@ class Libzot { // If setting for the default profile, unset the profile photo flag from any other photos I own if($is_default_profile) { - q("UPDATE photo SET photo_usage = %d WHERE photo_usage = %d AND resource_id != '%s' AND aid = %d AND uid = %d", + q("UPDATE photo SET photo_usage = %d WHERE photo_usage = %d AND resource_id != '%s' AND aid = %d AND uid = %d", intval(PHOTO_NORMAL), intval(PHOTO_PROFILE), dbesc($hash), @@ -954,8 +942,8 @@ class Libzot { * @param string $hub - url of site we just contacted * @param array $arr - output of z_post_url() * @param array $outq - The queue structure attached to this request + * @return void */ - static function process_response($hub, $arr, $outq) { logger('remote: ' . print_r($arr,true),LOGGER_DATA); @@ -986,7 +974,7 @@ class Libzot { if(! $x['success']) { // handle remote validation issues - + $b = q("update dreport set dreport_result = '%s', dreport_time = '%s' where dreport_queue = '%s'", dbesc(($x['message']) ? $x['message'] : 'unknown delivery error'), dbesc(datetime_convert()), @@ -994,7 +982,7 @@ class Libzot { ); } - if(is_array($x) && array_key_exists('delivery_report',$x) && is_array($x['delivery_report'])) { + if(is_array($x) && array_key_exists('delivery_report',$x) && is_array($x['delivery_report'])) { foreach($x['delivery_report'] as $xx) { call_hooks('dreport_process',$xx); @@ -1083,11 +1071,6 @@ class Libzot { * * @param array $arr * 'pickup' structure returned from remote site - * @param string $sender_url - * the url specified by the sender in the initial communication. - * We will verify the sender and url in each returned message structure and - * also verify that all the messages returned match the site url that we are - * currently processing. * * @returns array * Suitable for logging remotely, enumerating the processing results of each message/recipient combination @@ -1095,7 +1078,6 @@ class Libzot { * * [1] => \e string $delivery_status * * [2] => \e string $address */ - static function import($arr) { $env = $arr; @@ -1117,7 +1099,7 @@ class Libzot { $has_data = array_key_exists('data',$env) && $env['data']; $data = (($has_data) ? $env['data'] : false); - $AS = null; + $AS = null; if($env['encoding'] === 'activitystreams') { @@ -1175,7 +1157,6 @@ class Libzot { $deliveries = self::public_recips($env,$AS); - } $deliveries = array_unique($deliveries); @@ -1196,7 +1177,7 @@ class Libzot { $r = q("select hubloc_hash from hubloc where hubloc_id_url = '%s' and hubloc_network = 'zot6' limit 1", dbesc($AS->actor['id']) - ); + ); if($r) { $arr['author_xchan'] = $r[0]['hubloc_hash']; @@ -1205,20 +1186,20 @@ class Libzot { $s = q("select hubloc_hash from hubloc where hubloc_id_url = '%s' and hubloc_network = 'zot6' limit 1", dbesc($env['sender']) - ); + ); // in individual delivery, change owner if needed if($s) { $arr['owner_xchan'] = $s[0]['hubloc_hash']; } else { - $arr['owner_xchan'] = $env['sender']; + $arr['owner_xchan'] = $env['sender']; } if($private) { $arr['item_private'] = true; } - // @fixme - spoofable + /// @FIXME - spoofable if($AS->data['hubloc']) { $arr['item_verified'] = true; } @@ -1247,12 +1228,19 @@ class Libzot { } if ($result) { $return = array_merge($return, $result); - } + } return $return; } - static function is_top_level($env,$act) { + /** + * @brief + * + * @param array $env + * @param object $act + * @return boolean + */ + static function is_top_level($env, $act) { if($env['encoding'] === 'zot' && array_key_exists('flags',$env) && in_array('thread_parent', $env['flags'])) { return true; } @@ -1295,9 +1283,9 @@ class Libzot { * Some of these will be rejected, but this gives us a place to start. * * @param array $msg - * @return NULL|array + * @param object $act + * @return array */ - static function public_recips($msg, $act) { require_once('include/channel.php'); @@ -1442,7 +1430,7 @@ class Libzot { * will normally arrive first via sync delivery, but this isn't guaranteed. * There's a chance the current delivery could take place before the cloned copy arrives * hence the item could have the wrong ACL and *could* be used in subsequent deliveries or - * access checks. + * access checks. */ if($sender === $channel['channel_portable_id'] && $arr['author_xchan'] === $channel['channel_portable_id'] && $arr['mid'] === $arr['parent_mid']) { @@ -1504,7 +1492,7 @@ class Libzot { $allowed = true; $friendofriend = true; } - + if (! $allowed) { logger("permission denied for delivery to channel {$channel['channel_id']} {$channel['channel_address']}"); $DR->update('permission denied'); @@ -1524,7 +1512,7 @@ class Libzot { // this is so that permissions mismatches between senders apply to the entire conversation // As a side effect we will also do a preliminary check that we have the top-level-post, otherwise // processing it is pointless. - + $r = q("select route, id, owner_xchan, item_private from item where mid = '%s' and uid = %d limit 1", dbesc($arr['parent_mid']), intval($channel['channel_id']) @@ -1553,14 +1541,14 @@ class Libzot { } continue; } - + if($relay || $friendofriend || (intval($r[0]['item_private']) === 0 && intval($arr['item_private']) === 0)) { // reset the route in case it travelled a great distance upstream // use our parent's route so when we go back downstream we'll match // with whatever route our parent has. // Also friend-of-friend conversations may have been imported without a route, // but we are now getting comments via listener delivery - // and if there is no privacy on this or the parent, we don't care about the route, + // and if there is no privacy on this or the parent, we don't care about the route, // so just set the owner and route accordingly. $arr['route'] = $r[0]['route']; $arr['owner_xchan'] = $r[0]['owner_xchan']; @@ -1614,13 +1602,13 @@ class Libzot { // remove_community_tag is a no-op if this isn't a community tag activity self::remove_community_tag($sender,$arr,$channel['channel_id']); - + // set these just in case we need to store a fresh copy of the deleted post. // This could happen if the delete got here before the original post did. $arr['aid'] = $channel['channel_account_id']; $arr['uid'] = $channel['channel_id']; - + $item_id = self::delete_imported_item($sender,$arr,$channel['channel_id'],$relay); $DR->update(($item_id) ? 'deleted' : 'delete_failed'); $result[] = $DR->get(); @@ -1716,7 +1704,7 @@ class Libzot { * * \e array \b item * * \e array \b sender * * \e array \b channel - */ + */ call_hooks('activity_received', $parr); // don't add a source route if it's a relay or later recipients will get a route mismatch if(! $relay) @@ -1783,7 +1771,7 @@ class Libzot { $r = q("select hubloc_hash from hubloc where hubloc_id_url = '%s' and hubloc_network = 'zot6' limit 1", dbesc($AS->actor['id']) - ); + ); if(! $r) { $y = import_author_xchan([ 'url' => $AS->actor['id'] ]); @@ -1791,7 +1779,7 @@ class Libzot { $r = q("select hubloc_hash from hubloc where hubloc_id_url = '%s' and hubloc_network = 'zot6' limit 1", dbesc($AS->actor['id']) ); - } + } if(! $r) { logger('FOF Activity: no actor'); continue; @@ -1813,7 +1801,7 @@ class Libzot { $s = q("select hubloc_hash from hubloc where hubloc_id_url = '%s' and hubloc_network = 'zot6' limit 1", dbesc($a['signature']['signer']) - ); + ); if($s) { $arr['owner_xchan'] = $s[0]['hubloc_hash']; @@ -1822,7 +1810,7 @@ class Libzot { $arr['owner_xchan'] = $a['signature']['signer']; } - // @fixme - spoofable + /// @FIXME - spoofable if($AS->data['hubloc']) { $arr['item_verified'] = true; } @@ -1836,7 +1824,7 @@ class Libzot { $result = self::process_delivery($arr['owner_xchan'],$arr, [ $channel['channel_portable_id'] ],false,false,true); if ($result) { $ret = array_merge($ret, $result); - } + } } return $ret; @@ -1853,8 +1841,8 @@ class Libzot { * * \e int \b obj_type * * \e int \b mid * @param int $uid + * @return void */ - static function remove_community_tag($sender, $arr, $uid) { if(! (activity_match($arr['verb'], ACTIVITY_TAG) && ($arr['obj_type'] == ACTIVITY_OBJ_TAGTERM))) @@ -1882,7 +1870,7 @@ class Libzot { } $i = $r[0]; - + if($i['target']) $i['target'] = json_decode($i['target'],true); if($i['object']) @@ -1925,8 +1913,8 @@ class Libzot { * @param array $orig * @param int $uid * @param boolean $tag_delivery + * @return void|array */ - static function update_imported_item($sender, $item, $orig, $uid, $tag_delivery) { // If this is a comment being updated, remove any privacy information @@ -2066,7 +2054,7 @@ class Libzot { } foreach($deliveries as $d) { - + $DR = new DReport(z_root(),$sender,$d,$arr['mid']); $r = q("select * from channel where channel_portable_id = '%s' limit 1", @@ -2085,7 +2073,7 @@ class Libzot { if(! perm_is_allowed($channel['channel_id'],$sender,'post_mail')) { - /* + /* * Always allow somebody to reply if you initiated the conversation. It's anti-social * and a bit rude to send a private message to somebody and block their ability to respond. * If you are being harrassed and want to put an end to it, delete the conversation. @@ -2145,12 +2133,13 @@ class Libzot { * @brief Processes delivery of profile. * * @see import_directory_profile() + * * @param array $sender an associative array * * \e string \b hash a xchan_hash * @param array $arr * @param array $deliveries (unused) + * @return void */ - static function process_profile_delivery($sender, $arr, $deliveries) { logger('process_profile_delivery', LOGGER_DEBUG); @@ -2171,6 +2160,7 @@ class Libzot { * * \e string \b hash a xchan_hash * @param array $arr * @param array $deliveries (unused) deliveries is irrelevant + * @return void */ static function process_location_delivery($sender, $arr, $deliveries) { @@ -2188,7 +2178,7 @@ class Libzot { $x = Libsync::sync_locations($xchan,$arr,true); logger('results: ' . print_r($x,true), LOGGER_DEBUG); if($x['changed']) { - $guid = random_string() . '@' . App::get_hostname(); + //$guid = random_string() . '@' . App::get_hostname(); Libzotdir::update_modtime($sender,$r[0]['xchan_guid'],$arr['locations'][0]['address'],UPDATE_FLAGS_UPDATED); } } @@ -2212,8 +2202,8 @@ class Libzot { * * @param string $sender_hash A channel hash * @param array $locations + * @return void */ - static function check_location_move($sender_hash, $locations) { if(! $locations) @@ -2255,7 +2245,6 @@ class Libzot { } - /** * @brief Returns an array with all known distinct hubs for this channel. * @@ -2264,7 +2253,6 @@ class Libzot { * * \e string \b channel_hash the hash of the channel * @return array an array with associative arrays */ - static function encode_locations($channel) { $ret = []; @@ -2305,7 +2293,7 @@ class Libzot { if(! $z['site_id']) { $z['site_id'] = Libzot::make_xchan_hash($z['url'],$z['sitekey']); } - + $ret[] = $z; } } @@ -2318,10 +2306,8 @@ class Libzot { * @brief * * @param array $arr - * @param string $pubkey * @return boolean true if updated or inserted */ - static function import_site($arr) { if( (! is_array($arr)) || (! $arr['url']) || (! $arr['site_sig'])) @@ -2600,16 +2586,16 @@ class Libzot { dbesc($ztarget) ); if($t) { - + $ztarget_hash = $t[0]['hubloc_hash']; } else { - + // should probably perform discovery of the requestor (target) but if they actually had - // permissions we would know about them and we only want to know who they are to + // permissions we would know about them and we only want to know who they are to // enumerate their specific permissions - + $ztarget_hash = EMPTY_STR; } } @@ -2756,7 +2742,7 @@ class Libzot { $ret['id'] = $e['xchan_guid']; $ret['id_sig'] = self::sign($e['xchan_guid'], $e['channel_prvkey']); - $ret['primary_location'] = [ + $ret['primary_location'] = [ 'address' => $e['xchan_addr'], 'url' => $e['xchan_url'], 'connections_url' => $e['xchan_connurl'], @@ -2778,7 +2764,7 @@ class Libzot { $ret['searchable'] = $searchable; $ret['adult_content'] = $adult_channel; $ret['public_forum'] = $public_forum; - + $ret['comments'] = map_scope(PermissionLimits::Get($e['channel_id'],'post_comments')); $ret['mail'] = map_scope(PermissionLimits::Get($e['channel_id'],'post_mail')); @@ -2836,14 +2822,20 @@ class Libzot { $ret['locations'] = $x; $ret['site'] = self::site_info(); + /** + * @hooks zotinfo + * Hook to manipulate the zotinfo array before it is returned. + */ + call_hooks('zotinfo', $ret); - call_hooks('zotinfo',$ret); - - return($ret); - + return $ret; } - + /** + * @brief Get siteinfo. + * + * @return array + */ static function site_info() { $signing_key = get_config('system','prvkey'); @@ -2880,7 +2872,7 @@ class Libzot { if($dirmode != DIRECTORY_MODE_STANDALONE) { $register_policy = intval(get_config('system','register_policy')); - + if($register_policy == REGISTER_CLOSED) $ret['site']['register_policy'] = 'closed'; if($register_policy == REGISTER_APPROVE) @@ -2927,18 +2919,16 @@ class Libzot { } return $ret['site']; - } /** * @brief * * @param array $hub - * @param string $sitekey (optional, default empty) + * @param string $site_id (optional, default empty) * * @return string hubloc_url */ - static function update_hub_connected($hub, $site_id = '') { if ($site_id) { @@ -2997,12 +2987,21 @@ class Libzot { return $hub['hubloc_url']; } - + /** + * @brief + * + * @param string $data + * @param string $key + * @param string $alg (optional) default 'sha256' + * @return string + */ static function sign($data,$key,$alg = 'sha256') { if(! $key) return 'no key'; + $sig = ''; openssl_sign($data,$sig,$key,$alg); + return $alg . '.' . base64url_encode($sig); } @@ -3015,24 +3014,27 @@ class Libzot { if ($key && count($x) === 2) { $alg = $x[0]; $signature = base64url_decode($x[1]); - + $verify = @openssl_verify($data,$signature,$key,$alg); if ($verify === (-1)) { while ($msg = openssl_error_string()) { logger('openssl_verify: ' . $msg,LOGGER_NORMAL,LOG_ERR); } - btlogger('openssl_verify: key: ' . $key, LOGGER_DEBUG, LOG_ERR); + btlogger('openssl_verify: key: ' . $key, LOGGER_DEBUG, LOG_ERR); } } return(($verify > 0) ? true : false); } - - + /** + * @brief + * + * @return boolean + */ static function is_zot_request() { - $x = getBestSupportedMimeType([ 'application/x-zot+json' ]); + return(($x) ? true : false); } diff --git a/Zotlabs/Lib/PConfig.php b/Zotlabs/Lib/PConfig.php index 69f4de2db..95f07d580 100644 --- a/Zotlabs/Lib/PConfig.php +++ b/Zotlabs/Lib/PConfig.php @@ -112,9 +112,11 @@ class PConfig { * The configuration key to set * @param string $value * The value to store + * @param string $updated (optional) + * The datetime to store * @return mixed Stored $value or false */ - static public function Set($uid, $family, $key, $value, $updated=NULL) { + static public function Set($uid, $family, $key, $value, $updated = NULL) { // this catches subtle errors where this function has been called // with local_channel() when not logged in (which returns false) @@ -239,7 +241,9 @@ class PConfig { * The category of the configuration value * @param string $key * The configuration key to delete - * @return mixed + * @param string $updated (optional) + * The datetime to store + * @return boolean */ static public function Delete($uid, $family, $key, $updated = NULL) { @@ -283,6 +287,7 @@ class PConfig { if(! array_key_exists($family, \App::$config[$uid]['transient'])) \App::$config[$uid]['transient'][$family] = array(); + /// @FIXME $new is undefined, so dead code if ($new) { \App::$config[$uid]['transient'][$family]['pcfgdel:'.$key] = $updated; } diff --git a/Zotlabs/Module/Cards.php b/Zotlabs/Module/Cards.php index b66de158b..3f0e93de5 100644 --- a/Zotlabs/Module/Cards.php +++ b/Zotlabs/Module/Cards.php @@ -10,9 +10,13 @@ require_once('include/channel.php'); require_once('include/conversation.php'); require_once('include/acl_selectors.php'); +/** + * @brief Provides the Cards module. + * + */ class Cards extends Controller { - function init() { + public function init() { if(argc() > 1) $which = argv(1); @@ -20,14 +24,15 @@ class Cards extends Controller { return; profile_load($which); - } /** * {@inheritDoc} - * @see \Zotlabs\Web\Controller::get() + * @see \\Zotlabs\\Web\\Controller::get() + * + * @return string Parsed HTML from template 'cards.tpl' */ - function get($update = 0, $load = false) { + public function get($update = 0, $load = false) { if(observer_prohibited(true)) { return login(); @@ -99,7 +104,6 @@ class Cards extends Controller { } - if(perm_is_allowed($owner, $ob_hash, 'write_pages')) { $x = [ @@ -110,7 +114,7 @@ class Cards extends Controller { 'nickname' => $channel['channel_address'], 'lockstate' => (($channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'), - 'acl' => (($is_owner) ? populate_acl($channel_acl, false, + 'acl' => (($is_owner) ? populate_acl($channel_acl, false, PermissionDescription::fromGlobalPermission('view_pages')) : ''), 'permissions' => $channel_acl, 'showacl' => (($is_owner) ? true : false), diff --git a/Zotlabs/Zot6/Zot6Handler.php b/Zotlabs/Zot6/Zot6Handler.php index e320e7825..8f8957037 100644 --- a/Zotlabs/Zot6/Zot6Handler.php +++ b/Zotlabs/Zot6/Zot6Handler.php @@ -29,7 +29,7 @@ class Zot6Handler implements IHandler { // Implementation of specific methods follows; - // These generally do a small amout of validation and call Libzot + // These generally do a small amout of validation and call Libzot // to do any heavy lifting static function reply_notify($data,$hub) { @@ -40,7 +40,7 @@ class Zot6Handler implements IHandler { $x = Libzot::fetch($data); $ret['delivery_report'] = $x; - + $ret['success'] = true; return $ret; @@ -58,11 +58,11 @@ class Zot6Handler implements IHandler { * * @param array $sender * @param array $recipients + * @param array $hub * - * @return json_return_and_die() + * @return array */ - - static function reply_refresh($sender, $recipients,$hub) { + static function reply_refresh($sender, $recipients, $hub) { $ret = array('success' => false); if($recipients) { @@ -70,19 +70,18 @@ class Zot6Handler implements IHandler { // This would be a permissions update, typically for one connection foreach ($recipients as $recip) { - $r = q("select channel.*,xchan.* from channel left join xchan on channel_portable_id = xchan_hash where xchan_hash ='%s' limit 1", dbesc($recip) ); - + /// @FIXME $msgtype is undefined $x = Libzot::refresh( [ 'hubloc_id_url' => $hub['hubloc_id_url'] ], $r[0], (($msgtype === 'force_refresh') ? true : false)); } } else { // system wide refresh - + /// @FIXME $msgtype is undefined $x = Libzot::refresh( [ 'hubloc_id_url' => $hub['hubloc_id_url'] ], null, (($msgtype === 'force_refresh') ? true : false)); } @@ -100,17 +99,16 @@ class Zot6Handler implements IHandler { * for that packet. We will create a message_list array of the entire conversation starting with * the missing parent and invoke delivery to the sender of the packet. * - * Zotlabs/Daemon/Deliver.php (for local delivery) and + * Zotlabs/Daemon/Deliver.php (for local delivery) and * mod/post.php???? @fixme (for web delivery) detect the existence of * this 'message_list' at the destination and split it into individual messages which are * processed/delivered in order. * - * * @param array $data + * @param array $hub * @return array */ - - static function reply_message_request($data,$hub) { + static function reply_message_request($data, $hub) { $ret = [ 'success' => false ]; $message_id = EMPTY_STR; @@ -153,11 +151,10 @@ class Zot6Handler implements IHandler { /* * fetch the requested conversation */ - + /// @FIXME $sender_hash is undefined $messages = zot_feed($c[0]['channel_id'],$sender_hash, [ 'message_id' => $data['message_id'], 'encoding' => 'activitystreams' ]); return (($messages) ? : [] ); - } static function rekey_request($sender,$data,$hub) { @@ -183,7 +180,7 @@ class Zot6Handler implements IHandler { dbesc($oldhash) ); } - else + else return $ret; @@ -219,10 +216,10 @@ class Zot6Handler implements IHandler { * * @param array $sender * @param array $recipients + * @param array $hub * - * return json_return_and_die() + * @return array */ - static function reply_purge($sender, $recipients, $hub) { $ret = array('success' => false); @@ -259,9 +256,4 @@ class Zot6Handler implements IHandler { return $ret; } - - - - - } diff --git a/include/attach.php b/include/attach.php index dd718aa14..17a47d9ac 100644 --- a/include/attach.php +++ b/include/attach.php @@ -137,7 +137,7 @@ function z_mime_content_type($filename) { * @param string $hash (optional) * @param string $filename (optional) * @param string $filetype (optional) - * @return associative array with: + * @return array Associative array with: * * \e boolean \b success * * \e int|boolean \b results amount of found results, or false * * \e string \b message with error messages if any @@ -176,15 +176,17 @@ function attach_count_files($channel_id, $observer, $hash = '', $filename = '', /** * @brief Returns a list of files/attachments. * - * @param $channel_id - * @param $observer - * @param $hash (optional) - * @param $filename (optional) - * @param $filetype (optional) - * @param $orderby - * @param $start - * @param $entries - * @return associative array with: + * @param int $channel_id + * @param string $observer + * @param string $hash (optional) + * @param string $filename (optional) + * @param string $filetype (optional) + * @param string $orderby (optional) + * @param int $start (optional) + * @param int $entries (optional) + * @param string $since (optional) + * @param string $until (optional) + * @return array an associative array with: * * \e boolean \b success * * \e array|boolean \b results array with results, or false * * \e string \b message with error messages if any @@ -1428,8 +1430,17 @@ function attach_delete($channel_id, $resource, $is_photo = 0) { if(! $r) { attach_drop_photo($channel_id,$resource); - $arr = ['channel_id' => $channel_id, 'resource' => $resource, 'is_photo'=>$is_photo]; - call_hooks("attach_delete",$arr); + $arr = ['channel_id' => $channel_id, 'resource' => $resource, 'is_photo' => $is_photo]; + + /** + * @hooks attach_delete + * Called when deleting an attachment from channel. + * * \e int \b channel_id - the channel_id + * * \e string \b resource + * * \e int \b is_photo + */ + call_hooks('attach_delete', $arr); + return; } @@ -1488,8 +1499,15 @@ function attach_delete($channel_id, $resource, $is_photo = 0) { intval($channel_id) ); - $arr = ['channel_id' => $channel_id, 'resource' => $resource, 'is_photo'=>$is_photo]; - call_hooks("attach_delete",$arr); + $arr = ['channel_id' => $channel_id, 'resource' => $resource, 'is_photo' => $is_photo]; + /** + * @hooks attach_delete + * Called when deleting an attachment from channel. + * * \e int \b channel_id - the channel_id + * * \e string \b resource + * * \e int \b is_photo + */ + call_hooks('attach_delete', $arr); file_activity($channel_id, $object, $object['allow_cid'], $object['allow_gid'], $object['deny_cid'], $object['deny_gid'], 'update', true); @@ -1868,7 +1886,7 @@ function file_activity($channel_id, $object, $allow_cid, $allow_gid, $deny_cid, * @param int $channel_id * @param string $hash * @param string $url - * @return array An associative array for the specified file. + * @return array Associative array for the specified file. */ function get_file_activity_object($channel_id, $hash, $url) { @@ -2110,7 +2128,7 @@ function attach_export_data($channel, $resource_id, $deleted = false) { if($attach_ptr['is_photo']) { - // This query could potentially result in a few megabytes of data use. + // This query could potentially result in a few megabytes of data use. $r = q("select * from photo where resource_id = '%s' and uid = %d order by imgscale asc", dbesc($resource_id), @@ -2352,7 +2370,7 @@ function attach_move($channel_id, $resource_id, $new_folder_hash) { $filename = $r[0]['filename']; - // don't do duplicate check unless our parent folder has changed. + // don't do duplicate check unless our parent folder has changed. if($r[0]['folder'] !== $new_folder_hash) { @@ -2468,7 +2486,7 @@ function attach_move($channel_id, $resource_id, $new_folder_hash) { /** - * Used to generate a select input box of all your folders + * Used to generate a select input box of all your folders */ @@ -2551,10 +2569,10 @@ function attach_syspaths($channel_id,$attach_hash) { /** * in earlier releases we did not fill in os_path and display_path in the attach DB structure. - * (It was not needed or used). Going forward we intend to make use of these fields. + * (It was not needed or used). Going forward we intend to make use of these fields. * A cron task checks for empty values (as older attachments may have arrived at our site - * in a clone operation) and executes attach_syspaths() to generate these field values and correct - * the attach table entry. The operation is limited to 100 DB entries at a time so as not to + * in a clone operation) and executes attach_syspaths() to generate these field values and correct + * the attach table entry. The operation is limited to 100 DB entries at a time so as not to * overload the system in any cron run. Eventually it will catch up with old attach structures * and switch into maintenance mode to correct any that might arrive in clone packets from older * sites. diff --git a/include/feedutils.php b/include/feedutils.php index afbe4229e..5e52828c3 100644 --- a/include/feedutils.php +++ b/include/feedutils.php @@ -261,13 +261,13 @@ function construct_activity_target($item) { * @param SimplePie $item * @return array $author */ - function get_atom_author($feed, $item) { $author = []; $found_author = $item->get_author(); if($found_author) { + /// @FIXME $rawauthor is undefined here if($rawauthor) { if($rawauthor[0]['child'][NAMESPACE_POCO]['displayName'][0]['data']) $author['full_name'] = unxmlify($rawauthor[0]['child'][NAMESPACE_POCO]['displayName'][0]['data']); @@ -398,10 +398,10 @@ function get_atom_author($feed, $item) { 'author' => $author ]; /** - * @hooks parse_atom + * @hooks parse_atom_author * * \e SimplePie \b feed - The original SimplePie feed * * \e SimplePie \b item - * * \e array \b result - the result array that will also get returned + * * \e array \b author - the result array that will also get returned */ call_hooks('parse_atom_author', $arr); @@ -416,10 +416,8 @@ function get_atom_author($feed, $item) { * * @param SimplePie $feed * @param SimplePie $item - * @param[out] array $author * @return array Associative array with the parsed item data */ - function get_atom_elements($feed, $item) { require_once('include/html2bbcode.php'); @@ -669,10 +667,10 @@ function get_atom_elements($feed, $item) { $termterm = notags(trim(unxmlify($term))); // Mastodon auto generates an nsfw category tag for any 'content-warning' message. - // Most people use CW and use both summary/content as a spoiler and we honour that - // construct so the post will already be collapsed. The generated tag is almost + // Most people use CW and use both summary/content as a spoiler and we honour that + // construct so the post will already be collapsed. The generated tag is almost // always wrong and even if it isn't we would already be doing the right thing. - + if($mastodon && $termterm === 'nsfw' && $summary && $res['body']) continue; @@ -1336,7 +1334,7 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) { if( ! \Zotlabs\Lib\MessageFilter::evaluate($datarray,get_config('system','pubstream_incl'),get_config('system','pubstream_excl'))) { continue; } - } + } if(! post_is_importable($datarray, $contact)) continue; @@ -1492,7 +1490,7 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) { if( ! \Zotlabs\Lib\MessageFilter::evaluate($datarray,get_config('system','pubstream_incl'),get_config('system','pubstream_excl'))) { continue; } - } + } if(! post_is_importable($datarray, $contact)) continue; @@ -1900,7 +1898,7 @@ function atom_entry($item, $type, $author, $owner, $comment = false, $cid = 0, $ $body = $item['body']; - if($summary) + if($summary) $body = preg_replace('|^(.*?)\[summary\](.*?)\[/summary\](.*?)$|ism','$1$3',$item['body']); if($compat) diff --git a/include/help.php b/include/help.php index 61dbc7bb3..e82fa96da 100644 --- a/include/help.php +++ b/include/help.php @@ -7,9 +7,10 @@ use \Michelf\MarkdownExtra; * @brief * * @param string $path - * @return string|unknown + * @param string $suffix (optional) default null + * @return string */ -function get_help_fullpath($path,$suffix=null) { +function get_help_fullpath($path, $suffix = null) { $docroot = (\App::$override_helproot) ? \App::$override_helproot : 'doc/'; $docroot = (substr($docroot,-1)!='/') ? $docroot .= '/' : $docroot; @@ -49,8 +50,8 @@ function get_help_fullpath($path,$suffix=null) { /** * @brief * - * @param string $tocpath - * @return string|unknown + * @param string $tocpath (optional) default false + * @return string */ function get_help_content($tocpath = false) { @@ -171,16 +172,20 @@ function preg_callback_help_include($matches) { } /** - * @brief + * @brief Determines help language. * - * @return boolean|array + * If the language was specified in the URL, override the language preference + * of the browser. Default to English if both of these are absent. + * + * @return array Associative array with: + * * \e string \b language - 2-letter ISO 639-1 code ("en") + * * \e boolean \b from_url - true if language from URL overrides browser default */ function determine_help_language() { $lang_detect = new Text_LanguageDetect(); // Set this mode to recognize language by the short code like "en", "ru", etc. $lang_detect->setNameMode(2); - // If the language was specified in the URL, override the language preference - // of the browser. Default to English if both of these are absent. + if($lang_detect->languageExists(argv(1))) { $lang = argv(1); $from_url = true; @@ -211,10 +216,10 @@ function find_doc_file($s) { } /** - * @brief + * @brief Search in doc files. * - * @param string $s - * @return number|mixed|unknown|boolean + * @param string $s The search string to search for + * @return array */ function search_doc_files($s) { @@ -275,7 +280,6 @@ function doc_rank_sort($s1, $s2) { * * @return string */ - function load_context_help() { $path = App::$cmd; @@ -305,7 +309,7 @@ function load_context_help() { * @brief * * @param string $s - * @return void|boolean[]|number[]|string[]|unknown[] + * @return void|array */ function store_doc_file($s) { diff --git a/include/import.php b/include/import.php index 3bd8b4105..f391400bd 100644 --- a/include/import.php +++ b/include/import.php @@ -12,6 +12,7 @@ require_once('include/perm_upgrade.php'); * @param array $channel * @param int $account_id * @param int $seize + * @param string $newname (optional) * @return boolean|array */ function import_channel($channel, $account_id, $seize, $newname = '') { @@ -650,7 +651,7 @@ function import_items($channel, $items, $sync = false, $relocate = null) { // preserve conversations you've been involved in from being expired $stored = $item_result['item']; - if((is_array($stored)) && ($stored['id'] != $stored['parent']) + if((is_array($stored)) && ($stored['id'] != $stored['parent']) && ($stored['author_xchan'] === $channel['channel_hash'])) { retain_item($stored['item']['parent']); } @@ -672,7 +673,7 @@ function import_items($channel, $items, $sync = false, $relocate = null) { /** * @brief Sync items to channel. * - * @see import_items + * @see import_items() * * @param array $channel where to import to * @param array $items @@ -1049,7 +1050,7 @@ function import_mail($channel, $mails, $sync = false) { /** * @brief Synchronise mails. * - * @see import_mail + * @see import_mail() * @param array $channel * @param array $mails */ @@ -1337,7 +1338,7 @@ function sync_files($channel, $files) { if($str) $str .= ","; - + $str .= " " . TQUOT . $k . TQUOT . " = '" . (($k === 'content') ? dbescbin($v) : dbesc($v)) . "' "; } $r = dbq("update photo set " . $str . " where id = " . intval($exists[0]['id']) ); diff --git a/include/items.php b/include/items.php index e5f2be003..ed6fee597 100755 --- a/include/items.php +++ b/include/items.php @@ -25,7 +25,7 @@ require_once('include/permissions.php'); * * @param array $item * @param[out] boolean $private_envelope - * @param boolean $include_groups + * @param boolean $include_groups * @return array containing the recipients */ function collect_recipients($item, &$private_envelope,$include_groups = true) { @@ -97,9 +97,9 @@ function collect_recipients($item, &$private_envelope,$include_groups = true) { if(array_key_exists('public_policy',$item) && $item['public_policy'] !== 'self') { $hookinfo = [ - 'recipients' => [], - 'item' => $item, - 'private_envelope' => $private_envelope, + 'recipients' => [], + 'item' => $item, + 'private_envelope' => $private_envelope, 'include_groups' => $include_groups ]; @@ -410,7 +410,7 @@ function post_activity_item($arr, $allow_code = false, $deliver = true) { if(! $arr['mid']) { - $arr['uuid'] = ((x($arr,'uuid')) ? $arr['uuid'] : item_message_id()); + $arr['uuid'] = ((x($arr,'uuid')) ? $arr['uuid'] : item_message_id()); } $arr['mid'] = ((x($arr,'mid')) ? $arr['mid'] : z_root() . '/item/' . $arr['uuid']); $arr['parent_mid'] = ((x($arr,'parent_mid')) ? $arr['parent_mid'] : $arr['mid']); @@ -2400,15 +2400,15 @@ function item_update_parent_commented($item) { $update_parent = true; - // update the commented timestamp on the parent + // update the commented timestamp on the parent // - unless this is a moderated comment or a potential clone of an older item - // which we don't wish to bring to the surface. As the queue only holds deliveries - // for 3 days, it's suspected of being an older cloned item if the creation time + // which we don't wish to bring to the surface. As the queue only holds deliveries + // for 3 days, it's suspected of being an older cloned item if the creation time //is older than that. if(intval($item['item_blocked']) === ITEM_MODERATED) $update_parent = false; - + if($item['created'] < datetime_convert('','','now - 4 days')) $update_parent = false; @@ -3004,7 +3004,9 @@ function tgroup_check($uid, $item) { * @param array $channel * @param array $item * @param int $item_id - * @param boolean $parent + * @param array $parent + * @param boolean $edit (optional) default false + * @return void */ function start_delivery_chain($channel, $item, $item_id, $parent, $edit = false) { @@ -3039,7 +3041,7 @@ function start_delivery_chain($channel, $item, $item_id, $parent, $edit = false) } // This will change the author to the post owner. Useful for RSS feeds which are to be syndicated - // to federated platforms which can't verify the identity of the author. + // to federated platforms which can't verify the identity of the author. // This MAY cause you to run afoul of copyright law. $rewrite_author = intval(get_abconfig($channel['channel_id'],$item['owner_xchan'],'system','rself')); @@ -3552,7 +3554,7 @@ function item_expire($uid,$days,$comment_days = 7) { if(! $comment_days) $comment_days = 7; - + // $expire_network_only = save your own wall posts // and just expire conversations started by others // do not enable this until we can pass bulk delete messages through zot @@ -4892,7 +4894,7 @@ function copy_of_pubitem($channel,$mid) { dbesc($mid), intval($syschan['channel_id']) ); - + if($r) { $items = fetch_post_tags($r,true); foreach($items as $rv) { @@ -4918,5 +4920,5 @@ function copy_of_pubitem($channel,$mid) { } } - return $result; + return $result; } diff --git a/include/plugin.php b/include/plugin.php index ec14fd945..c789ad522 100755 --- a/include/plugin.php +++ b/include/plugin.php @@ -7,13 +7,15 @@ /** - * @brief Handle errors in plugin calls + * @brief Handle errors in plugin calls. * * @param string $plugin name of the addon - * @param string $error_text text of error - * @param bool $uninstall uninstall plugin + * @param string $notice UI visible text of error + * @param string $log technical error message for logging + * @param bool $uninstall (optional) default false + * uninstall plugin on error */ -function handleerrors_plugin($plugin,$notice,$log,$uninstall=false){ +function handleerrors_plugin($plugin, $notice, $log, $uninstall = false){ logger("Addons: [" . $plugin . "] Error: ".$log, LOGGER_ERROR); if ($notice != '') { notice("[" . $plugin . "] Error: ".$notice, LOGGER_ERROR); @@ -23,7 +25,7 @@ function handleerrors_plugin($plugin,$notice,$log,$uninstall=false){ $idx = array_search($plugin, \App::$plugins); unset(\App::$plugins[$idx]); uninstall_plugin($plugin); - set_config("system","addon", implode(", ",\App::$plugins)); + set_config("system", "addon", implode(", ", \App::$plugins)); } } @@ -381,8 +383,6 @@ function unregister_hook($hook, $file, $function) { * array in their theme_init() and use this to customise the app behaviour. * use insert_hook($hookname,$function_name) to do this. */ - - function load_hooks() { App::$hooks = []; @@ -1085,10 +1085,11 @@ function get_markup_template($s, $root = '') { } /** - * @brief + * @brief Test if a folder exists. * * @param string $folder * @return boolean|string + * False if folder does not exist, or canonicalized absolute pathname */ function folder_exists($folder) { // Get canonicalized absolute pathname diff --git a/include/text.php b/include/text.php index 6ac04f435..925c8e997 100644 --- a/include/text.php +++ b/include/text.php @@ -41,12 +41,12 @@ function replace_macros($s, $r) { $t = App::template_engine(); - try { - $output = $t->replace_macros($arr['template'], $arr['params']); - } catch (Exception $e) { - logger("Unable to render template: ".$e->getMessage()); - $output = "

ERROR: there was an error creating the output.

"; - } + try { + $output = $t->replace_macros($arr['template'], $arr['params']); + } catch (Exception $e) { + logger('Unable to render template: ' . $e->getMessage()); + $output = '

ERROR: there was an error creating the output.

'; + } return $output; } @@ -539,7 +539,14 @@ function paginate(&$a) { return $o; } - +/** + * @brief + * + * @param int $i + * @param string $more + * @param string $less + * @return string Parsed HTML from template 'alt_pager.tpl' + */ function alt_pager($i, $more = '', $less = '') { if(! $more) @@ -810,7 +817,7 @@ function activity_match($haystack,$needle) { * and strip the period from any tags which end with one. * * @param string $s - * @return Returns array of tags found, or empty array. + * @return array Returns an array of tags found, or empty array. */ function get_tags($s) { $ret = array(); @@ -825,7 +832,7 @@ function get_tags($s) { // ignore anything in [color= ], because it may contain color codes which are mistaken for tags $s = preg_replace('/\[color=(.*?)\]/sm','',$s); - + // skip anchors in URL $s = preg_replace('/\[url=(.*?)\]/sm','',$s); @@ -900,6 +907,7 @@ function tag_sort_length($a,$b) { function total_sort($a,$b) { if($a['total'] == $b['total']) return 0; + return(($b['total'] > $a['total']) ? 1 : (-1)); } @@ -1004,9 +1012,15 @@ function contact_block() { '$micropro' => $micropro, )); - $arr = array('contacts' => $r, 'output' => $o); - + $arr = ['contacts' => $r, 'output' => $o]; + /** + * @hooks contact_block_end + * Called at the end of contact_block(), but can not manipulate the output. + * * \e array \b contacts - Result array from database + * * \e string \b output - the generated output + */ call_hooks('contact_block_end', $arr); + return $o; } @@ -1108,16 +1122,20 @@ function linkify($s, $me = false) { * to a local redirector which uses https and which redirects to the selected content * * @param string $s - * @param int $uid * @returns string */ function sslify($s) { // Local photo cache - $str = array( + $str = [ 'body' => $s, 'uid' => local_channel() - ); + ]; + /** + * @hooks cache_body_hook + * * \e string \b body The content to parse and also the return value + * * \e int|bool \b uid + */ call_hooks('cache_body_hook', $str); $s = $str['body']; @@ -1222,7 +1240,11 @@ function get_mood_verbs() { /** * @brief Function to list all smilies, both internal and from addons. * - * @return Returns array with keys 'texts' and 'icons' + * @param boolean $default_only (optional) default false + * true will prevent that plugins can add smilies + * @return array Returns an associative array with: + * * \e array \b texts + * * \e array \b icons */ function list_smilies($default_only = false) { @@ -1300,6 +1322,11 @@ function list_smilies($default_only = false) { if($default_only) return $params; + /** + * @hooks smile + * * \e array \b texts - default values and also return value + * * \e array \b icons - default values and also return value + */ call_hooks('smilie', $params); return $params; @@ -1625,6 +1652,10 @@ function generate_named_map($location) { function prepare_body(&$item,$attach = false,$opts = false) { + /** + * @hooks prepare_body_init + * * \e array \b item + */ call_hooks('prepare_body_init', $item); $s = ''; @@ -1656,13 +1687,19 @@ function prepare_body(&$item,$attach = false,$opts = false) { $event = (($item['obj_type'] === ACTIVITY_OBJ_EVENT) ? format_event_obj($item['obj']) : false); - $prep_arr = array( + $prep_arr = [ 'item' => $item, 'html' => $event ? $event['content'] : $s, 'event' => $event['header'], 'photo' => $photo - ); - + ]; + /** + * @hooks prepare_body + * * \e array \b item + * * \e string \b html - the parsed HTML to return + * * \e string \b event - the event header to return + * * \e string \b photo - the photo to return + */ call_hooks('prepare_body', $prep_arr); $s = $prep_arr['html']; @@ -2249,19 +2286,24 @@ function ids_to_querystr($arr,$idx = 'id',$quote = false) { } /** - * @brief array_elm_to_str($arr,$elm,$delim = ',') extract unique individual elements from an array of arrays and return them as a string separated by a delimiter - * similar to ids_to_querystr, but allows a different delimiter instead of a db-quote option - * empty elements (evaluated after trim()) are ignored. - * @param $arr array - * @param $elm array key to extract from sub-array - * @param $delim string default ',' - * @param $each filter function to apply to each element before evaluation, default is 'trim'. + * @brief Extract unique individual elements from an array of arrays and return + * them as a string separated by a delimiter. + * + * Similar to ids_to_querystr, but allows a different delimiter instead of a + * db-quote option empty elements (evaluated after trim()) are ignored. + * + * @see ids_to_querystr() + * + * @param array $arr + * @param string $elm key to extract from sub-array + * @param string $delim (optional) default ',' + * @param string $each (optional) default is 'trim' + * Filter function to apply to each element before evaluation. * @returns string */ - -function array_elm_to_str($arr,$elm,$delim = ',',$each = 'trim') { - +function array_elm_to_str($arr, $elm, $delim = ',', $each = 'trim') { $tmp = []; + if($arr && is_array($arr)) { foreach($arr as $x) { if(is_array($x) && array_key_exists($elm,$x)) { @@ -2272,7 +2314,8 @@ function array_elm_to_str($arr,$elm,$delim = ',',$each = 'trim') { } } } - return implode($delim,$tmp); + + return implode($delim, $tmp); } function trim_and_unpunify($s) { @@ -2496,9 +2539,9 @@ function design_tools() { } /** - * @brief Creates website portation tools menu + * @brief Creates website portation tools menu. * - * @return string + * @return string Parsed HTML code from template 'website_portation_tools.tpl' */ function website_portation_tools() { @@ -2511,7 +2554,7 @@ function website_portation_tools() { $sys = true; } - return replace_macros(get_markup_template('website_portation_tools.tpl'), array( + return replace_macros(get_markup_template('website_portation_tools.tpl'), [ '$title' => t('Import'), '$import_label' => t('Import website...'), '$import_placeholder' => t('Select folder to import'), @@ -2528,7 +2571,7 @@ function website_portation_tools() { '$cloud_export_desc' => t('/path/to/export/folder'), '$cloud_export_hint' => t('Enter a path to a cloud files destination.'), '$cloud_export_select' => t('Specify folder'), - )); + ]); } /** @@ -2991,9 +3034,9 @@ function item_url_replace($channel,&$item,$old,$new,$oldnick = '') { json_url_replace('/' . $oldnick . '/' ,'/' . $channel['channel_address'] . '/' ,$item['target']); } - $x = preg_replace("/".preg_quote($old,'/')."\/(search|\w+\/".$channel['channel_address'].")/", $new.'/${1}', $item['body']); - if($x) { - $item['body'] = $x; + $x = preg_replace("/".preg_quote($old,'/')."\/(search|\w+\/".$channel['channel_address'].")/", $new.'/${1}', $item['body']); + if($x) { + $item['body'] = $x; $item['sig'] = base64url_encode(rsa_sign($item['body'],$channel['channel_prvkey'])); $item['item_verified'] = 1; } @@ -3103,7 +3146,13 @@ function pdl_selector($uid, $current='') { intval($uid) ); - $arr = array('channel_id' => $uid, 'current' => $current, 'entries' => $r); + $arr = ['channel_id' => $uid, 'current' => $current, 'entries' => $r]; + /** + * @hooks pdl_selector + * * \e int \b channel_id + * * \e string \b current + * * \e array \b entries - Result from database query + */ call_hooks('pdl_selector', $arr); $entries = $arr['entries']; @@ -3178,7 +3227,6 @@ function text_highlight($s, $lang) { 'language' => $lang, 'success' => false ]; - /** * @hooks text_highlight * * \e string \b text @@ -3379,13 +3427,17 @@ function punify($s) { } -// Be aware that unpunify will only convert domain names and not pathnames - +/** + * Be aware that unpunify() will only convert domain names and not pathnames. + * + * @param string $s + * @return string + */ function unpunify($s) { require_once('vendor/simplepie/simplepie/idn/idna_convert.class.php'); $x = new idna_convert(['encoding' => 'utf8']); - return $x->decode($s); + return $x->decode($s); } @@ -3521,12 +3573,11 @@ function array_path_exists($str,$arr) { */ function new_uuid() { - try { - $hash = Uuid::uuid4()->toString(); - } catch (UnsatisfiedDependencyException $e) { - $hash = random_string(48); - } + try { + $hash = Uuid::uuid4()->toString(); + } catch (UnsatisfiedDependencyException $e) { + $hash = random_string(48); + } - return $hash; + return $hash; } - diff --git a/include/zot.php b/include/zot.php index bc2187f91..3b089831b 100644 --- a/include/zot.php +++ b/include/zot.php @@ -174,7 +174,7 @@ function zot_build_packet($channel, $type = 'notify', $recipients = null, $remot * packet type: one of 'ping', 'pickup', 'purge', 'refresh', 'keychange', 'force_refresh', 'notify', 'auth_check' * @param array $recipients * envelope information, array ( 'guid' => string, 'guid_sig' => string ); empty for public posts - * @param string msg + * @param string $msg * optional message * @param string $remote_key * optional public site key of target hub used to encrypt entire packet @@ -1829,7 +1829,7 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $ else { $arr['item_wall'] = 0; } - + if ((! $tag_delivery) && (! $local_public)) { $allowed = (perm_is_allowed($channel['channel_id'],$sender['hash'],$perm)); @@ -1843,7 +1843,7 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $ $allowed = can_comment_on_post($d['hash'],$parent[0]); } } - + if (! $allowed) { logger("permission denied for delivery to channel {$channel['channel_id']} {$channel['channel_address']}"); $DR->update('permission denied'); @@ -2330,7 +2330,7 @@ function process_mail_delivery($sender, $arr, $deliveries) { if(! perm_is_allowed($channel['channel_id'],$sender['hash'],'post_mail')) { - /* + /* * Always allow somebody to reply if you initiated the conversation. It's anti-social * and a bit rude to send a private message to somebody and block their ability to respond. * If you are being harrassed and want to put an end to it, delete the conversation. @@ -2358,7 +2358,7 @@ function process_mail_delivery($sender, $arr, $deliveries) { ); if($r) { if(intval($arr['mail_recalled'])) { - msg_drop($r[0]['id'], $channel['channel_id'], $r[0]['conv_guid']); + msg_drop($r[0]['id'], $channel['channel_id'], $r[0]['conv_guid']); $DR->update('mail recalled'); $result[] = $DR->get(); logger('mail_recalled'); @@ -3247,7 +3247,7 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) { $channel = $r[0]; - // don't provide these in the export + // don't provide these in the export unset($channel['channel_active']); unset($channel['channel_password']); @@ -3616,7 +3616,7 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) { if(array_key_exists('channel_pageflags',$arr['channel']) && intval($arr['channel']['channel_pageflags'])) { // Several pageflags are site-specific and cannot be sync'd. - // Only allow those bits which are shareable from the remote and then + // Only allow those bits which are shareable from the remote and then // logically OR with the local flags $arr['channel']['channel_pageflags'] = $arr['channel']['channel_pageflags'] & (PAGE_HIDDEN|PAGE_AUTOCONNECT|PAGE_APPLICATION|PAGE_PREMIUM|PAGE_ADULT); @@ -4974,9 +4974,9 @@ function zot_reply_pickup($data) { // It's possible that we have more than 100 messages waiting to be sent. // See if there are any more messages in the queue. - $x = q("select * from outq where outq_posturl = '%s' order by outq_created limit 1", - dbesc($data['callback']) - ); + $x = q("select * from outq where outq_posturl = '%s' order by outq_created limit 1", + dbesc($data['callback']) + ); // If so, kick off a new delivery notification for the next batch if ($x) { @@ -5057,7 +5057,7 @@ function zot_reply_auth_check($data,$encrypted_packet) { } // There should be exactly one recipient, the original auth requestor - + /// @FIXME $recipients is undefined here. $ret['message'] .= 'recipients ' . print_r($recipients,true) . EOL; if ($data['recipients']) { From 0946ac2ff95d54bff36dfcacb7a8553070c9b3b9 Mon Sep 17 00:00:00 2001 From: Mario Vavti Date: Thu, 24 Jan 2019 12:53:38 +0100 Subject: [PATCH 10/80] possibly more page jumping fixes --- view/js/main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/view/js/main.js b/view/js/main.js index d88133b23..fca9d125d 100644 --- a/view/js/main.js +++ b/view/js/main.js @@ -769,7 +769,7 @@ function updateConvItems(mode,data) { mediaPlaying = false; }); - var bimgs = ((preloadImages) ? false : $(".wall-item-body img").not(function() { return this.complete; })); + var bimgs = ((preloadImages) ? false : $(".wall-item-body img, .wall-photo-item img").not(function() { return this.complete; })); var bimgcount = bimgs.length; if (bimgcount) { @@ -999,7 +999,7 @@ function liveUpdate(notify_id) { $("#profile-jot-text-loading").hide(); // adjust scroll position if new content was added above viewport - if(update_mode === 'update') { + if(update_mode === 'update' && !justifiedGalleryActive) { $(window).scrollTop($(window).scrollTop() + $("#region_2").height() - orgHeight + contentHeightDiff); } From 32acf9cb7283f55338994346fd90c9ef2136fab3 Mon Sep 17 00:00:00 2001 From: Mario Vavti Date: Thu, 24 Jan 2019 18:06:27 +0100 Subject: [PATCH 11/80] macke mod chanview aware of zot6 --- Zotlabs/Module/Chanview.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zotlabs/Module/Chanview.php b/Zotlabs/Module/Chanview.php index 779c7e646..2e653d030 100644 --- a/Zotlabs/Module/Chanview.php +++ b/Zotlabs/Module/Chanview.php @@ -106,7 +106,7 @@ class Chanview extends \Zotlabs\Web\Controller { if (\App::$poi) { $url = \App::$poi['xchan_url']; - if(\App::$poi['xchan_network'] === 'zot') { + if(in_array(\App::$poi['xchan_network'], ['zot', 'zot6'])) { $is_zot = true; } if(local_channel()) { From 4cc98874a06c2b243d39d1d5e0ea4a44518d50e9 Mon Sep 17 00:00:00 2001 From: Klaus Weidenbach Date: Sat, 12 Jan 2019 18:33:18 +0100 Subject: [PATCH 12/80] Publish doxygen API documentation at gitlab pages. Create the API documentation with Doxygen and publish it through gitlab-ci as a Gitlab page at: https://hubzilla.frama.io/core This should only happen when master gets updated. Update Doxyfile configuration. Correct image usage. Replace RedMatrix with Hubzilla icon. --- .gitlab-ci.yml | 26 ++++++++++++++++++++++++++ util/Doxyfile | 4 +++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d162d57ba..bf03c1763 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,10 @@ # Select image from https://hub.docker.com/_/php/ image: php:7.1 +stages: + - test + - deploy + # Select what we should cache cache: paths: @@ -31,6 +35,7 @@ before_script: # We test PHP7 with MySQL test:php:mysql: + stage: test services: - mysql:5.7 script: @@ -41,6 +46,7 @@ test:php:mysql: # test PHP7 with PostgreSQL test:php:postgres: + stage: test services: - postgres:latest variables: @@ -67,3 +73,23 @@ test:php:postgres: name: "$CI_COMMIT_REF_SLUG-$CI_JOB_NAME" paths: - tests/results/ + + +# Generate Doxygen API Documentation and deploy it at GitLab pages +pages: + stage: deploy + cache: {} + image: php:7-cli-alpine + before_script: + - apk update + - apk add doxygen ttf-freefont graphviz + script: + - doxygen util/Doxyfile + - mv doc/html/ public/ + - echo "API documentation should be accessible at https://hubzilla.frama.io/core/ soon" + artifacts: + paths: + - public + only: + # Only generate it on main repo's master branch + - master@hubzilla/core diff --git a/util/Doxyfile b/util/Doxyfile index 7be774a81..14464df81 100644 --- a/util/Doxyfile +++ b/util/Doxyfile @@ -1,7 +1,8 @@ INPUT = README.md index.php boot.php include/ install/ util/ view/ Zotlabs/ RECURSIVE = YES PROJECT_NAME = "The Hubzilla" -PROJECT_LOGO = images/rm-64.png +PROJECT_LOGO = images/hz-64.png +IMAGE_PATH = images/ EXCLUDE = .htconfig.php library/ doc/ store/ vendor/ .git/ util/zotsh/easywebdav/ util/generate-hooks-index/ EXCLUDE_PATTERNS = *smarty3* *strings.php *.out *test* OUTPUT_DIRECTORY = doc @@ -33,5 +34,6 @@ INTERACTIVE_SVG = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = NO # fix @var (https://bugzilla.gnome.org/show_bug.cgi?id=626105) +# Should be obsolete with doxygen >= 1.8.15 #INPUT_FILTER = "sed -e 's/@var\s/@see /'" INPUT_FILTER = "php util/Doxygen_phpvarfilter.php" From 2fa274de1e567665c5fd3d25e382557eb4325d83 Mon Sep 17 00:00:00 2001 From: zotlabs Date: Thu, 24 Jan 2019 19:08:57 -0800 Subject: [PATCH 13/80] support photo items between zot and zot6 --- Zotlabs/Daemon/Notifier.php | 2 ++ Zotlabs/Lib/Activity.php | 36 +++++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/Zotlabs/Daemon/Notifier.php b/Zotlabs/Daemon/Notifier.php index beb30ed96..5ee8843b2 100644 --- a/Zotlabs/Daemon/Notifier.php +++ b/Zotlabs/Daemon/Notifier.php @@ -434,6 +434,8 @@ class Notifier { $x['body'] = 'private'; logger('notifier: encoded item: ' . print_r($x,true), LOGGER_DATA, LOG_DEBUG); + //logger('notifier: encoded activity: ' . print_r($activity,true), LOGGER_DATA, LOG_DEBUG); + stringify_array_elms($recipients); if(! $recipients) { logger('no recipients'); diff --git a/Zotlabs/Lib/Activity.php b/Zotlabs/Lib/Activity.php index 154421b6a..03f094983 100644 --- a/Zotlabs/Lib/Activity.php +++ b/Zotlabs/Lib/Activity.php @@ -35,6 +35,9 @@ class Activity { if($x['type'] === ACTIVITY_OBJ_EVENT) { return self::fetch_event($x); } + if($x['type'] === ACTIVITY_OBJ_PHOTO) { + return self::fetch_image($x); + } return $x; @@ -102,6 +105,29 @@ class Activity { } } + + static function fetch_image($x) { + + + $ret = [ + 'type' => 'Image', + 'id' => $x['id'], + 'name' => $x['title'], + 'content' => bbcode($x['body']), + 'source' => [ 'mediaType' => 'text/bbcode', 'content' => $x['body'] ], + 'published' => datetime_convert('UTC','UTC',$x['created'],ATOM_TIME), + 'updated' => datetime_convert('UTC','UTC', $x['edited'],ATOM_TIME), + 'url' => [ + 'type' => 'Link', + 'mediaType' => $x['link'][0]['type'], + 'href' => $x['link'][0]['href'], + 'width' => $x['link'][0]['width'], + 'height' => $x['link'][0]['height'] + ] + ]; + return $ret; + } + static function fetch_event($x) { // convert old Zot event objects to ActivityStreams Event objects @@ -389,6 +415,8 @@ class Activity { } $ret['type'] = self::activity_mapper($i['verb']); + + $ret['id'] = ((strpos($i['mid'],'http') === 0) ? $i['mid'] : z_root() . '/activity/' . urlencode($i['mid'])); if($i['title']) @@ -460,6 +488,10 @@ class Activity { if(! is_array($i['obj'])) { $i['obj'] = json_decode($i['obj'],true); } + if($i['obj']['type'] === ACTIVITY_OBJ_PHOTO) { + $i['obj']['id'] = $i['id']; + } + $obj = self::encode_object($i['obj']); if($obj) $ret['object'] = $obj; @@ -1609,7 +1641,9 @@ class Activity { } - if($act->obj['type'] === 'Image') { + // avoid double images from hubzilla to zap/osada + + if($act->obj['type'] === 'Image' && strpos($s['body'],'zrl=') === false) { $ptr = null; From 10587e3a842d7870c94bd52c23dedc5abc114bdc Mon Sep 17 00:00:00 2001 From: Mario Vavti Date: Fri, 25 Jan 2019 10:49:17 +0100 Subject: [PATCH 14/80] return false if http signatue is not valid --- Zotlabs/Lib/Libzot.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Zotlabs/Lib/Libzot.php b/Zotlabs/Lib/Libzot.php index 167e2d67d..1440a9691 100644 --- a/Zotlabs/Lib/Libzot.php +++ b/Zotlabs/Lib/Libzot.php @@ -308,8 +308,7 @@ class Libzot { if(! $hsig_valid) { logger('http signature not valid: ' . print_r($hsig,true)); - /// @FIXME $result is undefined - return $result; + return false; } From 725652006dfa6d1cab307a05b6d16a33bd99441b Mon Sep 17 00:00:00 2001 From: Mario Vavti Date: Fri, 25 Jan 2019 12:14:17 +0100 Subject: [PATCH 15/80] bump version --- boot.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boot.php b/boot.php index 321f1a93b..348cea535 100755 --- a/boot.php +++ b/boot.php @@ -50,7 +50,7 @@ require_once('include/attach.php'); require_once('include/bbcode.php'); define ( 'PLATFORM_NAME', 'hubzilla' ); -define ( 'STD_VERSION', '3.9.5' ); +define ( 'STD_VERSION', '3.9.6' ); define ( 'ZOT_REVISION', '6.0a' ); define ( 'DB_UPDATE_VERSION', 1230 ); From b11be320634485562405e2e6bc14fa2840c2faf8 Mon Sep 17 00:00:00 2001 From: Max Kostikov Date: Fri, 25 Jan 2019 19:55:23 +0100 Subject: [PATCH 16/80] Update hmessages.po --- view/ru/hmessages.po | 1518 +++++++++++++++++++++++------------------- 1 file changed, 825 insertions(+), 693 deletions(-) diff --git a/view/ru/hmessages.po b/view/ru/hmessages.po index 76c24a404..f8c34f95d 100644 --- a/view/ru/hmessages.po +++ b/view/ru/hmessages.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: hubzilla\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-10-18 11:03+0200\n" -"PO-Revision-Date: 2018-12-04 12:19+0200\n" +"POT-Creation-Date: 2019-01-25 21:03+0200\n" +"PO-Revision-Date: 2019-01-25 21:07+0200\n" "Last-Translator: Max Kostikov \n" "Language-Team: Russian (http://www.transifex.com/Friendica/hubzilla/language/ru/)\n" "MIME-Version: 1.0\n" @@ -25,7 +25,7 @@ msgstr "" msgid "Source channel not found." msgstr "Канал-источник не найден." -#: ../../view/theme/redbasic/php/config.php:15 ../../include/text.php:3096 +#: ../../view/theme/redbasic/php/config.php:15 ../../include/text.php:3162 #: ../../Zotlabs/Module/Admin/Site.php:187 msgid "Default" msgstr "По умолчанию" @@ -42,7 +42,7 @@ msgstr "Фокус (по умолчанию Hubzilla)" #: ../../Zotlabs/Module/Email_validation.php:40 #: ../../Zotlabs/Module/Poke.php:217 ../../Zotlabs/Module/Appman.php:155 #: ../../Zotlabs/Module/Profiles.php:723 ../../Zotlabs/Module/Photos.php:1097 -#: ../../Zotlabs/Module/Photos.php:1137 ../../Zotlabs/Module/Photos.php:1255 +#: ../../Zotlabs/Module/Photos.php:1138 ../../Zotlabs/Module/Photos.php:1257 #: ../../Zotlabs/Module/Oauth.php:111 ../../Zotlabs/Module/Events.php:495 #: ../../Zotlabs/Module/Rate.php:166 ../../Zotlabs/Module/Locs.php:121 #: ../../Zotlabs/Module/Sources.php:125 ../../Zotlabs/Module/Sources.php:162 @@ -61,7 +61,7 @@ msgstr "Фокус (по умолчанию Hubzilla)" #: ../../Zotlabs/Module/Settings/Directory.php:41 #: ../../Zotlabs/Module/Settings/Photos.php:41 #: ../../Zotlabs/Module/Settings/Profiles.php:50 -#: ../../Zotlabs/Module/Settings/Featured.php:54 +#: ../../Zotlabs/Module/Settings/Featured.php:62 #: ../../Zotlabs/Module/Settings/Connections.php:41 #: ../../Zotlabs/Module/Settings/Channel.php:493 #: ../../Zotlabs/Module/Filestorage.php:183 ../../Zotlabs/Module/Cal.php:344 @@ -79,8 +79,8 @@ msgstr "Фокус (по умолчанию Hubzilla)" #: ../../Zotlabs/Module/Admin/Account_edit.php:73 #: ../../Zotlabs/Module/Tokens.php:188 ../../Zotlabs/Module/Thing.php:326 #: ../../Zotlabs/Module/Thing.php:379 ../../Zotlabs/Module/Editpost.php:85 -#: ../../Zotlabs/Module/Connedit.php:893 ../../Zotlabs/Module/Group.php:140 -#: ../../Zotlabs/Module/Group.php:156 ../../Zotlabs/Module/Mood.php:158 +#: ../../Zotlabs/Module/Connedit.php:904 ../../Zotlabs/Module/Group.php:150 +#: ../../Zotlabs/Module/Group.php:166 ../../Zotlabs/Module/Mood.php:158 #: ../../Zotlabs/Module/Invite.php:168 ../../Zotlabs/Module/Connect.php:124 #: ../../Zotlabs/Module/Pdledit.php:107 ../../Zotlabs/Module/Wiki.php:215 #: ../../Zotlabs/Module/Import.php:574 @@ -118,7 +118,7 @@ msgstr "Фокус (по умолчанию Hubzilla)" #: ../../extend/addon/hzaddons/cart/submodules/subscriptions.php:410 #: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:640 #: ../../extend/addon/hzaddons/cart/submodules/manualcat.php:248 -#: ../../extend/addon/hzaddons/cart/cart.php:1263 +#: ../../extend/addon/hzaddons/cart/cart.php:1264 #: ../../extend/addon/hzaddons/nofed/nofed.php:80 #: ../../extend/addon/hzaddons/planets/planets.php:153 #: ../../extend/addon/hzaddons/pageheader/pageheader.php:48 @@ -151,7 +151,7 @@ msgstr "Узкая панель навигации" #: ../../view/theme/redbasic/php/config.php:99 #: ../../view/theme/redbasic/php/config.php:116 ../../include/dir_fns.php:143 #: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145 -#: ../../boot.php:1630 ../../Zotlabs/Storage/Browser.php:405 +#: ../../boot.php:1634 ../../Zotlabs/Storage/Browser.php:405 #: ../../Zotlabs/Module/Defperms.php:197 ../../Zotlabs/Module/Profiles.php:681 #: ../../Zotlabs/Module/Photos.php:712 ../../Zotlabs/Module/Api.php:99 #: ../../Zotlabs/Module/Events.php:472 ../../Zotlabs/Module/Events.php:473 @@ -164,7 +164,7 @@ msgstr "Узкая панель навигации" #: ../../Zotlabs/Module/Menu.php:221 ../../Zotlabs/Module/Mitem.php:176 #: ../../Zotlabs/Module/Mitem.php:177 ../../Zotlabs/Module/Mitem.php:256 #: ../../Zotlabs/Module/Mitem.php:257 ../../Zotlabs/Module/Admin/Site.php:255 -#: ../../Zotlabs/Module/Connedit.php:398 ../../Zotlabs/Module/Connedit.php:785 +#: ../../Zotlabs/Module/Connedit.php:406 ../../Zotlabs/Module/Connedit.php:796 #: ../../Zotlabs/Module/Wiki.php:227 ../../Zotlabs/Module/Wiki.php:228 #: ../../Zotlabs/Module/Import.php:563 ../../Zotlabs/Module/Import.php:567 #: ../../Zotlabs/Module/Import.php:568 ../../Zotlabs/Lib/Libzotdir.php:162 @@ -206,7 +206,7 @@ msgstr "Узкая панель навигации" #: ../../extend/addon/hzaddons/cart/submodules/manualcat.php:63 #: ../../extend/addon/hzaddons/cart/submodules/manualcat.php:254 #: ../../extend/addon/hzaddons/cart/submodules/manualcat.php:258 -#: ../../extend/addon/hzaddons/cart/cart.php:1257 +#: ../../extend/addon/hzaddons/cart/cart.php:1258 #: ../../extend/addon/hzaddons/nofed/nofed.php:72 #: ../../extend/addon/hzaddons/nofed/nofed.php:76 #: ../../extend/addon/hzaddons/planets/planets.php:149 @@ -226,7 +226,7 @@ msgstr "Нет" #: ../../view/theme/redbasic/php/config.php:99 #: ../../view/theme/redbasic/php/config.php:116 ../../include/dir_fns.php:143 #: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145 -#: ../../boot.php:1630 ../../Zotlabs/Storage/Browser.php:405 +#: ../../boot.php:1634 ../../Zotlabs/Storage/Browser.php:405 #: ../../Zotlabs/Module/Defperms.php:197 ../../Zotlabs/Module/Profiles.php:681 #: ../../Zotlabs/Module/Photos.php:712 ../../Zotlabs/Module/Api.php:98 #: ../../Zotlabs/Module/Events.php:472 ../../Zotlabs/Module/Events.php:473 @@ -239,7 +239,7 @@ msgstr "Нет" #: ../../Zotlabs/Module/Menu.php:221 ../../Zotlabs/Module/Mitem.php:176 #: ../../Zotlabs/Module/Mitem.php:177 ../../Zotlabs/Module/Mitem.php:256 #: ../../Zotlabs/Module/Mitem.php:257 ../../Zotlabs/Module/Admin/Site.php:257 -#: ../../Zotlabs/Module/Connedit.php:398 ../../Zotlabs/Module/Wiki.php:227 +#: ../../Zotlabs/Module/Connedit.php:406 ../../Zotlabs/Module/Wiki.php:227 #: ../../Zotlabs/Module/Wiki.php:228 ../../Zotlabs/Module/Import.php:563 #: ../../Zotlabs/Module/Import.php:567 ../../Zotlabs/Module/Import.php:568 #: ../../Zotlabs/Lib/Libzotdir.php:162 ../../Zotlabs/Lib/Libzotdir.php:163 @@ -281,7 +281,7 @@ msgstr "Нет" #: ../../extend/addon/hzaddons/cart/submodules/manualcat.php:63 #: ../../extend/addon/hzaddons/cart/submodules/manualcat.php:254 #: ../../extend/addon/hzaddons/cart/submodules/manualcat.php:258 -#: ../../extend/addon/hzaddons/cart/cart.php:1257 +#: ../../extend/addon/hzaddons/cart/cart.php:1258 #: ../../extend/addon/hzaddons/nofed/nofed.php:72 #: ../../extend/addon/hzaddons/nofed/nofed.php:76 #: ../../extend/addon/hzaddons/planets/planets.php:149 @@ -461,9 +461,9 @@ msgstr "Неспецифический" #: ../../include/selectors.php:60 ../../include/selectors.php:77 #: ../../include/selectors.php:115 ../../include/selectors.php:151 #: ../../include/connections.php:703 ../../include/connections.php:710 -#: ../../include/event.php:1318 ../../include/event.php:1325 +#: ../../include/event.php:1327 ../../include/event.php:1334 #: ../../Zotlabs/Module/Cdav.php:1227 ../../Zotlabs/Module/Profiles.php:795 -#: ../../Zotlabs/Module/Connedit.php:924 +#: ../../Zotlabs/Module/Connedit.php:935 #: ../../Zotlabs/Access/PermissionRoles.php:306 msgid "Other" msgstr "Другой" @@ -567,7 +567,7 @@ msgstr "Эротоман" #: ../../Zotlabs/Module/Settings/Channel.php:75 #: ../../Zotlabs/Module/Settings/Channel.php:78 #: ../../Zotlabs/Module/Settings/Channel.php:89 -#: ../../Zotlabs/Module/Connedit.php:717 ../../Zotlabs/Widget/Affinity.php:24 +#: ../../Zotlabs/Module/Connedit.php:725 ../../Zotlabs/Widget/Affinity.php:29 msgid "Friends" msgstr "Друзья" @@ -655,18 +655,18 @@ msgstr "Всё равно" msgid "Ask me" msgstr "Спроси меня" -#: ../../include/photos.php:27 ../../include/items.php:3703 -#: ../../include/attach.php:150 ../../include/attach.php:197 -#: ../../include/attach.php:270 ../../include/attach.php:379 -#: ../../include/attach.php:393 ../../include/attach.php:400 -#: ../../include/attach.php:482 ../../include/attach.php:1042 -#: ../../include/attach.php:1116 ../../include/attach.php:1281 +#: ../../include/photos.php:27 ../../include/items.php:3750 +#: ../../include/attach.php:150 ../../include/attach.php:199 +#: ../../include/attach.php:272 ../../include/attach.php:381 +#: ../../include/attach.php:395 ../../include/attach.php:402 +#: ../../include/attach.php:484 ../../include/attach.php:1044 +#: ../../include/attach.php:1118 ../../include/attach.php:1283 #: ../../Zotlabs/Module/Mail.php:146 ../../Zotlabs/Module/Defperms.php:181 #: ../../Zotlabs/Module/Network.php:17 ../../Zotlabs/Module/Common.php:38 #: ../../Zotlabs/Module/Item.php:231 ../../Zotlabs/Module/Item.php:250 #: ../../Zotlabs/Module/Item.php:260 ../../Zotlabs/Module/Item.php:1136 #: ../../Zotlabs/Module/Achievements.php:34 -#: ../../Zotlabs/Module/Display.php:448 ../../Zotlabs/Module/Poke.php:157 +#: ../../Zotlabs/Module/Display.php:447 ../../Zotlabs/Module/Poke.php:157 #: ../../Zotlabs/Module/Profile.php:85 ../../Zotlabs/Module/Profile.php:101 #: ../../Zotlabs/Module/Appman.php:87 ../../Zotlabs/Module/Profiles.php:198 #: ../../Zotlabs/Module/Profiles.php:635 ../../Zotlabs/Module/Photos.php:69 @@ -691,9 +691,9 @@ msgstr "Спроси меня" #: ../../Zotlabs/Module/Filestorage.php:140 #: ../../Zotlabs/Module/Editblock.php:67 #: ../../Zotlabs/Module/Service_limits.php:11 -#: ../../Zotlabs/Module/Message.php:18 ../../Zotlabs/Module/Channel.php:163 -#: ../../Zotlabs/Module/Channel.php:330 ../../Zotlabs/Module/Channel.php:369 -#: ../../Zotlabs/Module/Like.php:185 ../../Zotlabs/Module/Bookmarks.php:70 +#: ../../Zotlabs/Module/Message.php:18 ../../Zotlabs/Module/Channel.php:168 +#: ../../Zotlabs/Module/Channel.php:335 ../../Zotlabs/Module/Channel.php:374 +#: ../../Zotlabs/Module/Like.php:187 ../../Zotlabs/Module/Bookmarks.php:70 #: ../../Zotlabs/Module/Viewsrc.php:19 ../../Zotlabs/Module/Menu.php:129 #: ../../Zotlabs/Module/Menu.php:140 ../../Zotlabs/Module/Setup.php:209 #: ../../Zotlabs/Module/Mitem.php:129 ../../Zotlabs/Module/Notifications.php:11 @@ -706,17 +706,17 @@ msgstr "Спроси меня" #: ../../Zotlabs/Module/Moderate.php:13 ../../Zotlabs/Module/Webpages.php:133 #: ../../Zotlabs/Module/Profile_photo.php:302 #: ../../Zotlabs/Module/Profile_photo.php:315 -#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Connedit.php:391 +#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Connedit.php:399 #: ../../Zotlabs/Module/Group.php:14 ../../Zotlabs/Module/Group.php:30 #: ../../Zotlabs/Module/Connections.php:32 ../../Zotlabs/Module/Mood.php:126 #: ../../Zotlabs/Module/Card_edit.php:51 #: ../../Zotlabs/Module/Article_edit.php:51 ../../Zotlabs/Module/Blocks.php:73 #: ../../Zotlabs/Module/Blocks.php:80 ../../Zotlabs/Module/Invite.php:21 -#: ../../Zotlabs/Module/Invite.php:102 ../../Zotlabs/Module/Articles.php:80 +#: ../../Zotlabs/Module/Invite.php:102 ../../Zotlabs/Module/Articles.php:88 #: ../../Zotlabs/Module/Cloud.php:40 ../../Zotlabs/Module/Pdledit.php:34 #: ../../Zotlabs/Module/Wiki.php:59 ../../Zotlabs/Module/Wiki.php:285 #: ../../Zotlabs/Module/Wiki.php:428 ../../Zotlabs/Module/Manage.php:10 -#: ../../Zotlabs/Module/Suggest.php:32 ../../Zotlabs/Module/Cards.php:81 +#: ../../Zotlabs/Module/Suggest.php:32 ../../Zotlabs/Module/Cards.php:86 #: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78 #: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Web/WebServer.php:123 #: ../../Zotlabs/Lib/Chatroom.php:133 @@ -755,12 +755,12 @@ msgctxt "photo_upload" msgid "%1$s posted %2$s to %3$s" msgstr "%1$s опубликовал %2$s в %3$s" -#: ../../include/photos.php:669 ../../include/nav.php:417 +#: ../../include/photos.php:669 ../../include/nav.php:447 msgid "Photo Albums" msgstr "Фотоальбомы" -#: ../../include/photos.php:670 ../../Zotlabs/Module/Photos.php:1380 -#: ../../Zotlabs/Module/Photos.php:1393 ../../Zotlabs/Module/Photos.php:1394 +#: ../../include/photos.php:670 ../../Zotlabs/Module/Photos.php:1389 +#: ../../Zotlabs/Module/Photos.php:1402 ../../Zotlabs/Module/Photos.php:1403 msgid "Recent Photos" msgstr "Последние фотографии" @@ -880,7 +880,7 @@ msgstr "Просмотреть все %d общих контактов" #: ../../Zotlabs/Module/Editblock.php:114 ../../Zotlabs/Module/Menu.php:175 #: ../../Zotlabs/Module/Admin/Profs.php:175 #: ../../Zotlabs/Module/Editwebpage.php:142 ../../Zotlabs/Module/Thing.php:266 -#: ../../Zotlabs/Module/Webpages.php:255 ../../Zotlabs/Module/Group.php:235 +#: ../../Zotlabs/Module/Webpages.php:255 ../../Zotlabs/Module/Group.php:252 #: ../../Zotlabs/Module/Connections.php:284 #: ../../Zotlabs/Module/Connections.php:322 #: ../../Zotlabs/Module/Connections.php:342 @@ -888,7 +888,7 @@ msgstr "Просмотреть все %d общих контактов" #: ../../Zotlabs/Module/Article_edit.php:99 ../../Zotlabs/Module/Blocks.php:160 #: ../../Zotlabs/Module/Wiki.php:211 ../../Zotlabs/Module/Wiki.php:384 #: ../../Zotlabs/Module/Layouts.php:193 ../../Zotlabs/Widget/Cdav.php:126 -#: ../../Zotlabs/Widget/Cdav.php:162 ../../Zotlabs/Lib/Apps.php:534 +#: ../../Zotlabs/Widget/Cdav.php:162 ../../Zotlabs/Lib/Apps.php:536 #: ../../Zotlabs/Lib/ThreadItem.php:133 msgid "Edit" msgstr "Изменить" @@ -947,9 +947,9 @@ msgstr "Запрошенный канал не доступен." #: ../../Zotlabs/Module/Editblock.php:31 ../../Zotlabs/Module/Menu.php:91 #: ../../Zotlabs/Module/Hcard.php:12 ../../Zotlabs/Module/Editwebpage.php:32 #: ../../Zotlabs/Module/Webpages.php:39 ../../Zotlabs/Module/Blocks.php:33 -#: ../../Zotlabs/Module/Articles.php:34 ../../Zotlabs/Module/Connect.php:17 -#: ../../Zotlabs/Module/Cards.php:37 ../../Zotlabs/Module/Layouts.php:31 -#: ../../extend/addon/hzaddons/gallery/Mod_Gallery.php:47 +#: ../../Zotlabs/Module/Articles.php:42 ../../Zotlabs/Module/Connect.php:17 +#: ../../Zotlabs/Module/Cards.php:42 ../../Zotlabs/Module/Layouts.php:31 +#: ../../extend/addon/hzaddons/gallery/Mod_Gallery.php:49 msgid "Requested profile is not available." msgstr "Запрашиваемый профиль не доступен." @@ -991,8 +991,8 @@ msgstr "Редактировать видимость" msgid "Connect" msgstr "Подключить" -#: ../../include/channel.php:1447 ../../include/event.php:54 -#: ../../include/event.php:86 ../../Zotlabs/Module/Directory.php:328 +#: ../../include/channel.php:1447 ../../include/event.php:58 +#: ../../include/event.php:90 ../../Zotlabs/Module/Directory.php:328 msgid "Location:" msgstr "Местоположение:" @@ -1030,7 +1030,7 @@ msgid "Like this channel" msgstr "нравится этот канал" #: ../../include/channel.php:1595 ../../include/conversation.php:1693 -#: ../../include/taxonomy.php:661 ../../Zotlabs/Module/Photos.php:1175 +#: ../../include/taxonomy.php:661 ../../Zotlabs/Module/Photos.php:1177 #: ../../Zotlabs/Lib/ThreadItem.php:221 msgctxt "noun" msgid "Like" @@ -1133,7 +1133,7 @@ msgid "School/education:" msgstr "Школа / образование:" #: ../../include/channel.php:1700 ../../Zotlabs/Module/Profperm.php:113 -#: ../../Zotlabs/Lib/Apps.php:337 +#: ../../Zotlabs/Lib/Apps.php:339 msgid "Profile" msgstr "Профиль" @@ -1150,25 +1150,25 @@ msgstr "Экспорт" msgid "cover photo" msgstr "фотография обложки" -#: ../../include/channel.php:2390 ../../boot.php:1626 -#: ../../Zotlabs/Module/Rmagic.php:75 +#: ../../include/channel.php:2405 ../../boot.php:1630 +#: ../../Zotlabs/Module/Rmagic.php:93 msgid "Remote Authentication" msgstr "Удаленная аутентификация" -#: ../../include/channel.php:2391 ../../Zotlabs/Module/Rmagic.php:76 +#: ../../include/channel.php:2406 ../../Zotlabs/Module/Rmagic.php:94 msgid "Enter your channel address (e.g. channel@example.com)" msgstr "Введите адрес вашего канала (например: channel@example.com)" -#: ../../include/channel.php:2392 ../../Zotlabs/Module/Rmagic.php:77 +#: ../../include/channel.php:2407 ../../Zotlabs/Module/Rmagic.php:95 msgid "Authenticate" msgstr "Проверка подлинности" -#: ../../include/channel.php:2547 ../../Zotlabs/Module/Admin/Accounts.php:91 +#: ../../include/channel.php:2562 ../../Zotlabs/Module/Admin/Accounts.php:91 #, php-format msgid "Account '%s' deleted" msgstr "Аккаунт '%s' удален" -#: ../../include/message.php:13 ../../include/text.php:1718 +#: ../../include/message.php:13 ../../include/text.php:1765 msgid "Download binary/encrypted content" msgstr "Загрузить двоичное / зашифрованное содержимое" @@ -1188,20 +1188,20 @@ msgstr "[без темы]" msgid "Stored post could not be verified." msgstr "Сохранённая публикация не может быть проверена." -#: ../../include/markdown.php:200 ../../include/bbcode.php:358 +#: ../../include/markdown.php:198 ../../include/bbcode.php:347 #, php-format msgid "%1$s wrote the following %2$s %3$s" msgstr "%1$s была создана %2$s %3$s" -#: ../../include/markdown.php:202 ../../include/bbcode.php:354 +#: ../../include/markdown.php:200 ../../include/bbcode.php:343 #: ../../Zotlabs/Module/Tagger.php:77 msgid "post" msgstr "публикация" -#: ../../include/items.php:384 ../../Zotlabs/Module/Dreport.php:10 +#: ../../include/items.php:399 ../../Zotlabs/Module/Dreport.php:10 #: ../../Zotlabs/Module/Dreport.php:79 ../../Zotlabs/Module/Profperm.php:28 -#: ../../Zotlabs/Module/Like.php:296 ../../Zotlabs/Module/Subthread.php:86 -#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Cloud.php:126 +#: ../../Zotlabs/Module/Like.php:301 ../../Zotlabs/Module/Subthread.php:86 +#: ../../Zotlabs/Module/Group.php:98 ../../Zotlabs/Module/Cloud.php:126 #: ../../Zotlabs/Module/Import_items.php:120 #: ../../Zotlabs/Web/WebServer.php:122 #: ../../extend/addon/hzaddons/redphotos/redphotos.php:119 @@ -1211,112 +1211,112 @@ msgstr "публикация" msgid "Permission denied" msgstr "Доступ запрещен" -#: ../../include/items.php:921 ../../include/items.php:981 +#: ../../include/items.php:936 ../../include/items.php:996 msgid "(Unknown)" msgstr "(Неизвестный)" -#: ../../include/items.php:1169 +#: ../../include/items.php:1184 msgid "Visible to anybody on the internet." msgstr "Виден всем в интернете." -#: ../../include/items.php:1171 +#: ../../include/items.php:1186 msgid "Visible to you only." msgstr "Видно только вам." -#: ../../include/items.php:1173 +#: ../../include/items.php:1188 msgid "Visible to anybody in this network." msgstr "Видно всем в этой сети." -#: ../../include/items.php:1175 +#: ../../include/items.php:1190 msgid "Visible to anybody authenticated." msgstr "Видно всем аутентифицированным." -#: ../../include/items.php:1177 +#: ../../include/items.php:1192 #, php-format msgid "Visible to anybody on %s." msgstr "Видно всем в %s." -#: ../../include/items.php:1179 +#: ../../include/items.php:1194 msgid "Visible to all connections." msgstr "Видно всем контактам." -#: ../../include/items.php:1181 +#: ../../include/items.php:1196 msgid "Visible to approved connections." msgstr "Видно только одобренным контактам." -#: ../../include/items.php:1183 +#: ../../include/items.php:1198 msgid "Visible to specific connections." msgstr "Видно указанным контактам." -#: ../../include/items.php:3615 ../../Zotlabs/Module/Display.php:45 -#: ../../Zotlabs/Module/Display.php:452 ../../Zotlabs/Module/Admin.php:62 +#: ../../include/items.php:3662 ../../Zotlabs/Module/Display.php:45 +#: ../../Zotlabs/Module/Display.php:451 ../../Zotlabs/Module/Admin.php:62 #: ../../Zotlabs/Module/Filestorage.php:24 ../../Zotlabs/Module/Viewsrc.php:25 #: ../../Zotlabs/Module/Admin/Addons.php:259 #: ../../Zotlabs/Module/Admin/Themes.php:72 ../../Zotlabs/Module/Thing.php:94 msgid "Item not found." msgstr "Элемент не найден." -#: ../../include/items.php:4195 ../../Zotlabs/Module/Group.php:61 -#: ../../Zotlabs/Module/Group.php:200 +#: ../../include/items.php:4242 ../../Zotlabs/Module/Group.php:61 +#: ../../Zotlabs/Module/Group.php:213 msgid "Privacy group not found." msgstr "Группа безопасности не найдена." -#: ../../include/items.php:4211 +#: ../../include/items.php:4258 msgid "Privacy group is empty." msgstr "Группа безопасности пуста" -#: ../../include/items.php:4218 +#: ../../include/items.php:4265 #, php-format msgid "Privacy group: %s" msgstr "Группа безопасности: %s" -#: ../../include/items.php:4228 ../../Zotlabs/Module/Connedit.php:856 +#: ../../include/items.php:4275 ../../Zotlabs/Module/Connedit.php:867 #, php-format msgid "Connection: %s" msgstr "Контакт: %s" -#: ../../include/items.php:4230 +#: ../../include/items.php:4277 msgid "Connection not found." msgstr "Контакт не найден." -#: ../../include/items.php:4572 ../../Zotlabs/Module/Cover_photo.php:269 +#: ../../include/items.php:4619 ../../Zotlabs/Module/Cover_photo.php:269 msgid "female" msgstr "женщина" -#: ../../include/items.php:4573 ../../Zotlabs/Module/Cover_photo.php:270 +#: ../../include/items.php:4620 ../../Zotlabs/Module/Cover_photo.php:270 #, php-format msgid "%1$s updated her %2$s" msgstr "%1$s обновила её %2$s" -#: ../../include/items.php:4574 ../../Zotlabs/Module/Cover_photo.php:271 +#: ../../include/items.php:4621 ../../Zotlabs/Module/Cover_photo.php:271 msgid "male" msgstr "мужчина" -#: ../../include/items.php:4575 ../../Zotlabs/Module/Cover_photo.php:272 +#: ../../include/items.php:4622 ../../Zotlabs/Module/Cover_photo.php:272 #, php-format msgid "%1$s updated his %2$s" msgstr "%1$s обновил его %2$s" -#: ../../include/items.php:4577 ../../Zotlabs/Module/Cover_photo.php:274 +#: ../../include/items.php:4624 ../../Zotlabs/Module/Cover_photo.php:274 #, php-format msgid "%1$s updated their %2$s" msgstr "%1$s обновили их %2$s" -#: ../../include/items.php:4579 +#: ../../include/items.php:4626 msgid "profile photo" msgstr "Фотография профиля" -#: ../../include/items.php:4771 +#: ../../include/items.php:4818 #, php-format msgid "[Edited %s]" msgstr "[Отредактировано %s]" -#: ../../include/items.php:4771 +#: ../../include/items.php:4818 msgctxt "edit_activity" msgid "Post" msgstr "Публикация" -#: ../../include/items.php:4771 +#: ../../include/items.php:4818 msgctxt "edit_activity" msgid "Comment" msgstr "Комментарий" @@ -1356,7 +1356,7 @@ msgstr "Выкл." msgid "On" msgstr "Вкл." -#: ../../include/features.php:82 ../../Zotlabs/Lib/Apps.php:342 +#: ../../include/features.php:82 ../../Zotlabs/Lib/Apps.php:344 msgid "CalDAV" msgstr "" @@ -1368,7 +1368,7 @@ msgstr "Начинать календарную неделю с понедель msgid "Default is Sunday" msgstr "По умолчанию - воскресенье" -#: ../../include/features.php:96 ../../Zotlabs/Lib/Apps.php:318 +#: ../../include/features.php:96 ../../Zotlabs/Lib/Apps.php:320 msgid "Channel Home" msgstr "Главная канала" @@ -1396,8 +1396,8 @@ msgstr "Использовать режим блога / списка" msgid "Comments will be displayed separately" msgstr "Комментарии будут отображаться отдельно" -#: ../../include/features.php:125 ../../include/text.php:980 -#: ../../Zotlabs/Module/Connections.php:334 ../../Zotlabs/Lib/Apps.php:308 +#: ../../include/features.php:125 ../../include/text.php:991 +#: ../../Zotlabs/Module/Connections.php:334 ../../Zotlabs/Lib/Apps.php:310 msgid "Connections" msgstr "Контакты" @@ -1445,7 +1445,7 @@ msgstr "Помечать сообщения" msgid "Ability to mark special posts with a star indicator" msgstr "Возможность отметить специальные сообщения индикатором-звёздочкой" -#: ../../include/features.php:176 ../../Zotlabs/Lib/Apps.php:322 +#: ../../include/features.php:176 ../../Zotlabs/Lib/Apps.php:324 msgid "Directory" msgstr "Каталог" @@ -1540,7 +1540,7 @@ msgid "" "prevent accidental loss of compositions" msgstr "Автоматически сохраняет черновики публикаций и комментариев в локальном хранилище браузера для предотвращения их случайной утраты" -#: ../../include/features.php:269 ../../Zotlabs/Lib/Apps.php:321 +#: ../../include/features.php:269 ../../Zotlabs/Lib/Apps.php:323 msgid "Events" msgstr "События" @@ -1632,7 +1632,7 @@ msgstr "Инструмент сходства / соответствия" msgid "Filter stream activity by depth of relationships" msgstr "Фильтровать потоки активности по глубине отношений" -#: ../../include/features.php:373 ../../Zotlabs/Lib/Apps.php:310 +#: ../../include/features.php:373 ../../Zotlabs/Lib/Apps.php:312 msgid "Suggest Channels" msgstr "Предлагаемые каналы" @@ -1640,8 +1640,8 @@ msgstr "Предлагаемые каналы" msgid "Show friend and connection suggestions" msgstr "Показать предложения в друзья" -#: ../../include/features.php:391 ../../include/nav.php:414 -#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:320 +#: ../../include/features.php:391 ../../include/nav.php:444 +#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:322 msgid "Photos" msgstr "Фотографии" @@ -1653,7 +1653,7 @@ msgstr "Местоположение фотографии" msgid "If location data is available on uploaded photos, link this to a map." msgstr "Если данные о местоположении доступны на загруженных фотографий, связать их с картой." -#: ../../include/features.php:405 ../../Zotlabs/Lib/Apps.php:338 +#: ../../include/features.php:405 ../../Zotlabs/Lib/Apps.php:340 msgid "Profiles" msgstr "Редактировать профиль" @@ -1697,465 +1697,466 @@ msgstr "последний" msgid "next" msgstr "следующий" -#: ../../include/text.php:546 +#: ../../include/text.php:553 msgid "older" msgstr "старше" -#: ../../include/text.php:548 +#: ../../include/text.php:555 msgid "newer" msgstr "новее" -#: ../../include/text.php:968 +#: ../../include/text.php:979 msgid "No connections" msgstr "Нет контактов" -#: ../../include/text.php:1000 +#: ../../include/text.php:1011 #, php-format msgid "View all %s connections" msgstr "Просмотреть все %s контактов" -#: ../../include/text.php:1056 +#: ../../include/text.php:1073 #, php-format msgid "Network: %s" msgstr "Сеть: %s" -#: ../../include/text.php:1067 ../../include/text.php:1079 +#: ../../include/text.php:1084 ../../include/text.php:1096 #: ../../include/acl_selectors.php:118 ../../include/nav.php:183 #: ../../Zotlabs/Module/Search.php:44 ../../Zotlabs/Module/Connections.php:338 #: ../../Zotlabs/Widget/Sitesearch.php:31 -#: ../../Zotlabs/Widget/Activity_filter.php:151 ../../Zotlabs/Lib/Apps.php:328 +#: ../../Zotlabs/Widget/Activity_filter.php:151 ../../Zotlabs/Lib/Apps.php:330 msgid "Search" msgstr "Поиск" -#: ../../include/text.php:1068 ../../include/text.php:1080 +#: ../../include/text.php:1085 ../../include/text.php:1097 #: ../../Zotlabs/Module/Admin/Profs.php:94 #: ../../Zotlabs/Module/Admin/Profs.php:114 ../../Zotlabs/Module/Rbmark.php:32 #: ../../Zotlabs/Module/Rbmark.php:104 ../../Zotlabs/Module/Filer.php:53 #: ../../Zotlabs/Widget/Notes.php:23 +#: ../../extend/addon/hzaddons/queueworker/Mod_Queueworker.php:102 msgid "Save" msgstr "Запомнить" -#: ../../include/text.php:1155 ../../include/text.php:1159 +#: ../../include/text.php:1176 ../../include/text.php:1180 msgid "poke" msgstr "Ткнуть" -#: ../../include/text.php:1155 ../../include/text.php:1159 +#: ../../include/text.php:1176 ../../include/text.php:1180 #: ../../include/conversation.php:251 msgid "poked" msgstr "ткнут" -#: ../../include/text.php:1160 +#: ../../include/text.php:1181 msgid "ping" msgstr "Пингануть" -#: ../../include/text.php:1160 +#: ../../include/text.php:1181 msgid "pinged" msgstr "Отпингован" -#: ../../include/text.php:1161 +#: ../../include/text.php:1182 msgid "prod" msgstr "Подтолкнуть" -#: ../../include/text.php:1161 +#: ../../include/text.php:1182 msgid "prodded" msgstr "Подтолкнут" -#: ../../include/text.php:1162 +#: ../../include/text.php:1183 msgid "slap" msgstr "Шлёпнуть" -#: ../../include/text.php:1162 +#: ../../include/text.php:1183 msgid "slapped" msgstr "Шлёпнут" -#: ../../include/text.php:1163 +#: ../../include/text.php:1184 msgid "finger" msgstr "Указать" -#: ../../include/text.php:1163 +#: ../../include/text.php:1184 msgid "fingered" msgstr "Указан" -#: ../../include/text.php:1164 +#: ../../include/text.php:1185 msgid "rebuff" msgstr "Дать отпор" -#: ../../include/text.php:1164 +#: ../../include/text.php:1185 msgid "rebuffed" msgstr "Дан отпор" -#: ../../include/text.php:1187 +#: ../../include/text.php:1208 msgid "happy" msgstr "счастливый" -#: ../../include/text.php:1188 +#: ../../include/text.php:1209 msgid "sad" msgstr "грустный" -#: ../../include/text.php:1189 +#: ../../include/text.php:1210 msgid "mellow" msgstr "спокойный" -#: ../../include/text.php:1190 +#: ../../include/text.php:1211 msgid "tired" msgstr "усталый" -#: ../../include/text.php:1191 +#: ../../include/text.php:1212 msgid "perky" msgstr "весёлый" -#: ../../include/text.php:1192 +#: ../../include/text.php:1213 msgid "angry" msgstr "сердитый" -#: ../../include/text.php:1193 +#: ../../include/text.php:1214 msgid "stupefied" msgstr "отупевший" -#: ../../include/text.php:1194 +#: ../../include/text.php:1215 msgid "puzzled" msgstr "недоумевающий" -#: ../../include/text.php:1195 +#: ../../include/text.php:1216 msgid "interested" msgstr "заинтересованный" -#: ../../include/text.php:1196 +#: ../../include/text.php:1217 msgid "bitter" msgstr "едкий" -#: ../../include/text.php:1197 +#: ../../include/text.php:1218 msgid "cheerful" msgstr "бодрый" -#: ../../include/text.php:1198 +#: ../../include/text.php:1219 msgid "alive" msgstr "энергичный" -#: ../../include/text.php:1199 +#: ../../include/text.php:1220 msgid "annoyed" msgstr "раздражённый" -#: ../../include/text.php:1200 +#: ../../include/text.php:1221 msgid "anxious" msgstr "обеспокоенный" -#: ../../include/text.php:1201 +#: ../../include/text.php:1222 msgid "cranky" msgstr "капризный" -#: ../../include/text.php:1202 +#: ../../include/text.php:1223 msgid "disturbed" msgstr "встревоженный" -#: ../../include/text.php:1203 +#: ../../include/text.php:1224 msgid "frustrated" msgstr "разочарованный" -#: ../../include/text.php:1204 +#: ../../include/text.php:1225 msgid "depressed" msgstr "подавленный" -#: ../../include/text.php:1205 +#: ../../include/text.php:1226 msgid "motivated" msgstr "мотивированный" -#: ../../include/text.php:1206 +#: ../../include/text.php:1227 msgid "relaxed" msgstr "расслабленный" -#: ../../include/text.php:1207 +#: ../../include/text.php:1228 msgid "surprised" msgstr "удивленный" -#: ../../include/text.php:1386 ../../include/js_strings.php:95 +#: ../../include/text.php:1416 ../../include/js_strings.php:95 msgid "Monday" msgstr "Понедельник" -#: ../../include/text.php:1386 ../../include/js_strings.php:96 +#: ../../include/text.php:1416 ../../include/js_strings.php:96 msgid "Tuesday" msgstr "Вторник" -#: ../../include/text.php:1386 ../../include/js_strings.php:97 +#: ../../include/text.php:1416 ../../include/js_strings.php:97 msgid "Wednesday" msgstr "Среда" -#: ../../include/text.php:1386 ../../include/js_strings.php:98 +#: ../../include/text.php:1416 ../../include/js_strings.php:98 msgid "Thursday" msgstr "Четверг" -#: ../../include/text.php:1386 ../../include/js_strings.php:99 +#: ../../include/text.php:1416 ../../include/js_strings.php:99 msgid "Friday" msgstr "Пятница" -#: ../../include/text.php:1386 ../../include/js_strings.php:100 +#: ../../include/text.php:1416 ../../include/js_strings.php:100 msgid "Saturday" msgstr "Суббота" -#: ../../include/text.php:1386 ../../include/js_strings.php:94 +#: ../../include/text.php:1416 ../../include/js_strings.php:94 msgid "Sunday" msgstr "Воскресенье" -#: ../../include/text.php:1390 ../../include/js_strings.php:70 +#: ../../include/text.php:1420 ../../include/js_strings.php:70 msgid "January" msgstr "Январь" -#: ../../include/text.php:1390 ../../include/js_strings.php:71 +#: ../../include/text.php:1420 ../../include/js_strings.php:71 msgid "February" msgstr "Февраль" -#: ../../include/text.php:1390 ../../include/js_strings.php:72 +#: ../../include/text.php:1420 ../../include/js_strings.php:72 msgid "March" msgstr "Март" -#: ../../include/text.php:1390 ../../include/js_strings.php:73 +#: ../../include/text.php:1420 ../../include/js_strings.php:73 msgid "April" msgstr "Апрель" -#: ../../include/text.php:1390 +#: ../../include/text.php:1420 msgid "May" msgstr "Май" -#: ../../include/text.php:1390 ../../include/js_strings.php:75 +#: ../../include/text.php:1420 ../../include/js_strings.php:75 msgid "June" msgstr "Июнь" -#: ../../include/text.php:1390 ../../include/js_strings.php:76 +#: ../../include/text.php:1420 ../../include/js_strings.php:76 msgid "July" msgstr "Июль" -#: ../../include/text.php:1390 ../../include/js_strings.php:77 +#: ../../include/text.php:1420 ../../include/js_strings.php:77 msgid "August" msgstr "Август" -#: ../../include/text.php:1390 ../../include/js_strings.php:78 +#: ../../include/text.php:1420 ../../include/js_strings.php:78 msgid "September" msgstr "Сентябрь" -#: ../../include/text.php:1390 ../../include/js_strings.php:79 +#: ../../include/text.php:1420 ../../include/js_strings.php:79 msgid "October" msgstr "Октябрь" -#: ../../include/text.php:1390 ../../include/js_strings.php:80 +#: ../../include/text.php:1420 ../../include/js_strings.php:80 msgid "November" msgstr "Ноябрь" -#: ../../include/text.php:1390 ../../include/js_strings.php:81 +#: ../../include/text.php:1420 ../../include/js_strings.php:81 msgid "December" msgstr "Декабрь" -#: ../../include/text.php:1464 +#: ../../include/text.php:1494 msgid "Unknown Attachment" msgstr "Неизвестное вложение" -#: ../../include/text.php:1466 ../../Zotlabs/Storage/Browser.php:287 +#: ../../include/text.php:1496 ../../Zotlabs/Storage/Browser.php:287 #: ../../Zotlabs/Module/Sharedwithme.php:106 msgid "Size" msgstr "Размер" -#: ../../include/text.php:1466 ../../include/feedutils.php:860 +#: ../../include/text.php:1496 ../../include/feedutils.php:858 msgid "unknown" msgstr "неизвестный" -#: ../../include/text.php:1502 +#: ../../include/text.php:1532 msgid "remove category" msgstr "удалить категорию" -#: ../../include/text.php:1576 +#: ../../include/text.php:1606 msgid "remove from file" msgstr "удалить из файла" -#: ../../include/text.php:1859 ../../Zotlabs/Module/Events.php:663 +#: ../../include/text.php:1913 ../../Zotlabs/Module/Events.php:663 #: ../../Zotlabs/Module/Cal.php:314 msgid "Link to Source" msgstr "Ссылка на источник" -#: ../../include/text.php:1881 ../../include/language.php:423 +#: ../../include/text.php:1935 ../../include/language.php:423 msgid "default" msgstr "по умолчанию" -#: ../../include/text.php:1889 +#: ../../include/text.php:1943 msgid "Page layout" msgstr "Шаблон страницы" -#: ../../include/text.php:1889 +#: ../../include/text.php:1943 msgid "You can create your own with the layouts tool" msgstr "Вы можете создать свой собственный с помощью инструмента шаблонов" -#: ../../include/text.php:1899 ../../Zotlabs/Module/Wiki.php:217 +#: ../../include/text.php:1953 ../../Zotlabs/Module/Wiki.php:217 #: ../../Zotlabs/Module/Wiki.php:371 ../../Zotlabs/Widget/Wiki_pages.php:38 #: ../../Zotlabs/Widget/Wiki_pages.php:95 msgid "BBcode" msgstr "" -#: ../../include/text.php:1900 +#: ../../include/text.php:1954 msgid "HTML" msgstr "" -#: ../../include/text.php:1901 ../../Zotlabs/Module/Wiki.php:217 +#: ../../include/text.php:1955 ../../Zotlabs/Module/Wiki.php:217 #: ../../Zotlabs/Module/Wiki.php:371 ../../Zotlabs/Widget/Wiki_pages.php:38 #: ../../Zotlabs/Widget/Wiki_pages.php:95 #: ../../extend/addon/hzaddons/mdpost/mdpost.php:41 msgid "Markdown" msgstr "Разметка Markdown" -#: ../../include/text.php:1902 ../../Zotlabs/Module/Wiki.php:217 +#: ../../include/text.php:1956 ../../Zotlabs/Module/Wiki.php:217 #: ../../Zotlabs/Widget/Wiki_pages.php:38 #: ../../Zotlabs/Widget/Wiki_pages.php:95 msgid "Text" msgstr "Текст" -#: ../../include/text.php:1903 +#: ../../include/text.php:1957 msgid "Comanche Layout" msgstr "Шаблон Comanche" -#: ../../include/text.php:1908 +#: ../../include/text.php:1962 msgid "PHP" msgstr "" -#: ../../include/text.php:1917 +#: ../../include/text.php:1971 msgid "Page content type" msgstr "Тип содержимого страницы" -#: ../../include/text.php:2037 ../../include/conversation.php:116 -#: ../../Zotlabs/Module/Tagger.php:69 ../../Zotlabs/Module/Like.php:387 -#: ../../Zotlabs/Module/Subthread.php:112 ../../Zotlabs/Lib/Activity.php:1570 +#: ../../include/text.php:2091 ../../include/conversation.php:116 +#: ../../Zotlabs/Module/Tagger.php:69 ../../Zotlabs/Module/Like.php:392 +#: ../../Zotlabs/Module/Subthread.php:112 ../../Zotlabs/Lib/Activity.php:1951 #: ../../extend/addon/hzaddons/redphotos/redphotohelper.php:71 #: ../../extend/addon/hzaddons/pubcrawl/as.php:1494 -#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1541 +#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1545 msgid "photo" msgstr "фото" -#: ../../include/text.php:2040 ../../include/conversation.php:119 -#: ../../include/event.php:1156 ../../Zotlabs/Module/Tagger.php:73 -#: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Like.php:389 +#: ../../include/text.php:2094 ../../include/conversation.php:119 +#: ../../include/event.php:1165 ../../Zotlabs/Module/Tagger.php:73 +#: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Like.php:394 msgid "event" msgstr "событие" -#: ../../include/text.php:2043 ../../include/conversation.php:144 -#: ../../Zotlabs/Module/Like.php:387 ../../Zotlabs/Module/Subthread.php:112 -#: ../../Zotlabs/Lib/Activity.php:1570 +#: ../../include/text.php:2097 ../../include/conversation.php:144 +#: ../../Zotlabs/Module/Like.php:392 ../../Zotlabs/Module/Subthread.php:112 +#: ../../Zotlabs/Lib/Activity.php:1951 #: ../../extend/addon/hzaddons/pubcrawl/as.php:1494 -#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1541 +#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1545 msgid "status" msgstr "статус" -#: ../../include/text.php:2045 ../../include/conversation.php:146 +#: ../../include/text.php:2099 ../../include/conversation.php:146 #: ../../Zotlabs/Module/Tagger.php:79 msgid "comment" msgstr "комментарий" -#: ../../include/text.php:2050 +#: ../../include/text.php:2104 msgid "activity" msgstr "активность" -#: ../../include/text.php:2151 +#: ../../include/text.php:2205 msgid "a-z, 0-9, -, and _ only" msgstr "Только a-z, 0-9, -, и _" -#: ../../include/text.php:2471 +#: ../../include/text.php:2531 msgid "Design Tools" msgstr "Инструменты дизайна" -#: ../../include/text.php:2474 ../../Zotlabs/Module/Blocks.php:154 +#: ../../include/text.php:2534 ../../Zotlabs/Module/Blocks.php:154 msgid "Blocks" msgstr "Блокировки" -#: ../../include/text.php:2475 ../../Zotlabs/Module/Menu.php:170 +#: ../../include/text.php:2535 ../../Zotlabs/Module/Menu.php:170 msgid "Menus" msgstr "Меню" -#: ../../include/text.php:2476 ../../Zotlabs/Module/Layouts.php:184 +#: ../../include/text.php:2536 ../../Zotlabs/Module/Layouts.php:184 msgid "Layouts" msgstr "Шаблоны" -#: ../../include/text.php:2477 +#: ../../include/text.php:2537 msgid "Pages" msgstr "Страницы" -#: ../../include/text.php:2498 ../../Zotlabs/Module/Cal.php:343 +#: ../../include/text.php:2558 ../../Zotlabs/Module/Cal.php:343 msgid "Import" msgstr "Импортировать" -#: ../../include/text.php:2499 +#: ../../include/text.php:2559 msgid "Import website..." msgstr "Импорт веб-сайта..." -#: ../../include/text.php:2500 +#: ../../include/text.php:2560 msgid "Select folder to import" msgstr "Выбрать каталог для импорта" -#: ../../include/text.php:2501 +#: ../../include/text.php:2561 msgid "Import from a zipped folder:" msgstr "Импортировать из каталога в zip-архиве:" -#: ../../include/text.php:2502 +#: ../../include/text.php:2562 msgid "Import from cloud files:" msgstr "Импортировать из сетевых файлов:" -#: ../../include/text.php:2503 +#: ../../include/text.php:2563 msgid "/cloud/channel/path/to/folder" msgstr "" -#: ../../include/text.php:2504 +#: ../../include/text.php:2564 msgid "Enter path to website files" msgstr "Введите путь к файлам веб-сайта" -#: ../../include/text.php:2505 +#: ../../include/text.php:2565 msgid "Select folder" msgstr "Выбрать каталог" -#: ../../include/text.php:2506 +#: ../../include/text.php:2566 msgid "Export website..." msgstr "Экспорт веб-сайта..." -#: ../../include/text.php:2507 +#: ../../include/text.php:2567 msgid "Export to a zip file" msgstr "Экспортировать в ZIP файл." -#: ../../include/text.php:2508 +#: ../../include/text.php:2568 msgid "website.zip" msgstr "" -#: ../../include/text.php:2509 +#: ../../include/text.php:2569 msgid "Enter a name for the zip file." msgstr "Введите имя для ZIP файла." -#: ../../include/text.php:2510 +#: ../../include/text.php:2570 msgid "Export to cloud files" msgstr "Эскпортировать в сетевые файлы:" -#: ../../include/text.php:2511 +#: ../../include/text.php:2571 msgid "/path/to/export/folder" msgstr "" -#: ../../include/text.php:2512 +#: ../../include/text.php:2572 msgid "Enter a path to a cloud files destination." msgstr "Введите путь к расположению сетевых файлов." -#: ../../include/text.php:2513 +#: ../../include/text.php:2573 msgid "Specify folder" msgstr "Указать каталог" -#: ../../include/text.php:2833 ../../Zotlabs/Storage/Browser.php:131 +#: ../../include/text.php:2893 ../../Zotlabs/Storage/Browser.php:131 msgid "Collection" msgstr "Коллекция" -#: ../../include/import.php:25 +#: ../../include/import.php:26 msgid "Unable to import a removed channel." msgstr "Невозможно импортировать удалённый канал." -#: ../../include/import.php:51 +#: ../../include/import.php:52 msgid "" "Cannot create a duplicate channel identifier on this system. Import failed." msgstr "Не удалось создать дублирующийся идентификатор канала. Импорт невозможен." -#: ../../include/import.php:72 +#: ../../include/import.php:73 #: ../../extend/addon/hzaddons/diaspora/import_diaspora.php:43 msgid "Unable to create a unique channel address. Import failed." msgstr "Не удалось создать уникальный адрес канала. Импорт не завершен." -#: ../../include/import.php:116 +#: ../../include/import.php:117 msgid "Cloned channel not found. Import failed." msgstr "Клон канала не найден. Импорт невозможен." @@ -2175,9 +2176,9 @@ msgid "edit" msgstr "редактировать" #: ../../include/group.php:320 ../../include/nav.php:95 -#: ../../Zotlabs/Module/Group.php:132 ../../Zotlabs/Module/Group.php:143 +#: ../../Zotlabs/Module/Group.php:141 ../../Zotlabs/Module/Group.php:153 #: ../../Zotlabs/Widget/Activity_filter.php:41 ../../Zotlabs/Lib/Group.php:324 -#: ../../Zotlabs/Lib/Apps.php:339 +#: ../../Zotlabs/Lib/Apps.php:341 msgid "Privacy Groups" msgstr "Группы безопасности" @@ -2270,16 +2271,16 @@ msgstr "Это действие невозможно из-за ограниче msgid "Invalid data packet" msgstr "Неверный пакет данных" -#: ../../include/zot.php:802 ../../Zotlabs/Lib/Libzot.php:667 +#: ../../include/zot.php:802 ../../Zotlabs/Lib/Libzot.php:653 msgid "Unable to verify channel signature" msgstr "Невозможно проверить подпись канала" -#: ../../include/zot.php:2575 ../../Zotlabs/Lib/Libsync.php:733 +#: ../../include/zot.php:2591 ../../Zotlabs/Lib/Libsync.php:733 #, php-format msgid "Unable to verify site signature for %s" msgstr "Невозможно проверить подпись сайта %s" -#: ../../include/zot.php:4272 +#: ../../include/zot.php:4288 msgid "invalid target signature" msgstr "недопустимая целевая подпись" @@ -2324,8 +2325,8 @@ msgid "Help:" msgstr "Помощь:" #: ../../include/help.php:117 ../../include/help.php:125 -#: ../../include/nav.php:168 ../../include/nav.php:289 -#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Lib/Apps.php:323 +#: ../../include/nav.php:168 ../../include/nav.php:319 +#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Lib/Apps.php:325 msgid "Help" msgstr "Помощь" @@ -2340,17 +2341,17 @@ msgstr "Не найдено" msgid "Page not found." msgstr "Страница не найдена." -#: ../../include/bbcode.php:200 ../../include/bbcode.php:1201 -#: ../../include/bbcode.php:1204 ../../include/bbcode.php:1209 -#: ../../include/bbcode.php:1212 ../../include/bbcode.php:1215 -#: ../../include/bbcode.php:1218 ../../include/bbcode.php:1223 -#: ../../include/bbcode.php:1226 ../../include/bbcode.php:1231 -#: ../../include/bbcode.php:1234 ../../include/bbcode.php:1237 -#: ../../include/bbcode.php:1240 +#: ../../include/bbcode.php:200 ../../include/bbcode.php:1190 +#: ../../include/bbcode.php:1193 ../../include/bbcode.php:1198 +#: ../../include/bbcode.php:1201 ../../include/bbcode.php:1204 +#: ../../include/bbcode.php:1207 ../../include/bbcode.php:1212 +#: ../../include/bbcode.php:1215 ../../include/bbcode.php:1220 +#: ../../include/bbcode.php:1223 ../../include/bbcode.php:1226 +#: ../../include/bbcode.php:1229 msgid "Image/photo" msgstr "Изображение / фотография" -#: ../../include/bbcode.php:239 ../../include/bbcode.php:1251 +#: ../../include/bbcode.php:239 ../../include/bbcode.php:1240 msgid "Encrypted content" msgstr "Зашифрованное содержание" @@ -2382,54 +2383,54 @@ msgstr "заблокировать" msgid "menu" msgstr "меню" -#: ../../include/bbcode.php:350 +#: ../../include/bbcode.php:339 msgid "card" msgstr "карточка" -#: ../../include/bbcode.php:352 +#: ../../include/bbcode.php:341 msgid "article" msgstr "статья" -#: ../../include/bbcode.php:435 ../../include/bbcode.php:443 +#: ../../include/bbcode.php:424 ../../include/bbcode.php:432 msgid "Click to open/close" msgstr "Нажмите, чтобы открыть/закрыть" -#: ../../include/bbcode.php:443 +#: ../../include/bbcode.php:432 msgid "spoiler" msgstr "спойлер" -#: ../../include/bbcode.php:456 +#: ../../include/bbcode.php:445 msgid "View article" msgstr "Просмотр статьи" -#: ../../include/bbcode.php:456 +#: ../../include/bbcode.php:445 msgid "View summary" msgstr "Просмотр резюме" -#: ../../include/bbcode.php:746 ../../include/bbcode.php:916 +#: ../../include/bbcode.php:735 ../../include/bbcode.php:905 #: ../../Zotlabs/Lib/NativeWikiPage.php:603 msgid "Different viewers will see this text differently" msgstr "Различные зрители увидят этот текст по-разному" -#: ../../include/bbcode.php:1189 +#: ../../include/bbcode.php:1178 msgid "$1 wrote:" msgstr "$1 писал:" -#: ../../include/conversation.php:122 ../../Zotlabs/Module/Like.php:121 +#: ../../include/conversation.php:122 ../../Zotlabs/Module/Like.php:123 msgid "channel" msgstr "канал" -#: ../../include/conversation.php:160 ../../Zotlabs/Module/Like.php:441 -#: ../../Zotlabs/Lib/Activity.php:1605 -#: ../../extend/addon/hzaddons/pubcrawl/as.php:1529 -#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1570 +#: ../../include/conversation.php:160 ../../Zotlabs/Module/Like.php:447 +#: ../../Zotlabs/Lib/Activity.php:1986 +#: ../../extend/addon/hzaddons/pubcrawl/as.php:1530 +#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1575 #, php-format msgid "%1$s likes %2$s's %3$s" msgstr "%1$s нравится %3$s %2$s" -#: ../../include/conversation.php:163 ../../Zotlabs/Module/Like.php:443 -#: ../../Zotlabs/Lib/Activity.php:1607 -#: ../../extend/addon/hzaddons/pubcrawl/as.php:1531 +#: ../../include/conversation.php:163 ../../Zotlabs/Module/Like.php:449 +#: ../../Zotlabs/Lib/Activity.php:1988 +#: ../../extend/addon/hzaddons/pubcrawl/as.php:1532 #, php-format msgid "%1$s doesn't like %2$s's %3$s" msgstr "%1$s не нравится %2$s %3$s" @@ -2464,42 +2465,42 @@ msgstr "%1$s в %2$s" msgid "This is an unsaved preview" msgstr "Это несохранённый просмотр" -#: ../../include/conversation.php:619 ../../Zotlabs/Module/Photos.php:1152 +#: ../../include/conversation.php:619 ../../Zotlabs/Module/Photos.php:1154 msgctxt "title" msgid "Likes" msgstr "Нравится" -#: ../../include/conversation.php:619 ../../Zotlabs/Module/Photos.php:1152 +#: ../../include/conversation.php:619 ../../Zotlabs/Module/Photos.php:1154 msgctxt "title" msgid "Dislikes" msgstr "Не нравится" -#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1153 +#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1155 msgctxt "title" msgid "Agree" msgstr "Согласен" -#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1153 +#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1155 msgctxt "title" msgid "Disagree" msgstr "Не согласен" -#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1153 +#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1155 msgctxt "title" msgid "Abstain" msgstr "Воздержался" -#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1154 +#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1156 msgctxt "title" msgid "Attending" msgstr "Посещаю" -#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1154 +#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1156 msgctxt "title" msgid "Not attending" msgstr "Не посещаю" -#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1154 +#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1156 msgctxt "title" msgid "Might attend" msgstr "Возможно посещу" @@ -2511,19 +2512,19 @@ msgstr "Выбрать" #: ../../include/conversation.php:691 ../../include/conversation.php:736 #: ../../Zotlabs/Storage/Browser.php:291 ../../Zotlabs/Module/Cdav.php:942 #: ../../Zotlabs/Module/Cdav.php:1232 ../../Zotlabs/Module/Profiles.php:800 -#: ../../Zotlabs/Module/Photos.php:1218 ../../Zotlabs/Module/Oauth.php:174 +#: ../../Zotlabs/Module/Photos.php:1220 ../../Zotlabs/Module/Oauth.php:174 #: ../../Zotlabs/Module/Oauth2.php:195 ../../Zotlabs/Module/Editlayout.php:138 #: ../../Zotlabs/Module/Editblock.php:139 #: ../../Zotlabs/Module/Admin/Channels.php:149 #: ../../Zotlabs/Module/Admin/Profs.php:176 #: ../../Zotlabs/Module/Admin/Accounts.php:175 #: ../../Zotlabs/Module/Editwebpage.php:167 ../../Zotlabs/Module/Thing.php:267 -#: ../../Zotlabs/Module/Webpages.php:257 ../../Zotlabs/Module/Connedit.php:660 -#: ../../Zotlabs/Module/Connedit.php:929 +#: ../../Zotlabs/Module/Webpages.php:257 ../../Zotlabs/Module/Connedit.php:668 +#: ../../Zotlabs/Module/Connedit.php:940 #: ../../Zotlabs/Module/Connections.php:292 #: ../../Zotlabs/Module/Card_edit.php:129 #: ../../Zotlabs/Module/Article_edit.php:129 -#: ../../Zotlabs/Module/Blocks.php:162 ../../Zotlabs/Lib/Apps.php:535 +#: ../../Zotlabs/Module/Blocks.php:162 ../../Zotlabs/Lib/Apps.php:537 #: ../../Zotlabs/Lib/ThreadItem.php:153 msgid "Delete" msgstr "Удалить" @@ -2616,12 +2617,12 @@ msgid "Unfollow Thread" msgstr "Прекратить отслеживать тему" #: ../../include/conversation.php:1038 ../../include/nav.php:106 -#: ../../Zotlabs/Module/Connedit.php:600 ../../Zotlabs/Lib/Apps.php:319 +#: ../../Zotlabs/Module/Connedit.php:608 ../../Zotlabs/Lib/Apps.php:321 #: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:57 msgid "View Profile" msgstr "Просмотреть профиль" -#: ../../include/conversation.php:1048 ../../Zotlabs/Module/Connedit.php:621 +#: ../../include/conversation.php:1048 ../../Zotlabs/Module/Connedit.php:629 msgid "Recent Activity" msgstr "Последние действия" @@ -2639,18 +2640,18 @@ msgid "Ratings" msgstr "Оценки" #: ../../include/conversation.php:1098 ../../Zotlabs/Module/Poke.php:199 -#: ../../Zotlabs/Lib/Apps.php:326 +#: ../../Zotlabs/Lib/Apps.php:328 msgid "Poke" msgstr "Ткнуть" #: ../../include/conversation.php:1166 ../../Zotlabs/Storage/Browser.php:164 #: ../../Zotlabs/Module/Cdav.php:811 ../../Zotlabs/Module/Cdav.php:812 #: ../../Zotlabs/Module/Cdav.php:819 ../../Zotlabs/Module/Photos.php:832 -#: ../../Zotlabs/Module/Photos.php:1288 -#: ../../Zotlabs/Module/Embedphotos.php:146 +#: ../../Zotlabs/Module/Photos.php:1296 +#: ../../Zotlabs/Module/Embedphotos.php:154 #: ../../Zotlabs/Widget/Portfolio.php:95 ../../Zotlabs/Widget/Album.php:84 -#: ../../Zotlabs/Lib/Apps.php:994 ../../Zotlabs/Lib/Apps.php:1078 -#: ../../Zotlabs/Lib/Activity.php:858 +#: ../../Zotlabs/Lib/Apps.php:1010 ../../Zotlabs/Lib/Apps.php:1094 +#: ../../Zotlabs/Lib/Activity.php:1006 #: ../../extend/addon/hzaddons/pubcrawl/as.php:949 msgid "Unknown" msgstr "Неизвестный" @@ -2789,7 +2790,7 @@ msgstr "Комментарии включены" msgid "Comments disabled" msgstr "Комментарии отключены" -#: ../../include/conversation.php:1356 ../../Zotlabs/Module/Photos.php:1138 +#: ../../include/conversation.php:1356 ../../Zotlabs/Module/Photos.php:1139 #: ../../Zotlabs/Module/Events.php:480 ../../Zotlabs/Module/Webpages.php:262 #: ../../Zotlabs/Lib/ThreadItem.php:783 #: ../../extend/addon/hzaddons/hsse/hsse.php:153 @@ -2861,7 +2862,7 @@ msgstr "Встроить изображение из ваших альбомов #: ../../Zotlabs/Module/Admin/Addons.php:423 #: ../../Zotlabs/Module/Editwebpage.php:169 #: ../../Zotlabs/Module/Profile_photo.php:465 -#: ../../Zotlabs/Module/Editpost.php:109 ../../Zotlabs/Module/Connedit.php:930 +#: ../../Zotlabs/Module/Editpost.php:109 ../../Zotlabs/Module/Connedit.php:941 #: ../../Zotlabs/Module/Card_edit.php:131 #: ../../Zotlabs/Module/Article_edit.php:131 ../../Zotlabs/Module/Wiki.php:368 #: ../../Zotlabs/Module/Wiki.php:401 ../../Zotlabs/Module/Filer.php:55 @@ -2934,7 +2935,7 @@ msgstr "Установить дату публикации" msgid "Encrypt text" msgstr "Зашифровать текст" -#: ../../include/conversation.php:1696 ../../Zotlabs/Module/Photos.php:1180 +#: ../../include/conversation.php:1696 ../../Zotlabs/Module/Photos.php:1182 #: ../../Zotlabs/Lib/ThreadItem.php:226 msgctxt "noun" msgid "Dislike" @@ -3042,8 +3043,8 @@ msgstr "Выбор дополнительного языка" msgid "Delete this item?" msgstr "Удалить этот элемент?" -#: ../../include/js_strings.php:6 ../../Zotlabs/Module/Photos.php:1136 -#: ../../Zotlabs/Module/Photos.php:1254 ../../Zotlabs/Lib/ThreadItem.php:772 +#: ../../include/js_strings.php:6 ../../Zotlabs/Module/Photos.php:1137 +#: ../../Zotlabs/Module/Photos.php:1256 ../../Zotlabs/Lib/ThreadItem.php:772 msgid "Comment" msgstr "Комментарий" @@ -3104,7 +3105,7 @@ msgid "Rate This Channel (this is public)" msgstr "Оценкa этoго канала (общедоступно)" #: ../../include/js_strings.php:20 ../../Zotlabs/Module/Rate.php:155 -#: ../../Zotlabs/Module/Connedit.php:876 +#: ../../Zotlabs/Module/Connedit.php:887 msgid "Rating" msgstr "Оценка" @@ -3380,39 +3381,35 @@ msgstr "Только публичные форумы" msgid "This Website Only" msgstr "Только этот веб-сайт" -#: ../../include/network.php:771 -msgid "view full size" -msgstr "посмотреть в полный размер" - -#: ../../include/network.php:1774 ../../include/network.php:1775 +#: ../../include/network.php:1715 ../../include/network.php:1716 msgid "Friendica" msgstr "" -#: ../../include/network.php:1776 +#: ../../include/network.php:1717 msgid "OStatus" msgstr "" -#: ../../include/network.php:1777 +#: ../../include/network.php:1718 msgid "GNU-Social" msgstr "" -#: ../../include/network.php:1778 +#: ../../include/network.php:1719 msgid "RSS/Atom" msgstr "" -#: ../../include/network.php:1779 ../../Zotlabs/Lib/Activity.php:1417 -#: ../../Zotlabs/Lib/Activity.php:1614 +#: ../../include/network.php:1720 ../../Zotlabs/Lib/Activity.php:1798 +#: ../../Zotlabs/Lib/Activity.php:1995 #: ../../extend/addon/hzaddons/pubcrawl/as.php:1204 #: ../../extend/addon/hzaddons/pubcrawl/as.php:1359 -#: ../../extend/addon/hzaddons/pubcrawl/as.php:1538 +#: ../../extend/addon/hzaddons/pubcrawl/as.php:1539 msgid "ActivityPub" msgstr "" -#: ../../include/network.php:1780 ../../Zotlabs/Module/Cdav.php:1219 +#: ../../include/network.php:1721 ../../Zotlabs/Module/Cdav.php:1219 #: ../../Zotlabs/Module/Profiles.php:787 #: ../../Zotlabs/Module/Admin/Accounts.php:171 #: ../../Zotlabs/Module/Admin/Accounts.php:183 -#: ../../Zotlabs/Module/Connedit.php:916 +#: ../../Zotlabs/Module/Connedit.php:927 #: ../../extend/addon/hzaddons/rtof/Mod_Rtof.php:57 #: ../../extend/addon/hzaddons/openid/MysqlProvider.php:56 #: ../../extend/addon/hzaddons/openid/MysqlProvider.php:57 @@ -3420,27 +3417,27 @@ msgstr "" msgid "Email" msgstr "Электронная почта" -#: ../../include/network.php:1781 +#: ../../include/network.php:1722 msgid "Diaspora" msgstr "" -#: ../../include/network.php:1782 +#: ../../include/network.php:1723 msgid "Facebook" msgstr "" -#: ../../include/network.php:1783 +#: ../../include/network.php:1724 msgid "Zot" msgstr "" -#: ../../include/network.php:1784 +#: ../../include/network.php:1725 msgid "LinkedIn" msgstr "" -#: ../../include/network.php:1785 +#: ../../include/network.php:1726 msgid "XMPP/IM" msgstr "" -#: ../../include/network.php:1786 +#: ../../include/network.php:1727 msgid "MySpace" msgstr "" @@ -3468,7 +3465,7 @@ msgstr "YYYY-MM-DD или MM-DD" msgid "Required" msgstr "Требуется" -#: ../../include/datetime.php:238 ../../boot.php:2558 +#: ../../include/datetime.php:238 ../../boot.php:2562 msgid "never" msgstr "никогда" @@ -3589,11 +3586,11 @@ msgstr "Не показывать" #: ../../include/acl_selectors.php:123 ../../Zotlabs/Module/Photos.php:717 #: ../../Zotlabs/Module/Photos.php:1086 ../../Zotlabs/Module/Chat.php:243 #: ../../Zotlabs/Module/Filestorage.php:170 ../../Zotlabs/Module/Thing.php:319 -#: ../../Zotlabs/Module/Thing.php:372 ../../Zotlabs/Module/Connedit.php:682 +#: ../../Zotlabs/Module/Thing.php:372 ../../Zotlabs/Module/Connedit.php:690 msgid "Permissions" msgstr "Разрешения" -#: ../../include/acl_selectors.php:125 ../../Zotlabs/Module/Photos.php:1308 +#: ../../include/acl_selectors.php:125 ../../Zotlabs/Module/Photos.php:1316 #: ../../Zotlabs/Lib/ThreadItem.php:441 msgid "Close" msgstr "Закрыть" @@ -3618,73 +3615,73 @@ msgstr "Новое окно" msgid "Open the selected location in a different window or browser tab" msgstr "Открыть выбранное местоположение в другом окне или вкладке браузера" -#: ../../include/connections.php:696 ../../include/event.php:1311 +#: ../../include/connections.php:696 ../../include/event.php:1320 #: ../../Zotlabs/Module/Cdav.php:1224 ../../Zotlabs/Module/Profiles.php:792 -#: ../../Zotlabs/Module/Connedit.php:921 +#: ../../Zotlabs/Module/Connedit.php:932 msgid "Mobile" msgstr "Мобильный" -#: ../../include/connections.php:697 ../../include/event.php:1312 +#: ../../include/connections.php:697 ../../include/event.php:1321 #: ../../Zotlabs/Module/Cdav.php:1225 ../../Zotlabs/Module/Profiles.php:793 -#: ../../Zotlabs/Module/Connedit.php:922 +#: ../../Zotlabs/Module/Connedit.php:933 msgid "Home" msgstr "Домашний" -#: ../../include/connections.php:698 ../../include/event.php:1313 +#: ../../include/connections.php:698 ../../include/event.php:1322 msgid "Home, Voice" msgstr "Дом, голос" -#: ../../include/connections.php:699 ../../include/event.php:1314 +#: ../../include/connections.php:699 ../../include/event.php:1323 msgid "Home, Fax" msgstr "Дом, факс" -#: ../../include/connections.php:700 ../../include/event.php:1315 +#: ../../include/connections.php:700 ../../include/event.php:1324 #: ../../Zotlabs/Module/Cdav.php:1226 ../../Zotlabs/Module/Profiles.php:794 -#: ../../Zotlabs/Module/Connedit.php:923 +#: ../../Zotlabs/Module/Connedit.php:934 msgid "Work" msgstr "Рабочий" -#: ../../include/connections.php:701 ../../include/event.php:1316 +#: ../../include/connections.php:701 ../../include/event.php:1325 msgid "Work, Voice" msgstr "Работа, голос" -#: ../../include/connections.php:702 ../../include/event.php:1317 +#: ../../include/connections.php:702 ../../include/event.php:1326 msgid "Work, Fax" msgstr "Работа, факс" -#: ../../include/event.php:24 ../../include/event.php:71 +#: ../../include/event.php:28 ../../include/event.php:75 msgid "l F d, Y \\@ g:i A" msgstr "" -#: ../../include/event.php:32 ../../include/event.php:75 +#: ../../include/event.php:36 ../../include/event.php:79 msgid "Starts:" msgstr "Начало:" -#: ../../include/event.php:42 ../../include/event.php:79 +#: ../../include/event.php:46 ../../include/event.php:83 msgid "Finishes:" msgstr "Окончание:" -#: ../../include/event.php:1011 +#: ../../include/event.php:1020 msgid "This event has been added to your calendar." msgstr "Это событие было добавлено в ваш календарь." -#: ../../include/event.php:1230 +#: ../../include/event.php:1239 msgid "Not specified" msgstr "Не указано" -#: ../../include/event.php:1231 +#: ../../include/event.php:1240 msgid "Needs Action" msgstr "Требует действия" -#: ../../include/event.php:1232 +#: ../../include/event.php:1241 msgid "Completed" msgstr "Завершено" -#: ../../include/event.php:1233 +#: ../../include/event.php:1242 msgid "In Process" msgstr "В процессе" -#: ../../include/event.php:1234 +#: ../../include/event.php:1243 msgid "Cancelled" msgstr "Отменено" @@ -3718,7 +3715,7 @@ msgid "Click to authenticate to your home hub" msgstr "Нажмите, чтобы аутентифицировать себя на домашнем узле" #: ../../include/nav.php:92 ../../Zotlabs/Module/Manage.php:170 -#: ../../Zotlabs/Lib/Apps.php:312 +#: ../../Zotlabs/Lib/Apps.php:314 msgid "Channel Manager" msgstr "Менеджер каналов" @@ -3733,7 +3730,7 @@ msgstr "Управление вашим группами безопасност #: ../../include/nav.php:97 ../../Zotlabs/Module/Admin/Addons.php:344 #: ../../Zotlabs/Module/Admin/Themes.php:125 #: ../../Zotlabs/Widget/Newmember.php:53 -#: ../../Zotlabs/Widget/Settings_menu.php:68 ../../Zotlabs/Lib/Apps.php:314 +#: ../../Zotlabs/Widget/Settings_menu.php:68 ../../Zotlabs/Lib/Apps.php:316 msgid "Settings" msgstr "Настройки" @@ -3742,7 +3739,7 @@ msgid "Account/Channel Settings" msgstr "Настройки аккаунта / канала" #: ../../include/nav.php:103 ../../include/nav.php:132 -#: ../../include/nav.php:151 ../../boot.php:1624 +#: ../../include/nav.php:151 ../../boot.php:1628 msgid "Logout" msgstr "Выход" @@ -3762,8 +3759,8 @@ msgstr "Управление / редактирование профилей" msgid "Edit your profile" msgstr "Редактировать профиль" -#: ../../include/nav.php:118 ../../include/nav.php:122 ../../boot.php:1625 -#: ../../Zotlabs/Lib/Apps.php:311 +#: ../../include/nav.php:118 ../../include/nav.php:122 ../../boot.php:1629 +#: ../../Zotlabs/Lib/Apps.php:313 msgid "Login" msgstr "Войти" @@ -3779,7 +3776,7 @@ msgstr "Домой" msgid "Log me out of this site" msgstr "Выйти с этого сайта" -#: ../../include/nav.php:156 ../../boot.php:1605 +#: ../../include/nav.php:156 ../../boot.php:1609 #: ../../Zotlabs/Module/Register.php:289 msgid "Register" msgstr "Регистрация" @@ -3804,110 +3801,110 @@ msgstr "Администрирование" msgid "Site Setup and Configuration" msgstr "Установка и конфигурация сайта" -#: ../../include/nav.php:293 ../../Zotlabs/Module/Defperms.php:256 +#: ../../include/nav.php:323 ../../Zotlabs/Module/Defperms.php:256 #: ../../Zotlabs/Module/New_channel.php:157 #: ../../Zotlabs/Module/New_channel.php:164 -#: ../../Zotlabs/Module/Connedit.php:858 +#: ../../Zotlabs/Module/Connedit.php:869 #: ../../Zotlabs/Widget/Notifications.php:162 msgid "Loading" msgstr "Загрузка" -#: ../../include/nav.php:299 +#: ../../include/nav.php:329 msgid "@name, !forum, #tag, ?doc, content" msgstr "@имя, !форум, #тег, ?документ, содержимое" -#: ../../include/nav.php:300 +#: ../../include/nav.php:330 msgid "Please wait..." msgstr "Подождите пожалуйста ..." -#: ../../include/nav.php:306 +#: ../../include/nav.php:336 msgid "Add Apps" msgstr "Добавить приложения" -#: ../../include/nav.php:307 +#: ../../include/nav.php:337 msgid "Arrange Apps" msgstr "Упорядочить приложения" -#: ../../include/nav.php:308 +#: ../../include/nav.php:338 msgid "Toggle System Apps" msgstr "Показать системные приложения" -#: ../../include/nav.php:391 ../../Zotlabs/Module/Admin/Channels.php:154 +#: ../../include/nav.php:421 ../../Zotlabs/Module/Admin/Channels.php:154 msgid "Channel" msgstr "Канал" -#: ../../include/nav.php:394 +#: ../../include/nav.php:424 msgid "Status Messages and Posts" msgstr "Статусы и публикации" -#: ../../include/nav.php:404 ../../Zotlabs/Module/Help.php:80 +#: ../../include/nav.php:434 ../../Zotlabs/Module/Help.php:80 msgid "About" msgstr "О себе" -#: ../../include/nav.php:407 +#: ../../include/nav.php:437 msgid "Profile Details" msgstr "Информация о профиле" -#: ../../include/nav.php:422 ../../Zotlabs/Storage/Browser.php:272 -#: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:315 +#: ../../include/nav.php:452 ../../Zotlabs/Storage/Browser.php:272 +#: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:317 msgid "Files" msgstr "Файлы" -#: ../../include/nav.php:425 +#: ../../include/nav.php:455 msgid "Files and Storage" msgstr "Файлы и хранилище" -#: ../../include/nav.php:433 ../../include/nav.php:436 +#: ../../include/nav.php:463 ../../include/nav.php:466 #: ../../Zotlabs/Storage/Browser.php:140 msgid "Calendar" msgstr "Календарь" -#: ../../include/nav.php:447 ../../include/nav.php:450 -#: ../../Zotlabs/Widget/Chatroom_list.php:16 ../../Zotlabs/Lib/Apps.php:307 +#: ../../include/nav.php:477 ../../include/nav.php:480 +#: ../../Zotlabs/Widget/Chatroom_list.php:16 ../../Zotlabs/Lib/Apps.php:309 msgid "Chatrooms" msgstr "Чаты" -#: ../../include/nav.php:460 ../../Zotlabs/Lib/Apps.php:306 +#: ../../include/nav.php:490 ../../Zotlabs/Lib/Apps.php:308 msgid "Bookmarks" msgstr "Закладки" -#: ../../include/nav.php:463 +#: ../../include/nav.php:493 msgid "Saved Bookmarks" msgstr "Сохранённые закладки" -#: ../../include/nav.php:471 ../../Zotlabs/Module/Cards.php:203 -#: ../../Zotlabs/Lib/Apps.php:303 +#: ../../include/nav.php:501 ../../Zotlabs/Module/Cards.php:207 +#: ../../Zotlabs/Lib/Apps.php:305 msgid "Cards" msgstr "Карточки" -#: ../../include/nav.php:474 +#: ../../include/nav.php:504 msgid "View Cards" msgstr "Просмотреть карточки" -#: ../../include/nav.php:482 ../../Zotlabs/Module/Articles.php:214 -#: ../../Zotlabs/Lib/Apps.php:302 +#: ../../include/nav.php:512 ../../Zotlabs/Module/Articles.php:222 +#: ../../Zotlabs/Lib/Apps.php:304 msgid "Articles" msgstr "Статьи" -#: ../../include/nav.php:485 +#: ../../include/nav.php:515 msgid "View Articles" msgstr "Просмотр статей" -#: ../../include/nav.php:494 ../../Zotlabs/Module/Webpages.php:252 -#: ../../Zotlabs/Lib/Apps.php:316 +#: ../../include/nav.php:524 ../../Zotlabs/Module/Webpages.php:252 +#: ../../Zotlabs/Lib/Apps.php:318 msgid "Webpages" msgstr "Веб-страницы" -#: ../../include/nav.php:497 +#: ../../include/nav.php:527 msgid "View Webpages" msgstr "Просмотр веб-страниц" -#: ../../include/nav.php:506 ../../Zotlabs/Module/Wiki.php:206 +#: ../../include/nav.php:536 ../../Zotlabs/Module/Wiki.php:206 #: ../../Zotlabs/Widget/Wiki_list.php:15 msgid "Wikis" msgstr "" -#: ../../include/nav.php:509 ../../Zotlabs/Lib/Apps.php:317 +#: ../../include/nav.php:539 ../../Zotlabs/Lib/Apps.php:319 msgid "Wiki" msgstr "" @@ -3916,117 +3913,117 @@ msgstr "" msgid "%1$s's bookmarks" msgstr "Закладки пользователя %1$s" -#: ../../include/attach.php:265 ../../include/attach.php:374 +#: ../../include/attach.php:267 ../../include/attach.php:376 msgid "Item was not found." msgstr "Элемент не найден." -#: ../../include/attach.php:282 +#: ../../include/attach.php:284 msgid "Unknown error." msgstr "Неизвестная ошибка." -#: ../../include/attach.php:567 +#: ../../include/attach.php:569 msgid "No source file." msgstr "Нет исходного файла." -#: ../../include/attach.php:589 +#: ../../include/attach.php:591 msgid "Cannot locate file to replace" msgstr "Не удается найти файл для замены" -#: ../../include/attach.php:608 +#: ../../include/attach.php:610 msgid "Cannot locate file to revise/update" msgstr "Не удается найти файл для пересмотра / обновления" -#: ../../include/attach.php:750 +#: ../../include/attach.php:752 #, php-format msgid "File exceeds size limit of %d" msgstr "Файл превышает предельный размер %d" -#: ../../include/attach.php:771 +#: ../../include/attach.php:773 #, php-format msgid "You have reached your limit of %1$.0f Mbytes attachment storage." msgstr "Вы достигли предела %1$.0f Мбайт для хранения вложений." -#: ../../include/attach.php:953 +#: ../../include/attach.php:955 msgid "File upload failed. Possible system limit or action terminated." msgstr "Загрузка файла не удалась. Возможно система перегружена или попытка прекращена." -#: ../../include/attach.php:982 +#: ../../include/attach.php:984 msgid "Stored file could not be verified. Upload failed." msgstr "Файл для сохранения не может быть проверен. Загрузка не удалась." -#: ../../include/attach.php:1056 ../../include/attach.php:1072 +#: ../../include/attach.php:1058 ../../include/attach.php:1074 msgid "Path not available." msgstr "Путь недоступен." -#: ../../include/attach.php:1121 ../../include/attach.php:1286 +#: ../../include/attach.php:1123 ../../include/attach.php:1288 msgid "Empty pathname" msgstr "Пустое имя пути" -#: ../../include/attach.php:1147 +#: ../../include/attach.php:1149 msgid "duplicate filename or path" msgstr "дублирующееся имя файла или пути" -#: ../../include/attach.php:1172 +#: ../../include/attach.php:1174 msgid "Path not found." msgstr "Путь не найден." -#: ../../include/attach.php:1240 +#: ../../include/attach.php:1242 msgid "mkdir failed." msgstr "mkdir не удался" -#: ../../include/attach.php:1244 +#: ../../include/attach.php:1246 msgid "database storage failed." msgstr "ошибка при записи базы данных." -#: ../../include/attach.php:1292 +#: ../../include/attach.php:1294 msgid "Empty path" msgstr "Пустое имя пути" -#: ../../include/photo/photo_driver.php:779 +#: ../../include/photo/photo_driver.php:782 #: ../../Zotlabs/Module/Profile_photo.php:120 #: ../../Zotlabs/Module/Profile_photo.php:248 msgid "Profile Photos" msgstr "Фотографии профиля" -#: ../../boot.php:1604 +#: ../../boot.php:1608 msgid "Create an account to access services and applications" msgstr "Создайте аккаунт для доступа к службам и приложениям" -#: ../../boot.php:1628 +#: ../../boot.php:1632 msgid "Login/Email" msgstr "Пользователь / email" -#: ../../boot.php:1629 +#: ../../boot.php:1633 msgid "Password" msgstr "Пароль" -#: ../../boot.php:1630 +#: ../../boot.php:1634 msgid "Remember me" msgstr "Запомнить меня" -#: ../../boot.php:1633 +#: ../../boot.php:1637 msgid "Forgot your password?" msgstr "Забыли пароль или логин?" -#: ../../boot.php:1634 ../../Zotlabs/Module/Lostpass.php:91 +#: ../../boot.php:1638 ../../Zotlabs/Module/Lostpass.php:91 msgid "Password Reset" msgstr "Сбросить пароль" -#: ../../boot.php:2431 +#: ../../boot.php:2435 #, php-format msgid "[$Projectname] Website SSL error for %s" msgstr "[$Projectname] Ошибка SSL/TLS веб-сайта для %s" -#: ../../boot.php:2436 +#: ../../boot.php:2440 msgid "Website SSL certificate is not valid. Please correct." msgstr "SSL/TLS сертификат веб-сайт недействителен. Исправьте это." -#: ../../boot.php:2552 +#: ../../boot.php:2556 #, php-format msgid "[$Projectname] Cron tasks not running on %s" msgstr "[$Projectname] Задания Cron не запущены на %s" -#: ../../boot.php:2557 +#: ../../boot.php:2561 msgid "Cron/Scheduled tasks not running." msgstr "Задания Cron / планировщика не запущены." @@ -4061,9 +4058,9 @@ msgstr "Общие" #: ../../Zotlabs/Storage/Browser.php:276 ../../Zotlabs/Storage/Browser.php:390 #: ../../Zotlabs/Module/Cdav.php:1230 ../../Zotlabs/Module/Profiles.php:798 #: ../../Zotlabs/Module/New_channel.php:189 ../../Zotlabs/Module/Menu.php:181 -#: ../../Zotlabs/Module/Webpages.php:254 ../../Zotlabs/Module/Connedit.php:927 -#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Articles.php:108 -#: ../../Zotlabs/Module/Cards.php:109 ../../Zotlabs/Module/Layouts.php:185 +#: ../../Zotlabs/Module/Webpages.php:254 ../../Zotlabs/Module/Connedit.php:938 +#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Articles.php:116 +#: ../../Zotlabs/Module/Cards.php:113 ../../Zotlabs/Module/Layouts.php:185 #: ../../Zotlabs/Widget/Cdav.php:128 ../../Zotlabs/Widget/Cdav.php:165 msgid "Create" msgstr "Создать" @@ -4081,7 +4078,7 @@ msgstr "Удалено администратором" #: ../../Zotlabs/Module/Sharedwithme.php:104 ../../Zotlabs/Module/Chat.php:259 #: ../../Zotlabs/Module/Oauth2.php:118 ../../Zotlabs/Module/Oauth2.php:146 #: ../../Zotlabs/Module/Admin/Channels.php:159 -#: ../../Zotlabs/Module/Connedit.php:912 ../../Zotlabs/Module/Group.php:144 +#: ../../Zotlabs/Module/Connedit.php:923 ../../Zotlabs/Module/Group.php:154 #: ../../Zotlabs/Module/Wiki.php:218 #: ../../Zotlabs/Widget/Wiki_page_history.php:22 #: ../../Zotlabs/Lib/NativeWikiPage.php:561 @@ -4122,7 +4119,7 @@ msgstr "Загрузить файл" #: ../../Zotlabs/Storage/Browser.php:392 ../../Zotlabs/Module/Photos.php:727 #: ../../Zotlabs/Module/Cover_photo.php:395 -#: ../../Zotlabs/Module/Embedphotos.php:158 +#: ../../Zotlabs/Module/Embedphotos.php:166 #: ../../Zotlabs/Module/Profile_photo.php:459 #: ../../Zotlabs/Widget/Portfolio.php:110 ../../Zotlabs/Widget/Cdav.php:133 #: ../../Zotlabs/Widget/Cdav.php:169 ../../Zotlabs/Widget/Album.php:97 @@ -4297,12 +4294,12 @@ msgstr "Приложение \"Разрешения по умолчанию\"" #: ../../Zotlabs/Module/Uexport.php:61 ../../Zotlabs/Module/Bookmarks.php:78 #: ../../Zotlabs/Module/Probe.php:18 ../../Zotlabs/Module/Tokens.php:99 #: ../../Zotlabs/Module/Notes.php:55 ../../Zotlabs/Module/Webpages.php:48 -#: ../../Zotlabs/Module/Group.php:101 ../../Zotlabs/Module/Mood.php:134 +#: ../../Zotlabs/Module/Group.php:106 ../../Zotlabs/Module/Mood.php:134 #: ../../Zotlabs/Module/Lang.php:17 ../../Zotlabs/Module/Randprof.php:29 -#: ../../Zotlabs/Module/Invite.php:110 ../../Zotlabs/Module/Articles.php:43 +#: ../../Zotlabs/Module/Invite.php:110 ../../Zotlabs/Module/Articles.php:51 #: ../../Zotlabs/Module/Connect.php:104 ../../Zotlabs/Module/Pdledit.php:42 #: ../../Zotlabs/Module/Wiki.php:52 ../../Zotlabs/Module/Suggest.php:40 -#: ../../Zotlabs/Module/Cards.php:46 +#: ../../Zotlabs/Module/Cards.php:51 msgid "Not Installed" msgstr "не установлено" @@ -4310,11 +4307,11 @@ msgstr "не установлено" msgid "Set custom default permissions for new connections" msgstr "Настройка пользовательских разрешений по умолчанию для новых подключений " -#: ../../Zotlabs/Module/Defperms.php:254 ../../Zotlabs/Module/Connedit.php:856 +#: ../../Zotlabs/Module/Defperms.php:254 ../../Zotlabs/Module/Connedit.php:867 msgid "Connection Default Permissions" msgstr "Разрешения по умолчанию для контакта" -#: ../../Zotlabs/Module/Defperms.php:255 ../../Zotlabs/Module/Connedit.php:857 +#: ../../Zotlabs/Module/Defperms.php:255 ../../Zotlabs/Module/Connedit.php:868 msgid "Apply these permissions automatically" msgstr "Применить эти разрешения автоматически" @@ -4324,15 +4321,15 @@ msgid "" "If enabled, connection requests will be approved without your interaction" msgstr "Если включено, запросы контактов будут одобрены без вашего участия" -#: ../../Zotlabs/Module/Defperms.php:256 ../../Zotlabs/Module/Connedit.php:858 +#: ../../Zotlabs/Module/Defperms.php:256 ../../Zotlabs/Module/Connedit.php:869 msgid "Permission role" msgstr "Роль разрешения" -#: ../../Zotlabs/Module/Defperms.php:257 ../../Zotlabs/Module/Connedit.php:859 +#: ../../Zotlabs/Module/Defperms.php:257 ../../Zotlabs/Module/Connedit.php:870 msgid "Add permission role" msgstr "Добавить роль разрешения" -#: ../../Zotlabs/Module/Defperms.php:261 ../../Zotlabs/Module/Connedit.php:872 +#: ../../Zotlabs/Module/Defperms.php:261 ../../Zotlabs/Module/Connedit.php:883 msgid "" "The permissions indicated on this page will be applied to all new " "connections." @@ -4343,17 +4340,17 @@ msgid "Automatic approval settings" msgstr "Настройки автоматического одобрения" #: ../../Zotlabs/Module/Defperms.php:264 ../../Zotlabs/Module/Permcats.php:123 -#: ../../Zotlabs/Module/Tokens.php:183 ../../Zotlabs/Module/Connedit.php:892 +#: ../../Zotlabs/Module/Tokens.php:183 ../../Zotlabs/Module/Connedit.php:903 msgid "inherited" msgstr "наследуется" #: ../../Zotlabs/Module/Defperms.php:266 ../../Zotlabs/Module/Permcats.php:121 -#: ../../Zotlabs/Module/Tokens.php:181 ../../Zotlabs/Module/Connedit.php:897 +#: ../../Zotlabs/Module/Tokens.php:181 ../../Zotlabs/Module/Connedit.php:908 msgid "My Settings" msgstr "Мои настройки" #: ../../Zotlabs/Module/Defperms.php:269 ../../Zotlabs/Module/Permcats.php:126 -#: ../../Zotlabs/Module/Tokens.php:186 ../../Zotlabs/Module/Connedit.php:899 +#: ../../Zotlabs/Module/Tokens.php:186 ../../Zotlabs/Module/Connedit.php:910 msgid "Individual Permissions" msgstr "Индивидуальные разрешения" @@ -4385,7 +4382,7 @@ msgid "" "connections." msgstr "Используйте эту форму для создания правил разрешений для различных групп людей и контактов." -#: ../../Zotlabs/Module/Permcats.php:112 ../../Zotlabs/Lib/Apps.php:350 +#: ../../Zotlabs/Module/Permcats.php:112 ../../Zotlabs/Lib/Apps.php:352 msgid "Permission Categories" msgstr "Категории разрешений" @@ -4394,7 +4391,7 @@ msgid "Permission category name" msgstr "Наименование категории разрешений" #: ../../Zotlabs/Module/Permcats.php:127 ../../Zotlabs/Module/Tokens.php:187 -#: ../../Zotlabs/Module/Connedit.php:900 +#: ../../Zotlabs/Module/Connedit.php:911 msgid "" "Some permissions may be inherited from your channel's privacy settings, which have higher priority than " @@ -4418,65 +4415,65 @@ msgstr "Не найдено." msgid "Invalid message" msgstr "Неверное сообщение" -#: ../../Zotlabs/Module/Dreport.php:89 +#: ../../Zotlabs/Module/Dreport.php:90 msgid "no results" msgstr "Ничего не найдено." -#: ../../Zotlabs/Module/Dreport.php:103 +#: ../../Zotlabs/Module/Dreport.php:104 msgid "channel sync processed" msgstr "синхронизация канала завершена" -#: ../../Zotlabs/Module/Dreport.php:107 +#: ../../Zotlabs/Module/Dreport.php:108 msgid "queued" msgstr "в очереди" -#: ../../Zotlabs/Module/Dreport.php:111 +#: ../../Zotlabs/Module/Dreport.php:112 msgid "posted" msgstr "опубликовано" -#: ../../Zotlabs/Module/Dreport.php:115 +#: ../../Zotlabs/Module/Dreport.php:116 msgid "accepted for delivery" msgstr "принято к доставке" -#: ../../Zotlabs/Module/Dreport.php:119 +#: ../../Zotlabs/Module/Dreport.php:120 msgid "updated" msgstr "обновлено" -#: ../../Zotlabs/Module/Dreport.php:122 +#: ../../Zotlabs/Module/Dreport.php:123 msgid "update ignored" msgstr "обновление игнорируется" -#: ../../Zotlabs/Module/Dreport.php:125 +#: ../../Zotlabs/Module/Dreport.php:126 msgid "permission denied" msgstr "доступ запрещен" -#: ../../Zotlabs/Module/Dreport.php:129 +#: ../../Zotlabs/Module/Dreport.php:130 msgid "recipient not found" msgstr "получатель не найден" -#: ../../Zotlabs/Module/Dreport.php:132 +#: ../../Zotlabs/Module/Dreport.php:133 msgid "mail recalled" msgstr "почта отозвана" -#: ../../Zotlabs/Module/Dreport.php:135 +#: ../../Zotlabs/Module/Dreport.php:136 msgid "duplicate mail received" msgstr "получено дублирующее сообщение" -#: ../../Zotlabs/Module/Dreport.php:138 +#: ../../Zotlabs/Module/Dreport.php:139 msgid "mail delivered" msgstr "почта доставлен" -#: ../../Zotlabs/Module/Dreport.php:158 +#: ../../Zotlabs/Module/Dreport.php:159 #, php-format msgid "Delivery report for %1$s" msgstr "Отчёт о доставке для %1$s" -#: ../../Zotlabs/Module/Dreport.php:161 ../../Zotlabs/Widget/Wiki_pages.php:41 +#: ../../Zotlabs/Module/Dreport.php:162 ../../Zotlabs/Widget/Wiki_pages.php:41 #: ../../Zotlabs/Widget/Wiki_pages.php:98 msgid "Options" msgstr "Параметры" -#: ../../Zotlabs/Module/Dreport.php:162 +#: ../../Zotlabs/Module/Dreport.php:163 msgid "Redeliver" msgstr "Доставить повторно" @@ -4484,29 +4481,29 @@ msgstr "Доставить повторно" msgid "No such group" msgstr "Нет такой группы" -#: ../../Zotlabs/Module/Network.php:149 +#: ../../Zotlabs/Module/Network.php:156 msgid "No such channel" msgstr "Нет такого канала" -#: ../../Zotlabs/Module/Network.php:164 ../../Zotlabs/Module/Channel.php:177 +#: ../../Zotlabs/Module/Network.php:171 ../../Zotlabs/Module/Channel.php:182 msgid "Search Results For:" msgstr "Результаты поиска для:" -#: ../../Zotlabs/Module/Network.php:194 ../../Zotlabs/Module/Display.php:80 -#: ../../Zotlabs/Module/Pubstream.php:94 ../../Zotlabs/Module/Channel.php:212 +#: ../../Zotlabs/Module/Network.php:201 ../../Zotlabs/Module/Display.php:80 +#: ../../Zotlabs/Module/Pubstream.php:94 ../../Zotlabs/Module/Channel.php:217 #: ../../Zotlabs/Module/Hq.php:134 msgid "Reset form" msgstr "Очистить форму" -#: ../../Zotlabs/Module/Network.php:233 +#: ../../Zotlabs/Module/Network.php:240 msgid "Privacy group is empty" msgstr "Группа безопасности пуста" -#: ../../Zotlabs/Module/Network.php:243 +#: ../../Zotlabs/Module/Network.php:250 msgid "Privacy group: " msgstr "Группа безопасности: " -#: ../../Zotlabs/Module/Network.php:316 +#: ../../Zotlabs/Module/Network.php:323 #: ../../extend/addon/hzaddons/redred/Mod_Redred.php:29 msgid "Invalid channel." msgstr "Недействительный канал." @@ -4597,16 +4594,16 @@ msgstr "Некоторые предложения о том, что делать msgid "Public access denied." msgstr "Публичный доступ запрещен." -#: ../../Zotlabs/Module/Display.php:374 ../../Zotlabs/Module/Channel.php:468 +#: ../../Zotlabs/Module/Display.php:374 ../../Zotlabs/Module/Channel.php:476 msgid "" "You must enable javascript for your browser to be able to view this content." msgstr "Для просмотра этого содержимого в вашем браузере должен быть включён JavaScript" -#: ../../Zotlabs/Module/Display.php:393 +#: ../../Zotlabs/Module/Display.php:392 msgid "Article" msgstr "Статья" -#: ../../Zotlabs/Module/Display.php:445 +#: ../../Zotlabs/Module/Display.php:444 msgid "Item has been removed." msgstr "Элемент был удалён." @@ -4614,35 +4611,35 @@ msgstr "Элемент был удалён." msgid "sent you a private message" msgstr "отправил вам личное сообщение" -#: ../../Zotlabs/Module/Ping.php:392 +#: ../../Zotlabs/Module/Ping.php:394 msgid "added your channel" msgstr "добавил ваш канал" -#: ../../Zotlabs/Module/Ping.php:417 +#: ../../Zotlabs/Module/Ping.php:419 msgid "requires approval" msgstr "Требуется подтверждение" -#: ../../Zotlabs/Module/Ping.php:427 +#: ../../Zotlabs/Module/Ping.php:429 msgid "g A l F d" msgstr "g A l F d" -#: ../../Zotlabs/Module/Ping.php:445 +#: ../../Zotlabs/Module/Ping.php:447 msgid "[today]" msgstr "[сегодня]" -#: ../../Zotlabs/Module/Ping.php:455 +#: ../../Zotlabs/Module/Ping.php:457 msgid "posted an event" msgstr "событие опубликовано" -#: ../../Zotlabs/Module/Ping.php:489 +#: ../../Zotlabs/Module/Ping.php:491 msgid "shared a file with you" msgstr "с вами поделились файлом" -#: ../../Zotlabs/Module/Ping.php:671 +#: ../../Zotlabs/Module/Ping.php:673 msgid "Private forum" msgstr "Частный форум" -#: ../../Zotlabs/Module/Ping.php:671 +#: ../../Zotlabs/Module/Ping.php:673 msgid "Public forum" msgstr "Публичный форум" @@ -4909,49 +4906,49 @@ msgstr "Удалить всё" msgid "Sorry! Editing of recurrent events is not yet implemented." msgstr "Простите, но редактирование повторяющихся событий пока не реализовано." -#: ../../Zotlabs/Module/Cdav.php:1216 ../../Zotlabs/Module/Connedit.php:913 +#: ../../Zotlabs/Module/Cdav.php:1216 ../../Zotlabs/Module/Connedit.php:924 msgid "Organisation" msgstr "Организация" -#: ../../Zotlabs/Module/Cdav.php:1217 ../../Zotlabs/Module/Connedit.php:914 +#: ../../Zotlabs/Module/Cdav.php:1217 ../../Zotlabs/Module/Connedit.php:925 msgid "Title" msgstr "Наименование" #: ../../Zotlabs/Module/Cdav.php:1218 ../../Zotlabs/Module/Profiles.php:786 -#: ../../Zotlabs/Module/Connedit.php:915 +#: ../../Zotlabs/Module/Connedit.php:926 msgid "Phone" msgstr "Телефон" #: ../../Zotlabs/Module/Cdav.php:1220 ../../Zotlabs/Module/Profiles.php:788 -#: ../../Zotlabs/Module/Connedit.php:917 +#: ../../Zotlabs/Module/Connedit.php:928 msgid "Instant messenger" msgstr "Мессенджер" #: ../../Zotlabs/Module/Cdav.php:1221 ../../Zotlabs/Module/Profiles.php:789 -#: ../../Zotlabs/Module/Connedit.php:918 +#: ../../Zotlabs/Module/Connedit.php:929 msgid "Website" msgstr "Веб-сайт" #: ../../Zotlabs/Module/Cdav.php:1222 ../../Zotlabs/Module/Profiles.php:502 #: ../../Zotlabs/Module/Profiles.php:790 ../../Zotlabs/Module/Locs.php:118 #: ../../Zotlabs/Module/Admin/Channels.php:160 -#: ../../Zotlabs/Module/Connedit.php:919 +#: ../../Zotlabs/Module/Connedit.php:930 msgid "Address" msgstr "Адрес" #: ../../Zotlabs/Module/Cdav.php:1223 ../../Zotlabs/Module/Profiles.php:791 -#: ../../Zotlabs/Module/Connedit.php:920 +#: ../../Zotlabs/Module/Connedit.php:931 msgid "Note" msgstr "Заметка" #: ../../Zotlabs/Module/Cdav.php:1228 ../../Zotlabs/Module/Profiles.php:796 -#: ../../Zotlabs/Module/Connedit.php:925 +#: ../../Zotlabs/Module/Connedit.php:936 #: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:368 msgid "Add Contact" msgstr "Добавить контакт" #: ../../Zotlabs/Module/Cdav.php:1229 ../../Zotlabs/Module/Profiles.php:797 -#: ../../Zotlabs/Module/Connedit.php:926 +#: ../../Zotlabs/Module/Connedit.php:937 msgid "Add Field" msgstr "Добавить поле" @@ -4959,36 +4956,36 @@ msgstr "Добавить поле" #: ../../Zotlabs/Module/Oauth.php:53 ../../Zotlabs/Module/Oauth.php:137 #: ../../Zotlabs/Module/Oauth2.php:58 ../../Zotlabs/Module/Oauth2.php:144 #: ../../Zotlabs/Module/Admin/Addons.php:453 -#: ../../Zotlabs/Module/Connedit.php:928 ../../Zotlabs/Lib/Apps.php:513 +#: ../../Zotlabs/Module/Connedit.php:939 ../../Zotlabs/Lib/Apps.php:515 msgid "Update" msgstr "Обновить" -#: ../../Zotlabs/Module/Cdav.php:1234 ../../Zotlabs/Module/Connedit.php:931 +#: ../../Zotlabs/Module/Cdav.php:1234 ../../Zotlabs/Module/Connedit.php:942 msgid "P.O. Box" msgstr "абонентский ящик" -#: ../../Zotlabs/Module/Cdav.php:1235 ../../Zotlabs/Module/Connedit.php:932 +#: ../../Zotlabs/Module/Cdav.php:1235 ../../Zotlabs/Module/Connedit.php:943 msgid "Additional" msgstr "Дополнительно" -#: ../../Zotlabs/Module/Cdav.php:1236 ../../Zotlabs/Module/Connedit.php:933 +#: ../../Zotlabs/Module/Cdav.php:1236 ../../Zotlabs/Module/Connedit.php:944 msgid "Street" msgstr "Улица" -#: ../../Zotlabs/Module/Cdav.php:1237 ../../Zotlabs/Module/Connedit.php:934 +#: ../../Zotlabs/Module/Cdav.php:1237 ../../Zotlabs/Module/Connedit.php:945 msgid "Locality" msgstr "Населённый пункт" -#: ../../Zotlabs/Module/Cdav.php:1238 ../../Zotlabs/Module/Connedit.php:935 +#: ../../Zotlabs/Module/Cdav.php:1238 ../../Zotlabs/Module/Connedit.php:946 msgid "Region" msgstr "Регион" -#: ../../Zotlabs/Module/Cdav.php:1239 ../../Zotlabs/Module/Connedit.php:936 +#: ../../Zotlabs/Module/Cdav.php:1239 ../../Zotlabs/Module/Connedit.php:947 msgid "ZIP Code" msgstr "Индекс" #: ../../Zotlabs/Module/Cdav.php:1240 ../../Zotlabs/Module/Profiles.php:757 -#: ../../Zotlabs/Module/Connedit.php:937 +#: ../../Zotlabs/Module/Connedit.php:948 msgid "Country" msgstr "Страна" @@ -5542,18 +5539,18 @@ msgstr "Показать новые первыми" msgid "Show Oldest First" msgstr "Показать старые первыми" -#: ../../Zotlabs/Module/Photos.php:826 ../../Zotlabs/Module/Photos.php:1365 -#: ../../Zotlabs/Module/Embedphotos.php:140 +#: ../../Zotlabs/Module/Photos.php:826 ../../Zotlabs/Module/Photos.php:1374 +#: ../../Zotlabs/Module/Embedphotos.php:148 #: ../../Zotlabs/Widget/Portfolio.php:87 ../../Zotlabs/Widget/Album.php:78 msgid "View Photo" msgstr "Посмотреть фотографию" -#: ../../Zotlabs/Module/Photos.php:857 ../../Zotlabs/Module/Embedphotos.php:156 +#: ../../Zotlabs/Module/Photos.php:857 ../../Zotlabs/Module/Embedphotos.php:164 #: ../../Zotlabs/Widget/Portfolio.php:108 ../../Zotlabs/Widget/Album.php:95 msgid "Edit Album" msgstr "Редактировать Фотоальбом" -#: ../../Zotlabs/Module/Photos.php:859 ../../Zotlabs/Module/Photos.php:1396 +#: ../../Zotlabs/Module/Photos.php:859 ../../Zotlabs/Module/Photos.php:1405 msgid "Add Photos" msgstr "Добавить фотографии" @@ -5631,34 +5628,34 @@ msgstr "мне это нравится (переключение)" msgid "I don't like this (toggle)" msgstr "мне это не нравится (переключение)" -#: ../../Zotlabs/Module/Photos.php:1134 ../../Zotlabs/Module/Photos.php:1252 +#: ../../Zotlabs/Module/Photos.php:1135 ../../Zotlabs/Module/Photos.php:1254 #: ../../Zotlabs/Lib/ThreadItem.php:770 msgid "This is you" msgstr "Это вы" -#: ../../Zotlabs/Module/Photos.php:1171 ../../Zotlabs/Module/Photos.php:1183 +#: ../../Zotlabs/Module/Photos.php:1173 ../../Zotlabs/Module/Photos.php:1185 #: ../../Zotlabs/Lib/ThreadItem.php:217 ../../Zotlabs/Lib/ThreadItem.php:229 msgid "View all" msgstr "Просмотреть все" -#: ../../Zotlabs/Module/Photos.php:1280 +#: ../../Zotlabs/Module/Photos.php:1288 msgid "Photo Tools" msgstr "Фото-Инструменты" -#: ../../Zotlabs/Module/Photos.php:1289 +#: ../../Zotlabs/Module/Photos.php:1297 msgid "In This Photo:" msgstr "На этой фотографии:" -#: ../../Zotlabs/Module/Photos.php:1294 +#: ../../Zotlabs/Module/Photos.php:1302 msgid "Map" msgstr "Карта" -#: ../../Zotlabs/Module/Photos.php:1302 ../../Zotlabs/Lib/ThreadItem.php:435 +#: ../../Zotlabs/Module/Photos.php:1310 ../../Zotlabs/Lib/ThreadItem.php:435 msgctxt "noun" msgid "Likes" msgstr "Нравится" -#: ../../Zotlabs/Module/Photos.php:1303 ../../Zotlabs/Lib/ThreadItem.php:436 +#: ../../Zotlabs/Module/Photos.php:1311 ../../Zotlabs/Lib/ThreadItem.php:436 msgctxt "noun" msgid "Dislikes" msgstr "Не нравится" @@ -6025,7 +6022,7 @@ msgid "The unmoderated public stream of this hub" msgstr "Немодерируемый публичный поток с этого хаба" #: ../../Zotlabs/Module/Pubstream.php:109 -#: ../../Zotlabs/Widget/Notifications.php:142 ../../Zotlabs/Lib/Apps.php:352 +#: ../../Zotlabs/Widget/Notifications.php:142 ../../Zotlabs/Lib/Apps.php:354 msgid "Public Stream" msgstr "Публичный поток" @@ -6319,21 +6316,21 @@ msgid "" "check your email for further instructions." msgstr "Этот сайт требует проверку адреса электронной почты. После заполнения этой формы, пожалуйста, проверьте ваш почтовый ящик для дальнейших инструкций." -#: ../../Zotlabs/Module/Apporder.php:44 +#: ../../Zotlabs/Module/Apporder.php:47 msgid "Change Order of Pinned Navbar Apps" msgstr "Изменить порядок приложений на панели навигации" -#: ../../Zotlabs/Module/Apporder.php:44 +#: ../../Zotlabs/Module/Apporder.php:47 msgid "Change Order of App Tray Apps" msgstr "Изменить порядок приложений в лотке" -#: ../../Zotlabs/Module/Apporder.php:45 +#: ../../Zotlabs/Module/Apporder.php:48 msgid "" "Use arrows to move the corresponding app left (top) or right (bottom) in the " "navbar" msgstr "Используйте стрелки для перемещения приложения влево (вверх) или вправо (вниз) в панели навигации" -#: ../../Zotlabs/Module/Apporder.php:45 +#: ../../Zotlabs/Module/Apporder.php:48 msgid "Use arrows to move the corresponding app up or down in the app tray" msgstr "Используйте стрелки для перемещения приложения вверх или вниз в лотке" @@ -6341,7 +6338,7 @@ msgstr "Используйте стрелки для перемещения пр msgid "Documentation Search" msgstr "Поиск документации" -#: ../../Zotlabs/Module/Help.php:81 ../../Zotlabs/Module/Group.php:145 +#: ../../Zotlabs/Module/Help.php:81 ../../Zotlabs/Module/Group.php:155 msgid "Members" msgstr "Участники" @@ -6475,7 +6472,7 @@ msgstr "Автоматический импорт контента из друг msgid "*" msgstr "" -#: ../../Zotlabs/Module/Sources.php:107 ../../Zotlabs/Lib/Apps.php:344 +#: ../../Zotlabs/Module/Sources.php:107 ../../Zotlabs/Lib/Apps.php:346 msgid "Channel Sources" msgstr "Источники канала" @@ -6870,39 +6867,47 @@ msgstr "Настройки фотографий" msgid "Profiles Settings" msgstr "Настройки профилей" -#: ../../Zotlabs/Module/Settings/Featured.php:23 +#: ../../Zotlabs/Module/Settings/Featured.php:27 msgid "Affinity Slider settings updated." msgstr "Обновлены настройки слайдера cходства." -#: ../../Zotlabs/Module/Settings/Featured.php:38 +#: ../../Zotlabs/Module/Settings/Featured.php:42 msgid "No feature settings configured" msgstr "Параметры функций не настроены" -#: ../../Zotlabs/Module/Settings/Featured.php:45 +#: ../../Zotlabs/Module/Settings/Featured.php:49 msgid "Default maximum affinity level" msgstr "Максимальный уровень сходства по умолчанию." -#: ../../Zotlabs/Module/Settings/Featured.php:45 +#: ../../Zotlabs/Module/Settings/Featured.php:49 msgid "0-99 default 99" msgstr "0-99 (по умолчанию 99)" -#: ../../Zotlabs/Module/Settings/Featured.php:50 +#: ../../Zotlabs/Module/Settings/Featured.php:54 msgid "Default minimum affinity level" msgstr "Минимальный уровень сходства по умолчанию." -#: ../../Zotlabs/Module/Settings/Featured.php:50 +#: ../../Zotlabs/Module/Settings/Featured.php:54 msgid "0-99 - default 0" msgstr "0-99 (по умолчанию 0)" -#: ../../Zotlabs/Module/Settings/Featured.php:54 +#: ../../Zotlabs/Module/Settings/Featured.php:58 +msgid "Always reset on new page visit." +msgstr "Всегда сбрасывать при посещении новой страницы." + +#: ../../Zotlabs/Module/Settings/Featured.php:58 +msgid "default: yes" +msgstr "по-умолчанию: да" + +#: ../../Zotlabs/Module/Settings/Featured.php:62 msgid "Affinity Slider Settings" msgstr "Настройки слайдера сходства" -#: ../../Zotlabs/Module/Settings/Featured.php:67 +#: ../../Zotlabs/Module/Settings/Featured.php:75 msgid "Addon Settings" msgstr "Настройки расширений" -#: ../../Zotlabs/Module/Settings/Featured.php:68 +#: ../../Zotlabs/Module/Settings/Featured.php:76 msgid "Please save/submit changes to any panel before opening another." msgstr "Пожалуйста сохраните / отправьте изменения на панели прежде чем открывать другую." @@ -7395,7 +7400,7 @@ msgstr "Редактировать блок" msgid "No service class restrictions found." msgstr "Ограничений класса обслуживание не найдено." -#: ../../Zotlabs/Module/Channel.php:160 +#: ../../Zotlabs/Module/Channel.php:165 msgid "Insufficient permissions. Request redirected to profile page." msgstr "Недостаточно прав. Запрос перенаправлен на страницу профиля." @@ -7473,75 +7478,75 @@ msgstr "Нет на месте" msgid "Online" msgstr "В сети" -#: ../../Zotlabs/Module/Like.php:54 +#: ../../Zotlabs/Module/Like.php:56 msgid "Like/Dislike" msgstr "Нравится / не нравится" -#: ../../Zotlabs/Module/Like.php:59 +#: ../../Zotlabs/Module/Like.php:61 msgid "This action is restricted to members." msgstr "Это действие доступно только участникам." -#: ../../Zotlabs/Module/Like.php:60 +#: ../../Zotlabs/Module/Like.php:62 msgid "" "Please login with your $Projectname ID or register as a new $Projectname member to continue." msgstr "Пожалуйста, для продолжения войдите с вашим $Projectname ID или зарегистрируйтесь как новый участник $Projectname." -#: ../../Zotlabs/Module/Like.php:109 ../../Zotlabs/Module/Like.php:135 -#: ../../Zotlabs/Module/Like.php:173 +#: ../../Zotlabs/Module/Like.php:111 ../../Zotlabs/Module/Like.php:137 +#: ../../Zotlabs/Module/Like.php:175 msgid "Invalid request." msgstr "Неверный запрос." -#: ../../Zotlabs/Module/Like.php:150 +#: ../../Zotlabs/Module/Like.php:152 msgid "thing" msgstr "предмет" -#: ../../Zotlabs/Module/Like.php:196 +#: ../../Zotlabs/Module/Like.php:198 msgid "Channel unavailable." msgstr "Канал недоступен." -#: ../../Zotlabs/Module/Like.php:244 +#: ../../Zotlabs/Module/Like.php:246 msgid "Previous action reversed." msgstr "Предыдущее действие отменено." -#: ../../Zotlabs/Module/Like.php:445 +#: ../../Zotlabs/Module/Like.php:451 #, php-format msgid "%1$s agrees with %2$s's %3$s" msgstr "%1$s согласен с %2$s %3$s" -#: ../../Zotlabs/Module/Like.php:447 +#: ../../Zotlabs/Module/Like.php:453 #, php-format msgid "%1$s doesn't agree with %2$s's %3$s" msgstr "%1$s не согласен с %2$s %3$s" -#: ../../Zotlabs/Module/Like.php:449 +#: ../../Zotlabs/Module/Like.php:455 #, php-format msgid "%1$s abstains from a decision on %2$s's %3$s" msgstr "%1$s воздерживается от решения по %2$s%3$s" -#: ../../Zotlabs/Module/Like.php:451 -#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2120 +#: ../../Zotlabs/Module/Like.php:457 +#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2133 #, php-format msgid "%1$s is attending %2$s's %3$s" msgstr "%1$s посещает %2$s%3$s" -#: ../../Zotlabs/Module/Like.php:453 -#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2122 +#: ../../Zotlabs/Module/Like.php:459 +#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2135 #, php-format msgid "%1$s is not attending %2$s's %3$s" msgstr "%1$s не посещает %2$s%3$s" -#: ../../Zotlabs/Module/Like.php:455 -#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2124 +#: ../../Zotlabs/Module/Like.php:461 +#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2137 #, php-format msgid "%1$s may attend %2$s's %3$s" msgstr "%1$s может посетить %2$s%3$s" -#: ../../Zotlabs/Module/Like.php:566 +#: ../../Zotlabs/Module/Like.php:572 msgid "Action completed." msgstr "Действие завершено." -#: ../../Zotlabs/Module/Like.php:567 +#: ../../Zotlabs/Module/Like.php:573 msgid "Thank you." msgstr "Спасибо." @@ -7800,7 +7805,7 @@ msgid "" msgstr "Вам может понадобится импортировать файл \"install/schema_xxx.sql\" вручную используя клиент базы данных." #: ../../Zotlabs/Module/Setup.php:198 ../../Zotlabs/Module/Setup.php:262 -#: ../../Zotlabs/Module/Setup.php:756 +#: ../../Zotlabs/Module/Setup.php:761 msgid "Please see the file \"install/INSTALL.txt\"." msgstr "Пожалуйста, обратитесь к файлу \"install/INSTALL.txt\"." @@ -7944,229 +7949,235 @@ msgstr "Это необходимо для функционирования до msgid "PHP register_argc_argv" msgstr "" -#: ../../Zotlabs/Module/Setup.php:446 +#: ../../Zotlabs/Module/Setup.php:448 +msgid "" +"This is not sufficient to upload larger images or files. You should be able " +"to upload at least 4 MB at once." +msgstr "Этого недостаточно для загрузки больших изображений или файлов. Вы должны иметь возможность загрузить как минимум 4 Мб за раз." + +#: ../../Zotlabs/Module/Setup.php:450 #, php-format msgid "" "Your max allowed total upload size is set to %s. Maximum size of one file to " "upload is set to %s. You are allowed to upload up to %d files at once." msgstr "Максимально разрешённый общий размер загрузок установлен в %s. Максимальный размер одной загрузки установлен в %s. Вам разрешено загружать до %d файлов за один приём." -#: ../../Zotlabs/Module/Setup.php:451 +#: ../../Zotlabs/Module/Setup.php:456 msgid "You can adjust these settings in the server php.ini file." msgstr "Вы можете изменить эти настройки в файле php.ini на сервере." -#: ../../Zotlabs/Module/Setup.php:453 +#: ../../Zotlabs/Module/Setup.php:458 msgid "PHP upload limits" msgstr "Максимальный размер загрузки в PHP" -#: ../../Zotlabs/Module/Setup.php:476 +#: ../../Zotlabs/Module/Setup.php:481 msgid "" "Error: the \"openssl_pkey_new\" function on this system is not able to " "generate encryption keys" msgstr "Ошибка: функция \"openssl_pkey_new\" не может сгенерировать ключи шифрования" -#: ../../Zotlabs/Module/Setup.php:477 +#: ../../Zotlabs/Module/Setup.php:482 msgid "" "If running under Windows, please see \"http://www.php.net/manual/en/openssl." "installation.php\"." msgstr "Если работаете под Windows, см. \"http://www.php.net/manual/en/openssl.installation.php\"." -#: ../../Zotlabs/Module/Setup.php:480 +#: ../../Zotlabs/Module/Setup.php:485 msgid "Generate encryption keys" msgstr "Генерация ключей шифрования" -#: ../../Zotlabs/Module/Setup.php:497 +#: ../../Zotlabs/Module/Setup.php:502 msgid "libCurl PHP module" msgstr "модуль PHP libcURL" -#: ../../Zotlabs/Module/Setup.php:498 +#: ../../Zotlabs/Module/Setup.php:503 msgid "GD graphics PHP module" msgstr "модуль графики PHP GD" -#: ../../Zotlabs/Module/Setup.php:499 +#: ../../Zotlabs/Module/Setup.php:504 msgid "OpenSSL PHP module" msgstr "модуль PHP OpenSSL" -#: ../../Zotlabs/Module/Setup.php:500 +#: ../../Zotlabs/Module/Setup.php:505 msgid "PDO database PHP module" msgstr "модуль баз данных PHP PDO" -#: ../../Zotlabs/Module/Setup.php:501 +#: ../../Zotlabs/Module/Setup.php:506 msgid "mb_string PHP module" msgstr "модуль PHP mb_string" -#: ../../Zotlabs/Module/Setup.php:502 +#: ../../Zotlabs/Module/Setup.php:507 msgid "xml PHP module" msgstr "модуль PHP xml" -#: ../../Zotlabs/Module/Setup.php:503 +#: ../../Zotlabs/Module/Setup.php:508 msgid "zip PHP module" msgstr "модуль PHP zip" -#: ../../Zotlabs/Module/Setup.php:507 ../../Zotlabs/Module/Setup.php:509 +#: ../../Zotlabs/Module/Setup.php:512 ../../Zotlabs/Module/Setup.php:514 msgid "Apache mod_rewrite module" msgstr "модуль Apache mod_rewrite" -#: ../../Zotlabs/Module/Setup.php:507 +#: ../../Zotlabs/Module/Setup.php:512 msgid "" "Error: Apache webserver mod-rewrite module is required but not installed." msgstr "Ошибка: требуемый модуль mod_rewrite веб-сервера Apache не установлен." -#: ../../Zotlabs/Module/Setup.php:513 ../../Zotlabs/Module/Setup.php:516 +#: ../../Zotlabs/Module/Setup.php:518 ../../Zotlabs/Module/Setup.php:521 msgid "exec" msgstr "" -#: ../../Zotlabs/Module/Setup.php:513 +#: ../../Zotlabs/Module/Setup.php:518 msgid "" "Error: exec is required but is either not installed or has been disabled in " "php.ini" msgstr "Ошибка: exec требуется, однако не установлен или был отключён в php.ini" -#: ../../Zotlabs/Module/Setup.php:519 ../../Zotlabs/Module/Setup.php:522 +#: ../../Zotlabs/Module/Setup.php:524 ../../Zotlabs/Module/Setup.php:527 msgid "shell_exec" msgstr "" -#: ../../Zotlabs/Module/Setup.php:519 +#: ../../Zotlabs/Module/Setup.php:524 msgid "" "Error: shell_exec is required but is either not installed or has been " "disabled in php.ini" msgstr "Ошибка: shell_exec требуется, однако не установлен или был отключён в php.ini" -#: ../../Zotlabs/Module/Setup.php:527 +#: ../../Zotlabs/Module/Setup.php:532 msgid "Error: libCURL PHP module required but not installed." msgstr "Ошибка: модуль PHP libсURL требуется, однако не установлен" -#: ../../Zotlabs/Module/Setup.php:531 +#: ../../Zotlabs/Module/Setup.php:536 msgid "" "Error: GD PHP module with JPEG support or ImageMagick graphics library " "required but not installed." msgstr "Ошибка: модуль PHP GD с поддержкой JPEG или графическая библиотека ImageMagick требуется, однако не установлена" -#: ../../Zotlabs/Module/Setup.php:535 +#: ../../Zotlabs/Module/Setup.php:540 msgid "Error: openssl PHP module required but not installed." msgstr "Ошибка: модуль PHP OpenSSL требуется, однако не установлен" -#: ../../Zotlabs/Module/Setup.php:541 +#: ../../Zotlabs/Module/Setup.php:546 msgid "" "Error: PDO database PHP module missing a driver for either mysql or pgsql." msgstr "Ошибка: отсутствует драйвер MySQL или PgSQL в модуле баз данных PHP PDO" -#: ../../Zotlabs/Module/Setup.php:546 +#: ../../Zotlabs/Module/Setup.php:551 msgid "Error: PDO database PHP module required but not installed." msgstr "Ошибка: модуль баз данных PHP PDO требуется, однако не установлен" -#: ../../Zotlabs/Module/Setup.php:550 +#: ../../Zotlabs/Module/Setup.php:555 msgid "Error: mb_string PHP module required but not installed." msgstr "Ошибка: модуль PHP mb_string требуется, однако не установлен" -#: ../../Zotlabs/Module/Setup.php:554 +#: ../../Zotlabs/Module/Setup.php:559 msgid "Error: xml PHP module required for DAV but not installed." msgstr "Ошибка: модуль PHP xml требуется для DAV, однако не установлен" -#: ../../Zotlabs/Module/Setup.php:558 +#: ../../Zotlabs/Module/Setup.php:563 msgid "Error: zip PHP module required but not installed." msgstr "Ошибка: модуль PHP zip требуется, однако не установлен" -#: ../../Zotlabs/Module/Setup.php:577 ../../Zotlabs/Module/Setup.php:586 +#: ../../Zotlabs/Module/Setup.php:582 ../../Zotlabs/Module/Setup.php:591 msgid ".htconfig.php is writable" msgstr ".htconfig.php доступен для записи" -#: ../../Zotlabs/Module/Setup.php:582 +#: ../../Zotlabs/Module/Setup.php:587 msgid "" "The web installer needs to be able to create a file called \".htconfig.php\" " "in the top folder of your web server and it is unable to do so." msgstr "Инсталлятор требует возможности создать файл с именем \".htconfig.php\" в корневом каталоге вашего веб-сервера но не может этого сделать." -#: ../../Zotlabs/Module/Setup.php:583 +#: ../../Zotlabs/Module/Setup.php:588 msgid "" "This is most often a permission setting, as the web server may not be able " "to write files in your folder - even if you can." msgstr "В большинстве случаев это проблема прав доступа. Веб-сервер может не иметь возможности записывать файлы в этот каталог даже если вы можете это делать." -#: ../../Zotlabs/Module/Setup.php:584 +#: ../../Zotlabs/Module/Setup.php:589 msgid "Please see install/INSTALL.txt for additional information." msgstr "Пожалуйста, ознакомьтесь с install/INSTALL.txt для дополнительных сведений." -#: ../../Zotlabs/Module/Setup.php:600 +#: ../../Zotlabs/Module/Setup.php:605 msgid "" "This software uses the Smarty3 template engine to render its web views. " "Smarty3 compiles templates to PHP to speed up rendering." msgstr "Это программное обеспечение использует шаблонизатор Smarty3 для отображения своих веб-страниц. Smarty3 компилирует шаблоны для PHP для ускорения рендеринга." -#: ../../Zotlabs/Module/Setup.php:601 +#: ../../Zotlabs/Module/Setup.php:606 #, php-format msgid "" "In order to store these compiled templates, the web server needs to have " "write access to the directory %s under the top level web folder." msgstr "Для хранения этих скомпилированных шаблонов веб-сервер должен иметь доступ на запись к каталогу %s в каталоге верхнего уровня." -#: ../../Zotlabs/Module/Setup.php:602 ../../Zotlabs/Module/Setup.php:623 +#: ../../Zotlabs/Module/Setup.php:607 ../../Zotlabs/Module/Setup.php:628 msgid "" "Please ensure that the user that your web server runs as (e.g. www-data) has " "write access to this folder." msgstr "Убедитесь, что пользователь от имени которого работает ваш веб-сервер (например, www-data), имеет доступ на запись в этот каталог." -#: ../../Zotlabs/Module/Setup.php:603 +#: ../../Zotlabs/Module/Setup.php:608 #, php-format msgid "" "Note: as a security measure, you should give the web server write access to " "%s only--not the template files (.tpl) that it contains." msgstr "Примечание. В качестве меры безопасности вы должны предоставить доступ веб-серверу для записи только к %s но не к содержащимися в нём файлами шаблонов (.tpl)." -#: ../../Zotlabs/Module/Setup.php:606 +#: ../../Zotlabs/Module/Setup.php:611 #, php-format msgid "%s is writable" msgstr "%s доступен для записи" -#: ../../Zotlabs/Module/Setup.php:622 +#: ../../Zotlabs/Module/Setup.php:627 msgid "" "This software uses the store directory to save uploaded files. The web " "server needs to have write access to the store directory under the top level " "web folder" msgstr "Эта программа использует каталог хранения для загруженных файлов. Для веб-сервера требуется доступ на запись начиная с верхнего уровня каталога хранения." -#: ../../Zotlabs/Module/Setup.php:626 +#: ../../Zotlabs/Module/Setup.php:631 msgid "store is writable" msgstr "хранилище доступно для записи" -#: ../../Zotlabs/Module/Setup.php:658 +#: ../../Zotlabs/Module/Setup.php:663 msgid "" "SSL certificate cannot be validated. Fix certificate or disable https access " "to this site." msgstr "SSL certificate cannot be validated. Замените его или отключите https доступ к этому сайту." -#: ../../Zotlabs/Module/Setup.php:659 +#: ../../Zotlabs/Module/Setup.php:664 msgid "" "If you have https access to your website or allow connections to TCP port " "443 (the https: port), you MUST use a browser-valid certificate. You MUST " "NOT use self-signed certificates!" msgstr "Если у вас есть https-доступ к вашему сайту или разрешено подключение к TCP-порту 443 (порт https), вы ДОЛЖНЫ использовать сертификат, действительный для браузера. Вы НЕ ДОЛЖНЫ использовать самоподписанные сертификаты!" -#: ../../Zotlabs/Module/Setup.php:660 +#: ../../Zotlabs/Module/Setup.php:665 msgid "" "This restriction is incorporated because public posts from you may for " "example contain references to images on your own hub." msgstr "Эти ограничения приняты поскольку ваши общедоступные публикации могут, например, содержать ссылки на изображения на вашем собственном хабе." -#: ../../Zotlabs/Module/Setup.php:661 +#: ../../Zotlabs/Module/Setup.php:666 msgid "" "If your certificate is not recognized, members of other sites (who may " "themselves have valid certificates) will get a warning message on their own " "site complaining about security issues." msgstr "Если ваш сертификат не признан, пользователи других сайтов (которые могут сами иметь действительные сертификаты) получат предупреждающее сообщение о проблемах с безопасностью." -#: ../../Zotlabs/Module/Setup.php:662 +#: ../../Zotlabs/Module/Setup.php:667 msgid "" "This can cause usability issues elsewhere (not just on your own site) so we " "must insist on this requirement." msgstr "Это может привести к проблемам удобства использования из других мест (не только на вашем собственном сайте), поэтому мы настаиваем на этом требовании." -#: ../../Zotlabs/Module/Setup.php:663 +#: ../../Zotlabs/Module/Setup.php:668 msgid "" "Providers are available that issue free certificates which are browser-valid." msgstr "Доступны поставщики, которые выдают действительные для браузера бесплатные сертификаты." -#: ../../Zotlabs/Module/Setup.php:665 +#: ../../Zotlabs/Module/Setup.php:670 msgid "" "If you are confident that the certificate is valid and signed by a trusted " "authority, check to see if you have failed to install an intermediate cert. " @@ -8174,37 +8185,37 @@ msgid "" "server communications." msgstr "Если вы уверены, что сертификат действителен и подписан доверенным органом, проверьте, установлен ли промежуточные сертификаты. Обычно они не требуются браузерами, но бывают необходимы для связи между серверами." -#: ../../Zotlabs/Module/Setup.php:667 +#: ../../Zotlabs/Module/Setup.php:672 msgid "SSL certificate validation" msgstr "Проверка SSL сертификата" -#: ../../Zotlabs/Module/Setup.php:673 +#: ../../Zotlabs/Module/Setup.php:678 msgid "" "Url rewrite in .htaccess is not working. Check your server configuration." "Test: " msgstr "Перезапись URL в .htaccess не работает. Проверьте настройки вашего сервера." -#: ../../Zotlabs/Module/Setup.php:676 +#: ../../Zotlabs/Module/Setup.php:681 msgid "Url rewrite is working" msgstr "Перезапись URL работает" -#: ../../Zotlabs/Module/Setup.php:690 +#: ../../Zotlabs/Module/Setup.php:695 msgid "" "The database configuration file \".htconfig.php\" could not be written. " "Please use the enclosed text to create a configuration file in your web " "server root." msgstr "Файл конфигурации базы данных \".htconfig.php\" не может быть записан. Используйте прилагаемый текст для создания файла конфигурации в корневом каталоге веб-сервера." -#: ../../Zotlabs/Module/Setup.php:714 +#: ../../Zotlabs/Module/Setup.php:719 #: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:401 msgid "Errors encountered creating database tables." msgstr "При создании базы данных возникли ошибки." -#: ../../Zotlabs/Module/Setup.php:754 +#: ../../Zotlabs/Module/Setup.php:759 msgid "

What next?

" msgstr "

Что дальше?

" -#: ../../Zotlabs/Module/Setup.php:755 +#: ../../Zotlabs/Module/Setup.php:760 msgid "" "IMPORTANT: You will need to [manually] setup a scheduled task for the poller." msgstr "Вам понадобится [вручную] настроить запланированную задачу для опрашивателя." @@ -8664,7 +8675,7 @@ msgstr "Загрузить репозиторий расширений" msgid "Install new repo" msgstr "Установить новый репозиторий" -#: ../../Zotlabs/Module/Admin/Addons.php:422 ../../Zotlabs/Lib/Apps.php:513 +#: ../../Zotlabs/Module/Admin/Addons.php:422 ../../Zotlabs/Lib/Apps.php:515 msgid "Install" msgstr "Установить" @@ -8938,7 +8949,7 @@ msgstr "Импортировать только публичные потоки #: ../../Zotlabs/Module/Admin/Site.php:323 #: ../../Zotlabs/Module/Admin/Site.php:324 -#: ../../Zotlabs/Module/Connedit.php:881 ../../Zotlabs/Module/Connedit.php:882 +#: ../../Zotlabs/Module/Connedit.php:892 ../../Zotlabs/Module/Connedit.php:893 msgid "" "words one per line or #tags or /patterns/ or lang=xx, leave blank to import " "all posts" @@ -9283,12 +9294,12 @@ msgid "No registrations." msgstr "Нет новых регистраций." #: ../../Zotlabs/Module/Admin/Accounts.php:176 -#: ../../Zotlabs/Module/Connedit.php:628 +#: ../../Zotlabs/Module/Connedit.php:636 msgid "Block" msgstr "Блокировать" #: ../../Zotlabs/Module/Admin/Accounts.php:177 -#: ../../Zotlabs/Module/Connedit.php:628 +#: ../../Zotlabs/Module/Connedit.php:636 msgid "Unblock" msgstr "Разблокировать" @@ -9452,7 +9463,7 @@ msgstr "Пароль" msgid "Expires (yyyy-mm-dd)" msgstr "Срок действия (yyyy-mm-dd)" -#: ../../Zotlabs/Module/Tokens.php:180 ../../Zotlabs/Module/Connedit.php:896 +#: ../../Zotlabs/Module/Tokens.php:180 ../../Zotlabs/Module/Connedit.php:907 msgid "Their Settings" msgstr "Их настройки" @@ -9696,268 +9707,268 @@ msgstr "Контакт добавлен." msgid "Item is not editable" msgstr "Элемент нельзя редактировать" -#: ../../Zotlabs/Module/Connedit.php:111 +#: ../../Zotlabs/Module/Connedit.php:112 msgid "Could not locate selected profile." msgstr "Не удалось обнаружить выбранный профиль." -#: ../../Zotlabs/Module/Connedit.php:248 +#: ../../Zotlabs/Module/Connedit.php:256 msgid "Connection updated." msgstr "Контакты обновлены." -#: ../../Zotlabs/Module/Connedit.php:250 +#: ../../Zotlabs/Module/Connedit.php:258 msgid "Failed to update connection record." msgstr "Не удалось обновить запись контакта." -#: ../../Zotlabs/Module/Connedit.php:304 +#: ../../Zotlabs/Module/Connedit.php:312 msgid "is now connected to" msgstr "теперь подключён к" -#: ../../Zotlabs/Module/Connedit.php:429 +#: ../../Zotlabs/Module/Connedit.php:437 msgid "Could not access address book record." msgstr "Не удалось получить доступ к записи адресной книги." -#: ../../Zotlabs/Module/Connedit.php:477 ../../Zotlabs/Module/Connedit.php:481 +#: ../../Zotlabs/Module/Connedit.php:485 ../../Zotlabs/Module/Connedit.php:489 msgid "Refresh failed - channel is currently unavailable." msgstr "Обновление невозможно - в настоящее время канал недоступен." -#: ../../Zotlabs/Module/Connedit.php:496 ../../Zotlabs/Module/Connedit.php:505 -#: ../../Zotlabs/Module/Connedit.php:514 ../../Zotlabs/Module/Connedit.php:523 -#: ../../Zotlabs/Module/Connedit.php:536 +#: ../../Zotlabs/Module/Connedit.php:504 ../../Zotlabs/Module/Connedit.php:513 +#: ../../Zotlabs/Module/Connedit.php:522 ../../Zotlabs/Module/Connedit.php:531 +#: ../../Zotlabs/Module/Connedit.php:544 msgid "Unable to set address book parameters." msgstr "Не удалось получить доступ к параметрам адресной книги." -#: ../../Zotlabs/Module/Connedit.php:560 +#: ../../Zotlabs/Module/Connedit.php:568 msgid "Connection has been removed." msgstr "Контакт был удалён." -#: ../../Zotlabs/Module/Connedit.php:603 +#: ../../Zotlabs/Module/Connedit.php:611 #, php-format msgid "View %s's profile" msgstr "Просмотр %s профиля" -#: ../../Zotlabs/Module/Connedit.php:607 +#: ../../Zotlabs/Module/Connedit.php:615 msgid "Refresh Permissions" msgstr "Обновить разрешения" -#: ../../Zotlabs/Module/Connedit.php:610 +#: ../../Zotlabs/Module/Connedit.php:618 msgid "Fetch updated permissions" msgstr "Получить обновлённые разрешения" -#: ../../Zotlabs/Module/Connedit.php:614 +#: ../../Zotlabs/Module/Connedit.php:622 msgid "Refresh Photo" msgstr "Обновить фотографию" -#: ../../Zotlabs/Module/Connedit.php:617 +#: ../../Zotlabs/Module/Connedit.php:625 msgid "Fetch updated photo" msgstr "Получить обновлённую фотографию" -#: ../../Zotlabs/Module/Connedit.php:624 +#: ../../Zotlabs/Module/Connedit.php:632 msgid "View recent posts and comments" msgstr "Просмотреть последние публикации и комментарии" -#: ../../Zotlabs/Module/Connedit.php:631 +#: ../../Zotlabs/Module/Connedit.php:639 msgid "Block (or Unblock) all communications with this connection" msgstr "Блокировать (или разблокировать) связи с этим контактом" -#: ../../Zotlabs/Module/Connedit.php:632 +#: ../../Zotlabs/Module/Connedit.php:640 msgid "This connection is blocked!" msgstr "Этот контакт заблокирован!" -#: ../../Zotlabs/Module/Connedit.php:636 +#: ../../Zotlabs/Module/Connedit.php:644 msgid "Unignore" msgstr "Не игнорировать" -#: ../../Zotlabs/Module/Connedit.php:636 +#: ../../Zotlabs/Module/Connedit.php:644 #: ../../Zotlabs/Module/Connections.php:308 msgid "Ignore" msgstr "Игнорировать" -#: ../../Zotlabs/Module/Connedit.php:639 +#: ../../Zotlabs/Module/Connedit.php:647 msgid "Ignore (or Unignore) all inbound communications from this connection" msgstr "Игнорировать (или не игнорировать) все связи для этого контакта" -#: ../../Zotlabs/Module/Connedit.php:640 +#: ../../Zotlabs/Module/Connedit.php:648 msgid "This connection is ignored!" msgstr "Этот контакт игнорируется!" -#: ../../Zotlabs/Module/Connedit.php:644 +#: ../../Zotlabs/Module/Connedit.php:652 msgid "Unarchive" msgstr "Разархивировать" -#: ../../Zotlabs/Module/Connedit.php:644 +#: ../../Zotlabs/Module/Connedit.php:652 msgid "Archive" msgstr "Заархивировать" -#: ../../Zotlabs/Module/Connedit.php:647 +#: ../../Zotlabs/Module/Connedit.php:655 msgid "" "Archive (or Unarchive) this connection - mark channel dead but keep content" msgstr "Заархивировать (или разархивировать) этот контакт - пометить канал отключённым но сохранить содержимое" -#: ../../Zotlabs/Module/Connedit.php:648 +#: ../../Zotlabs/Module/Connedit.php:656 msgid "This connection is archived!" msgstr "Этот контакт заархивирован!" -#: ../../Zotlabs/Module/Connedit.php:652 +#: ../../Zotlabs/Module/Connedit.php:660 msgid "Unhide" msgstr "Показать" -#: ../../Zotlabs/Module/Connedit.php:652 +#: ../../Zotlabs/Module/Connedit.php:660 msgid "Hide" msgstr "Скрыть" -#: ../../Zotlabs/Module/Connedit.php:655 +#: ../../Zotlabs/Module/Connedit.php:663 msgid "Hide or Unhide this connection from your other connections" msgstr "Скрыть или показать этот контакт от / для остальных" -#: ../../Zotlabs/Module/Connedit.php:656 +#: ../../Zotlabs/Module/Connedit.php:664 msgid "This connection is hidden!" msgstr "Этот контакт скрыт!" -#: ../../Zotlabs/Module/Connedit.php:663 +#: ../../Zotlabs/Module/Connedit.php:671 msgid "Delete this connection" msgstr "Удалить этот контакт" -#: ../../Zotlabs/Module/Connedit.php:671 +#: ../../Zotlabs/Module/Connedit.php:679 msgid "Fetch Vcard" msgstr "Получить vCard" -#: ../../Zotlabs/Module/Connedit.php:674 +#: ../../Zotlabs/Module/Connedit.php:682 msgid "Fetch electronic calling card for this connection" msgstr "Получить электронную телефонную карточку для этого контакта" -#: ../../Zotlabs/Module/Connedit.php:685 +#: ../../Zotlabs/Module/Connedit.php:693 msgid "Open Individual Permissions section by default" msgstr "Открывать раздел \"Индивидуальные разрешения\" по умолчанию" -#: ../../Zotlabs/Module/Connedit.php:708 +#: ../../Zotlabs/Module/Connedit.php:716 msgid "Affinity" msgstr "Сходство" -#: ../../Zotlabs/Module/Connedit.php:711 +#: ../../Zotlabs/Module/Connedit.php:719 msgid "Open Set Affinity section by default" msgstr "Открыть секцию установления сходства по умолчанию" -#: ../../Zotlabs/Module/Connedit.php:715 ../../Zotlabs/Widget/Affinity.php:22 +#: ../../Zotlabs/Module/Connedit.php:723 ../../Zotlabs/Widget/Affinity.php:27 msgid "Me" msgstr "Я" -#: ../../Zotlabs/Module/Connedit.php:716 ../../Zotlabs/Widget/Affinity.php:23 +#: ../../Zotlabs/Module/Connedit.php:724 ../../Zotlabs/Widget/Affinity.php:28 msgid "Family" msgstr "Семья" -#: ../../Zotlabs/Module/Connedit.php:718 ../../Zotlabs/Widget/Affinity.php:25 +#: ../../Zotlabs/Module/Connedit.php:726 ../../Zotlabs/Widget/Affinity.php:30 msgid "Acquaintances" msgstr "Знакомые" -#: ../../Zotlabs/Module/Connedit.php:719 +#: ../../Zotlabs/Module/Connedit.php:727 #: ../../Zotlabs/Module/Connections.php:97 #: ../../Zotlabs/Module/Connections.php:111 -#: ../../Zotlabs/Widget/Affinity.php:26 +#: ../../Zotlabs/Widget/Affinity.php:31 msgid "All" msgstr "Все" -#: ../../Zotlabs/Module/Connedit.php:745 +#: ../../Zotlabs/Module/Connedit.php:756 msgid "Filter" msgstr "Фильтр" -#: ../../Zotlabs/Module/Connedit.php:748 +#: ../../Zotlabs/Module/Connedit.php:759 msgid "Open Custom Filter section by default" msgstr "Открывать секцию \"Настраиваемый фильтр\" по умолчанию" -#: ../../Zotlabs/Module/Connedit.php:785 +#: ../../Zotlabs/Module/Connedit.php:796 msgid "Approve this connection" msgstr "Утвердить этот контакт" -#: ../../Zotlabs/Module/Connedit.php:785 +#: ../../Zotlabs/Module/Connedit.php:796 msgid "Accept connection to allow communication" msgstr "Принять контакт чтобы разрешить связь" -#: ../../Zotlabs/Module/Connedit.php:790 +#: ../../Zotlabs/Module/Connedit.php:801 msgid "Set Affinity" msgstr "Установить сходство" -#: ../../Zotlabs/Module/Connedit.php:793 +#: ../../Zotlabs/Module/Connedit.php:804 msgid "Set Profile" msgstr "Установить профиль" -#: ../../Zotlabs/Module/Connedit.php:796 +#: ../../Zotlabs/Module/Connedit.php:807 msgid "Set Affinity & Profile" msgstr "Установить сходство и профиль" -#: ../../Zotlabs/Module/Connedit.php:844 +#: ../../Zotlabs/Module/Connedit.php:855 msgid "This connection is unreachable from this location." msgstr "Этот контакт недоступен для данного местоположения" -#: ../../Zotlabs/Module/Connedit.php:845 +#: ../../Zotlabs/Module/Connedit.php:856 msgid "This connection may be unreachable from other channel locations." msgstr "Этот контакт может быть недоступен из других мест размещения канала" -#: ../../Zotlabs/Module/Connedit.php:847 +#: ../../Zotlabs/Module/Connedit.php:858 msgid "Location independence is not supported by their network." msgstr "Независимое местоположение не поддерживается их сетью." -#: ../../Zotlabs/Module/Connedit.php:853 +#: ../../Zotlabs/Module/Connedit.php:864 msgid "" "This connection is unreachable from this location. Location independence is " "not supported by their network." msgstr "Этот контакт недоступен из данного местоположения. Независимое местоположение не поддерживается их сетью." -#: ../../Zotlabs/Module/Connedit.php:857 +#: ../../Zotlabs/Module/Connedit.php:868 msgid "Connection requests will be approved without your interaction" msgstr "Запросы контактов будут одобрены без вашего участия" -#: ../../Zotlabs/Module/Connedit.php:866 +#: ../../Zotlabs/Module/Connedit.php:877 msgid "This connection's primary address is" msgstr "Главный адрес это контакта" -#: ../../Zotlabs/Module/Connedit.php:867 +#: ../../Zotlabs/Module/Connedit.php:878 msgid "Available locations:" msgstr "Доступные расположения:" -#: ../../Zotlabs/Module/Connedit.php:873 +#: ../../Zotlabs/Module/Connedit.php:884 msgid "Connection Tools" msgstr "Инструменты контактов" -#: ../../Zotlabs/Module/Connedit.php:875 +#: ../../Zotlabs/Module/Connedit.php:886 msgid "Slide to adjust your degree of friendship" msgstr "Прокрутить для настройки степени дружбы" -#: ../../Zotlabs/Module/Connedit.php:877 +#: ../../Zotlabs/Module/Connedit.php:888 msgid "Slide to adjust your rating" msgstr "Прокрутить для настройки оценки" -#: ../../Zotlabs/Module/Connedit.php:878 ../../Zotlabs/Module/Connedit.php:883 +#: ../../Zotlabs/Module/Connedit.php:889 ../../Zotlabs/Module/Connedit.php:894 msgid "Optionally explain your rating" msgstr "Объясните свою оценку (не обязательно)" -#: ../../Zotlabs/Module/Connedit.php:880 +#: ../../Zotlabs/Module/Connedit.php:891 msgid "Custom Filter" msgstr "Настраиваемый фильтр" -#: ../../Zotlabs/Module/Connedit.php:881 +#: ../../Zotlabs/Module/Connedit.php:892 msgid "Only import posts with this text" msgstr "Импортировать публикации только с этим текстом" -#: ../../Zotlabs/Module/Connedit.php:882 +#: ../../Zotlabs/Module/Connedit.php:893 msgid "Do not import posts with this text" msgstr "Не импортировать публикации с этим текстом" -#: ../../Zotlabs/Module/Connedit.php:884 +#: ../../Zotlabs/Module/Connedit.php:895 msgid "This information is public!" msgstr "Эта информация общедоступна!" -#: ../../Zotlabs/Module/Connedit.php:889 +#: ../../Zotlabs/Module/Connedit.php:900 msgid "Connection Pending Approval" msgstr "Ожидающие подтверждения контактов" -#: ../../Zotlabs/Module/Connedit.php:894 +#: ../../Zotlabs/Module/Connedit.php:905 #, php-format msgid "" "Please choose the profile you would like to display to %s when viewing your " "profile securely." msgstr "Пожалуйста, выберите профиль который вы хотит показывать в %s при безопасном просмотре." -#: ../../Zotlabs/Module/Connedit.php:901 +#: ../../Zotlabs/Module/Connedit.php:912 msgid "" "Some permissions may be inherited from your channel's privacy settings, which have higher priority than " @@ -9965,11 +9976,11 @@ msgid "" "any impact unless the inherited setting changes." msgstr "Некоторые разрешения могут быть унаследованы из настроек приватности вашего канала, которые могут иметь более высокий приоритет чем индивидуальные. Вы можете изменить эти настройки, однако они не будут применены до изменения переданных по наследству настроек." -#: ../../Zotlabs/Module/Connedit.php:902 +#: ../../Zotlabs/Module/Connedit.php:913 msgid "Last update:" msgstr "Последнее обновление:" -#: ../../Zotlabs/Module/Connedit.php:910 +#: ../../Zotlabs/Module/Connedit.php:921 msgid "Details" msgstr "Сведения" @@ -9981,60 +9992,60 @@ msgstr "Группа безопасности создана." msgid "Could not create privacy group." msgstr "Не удалось создать группу безопасности." -#: ../../Zotlabs/Module/Group.php:77 +#: ../../Zotlabs/Module/Group.php:80 msgid "Privacy group updated." msgstr "Группа безопасности обновлена." -#: ../../Zotlabs/Module/Group.php:101 +#: ../../Zotlabs/Module/Group.php:106 msgid "Privacy Groups App" msgstr "Приложение \"Группы безопасности\"" -#: ../../Zotlabs/Module/Group.php:102 +#: ../../Zotlabs/Module/Group.php:107 msgid "Management of privacy groups" msgstr "Управление группами безопасности." -#: ../../Zotlabs/Module/Group.php:133 +#: ../../Zotlabs/Module/Group.php:142 msgid "Add Group" msgstr "Добавить группу" -#: ../../Zotlabs/Module/Group.php:137 +#: ../../Zotlabs/Module/Group.php:146 msgid "Privacy group name" msgstr "Имя группы безопасности" -#: ../../Zotlabs/Module/Group.php:138 ../../Zotlabs/Module/Group.php:239 +#: ../../Zotlabs/Module/Group.php:147 ../../Zotlabs/Module/Group.php:256 msgid "Members are visible to other channels" msgstr "Участники канала видимые для остальных" -#: ../../Zotlabs/Module/Group.php:170 +#: ../../Zotlabs/Module/Group.php:182 msgid "Privacy group removed." msgstr "Группа безопасности удалена." -#: ../../Zotlabs/Module/Group.php:172 +#: ../../Zotlabs/Module/Group.php:185 msgid "Unable to remove privacy group." msgstr "Ну удалось удалить группу безопасности." -#: ../../Zotlabs/Module/Group.php:234 +#: ../../Zotlabs/Module/Group.php:251 #, php-format msgid "Privacy Group: %s" msgstr "Группа безопасности: %s" -#: ../../Zotlabs/Module/Group.php:236 +#: ../../Zotlabs/Module/Group.php:253 msgid "Privacy group name: " msgstr "Название группы безопасности: " -#: ../../Zotlabs/Module/Group.php:241 +#: ../../Zotlabs/Module/Group.php:258 msgid "Delete Group" msgstr "Удалить группу" -#: ../../Zotlabs/Module/Group.php:251 +#: ../../Zotlabs/Module/Group.php:269 msgid "Group members" msgstr "Члены группы" -#: ../../Zotlabs/Module/Group.php:253 +#: ../../Zotlabs/Module/Group.php:271 msgid "Not in this group" msgstr "Не в этой группе" -#: ../../Zotlabs/Module/Group.php:285 +#: ../../Zotlabs/Module/Group.php:303 msgid "Click a channel to toggle membership" msgstr "Нажмите на канал для просмотра членства" @@ -10173,7 +10184,7 @@ msgstr "Приложение \"Настроение\"" msgid "Set your current mood and tell your friends" msgstr "Установить текущее настроение и рассказать друзьям" -#: ../../Zotlabs/Module/Mood.php:154 ../../Zotlabs/Lib/Apps.php:325 +#: ../../Zotlabs/Module/Mood.php:154 ../../Zotlabs/Lib/Apps.php:327 msgid "Mood" msgstr "Настроение" @@ -10280,15 +10291,15 @@ msgstr "или посетите" msgid "3. Click [Connect]" msgstr "Нажать [Подключиться]" -#: ../../Zotlabs/Module/Articles.php:43 +#: ../../Zotlabs/Module/Articles.php:51 msgid "Articles App" msgstr "Приложение \"Статьи\"" -#: ../../Zotlabs/Module/Articles.php:44 +#: ../../Zotlabs/Module/Articles.php:52 msgid "Create interactive articles" msgstr "Создать интерактивные статьи" -#: ../../Zotlabs/Module/Articles.php:107 +#: ../../Zotlabs/Module/Articles.php:115 msgid "Add Article" msgstr "Добавить статью" @@ -10399,7 +10410,7 @@ msgstr "Системный шаблон" #: ../../Zotlabs/Module/Wiki.php:35 #: ../../extend/addon/hzaddons/flashcards/Mod_Flashcards.php:34 -#: ../../extend/addon/hzaddons/cart/cart.php:1297 +#: ../../extend/addon/hzaddons/cart/cart.php:1298 msgid "Profile Unavailable." msgstr "Профиль недоступен." @@ -10415,7 +10426,7 @@ msgstr "Предоставьте Wiki для вашего канала" #: ../../extend/addon/hzaddons/cart/submodules/paypalbutton.php:456 #: ../../extend/addon/hzaddons/cart/myshop.php:37 #: ../../extend/addon/hzaddons/cart/manual_payments.php:93 -#: ../../extend/addon/hzaddons/cart/cart.php:1443 +#: ../../extend/addon/hzaddons/cart/cart.php:1444 msgid "Invalid channel" msgstr "Недействительный канал" @@ -10793,15 +10804,15 @@ msgstr "Домашняя страница проекта" msgid "Developer homepage" msgstr "Домашняя страница разработчика" -#: ../../Zotlabs/Module/Cards.php:46 +#: ../../Zotlabs/Module/Cards.php:51 msgid "Cards App" msgstr "Приложение \"Карточки\"" -#: ../../Zotlabs/Module/Cards.php:47 +#: ../../Zotlabs/Module/Cards.php:52 msgid "Create personal planning cards" msgstr "Создать личные карточки планирования" -#: ../../Zotlabs/Module/Cards.php:108 +#: ../../Zotlabs/Module/Cards.php:112 msgid "Add Card" msgstr "Добавить карточку" @@ -10841,7 +10852,7 @@ msgstr "Невозможно найти ваш сервер" msgid "Post successful." msgstr "Успешно опубликовано." -#: ../../Zotlabs/Module/Rmagic.php:35 +#: ../../Zotlabs/Module/Rmagic.php:44 msgid "Authentication failed." msgstr "Ошибка аутентификации." @@ -10927,7 +10938,7 @@ msgstr "Просмотр публичного потока. Предупрежд msgid "Forums" msgstr "Форумы" -#: ../../Zotlabs/Widget/Notes.php:21 ../../Zotlabs/Lib/Apps.php:346 +#: ../../Zotlabs/Widget/Notes.php:21 ../../Zotlabs/Lib/Apps.php:348 msgid "Notes" msgstr "Заметки" @@ -11329,7 +11340,7 @@ msgstr "Управление местоположением" msgid "Member registrations waiting for confirmation" msgstr "Регистрации участников, ожидающие подверждения" -#: ../../Zotlabs/Widget/Admin.php:26 ../../Zotlabs/Lib/Apps.php:333 +#: ../../Zotlabs/Widget/Admin.php:26 ../../Zotlabs/Lib/Apps.php:335 msgid "Features" msgstr "Функции" @@ -11423,7 +11434,7 @@ msgstr "Участники чата" msgid "Click to show more" msgstr "Нажмите чтобы показать больше" -#: ../../Zotlabs/Widget/Affinity.php:45 +#: ../../Zotlabs/Widget/Affinity.php:50 msgid "Refresh" msgstr "Обновить" @@ -11988,138 +11999,138 @@ msgctxt "permcat" msgid "publisher" msgstr "издатель" -#: ../../Zotlabs/Lib/Apps.php:301 +#: ../../Zotlabs/Lib/Apps.php:303 msgid "Apps" msgstr "Приложения" -#: ../../Zotlabs/Lib/Apps.php:304 +#: ../../Zotlabs/Lib/Apps.php:306 msgid "Site Admin" msgstr "Администратор сайта" -#: ../../Zotlabs/Lib/Apps.php:305 +#: ../../Zotlabs/Lib/Apps.php:307 #: ../../extend/addon/hzaddons/buglink/buglink.php:16 msgid "Report Bug" msgstr "Сообщить об ошибке" -#: ../../Zotlabs/Lib/Apps.php:309 +#: ../../Zotlabs/Lib/Apps.php:311 msgid "Remote Diagnostics" msgstr "Удалённая диагностика" -#: ../../Zotlabs/Lib/Apps.php:313 +#: ../../Zotlabs/Lib/Apps.php:315 msgid "Stream" msgstr "Поток" -#: ../../Zotlabs/Lib/Apps.php:324 +#: ../../Zotlabs/Lib/Apps.php:326 msgid "Mail" msgstr "Переписка" -#: ../../Zotlabs/Lib/Apps.php:327 +#: ../../Zotlabs/Lib/Apps.php:329 msgid "Chat" msgstr "Чат" -#: ../../Zotlabs/Lib/Apps.php:329 +#: ../../Zotlabs/Lib/Apps.php:331 msgid "Probe" msgstr "Проба" -#: ../../Zotlabs/Lib/Apps.php:330 +#: ../../Zotlabs/Lib/Apps.php:332 msgid "Suggest" msgstr "Предложить" -#: ../../Zotlabs/Lib/Apps.php:331 +#: ../../Zotlabs/Lib/Apps.php:333 msgid "Random Channel" msgstr "Случайный канал" -#: ../../Zotlabs/Lib/Apps.php:332 +#: ../../Zotlabs/Lib/Apps.php:334 msgid "Invite" msgstr "Пригласить" -#: ../../Zotlabs/Lib/Apps.php:334 +#: ../../Zotlabs/Lib/Apps.php:336 #: ../../extend/addon/hzaddons/openid/MysqlProvider.php:69 msgid "Language" msgstr "Язык" -#: ../../Zotlabs/Lib/Apps.php:335 +#: ../../Zotlabs/Lib/Apps.php:337 msgid "Post" msgstr "Публикация" -#: ../../Zotlabs/Lib/Apps.php:336 +#: ../../Zotlabs/Lib/Apps.php:338 #: ../../extend/addon/hzaddons/openid/MysqlProvider.php:58 #: ../../extend/addon/hzaddons/openid/MysqlProvider.php:59 #: ../../extend/addon/hzaddons/openid/MysqlProvider.php:60 msgid "Profile Photo" msgstr "Фотография профиля" -#: ../../Zotlabs/Lib/Apps.php:340 +#: ../../Zotlabs/Lib/Apps.php:342 msgid "Notifications" msgstr "Оповещения" -#: ../../Zotlabs/Lib/Apps.php:341 +#: ../../Zotlabs/Lib/Apps.php:343 msgid "Order Apps" msgstr "Порядок приложений" -#: ../../Zotlabs/Lib/Apps.php:343 +#: ../../Zotlabs/Lib/Apps.php:345 msgid "CardDAV" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:345 +#: ../../Zotlabs/Lib/Apps.php:347 msgid "Guest Access" msgstr "Гостевой доступ" -#: ../../Zotlabs/Lib/Apps.php:347 +#: ../../Zotlabs/Lib/Apps.php:349 msgid "OAuth Apps Manager" msgstr "Менеджер OAuth" -#: ../../Zotlabs/Lib/Apps.php:348 +#: ../../Zotlabs/Lib/Apps.php:350 msgid "OAuth2 Apps Manager" msgstr "Менеджер OAuth2" -#: ../../Zotlabs/Lib/Apps.php:349 +#: ../../Zotlabs/Lib/Apps.php:351 msgid "PDL Editor" msgstr "Редактор PDL" -#: ../../Zotlabs/Lib/Apps.php:351 +#: ../../Zotlabs/Lib/Apps.php:353 msgid "Premium Channel" msgstr "Премиальный канал" -#: ../../Zotlabs/Lib/Apps.php:353 +#: ../../Zotlabs/Lib/Apps.php:355 msgid "My Chatrooms" msgstr "Мои чаты" -#: ../../Zotlabs/Lib/Apps.php:354 +#: ../../Zotlabs/Lib/Apps.php:356 msgid "Channel Export" msgstr "Экспорт канала" -#: ../../Zotlabs/Lib/Apps.php:531 +#: ../../Zotlabs/Lib/Apps.php:533 msgid "Purchase" msgstr "Купить" -#: ../../Zotlabs/Lib/Apps.php:536 +#: ../../Zotlabs/Lib/Apps.php:538 msgid "Undelete" msgstr "Восстановить" -#: ../../Zotlabs/Lib/Apps.php:545 +#: ../../Zotlabs/Lib/Apps.php:547 msgid "Add to app-tray" msgstr "Добавить в app-tray" -#: ../../Zotlabs/Lib/Apps.php:546 +#: ../../Zotlabs/Lib/Apps.php:548 msgid "Remove from app-tray" msgstr "Удалить из app-tray" -#: ../../Zotlabs/Lib/Apps.php:547 +#: ../../Zotlabs/Lib/Apps.php:549 msgid "Pin to navbar" msgstr "Добавить на панель навигации" -#: ../../Zotlabs/Lib/Apps.php:548 +#: ../../Zotlabs/Lib/Apps.php:550 msgid "Unpin from navbar" msgstr "Удалить с панели навигации" #: ../../Zotlabs/Lib/ThreadItem.php:188 msgid "I will attend" -msgstr "Я буду присутствовать" +msgstr "Я буду участвовать" #: ../../Zotlabs/Lib/ThreadItem.php:188 msgid "I will not attend" -msgstr "Я не буду присутствовать" +msgstr "Я не буду участвовать" #: ../../Zotlabs/Lib/ThreadItem.php:188 msgid "I might attend" @@ -12304,6 +12315,36 @@ msgstr "Это настройка по умолчанию для тех, кто msgid "This is your default setting for the audience of your webpages" msgstr "Это настройка по умолчанию для аудитории ваших веб-страниц" +#: ../../Zotlabs/Lib/Activity.php:1450 +#, php-format +msgid "Likes %1$s's %2$s" +msgstr "Нравится %1$s %2$s" + +#: ../../Zotlabs/Lib/Activity.php:1453 +#, php-format +msgid "Doesn't like %1$s's %2$s" +msgstr "Не нравится %1$s %2$s" + +#: ../../Zotlabs/Lib/Activity.php:1456 +#, php-format +msgid "Will attend %1$s's %2$s" +msgstr "Примет участие %1$s %2$s" + +#: ../../Zotlabs/Lib/Activity.php:1459 +#, php-format +msgid "Will not attend %1$s's %2$s" +msgstr "Не примет участие %1$s %2$s" + +#: ../../Zotlabs/Lib/Activity.php:1462 +#, php-format +msgid "May attend %1$s's %2$s" +msgstr "Возможно примет участие %1$s %2$s" + +#: ../../Zotlabs/Lib/Activity.php:1465 +#, php-format +msgid "🔁 Repeated %1$s's %2$s" +msgstr "🔁 Повторил %1$s %2$s" + #: ../../Zotlabs/Lib/Techlevels.php:10 msgid "0. Beginner/Basic" msgstr "Начинающий / Базовый" @@ -12515,16 +12556,16 @@ msgstr "Максимальное количество для импорта" msgid "0 or blank to import all available" msgstr "0 или пусто для импорта всех доступных" -#: ../../extend/addon/hzaddons/gallery/Mod_Gallery.php:57 +#: ../../extend/addon/hzaddons/gallery/Mod_Gallery.php:59 msgid "A simple gallery for your photo albums" msgstr "Простая галлерея для ваших фотоальбомов" -#: ../../extend/addon/hzaddons/gallery/Mod_Gallery.php:115 -#: ../../extend/addon/hzaddons/gallery/gallery.php:28 +#: ../../extend/addon/hzaddons/gallery/Mod_Gallery.php:135 +#: ../../extend/addon/hzaddons/gallery/gallery.php:38 msgid "Gallery" msgstr "Галерея" -#: ../../extend/addon/hzaddons/gallery/gallery.php:31 +#: ../../extend/addon/hzaddons/gallery/gallery.php:41 msgid "Photo Gallery" msgstr "Фотогалерея" @@ -13742,7 +13783,7 @@ msgstr "Если включено, ваши общедоступные публ #: ../../extend/addon/hzaddons/statusnet/Mod_Statusnet.php:303 msgid "GNU-Social Crosspost Connector" -msgstr "" +msgstr "Подключение пересылки публикаций GNU Social" #: ../../extend/addon/hzaddons/statusnet/statusnet.php:145 msgid "Post to GNU social" @@ -14006,7 +14047,7 @@ msgid "Base Merchant Currency" msgstr "Основная торговая валюта" #: ../../extend/addon/hzaddons/cart/Settings/Cart.php:111 -#: ../../extend/addon/hzaddons/cart/cart.php:1262 +#: ../../extend/addon/hzaddons/cart/cart.php:1263 msgid "Cart Settings" msgstr "Настройки карточек" @@ -14160,7 +14201,7 @@ msgstr "Кнопка Paypal для платежей настроена непр #: ../../extend/addon/hzaddons/cart/submodules/paypalbutton.php:392 #: ../../extend/addon/hzaddons/cart/manual_payments.php:68 -#: ../../extend/addon/hzaddons/cart/cart.php:1465 +#: ../../extend/addon/hzaddons/cart/cart.php:1466 msgid "Order not found." msgstr "Заказ не найден." @@ -14173,7 +14214,7 @@ msgid "Access Denied." msgstr "Доступ запрещён." #: ../../extend/addon/hzaddons/cart/myshop.php:111 -#: ../../extend/addon/hzaddons/cart/cart.php:1333 +#: ../../extend/addon/hzaddons/cart/cart.php:1334 msgid "Order Not Found" msgstr "Заказ не найден" @@ -14200,49 +14241,49 @@ msgstr "Завершено" msgid "DB Cleanup Failure" msgstr "Сбой очистки базы данных" -#: ../../extend/addon/hzaddons/cart/cart.php:564 +#: ../../extend/addon/hzaddons/cart/cart.php:565 msgid "[cart] Item Added" msgstr "[cart] Элемент добавлен" -#: ../../extend/addon/hzaddons/cart/cart.php:952 +#: ../../extend/addon/hzaddons/cart/cart.php:953 msgid "Order already checked out." msgstr "Заказ уже проверен." -#: ../../extend/addon/hzaddons/cart/cart.php:1255 +#: ../../extend/addon/hzaddons/cart/cart.php:1256 msgid "Drop database tables when uninstalling." msgstr "Сбросить таблицы базы данных при деинсталляции" -#: ../../extend/addon/hzaddons/cart/cart.php:1274 -#: ../../extend/addon/hzaddons/cart/cart.php:1277 +#: ../../extend/addon/hzaddons/cart/cart.php:1275 +#: ../../extend/addon/hzaddons/cart/cart.php:1278 msgid "Shop" msgstr "Магазин" -#: ../../extend/addon/hzaddons/cart/cart.php:1394 +#: ../../extend/addon/hzaddons/cart/cart.php:1395 msgid "Cart utilities for orders and payments" msgstr "Утилиты карточек для заказов и платежей" -#: ../../extend/addon/hzaddons/cart/cart.php:1432 +#: ../../extend/addon/hzaddons/cart/cart.php:1433 msgid "You must be logged into the Grid to shop." msgstr "Вы должны быть в сети для доступа к магазину" -#: ../../extend/addon/hzaddons/cart/cart.php:1473 +#: ../../extend/addon/hzaddons/cart/cart.php:1474 msgid "Access denied." msgstr "Доступ запрещён." -#: ../../extend/addon/hzaddons/cart/cart.php:1525 -#: ../../extend/addon/hzaddons/cart/cart.php:1668 +#: ../../extend/addon/hzaddons/cart/cart.php:1526 +#: ../../extend/addon/hzaddons/cart/cart.php:1669 msgid "No Order Found" msgstr "Нет найденных заказов" -#: ../../extend/addon/hzaddons/cart/cart.php:1534 +#: ../../extend/addon/hzaddons/cart/cart.php:1535 msgid "An unknown error has occurred Please start again." msgstr "Произошла неизвестная ошибка. Пожалуйста, начните снова." -#: ../../extend/addon/hzaddons/cart/cart.php:1701 +#: ../../extend/addon/hzaddons/cart/cart.php:1702 msgid "Invalid Payment Type. Please start again." msgstr "Недействительный тип платежа. Пожалуйста, начните снова." -#: ../../extend/addon/hzaddons/cart/cart.php:1708 +#: ../../extend/addon/hzaddons/cart/cart.php:1709 msgid "Order not found" msgstr "Заказ не найден" @@ -14439,6 +14480,89 @@ msgstr "Протокол GNU-Social не поддерживает независ msgid "GNU-Social Protocol" msgstr "Протокол GNU-Social" +#: ../../extend/addon/hzaddons/totp/Mod_Totp.php:23 +msgid "TOTP Two-Step Verification" +msgstr "Двухэтапная верификация TOTP" + +#: ../../extend/addon/hzaddons/totp/Mod_Totp.php:24 +msgid "Enter the 2-step verification generated by your authenticator app:" +msgstr "Введите код проверки, созданный вашим приложением для аутентификации" + +#: ../../extend/addon/hzaddons/totp/Mod_Totp.php:25 +msgid "Success!" +msgstr "Успех!" + +#: ../../extend/addon/hzaddons/totp/Mod_Totp.php:26 +msgid "Invalid code, please try again." +msgstr "Неверный код. Пожалуйста, попробуйте ещё раз." + +#: ../../extend/addon/hzaddons/totp/Mod_Totp.php:27 +msgid "Too many invalid codes..." +msgstr "Слишком много неверных кодов..." + +#: ../../extend/addon/hzaddons/totp/Mod_Totp.php:28 +msgid "Verify" +msgstr "Проверить" + +#: ../../extend/addon/hzaddons/totp/Settings/Totp.php:90 +msgid "" +"You haven't set a TOTP secret yet.\n" +"Please click the button below to generate one and register this site\n" +"with your preferred authenticator app." +msgstr "Вы еще не установили секретный код TOTP. Пожалуйста, нажмите на кнопку ниже, чтобы сгенерировать его и зарегистрировать этот сайт в предпочитаемом вами приложении для аутентификации." + +#: ../../extend/addon/hzaddons/totp/Settings/Totp.php:93 +msgid "Your TOTP secret is" +msgstr "Ваш секретный код TOTP" + +#: ../../extend/addon/hzaddons/totp/Settings/Totp.php:94 +msgid "" +"Be sure to save it somewhere in case you lose or replace your mobile " +"device.\n" +"Use your mobile device to scan the QR code below to register this site\n" +"with your preferred authenticator app." +msgstr "Обязательно сохраните его где-нибудь на случай потери или замены мобильного устройства. С помощью мобильного устройства отсканируйте приведенный ниже QR-код, чтобы зарегистрировать этот сайт в предпочитаемом вами приложении для аутентификации." + +#: ../../extend/addon/hzaddons/totp/Settings/Totp.php:99 +msgid "Test" +msgstr "Тест" + +#: ../../extend/addon/hzaddons/totp/Settings/Totp.php:100 +msgid "Generate New Secret" +msgstr "Сгенерировать новый секретный код" + +#: ../../extend/addon/hzaddons/totp/Settings/Totp.php:101 +msgid "Go" +msgstr "Вперёд" + +#: ../../extend/addon/hzaddons/totp/Settings/Totp.php:102 +msgid "Enter your password" +msgstr "Введите ваш пароль" + +#: ../../extend/addon/hzaddons/totp/Settings/Totp.php:103 +msgid "enter TOTP code from your device" +msgstr "введите код TOTP из вашего устройства" + +#: ../../extend/addon/hzaddons/totp/Settings/Totp.php:104 +msgid "Pass!" +msgstr "Принято!" + +#: ../../extend/addon/hzaddons/totp/Settings/Totp.php:105 +msgid "Fail" +msgstr "Отказано" + +#: ../../extend/addon/hzaddons/totp/Settings/Totp.php:106 +msgid "Incorrect password, try again." +msgstr "Неверный пароль, попробуйте снова." + +#: ../../extend/addon/hzaddons/totp/Settings/Totp.php:107 +msgid "Record your new TOTP secret and rescan the QR code above." +msgstr "Запишите ваш секретный код TOTP и повторно отсканируйте приведенный ниже QR-код." + +#: ../../extend/addon/hzaddons/totp/Settings/Totp.php:115 +msgid "TOTP Settings" +msgstr "Настройки TOTP" + #: ../../extend/addon/hzaddons/pageheader/pageheader.php:43 msgid "Message to display on every page on this server" msgstr "Отображаемое сообщение на каждой странице на этом сервере." @@ -14695,6 +14819,18 @@ msgstr "Отправить ZID" msgid "Who likes me?" msgstr "Кому я нравлюсь?" +#: ../../extend/addon/hzaddons/queueworker/Mod_Queueworker.php:73 +msgid "Max queueworker threads" +msgstr "Макс. количество обработчиков очереди" + +#: ../../extend/addon/hzaddons/queueworker/Mod_Queueworker.php:87 +msgid "Assume workers dead after ___ seconds" +msgstr "Считать обработчики неактивными через секунд" + +#: ../../extend/addon/hzaddons/queueworker/Mod_Queueworker.php:99 +msgid "Queueworker Settings" +msgstr "Настройки обработчика очереди" + #: ../../extend/addon/hzaddons/moremoods/moremoods.php:19 msgid "lonely" msgstr "одинокий" @@ -14918,7 +15054,7 @@ msgstr "Необходим канал." #: ../../extend/addon/hzaddons/redred/Mod_Redred.php:38 msgid "Hubzilla Crosspost Connector Settings saved." -msgstr "" +msgstr "Настройки пересылки публикаций Hubzilla сохранены." #: ../../extend/addon/hzaddons/redred/Mod_Redred.php:51 msgid "Relay public postings to another Hubzilla channel" @@ -14942,11 +15078,11 @@ msgstr "Название канала Hubzilla" #: ../../extend/addon/hzaddons/redred/Mod_Redred.php:87 msgid "Hubzilla Crosspost Connector" -msgstr "" +msgstr "Пересылка публикаций Hubzilla" #: ../../extend/addon/hzaddons/redred/redred.php:50 msgid "Post to Hubzilla" -msgstr "" +msgstr "Опубликовать в Hubzilla" #: ../../extend/addon/hzaddons/pubcrawl/Mod_Pubcrawl.php:25 msgid "ActivityPub Protocol Settings updated." @@ -15129,7 +15265,3 @@ msgstr "" #: ../../extend/addon/hzaddons/opensearch/opensearch.php:43 msgid "Search $Projectname" msgstr "Поиск $Projectname" - -#: ../../store/[data]/smarty3/compiled/3fbe720b52221cc66640ba6ea030406a047aa52a_0.file.cover_photo.tpl.php:127 -msgid "Cover Photo" -msgstr "" From 3277595366afb36e779f140145dc76e0080fa906 Mon Sep 17 00:00:00 2001 From: Max Kostikov Date: Fri, 25 Jan 2019 19:56:15 +0100 Subject: [PATCH 17/80] Update hstrings.php --- view/ru/hstrings.php | 45 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/view/ru/hstrings.php b/view/ru/hstrings.php index 30dd01269..ee4c31619 100644 --- a/view/ru/hstrings.php +++ b/view/ru/hstrings.php @@ -729,7 +729,6 @@ App::$strings["Directory Options"] = "Параметры каталога"; App::$strings["Safe Mode"] = "Безопасный режим"; App::$strings["Public Forums Only"] = "Только публичные форумы"; App::$strings["This Website Only"] = "Только этот веб-сайт"; -App::$strings["view full size"] = "посмотреть в полный размер"; App::$strings["Friendica"] = ""; App::$strings["OStatus"] = ""; App::$strings["GNU-Social"] = ""; @@ -1549,6 +1548,8 @@ App::$strings["Default maximum affinity level"] = "Максимальный ур App::$strings["0-99 default 99"] = "0-99 (по умолчанию 99)"; App::$strings["Default minimum affinity level"] = "Минимальный уровень сходства по умолчанию."; App::$strings["0-99 - default 0"] = "0-99 (по умолчанию 0)"; +App::$strings["Always reset on new page visit."] = "Всегда сбрасывать при посещении новой страницы."; +App::$strings["default: yes"] = "по-умолчанию: да"; App::$strings["Affinity Slider Settings"] = "Настройки слайдера сходства"; App::$strings["Addon Settings"] = "Настройки расширений"; App::$strings["Please save/submit changes to any panel before opening another."] = "Пожалуйста сохраните / отправьте изменения на панели прежде чем открывать другую."; @@ -1788,6 +1789,7 @@ App::$strings["Unable to check command line PHP, as shell_exec() is disabled. Th App::$strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "В консольной версии PHP в вашей системе отключена опция \"register_argc_argv\"."; App::$strings["This is required for message delivery to work."] = "Это необходимо для функционирования доставки сообщений."; App::$strings["PHP register_argc_argv"] = ""; +App::$strings["This is not sufficient to upload larger images or files. You should be able to upload at least 4 MB at once."] = "Этого недостаточно для загрузки больших изображений или файлов. Вы должны иметь возможность загрузить как минимум 4 Мб за раз."; App::$strings["Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once."] = "Максимально разрешённый общий размер загрузок установлен в %s. Максимальный размер одной загрузки установлен в %s. Вам разрешено загружать до %d файлов за один приём."; App::$strings["You can adjust these settings in the server php.ini file."] = "Вы можете изменить эти настройки в файле php.ini на сервере."; App::$strings["PHP upload limits"] = "Максимальный размер загрузки в PHP"; @@ -2757,8 +2759,8 @@ App::$strings["Add to app-tray"] = "Добавить в app-tray"; App::$strings["Remove from app-tray"] = "Удалить из app-tray"; App::$strings["Pin to navbar"] = "Добавить на панель навигации"; App::$strings["Unpin from navbar"] = "Удалить с панели навигации"; -App::$strings["I will attend"] = "Я буду присутствовать"; -App::$strings["I will not attend"] = "Я не буду присутствовать"; +App::$strings["I will attend"] = "Я буду участвовать"; +App::$strings["I will not attend"] = "Я не буду участвовать"; App::$strings["I might attend"] = "Я возможно буду присутствовать"; App::$strings["I agree"] = "Я согласен"; App::$strings["I disagree"] = "Я не согласен"; @@ -2806,6 +2808,12 @@ App::$strings["This is your default setting for who can view your default channe App::$strings["This is your default setting for who can view your connections"] = "Это настройка по умолчанию для тех, кто может просматривать ваши контакты"; App::$strings["This is your default setting for who can view your file storage and photos"] = "Это настройка по умолчанию для тех, кто может просматривать ваше хранилище файлов и фотографий"; App::$strings["This is your default setting for the audience of your webpages"] = "Это настройка по умолчанию для аудитории ваших веб-страниц"; +App::$strings["Likes %1\$s's %2\$s"] = "Нравится %1\$s %2\$s"; +App::$strings["Doesn't like %1\$s's %2\$s"] = "Не нравится %1\$s %2\$s"; +App::$strings["Will attend %1\$s's %2\$s"] = "Примет участие %1\$s %2\$s"; +App::$strings["Will not attend %1\$s's %2\$s"] = "Не примет участие %1\$s %2\$s"; +App::$strings["May attend %1\$s's %2\$s"] = "Возможно примет участие %1\$s %2\$s"; +App::$strings["🔁 Repeated %1\$s's %2\$s"] = "🔁 Повторил %1\$s %2\$s"; App::$strings["0. Beginner/Basic"] = "Начинающий / Базовый"; App::$strings["1. Novice - not skilled but willing to learn"] = "1. Новичок - не опытный, но желающий учиться"; App::$strings["2. Intermediate - somewhat comfortable"] = "2. Промежуточный - более удобный"; @@ -3133,7 +3141,7 @@ App::$strings["Cancel GNU social Connection"] = "Отменить подключ App::$strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to GNU social will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "Замечание: Из-за настроек конфиденциальности (скрыть данные своего профиля от неизвестных зрителей?) cсылка, потенциально включенная в общедоступные публикации, переданные в GNU social, приведет посетителя к пустой странице, информирующей его о том, что доступ к вашему профилю был ограничен."; App::$strings["Post to GNU social by default"] = "Публиковать в GNU social по умолчанию"; App::$strings["If enabled your public postings will be posted to the associated GNU-social account by default"] = "Если включено, ваши общедоступные публикации будут опубликованы в связанной учётной записи GNU social по умолчанию"; -App::$strings["GNU-Social Crosspost Connector"] = ""; +App::$strings["GNU-Social Crosspost Connector"] = "Подключение пересылки публикаций GNU Social"; App::$strings["Post to GNU social"] = "Опубликовать в GNU Social"; App::$strings["API URL"] = ""; App::$strings["Application name"] = "Название приложения"; @@ -3293,6 +3301,25 @@ App::$strings["Follow"] = "Отслеживать"; App::$strings["%1\$s is now following %2\$s"] = "%1\$s сейчас отслеживает %2\$s"; App::$strings["The GNU-Social protocol does not support location independence. Connections you make within that network may be unreachable from alternate channel locations."] = "Протокол GNU-Social не поддерживает независимость от расположения. Ваши контакты установленные в этой сети могут быть недоступны из альтернативных мест размещения канала."; App::$strings["GNU-Social Protocol"] = "Протокол GNU-Social"; +App::$strings["TOTP Two-Step Verification"] = "Двухэтапная верификация TOTP"; +App::$strings["Enter the 2-step verification generated by your authenticator app:"] = "Введите код проверки, созданный вашим приложением для аутентификации"; +App::$strings["Success!"] = "Успех!"; +App::$strings["Invalid code, please try again."] = "Неверный код. Пожалуйста, попробуйте ещё раз."; +App::$strings["Too many invalid codes..."] = "Слишком много неверных кодов..."; +App::$strings["Verify"] = "Проверить"; +App::$strings["You haven't set a TOTP secret yet.\nPlease click the button below to generate one and register this site\nwith your preferred authenticator app."] = "Вы еще не установили секретный код TOTP. Пожалуйста, нажмите на кнопку ниже, чтобы сгенерировать его и зарегистрировать этот сайт в предпочитаемом вами приложении для аутентификации."; +App::$strings["Your TOTP secret is"] = "Ваш секретный код TOTP"; +App::$strings["Be sure to save it somewhere in case you lose or replace your mobile device.\nUse your mobile device to scan the QR code below to register this site\nwith your preferred authenticator app."] = "Обязательно сохраните его где-нибудь на случай потери или замены мобильного устройства. С помощью мобильного устройства отсканируйте приведенный ниже QR-код, чтобы зарегистрировать этот сайт в предпочитаемом вами приложении для аутентификации."; +App::$strings["Test"] = "Тест"; +App::$strings["Generate New Secret"] = "Сгенерировать новый секретный код"; +App::$strings["Go"] = "Вперёд"; +App::$strings["Enter your password"] = "Введите ваш пароль"; +App::$strings["enter TOTP code from your device"] = "введите код TOTP из вашего устройства"; +App::$strings["Pass!"] = "Принято!"; +App::$strings["Fail"] = "Отказано"; +App::$strings["Incorrect password, try again."] = "Неверный пароль, попробуйте снова."; +App::$strings["Record your new TOTP secret and rescan the QR code above."] = "Запишите ваш секретный код TOTP и повторно отсканируйте приведенный ниже QR-код."; +App::$strings["TOTP Settings"] = "Настройки TOTP"; App::$strings["Message to display on every page on this server"] = "Отображаемое сообщение на каждой странице на этом сервере."; App::$strings["Pageheader Settings"] = "Настройки шапки страницы"; App::$strings["pageheader Settings saved."] = "Настройки шапки страницы сохранены."; @@ -3354,6 +3381,9 @@ App::$strings["Message sent to %s. New account registration: %s"] = "Сообщ App::$strings["Send your identity to all websites"] = "Отправить ваши данные на все веб-сайты"; App::$strings["Send ZID"] = "Отправить ZID"; App::$strings["Who likes me?"] = "Кому я нравлюсь?"; +App::$strings["Max queueworker threads"] = "Макс. количество обработчиков очереди"; +App::$strings["Assume workers dead after ___ seconds"] = "Считать обработчики неактивными через секунд"; +App::$strings["Queueworker Settings"] = "Настройки обработчика очереди"; App::$strings["lonely"] = "одинокий"; App::$strings["drunk"] = "пьяный"; App::$strings["horny"] = "возбуждённый"; @@ -3406,14 +3436,14 @@ App::$strings["Post to Libertree by default"] = "Публиковать в Liber App::$strings["Libertree Post Settings"] = "Настройки публикаций в Libertree"; App::$strings["Libertree Settings saved."] = "Настройки Libertree сохранены."; App::$strings["Channel is required."] = "Необходим канал."; -App::$strings["Hubzilla Crosspost Connector Settings saved."] = ""; +App::$strings["Hubzilla Crosspost Connector Settings saved."] = "Настройки пересылки публикаций Hubzilla сохранены."; App::$strings["Relay public postings to another Hubzilla channel"] = "Ретранслировать общедоступные публикации в другой канал Hubzilla"; App::$strings["Send public postings to Hubzilla channel by default"] = "Отправлять общедоступные публикации в канал Hubzilla по умолчанию"; App::$strings["Hubzilla API Path"] = "Путь к Hubzilla API"; App::$strings["Hubzilla login name"] = "Имя входа Hubzilla"; App::$strings["Hubzilla channel name"] = "Название канала Hubzilla"; -App::$strings["Hubzilla Crosspost Connector"] = ""; -App::$strings["Post to Hubzilla"] = ""; +App::$strings["Hubzilla Crosspost Connector"] = "Пересылка публикаций Hubzilla"; +App::$strings["Post to Hubzilla"] = "Опубликовать в Hubzilla"; App::$strings["ActivityPub Protocol Settings updated."] = "Настройки протокола ActivityPub обновлены."; App::$strings["The activitypub protocol does not support location independence. Connections you make within that network may be unreachable from alternate channel locations."] = "Протокол ActivityPub не поддерживает независимость от расположения. Ваши контакты установленные в этой сети могут быть недоступны из альтернативных мест размещения канала."; App::$strings["Deliver to ActivityPub recipients in privacy groups"] = "Доставить получателям ActivityPub в группах безопасности"; @@ -3455,4 +3485,3 @@ App::$strings["Skeleton Settings"] = "Настройки скелета"; App::$strings["__ctx:opensearch__ Search %1\$s (%2\$s)"] = "Искать %1\$s (%2\$s)"; App::$strings["__ctx:opensearch__ \$Projectname"] = ""; App::$strings["Search \$Projectname"] = "Поиск \$Projectname"; -App::$strings["Cover Photo"] = ""; From b9cef2f38f87c2fab51c28af33fa688f30d39138 Mon Sep 17 00:00:00 2001 From: zotlabs Date: Sat, 26 Jan 2019 12:17:52 -0800 Subject: [PATCH 18/80] command line tool for managing site admins --- util/admins | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100755 util/admins diff --git a/util/admins b/util/admins new file mode 100755 index 000000000..22fd2fb4f --- /dev/null +++ b/util/admins @@ -0,0 +1,64 @@ +#!/usr/bin/env php +' . PHP_EOL; + exit(1); +} + + + +require_once('include/cli_startup.php'); +require_once('include/zot.php'); + +cli_startup(); + +$helpArgs = getopt('h', array('help')); +if (count($helpArgs) === 1) { + echo <<<'EndOfOutput' +adds, removes, or lists admins + +Usage: util/admins + util/admins list + util/admins add + util/admins remove + +EndOfOutput; + return; +} + +if($argc == 1) { + $r = q("select account_id, account_roles, account_email from account"); + if($r) { + foreach($r as $rr) { + echo sprintf('%4u %s %s', $rr['account_id'], $rr['account_email'],(($rr['account_roles'] & 4096) ? '*' : '')) . PHP_EOL; + } + } +} + + + +if($argc > 1 && $argv[1] === 'list') { + $r = q("select account_id, account_roles, account_email from account where (account_roles & 4096) > 0"); + if($r) { + foreach($r as $rr) { + echo sprintf('%4u %s %s', $rr['account_id'], $rr['account_email'],(($rr['account_roles'] & 4096) ? '*' : '')) . PHP_EOL; + } + } +} + + +if($argc > 2 && $argv[1] === 'add' && intval($argv[2])) { + $r = q("update account set account_roles = (account_roles | 4096) where account_id = %d", + intval($argv[2]) + ); +} + +if($argc > 2 && $argv[1] === 'remove' && intval($argv[2])) { + $r = q("update account set account_roles = (account_roles - 4096) where account_id = %d and (account_roles & 4096) > 0", + intval($argv[2]) + ); +} From 535f0f45c9dbeb737d5bc888ccbd95fd01fb6e43 Mon Sep 17 00:00:00 2001 From: zotlabs Date: Sat, 26 Jan 2019 12:55:12 -0800 Subject: [PATCH 19/80] cleanup of cli admin tool --- util/admins | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/util/admins b/util/admins index 22fd2fb4f..3c7f0e83e 100755 --- a/util/admins +++ b/util/admins @@ -1,18 +1,14 @@ #!/usr/bin/env php ' . PHP_EOL; + echo 'Run admins from the top level Hubzilla web directory, as util/admins ' . PHP_EOL; exit(1); } require_once('include/cli_startup.php'); -require_once('include/zot.php'); cli_startup(); From 37b7dc8e7c10870021c835168a441788f0fcb351 Mon Sep 17 00:00:00 2001 From: "M. Dent" Date: Sun, 27 Jan 2019 17:36:56 +0100 Subject: [PATCH 20/80] Remove extraneous sync logic --- Zotlabs/Lib/PConfig.php | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/Zotlabs/Lib/PConfig.php b/Zotlabs/Lib/PConfig.php index 95f07d580..c08c11e75 100644 --- a/Zotlabs/Lib/PConfig.php +++ b/Zotlabs/Lib/PConfig.php @@ -275,23 +275,13 @@ class PConfig { dbesc($key) ); + // Synchronize delete with clones. + if ($family != 'hz_delpconfig') { $hash = hash('sha256',$family.':'.$key); set_pconfig($uid,'hz_delpconfig',$hash,$updated); } - // Synchronize delete with clones. - - if(! array_key_exists('transient', \App::$config[$uid])) - \App::$config[$uid]['transient'] = array(); - if(! array_key_exists($family, \App::$config[$uid]['transient'])) - \App::$config[$uid]['transient'][$family] = array(); - - /// @FIXME $new is undefined, so dead code - if ($new) { - \App::$config[$uid]['transient'][$family]['pcfgdel:'.$key] = $updated; - } - return $ret; } From e262de9b2ddb48d618f45a1b28619b068f76ebac Mon Sep 17 00:00:00 2001 From: Mario Vavti Date: Sun, 27 Jan 2019 18:05:46 +0100 Subject: [PATCH 21/80] update nginx and lighttpd sample server configs to explicit dissalow access to util --- install/sample-lighttpd.conf | 2 +- install/sample-nginx.conf | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/install/sample-lighttpd.conf b/install/sample-lighttpd.conf index db26c3b64..b65d86645 100644 --- a/install/sample-lighttpd.conf +++ b/install/sample-lighttpd.conf @@ -79,7 +79,7 @@ $HTTP["url"] =~ "\.(out|log|htaccess)$" { url.access-deny = ("") } -$HTTP["url"] =~ "(^|/)\.git|(^|/)store" { +$HTTP["url"] =~ "(^|/)\.git|(^|/)store|(^|/)util" { url.access-deny = ("") } diff --git a/install/sample-nginx.conf b/install/sample-nginx.conf index 839f208ae..6a986d426 100644 --- a/install/sample-nginx.conf +++ b/install/sample-nginx.conf @@ -141,5 +141,10 @@ server { deny all; } +#deny access to util + location ~ /util { + deny all; + } + } From 94cbc8bd3160bf644b02ef97268244869b7a9f5b Mon Sep 17 00:00:00 2001 From: zotlabs Date: Sun, 27 Jan 2019 12:38:51 -0800 Subject: [PATCH 22/80] share fixes --- Zotlabs/Lib/Activity.php | 5 +++++ Zotlabs/Lib/Share.php | 1 + 2 files changed, 6 insertions(+) diff --git a/Zotlabs/Lib/Activity.php b/Zotlabs/Lib/Activity.php index 03f094983..8cfa18997 100644 --- a/Zotlabs/Lib/Activity.php +++ b/Zotlabs/Lib/Activity.php @@ -411,6 +411,11 @@ class Activity { $ret['type'] = 'Tombstone'; $ret['formerType'] = self::activity_obj_mapper($i['obj_type']); $ret['id'] = ((strpos($i['mid'],'http') === 0) ? $i['mid'] : z_root() . '/item/' . urlencode($i['mid'])); + $actor = self::encode_person($i['author'],false); + if($actor) + $ret['actor'] = $actor; + else + return []; return $ret; } diff --git a/Zotlabs/Lib/Share.php b/Zotlabs/Lib/Share.php index d3ecbf7fa..3a2ab1783 100644 --- a/Zotlabs/Lib/Share.php +++ b/Zotlabs/Lib/Share.php @@ -54,6 +54,7 @@ class Share { if(! $this->item) return $obj; + $obj['asld'] = $this->item['mid']; $obj['type'] = $this->item['obj_type']; $obj['id'] = $this->item['mid']; $obj['content'] = $this->item['body']; From 625cdde9a40d13b47a794c6202add2c8f647aebe Mon Sep 17 00:00:00 2001 From: zotlabs Date: Mon, 28 Jan 2019 02:46:45 -0800 Subject: [PATCH 23/80] block private reshares from zot6 due to different parents --- Zotlabs/Daemon/Notifier.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Zotlabs/Daemon/Notifier.php b/Zotlabs/Daemon/Notifier.php index 5ee8843b2..df73d977d 100644 --- a/Zotlabs/Daemon/Notifier.php +++ b/Zotlabs/Daemon/Notifier.php @@ -679,6 +679,17 @@ class Notifier { } $packet_type = (($upstream || $uplink) ? 'response' : 'activity'); + + // block zot private reshares from zot6, as this could cause a number of privacy issues + // due to parenting differences between the reshare implementations. In zot a reshare is + // a standalone parent activity and in zot6 it is a followup/child of the original activity. + // For public reshares, some comments to the reshare on the zot fork will not make it to zot6 + // due to these different message models. This cannot be prevented at this time. + + if($packet_type === 'activity' && $activity['type'] === 'Announce' && intval($target_item['item_private'])) { + continue; + } + $packet = Libzot::build_packet($channel,$packet_type,$zenv,$activity,'activitystreams',(($private) ? $hub['hubloc_sitekey'] : null),$hub['site_crypto']); } else { From 8972ca8134c16039c03ad83d26b75b9e9e21d7ea Mon Sep 17 00:00:00 2001 From: "DM42.Net (Matt Dent)" Date: Mon, 28 Jan 2019 14:20:46 -0500 Subject: [PATCH 24/80] Make session handler pluggable --- Zotlabs/Web/Session.php | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/Zotlabs/Web/Session.php b/Zotlabs/Web/Session.php index 4f2a3f1f7..1ba120fa9 100644 --- a/Zotlabs/Web/Session.php +++ b/Zotlabs/Web/Session.php @@ -15,6 +15,7 @@ class Session { private $handler = null; private $session_started = false; + private $custom_handler = false; public function init() { @@ -28,13 +29,20 @@ class Session { * Set our session storage functions. */ - $handler = new \Zotlabs\Web\SessionHandler(); + $custom_handler = $this->custom_handler; + call_hook('custom_session_handler',$custom_handler); + $this->custom_handler = $custom_handler; - $this->handler = $handler; - $x = session_set_save_handler($handler,false); - if(! $x) - logger('Session save handler initialisation failed.',LOGGER_NORMAL,LOG_ERR); + if (!$this->custom_handler) { + $handler = new \Zotlabs\Web\SessionHandler(); + + $this->handler = $handler; + + $x = session_set_save_handler($handler,false); + if(! $x) + logger('Session save handler initialisation failed.',LOGGER_NORMAL,LOG_ERR); + } // Force cookies to be secure (https only) if this site is SSL enabled. // Must be done before session_start(). @@ -86,14 +94,17 @@ class Session { $arr = session_get_cookie_params(); - if($this->handler && $this->session_started) { + if(($this->handler || $this->custom_handler) && $this->session_started) { session_regenerate_id(true); - // force SessionHandler record creation with the new session_id - // which occurs as a side effect of read() + if (!$this->custom_handler) { + // force SessionHandler record creation with the new session_id + // which occurs as a side effect of read() since not all implementations + // of session_regenerate_id() call read(). - $this->handler->read(session_id()); + $this->handler->read(session_id()); + } } else logger('no session handler'); From ec6e130eb3da6765b24caa1235d5b53ba8342aeb Mon Sep 17 00:00:00 2001 From: Klaus Weidenbach Date: Mon, 28 Jan 2019 23:10:36 +0100 Subject: [PATCH 25/80] Correct variable in boot.php --- boot.php | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/boot.php b/boot.php index 348cea535..14458cd4f 100755 --- a/boot.php +++ b/boot.php @@ -733,11 +733,11 @@ class App { private static $perms = null; // observer permissions private static $widgets = array(); // widgets for this page public static $config = array(); // config cache - public static $override_intltext_templates = array(); - public static $override_markup_templates = array(); - public static $override_templateroot = null; - public static $override_helproot = null; - public static $override_helpfiles = array(); + public static $override_intltext_templates = array(); + public static $override_markup_templates = array(); + public static $override_templateroot = null; + public static $override_helproot = null; + public static $override_helpfiles = array(); public static $session = null; public static $groups; @@ -888,7 +888,7 @@ class App { // removing trailing / - maybe a nginx problem if (substr(self::$query_string, 0, 1) == "/") self::$query_string = substr(self::$query_string, 1); - // change the first & to ? + // change the first & to ? self::$query_string = preg_replace('/&/','?',self::$query_string,1); } @@ -1579,7 +1579,7 @@ function login($register = false, $form_id = 'main-login', $hiddens = false, $lo // Here's the current description of how the register link works (2018-05-15) - // Register links are enabled on the site home page and login page and navbar. + // Register links are enabled on the site home page and login page and navbar. // They are not shown by default on other pages which may require login. // If the register link is enabled and registration is closed, the request is directed @@ -1591,10 +1591,10 @@ function login($register = false, $form_id = 'main-login', $hiddens = false, $lo // system.register_link may or may not be the same destination as system.sellpage - // system.sellpage is the destination linked from the /pubsites page on other sites. If + // system.sellpage is the destination linked from the /pubsites page on other sites. If // system.sellpage is not set, the 'register' link in /pubsites will go to 'register' on your - // site. - + // site. + // If system.register_link is set to the word 'none', no registration link will be shown on // your site. @@ -1833,8 +1833,6 @@ function proc_run(){ $args = func_get_args(); - $newargs = array(); - if(! count($args)) return; @@ -2282,7 +2280,7 @@ function construct_page() { $cspheader = "Content-Security-Policy:"; foreach ($cspsettings as $cspdirective => $csp) { if (!in_array($cspdirective,$validcspdirectives)) { - logger("INVALID CSP DIRECTIVE: ".$cspdirective,LOGGER_DEBUG); + logger("INVALID CSP DIRECTIVE: ".$cspdirective,LOGGER_DEBUG); continue; } $cspsettingsarray=array_unique($cspsettings[$cspdirective]); @@ -2401,7 +2399,7 @@ function z_get_temp_dir() { if(! $temp_dir) $temp_dir = sys_get_temp_dir(); - return $upload_dir; + return $temp_dir; } From 728788e3b9ce351b7eab0fba00e97ba59215e975 Mon Sep 17 00:00:00 2001 From: Klaus Weidenbach Date: Sat, 26 Jan 2019 00:47:39 +0100 Subject: [PATCH 26/80] Extend documentation. --- Zotlabs/Lib/Apps.php | 377 ++++++++++++++++++----------- Zotlabs/Module/Notes.php | 20 +- include/contact_widgets.php | 40 ++- view/tpl/remote_friends_common.tpl | 3 +- 4 files changed, 267 insertions(+), 173 deletions(-) diff --git a/Zotlabs/Lib/Apps.php b/Zotlabs/Lib/Apps.php index de7439ed7..9edd00667 100644 --- a/Zotlabs/Lib/Apps.php +++ b/Zotlabs/Lib/Apps.php @@ -1,32 +1,34 @@ - t('Remote Diagnostics'), 'Suggest Channels' => t('Suggest Channels'), 'Login' => t('Login'), - 'Channel Manager' => t('Channel Manager'), + 'Channel Manager' => t('Channel Manager'), 'Network' => t('Stream'), 'Settings' => t('Settings'), 'Files' => t('Files'), 'Webpages' => t('Webpages'), 'Wiki' => t('Wiki'), - 'Channel Home' => t('Channel Home'), + 'Channel Home' => t('Channel Home'), 'View Profile' => t('View Profile'), - 'Photos' => t('Photos'), - 'Events' => t('Events'), - 'Directory' => t('Directory'), + 'Photos' => t('Photos'), + 'Events' => t('Events'), + 'Directory' => t('Directory'), 'Help' => t('Help'), 'Mail' => t('Mail'), 'Mood' => t('Mood'), @@ -366,30 +385,31 @@ class Apps { if(array_key_exists($arr[$x]['name'],$apps)) { $arr[$x]['name'] = $apps[$arr[$x]['name']]; } else { - // Try to guess by app name if not in list - $arr[$x]['name'] = t(trim($arr[$x]['name'])); + // Try to guess by app name if not in list + $arr[$x]['name'] = t(trim($arr[$x]['name'])); } } } - } - - // papp is a portable app - - static public function app_render($papp,$mode = 'view') { - - /** - * modes: - * view: normal mode for viewing an app via bbcode from a conversation or page - * provides install/update button if you're logged in locally - * install: like view but does not display app-bin options if they are present - * list: normal mode for viewing an app on the app page - * no buttons are shown - * edit: viewing the app page in editing mode provides a delete button - * nav: render apps for app-bin - */ - + /** + * @brief + * + * @param array $papp + * papp is a portable app + * @param string $mode (optional) default 'view' + * Render modes: + * * \b view: normal mode for viewing an app via bbcode from a conversation or page + * provides install/update button if you're logged in locally + * * \b install: like view but does not display app-bin options if they are present + * * \b list: normal mode for viewing an app on the app page + * no buttons are shown + * * \b edit: viewing the app page in editing mode provides a delete button + * * \b nav: render apps for app-bin + * + * @return void|string Parsed HTML + */ + static public function app_render($papp, $mode = 'view') { $installed = false; if(! $papp) @@ -414,7 +434,7 @@ class Apps { $sys = get_sys_channel(); $view_channel = $sys['channel_id']; } - self::app_macros($view_channel,$papp); + self::app_macros($view_channel,$papp); } if(strpos($papp['url'], ',')) { @@ -427,7 +447,6 @@ class Apps { $papp['url'] = z_root() . ((strpos($papp['url'],'/') === 0) ? '' : '/') . $papp['url']; - foreach($papp as $k => $v) { if(strpos($v,'http') === 0 && $k != 'papp') { if(! (local_channel() && strpos($v,z_root()) === 0)) { @@ -509,7 +528,7 @@ class Apps { if($x) { $hosturl = $x['scheme'] . '://' . $x['host'] . '/'; } - } + } } $install_action = (($installed) ? t('Update') : t('Install')); @@ -592,8 +611,14 @@ class Apps { return false; } - - static public function can_delete($uid,$app) { + /** + * @brief + * + * @param mixed $uid If not set return false, otherwise no influence + * @param array $app + * @return boolean + */ + static public function can_delete($uid, $app) { if(! $uid) { return false; } @@ -601,7 +626,7 @@ class Apps { $base_apps = self::get_base_apps(); if($base_apps) { foreach($base_apps as $b) { - if($app['guid'] === hash('whirlpool',$b)) { + if($app['guid'] === hash('whirlpool', $b)) { return false; } } @@ -613,7 +638,6 @@ class Apps { static public function app_destroy($uid,$app) { if($uid && $app['guid']) { - $x = q("select * from app where app_id = '%s' and app_channel = %d limit 1", dbesc($app['guid']), intval($uid) @@ -622,7 +646,7 @@ class Apps { if(! intval($x[0]['app_deleted'])) { $x[0]['app_deleted'] = 1; if(self::can_delete($uid,$app)) { - $r = q("delete from app where app_id = '%s' and app_channel = %d", + q("delete from app where app_id = '%s' and app_channel = %d", dbesc($app['guid']), intval($uid) ); @@ -630,10 +654,15 @@ class Apps { intval(TERM_OBJ_APP), intval($x[0]['id']) ); + /** + * @hooks app_destroy + * Called after app entry got removed from database + * and provide app array from database. + */ call_hooks('app_destroy', $x[0]); } else { - $r = q("update app set app_deleted = 1 where app_id = '%s' and app_channel = %d", + q("update app set app_deleted = 1 where app_id = '%s' and app_channel = %d", dbesc($app['guid']), intval($uid) ); @@ -647,22 +676,23 @@ class Apps { } } } - } - static public function app_undestroy($uid,$app) { - - // undelete a system app - + /** + * @brief Undelete a system app. + * + * @param int $uid + * @param array $app + */ + static public function app_undestroy($uid, $app) { if($uid && $app['guid']) { - $x = q("select * from app where app_id = '%s' and app_channel = %d limit 1", dbesc($app['guid']), intval($uid) ); if($x) { if($x[0]['app_system']) { - $r = q("update app set app_deleted = 0 where app_id = '%s' and app_channel = %d", + q("update app set app_deleted = 0 where app_id = '%s' and app_channel = %d", dbesc($app['guid']), intval($uid) ); @@ -671,7 +701,15 @@ class Apps { } } - static public function app_feature($uid,$app,$term) { + /** + * @brief + * + * @param int $uid + * @param array $app + * @param string $term + * @return void + */ + static public function app_feature($uid, $app, $term) { $r = q("select id from app where app_id = '%s' and app_channel = %d limit 1", dbesc($app['guid']), intval($uid) @@ -695,23 +733,37 @@ class Apps { } } - static public function app_installed($uid,$app,$bypass_filter=false) { + /** + * @brief + * + * @param int $uid + * @param array $app + * @param boolean $bypass_filter (optional) default false + * @return boolean + */ + static public function app_installed($uid, $app, $bypass_filter = false) { $r = q("select id from app where app_id = '%s' and app_channel = %d limit 1", - dbesc((array_key_exists('guid',$app)) ? $app['guid'] : ''), + dbesc((array_key_exists('guid', $app)) ? $app['guid'] : ''), intval($uid) ); - if (!$bypass_filter) { + if(!$bypass_filter) { $filter_arr = [ - 'uid'=>$uid, - 'app'=>$app, - 'installed'=>$r + 'uid' => $uid, + 'app' => $app, + 'installed' => $r ]; - call_hooks('app_installed_filter',$filter_arr); + /** + * @hooks app_installed_filter + * * \e int \b uid + * * \e array \b app + * * \e mixed \b installed - return value + */ + call_hooks('app_installed_filter', $filter_arr); $r = $filter_arr['installed']; } - return(($r) ? true : false); + return(($r) ? true : false); } @@ -727,11 +779,17 @@ class Apps { 'app'=>$app, 'installed'=>$r ]; - call_hooks('addon_app_installed_filter',$filter_arr); + /** + * @hooks addon_app_installed_filter + * * \e int \b uid + * * \e array \b app + * * \e mixed \b installed - return value + */ + call_hooks('addon_app_installed_filter', $filter_arr); $r = $filter_arr['installed']; } - return(($r) ? true : false); + return(($r) ? true : false); } static public function system_app_installed($uid,$app,$bypass_filter=false) { @@ -746,28 +804,39 @@ class Apps { 'app'=>$app, 'installed'=>$r ]; - call_hooks('system_app_installed_filter',$filter_arr); + /** + * @hooks system_app_installed_filter + * * \e int \b uid + * * \e array \b app + * * \e mixed \b installed - return value + */ + call_hooks('system_app_installed_filter', $filter_arr); $r = $filter_arr['installed']; } - return(($r) ? true : false); + return(($r) ? true : false); } - - + /** + * @brief + * + * @param int $uid + * @param boolean $deleted + * @param array $cats + * @return boolean|array + */ static public function app_list($uid, $deleted = false, $cats = []) { - if($deleted) - $sql_extra = ""; + if($deleted) + $sql_extra = ''; else - $sql_extra = " and app_deleted = 0 "; + $sql_extra = ' and app_deleted = 0 '; if($cats) { - - $cat_sql_extra = " and ( "; + $cat_sql_extra = ' and ( '; foreach($cats as $cat) { if(strpos($cat_sql_extra, 'term')) - $cat_sql_extra .= "or "; + $cat_sql_extra .= 'or '; $cat_sql_extra .= "term = '" . dbesc($cat) . "' "; } @@ -779,11 +848,13 @@ class Apps { ); if(! $r) return $r; - $sql_extra .= " and app.id in ( "; + + $sql_extra .= ' and app.id in ( '; $s = ''; foreach($r as $rr) { if($s) $s .= ','; + $s .= intval($rr['oid']); } $sql_extra .= $s . ') '; @@ -794,12 +865,26 @@ class Apps { ); if($r) { - $hookinfo = Array('uid'=>$uid,'deleted'=>$deleted,'cats'=>$cats,'apps'=>$r); - call_hooks('app_list',$hookinfo); + $hookinfo = [ + 'uid' => $uid, + 'deleted' => $deleted, + 'cats' => $cats, + 'apps' => $r, + ]; + /** + * @hooks app_list + * * \e int \b uid + * * \e boolean \b deleted + * * \e array \b cats + * * \e array \b apps - return value + */ + call_hooks('app_list', $hookinfo); $r = $hookinfo['apps']; - for($x = 0; $x < count($r); $x ++) { + + for($x = 0; $x < count($r); $x++) { if(! $r[$x]['app_system']) $r[$x]['type'] = 'personal'; + $r[$x]['term'] = q("select * from term where otype = %d and oid = %d", intval(TERM_OBJ_APP), intval($r[$x]['id']) @@ -807,7 +892,7 @@ class Apps { } } - return($r); + return $r; } static public function app_order($uid,$apps,$menu) { @@ -839,13 +924,14 @@ class Apps { $ret[] = $ap; } } - return $ret; + return $ret; } static function find_app_in_array($name,$arr) { if(! $arr) return false; + foreach($arr as $x) { if($x['name'] === $name) { return $x; @@ -854,8 +940,16 @@ class Apps { return false; } - static function moveup($uid,$guid,$menu) { - $syslist = array(); + /** + * @brief + * + * @param int $uid + * @param int $guid + * @param string $menu + * @return void + */ + static function moveup($uid, $guid, $menu) { + $syslist = []; $conf = (($menu === 'nav_featured_app') ? 'app_order' : 'app_pin_order'); @@ -865,6 +959,7 @@ class Apps { $papp = self::app_encode($li); if($menu !== 'nav_pinned_app' && strpos($papp['categories'],'nav_pinned_app') !== false) continue; + $syslist[] = $papp; } } @@ -877,8 +972,6 @@ class Apps { if(! $syslist) return; - $newlist = []; - foreach($syslist as $k => $li) { if($li['guid'] === $guid) { $position = $k; @@ -887,6 +980,7 @@ class Apps { } if(! $position) return; + $dest_position = $position - 1; $saved = $syslist[$dest_position]; $syslist[$dest_position] = $syslist[$position]; @@ -898,11 +992,18 @@ class Apps { } set_pconfig($uid,'system',$conf,implode(',',$narr)); - } - static function movedown($uid,$guid,$menu) { - $syslist = array(); + /** + * @brief + * + * @param int $uid + * @param int $guid + * @param string $menu + * @return void + */ + static function movedown($uid, $guid, $menu) { + $syslist = []; $conf = (($menu === 'nav_featured_app') ? 'app_order' : 'app_pin_order'); @@ -912,6 +1013,7 @@ class Apps { $papp = self::app_encode($li); if($menu !== 'nav_pinned_app' && strpos($papp['categories'],'nav_pinned_app') !== false) continue; + $syslist[] = $papp; } } @@ -924,8 +1026,6 @@ class Apps { if(! $syslist) return; - $newlist = []; - foreach($syslist as $k => $li) { if($li['guid'] === $guid) { $position = $k; @@ -934,6 +1034,7 @@ class Apps { } if($position >= count($syslist) - 1) return; + $dest_position = $position + 1; $saved = $syslist[$dest_position]; $syslist[$dest_position] = $syslist[$position]; @@ -945,7 +1046,6 @@ class Apps { } set_pconfig($uid,'system',$conf,implode(',',$narr)); - } static public function app_decode($s) { @@ -953,8 +1053,14 @@ class Apps { return json_decode($x,true); } - - static public function app_macros($uid,&$arr) { + /** + * @brief + * + * @param int $uid + * @param[in,out] array $arr + * @return void + */ + static public function app_macros($uid, &$arr) { if(! intval($uid)) return; @@ -962,21 +1068,17 @@ class Apps { $baseurl = z_root(); $channel = channelx_by_n($uid); $address = (($channel) ? $channel['channel_address'] : ''); - + //future expansion - $observer = \App::get_observer(); - + //$observer = \App::get_observer(); + $arr['url'] = str_replace(array('$baseurl','$nick'),array($baseurl,$address),$arr['url']); $arr['photo'] = str_replace(array('$baseurl','$nick'),array($baseurl,$address),$arr['photo']); - } - - - static public function app_store($arr) { //logger('app_store: ' . print_r($arr,true)); @@ -1160,16 +1262,20 @@ class Apps { } return $ret; - } - - static public function app_encode($app,$embed = false) { - - $ret = array(); + /** + * @brief + * + * @param array $app + * @param boolean $embed (optional) default false + * @return array|string + */ + static public function app_encode($app, $embed = false) { + $ret = []; $ret['type'] = 'personal'; - + if($app['app_id']) $ret['guid'] = $app['app_id']; @@ -1202,7 +1308,7 @@ class Apps { if($app['app_price']) $ret['price'] = $app['app_price']; - + if($app['app_page']) $ret['page'] = $app['app_page']; @@ -1226,12 +1332,12 @@ class Apps { foreach($app['term'] as $t) { if($s) $s .= ','; + $s .= $t['term']; } $ret['categories'] = $s; } - if(! $embed) return $ret; @@ -1239,18 +1345,15 @@ class Apps { if(array_key_exists('categories',$ret)) unset($ret['categories']); - - $j = json_encode($ret); - return '[app]' . chunk_split(base64_encode($j),72,"\n") . '[/app]'; + $j = json_encode($ret); + + return '[app]' . chunk_split(base64_encode($j),72,"\n") . '[/app]'; } static public function papp_encode($papp) { return chunk_split(base64_encode(json_encode($papp)),72,"\n"); - } } - - diff --git a/Zotlabs/Module/Notes.php b/Zotlabs/Module/Notes.php index 178a6bce0..7572f7420 100644 --- a/Zotlabs/Module/Notes.php +++ b/Zotlabs/Module/Notes.php @@ -1,28 +1,31 @@ true); if(array_key_exists('note_text',$_REQUEST)) { $body = escape_tags($_REQUEST['note_text']); - + // I've had my notes vanish into thin air twice in four years. - // Provide a backup copy if there were contents previously + // Provide a backup copy if there were contents previously // and there are none being saved now. - + if(! $body) { $old_text = get_pconfig(local_channel(),'notes','text'); if($old_text) @@ -40,11 +43,9 @@ class Notes extends Controller { logger('notes saved.', LOGGER_DEBUG); json_return_and_die($ret); - } function get() { - if(! local_channel()) return EMPTY_STR; @@ -61,7 +62,6 @@ class Notes extends Controller { $arr = ['app' => true]; return $w->widget($arr); - } - + } diff --git a/include/contact_widgets.php b/include/contact_widgets.php index a105bca19..6ad276b00 100644 --- a/include/contact_widgets.php +++ b/include/contact_widgets.php @@ -7,14 +7,14 @@ function findpeople_widget() { if(get_config('system','invitation_only')) { $x = get_pconfig(local_channel(),'system','invites_remaining'); if($x || is_site_admin()) { - App::$page['aside'] .= '' . $inv; + App::$page['aside'] .= ''; } } $advanced_search = ((local_channel() && feature_enabled(local_channel(),'advanced_dirsearch')) ? t('Advanced') : false); - + return replace_macros(get_markup_template('peoplefind.tpl'),array( '$findpeople' => t('Find Channels'), '$desc' => t('Enter name or interest'), @@ -22,7 +22,7 @@ function findpeople_widget() { '$hint' => t('Examples: Robert Morgenstein, Fishing'), '$findthem' => t('Find'), '$suggest' => t('Channel Suggestions'), - '$similar' => '', // FIXME and uncomment when mod/match working // t('Similar Interests'), + '$similar' => '', /// @FIXME fixme and uncomment when mod/match working // t('Similar Interests'), '$random' => t('Random Profile'), '$inv' => t('Invite Friends'), '$advanced_search' => $advanced_search, @@ -56,12 +56,11 @@ function fileas_widget($baseurl,$selected = '') { '$all' => t('Everything'), '$terms' => $terms, '$base' => $baseurl, - )); } function categories_widget($baseurl,$selected = '') { - + if(! feature_enabled(App::$profile['profile_uid'],'categories')) return ''; @@ -100,14 +99,13 @@ function categories_widget($baseurl,$selected = '') { '$all' => t('Everything'), '$terms' => $terms, '$base' => $baseurl, - )); } return ''; } function cardcategories_widget($baseurl,$selected = '') { - + if(! feature_enabled(App::$profile['profile_uid'],'categories')) return ''; @@ -128,7 +126,7 @@ function cardcategories_widget($baseurl,$selected = '') { $item_normal $sql_extra order by term.term asc", - intval(App::$profile['profile_uid']), + intval(App::$profile['profile_uid']), intval(TERM_CATEGORY), intval(TERM_OBJ_POST), dbesc(App::$profile['channel_hash']) @@ -144,15 +142,15 @@ function cardcategories_widget($baseurl,$selected = '') { '$all' => t('Everything'), '$terms' => $terms, '$base' => $baseurl, - )); } + return ''; } function articlecategories_widget($baseurl,$selected = '') { - + if(! feature_enabled(App::$profile['profile_uid'],'categories')) return ''; @@ -173,7 +171,7 @@ function articlecategories_widget($baseurl,$selected = '') { $item_normal $sql_extra order by term.term asc", - intval(App::$profile['profile_uid']), + intval(App::$profile['profile_uid']), intval(TERM_CATEGORY), intval(TERM_OBJ_POST), dbesc(App::$profile['channel_hash']) @@ -189,17 +187,14 @@ function articlecategories_widget($baseurl,$selected = '') { '$all' => t('Everything'), '$terms' => $terms, '$base' => $baseurl, - )); } + return ''; } - - - function common_friends_visitor_widget($profile_uid,$cnt = 25) { if(local_channel() == $profile_uid) @@ -218,17 +213,14 @@ function common_friends_visitor_widget($profile_uid,$cnt = 25) { return; $r = common_friends($profile_uid,$observer_hash,0,$cnt,true); - - return replace_macros(get_markup_template('remote_friends_common.tpl'), array( + + return replace_macros(get_markup_template('remote_friends_common.tpl'), [ '$desc' => t('Common Connections'), '$base' => z_root(), '$uid' => $profile_uid, - '$cid' => $observer, '$linkmore' => (($t > $cnt) ? 'true' : ''), '$more' => sprintf( t('View all %d common connections'), $t), - '$items' => $r - )); + '$items' => $r, + ]); }; - - diff --git a/view/tpl/remote_friends_common.tpl b/view/tpl/remote_friends_common.tpl index efc0ab49a..6ef3a7dde 100755 --- a/view/tpl/remote_friends_common.tpl +++ b/view/tpl/remote_friends_common.tpl @@ -7,10 +7,9 @@
{{foreach $items as $item}}
- {{$item.xchan_name}} + {{$item.xchan_name}}
{{/foreach}}
{{/if}} - From 753f137575674a4fb1cfb16753baced6ed21145a Mon Sep 17 00:00:00 2001 From: zotlabs Date: Mon, 28 Jan 2019 15:29:39 -0800 Subject: [PATCH 27/80] disable hyperdrive in hubzilla --- Zotlabs/Lib/Libzot.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Zotlabs/Lib/Libzot.php b/Zotlabs/Lib/Libzot.php index 1440a9691..27502009c 100644 --- a/Zotlabs/Lib/Libzot.php +++ b/Zotlabs/Lib/Libzot.php @@ -1534,6 +1534,11 @@ class Libzot { // the top level post is unlikely to be imported and // this is just an exercise in futility. + + if((! get_pconfig($channel['channel_id'],'system','hyperdrive',false)) || (! $arr['verb'] === 'Announce')) { + continue; + } + if((! $relay) && (! $request) && (! $local_public) && perm_is_allowed($channel['channel_id'],$sender,'send_stream')) { self::fetch_conversation($channel,$arr['parent_mid']); From 456207b4e75ee4b28b60e90b44ef758dc95b2ebc Mon Sep 17 00:00:00 2001 From: Mario Vavti Date: Tue, 29 Jan 2019 10:13:49 +0100 Subject: [PATCH 28/80] fix wrong function name and coding style --- Zotlabs/Web/Session.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zotlabs/Web/Session.php b/Zotlabs/Web/Session.php index 1ba120fa9..648f6b720 100644 --- a/Zotlabs/Web/Session.php +++ b/Zotlabs/Web/Session.php @@ -30,7 +30,7 @@ class Session { */ $custom_handler = $this->custom_handler; - call_hook('custom_session_handler',$custom_handler); + call_hooks('custom_session_handler', $custom_handler); $this->custom_handler = $custom_handler; From cd4d90c6479dad05e08faca2e9bbedc9b7710858 Mon Sep 17 00:00:00 2001 From: Mario Date: Tue, 29 Jan 2019 21:16:16 +0100 Subject: [PATCH 29/80] Revert "fix wrong function name and coding style" This reverts commit 456207b4e75ee4b28b60e90b44ef758dc95b2ebc --- Zotlabs/Web/Session.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zotlabs/Web/Session.php b/Zotlabs/Web/Session.php index 648f6b720..1ba120fa9 100644 --- a/Zotlabs/Web/Session.php +++ b/Zotlabs/Web/Session.php @@ -30,7 +30,7 @@ class Session { */ $custom_handler = $this->custom_handler; - call_hooks('custom_session_handler', $custom_handler); + call_hook('custom_session_handler',$custom_handler); $this->custom_handler = $custom_handler; From 913b620c66f32a4c89acbadfc4fdf751d3a34b17 Mon Sep 17 00:00:00 2001 From: Mario Date: Tue, 29 Jan 2019 21:16:38 +0100 Subject: [PATCH 30/80] Revert "Make session handler pluggable" This reverts commit 8972ca8134c16039c03ad83d26b75b9e9e21d7ea --- Zotlabs/Web/Session.php | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/Zotlabs/Web/Session.php b/Zotlabs/Web/Session.php index 1ba120fa9..4f2a3f1f7 100644 --- a/Zotlabs/Web/Session.php +++ b/Zotlabs/Web/Session.php @@ -15,7 +15,6 @@ class Session { private $handler = null; private $session_started = false; - private $custom_handler = false; public function init() { @@ -29,20 +28,13 @@ class Session { * Set our session storage functions. */ - $custom_handler = $this->custom_handler; - call_hook('custom_session_handler',$custom_handler); - $this->custom_handler = $custom_handler; + $handler = new \Zotlabs\Web\SessionHandler(); + $this->handler = $handler; - if (!$this->custom_handler) { - $handler = new \Zotlabs\Web\SessionHandler(); - - $this->handler = $handler; - - $x = session_set_save_handler($handler,false); - if(! $x) - logger('Session save handler initialisation failed.',LOGGER_NORMAL,LOG_ERR); - } + $x = session_set_save_handler($handler,false); + if(! $x) + logger('Session save handler initialisation failed.',LOGGER_NORMAL,LOG_ERR); // Force cookies to be secure (https only) if this site is SSL enabled. // Must be done before session_start(). @@ -94,17 +86,14 @@ class Session { $arr = session_get_cookie_params(); - if(($this->handler || $this->custom_handler) && $this->session_started) { + if($this->handler && $this->session_started) { session_regenerate_id(true); - if (!$this->custom_handler) { - // force SessionHandler record creation with the new session_id - // which occurs as a side effect of read() since not all implementations - // of session_regenerate_id() call read(). + // force SessionHandler record creation with the new session_id + // which occurs as a side effect of read() - $this->handler->read(session_id()); - } + $this->handler->read(session_id()); } else logger('no session handler'); From 4b516fdb0927021dc4ebb38513127699e48b87f9 Mon Sep 17 00:00:00 2001 From: Mark Nowiasz Date: Tue, 29 Jan 2019 21:41:23 +0100 Subject: [PATCH 31/80] Custom sessionhandler support, as requested --- Zotlabs/Web/Session.php | 42 ++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/Zotlabs/Web/Session.php b/Zotlabs/Web/Session.php index 4f2a3f1f7..31979c3f6 100644 --- a/Zotlabs/Web/Session.php +++ b/Zotlabs/Web/Session.php @@ -15,7 +15,7 @@ class Session { private $handler = null; private $session_started = false; - + private $custom_handler = false; public function init() { $gc_probability = 50; @@ -23,25 +23,44 @@ class Session { ini_set('session.gc_probability', $gc_probability); ini_set('session.use_only_cookies', 1); ini_set('session.cookie_httponly', 1); - + + $this->custom_handler = boolval(get_config('system', 'session_custom', false)); + /* * Set our session storage functions. */ + + if ($this->custom_handler) { + /* Custom handler (files, memached, redis..) */ - $handler = new \Zotlabs\Web\SessionHandler(); + $session_save_handler = strval(get_config('system', 'session_save_handler', Null)); + $session_save_path = strval(get_config('system', 'session_save_path', Null)); + $session_gc_probability = intval(get_config('system', 'session_gc_probability', 1)); + $session_gc_divisor = intval(get_config('system', 'session_gc_divisor', 100)); + if (!$session_save_handler || !$session_save_path) { + logger('Session save handler or path not set.',LOGGER_NORMAL,LOG_ERR); + } else { + ini_set('session.save_handler', $session_save_handler); + ini_set('session.save_path', $session_save_path); + ini_set('session.gc_probability', $session_gc_probability); + ini_set('session.gc_divisor', $session_gc_divisor); - $this->handler = $handler; + } + } else { + $handler = new \Zotlabs\Web\SessionHandler(); - $x = session_set_save_handler($handler,false); - if(! $x) - logger('Session save handler initialisation failed.',LOGGER_NORMAL,LOG_ERR); + $this->handler = $handler; + $x = session_set_save_handler($handler,false); + if(! $x) + logger('Session save handler initialisation failed.',LOGGER_NORMAL,LOG_ERR); + }; // Force cookies to be secure (https only) if this site is SSL enabled. // Must be done before session_start(). $arr = session_get_cookie_params(); - + // Note when setting cookies: set the domain to false which creates a single domain // cookie. If you use a hostname it will create a .domain.com wildcard which will // have some nasty side effects if you have any other subdomains running hubzilla. @@ -86,14 +105,15 @@ class Session { $arr = session_get_cookie_params(); - if($this->handler && $this->session_started) { + if(($this->handler || $this->custom_handler) && $this->session_started) { session_regenerate_id(true); // force SessionHandler record creation with the new session_id // which occurs as a side effect of read() - - $this->handler->read(session_id()); + if (! $this->custom_handler) { + $this->handler->read(session_id()); + } } else logger('no session handler'); From 3b31dbaa169345e95580e40c809d3cf3f0b642c2 Mon Sep 17 00:00:00 2001 From: Mario Vavti Date: Tue, 29 Jan 2019 22:37:30 +0100 Subject: [PATCH 32/80] clean up whitespace and remove superfluous semicolon --- Zotlabs/Web/Session.php | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/Zotlabs/Web/Session.php b/Zotlabs/Web/Session.php index 31979c3f6..fe0a3fbf9 100644 --- a/Zotlabs/Web/Session.php +++ b/Zotlabs/Web/Session.php @@ -30,23 +30,24 @@ class Session { * Set our session storage functions. */ - if ($this->custom_handler) { - /* Custom handler (files, memached, redis..) */ + if($this->custom_handler) { + /* Custom handler (files, memached, redis..) */ - $session_save_handler = strval(get_config('system', 'session_save_handler', Null)); - $session_save_path = strval(get_config('system', 'session_save_path', Null)); - $session_gc_probability = intval(get_config('system', 'session_gc_probability', 1)); - $session_gc_divisor = intval(get_config('system', 'session_gc_divisor', 100)); - if (!$session_save_handler || !$session_save_path) { - logger('Session save handler or path not set.',LOGGER_NORMAL,LOG_ERR); - } else { - ini_set('session.save_handler', $session_save_handler); - ini_set('session.save_path', $session_save_path); - ini_set('session.gc_probability', $session_gc_probability); - ini_set('session.gc_divisor', $session_gc_divisor); - - } - } else { + $session_save_handler = strval(get_config('system', 'session_save_handler', Null)); + $session_save_path = strval(get_config('system', 'session_save_path', Null)); + $session_gc_probability = intval(get_config('system', 'session_gc_probability', 1)); + $session_gc_divisor = intval(get_config('system', 'session_gc_divisor', 100)); + if(!$session_save_handler || !$session_save_path) { + logger('Session save handler or path not set.',LOGGER_NORMAL,LOG_ERR); + } + else { + ini_set('session.save_handler', $session_save_handler); + ini_set('session.save_path', $session_save_path); + ini_set('session.gc_probability', $session_gc_probability); + ini_set('session.gc_divisor', $session_gc_divisor); + } + } + else { $handler = new \Zotlabs\Web\SessionHandler(); $this->handler = $handler; @@ -54,7 +55,8 @@ class Session { $x = session_set_save_handler($handler,false); if(! $x) logger('Session save handler initialisation failed.',LOGGER_NORMAL,LOG_ERR); - }; + } + // Force cookies to be secure (https only) if this site is SSL enabled. // Must be done before session_start(). From b15421826d91d7344ad28a16f0be047c191d5ec4 Mon Sep 17 00:00:00 2001 From: zotlabs Date: Tue, 29 Jan 2019 15:14:49 -0800 Subject: [PATCH 33/80] cache embeds in the background on initial storage rather than on first access --- Zotlabs/Daemon/Cache_embeds.php | 27 +++++++++++++++++++++++++++ include/items.php | 12 ++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 Zotlabs/Daemon/Cache_embeds.php diff --git a/Zotlabs/Daemon/Cache_embeds.php b/Zotlabs/Daemon/Cache_embeds.php new file mode 100644 index 000000000..08088abd6 --- /dev/null +++ b/Zotlabs/Daemon/Cache_embeds.php @@ -0,0 +1,27 @@ + Date: Wed, 30 Jan 2019 18:33:10 -0800 Subject: [PATCH 34/80] set document title when title changes on a page update --- view/js/main.js | 1 + 1 file changed, 1 insertion(+) diff --git a/view/js/main.js b/view/js/main.js index fca9d125d..4718fb98f 100644 --- a/view/js/main.js +++ b/view/js/main.js @@ -734,6 +734,7 @@ function updateConvItems(mode,data) { title.replace(/\s+$/, ''); if (title) { savedTitle = title + " " + savedTitle; + document.title = title; } } } From 71adbd7c39760359e5b172812a53f398b8abb072 Mon Sep 17 00:00:00 2001 From: Max Kostikov Date: Thu, 31 Jan 2019 18:06:09 +0100 Subject: [PATCH 35/80] Update hmessages.po --- view/ru/hmessages.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/view/ru/hmessages.po b/view/ru/hmessages.po index f8c34f95d..79808438a 100644 --- a/view/ru/hmessages.po +++ b/view/ru/hmessages.po @@ -2230,7 +2230,7 @@ msgstr "Не удалось сохранить информацию аккаун #: ../../include/account.php:314 #, php-format msgid "Registration confirmation for %s" -msgstr "Подтверждение регистрации для %s" +msgstr "Подтверждение регистрации на %s" #: ../../include/account.php:385 #, php-format @@ -4523,7 +4523,7 @@ msgid "" "A verification token was sent to your email address [%s]. Enter that token " "here to complete the account verification step. Please allow a few minutes " "for delivery, and check your spam folder if you do not see the message." -msgstr "Проверочный токен был выслн на ваш адрес электронной почты [%s]. Введите этот токен здесь для завершения этапа проверки учётной записи. Пожалуйста, подождите несколько минут для завершения доставки и проверьте вашу папку \"Спам\" если вы не видите письма." +msgstr "Проверочный токен был отправлен на ваш адрес электронной почты [%s]. Введите этот токен здесь для завершения этапа проверки учётной записи. Пожалуйста, подождите несколько минут для завершения доставки и проверьте вашу папку \"Спам\" если вы не видите письма." #: ../../Zotlabs/Module/Email_validation.php:38 msgid "Resend Email" From c1159337dae9a18f704228ed255428d76f7c498a Mon Sep 17 00:00:00 2001 From: Max Kostikov Date: Thu, 31 Jan 2019 18:06:19 +0100 Subject: [PATCH 36/80] Update hstrings.php --- view/ru/hstrings.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/view/ru/hstrings.php b/view/ru/hstrings.php index ee4c31619..90bb2b855 100644 --- a/view/ru/hstrings.php +++ b/view/ru/hstrings.php @@ -444,7 +444,7 @@ App::$strings["An invitation is required."] = "Требуется приглаш App::$strings["Invitation could not be verified."] = "Не удалось проверить приглашение."; App::$strings["Please enter the required information."] = "Пожалуйста, введите необходимую информацию."; App::$strings["Failed to store account information."] = "Не удалось сохранить информацию аккаунта."; -App::$strings["Registration confirmation for %s"] = "Подтверждение регистрации для %s"; +App::$strings["Registration confirmation for %s"] = "Подтверждение регистрации на %s"; App::$strings["Registration request at %s"] = "Запрос регистрации на %s"; App::$strings["your registration password"] = "ваш пароль регистрации"; App::$strings["Registration details for %s"] = "Регистрационные данные для %s"; @@ -998,7 +998,7 @@ App::$strings["Privacy group: "] = "Группа безопасности: "; App::$strings["Invalid channel."] = "Недействительный канал."; App::$strings["Token verification failed."] = "Не удалось выполнить проверку токена."; App::$strings["Email Verification Required"] = "Требуется проверка адреса email"; -App::$strings["A verification token was sent to your email address [%s]. Enter that token here to complete the account verification step. Please allow a few minutes for delivery, and check your spam folder if you do not see the message."] = "Проверочный токен был выслн на ваш адрес электронной почты [%s]. Введите этот токен здесь для завершения этапа проверки учётной записи. Пожалуйста, подождите несколько минут для завершения доставки и проверьте вашу папку \"Спам\" если вы не видите письма."; +App::$strings["A verification token was sent to your email address [%s]. Enter that token here to complete the account verification step. Please allow a few minutes for delivery, and check your spam folder if you do not see the message."] = "Проверочный токен был отправлен на ваш адрес электронной почты [%s]. Введите этот токен здесь для завершения этапа проверки учётной записи. Пожалуйста, подождите несколько минут для завершения доставки и проверьте вашу папку \"Спам\" если вы не видите письма."; App::$strings["Resend Email"] = "Выслать повторно"; App::$strings["Validation token"] = "Проверочный токен"; App::$strings["No channel."] = "Канала нет."; From 004246163dd4482ae1d0d442d30256db8ed1535a Mon Sep 17 00:00:00 2001 From: Mario Date: Thu, 31 Jan 2019 18:39:07 +0100 Subject: [PATCH 37/80] starring and filing is only supported for post item type --- Zotlabs/Lib/ThreadItem.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zotlabs/Lib/ThreadItem.php b/Zotlabs/Lib/ThreadItem.php index 83d243177..dc84df316 100644 --- a/Zotlabs/Lib/ThreadItem.php +++ b/Zotlabs/Lib/ThreadItem.php @@ -411,9 +411,9 @@ class ThreadItem { 'rawmid' => $item['mid'], 'plink' => get_plink($item), 'edpost' => $edpost, // ((feature_enabled($conv->get_profile_owner(),'edit_posts')) ? $edpost : ''), - 'star' => ((feature_enabled($conv->get_profile_owner(),'star_posts')) ? $star : ''), + 'star' => ((feature_enabled($conv->get_profile_owner(),'star_posts') && ($item['item_type'] == ITEM_TYPE_POST)) ? $star : ''), 'tagger' => ((feature_enabled($conv->get_profile_owner(),'commtag')) ? $tagger : ''), - 'filer' => ((feature_enabled($conv->get_profile_owner(),'filing')) ? $filer : ''), + 'filer' => ((feature_enabled($conv->get_profile_owner(),'filing') && ($item['item_type'] == ITEM_TYPE_POST)) ? $filer : ''), 'bookmark' => (($conv->get_profile_owner() == local_channel() && local_channel() && $has_bookmarks) ? t('Save Bookmarks') : ''), 'addtocal' => (($has_event) ? t('Add to Calendar') : ''), 'drop' => $drop, From ad4dd2def58999c58fc12def0e6b5789597f5581 Mon Sep 17 00:00:00 2001 From: "M. Dent" Date: Fri, 1 Feb 2019 09:29:59 +0100 Subject: [PATCH 38/80] Set lock red and provide warning if a forum is tagged in the post --- Zotlabs/Lib/ThreadItem.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Zotlabs/Lib/ThreadItem.php b/Zotlabs/Lib/ThreadItem.php index dc84df316..7ce0d0f9e 100644 --- a/Zotlabs/Lib/ThreadItem.php +++ b/Zotlabs/Lib/ThreadItem.php @@ -101,6 +101,7 @@ class ThreadItem { || strlen($item['deny_cid']) || strlen($item['deny_gid'])))) ? t('Private Message') : false); + $shareable = ((($conv->get_profile_owner() == local_channel() && local_channel()) && ($item['item_private'] != 1)) ? true : false); // allow an exemption for sharing stuff from your private feeds @@ -115,6 +116,16 @@ class ThreadItem { $privacy_warning = true; } + if ($lock) { + if (count(get_terms_oftype($item['term'],TERM_FORUM))) { + $privacy_warning = true; + } + } + + if ($lock && $privacy_warning) { + $lock = t('Privacy conflict. Discretion advised.'); + } + $mode = $conv->get_mode(); switch($item['item_type']) { From 6462c83f69969e1b3a945292a4a9e8df7e730936 Mon Sep 17 00:00:00 2001 From: Max Kostikov Date: Fri, 1 Feb 2019 15:47:51 +0100 Subject: [PATCH 39/80] Prevent Hubzilla usage for SEO backlinks --- include/text.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/text.php b/include/text.php index 7d253e3d7..b6a1004c2 100644 --- a/include/text.php +++ b/include/text.php @@ -1093,7 +1093,7 @@ function searchbox($s,$id='search-box',$url='/search',$save = false) { * @return string */ function linkify($s, $me = false) { - $s = preg_replace("/(https?\:\/\/[a-zA-Z0-9\pL\:\/\-\?\&\;\.\=\_\@\~\#\'\%\$\!\+\,\@]*)/u", (($me) ? ' $1' : ' $1'), $s); + $s = preg_replace("/(https?\:\/\/[a-zA-Z0-9\pL\:\/\-\?\&\;\.\=\_\@\~\#\'\%\$\!\+\,\@]*)/u", (($me) ? ' $1' : ' $1'), $s); $s = preg_replace("/\<(.*?)(src|href)=(.*?)\&\;(.*?)\>/ism",'<$1$2=$3&$4>',$s); return($s); From 708d2881217a3a66d5ff64a33365e0cb96353962 Mon Sep 17 00:00:00 2001 From: "DM42.Net (Matt Dent)" Date: Fri, 1 Feb 2019 00:12:45 -0500 Subject: [PATCH 40/80] Add filter hooks and the ability to add buttons to the default status editor --- doc/hook/jot_header_tpl_filter.bb | 5 +++++ doc/hook/jot_tpl_filter.bb | 5 +++++ doc/hooklist.bb | 6 ++++++ include/conversation.php | 19 ++++++++++++++----- view/tpl/jot.tpl | 12 +++++++++++- 5 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 doc/hook/jot_header_tpl_filter.bb create mode 100644 doc/hook/jot_tpl_filter.bb diff --git a/doc/hook/jot_header_tpl_filter.bb b/doc/hook/jot_header_tpl_filter.bb new file mode 100644 index 000000000..b17d81d03 --- /dev/null +++ b/doc/hook/jot_header_tpl_filter.bb @@ -0,0 +1,5 @@ +[h2]jot_header_tpl_filter[/h2] + +Allows addon developers to modify the values of replacements fed into jot-header.tpl + +cxref: include/conversation.php diff --git a/doc/hook/jot_tpl_filter.bb b/doc/hook/jot_tpl_filter.bb new file mode 100644 index 000000000..426da3c56 --- /dev/null +++ b/doc/hook/jot_tpl_filter.bb @@ -0,0 +1,5 @@ +[h2]jot_tpl_filter[/h2] + +Allows addon developers to alter the macro replacements prior to being fed into jot.tpl + +cxref: include/conversation.php diff --git a/doc/hooklist.bb b/doc/hooklist.bb index 6d56d5e71..5a804c819 100644 --- a/doc/hooklist.bb +++ b/doc/hooklist.bb @@ -370,6 +370,12 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the [zrl=[baseurl]/help/hook/jot_tool]jot_tool[/zrl] Deprecated and possibly obsolete. Allows one to add action buttons to the post editor. +[zrl=[baseurl]/help/hook/jot_tpl_filter]jot_tpl_filter[/zrl] + Called to filter template vars before replacement in jot.tpl. + +[zrl=[baseurl]/help/hook/jot_header_tpl_filter]jot_header_tpl_filter[/zrl] + Called to filter template vars before replacement in jot_header.tpl. + [zrl=[baseurl]/help/hook/legal_webbie]legal_webbie[/zrl] Called to validate a channel address diff --git a/include/conversation.php b/include/conversation.php index 041994b90..e2dd02ffc 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -1328,7 +1328,7 @@ function hz_status_editor($a, $x, $popup = false) { $tpl = get_markup_template('jot-header.tpl'); - App::$page['htmlhead'] .= replace_macros($tpl, array( + $tplmacros = [ '$baseurl' => z_root(), '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'), '$pretext' => ((x($x,'pretext')) ? $x['pretext'] : ''), @@ -1349,7 +1349,10 @@ function hz_status_editor($a, $x, $popup = false) { '$nocomment_disabled' => t('Comments disabled'), '$auto_save_draft' => $feature_auto_save_draft, '$reset' => $reset - )); + ]; + + call_hooks('jot_header_tpl_filter',$tplmacros); + App::$page['htmlhead'] .= replace_macros($tpl, $tplmacros); $tpl = get_markup_template('jot.tpl'); @@ -1389,7 +1392,7 @@ function hz_status_editor($a, $x, $popup = false) { $sharebutton = (x($x,'button') ? $x['button'] : t('Share')); $placeholdtext = (x($x,'content_label') ? $x['content_label'] : $sharebutton); - $o .= replace_macros($tpl, array( + $tplmacros = [ '$return_path' => ((x($x, 'return_path')) ? $x['return_path'] : App::$query_string), '$action' => z_root() . '/item', '$share' => $sharebutton, @@ -1463,9 +1466,15 @@ function hz_status_editor($a, $x, $popup = false) { '$bbcode' => ((x($x, 'bbcode')) ? $x['bbcode'] : false), '$parent' => ((array_key_exists('parent',$x) && $x['parent']) ? $x['parent'] : 0), '$reset' => $reset, - '$is_owner' => ((local_channel() && (local_channel() == $x['profile_uid'])) ? true : false) - )); + '$is_owner' => ((local_channel() && (local_channel() == $x['profile_uid'])) ? true : false), + '$custommoretoolsdropdown' => '', + '$custommoretoolsbuttons' => '', + '$customsubmitright' => [] + ]; + call_hooks('jot_tpl_filter',$tplmacros); + + $o .= replace_macros($tpl, $tplmacros); if ($popup === true) { $o = ''; } diff --git a/view/tpl/jot.tpl b/view/tpl/jot.tpl index 4eae33d13..12509fc59 100755 --- a/view/tpl/jot.tpl +++ b/view/tpl/jot.tpl @@ -137,8 +137,11 @@ {{/if}} + {{if $custommoretoolsbuttons}} + {{$custommoretoolsbuttons}} + {{/if}} - {{if $writefiles || $weblink || $setloc || $clearloc || $feature_expire || $feature_encrypt || $feature_voting}} + {{if $writefiles || $weblink || $setloc || $clearloc || $feature_expire || $feature_encrypt || $feature_voting || $custommoretoolsdropdown}}
{{/if}} @@ -186,6 +191,11 @@
+ {{foreach $customsubmitright as $csr}} + + {{/foreach}} {{if $preview}}