diff options
author | Manuel Jiménez Friaza <mjfriaza@openmailbox.org> | 2018-11-24 13:01:01 +0100 |
---|---|---|
committer | Manuel Jiménez Friaza <mjfriaza@openmailbox.org> | 2018-11-24 13:01:01 +0100 |
commit | f865d6e5dab19122fffc677da495b21d3d5e93e7 (patch) | |
tree | 8631750db2c385438207326479350ea909a625b4 | |
parent | 0bba9482dfbcc0fd8bea880ac3820548281ecfc2 (diff) | |
parent | bc9f2922e0e255e97cb607d099f60c8a81c4736f (diff) | |
download | volse-hubzilla-f865d6e5dab19122fffc677da495b21d3d5e93e7.tar.gz volse-hubzilla-f865d6e5dab19122fffc677da495b21d3d5e93e7.tar.bz2 volse-hubzilla-f865d6e5dab19122fffc677da495b21d3d5e93e7.zip |
Resolved merge conflicts
54 files changed, 1770 insertions, 1060 deletions
diff --git a/.homeinstall/README.md b/.homeinstall/README.md index aeecb9184..d63931a84 100644 --- a/.homeinstall/README.md +++ b/.homeinstall/README.md @@ -5,8 +5,8 @@ Run hubzilla-setup.sh for an unattended installation of hubzilla. The script is known to work without adjustments with + Hardware - - Mini-PC with Debian-9.2-amd64, or - - Rapberry 3 with Raspbian, Debian-9.3 + - Mini-PC with Debian-9.5-amd64, or + - Rapberry 3 with Raspbian, Debian-9.5 + DynDNS - selfHOST.de - freedns.afraid.org @@ -38,7 +38,7 @@ Software - apt-get install git - mkdir -p /var/www - cd /var/www - - git clone https://github.com/redmatrix/hubzilla.git html + - git clone https://framagit.org/hubzilla/core.git html - cd html/.homeinstall - cp hubzilla-config.txt.template hubzilla-config.txt - nano hubzilla-config.txt @@ -100,7 +100,7 @@ Create bootable USB drive with Debian on it.You could use Example for command dd... su - - dd if=2017-11-29-raspbian-stretch.img of=/dev/mmcblk0 + dd if=2018-10-09-raspbian-stretch.img of=/dev/mmcblk0 Do not forget to unmount the SD card before and check if unmounted like in this example... @@ -164,7 +164,7 @@ Make the directory for apache and change diretory to it Clone hubzilla from git ("git pull" will update it later) - git clone https://framagit.org/hubzilla/core html + git clone https://framagit.org/hubzilla/core.git html Change to the install script @@ -217,14 +217,20 @@ After the daily script was executed at 05:30 (am) - optionally view the daily log under yourdomain.org/admin/logs/ - set the logfile to var/www/html/hubzilla-daily.log -## Note for the Rasperry -The script was tested with an Raspberry 3 under Raspian (Debian 9.3, 2017-11-29-raspbian-stretch.img). +## Install Hubzilla in a Virtual Machine for Test Purposes + +Modify the file "hubzilla-config.txt". + + nano hubzilla-config.txt -It is recommended to deinstall these programms to avoid endless updates. Use... +There use + + le_domain=localhost + +## Note for the Rasperry - sudo apt-get purge wolfram-engine sonic-pi - sudo apt-get autoremove +The script was tested with an Raspberry 3 under Raspian (Debian 9.5, 2018-10-09-raspbian-stretch.img). It is recommended to run the Raspi without graphical frontend (X-Server). Use... @@ -234,7 +240,7 @@ to boot the Rapsi to the client console. DO NOT FORGET TO CHANGE THE DEFAULT PASSWORD FOR USER PI! -On a Raspian Stretch (Debian 9) the validation of the mail address fails for the very first user. +If the validation of the mail address fails for the very first registered user... This used to happen on some *bsd distros but there was some work to fix that a year ago (2017). So if your system isn't registered in DNS or DNS isn't active do diff --git a/.homeinstall/hubzilla-config.txt.template b/.homeinstall/hubzilla-config.txt.template index 2776ccd27..e42da0e4e 100644 --- a/.homeinstall/hubzilla-config.txt.template +++ b/.homeinstall/hubzilla-config.txt.template @@ -18,6 +18,8 @@ db_pass= # Example: my.cooldomain.org # Example: cooldomain.org # +# Example: localhost (test installation without certificates for httpS) +# # Email is optional # # diff --git a/.homeinstall/hubzilla-setup.sh b/.homeinstall/hubzilla-setup.sh index ff101086c..1f3ad5db5 100755 --- a/.homeinstall/hubzilla-setup.sh +++ b/.homeinstall/hubzilla-setup.sh @@ -816,15 +816,35 @@ install_run_selfhost ping_domain configure_cron_freedns configure_cron_selfhost -install_letsencrypt -configure_apache_for_https -check_https + +if [ "$le_domain" != "localhost" ] +then + install_letsencrypt + configure_apache_for_https + check_https +else + print_info "is localhost - skipped installation of letsencrypt and configuration of apache for https" +fi + install_hubzilla -rewrite_to_https -install_rsnapshot + +if [ "$le_domain" != "localhost" ] +then + rewrite_to_https + install_rsnapshot +else + print_info "is localhost - skipped rewrite to https and installation of rsnapshot" +fi + configure_cron_daily -install_cryptosetup -write_uninstall_script + +if [ "$le_domain" != "localhost" ] +then + install_cryptosetup + write_uninstall_script +else + print_info "is localhost - skipped installation of cryptosetup" +fi #set +x # stop debugging from here diff --git a/Zotlabs/Daemon/Deliver.php b/Zotlabs/Daemon/Deliver.php index b809cba91..43f426eb7 100644 --- a/Zotlabs/Daemon/Deliver.php +++ b/Zotlabs/Daemon/Deliver.php @@ -2,6 +2,8 @@ namespace Zotlabs\Daemon; +use Zotlabs\Lib\DReport; + require_once('include/zot.php'); require_once('include/queue_fn.php'); @@ -58,11 +60,12 @@ class Deliver { foreach($dresult as $xx) { if(is_array($xx) && array_key_exists('message_id',$xx)) { - if(delivery_report_is_storable($xx)) { - q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_result, dreport_time, dreport_xchan ) values ( '%s', '%s','%s','%s','%s','%s' ) ", + if(DReport::is_storable($xx)) { + q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_name, dreport_result, dreport_time, dreport_xchan ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ", dbesc($xx['message_id']), dbesc($xx['location']), dbesc($xx['recipient']), + dbesc(($xx['name']) ? $xx['name'] : EMPTY_STR), dbesc($xx['status']), dbesc(datetime_convert($xx['date'])), dbesc($xx['sender']) diff --git a/Zotlabs/Daemon/Notifier.php b/Zotlabs/Daemon/Notifier.php index f74c8f11c..8b81c49da 100644 --- a/Zotlabs/Daemon/Notifier.php +++ b/Zotlabs/Daemon/Notifier.php @@ -2,6 +2,8 @@ namespace Zotlabs\Daemon; +use Zotlabs\Lib\Libzot; + require_once('include/queue_fn.php'); require_once('include/html2plain.php'); require_once('include/conversation.php'); @@ -344,7 +346,16 @@ class Notifier { return; $encoded_item = encode_item($target_item); - + + // activitystreams version + $m = get_iconfig($target_item,'activitystreams','signed_data'); + if($m) { + $activity = json_decode($m,true); + } + else { + $activity = \Zotlabs\Lib\Activity::encode_activity($target_item); + } + // Send comments to the owner to re-deliver to everybody in the conversation // We only do this if the item in question originated on this site. This prevents looping. // To clarify, a site accepting a new comment is responsible for sending it to the owner for relay. @@ -561,7 +572,7 @@ class Notifier { logger('notifier_hub: ' . $hub['hubloc_url'],LOGGER_DEBUG); - if($hub['hubloc_network'] !== 'zot') { + if(! in_array($hub['hubloc_network'], [ 'zot','zot6' ])) { $narr = [ 'channel' => $channel, 'upstream' => $upstream, @@ -610,20 +621,27 @@ class Notifier { continue; } - // default: zot protocol + if(! in_array($hub['hubloc_network'], [ 'zot','zot6' ])) { + continue; + } - $hash = random_string(); + $hash = new_uuid(); $packet = null; $pmsg = ''; if($packet_type === 'refresh' || $packet_type === 'purge') { - $packet = zot_build_packet($channel,$packet_type,(($packet_recips) ? $packet_recips : null)); + if($hub['hubloc_network'] === 'zot6') { + $packet = Libzot::build_packet($channel, $packet_type, ids_to_array($packet_recips,'hash')); + } + else { + $packet = zot_build_packet($channel,$packet_type,(($packet_recips) ? $packet_recips : null)); + } } - if($packet_type === 'keychange') { + if($packet_type === 'keychange' && $hub['hubloc_network'] === 'zot') { $pmsg = get_pconfig($channel['channel_id'],'system','keychange'); $packet = zot_build_packet($channel,$packet_type,(($packet_recips) ? $packet_recips : null)); } - elseif($packet_type === 'request') { + elseif($packet_type === 'request' && $hub['hubloc_network'] === 'zot') { $env = (($hub_env && $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']]) ? $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']] : ''); $packet = zot_build_packet($channel,$packet_type,$env,$hub['hubloc_sitekey'],$hub['site_crypto'], $hash, array('message_id' => $request_message_id) @@ -636,6 +654,7 @@ class Notifier { 'account_id' => $channel['channel_account_id'], 'channel_id' => $channel['channel_id'], 'posturl' => $hub['hubloc_callback'], + 'driver' => $hub['hubloc_network'], 'notify' => $packet, 'msg' => (($pmsg) ? json_encode($pmsg) : '') )); @@ -643,18 +662,32 @@ class Notifier { else { $env = (($hub_env && $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']]) ? $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']] : ''); - // currently zot6 delivery is only performed on normal items and not sync items or mail or anything else - // Eventually we will do this for all deliveries, but for now ensure this is precisely what we are dealing - // with before switching to zot6 as the primary zot6 handler checks for the existence of a message delivery report - // to trigger dequeue'ing - $z6 = (($encoded_item && $encoded_item['type'] === 'activity' && (! array_key_exists('allow_cid',$encoded_item))) ? true : false); - if($z6) { - $packet = zot6_build_packet($channel,'notify',$env, json_encode($encoded_item), (($private) ? $hub['hubloc_sitekey'] : null), $hub['site_crypto'],$hash); + if($hub['hubloc_network'] === 'zot6') { + $zenv = []; + if($env) { + foreach($env as $e) { + $zenv[] = $e['hash']; + } + } + + $packet_type = (($upstream || $uplink) ? 'response' : 'activity'); + $packet = Libzot::build_packet($channel,$packet_type,$zenv,$activity,'activitystreams',(($private) ? $hub['hubloc_sitekey'] : null),$hub['site_crypto']); } else { - $packet = zot_build_packet($channel,'notify',$env, (($private) ? $hub['hubloc_sitekey'] : null), $hub['site_crypto'],$hash); + // currently zot6 delivery is only performed on normal items and not sync items or mail or anything else + // Eventually we will do this for all deliveries, but for now ensure this is precisely what we are dealing + // with before switching to zot6 as the primary zot6 handler checks for the existence of a message delivery report + // to trigger dequeue'ing + + $z6 = (($encoded_item && $encoded_item['type'] === 'activity' && (! array_key_exists('allow_cid',$encoded_item))) ? true : false); + if($z6) { + $packet = zot6_build_packet($channel,'notify',$env, json_encode($encoded_item), (($private) ? $hub['hubloc_sitekey'] : null), $hub['site_crypto'],$hash); + } + else { + $packet = zot_build_packet($channel,'notify',$env, (($private) ? $hub['hubloc_sitekey'] : null), $hub['site_crypto'],$hash); + } } queue_insert( @@ -663,6 +696,7 @@ class Notifier { 'account_id' => $target_item['aid'], 'channel_id' => $target_item['uid'], 'posturl' => $hub['hubloc_callback'], + 'driver' => $hub['hubloc_network'], 'notify' => $packet, 'msg' => json_encode($encoded_item) ] diff --git a/Zotlabs/Lib/ActivityStreams.php b/Zotlabs/Lib/ActivityStreams.php index 37e717f58..49978031e 100644 --- a/Zotlabs/Lib/ActivityStreams.php +++ b/Zotlabs/Lib/ActivityStreams.php @@ -7,22 +7,25 @@ namespace Zotlabs\Lib; * * Parses an ActivityStream JSON string. */ + class ActivityStreams { - public $raw = null; - public $data; - public $valid = false; - public $id = ''; - public $type = ''; - public $actor = null; - public $obj = null; - public $tgt = null; - public $origin = null; - public $owner = null; - public $signer = null; - public $ldsig = null; - public $sigok = false; - public $recips = null; + public $raw = null; + public $data = null; + public $valid = false; + public $deleted = false; + public $id = ''; + public $parent_id = ''; + public $type = ''; + public $actor = null; + public $obj = null; + public $tgt = null; + public $origin = null; + public $owner = null; + public $signer = null; + public $ldsig = null; + public $sigok = false; + public $recips = null; public $raw_recips = null; /** @@ -35,16 +38,49 @@ class ActivityStreams { function __construct($string) { $this->raw = $string; - $this->data = json_decode($string, true); + + if(is_array($string)) { + $this->data = $string; + } + else { + $this->data = json_decode($string, true); + } if($this->data) { + + // verify and unpack JSalmon signature if present + + if(is_array($this->data) && array_key_exists('signed',$this->data)) { + $ret = JSalmon::verify($this->data); + $tmp = JSalmon::unpack($this->data['data']); + if($ret && $ret['success']) { + if($ret['signer']) { + $saved = json_encode($this->data,JSON_UNESCAPED_SLASHES); + $this->data = $tmp; + $this->data['signer'] = $ret['signer']; + $this->data['signed_data'] = $saved; + if($ret['hubloc']) { + $this->data['hubloc'] = $ret['hubloc']; + } + } + } + } + $this->valid = true; + + if(array_key_exists('type',$this->data) && array_key_exists('actor',$this->data) && array_key_exists('object',$this->data)) { + if($this->data['type'] === 'Delete' && $this->data['actor'] === $this->data['object']) { + $this->deleted = $this->data['actor']; + $this->valid = false; + } + } + } if($this->is_valid()) { $this->id = $this->get_property_obj('id'); $this->type = $this->get_primary_type(); - $this->actor = $this->get_compound_property('actor'); + $this->actor = $this->get_actor('actor','',''); $this->obj = $this->get_compound_property('object'); $this->tgt = $this->get_compound_property('target'); $this->origin = $this->get_compound_property('origin'); @@ -53,14 +89,31 @@ class ActivityStreams { $this->ldsig = $this->get_compound_property('signature'); if($this->ldsig) { $this->signer = $this->get_compound_property('creator',$this->ldsig); - if($this->signer && $this->signer['publicKey'] && $this->signer['publicKey']['publicKeyPem']) { - $this->sigok = \Zotlabs\Lib\LDSignatures::verify($this->data,$this->signer['publicKey']['publicKeyPem']); + if($this->signer && is_array($this->signer) && array_key_exists('publicKey',$this->signer) && is_array($this->signer['publicKey']) && $this->signer['publicKey']['publicKeyPem']) { + $this->sigok = LDSignatures::verify($this->data,$this->signer['publicKey']['publicKeyPem']); } } - if(($this->type === 'Note') && (! $this->obj)) { + if(! $this->obj) { $this->obj = $this->data; $this->type = 'Create'; + if(! $this->actor) { + $this->actor = $this->get_actor('attributedTo',$this->obj); + } + } + + if($this->obj && is_array($this->obj) && $this->obj['actor']) + $this->obj['actor'] = $this->get_actor('actor',$this->obj); + if($this->tgt && is_array($this->tgt) && $this->tgt['actor']) + $this->tgt['actor'] = $this->get_actor('actor',$this->tgt); + + $this->parent_id = $this->get_property_obj('inReplyTo'); + + if((! $this->parent_id) && is_array($this->obj)) { + $this->parent_id = $this->obj['inReplyTo']; + } + if((! $this->parent_id) && is_array($this->obj)) { + $this->parent_id = $this->obj['id']; } } } @@ -190,44 +243,122 @@ class ActivityStreams { $base = (($base) ? $base : $this->data); $propname = (($prefix) ? $prefix . ':' : '') . $property; + if(! is_array($base)) { + btlogger('not an array: ' . print_r($base,true)); + return null; + } + return ((array_key_exists($propname, $base)) ? $base[$propname] : null); } + /** * @brief Fetches a property from an URL. * * @param string $url * @return NULL|mixed */ + function fetch_property($url) { + return self::fetch($url); + } + + static function fetch($url) { $redirects = 0; if(! check_siteallowed($url)) { logger('blacklisted: ' . $url); return null; } - + logger('fetch: ' . $url, LOGGER_DEBUG); $x = z_fetch_url($url, true, $redirects, - ['headers' => [ 'Accept: application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams"' ]]); - if($x['success']) + [ 'headers' => [ 'Accept: application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams"' ]]); + if($x['success']) { + $y = json_decode($x['body'],true); + logger('returned: ' . json_encode($y,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES)); return json_decode($x['body'], true); + } + else { + logger('fetch failed: ' . $url); + } + return null; + } + + static function is_an_actor($s) { + return(in_array($s,[ 'Application','Group','Organization','Person','Service' ])); + } + + /** + * @brief + * + * @param string $property + * @param array $base + * @param string $namespace (optional) default empty + * @return NULL|mixed + */ + + function get_actor($property,$base='',$namespace = '') { + $x = $this->get_property_obj($property, $base, $namespace); + if($this->is_url($x)) { + + // SECURITY: If we have already stored the actor profile, re-generate it + // from cached data - don't refetch it from the network + $r = q("select * from xchan left join hubloc on xchan_hash = hubloc_hash where hubloc_id_url = '%s' limit 1", + dbesc($x) + ); + if($r) { + $y = Activity::encode_person($r[0]); + $y['cached'] = true; + return $y; + } + } + $actor = $this->get_compound_property($property,$base,$namespace,true); + if(is_array($actor) && self::is_an_actor($actor['type'])) { + if(array_key_exists('id',$actor) && (! array_key_exists('inbox',$actor))) { + $actor = $this->fetch_property($actor['id']); + } + return $actor; + } return null; } + /** * @brief * * @param string $property * @param array $base * @param string $namespace (optional) default empty + * @param boolean $first (optional) default false, if true and result is a sequential array return only the first element * @return NULL|mixed */ - function get_compound_property($property, $base = '', $namespace = '') { + function get_compound_property($property, $base = '', $namespace = '', $first = false) { $x = $this->get_property_obj($property, $base, $namespace); if($this->is_url($x)) { $x = $this->fetch_property($x); } + // verify and unpack JSalmon signature if present + + if(is_array($x) && array_key_exists('signed',$x)) { + $ret = JSalmon::verify($x); + $tmp = JSalmon::unpack($x['data']); + if($ret && $ret['success']) { + if($ret['signer']) { + $saved = json_encode($x,JSON_UNESCAPED_SLASHES); + $x = $tmp; + $x['signer'] = $ret['signer']; + $x['signed_data'] = $saved; + if($ret['hubloc']) { + $x['hubloc'] = $ret['hubloc']; + } + } + } + } + if($first && is_array($x) && array_key_exists(0,$x)) { + return $x[0]; + } + return $x; } @@ -273,4 +404,18 @@ class ActivityStreams { return $x; } + + static function is_as_request() { + + $x = getBestSupportedMimeType([ + 'application/ld+json;profile="https://www.w3.org/ns/activitystreams"', + 'application/activity+json', + 'application/ld+json;profile="http://www.w3.org/ns/activitystreams"' + ]); + + return(($x) ? true : false); + + } + + }
\ No newline at end of file diff --git a/Zotlabs/Lib/DReport.php b/Zotlabs/Lib/DReport.php index a68d6c18f..21b320cac 100644 --- a/Zotlabs/Lib/DReport.php +++ b/Zotlabs/Lib/DReport.php @@ -14,6 +14,7 @@ class DReport { $this->location = $location; $this->sender = $sender; $this->recipient = $recipient; + $this->name = EMPTY_STR; $this->message_id = $message_id; $this->status = $status; $this->date = datetime_convert(); @@ -24,8 +25,8 @@ class DReport { $this->date = datetime_convert(); } - function addto_recipient($name) { - $this->recipient = $this->recipient . ' ' . $name; + function set_name($name) { + $this->name = $name; } function addto_update($status) { @@ -37,6 +38,7 @@ class DReport { $this->location = $arr['location']; $this->sender = $arr['sender']; $this->recipient = $arr['recipient']; + $this->name = $arr['name']; $this->message_id = $arr['message_id']; $this->status = $arr['status']; $this->date = $arr['date']; @@ -47,9 +49,87 @@ class DReport { 'location' => $this->location, 'sender' => $this->sender, 'recipient' => $this->recipient, + 'name' => $this->name, 'message_id' => $this->message_id, 'status' => $this->status, 'date' => $this->date ); } + + /** + * @brief decide whether to store a returned delivery report + * + * @param array $dr + * @return boolean + */ + + static function is_storable($dr) { + + if(get_config('system', 'disable_dreport')) + return false; + + /** + * @hooks dreport_is_storable + * Called before storing a dreport record to determine whether to store it. + * * \e array + */ + + call_hooks('dreport_is_storable', $dr); + + // let plugins accept or reject - if neither, continue on + if(array_key_exists('accept',$dr) && intval($dr['accept'])) + return true; + if(array_key_exists('reject',$dr) && intval($dr['reject'])) + return false; + + if(! ($dr['sender'])) + return false; + + // Is the sender one of our channels? + + $c = q("select channel_id from channel where channel_hash = '%s' limit 1", + dbesc($dr['sender']) + ); + if(! $c) + return false; + + + // is the recipient one of our connections, or do we want to store every report? + + + $rxchan = $dr['recipient']; + $pcf = get_pconfig($c[0]['channel_id'],'system','dreport_store_all'); + if($pcf) + return true; + + // We always add ourself as a recipient to private and relayed posts + // So if a remote site says they can't find us, that's no big surprise + // and just creates a lot of extra report noise + + if(($dr['location'] !== z_root()) && ($dr['sender'] === $rxchan) && ($dr['status'] === 'recipient_not_found')) + return false; + + // If you have a private post with a recipient list, every single site is going to report + // back a failed delivery for anybody on that list that isn't local to them. We're only + // concerned about this if we have a local hubloc record which says we expected them to + // have a channel on that site. + + $r = q("select hubloc_id from hubloc where hubloc_hash = '%s' and hubloc_url = '%s'", + dbesc($rxchan), + dbesc($dr['location']) + ); + if((! $r) && ($dr['status'] === 'recipient_not_found')) + return false; + + $r = q("select abook_id from abook where abook_xchan = '%s' and abook_channel = %d limit 1", + dbesc($rxchan), + intval($c[0]['channel_id']) + ); + if($r) + return true; + + return false; + } + + } diff --git a/Zotlabs/Lib/JSalmon.php b/Zotlabs/Lib/JSalmon.php index 43d5f9d09..f35bf6235 100644 --- a/Zotlabs/Lib/JSalmon.php +++ b/Zotlabs/Lib/JSalmon.php @@ -2,15 +2,13 @@ namespace Zotlabs\Lib; +use Zotlabs\Zot6\HTTPSig; class JSalmon { - static function sign($data,$key_id,$key) { + static function sign($data,$key_id,$key,$data_type = 'application/x-zot+json') { - $arr = $data; - $data = json_encode($data,JSON_UNESCAPED_SLASHES); - $data = base64url_encode($data, false); // do not strip padding - $data_type = 'application/x-zot+json'; + $data = base64url_encode(json_encode($data,true),true); // strip padding $encoding = 'base64url'; $algorithm = 'RSA-SHA256'; @@ -18,9 +16,9 @@ class JSalmon { // precomputed base64url encoding of data_type, encoding, algorithm concatenated with periods - $precomputed = '.' . base64url_encode($data_type,false) . '.YmFzZTY0dXJs.UlNBLVNIQTI1Ng=='; + $precomputed = '.' . base64url_encode($data_type,true) . '.YmFzZTY0dXJs.UlNBLVNIQTI1Ng'; - $signature = base64url_encode(rsa_sign($data . $precomputed, $key), false); + $signature = base64url_encode(rsa_sign($data . $precomputed, $key), true); return ([ 'signed' => true, @@ -30,9 +28,45 @@ class JSalmon { 'alg' => $algorithm, 'sigs' => [ 'value' => $signature, - 'key_id' => base64url_encode($key_id) + 'key_id' => base64url_encode($key_id, true) ] ]); } + + static function verify($x) { + + logger('verify'); + $ret = [ 'results' => [] ]; + + if(! is_array($x)) { + return $false; + } + if(! ( array_key_exists('signed',$x) && $x['signed'])) { + return $false; + } + + $signed_data = preg_replace('/\s+/','',$x['data']) . '.' + . base64url_encode($x['data_type'],true) . '.' + . base64url_encode($x['encoding'],true) . '.' + . base64url_encode($x['alg'],true); + + $key = HTTPSig::get_key(EMPTY_STR,base64url_decode($x['sigs']['key_id'])); + logger('key: ' . print_r($key,true)); + if($key['portable_id'] && $key['public_key']) { + if(rsa_verify($signed_data,base64url_decode($x['sigs']['value']),$key['public_key'])) { + logger('verified'); + $ret = [ 'success' => true, 'signer' => $key['portable_id'], 'hubloc' => $key['hubloc'] ]; + } + } + + return $ret; + + } + + static function unpack($data) { + return json_decode(base64url_decode($data),true); + } + + }
\ No newline at end of file diff --git a/Zotlabs/Lib/Libzot.php b/Zotlabs/Lib/Libzot.php index 2c726aff4..70f013eb7 100644 --- a/Zotlabs/Lib/Libzot.php +++ b/Zotlabs/Lib/Libzot.php @@ -109,7 +109,7 @@ class Libzot { $data = [ 'type' => $type, 'encoding' => $encoding, - 'sender' => $channel['channel_hash'], + 'sender' => $channel['channel_portable_id'], 'site_id' => self::make_xchan_hash(z_root(), get_config('system','pubkey')), 'version' => System::get_zot_revision(), ]; @@ -329,8 +329,14 @@ class Libzot { return false; if($channel && $record['data']['permissions']) { - $old_read_stream_perm = their_perms_contains($channel['channel_id'],$x['hash'],'view_stream'); - set_abconfig($channel['channel_id'],$x['hash'],'system','their_perms',$record['data']['permissions']); + $permissions = explode(',',$record['data']['permissions']); + if($permissions && is_array($permissions)) { + $old_read_stream_perm = get_abconfig($channel['channel_id'],$x['hash'],'their_perms','view_stream'); + + foreach($permissions as $p) { + set_abconfig($channel['channel_id'],$x['hash'],'their_perms',$p,'1'); + } + } if(array_key_exists('profile',$record['data']) && array_key_exists('next_birthday',$record['data']['profile'])) { $next_birthday = datetime_convert('UTC','UTC',$record['data']['profile']['next_birthday']); @@ -350,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 @@ -379,14 +385,16 @@ class Libzot { else { $p = Permissions::connect_perms($channel['channel_id']); - $my_perms = Permissions::serialise($p['perms']); + $my_perms = $p['perms']; $automatic = $p['automatic']; // new connection if($my_perms) { - set_abconfig($channel['channel_id'],$x['hash'],'system','my_perms',$my_perms); + foreach($my_perms as $k => $v) { + set_abconfig($channel['channel_id'],$x['hash'],'my_perms',$k,$v); + } } $closeness = get_pconfig($channel['channel_id'],'system','new_abook_closeness'); @@ -409,7 +417,7 @@ class Libzot { if($y) { logger("New introduction received for {$channel['channel_name']}"); - $new_perms = get_all_perms($channel['channel_id'],$x['hash']); + $new_perms = get_all_perms($channel['channel_id'],$x['hash'],false); // Send a clone sync packet and a permissions update if permissions have changed @@ -425,7 +433,7 @@ class Libzot { [ 'type' => NOTIFY_INTRO, 'from_xchan' => $x['hash'], - 'to_xchan' => $channel['channel_hash'], + 'to_xchan' => $channel['channel_portable_id'], 'link' => z_root() . '/connedit/' . $new_connection[0]['abook_id'] ] ); @@ -500,6 +508,7 @@ class Libzot { $r = q("select hubloc.*, site.site_crypto from hubloc left join site on hubloc_url = site_url where hubloc_guid = '%s' and hubloc_guid_sig = '%s' and hubloc_url = '%s' and hubloc_url_sig = '%s' + and hubloc_network = 'zot6' and hubloc_site_id = '%s' $limit", dbesc($arr['id']), dbesc($arr['id_sig']), @@ -776,7 +785,7 @@ class Libzot { // see if this is a channel clone that's hosted locally - which we treat different from other xchans/connections - $local = q("select channel_account_id, channel_id from channel where channel_hash = '%s' limit 1", + $local = q("select channel_account_id, channel_id from channel where channel_portable_id = '%s' limit 1", dbesc($xchan_hash) ); if($local) { @@ -966,6 +975,7 @@ class Libzot { } $x = crypto_unencapsulate($x, get_config('system','prvkey')); + if(! is_array($x)) { $x = json_decode($x,true); } @@ -996,7 +1006,7 @@ class Libzot { dbesc($xx['recipient']), dbesc($xx['name']), dbesc($xx['status']), - dbesc(datetime_convert($xx['date'])), + dbesc(datetime_convert('UTC','UTC',$xx['date'])), dbesc($xx['sender']) ); } @@ -1129,7 +1139,7 @@ class Libzot { if($recip_arr) { stringify_array_elms($recip_arr,true); $recips = implode(',',$recip_arr); - $r = q("select channel_hash as hash from channel where channel_hash in ( " . $recips . " ) and channel_removed = 0 "); + $r = q("select channel_portable_id as hash from channel where channel_portable_id in ( " . $recips . " ) and channel_removed = 0 "); } if(! $r) { @@ -1303,12 +1313,12 @@ class Libzot { $r = []; - $c = q("select channel_id, channel_hash from channel where channel_removed = 0"); + $c = q("select channel_id, channel_portable_id from channel where channel_removed = 0"); if($c) { foreach($c as $cc) { if(perm_is_allowed($cc['channel_id'],$msg['sender'],$perm)) { - $r[] = $cc['channel_hash']; + $r[] = $cc['channel_portable_id']; } } } @@ -1316,7 +1326,7 @@ class Libzot { if($include_sys) { $sys = get_sys_channel(); if($sys) - $r[] = $sys['channel_hash']; + $r[] = $sys['channel_portable_id']; } @@ -1332,7 +1342,7 @@ class Libzot { if($tag['type'] === 'Mention' && (strpos($tag['href'],z_root()) !== false)) { $address = basename($tag['href']); if($address) { - $z = q("select channel_hash as hash from channel where channel_address = '%s' + $z = q("select channel_portable_id as hash from channel where channel_address = '%s' and channel_removed = 0 limit 1", dbesc($address) ); @@ -1353,7 +1363,7 @@ class Libzot { $thread_parent = self::find_parent($msg,$act); if($thread_parent) { - $z = q("select channel_hash as hash from channel left join item on channel.channel_id = item.uid where ( item.thr_parent = '%s' OR item.parent_mid = '%s' ) ", + $z = q("select channel_portable_id as hash from channel left join item on channel.channel_id = item.uid where ( item.thr_parent = '%s' OR item.parent_mid = '%s' ) ", dbesc($thread_parent), dbesc($thread_parent) ); @@ -1427,7 +1437,7 @@ class Libzot { * access checks. */ - if($sender === $channel['channel_hash'] && $arr['author_xchan'] === $channel['channel_hash'] && $arr['mid'] === $arr['parent_mid']) { + if($sender === $channel['channel_portable_id'] && $arr['author_xchan'] === $channel['channel_portable_id'] && $arr['mid'] === $arr['parent_mid']) { $DR->update('self delivery ignored'); $result[] = $DR->get(); continue; @@ -1709,7 +1719,7 @@ class Libzot { $stored = (($item_result && $item_result['item']) ? $item_result['item'] : false); if((is_array($stored)) && ($stored['id'] != $stored['parent']) - && ($stored['author_xchan'] === $channel['channel_hash'])) { + && ($stored['author_xchan'] === $channel['channel_hash'] || $stored['author_xchan'] === $channel['channel_portable_id'])) { retain_item($stored['item']['parent']); } @@ -1809,9 +1819,9 @@ class Libzot { } logger('FOF Activity received: ' . print_r($arr,true), LOGGER_DATA, LOG_DEBUG); - logger('FOF Activity recipient: ' . $channel['channel_hash'], LOGGER_DATA, LOG_DEBUG); + logger('FOF Activity recipient: ' . $channel['channel_portable_id'], LOGGER_DATA, LOG_DEBUG); - $result = self::process_delivery($arr['owner_xchan'],$arr, [ $channel['channel_hash'] ],false,false,true); + $result = self::process_delivery($arr['owner_xchan'],$arr, [ $channel['channel_portable_id'] ],false,false,true); if ($result) { $ret = array_merge($ret, $result); } @@ -2047,7 +2057,7 @@ class Libzot { $DR = new DReport(z_root(),$sender,$d,$arr['mid']); - $r = q("select * from channel where channel_hash = '%s' limit 1", + $r = q("select * from channel where channel_portable_id = '%s' limit 1", dbesc($d['hash']) ); @@ -2202,7 +2212,7 @@ class Libzot { $loc = $locations[0]; - $r = q("select * from channel where channel_hash = '%s' limit 1", + $r = q("select * from channel where channel_portable_id = '%s' limit 1", dbesc($sender_hash) ); @@ -2210,7 +2220,7 @@ class Libzot { return; if($loc['url'] !== z_root()) { - $x = q("update channel set channel_moved = '%s' where channel_hash = '%s' limit 1", + $x = q("update channel set channel_moved = '%s' where channel_portable_id = '%s' limit 1", dbesc($loc['url']), dbesc($sender_hash) ); @@ -2246,7 +2256,7 @@ class Libzot { static function encode_locations($channel) { $ret = []; - $x = self::get_hublocs($channel['channel_hash']); + $x = self::get_hublocs($channel['channel_portable_id']); if($x && count($x)) { foreach($x as $hub) { @@ -2557,6 +2567,9 @@ class Libzot { static function zotinfo($arr) { + logger('arr: ' . print_r($arr,true)); + + $ret = []; $zhash = ((x($arr,'guid_hash')) ? $arr['guid_hash'] : ''); @@ -2593,13 +2606,13 @@ class Libzot { $r = null; if(strlen($zhash)) { - $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash - where channel_hash = '%s' limit 1", + $r = q("select channel.*, xchan.* from channel left join xchan on channel_portable_id = xchan_hash + where channel_portable_id = '%s' limit 1", dbesc($zhash) ); } elseif(strlen($zguid) && strlen($zguid_sig)) { - $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash + $r = q("select channel.*, xchan.* from channel left join xchan on channel_portable_id = xchan_hash where channel_guid = '%s' and channel_guid_sig = '%s' limit 1", dbesc($zguid), dbesc($zguid_sig) @@ -2607,7 +2620,7 @@ class Libzot { } elseif(strlen($zaddr)) { if(strpos($zaddr,'[system]') === false) { /* normal address lookup */ - $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash + $r = q("select channel.*, xchan.* from channel left join xchan on channel_portable_id = xchan_hash where ( channel_address = '%s' or xchan_addr = '%s' ) limit 1", dbesc($zaddr), dbesc($zaddr) @@ -2627,10 +2640,10 @@ class Libzot { * */ - $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash + $r = q("select channel.*, xchan.* from channel left join xchan on channel_portable_id = xchan_hash where channel_system = 1 order by channel_id limit 1"); if(! $r) { - $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash + $r = q("select channel.*, xchan.* from channel left join xchan on channel_portable_id = xchan_hash where channel_removed = 0 order by channel_id limit 1"); } } @@ -2749,7 +2762,7 @@ class Libzot { ]; $ret['channel_role'] = get_pconfig($e['channel_id'],'system','permissions_role','custom'); - $ret['protocols'] = [ 'zot6' ]; + $ret['protocols'] = [ 'zot', 'zot6' ]; $ret['searchable'] = $searchable; $ret['adult_content'] = $adult_channel; $ret['public_forum'] = $public_forum; @@ -2774,7 +2787,7 @@ class Libzot { if(! $ret['follow_url']) $ret['follow_url'] = z_root() . '/follow?f=&url=%s'; - $permissions = get_all_perms($e['channel_id'],$ztarget_hash,false); + $permissions = get_all_perms($e['channel_id'],$ztarget_hash,false,false); if($ztarget_hash) { $permissions['connected'] = false; diff --git a/Zotlabs/Lib/NativeWiki.php b/Zotlabs/Lib/NativeWiki.php index cdabbc3e9..e2bd07c0d 100644 --- a/Zotlabs/Lib/NativeWiki.php +++ b/Zotlabs/Lib/NativeWiki.php @@ -40,26 +40,17 @@ class NativeWiki { function create_wiki($channel, $observer_hash, $wiki, $acl) { - // Generate unique resource_id using the same method as item_message_id() - do { - $dups = false; - $resource_id = random_string(); - $r = q("SELECT mid FROM item WHERE resource_id = '%s' AND resource_type = '%s' AND uid = %d LIMIT 1", - dbesc($resource_id), - dbesc(NWIKI_ITEM_RESOURCE_TYPE), - intval($channel['channel_id']) - ); - if($r) - $dups = true; - } while($dups == true); + $resource_id = new_uuid(); + $uuid = new_uuid(); $ac = $acl->get(); - $mid = item_message_id(); + $mid = z_root() . '/item/' . $uuid; $arr = array(); // Initialize the array of parameters for the post $item_hidden = ((intval($wiki['postVisible']) === 0) ? 1 : 0); $wiki_url = z_root() . '/wiki/' . $channel['channel_address'] . '/' . $wiki['urlName']; $arr['aid'] = $channel['channel_account_id']; + $arr['uuid'] = $uuid; $arr['uid'] = $channel['channel_id']; $arr['mid'] = $mid; $arr['parent_mid'] = $mid; diff --git a/Zotlabs/Lib/ThreadItem.php b/Zotlabs/Lib/ThreadItem.php index 78714c2c4..83d243177 100644 --- a/Zotlabs/Lib/ThreadItem.php +++ b/Zotlabs/Lib/ThreadItem.php @@ -39,6 +39,8 @@ class ThreadItem { $this->data = $data; $this->toplevel = ($this->get_id() == $this->get_data_value('parent')); + $observer = \App::get_observer(); + // Prepare the children if($data['children']) { foreach($data['children'] as $item) { @@ -51,6 +53,7 @@ class ThreadItem { continue; } + $child = new ThreadItem($item); $this->add_child($child); } @@ -299,8 +302,10 @@ class ThreadItem { if($keep_reports === 0) $keep_reports = 10; - if((! get_config('system','disable_dreport')) && strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC',"now - $keep_reports days")) > 0) + if((! get_config('system','disable_dreport')) && strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC',"now - $keep_reports days")) > 0) { $dreport = t('Delivery Report'); + $dreport_link = gen_link_id($item['mid']); + } if(strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC','now - 12 hours')) > 0) $is_new = true; @@ -316,7 +321,7 @@ class ThreadItem { $owner_address = substr($item['owner']['xchan_addr'],0,strpos($item['owner']['xchan_addr'],'@')); $viewthread = $item['llink']; if($conv->get_mode() === 'channel') - $viewthread = z_root() . '/channel/' . $owner_address . '?f=&mid=' . urlencode($item['mid']); + $viewthread = z_root() . '/channel/' . $owner_address . '?f=&mid=' . urlencode(gen_link_id($item['mid'])); $comment_count_txt = sprintf( tt('%d comment','%d comments',$total_children),$total_children ); $list_unseen_txt = (($unseen_comments) ? sprintf('%d unseen',$unseen_comments) : ''); @@ -364,6 +369,7 @@ class ThreadItem { 'thread_action_menu' => thread_action_menu($item,$conv->get_mode()), 'thread_author_menu' => thread_author_menu($item,$conv->get_mode()), 'dreport' => $dreport, + 'dreport_link' => $dreport_link, 'name' => $profile_name, 'thumb' => $profile_avatar, 'osparkle' => $osparkle, diff --git a/Zotlabs/Lib/Zotfinger.php b/Zotlabs/Lib/Zotfinger.php index 537e440d4..d094fdc8d 100644 --- a/Zotlabs/Lib/Zotfinger.php +++ b/Zotlabs/Lib/Zotfinger.php @@ -2,7 +2,7 @@ namespace Zotlabs\Lib; -use Zotlabs\Web\HTTPSig; +use Zotlabs\Zot6\HTTPSig; class Zotfinger { @@ -12,10 +12,19 @@ class Zotfinger { return false; } - if($channel) { + $m = parse_url($resource); + + $data = json_encode([ 'zot_token' => random_string() ]); + + if($channel && $m) { + $headers = [ - 'Accept' => 'application/x-zot+json', - 'X-Zot-Token' => random_string(), + 'Accept' => 'application/x-zot+json', + 'Content-Type' => 'application/x-zot+json', + 'X-Zot-Token' => random_string(), + 'Digest' => HTTPSig::generate_digest_header($data), + 'Host' => $m['host'], + '(request-target)' => 'post ' . get_request_string($resource) ]; $h = HTTPSig::create_sig($headers,$channel['channel_prvkey'],channel_url($channel),false); } @@ -27,7 +36,9 @@ class Zotfinger { $redirects = 0; - $x = z_fetch_url($resource,false,$redirects, [ 'headers' => $h ] ); + $x = z_post_url($resource,$data,$redirects, [ 'headers' => $h ] ); + + logger('fetch: ' . print_r($x,true)); if($x['success']) { @@ -39,6 +50,8 @@ class Zotfinger { $result['data'] = json_decode(crypto_unencapsulate($result['data'],get_config('system','prvkey')),true); } + logger('decrypted: ' . print_r($result,true)); + return $result; } diff --git a/Zotlabs/Module/Channel.php b/Zotlabs/Module/Channel.php index f1537ed15..12d87885f 100644 --- a/Zotlabs/Module/Channel.php +++ b/Zotlabs/Module/Channel.php @@ -6,6 +6,8 @@ namespace Zotlabs\Module; use App; use Zotlabs\Web\Controller; use Zotlabs\Lib\PermissionDescription; +use Zotlabs\Zot6\HTTPSig; +use Zotlabs\Lib\Libzot; require_once('include/items.php'); require_once('include/security.php'); @@ -44,6 +46,48 @@ class Channel extends Controller { $channel = App::get_channel(); if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) { + $which = $channel['channel_address']; + $profile = argv(1); + } + + $channel = channelx_by_nick($which); + if(! $channel) { + http_status_exit(404, 'Not found'); + } + + // handle zot6 channel discovery + + if(Libzot::is_zot_request()) { + + $sigdata = HTTPSig::verify(file_get_contents('php://input')); + + if($sigdata && $sigdata['signer'] && $sigdata['header_valid']) { + $data = json_encode(Libzot::zotinfo([ 'address' => $channel['channel_address'], 'target_url' => $sigdata['signer'] ])); + $s = q("select site_crypto, hubloc_sitekey from site left join hubloc on hubloc_url = site_url where hubloc_id_url = '%s' and hubloc_network = 'zot6' limit 1", + dbesc($sigdata['signer']) + ); + + if($s) { + $data = json_encode(crypto_encapsulate($data,$s[0]['hubloc_sitekey'],Libzot::best_algorithm($s[0]['site_crypto']))); + } + } + else { + $data = json_encode(Libzot::zotinfo([ 'address' => $channel['channel_address'] ])); + } + + $headers = [ + 'Content-Type' => 'application/x-zot+json', + 'Digest' => HTTPSig::generate_digest_header($data), + '(request-target)' => strtolower($_SERVER['REQUEST_METHOD']) . ' ' . $_SERVER['REQUEST_URI'] + ]; + $h = HTTPSig::create_sig($headers,$channel['channel_prvkey'],channel_url($channel)); + HTTPSig::set_headers($h); + echo $data; + killme(); + } + + + if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) { $which = $channel['channel_address']; $profile = argv(1); } diff --git a/Zotlabs/Module/Connedit.php b/Zotlabs/Module/Connedit.php index 3d7ee449a..a9f643306 100644 --- a/Zotlabs/Module/Connedit.php +++ b/Zotlabs/Module/Connedit.php @@ -8,6 +8,7 @@ namespace Zotlabs\Module; */ use Zotlabs\Lib\Apps; +use Zotlabs\Lib\Libzot; require_once('include/socgraph.php'); require_once('include/selectors.php'); @@ -475,6 +476,10 @@ class Connedit extends \Zotlabs\Web\Controller { if(! zot_refresh($orig_record[0],\App::get_channel())) notice( t('Refresh failed - channel is currently unavailable.') ); } + elseif($orig_record[0]['xchan_network'] === 'zot6') { + if(! Libzot::refresh($orig_record[0],\App::get_channel())) + notice( t('Refresh failed - channel is currently unavailable.') ); + } else { // if you are on a different network we'll force a refresh of the connection basic info diff --git a/Zotlabs/Module/Dreport.php b/Zotlabs/Module/Dreport.php index 76e07b147..16ae7941f 100644 --- a/Zotlabs/Module/Dreport.php +++ b/Zotlabs/Module/Dreport.php @@ -17,9 +17,17 @@ class Dreport extends \Zotlabs\Web\Controller { $mid = ((argc() > 1) ? argv(1) : ''); + if(strpos($mid,'b64.') === 0) + $mid = @base64url_decode(substr($mid,4)); + + if($mid === 'push') { $table = 'push'; $mid = ((argc() > 2) ? argv(2) : ''); + + if(strpos($mid,'b64.') === 0) + $mid = @base64url_decode(substr($mid,4)); + if($mid) { $i = q("select id from item where mid = '%s' and uid = %d and ( author_xchan = '%s' or ( owner_xchan = '%s' and item_wall = 1 )) ", dbesc($mid), @@ -38,6 +46,9 @@ class Dreport extends \Zotlabs\Web\Controller { if($mid === 'mail') { $table = 'mail'; $mid = ((argc() > 2) ? argv(2) : ''); + if(strpos($mid,'b64.') === 0) + $mid = @base64url_decode(substr($mid,4)); + } @@ -80,7 +91,6 @@ class Dreport extends \Zotlabs\Web\Controller { } for($x = 0; $x < count($r); $x++ ) { - $r[$x]['name'] = escape_tags(substr($r[$x]['dreport_recip'],strpos($r[$x]['dreport_recip'],' '))); // This has two purposes: 1. make the delivery report strings translateable, and // 2. assign an ordering to item delivery results so we can group them and provide @@ -138,14 +148,14 @@ class Dreport extends \Zotlabs\Web\Controller { $entries = array(); foreach($r as $rr) { $entries[] = [ - 'name' => $rr['name'], + 'name' => escape_tags($rr['dreport_name'] ?: $rr['dreport_recip']), 'result' => escape_tags($rr['dreport_result']), 'time' => escape_tags(datetime_convert('UTC',date_default_timezone_get(),$rr['dreport_time'])) ]; } $o = replace_macros(get_markup_template('dreport.tpl'), array( - '$title' => sprintf( t('Delivery report for %1$s'),substr($mid,0,32)) . '...', + '$title' => sprintf( t('Delivery report for %1$s'),basename($mid)) . '...', '$table' => $table, '$mid' => urlencode($mid), '$options' => t('Options'), @@ -162,9 +172,9 @@ class Dreport extends \Zotlabs\Web\Controller { private static function dreport_gravity_sort($a,$b) { if($a['gravity'] == $b['gravity']) { - if($a['name'] === $b['name']) + if($a['dreport_name'] === $b['dreport_name']) return strcmp($a['dreport_time'],$b['dreport_time']); - return strcmp($a['name'],$b['name']); + return strcmp($a['dreport_name'],$b['dreport_name']); } return (($a['gravity'] > $b['gravity']) ? 1 : (-1)); } diff --git a/Zotlabs/Module/Impel.php b/Zotlabs/Module/Impel.php index 0c372bd96..e05027d9f 100644 --- a/Zotlabs/Module/Impel.php +++ b/Zotlabs/Module/Impel.php @@ -133,9 +133,11 @@ class Impel extends \Zotlabs\Web\Controller { $arr['author_xchan'] = (($j['author_xchan']) ? $j['author_xchan'] : get_observer_hash()); $arr['mimetype'] = (($j['mimetype']) ? $j['mimetype'] : 'text/bbcode'); - if(! $j['mid']) - $j['mid'] = item_message_id(); - + if(! $j['mid']) { + $j['uuid'] = item_message_id(); + $j['mid'] = z_root() . '/item/' . $j['uuid']; + } + $arr['uuid'] = $j['uuid']; $arr['mid'] = $arr['parent_mid'] = $j['mid']; diff --git a/Zotlabs/Module/Item.php b/Zotlabs/Module/Item.php index 2ee639874..1d64ef60c 100644 --- a/Zotlabs/Module/Item.php +++ b/Zotlabs/Module/Item.php @@ -2,6 +2,16 @@ namespace Zotlabs\Module; +use Zotlabs\Lib\IConfig; +use Zotlabs\Lib\Enotify; +use Zotlabs\Web\Controller; +use Zotlabs\Daemon\Master; + +require_once('include/crypto.php'); +require_once('include/items.php'); +require_once('include/security.php'); + + /** * * This is the POST destination for most all locally posted @@ -17,16 +27,8 @@ namespace Zotlabs\Module; * */ -require_once('include/crypto.php'); -require_once('include/items.php'); -require_once('include/attach.php'); -require_once('include/bbcode.php'); -require_once('include/security.php'); - -use \Zotlabs\Lib as Zlib; - -class Item extends \Zotlabs\Web\Controller { +class Item extends Controller { function post() { @@ -392,6 +394,7 @@ class Item extends \Zotlabs\Web\Controller { $verb = $orig_post['verb']; $app = $orig_post['app']; $title = escape_tags(trim($_REQUEST['title'])); + $summary = trim($_REQUEST['summary']); $body = trim($_REQUEST['body']); $item_flags = $orig_post['item_flags']; @@ -454,6 +457,7 @@ class Item extends \Zotlabs\Web\Controller { $coord = notags(trim($_REQUEST['coord'])); $verb = notags(trim($_REQUEST['verb'])); $title = escape_tags(trim($_REQUEST['title'])); + $summary = trim($_REQUEST['summary']); $body = trim($_REQUEST['body']); $body .= trim($_REQUEST['attachment']); $postopts = ''; @@ -505,12 +509,14 @@ class Item extends \Zotlabs\Web\Controller { && ($channel['channel_pageflags'] & PAGE_ALLOWCODE)) ? true : false); if($preview) { + $summary = z_input_filter($summary,$mimetype,$execflag); $body = z_input_filter($body,$mimetype,$execflag); } - $arr = [ 'profile_uid' => $profile_uid, 'content' => $body, 'mimetype' => $mimetype ]; + $arr = [ 'profile_uid' => $profile_uid, 'summary' => $summary, 'content' => $body, 'mimetype' => $mimetype ]; call_hooks('post_content',$arr); + $summary = $arr['summary']; $body = $arr['content']; $mimetype = $arr['mimetype']; @@ -531,9 +537,23 @@ class Item extends \Zotlabs\Web\Controller { // we may need virtual or template classes to implement the possible alternatives + if(strpos($body,'[/summary]') !== false) { + $match = ''; + $cnt = preg_match("/\[summary\](.*?)\[\/summary\]/ism",$body,$match); + if($cnt) { + $summary .= $match[1]; + } + $body_content = preg_replace("/^(.*?)\[summary\](.*?)\[\/summary\](.*?)$/ism", '',$body); + $body = trim($body_content); + } + + $summary = cleanup_bbcode($summary); + $body = cleanup_bbcode($body); // Look for tags and linkify them + + $results = linkify_tags($a, $summary, ($uid) ? $uid : $profile_uid); $results = linkify_tags($a, $body, ($uid) ? $uid : $profile_uid); if($results) { @@ -579,6 +599,9 @@ class Item extends \Zotlabs\Web\Controller { if(! $preview) { fix_attached_photo_permissions($profile_uid,$owner_xchan['xchan_hash'],((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny); + fix_attached_photo_permissions($profile_uid,$owner_xchan['xchan_hash'],((strpos($summary,'[/crypt]')) ? $_POST['media_str'] : $summary),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny); + + fix_attached_file_permissions($channel,$observer['xchan_hash'],((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny); } @@ -711,7 +734,8 @@ class Item extends \Zotlabs\Web\Controller { $notify_type = (($parent) ? 'comment-new' : 'wall-new' ); if(! $mid) { - $mid = (($message_id) ? $message_id : item_message_id()); + $uuid = (($message_id) ? $message_id : item_message_id()); + $mid = z_root() . '/item/' . $uuid; } @@ -766,6 +790,7 @@ class Item extends \Zotlabs\Web\Controller { $datarray['aid'] = $channel['channel_account_id']; $datarray['uid'] = $profile_uid; + $datarray['uuid'] = $uuid; $datarray['owner_xchan'] = (($owner_hash) ? $owner_hash : $owner_xchan['xchan_hash']); $datarray['author_xchan'] = $observer['xchan_hash']; $datarray['created'] = $created; @@ -778,6 +803,7 @@ class Item extends \Zotlabs\Web\Controller { $datarray['parent_mid'] = $parent_mid; $datarray['mimetype'] = $mimetype; $datarray['title'] = $title; + $datarray['summary'] = $summary; $datarray['body'] = $body; $datarray['app'] = $app; $datarray['location'] = $location; @@ -887,12 +913,12 @@ class Item extends \Zotlabs\Web\Controller { $datarray['title'] = mb_substr($datarray['title'],0,191); if($webpage) { - Zlib\IConfig::Set($datarray,'system', webpage_to_namespace($webpage), - (($pagetitle) ? $pagetitle : substr($datarray['mid'],0,16)),true); + IConfig::Set($datarray,'system', webpage_to_namespace($webpage), + (($pagetitle) ? $pagetitle : basename($datarray['mid'])), true); } elseif($namespace) { - Zlib\IConfig::Set($datarray,'system', $namespace, - (($remote_id) ? $remote_id : substr($datarray['mid'],0,16)),true); + IConfig::Set($datarray,'system', $namespace, + (($remote_id) ? $remote_id : basename($datarray['mid'])), true); } @@ -924,7 +950,7 @@ class Item extends \Zotlabs\Web\Controller { } } if(! $nopush) - \Zotlabs\Daemon\Master::Summon(array('Notifier', 'edit_post', $post_id)); + Master::Summon([ 'Notifier', 'edit_post', $post_id ]); if($api_source) @@ -959,7 +985,7 @@ class Item extends \Zotlabs\Web\Controller { // otherwise it will happen during delivery if(($datarray['owner_xchan'] != $datarray['author_xchan']) && (intval($parent_item['item_wall']))) { - Zlib\Enotify::submit(array( + Enotify::submit(array( 'type' => NOTIFY_COMMENT, 'from_xchan' => $datarray['author_xchan'], 'to_xchan' => $datarray['owner_xchan'], @@ -977,7 +1003,7 @@ class Item extends \Zotlabs\Web\Controller { $parent = $post_id; if(($datarray['owner_xchan'] != $datarray['author_xchan']) && ($datarray['item_type'] == ITEM_TYPE_POST)) { - Zlib\Enotify::submit(array( + Enotify::submit(array( 'type' => NOTIFY_WALL, 'from_xchan' => $datarray['author_xchan'], 'to_xchan' => $datarray['owner_xchan'], @@ -1039,7 +1065,7 @@ class Item extends \Zotlabs\Web\Controller { call_hooks('post_local_end', $datarray); if(! $nopush) - \Zotlabs\Daemon\Master::Summon(array('Notifier', $notify_type, $post_id)); + Master::Summon([ 'Notifier', $notify_type, $post_id ]); logger('post_complete'); diff --git a/Zotlabs/Module/Like.php b/Zotlabs/Module/Like.php index 4e216f08b..c39726b88 100644 --- a/Zotlabs/Module/Like.php +++ b/Zotlabs/Module/Like.php @@ -371,10 +371,13 @@ class Like extends \Zotlabs\Web\Controller { } } - $mid = item_message_id(); + $uuid = item_message_id(); $arr = array(); + $arr['uuid'] = $uuid; + $arr['mid'] = z_root() . '/item/' . $uuid; + if($extended_like) { $arr['item_thread_top'] = 1; $arr['item_origin'] = 1; @@ -476,7 +479,6 @@ class Like extends \Zotlabs\Web\Controller { } - $arr['mid'] = $mid; $arr['aid'] = (($extended_like) ? $ch[0]['channel_account_id'] : $owner_aid); $arr['uid'] = $owner_uid; diff --git a/Zotlabs/Module/Mood.php b/Zotlabs/Module/Mood.php index 16ef0b171..453f08f9f 100644 --- a/Zotlabs/Module/Mood.php +++ b/Zotlabs/Module/Mood.php @@ -70,7 +70,8 @@ class Mood extends Controller { $poster = App::get_observer(); - $mid = item_message_id(); + $uuid = item_message_id(); + $mid = z_root() . '/item/' . $uuid; $action = sprintf( t('%1$s is %2$s','mood'), '[zrl=' . $poster['xchan_url'] . ']' . $poster['xchan_name'] . '[/zrl]' , $verbs[$verb]); @@ -78,6 +79,7 @@ class Mood extends Controller { $arr['aid'] = get_account_id(); $arr['uid'] = $uid; + $arr['uuid'] = $uuid; $arr['mid'] = $mid; $arr['parent_mid'] = (($parent_mid) ? $parent_mid : $mid); $arr['author_xchan'] = $poster['xchan_hash']; diff --git a/Zotlabs/Module/Nojs.php b/Zotlabs/Module/Nojs.php deleted file mode 100644 index 5f3d80ecd..000000000 --- a/Zotlabs/Module/Nojs.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php -namespace Zotlabs\Module; - - -class Nojs extends \Zotlabs\Web\Controller { - - function init() { - $n = ((argc() > 1) ? intval(argv(1)) : 1); - setcookie('jsdisabled', $n, 0, '/'); - $p = hex2bin($_GET['redir']); - $hasq = strpbrk($p,'?&'); - goaway(z_root() . (($p) ? '/' . $p : '') . (($hasq) ? '' : '?f=' ) . '&jsdisabled=' . $n); - - } -} diff --git a/Zotlabs/Module/Pconfig.php b/Zotlabs/Module/Pconfig.php index 7c82bac7d..44fe5d9a9 100644 --- a/Zotlabs/Module/Pconfig.php +++ b/Zotlabs/Module/Pconfig.php @@ -43,7 +43,7 @@ class Pconfig extends \Zotlabs\Web\Controller { } - function get() { + function get() { if(! local_channel()) { return login(); diff --git a/Zotlabs/Module/React.php b/Zotlabs/Module/React.php index fbb760786..3920301f5 100644 --- a/Zotlabs/Module/React.php +++ b/Zotlabs/Module/React.php @@ -44,6 +44,7 @@ class React extends \Zotlabs\Web\Controller { return; } + $uuid = item_message_id(); $n = array(); $n['aid'] = $channel['channel_account_id']; @@ -52,7 +53,8 @@ class React extends \Zotlabs\Web\Controller { $n['item_type'] = $i[0]['item_type']; $n['parent'] = $postid; $n['parent_mid'] = $i[0]['mid']; - $n['mid'] = item_message_id(); + $n['uuid'] = $uuid; + $n['mid'] = z_root() . '/item/' . $uuid; $n['verb'] = ACTIVITY_REACT . '#' . $emoji; $n['body'] = "\n\n[zmg=32x32]" . z_root() . '/images/emoji/' . $emoji . '.png[/zmg]' . "\n\n"; $n['author_xchan'] = $channel['channel_hash']; diff --git a/Zotlabs/Module/Subthread.php b/Zotlabs/Module/Subthread.php index 1a9caff6c..54343fdfa 100644 --- a/Zotlabs/Module/Subthread.php +++ b/Zotlabs/Module/Subthread.php @@ -106,8 +106,9 @@ class Subthread extends \Zotlabs\Web\Controller { - $mid = item_message_id(); - + $uuid = item_message_id(); + $mid = z_root() . '/item/' . $uuid; + $post_type = (($item['resource_type'] === 'photo') ? t('photo') : t('status')); $links = array(array('rel' => 'alternate','type' => 'text/html', 'href' => $item['plink'])); @@ -145,6 +146,7 @@ class Subthread extends \Zotlabs\Web\Controller { $arr = array(); + $arr['uuid'] = $uuid; $arr['mid'] = $mid; $arr['aid'] = $owner_aid; $arr['uid'] = $owner_uid; diff --git a/Zotlabs/Module/Wfinger.php b/Zotlabs/Module/Wfinger.php index 1866bce40..e4591df12 100644 --- a/Zotlabs/Module/Wfinger.php +++ b/Zotlabs/Module/Wfinger.php @@ -205,6 +205,12 @@ class Wfinger extends \Zotlabs\Web\Controller { ], [ + 'rel' => 'http://purl.org/zot/protocol/6.0', + 'type' => 'application/x-zot+json', + 'href' => channel_url($r[0]) + ], + + [ 'rel' => 'http://purl.org/openwebauth/v1', 'type' => 'application/x-zot+json', 'href' => z_root() . '/owa', diff --git a/Zotlabs/Storage/Directory.php b/Zotlabs/Storage/Directory.php index 642af6300..b30aecf92 100644 --- a/Zotlabs/Storage/Directory.php +++ b/Zotlabs/Storage/Directory.php @@ -224,7 +224,7 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota, DAV\IMo } $filesize = 0; - $hash = random_string(); + $hash = new_uuid(); $f = 'store/' . $this->auth->owner_nick . '/' . (($this->os_path) ? $this->os_path . '/' : '') . $hash; diff --git a/Zotlabs/Update/_1226.php b/Zotlabs/Update/_1226.php new file mode 100644 index 000000000..6e5a0e319 --- /dev/null +++ b/Zotlabs/Update/_1226.php @@ -0,0 +1,78 @@ +<?php + +namespace Zotlabs\Update; + +use Zotlabs\Lib\Libzot; + +class _1226 { + + function run() { + + q("START TRANSACTION"); + + if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) { + $r1 = q("ALTER TABLE channel ADD channel_portable_id text NOT NULL DEFAULT '' "); + $r2 = q("create index \"channel_portable_id_idx\" on channel (\"channel_portable_id\")"); + + $r = ($r1 && $r2); + } + else { + $r = q("ALTER TABLE `channel` ADD `channel_portable_id` char(191) NOT NULL DEFAULT '' , + ADD INDEX `channel_portable_id` (`channel_portable_id`)"); + } + + if($r) { + q("COMMIT"); + self::upgrade(); + return UPDATE_SUCCESS; + } + + q("ROLLBACK"); + return UPDATE_FAILED; + } + + + static function upgrade() { + + $r = q("select * from channel where channel_portable_id = '' "); + + if($r) { + foreach($r as $rv) { + + $zhash = Libzot::make_xchan_hash($rv['channel_guid'],$rv['channel_pubkey']); + q("update channel set channel_portable_id = '%s' where channel_id = %d", + dbesc($zhash), + intval($rv['channel_id']) + ); + $x = q("select * from xchan where xchan_hash = '%s' limit 1", + dbesc($rv['channel_hash']) + ); + if($x) { + $rec = $x[0]; + $rec['xchan_hash'] = $zhash; + $rec['xchan_guid_sig'] = 'sha256.' . $rec['xchan_guid_sig']; + $rec['xchan_network'] = 'zot6'; + + xchan_store_lowlevel($rec); + } + $x = q("select * from hubloc where hubloc_hash = '%s' and hubloc_url = '%s' limit 1", + dbesc($rv['channel_hash']), + dbesc(z_root()) + ); + if($x) { + $rec = $x[0]; + $rec['hubloc_hash'] = $zhash; + $rec['hubloc_guid_sig'] = 'sha256.' . $rec['hubloc_guid_sig']; + $rec['hubloc_network'] = 'zot6'; + $rec['hubloc_url_sig'] = 'sha256.' . $rec['hubloc_url_sig']; + $rec['hubloc_callback'] = z_root() . '/zot'; + $rec['hubloc_id_url'] = channel_url($rv); + $rec['hubloc_site_id'] = Libzot::make_xchan_hash(z_root(),get_config('system','pubkey')); + hubloc_store_lowlevel($rec); + } + } + } + } +} + + diff --git a/Zotlabs/Update/_1227.php b/Zotlabs/Update/_1227.php new file mode 100644 index 000000000..b5dbb2286 --- /dev/null +++ b/Zotlabs/Update/_1227.php @@ -0,0 +1,30 @@ +<?php + +namespace Zotlabs\Update; + + +class _1227 { + + function run() { + + q("START TRANSACTION"); + + if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) { + $r = q("ALTER TABLE dreport ADD dreport_name text NOT NULL DEFAULT '' "); + } + else { + $r = q("ALTER TABLE `dreport` ADD `dreport_name` char(191) NOT NULL DEFAULT ''"); + } + + if($r) { + q("COMMIT"); + return UPDATE_SUCCESS; + } + + q("ROLLBACK"); + return UPDATE_FAILED; + } + +} + + diff --git a/Zotlabs/Update/_1228.php b/Zotlabs/Update/_1228.php new file mode 100644 index 000000000..f8a506bb4 --- /dev/null +++ b/Zotlabs/Update/_1228.php @@ -0,0 +1,36 @@ +<?php + +namespace Zotlabs\Update; + + +class _1228 { + + function run() { + + q("START TRANSACTION"); + + if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) { + $r1 = q("ALTER TABLE item ADD uuid text NOT NULL DEFAULT '' "); + $r2 = q("create index \"uuid_idx\" on channel (\"uuid\")"); + $r3 = q("ALTER TABLE item add summary TEXT NOT NULL"); + + $r = ($r1 && $r2 && $r3); + } + else { + $r1 = q("ALTER TABLE `item` ADD `uuid` char(191) NOT NULL DEFAULT '' , + ADD INDEX `uuid` (`uuid`)"); + $r2 = q("ALTER TABLE `item` ADD `summary` mediumtext NOT NULL"); + $r = ($r1 && $r2); + } + + if($r) { + q("COMMIT"); + return UPDATE_SUCCESS; + } + + q("ROLLBACK"); + return UPDATE_FAILED; + } + +} + diff --git a/Zotlabs/Web/CheckJS.php b/Zotlabs/Web/CheckJS.php deleted file mode 100644 index e83ccf27b..000000000 --- a/Zotlabs/Web/CheckJS.php +++ /dev/null @@ -1,50 +0,0 @@ -<?php - -namespace Zotlabs\Web; - - -class CheckJS { - - private static $jsdisabled = 0; - - function __construct($test = 0) { - if(intval($_REQUEST['jsdisabled'])) - $this->jsdisabled = 1; - else - $this->jsdisabled = 0; - if(intval($_COOKIE['jsdisabled'])) - $this->jsdisabled = 1; - else - $this->jsdisabled = 0; - - $page = bin2hex(\App::$query_string); - - if(! $this->jsdisabled) { - if($test) { - $this->jsdisabled = 1; - if(array_key_exists('jsdisabled',$_COOKIE)) - $this->jsdisabled = $_COOKIE['jsdisabled']; - - if(! array_key_exists('jsdisabled',$_COOKIE)) { - \App::$page['htmlhead'] .= "\r\n" . '<script>document.cookie="jsdisabled=0; path=/"; var jsMatch = /\&jsdisabled=0/; if (!jsMatch.exec(location.href)) { location.href = "' . z_root() . '/nojs/0?f=&redir=' . $page . '" ; }</script>' . "\r\n"; - /* emulate JS cookie if cookies are not accepted */ - if (array_key_exists('jsdisabled',$_GET)) { - $_COOKIE['jsdisabled'] = $_GET['jsdisabled']; - } - } - } - else { - \App::$page['htmlhead'] .= "\r\n" . '<noscript><meta http-equiv="refresh" content="0; url=' . z_root() . '/nojs?f=&redir=' . $page . '"></noscript>' . "\r\n"; - } - } - - } - - function disabled() { - return $this->jsdisabled; - } - - -} - - diff --git a/Zotlabs/Web/HTTPSig.php b/Zotlabs/Web/HTTPSig.php index f27aa0556..fe0b9428f 100644 --- a/Zotlabs/Web/HTTPSig.php +++ b/Zotlabs/Web/HTTPSig.php @@ -342,6 +342,10 @@ class HTTPSig { */ static function parse_sigheader($header) { + if(is_array($header)) { + btlogger('is_array: ' . print_r($header,true)); + } + $ret = []; $matches = []; @@ -397,7 +401,7 @@ class HTTPSig { $data = $matches[1]; if($iv && $key && $alg && $data) { - return crypto_unencapsulate([ 'iv' => $iv, 'key' => $key, 'alg' => $alg, 'data' => $data ] , $prvkey); + return crypto_unencapsulate([ 'encrypted' => true, 'iv' => $iv, 'key' => $key, 'alg' => $alg, 'data' => $data ] , $prvkey); } return ''; diff --git a/Zotlabs/Zot6/HTTPSig.php b/Zotlabs/Zot6/HTTPSig.php index a0f0d3500..72785b1e9 100644 --- a/Zotlabs/Zot6/HTTPSig.php +++ b/Zotlabs/Zot6/HTTPSig.php @@ -48,12 +48,14 @@ class HTTPSig { $h = new HTTPHeaders($data['header']); $headers = $h->fetcharr(); $body = $data['body']; + $headers['(request-target)'] = $data['request_target']; } else { $headers = []; $headers['(request-target)'] = strtolower($_SERVER['REQUEST_METHOD']) . ' ' . $_SERVER['REQUEST_URI']; $headers['content-type'] = $_SERVER['CONTENT_TYPE']; + $headers['content-length'] = $_SERVER['CONTENT_LENGTH']; foreach($_SERVER as $k => $v) { if(strpos($k,'HTTP_') === 0) { @@ -121,6 +123,17 @@ class HTTPSig { if(array_key_exists($h,$headers)) { $signed_data .= $h . ': ' . $headers[$h] . "\n"; } + if($h === 'date') { + $d = new \DateTime($headers[$h]); + $d->setTimeZone(new \DateTimeZone('UTC')); + $dplus = datetime_convert('UTC','UTC','now + 1 day'); + $dminus = datetime_convert('UTC','UTC','now - 1 day'); + $c = $d->format('Y-m-d H:i:s'); + if($c > $dplus || $c < $dminus) { + logger('bad time: ' . $c); + return $result; + } + } } $signed_data = rtrim($signed_data,"\n"); @@ -147,8 +160,15 @@ class HTTPSig { logger('verified: ' . $x, LOGGER_DEBUG); - if(! $x) + if(! $x) { + logger('verify failed for ' . $result['signer'] . ' alg=' . $algorithm . (($key['public_key']) ? '' : ' no key')); + $sig_block['signature'] = base64_encode($sig_block['signature']); + logger('affected sigblock: ' . print_r($sig_block,true)); + logger('signed_data: ' . print_r($signed_data,true)); + logger('headers: ' . print_r($headers,true)); + logger('server: ' . print_r($_SERVER,true)); return $result; + } $result['portable_id'] = $key['portable_id']; $result['header_valid'] = true; @@ -180,7 +200,9 @@ class HTTPSig { return [ 'public_key' => $key ]; } - $key = self::get_webfinger_key($id); + if(strpos($id,'#') === false) { + $key = self::get_webfinger_key($id); + } if(! $key) { $key = self::get_activitystreams_key($id); @@ -216,25 +238,29 @@ class HTTPSig { function get_activitystreams_key($id) { + // remove fragment + + $url = ((strpos($id,'#')) ? substr($id,0,strpos($id,'#')) : $id); + $x = q("select * from xchan left join hubloc on xchan_hash = hubloc_hash where hubloc_addr = '%s' or hubloc_id_url = '%s' limit 1", - dbesc(str_replace('acct:','',$id)), - dbesc($id) + dbesc(str_replace('acct:','',$url)), + dbesc($url) ); if($x && $x[0]['xchan_pubkey']) { return [ 'portable_id' => $x[0]['xchan_hash'], 'public_key' => $x[0]['xchan_pubkey'] , 'hubloc' => $x[0] ]; } - $r = ActivityStreams::fetch_property($id); + $r = ActivityStreams::fetch($id); if($r) { - if(array_key_exists('publicKey',$j) && array_key_exists('publicKeyPem',$j['publicKey']) && array_key_exists('id',$j['publicKey'])) { - if($j['publicKey']['id'] === $id || $j['id'] === $id) { - return [ 'public_key' => self::convertKey($j['publicKey']['publicKeyPem']), 'portable_id' => '', 'hubloc' => [] ]; + if(array_key_exists('publicKey',$r) && array_key_exists('publicKeyPem',$r['publicKey']) && array_key_exists('id',$r['publicKey'])) { + if($r['publicKey']['id'] === $id || $r['id'] === $id) { + $portable_id = ((array_key_exists('owner',$r['publicKey'])) ? $r['publicKey']['owner'] : EMPTY_STR); + return [ 'public_key' => self::convertKey($r['publicKey']['publicKeyPem']), 'portable_id' => $portable_id, 'hubloc' => [] ]; } } } - return false; } @@ -409,6 +435,8 @@ class HTTPSig { $headers = ''; $fields = ''; + logger('signing: ' . print_r($head,true), LOGGER_DATA); + if($head) { foreach($head as $k => $v) { $headers .= strtolower($k) . ': ' . trim($v) . "\n"; diff --git a/Zotlabs/Zot6/Receiver.php b/Zotlabs/Zot6/Receiver.php index 4f26e2b0c..66559c9a5 100644 --- a/Zotlabs/Zot6/Receiver.php +++ b/Zotlabs/Zot6/Receiver.php @@ -4,7 +4,7 @@ namespace Zotlabs\Zot6; use Zotlabs\Lib\Config; use Zotlabs\Lib\Libzot; -use Zotlabs\Web\HTTPSig; + class Receiver { diff --git a/Zotlabs/Zot6/Zot6Handler.php b/Zotlabs/Zot6/Zot6Handler.php index 5597921cc..e320e7825 100644 --- a/Zotlabs/Zot6/Zot6Handler.php +++ b/Zotlabs/Zot6/Zot6Handler.php @@ -70,9 +70,10 @@ 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_hash = xchan_hash - where channel_hash ='%s' limit 1", + left join xchan on channel_portable_id = xchan_hash + where xchan_hash ='%s' limit 1", dbesc($recip) ); @@ -140,7 +141,7 @@ class Zot6Handler implements IHandler { $arr = $data['recipients'][0]; - $c = q("select * from channel left join xchan on channel_hash = xchan_hash where channel_hash = '%s' limit 1", + $c = q("select * from channel left join xchan on channel_portable_id = xchan_hash where channel_portable_id = '%s' limit 1", dbesc($arr['portable_id']) ); if (! $c) { @@ -230,8 +231,8 @@ class Zot6Handler implements IHandler { // basically this means "unfriend" foreach ($recipients as $recip) { $r = q("select channel.*,xchan.* from channel - left join xchan on channel_hash = xchan_hash - where channel_hash = '%s' and channel_guid_sig = '%s' limit 1", + left join xchan on channel_portable_id = xchan_hash + where channel_portable_id = '%s' limit 1", dbesc($recip) ); if ($r) { @@ -50,10 +50,10 @@ require_once('include/attach.php'); require_once('include/bbcode.php'); define ( 'PLATFORM_NAME', 'hubzilla' ); -define ( 'STD_VERSION', '3.8.5' ); +define ( 'STD_VERSION', '3.9.5' ); define ( 'ZOT_REVISION', '6.0a' ); -define ( 'DB_UPDATE_VERSION', 1225 ); +define ( 'DB_UPDATE_VERSION', 1228 ); define ( 'PROJECT_BASE', __DIR__ ); diff --git a/include/activities.php b/include/activities.php index 9b83f7a5c..68c995338 100644 --- a/include/activities.php +++ b/include/activities.php @@ -16,7 +16,8 @@ function profile_activity($changed, $value) { return; $arr = array(); - $arr['mid'] = $arr['parent_mid'] = item_message_id(); + $arr['uuid'] = item_message_id(); + $arr['mid'] = $arr['parent_mid'] = z_root() . '/item/' . $arr['uuid']; $arr['uid'] = local_channel(); $arr['aid'] = $self['channel_account_id']; $arr['owner_xchan'] = $arr['author_xchan'] = $self['xchan_hash']; diff --git a/include/attach.php b/include/attach.php index 4db5bc435..dd718aa14 100644 --- a/include/attach.php +++ b/include/attach.php @@ -739,7 +739,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { } if(! $hash) - $hash = random_string(); + $hash = new_uuid(); // Check storage limits if($options !== 'update') { @@ -1122,7 +1122,7 @@ function attach_mkdir($channel, $observer_hash, $arr = null) { return $ret; } - $arr['hash'] = (($arr['hash']) ? $arr['hash'] : random_string()); + $arr['hash'] = (($arr['hash']) ? $arr['hash'] : new_uuid()); // Check for duplicate name. // Check both the filename and the hash as we will be making use of both. @@ -1759,16 +1759,18 @@ function file_activity($channel_id, $object, $allow_cid, $allow_gid, $deny_cid, $arr_allow_cid = check_list_permissions($channel_id, $arr_allow_cid, 'view_storage'); } - $mid = item_message_id(); + $uuid = item_message_id(); + $mid = z_root() . '/item/' . $uuid; $objtype = ACTIVITY_OBJ_FILE; $arr = array(); $arr['aid'] = get_account_id(); $arr['uid'] = $channel_id; - $arr['item_wall'] = 1; - $arr['item_origin'] = 1; - $arr['item_unseen'] = 1; + $arr['uuid'] = $uuid; + $arr['item_wall'] = 1; + $arr['item_origin'] = 1; + $arr['item_unseen'] = 1; $arr['author_xchan'] = $poster['xchan_hash']; $arr['owner_xchan'] = $poster['xchan_hash']; $arr['title'] = ''; @@ -1813,8 +1815,10 @@ function file_activity($channel_id, $object, $allow_cid, $allow_gid, $deny_cid, $private = (($u_arr_allow_cid[0] || $u_arr_allow_gid[0] || $u_arr_deny_cid[0] || $u_arr_deny_gid[0]) ? 1 : 0); - $u_mid = item_message_id(); + $uuid = item_message_id(); + $u_mid = z_root() . '/item/' . $uuid; + $arr['uuid'] = $uuid; $arr['mid'] = $u_mid; $arr['parent_mid'] = $u_mid; $arr['allow_cid'] = perms2str($u_arr_allow_cid); diff --git a/include/channel.php b/include/channel.php index 22cdb9fe7..1e5570f6b 100644 --- a/include/channel.php +++ b/include/channel.php @@ -10,6 +10,7 @@ use Zotlabs\Access\Permissions; use Zotlabs\Daemon\Master; use Zotlabs\Lib\System; use Zotlabs\Render\Comanche; +use Zotlabs\Lib\Libzot; require_once('include/zot.php'); require_once('include/crypto.php'); @@ -232,6 +233,7 @@ function create_identity($arr) { $sig = base64url_encode(rsa_sign($guid,$key['prvkey'])); $hash = make_xchan_hash($guid,$sig); + $zhash = Libzot::make_xchan_hash($guid,$key['pubkey']); // Force a few things on the short term until we can provide a theme or app with choice @@ -265,6 +267,7 @@ function create_identity($arr) { 'channel_guid' => $guid, 'channel_guid_sig' => $sig, 'channel_hash' => $hash, + 'channel_portable_id' => $zhash, 'channel_prvkey' => $key['prvkey'], 'channel_pubkey' => $key['pubkey'], 'channel_pageflags' => intval($pageflags), @@ -345,30 +348,76 @@ function create_identity($arr) { if(! $r) logger('Unable to store hub location'); + $r = hubloc_store_lowlevel( + [ + 'hubloc_guid' => $guid, + 'hubloc_guid_sig' => 'sha256.' . $sig, + 'hubloc_hash' => $zhash, + 'hubloc_id_url' => channel_url($ret['channel']), + 'hubloc_addr' => channel_reddress($ret['channel']), + 'hubloc_primary' => intval($primary), + 'hubloc_url' => z_root(), + 'hubloc_url_sig' => 'sha256.' . base64url_encode(rsa_sign(z_root(),$ret['channel']['channel_prvkey'])), + 'hubloc_site_id' => Libzot::make_xchan_hash(z_root(),get_config('system','pubkey')), + 'hubloc_host' => App::get_hostname(), + 'hubloc_callback' => z_root() . '/zot', + 'hubloc_sitekey' => get_config('system','pubkey'), + 'hubloc_network' => 'zot6', + 'hubloc_updated' => datetime_convert() + ] + ); + if(! $r) + logger('Unable to store hub location'); + + $newuid = $ret['channel']['channel_id']; $r = xchan_store_lowlevel( [ - 'xchan_hash' => $hash, - 'xchan_guid' => $guid, - 'xchan_guid_sig' => $sig, - 'xchan_pubkey' => $key['pubkey'], + 'xchan_hash' => $hash, + 'xchan_guid' => $guid, + 'xchan_guid_sig' => $sig, + 'xchan_pubkey' => $key['pubkey'], 'xchan_photo_mimetype' => (($photo_type) ? $photo_type : 'image/png'), - 'xchan_photo_l' => z_root() . "/photo/profile/l/{$newuid}", - 'xchan_photo_m' => z_root() . "/photo/profile/m/{$newuid}", - 'xchan_photo_s' => z_root() . "/photo/profile/s/{$newuid}", - 'xchan_addr' => channel_reddress($ret['channel']), - 'xchan_url' => z_root() . '/channel/' . $ret['channel']['channel_address'], - 'xchan_follow' => z_root() . '/follow?f=&url=%s', - 'xchan_connurl' => z_root() . '/poco/' . $ret['channel']['channel_address'], - 'xchan_name' => $ret['channel']['channel_name'], - 'xchan_network' => 'zot', - 'xchan_photo_date' => datetime_convert(), - 'xchan_name_date' => datetime_convert(), - 'xchan_system' => $system + 'xchan_photo_l' => z_root() . "/photo/profile/l/{$newuid}", + 'xchan_photo_m' => z_root() . "/photo/profile/m/{$newuid}", + 'xchan_photo_s' => z_root() . "/photo/profile/s/{$newuid}", + 'xchan_addr' => channel_reddress($ret['channel']), + 'xchan_url' => z_root() . '/channel/' . $ret['channel']['channel_address'], + 'xchan_follow' => z_root() . '/follow?f=&url=%s', + 'xchan_connurl' => z_root() . '/poco/' . $ret['channel']['channel_address'], + 'xchan_name' => $ret['channel']['channel_name'], + 'xchan_network' => 'zot', + 'xchan_photo_date' => datetime_convert(), + 'xchan_name_date' => datetime_convert(), + 'xchan_system' => $system ] ); + $r = xchan_store_lowlevel( + [ + 'xchan_hash' => $zhash, + 'xchan_guid' => $guid, + 'xchan_guid_sig' => 'sha256.' . $sig, + 'xchan_pubkey' => $key['pubkey'], + 'xchan_photo_mimetype' => (($photo_type) ? $photo_type : 'image/png'), + 'xchan_photo_l' => z_root() . "/photo/profile/l/{$newuid}", + 'xchan_photo_m' => z_root() . "/photo/profile/m/{$newuid}", + 'xchan_photo_s' => z_root() . "/photo/profile/s/{$newuid}", + 'xchan_addr' => channel_reddress($ret['channel']), + 'xchan_url' => z_root() . '/channel/' . $ret['channel']['channel_address'], + 'xchan_follow' => z_root() . '/follow?f=&url=%s', + 'xchan_connurl' => z_root() . '/poco/' . $ret['channel']['channel_address'], + 'xchan_name' => $ret['channel']['channel_name'], + 'xchan_network' => 'zot6', + 'xchan_photo_date' => datetime_convert(), + 'xchan_name_date' => datetime_convert(), + 'xchan_system' => $system + ] + ); + + + // Not checking return value. // It's ok for this to fail if it's an imported channel, and therefore the hash is a duplicate @@ -2355,6 +2404,7 @@ function channel_store_lowlevel($arr) { 'channel_guid' => ((array_key_exists('channel_guid',$arr)) ? $arr['channel_guid'] : ''), 'channel_guid_sig' => ((array_key_exists('channel_guid_sig',$arr)) ? $arr['channel_guid_sig'] : ''), 'channel_hash' => ((array_key_exists('channel_hash',$arr)) ? $arr['channel_hash'] : ''), + 'channel_portable_id' => ((array_key_exists('channel_portable_id',$arr)) ? $arr['channel_portable_id'] : ''), 'channel_timezone' => ((array_key_exists('channel_timezone',$arr)) ? $arr['channel_timezone'] : 'UTC'), 'channel_location' => ((array_key_exists('channel_location',$arr)) ? $arr['channel_location'] : ''), 'channel_theme' => ((array_key_exists('channel_theme',$arr)) ? $arr['channel_theme'] : ''), diff --git a/include/crypto.php b/include/crypto.php index 1040ac29b..39bfd8d43 100644 --- a/include/crypto.php +++ b/include/crypto.php @@ -225,9 +225,14 @@ function crypto_unencapsulate($data,$prvkey) { if(! $data) return; - $alg = ((array_key_exists('alg',$data)) ? $data['alg'] : 'aes256cbc'); - if($alg === 'aes256cbc') + $alg = ((is_array($data) && (array_key_exists('encrypted',$data) || array_key_exists('iv',$data))) ? $data['alg'] : ''); + if(! $alg) { + return $data; + } + + if($alg === 'aes256cbc') { return aes_unencapsulate($data,$prvkey); + } return other_unencapsulate($data,$prvkey,$alg); diff --git a/include/event.php b/include/event.php index 84a16e8be..a34250e7a 100644 --- a/include/event.php +++ b/include/event.php @@ -1125,11 +1125,14 @@ function event_store_item($arr, $event) { } } - if(! $arr['mid']) - $arr['mid'] = item_message_id(); + if(! $arr['mid']) { + $arr['uuid'] = item_message_id(); + $arr['mid'] = z_root() . '/item/' . $arr['uuid']; + } $item_arr['aid'] = $z[0]['channel_account_id']; $item_arr['uid'] = $arr['uid']; + $item_arr['uuid'] = $arr['uuid']; $item_arr['author_xchan'] = $arr['event_xchan']; $item_arr['mid'] = $arr['mid']; $item_arr['parent_mid'] = $arr['mid']; diff --git a/include/help.php b/include/help.php index 3b56a7238..f2aa4add3 100644 --- a/include/help.php +++ b/include/help.php @@ -351,7 +351,8 @@ function store_doc_file($s) { $x = item_store_update($item); } else { - $item['mid'] = $item['parent_mid'] = item_message_id(); + $item['uuid'] = $item_message_id(); + $item['mid'] = $item['parent_mid'] = z_root() . '/item/' . $item['uuid']; $x = item_store($item); } diff --git a/include/import.php b/include/import.php index 6476aa688..53b21c317 100644 --- a/include/import.php +++ b/include/import.php @@ -1520,7 +1520,8 @@ function import_webpage_element($element, $channel, $type) { } else { // otherwise, generate the creation times and unique id $arr['created'] = datetime_convert('UTC', 'UTC'); - $arr['mid'] = $arr['parent_mid'] = item_message_id(); + $arr['uuid'] = item_message_id(); + $arr['mid'] = $arr['parent_mid'] = z_root() . '/item/' . $arr['uuid']; } // Update the edited time whether or not the element already exists $arr['edited'] = datetime_convert('UTC', 'UTC'); diff --git a/include/items.php b/include/items.php index d8a9e8e56..2cee376d0 100755 --- a/include/items.php +++ b/include/items.php @@ -393,7 +393,11 @@ function post_activity_item($arr, $allow_code = false, $deliver = true) { if(! array_key_exists('mimetype',$arr)) $arr['mimetype'] = 'text/bbcode'; - $arr['mid'] = ((x($arr,'mid')) ? $arr['mid'] : item_message_id()); + + if(! $arr['mid']) { + $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']); $arr['thr_parent'] = ((x($arr,'thr_parent')) ? $arr['thr_parent'] : $arr['mid']); @@ -597,6 +601,7 @@ function get_item_elements($x,$allow_code = false) { $arr = array(); $arr['body'] = $x['body']; + $arr['summary'] = $x['summary']; $maxlen = get_max_import_size(); @@ -605,6 +610,11 @@ function get_item_elements($x,$allow_code = false) { logger('get_item_elements: message length exceeds max_import_size: truncated'); } + if($maxlen && mb_strlen($arr['summary']) > $maxlen) { + $arr['summary'] = mb_substr($arr['summary'],0,$maxlen,'UTF-8'); + logger('get_item_elements: message summary length exceeds max_import_size: truncated'); + } + $arr['created'] = datetime_convert('UTC','UTC',$x['created']); $arr['edited'] = datetime_convert('UTC','UTC',$x['edited']); @@ -627,6 +637,7 @@ function get_item_elements($x,$allow_code = false) { if(mb_strlen($arr['title']) > 255) $arr['title'] = mb_substr($arr['title'],0,255); + $arr['uuid'] = (($x['uuid']) ? htmlspecialchars($x['uuid'], ENT_COMPAT,'UTF-8',false) : ''); $arr['app'] = (($x['app']) ? htmlspecialchars($x['app'], ENT_COMPAT,'UTF-8',false) : ''); $arr['route'] = (($x['route']) ? htmlspecialchars($x['route'], ENT_COMPAT,'UTF-8',false) : ''); $arr['mid'] = (($x['message_id']) ? htmlspecialchars($x['message_id'], ENT_COMPAT,'UTF-8',false) : ''); @@ -747,9 +758,10 @@ function get_item_elements($x,$allow_code = false) { // Do this after signature checking as the original signature // was generated on the escaped content. - if($arr['mimetype'] === 'text/markdown') + if($arr['mimetype'] === 'text/markdown') { + $arr['summary'] = MarkdownSoap::unescape($arr['summary']); $arr['body'] = MarkdownSoap::unescape($arr['body']); - + } if(array_key_exists('revision',$x)) { // extended export encoding @@ -1061,6 +1073,7 @@ function encode_item($item,$mirror = false) { $x['item_blocked'] = $item['item_blocked']; } + $x['uuid'] = $item['uuid']; $x['message_id'] = $item['mid']; $x['message_top'] = $item['parent_mid']; $x['message_parent'] = $item['thr_parent']; @@ -1071,6 +1084,7 @@ function encode_item($item,$mirror = false) { $x['commented'] = $item['commented']; $x['mimetype'] = $item['mimetype']; $x['title'] = $item['title']; + $x['summary'] = $item['summary']; $x['body'] = $item['body']; $x['app'] = $item['app']; $x['verb'] = $item['verb']; @@ -1629,6 +1643,7 @@ function item_store($arr, $allow_exec = false, $deliver = true) { } $arr['title'] = ((array_key_exists('title',$arr) && strlen($arr['title'])) ? trim($arr['title']) : ''); + $arr['summary'] = ((array_key_exists('summary',$arr) && strlen($arr['summary'])) ? trim($arr['summary']) : ''); $arr['body'] = ((array_key_exists('body',$arr) && strlen($arr['body'])) ? trim($arr['body']) : ''); $arr['allow_cid'] = ((x($arr,'allow_cid')) ? trim($arr['allow_cid']) : ''); @@ -1637,6 +1652,7 @@ function item_store($arr, $allow_exec = false, $deliver = true) { $arr['deny_gid'] = ((x($arr,'deny_gid')) ? trim($arr['deny_gid']) : ''); $arr['postopts'] = ((x($arr,'postopts')) ? trim($arr['postopts']) : ''); $arr['route'] = ((x($arr,'route')) ? trim($arr['route']) : ''); + $arr['uuid'] = ((x($arr,'uuid')) ? trim($arr['uuid']) : ''); $arr['item_private'] = ((x($arr,'item_private')) ? intval($arr['item_private']) : 0 ); $arr['item_wall'] = ((x($arr,'item_wall')) ? intval($arr['item_wall']) : 0 ); $arr['item_type'] = ((x($arr,'item_type')) ? intval($arr['item_type']) : 0 ); @@ -1649,6 +1665,7 @@ function item_store($arr, $allow_exec = false, $deliver = true) { // apply the input filter here + $arr['summary'] = trim(z_input_filter($arr['summary'],$arr['mimetype'],$allow_exec)); $arr['body'] = trim(z_input_filter($arr['body'],$arr['mimetype'],$allow_exec)); item_sign($arr); @@ -2094,6 +2111,7 @@ function item_store_update($arr, $allow_exec = false, $deliver = true) { // apply the input filter here + $arr['summary'] = trim(z_input_filter($arr['summary'],$arr['mimetype'],$allow_exec)); $arr['body'] = trim(z_input_filter($arr['body'],$arr['mimetype'],$allow_exec)); item_sign($arr); @@ -2170,6 +2188,7 @@ function item_store_update($arr, $allow_exec = false, $deliver = true) { $arr['route'] = ((array_key_exists('route',$arr)) ? trim($arr['route']) : $orig[0]['route']); $arr['location'] = ((x($arr,'location')) ? notags(trim($arr['location'])) : $orig[0]['location']); + $arr['uuid'] = ((x($arr,'uuid')) ? notags(trim($arr['uuid'])) : $orig[0]['uuid']); $arr['coord'] = ((x($arr,'coord')) ? notags(trim($arr['coord'])) : $orig[0]['coord']); $arr['verb'] = ((x($arr,'verb')) ? notags(trim($arr['verb'])) : $orig[0]['verb']); $arr['obj_type'] = ((x($arr,'obj_type')) ? notags(trim($arr['obj_type'])) : $orig[0]['obj_type']); @@ -2625,28 +2644,30 @@ function tag_deliver($uid, $item_id) { $plustagged = false; $matches = array(); - $pattern = '/[\!@]\!?\[zrl\=' . preg_quote($term['url'],'/') . '\]' . preg_quote($term['term'],'/') . '\[\/zrl\]/'; + $pattern = '/[\!@]\!?\[[uz]rl\=' . preg_quote($term['url'],'/') . '\](.*?)\[\/[uz]rl\]/'; if(preg_match($pattern,$body,$matches)) $tagged = true; - // original red forum tagging sequence @forumname+ + $pattern = '/\[url\=' . preg_quote($term['url'],'/') . '\]\@(.*?)\[\/url\]/'; + if(preg_match($pattern,$body,$matches)) + $tagged = true; + + // standard forum tagging sequence !forumname - $pluspattern = '/@\!?\[zrl\=([^\]]*?)\]((?:.(?!\[zrl\=))*?)\+\[\/zrl\]/'; + $forumpattern = '/\!\!?\[[uz]rl\=([^\]]*?)\]((?:.(?!\[[uz]rl\=))*?)\[\/[uz]rl\]/'; - $forumpattern = '/\!\!?\[zrl\=([^\]]*?)\]((?:.(?!\[zrl\=))*?)\[\/zrl\]/'; + $forumpattern2 = '/\[[uz]rl\=([^\]]*?)\]\!((?:.(?!\[[uz]rl\=))*?)\[\/[uz]rl\]/'; - $found = false; $matches = array(); - if(preg_match_all($pluspattern,$body,$matches,PREG_SET_ORDER)) { + if(preg_match_all($forumpattern,$body,$matches,PREG_SET_ORDER)) { foreach($matches as $match) { $matched_forums ++; - if($term['url'] === $match[1] && $term['term'] === $match[2] && intval($term['ttype']) === TERM_MENTION) { + if($term['url'] === $match[1] && intval($term['ttype']) === TERM_FORUM) { if($matched_forums <= $max_forums) { $plustagged = true; - $found = true; break; } logger('forum ' . $term['term'] . ' exceeded max_tagged_forums - ignoring'); @@ -2654,13 +2675,12 @@ function tag_deliver($uid, $item_id) { } } - if(preg_match_all($forumpattern,$body,$matches,PREG_SET_ORDER)) { + if(preg_match_all($forumpattern2,$body,$matches,PREG_SET_ORDER)) { foreach($matches as $match) { $matched_forums ++; - if($term['url'] === $match[1] && $term['term'] === $match[2] && intval($term['ttype']) === TERM_FORUM) { + if($term['url'] === $match[1] && intval($term['ttype']) === TERM_FORUM) { if($matched_forums <= $max_forums) { $plustagged = true; - $found = true; break; } logger('forum ' . $term['term'] . ' exceeded max_tagged_forums - ignoring'); @@ -2882,18 +2902,19 @@ function tgroup_check($uid, $item) { $body = preg_replace('/\[share(.*?)\[\/share\]/','',$item['body']); - $pluspattern = '/@\!?\[zrl\=([^\]]*?)\]((?:.(?!\[zrl\=))*?)\+\[\/zrl\]/'; - $forumpattern = '/\!\!?\[zrl\=([^\]]*?)\]((?:.(?!\[zrl\=))*?)\[\/zrl\]/'; + $forumpattern2 = '/\[zrl\=([^\]]*?)\]\!((?:.(?!\[zrl\=))*?)\[\/zrl\]/'; + + $found = false; $matches = array(); - if(preg_match_all($pluspattern,$body,$matches,PREG_SET_ORDER)) { + if(preg_match_all($forumpattern,$body,$matches,PREG_SET_ORDER)) { foreach($matches as $match) { $matched_forums ++; - if($term['url'] === $match[1] && $term['term'] === $match[2] && intval($term['ttype']) === TERM_MENTION) { + if($term['url'] === $match[1] && intval($term['ttype']) === TERM_FORUM) { if($matched_forums <= $max_forums) { $found = true; break; @@ -2903,10 +2924,10 @@ function tgroup_check($uid, $item) { } } - if(preg_match_all($forumpattern,$body,$matches,PREG_SET_ORDER)) { + if(preg_match_all($forumpattern2,$body,$matches,PREG_SET_ORDER)) { foreach($matches as $match) { $matched_forums ++; - if($term['url'] === $match[1] && $term['term'] === $match[2] && intval($term['ttype']) === TERM_FORUM) { + if($term['url'] === $match[1] && intval($term['ttype']) === TERM_FORUM) { if($matched_forums <= $max_forums) { $found = true; break; @@ -4744,7 +4765,8 @@ function item_create_edit_activity($post) { $new_item['id'] = 0; $new_item['parent'] = 0; - $new_item['mid'] = item_message_id(); + $new_item['uuid'] = item_message_id(); + $new_item['mid'] = z_root() . '/item/' . $new_item['uuid']; $new_item['body'] = sprintf( t('[Edited %s]'), (($update_item['item_thread_top']) ? t('Post','edit_activity') : t('Comment','edit_activity'))); diff --git a/include/network.php b/include/network.php index d37da05f7..183a47105 100644 --- a/include/network.php +++ b/include/network.php @@ -153,7 +153,7 @@ function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) { // Pull out multiple headers, e.g. proxy and continuation headers // allow for HTTP/2.x without fixing code - while(preg_match('/^HTTP\/[1-2].+? [1-5][0-9][0-9]/',$base)) { + while(preg_match('/^HTTP\/[1-3].+? [1-5][0-9][0-9]/',$base)) { $chunk = substr($base,0,strpos($base,"\r\n\r\n")+4); $header .= $chunk; $base = substr($base,strlen($chunk)); @@ -319,7 +319,7 @@ function z_post_url($url, $params, $redirects = 0, $opts = array()) { // Pull out multiple headers, e.g. proxy and continuation headers // allow for HTTP/2.x without fixing code - while(preg_match('/^HTTP\/[1-2].+? [1-5][0-9][0-9]/',$base)) { + while(preg_match('/^HTTP\/[1-3].+? [1-5][0-9][0-9]/',$base)) { $chunk = substr($base,0,strpos($base,"\r\n\r\n")+4); $header .= $chunk; $base = substr($base,strlen($chunk)); diff --git a/include/photos.php b/include/photos.php index d5553b495..ae51703e0 100644 --- a/include/photos.php +++ b/include/photos.php @@ -441,11 +441,13 @@ function photo_upload($channel, $observer, $args) { } } else { - $mid = item_message_id(); + $uuid = item_message_id(); + $mid = z_root() . '/item/' . $uuid; $arr = [ 'aid' => $account_id, 'uid' => $channel_id, + 'uuid' => $uuid, 'mid' => $mid, 'parent_mid' => $mid, 'item_hidden' => $item_hidden, @@ -827,12 +829,14 @@ function photos_create_item($channel, $creator_hash, $photo, $visible = false) { $item_hidden = (($visible) ? 0 : 1 ); - $mid = item_message_id(); + $uuid = item_message_id(); + $mid = z_root() . '/item/' . $uuid; $arr = array(); $arr['aid'] = $channel['channel_account_id']; $arr['uid'] = $channel['channel_id']; + $arr['uuid'] = $uuid; $arr['mid'] = $mid; $arr['parent_mid'] = $mid; $arr['item_wall'] = 1; diff --git a/include/queue_fn.php b/include/queue_fn.php index f05bac5b0..f7e2922c6 100644 --- a/include/queue_fn.php +++ b/include/queue_fn.php @@ -1,5 +1,9 @@ <?php /** @file */ +use Zotlabs\Lib\Libzot; +use Zotlabs\Zot6\Receiver; +use Zotlabs\Zot6\Zot6Handler; + function update_queue_item($id, $add_priority = 0) { logger('queue: requeue item ' . $id,LOGGER_DEBUG); $x = q("select outq_created, outq_posturl from outq where outq_hash = '%s' limit 1", @@ -226,37 +230,85 @@ function queue_deliver($outq, $immediate = false) { logger('deliver: dest: ' . $outq['outq_posturl'], LOGGER_DEBUG); - $channel = null; + if($outq['outq_driver'] === 'zot6') { + + if($outq['outq_posturl'] === z_root() . '/zot') { + // local delivery + $zot = new Receiver(new Zot6Handler(),$outq['outq_notify']); + $result = $zot->run(true); + logger('returned_json: ' . json_encode($result,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES), LOGGER_DATA); + logger('deliver: local zot6 delivery succeeded to ' . $outq['outq_posturl']); + Libzot::process_response($outq['outq_posturl'],[ 'success' => true, 'body' => json_encode($result) ], $outq); + } + else { + logger('remote'); + $channel = null; + + if($outq['outq_channel']) { + $channel = channelx_by_n($outq['outq_channel']); + } + + $host_crypto = null; + if($channel && $base) { + $h = q("select hubloc_sitekey, site_crypto from hubloc left join site on hubloc_url = site_url where site_url = '%s' and hubloc_network = 'zot6' order by hubloc_id desc limit 1", + dbesc($base) + ); + if($h) { + $host_crypto = $h[0]; + } + } + + $msg = $outq['outq_notify']; + + $result = Libzot::zot($outq['outq_posturl'],$msg,$channel,$host_crypto); + + if($result['success']) { + logger('deliver: remote zot6 delivery succeeded to ' . $outq['outq_posturl']); + Libzot::process_response($outq['outq_posturl'],$result, $outq); + } + else { + logger('deliver: remote zot6 delivery failed to ' . $outq['outq_posturl']); + logger('deliver: remote zot6 delivery fail data: ' . print_r($result,true), LOGGER_DATA); + update_queue_item($outq['outq_hash'],10); + } - if($outq['outq_msg'] && $outq['outq_channel']) { - $channel = channelx_by_n($outq['outq_channel']); + } + return; } + else { - $host_crypto = null; + $channel = null; - if($channel && $base) { - $h = q("select hubloc_sitekey, site_crypto from hubloc left join site on hubloc_url = site_url where site_url = '%s' order by hubloc_id desc limit 1", - dbesc($base) - ); - if($h) { - $host_crypto = $h[0]; + if($outq['outq_msg'] && $outq['outq_channel']) { + $channel = channelx_by_n($outq['outq_channel']); } - } - $msg = $outq['outq_notify']; + $host_crypto = null; - $result = zot_zot($outq['outq_posturl'],$msg,$channel,$host_crypto); + if($channel && $base) { + $h = q("select hubloc_sitekey, site_crypto from hubloc left join site on hubloc_url = site_url where site_url = '%s' order by hubloc_id desc limit 1", + dbesc($base) + ); + if($h) { + $host_crypto = $h[0]; + } + } + $msg = $outq['outq_notify']; - if($result['success']) { - logger('deliver: remote zot delivery succeeded to ' . $outq['outq_posturl']); - zot_process_response($outq['outq_posturl'],$result, $outq); - } - else { - logger('deliver: remote zot delivery failed to ' . $outq['outq_posturl']); - logger('deliver: remote zot delivery fail data: ' . print_r($result,true), LOGGER_DATA); - update_queue_item($outq['outq_hash'],10); + $result = zot_zot($outq['outq_posturl'],$msg,$channel,$host_crypto); + + + if($result['success']) { + logger('deliver: remote zot delivery succeeded to ' . $outq['outq_posturl']); + zot_process_response($outq['outq_posturl'],$result, $outq); + } + else { + logger('deliver: remote zot delivery failed to ' . $outq['outq_posturl']); + logger('deliver: remote zot delivery fail data: ' . print_r($result,true), LOGGER_DATA); + update_queue_item($outq['outq_hash'],10); + } + return; } - return; -} +}
\ No newline at end of file diff --git a/include/text.php b/include/text.php index 076c98407..646bfe749 100644 --- a/include/text.php +++ b/include/text.php @@ -3,8 +3,11 @@ * @file include/text.php */ -use \Zotlabs\Lib as Zlib; -use \Michelf\MarkdownExtra; +use Zotlabs\Lib as Zlib; + +use Michelf\MarkdownExtra; +use Ramsey\Uuid\Uuid; +use Ramsey\Uuid\Exception\UnsatisfiedDependencyException; require_once("include/bbcode.php"); @@ -571,18 +574,9 @@ function alt_pager($i, $more = '', $less = '') { * @return string a unique id */ function item_message_id() { - do { - $dups = false; - $hash = random_string(); - $mid = $hash . '@' . App::get_hostname(); - $r = q("SELECT id FROM item WHERE mid = '%s' LIMIT 1", - dbesc($mid)); - if($r) - $dups = true; - } while($dups == true); + return new_uuid(); - return $mid; } /** @@ -593,17 +587,9 @@ function item_message_id() { * @return string a uniqe hash */ function photo_new_resource() { - do { - $found = false; - $resource = hash('md5', uniqid(mt_rand(), true)); - $r = q("SELECT id FROM photo WHERE resource_id = '%s' LIMIT 1", - dbesc($resource)); - if($r) - $found = true; - } while($found === true); + return new_uuid(); - return $resource; } /** @@ -3480,3 +3466,19 @@ function print_val($v) { return $v; } + +/** + * @brief Generate a unique ID. + * + * @return string + */ +function new_uuid() { + + try { + $hash = Uuid::uuid4()->toString(); + } catch (UnsatisfiedDependencyException $e) { + $hash = random_string(48); + } + + return $hash; +} diff --git a/include/xchan.php b/include/xchan.php index eb5f1b4a3..4cbfb42c5 100644 --- a/include/xchan.php +++ b/include/xchan.php @@ -5,6 +5,11 @@ use Zotlabs\Zot6\HTTPSig; function xchan_store_lowlevel($arr) { + if(! $arr['xchan_hash']) { + logger('No xchan_hash'); + return false; + } + $store = [ 'xchan_hash' => ((array_key_exists('xchan_hash',$arr)) ? $arr['xchan_hash'] : ''), 'xchan_guid' => ((array_key_exists('xchan_guid',$arr)) ? $arr['xchan_guid'] : ''), diff --git a/include/zot.php b/include/zot.php index 3ccf0a81f..d031b4a96 100644 --- a/include/zot.php +++ b/include/zot.php @@ -8,6 +8,8 @@ * */ +use Zotlabs\Lib\DReport; + require_once('include/crypto.php'); require_once('include/items.php'); require_once('include/queue_fn.php'); @@ -81,7 +83,7 @@ function zot_get_hublocs($hash) { /* Only search for active hublocs - e.g. those that haven't been marked deleted */ - $ret = q("select * from hubloc where hubloc_hash = '%s' and hubloc_deleted = 0 order by hubloc_url ", + $ret = q("select * from hubloc where hubloc_hash = '%s' and hubloc_deleted = 0 and hubloc_network = 'zot' order by hubloc_url ", dbesc($hash) ); @@ -654,7 +656,7 @@ function zot_gethub($arr, $multiple = false) { $r = q("select hubloc.*, site.site_crypto from hubloc left join site on hubloc_url = site_url where hubloc_guid = '%s' and hubloc_guid_sig = '%s' - and hubloc_url = '%s' and hubloc_url_sig = '%s' + and hubloc_url = '%s' and hubloc_url_sig = '%s' and hubloc_network = 'zot' $sitekey $limit", dbesc($arr['guid']), dbesc($arr['guid_sig']), @@ -1119,14 +1121,15 @@ function zot_process_response($hub, $arr, $outq) { } foreach($x['delivery_report'] as $xx) { - call_hooks('dreport_process',$xx); - if(is_array($xx) && array_key_exists('message_id',$xx) && delivery_report_is_storable($xx)) { - q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_result, dreport_time, dreport_xchan ) values ( '%s', '%s','%s','%s','%s','%s' ) ", + call_hooks('dreport_process',$xx); + if(is_array($xx) && array_key_exists('message_id',$xx) && DReport::is_storable($xx)) { + q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_name, dreport_result, dreport_time, dreport_xchan ) values ( '%s', '%s','%s','%s','%s','%s','%s' ) ", dbesc($xx['message_id']), dbesc($xx['location']), dbesc($xx['recipient']), + dbesc($xx['name']), dbesc($xx['status']), - dbesc(datetime_convert($xx['date'])), + dbesc(datetime_convert('UTC','UTC',$xx['date'])), dbesc($xx['sender']) ); } @@ -1188,6 +1191,7 @@ function zot_fetch($arr) { $zret = zot6_check_sig(); if($zret['success'] && $zret['hubloc'] && $zret['hubloc']['hubloc_guid'] === $arr['sender']['guid'] && $arr['msg']) { + logger('zot6_delivery',LOGGER_DEBUG); logger('zot6_data: ' . print_r($arr,true),LOGGER_DATA); @@ -1748,7 +1752,7 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $ } $channel = $r[0]; - $DR->addto_recipient($channel['channel_name'] . ' <' . channel_reddress($channel) . '>'); + $DR->set_name($channel['channel_name'] . ' <' . channel_reddress($channel) . '>'); /* blacklisted channels get a permission denied, no special message to tip them off */ @@ -2297,7 +2301,7 @@ function process_mail_delivery($sender, $arr, $deliveries) { } $channel = $r[0]; - $DR->addto_recipient($channel['channel_name'] . ' <' . channel_reddress($channel) . '>'); + $DR->set_name($channel['channel_name'] . ' <' . channel_reddress($channel) . '>'); /* blacklisted channels get a permission denied, no special message to tip them off */ @@ -3987,7 +3991,7 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) { if(array_key_exists('item',$arr) && is_array($arr['item'][0])) { $DR = new Zotlabs\Lib\DReport(z_root(),$d['hash'],$d['hash'],$arr['item'][0]['message_id'],'channel sync processed'); - $DR->addto_recipient($channel['channel_name'] . ' <' . channel_reddress($channel) . '>'); + $DR->set_name($channel['channel_name'] . ' <' . channel_reddress($channel) . '>'); } else $DR = new Zotlabs\Lib\DReport(z_root(),$d['hash'],$d['hash'],'sync packet','channel sync delivered'); @@ -5185,7 +5189,7 @@ function zot6_check_sig() { $sigblock = \Zotlabs\Web\HTTPSig::parse_sigheader($_SERVER['HTTP_SIGNATURE']); if($sigblock) { $keyId = $sigblock['keyId']; - + logger('keyID: ' . $keyId); if($keyId) { $r = q("select hubloc.*, site_crypto from hubloc left join site on hubloc_url = site_url where hubloc_addr = '%s' ", @@ -5195,6 +5199,7 @@ function zot6_check_sig() { foreach($r as $hubloc) { $verified = \Zotlabs\Web\HTTPSig::verify('',$hubloc['xchan_pubkey']); if($verified && $verified['header_signed'] && $verified['header_valid'] && $verified['content_signed'] && $verified['content_valid']) { + logger('zot6 verified'); $ret['hubloc'] = $hubloc; $ret['success'] = true; return $ret; diff --git a/install/schema_mysql.sql b/install/schema_mysql.sql index 7b7d9cc3a..3e3e6fe88 100644 --- a/install/schema_mysql.sql +++ b/install/schema_mysql.sql @@ -247,6 +247,7 @@ CREATE TABLE IF NOT EXISTS `channel` ( `channel_guid` char(191) NOT NULL DEFAULT '', `channel_guid_sig` text NOT NULL, `channel_hash` char(191) NOT NULL DEFAULT '', + `channel_portable_id` char(191) NOT NULL DEFAULT '', `channel_timezone` char(128) NOT NULL DEFAULT 'UTC', `channel_location` char(191) NOT NULL DEFAULT '', `channel_theme` char(191) NOT NULL DEFAULT '', @@ -306,6 +307,7 @@ CREATE TABLE IF NOT EXISTS `channel` ( KEY `channel_default_gid` (`channel_default_group`), KEY `channel_guid` (`channel_guid`), KEY `channel_hash` (`channel_hash`), + KEY `channel_portable_id` (`channel_portable_id`), KEY `channel_expire_days` (`channel_expire_days`), KEY `channel_deleted` (`channel_deleted`), KEY `channel_active` (`channel_active`), @@ -403,6 +405,7 @@ CREATE TABLE IF NOT EXISTS `dreport` ( `dreport_site` char(191) NOT NULL DEFAULT '', `dreport_recip` char(191) NOT NULL DEFAULT '', `dreport_result` char(191) NOT NULL DEFAULT '', + `dreport_name` char(191) NOT NULL DEFAULT '', `dreport_time` datetime NOT NULL DEFAULT '0001-01-01 00:00:00', `dreport_xchan` char(191) NOT NULL DEFAULT '', `dreport_queue` char(191) NOT NULL DEFAULT '', @@ -577,6 +580,7 @@ CREATE TABLE IF NOT EXISTS `issue` ( CREATE TABLE IF NOT EXISTS `item` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `uuid` char(191) NOT NULL DEFAULT '', `mid` char(191) NOT NULL DEFAULT '', `aid` int(10) unsigned NOT NULL DEFAULT 0 , `uid` int(10) unsigned NOT NULL DEFAULT 0 , @@ -595,6 +599,7 @@ CREATE TABLE IF NOT EXISTS `item` ( `source_xchan` char(191) NOT NULL DEFAULT '', `mimetype` char(191) NOT NULL DEFAULT '', `title` text NOT NULL, + `summary` mediumtext NOT NULL, `body` mediumtext NOT NULL, `html` mediumtext NOT NULL, `app` char(191) NOT NULL DEFAULT '', @@ -649,6 +654,7 @@ CREATE TABLE IF NOT EXISTS `item` ( `item_pending_remove` tinyint(1) NOT NULL DEFAULT 0 , `item_blocked` tinyint(1) NOT NULL DEFAULT 0 , PRIMARY KEY (`id`), + KEY `uuid` (`uuid`), KEY `parent` (`parent`), KEY `created` (`created`), KEY `edited` (`edited`), diff --git a/install/schema_postgres.sql b/install/schema_postgres.sql index fd827978c..44f98b944 100644 --- a/install/schema_postgres.sql +++ b/install/schema_postgres.sql @@ -242,6 +242,7 @@ CREATE TABLE "channel" ( "channel_guid" text NOT NULL DEFAULT '', "channel_guid_sig" text NOT NULL, "channel_hash" text NOT NULL DEFAULT '', + "channel_portable_id" text NOT NULL DEFAULT '', "channel_timezone" varchar(128) NOT NULL DEFAULT 'UTC', "channel_location" text NOT NULL DEFAULT '', "channel_theme" text NOT NULL DEFAULT '', @@ -284,6 +285,7 @@ create index "channel_max_friend_req" on channel ("channel_max_friend_req"); create index "channel_default_gid" on channel ("channel_default_group"); create index "channel_guid" on channel ("channel_guid"); create index "channel_hash" on channel ("channel_hash"); +create index "channel_portable_id" on channel ("channel_portable_id"); create index "channel_expire_days" on channel ("channel_expire_days"); create index "channel_deleted" on channel ("channel_deleted"); create index "channel_active" on channel ("channel_active"); @@ -375,6 +377,7 @@ CREATE TABLE IF NOT EXISTS "dreport" ( "dreport_site" varchar(255) NOT NULL DEFAULT '', "dreport_recip" varchar(255) NOT NULL DEFAULT '', "dreport_result" varchar(255) NOT NULL DEFAULT '', + "dreport_name" varchar(255) NOT NULL DEFAULT '', "dreport_time" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00', "dreport_xchan" varchar(255) NOT NULL DEFAULT '', "dreport_queue" varchar(255) NOT NULL DEFAULT '', @@ -548,6 +551,7 @@ create index "issue_component" on issue ("issue_component"); CREATE TABLE "item" ( "id" serial NOT NULL, + "uuid" text NOT NULL DEFAULT '', "mid" text NOT NULL DEFAULT '', "aid" bigint NOT NULL DEFAULT '0', "uid" bigint NOT NULL DEFAULT '0', @@ -566,6 +570,7 @@ CREATE TABLE "item" ( "source_xchan" text NOT NULL DEFAULT '', "mimetype" text NOT NULL DEFAULT '', "title" text NOT NULL, + "summary" text NOT NULL, "body" text NOT NULL, "html" text NOT NULL, "app" text NOT NULL DEFAULT '', @@ -623,6 +628,7 @@ CREATE TABLE "item" ( PRIMARY KEY ("id") ); create index "item_uid" on item ("uid"); +create index "item_uuid" on item ("uuid"); create index "item_parent" on item ("parent"); create index "item_created" on item ("created"); create index "item_edited" on item ("edited"); diff --git a/tests/unit/Web/HttpSigTest.php b/tests/unit/Web/HttpSigTest.php index 18f2ce92b..9909a9883 100644 --- a/tests/unit/Web/HttpSigTest.php +++ b/tests/unit/Web/HttpSigTest.php @@ -91,6 +91,7 @@ class PermissionDescriptionTest extends UnitTestCase { function testDecrypt_sigheader() { $header = 'Header: iv="value_iv" key="value_key" alg="value_alg" data="value_data"'; $result = [ + 'encrypted' => true, 'iv' => 'value_iv', 'key' => 'value_key', 'alg' => 'value_alg', @@ -109,6 +110,7 @@ class PermissionDescriptionTest extends UnitTestCase { $header = 'Header: iv="value_iv" key="value_key" alg="value_alg" data="value_data"'; $result = [ + 'encrypted' => true, 'iv' => 'value_iv', 'key' => 'value_key', 'alg' => 'value_alg', diff --git a/view/ru/hmessages.po b/view/ru/hmessages.po index d21f707d1..6a8c8805c 100644 --- a/view/ru/hmessages.po +++ b/view/ru/hmessages.po @@ -12,7 +12,7 @@ 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-10-18 11:06+0200\n" +"PO-Revision-Date: 2018-11-19 14:12+0200\n" "Last-Translator: Max Kostikov <max@kostikov.co>\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:3087 +#: ../../view/theme/redbasic/php/config.php:15 ../../include/text.php:3086 #: ../../Zotlabs/Module/Admin/Site.php:187 msgid "Default" msgstr "По умолчанию" @@ -41,8 +41,8 @@ msgstr "Фокус (по умолчанию Hubzilla)" #: ../../Zotlabs/Module/Xchan.php:15 #: ../../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:1084 -#: ../../Zotlabs/Module/Photos.php:1124 ../../Zotlabs/Module/Photos.php:1242 +#: ../../Zotlabs/Module/Profiles.php:723 ../../Zotlabs/Module/Photos.php:1097 +#: ../../Zotlabs/Module/Photos.php:1137 ../../Zotlabs/Module/Photos.php:1255 #: ../../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 @@ -79,15 +79,15 @@ 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:888 ../../Zotlabs/Module/Group.php:140 -#: ../../Zotlabs/Module/Group.php:156 ../../Zotlabs/Module/Mood.php:156 +#: ../../Zotlabs/Module/Connedit.php:893 ../../Zotlabs/Module/Group.php:140 +#: ../../Zotlabs/Module/Group.php:156 ../../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:565 #: ../../Zotlabs/Module/Import_items.php:129 #: ../../Zotlabs/Widget/Wiki_pages.php:42 #: ../../Zotlabs/Widget/Wiki_pages.php:99 -#: ../../Zotlabs/Widget/Eventstools.php:16 ../../Zotlabs/Lib/ThreadItem.php:767 +#: ../../Zotlabs/Widget/Eventstools.php:16 ../../Zotlabs/Lib/ThreadItem.php:770 #: ../../extend/addon/hzaddons/dwpost/dwpost.php:89 #: ../../extend/addon/hzaddons/fuzzloc/fuzzloc.php:191 #: ../../extend/addon/hzaddons/redphotos/redphotos.php:136 @@ -106,7 +106,7 @@ msgstr "Фокус (по умолчанию Hubzilla)" #: ../../extend/addon/hzaddons/mailtest/mailtest.php:100 #: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:53 #: ../../extend/addon/hzaddons/hzfiles/hzfiles.php:84 -#: ../../extend/addon/hzaddons/ljpost/ljpost.php:86 +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:89 #: ../../extend/addon/hzaddons/statusnet/statusnet.php:322 #: ../../extend/addon/hzaddons/statusnet/statusnet.php:380 #: ../../extend/addon/hzaddons/statusnet/statusnet.php:432 @@ -150,9 +150,9 @@ 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:1629 ../../Zotlabs/Storage/Browser.php:405 #: ../../Zotlabs/Module/Defperms.php:197 ../../Zotlabs/Module/Profiles.php:681 -#: ../../Zotlabs/Module/Photos.php:699 ../../Zotlabs/Module/Api.php:99 +#: ../../Zotlabs/Module/Photos.php:712 ../../Zotlabs/Module/Api.php:99 #: ../../Zotlabs/Module/Events.php:472 ../../Zotlabs/Module/Events.php:473 #: ../../Zotlabs/Module/Sources.php:124 ../../Zotlabs/Module/Sources.php:159 #: ../../Zotlabs/Module/Settings/Display.php:89 @@ -163,7 +163,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:397 ../../Zotlabs/Module/Connedit.php:780 +#: ../../Zotlabs/Module/Connedit.php:398 ../../Zotlabs/Module/Connedit.php:785 #: ../../Zotlabs/Module/Wiki.php:227 ../../Zotlabs/Module/Wiki.php:228 #: ../../Zotlabs/Module/Import.php:554 ../../Zotlabs/Module/Import.php:558 #: ../../Zotlabs/Module/Import.php:559 ../../Zotlabs/Lib/Libzotdir.php:162 @@ -189,8 +189,8 @@ msgstr "Узкая панель навигации" #: ../../extend/addon/hzaddons/pumpio/pumpio.php:227 #: ../../extend/addon/hzaddons/pumpio/pumpio.php:231 #: ../../extend/addon/hzaddons/nsabait/nsabait.php:157 -#: ../../extend/addon/hzaddons/ljpost/ljpost.php:70 -#: ../../extend/addon/hzaddons/ljpost/ljpost.php:82 +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:73 +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:85 #: ../../extend/addon/hzaddons/statusnet/statusnet.php:389 #: ../../extend/addon/hzaddons/statusnet/statusnet.php:411 #: ../../extend/addon/hzaddons/statusnet/statusnet.php:415 @@ -229,9 +229,9 @@ 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:1629 ../../Zotlabs/Storage/Browser.php:405 #: ../../Zotlabs/Module/Defperms.php:197 ../../Zotlabs/Module/Profiles.php:681 -#: ../../Zotlabs/Module/Photos.php:699 ../../Zotlabs/Module/Api.php:98 +#: ../../Zotlabs/Module/Photos.php:712 ../../Zotlabs/Module/Api.php:98 #: ../../Zotlabs/Module/Events.php:472 ../../Zotlabs/Module/Events.php:473 #: ../../Zotlabs/Module/Sources.php:124 ../../Zotlabs/Module/Sources.php:159 #: ../../Zotlabs/Module/Settings/Display.php:89 @@ -242,7 +242,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:397 ../../Zotlabs/Module/Wiki.php:227 +#: ../../Zotlabs/Module/Connedit.php:398 ../../Zotlabs/Module/Wiki.php:227 #: ../../Zotlabs/Module/Wiki.php:228 ../../Zotlabs/Module/Import.php:554 #: ../../Zotlabs/Module/Import.php:558 ../../Zotlabs/Module/Import.php:559 #: ../../Zotlabs/Lib/Libzotdir.php:162 ../../Zotlabs/Lib/Libzotdir.php:163 @@ -268,8 +268,8 @@ msgstr "Нет" #: ../../extend/addon/hzaddons/pumpio/pumpio.php:227 #: ../../extend/addon/hzaddons/pumpio/pumpio.php:231 #: ../../extend/addon/hzaddons/nsabait/nsabait.php:157 -#: ../../extend/addon/hzaddons/ljpost/ljpost.php:70 -#: ../../extend/addon/hzaddons/ljpost/ljpost.php:82 +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:73 +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:85 #: ../../extend/addon/hzaddons/statusnet/statusnet.php:389 #: ../../extend/addon/hzaddons/statusnet/statusnet.php:411 #: ../../extend/addon/hzaddons/statusnet/statusnet.php:415 @@ -414,13 +414,13 @@ msgid "Monthly" msgstr "Ежемесячно" #: ../../include/selectors.php:60 ../../include/selectors.php:77 -#: ../../include/channel.php:1487 +#: ../../include/channel.php:1536 #: ../../extend/addon/hzaddons/openid/Mod_Id.php:85 msgid "Male" msgstr "Мужчина" #: ../../include/selectors.php:60 ../../include/selectors.php:77 -#: ../../include/channel.php:1485 +#: ../../include/channel.php:1534 #: ../../extend/addon/hzaddons/openid/Mod_Id.php:87 msgid "Female" msgstr "Женщина" @@ -457,20 +457,20 @@ msgstr "Транссексуал" msgid "Hermaphrodite" msgstr "Гермафродит" -#: ../../include/selectors.php:60 ../../include/channel.php:1491 +#: ../../include/selectors.php:60 ../../include/channel.php:1540 msgid "Neuter" msgstr "Среднего рода" -#: ../../include/selectors.php:60 ../../include/channel.php:1493 +#: ../../include/selectors.php:60 ../../include/channel.php:1542 msgid "Non-specific" 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:1315 ../../include/event.php:1322 +#: ../../include/event.php:1318 ../../include/event.php:1325 #: ../../Zotlabs/Module/Cdav.php:1227 ../../Zotlabs/Module/Profiles.php:795 -#: ../../Zotlabs/Module/Connedit.php:919 +#: ../../Zotlabs/Module/Connedit.php:924 #: ../../Zotlabs/Access/PermissionRoles.php:306 msgid "Other" msgstr "Другой" @@ -567,14 +567,14 @@ msgstr "Неверный" msgid "Sex Addict" msgstr "Эротоман" -#: ../../include/selectors.php:134 ../../include/channel.php:444 -#: ../../include/channel.php:445 ../../include/channel.php:452 +#: ../../include/selectors.php:134 ../../include/channel.php:493 +#: ../../include/channel.php:494 ../../include/channel.php:501 #: ../../Zotlabs/Module/Settings/Channel.php:70 #: ../../Zotlabs/Module/Settings/Channel.php:74 #: ../../Zotlabs/Module/Settings/Channel.php:75 #: ../../Zotlabs/Module/Settings/Channel.php:78 #: ../../Zotlabs/Module/Settings/Channel.php:89 -#: ../../Zotlabs/Module/Connedit.php:712 ../../Zotlabs/Widget/Affinity.php:24 +#: ../../Zotlabs/Module/Connedit.php:717 ../../Zotlabs/Widget/Affinity.php:24 msgid "Friends" msgstr "Друзья" @@ -662,7 +662,7 @@ msgstr "Всё равно" msgid "Ask me" msgstr "Спроси меня" -#: ../../include/photos.php:27 ../../include/items.php:3675 +#: ../../include/photos.php:27 ../../include/items.php:3701 #: ../../include/attach.php:150 ../../include/attach.php:197 #: ../../include/attach.php:270 ../../include/attach.php:379 #: ../../include/attach.php:393 ../../include/attach.php:400 @@ -670,8 +670,8 @@ msgstr "Спроси меня" #: ../../include/attach.php:1116 ../../include/attach.php:1281 #: ../../Zotlabs/Module/Mail.php:146 ../../Zotlabs/Module/Defperms.php:181 #: ../../Zotlabs/Module/Network.php:17 ../../Zotlabs/Module/Common.php:38 -#: ../../Zotlabs/Module/Item.php:229 ../../Zotlabs/Module/Item.php:248 -#: ../../Zotlabs/Module/Item.php:258 ../../Zotlabs/Module/Item.php:1110 +#: ../../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/Profile.php:85 ../../Zotlabs/Module/Profile.php:101 @@ -698,8 +698,8 @@ 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:119 -#: ../../Zotlabs/Module/Channel.php:286 ../../Zotlabs/Module/Channel.php:325 +#: ../../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/Viewsrc.php:19 ../../Zotlabs/Module/Menu.php:129 #: ../../Zotlabs/Module/Menu.php:140 ../../Zotlabs/Module/Setup.php:209 @@ -713,9 +713,9 @@ 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:390 +#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Connedit.php:391 #: ../../Zotlabs/Module/Group.php:14 ../../Zotlabs/Module/Group.php:30 -#: ../../Zotlabs/Module/Connections.php:32 ../../Zotlabs/Module/Mood.php:124 +#: ../../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 @@ -727,6 +727,7 @@ msgstr "Спроси меня" #: ../../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 +#: ../../extend/addon/hzaddons/flashcards/Mod_Flashcards.php:167 #: ../../extend/addon/hzaddons/pumpio/pumpio.php:40 #: ../../extend/addon/hzaddons/openid/Mod_Id.php:53 #: ../../extend/addon/hzaddons/keepout/keepout.php:36 @@ -761,16 +762,16 @@ msgctxt "photo_upload" msgid "%1$s posted %2$s to %3$s" msgstr "%1$s опубликовал %2$s в %3$s" -#: ../../include/photos.php:667 ../../include/nav.php:417 +#: ../../include/photos.php:669 ../../include/nav.php:417 msgid "Photo Albums" msgstr "Фотоальбомы" -#: ../../include/photos.php:668 ../../Zotlabs/Module/Photos.php:1367 -#: ../../Zotlabs/Module/Photos.php:1380 ../../Zotlabs/Module/Photos.php:1381 +#: ../../include/photos.php:670 ../../Zotlabs/Module/Photos.php:1380 +#: ../../Zotlabs/Module/Photos.php:1393 ../../Zotlabs/Module/Photos.php:1394 msgid "Recent Photos" msgstr "Последние фотографии" -#: ../../include/photos.php:672 +#: ../../include/photos.php:674 msgid "Upload New Photos" msgstr "Загрузить новые фотографии" @@ -778,19 +779,19 @@ msgstr "Загрузить новые фотографии" msgid "View PDF" msgstr "Просмотреть PDF" -#: ../../include/oembed.php:347 +#: ../../include/oembed.php:352 msgid " by " msgstr " по " -#: ../../include/oembed.php:348 +#: ../../include/oembed.php:353 msgid " on " msgstr " на " -#: ../../include/oembed.php:377 +#: ../../include/oembed.php:382 msgid "Embedded content" msgstr "Встроенное содержимое" -#: ../../include/oembed.php:386 +#: ../../include/oembed.php:391 msgid "Embedding disabled" msgstr "Встраивание отключено" @@ -853,7 +854,7 @@ msgstr "Расширенный пример: name=ivan and country=russia" #: ../../include/contact_widgets.php:53 ../../include/features.php:325 #: ../../Zotlabs/Widget/Filer.php:28 -#: ../../Zotlabs/Widget/Activity_filter.php:136 +#: ../../Zotlabs/Widget/Activity_filter.php:137 msgid "Saved Folders" msgstr "Сохранённые каталоги" @@ -879,8 +880,8 @@ msgstr "Общие контакты" msgid "View all %d common connections" msgstr "Просмотреть все %d общих контактов" -#: ../../include/menu.php:118 ../../include/channel.php:1303 -#: ../../include/channel.php:1307 ../../Zotlabs/Storage/Browser.php:290 +#: ../../include/menu.php:118 ../../include/channel.php:1352 +#: ../../include/channel.php:1356 ../../Zotlabs/Storage/Browser.php:290 #: ../../Zotlabs/Module/Oauth.php:173 ../../Zotlabs/Module/Oauth2.php:194 #: ../../Zotlabs/Module/Editlayout.php:114 #: ../../Zotlabs/Module/Editblock.php:114 ../../Zotlabs/Module/Menu.php:175 @@ -899,55 +900,55 @@ msgstr "Просмотреть все %d общих контактов" msgid "Edit" msgstr "Изменить" -#: ../../include/channel.php:42 +#: ../../include/channel.php:43 msgid "Unable to obtain identity information from database" msgstr "Невозможно получить идентификационную информацию из базы данных" -#: ../../include/channel.php:75 +#: ../../include/channel.php:76 msgid "Empty name" msgstr "Пустое имя" -#: ../../include/channel.php:78 +#: ../../include/channel.php:79 msgid "Name too long" msgstr "Слишком длинное имя" -#: ../../include/channel.php:195 +#: ../../include/channel.php:196 msgid "No account identifier" msgstr "Идентификатор аккаунта отсутствует" -#: ../../include/channel.php:207 +#: ../../include/channel.php:208 msgid "Nickname is required." msgstr "Требуется псевдоним." -#: ../../include/channel.php:221 ../../include/channel.php:606 +#: ../../include/channel.php:222 ../../include/channel.php:655 #: ../../Zotlabs/Module/Changeaddr.php:46 msgid "Reserved nickname. Please choose another." msgstr "Зарезервированый псевдоним. Пожалуйста, выберите другой." -#: ../../include/channel.php:226 ../../include/channel.php:611 +#: ../../include/channel.php:227 ../../include/channel.php:660 #: ../../Zotlabs/Module/Changeaddr.php:51 msgid "" "Nickname has unsupported characters or is already being used on this site." msgstr "Псевдоним имеет недопустимые символы или уже используется на этом сайте." -#: ../../include/channel.php:284 +#: ../../include/channel.php:287 msgid "Unable to retrieve created identity" msgstr "Не удается получить созданный идентификатор" -#: ../../include/channel.php:380 +#: ../../include/channel.php:429 msgid "Default Profile" msgstr "Профиль по умолчанию" -#: ../../include/channel.php:539 ../../include/channel.php:628 +#: ../../include/channel.php:588 ../../include/channel.php:677 msgid "Unable to retrieve modified identity" msgstr "Не удается найти изменённый идентификатор" -#: ../../include/channel.php:1158 +#: ../../include/channel.php:1207 #: ../../extend/addon/hzaddons/chess/chess.php:486 msgid "Requested channel is not available." msgstr "Запрошенный канал не доступен." -#: ../../include/channel.php:1204 ../../Zotlabs/Module/Achievements.php:15 +#: ../../include/channel.php:1253 ../../Zotlabs/Module/Achievements.php:15 #: ../../Zotlabs/Module/Profile.php:20 ../../Zotlabs/Module/Editlayout.php:31 #: ../../Zotlabs/Module/Filestorage.php:51 #: ../../Zotlabs/Module/Editblock.php:31 ../../Zotlabs/Module/Menu.php:91 @@ -959,84 +960,84 @@ msgstr "Запрошенный канал не доступен." msgid "Requested profile is not available." msgstr "Запрашиваемый профиль не доступен." -#: ../../include/channel.php:1296 ../../Zotlabs/Module/Profiles.php:728 +#: ../../include/channel.php:1345 ../../Zotlabs/Module/Profiles.php:728 msgid "Change profile photo" msgstr "Изменить фотографию профиля" -#: ../../include/channel.php:1303 ../../include/nav.php:109 +#: ../../include/channel.php:1352 ../../include/nav.php:109 #: ../../Zotlabs/Module/Profiles.php:830 msgid "Edit Profiles" msgstr "Редактирование профилей" -#: ../../include/channel.php:1304 +#: ../../include/channel.php:1353 msgid "Create New Profile" msgstr "Создать новый профиль" -#: ../../include/channel.php:1307 ../../include/nav.php:111 +#: ../../include/channel.php:1356 ../../include/nav.php:111 #: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:58 msgid "Edit Profile" msgstr "Редактировать профиль" -#: ../../include/channel.php:1322 ../../Zotlabs/Module/Profiles.php:820 +#: ../../include/channel.php:1371 ../../Zotlabs/Module/Profiles.php:820 msgid "Profile Image" msgstr "Изображение профиля" -#: ../../include/channel.php:1325 +#: ../../include/channel.php:1374 msgid "Visible to everybody" msgstr "Видно всем" -#: ../../include/channel.php:1326 ../../Zotlabs/Module/Profiles.php:725 +#: ../../include/channel.php:1375 ../../Zotlabs/Module/Profiles.php:725 #: ../../Zotlabs/Module/Profiles.php:824 msgid "Edit visibility" msgstr "Редактировать видимость" -#: ../../include/channel.php:1383 ../../include/conversation.php:1058 +#: ../../include/channel.php:1432 ../../include/conversation.php:1058 #: ../../include/connections.php:110 ../../Zotlabs/Module/Directory.php:342 #: ../../Zotlabs/Module/Suggest.php:71 ../../Zotlabs/Widget/Suggestions.php:44 #: ../../Zotlabs/Widget/Follow.php:32 msgid "Connect" msgstr "Подключить" -#: ../../include/channel.php:1398 ../../include/event.php:54 +#: ../../include/channel.php:1447 ../../include/event.php:54 #: ../../include/event.php:86 ../../Zotlabs/Module/Directory.php:328 msgid "Location:" msgstr "Местоположение:" -#: ../../include/channel.php:1402 ../../include/channel.php:1530 +#: ../../include/channel.php:1451 ../../include/channel.php:1579 msgid "Gender:" msgstr "Пол:" -#: ../../include/channel.php:1403 ../../include/channel.php:1574 +#: ../../include/channel.php:1452 ../../include/channel.php:1623 #: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:305 msgid "Status:" msgstr "Статус:" -#: ../../include/channel.php:1404 ../../include/channel.php:1598 +#: ../../include/channel.php:1453 ../../include/channel.php:1647 msgid "Homepage:" msgstr "Домашняя страница:" -#: ../../include/channel.php:1405 +#: ../../include/channel.php:1454 msgid "Online Now" msgstr "Сейчас в сети" -#: ../../include/channel.php:1458 +#: ../../include/channel.php:1507 msgid "Change your profile photo" msgstr "Изменить фотографию вашего профиля" -#: ../../include/channel.php:1489 +#: ../../include/channel.php:1538 msgid "Trans" msgstr "Трансексуал" -#: ../../include/channel.php:1528 ../../Zotlabs/Module/Settings/Channel.php:499 +#: ../../include/channel.php:1577 ../../Zotlabs/Module/Settings/Channel.php:499 msgid "Full Name:" msgstr "Полное имя:" -#: ../../include/channel.php:1535 +#: ../../include/channel.php:1584 msgid "Like this channel" msgstr "нравится этот канал" -#: ../../include/channel.php:1546 ../../include/conversation.php:1693 -#: ../../include/taxonomy.php:661 ../../Zotlabs/Module/Photos.php:1162 +#: ../../include/channel.php:1595 ../../include/conversation.php:1693 +#: ../../include/taxonomy.php:661 ../../Zotlabs/Module/Photos.php:1175 #: ../../Zotlabs/Lib/ThreadItem.php:218 msgctxt "noun" msgid "Like" @@ -1045,136 +1046,136 @@ msgstr[0] "Нравится" msgstr[1] "Нравится" msgstr[2] "Нравится" -#: ../../include/channel.php:1559 +#: ../../include/channel.php:1608 msgid "j F, Y" msgstr "" -#: ../../include/channel.php:1560 +#: ../../include/channel.php:1609 msgid "j F" msgstr "" -#: ../../include/channel.php:1567 +#: ../../include/channel.php:1616 msgid "Birthday:" msgstr "День рождения:" -#: ../../include/channel.php:1571 ../../Zotlabs/Module/Directory.php:323 +#: ../../include/channel.php:1620 ../../Zotlabs/Module/Directory.php:323 msgid "Age:" msgstr "Возраст:" -#: ../../include/channel.php:1580 +#: ../../include/channel.php:1629 #, php-format msgid "for %1$d %2$s" msgstr "для %1$d %2$s" -#: ../../include/channel.php:1592 +#: ../../include/channel.php:1641 msgid "Tags:" msgstr "Теги:" -#: ../../include/channel.php:1596 +#: ../../include/channel.php:1645 msgid "Sexual Preference:" msgstr "Сексуальные предпочтения:" -#: ../../include/channel.php:1600 ../../Zotlabs/Module/Directory.php:339 +#: ../../include/channel.php:1649 ../../Zotlabs/Module/Directory.php:339 msgid "Hometown:" msgstr "Родной город:" -#: ../../include/channel.php:1602 +#: ../../include/channel.php:1651 msgid "Political Views:" msgstr "Политические взгляды:" -#: ../../include/channel.php:1604 +#: ../../include/channel.php:1653 msgid "Religion:" msgstr "Религия:" -#: ../../include/channel.php:1606 ../../Zotlabs/Module/Directory.php:341 +#: ../../include/channel.php:1655 ../../Zotlabs/Module/Directory.php:341 msgid "About:" msgstr "О себе:" -#: ../../include/channel.php:1608 +#: ../../include/channel.php:1657 msgid "Hobbies/Interests:" msgstr "Хобби / интересы:" -#: ../../include/channel.php:1610 +#: ../../include/channel.php:1659 msgid "Likes:" msgstr "Что вам нравится:" -#: ../../include/channel.php:1612 +#: ../../include/channel.php:1661 msgid "Dislikes:" msgstr "Что вам не нравится:" -#: ../../include/channel.php:1614 +#: ../../include/channel.php:1663 msgid "Contact information and Social Networks:" msgstr "Контактная информация и социальные сети:" -#: ../../include/channel.php:1616 +#: ../../include/channel.php:1665 msgid "My other channels:" msgstr "Мои другие каналы:" -#: ../../include/channel.php:1618 +#: ../../include/channel.php:1667 msgid "Musical interests:" msgstr "Музыкальные интересы:" -#: ../../include/channel.php:1620 +#: ../../include/channel.php:1669 msgid "Books, literature:" msgstr "Книги, литература:" -#: ../../include/channel.php:1622 +#: ../../include/channel.php:1671 msgid "Television:" msgstr "Телевидение:" -#: ../../include/channel.php:1624 +#: ../../include/channel.php:1673 msgid "Film/dance/culture/entertainment:" msgstr "Кино / танцы / культура / развлечения:" -#: ../../include/channel.php:1626 +#: ../../include/channel.php:1675 msgid "Love/Romance:" msgstr "Любовь / романтика:" -#: ../../include/channel.php:1628 +#: ../../include/channel.php:1677 msgid "Work/employment:" msgstr "Работа / занятость:" -#: ../../include/channel.php:1630 +#: ../../include/channel.php:1679 msgid "School/education:" msgstr "Школа / образование:" -#: ../../include/channel.php:1651 ../../Zotlabs/Module/Profperm.php:113 +#: ../../include/channel.php:1700 ../../Zotlabs/Module/Profperm.php:113 #: ../../Zotlabs/Lib/Apps.php:337 msgid "Profile" msgstr "Профиль" -#: ../../include/channel.php:1653 +#: ../../include/channel.php:1702 msgid "Like this thing" msgstr "нравится этo" -#: ../../include/channel.php:1654 ../../Zotlabs/Module/Events.php:692 +#: ../../include/channel.php:1703 ../../Zotlabs/Module/Events.php:692 #: ../../Zotlabs/Module/Cal.php:340 msgid "Export" msgstr "Экспорт" -#: ../../include/channel.php:2088 ../../Zotlabs/Module/Cover_photo.php:276 +#: ../../include/channel.php:2137 ../../Zotlabs/Module/Cover_photo.php:276 msgid "cover photo" msgstr "фотография обложки" -#: ../../include/channel.php:2341 ../../boot.php:1626 +#: ../../include/channel.php:2390 ../../boot.php:1625 #: ../../Zotlabs/Module/Rmagic.php:75 msgid "Remote Authentication" msgstr "Удаленная аутентификация" -#: ../../include/channel.php:2342 ../../Zotlabs/Module/Rmagic.php:76 +#: ../../include/channel.php:2391 ../../Zotlabs/Module/Rmagic.php:76 msgid "Enter your channel address (e.g. channel@example.com)" msgstr "Введите адрес вашего канала (например: channel@example.com)" -#: ../../include/channel.php:2343 ../../Zotlabs/Module/Rmagic.php:77 +#: ../../include/channel.php:2392 ../../Zotlabs/Module/Rmagic.php:77 msgid "Authenticate" msgstr "Проверка подлинности" -#: ../../include/channel.php:2497 ../../Zotlabs/Module/Admin/Accounts.php:91 +#: ../../include/channel.php:2547 ../../Zotlabs/Module/Admin/Accounts.php:91 #, php-format msgid "Account '%s' deleted" msgstr "Аккаунт '%s' удален" -#: ../../include/message.php:13 ../../include/text.php:1709 +#: ../../include/message.php:13 ../../include/text.php:1708 msgid "Download binary/encrypted content" msgstr "Загрузить двоичное / зашифрованное содержимое" @@ -1205,7 +1206,7 @@ msgid "post" msgstr "публикация" #: ../../include/items.php:384 ../../Zotlabs/Module/Dreport.php:10 -#: ../../Zotlabs/Module/Dreport.php:68 ../../Zotlabs/Module/Profperm.php:28 +#: ../../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/Import_items.php:120 @@ -1217,44 +1218,44 @@ msgstr "публикация" msgid "Permission denied" msgstr "Доступ запрещен" -#: ../../include/items.php:911 ../../include/items.php:971 +#: ../../include/items.php:921 ../../include/items.php:981 msgid "(Unknown)" msgstr "(Неизвестный)" -#: ../../include/items.php:1157 +#: ../../include/items.php:1169 msgid "Visible to anybody on the internet." msgstr "Виден всем в интернете." -#: ../../include/items.php:1159 +#: ../../include/items.php:1171 msgid "Visible to you only." msgstr "Видно только вам." -#: ../../include/items.php:1161 +#: ../../include/items.php:1173 msgid "Visible to anybody in this network." msgstr "Видно всем в этой сети." -#: ../../include/items.php:1163 +#: ../../include/items.php:1175 msgid "Visible to anybody authenticated." msgstr "Видно всем аутентифицированным." -#: ../../include/items.php:1165 +#: ../../include/items.php:1177 #, php-format msgid "Visible to anybody on %s." msgstr "Видно всем в %s." -#: ../../include/items.php:1167 +#: ../../include/items.php:1179 msgid "Visible to all connections." msgstr "Видно всем контактам." -#: ../../include/items.php:1169 +#: ../../include/items.php:1181 msgid "Visible to approved connections." msgstr "Видно только одобренным контактам." -#: ../../include/items.php:1171 +#: ../../include/items.php:1183 msgid "Visible to specific connections." msgstr "Видно указанным контактам." -#: ../../include/items.php:3587 ../../Zotlabs/Module/Display.php:45 +#: ../../include/items.php:3613 ../../Zotlabs/Module/Display.php:45 #: ../../Zotlabs/Module/Display.php:452 ../../Zotlabs/Module/Admin.php:62 #: ../../Zotlabs/Module/Filestorage.php:24 ../../Zotlabs/Module/Viewsrc.php:25 #: ../../Zotlabs/Module/Admin/Addons.php:259 @@ -1262,90 +1263,90 @@ msgstr "Видно указанным контактам." msgid "Item not found." msgstr "Элемент не найден." -#: ../../include/items.php:4167 ../../Zotlabs/Module/Group.php:61 +#: ../../include/items.php:4193 ../../Zotlabs/Module/Group.php:61 #: ../../Zotlabs/Module/Group.php:200 msgid "Privacy group not found." msgstr "Группа безопасности не найдена." -#: ../../include/items.php:4183 +#: ../../include/items.php:4209 msgid "Privacy group is empty." msgstr "Группа безопасности пуста" -#: ../../include/items.php:4190 +#: ../../include/items.php:4216 #, php-format msgid "Privacy group: %s" msgstr "Группа безопасности: %s" -#: ../../include/items.php:4200 ../../Zotlabs/Module/Connedit.php:851 +#: ../../include/items.php:4226 ../../Zotlabs/Module/Connedit.php:856 #, php-format msgid "Connection: %s" msgstr "Контакт: %s" -#: ../../include/items.php:4202 +#: ../../include/items.php:4228 msgid "Connection not found." msgstr "Контакт не найден." -#: ../../include/items.php:4544 ../../Zotlabs/Module/Cover_photo.php:269 +#: ../../include/items.php:4570 ../../Zotlabs/Module/Cover_photo.php:269 msgid "female" msgstr "женщина" -#: ../../include/items.php:4545 ../../Zotlabs/Module/Cover_photo.php:270 +#: ../../include/items.php:4571 ../../Zotlabs/Module/Cover_photo.php:270 #, php-format msgid "%1$s updated her %2$s" msgstr "%1$s обновила её %2$s" -#: ../../include/items.php:4546 ../../Zotlabs/Module/Cover_photo.php:271 +#: ../../include/items.php:4572 ../../Zotlabs/Module/Cover_photo.php:271 msgid "male" msgstr "мужчина" -#: ../../include/items.php:4547 ../../Zotlabs/Module/Cover_photo.php:272 +#: ../../include/items.php:4573 ../../Zotlabs/Module/Cover_photo.php:272 #, php-format msgid "%1$s updated his %2$s" msgstr "%1$s обновил его %2$s" -#: ../../include/items.php:4549 ../../Zotlabs/Module/Cover_photo.php:274 +#: ../../include/items.php:4575 ../../Zotlabs/Module/Cover_photo.php:274 #, php-format msgid "%1$s updated their %2$s" msgstr "%1$s обновили их %2$s" -#: ../../include/items.php:4551 +#: ../../include/items.php:4577 msgid "profile photo" msgstr "Фотография профиля" -#: ../../include/items.php:4742 +#: ../../include/items.php:4769 #, php-format msgid "[Edited %s]" msgstr "[Отредактировано %s]" -#: ../../include/items.php:4742 +#: ../../include/items.php:4769 msgctxt "edit_activity" msgid "Post" msgstr "Публикация" -#: ../../include/items.php:4742 +#: ../../include/items.php:4769 msgctxt "edit_activity" msgid "Comment" msgstr "Комментарий" -#: ../../include/activities.php:41 +#: ../../include/activities.php:42 msgid " and " msgstr " и " -#: ../../include/activities.php:49 +#: ../../include/activities.php:50 msgid "public profile" msgstr "общедоступный профиль" -#: ../../include/activities.php:58 +#: ../../include/activities.php:59 #, php-format msgid "%1$s changed %2$s to “%3$s”" msgstr "%1$s изменил %2$s на “%3$s”" -#: ../../include/activities.php:59 +#: ../../include/activities.php:60 #, php-format msgid "Visit %1$s's %2$s" msgstr "Посетить %1$s %2$s" -#: ../../include/activities.php:62 +#: ../../include/activities.php:63 #, php-format msgid "%1$s has an updated %2$s, changing %3$s." msgstr "%1$s обновлено %2$s, изменено %3$s." @@ -1402,7 +1403,7 @@ msgstr "Использовать режим блога / списка" msgid "Comments will be displayed separately" msgstr "Комментарии будут отображаться отдельно" -#: ../../include/features.php:125 ../../include/text.php:981 +#: ../../include/features.php:125 ../../include/text.php:980 #: ../../Zotlabs/Module/Connections.php:334 ../../Zotlabs/Lib/Apps.php:308 msgid "Connections" msgstr "Контакты" @@ -1687,53 +1688,53 @@ msgstr "Несколько профилей" msgid "Ability to create multiple profiles" msgstr "Возможность создания нескольких профилей" -#: ../../include/text.php:498 +#: ../../include/text.php:501 msgid "prev" msgstr "предыдущий" -#: ../../include/text.php:500 +#: ../../include/text.php:503 msgid "first" msgstr "первый" -#: ../../include/text.php:529 +#: ../../include/text.php:532 msgid "last" msgstr "последний" -#: ../../include/text.php:532 +#: ../../include/text.php:535 msgid "next" msgstr "следующий" -#: ../../include/text.php:543 +#: ../../include/text.php:546 msgid "older" msgstr "старше" -#: ../../include/text.php:545 +#: ../../include/text.php:548 msgid "newer" msgstr "новее" -#: ../../include/text.php:969 +#: ../../include/text.php:968 msgid "No connections" msgstr "Нет контактов" -#: ../../include/text.php:1001 +#: ../../include/text.php:1000 #, php-format msgid "View all %s connections" msgstr "Просмотреть все %s контактов" -#: ../../include/text.php:1057 +#: ../../include/text.php:1056 #, php-format msgid "Network: %s" msgstr "Сеть: %s" -#: ../../include/text.php:1068 ../../include/text.php:1080 +#: ../../include/text.php:1067 ../../include/text.php:1079 #: ../../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:150 ../../Zotlabs/Lib/Apps.php:328 +#: ../../Zotlabs/Widget/Activity_filter.php:151 ../../Zotlabs/Lib/Apps.php:328 msgid "Search" msgstr "Поиск" -#: ../../include/text.php:1069 ../../include/text.php:1081 +#: ../../include/text.php:1068 ../../include/text.php:1080 #: ../../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 @@ -1741,409 +1742,409 @@ msgstr "Поиск" msgid "Save" msgstr "Запомнить" -#: ../../include/text.php:1146 ../../include/text.php:1150 +#: ../../include/text.php:1145 ../../include/text.php:1149 msgid "poke" msgstr "Ткнуть" -#: ../../include/text.php:1146 ../../include/text.php:1150 +#: ../../include/text.php:1145 ../../include/text.php:1149 #: ../../include/conversation.php:251 msgid "poked" msgstr "ткнут" -#: ../../include/text.php:1151 +#: ../../include/text.php:1150 msgid "ping" msgstr "Пингануть" -#: ../../include/text.php:1151 +#: ../../include/text.php:1150 msgid "pinged" msgstr "Отпингован" -#: ../../include/text.php:1152 +#: ../../include/text.php:1151 msgid "prod" msgstr "Подтолкнуть" -#: ../../include/text.php:1152 +#: ../../include/text.php:1151 msgid "prodded" msgstr "Подтолкнут" -#: ../../include/text.php:1153 +#: ../../include/text.php:1152 msgid "slap" msgstr "Шлёпнуть" -#: ../../include/text.php:1153 +#: ../../include/text.php:1152 msgid "slapped" msgstr "Шлёпнут" -#: ../../include/text.php:1154 +#: ../../include/text.php:1153 msgid "finger" msgstr "Указать" -#: ../../include/text.php:1154 +#: ../../include/text.php:1153 msgid "fingered" msgstr "Указан" -#: ../../include/text.php:1155 +#: ../../include/text.php:1154 msgid "rebuff" msgstr "Дать отпор" -#: ../../include/text.php:1155 +#: ../../include/text.php:1154 msgid "rebuffed" msgstr "Дан отпор" -#: ../../include/text.php:1178 +#: ../../include/text.php:1177 msgid "happy" msgstr "счастливый" -#: ../../include/text.php:1179 +#: ../../include/text.php:1178 msgid "sad" msgstr "грустный" -#: ../../include/text.php:1180 +#: ../../include/text.php:1179 msgid "mellow" msgstr "спокойный" -#: ../../include/text.php:1181 +#: ../../include/text.php:1180 msgid "tired" msgstr "усталый" -#: ../../include/text.php:1182 +#: ../../include/text.php:1181 msgid "perky" msgstr "весёлый" -#: ../../include/text.php:1183 +#: ../../include/text.php:1182 msgid "angry" msgstr "сердитый" -#: ../../include/text.php:1184 +#: ../../include/text.php:1183 msgid "stupefied" msgstr "отупевший" -#: ../../include/text.php:1185 +#: ../../include/text.php:1184 msgid "puzzled" msgstr "недоумевающий" -#: ../../include/text.php:1186 +#: ../../include/text.php:1185 msgid "interested" msgstr "заинтересованный" -#: ../../include/text.php:1187 +#: ../../include/text.php:1186 msgid "bitter" msgstr "едкий" -#: ../../include/text.php:1188 +#: ../../include/text.php:1187 msgid "cheerful" msgstr "бодрый" -#: ../../include/text.php:1189 +#: ../../include/text.php:1188 msgid "alive" msgstr "энергичный" -#: ../../include/text.php:1190 +#: ../../include/text.php:1189 msgid "annoyed" msgstr "раздражённый" -#: ../../include/text.php:1191 +#: ../../include/text.php:1190 msgid "anxious" msgstr "обеспокоенный" -#: ../../include/text.php:1192 +#: ../../include/text.php:1191 msgid "cranky" msgstr "капризный" -#: ../../include/text.php:1193 +#: ../../include/text.php:1192 msgid "disturbed" msgstr "встревоженный" -#: ../../include/text.php:1194 +#: ../../include/text.php:1193 msgid "frustrated" msgstr "разочарованный" -#: ../../include/text.php:1195 +#: ../../include/text.php:1194 msgid "depressed" msgstr "подавленный" -#: ../../include/text.php:1196 +#: ../../include/text.php:1195 msgid "motivated" msgstr "мотивированный" -#: ../../include/text.php:1197 +#: ../../include/text.php:1196 msgid "relaxed" msgstr "расслабленный" -#: ../../include/text.php:1198 +#: ../../include/text.php:1197 msgid "surprised" msgstr "удивленный" -#: ../../include/text.php:1377 ../../include/js_strings.php:95 +#: ../../include/text.php:1376 ../../include/js_strings.php:95 msgid "Monday" msgstr "Понедельник" -#: ../../include/text.php:1377 ../../include/js_strings.php:96 +#: ../../include/text.php:1376 ../../include/js_strings.php:96 msgid "Tuesday" msgstr "Вторник" -#: ../../include/text.php:1377 ../../include/js_strings.php:97 +#: ../../include/text.php:1376 ../../include/js_strings.php:97 msgid "Wednesday" msgstr "Среда" -#: ../../include/text.php:1377 ../../include/js_strings.php:98 +#: ../../include/text.php:1376 ../../include/js_strings.php:98 msgid "Thursday" msgstr "Четверг" -#: ../../include/text.php:1377 ../../include/js_strings.php:99 +#: ../../include/text.php:1376 ../../include/js_strings.php:99 msgid "Friday" msgstr "Пятница" -#: ../../include/text.php:1377 ../../include/js_strings.php:100 +#: ../../include/text.php:1376 ../../include/js_strings.php:100 msgid "Saturday" msgstr "Суббота" -#: ../../include/text.php:1377 ../../include/js_strings.php:94 +#: ../../include/text.php:1376 ../../include/js_strings.php:94 msgid "Sunday" msgstr "Воскресенье" -#: ../../include/text.php:1381 ../../include/js_strings.php:70 +#: ../../include/text.php:1380 ../../include/js_strings.php:70 msgid "January" msgstr "Январь" -#: ../../include/text.php:1381 ../../include/js_strings.php:71 +#: ../../include/text.php:1380 ../../include/js_strings.php:71 msgid "February" msgstr "Февраль" -#: ../../include/text.php:1381 ../../include/js_strings.php:72 +#: ../../include/text.php:1380 ../../include/js_strings.php:72 msgid "March" msgstr "Март" -#: ../../include/text.php:1381 ../../include/js_strings.php:73 +#: ../../include/text.php:1380 ../../include/js_strings.php:73 msgid "April" msgstr "Апрель" -#: ../../include/text.php:1381 +#: ../../include/text.php:1380 msgid "May" msgstr "Май" -#: ../../include/text.php:1381 ../../include/js_strings.php:75 +#: ../../include/text.php:1380 ../../include/js_strings.php:75 msgid "June" msgstr "Июнь" -#: ../../include/text.php:1381 ../../include/js_strings.php:76 +#: ../../include/text.php:1380 ../../include/js_strings.php:76 msgid "July" msgstr "Июль" -#: ../../include/text.php:1381 ../../include/js_strings.php:77 +#: ../../include/text.php:1380 ../../include/js_strings.php:77 msgid "August" msgstr "Август" -#: ../../include/text.php:1381 ../../include/js_strings.php:78 +#: ../../include/text.php:1380 ../../include/js_strings.php:78 msgid "September" msgstr "Сентябрь" -#: ../../include/text.php:1381 ../../include/js_strings.php:79 +#: ../../include/text.php:1380 ../../include/js_strings.php:79 msgid "October" msgstr "Октябрь" -#: ../../include/text.php:1381 ../../include/js_strings.php:80 +#: ../../include/text.php:1380 ../../include/js_strings.php:80 msgid "November" msgstr "Ноябрь" -#: ../../include/text.php:1381 ../../include/js_strings.php:81 +#: ../../include/text.php:1380 ../../include/js_strings.php:81 msgid "December" msgstr "Декабрь" -#: ../../include/text.php:1455 +#: ../../include/text.php:1454 msgid "Unknown Attachment" msgstr "Неизвестное вложение" -#: ../../include/text.php:1457 ../../Zotlabs/Storage/Browser.php:287 +#: ../../include/text.php:1456 ../../Zotlabs/Storage/Browser.php:287 #: ../../Zotlabs/Module/Sharedwithme.php:106 msgid "Size" msgstr "Размер" -#: ../../include/text.php:1457 ../../include/feedutils.php:860 +#: ../../include/text.php:1456 ../../include/feedutils.php:860 msgid "unknown" msgstr "неизвестный" -#: ../../include/text.php:1493 +#: ../../include/text.php:1492 msgid "remove category" msgstr "удалить категорию" -#: ../../include/text.php:1567 +#: ../../include/text.php:1566 msgid "remove from file" msgstr "удалить из файла" -#: ../../include/text.php:1850 ../../Zotlabs/Module/Events.php:663 +#: ../../include/text.php:1849 ../../Zotlabs/Module/Events.php:663 #: ../../Zotlabs/Module/Cal.php:314 msgid "Link to Source" msgstr "Ссылка на источник" -#: ../../include/text.php:1872 ../../include/language.php:423 +#: ../../include/text.php:1871 ../../include/language.php:423 msgid "default" msgstr "по умолчанию" -#: ../../include/text.php:1880 +#: ../../include/text.php:1879 msgid "Page layout" msgstr "Шаблон страницы" -#: ../../include/text.php:1880 +#: ../../include/text.php:1879 msgid "You can create your own with the layouts tool" msgstr "Вы можете создать свой собственный с помощью инструмента шаблонов" -#: ../../include/text.php:1890 ../../Zotlabs/Module/Wiki.php:217 +#: ../../include/text.php:1889 ../../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:1891 +#: ../../include/text.php:1890 msgid "HTML" msgstr "" -#: ../../include/text.php:1892 ../../Zotlabs/Module/Wiki.php:217 +#: ../../include/text.php:1891 ../../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:1893 ../../Zotlabs/Module/Wiki.php:217 +#: ../../include/text.php:1892 ../../Zotlabs/Module/Wiki.php:217 #: ../../Zotlabs/Widget/Wiki_pages.php:38 #: ../../Zotlabs/Widget/Wiki_pages.php:95 msgid "Text" msgstr "Текст" -#: ../../include/text.php:1894 +#: ../../include/text.php:1893 msgid "Comanche Layout" msgstr "Шаблон Comanche" -#: ../../include/text.php:1899 +#: ../../include/text.php:1898 msgid "PHP" msgstr "" -#: ../../include/text.php:1908 +#: ../../include/text.php:1907 msgid "Page content type" msgstr "Тип содержимого страницы" -#: ../../include/text.php:2028 ../../include/conversation.php:116 -#: ../../Zotlabs/Module/Tagger.php:69 ../../Zotlabs/Module/Like.php:384 -#: ../../Zotlabs/Module/Subthread.php:111 ../../Zotlabs/Lib/Activity.php:1570 +#: ../../include/text.php:2027 ../../include/conversation.php:116 +#: ../../Zotlabs/Module/Tagger.php:69 ../../Zotlabs/Module/Like.php:387 +#: ../../Zotlabs/Module/Subthread.php:112 ../../Zotlabs/Lib/Activity.php:1570 #: ../../extend/addon/hzaddons/redphotos/redphotohelper.php:71 -#: ../../extend/addon/hzaddons/pubcrawl/as.php:1512 -#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1539 +#: ../../extend/addon/hzaddons/pubcrawl/as.php:1494 +#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1541 msgid "photo" msgstr "фото" -#: ../../include/text.php:2031 ../../include/conversation.php:119 -#: ../../include/event.php:1153 ../../Zotlabs/Module/Tagger.php:73 -#: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Like.php:386 +#: ../../include/text.php:2030 ../../include/conversation.php:119 +#: ../../include/event.php:1156 ../../Zotlabs/Module/Tagger.php:73 +#: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Like.php:389 msgid "event" msgstr "событие" -#: ../../include/text.php:2034 ../../include/conversation.php:144 -#: ../../Zotlabs/Module/Like.php:384 ../../Zotlabs/Module/Subthread.php:111 +#: ../../include/text.php:2033 ../../include/conversation.php:144 +#: ../../Zotlabs/Module/Like.php:387 ../../Zotlabs/Module/Subthread.php:112 #: ../../Zotlabs/Lib/Activity.php:1570 -#: ../../extend/addon/hzaddons/pubcrawl/as.php:1512 -#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1539 +#: ../../extend/addon/hzaddons/pubcrawl/as.php:1494 +#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1541 msgid "status" msgstr "статус" -#: ../../include/text.php:2036 ../../include/conversation.php:146 +#: ../../include/text.php:2035 ../../include/conversation.php:146 #: ../../Zotlabs/Module/Tagger.php:79 msgid "comment" msgstr "комментарий" -#: ../../include/text.php:2041 +#: ../../include/text.php:2040 msgid "activity" msgstr "активность" -#: ../../include/text.php:2142 +#: ../../include/text.php:2141 msgid "a-z, 0-9, -, and _ only" msgstr "Только a-z, 0-9, -, и _" -#: ../../include/text.php:2462 +#: ../../include/text.php:2461 msgid "Design Tools" msgstr "Инструменты дизайна" -#: ../../include/text.php:2465 ../../Zotlabs/Module/Blocks.php:154 +#: ../../include/text.php:2464 ../../Zotlabs/Module/Blocks.php:154 msgid "Blocks" msgstr "Блокировки" -#: ../../include/text.php:2466 ../../Zotlabs/Module/Menu.php:170 +#: ../../include/text.php:2465 ../../Zotlabs/Module/Menu.php:170 msgid "Menus" msgstr "Меню" -#: ../../include/text.php:2467 ../../Zotlabs/Module/Layouts.php:184 +#: ../../include/text.php:2466 ../../Zotlabs/Module/Layouts.php:184 msgid "Layouts" msgstr "Шаблоны" -#: ../../include/text.php:2468 +#: ../../include/text.php:2467 msgid "Pages" msgstr "Страницы" -#: ../../include/text.php:2489 ../../Zotlabs/Module/Cal.php:343 +#: ../../include/text.php:2488 ../../Zotlabs/Module/Cal.php:343 msgid "Import" msgstr "Импортировать" -#: ../../include/text.php:2490 +#: ../../include/text.php:2489 msgid "Import website..." msgstr "Импорт веб-сайта..." -#: ../../include/text.php:2491 +#: ../../include/text.php:2490 msgid "Select folder to import" msgstr "Выбрать каталог для импорта" -#: ../../include/text.php:2492 +#: ../../include/text.php:2491 msgid "Import from a zipped folder:" msgstr "Импортировать из каталога в zip-архиве:" -#: ../../include/text.php:2493 +#: ../../include/text.php:2492 msgid "Import from cloud files:" msgstr "Импортировать из сетевых файлов:" -#: ../../include/text.php:2494 +#: ../../include/text.php:2493 msgid "/cloud/channel/path/to/folder" msgstr "" -#: ../../include/text.php:2495 +#: ../../include/text.php:2494 msgid "Enter path to website files" msgstr "Введите путь к файлам веб-сайта" -#: ../../include/text.php:2496 +#: ../../include/text.php:2495 msgid "Select folder" msgstr "Выбрать каталог" -#: ../../include/text.php:2497 +#: ../../include/text.php:2496 msgid "Export website..." msgstr "Экспорт веб-сайта..." -#: ../../include/text.php:2498 +#: ../../include/text.php:2497 msgid "Export to a zip file" msgstr "Экспортировать в ZIP файл." -#: ../../include/text.php:2499 +#: ../../include/text.php:2498 msgid "website.zip" msgstr "" -#: ../../include/text.php:2500 +#: ../../include/text.php:2499 msgid "Enter a name for the zip file." msgstr "Введите имя для ZIP файла." -#: ../../include/text.php:2501 +#: ../../include/text.php:2500 msgid "Export to cloud files" msgstr "Эскпортировать в сетевые файлы:" -#: ../../include/text.php:2502 +#: ../../include/text.php:2501 msgid "/path/to/export/folder" msgstr "" -#: ../../include/text.php:2503 +#: ../../include/text.php:2502 msgid "Enter a path to a cloud files destination." msgstr "Введите путь к расположению сетевых файлов." -#: ../../include/text.php:2504 +#: ../../include/text.php:2503 msgid "Specify folder" msgstr "Указать каталог" -#: ../../include/text.php:2824 ../../Zotlabs/Storage/Browser.php:131 +#: ../../include/text.php:2823 ../../Zotlabs/Storage/Browser.php:131 msgid "Collection" msgstr "Коллекция" @@ -2161,7 +2162,7 @@ msgstr "Не удалось создать дублирующийся идент msgid "Unable to create a unique channel address. Import failed." msgstr "Не удалось создать уникальный адрес канала. Импорт не завершен." -#: ../../include/import.php:117 +#: ../../include/import.php:116 msgid "Cloned channel not found. Import failed." msgstr "Клон канала не найден. Импорт невозможен." @@ -2182,7 +2183,7 @@ msgstr "редактировать" #: ../../include/group.php:320 ../../include/nav.php:95 #: ../../Zotlabs/Module/Group.php:132 ../../Zotlabs/Module/Group.php:143 -#: ../../Zotlabs/Widget/Activity_filter.php:70 ../../Zotlabs/Lib/Group.php:324 +#: ../../Zotlabs/Widget/Activity_filter.php:41 ../../Zotlabs/Lib/Group.php:324 #: ../../Zotlabs/Lib/Apps.php:339 msgid "Privacy Groups" msgstr "Группы безопасности" @@ -2272,20 +2273,20 @@ msgstr "Это действие превышает ограничения, ус msgid "This action is not available under your subscription plan." msgstr "Это действие невозможно из-за ограничений в вашем плане." -#: ../../include/zot.php:773 +#: ../../include/zot.php:775 msgid "Invalid data packet" msgstr "Неверный пакет данных" -#: ../../include/zot.php:800 ../../Zotlabs/Lib/Libzot.php:663 +#: ../../include/zot.php:802 ../../Zotlabs/Lib/Libzot.php:667 msgid "Unable to verify channel signature" msgstr "Невозможно проверить подпись канала" -#: ../../include/zot.php:2571 ../../Zotlabs/Lib/Libsync.php:733 +#: ../../include/zot.php:2575 ../../Zotlabs/Lib/Libsync.php:733 #, php-format msgid "Unable to verify site signature for %s" msgstr "Невозможно проверить подпись сайта %s" -#: ../../include/zot.php:4235 +#: ../../include/zot.php:4272 msgid "invalid target signature" msgstr "недопустимая целевая подпись" @@ -2346,11 +2347,6 @@ msgstr "Не найдено" msgid "Page not found." msgstr "Страница не найдена." -#: ../../include/dba/dba_driver.php:178 -#, php-format -msgid "Cannot locate DNS info for database server '%s'" -msgstr "Не удается найти DNS информацию для сервера базы данных '%s'" - #: ../../include/bbcode.php:200 ../../include/bbcode.php:1201 #: ../../include/bbcode.php:1204 ../../include/bbcode.php:1209 #: ../../include/bbcode.php:1212 ../../include/bbcode.php:1215 @@ -2430,17 +2426,17 @@ msgstr "$1 писал:" msgid "channel" msgstr "канал" -#: ../../include/conversation.php:160 ../../Zotlabs/Module/Like.php:438 +#: ../../include/conversation.php:160 ../../Zotlabs/Module/Like.php:441 #: ../../Zotlabs/Lib/Activity.php:1605 -#: ../../extend/addon/hzaddons/pubcrawl/as.php:1547 -#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1568 +#: ../../extend/addon/hzaddons/pubcrawl/as.php:1529 +#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1570 #, 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:440 +#: ../../include/conversation.php:163 ../../Zotlabs/Module/Like.php:443 #: ../../Zotlabs/Lib/Activity.php:1607 -#: ../../extend/addon/hzaddons/pubcrawl/as.php:1549 +#: ../../extend/addon/hzaddons/pubcrawl/as.php:1531 #, php-format msgid "%1$s doesn't like %2$s's %3$s" msgstr "%1$s не нравится %2$s %3$s" @@ -2465,52 +2461,52 @@ msgstr "%1$s теперь в контакте с %2$s" msgid "%1$s poked %2$s" msgstr "%1$s ткнул %2$s" -#: ../../include/conversation.php:268 ../../Zotlabs/Module/Mood.php:75 +#: ../../include/conversation.php:268 ../../Zotlabs/Module/Mood.php:76 #, php-format msgctxt "mood" msgid "%1$s is %2$s" msgstr "%1$s в %2$s" -#: ../../include/conversation.php:483 ../../Zotlabs/Lib/ThreadItem.php:440 +#: ../../include/conversation.php:483 ../../Zotlabs/Lib/ThreadItem.php:443 msgid "This is an unsaved preview" msgstr "Это несохранённый просмотр" -#: ../../include/conversation.php:619 ../../Zotlabs/Module/Photos.php:1139 +#: ../../include/conversation.php:619 ../../Zotlabs/Module/Photos.php:1152 msgctxt "title" msgid "Likes" msgstr "Нравится" -#: ../../include/conversation.php:619 ../../Zotlabs/Module/Photos.php:1139 +#: ../../include/conversation.php:619 ../../Zotlabs/Module/Photos.php:1152 msgctxt "title" msgid "Dislikes" msgstr "Не нравится" -#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1140 +#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1153 msgctxt "title" msgid "Agree" msgstr "Согласен" -#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1140 +#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1153 msgctxt "title" msgid "Disagree" msgstr "Не согласен" -#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1140 +#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1153 msgctxt "title" msgid "Abstain" msgstr "Воздержался" -#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1141 +#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1154 msgctxt "title" msgid "Attending" msgstr "Посещаю" -#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1141 +#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1154 msgctxt "title" msgid "Not attending" msgstr "Не посещаю" -#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1141 +#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1154 msgctxt "title" msgid "Might attend" msgstr "Возможно посещу" @@ -2522,15 +2518,15 @@ 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:1205 ../../Zotlabs/Module/Oauth.php:174 +#: ../../Zotlabs/Module/Photos.php:1218 ../../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:655 -#: ../../Zotlabs/Module/Connedit.php:924 +#: ../../Zotlabs/Module/Webpages.php:257 ../../Zotlabs/Module/Connedit.php:660 +#: ../../Zotlabs/Module/Connedit.php:929 #: ../../Zotlabs/Module/Connections.php:292 #: ../../Zotlabs/Module/Card_edit.php:129 #: ../../Zotlabs/Module/Article_edit.php:129 @@ -2574,17 +2570,17 @@ msgstr "Категории:" msgid "Filed under:" msgstr "Хранить под:" -#: ../../include/conversation.php:766 ../../Zotlabs/Lib/ThreadItem.php:375 +#: ../../include/conversation.php:766 ../../Zotlabs/Lib/ThreadItem.php:378 #, php-format msgid "from %s" msgstr "от %s" -#: ../../include/conversation.php:769 ../../Zotlabs/Lib/ThreadItem.php:378 +#: ../../include/conversation.php:769 ../../Zotlabs/Lib/ThreadItem.php:381 #, php-format msgid "last edited: %s" msgstr "последнее редактирование: %s" -#: ../../include/conversation.php:770 ../../Zotlabs/Lib/ThreadItem.php:379 +#: ../../include/conversation.php:770 ../../Zotlabs/Lib/ThreadItem.php:382 #, php-format msgid "Expires: %s" msgstr "Срок действия: %s" @@ -2593,8 +2589,8 @@ msgstr "Срок действия: %s" msgid "View in context" msgstr "Показать в контексте" -#: ../../include/conversation.php:787 ../../Zotlabs/Module/Photos.php:1105 -#: ../../Zotlabs/Lib/ThreadItem.php:441 +#: ../../include/conversation.php:787 ../../Zotlabs/Module/Photos.php:1118 +#: ../../Zotlabs/Lib/ThreadItem.php:444 msgid "Please wait" msgstr "Подождите пожалуйста" @@ -2627,12 +2623,12 @@ msgid "Unfollow Thread" msgstr "Прекратить отслеживать тему" #: ../../include/conversation.php:1038 ../../include/nav.php:106 -#: ../../Zotlabs/Module/Connedit.php:595 ../../Zotlabs/Lib/Apps.php:319 +#: ../../Zotlabs/Module/Connedit.php:600 ../../Zotlabs/Lib/Apps.php:319 #: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:57 msgid "View Profile" msgstr "Просмотреть профиль" -#: ../../include/conversation.php:1048 ../../Zotlabs/Module/Connedit.php:616 +#: ../../include/conversation.php:1048 ../../Zotlabs/Module/Connedit.php:621 msgid "Recent Activity" msgstr "Последние действия" @@ -2656,13 +2652,13 @@ 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:819 -#: ../../Zotlabs/Module/Photos.php:1275 +#: ../../Zotlabs/Module/Cdav.php:819 ../../Zotlabs/Module/Photos.php:832 +#: ../../Zotlabs/Module/Photos.php:1288 #: ../../Zotlabs/Module/Embedphotos.php:146 #: ../../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 -#: ../../extend/addon/hzaddons/pubcrawl/as.php:964 +#: ../../extend/addon/hzaddons/pubcrawl/as.php:949 msgid "Unknown" msgstr "Неизвестный" @@ -2800,14 +2796,14 @@ msgstr "Комментарии включены" msgid "Comments disabled" msgstr "Комментарии отключены" -#: ../../include/conversation.php:1356 ../../Zotlabs/Module/Photos.php:1125 +#: ../../include/conversation.php:1356 ../../Zotlabs/Module/Photos.php:1138 #: ../../Zotlabs/Module/Events.php:480 ../../Zotlabs/Module/Webpages.php:262 -#: ../../Zotlabs/Lib/ThreadItem.php:777 +#: ../../Zotlabs/Lib/ThreadItem.php:780 #: ../../extend/addon/hzaddons/hsse/hsse.php:153 msgid "Preview" msgstr "Предварительный просмотр" -#: ../../include/conversation.php:1389 ../../Zotlabs/Module/Photos.php:1104 +#: ../../include/conversation.php:1389 ../../Zotlabs/Module/Photos.php:1117 #: ../../Zotlabs/Module/Webpages.php:256 ../../Zotlabs/Module/Blocks.php:161 #: ../../Zotlabs/Module/Wiki.php:301 ../../Zotlabs/Module/Layouts.php:194 #: ../../Zotlabs/Widget/Cdav.php:124 @@ -2825,32 +2821,32 @@ msgstr "Название ссылки на страницу " msgid "Post as" msgstr "Опубликовать как" -#: ../../include/conversation.php:1403 ../../Zotlabs/Lib/ThreadItem.php:768 +#: ../../include/conversation.php:1403 ../../Zotlabs/Lib/ThreadItem.php:771 #: ../../extend/addon/hzaddons/hsse/hsse.php:200 msgid "Bold" msgstr "Жирный" -#: ../../include/conversation.php:1404 ../../Zotlabs/Lib/ThreadItem.php:769 +#: ../../include/conversation.php:1404 ../../Zotlabs/Lib/ThreadItem.php:772 #: ../../extend/addon/hzaddons/hsse/hsse.php:201 msgid "Italic" msgstr "Курсив" -#: ../../include/conversation.php:1405 ../../Zotlabs/Lib/ThreadItem.php:770 +#: ../../include/conversation.php:1405 ../../Zotlabs/Lib/ThreadItem.php:773 #: ../../extend/addon/hzaddons/hsse/hsse.php:202 msgid "Underline" msgstr "Подчеркнутый" -#: ../../include/conversation.php:1406 ../../Zotlabs/Lib/ThreadItem.php:771 +#: ../../include/conversation.php:1406 ../../Zotlabs/Lib/ThreadItem.php:774 #: ../../extend/addon/hzaddons/hsse/hsse.php:203 msgid "Quote" msgstr "Цитата" -#: ../../include/conversation.php:1407 ../../Zotlabs/Lib/ThreadItem.php:772 +#: ../../include/conversation.php:1407 ../../Zotlabs/Lib/ThreadItem.php:775 #: ../../extend/addon/hzaddons/hsse/hsse.php:204 msgid "Code" msgstr "Код" -#: ../../include/conversation.php:1408 ../../Zotlabs/Lib/ThreadItem.php:774 +#: ../../include/conversation.php:1408 ../../Zotlabs/Lib/ThreadItem.php:777 #: ../../extend/addon/hzaddons/hsse/hsse.php:205 msgid "Attach/Upload file" msgstr "Прикрепить/загрузить файл" @@ -2872,7 +2868,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:925 +#: ../../Zotlabs/Module/Editpost.php:109 ../../Zotlabs/Module/Connedit.php:930 #: ../../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 @@ -2904,8 +2900,8 @@ msgstr "Отключить комментарии" msgid "Toggle comments" msgstr "Переключить комментарии" -#: ../../include/conversation.php:1424 ../../Zotlabs/Module/Photos.php:700 -#: ../../Zotlabs/Module/Photos.php:1070 ../../Zotlabs/Module/Editblock.php:129 +#: ../../include/conversation.php:1424 ../../Zotlabs/Module/Photos.php:713 +#: ../../Zotlabs/Module/Photos.php:1083 ../../Zotlabs/Module/Editblock.php:129 #: ../../Zotlabs/Module/Card_edit.php:117 #: ../../Zotlabs/Module/Article_edit.php:117 #: ../../extend/addon/hzaddons/hsse/hsse.php:221 @@ -2940,12 +2936,12 @@ msgstr "Установить дату публикации" #: ../../include/conversation.php:1458 ../../Zotlabs/Module/Mail.php:294 #: ../../Zotlabs/Module/Mail.php:436 ../../Zotlabs/Module/Chat.php:221 -#: ../../Zotlabs/Lib/ThreadItem.php:781 +#: ../../Zotlabs/Lib/ThreadItem.php:784 #: ../../extend/addon/hzaddons/hsse/hsse.php:255 msgid "Encrypt text" msgstr "Зашифровать текст" -#: ../../include/conversation.php:1696 ../../Zotlabs/Module/Photos.php:1167 +#: ../../include/conversation.php:1696 ../../Zotlabs/Module/Photos.php:1180 #: ../../Zotlabs/Lib/ThreadItem.php:223 msgctxt "noun" msgid "Dislike" @@ -3053,12 +3049,12 @@ msgstr "Выбор дополнительного языка" msgid "Delete this item?" msgstr "Удалить этот элемент?" -#: ../../include/js_strings.php:6 ../../Zotlabs/Module/Photos.php:1123 -#: ../../Zotlabs/Module/Photos.php:1241 ../../Zotlabs/Lib/ThreadItem.php:766 +#: ../../include/js_strings.php:6 ../../Zotlabs/Module/Photos.php:1136 +#: ../../Zotlabs/Module/Photos.php:1254 ../../Zotlabs/Lib/ThreadItem.php:769 msgid "Comment" msgstr "Комментарий" -#: ../../include/js_strings.php:7 ../../Zotlabs/Lib/ThreadItem.php:473 +#: ../../include/js_strings.php:7 ../../Zotlabs/Lib/ThreadItem.php:476 #, php-format msgid "%s show all" msgstr "%s показать всё" @@ -3115,7 +3111,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:871 +#: ../../Zotlabs/Module/Connedit.php:876 msgid "Rating" msgstr "Оценка" @@ -3413,9 +3409,9 @@ msgstr "" #: ../../include/network.php:1778 ../../Zotlabs/Lib/Activity.php:1417 #: ../../Zotlabs/Lib/Activity.php:1614 -#: ../../extend/addon/hzaddons/pubcrawl/as.php:1222 -#: ../../extend/addon/hzaddons/pubcrawl/as.php:1377 -#: ../../extend/addon/hzaddons/pubcrawl/as.php:1556 +#: ../../extend/addon/hzaddons/pubcrawl/as.php:1204 +#: ../../extend/addon/hzaddons/pubcrawl/as.php:1359 +#: ../../extend/addon/hzaddons/pubcrawl/as.php:1538 msgid "ActivityPub" msgstr "" @@ -3423,7 +3419,7 @@ msgstr "" #: ../../Zotlabs/Module/Profiles.php:787 #: ../../Zotlabs/Module/Admin/Accounts.php:171 #: ../../Zotlabs/Module/Admin/Accounts.php:183 -#: ../../Zotlabs/Module/Connedit.php:911 +#: ../../Zotlabs/Module/Connedit.php:916 #: ../../extend/addon/hzaddons/rtof/rtof.php:93 #: ../../extend/addon/hzaddons/openid/MysqlProvider.php:56 #: ../../extend/addon/hzaddons/openid/MysqlProvider.php:57 @@ -3479,7 +3475,7 @@ msgstr "YYYY-MM-DD или MM-DD" msgid "Required" msgstr "Требуется" -#: ../../include/datetime.php:238 ../../boot.php:2558 +#: ../../include/datetime.php:238 ../../boot.php:2557 msgid "never" msgstr "никогда" @@ -3564,7 +3560,7 @@ msgstr "С Днем рождения %1$s !" msgid "Visible to your default audience" msgstr "Видно вашей аудитории по умолчанию." -#: ../../include/acl_selectors.php:88 ../../Zotlabs/Module/Acl.php:120 +#: ../../include/acl_selectors.php:88 ../../Zotlabs/Module/Acl.php:121 #: ../../Zotlabs/Module/Lockview.php:117 ../../Zotlabs/Module/Lockview.php:153 msgctxt "acl" msgid "Profile" @@ -3597,15 +3593,15 @@ msgstr "Показать" msgid "Don't show" msgstr "Не показывать" -#: ../../include/acl_selectors.php:123 ../../Zotlabs/Module/Photos.php:704 -#: ../../Zotlabs/Module/Photos.php:1073 ../../Zotlabs/Module/Chat.php:243 +#: ../../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:677 +#: ../../Zotlabs/Module/Thing.php:372 ../../Zotlabs/Module/Connedit.php:682 msgid "Permissions" msgstr "Разрешения" -#: ../../include/acl_selectors.php:125 ../../Zotlabs/Module/Photos.php:1295 -#: ../../Zotlabs/Lib/ThreadItem.php:435 +#: ../../include/acl_selectors.php:125 ../../Zotlabs/Module/Photos.php:1308 +#: ../../Zotlabs/Lib/ThreadItem.php:438 msgid "Close" msgstr "Закрыть" @@ -3629,37 +3625,37 @@ msgstr "Новое окно" msgid "Open the selected location in a different window or browser tab" msgstr "Открыть выбранное местоположение в другом окне или вкладке браузера" -#: ../../include/connections.php:696 ../../include/event.php:1308 +#: ../../include/connections.php:696 ../../include/event.php:1311 #: ../../Zotlabs/Module/Cdav.php:1224 ../../Zotlabs/Module/Profiles.php:792 -#: ../../Zotlabs/Module/Connedit.php:916 +#: ../../Zotlabs/Module/Connedit.php:921 msgid "Mobile" msgstr "Мобильный" -#: ../../include/connections.php:697 ../../include/event.php:1309 +#: ../../include/connections.php:697 ../../include/event.php:1312 #: ../../Zotlabs/Module/Cdav.php:1225 ../../Zotlabs/Module/Profiles.php:793 -#: ../../Zotlabs/Module/Connedit.php:917 +#: ../../Zotlabs/Module/Connedit.php:922 msgid "Home" msgstr "Домашний" -#: ../../include/connections.php:698 ../../include/event.php:1310 +#: ../../include/connections.php:698 ../../include/event.php:1313 msgid "Home, Voice" msgstr "Дом, голос" -#: ../../include/connections.php:699 ../../include/event.php:1311 +#: ../../include/connections.php:699 ../../include/event.php:1314 msgid "Home, Fax" msgstr "Дом, факс" -#: ../../include/connections.php:700 ../../include/event.php:1312 +#: ../../include/connections.php:700 ../../include/event.php:1315 #: ../../Zotlabs/Module/Cdav.php:1226 ../../Zotlabs/Module/Profiles.php:794 -#: ../../Zotlabs/Module/Connedit.php:918 +#: ../../Zotlabs/Module/Connedit.php:923 msgid "Work" msgstr "Рабочий" -#: ../../include/connections.php:701 ../../include/event.php:1313 +#: ../../include/connections.php:701 ../../include/event.php:1316 msgid "Work, Voice" msgstr "Работа, голос" -#: ../../include/connections.php:702 ../../include/event.php:1314 +#: ../../include/connections.php:702 ../../include/event.php:1317 msgid "Work, Fax" msgstr "Работа, факс" @@ -3679,23 +3675,23 @@ msgstr "Окончание:" msgid "This event has been added to your calendar." msgstr "Это событие было добавлено в ваш календарь." -#: ../../include/event.php:1227 +#: ../../include/event.php:1230 msgid "Not specified" msgstr "Не указано" -#: ../../include/event.php:1228 +#: ../../include/event.php:1231 msgid "Needs Action" msgstr "Требует действия" -#: ../../include/event.php:1229 +#: ../../include/event.php:1232 msgid "Completed" msgstr "Завершено" -#: ../../include/event.php:1230 +#: ../../include/event.php:1233 msgid "In Process" msgstr "В процессе" -#: ../../include/event.php:1231 +#: ../../include/event.php:1234 msgid "Cancelled" msgstr "Отменено" @@ -3753,7 +3749,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:1623 msgid "Logout" msgstr "Выход" @@ -3773,7 +3769,7 @@ msgstr "Управление / редактирование профилей" msgid "Edit your profile" msgstr "Редактировать профиль" -#: ../../include/nav.php:118 ../../include/nav.php:122 ../../boot.php:1625 +#: ../../include/nav.php:118 ../../include/nav.php:122 ../../boot.php:1624 #: ../../Zotlabs/Lib/Apps.php:311 msgid "Login" msgstr "Войти" @@ -3790,7 +3786,7 @@ msgstr "Домой" msgid "Log me out of this site" msgstr "Выйти с этого сайта" -#: ../../include/nav.php:156 ../../boot.php:1605 +#: ../../include/nav.php:156 ../../boot.php:1604 #: ../../Zotlabs/Module/Register.php:289 msgid "Register" msgstr "Регистрация" @@ -3818,7 +3814,7 @@ msgstr "Установка и конфигурация сайта" #: ../../include/nav.php:293 ../../Zotlabs/Module/Defperms.php:256 #: ../../Zotlabs/Module/New_channel.php:157 #: ../../Zotlabs/Module/New_channel.php:164 -#: ../../Zotlabs/Module/Connedit.php:853 +#: ../../Zotlabs/Module/Connedit.php:858 #: ../../Zotlabs/Widget/Notifications.php:162 msgid "Loading" msgstr "Загрузка" @@ -3914,7 +3910,7 @@ msgid "View Webpages" msgstr "Просмотр веб-страниц" #: ../../include/nav.php:506 ../../Zotlabs/Module/Wiki.php:206 -#: ../../Zotlabs/Widget/Wiki_list.php:19 +#: ../../Zotlabs/Widget/Wiki_list.php:15 msgid "Wikis" msgstr "" @@ -3993,51 +3989,51 @@ msgstr "ошибка при записи базы данных." msgid "Empty path" msgstr "Пустое имя пути" -#: ../../include/photo/photo_driver.php:741 +#: ../../include/photo/photo_driver.php:774 #: ../../Zotlabs/Module/Profile_photo.php:120 #: ../../Zotlabs/Module/Profile_photo.php:248 msgid "Profile Photos" msgstr "Фотографии профиля" -#: ../../boot.php:1604 +#: ../../boot.php:1603 msgid "Create an account to access services and applications" msgstr "Создайте аккаунт для доступа к службам и приложениям" -#: ../../boot.php:1628 +#: ../../boot.php:1627 msgid "Login/Email" msgstr "Пользователь / email" -#: ../../boot.php:1629 +#: ../../boot.php:1628 msgid "Password" msgstr "Пароль" -#: ../../boot.php:1630 +#: ../../boot.php:1629 msgid "Remember me" msgstr "Запомнить меня" -#: ../../boot.php:1633 +#: ../../boot.php:1632 msgid "Forgot your password?" msgstr "Забыли пароль или логин?" -#: ../../boot.php:1634 ../../Zotlabs/Module/Lostpass.php:91 +#: ../../boot.php:1633 ../../Zotlabs/Module/Lostpass.php:91 msgid "Password Reset" msgstr "Сбросить пароль" -#: ../../boot.php:2431 +#: ../../boot.php:2430 #, php-format msgid "[$Projectname] Website SSL error for %s" msgstr "[$Projectname] Ошибка SSL/TLS веб-сайта для %s" -#: ../../boot.php:2436 +#: ../../boot.php:2435 msgid "Website SSL certificate is not valid. Please correct." msgstr "SSL/TLS сертификат веб-сайт недействителен. Исправьте это." -#: ../../boot.php:2552 +#: ../../boot.php:2551 #, php-format msgid "[$Projectname] Cron tasks not running on %s" msgstr "[$Projectname] Задания Cron не запущены на %s" -#: ../../boot.php:2557 +#: ../../boot.php:2556 msgid "Cron/Scheduled tasks not running." msgstr "Задания Cron / планировщика не запущены." @@ -4072,7 +4068,7 @@ 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:922 +#: ../../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/Widget/Cdav.php:128 ../../Zotlabs/Widget/Cdav.php:165 @@ -4092,7 +4088,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:907 ../../Zotlabs/Module/Group.php:144 +#: ../../Zotlabs/Module/Connedit.php:912 ../../Zotlabs/Module/Group.php:144 #: ../../Zotlabs/Module/Wiki.php:218 #: ../../Zotlabs/Widget/Wiki_page_history.php:22 #: ../../Zotlabs/Lib/NativeWikiPage.php:561 @@ -4131,7 +4127,7 @@ msgstr "Создать новую папку" msgid "Upload file" msgstr "Загрузить файл" -#: ../../Zotlabs/Storage/Browser.php:392 ../../Zotlabs/Module/Photos.php:714 +#: ../../Zotlabs/Storage/Browser.php:392 ../../Zotlabs/Module/Photos.php:727 #: ../../Zotlabs/Module/Cover_photo.php:395 #: ../../Zotlabs/Module/Embedphotos.php:158 #: ../../Zotlabs/Module/Profile_photo.php:459 @@ -4280,7 +4276,7 @@ msgid "" "to correctly use this feature." msgstr "Предупреждение. Изменение некоторых настроек может привести к неработоспособности вашего канала. Пожалуйста, покиньте эту страницу, если вы точно не значете, как правильно использовать эту функцию." -#: ../../Zotlabs/Module/Defperms.php:67 ../../Zotlabs/Module/Connedit.php:80 +#: ../../Zotlabs/Module/Defperms.php:67 ../../Zotlabs/Module/Connedit.php:81 msgid "Could not access contact record." msgstr "Не удалось получить доступ к записи контакта." @@ -4308,7 +4304,7 @@ 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:132 +#: ../../Zotlabs/Module/Group.php:101 ../../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/Connect.php:104 ../../Zotlabs/Module/Pdledit.php:42 @@ -4321,11 +4317,11 @@ msgstr "не установлено" msgid "Set custom default permissions for new connections" msgstr "Настройка пользовательских разрешений по умолчанию для новых подключений " -#: ../../Zotlabs/Module/Defperms.php:254 ../../Zotlabs/Module/Connedit.php:851 +#: ../../Zotlabs/Module/Defperms.php:254 ../../Zotlabs/Module/Connedit.php:856 msgid "Connection Default Permissions" msgstr "Разрешения по умолчанию для контакта" -#: ../../Zotlabs/Module/Defperms.php:255 ../../Zotlabs/Module/Connedit.php:852 +#: ../../Zotlabs/Module/Defperms.php:255 ../../Zotlabs/Module/Connedit.php:857 msgid "Apply these permissions automatically" msgstr "Применить эти разрешения автоматически" @@ -4335,15 +4331,15 @@ msgid "" "If enabled, connection requests will be approved without your interaction" msgstr "Если включено, запросы контактов будут одобрены без вашего участия" -#: ../../Zotlabs/Module/Defperms.php:256 ../../Zotlabs/Module/Connedit.php:853 +#: ../../Zotlabs/Module/Defperms.php:256 ../../Zotlabs/Module/Connedit.php:858 msgid "Permission role" msgstr "Роль разрешения" -#: ../../Zotlabs/Module/Defperms.php:257 ../../Zotlabs/Module/Connedit.php:854 +#: ../../Zotlabs/Module/Defperms.php:257 ../../Zotlabs/Module/Connedit.php:859 msgid "Add permission role" msgstr "Добавить роль разрешения" -#: ../../Zotlabs/Module/Defperms.php:261 ../../Zotlabs/Module/Connedit.php:867 +#: ../../Zotlabs/Module/Defperms.php:261 ../../Zotlabs/Module/Connedit.php:872 msgid "" "The permissions indicated on this page will be applied to all new " "connections." @@ -4354,17 +4350,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:887 +#: ../../Zotlabs/Module/Tokens.php:183 ../../Zotlabs/Module/Connedit.php:892 msgid "inherited" msgstr "наследуется" #: ../../Zotlabs/Module/Defperms.php:266 ../../Zotlabs/Module/Permcats.php:121 -#: ../../Zotlabs/Module/Tokens.php:181 ../../Zotlabs/Module/Connedit.php:892 +#: ../../Zotlabs/Module/Tokens.php:181 ../../Zotlabs/Module/Connedit.php:897 msgid "My Settings" msgstr "Мои настройки" #: ../../Zotlabs/Module/Defperms.php:269 ../../Zotlabs/Module/Permcats.php:126 -#: ../../Zotlabs/Module/Tokens.php:186 ../../Zotlabs/Module/Connedit.php:894 +#: ../../Zotlabs/Module/Tokens.php:186 ../../Zotlabs/Module/Connedit.php:899 msgid "Individual Permissions" msgstr "Индивидуальные разрешения" @@ -4405,7 +4401,7 @@ msgid "Permission category name" msgstr "Наименование категории разрешений" #: ../../Zotlabs/Module/Permcats.php:127 ../../Zotlabs/Module/Tokens.php:187 -#: ../../Zotlabs/Module/Connedit.php:895 +#: ../../Zotlabs/Module/Connedit.php:900 msgid "" "Some permissions may be inherited from your channel's <a href=\"settings" "\"><strong>privacy settings</strong></a>, which have higher priority than " @@ -4425,69 +4421,69 @@ msgstr "Запрос Xchan начинается с (или webbie):" msgid "Not found." msgstr "Не найдено." -#: ../../Zotlabs/Module/Dreport.php:45 +#: ../../Zotlabs/Module/Dreport.php:56 msgid "Invalid message" msgstr "Неверное сообщение" -#: ../../Zotlabs/Module/Dreport.php:78 +#: ../../Zotlabs/Module/Dreport.php:89 msgid "no results" msgstr "Ничего не найдено." -#: ../../Zotlabs/Module/Dreport.php:93 +#: ../../Zotlabs/Module/Dreport.php:103 msgid "channel sync processed" msgstr "синхронизация канала завершена" -#: ../../Zotlabs/Module/Dreport.php:97 +#: ../../Zotlabs/Module/Dreport.php:107 msgid "queued" msgstr "в очереди" -#: ../../Zotlabs/Module/Dreport.php:101 +#: ../../Zotlabs/Module/Dreport.php:111 msgid "posted" msgstr "опубликовано" -#: ../../Zotlabs/Module/Dreport.php:105 +#: ../../Zotlabs/Module/Dreport.php:115 msgid "accepted for delivery" msgstr "принято к доставке" -#: ../../Zotlabs/Module/Dreport.php:109 +#: ../../Zotlabs/Module/Dreport.php:119 msgid "updated" msgstr "обновлено" -#: ../../Zotlabs/Module/Dreport.php:112 +#: ../../Zotlabs/Module/Dreport.php:122 msgid "update ignored" msgstr "обновление игнорируется" -#: ../../Zotlabs/Module/Dreport.php:115 +#: ../../Zotlabs/Module/Dreport.php:125 msgid "permission denied" msgstr "доступ запрещен" -#: ../../Zotlabs/Module/Dreport.php:119 +#: ../../Zotlabs/Module/Dreport.php:129 msgid "recipient not found" msgstr "получатель не найден" -#: ../../Zotlabs/Module/Dreport.php:122 +#: ../../Zotlabs/Module/Dreport.php:132 msgid "mail recalled" msgstr "почта отозвана" -#: ../../Zotlabs/Module/Dreport.php:125 +#: ../../Zotlabs/Module/Dreport.php:135 msgid "duplicate mail received" msgstr "получено дублирующее сообщение" -#: ../../Zotlabs/Module/Dreport.php:128 +#: ../../Zotlabs/Module/Dreport.php:138 msgid "mail delivered" msgstr "почта доставлен" -#: ../../Zotlabs/Module/Dreport.php:148 +#: ../../Zotlabs/Module/Dreport.php:158 #, php-format msgid "Delivery report for %1$s" msgstr "Отчёт о доставке для %1$s" -#: ../../Zotlabs/Module/Dreport.php:151 ../../Zotlabs/Widget/Wiki_pages.php:41 +#: ../../Zotlabs/Module/Dreport.php:161 ../../Zotlabs/Widget/Wiki_pages.php:41 #: ../../Zotlabs/Widget/Wiki_pages.php:98 msgid "Options" msgstr "Параметры" -#: ../../Zotlabs/Module/Dreport.php:152 +#: ../../Zotlabs/Module/Dreport.php:162 msgid "Redeliver" msgstr "Доставить повторно" @@ -4495,29 +4491,29 @@ msgstr "Доставить повторно" msgid "No such group" msgstr "Нет такой группы" -#: ../../Zotlabs/Module/Network.php:148 +#: ../../Zotlabs/Module/Network.php:149 msgid "No such channel" msgstr "Нет такого канала" -#: ../../Zotlabs/Module/Network.php:163 ../../Zotlabs/Module/Channel.php:133 +#: ../../Zotlabs/Module/Network.php:164 ../../Zotlabs/Module/Channel.php:177 msgid "Search Results For:" msgstr "Результаты поиска для:" -#: ../../Zotlabs/Module/Network.php:193 ../../Zotlabs/Module/Display.php:80 -#: ../../Zotlabs/Module/Pubstream.php:94 ../../Zotlabs/Module/Channel.php:168 +#: ../../Zotlabs/Module/Network.php:194 ../../Zotlabs/Module/Display.php:80 +#: ../../Zotlabs/Module/Pubstream.php:94 ../../Zotlabs/Module/Channel.php:212 #: ../../Zotlabs/Module/Hq.php:134 msgid "Reset form" msgstr "Очистить форму" -#: ../../Zotlabs/Module/Network.php:231 +#: ../../Zotlabs/Module/Network.php:233 msgid "Privacy group is empty" msgstr "Группа безопасности пуста" -#: ../../Zotlabs/Module/Network.php:242 +#: ../../Zotlabs/Module/Network.php:243 msgid "Privacy group: " msgstr "Группа безопасности: " -#: ../../Zotlabs/Module/Network.php:291 +#: ../../Zotlabs/Module/Network.php:316 #: ../../extend/addon/hzaddons/redred/redred.php:65 msgid "Invalid channel." msgstr "Недействительный канал." @@ -4559,40 +4555,40 @@ msgstr "Общих контактов нет." msgid "View Common Connections" msgstr "Просмотр общий контактов" -#: ../../Zotlabs/Module/Acl.php:359 +#: ../../Zotlabs/Module/Acl.php:360 msgid "network" msgstr "сеть" -#: ../../Zotlabs/Module/Item.php:194 +#: ../../Zotlabs/Module/Item.php:196 msgid "Unable to locate original post." msgstr "Не удалось найти оригинальную публикацию." -#: ../../Zotlabs/Module/Item.php:479 +#: ../../Zotlabs/Module/Item.php:483 msgid "Empty post discarded." msgstr "Пустая публикация отклонена." -#: ../../Zotlabs/Module/Item.php:866 +#: ../../Zotlabs/Module/Item.php:892 msgid "Duplicate post suppressed." msgstr "Подавлена дублирующаяся публикация." -#: ../../Zotlabs/Module/Item.php:1011 +#: ../../Zotlabs/Module/Item.php:1037 msgid "System error. Post not saved." msgstr "Системная ошибка. Публикация не сохранена." -#: ../../Zotlabs/Module/Item.php:1047 +#: ../../Zotlabs/Module/Item.php:1073 msgid "Your comment is awaiting approval." msgstr "Ваш комментарий ожидает одобрения." -#: ../../Zotlabs/Module/Item.php:1164 +#: ../../Zotlabs/Module/Item.php:1190 msgid "Unable to obtain post information from database." msgstr "Невозможно получить информацию о публикации из базы данных" -#: ../../Zotlabs/Module/Item.php:1171 +#: ../../Zotlabs/Module/Item.php:1197 #, php-format msgid "You have reached your limit of %1$.0f top level posts." msgstr "Вы достигли вашего ограничения в %1$.0f публикаций высокого уровня." -#: ../../Zotlabs/Module/Item.php:1178 +#: ../../Zotlabs/Module/Item.php:1204 #, php-format msgid "You have reached your limit of %1$.0f webpages." msgstr "Вы достигли вашего ограничения в %1$.0f страниц." @@ -4602,13 +4598,13 @@ msgid "Some blurb about what to do when you're new here" msgstr "Некоторые предложения о том, что делать, если вы здесь новичок " #: ../../Zotlabs/Module/Display.php:29 ../../Zotlabs/Module/Directory.php:67 -#: ../../Zotlabs/Module/Directory.php:72 ../../Zotlabs/Module/Photos.php:545 +#: ../../Zotlabs/Module/Directory.php:72 ../../Zotlabs/Module/Photos.php:558 #: ../../Zotlabs/Module/Viewconnections.php:23 #: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Search.php:17 msgid "Public access denied." msgstr "Публичный доступ запрещен." -#: ../../Zotlabs/Module/Display.php:374 ../../Zotlabs/Module/Channel.php:424 +#: ../../Zotlabs/Module/Display.php:374 ../../Zotlabs/Module/Channel.php:468 msgid "" "You must enable javascript for your browser to be able to view this content." msgstr "Для просмотра этого содержимого в вашем браузере должен быть включён JavaScript" @@ -4649,11 +4645,11 @@ msgstr "событие опубликовано" msgid "shared a file with you" msgstr "с вами поделились файлом" -#: ../../Zotlabs/Module/Ping.php:659 +#: ../../Zotlabs/Module/Ping.php:665 msgid "Private forum" msgstr "Частный форум" -#: ../../Zotlabs/Module/Ping.php:659 +#: ../../Zotlabs/Module/Ping.php:665 msgid "Public forum" msgstr "Публичный форум" @@ -4858,13 +4854,13 @@ msgstr "Дата и время окончания" msgid "Description" msgstr "Описание" -#: ../../Zotlabs/Module/Cdav.php:924 ../../Zotlabs/Module/Photos.php:973 +#: ../../Zotlabs/Module/Cdav.php:924 ../../Zotlabs/Module/Photos.php:986 #: ../../Zotlabs/Module/Events.php:690 ../../Zotlabs/Module/Events.php:699 #: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Cal.php:345 msgid "Previous" msgstr "Предыдущая" -#: ../../Zotlabs/Module/Cdav.php:925 ../../Zotlabs/Module/Photos.php:982 +#: ../../Zotlabs/Module/Cdav.php:925 ../../Zotlabs/Module/Photos.php:995 #: ../../Zotlabs/Module/Events.php:691 ../../Zotlabs/Module/Events.php:700 #: ../../Zotlabs/Module/Cal.php:339 ../../Zotlabs/Module/Cal.php:346 #: ../../Zotlabs/Module/Setup.php:263 @@ -4920,49 +4916,49 @@ msgstr "Удалить всё" msgid "Sorry! Editing of recurrent events is not yet implemented." msgstr "Простите, но редактирование повторяющихся событий пока не реализовано." -#: ../../Zotlabs/Module/Cdav.php:1216 ../../Zotlabs/Module/Connedit.php:908 +#: ../../Zotlabs/Module/Cdav.php:1216 ../../Zotlabs/Module/Connedit.php:913 msgid "Organisation" msgstr "Организация" -#: ../../Zotlabs/Module/Cdav.php:1217 ../../Zotlabs/Module/Connedit.php:909 +#: ../../Zotlabs/Module/Cdav.php:1217 ../../Zotlabs/Module/Connedit.php:914 msgid "Title" msgstr "Наименование" #: ../../Zotlabs/Module/Cdav.php:1218 ../../Zotlabs/Module/Profiles.php:786 -#: ../../Zotlabs/Module/Connedit.php:910 +#: ../../Zotlabs/Module/Connedit.php:915 msgid "Phone" msgstr "Телефон" #: ../../Zotlabs/Module/Cdav.php:1220 ../../Zotlabs/Module/Profiles.php:788 -#: ../../Zotlabs/Module/Connedit.php:912 +#: ../../Zotlabs/Module/Connedit.php:917 msgid "Instant messenger" msgstr "Мессенджер" #: ../../Zotlabs/Module/Cdav.php:1221 ../../Zotlabs/Module/Profiles.php:789 -#: ../../Zotlabs/Module/Connedit.php:913 +#: ../../Zotlabs/Module/Connedit.php:918 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:914 +#: ../../Zotlabs/Module/Connedit.php:919 msgid "Address" msgstr "Адрес" #: ../../Zotlabs/Module/Cdav.php:1223 ../../Zotlabs/Module/Profiles.php:791 -#: ../../Zotlabs/Module/Connedit.php:915 +#: ../../Zotlabs/Module/Connedit.php:920 msgid "Note" msgstr "Заметка" #: ../../Zotlabs/Module/Cdav.php:1228 ../../Zotlabs/Module/Profiles.php:796 -#: ../../Zotlabs/Module/Connedit.php:920 +#: ../../Zotlabs/Module/Connedit.php:925 #: ../../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:921 +#: ../../Zotlabs/Module/Connedit.php:926 msgid "Add Field" msgstr "Добавить поле" @@ -4970,36 +4966,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:923 ../../Zotlabs/Lib/Apps.php:513 +#: ../../Zotlabs/Module/Connedit.php:928 ../../Zotlabs/Lib/Apps.php:513 msgid "Update" msgstr "Обновить" -#: ../../Zotlabs/Module/Cdav.php:1234 ../../Zotlabs/Module/Connedit.php:926 +#: ../../Zotlabs/Module/Cdav.php:1234 ../../Zotlabs/Module/Connedit.php:931 msgid "P.O. Box" msgstr "абонентский ящик" -#: ../../Zotlabs/Module/Cdav.php:1235 ../../Zotlabs/Module/Connedit.php:927 +#: ../../Zotlabs/Module/Cdav.php:1235 ../../Zotlabs/Module/Connedit.php:932 msgid "Additional" msgstr "Дополнительно" -#: ../../Zotlabs/Module/Cdav.php:1236 ../../Zotlabs/Module/Connedit.php:928 +#: ../../Zotlabs/Module/Cdav.php:1236 ../../Zotlabs/Module/Connedit.php:933 msgid "Street" msgstr "Улица" -#: ../../Zotlabs/Module/Cdav.php:1237 ../../Zotlabs/Module/Connedit.php:929 +#: ../../Zotlabs/Module/Cdav.php:1237 ../../Zotlabs/Module/Connedit.php:934 msgid "Locality" msgstr "Населённый пункт" -#: ../../Zotlabs/Module/Cdav.php:1238 ../../Zotlabs/Module/Connedit.php:930 +#: ../../Zotlabs/Module/Cdav.php:1238 ../../Zotlabs/Module/Connedit.php:935 msgid "Region" msgstr "Регион" -#: ../../Zotlabs/Module/Cdav.php:1239 ../../Zotlabs/Module/Connedit.php:931 +#: ../../Zotlabs/Module/Cdav.php:1239 ../../Zotlabs/Module/Connedit.php:936 msgid "ZIP Code" msgstr "Индекс" #: ../../Zotlabs/Module/Cdav.php:1240 ../../Zotlabs/Module/Profiles.php:757 -#: ../../Zotlabs/Module/Connedit.php:932 +#: ../../Zotlabs/Module/Connedit.php:937 msgid "Country" msgstr "Страна" @@ -5011,12 +5007,12 @@ msgstr "Календарь по умолчанию" msgid "Default Addressbook" msgstr "Адресная книга по умолчанию" -#: ../../Zotlabs/Module/Profile.php:45 ../../Zotlabs/Module/Channel.php:54 +#: ../../Zotlabs/Module/Profile.php:45 ../../Zotlabs/Module/Channel.php:98 #: ../../Zotlabs/Module/Hcard.php:37 msgid "Posts and comments" msgstr "Публикации и комментарии" -#: ../../Zotlabs/Module/Profile.php:52 ../../Zotlabs/Module/Channel.php:61 +#: ../../Zotlabs/Module/Profile.php:52 ../../Zotlabs/Module/Channel.php:105 #: ../../Zotlabs/Module/Hcard.php:44 msgid "Only posts" msgstr "Только публикации" @@ -5026,7 +5022,7 @@ msgid "vcard" msgstr "vCard" #: ../../Zotlabs/Module/Ochannel.php:32 ../../Zotlabs/Module/Chat.php:31 -#: ../../Zotlabs/Module/Channel.php:39 +#: ../../Zotlabs/Module/Channel.php:41 #: ../../extend/addon/hzaddons/chess/chess.php:508 msgid "You must be logged in to see this page." msgstr "Вы должны авторизоваться, чтобы увидеть эту страницу." @@ -5039,12 +5035,12 @@ msgstr "Нет новых оповещений системы." msgid "System Notifications" msgstr "Системные оповещения " -#: ../../Zotlabs/Module/Impel.php:183 +#: ../../Zotlabs/Module/Impel.php:185 #, php-format msgid "%s element installed" msgstr "%s элемент установлен" -#: ../../Zotlabs/Module/Impel.php:186 +#: ../../Zotlabs/Module/Impel.php:188 #, php-format msgid "%s element installation failed" msgstr "%sустановка элемента неудачна." @@ -5179,23 +5175,15 @@ msgstr "Близкие к просрочке аккаунты" msgid "Channels" msgstr "Каналы" -#: ../../Zotlabs/Module/Admin.php:115 ../../Zotlabs/Module/Locs.php:119 -msgid "Primary" -msgstr "Основной" - -#: ../../Zotlabs/Module/Admin.php:116 -msgid "Clones" -msgstr "Клоны" - -#: ../../Zotlabs/Module/Admin.php:122 +#: ../../Zotlabs/Module/Admin.php:120 msgid "Message queues" msgstr "Очередь сообщений" -#: ../../Zotlabs/Module/Admin.php:136 +#: ../../Zotlabs/Module/Admin.php:134 msgid "Your software should be updated" msgstr "Ваше программное обеспечение должно быть обновлено" -#: ../../Zotlabs/Module/Admin.php:140 ../../Zotlabs/Module/Admin/Logs.php:82 +#: ../../Zotlabs/Module/Admin.php:138 ../../Zotlabs/Module/Admin/Logs.php:82 #: ../../Zotlabs/Module/Admin/Channels.php:145 #: ../../Zotlabs/Module/Admin/Security.php:92 #: ../../Zotlabs/Module/Admin/Addons.php:341 @@ -5207,35 +5195,35 @@ msgstr "Ваше программное обеспечение должно бы msgid "Administration" msgstr "Администрирование" -#: ../../Zotlabs/Module/Admin.php:141 +#: ../../Zotlabs/Module/Admin.php:139 msgid "Summary" msgstr "Резюме" -#: ../../Zotlabs/Module/Admin.php:144 +#: ../../Zotlabs/Module/Admin.php:142 msgid "Registered accounts" msgstr "Зарегистрированные аккаунты" -#: ../../Zotlabs/Module/Admin.php:145 +#: ../../Zotlabs/Module/Admin.php:143 msgid "Pending registrations" msgstr "Ждут утверждения" -#: ../../Zotlabs/Module/Admin.php:146 +#: ../../Zotlabs/Module/Admin.php:144 msgid "Registered channels" msgstr "Зарегистрированные каналы" -#: ../../Zotlabs/Module/Admin.php:147 +#: ../../Zotlabs/Module/Admin.php:145 msgid "Active addons" msgstr "Активные расширения" -#: ../../Zotlabs/Module/Admin.php:148 +#: ../../Zotlabs/Module/Admin.php:146 msgid "Version" msgstr "Версия системы" -#: ../../Zotlabs/Module/Admin.php:149 +#: ../../Zotlabs/Module/Admin.php:147 msgid "Repository version (master)" msgstr "Версия репозитория (master)" -#: ../../Zotlabs/Module/Admin.php:150 +#: ../../Zotlabs/Module/Admin.php:148 msgid "Repository version (dev)" msgstr "Версия репозитория (dev)" @@ -5511,173 +5499,173 @@ msgstr "Альбом не найден." msgid "Delete Album" msgstr "Удалить альбом" -#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1085 +#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1098 msgid "Delete Photo" msgstr "Удалить фотографию" -#: ../../Zotlabs/Module/Photos.php:556 +#: ../../Zotlabs/Module/Photos.php:569 msgid "No photos selected" msgstr "Никакие фотографии не выбраны" -#: ../../Zotlabs/Module/Photos.php:605 +#: ../../Zotlabs/Module/Photos.php:618 msgid "Access to this item is restricted." msgstr "Доступ к этому элементу ограничен." -#: ../../Zotlabs/Module/Photos.php:648 +#: ../../Zotlabs/Module/Photos.php:661 #, php-format msgid "%1$.2f MB of %2$.2f MB photo storage used." msgstr "Вы использовали %1$.2f мегабайт из %2$.2f для хранения фото." -#: ../../Zotlabs/Module/Photos.php:651 +#: ../../Zotlabs/Module/Photos.php:664 #, php-format msgid "%1$.2f MB photo storage used." msgstr "Вы использовали %1$.2f мегабайт для хранения фото." -#: ../../Zotlabs/Module/Photos.php:693 +#: ../../Zotlabs/Module/Photos.php:706 msgid "Upload Photos" msgstr "Загрузить фотографии" -#: ../../Zotlabs/Module/Photos.php:697 +#: ../../Zotlabs/Module/Photos.php:710 msgid "Enter an album name" msgstr "Введите название альбома" -#: ../../Zotlabs/Module/Photos.php:698 +#: ../../Zotlabs/Module/Photos.php:711 msgid "or select an existing album (doubleclick)" msgstr "или выберите существующий альбом (двойной щелчок)" -#: ../../Zotlabs/Module/Photos.php:699 +#: ../../Zotlabs/Module/Photos.php:712 msgid "Create a status post for this upload" msgstr "Сделать публикацию о статусе для этой загрузки" -#: ../../Zotlabs/Module/Photos.php:701 +#: ../../Zotlabs/Module/Photos.php:714 msgid "Description (optional)" msgstr "Описание (необязательно)" -#: ../../Zotlabs/Module/Photos.php:787 +#: ../../Zotlabs/Module/Photos.php:800 msgid "Show Newest First" msgstr "Показать новые первыми" -#: ../../Zotlabs/Module/Photos.php:789 +#: ../../Zotlabs/Module/Photos.php:802 msgid "Show Oldest First" msgstr "Показать старые первыми" -#: ../../Zotlabs/Module/Photos.php:813 ../../Zotlabs/Module/Photos.php:1352 +#: ../../Zotlabs/Module/Photos.php:826 ../../Zotlabs/Module/Photos.php:1365 #: ../../Zotlabs/Module/Embedphotos.php:140 #: ../../Zotlabs/Widget/Portfolio.php:87 ../../Zotlabs/Widget/Album.php:78 msgid "View Photo" msgstr "Посмотреть фотографию" -#: ../../Zotlabs/Module/Photos.php:844 ../../Zotlabs/Module/Embedphotos.php:156 +#: ../../Zotlabs/Module/Photos.php:857 ../../Zotlabs/Module/Embedphotos.php:156 #: ../../Zotlabs/Widget/Portfolio.php:108 ../../Zotlabs/Widget/Album.php:95 msgid "Edit Album" msgstr "Редактировать Фотоальбом" -#: ../../Zotlabs/Module/Photos.php:846 ../../Zotlabs/Module/Photos.php:1383 +#: ../../Zotlabs/Module/Photos.php:859 ../../Zotlabs/Module/Photos.php:1396 msgid "Add Photos" msgstr "Добавить фотографии" -#: ../../Zotlabs/Module/Photos.php:894 +#: ../../Zotlabs/Module/Photos.php:907 msgid "Permission denied. Access to this item may be restricted." msgstr "Доступ запрещен. Доступ к этому элементу может быть ограничен." -#: ../../Zotlabs/Module/Photos.php:896 +#: ../../Zotlabs/Module/Photos.php:909 msgid "Photo not available" msgstr "Фотография не доступна" -#: ../../Zotlabs/Module/Photos.php:954 +#: ../../Zotlabs/Module/Photos.php:967 msgid "Use as profile photo" msgstr "Использовать в качестве фотографии профиля" -#: ../../Zotlabs/Module/Photos.php:955 +#: ../../Zotlabs/Module/Photos.php:968 msgid "Use as cover photo" msgstr "Использовать в качестве фотографии обложки" -#: ../../Zotlabs/Module/Photos.php:962 +#: ../../Zotlabs/Module/Photos.php:975 msgid "Private Photo" msgstr "Личная фотография" -#: ../../Zotlabs/Module/Photos.php:977 +#: ../../Zotlabs/Module/Photos.php:990 msgid "View Full Size" msgstr "Посмотреть в полный размер" -#: ../../Zotlabs/Module/Photos.php:1022 ../../Zotlabs/Module/Tagrm.php:137 +#: ../../Zotlabs/Module/Photos.php:1035 ../../Zotlabs/Module/Tagrm.php:137 #: ../../Zotlabs/Module/Admin/Addons.php:455 #: ../../extend/addon/hzaddons/superblock/Mod_Superblock.php:91 msgid "Remove" msgstr "Удалить" -#: ../../Zotlabs/Module/Photos.php:1059 +#: ../../Zotlabs/Module/Photos.php:1072 msgid "Edit photo" msgstr "Редактировать фотографию" -#: ../../Zotlabs/Module/Photos.php:1061 +#: ../../Zotlabs/Module/Photos.php:1074 msgid "Rotate CW (right)" msgstr "Повернуть CW (направо)" -#: ../../Zotlabs/Module/Photos.php:1062 +#: ../../Zotlabs/Module/Photos.php:1075 msgid "Rotate CCW (left)" msgstr "Повернуть CCW (налево)" -#: ../../Zotlabs/Module/Photos.php:1065 +#: ../../Zotlabs/Module/Photos.php:1078 msgid "Move photo to album" msgstr "Переместить фотографию в альбом" -#: ../../Zotlabs/Module/Photos.php:1066 +#: ../../Zotlabs/Module/Photos.php:1079 msgid "Enter a new album name" msgstr "Введите новое название альбома" -#: ../../Zotlabs/Module/Photos.php:1067 +#: ../../Zotlabs/Module/Photos.php:1080 msgid "or select an existing one (doubleclick)" msgstr "или выбрать существующую (двойной щелчок)" -#: ../../Zotlabs/Module/Photos.php:1072 +#: ../../Zotlabs/Module/Photos.php:1085 msgid "Add a Tag" msgstr "Добавить тег" -#: ../../Zotlabs/Module/Photos.php:1080 +#: ../../Zotlabs/Module/Photos.php:1093 msgid "Example: @bob, @Barbara_Jensen, @jim@example.com" msgstr "Пример: @bob, @Barbara_Jensen, @jim@example.com" -#: ../../Zotlabs/Module/Photos.php:1083 +#: ../../Zotlabs/Module/Photos.php:1096 msgid "Flag as adult in album view" msgstr "Пометить как альбом \"для взрослых\"" -#: ../../Zotlabs/Module/Photos.php:1102 ../../Zotlabs/Lib/ThreadItem.php:289 +#: ../../Zotlabs/Module/Photos.php:1115 ../../Zotlabs/Lib/ThreadItem.php:289 msgid "I like this (toggle)" msgstr "мне это нравится (переключение)" -#: ../../Zotlabs/Module/Photos.php:1103 ../../Zotlabs/Lib/ThreadItem.php:290 +#: ../../Zotlabs/Module/Photos.php:1116 ../../Zotlabs/Lib/ThreadItem.php:290 msgid "I don't like this (toggle)" msgstr "мне это не нравится (переключение)" -#: ../../Zotlabs/Module/Photos.php:1121 ../../Zotlabs/Module/Photos.php:1239 -#: ../../Zotlabs/Lib/ThreadItem.php:764 +#: ../../Zotlabs/Module/Photos.php:1134 ../../Zotlabs/Module/Photos.php:1252 +#: ../../Zotlabs/Lib/ThreadItem.php:767 msgid "This is you" msgstr "Это вы" -#: ../../Zotlabs/Module/Photos.php:1158 ../../Zotlabs/Module/Photos.php:1170 +#: ../../Zotlabs/Module/Photos.php:1171 ../../Zotlabs/Module/Photos.php:1183 #: ../../Zotlabs/Lib/ThreadItem.php:214 ../../Zotlabs/Lib/ThreadItem.php:226 msgid "View all" msgstr "Просмотреть все" -#: ../../Zotlabs/Module/Photos.php:1267 +#: ../../Zotlabs/Module/Photos.php:1280 msgid "Photo Tools" msgstr "Фото-Инструменты" -#: ../../Zotlabs/Module/Photos.php:1276 +#: ../../Zotlabs/Module/Photos.php:1289 msgid "In This Photo:" msgstr "На этой фотографии:" -#: ../../Zotlabs/Module/Photos.php:1281 +#: ../../Zotlabs/Module/Photos.php:1294 msgid "Map" msgstr "Карта" -#: ../../Zotlabs/Module/Photos.php:1289 ../../Zotlabs/Lib/ThreadItem.php:429 +#: ../../Zotlabs/Module/Photos.php:1302 ../../Zotlabs/Lib/ThreadItem.php:432 msgctxt "noun" msgid "Likes" msgstr "Нравится" -#: ../../Zotlabs/Module/Photos.php:1290 ../../Zotlabs/Lib/ThreadItem.php:430 +#: ../../Zotlabs/Module/Photos.php:1303 ../../Zotlabs/Lib/ThreadItem.php:433 msgctxt "noun" msgid "Dislikes" msgstr "Не нравится" @@ -6444,6 +6432,10 @@ msgstr "Местоположений не найдено" msgid "Manage Channel Locations" msgstr "Управление местоположением канала" +#: ../../Zotlabs/Module/Locs.php:119 +msgid "Primary" +msgstr "Основной" + #: ../../Zotlabs/Module/Locs.php:120 ../../Zotlabs/Module/Menu.php:176 msgid "Drop" msgstr "Удалить" @@ -7410,7 +7402,7 @@ msgstr "Редактировать блок" msgid "No service class restrictions found." msgstr "Ограничений класса обслуживание не найдено." -#: ../../Zotlabs/Module/Channel.php:116 +#: ../../Zotlabs/Module/Channel.php:160 msgid "Insufficient permissions. Request redirected to profile page." msgstr "Недостаточно прав. Запрос перенаправлен на страницу профиля." @@ -7519,44 +7511,44 @@ msgstr "Канал недоступен." msgid "Previous action reversed." msgstr "Предыдущее действие отменено." -#: ../../Zotlabs/Module/Like.php:442 +#: ../../Zotlabs/Module/Like.php:445 #, php-format msgid "%1$s agrees with %2$s's %3$s" msgstr "%1$s согласен с %2$s %3$s" -#: ../../Zotlabs/Module/Like.php:444 +#: ../../Zotlabs/Module/Like.php:447 #, 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:446 +#: ../../Zotlabs/Module/Like.php:449 #, 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:448 -#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2111 +#: ../../Zotlabs/Module/Like.php:451 +#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2120 #, php-format msgid "%1$s is attending %2$s's %3$s" msgstr "%1$s посещает %2$s%3$s" -#: ../../Zotlabs/Module/Like.php:450 -#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2113 +#: ../../Zotlabs/Module/Like.php:453 +#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2122 #, php-format msgid "%1$s is not attending %2$s's %3$s" msgstr "%1$s не посещает %2$s%3$s" -#: ../../Zotlabs/Module/Like.php:452 -#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2115 +#: ../../Zotlabs/Module/Like.php:455 +#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2124 #, php-format msgid "%1$s may attend %2$s's %3$s" msgstr "%1$s может посетить %2$s%3$s" -#: ../../Zotlabs/Module/Like.php:564 +#: ../../Zotlabs/Module/Like.php:566 msgid "Action completed." msgstr "Действие завершено." -#: ../../Zotlabs/Module/Like.php:565 +#: ../../Zotlabs/Module/Like.php:567 msgid "Thank you." msgstr "Спасибо." @@ -8148,14 +8140,14 @@ msgstr "хранилище доступно для записи" msgid "" "SSL certificate cannot be validated. Fix certificate or disable https access " "to this site." -msgstr "" +msgstr "SSL certificate cannot be validated. Замените его или отключите https доступ к этому сайту." #: ../../Zotlabs/Module/Setup.php:659 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 "" +msgstr "Если у вас есть https-доступ к вашему сайту или разрешено подключение к TCP-порту 443 (порт https), вы ДОЛЖНЫ использовать сертификат, действительный для браузера. Вы НЕ ДОЛЖНЫ использовать самоподписанные сертификаты!" #: ../../Zotlabs/Module/Setup.php:660 msgid "" @@ -8168,18 +8160,18 @@ 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 "" +msgstr "Если ваш сертификат не признан, пользователи других сайтов (которые могут сами иметь действительные сертификаты) получат предупреждающее сообщение о проблемах с безопасностью." #: ../../Zotlabs/Module/Setup.php:662 msgid "" "This can cause usability issues elsewhere (not just on your own site) so we " "must insist on this requirement." -msgstr "" +msgstr "Это может привести к проблемам удобства использования из других мест (не только на вашем собственном сайте), поэтому мы настаиваем на этом требовании." #: ../../Zotlabs/Module/Setup.php:663 msgid "" "Providers are available that issue free certificates which are browser-valid." -msgstr "" +msgstr "Доступны поставщики, которые выдают действительные для браузера бесплатные сертификаты." #: ../../Zotlabs/Module/Setup.php:665 msgid "" @@ -8187,17 +8179,17 @@ msgid "" "authority, check to see if you have failed to install an intermediate cert. " "These are not normally required by browsers, but are required for server-to-" "server communications." -msgstr "" +msgstr "Если вы уверены, что сертификат действителен и подписан доверенным органом, проверьте, установлен ли промежуточные сертификаты. Обычно они не требуются браузерами, но бывают необходимы для связи между серверами." #: ../../Zotlabs/Module/Setup.php:667 msgid "SSL certificate validation" -msgstr "" +msgstr "Проверка SSL сертификата" #: ../../Zotlabs/Module/Setup.php:673 msgid "" "Url rewrite in .htaccess is not working. Check your server configuration." "Test: " -msgstr "" +msgstr "Перезапись URL в .htaccess не работает. Проверьте настройки вашего сервера." #: ../../Zotlabs/Module/Setup.php:676 msgid "Url rewrite is working" @@ -8208,7 +8200,7 @@ 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 "" +msgstr "Файл конфигурации базы данных \".htconfig.php\" не может быть записан. Используйте прилагаемый текст для создания файла конфигурации в корневом каталоге веб-сервера." #: ../../Zotlabs/Module/Setup.php:714 #: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:401 @@ -8953,7 +8945,7 @@ msgstr "Импортировать только публичные потоки #: ../../Zotlabs/Module/Admin/Site.php:323 #: ../../Zotlabs/Module/Admin/Site.php:324 -#: ../../Zotlabs/Module/Connedit.php:876 ../../Zotlabs/Module/Connedit.php:877 +#: ../../Zotlabs/Module/Connedit.php:881 ../../Zotlabs/Module/Connedit.php:882 msgid "" "words one per line or #tags or /patterns/ or lang=xx, leave blank to import " "all posts" @@ -9298,12 +9290,12 @@ msgid "No registrations." msgstr "Нет новых регистраций." #: ../../Zotlabs/Module/Admin/Accounts.php:176 -#: ../../Zotlabs/Module/Connedit.php:623 +#: ../../Zotlabs/Module/Connedit.php:628 msgid "Block" msgstr "Блокировать" #: ../../Zotlabs/Module/Admin/Accounts.php:177 -#: ../../Zotlabs/Module/Connedit.php:623 +#: ../../Zotlabs/Module/Connedit.php:628 msgid "Unblock" msgstr "Разблокировать" @@ -9467,21 +9459,21 @@ msgstr "Пароль" msgid "Expires (yyyy-mm-dd)" msgstr "Срок действия (yyyy-mm-dd)" -#: ../../Zotlabs/Module/Tokens.php:180 ../../Zotlabs/Module/Connedit.php:891 +#: ../../Zotlabs/Module/Tokens.php:180 ../../Zotlabs/Module/Connedit.php:896 msgid "Their Settings" msgstr "Их настройки" #: ../../Zotlabs/Module/Notifications.php:60 -#: ../../Zotlabs/Lib/ThreadItem.php:422 +#: ../../Zotlabs/Lib/ThreadItem.php:425 msgid "Mark all seen" msgstr "Отметить как просмотренное" -#: ../../Zotlabs/Module/Subthread.php:142 +#: ../../Zotlabs/Module/Subthread.php:143 #, php-format msgid "%1$s is following %2$s's %3$s" msgstr "%1$s отслеживает %2$s's %3$s" -#: ../../Zotlabs/Module/Subthread.php:144 +#: ../../Zotlabs/Module/Subthread.php:145 #, php-format msgid "%1$s stopped following %2$s's %3$s" msgstr "%1$s прекратил отслеживать %2$s's %3$s" @@ -9711,268 +9703,268 @@ msgstr "Контакт добавлен." msgid "Item is not editable" msgstr "Элемент нельзя редактировать" -#: ../../Zotlabs/Module/Connedit.php:110 +#: ../../Zotlabs/Module/Connedit.php:111 msgid "Could not locate selected profile." msgstr "Не удалось обнаружить выбранный профиль." -#: ../../Zotlabs/Module/Connedit.php:247 +#: ../../Zotlabs/Module/Connedit.php:248 msgid "Connection updated." msgstr "Контакты обновлены." -#: ../../Zotlabs/Module/Connedit.php:249 +#: ../../Zotlabs/Module/Connedit.php:250 msgid "Failed to update connection record." msgstr "Не удалось обновить запись контакта." -#: ../../Zotlabs/Module/Connedit.php:303 +#: ../../Zotlabs/Module/Connedit.php:304 msgid "is now connected to" msgstr "теперь подключён к" -#: ../../Zotlabs/Module/Connedit.php:428 +#: ../../Zotlabs/Module/Connedit.php:429 msgid "Could not access address book record." msgstr "Не удалось получить доступ к записи адресной книги." -#: ../../Zotlabs/Module/Connedit.php:476 +#: ../../Zotlabs/Module/Connedit.php:477 ../../Zotlabs/Module/Connedit.php:481 msgid "Refresh failed - channel is currently unavailable." msgstr "Обновление невозможно - в настоящее время канал недоступен." -#: ../../Zotlabs/Module/Connedit.php:491 ../../Zotlabs/Module/Connedit.php:500 -#: ../../Zotlabs/Module/Connedit.php:509 ../../Zotlabs/Module/Connedit.php:518 -#: ../../Zotlabs/Module/Connedit.php:531 +#: ../../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 msgid "Unable to set address book parameters." msgstr "Не удалось получить доступ к параметрам адресной книги." -#: ../../Zotlabs/Module/Connedit.php:555 +#: ../../Zotlabs/Module/Connedit.php:560 msgid "Connection has been removed." msgstr "Контакт был удалён." -#: ../../Zotlabs/Module/Connedit.php:598 +#: ../../Zotlabs/Module/Connedit.php:603 #, php-format msgid "View %s's profile" msgstr "Просмотр %s профиля" -#: ../../Zotlabs/Module/Connedit.php:602 +#: ../../Zotlabs/Module/Connedit.php:607 msgid "Refresh Permissions" msgstr "Обновить разрешения" -#: ../../Zotlabs/Module/Connedit.php:605 +#: ../../Zotlabs/Module/Connedit.php:610 msgid "Fetch updated permissions" msgstr "Получить обновлённые разрешения" -#: ../../Zotlabs/Module/Connedit.php:609 +#: ../../Zotlabs/Module/Connedit.php:614 msgid "Refresh Photo" msgstr "Обновить фотографию" -#: ../../Zotlabs/Module/Connedit.php:612 +#: ../../Zotlabs/Module/Connedit.php:617 msgid "Fetch updated photo" msgstr "Получить обновлённую фотографию" -#: ../../Zotlabs/Module/Connedit.php:619 +#: ../../Zotlabs/Module/Connedit.php:624 msgid "View recent posts and comments" msgstr "Просмотреть последние публикации и комментарии" -#: ../../Zotlabs/Module/Connedit.php:626 +#: ../../Zotlabs/Module/Connedit.php:631 msgid "Block (or Unblock) all communications with this connection" msgstr "Блокировать (или разблокировать) связи с этим контактом" -#: ../../Zotlabs/Module/Connedit.php:627 +#: ../../Zotlabs/Module/Connedit.php:632 msgid "This connection is blocked!" msgstr "Этот контакт заблокирован!" -#: ../../Zotlabs/Module/Connedit.php:631 +#: ../../Zotlabs/Module/Connedit.php:636 msgid "Unignore" msgstr "Не игнорировать" -#: ../../Zotlabs/Module/Connedit.php:631 +#: ../../Zotlabs/Module/Connedit.php:636 #: ../../Zotlabs/Module/Connections.php:308 msgid "Ignore" msgstr "Игнорировать" -#: ../../Zotlabs/Module/Connedit.php:634 +#: ../../Zotlabs/Module/Connedit.php:639 msgid "Ignore (or Unignore) all inbound communications from this connection" msgstr "Игнорировать (или не игнорировать) все связи для этого контакта" -#: ../../Zotlabs/Module/Connedit.php:635 +#: ../../Zotlabs/Module/Connedit.php:640 msgid "This connection is ignored!" msgstr "Этот контакт игнорируется!" -#: ../../Zotlabs/Module/Connedit.php:639 +#: ../../Zotlabs/Module/Connedit.php:644 msgid "Unarchive" msgstr "Разархивировать" -#: ../../Zotlabs/Module/Connedit.php:639 +#: ../../Zotlabs/Module/Connedit.php:644 msgid "Archive" msgstr "Заархивировать" -#: ../../Zotlabs/Module/Connedit.php:642 +#: ../../Zotlabs/Module/Connedit.php:647 msgid "" "Archive (or Unarchive) this connection - mark channel dead but keep content" msgstr "Заархивировать (или разархивировать) этот контакт - пометить канал отключённым но сохранить содержимое" -#: ../../Zotlabs/Module/Connedit.php:643 +#: ../../Zotlabs/Module/Connedit.php:648 msgid "This connection is archived!" msgstr "Этот контакт заархивирован!" -#: ../../Zotlabs/Module/Connedit.php:647 +#: ../../Zotlabs/Module/Connedit.php:652 msgid "Unhide" msgstr "Показать" -#: ../../Zotlabs/Module/Connedit.php:647 +#: ../../Zotlabs/Module/Connedit.php:652 msgid "Hide" msgstr "Скрыть" -#: ../../Zotlabs/Module/Connedit.php:650 +#: ../../Zotlabs/Module/Connedit.php:655 msgid "Hide or Unhide this connection from your other connections" msgstr "Скрыть или показать этот контакт от / для остальных" -#: ../../Zotlabs/Module/Connedit.php:651 +#: ../../Zotlabs/Module/Connedit.php:656 msgid "This connection is hidden!" msgstr "Этот контакт скрыт!" -#: ../../Zotlabs/Module/Connedit.php:658 +#: ../../Zotlabs/Module/Connedit.php:663 msgid "Delete this connection" msgstr "Удалить этот контакт" -#: ../../Zotlabs/Module/Connedit.php:666 +#: ../../Zotlabs/Module/Connedit.php:671 msgid "Fetch Vcard" msgstr "Получить vCard" -#: ../../Zotlabs/Module/Connedit.php:669 +#: ../../Zotlabs/Module/Connedit.php:674 msgid "Fetch electronic calling card for this connection" msgstr "Получить электронную телефонную карточку для этого контакта" -#: ../../Zotlabs/Module/Connedit.php:680 +#: ../../Zotlabs/Module/Connedit.php:685 msgid "Open Individual Permissions section by default" msgstr "Открывать раздел \"Индивидуальные разрешения\" по умолчанию" -#: ../../Zotlabs/Module/Connedit.php:703 +#: ../../Zotlabs/Module/Connedit.php:708 msgid "Affinity" msgstr "Сходство" -#: ../../Zotlabs/Module/Connedit.php:706 +#: ../../Zotlabs/Module/Connedit.php:711 msgid "Open Set Affinity section by default" msgstr "Открыть секцию установления сходства по умолчанию" -#: ../../Zotlabs/Module/Connedit.php:710 ../../Zotlabs/Widget/Affinity.php:22 +#: ../../Zotlabs/Module/Connedit.php:715 ../../Zotlabs/Widget/Affinity.php:22 msgid "Me" msgstr "Я" -#: ../../Zotlabs/Module/Connedit.php:711 ../../Zotlabs/Widget/Affinity.php:23 +#: ../../Zotlabs/Module/Connedit.php:716 ../../Zotlabs/Widget/Affinity.php:23 msgid "Family" msgstr "Семья" -#: ../../Zotlabs/Module/Connedit.php:713 ../../Zotlabs/Widget/Affinity.php:25 +#: ../../Zotlabs/Module/Connedit.php:718 ../../Zotlabs/Widget/Affinity.php:25 msgid "Acquaintances" msgstr "Знакомые" -#: ../../Zotlabs/Module/Connedit.php:714 +#: ../../Zotlabs/Module/Connedit.php:719 #: ../../Zotlabs/Module/Connections.php:97 #: ../../Zotlabs/Module/Connections.php:111 #: ../../Zotlabs/Widget/Affinity.php:26 msgid "All" msgstr "Все" -#: ../../Zotlabs/Module/Connedit.php:740 +#: ../../Zotlabs/Module/Connedit.php:745 msgid "Filter" msgstr "Фильтр" -#: ../../Zotlabs/Module/Connedit.php:743 +#: ../../Zotlabs/Module/Connedit.php:748 msgid "Open Custom Filter section by default" msgstr "Открывать секцию \"Настраиваемый фильтр\" по умолчанию" -#: ../../Zotlabs/Module/Connedit.php:780 +#: ../../Zotlabs/Module/Connedit.php:785 msgid "Approve this connection" msgstr "Утвердить этот контакт" -#: ../../Zotlabs/Module/Connedit.php:780 +#: ../../Zotlabs/Module/Connedit.php:785 msgid "Accept connection to allow communication" msgstr "Принять контакт чтобы разрешить связь" -#: ../../Zotlabs/Module/Connedit.php:785 +#: ../../Zotlabs/Module/Connedit.php:790 msgid "Set Affinity" msgstr "Установить сходство" -#: ../../Zotlabs/Module/Connedit.php:788 +#: ../../Zotlabs/Module/Connedit.php:793 msgid "Set Profile" msgstr "Установить профиль" -#: ../../Zotlabs/Module/Connedit.php:791 +#: ../../Zotlabs/Module/Connedit.php:796 msgid "Set Affinity & Profile" msgstr "Установить сходство и профиль" -#: ../../Zotlabs/Module/Connedit.php:839 +#: ../../Zotlabs/Module/Connedit.php:844 msgid "This connection is unreachable from this location." msgstr "Этот контакт недоступен для данного местоположения" -#: ../../Zotlabs/Module/Connedit.php:840 +#: ../../Zotlabs/Module/Connedit.php:845 msgid "This connection may be unreachable from other channel locations." msgstr "Этот контакт может быть недоступен из других мест размещения канала" -#: ../../Zotlabs/Module/Connedit.php:842 +#: ../../Zotlabs/Module/Connedit.php:847 msgid "Location independence is not supported by their network." msgstr "Независимое местоположение не поддерживается их сетью." -#: ../../Zotlabs/Module/Connedit.php:848 +#: ../../Zotlabs/Module/Connedit.php:853 msgid "" "This connection is unreachable from this location. Location independence is " "not supported by their network." msgstr "Этот контакт недоступен из данного местоположения. Независимое местоположение не поддерживается их сетью." -#: ../../Zotlabs/Module/Connedit.php:852 +#: ../../Zotlabs/Module/Connedit.php:857 msgid "Connection requests will be approved without your interaction" msgstr "Запросы контактов будут одобрены без вашего участия" -#: ../../Zotlabs/Module/Connedit.php:861 +#: ../../Zotlabs/Module/Connedit.php:866 msgid "This connection's primary address is" msgstr "Главный адрес это контакта" -#: ../../Zotlabs/Module/Connedit.php:862 +#: ../../Zotlabs/Module/Connedit.php:867 msgid "Available locations:" msgstr "Доступные расположения:" -#: ../../Zotlabs/Module/Connedit.php:868 +#: ../../Zotlabs/Module/Connedit.php:873 msgid "Connection Tools" msgstr "Инструменты контактов" -#: ../../Zotlabs/Module/Connedit.php:870 +#: ../../Zotlabs/Module/Connedit.php:875 msgid "Slide to adjust your degree of friendship" msgstr "Прокрутить для настройки степени дружбы" -#: ../../Zotlabs/Module/Connedit.php:872 +#: ../../Zotlabs/Module/Connedit.php:877 msgid "Slide to adjust your rating" msgstr "Прокрутить для настройки оценки" -#: ../../Zotlabs/Module/Connedit.php:873 ../../Zotlabs/Module/Connedit.php:878 +#: ../../Zotlabs/Module/Connedit.php:878 ../../Zotlabs/Module/Connedit.php:883 msgid "Optionally explain your rating" msgstr "Объясните свою оценку (не обязательно)" -#: ../../Zotlabs/Module/Connedit.php:875 +#: ../../Zotlabs/Module/Connedit.php:880 msgid "Custom Filter" msgstr "Настраиваемый фильтр" -#: ../../Zotlabs/Module/Connedit.php:876 +#: ../../Zotlabs/Module/Connedit.php:881 msgid "Only import posts with this text" msgstr "Импортировать публикации только с этим текстом" -#: ../../Zotlabs/Module/Connedit.php:877 +#: ../../Zotlabs/Module/Connedit.php:882 msgid "Do not import posts with this text" msgstr "Не импортировать публикации с этим текстом" -#: ../../Zotlabs/Module/Connedit.php:879 +#: ../../Zotlabs/Module/Connedit.php:884 msgid "This information is public!" msgstr "Эта информация общедоступна!" -#: ../../Zotlabs/Module/Connedit.php:884 +#: ../../Zotlabs/Module/Connedit.php:889 msgid "Connection Pending Approval" msgstr "Ожидающие подтверждения контактов" -#: ../../Zotlabs/Module/Connedit.php:889 +#: ../../Zotlabs/Module/Connedit.php:894 #, 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:896 +#: ../../Zotlabs/Module/Connedit.php:901 msgid "" "Some permissions may be inherited from your channel's <a href=\"settings" "\"><strong>privacy settings</strong></a>, which have higher priority than " @@ -9980,11 +9972,11 @@ msgid "" "any impact unless the inherited setting changes." msgstr "Некоторые разрешения могут быть унаследованы из <a href=\"settings\"><strong>настроек приватности</strong></a> вашего канала, которые могут иметь более высокий приоритет чем индивидуальные. Вы можете изменить эти настройки, однако они не будут применены до изменения переданных по наследству настроек." -#: ../../Zotlabs/Module/Connedit.php:897 +#: ../../Zotlabs/Module/Connedit.php:902 msgid "Last update:" msgstr "Последнее обновление:" -#: ../../Zotlabs/Module/Connedit.php:905 +#: ../../Zotlabs/Module/Connedit.php:910 msgid "Details" msgstr "Сведения" @@ -10180,15 +10172,15 @@ msgstr "Поиск ваших контактов" msgid "Connections search" msgstr "Поиск контаков" -#: ../../Zotlabs/Module/Mood.php:132 +#: ../../Zotlabs/Module/Mood.php:134 msgid "Mood App" msgstr "Приложение \"Настроение\"" -#: ../../Zotlabs/Module/Mood.php:133 ../../Zotlabs/Module/Mood.php:153 +#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Module/Mood.php:155 msgid "Set your current mood and tell your friends" msgstr "Установить текущее настроение и рассказать друзьям" -#: ../../Zotlabs/Module/Mood.php:152 ../../Zotlabs/Lib/Apps.php:325 +#: ../../Zotlabs/Module/Mood.php:154 ../../Zotlabs/Lib/Apps.php:325 msgid "Mood" msgstr "Настроение" @@ -10413,6 +10405,7 @@ msgid "System layout" msgstr "Системный шаблон" #: ../../Zotlabs/Module/Wiki.php:35 +#: ../../extend/addon/hzaddons/flashcards/Mod_Flashcards.php:34 #: ../../extend/addon/hzaddons/cart/cart.php:1297 msgid "Profile Unavailable." msgstr "Профиль недоступен." @@ -10429,7 +10422,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:1440 +#: ../../extend/addon/hzaddons/cart/cart.php:1443 msgid "Invalid channel" msgstr "Недействительный канал" @@ -10937,7 +10930,7 @@ msgstr "Просмотр публичного потока. Предупрежд #: ../../Zotlabs/Widget/Forums.php:100 #: ../../Zotlabs/Widget/Notifications.php:119 #: ../../Zotlabs/Widget/Notifications.php:120 -#: ../../Zotlabs/Widget/Activity_filter.php:102 +#: ../../Zotlabs/Widget/Activity_filter.php:73 msgid "Forums" msgstr "Форумы" @@ -10979,7 +10972,7 @@ msgstr "Показывать только новые публикации" #: ../../Zotlabs/Widget/Notifications.php:46 #: ../../Zotlabs/Widget/Notifications.php:122 #: ../../Zotlabs/Widget/Notifications.php:153 -#: ../../Zotlabs/Widget/Activity_filter.php:164 +#: ../../Zotlabs/Widget/Activity_filter.php:165 msgid "Filter by name" msgstr "Отфильтровать по имени" @@ -11372,57 +11365,57 @@ msgstr "Установленные приложения" msgid "Remove term" msgstr "Удалить термин" -#: ../../Zotlabs/Widget/Activity_filter.php:26 -msgid "Personal Posts" -msgstr "Личные публикации" - -#: ../../Zotlabs/Widget/Activity_filter.php:30 -msgid "Show posts that mention or involve me" -msgstr "Показывать публикации где вы были упомянуты или привлечены" - -#: ../../Zotlabs/Widget/Activity_filter.php:41 -msgid "Starred Posts" -msgstr "Отмеченные публикации" - -#: ../../Zotlabs/Widget/Activity_filter.php:45 -msgid "Show posts that I have starred" -msgstr "Показывать публикации которые я отметил" - -#: ../../Zotlabs/Widget/Activity_filter.php:65 +#: ../../Zotlabs/Widget/Activity_filter.php:36 #, php-format msgid "Show posts related to the %s privacy group" msgstr "Показывать публикации относящиеся к группе безопасности %s" -#: ../../Zotlabs/Widget/Activity_filter.php:74 +#: ../../Zotlabs/Widget/Activity_filter.php:45 msgid "Show my privacy groups" msgstr "Показывать мои группы безопасности" -#: ../../Zotlabs/Widget/Activity_filter.php:95 +#: ../../Zotlabs/Widget/Activity_filter.php:66 msgid "Show posts to this forum" msgstr "Показывать публикации этого форума" -#: ../../Zotlabs/Widget/Activity_filter.php:106 +#: ../../Zotlabs/Widget/Activity_filter.php:77 msgid "Show forums" msgstr "Показывать форумы" -#: ../../Zotlabs/Widget/Activity_filter.php:130 +#: ../../Zotlabs/Widget/Activity_filter.php:91 +msgid "Starred Posts" +msgstr "Отмеченные публикации" + +#: ../../Zotlabs/Widget/Activity_filter.php:95 +msgid "Show posts that I have starred" +msgstr "Показывать публикации которые я отметил" + +#: ../../Zotlabs/Widget/Activity_filter.php:106 +msgid "Personal Posts" +msgstr "Личные публикации" + +#: ../../Zotlabs/Widget/Activity_filter.php:110 +msgid "Show posts that mention or involve me" +msgstr "Показывать публикации где вы были упомянуты или привлечены" + +#: ../../Zotlabs/Widget/Activity_filter.php:131 #, php-format msgid "Show posts that I have filed to %s" msgstr "Показывать публикации которые я добавил в %s" -#: ../../Zotlabs/Widget/Activity_filter.php:140 +#: ../../Zotlabs/Widget/Activity_filter.php:141 msgid "Show filed post categories" msgstr "Показывать категории добавленных публикаций" -#: ../../Zotlabs/Widget/Activity_filter.php:154 +#: ../../Zotlabs/Widget/Activity_filter.php:155 msgid "Panel search" msgstr "Панель поиска" -#: ../../Zotlabs/Widget/Activity_filter.php:179 +#: ../../Zotlabs/Widget/Activity_filter.php:180 msgid "Remove active filter" msgstr "Удалить активный фильтр" -#: ../../Zotlabs/Widget/Activity_filter.php:195 +#: ../../Zotlabs/Widget/Activity_filter.php:196 msgid "Stream Filters" msgstr "Фильтры потока" @@ -12164,7 +12157,7 @@ msgstr "поделиться" msgid "Delivery Report" msgstr "Отчёт о доставке" -#: ../../Zotlabs/Lib/ThreadItem.php:321 +#: ../../Zotlabs/Lib/ThreadItem.php:323 #, php-format msgid "%d comment" msgid_plural "%d comments" @@ -12172,73 +12165,73 @@ msgstr[0] "%d комментарий" msgstr[1] "%d комментария" msgstr[2] "%d комментариев" -#: ../../Zotlabs/Lib/ThreadItem.php:355 ../../Zotlabs/Lib/ThreadItem.php:356 +#: ../../Zotlabs/Lib/ThreadItem.php:357 ../../Zotlabs/Lib/ThreadItem.php:358 #, php-format msgid "View %s's profile - %s" msgstr "Просмотр %s профиля - %s" -#: ../../Zotlabs/Lib/ThreadItem.php:359 +#: ../../Zotlabs/Lib/ThreadItem.php:361 msgid "to" msgstr "к" -#: ../../Zotlabs/Lib/ThreadItem.php:360 +#: ../../Zotlabs/Lib/ThreadItem.php:362 msgid "via" msgstr "через" -#: ../../Zotlabs/Lib/ThreadItem.php:361 +#: ../../Zotlabs/Lib/ThreadItem.php:363 msgid "Wall-to-Wall" msgstr "Стена-к-Стене" -#: ../../Zotlabs/Lib/ThreadItem.php:362 +#: ../../Zotlabs/Lib/ThreadItem.php:364 msgid "via Wall-To-Wall:" msgstr "через Стена-к-Стене:" -#: ../../Zotlabs/Lib/ThreadItem.php:387 +#: ../../Zotlabs/Lib/ThreadItem.php:390 msgid "Attend" msgstr "Посетить" -#: ../../Zotlabs/Lib/ThreadItem.php:388 +#: ../../Zotlabs/Lib/ThreadItem.php:391 msgid "Attendance Options" msgstr "Параметры посещаемости" -#: ../../Zotlabs/Lib/ThreadItem.php:389 +#: ../../Zotlabs/Lib/ThreadItem.php:392 msgid "Vote" msgstr "Голосовать" -#: ../../Zotlabs/Lib/ThreadItem.php:390 +#: ../../Zotlabs/Lib/ThreadItem.php:393 msgid "Voting Options" msgstr "Параметры голосования" -#: ../../Zotlabs/Lib/ThreadItem.php:411 +#: ../../Zotlabs/Lib/ThreadItem.php:414 #: ../../extend/addon/hzaddons/bookmarker/bookmarker.php:38 msgid "Save Bookmarks" msgstr "Сохранить закладки" -#: ../../Zotlabs/Lib/ThreadItem.php:412 +#: ../../Zotlabs/Lib/ThreadItem.php:415 msgid "Add to Calendar" msgstr "Добавить в календарь" -#: ../../Zotlabs/Lib/ThreadItem.php:773 +#: ../../Zotlabs/Lib/ThreadItem.php:776 msgid "Image" msgstr "Изображение" -#: ../../Zotlabs/Lib/ThreadItem.php:775 +#: ../../Zotlabs/Lib/ThreadItem.php:778 msgid "Insert Link" msgstr "Вставить ссылку" -#: ../../Zotlabs/Lib/ThreadItem.php:776 +#: ../../Zotlabs/Lib/ThreadItem.php:779 msgid "Video" msgstr "Видео" -#: ../../Zotlabs/Lib/ThreadItem.php:786 +#: ../../Zotlabs/Lib/ThreadItem.php:789 msgid "Your full name (required)" msgstr "Ваше полное имя (требуется)" -#: ../../Zotlabs/Lib/ThreadItem.php:787 +#: ../../Zotlabs/Lib/ThreadItem.php:790 msgid "Your email address (required)" msgstr "Ваш адрес электронной почты (требуется)" -#: ../../Zotlabs/Lib/ThreadItem.php:788 +#: ../../Zotlabs/Lib/ThreadItem.php:791 msgid "Your website URL (optional)" msgstr "URL вашего вебсайта (необязательно)" @@ -12339,11 +12332,11 @@ msgstr "4. Эксперт - я умею программировать" msgid "5. Wizard - I probably know more than you do" msgstr "5. Волшебник - возможно я знаю больше чем ты" -#: ../../Zotlabs/Lib/NativeWiki.php:152 +#: ../../Zotlabs/Lib/NativeWiki.php:143 msgid "Wiki updated successfully" msgstr "Wiki успешно обновлена" -#: ../../Zotlabs/Lib/NativeWiki.php:206 +#: ../../Zotlabs/Lib/NativeWiki.php:197 msgid "Wiki files deleted successfully" msgstr "Wiki успешно удалена" @@ -12383,72 +12376,68 @@ msgstr "Серверы и ресурсы проекта" msgid "Project Creator and Tech Lead" msgstr "Создатель проекта и технический руководитель" -#: ../../extend/addon/hzaddons/donate/donate.php:23 -msgid "Admin, developer, directorymin, support bloke" -msgstr "Администратор, разработчик, администратор каталога, поддержка" - -#: ../../extend/addon/hzaddons/donate/donate.php:50 +#: ../../extend/addon/hzaddons/donate/donate.php:49 msgid "" "And the hundreds of other people and organisations who helped make the " "Hubzilla possible." msgstr "И сотни других людей и организаций которые помогали в создании Hubzilla." -#: ../../extend/addon/hzaddons/donate/donate.php:53 +#: ../../extend/addon/hzaddons/donate/donate.php:52 msgid "" "The Redmatrix/Hubzilla projects are provided primarily by volunteers giving " "their time and expertise - and often paying out of pocket for services they " "share with others." msgstr "Проекты Redmatrix / Hubzilla предоставляются, в основном, добровольцами, которые предоставляют свое время и опыт и, часто, оплачивают из своего кармана услуги, которыми они делятся с другими." -#: ../../extend/addon/hzaddons/donate/donate.php:54 +#: ../../extend/addon/hzaddons/donate/donate.php:53 msgid "" "There is no corporate funding and no ads, and we do not collect and sell " "your personal information. (We don't control your personal information - " "<strong>you do</strong>.)" msgstr "Здесь нет корпоративного финансирования и рекламы, мы не собираем и не продаем вашу личную информацию. (Мы не контролируем вашу личную информацию - <strong>это делаете вы</strong>.)" -#: ../../extend/addon/hzaddons/donate/donate.php:55 +#: ../../extend/addon/hzaddons/donate/donate.php:54 msgid "" "Help support our ground-breaking work in decentralisation, web identity, and " "privacy." msgstr "Помогите поддержать нашу новаторскую работу в областях децентрализации, веб-идентификации и конфиденциальности." -#: ../../extend/addon/hzaddons/donate/donate.php:57 +#: ../../extend/addon/hzaddons/donate/donate.php:56 msgid "" "Your donations keep servers and services running and also helps us to " "provide innovative new features and continued development." msgstr "В ваших пожертвованиях поддерживают серверы и службы, а также помогают нам предоставлять новые возможности и продолжать развитие." -#: ../../extend/addon/hzaddons/donate/donate.php:60 +#: ../../extend/addon/hzaddons/donate/donate.php:59 msgid "Donate" msgstr "Пожертвовать" -#: ../../extend/addon/hzaddons/donate/donate.php:62 +#: ../../extend/addon/hzaddons/donate/donate.php:61 msgid "" "Choose a project, developer, or public hub to support with a one-time " "donation" msgstr "Выберите проект, разработчика или общедоступный узел для поддержки в форме единоразового пожертвования" -#: ../../extend/addon/hzaddons/donate/donate.php:63 +#: ../../extend/addon/hzaddons/donate/donate.php:62 msgid "Donate Now" msgstr "Пожертвовать сейчас" -#: ../../extend/addon/hzaddons/donate/donate.php:64 +#: ../../extend/addon/hzaddons/donate/donate.php:63 msgid "" "<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project only)" msgstr "<strong><em>или</em></strong> станьте спонсором проекта (только для Hubzilla)" -#: ../../extend/addon/hzaddons/donate/donate.php:65 +#: ../../extend/addon/hzaddons/donate/donate.php:64 msgid "" "Please indicate if you would like your first name or full name (or nothing) " "to appear in our sponsor listing" msgstr "Пожалуйста, если желаете, укажите ваше имя для отображения в списке спонсоров." -#: ../../extend/addon/hzaddons/donate/donate.php:66 +#: ../../extend/addon/hzaddons/donate/donate.php:65 msgid "Sponsor" msgstr "Спонсор" -#: ../../extend/addon/hzaddons/donate/donate.php:69 +#: ../../extend/addon/hzaddons/donate/donate.php:68 msgid "Special thanks to: " msgstr "Особые благодарности:" @@ -12535,11 +12524,11 @@ msgid "A simple gallery for your photo albums" msgstr "Простая галлерея для ваших фотоальбомов" #: ../../extend/addon/hzaddons/gallery/Mod_Gallery.php:115 -#: ../../extend/addon/hzaddons/gallery/gallery.php:47 +#: ../../extend/addon/hzaddons/gallery/gallery.php:28 msgid "Gallery" msgstr "Галерея" -#: ../../extend/addon/hzaddons/gallery/gallery.php:50 +#: ../../extend/addon/hzaddons/gallery/gallery.php:31 msgid "Photo Gallery" msgstr "Фотогалерея" @@ -12881,7 +12870,7 @@ msgid "" "return key" msgstr "Добро пожаловать в Hubzilla! Желаете получить обзор пользовательского интерфейса?</p> <p>Вы можете его приостановаить и в любое время перезагрузив страницу или перейдя на другую.</p><p>Также вы можете нажать клавишу \"Назад\"" -#: ../../extend/addon/hzaddons/superblock/superblock.php:318 +#: ../../extend/addon/hzaddons/superblock/superblock.php:337 msgid "Block Completely" msgstr "Заблокировать полностью" @@ -13599,32 +13588,28 @@ msgid "Until modified date yyyy-mm-dd" msgstr "Заканчивая датой изменений yyyy-mm-dd" #: ../../extend/addon/hzaddons/ljpost/ljpost.php:42 -msgid "Post to LiveJournal" -msgstr "Опубликовать в LiveJournal" - -#: ../../extend/addon/hzaddons/ljpost/ljpost.php:70 -msgid "Enable LiveJournal Post Plugin" -msgstr "Включить плагин публикаций LiveJournal" +msgid "Post to Livejournal" +msgstr "Опубликовать в Livejournal" -#: ../../extend/addon/hzaddons/ljpost/ljpost.php:74 -msgid "LiveJournal username" -msgstr "Имя пользователя LiveJournal" +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:73 +msgid "Enable Livejournal Post Plugin" +msgstr "Включить раширение публикаций в Livejournal" -#: ../../extend/addon/hzaddons/ljpost/ljpost.php:78 -msgid "LiveJournal password" -msgstr "Пароль LiveJournal" +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:77 +msgid "Livejournal username" +msgstr "Имя пользователя Livejournal" -#: ../../extend/addon/hzaddons/ljpost/ljpost.php:82 -msgid "Post to LiveJournal by default" -msgstr "Публиковать в LiveJournal по умолчанию" +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:81 +msgid "Livejournal password" +msgstr "Пароль Livejournal" -#: ../../extend/addon/hzaddons/ljpost/ljpost.php:86 -msgid "LiveJournal Post Settings" -msgstr "Настройки публикаций в LiveJournal" +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:85 +msgid "Post to Livejournal by default" +msgstr "Публиковать в Livejournal по умолчанию" -#: ../../extend/addon/hzaddons/ljpost/ljpost.php:101 -msgid "LiveJournal Settings saved." -msgstr "Настройки LiveJournal сохранены." +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:89 +msgid "Livejournal Post Settings" +msgstr "Настройки публикации в Livejournal" #: ../../extend/addon/hzaddons/statusnet/statusnet.php:143 msgid "Post to GNU social" @@ -13825,8 +13810,8 @@ msgstr "Настройки модерирования сообщества" msgid "Can moderate reputation on my channel." msgstr "Может модерировать репутацию на моём канале" -#: ../../extend/addon/hzaddons/channelreputation/channelreputation.php:544 -#: ../../extend/addon/hzaddons/channelreputation/channelreputation.php:547 +#: ../../extend/addon/hzaddons/channelreputation/channelreputation.php:542 +#: ../../extend/addon/hzaddons/channelreputation/channelreputation.php:545 msgid "Channel Reputation" msgstr "Репутация канала" @@ -14160,7 +14145,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:1462 +#: ../../extend/addon/hzaddons/cart/cart.php:1465 msgid "Order not found." msgstr "Заказ не найден." @@ -14173,7 +14158,7 @@ msgid "Access Denied." msgstr "Доступ запрещён." #: ../../extend/addon/hzaddons/cart/myshop.php:111 -#: ../../extend/addon/hzaddons/cart/cart.php:1330 +#: ../../extend/addon/hzaddons/cart/cart.php:1333 msgid "Order Not Found" msgstr "Заказ не найден" @@ -14217,32 +14202,32 @@ msgstr "Сбросить таблицы базы данных при деинс msgid "Shop" msgstr "Магазин" -#: ../../extend/addon/hzaddons/cart/cart.php:1391 +#: ../../extend/addon/hzaddons/cart/cart.php:1394 msgid "Cart utilities for orders and payments" msgstr "Утилиты карточек для заказов и платежей" -#: ../../extend/addon/hzaddons/cart/cart.php:1429 +#: ../../extend/addon/hzaddons/cart/cart.php:1432 msgid "You must be logged into the Grid to shop." msgstr "Вы должны быть в сети для доступа к магазину" -#: ../../extend/addon/hzaddons/cart/cart.php:1470 +#: ../../extend/addon/hzaddons/cart/cart.php:1473 msgid "Access denied." msgstr "Доступ запрещён." -#: ../../extend/addon/hzaddons/cart/cart.php:1522 -#: ../../extend/addon/hzaddons/cart/cart.php:1665 +#: ../../extend/addon/hzaddons/cart/cart.php:1525 +#: ../../extend/addon/hzaddons/cart/cart.php:1668 msgid "No Order Found" msgstr "Нет найденных заказов" -#: ../../extend/addon/hzaddons/cart/cart.php:1531 +#: ../../extend/addon/hzaddons/cart/cart.php:1534 msgid "An unknown error has occurred Please start again." msgstr "Произошла неизвестная ошибка. Пожалуйста, начните снова." -#: ../../extend/addon/hzaddons/cart/cart.php:1698 +#: ../../extend/addon/hzaddons/cart/cart.php:1701 msgid "Invalid Payment Type. Please start again." msgstr "Недействительный тип платежа. Пожалуйста, начните снова." -#: ../../extend/addon/hzaddons/cart/cart.php:1705 +#: ../../extend/addon/hzaddons/cart/cart.php:1708 msgid "Order not found" msgstr "Заказ не найден" @@ -14415,7 +14400,7 @@ msgstr "Ошибка создания новой игры." msgid "You must select a local channel /chess/channelname" msgstr "Вы должны выбрать локальный канал /chess/channelname" -#: ../../extend/addon/hzaddons/chess/chess.php:1066 +#: ../../extend/addon/hzaddons/chess/chess.php:1071 msgid "Enable notifications" msgstr "Включить оповещения" diff --git a/view/ru/hstrings.php b/view/ru/hstrings.php index 598d02718..02c88dde3 100644 --- a/view/ru/hstrings.php +++ b/view/ru/hstrings.php @@ -470,7 +470,6 @@ App::$strings["Help:"] = "Помощь:"; App::$strings["Help"] = "Помощь"; App::$strings["Not Found"] = "Не найдено"; App::$strings["Page not found."] = "Страница не найдена."; -App::$strings["Cannot locate DNS info for database server '%s'"] = "Не удается найти DNS информацию для сервера базы данных '%s'"; App::$strings["Image/photo"] = "Изображение / фотография"; App::$strings["Encrypted content"] = "Зашифрованное содержание"; App::$strings["Install %1\$s element %2\$s"] = "Установить %1\$s элемент %2\$s"; @@ -1152,8 +1151,6 @@ App::$strings["Blocked accounts"] = "Заблокированные аккаун App::$strings["Expired accounts"] = "Просроченные аккаунты"; App::$strings["Expiring accounts"] = "Близкие к просрочке аккаунты"; App::$strings["Channels"] = "Каналы"; -App::$strings["Primary"] = "Основной"; -App::$strings["Clones"] = "Клоны"; App::$strings["Message queues"] = "Очередь сообщений"; App::$strings["Your software should be updated"] = "Ваше программное обеспечение должно быть обновлено"; App::$strings["Administration"] = "Администрирование"; @@ -1439,6 +1436,7 @@ App::$strings["Please select another location to become primary before removing App::$strings["Syncing locations"] = "Синхронизировать местоположение"; App::$strings["No locations found."] = "Местоположений не найдено"; App::$strings["Manage Channel Locations"] = "Управление местоположением канала"; +App::$strings["Primary"] = "Основной"; App::$strings["Drop"] = "Удалить"; App::$strings["Sync Now"] = "Синхронизировать"; App::$strings["Please wait several minutes between consecutive operations."] = "Пожалуйста, подождите несколько минут между последовательными операциями."; @@ -1828,17 +1826,17 @@ App::$strings["Note: as a security measure, you should give the web server write App::$strings["%s is writable"] = "%s доступен для записи"; App::$strings["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"] = "Эта программа использует каталог хранения для загруженных файлов. Для веб-сервера требуется доступ на запись начиная с верхнего уровня каталога хранения."; App::$strings["store is writable"] = "хранилище доступно для записи"; -App::$strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = ""; -App::$strings["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!"] = ""; +App::$strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "SSL certificate cannot be validated. Замените его или отключите https доступ к этому сайту."; +App::$strings["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!"] = "Если у вас есть https-доступ к вашему сайту или разрешено подключение к TCP-порту 443 (порт https), вы ДОЛЖНЫ использовать сертификат, действительный для браузера. Вы НЕ ДОЛЖНЫ использовать самоподписанные сертификаты!"; App::$strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = "Эти ограничения приняты поскольку ваши общедоступные публикации могут, например, содержать ссылки на изображения на вашем собственном хабе."; -App::$strings["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."] = ""; -App::$strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = ""; -App::$strings["Providers are available that issue free certificates which are browser-valid."] = ""; -App::$strings["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. These are not normally required by browsers, but are required for server-to-server communications."] = ""; -App::$strings["SSL certificate validation"] = ""; -App::$strings["Url rewrite in .htaccess is not working. Check your server configuration.Test: "] = ""; +App::$strings["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."] = "Если ваш сертификат не признан, пользователи других сайтов (которые могут сами иметь действительные сертификаты) получат предупреждающее сообщение о проблемах с безопасностью."; +App::$strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = "Это может привести к проблемам удобства использования из других мест (не только на вашем собственном сайте), поэтому мы настаиваем на этом требовании."; +App::$strings["Providers are available that issue free certificates which are browser-valid."] = "Доступны поставщики, которые выдают действительные для браузера бесплатные сертификаты."; +App::$strings["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. These are not normally required by browsers, but are required for server-to-server communications."] = "Если вы уверены, что сертификат действителен и подписан доверенным органом, проверьте, установлен ли промежуточные сертификаты. Обычно они не требуются браузерами, но бывают необходимы для связи между серверами."; +App::$strings["SSL certificate validation"] = "Проверка SSL сертификата"; +App::$strings["Url rewrite in .htaccess is not working. Check your server configuration.Test: "] = "Перезапись URL в .htaccess не работает. Проверьте настройки вашего сервера."; App::$strings["Url rewrite is working"] = "Перезапись URL работает"; -App::$strings["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."] = ""; +App::$strings["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."] = "Файл конфигурации базы данных \".htconfig.php\" не может быть записан. Используйте прилагаемый текст для создания файла конфигурации в корневом каталоге веб-сервера."; App::$strings["Errors encountered creating database tables."] = "При создании базы данных возникли ошибки."; App::$strings["<h1>What next?</h1>"] = "<h1>Что дальше? </h1>"; App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "Вам понадобится [вручную] настроить запланированную задачу для опрашивателя."; @@ -2588,14 +2586,14 @@ App::$strings["Addon Features"] = "Настройки расширений"; App::$strings["App Collections"] = "Коллекции приложений"; App::$strings["Installed apps"] = "Установленные приложения"; App::$strings["Remove term"] = "Удалить термин"; -App::$strings["Personal Posts"] = "Личные публикации"; -App::$strings["Show posts that mention or involve me"] = "Показывать публикации где вы были упомянуты или привлечены"; -App::$strings["Starred Posts"] = "Отмеченные публикации"; -App::$strings["Show posts that I have starred"] = "Показывать публикации которые я отметил"; App::$strings["Show posts related to the %s privacy group"] = "Показывать публикации относящиеся к группе безопасности %s"; App::$strings["Show my privacy groups"] = "Показывать мои группы безопасности"; App::$strings["Show posts to this forum"] = "Показывать публикации этого форума"; App::$strings["Show forums"] = "Показывать форумы"; +App::$strings["Starred Posts"] = "Отмеченные публикации"; +App::$strings["Show posts that I have starred"] = "Показывать публикации которые я отметил"; +App::$strings["Personal Posts"] = "Личные публикации"; +App::$strings["Show posts that mention or involve me"] = "Показывать публикации где вы были упомянуты или привлечены"; App::$strings["Show posts that I have filed to %s"] = "Показывать публикации которые я добавил в %s"; App::$strings["Show filed post categories"] = "Показывать категории добавленных публикаций"; App::$strings["Panel search"] = "Панель поиска"; @@ -2824,7 +2822,6 @@ App::$strings["Post to Dreamwidth by default"] = "Публиковать в Drea App::$strings["Dreamwidth Post Settings"] = "Настройки публикаций в Dreamwidth"; App::$strings["Project Servers and Resources"] = "Серверы и ресурсы проекта"; App::$strings["Project Creator and Tech Lead"] = "Создатель проекта и технический руководитель"; -App::$strings["Admin, developer, directorymin, support bloke"] = "Администратор, разработчик, администратор каталога, поддержка"; App::$strings["And the hundreds of other people and organisations who helped make the Hubzilla possible."] = "И сотни других людей и организаций которые помогали в создании Hubzilla."; App::$strings["The Redmatrix/Hubzilla projects are provided primarily by volunteers giving their time and expertise - and often paying out of pocket for services they share with others."] = "Проекты Redmatrix / Hubzilla предоставляются, в основном, добровольцами, которые предоставляют свое время и опыт и, часто, оплачивают из своего кармана услуги, которыми они делятся с другими."; App::$strings["There is no corporate funding and no ads, and we do not collect and sell your personal information. (We don't control your personal information - <strong>you do</strong>.)"] = "Здесь нет корпоративного финансирования и рекламы, мы не собираем и не продаем вашу личную информацию. (Мы не контролируем вашу личную информацию - <strong>это делаете вы</strong>.)"; @@ -3102,13 +3099,12 @@ App::$strings["This will import all your cloud files from another server."] = " App::$strings["Hubzilla Server base URL"] = "Базовый URL сервера Hubzilla"; App::$strings["Since modified date yyyy-mm-dd"] = "Начиная с даты изменений yyyy-mm-dd"; App::$strings["Until modified date yyyy-mm-dd"] = "Заканчивая датой изменений yyyy-mm-dd"; -App::$strings["Post to LiveJournal"] = "Опубликовать в LiveJournal"; -App::$strings["Enable LiveJournal Post Plugin"] = "Включить плагин публикаций LiveJournal"; -App::$strings["LiveJournal username"] = "Имя пользователя LiveJournal"; -App::$strings["LiveJournal password"] = "Пароль LiveJournal"; -App::$strings["Post to LiveJournal by default"] = "Публиковать в LiveJournal по умолчанию"; -App::$strings["LiveJournal Post Settings"] = "Настройки публикаций в LiveJournal"; -App::$strings["LiveJournal Settings saved."] = "Настройки LiveJournal сохранены."; +App::$strings["Post to Livejournal"] = "Опубликовать в Livejournal"; +App::$strings["Enable Livejournal Post Plugin"] = "Включить раширение публикаций в Livejournal"; +App::$strings["Livejournal username"] = "Имя пользователя Livejournal"; +App::$strings["Livejournal password"] = "Пароль Livejournal"; +App::$strings["Post to Livejournal by default"] = "Публиковать в Livejournal по умолчанию"; +App::$strings["Livejournal Post Settings"] = "Настройки публикации в Livejournal"; App::$strings["Post to GNU social"] = "Опубликовать в GNU Social"; App::$strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Пожалуйста свяжитесь с администратором сайта. <br />Предоставленный URL API недействителен."; App::$strings["We could not contact the GNU social API with the Path you entered."] = "Нам не удалось установить контакт с GNU Social API по введённому вами пути"; diff --git a/view/tpl/conv_item.tpl b/view/tpl/conv_item.tpl index 5720a2a5f..7dddf9c01 100755 --- a/view/tpl/conv_item.tpl +++ b/view/tpl/conv_item.tpl @@ -181,7 +181,7 @@ {{/if}} {{if $item.edpost && $item.dreport}} <div class="dropdown-divider"></div> - <a class="dropdown-item" href="dreport/{{$item.mid}}">{{$item.dreport}}</a> + <a class="dropdown-item" href="dreport/{{$item.dreport_link}}">{{$item.dreport}}</a> {{/if}} {{if $item.settings}} <div class="dropdown-divider"></div> |