diff options
310 files changed, 20133 insertions, 7107 deletions
diff --git a/.gitignore b/.gitignore index 050902f17..0e5233eaf 100755 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,7 @@ *.rej # OSX .DS_Store files .DS_Store -# version scripts (repo master only) +# version scripts (repo master only) .version* Thumbs.db @@ -27,6 +27,7 @@ custom/ /store/ # site apps apps/ +!doc/context/*/apps # default startpage home.html # page header plugin @@ -1,3 +1,114 @@ +Hubzilla 2.8 (2017-10-25) + - Redirect to be moderated items to /moderate + - Update notifications if notifications area remains open + - Create an actual logout module instead of relying on internal variables + - Add local_channel as a comanche condition variable + - Implement possibility to pin app-tray apps in the navbar via app category navbar_default + - Introduce custom navbars + - Re-implement single delivery + - Pdledit usability improvements + - Implement next generation notifications in right aside + - Implement single post view for /pubstream + - Make anonymous comments work in mod display + - Introduce notifications for unseen public stream posts (off by default) + - Preperatory work on Zot VI + - Add app for site admin + - Introduce experimental alternate channel_menu navigation (off by default) + - Introduce notifications for shared files + - Bring back notifications for account approvals + - Urlencode hashes from mod_acl + - Don't use chanlink_url() for feed mentions + - Design common friends widget to fit better in the app and move it to left aside + - Allow navbar to be used when cover photo is displayed in mod channel + - Implement admin setting to use imagick converter for large photos + - Process activity deletes from OStatus which for whatever reason do not use the industry standard tombstone mechanism + - Implement new css based spinner + - Move the link header initialisation from Router to Webserver + ⁻ Extend activity_match() to work with arrays + - Updated the trusted CA cert database + - Ostatus - support likes of comments + - Provide ability to mention a forum by using !forumname as well as the traditional red style (@forumname+) + - Encrypt delivery reports (not backward compatible) + - Provide a space between link header params (draft-cavage-http-signatures-08) + - Turn common_friends into a widget + - Update to jquery-3.2.1 + - Wiki pages sorted by name + - Create new hooks for permissions_accept and permissions_reject + - Provide rel=alternate link if no reshare content in post + - Add remote login button to login page + - DB update to add index to item.resource_id + - Implement wiki editing (name and acl) + - Provide a hook for importing a channel photo at channel creation time + - Implement wiki mimetype lock + - Bring back wiki downloads + - Add text/plain mimetype to wiki + - Implement per page mimetype selection for wikis + - Added english context help for apps and appman + - Implement owa (open web auth) + - Ignore diaspora_meta column on item import + - Check code permissions on cloud files + - Remove period from characters allowed in username + - Make comment highlighting more reliable + - Sign zot-info packets with httpsignatures + - Implement server to server magic auth + - Provide support for json-ld signatures + - Rewrite comment form open/close handling to be more reliable + - Radically reduce code duplication in updateConvItems() + - Remove discover tab in favour of the public stream app + - Apply autotime to all autotime classed elements when static loading a page + - Implement cards feature + - Extended support for help page translations including table of contents files at the top level + - Introduce util/dmkdir - a mkdir tool for DAV + - Various doco improvements + - Introduce util/dcp (DAV-copy) - copy file or directory from local system to Hubzilla + - Provide support for HTTPsig + - Implement mechanism for selective network following in protocol connectors (diaspora, ostatus, activitypub, zot, rss) + + Bugfixes + - Fix w2w posts not removed in contact_remove() - github issue #837 + - Fix guests not having a unique (non-existent) url + - Fix mod register re-using the password + - Fix write_storage permission not checked in /display + - Fix discovery of moderated items in enotify + - Fix profile thing image not deleted when thing deleted - github issue #868 + - Fix deletions to comments not synced on wall posts + - Fix community tags not preserved on post edit - github issue #865 + - Fix profile photo propagation issue if the local xchan_photo_[l|m|s] fields were changed from the /photo/profile/l/n form to photo/[hash] form by a clone operation + - Fix lockstate and current permissions not handed over to editor in mod card_edit + - Fix profile edit dropdown for multiple profiles + - Fix affinity slider spinner + - Fix mod pubsites broken + - Fix directory server admin selection includes known dead sites + - Fix sticky-kit issue where the bottom of left aside was not visible when section content was short + - Fix possibility to set bogus my_address + - Fix deleting of wiki pages + - Fix selected theme not appearing selected after change - github issue #855 + - Fix an issue where some encoded mids were not found in /display + - Fix issue with mentions and xchans with @ or / + - Fix webfinger returns invalid XML - github issue #851 + - Fix last remaining task in tasklist was not removed from view when completed + + Plugins/Addon + Hubwall: Remove errant $1 string in sender name + Map federation protocols for zotinfo + Gnusoc: force ostatus profile photos to get refreshed monthly + Gnusoc: fix ostatus mention notifications + Gnusoc: unsubscribe to gnusoc feeds if connector is disabled + Phpmailer: not using load/unload + Gnusoc: don't provide some information if gnusoc is disabled by the channel + Diaspora: add a predelivery interval + Diaspora: support for likes on comments + Introduce the pubcrawl plugin - an unapologetically non-compliant ActivityPub Protocol implemention + Introduce gravatar plugin + Pubsubhubbub: produce much more compact PuSH feeds + Diaspora: support text comments on reshare posts + Diaspora: changes to delivery scenarios for the special handling of profile messages + Diaspora: put diaspora seed_location in json webfinger + Gnusoc: fix mis-attributed comments from mastodon + Gnusoc: allow discovery by url (not just reddress) and permit upgrade from 'unknown' network to gnusoc + Implement mechanism for selective network following in protocol connectors + + Hubzilla 2.6.3 (2017-09-18) - Fix anonymous comments/likes on photos - this is not yet implemented - Fix favicon not displayed on certain pages diff --git a/Zotlabs/Daemon/Deliver.php b/Zotlabs/Daemon/Deliver.php index dbc311cf5..394a7bf3e 100644 --- a/Zotlabs/Daemon/Deliver.php +++ b/Zotlabs/Daemon/Deliver.php @@ -53,6 +53,9 @@ class Deliver { remove_queue_item($r[0]['outq_hash']); if($dresult && is_array($dresult)) { + + // delivery reports for local deliveries do not require encryption + foreach($dresult as $xx) { if(is_array($xx) && array_key_exists('message_id',$xx)) { if(delivery_report_is_storable($xx)) { diff --git a/Zotlabs/Daemon/Gprobe.php b/Zotlabs/Daemon/Gprobe.php index 43cce93c3..f1ffb2d81 100644 --- a/Zotlabs/Daemon/Gprobe.php +++ b/Zotlabs/Daemon/Gprobe.php @@ -17,7 +17,7 @@ class Gprobe { if(! strpos($url,'@')) return; - $r = q("select * from xchan where xchan_addr = '%s' limit 1", + $r = q("select * from hubloc where hubloc_addr = '%s' limit 1", dbesc($url) ); diff --git a/Zotlabs/Daemon/Importfile.php b/Zotlabs/Daemon/Importfile.php new file mode 100644 index 000000000..c68ed21cf --- /dev/null +++ b/Zotlabs/Daemon/Importfile.php @@ -0,0 +1,47 @@ +<?php /** @file */ + +namespace Zotlabs\Daemon; + +class Importfile { + + static public function run($argc,$argv){ + + logger('Importfile: ' . print_r($argv,true)); + + if($argc < 3) + return; + + $channel = channelx_by_n($argv[1]); + if(! $channel) + return; + + $srcfile = $argv[2]; + $folder = (($argc > 3) ? $argv[3] : ''); + $dstname = (($argc > 4) ? $argv[4] : ''); + + $hash = random_string(); + + $arr = [ + 'src' => $srcfile, + 'filename' => (($dstname) ? $dstname : basename($srcfile)), + 'hash' => $hash, + 'allow_cid' => $channel['channel_allow_cid'], + 'allow_gid' => $channel['channel_allow_gid'], + 'deny_cid' => $channel['channel_deny_cid'], + 'deny_gid' => $channel['channel_deny_gid'], + 'preserve_original' => true, + 'replace' => true + ]; + + if($folder) + $arr['folder'] = $folder; + + attach_store($channel,$channel['channel_hash'],'import',$arr); + + $sync = attach_export_data($channel,$hash); + if($sync) + build_sync_packet($channel['channel_id'],array('file' => array($sync))); + + return; + } +} diff --git a/Zotlabs/Daemon/Notifier.php b/Zotlabs/Daemon/Notifier.php index 6bca22025..d0175549b 100644 --- a/Zotlabs/Daemon/Notifier.php +++ b/Zotlabs/Daemon/Notifier.php @@ -59,14 +59,19 @@ require_once('include/bbcode.php'); * * ZOT * permission_create abook_id + * permission_accept abook_id + * permission_reject abook_id * permission_update abook_id * refresh_all channel_id * purge_all channel_id * expire channel_id * relay item_id (item was relayed to owner, we will deliver it as owner) + * single_activity item_id (deliver to a singleton network from the appropriate clone) + * single_mail mail_id (deliver to a singleton network from the appropriate clone) * location channel_id * request channel_id xchan_hash message_id * rating xlink_id + * keychange channel_id * */ @@ -103,7 +108,7 @@ class Notifier { $normal_mode = true; $packet_type = 'undefined'; - if($cmd === 'mail') { + if($cmd === 'mail' || $cmd === 'single_mail') { $normal_mode = false; $mail = true; $private = true; @@ -144,7 +149,21 @@ class Notifier { $packet_type = 'request'; $normal_mode = false; } - elseif($cmd == 'permission_update' || $cmd == 'permission_create') { + elseif($cmd === 'keychange') { + $channel = channelx_by_n($item_id); + $r = q("select abook_xchan from abook where abook_channel = %d", + intval($item_id) + ); + if($r) { + foreach($r as $rr) { + $recipients[] = $rr['abook_xchan']; + } + } + $private = false; + $packet_type = 'keychange'; + $normal_mode = false; + } + elseif(in_array($cmd, [ 'permission_update', 'permission_reject', 'permission_accept', 'permission_create' ])) { // Get the (single) recipient $r = q("select * from abook left join xchan on abook_xchan = xchan_hash where abook_id = %d and abook_self = 0", intval($item_id) @@ -156,8 +175,12 @@ class Notifier { if($channel) { $perm_update = array('sender' => $channel, 'recipient' => $r[0], 'success' => false, 'deliveries' => ''); - if($cmd == 'permission_create') + if($cmd === 'permission_create') call_hooks('permissions_create',$perm_update); + elseif($cmd === 'permission_accept') + call_hooks('permissions_accept',$perm_update); + elseif($cmd === 'permission_reject') + call_hooks('permissions_reject',$perm_update); else call_hooks('permissions_update',$perm_update); @@ -261,7 +284,7 @@ class Notifier { $deleted_item = true; } - if(intval($target_item['item_type']) != ITEM_TYPE_POST) { + if(! in_array(intval($target_item['item_type']), [ ITEM_TYPE_POST ] )) { logger('notifier: target item not forwardable: type ' . $target_item['item_type'], LOGGER_DEBUG); return; } @@ -410,7 +433,7 @@ class Notifier { $env_recips = (($private) ? array() : null); - $details = q("select xchan_hash, xchan_instance_url, xchan_network, xchan_addr, xchan_guid, xchan_guid_sig from xchan where xchan_hash in (" . implode(',',$recipients) . ")"); + $details = q("select xchan_hash, xchan_instance_url, xchan_network, xchan_addr, xchan_guid, xchan_guid_sig from xchan where xchan_hash in (" . protect_sprintf(implode(',',$recipients)) . ")"); $recip_list = array(); @@ -445,7 +468,7 @@ class Notifier { 'uplink' => $uplink, 'cmd' => $cmd, 'mail' => $mail, - 'single' => false, + 'single' => (($cmd === 'single_mail' || $cmd === 'single_activity') ? true : false), 'location' => $location, 'request' => $request, 'normal_mode' => $normal_mode, @@ -477,7 +500,7 @@ class Notifier { // Now we have collected recipients (except for external mentions, FIXME) // Let's reduce this to a set of hubs; checking that the site is not dead. - $r = q("select hubloc.*, site.site_crypto from hubloc left join site on site_url = hubloc_url where hubloc_hash in (" . implode(',',$recipients) . ") + $r = q("select hubloc.*, site.site_crypto, site.site_flags from hubloc left join site on site_url = hubloc_url where hubloc_hash in (" . protect_sprintf(implode(',',$recipients)) . ") and hubloc_error = 0 and hubloc_deleted = 0 and ( site_dead = 0 OR site_dead is null ) " ); @@ -518,14 +541,14 @@ class Notifier { if($hub['hubloc_network'] == 'zot') { if(! in_array($hub['hubloc_sitekey'],$keys)) { - $hublist[] = $hub['hubloc_host']; + $hublist[] = $hub['hubloc_host'] . ' ' . $hub['hubloc_network']; $dhubs[] = $hub; $keys[] = $hub['hubloc_sitekey']; } } else { if(! in_array($hub['hubloc_url'],$urls)) { - $hublist[] = $hub['hubloc_host']; + $hublist[] = $hub['hubloc_host'] . ' ' . $hub['hubloc_network']; $dhubs[] = $hub; $urls[] = $hub['hubloc_url']; } @@ -553,7 +576,7 @@ class Notifier { 'uplink' => $uplink, 'cmd' => $cmd, 'mail' => $mail, - 'single' => false, + 'single' => (($cmd === 'single_mail' || $cmd === 'single_activity') ? true : false), 'location' => $location, 'request' => $request, 'normal_mode' => $normal_mode, @@ -572,12 +595,32 @@ class Notifier { } - $hash = random_string(); + // singleton deliveries by definition 'not got zot'. + // Single deliveries are other federated networks (plugins) and we're essentially + // delivering only to those that have this site url in their abook_instance + // and only from within a sync operation. This means if you post from a clone, + // and a connection is connected to one of your other clones; assuming that hub + // is running it will receive a sync packet. On receipt of this sync packet it + // will invoke a delivery to those connections which are connected to just that + // hub instance. + + if($cmd === 'single_mail' || $cmd === 'single_activity') { + continue; + } + + // default: zot protocol + + $hash = random_string(); $packet = null; + $pmsg = ''; if($packet_type === 'refresh' || $packet_type === 'purge') { $packet = zot_build_packet($channel,$packet_type,(($packet_recips) ? $packet_recips : null)); } + if($packet_type === 'keychange') { + $packet = zot_build_packet($channel,$packet_type,(($packet_recips) ? $packet_recips : null)); + $pmsg = get_pconfig($channel['channel_id'],'system','keychange'); + } elseif($packet_type === 'request') { $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'], @@ -591,7 +634,8 @@ class Notifier { 'account_id' => $channel['channel_account_id'], 'channel_id' => $channel['channel_id'], 'posturl' => $hub['hubloc_callback'], - 'notify' => $packet + 'notify' => $packet, + 'msg' => (($pmsg) ? json_encode($pmsg) : '') )); } else { diff --git a/Zotlabs/Lib/ActivityStreams.php b/Zotlabs/Lib/ActivityStreams.php new file mode 100644 index 000000000..379e78a59 --- /dev/null +++ b/Zotlabs/Lib/ActivityStreams.php @@ -0,0 +1,199 @@ +<?php + +namespace Zotlabs\Lib; + +class ActivityStreams { + + 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_recips = null; + + function __construct($string) { + + $this->data = json_decode($string,true); + if($this->data) { + $this->valid = true; + } + + 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->obj = $this->get_compound_property('object'); + $this->tgt = $this->get_compound_property('target'); + $this->origin = $this->get_compound_property('origin'); + $this->recips = $this->collect_recips(); + + $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->type === 'Note') && (! $this->obj)) { + $this->obj = $this->data; + $this->type = 'Create'; + } + } + } + + function is_valid() { + return $this->valid; + } + + function set_recips($arr) { + $this->saved_recips = $arr; + } + + function collect_recips($base = '',$namespace = '') { + $x = []; + $fields = [ 'to','cc','bto','bcc','audience']; + foreach($fields as $f) { + $y = $this->get_compound_property($f,$base,$namespace); + if($y) { + $x = array_merge($x,$y); + if(! is_array($this->raw_recips)) + $this->raw_recips = []; + $this->raw_recips[$f] = $x; + } + } +// not yet ready for prime time +// $x = $this->expand($x,$base,$namespace); + return $x; + } + + function expand($arr,$base = '',$namespace = '') { + $ret = []; + + // right now use a hardwired recursion depth of 5 + + for($z = 0; $z < 5; $z ++) { + if(is_array($arr) && $arr) { + foreach($arr as $a) { + if(is_array($a)) { + $ret[] = $a; + } + else { + $x = $this->get_compound_property($a,$base,$namespace); + if($x) { + $ret = array_merge($ret,$x); + } + } + } + } + } + + // @fixme de-duplicate + + return $ret; + } + + function get_namespace($base,$namespace) { + + if(! $namespace) + return ''; + + $key = null; + + + foreach( [ $this->data, $base ] as $b ) { + if(! $b) + continue; + if(array_key_exists('@context',$b)) { + if(is_array($b['@context'])) { + foreach($b['@context'] as $ns) { + if(is_array($ns)) { + foreach($ns as $k => $v) { + if($namespace === $v) + $key = $k; + } + } + else { + if($namespace === $ns) { + $key = ''; + } + } + } + } + else { + if($namespace === $b['@context']) { + $key = ''; + } + } + } + } + return $key; + } + + + function get_property_obj($property,$base = '',$namespace = '' ) { + $prefix = $this->get_namespace($base,$namespace); + if($prefix === null) + return null; + $base = (($base) ? $base : $this->data); + $propname = (($prefix) ? $prefix . ':' : '') . $property; + return ((array_key_exists($propname,$base)) ? $base[$propname] : null); + } + + function fetch_property($url) { + $redirects = 0; + if(! check_siteallowed($url)) { + logger('blacklisted: ' . $url); + return null; + } + + $x = z_fetch_url($url,true,$redirects, + ['headers' => [ 'Accept: application/ld+json; profile="https://www.w3.org/ns/activitystreams", application/activity+json' ]]); + if($x['success']) + return json_decode($x['body'],true); + return null; + } + + function get_compound_property($property,$base = '',$namespace = '') { + $x = $this->get_property_obj($property,$base,$namespace); + if($this->is_url($x)) { + $x = $this->fetch_property($x); + } + return $x; + } + + function is_url($url) { + if(($url) && (! is_array($url)) && (strpos($url,'http') === 0)) { + return true; + } + return false; + } + + function get_primary_type($base = '',$namespace = '') { + if(! $base) + $base = $this->data; + $x = $this->get_property_obj('type',$base,$namespace); + if(is_array($x)) { + foreach($x as $y) { + if(strpos($y,':') === false) { + return $y; + } + } + } + return $x; + } + + function debug() { + $x = var_export($this,true); + return $x; + } + +}
\ No newline at end of file diff --git a/Zotlabs/Lib/ActivityStreams2.php b/Zotlabs/Lib/ActivityStreams2.php deleted file mode 100644 index 904782bf7..000000000 --- a/Zotlabs/Lib/ActivityStreams2.php +++ /dev/null @@ -1,86 +0,0 @@ -<?php - -namespace Zotlabs\Lib; - - -class ActivityStreams2 { - - public $data; - public $valid = false; - public $id = ''; - public $type = ''; - public $actor = null; - public $obj = null; - public $tgt = null; - - function __construct($string) { - - $this->data = json_decode($string,true); - if($this->data) { - $this->valid = true; - } - - 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->obj = $this->get_compound_property('object'); - $this->tgt = $this->get_compound_property('target'); - } - } - - function is_valid() { - return $this->valid; - } - - function get_property_obj($property,$base = '') { - if(! $base) { - $base = $this->data; - } - return $base[$property]; - } - - function fetch_property($url) { - $redirects = 0; - $x = z_fetch_url($url,true,$redirects, - ['headers' => [ 'Accept: application/ld+json; profile="https://www.w3.org/ns/activitystreams"']]); - if($x['success']) - return json_decode($x['body'],true); - return null; - } - - function get_compound_property($property,$base = '') { - $x = $this->get_property_obj($property,$base); - if($this->is_url($x)) { - $x = $this->fetch_property($x); - } - return $x; - } - - function is_url($url) { - if(($url) && (! is_array($url)) && (strpos($url,'http') === 0)) { - return true; - } - return false; - } - - function get_primary_type($base = '') { - if(! $base) - $base = $this->data; - $x = $this->get_property_obj('type',$base); - if(is_array($x)) { - foreach($x as $y) { - if(strpos($y,':') === false) { - return $y; - } - } - } - return $x; - } - - function debug() { - $x = var_export($this,true); - return $x; - } - -}
\ No newline at end of file diff --git a/Zotlabs/Lib/Apps.php b/Zotlabs/Lib/Apps.php index 68587df49..f13fbe362 100644 --- a/Zotlabs/Lib/Apps.php +++ b/Zotlabs/Lib/Apps.php @@ -169,6 +169,14 @@ class Apps { $requires = explode(',',$ret['requires']); foreach($requires as $require) { $require = trim(strtolower($require)); + $config = false; + + if(substr($require, 0, 7) == 'config:') { + $config = true; + $require = ltrim($require, 'config:'); + $require = explode('=', $require); + } + switch($require) { case 'nologin': if(local_channel()) @@ -191,10 +199,13 @@ class Apps { unset($ret); break; default: - if(! (local_channel() && feature_enabled(local_channel(),$require))) + if($config) + $unset = ((get_config('system', $require[0]) == $require[1]) ? false : true); + else + $unset = ((local_channel() && feature_enabled(local_channel(),$require)) ? false : true); + if($unset) unset($ret); break; - } } } @@ -210,7 +221,8 @@ class Apps { static public function translate_system_apps(&$arr) { $apps = array( 'Apps' => t('Apps'), - 'Site Admin' => t('Site Admin'), + 'Cards' => t('Cards'), + 'Admin' => t('Site Admin'), 'Report Bug' => t('Report Bug'), 'View Bookmarks' => t('View Bookmarks'), 'My Chatrooms' => t('My Chatrooms'), @@ -305,8 +317,17 @@ class Apps { if($k === 'requires') { $requires = explode(',',$v); + foreach($requires as $require) { $require = trim(strtolower($require)); + $config = false; + + if(substr($require, 0, 7) == 'config:') { + $config = true; + $require = ltrim($require, 'config:'); + $require = explode('=', $require); + } + switch($require) { case 'nologin': if(local_channel()) @@ -330,10 +351,13 @@ class Apps { return ''; break; default: - if(! (local_channel() && feature_enabled(local_channel(),$require))) + if($config) + $unset = ((get_config('system', $require[0]) == $require[1]) ? false : true); + else + $unset = ((local_channel() && feature_enabled(local_channel(),$require)) ? false : true); + if($unset) return ''; break; - } } } @@ -359,6 +383,13 @@ class Apps { $install_action = (($installed) ? t('Update') : t('Install')); $icon = ((strpos($papp['photo'],'icon:') === 0) ? substr($papp['photo'],5) : ''); + if($mode === 'navbar') { + return replace_macros(get_markup_template('app_nav.tpl'),array( + '$app' => $papp, + '$icon' => $icon, + )); + } + return replace_macros(get_markup_template('app.tpl'),array( '$app' => $papp, '$icon' => $icon, diff --git a/Zotlabs/Lib/Enotify.php b/Zotlabs/Lib/Enotify.php index 9f3347d19..e82c11a35 100644 --- a/Zotlabs/Lib/Enotify.php +++ b/Zotlabs/Lib/Enotify.php @@ -130,7 +130,9 @@ class Enotify { if ($params['type'] == NOTIFY_COMMENT) { // logger("notification: params = " . print_r($params, true), LOGGER_DEBUG); - $itemlink = $params['link']; + $moderated = (($params['item']['item_blocked'] == ITEM_MODERATED) ? true : false); + + $itemlink = $params['link']; // ignore like/unlike activity on posts - they probably require a separate notification preference @@ -170,8 +172,6 @@ class Enotify { xchan_query($p); - $moderated = (($p[0]['item_blocked'] == ITEM_MODERATED) ? true : false); - $item_post_type = item_post_type($p[0]); // $private = $p[0]['item_private']; $parent_id = $p[0]['id']; diff --git a/Zotlabs/Lib/JSalmon.php b/Zotlabs/Lib/JSalmon.php new file mode 100644 index 000000000..43d5f9d09 --- /dev/null +++ b/Zotlabs/Lib/JSalmon.php @@ -0,0 +1,38 @@ +<?php + +namespace Zotlabs\Lib; + + +class JSalmon { + + static function sign($data,$key_id,$key) { + + $arr = $data; + $data = json_encode($data,JSON_UNESCAPED_SLASHES); + $data = base64url_encode($data, false); // do not strip padding + $data_type = 'application/x-zot+json'; + $encoding = 'base64url'; + $algorithm = 'RSA-SHA256'; + + $data = preg_replace('/\s+/','',$data); + + // precomputed base64url encoding of data_type, encoding, algorithm concatenated with periods + + $precomputed = '.' . base64url_encode($data_type,false) . '.YmFzZTY0dXJs.UlNBLVNIQTI1Ng=='; + + $signature = base64url_encode(rsa_sign($data . $precomputed, $key), false); + + return ([ + 'signed' => true, + 'data' => $data, + 'data_type' => $data_type, + 'encoding' => $encoding, + 'alg' => $algorithm, + 'sigs' => [ + 'value' => $signature, + 'key_id' => base64url_encode($key_id) + ] + ]); + + } +}
\ No newline at end of file diff --git a/Zotlabs/Lib/LDSignatures.php b/Zotlabs/Lib/LDSignatures.php new file mode 100644 index 000000000..6d7127cde --- /dev/null +++ b/Zotlabs/Lib/LDSignatures.php @@ -0,0 +1,135 @@ +<?php + +namespace Zotlabs\Lib; + +require_once('library/jsonld/jsonld.php'); + +class LDSignatures { + + + static function verify($data,$pubkey) { + + $ohash = self::hash(self::signable_options($data['signature'])); + $dhash = self::hash(self::signable_data($data)); + + $x = rsa_verify($ohash . $dhash,base64_decode($data['signature']['signatureValue']), $pubkey); + logger('LD-verify: ' . intval($x)); + + return $x; + } + + static function dopplesign(&$data,$channel) { + // remove for the time being - performance issues + // $data['magicEnv'] = self::salmon_sign($data,$channel); + return self::sign($data,$channel); + } + + static function sign($data,$channel) { + + $options = [ + 'type' => 'RsaSignature2017', + 'nonce' => random_string(64), + 'creator' => z_root() . '/channel/' . $channel['channel_address'] . '/public_key_pem', + 'created' => datetime_convert('UTC','UTC', 'now', 'Y-m-d\Th:i:s\Z') + ]; + + $ohash = self::hash(self::signable_options($options)); + $dhash = self::hash(self::signable_data($data)); + $options['signatureValue'] = base64_encode(rsa_sign($ohash . $dhash,$channel['channel_prvkey'])); + + $signed = array_merge([ + '@context' => [ + ACTIVITYSTREAMS_JSONLD_REV, + 'https://w3id.org/security/v1' ], + ],$options); + + return $signed; + } + + + static function signable_data($data) { + + $newdata = []; + if($data) { + foreach($data as $k => $v) { + if(! in_array($k,[ 'signature' ])) { + $newdata[$k] = $v; + } + } + } + return json_encode($newdata,JSON_UNESCAPED_SLASHES); + } + + + static function signable_options($options) { + + $newopts = [ '@context' => 'https://w3id.org/identity/v1' ]; + if($options) { + foreach($options as $k => $v) { + if(! in_array($k,[ 'type','id','signatureValue' ])) { + $newopts[$k] = $v; + } + } + } + return json_encode($newopts,JSON_UNESCAPED_SLASHES); + } + + static function hash($obj) { + + return hash('sha256',self::normalise($obj)); + } + + static function normalise($data) { + if(is_string($data)) { + $data = json_decode($data); + } + + if(! is_object($data)) + return ''; + + jsonld_set_document_loader('jsonld_document_loader'); + + try { + $d = jsonld_normalize($data,[ 'algorithm' => 'URDNA2015', 'format' => 'application/nquads' ]); + } + catch (\Exception $e) { + logger('normalise error:' . print_r($e,true)); + logger('normalise error: ' . print_r($data,true)); + } + + return $d; + } + + static function salmon_sign($data,$channel) { + + $arr = $data; + $data = json_encode($data,JSON_UNESCAPED_SLASHES); + $data = base64url_encode($data, false); // do not strip padding + $data_type = 'application/activity+json'; + $encoding = 'base64url'; + $algorithm = 'RSA-SHA256'; + $keyhash = base64url_encode(z_root() . '/channel/' . $channel['channel_address']); + + $data = str_replace(array(" ","\t","\r","\n"),array("","","",""),$data); + + // precomputed base64url encoding of data_type, encoding, algorithm concatenated with periods + + $precomputed = '.' . base64url_encode($data_type,false) . '.YmFzZTY0dXJs.UlNBLVNIQTI1Ng=='; + + $signature = base64url_encode(rsa_sign($data . $precomputed,$channel['channel_prvkey'])); + + return ([ + 'id' => $arr['id'], + 'meData' => $data, + 'meDataType' => $data_type, + 'meEncoding' => $encoding, + 'meAlgorithm' => $algorithm, + 'meCreator' => z_root() . '/channel/' . $channel['channel_address'] . '/public_key_pem', + 'meSignatureValue' => $signature + ]); + + } + + + +}
\ No newline at end of file diff --git a/Zotlabs/Lib/MarkdownSoap.php b/Zotlabs/Lib/MarkdownSoap.php index 534ad819f..fa279b07c 100644 --- a/Zotlabs/Lib/MarkdownSoap.php +++ b/Zotlabs/Lib/MarkdownSoap.php @@ -94,7 +94,7 @@ class MarkdownSoap { } function escape($s) { - return htmlspecialchars($s,ENT_QUOTES); + return htmlspecialchars($s,ENT_QUOTES,'UTF-8',false); } static public function unescape($s) { diff --git a/Zotlabs/Lib/NativeWiki.php b/Zotlabs/Lib/NativeWiki.php index 4301feaa0..7642dbb3e 100644 --- a/Zotlabs/Lib/NativeWiki.php +++ b/Zotlabs/Lib/NativeWiki.php @@ -18,11 +18,18 @@ class NativeWiki { if($wikis) { foreach($wikis as &$w) { + + $w['json_allow_cid'] = acl2json($w['allow_cid']); + $w['json_allow_gid'] = acl2json($w['allow_gid']); + $w['json_deny_cid'] = acl2json($w['deny_cid']); + $w['json_deny_gid'] = acl2json($w['deny_gid']); + $w['rawName'] = get_iconfig($w, 'wiki', 'rawName'); $w['htmlName'] = escape_tags($w['rawName']); $w['urlName'] = urlencode(urlencode($w['rawName'])); $w['mimeType'] = get_iconfig($w, 'wiki', 'mimeType'); - $w['lock'] = (($w['item_private'] || $w['allow_cid'] || $w['allow_gid'] || $w['deny_cid'] || $w['deny_gid']) ? true : false); + $w['typelock'] = get_iconfig($w, 'wiki', 'typelock'); + $w['lockstate'] = (($w['allow_cid'] || $w['allow_gid'] || $w['deny_cid'] || $w['deny_gid']) ? 'lock' : 'unlock'); } } // TODO: query db for wikis the observer can access. Return with two lists, for read and write access @@ -84,7 +91,9 @@ class NativeWiki { if(! set_iconfig($arr, 'wiki', 'mimeType', $wiki['mimeType'], true)) { return array('item' => null, 'success' => false); } - + + set_iconfig($arr,'wiki','typelock',$wiki['typelock'],true); + $post = item_store($arr); $item_id = $post['item_id']; @@ -98,6 +107,61 @@ class NativeWiki { } } + function update_wiki($channel_id, $observer_hash, $arr, $acl) { + + $w = self::get_wiki($channel_id, $observer_hash, $arr['resource_id']); + $item = $w['wiki']; + + if(! $item) { + return array('item' => null, 'success' => false); + } + + $x = $acl->get(); + + $item['allow_cid'] = $x['allow_cid']; + $item['allow_gid'] = $x['allow_gid']; + $item['deny_cid'] = $x['deny_cid']; + $item['deny_gid'] = $x['deny_gid']; + $item['item_private'] = intval($acl->is_private()); + + $update_title = false; + + if($item['title'] !== $arr['updateRawName']) { + $update_title = true; + $item['title'] = $arr['updateRawName']; + } + + $update = item_store_update($item); + + $item_id = $update['item_id']; + + // update acl for any existing wiki pages + + q("update item set allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s', item_private = %d where resource_type = 'nwikipage' and resource_id = '%s'", + dbesc($item['allow_cid']), + dbesc($item['allow_gid']), + dbesc($item['deny_cid']), + dbesc($item['deny_gid']), + dbesc($item['item_private']), + dbesc($arr['resource_id']) + ); + + + if($update['item_id']) { + info( t('Wiki updated successfully')); + if($update_title) { + // Update the wiki name information using iconfig. + if(! set_iconfig($update['item_id'], 'wiki', 'rawName', $arr['updateRawName'], true)) { + return array('item' => null, 'success' => false); + } + } + return array('item' => $update['item'], 'item_id' => $update['item_id'], 'success' => $update['success']); + } + else { + return array('item' => null, 'success' => false); + } + } + static public function sync_a_wiki_item($uid,$id,$resource_id) { @@ -108,6 +172,12 @@ class NativeWiki { dbesc($resource_id) ); if($r) { + $q = q("select * from item where resource_type = 'nwikipage' and resource_id = '%s'", + dbesc($r[0]['resource_type']) + ); + if($q) { + $r = array_merge($r,$q); + } xchan_query($r); $sync_item = fetch_post_tags($r); build_sync_packet($uid,array('wiki' => array(encode_item($sync_item[0],true)))); @@ -150,13 +220,15 @@ class NativeWiki { // Get wiki metadata $rawName = get_iconfig($w, 'wiki', 'rawName'); $mimeType = get_iconfig($w, 'wiki', 'mimeType'); + $typelock = get_iconfig($w, 'wiki', 'typelock'); return array( - 'wiki' => $w, - 'rawName' => $rawName, + 'wiki' => $w, + 'rawName' => $rawName, 'htmlName' => escape_tags($rawName), - 'urlName' => urlencode(urlencode($rawName)), - 'mimeType' => $mimeType + 'urlName' => urlencode(urlencode($rawName)), + 'mimeType' => $mimeType, + 'typelock' => $typelock ); } } diff --git a/Zotlabs/Lib/NativeWikiPage.php b/Zotlabs/Lib/NativeWikiPage.php index 78b54ebda..209a5ef3c 100644 --- a/Zotlabs/Lib/NativeWikiPage.php +++ b/Zotlabs/Lib/NativeWikiPage.php @@ -21,7 +21,7 @@ class NativeWikiPage { $sql_extra = item_permissions_sql($channel_id,$observer_hash); $r = q("select * from item where resource_type = 'nwikipage' and resource_id = '%s' and uid = %d and item_deleted = 0 - $sql_extra order by created asc", + $sql_extra order by title asc", dbesc($resource_id), intval($channel_id) ); @@ -55,7 +55,12 @@ class NativeWikiPage { } - static public function create_page($channel_id, $observer_hash, $name, $resource_id) { + static public function create_page($channel_id, $observer_hash, $name, $resource_id, $mimetype = 'text/bbcode') { + + logger('mimetype: ' . $mimetype); + + if(! in_array($mimetype,[ 'text/markdown','text/bbcode','text/plain','text/html' ])) + $mimetype = 'text/markdown'; $w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id); @@ -68,6 +73,8 @@ class NativeWikiPage { $arr = []; $arr['uid'] = $channel_id; $arr['author_xchan'] = $observer_hash; + $arr['mimetype'] = $mimetype; + $arr['title'] = $name; $arr['resource_type'] = 'nwikipage'; $arr['resource_id'] = $resource_id; $arr['allow_cid'] = $w['wiki']['allow_cid']; @@ -133,8 +140,14 @@ class NativeWikiPage { if($ic) { foreach($ic as $c) { set_iconfig($c['item_id'],'nwikipage','pagetitle',$pageNewName); + $ids[] = $c['item_id']; } + $str_ids = implode(',', $ids); + q("update item set title = '%s' where id in ($str_ids)", + dbesc($pageNewName) + ); + $page = [ 'rawName' => $pageNewName, 'htmlName' => escape_tags($pageNewName), @@ -167,10 +180,11 @@ class NativeWikiPage { $content = $item['body']; return [ - 'content' => $content, - 'mimeType' => $w['mimeType'], - 'message' => '', - 'success' => true + 'content' => $content, + 'mimeType' => $w['mimeType'], + 'pageMimeType' => $item['mimetype'], + 'message' => '', + 'success' => true ]; } @@ -333,7 +347,6 @@ class NativeWikiPage { return array('message' => t('Error reading wiki'), 'success' => false); } - $mimetype = $w['mimeType']; // fetch the most recently saved revision. @@ -342,6 +355,8 @@ class NativeWikiPage { return array('message' => t('Page not found'), 'success' => false); } + $mimetype = $item['mimetype']; + // change just the fields we need to change to create a revision; unset($item['id']); @@ -599,10 +614,13 @@ class NativeWikiPage { } static public function get_file_ext($arr) { - if($arr['mimeType'] == 'text/bbcode') + if($arr['mimetype'] === 'text/bbcode') return '.bb'; - else + elseif($arr['mimetype'] === 'text/markdown') return '.md'; + elseif($arr['mimetype'] === 'text/plain') + return '.txt'; + } // This function is derived from diff --git a/Zotlabs/Lib/PConfig.php b/Zotlabs/Lib/PConfig.php index 25478e764..2a0b18aac 100644 --- a/Zotlabs/Lib/PConfig.php +++ b/Zotlabs/Lib/PConfig.php @@ -20,11 +20,12 @@ class PConfig { if(is_null($uid) || $uid === false) return false; - if(! array_key_exists($uid, \App::$config)) - \App::$config[$uid] = array(); - if(! is_array(\App::$config)) { - btlogger('App::$config not an array: ' . $uid); + btlogger('App::$config not an array'); + } + + if(! array_key_exists($uid, \App::$config)) { + \App::$config[$uid] = array(); } if(! is_array(\App::$config[$uid])) { diff --git a/Zotlabs/Lib/SConfig.php b/Zotlabs/Lib/SConfig.php new file mode 100644 index 000000000..ca0d133b2 --- /dev/null +++ b/Zotlabs/Lib/SConfig.php @@ -0,0 +1,25 @@ +<?php + +namespace Zotlabs\Lib; + +// account configuration storage is built on top of the under-utilised xconfig + +class SConfig { + + static public function Load($server_id) { + return XConfig::Load('s_' . $server_id); + } + + static public function Get($server_id,$family,$key,$default = false) { + return XConfig::Get('s_' . $server_id,$family,$key, $default); + } + + static public function Set($server_id,$family,$key,$value) { + return XConfig::Set('s_' . $server_id,$family,$key,$value); + } + + static public function Delete($server_id,$family,$key) { + return XConfig::Delete('s_' . $server_id,$family,$key); + } + +} diff --git a/Zotlabs/Lib/System.php b/Zotlabs/Lib/System.php index a5790fb07..c3e11eb6a 100644 --- a/Zotlabs/Lib/System.php +++ b/Zotlabs/Lib/System.php @@ -61,6 +61,13 @@ class System { return 'pro'; } + + static public function get_zot_revision() { + $x = [ 'revision' => ZOT_REVISION ]; + call_hooks('zot_revision',$x); + return $x['revision']; + } + static public function get_std_version() { if(defined('STD_VERSION')) return STD_VERSION; diff --git a/Zotlabs/Lib/ThreadItem.php b/Zotlabs/Lib/ThreadItem.php index 17d65dbc7..67a507025 100644 --- a/Zotlabs/Lib/ThreadItem.php +++ b/Zotlabs/Lib/ThreadItem.php @@ -29,6 +29,7 @@ class ThreadItem { private $visiting = false; private $channel = null; private $display_mode = 'normal'; + private $reload = ''; public function __construct($data) { @@ -101,10 +102,13 @@ class ThreadItem { if($item['author']['xchan_network'] === 'rss') $shareable = true; + $mode = $conv->get_mode(); + $edlink = (($item['item_type'] == ITEM_TYPE_CARD) ? 'card_edit' : 'editpost'); + if(local_channel() && $observer['xchan_hash'] === $item['author_xchan']) - $edpost = array(z_root()."/editpost/".$item['id'], t("Edit")); + $edpost = array(z_root() . '/' . $edlink . '/' . $item['id'], t('Edit')); else $edpost = false; @@ -309,7 +313,8 @@ class ThreadItem { $tmp_item = array( 'template' => $this->get_template(), - 'mode' => $mode, + 'mode' => $mode, + 'item_type' => intval($item['item_type']), 'type' => implode("",array_slice(explode("/",$item['verb']),-1)), 'body' => $body['html'], 'tags' => $body['tags'], @@ -407,8 +412,9 @@ class ThreadItem { 'showdislike' => $showdislike, 'comment' => $this->get_comment_box($indent), 'previewing' => ($conv->is_preview() ? true : false ), + 'preview_lbl' => t('This is an unsaved preview'), 'wait' => t('Please wait'), - 'submid' => str_replace(['+','='], ['',''], base64_encode(substr($item['mid'],0,32))), + 'submid' => str_replace(['+','='], ['',''], base64_encode($item['mid'])), 'thread_level' => $thread_level ); @@ -479,6 +485,14 @@ class ThreadItem { return $this->threaded; } + public function set_reload($val) { + $this->reload = $val; + } + + public function get_reload() { + return $this->reload; + } + public function set_commentable($val) { $this->commentable = $val; foreach($this->get_children() as $child) @@ -715,7 +729,7 @@ class ThreadItem { $comment_box = replace_macros($template,array( '$return_path' => '', '$threaded' => $this->is_threaded(), - '$jsreload' => '', //(($conv->get_mode() === 'display') ? $_SESSION['return_url'] : ''), + '$jsreload' => $conv->reload, '$type' => (($conv->get_mode() === 'channel') ? 'wall-comment' : 'net-comment'), '$id' => $this->get_id(), '$parent' => $this->get_id(), @@ -733,19 +747,21 @@ class ThreadItem { '$edquote' => t('Quote'), '$edcode' => t('Code'), '$edimg' => t('Image'), + '$edatt' => t('Attach File'), '$edurl' => t('Insert Link'), '$edvideo' => t('Video'), '$preview' => t('Preview'), // ((feature_enabled($conv->get_profile_owner(),'preview')) ? t('Preview') : ''), '$indent' => $indent, + '$can_upload' => (perm_is_allowed($conv->get_profile_owner(),get_observer_hash(),'write_storage') && $conv->is_uploadable()), '$feature_encrypt' => ((feature_enabled($conv->get_profile_owner(),'content_encrypt')) ? true : false), '$encrypt' => t('Encrypt text'), '$cipher' => $conv->get_cipher(), '$sourceapp' => \App::$sourcename, '$observer' => get_observer_hash(), - '$anoncomments' => (($conv->get_mode() === 'channel' && perm_is_allowed($conv->get_profile_owner(),'','post_comments')) ? true : false), - '$anonname' => [ 'anonname', t('Your full name (required)'),'','','','onBlur="commentCloseUI(this,\'' . $this->get_id() . '\')"' ], - '$anonmail' => [ 'anonmail', t('Your email address (required)'),'','','','onBlur="commentCloseUI(this,\'' . $this->get_id() . '\')"' ], - '$anonurl' => [ 'anonurl', t('Your website URL (optional)'),'','','','onBlur="commentCloseUI(this,\'' . $this->get_id() . '\')"' ] + '$anoncomments' => ((($conv->get_mode() === 'channel' || $conv->get_mode() === 'display') && perm_is_allowed($conv->get_profile_owner(),'','post_comments')) ? true : false), + '$anonname' => [ 'anonname', t('Your full name (required)') ], + '$anonmail' => [ 'anonmail', t('Your email address (required)') ], + '$anonurl' => [ 'anonurl', t('Your website URL (optional)') ] )); return $comment_box; diff --git a/Zotlabs/Lib/ThreadStream.php b/Zotlabs/Lib/ThreadStream.php index 35ccf4fdb..436723f8c 100644 --- a/Zotlabs/Lib/ThreadStream.php +++ b/Zotlabs/Lib/ThreadStream.php @@ -22,15 +22,17 @@ class ThreadStream { private $profile_owner = 0; private $preview = false; private $prepared_item = ''; + public $reload = ''; private $cipher = 'aes256'; // $prepared_item is for use by alternate conversation structures such as photos // wherein we've already prepared a top level item which doesn't look anything like // a normal "post" item - public function __construct($mode, $preview, $prepared_item = '') { + public function __construct($mode, $preview, $uploadable, $prepared_item = '') { $this->set_mode($mode); $this->preview = $preview; + $this->uploadable = $uploadable; $this->prepared_item = $prepared_item; $c = ((local_channel()) ? get_pconfig(local_channel(),'system','default_cipher') : ''); if($c) @@ -56,11 +58,17 @@ class ThreadStream { $this->profile_owner = \App::$profile['profile_uid']; $this->writable = perm_is_allowed($this->profile_owner,$ob_hash,'post_comments'); break; + case 'cards': + $this->profile_owner = \App::$profile['profile_uid']; + $this->writable = perm_is_allowed($this->profile_owner,$ob_hash,'post_comments'); + $this->reload = $_SESSION['return_url']; + break; case 'display': // in this mode we set profile_owner after initialisation (from conversation()) and then // pull some trickery which allows us to re-invoke this function afterward // it's an ugly hack so @FIXME $this->writable = perm_is_allowed($this->profile_owner,$ob_hash,'post_comments'); + $this->uploadable = perm_is_allowed($this->profile_owner,$ob_hash,'write_storage'); break; case 'page': $this->profile_owner = \App::$profile['uid']; @@ -92,6 +100,11 @@ class ThreadStream { return $this->commentable; } + public function is_uploadable() { + return $this->uploadable; + } + + /** * Check if page is a preview */ diff --git a/Zotlabs/Module/Acl.php b/Zotlabs/Module/Acl.php index 83fafbdff..e164875e8 100644 --- a/Zotlabs/Module/Acl.php +++ b/Zotlabs/Module/Acl.php @@ -21,7 +21,7 @@ class Acl extends \Zotlabs\Web\Controller { function init() { - // logger('mod_acl: ' . print_r($_REQUEST,true)); + logger('mod_acl: ' . print_r($_REQUEST,true)); $start = (x($_REQUEST,'start') ? $_REQUEST['start'] : 0); $count = (x($_REQUEST,'count') ? $_REQUEST['count'] : 500); @@ -33,6 +33,7 @@ class Acl extends \Zotlabs\Web\Controller { // $type = // '' => standard ACL request // 'g' => Groups only ACL request + // 'f' => forums only ACL request // 'c' => Connections only ACL request or editor (textarea) mention request // $_REQUEST['search'] contains ACL search text. @@ -56,12 +57,12 @@ class Acl extends \Zotlabs\Web\Controller { $search = $_REQUEST['query']; } - if( (! local_channel()) && (! ($type == 'x' || $type == 'c'))) + if( (! local_channel()) && (! in_array($type, [ 'x', 'c', 'f' ]))) killme(); $permitted = []; - if(in_array($type, [ 'm', 'a', 'c' ])) { + if(in_array($type, [ 'm', 'a', 'c', 'f' ])) { // These queries require permission checking. We'll create a simple array of xchan_hash for those with // the requisite permissions which we can check against. @@ -154,7 +155,7 @@ class Acl extends \Zotlabs\Web\Controller { } } - if($type == '' || $type == 'c') { + if($type == '' || $type == 'c' || $type === 'f') { $extra_channels_sql = ''; @@ -307,7 +308,7 @@ class Acl extends \Zotlabs\Web\Controller { $contacts[] = array( "photo" => $g['photo'], "name" => $g['name'], - "nick" => $g['address'], + "nick" => $g['address'] ); } } @@ -324,18 +325,24 @@ class Acl extends \Zotlabs\Web\Controller { $r = array(); if($r) { - foreach($r as $g){ + foreach($r as $g) { - // remove RSS feeds from ACLs - they are inaccessible - if(strpos($g['hash'],'/') && $type != 'a') + if(($g['network'] === 'rss') && ($type != 'a')) continue; - - if(in_array($g['hash'],$permitted) && $type == 'c' && (! $noforums)) { + + $g['hash'] = urlencode($g['hash']); + + if(! $g['nick']) { + $t = explode(' ',strtolower($g['name'])); + $g['nick'] = $t[0] . '@'; + } + + if(in_array($g['hash'],$permitted) && in_array($type, [ 'c', 'f' ]) && (! $noforums)) { $contacts[] = array( "type" => "c", "photo" => "images/twopeople.png", - "name" => $g['name'] . '+', - "id" => $g['id'] . '+', + "name" => $g['name'] . (($type === 'f') ? '' : '+'), + "id" => urlencode($g['id']) . (($type === 'f') ? '' : '+'), "xid" => $g['hash'], "link" => $g['nick'], "nick" => substr($g['nick'],0,strpos($g['nick'],'@')), @@ -344,18 +351,20 @@ class Acl extends \Zotlabs\Web\Controller { "label" => t('network') ); } - $contacts[] = array( - "type" => "c", - "photo" => $g['micro'], - "name" => $g['name'], - "id" => $g['id'], - "xid" => $g['hash'], - "link" => $g['nick'], - "nick" => (($g['nick']) ? substr($g['nick'],0,strpos($g['nick'],'@')) : t('RSS')), - "self" => (intval($g['abook_self']) ? 'abook-self' : ''), - "taggable" => '', - "label" => '', - ); + if($type !== 'f') { + $contacts[] = array( + "type" => "c", + "photo" => $g['micro'], + "name" => $g['name'], + "id" => urlencode($g['id']), + "xid" => $g['hash'], + "link" => $g['nick'], + "nick" => (($g['nick']) ? substr($g['nick'],0,strpos($g['nick'],'@')) : $g['nick']), + "self" => (intval($g['abook_self']) ? 'abook-self' : ''), + "taggable" => '', + "label" => '', + ); + } } } diff --git a/Zotlabs/Module/Admin/Site.php b/Zotlabs/Module/Admin/Site.php index 4c5b82e78..d3d058c53 100644 --- a/Zotlabs/Module/Admin/Site.php +++ b/Zotlabs/Module/Admin/Site.php @@ -62,6 +62,7 @@ class Site { $feed_contacts = ((x($_POST,'feed_contacts')) ? intval($_POST['feed_contacts']) : 0); $verify_email = ((x($_POST,'verify_email')) ? 1 : 0); $techlevel_lock = ((x($_POST,'techlock')) ? intval($_POST['techlock']) : 0); + $imagick_path = ((x($_POST,'imagick_path')) ? trim($_POST['imagick_path']) : ''); $techlevel = null; if(array_key_exists('techlevel', $_POST)) @@ -82,6 +83,7 @@ class Site { set_config('system', 'reply_address', $reply_address); set_config('system', 'from_email', $from_email); set_config('system', 'from_email_name' , $from_email_name); + set_config('system', 'imagick_convert_path' , $imagick_path); set_config('system', 'techlevel_lock', $techlevel_lock); @@ -206,7 +208,7 @@ class Site { // directory server should not be set or settable unless we are a directory client if($dirmode == DIRECTORY_MODE_NORMAL) { - $x = q("select site_url from site where site_flags in (%d,%d) and site_realm = '%s'", + $x = q("select site_url from site where site_flags in (%d,%d) and site_realm = '%s' and site_dead = 0", intval(DIRECTORY_MODE_SECONDARY), intval(DIRECTORY_MODE_PRIMARY), dbesc($realm) @@ -317,6 +319,7 @@ class Site { '$delivery_interval' => array('delivery_interval', t("Delivery interval"), (x(get_config('system','delivery_interval'))?get_config('system','delivery_interval'):2), t("Delay background delivery processes by this many seconds to reduce system load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 for large dedicated servers.")), '$delivery_batch_count' => array('delivery_batch_count', t('Deliveries per process'),(x(get_config('system','delivery_batch_count'))?get_config('system','delivery_batch_count'):1), t("Number of deliveries to attempt in a single operating system process. Adjust if necessary to tune system performance. Recommend: 1-5.")), '$poll_interval' => array('poll_interval', t("Poll interval"), (x(get_config('system','poll_interval'))?get_config('system','poll_interval'):2), t("Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval.")), + '$imagick_path' => array('imagick_path', t("Path to ImageMagick convert program"), get_config('system','imagick_convert_path'), t("If set, use this program to generate photo thumbnails for huge images ( > 4000 pixels in either dimension), otherwise memory exhaustion may occur. Example: /usr/bin/convert")), '$maxloadavg' => array('maxloadavg', t("Maximum Load Average"), ((intval(get_config('system','maxloadavg')) > 0)?get_config('system','maxloadavg'):50), t("Maximum system load before delivery and poll processes are deferred - default 50.")), '$default_expire_days' => array('default_expire_days', t('Expiration period in days for imported (grid/network) content'), intval(get_config('system','default_expire_days')), t('0 for no expiration of imported content')), '$form_security_token' => get_form_security_token("admin_site"), diff --git a/Zotlabs/Module/Ap_probe.php b/Zotlabs/Module/Ap_probe.php deleted file mode 100644 index 769cd4c4e..000000000 --- a/Zotlabs/Module/Ap_probe.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php -namespace Zotlabs\Module; - -require_once('include/zot.php'); - - -class Ap_probe extends \Zotlabs\Web\Controller { - - function get() { - - $o .= '<h3>ActivityPub Probe Diagnostic</h3>'; - - $o .= '<form action="ap_probe" method="get">'; - $o .= 'Lookup URI: <input type="text" style="width: 250px;" name="addr" value="' . $_GET['addr'] .'" /><br>'; - $o .= 'Request Signed version: <input type=checkbox name="magenv" value="1" ><br>'; - $o .= '<input type="submit" name="submit" value="Submit" /></form>'; - - $o .= '<br /><br />'; - - if(x($_GET,'addr')) { - $addr = $_GET['addr']; - - if($_GET['magenv']) { - $headers = 'Accept: application/magic-envelope+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams"'; - } - else { - $headers = 'Accept: application/ld+json; profile="https://www.w3.org/ns/activitystreams"'; - } - - $redirects = 0; - $x = z_fetch_url($addr,true,$redirects, [ 'headers' => [ $headers ]]); - if($x['success']) - $o .= '<pre>' . str_replace(['\\n','\\'],["\n",''],jindent($x['body'])) . '</pre>'; - } - return $o; - } - -} diff --git a/Zotlabs/Module/Apporder.php b/Zotlabs/Module/Apporder.php index 1097a01eb..956548d1f 100644 --- a/Zotlabs/Module/Apporder.php +++ b/Zotlabs/Module/Apporder.php @@ -11,30 +11,35 @@ class Apporder extends \Zotlabs\Web\Controller { } function get() { - $syslist = array(); - $list = Zlib\Apps::app_list(local_channel(), false, 'nav_featured_app'); - if($list) { - foreach($list as $li) { - $syslist[] = Zlib\Apps::app_encode($li); - } - } - Zlib\Apps::translate_system_apps($syslist); - usort($syslist,'Zotlabs\\Lib\\Apps::app_name_compare'); + if(! local_channel()) + return; - $syslist = Zlib\Apps::app_order(local_channel(),$syslist); + nav_set_selected('Order Apps'); - foreach($syslist as $app) { - $nav_apps[] = Zlib\Apps::app_render($app,'nav-order'); + $syslist = array(); + $list = Zlib\Apps::app_list(local_channel(), false, 'nav_featured_app'); + if($list) { + foreach($list as $li) { + $syslist[] = Zlib\Apps::app_encode($li); + } + } + Zlib\Apps::translate_system_apps($syslist); + + usort($syslist,'Zotlabs\\Lib\\Apps::app_name_compare'); + + $syslist = Zlib\Apps::app_order(local_channel(),$syslist); + foreach($syslist as $app) { + $nav_apps[] = Zlib\Apps::app_render($app,'nav-order'); } - return replace_macros(get_markup_template('apporder.tpl'), - [ - '$header' => t('Change Order of Navigation Apps'), - '$desc' => t('Use arrows to move the corresponding app up or down in the display list'), - '$nav_apps' => $nav_apps - ] - ); + return replace_macros(get_markup_template('apporder.tpl'), + [ + '$header' => t('Change Order of Navigation Apps'), + '$desc' => t('Use arrows to move the corresponding app up or down in the display list'), + '$nav_apps' => $nav_apps + ] + ); } } diff --git a/Zotlabs/Module/Apps.php b/Zotlabs/Module/Apps.php index 261615997..2f61f2932 100644 --- a/Zotlabs/Module/Apps.php +++ b/Zotlabs/Module/Apps.php @@ -7,6 +7,8 @@ use \Zotlabs\Lib as Zlib; class Apps extends \Zotlabs\Web\Controller { function get() { + + nav_set_selected('Apps'); if(argc() == 2 && argv(1) == 'edit') $mode = 'edit'; diff --git a/Zotlabs/Module/Attach.php b/Zotlabs/Module/Attach.php index 94f46978a..490d5edd0 100644 --- a/Zotlabs/Module/Attach.php +++ b/Zotlabs/Module/Attach.php @@ -31,7 +31,7 @@ class Attach extends \Zotlabs\Web\Controller { $unsafe_types = array('text/html','text/css','application/javascript'); - if(in_array($r['data']['filetype'],$unsafe_types)) { + if(in_array($r['data']['filetype'],$unsafe_types) && (! channel_codeallowed($r['data']['uid']))) { header('Content-type: text/plain'); } else { diff --git a/Zotlabs/Module/Bookmarks.php b/Zotlabs/Module/Bookmarks.php index e62f5ce96..e147ffe6c 100644 --- a/Zotlabs/Module/Bookmarks.php +++ b/Zotlabs/Module/Bookmarks.php @@ -8,7 +8,7 @@ class Bookmarks extends \Zotlabs\Web\Controller { if(! local_channel()) return; - nav_set_selected(t('View Bookmarks')); + nav_set_selected('View Bookmarks'); $item_id = intval($_REQUEST['item']); $burl = trim($_REQUEST['burl']); diff --git a/Zotlabs/Module/Card_edit.php b/Zotlabs/Module/Card_edit.php new file mode 100644 index 000000000..7cc563fd2 --- /dev/null +++ b/Zotlabs/Module/Card_edit.php @@ -0,0 +1,138 @@ +<?php +namespace Zotlabs\Module; + +require_once('include/channel.php'); +require_once('include/acl_selectors.php'); +require_once('include/conversation.php'); + +class Card_edit extends \Zotlabs\Web\Controller { + + + function get() { + + // Figure out which post we're editing + $post_id = ((argc() > 1) ? intval(argv(1)) : 0); + + if(! $post_id) { + notice( t('Item not found') . EOL); + return; + } + + $itm = q("SELECT * FROM item WHERE id = %d and item_type = %d LIMIT 1", + intval($post_id), + intval(ITEM_TYPE_CARD) + ); + if($itm) { + $item_id = q("select * from iconfig where cat = 'system' and k = 'CARD' and iid = %d limit 1", + intval($itm[0]['id']) + ); + if($item_id) + $card_title = $item_id[0]['v']; + } + else { + notice( t('Item not found') . EOL); + return; + } + + $owner = $itm[0]['uid']; + $uid = local_channel(); + + $observer = \App::get_observer(); + + $channel = channelx_by_n($owner); + if(! $channel) { + notice( t('Channel not found.') . EOL); + return; + } + + $ob_hash = (($observer) ? $observer['xchan_hash'] : ''); + + if(! perm_is_allowed($owner,$ob_hash,'write_pages')) { + notice( t('Permission denied.') . EOL); + return; + } + + $is_owner = (($uid && $uid == $owner) ? true : false); + + $o = ''; + + + + $category = ''; + $catsenabled = ((feature_enabled($owner,'categories')) ? 'categories' : ''); + + if ($catsenabled){ + $itm = fetch_post_tags($itm); + + $cats = get_terms_oftype($itm[0]['term'], TERM_CATEGORY); + + foreach ($cats as $cat) { + if (strlen($category)) + $category .= ', '; + $category .= $cat['term']; + } + } + + if($itm[0]['attach']) { + $j = json_decode($itm[0]['attach'],true); + if($j) { + foreach($j as $jj) { + $itm[0]['body'] .= "\n" . '[attachment]' . basename($jj['href']) . ',' . $jj['revision'] . '[/attachment]' . "\n"; + } + } + } + + + $mimetype = $itm[0]['mimetype']; + + $content = $itm[0]['body']; + + + + $rp = 'cards/' . $channel['channel_address']; + + $x = array( + 'nickname' => $channel['channel_address'], + 'bbco_autocomplete'=> 'bbcode', + 'return_path' => $rp, + 'webpage' => ITEM_TYPE_CARD, + 'button' => t('Edit'), + 'writefiles' => perm_is_allowed($owner, get_observer_hash(), 'write_pages'), + 'weblink' => t('Insert web link'), + 'hide_voting' => false, + 'hide_future' => false, + 'hide_location' => false, + 'hide_expire' => false, + 'showacl' => true, + 'acl' => populate_acl($itm[0],false,\Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_pages')), + 'permissions' => $itm[0], + 'lockstate' => (($itm[0]['allow_cid'] || $itm[0]['allow_gid'] || $itm[0]['deny_cid'] || $itm[0]['deny_gid']) ? 'lock' : 'unlock'), + 'ptyp' => $itm[0]['type'], + 'mimeselect' => false, + 'mimetype' => $itm[0]['mimetype'], + 'body' => undo_post_tagging($content), + 'post_id' => $post_id, + 'visitor' => true, + 'title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'), + 'placeholdertitle' => t('Title (optional)'), + 'pagetitle' => $card_title, + 'profile_uid' => (intval($channel['channel_id'])), + 'catsenabled' => $catsenabled, + 'category' => $category, + 'bbcode' => (($mimetype == 'text/bbcode') ? true : false) + ); + + $editor = status_editor($a, $x); + + $o .= replace_macros(get_markup_template('edpost_head.tpl'), array( + '$title' => t('Edit Card'), + '$delete' => ((($itm[0]['author_xchan'] === $ob_hash) || ($itm[0]['owner_xchan'] === $ob_hash)) ? t('Delete') : false), + '$id' => $itm[0]['id'], + '$editor' => $editor + )); + + return $o; + + } + +} diff --git a/Zotlabs/Module/Cards.php b/Zotlabs/Module/Cards.php new file mode 100644 index 000000000..22c5d673c --- /dev/null +++ b/Zotlabs/Module/Cards.php @@ -0,0 +1,187 @@ +<?php +namespace Zotlabs\Module; + +require_once('include/channel.php'); +require_once('include/conversation.php'); +require_once('include/acl_selectors.php'); + + +class Cards extends \Zotlabs\Web\Controller { + + function init() { + + if(argc() > 1) + $which = argv(1); + else + return; + + profile_load($which); + + } + + function get($update = 0, $load = false) { + + if(observer_prohibited(true)) { + return login(); + } + + if(! \App::$profile) { + notice( t('Requested profile is not available.') . EOL ); + \App::$error = 404; + return; + } + + if(! feature_enabled(\App::$profile_uid,'cards')) { + return; + } + + nav_set_selected(t('Cards')); + + head_add_link([ + 'rel' => 'alternate', + 'type' => 'application/json+oembed', + 'href' => z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$query_string), + 'title' => 'oembed' + ]); + + + $category = (($_REQUEST['cat']) ? escape_tags(trim($_REQUEST['cat'])) : ''); + + if($category) { + $sql_extra2 .= protect_sprintf(term_item_parent_query(\App::$profile['profile_uid'],'item', $category, TERM_CATEGORY)); + } + + + $which = argv(1); + + $selected_card = ((argc() > 2) ? argv(2) : ''); + + $_SESSION['return_url'] = \App::$query_string; + + $uid = local_channel(); + $owner = \App::$profile_uid; + $observer = \App::get_observer(); + + $ob_hash = (($observer) ? $observer['xchan_hash'] : ''); + + if(! perm_is_allowed($owner,$ob_hash,'view_pages')) { + notice( t('Permission denied.') . EOL); + return; + } + + $is_owner = ($uid && $uid == $owner); + + $channel = channelx_by_n($owner); + + if($channel) { + $channel_acl = array( + 'allow_cid' => $channel['channel_allow_cid'], + 'allow_gid' => $channel['channel_allow_gid'], + 'deny_cid' => $channel['channel_deny_cid'], + 'deny_gid' => $channel['channel_deny_gid'] + ); + } + else { + $channel_acl = [ 'allow_cid' => '', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '' ]; + } + + + + if(perm_is_allowed($owner,$ob_hash,'write_pages')) { + + $x = [ + 'webpage' => ITEM_TYPE_CARD, + 'is_owner' => true, + 'content_label' => t('Add Card'), + 'button' => t('Create'), + 'nickname' => $channel['channel_address'], + 'lockstate' => (($channel['channel_allow_cid'] || $channel['channel_allow_gid'] + || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'), + 'acl' => (($is_owner) ? populate_acl($channel_acl, false, + \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_pages')) : ''), + 'permissions' => $channel_acl, + 'showacl' => (($is_owner) ? true : false), + 'visitor' => true, + 'hide_location' => false, + 'hide_voting' => false, + 'profile_uid' => intval($owner), + 'mimetype' => 'text/bbcode', + 'mimeselect' => false, + 'layoutselect' => false, + 'expanded' => false, + 'novoting' => false, + 'catsenabled' => feature_enabled($owner,'categories'), + 'bbco_autocomplete' => 'bbcode', + 'bbcode' => true + ]; + + if($_REQUEST['title']) + $x['title'] = $_REQUEST['title']; + if($_REQUEST['body']) + $x['body'] = $_REQUEST['body']; + $editor = status_editor($a,$x); + + } + else { + $editor = ''; + } + + + $sql_extra = item_permissions_sql($owner); + + if($selected_card) { + $r = q("select * from iconfig where iconfig.cat = 'system' and iconfig.k = 'CARD' and iconfig.v = '%s' limit 1", + dbesc($selected_card) + ); + if($r) { + $sql_extra .= "and item.id = " . intval($r[0]['iid']) . " "; + } + } + + $r = q("select * from item + where item.uid = %d and item_type = %d + $sql_extra order by item.created desc", + intval($owner), + intval(ITEM_TYPE_CARD) + ); + + $item_normal = " and item.item_hidden = 0 and item.item_type in (0,6) and item.item_deleted = 0 + and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_pending_remove = 0 + and item.item_blocked = 0 "; + + if($r) { + + $parents_str = ids_to_querystr($r,'id'); + + $items = q("SELECT item.*, item.id AS item_id + FROM item + WHERE item.uid = %d $item_normal + AND item.parent IN ( %s ) + $sql_extra $sql_extra2 ", + intval(\App::$profile['profile_uid']), + dbesc($parents_str) + ); + if($items) { + xchan_query($items); + $items = fetch_post_tags($items, true); + $items = conv_sort($items,'updated'); + } + else + $items = []; + } + + $mode = 'cards'; + + $content = conversation($items,$mode,false,'traditional'); + + $o = replace_macros(get_markup_template('cards.tpl'), [ + '$title' => t('Cards'), + '$editor' => $editor, + '$content' => $content, + '$pager' => alt_pager($a,count($items)) + ]); + + return $o; + } + +} diff --git a/Zotlabs/Module/Cdav.php b/Zotlabs/Module/Cdav.php index d0619ef0b..77052f97c 100644 --- a/Zotlabs/Module/Cdav.php +++ b/Zotlabs/Module/Cdav.php @@ -3,31 +3,81 @@ namespace Zotlabs\Module; require_once('include/event.php'); +require_once('include/auth.php'); +require_once('include/security.php'); + class Cdav extends \Zotlabs\Web\Controller { function init() { + $record = null; + $channel_login = false; + if((argv(1) !== 'calendar') && (argv(1) !== 'addressbook')) { - // workaround for HTTP-auth in CGI mode - if (x($_SERVER, 'REDIRECT_REMOTE_USER')) { - $userpass = base64_decode(substr($_SERVER["REDIRECT_REMOTE_USER"], 6)) ; - if(strlen($userpass)) { - list($name, $password) = explode(':', $userpass); - $_SERVER['PHP_AUTH_USER'] = $name; - $_SERVER['PHP_AUTH_PW'] = $password; + foreach([ 'REDIRECT_REMOTE_USER', 'HTTP_AUTHORIZATION' ] as $head) { + + /* Basic authentication */ + + if(array_key_exists($head,$_SERVER) && substr(trim($_SERVER[$head]),0,5) === 'Basic') { + $userpass = @base64_decode(substr(trim($_SERVER[$head]),6)) ; + if(strlen($userpass)) { + list($name, $password) = explode(':', $userpass); + $_SERVER['PHP_AUTH_USER'] = $name; + $_SERVER['PHP_AUTH_PW'] = $password; + } + break; } - } - if (x($_SERVER, 'HTTP_AUTHORIZATION')) { - $userpass = base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"], 6)) ; - if(strlen($userpass)) { - list($name, $password) = explode(':', $userpass); - $_SERVER['PHP_AUTH_USER'] = $name; - $_SERVER['PHP_AUTH_PW'] = $password; + /* Signature authentication */ + + if(array_key_exists($head,$_SERVER) && substr(trim($_SERVER[$head]),0,9) === 'Signature') { + if($head !== 'HTTP_AUTHORIZATION') { + $_SERVER['HTTP_AUTHORIZATION'] = $_SERVER[$head]; + continue; + } + + $sigblock = \Zotlabs\Web\HTTPSig::parse_sigheader($_SERVER[$head]); + if($sigblock) { + $keyId = $sigblock['keyId']; + if($keyId) { + $r = q("select * from hubloc where hubloc_addr = '%s' limit 1", + dbesc($keyId) + ); + if($r) { + $c = channelx_by_hash($r[0]['hubloc_hash']); + if($c) { + $a = q("select * from account where account_id = %d limit 1", + intval($c['channel_account_id']) + ); + if($a) { + $record = [ 'channel' => $c, 'account' => $a[0] ]; + $channel_login = $c['channel_id']; + } + } + } + if(! $record) + continue; + + if($record) { + $verified = \Zotlabs\Web\HTTPSig::verify('',$record['channel']['channel_pubkey']); + if(! ($verified && $verified['header_signed'] && $verified['header_valid'])) { + $record = null; + } + if($record['account']) { + authenticate_success($record['account']); + if($channel_login) { + change_channel($channel_login); + } + } + break; + } + } + } } } + /** * This server combines both CardDAV and CalDAV functionality into a single * server. It is assumed that the server runs at the root of a HTTP domain (be @@ -774,7 +824,7 @@ class Cdav extends \Zotlabs\Web\Controller { } if(argv(1) === 'calendar') { - nav_set_selected(t('CalDAV')); + nav_set_selected('CalDAV'); $caldavBackend = new \Sabre\CalDAV\Backend\PDO($pdo); $calendars = $caldavBackend->getCalendarsForUser($principalUri); } @@ -975,7 +1025,7 @@ class Cdav extends \Zotlabs\Web\Controller { if(argv(1) === 'addressbook') { - nav_set_selected(t('CardDAV')); + nav_set_selected('CardDAV'); $carddavBackend = new \Sabre\CardDAV\Backend\PDO($pdo); $addressbooks = $carddavBackend->getAddressBooksForUser($principalUri); } diff --git a/Zotlabs/Module/Changeaddr.php b/Zotlabs/Module/Changeaddr.php new file mode 100644 index 000000000..5cd236394 --- /dev/null +++ b/Zotlabs/Module/Changeaddr.php @@ -0,0 +1,88 @@ +<?php +namespace Zotlabs\Module; + + +class Changeaddr extends \Zotlabs\Web\Controller { + + function post() { + + if(! local_channel()) + return; + + if($_SESSION['delegate']) + return; + + if((! x($_POST,'qxz_password')) || (! strlen(trim($_POST['qxz_password'])))) + return; + + if((! x($_POST,'verify')) || (! strlen(trim($_POST['verify'])))) + return; + + if($_POST['verify'] !== $_SESSION['remove_account_verify']) + return; + + + $account = \App::get_account(); + $channel = \App::get_channel(); + + $x = account_verify_password($account['account_email'],$_POST['qxz_password']); + if(! ($x && $x['account'])) + return; + + if($account['account_password_changed'] > NULL_DATE) { + $d1 = datetime_convert('UTC','UTC','now - 48 hours'); + if($account['account_password_changed'] > d1) { + notice( t('Channel name changes are not allowed within 48 hours of changing the account password.') . EOL); + return; + } + } + + $new_address = trim($_POST['newname']); + + if($new_address === $channel['channel_address']) + return; + + if($new_address === 'sys') { + notice( t('Reserved nickname. Please choose another.') . EOL); + return; + } + + if(check_webbie(array($new_address)) !== $new_address) { + notice( t('Nickname has unsupported characters or is already being used on this site.') . EOL); + return $ret; + } + + channel_change_address($channel,$new_address); + + goaway(z_root() . '/changeaddr'); + + } + + + function get() { + + if(! local_channel()) + goaway(z_root()); + + $channel = \App::get_channel(); + + $hash = random_string(); + + $_SESSION['remove_account_verify'] = $hash; + + $tpl = get_markup_template('channel_rename.tpl'); + $o .= replace_macros($tpl, array( + '$basedir' => z_root(), + '$hash' => $hash, + '$title' => t('Change channel nickname/address'), + '$desc' => array(t('WARNING: '), t('Any/all connections on other networks will be lost!')), + '$passwd' => t('Please enter your password for verification:'), + '$newname' => array('newname', t('New channel address'),$channel['channel_address'], ''), + '$submit' => t('Rename Channel') + )); + + return $o; + + } + +} diff --git a/Zotlabs/Module/Channel.php b/Zotlabs/Module/Channel.php index a44984c97..14d02d873 100644 --- a/Zotlabs/Module/Channel.php +++ b/Zotlabs/Module/Channel.php @@ -92,11 +92,6 @@ class Channel extends \Zotlabs\Web\Controller { // Ensure we've got a profile owner if updating. \App::$profile['profile_uid'] = \App::$profile_uid = $update; } - else { - if(\App::$profile['profile_uid'] == local_channel()) { - nav_set_selected(t('Channel Home')); - } - } $is_owner = (((local_channel()) && (\App::$profile['profile_uid'] == local_channel())) ? true : false); @@ -119,11 +114,13 @@ class Channel extends \Zotlabs\Web\Controller { if(! $update) { + nav_set_selected('Channel Home'); + $static = channel_manual_conv_update(\App::$profile['profile_uid']); //$o .= profile_tabs($a, $is_owner, \App::$profile['channel_address']); - $o .= common_friends_visitor_widget(\App::$profile['profile_uid']); + // $o .= common_friends_visitor_widget(\App::$profile['profile_uid']); if($channel && $is_owner) { $channel_acl = array( @@ -169,6 +166,7 @@ class Channel extends \Zotlabs\Web\Controller { */ $item_normal = item_normal(); + $item_normal_update = item_normal_update(); $sql_extra = item_permissions_sql(\App::$profile['profile_uid']); if(get_pconfig(\App::$profile['profile_uid'],'system','channel_list_mode') && (! $mid)) @@ -180,7 +178,12 @@ class Channel extends \Zotlabs\Web\Controller { $simple_update = (($update) ? " AND item_unseen = 1 " : ''); - \App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$query_string) . '" title="oembed" />' . "\r\n"; + head_add_link([ + 'rel' => 'alternate', + 'type' => 'application/json+oembed', + 'href' => z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$query_string), + 'title' => 'oembed' + ]); if($update && $_SESSION['loadtime']) $simple_update = " AND (( item_unseen = 1 AND item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) OR item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) "; @@ -188,12 +191,12 @@ class Channel extends \Zotlabs\Web\Controller { $simple_update = ''; if($static && $simple_update) - $simple_update .= " and item_thread_top = 0 and author_xchan = '" . protect_sprintf(get_observer_hash()) . "' "; + $simple_update .= " and author_xchan = '" . protect_sprintf(get_observer_hash()) . "' "; if(($update) && (! $load)) { if($mid) { - $r = q("SELECT parent AS item_id from item where mid like '%s' and uid = %d $item_normal + $r = q("SELECT parent AS item_id from item where mid like '%s' and uid = %d $item_normal_update AND item_wall = 1 $simple_update $sql_extra limit 1", dbesc($mid . '%'), intval(\App::$profile['profile_uid']) @@ -203,7 +206,7 @@ class Channel extends \Zotlabs\Web\Controller { else { $r = q("SELECT distinct parent AS item_id, created from item left join abook on ( item.owner_xchan = abook.abook_xchan $abook_uids ) - WHERE uid = %d $item_normal + WHERE uid = %d $item_normal_update AND item_wall = 1 $simple_update AND (abook.abook_blocked = 0 or abook.abook_flags is null) $sql_extra @@ -236,7 +239,7 @@ class Channel extends \Zotlabs\Web\Controller { if($load || ($checkjs->disabled())) { if($mid) { - $r = q("SELECT parent AS item_id from item where mid like '%s' and uid = %d $item_normal + $r = q("SELECT distinct parent AS item_id from item where mid like '%s' and uid = %d $item_normal AND item_wall = 1 $sql_extra limit 1", dbesc($mid . '%'), intval(\App::$profile['profile_uid']) @@ -358,9 +361,13 @@ class Channel extends \Zotlabs\Web\Controller { } if($is_owner && $update_unseen) { - $r = q("UPDATE item SET item_unseen = 0 where item_unseen = 1 and item_wall = 1 AND uid = %d $update_unseen", - intval(local_channel()) - ); + $x = [ 'channel_id' => local_channel(), 'update' => 'unset' ]; + call_hooks('update_unseen',$x); + if($x['update'] === 'unset' || intval($x['update'])) { + $r = q("UPDATE item SET item_unseen = 0 where item_unseen = 1 and item_wall = 1 AND uid = %d $update_unseen", + intval(local_channel()) + ); + } } diff --git a/Zotlabs/Module/Chat.php b/Zotlabs/Module/Chat.php index 138ca1cb5..378c9f4dd 100644 --- a/Zotlabs/Module/Chat.php +++ b/Zotlabs/Module/Chat.php @@ -91,7 +91,7 @@ class Chat extends \Zotlabs\Web\Controller { if(local_channel()) { $channel = \App::get_channel(); - nav_set_selected(t('My Chatrooms')); + nav_set_selected('My Chatrooms'); } $ob = \App::get_observer(); diff --git a/Zotlabs/Module/Common.php b/Zotlabs/Module/Common.php index 2f3c57267..eebc56d2b 100644 --- a/Zotlabs/Module/Common.php +++ b/Zotlabs/Module/Common.php @@ -25,7 +25,7 @@ class Common extends \Zotlabs\Web\Controller { } - function get() { + function get() { $o = ''; @@ -34,38 +34,37 @@ class Common extends \Zotlabs\Web\Controller { $observer_hash = get_observer_hash(); - if(! perm_is_allowed(\App::$profile['profile_uid'],$observer_hash,'view_contacts')) { notice( t('Permission denied.') . EOL); return; } - $o .= '<h2>' . t('Common connections') . '</h2>'; - $t = count_common_friends(\App::$profile['profile_uid'],$observer_hash); if(! $t) { notice( t('No connections in common.') . EOL); - return $o; + return; } $r = common_friends(\App::$profile['profile_uid'],$observer_hash); if($r) { - - $tpl = get_markup_template('common_friends.tpl'); - foreach($r as $rr) { - $o .= replace_macros($tpl,array( - '$url' => $rr['xchan_url'], - '$name' => $rr['xchan_name'], - '$photo' => $rr['xchan_photo_m'], - '$tags' => '' - )); + $items[] = [ + 'url' => $rr['xchan_url'], + 'name' => $rr['xchan_name'], + 'photo' => $rr['xchan_photo_m'], + 'tags' => '' + ]; } - - $o .= cleardiv(); } + + $tpl = get_markup_template('common_friends.tpl'); + + $o = replace_macros($tpl, [ + '$title' => t('View Common Connections'), + '$items' => $items + ]); return $o; } diff --git a/Zotlabs/Module/Connections.php b/Zotlabs/Module/Connections.php index 6ad1e9528..f42ff9b84 100644 --- a/Zotlabs/Module/Connections.php +++ b/Zotlabs/Module/Connections.php @@ -30,7 +30,7 @@ class Connections extends \Zotlabs\Web\Controller { return login(); } - nav_set_selected(t('Connections')); + nav_set_selected('Connections'); $blocked = false; $hidden = false; diff --git a/Zotlabs/Module/Connedit.php b/Zotlabs/Module/Connedit.php index d301c2d45..23c5282e3 100644 --- a/Zotlabs/Module/Connedit.php +++ b/Zotlabs/Module/Connedit.php @@ -248,6 +248,10 @@ class Connedit extends \Zotlabs\Web\Controller { notice( t('Failed to update connection record.') . EOL); if(! intval(\App::$poi['abook_self'])) { + if($new_friend) { + \Zotlabs\Daemon\Master::Summon( [ 'Notifier', 'permission_accept', $contact_id ] ); + } + \Zotlabs\Daemon\Master::Summon( [ 'Notifier', (($new_friend) ? 'permission_create' : 'permission_update'), @@ -841,7 +845,7 @@ class Connedit extends \Zotlabs\Web\Controller { } } else - $locstr = t('none'); + $locstr = $contact['xchan_url']; $clone_warn = ''; $clonable = (in_array($contact['xchan_network'],['zot','rss']) ? true : false); @@ -866,6 +870,7 @@ class Connedit extends \Zotlabs\Web\Controller { '$permcat_new' => t('Add permission role'), '$permcat_enable' => feature_enabled(local_channel(),'permcats'), '$addr' => $contact['xchan_addr'], + '$primeurl' => $contact['xchan_url'], '$section' => $section, '$sections' => $sections, '$vcard' => $vcard, diff --git a/Zotlabs/Module/Dav.php b/Zotlabs/Module/Dav.php index 8ae2e8991..d506fe9f5 100644 --- a/Zotlabs/Module/Dav.php +++ b/Zotlabs/Module/Dav.php @@ -12,6 +12,9 @@ use \Sabre\DAV as SDAV; use \Zotlabs\Storage; require_once('include/attach.php'); +require_once('include/auth.php'); +require_once('include/security.php'); + class Dav extends \Zotlabs\Web\Controller { @@ -21,22 +24,65 @@ class Dav extends \Zotlabs\Web\Controller { */ function init() { - // workaround for HTTP-auth in CGI mode - if (x($_SERVER, 'REDIRECT_REMOTE_USER')) { - $userpass = base64_decode(substr($_SERVER["REDIRECT_REMOTE_USER"], 6)) ; - if(strlen($userpass)) { - list($name, $password) = explode(':', $userpass); - $_SERVER['PHP_AUTH_USER'] = $name; - $_SERVER['PHP_AUTH_PW'] = $password; + foreach([ 'REDIRECT_REMOTE_USER', 'HTTP_AUTHORIZATION' ] as $head) { + + /* Basic authentication */ + + if(array_key_exists($head,$_SERVER) && substr(trim($_SERVER[$head]),0,5) === 'Basic') { + $userpass = @base64_decode(substr(trim($_SERVER[$head]),6)) ; + if(strlen($userpass)) { + list($name, $password) = explode(':', $userpass); + $_SERVER['PHP_AUTH_USER'] = $name; + $_SERVER['PHP_AUTH_PW'] = $password; + } + break; } - } - if (x($_SERVER, 'HTTP_AUTHORIZATION')) { - $userpass = base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"], 6)) ; - if(strlen($userpass)) { - list($name, $password) = explode(':', $userpass); - $_SERVER['PHP_AUTH_USER'] = $name; - $_SERVER['PHP_AUTH_PW'] = $password; + /* Signature authentication */ + + if(array_key_exists($head,$_SERVER) && substr(trim($_SERVER[$head]),0,9) === 'Signature') { + if($head !== 'HTTP_AUTHORIZATION') { + $_SERVER['HTTP_AUTHORIZATION'] = $_SERVER[$head]; + continue; + } + + $sigblock = \Zotlabs\Web\HTTPSig::parse_sigheader($_SERVER[$head]); + if($sigblock) { + $keyId = $sigblock['keyId']; + if($keyId) { + $r = q("select * from hubloc where hubloc_addr = '%s' limit 1", + dbesc($keyId) + ); + if($r) { + $c = channelx_by_hash($r[0]['hubloc_hash']); + if($c) { + $a = q("select * from account where account_id = %d limit 1", + intval($c['channel_account_id']) + ); + if($a) { + $record = [ 'channel' => $c, 'account' => $a[0] ]; + $channel_login = $c['channel_id']; + } + } + } + if(! $record) + continue; + + if($record) { + $verified = \Zotlabs\Web\HTTPSig::verify('',$record['channel']['channel_pubkey']); + if(! ($verified && $verified['header_signed'] && $verified['header_valid'])) { + $record = null; + } + if($record['account']) { + authenticate_success($record['account']); + if($channel_login) { + change_channel($channel_login); + } + } + break; + } + } + } } } diff --git a/Zotlabs/Module/Directory.php b/Zotlabs/Module/Directory.php index 6268e99c6..caf0190ae 100644 --- a/Zotlabs/Module/Directory.php +++ b/Zotlabs/Module/Directory.php @@ -77,7 +77,7 @@ class Directory extends \Zotlabs\Web\Controller { $pubforums = get_directory_setting($observer, 'pubforums'); $o = ''; - nav_set_selected(t('Directory')); + nav_set_selected('Directory'); if(x($_POST,'search')) $search = notags(trim($_POST['search'])); diff --git a/Zotlabs/Module/Display.php b/Zotlabs/Module/Display.php index df3cb1e2b..d5afdd787 100644 --- a/Zotlabs/Module/Display.php +++ b/Zotlabs/Module/Display.php @@ -17,20 +17,18 @@ class Display extends \Zotlabs\Web\Controller { if($load) $_SESSION['loadtime'] = datetime_convert(); - if(observer_prohibited()) { notice( t('Public access denied.') . EOL); return; } - if(argc() > 1 && argv(1) !== 'load') $item_hash = argv(1); if($_REQUEST['mid']) $item_hash = $_REQUEST['mid']; - if(! $item_hash) { + if(! $item_hash) { \App::$error = 404; notice( t('Item not found.') . EOL); return; @@ -38,21 +36,18 @@ class Display extends \Zotlabs\Web\Controller { $observer_is_owner = false; $updateable = false; - - + if(local_channel() && (! $update)) { $channel = \App::get_channel(); - - + $channel_acl = array( 'allow_cid' => $channel['channel_allow_cid'], 'allow_gid' => $channel['channel_allow_gid'], 'deny_cid' => $channel['channel_deny_cid'], 'deny_gid' => $channel['channel_deny_gid'] ); - - + $x = array( 'is_owner' => true, 'allow_location' => ((intval(get_pconfig($channel['channel_id'],'system','use_browser_location'))) ? '1' : ''), @@ -76,7 +71,6 @@ class Display extends \Zotlabs\Web\Controller { $o = '<div id="jot-popup">'; $o .= status_editor($a,$x); $o .= '</div>'; - } // This page can be viewed by anybody so the query could be complicated @@ -95,14 +89,18 @@ class Display extends \Zotlabs\Web\Controller { if($decoded) $item_hash = $decoded; - $r = q("select id, uid, mid, parent_mid, item_type, item_deleted from item where mid like '%s' limit 1", - dbesc($item_hash . '%'), - dbesc($decoded . '%') + $r = q("select id, uid, mid, parent_mid, thr_parent, verb, item_type, item_deleted, item_blocked from item where mid like '%s' limit 1", + dbesc($item_hash . '%') ); if($r) { $target_item = $r[0]; } + + //if the item is to be moderated redirect to /moderate + if($target_item['item_blocked'] == ITEM_MODERATED) { + goaway(z_root() . '/moderate/' . $target_item['id']); + } $r = null; @@ -138,10 +136,16 @@ class Display extends \Zotlabs\Web\Controller { $simple_update .= " and item_thread_top = 0 and author_xchan = '" . protect_sprintf(get_observer_hash()) . "' "; if((! $update) && (! $load)) { - - $static = ((local_channel()) ? channel_manual_conv_update(local_channel()) : 0); - + $static = ((local_channel()) ? channel_manual_conv_update(local_channel()) : 1); + + //if the target item is not a post (eg a like) we want to address its thread parent + $mid = ((($target_item['verb'] == ACTIVITY_LIKE) || ($target_item['verb'] == ACTIVITY_DISLIKE)) ? $target_item['thr_parent'] : $target_item['mid']); + + //if we got a decoded hash we must encode it again before handing to javascript + if($decoded) + $mid = 'b64.' . base64url_encode($mid); + $o .= '<div id="live-display"></div>' . "\r\n"; $o .= "<script> var profile_uid = " . ((intval(local_channel())) ? local_channel() : (-1)) . "; var netargs = '?f='; var profile_page = " . \App::$pager['page'] . "; </script>\r\n"; @@ -173,25 +177,31 @@ class Display extends \Zotlabs\Web\Controller { '$dend' => '', '$dbegin' => '', '$verb' => '', - '$mid' => $item_hash + '$mid' => $mid )); - - + + head_add_link([ + 'rel' => 'alternate', + 'type' => 'application/json+oembed', + 'href' => z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$query_string), + 'title' => 'oembed' + ]); + } - + $observer_hash = get_observer_hash(); $item_normal = item_normal(); - + $item_normal_update = item_normal_update(); + $sql_extra = public_permissions_sql($observer_hash); if(($update && $load) || ($checkjs->disabled())) { - - + $pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']),intval(\App::$pager['start'])); - + if($load || ($checkjs->disabled())) { $r = null; - + require_once('include/channel.php'); $sys = get_sys_channel(); $sysid = $sys['channel_id']; @@ -207,25 +217,22 @@ class Display extends \Zotlabs\Web\Controller { ); if($r) { $updateable = true; - } - } if($r === null) { - + // in case somebody turned off public access to sys channel content using permissions - // make that content unsearchable by ensuring the owner_xchan can't match - + // make that content unsearchable by ensuring the owner uid can't match + if(! perm_is_allowed($sysid,$observer_hash,'view_stream')) $sysid = 0; - - + $r = q("SELECT item.id as item_id from item WHERE mid = '%s' AND (((( item.allow_cid = '' AND item.allow_gid = '' AND item.deny_cid = '' AND item.deny_gid = '' AND item_private = 0 ) - and owner_xchan in ( " . stream_perms_xchans(($observer_hash) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " )) + and uid in ( " . stream_perms_api_uids(($observer_hash) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " )) OR uid = %d ) $sql_extra ) $item_normal @@ -233,7 +240,6 @@ class Display extends \Zotlabs\Web\Controller { dbesc($target_item['parent_mid']), intval($sysid) ); - } } } @@ -249,7 +255,7 @@ class Display extends \Zotlabs\Web\Controller { $r = q("SELECT item.parent AS item_id from item WHERE uid = %d and parent_mid = '%s' - $item_normal + $item_normal_update $simple_update limit 1", intval(local_channel()), @@ -265,15 +271,15 @@ class Display extends \Zotlabs\Web\Controller { // make that content unsearchable by ensuring the owner_xchan can't match if(! perm_is_allowed($sysid,$observer_hash,'view_stream')) $sysid = 0; - + $r = q("SELECT item.parent AS item_id from item WHERE parent_mid = '%s' AND (((( item.allow_cid = '' AND item.allow_gid = '' AND item.deny_cid = '' AND item.deny_gid = '' AND item_private = 0 ) - and owner_xchan in ( " . stream_perms_xchans(($observer_hash) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " )) + and uid in ( " . stream_perms_api_uids(($observer_hash) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " )) OR uid = %d ) $sql_extra ) - $item_normal + $item_normal_update $simple_update limit 1", dbesc($target_item['parent_mid']), @@ -288,10 +294,8 @@ class Display extends \Zotlabs\Web\Controller { } if($r) { - $parents_str = ids_to_querystr($r,'item_id'); if($parents_str) { - $items = q("SELECT item.*, item.id AS item_id FROM item WHERE parent in ( %s ) $item_normal ", @@ -302,11 +306,11 @@ class Display extends \Zotlabs\Web\Controller { $items = fetch_post_tags($items,true); $items = conv_sort($items,'created'); } - } else { + } + else { $items = array(); } - if ($checkjs->disabled()) { $o .= conversation($items, 'display', $update, 'traditional'); if ($items[0]['title']) @@ -324,17 +328,13 @@ class Display extends \Zotlabs\Web\Controller { } $o .= '<div id="content-complete"></div>'; - - return $o; - - - /* - elseif((! $update) && (! { + + if((($update && $load) || $checkjs->disabled()) && (! $items)) { - $r = q("SELECT id, item_flags FROM item WHERE id = '%s' OR mid = '%s' LIMIT 1", - dbesc($item_hash), + $r = q("SELECT id, item_deleted FROM item WHERE mid = '%s' LIMIT 1", dbesc($item_hash) ); + if($r) { if(intval($r[0]['item_deleted'])) { notice( t('Item has been removed.') . EOL ); @@ -348,8 +348,9 @@ class Display extends \Zotlabs\Web\Controller { } } - */ + + return $o; + } - - + } diff --git a/Zotlabs/Module/Events.php b/Zotlabs/Module/Events.php index 0541f5e9b..33c8b8249 100644 --- a/Zotlabs/Module/Events.php +++ b/Zotlabs/Module/Events.php @@ -272,7 +272,7 @@ class Events extends \Zotlabs\Web\Controller { return; } - nav_set_selected(t('Events')); + nav_set_selected('Events'); if((argc() > 2) && (argv(1) === 'ignore') && intval(argv(2))) { $r = q("update event set dismissed = 1 where id = %d and uid = %d", diff --git a/Zotlabs/Module/File_upload.php b/Zotlabs/Module/File_upload.php index 29a7bd137..5c4b9a502 100644 --- a/Zotlabs/Module/File_upload.php +++ b/Zotlabs/Module/File_upload.php @@ -34,10 +34,26 @@ class File_upload extends \Zotlabs\Web\Controller { $_REQUEST['deny_gid'] = perms2str($_REQUEST['group_deny']); if($_REQUEST['filename']) { - $r = attach_mkdir($channel,get_observer_hash(),$_REQUEST); + $r = attach_mkdir($channel, get_observer_hash(), $_REQUEST); + if($r['success']) { + $hash = $r['data']['hash']; + + $sync = attach_export_data($channel,$hash); + if($sync) { + build_sync_packet($channel['channel_id'],array('file' => array($sync))); + } + goaway(z_root() . '/cloud/' . $channel['channel_address'] . '/' . $r['data']['display_path']); + + } } else { - $r = attach_store($channel,get_observer_hash(), '', $_REQUEST); + $r = attach_store($channel, get_observer_hash(), '', $_REQUEST); + if($r['success']) { + $sync = attach_export_data($channel,$r['data']['hash']); + if($sync) + build_sync_packet($channel['channel_id'],array('file' => array($sync))); + + } } goaway(z_root() . '/' . $_REQUEST['return_url']); diff --git a/Zotlabs/Module/Filestorage.php b/Zotlabs/Module/Filestorage.php index d6f363e77..55713027a 100644 --- a/Zotlabs/Module/Filestorage.php +++ b/Zotlabs/Module/Filestorage.php @@ -18,7 +18,7 @@ class Filestorage extends \Zotlabs\Web\Controller { $recurse = ((x($_POST, 'recurse')) ? intval($_POST['recurse']) : 0); $resource = ((x($_POST, 'filehash')) ? notags($_POST['filehash']) : ''); - $notify = ((x($_POST, 'notify')) ? intval($_POST['notify']) : 0); + $notify = ((x($_POST, 'notify_edit')) ? intval($_POST['notify_edit']) : 0); if(! $resource) { notice(t('Item not found.') . EOL); @@ -31,16 +31,16 @@ class Filestorage extends \Zotlabs\Web\Controller { $acl->set_from_array($_POST); $x = $acl->get(); - $cloudPath = get_parent_cloudpath($channel_id, $channel['channel_address'], $resource); + $url = get_cloud_url($channel_id, $channel['channel_address'], $resource); //get the object before permissions change so we can catch eventual former allowed members - $object = get_file_activity_object($channel_id, $resource, $cloudPath); + $object = get_file_activity_object($channel_id, $resource, $url); attach_change_permissions($channel_id, $resource, $x['allow_cid'], $x['allow_gid'], $x['deny_cid'], $x['deny_gid'], $recurse, true); file_activity($channel_id, $object, $x['allow_cid'], $x['allow_gid'], $x['deny_cid'], $x['deny_gid'], 'post', $notify); - goaway($cloudPath); + goaway(dirname($url)); } function get() { @@ -99,11 +99,11 @@ class Filestorage extends \Zotlabs\Web\Controller { $f = $r[0]; $channel = \App::get_channel(); - $parentpath = get_parent_cloudpath($channel['channel_id'], $channel['channel_address'], $f['hash']); + $url = get_cloud_url($channel['channel_id'], $channel['channel_address'], $f['hash']); attach_delete($owner, $f['hash']); - goaway($parentpath); + goaway(dirname($url)); } if(argc() > 3 && argv(3) === 'edit') { @@ -123,7 +123,6 @@ class Filestorage extends \Zotlabs\Web\Controller { $channel = \App::get_channel(); $cloudpath = get_cloudpath($f); - $parentpath = get_parent_cloudpath($channel['channel_id'], $channel['channel_address'], $f['hash']); $aclselect_e = populate_acl($f, false, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_storage')); $is_a_dir = (intval($f['is_dir']) ? true : false); @@ -138,7 +137,6 @@ class Filestorage extends \Zotlabs\Web\Controller { '$header' => t('Edit file permissions'), '$file' => $f, '$cloudpath' => z_root() . '/' . $encoded_path, - '$parentpath' => $parentpath, '$uid' => $channel['channel_id'], '$channelnick' => $channel['channel_address'], '$permissions' => t('Permissions'), @@ -157,7 +155,7 @@ class Filestorage extends \Zotlabs\Web\Controller { '$submit' => t('Submit'), '$attach_btn_title' => t('Share this file'), '$link_btn_title' => t('Show URL to this file'), - '$notify' => array('notify', t('Notify your contacts about this file'), 0, '', array(t('No'), t('Yes'))), + '$notify' => array('notify_edit', t('Show in your contacts shared folder'), 0, '', array(t('No'), t('Yes'))), )); echo $o; diff --git a/Zotlabs/Module/Getfile.php b/Zotlabs/Module/Getfile.php index 0b05d78a4..413a68e0c 100644 --- a/Zotlabs/Module/Getfile.php +++ b/Zotlabs/Module/Getfile.php @@ -108,7 +108,7 @@ class Getfile extends \Zotlabs\Web\Controller { $unsafe_types = array('text/html','text/css','application/javascript'); - if(in_array($r['data']['filetype'],$unsafe_types)) { + if(in_array($r['data']['filetype'],$unsafe_types) && (! channel_codeallowed($channel['channel_id']))) { header('Content-type: text/plain'); } else { diff --git a/Zotlabs/Module/Help.php b/Zotlabs/Module/Help.php index e98cb9d4d..f1b1acaef 100644 --- a/Zotlabs/Module/Help.php +++ b/Zotlabs/Module/Help.php @@ -15,7 +15,7 @@ require_once('include/help.php'); class Help extends \Zotlabs\Web\Controller { function get() { - nav_set_selected(t('Help')); + nav_set_selected('Help'); if($_REQUEST['search']) { $o .= '<div id="help-content" class="generic-content-wrapper">'; @@ -88,12 +88,15 @@ class Help extends \Zotlabs\Web\Controller { $heading = $headings[argv(1)]; $content = get_help_content(); + + $language = determine_help_language()['language']; return replace_macros(get_markup_template('help.tpl'), array( '$title' => t('$Projectname Documentation'), '$tocHeading' => t('Contents'), '$content' => $content, - '$heading' => $heading + '$heading' => $heading, + '$language' => $language )); } diff --git a/Zotlabs/Module/Import.php b/Zotlabs/Module/Import.php index 40ce8f6d1..2b16ff4e1 100644 --- a/Zotlabs/Module/Import.php +++ b/Zotlabs/Module/Import.php @@ -278,20 +278,31 @@ class Import extends \Zotlabs\Web\Controller { create_table_from_array('xchan',$xchan); require_once('include/photo/photo_driver.php'); - $photos = import_xchan_photo($xchan['xchan_photo_l'],$xchan['xchan_hash']); - if($photos[4]) - $photodate = NULL_DATE; - else - $photodate = $xchan['xchan_photo_date']; - - $r = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s', xchan_photo_date = '%s' where xchan_hash = '%s'", - dbesc($photos[0]), - dbesc($photos[1]), - dbesc($photos[2]), - dbesc($photos[3]), - dbesc($photodate), - dbesc($xchan['xchan_hash']) - ); + + if($xchan['xchan_hash'] === $channel['channel_hash']) { + $r = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s' where xchan_hash = '%s'", + dbesc(z_root() . '/photo/profile/l/' . $channel['channel_id']), + dbesc(z_root() . '/photo/profile/m/' . $channel['channel_id']), + dbesc(z_root() . '/photo/profile/s/' . $channel['channel_id']), + dbesc($xchan['xchan_hash']) + ); + } + else { + $photos = import_xchan_photo($xchan['xchan_photo_l'],$xchan['xchan_hash']); + if($photos[4]) + $photodate = NULL_DATE; + else + $photodate = $xchan['xchan_photo_date']; + + $r = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s', xchan_photo_date = '%s' where xchan_hash = '%s'", + dbesc($photos[0]), + dbesc($photos[1]), + dbesc($photos[2]), + dbesc($photos[3]), + dbesc($photodate), + dbesc($xchan['xchan_hash']) + ); + } } logger('import step 7'); diff --git a/Zotlabs/Module/Invite.php b/Zotlabs/Module/Invite.php index bbd98150d..0bcd1c1fa 100644 --- a/Zotlabs/Module/Invite.php +++ b/Zotlabs/Module/Invite.php @@ -95,7 +95,7 @@ class Invite extends \Zotlabs\Web\Controller { return; } - nav_set_selected(t('Invite')); + nav_set_selected('Invite'); $tpl = get_markup_template('invite.tpl'); $invonly = false; diff --git a/Zotlabs/Module/Item.php b/Zotlabs/Module/Item.php index eb8b60931..9e5dcfaff 100644 --- a/Zotlabs/Module/Item.php +++ b/Zotlabs/Module/Item.php @@ -659,14 +659,23 @@ class Item extends \Zotlabs\Web\Controller { // BBCODE end alert if(strlen($categories)) { + $cats = explode(',',$categories); foreach($cats as $cat) { + + if($webpage == ITEM_TYPE_CARD) { + $catlink = z_root() . '/cards/' . $channel['channel_address'] . '?f=&cat=' . urlencode(trim($cat)); + } + else { + $catlink = $owner_xchan['xchan_url'] . '?f=&cat=' . urlencode(trim($cat)); + } + $post_tags[] = array( 'uid' => $profile_uid, 'ttype' => TERM_CATEGORY, 'otype' => TERM_OBJ_POST, 'term' => trim($cat), - 'url' => $owner_xchan['xchan_url'] . '?f=&cat=' . urlencode(trim($cat)) + 'url' => $catlink ); } } @@ -734,7 +743,9 @@ class Item extends \Zotlabs\Web\Controller { if($parent_item) $parent_mid = $parent_item['mid']; - + + + // Fallback so that we alway have a thr_parent if(!$thr_parent) @@ -744,6 +755,21 @@ class Item extends \Zotlabs\Web\Controller { $item_thread_top = ((! $parent) ? 1 : 0); + + // fix permalinks for cards + + if($webpage == ITEM_TYPE_CARD) { + $plink = z_root() . '/cards/' . $channel['channel_address'] . '/' . (($pagetitle) ? $pagetitle : substr($mid,0,16)); + } + if(($parent_item) && ($parent_item['item_type'] == ITEM_TYPE_CARD)) { + $r = q("select v from iconfig where iconfig.cat = 'system' and iconfig.k = 'CARD' and iconfig.iid = %d limit 1", + intval($parent_item['id']) + ); + if($r) { + $plink = z_root() . '/cards/' . $channel['channel_address'] . '/' . $r[0]['v']; + } + } + if ((! $plink) && ($item_thread_top)) { $plink = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $mid; } @@ -1079,21 +1105,28 @@ class Item extends \Zotlabs\Web\Controller { // if this is a different page type or it's just a local delete // but not by the item author or owner, do a simple deletion - + + $complex = false; + if(intval($i[0]['item_type']) || ($local_delete && (! $can_delete))) { drop_item($i[0]['id']); } else { // complex deletion that needs to propagate and be performed in phases drop_item($i[0]['id'],true,DROPITEM_PHASE1); - $r = q("select * from item where id = %d", - intval($i[0]['id']) - ); - if($r) { - xchan_query($r); - $sync_item = fetch_post_tags($r); - build_sync_packet($i[0]['uid'],array('item' => array(encode_item($sync_item[0],true)))); - } + $complex = true; + } + + $r = q("select * from item where id = %d", + intval($i[0]['id']) + ); + if($r) { + xchan_query($r); + $sync_item = fetch_post_tags($r); + build_sync_packet($i[0]['uid'],array('item' => array(encode_item($sync_item[0],true)))); + } + + if($complex) { tag_deliver($i[0]['uid'],$i[0]['id']); } } diff --git a/Zotlabs/Module/Lang.php b/Zotlabs/Module/Lang.php index 84776c3ea..0e5d85d05 100644 --- a/Zotlabs/Module/Lang.php +++ b/Zotlabs/Module/Lang.php @@ -5,7 +5,7 @@ namespace Zotlabs\Module; class Lang extends \Zotlabs\Web\Controller { function get() { - nav_set_selected(t('Language')); + nav_set_selected('Language'); return lang_selector(); } diff --git a/Zotlabs/Module/Like.php b/Zotlabs/Module/Like.php index c995079ce..b104a5f5f 100644 --- a/Zotlabs/Module/Like.php +++ b/Zotlabs/Module/Like.php @@ -255,7 +255,7 @@ class Like extends \Zotlabs\Web\Controller { // get the item. Allow linked photos (which are normally hidden) to be liked $r = q("SELECT * FROM item WHERE id = %d - and item_type = 0 and item_deleted = 0 and item_unpublished = 0 + and (item_type = 0 or item_type = 6) and item_deleted = 0 and item_unpublished = 0 and item_delayed = 0 and item_pending_remove = 0 and item_blocked = 0 LIMIT 1", intval($item_id) ); diff --git a/Zotlabs/Module/Linkinfo.php b/Zotlabs/Module/Linkinfo.php index 8f8231c49..78c34583e 100644 --- a/Zotlabs/Module/Linkinfo.php +++ b/Zotlabs/Module/Linkinfo.php @@ -95,7 +95,7 @@ class Linkinfo extends \Zotlabs\Web\Controller { echo $arr['text']; killme(); } - + if($process_oembed) { $x = oembed_process($url); if($x) { diff --git a/Zotlabs/Module/Logout.php b/Zotlabs/Module/Logout.php new file mode 100644 index 000000000..6aa11d110 --- /dev/null +++ b/Zotlabs/Module/Logout.php @@ -0,0 +1,12 @@ +<?php + +namespace Zotlabs\Module; + +class Logout extends \Zotlabs\Web\Controller { + + function init() { + \App::$session->nuke(); + goaway(z_root()); + + } +}
\ No newline at end of file diff --git a/Zotlabs/Module/Magic.php b/Zotlabs/Module/Magic.php index 9ee5f9324..879085f96 100644 --- a/Zotlabs/Module/Magic.php +++ b/Zotlabs/Module/Magic.php @@ -17,6 +17,7 @@ class Magic extends \Zotlabs\Web\Controller { $dest = ((x($_REQUEST,'dest')) ? $_REQUEST['dest'] : ''); $test = ((x($_REQUEST,'test')) ? intval($_REQUEST['test']) : 0); $rev = ((x($_REQUEST,'rev')) ? intval($_REQUEST['rev']) : 0); + $owa = ((x($_REQUEST,'owa')) ? intval($_REQUEST['owa']) : 0); $delegate = ((x($_REQUEST,'delegate')) ? $_REQUEST['delegate'] : ''); $parsed = parse_url($dest); @@ -132,12 +133,32 @@ class Magic extends \Zotlabs\Web\Controller { if(local_channel()) { $channel = \App::get_channel(); + // OpenWebAuth + + if($owa) { + + $headers = []; + $headers['Accept'] = 'application/x-zot+json' ; + $headers['X-Open-Web-Auth'] = random_string(); + $headers = \Zotlabs\Web\HTTPSig::create_sig('',$headers,$channel['channel_prvkey'], + 'acct:' . $channel['channel_address'] . '@' . \App::get_hostname(),false,true,'sha512'); + $x = z_fetch_url($basepath . '/owa',false,$redirects,[ 'headers' => $headers ]); + + if($x['success']) { + $j = json_decode($x['body'],true); + if($j['success'] && $j['token']) { + $x = strpbrk($dest,'?&'); + $args = (($x) ? '&owt=' . $j['token'] : '?f=&owt=' . $j['token']) . (($delegate) ? '&delegate=1' : ''); + + goaway($dest . $args); + } + } + goaway($dest); + } + + $token = random_string(); - $token_sig = base64url_encode(rsa_sign($token,$channel['channel_prvkey'])); - - $channel['token'] = $token; - $channel['token_sig'] = $token_sig; - + \Zotlabs\Zot\Verify::create('auth',$channel['channel_id'],$token,$x[0]['hubloc_url']); $target_url = $x[0]['hubloc_callback'] . '/?f=&auth=' . urlencode(channel_reddress($channel)) diff --git a/Zotlabs/Module/Mail.php b/Zotlabs/Module/Mail.php index e5509961a..12f3b8152 100644 --- a/Zotlabs/Module/Mail.php +++ b/Zotlabs/Module/Mail.php @@ -140,7 +140,7 @@ class Mail extends \Zotlabs\Web\Controller { function get() { $o = ''; - nav_set_selected(t('Mail')); + nav_set_selected('Mail'); if(! local_channel()) { notice( t('Permission denied.') . EOL); diff --git a/Zotlabs/Module/Manage.php b/Zotlabs/Module/Manage.php index 2d8f39ded..9c5c32294 100644 --- a/Zotlabs/Module/Manage.php +++ b/Zotlabs/Module/Manage.php @@ -11,7 +11,7 @@ class Manage extends \Zotlabs\Web\Controller { return; } - nav_set_selected('Manage'); + nav_set_selected('Channel Manager'); require_once('include/security.php'); diff --git a/Zotlabs/Module/Moderate.php b/Zotlabs/Module/Moderate.php index 9af43420d..cf1625a6b 100644 --- a/Zotlabs/Module/Moderate.php +++ b/Zotlabs/Module/Moderate.php @@ -14,6 +14,24 @@ class Moderate extends \Zotlabs\Web\Controller { return; } + //show all items + if(argc() == 1) { + $r = q("select item.id as item_id, item.* from item where item.uid = %d and item_blocked = %d and item_deleted = 0 order by created desc limit 60", + intval(local_channel()), + intval(ITEM_MODERATED) + ); + } + + //show a single item + if(argc() == 2) { + $post_id = intval(argv(1)); + + $r = q("select item.id as item_id, item.* from item where item.id = %d and item.uid = %d and item_blocked = %d and item_deleted = 0 order by created desc limit 60", + intval($post_id), + intval(local_channel()), + intval(ITEM_MODERATED) + ); + } if(argc() > 2) { $post_id = intval(argv(1)); @@ -55,10 +73,6 @@ class Moderate extends \Zotlabs\Web\Controller { goaway(z_root() . '/moderate'); } } - $r = q("select item.id as item_id, item.* from item where item.uid = %d and item_blocked = %d and item_deleted = 0 order by created desc limit 60", - intval(local_channel()), - intval(ITEM_MODERATED) - ); if($r) { xchan_query($r); @@ -73,4 +87,4 @@ class Moderate extends \Zotlabs\Web\Controller { } -}
\ No newline at end of file +} diff --git a/Zotlabs/Module/Mood.php b/Zotlabs/Module/Mood.php index 85c8a3042..ad29ec7e8 100644 --- a/Zotlabs/Module/Mood.php +++ b/Zotlabs/Module/Mood.php @@ -117,7 +117,7 @@ class Mood extends \Zotlabs\Web\Controller { return; } - nav_set_selected(t('Mood')); + nav_set_selected('Mood'); $parent = ((x($_GET,'parent')) ? intval($_GET['parent']) : '0'); diff --git a/Zotlabs/Module/Network.php b/Zotlabs/Module/Network.php index e5c059af5..ee736ff42 100644 --- a/Zotlabs/Module/Network.php +++ b/Zotlabs/Module/Network.php @@ -44,6 +44,7 @@ class Network extends \Zotlabs\Web\Controller { $channel = \App::get_channel(); $item_normal = item_normal(); + $item_normal_update = item_normal_update(); $datequery = $datequery2 = ''; @@ -116,7 +117,6 @@ class Network extends \Zotlabs\Web\Controller { $spam = ((x($_GET,'spam')) ? intval($_GET['spam']) : 0); $cmin = ((x($_GET,'cmin')) ? intval($_GET['cmin']) : 0); $cmax = ((x($_GET,'cmax')) ? intval($_GET['cmax']) : 99); - $firehose = ((x($_GET,'fh')) ? intval($_GET['fh']) : 0); $file = ((x($_GET,'file')) ? $_GET['file'] : ''); $xchan = ((x($_GET,'xchan')) ? $_GET['xchan'] : ''); @@ -154,7 +154,7 @@ class Network extends \Zotlabs\Web\Controller { )); } - nav_set_selected(t('Activity')); + nav_set_selected('Grid'); $channel_acl = array( 'allow_cid' => $channel['channel_allow_cid'], @@ -290,9 +290,6 @@ class Network extends \Zotlabs\Web\Controller { // We only launch liveUpdate if you aren't filtering in some incompatible // way and also you aren't writing a comment (discovered in javascript). - if($gid || $cid || $cmin || ($cmax != 99) || $star || $liked || $conv || $spam || $nouveau || $list) - $firehose = 0; - $maxheight = get_pconfig(local_channel(),'system','network_divmore_height'); if(! $maxheight) $maxheight = 400; @@ -315,7 +312,7 @@ class Network extends \Zotlabs\Web\Controller { '$liked' => (($liked) ? $liked : '0'), '$conv' => (($conv) ? $conv : '0'), '$spam' => (($spam) ? $spam : '0'), - '$fh' => (($firehose) ? $firehose : '0'), + '$fh' => '0', '$nouveau' => (($nouveau) ? $nouveau : '0'), '$wall' => '0', '$static' => $static, @@ -409,17 +406,7 @@ class Network extends \Zotlabs\Web\Controller { } $abook_uids = " and abook.abook_channel = " . local_channel() . " "; - - $disable_discover_tab = get_config('system','disable_discover_tab') || get_config('system','disable_discover_tab') === false; - if($firehose && (! $disable_discover_tab)) { - require_once('include/channel.php'); - $sys = get_sys_channel(); - $uids = " and item.uid = " . intval($sys['channel_id']) . " "; - \App::$data['firehose'] = intval($sys['channel_id']); - } - else { - $uids = " and item.uid = " . local_channel() . " "; - } + $uids = " and item.uid = " . local_channel() . " "; if(get_pconfig(local_channel(),'system','network_list_mode')) $page_mode = 'list'; @@ -491,10 +478,11 @@ class Network extends \Zotlabs\Web\Controller { } else { + // this is an update $r = q("SELECT item.parent AS item_id FROM item left join abook on ( item.owner_xchan = abook.abook_xchan $abook_uids ) - WHERE true $uids $item_normal $simple_update + WHERE true $uids $item_normal_update $simple_update and (abook.abook_blocked = 0 or abook.abook_flags is null) $sql_extra3 $sql_extra $sql_nets " ); @@ -516,14 +504,14 @@ class Network extends \Zotlabs\Web\Controller { dbesc($parents_str) ); - xchan_query($items,true,(($firehose) ? local_channel() : 0)); + xchan_query($items,true); $items = fetch_post_tags($items,true); $items = conv_sort($items,$ordering); } else { $items = array(); } - + if($page_mode === 'list') { /** @@ -535,20 +523,26 @@ class Network extends \Zotlabs\Web\Controller { if($parents_str) { $update_unseen = " AND ( id IN ( " . dbesc($parents_str) . " )"; + $update_unseen .= " AND obj_type != '" . dbesc(ACTIVITY_OBJ_FILE) . "'"; $update_unseen .= " OR ( parent IN ( " . dbesc($parents_str) . " ) AND verb in ( '" . dbesc(ACTIVITY_LIKE) . "','" . dbesc(ACTIVITY_DISLIKE) . "' ))) "; } } else { if($parents_str) { - $update_unseen = " AND parent IN ( " . dbesc($parents_str) . " )"; + $update_unseen = " AND parent IN ( " . dbesc($parents_str) . " ) AND obj_type != '" . dbesc(ACTIVITY_OBJ_FILE) . "'"; } } } - if(($update_unseen) && (! $firehose)) - $r = q("UPDATE item SET item_unseen = 0 WHERE item_unseen = 1 AND uid = %d $update_unseen ", - intval(local_channel()) - ); + if($update_unseen) { + $x = [ 'channel_id' => local_channel(), 'update' => 'unset' ]; + call_hooks('update_unseen',$x); + if($x['update'] === 'unset' || intval($x['update'])) { + $r = q("UPDATE item SET item_unseen = 0 WHERE item_unseen = 1 AND uid = %d $update_unseen ", + intval(local_channel()) + ); + } + } $mode = (($nouveau) ? 'network-new' : 'network'); diff --git a/Zotlabs/Module/New_channel.php b/Zotlabs/Module/New_channel.php index cfd45e909..2b73fa191 100644 --- a/Zotlabs/Module/New_channel.php +++ b/Zotlabs/Module/New_channel.php @@ -9,7 +9,7 @@ require_once('include/permissions.php'); class New_channel extends \Zotlabs\Web\Controller { function init() { - + $cmd = ((argc() > 1) ? argv(1) : ''); if($cmd === 'autofill.json') { diff --git a/Zotlabs/Module/Notifications.php b/Zotlabs/Module/Notifications.php index 652648701..dfa007548 100644 --- a/Zotlabs/Module/Notifications.php +++ b/Zotlabs/Module/Notifications.php @@ -12,25 +12,44 @@ class Notifications extends \Zotlabs\Web\Controller { return; } - nav_set_selected('notifications'); + nav_set_selected('Notifications'); $o = ''; - - $r = q("SELECT * from notify where uid = %d and seen = 0 order by created desc", + + $r = q("select count(*) as total from notify where uid = %d and seen = 0", intval(local_channel()) ); + if($r && intval($t[0]['total']) > 49) { + $r = q("select * from notify where uid = %d + and seen = 0 order by created desc limit 50", + intval(local_channel()) + ); + } else { + $r1 = q("select * from notify where uid = %d + and seen = 0 order by created desc limit 50", + intval(local_channel()) + ); + $r2 = q("select * from notify where uid = %d + and seen = 1 order by created desc limit %d", + intval(local_channel()), + intval(50 - intval($t[0]['total'])) + ); + $r = array_merge($r1,$r2); + } if($r) { $notifications_available = 1; - foreach ($r as $it) { - $x = strip_tags(bbcode($it['msg'])); + foreach ($r as $rr) { + $x = strip_tags(bbcode($rr['msg'])); if(strpos($x,',')) $x = substr($x,strpos($x,',')+1); $notif_content .= replace_macros(get_markup_template('notify.tpl'),array( - '$item_link' => z_root().'/notify/view/'. $it['id'], - '$item_image' => $it['photo'], + '$item_link' => z_root().'/notify/view/'. $rr['id'], + '$item_image' => $rr['photo'], '$item_text' => $x, - '$item_when' => relative_date($it['created']) + '$item_when' => relative_date($rr['created']), + '$item_seen' => (($rr['seen']) ? true : false), + '$new' => t('New') )); } } diff --git a/Zotlabs/Module/Notify.php b/Zotlabs/Module/Notify.php index f592f6f37..3d6e1c2e7 100644 --- a/Zotlabs/Module/Notify.php +++ b/Zotlabs/Module/Notify.php @@ -15,12 +15,16 @@ class Notify extends \Zotlabs\Web\Controller { intval(local_channel()) ); if($r) { - q("update notify set seen = 1 where (( parent != '' and parent = '%s' and otype = '%s' ) or link = '%s' ) and uid = %d", - dbesc($r[0]['parent']), - dbesc($r[0]['otype']), - dbesc($r[0]['link']), - intval(local_channel()) - ); + $x = [ 'channel_id' => local_channel(), 'update' => 'unset' ]; + call_hooks('update_unseen',$x); + if($x['update'] === 'unset' || intval($x['update'])) { + q("update notify set seen = 1 where (( parent != '' and parent = '%s' and otype = '%s' ) or link = '%s' ) and uid = %d", + dbesc($r[0]['parent']), + dbesc($r[0]['otype']), + dbesc($r[0]['link']), + intval(local_channel()) + ); + } goaway($r[0]['link']); } goaway(z_root()); diff --git a/Zotlabs/Module/Oep.php b/Zotlabs/Module/Oep.php index 9c05f5e3f..5e06d3540 100644 --- a/Zotlabs/Module/Oep.php +++ b/Zotlabs/Module/Oep.php @@ -1,6 +1,8 @@ <?php namespace Zotlabs\Module; +require_once('include/security.php'); + // oembed provider @@ -41,6 +43,8 @@ class Oep extends \Zotlabs\Web\Controller { $arr = $this->oep_profile_reply($_REQUEST); elseif(fnmatch('*/profile/*',$url)) $arr = $this->oep_profile_reply($_REQUEST); + elseif(fnmatch('*/cards/*',$url)) + $arr = $this->oep_cards_reply($_REQUEST); if($arr) { if($html) { @@ -66,45 +70,70 @@ class Oep extends \Zotlabs\Web\Controller { $url = $args['url']; $maxwidth = intval($args['maxwidth']); $maxheight = intval($args['maxheight']); - - if(preg_match('#//(.*?)/(.*?)/(.*?)/(.*?)mid\=(.*?)(&|$)#',$url,$matches)) { - $chn = $matches[3]; - $res = $matches[5]; + logger('processing display'); + if(preg_match('#//(.*?)/display/(.*?)(&|\?|$)#',$url,$matches)) { + $res = $matches[2]; } - - if(! ($chn && $res)) - return; - $c = q("select * from channel where channel_address = '%s' limit 1", - dbesc($chn) + + if(strpos($res,'b64.') === 0) { + $res = base64url_decode(substr($res,4)); + } + + $item_normal = item_normal(); + + $p = q("select * from item where mid like '%s' limit 1", + dbesc($res . '%') ); - - if(! $c) + + if(! $p) return; + + $c = channelx_by_n($p[0]['uid']); + - $sql_extra = item_permissions_sql($c[0]['channel_id']); + if(! ($c && $res)) + return; + + if(! perm_is_allowed($c[0]['channel_id'],get_observer_hash(),'view_stream')) + return; + + $sql_extra = item_permissions_sql($c['channel_id']); - $p = q("select * from item where mid = '%s' and uid = %d $sql_extra limit 1", - dbesc($res), - intval($c[0]['channel_id']) + $p = q("select * from item where mid like '%s' and uid = %d $sql_extra $item_normal limit 1", + dbesc($res . '%'), + intval($c['channel_id']) ); + if(! $p) return; xchan_query($p,true); $p = fetch_post_tags($p,true); + + // This function can get tripped up if the item is already a reshare + // (the multiple share declarations do not parse cleanly if nested) + // So build a template with a known nonsense string as the content, and then + // replace that known string with the actual rendered content, sending + // each content layer through bbcode() separately. + + $x = '2eGriplW^*Jmf4'; + $o = "[share author='".urlencode($p[0]['author']['xchan_name']). - "' profile='".$p[0]['author']['xchan_url'] . - "' avatar='".$p[0]['author']['xchan_photo_s']. - "' link='".$p[0]['plink']. - "' posted='".$p[0]['created']. - "' message_id='".$p[0]['mid']."']"; + "' profile='".$p[0]['author']['xchan_url'] . + "' avatar='".$p[0]['author']['xchan_photo_s']. + "' link='".$p[0]['plink']. + "' posted='".$p[0]['created']. + "' message_id='".$p[0]['mid']."']"; if($p[0]['title']) - $o .= '[b]'.$p[0]['title'].'[/b]'."\r\n"; - $o .= $p[0]['body']; - $o .= "[/share]"; + $o .= '[b]'.$p[0]['title'].'[/b]'."\r\n"; + + $o .= $x; + $o .= "[/share]"; $o = bbcode($o); + $o = str_replace($x,bbcode($p[0]['body']),$o); + $ret['type'] = 'rich'; $w = (($maxwidth) ? $maxwidth : 640); @@ -118,6 +147,91 @@ class Oep extends \Zotlabs\Web\Controller { return $ret; } + + + function oep_cards_reply($args) { + + $ret = []; + $url = $args['url']; + $maxwidth = intval($args['maxwidth']); + $maxheight = intval($args['maxheight']); + + if(preg_match('#//(.*?)/cards/(.*?)/(.*?)(&|\?|$)#',$url,$matches)) { + $nick = $matches[2]; + $res = $matches[3]; + } + if(! ($nick && $res)) + return $ret; + + $channel = channelx_by_nick($nick); + + if(! $channel) + return $ret; + + + if(! perm_is_allowed($channel['channel_id'],get_observer_hash(),'view_pages')) + return $ret; + + $sql_extra = item_permissions_sql($channel['channel_id'],get_observer_hash()); + + $r = q("select * from iconfig where iconfig.cat = 'system' and iconfig.k = 'CARD' and iconfig.v = '%s' limit 1", + dbesc($res) + ); + if($r) { + $sql_extra = "and item.id = " . intval($r[0]['iid']) . " "; + } + else { + return $ret; + } + + $r = q("select * from item + where item.uid = %d and item_type = %d + $sql_extra order by item.created desc", + intval($channel['channel_id']), + intval(ITEM_TYPE_CARD) + ); + + $item_normal = " and item.item_hidden = 0 and item.item_type in (0,6) and item.item_deleted = 0 + and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_pending_remove = 0 + and item.item_blocked = 0 "; + + if($r) { + xchan_query($r); + $p = fetch_post_tags($r, true); + } + + $x = '2eGriplW^*Jmf4'; + + + $o = "[share author='".urlencode($p[0]['author']['xchan_name']). + "' profile='".$p[0]['author']['xchan_url'] . + "' avatar='".$p[0]['author']['xchan_photo_s']. + "' link='".$p[0]['plink']. + "' posted='".$p[0]['created']. + "' message_id='".$p[0]['mid']."']"; + if($p[0]['title']) + $o .= '[b]'.$p[0]['title'].'[/b]'."\r\n"; + + $o .= $x; + $o .= "[/share]"; + $o = bbcode($o); + + $o = str_replace($x,bbcode($p[0]['body']),$o); + + $ret['type'] = 'rich'; + + $w = (($maxwidth) ? $maxwidth : 640); + $h = (($maxheight) ? $maxheight : intval($w * 2 / 3)); + + $ret['html'] = '<div style="width: ' . $w . '; height: ' . $h . '; font-family: sans-serif,arial,freesans;" >' . $o . '</div>'; + + $ret['width'] = $w; + $ret['height'] = $h; + + return $ret; + + } + function oep_mid_reply($args) { @@ -139,6 +253,9 @@ class Oep extends \Zotlabs\Web\Controller { if(! $c) return; + + if(! perm_is_allowed($c[0]['channel_id'],get_observer_hash(),'view_stream')) + return; $sql_extra = item_permissions_sql($c[0]['channel_id']); @@ -151,19 +268,29 @@ class Oep extends \Zotlabs\Web\Controller { xchan_query($p,true); $p = fetch_post_tags($p,true); - + + // This function can get tripped up if the item is already a reshare + // (the multiple share declarations do not parse cleanly if nested) + // So build a template with a known nonsense string as the content, and then + // replace that known string with the actual rendered content, sending + // each content layer through bbcode() separately. + + $x = '2eGriplW^*Jmf4'; + $o = "[share author='".urlencode($p[0]['author']['xchan_name']). - "' profile='".$p[0]['author']['xchan_url'] . - "' avatar='".$p[0]['author']['xchan_photo_s']. - "' link='".$p[0]['plink']. - "' posted='".$p[0]['created']. - "' message_id='".$p[0]['mid']."']"; - if($p[0]['title']) - $o .= '[b]'.$p[0]['title'].'[/b]'."\r\n"; - $o .= $p[0]['body']; - $o .= "[/share]"; + "' profile='".$p[0]['author']['xchan_url'] . + "' avatar='".$p[0]['author']['xchan_photo_s']. + "' link='".$p[0]['plink']. + "' posted='".$p[0]['created']. + "' message_id='".$p[0]['mid']."']"; + if($p[0]['title']) + $o .= '[b]'.$p[0]['title'].'[/b]'."\r\n"; + $o .= $x; + $o .= "[/share]"; $o = bbcode($o); + $o = str_replace($x,bbcode($p[0]['body']),$o); + $ret['type'] = 'rich'; $w = (($maxwidth) ? $maxwidth : 640); @@ -247,6 +374,9 @@ class Oep extends \Zotlabs\Web\Controller { if(! $c) return; + if(! perm_is_allowed($c[0]['channel_id'],get_observer_hash(),'view_files')) + return; + $sql_extra = permissions_sql($c[0]['channel_id']); $p = q("select resource_id from photo where album = '%s' and uid = %d and imgscale = 0 $sql_extra order by created desc limit 1", @@ -308,6 +438,9 @@ class Oep extends \Zotlabs\Web\Controller { if(! $c) return; + if(! perm_is_allowed($c[0]['channel_id'],get_observer_hash(),'view_files')) + return; + $sql_extra = permissions_sql($c[0]['channel_id']); $p = q("select resource_id from photo where uid = %d and imgscale = 0 $sql_extra order by created desc limit 1", @@ -368,7 +501,10 @@ class Oep extends \Zotlabs\Web\Controller { if(! $c) return; - + + if(! perm_is_allowed($c[0]['channel_id'],get_observer_hash(),'view_files')) + return; + $sql_extra = permissions_sql($c[0]['channel_id']); diff --git a/Zotlabs/Module/Ofeed.php b/Zotlabs/Module/Ofeed.php index 2b7acff99..58488d4af 100644 --- a/Zotlabs/Module/Ofeed.php +++ b/Zotlabs/Module/Ofeed.php @@ -18,7 +18,7 @@ class Ofeed extends \Zotlabs\Web\Controller { $params['pages'] = ((x($_REQUEST,'pages')) ? intval($_REQUEST['pages']) : 0); $params['top'] = ((x($_REQUEST,'top')) ? intval($_REQUEST['top']) : 0); $params['start'] = ((x($params,'start')) ? intval($params['start']) : 0); - $params['records'] = ((x($params,'records')) ? intval($params['records']) : 40); + $params['records'] = ((x($params,'records')) ? intval($params['records']) : 10); $params['direction'] = ((x($params,'direction')) ? dbesc($params['direction']) : 'desc'); $params['cat'] = ((x($_REQUEST,'cat')) ? escape_tags($_REQUEST['cat']) : ''); $params['compat'] = ((x($_REQUEST,'compat')) ? intval($_REQUEST['compat']) : 1); diff --git a/Zotlabs/Module/Owa.php b/Zotlabs/Module/Owa.php new file mode 100644 index 000000000..4b0d855c5 --- /dev/null +++ b/Zotlabs/Module/Owa.php @@ -0,0 +1,53 @@ +<?php + +namespace Zotlabs\Module; + +/** + * OpenWebAuth verifier and token generator + * See https://macgirvin.com/wiki/mike/OpenWebAuth/Home + * Requests to this endpoint should be signed using HTTP Signatures + * using the 'Authorization: Signature' authentication method + * If the signature verifies a token is returned. + * + * This token may be exchanged for an authenticated cookie. + */ + +class Owa extends \Zotlabs\Web\Controller { + + function init() { + + $ret = [ 'success' => false ]; + + foreach([ 'REDIRECT_REMOTE_USER', 'HTTP_AUTHORIZATION' ] as $head) { + if(array_key_exists($head,$_SERVER) && substr(trim($_SERVER[$head]),0,9) === 'Signature') { + if($head !== 'HTTP_AUTHORIZATION') { + $_SERVER['HTTP_AUTHORIZATION'] = $_SERVER[$head]; + continue; + } + + $sigblock = \Zotlabs\Web\HTTPSig::parse_sigheader($_SERVER[$head]); + if($sigblock) { + $keyId = $sigblock['keyId']; + + if($keyId) { + $r = q("select * from hubloc left join xchan on hubloc_hash = xchan_hash + where hubloc_addr = '%s' limit 1", + dbesc(str_replace('acct:','',$keyId)) + ); + if($r) { + $hubloc = $r[0]; + $verified = \Zotlabs\Web\HTTPSig::verify('',$hubloc['xchan_pubkey']); + if($verified && $verified['header_signed'] && $verified['header_valid']) { + $ret['success'] = true; + $token = random_string(32); + \Zotlabs\Zot\Verify::create('owt',0,$token,$r[0]['hubloc_addr']); + $ret['token'] = $token; + } + } + } + } + } + } + json_return_and_die($ret,'application/x-zot+json'); + } +} diff --git a/Zotlabs/Module/Pdledit.php b/Zotlabs/Module/Pdledit.php index 618444480..f8af470ac 100644 --- a/Zotlabs/Module/Pdledit.php +++ b/Zotlabs/Module/Pdledit.php @@ -14,7 +14,7 @@ class Pdledit extends \Zotlabs\Web\Controller { if(! trim($_REQUEST['content'])) { del_pconfig(local_channel(),'system','mod_' . $_REQUEST['module'] . '.pdl'); - goaway(z_root() . '/pdledit/' . $_REQUEST['module']); + goaway(z_root() . '/pdledit'); } set_pconfig(local_channel(),'system','mod_' . $_REQUEST['module'] . '.pdl',escape_tags($_REQUEST['content'])); build_sync_packet(); @@ -34,19 +34,38 @@ class Pdledit extends \Zotlabs\Web\Controller { notice( t('Feature disabled.') . EOL); return; } - + + if(argc() > 2 && argv(2) === 'reset') { + del_pconfig(local_channel(),'system','mod_' . argv(1) . '.pdl'); + goaway(z_root() . '/pdledit'); + } + if(argc() > 1) $module = 'mod_' . argv(1) . '.pdl'; else { $o .= '<div class="generic-content-wrapper-styled">'; $o .= '<h1>' . t('Edit System Page Description') . '</h1>'; + + $edited = []; + + $r = q("select k from pconfig where uid = %d and cat = 'system' and k like '%s' ", + intval(local_channel()), + dbesc('mod_%.pdl') + ); + + if($r) { + foreach($r as $rv) { + $edited[] = substr(str_replace('.pdl','',$rv['k']),4); + } + } + $files = glob('Zotlabs/Module/*.php'); if($files) { foreach($files as $f) { $name = lcfirst(basename($f,'.php')); $x = theme_include('mod_' . $name . '.pdl'); if($x) { - $o .= '<a href="pdledit/' . $name . '" >' . $name . '</a><br />'; + $o .= '<a href="pdledit/' . $name . '" >' . $name . '</a>' . ((in_array($name,$edited)) ? ' ' . t('(modified)') . ' <a href="pdledit/' . $name . '/reset" >' . t('Reset') . '</a>': '' ) . '<br />'; } } } @@ -69,6 +88,7 @@ class Pdledit extends \Zotlabs\Web\Controller { '$header' => t('Edit System Page Description'), '$mname' => t('Module Name:'), '$help' => t('Layout Help'), + '$another' => t('Edit another layout'), '$module' => argv(1), '$content' => htmlspecialchars($t,ENT_COMPAT,'UTF-8'), '$submit' => t('Submit') diff --git a/Zotlabs/Module/Photos.php b/Zotlabs/Module/Photos.php index 85dae46a5..caef45d98 100644 --- a/Zotlabs/Module/Photos.php +++ b/Zotlabs/Module/Photos.php @@ -555,7 +555,7 @@ class Photos extends \Zotlabs\Web\Controller { $sql_extra = permissions_sql($owner_uid,get_observer_hash(),'photo'); $sql_attach = permissions_sql($owner_uid,get_observer_hash(),'attach'); - nav_set_selected(t('Photos')); + nav_set_selected('Photos'); $o = ""; @@ -671,8 +671,13 @@ class Photos extends \Zotlabs\Web\Controller { */ if($datatype === 'album') { - - \App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$cmd) . '" title="oembed" />' . "\r\n"; + + head_add_link([ + 'rel' => 'alternate', + 'type' => 'application/json+oembed', + 'href' => z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$query_string), + 'title' => 'oembed' + ]); if($x = photos_album_exists($owner_uid, get_observer_hash(), $datum)) { \App::set_pager_itemspage(60); @@ -765,7 +770,7 @@ class Photos extends \Zotlabs\Web\Controller { if($photos) { $o = replace_macros(get_markup_template('photosajax.tpl'),array( '$photos' => $photos, - '$album_id' => bin2hex($album) + '$album_id' => $datum )); } else { diff --git a/Zotlabs/Module/Ping.php b/Zotlabs/Module/Ping.php index bf2fa5cc9..c91659f2f 100644 --- a/Zotlabs/Module/Ping.php +++ b/Zotlabs/Module/Ping.php @@ -19,6 +19,7 @@ class Ping extends \Zotlabs\Web\Controller { * @result JSON */ function init() { + $result = array(); $notifs = array(); @@ -36,6 +37,11 @@ class Ping extends \Zotlabs\Web\Controller { $result['all_events_today'] = 0; $result['notice'] = array(); $result['info'] = array(); + $result['pubs'] = 0; + $result['files'] = 0; + + if(! $_SESSION['static_loadtime']) + $_SESSION['static_loadtime'] = datetime_convert(); $t0 = dba_timer(); @@ -134,6 +140,61 @@ class Ping extends \Zotlabs\Web\Controller { db_utcnow(), db_quoteinterval('3 MINUTE') ); + $discover_tab_on = ((get_config('system','disable_discover_tab') != 1) ? true : false); + $notify_pubs = ((local_channel()) ? ($vnotify & VNOTIFY_PUBS) && $discover_tab_on : $discover_tab_on); + + if($notify_pubs) { + $sys = get_sys_channel(); + + $pubs = q("SELECT count(id) as total from item + WHERE uid = %d + AND author_xchan != '%s' + AND obj_type != '%s' + AND item_unseen = 1 + AND created > '" . datetime_convert('UTC','UTC',$_SESSION['static_loadtime']) . "' + $item_normal", + intval($sys['channel_id']), + dbesc(get_observer_hash()), + dbesc(ACTIVITY_OBJ_FILE) + ); + + if($pubs) + $result['pubs'] = intval($pubs[0]['total']); + } + + if((argc() > 1) && (argv(1) === 'pubs') && ($notify_pubs)) { + $sys = get_sys_channel(); + $result = array(); + + $r = q("SELECT * FROM item + WHERE uid = %d + AND author_xchan != '%s' + AND obj_type != '%s' + AND item_unseen = 1 + AND created > '" . datetime_convert('UTC','UTC',$_SESSION['static_loadtime']) . "' + $item_normal + ORDER BY created DESC + LIMIT 300", + intval($sys['channel_id']), + dbesc(get_observer_hash()), + dbesc(ACTIVITY_OBJ_FILE) + ); + + if($r) { + xchan_query($r); + foreach($r as $rr) { + $rr['llink'] = str_replace('display/', 'pubstream/?f=&mid=', $rr['llink']); + $result[] = \Zotlabs\Lib\Enotify::format($rr); + } + } + +// logger('ping (network||home): ' . print_r($result, true), LOGGER_DATA); + echo json_encode(array('notify' => $result)); + killme(); + } + + $t1 = dba_timer(); + if((! local_channel()) || ($result['invalid'])) { echo json_encode($result); killme(); @@ -177,6 +238,9 @@ class Ping extends \Zotlabs\Web\Controller { intval(local_channel()) ); break; + case 'pubs': + unset($_SESSION['static_loadtime']); + break; default: break; } @@ -194,37 +258,20 @@ class Ping extends \Zotlabs\Web\Controller { * dropdown menu. */ if(argc() > 1 && argv(1) === 'notify') { - $t = q("select count(*) as total from notify where uid = %d and seen = 0", + $t = q("select * from notify where uid = %d and seen = 0 order by created desc", intval(local_channel()) ); - if($t && intval($t[0]['total']) > 49) { - $z = q("select * from notify where uid = %d - and seen = 0 order by created desc limit 50", - intval(local_channel()) - ); - } else { - $z1 = q("select * from notify where uid = %d - and seen = 0 order by created desc limit 50", - intval(local_channel()) - ); - $z2 = q("select * from notify where uid = %d - and seen = 1 order by created desc limit %d", - intval(local_channel()), - intval(50 - intval($t[0]['total'])) - ); - $z = array_merge($z1,$z2); - } - if(count($z)) { - foreach($z as $zz) { + if($t) { + foreach($t as $tt) { $notifs[] = array( - 'notify_link' => z_root() . '/notify/view/' . $zz['id'], - 'name' => $zz['xname'], - 'url' => $zz['url'], - 'photo' => $zz['photo'], - 'when' => relative_date($zz['created']), - 'hclass' => (($zz['seen']) ? 'notify-seen' : 'notify-unseen'), - 'message' => strip_tags(bbcode($zz['msg'])) + 'notify_link' => z_root() . '/notify/view/' . $tt['id'], + 'name' => $tt['xname'], + 'url' => $tt['url'], + 'photo' => $tt['photo'], + 'when' => relative_date($tt['created']), + 'hclass' => (($tt['seen']) ? 'notify-seen' : 'notify-unseen'), + 'message' => strip_tags(bbcode($tt['msg'])) ); } } @@ -233,7 +280,7 @@ class Ping extends \Zotlabs\Web\Controller { killme(); } - if(argc() > 1 && argv(1) === 'messages') { + if(argc() > 1 && argv(1) === 'mail') { $channel = \App::get_channel(); $t = q("select mail.*, xchan.* from mail left join xchan on xchan_hash = from_xchan where channel_id = %d and mail_seen = 0 and mail_deleted = 0 @@ -265,9 +312,12 @@ class Ping extends \Zotlabs\Web\Controller { $r = q("SELECT * FROM item WHERE item_unseen = 1 and uid = %d $item_normal - and author_xchan != '%s' ORDER BY created DESC limit 300", + AND author_xchan != '%s' + AND obj_type != '%s' + ORDER BY created DESC limit 300", intval(local_channel()), - dbesc($ob_hash) + dbesc($ob_hash), + dbesc(ACTIVITY_OBJ_FILE) ); if($r) { @@ -308,6 +358,30 @@ class Ping extends \Zotlabs\Web\Controller { killme(); } + if((argc() > 1 && (argv(1) === 'register')) && is_site_admin()) { + $result = array(); + + $r = q("SELECT account_email, account_created from account where (account_flags & %d) > 0", + intval(ACCOUNT_PENDING) + ); + if($r) { + foreach($r as $rr) { + $result[] = array( + 'notify_link' => z_root() . '/admin/accounts', + 'name' => $rr['account_email'], + 'url' => '', + 'photo' => get_default_profile_photo(48), + 'when' => relative_date($rr['account_created']), + 'hclass' => ('notify-unseen'), + 'message' => t('requires approval') + ); + } + } + logger('ping (register): ' . print_r($result, true), LOGGER_DATA); + echo json_encode(array('notify' => $result)); + killme(); + } + if(argc() > 1 && (argv(1) === 'all_events')) { $bd_format = t('g A l F d') ; // 8 AM Friday January 18 @@ -345,6 +419,39 @@ class Ping extends \Zotlabs\Web\Controller { killme(); } + if(argc() > 1 && (argv(1) === 'files')) { + $result = array(); + + $r = q("SELECT item.created, xchan.xchan_name, xchan.xchan_url, xchan.xchan_photo_s FROM item + LEFT JOIN xchan on author_xchan = xchan_hash + WHERE item.verb = '%s' + AND item.obj_type = '%s' + AND item.uid = %d + AND item.owner_xchan != '%s' + AND item.item_unseen = 1", + dbesc(ACTIVITY_POST), + dbesc(ACTIVITY_OBJ_FILE), + intval(local_channel()), + dbesc($ob_hash) + ); + if($r) { + foreach($r as $rr) { + $result[] = array( + 'notify_link' => z_root() . '/sharedwithme', + 'name' => $rr['xchan_name'], + 'url' => $rr['xchan_url'], + 'photo' => $rr['xchan_photo_s'], + 'when' => relative_date($rr['created']), + 'hclass' => ('notify-unseen'), + 'message' => t('shared a file with you') + ); + } + } + logger('ping (files): ' . print_r($result, true), LOGGER_DATA); + echo json_encode(array('notify' => $result)); + killme(); + } + /** * Normal ping - just the counts, no detail */ @@ -356,15 +463,35 @@ class Ping extends \Zotlabs\Web\Controller { $result['notify'] = intval($t[0]['total']); } - $t1 = dba_timer(); + $t2 = dba_timer(); + + if($vnotify & VNOTIFY_FILES) { + $files = q("SELECT count(id) as total FROM item + WHERE verb = '%s' + AND obj_type = '%s' + AND uid = %d + AND owner_xchan != '%s' + AND item_unseen = 1", + dbesc(ACTIVITY_POST), + dbesc(ACTIVITY_OBJ_FILE), + intval(local_channel()), + dbesc($ob_hash) + ); + if($files) + $result['files'] = intval($files[0]['total']); + } + + $t3 = dba_timer(); if($vnotify & (VNOTIFY_NETWORK|VNOTIFY_CHANNEL)) { $r = q("SELECT id, item_wall FROM item WHERE item_unseen = 1 and uid = %d $item_normal - and author_xchan != '%s'", + AND author_xchan != '%s' + AND obj_type != '%s'", intval(local_channel()), - dbesc($ob_hash) + dbesc($ob_hash), + dbesc(ACTIVITY_OBJ_FILE) ); if($r) { @@ -384,20 +511,20 @@ class Ping extends \Zotlabs\Web\Controller { if(! ($vnotify & VNOTIFY_CHANNEL)) $result['home'] = 0; - $t2 = dba_timer(); + $t4 = dba_timer(); if($vnotify & VNOTIFY_INTRO) { $intr = q("SELECT COUNT(abook.abook_id) AS total FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash where abook_channel = %d and abook_pending = 1 and abook_self = 0 and abook_ignored = 0 and xchan_deleted = 0 and xchan_orphan = 0 ", intval(local_channel()) ); - $t3 = dba_timer(); + $t5 = dba_timer(); if($intr) $result['intros'] = intval($intr[0]['total']); } - $t4 = dba_timer(); + $t6 = dba_timer(); $channel = \App::get_channel(); if($vnotify & VNOTIFY_MAIL) { @@ -420,7 +547,7 @@ class Ping extends \Zotlabs\Web\Controller { } } - $t5 = dba_timer(); + $t7 = dba_timer(); if($vnotify & (VNOTIFY_EVENT|VNOTIFY_EVENTTODAY|VNOTIFY_BIRTHDAY)) { $events = q("SELECT etype, dtstart, adjust FROM event @@ -466,9 +593,9 @@ class Ping extends \Zotlabs\Web\Controller { $x = json_encode($result); - $t6 = dba_timer(); + $t8 = dba_timer(); -// logger('ping timer: ' . sprintf('%01.4f %01.4f %01.4f %01.4f %01.4f %01.4f',$t6 - $t5, $t5 - $t4, $t4 - $t3, $t3 - $t2, $t2 - $t1, $t1 - $t0)); +// logger('ping timer: ' . sprintf('%01.4f %01.4f %01.4f %01.4f %01.4f %01.4f %01.4f %01.4f',$t8 - $t7, $t7 - $t6, $t6 - $t5, $t5 - $t4, $t4 - $t3, $t3 - $t2, $t2 - $t1, $t1 - $t0)); echo $x; killme(); diff --git a/Zotlabs/Module/Poke.php b/Zotlabs/Module/Poke.php index 0bd1187c7..d13ec5ced 100644 --- a/Zotlabs/Module/Poke.php +++ b/Zotlabs/Module/Poke.php @@ -150,7 +150,7 @@ class Poke extends \Zotlabs\Web\Controller { return; } - nav_set_selected(t('Poke')); + nav_set_selected('Poke'); $name = ''; $id = ''; diff --git a/Zotlabs/Module/Post.php b/Zotlabs/Module/Post.php index c78484a45..f67cbf020 100644 --- a/Zotlabs/Module/Post.php +++ b/Zotlabs/Module/Post.php @@ -19,16 +19,16 @@ class Post extends \Zotlabs\Web\Controller { function init() { if(array_key_exists('auth', $_REQUEST)) { $x = new \Zotlabs\Zot\Auth($_REQUEST); - exit; } } function post() { - $z = new \Zotlabs\Zot\Receiver($_REQUEST['data'], get_config('system', 'prvkey'), new \Zotlabs\Zot\ZotHandler()); + if(array_key_exists('data',$_REQUEST)) { + $z = new \Zotlabs\Zot\Receiver($_REQUEST['data'], get_config('system', 'prvkey'), new \Zotlabs\Zot\ZotHandler()); + exit; + } - // notreached; - exit; } } diff --git a/Zotlabs/Module/Probe.php b/Zotlabs/Module/Probe.php index 859bed315..2e65f107c 100644 --- a/Zotlabs/Module/Probe.php +++ b/Zotlabs/Module/Probe.php @@ -8,7 +8,7 @@ class Probe extends \Zotlabs\Web\Controller { function get() { - nav_set_selected(t('Remote Diagnostics')); + nav_set_selected('Remote Diagnostics'); $o .= '<h3>Probe Diagnostic</h3>'; diff --git a/Zotlabs/Module/Profile.php b/Zotlabs/Module/Profile.php index 6930d50ca..43106e3af 100644 --- a/Zotlabs/Module/Profile.php +++ b/Zotlabs/Module/Profile.php @@ -94,7 +94,6 @@ class Profile extends \Zotlabs\Web\Controller { echo \App::$profile['profile_vcard']; killme(); } - $is_owner = ((local_channel()) && (local_channel() == \App::$profile['profile_uid']) ? true : false); @@ -102,11 +101,14 @@ class Profile extends \Zotlabs\Web\Controller { notice( t('Permission denied.') . EOL); return; } - - //$o .= profile_tabs($a, $is_owner, \App::$profile['channel_address']); - - \App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$query_string) . '" title="oembed" />' . "\r\n"; - + + head_add_link([ + 'rel' => 'alternate', + 'type' => 'application/json+oembed', + 'href' => z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$query_string), + 'title' => 'oembed' + ]); + $o .= advanced_profile($a); call_hooks('profile_advanced',$o); return $o; diff --git a/Zotlabs/Module/Profile_photo.php b/Zotlabs/Module/Profile_photo.php index 47b627015..27e6bc445 100644 --- a/Zotlabs/Module/Profile_photo.php +++ b/Zotlabs/Module/Profile_photo.php @@ -158,6 +158,9 @@ class Profile_photo extends \Zotlabs\Web\Controller { intval(local_channel()) ); + + + send_profile_photo_activity($channel,$base_image,$profile); } @@ -174,12 +177,17 @@ class Profile_photo extends \Zotlabs\Web\Controller { // We'll set the updated profile-photo timestamp even if it isn't the default profile, // so that browsers will do a cache update unconditionally + // Also set links back to site-specific profile photo url in case it was + // changed to a generic URL by a clone operation. Otherwise the new photo may + // not get pushed to other sites correctly. - - $r = q("UPDATE xchan set xchan_photo_mimetype = '%s', xchan_photo_date = '%s' + $r = q("UPDATE xchan set xchan_photo_mimetype = '%s', xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s' where xchan_hash = '%s'", dbesc($im->getType()), dbesc(datetime_convert()), + dbesc(z_root() . '/photo/profile/l/' . $channel['channel_id']), + dbesc(z_root() . '/photo/profile/m/' . $channel['channel_id']), + dbesc(z_root() . '/photo/profile/s/' . $channel['channel_id']), dbesc($channel['xchan_hash']) ); diff --git a/Zotlabs/Module/Pubsites.php b/Zotlabs/Module/Pubsites.php index d87967189..daec5dde3 100644 --- a/Zotlabs/Module/Pubsites.php +++ b/Zotlabs/Module/Pubsites.php @@ -30,13 +30,14 @@ class Pubsites extends \Zotlabs\Web\Controller { if($ret['success']) { $j = json_decode($ret['body'],true); if($j) { - $o .= '<table class="table table-striped table-hover"><tr><td>' . t('Hub URL') . '</td><td>' . t('Access Type') . '</td><td>' . t('Registration Policy') . '</td><td>' . t('Stats') . '</td><td>' . t('Software') . '</td>'; + $o .= '<table class="table table-striped table-hover"><tr><td>' . t('Hub URL') . '</td><td>' . t('Access Type') . '</td><td>' . t('Registration Policy') . '</td><!--td>' . t('Stats') . '</td--><td>' . t('Software') . '</td>'; if($rating_enabled) $o .= '<td colspan="2">' . t('Ratings') . '</td>'; $o .= '</tr>'; if($j['sites']) { foreach($j['sites'] as $jj) { - if(! \Zotlabs\Lib\System::compatible_project($jj['project'])) + $projectname = explode(' ',$jj['project']); + if(! \Zotlabs\Lib\System::compatible_project($projectname[0])) continue; if(strpos($jj['version'],' ')) { $x = explode(' ', $jj['version']); @@ -54,7 +55,7 @@ class Pubsites extends \Zotlabs\Web\Controller { $location = '<br /> '; } $urltext = str_replace(array('https://'), '', $jj['url']); - $o .= '<tr><td><a href="'. (($jj['sellpage']) ? $jj['sellpage'] : $jj['url'] . '/register' ) . '" ><i class="fa fa-link"></i> ' . $urltext . '</a>' . $location . '</td><td>' . $jj['access'] . '</td><td>' . $jj['register'] . '</td><td>' . '<a target="stats" href="https://hubchart-tarine.rhcloud.com/hub.jsp?hubFqdn=' . $m['host'] . '"><i class="fa fa-area-chart"></i></a></td><td>' . ucwords($jj['project']) . (($jj['version']) ? ' ' . $jj['version'] : '') . '</td>'; + $o .= '<tr><td><a href="'. (($jj['sellpage']) ? $jj['sellpage'] : $jj['url'] . '/register' ) . '" ><i class="fa fa-link"></i> ' . $urltext . '</a>' . $location . '</td><td>' . $jj['access'] . '</td><td>' . $jj['register'] . '</td><!--td>' . '<a target="stats" href="https://hubchart-tarine.rhcloud.com/hub.jsp?hubFqdn=' . $m['host'] . '"><i class="fa fa-area-chart"></i></a></td--><td>' . ucwords($jj['project']) . (($jj['version']) ? ' ' . $jj['version'] : '') . '</td>'; if($rating_enabled) $o .= '<td><a href="ratings/' . $host . '" class="btn-btn-default"><i class="fa fa-eye"></i> ' . t('View') . '</a></td>' . $rate_links ; $o .= '</tr>'; diff --git a/Zotlabs/Module/Pubstream.php b/Zotlabs/Module/Pubstream.php index 42aa2b51b..15e2d8a74 100644 --- a/Zotlabs/Module/Pubstream.php +++ b/Zotlabs/Module/Pubstream.php @@ -7,10 +7,10 @@ require_once('include/conversation.php'); class Pubstream extends \Zotlabs\Web\Controller { function get($update = 0, $load = false) { - + if($load) $_SESSION['loadtime'] = datetime_convert(); - + if(observer_prohibited(true)) { return login(); @@ -19,15 +19,28 @@ class Pubstream extends \Zotlabs\Web\Controller { $disable_discover_tab = get_config('system','disable_discover_tab') || get_config('system','disable_discover_tab') === false; if($disable_discover_tab) return; - + + $mid = ((x($_REQUEST,'mid')) ? $_REQUEST['mid'] : ''); + + if(strpos($mid,'b64.') === 0) + $decoded = @base64url_decode(substr($mid,4)); + if($decoded) + $mid = $decoded; + $item_normal = item_normal(); + $item_normal_update = item_normal_update(); $static = ((array_key_exists('static',$_REQUEST)) ? intval($_REQUEST['static']) : 0); - if(! $update) { + if(! $update && !$load) { + + nav_set_selected(t('Public Stream')); - $static = ((local_channel()) ? channel_manual_conv_update(local_channel()) : 0); + if(!$mid) + $_SESSION['static_loadtime'] = datetime_convert(); + + $static = ((local_channel()) ? channel_manual_conv_update(local_channel()) : 1); $maxheight = get_config('system','home_divmore_height'); if(! $maxheight) @@ -38,6 +51,10 @@ class Pubstream extends \Zotlabs\Web\Controller { . "; var profile_page = " . \App::$pager['page'] . "; divmore_height = " . intval($maxheight) . "; </script>\r\n"; + //if we got a decoded hash we must encode it again before handing to javascript + if($decoded) + $mid = 'b64.' . base64url_encode($mid); + \App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array( '$baseurl' => z_root(), '$pgtype' => 'pubstream', @@ -63,7 +80,7 @@ class Pubstream extends \Zotlabs\Web\Controller { '$cats' => '', '$tags' => '', '$dend' => '', - '$mid' => '', + '$mid' => $mid, '$verb' => '', '$dbegin' => '' )); @@ -105,7 +122,7 @@ class Pubstream extends \Zotlabs\Web\Controller { $simple_update = ''; if($static && $simple_update) - $simple_update .= " and item_thread_top = 0 and author_xchan = '" . protect_sprintf(get_observer_hash()) . "' "; + $simple_update .= " and item_thread_top = 0 and author_xchan = '" . protect_sprintf(get_observer_hash()) . "' "; //logger('update: ' . $update . ' load: ' . $load); @@ -114,29 +131,46 @@ class Pubstream extends \Zotlabs\Web\Controller { $ordering = "commented"; if($load) { - - // Fetch a page full of parent items for this page - - $r = q("SELECT distinct item.id AS item_id, $ordering FROM item - left join abook on item.author_xchan = abook.abook_xchan - WHERE true $uids $item_normal - AND item.parent = item.id - and (abook.abook_blocked = 0 or abook.abook_flags is null) - $sql_extra3 $sql_extra $sql_nets - ORDER BY $ordering DESC $pager_sql " - ); - - + if($mid) { + $r = q("SELECT parent AS item_id FROM item + left join abook on item.author_xchan = abook.abook_xchan + WHERE mid like '%s' $uids $item_normal + and (abook.abook_blocked = 0 or abook.abook_flags is null) + $sql_extra3 $sql_extra $sql_nets LIMIT 1", + dbesc($mid . '%') + ); + } + else { + // Fetch a page full of parent items for this page + $r = q("SELECT distinct item.id AS item_id, $ordering FROM item + left join abook on item.author_xchan = abook.abook_xchan + WHERE true $uids $item_normal + AND item.parent = item.id + and (abook.abook_blocked = 0 or abook.abook_flags is null) + $sql_extra3 $sql_extra $sql_nets + ORDER BY $ordering DESC $pager_sql " + ); + } } elseif($update) { - - $r = q("SELECT distinct item.id AS item_id, $ordering FROM item - left join abook on item.author_xchan = abook.abook_xchan - WHERE true $uids $item_normal - AND item.parent = item.id $simple_update - and (abook.abook_blocked = 0 or abook.abook_flags is null) - $sql_extra3 $sql_extra $sql_nets" - ); + if($mid) { + $r = q("SELECT parent AS item_id FROM item + left join abook on item.author_xchan = abook.abook_xchan + WHERE mid like '%s' $uids $item_normal_update $simple_update + and (abook.abook_blocked = 0 or abook.abook_flags is null) + $sql_extra3 $sql_extra $sql_nets LIMIT 1", + dbesc($mid . '%') + ); + } + else { + $r = q("SELECT distinct item.id AS item_id, $ordering FROM item + left join abook on item.author_xchan = abook.abook_xchan + WHERE true $uids $item_normal_update + AND item.parent = item.id $simple_update + and (abook.abook_blocked = 0 or abook.abook_flags is null) + $sql_extra3 $sql_extra $sql_nets" + ); + } $_SESSION['loadtime'] = datetime_convert(); } // Then fetch all the children of the parents that are on this page @@ -168,6 +202,9 @@ class Pubstream extends \Zotlabs\Web\Controller { $mode = ('network'); $o .= conversation($items,$mode,$update,$page_mode); + + if($mid) + $o .= '<div id="content-complete"></div>'; if(($items) && (! $update)) $o .= alt_pager($a,count($items)); diff --git a/Zotlabs/Module/Register.php b/Zotlabs/Module/Register.php index d4573156c..95e3ca96f 100644 --- a/Zotlabs/Module/Register.php +++ b/Zotlabs/Module/Register.php @@ -27,7 +27,7 @@ class Register extends \Zotlabs\Web\Controller { $result = check_account_email($_REQUEST['email']); break; case 'password_check.json': - $result = check_account_password($_REQUEST['password']); + $result = check_account_password($_REQUEST['password1']); break; default: break; @@ -123,12 +123,19 @@ class Register extends \Zotlabs\Web\Controller { if($policy == REGISTER_OPEN ) { if($email_verify) { $res = verify_email_address($result); + if($res) { + info( t('Registration successful. Please check your email for validation instructions.') . EOL ) ; + } } else { $res = send_register_success_email($result['email'],$result['password']); } if($res) { - info( t('Registration successful. Please check your email for validation instructions.') . EOL ) ; + if($invite_code) { + info( t('Registration successful. Continue to create your first channel...') . EOL ) ; + } else { + info( t('Registration successful. Please check your email for validation instructions.') . EOL ) ; + } } } elseif($policy == REGISTER_APPROVE) { @@ -167,7 +174,8 @@ class Register extends \Zotlabs\Web\Controller { $next_page = $x; $_SESSION['workflow'] = true; } - + + unset($_SESSION['login_return_url']); goaway(z_root() . '/' . $next_page); } @@ -231,8 +239,8 @@ class Register extends \Zotlabs\Web\Controller { $enable_tos = 1 - intval(get_config('system','no_termsofservice')); $email = array('email', t('Your email address'), ((x($_REQUEST,'email')) ? strip_tags(trim($_REQUEST['email'])) : "")); - $password = array('password', t('Choose a password'), ((x($_REQUEST,'password')) ? trim($_REQUEST['password']) : "")); - $password2 = array('password2', t('Please re-enter your password'), ((x($_REQUEST,'password2')) ? trim($_REQUEST['password2']) : "")); + $password = array('password', t('Choose a password'), ''); + $password2 = array('password2', t('Please re-enter your password'), ''); $invite_code = array('invite_code', t('Please enter your invitation code'), ((x($_REQUEST,'invite_code')) ? strip_tags(trim($_REQUEST['invite_code'])) : "")); $name = array('name', t('Name or caption'), ((x($_REQUEST,'name')) ? $_REQUEST['name'] : ''), t('Examples: "Bob Jameson", "Lisa and her Horses", "Soccer", "Aviation Group"')); $nickhub = '@' . str_replace(array('http://','https://','/'), '', get_config('system','baseurl')); diff --git a/Zotlabs/Module/Rmagic.php b/Zotlabs/Module/Rmagic.php index 9fcc72441..bfc03f6ec 100644 --- a/Zotlabs/Module/Rmagic.php +++ b/Zotlabs/Module/Rmagic.php @@ -17,8 +17,8 @@ class Rmagic extends \Zotlabs\Web\Controller { if($r) { if($r[0]['hubloc_url'] === z_root()) goaway(z_root() . '/login'); - $dest = z_root() . '/' . str_replace('zid=','zid_=',\App::$query_string); - goaway($r[0]['hubloc_url'] . '/magic' . '?f=&dest=' . $dest); + $dest = z_root() . '/' . str_replace(['rmagic','zid='],['','zid_='],\App::$query_string); + goaway($r[0]['hubloc_url'] . '/magic' . '?f=&owa=1&dest=' . $dest); } } } @@ -61,9 +61,9 @@ class Rmagic extends \Zotlabs\Web\Controller { if($_SESSION['return_url']) $dest = urlencode(z_root() . '/' . str_replace('zid=','zid_=',$_SESSION['return_url'])); else - $dest = urlencode(z_root() . '/' . str_replace('zid=','zid_=',\App::$query_string)); + $dest = urlencode(z_root() . '/' . str_replace([ 'rmagic', 'zid=' ] ,[ '', 'zid_='],\App::$query_string)); - goaway($url . '/magic' . '?f=&dest=' . $dest); + goaway($url . '/magic' . '?f=&owa=1&dest=' . $dest); } } } diff --git a/Zotlabs/Module/Rpost.php b/Zotlabs/Module/Rpost.php index 731eab82e..5d2f0d7e8 100644 --- a/Zotlabs/Module/Rpost.php +++ b/Zotlabs/Module/Rpost.php @@ -20,6 +20,7 @@ require_once('include/zot.php'); * body= Body of post * url= URL which will be parsed and the results appended to the body * source= Source application + * post_id= post_id of post to 'share' (local use only) * remote_return= absolute URL to return after posting is finished * type= choices are 'html' or 'bbcode', default is 'bbcode' * @@ -60,7 +61,7 @@ class Rpost extends \Zotlabs\Web\Controller { return login(); } - nav_set_selected(t('Post')); + nav_set_selected('Post'); // If we have saved rpost session variables, but nothing in the current $_REQUEST, recover the saved variables @@ -90,8 +91,6 @@ class Rpost extends \Zotlabs\Web\Controller { } $plaintext = true; - // if(feature_enabled(local_channel(),'richtext')) - // $plaintext = false; if(array_key_exists('type', $_REQUEST) && $_REQUEST['type'] === 'html') { require_once('include/html2bbcode.php'); @@ -110,28 +109,67 @@ class Rpost extends \Zotlabs\Web\Controller { if($x['success']) $_REQUEST['body'] = $_REQUEST['body'] . $x['body']; } + + if($_REQUEST['post_id']) { + $r = q("SELECT * from item WHERE id = %d LIMIT 1", + intval($_REQUEST['post_id']) + ); + if(($r) && (! intval($r[0]['item_private']))) { + $sql_extra = item_permissions_sql($r[0]['uid']); + + $r = q("select * from item where id = %d $sql_extra", + intval($_REQUEST['post_id']) + ); + if($r && $r[0]['mimetype'] === 'text/bbcode') { + + xchan_query($r); + + $is_photo = (($r[0]['obj_type'] === ACTIVITY_OBJ_PHOTO) ? true : false); + if($is_photo) { + $object = json_decode($r[0]['obj'],true); + $photo_bb = $object['body']; + } + + if (strpos($r[0]['body'], "[/share]") !== false) { + $pos = strpos($r[0]['body'], "[share"); + $i = substr($r[0]['body'], $pos); + } else { + $i = "[share author='".urlencode($r[0]['author']['xchan_name']). + "' profile='".$r[0]['author']['xchan_url'] . + "' avatar='".$r[0]['author']['xchan_photo_s']. + "' link='".$r[0]['plink']. + "' posted='".$r[0]['created']. + "' message_id='".$r[0]['mid']."']"; + if($r[0]['title']) + $i .= '[b]'.$r[0]['title'].'[/b]'."\r\n"; + $i .= (($is_photo) ? $photo_bb . "\r\n" . $r[0]['body'] : $r[0]['body']); + $i .= "[/share]"; + } + } + } + $_REQUEST['body'] = $_REQUEST['body'] . $i; + } $x = array( - 'is_owner' => true, - 'allow_location' => ((intval(get_pconfig($channel['channel_id'],'system','use_browser_location'))) ? '1' : ''), - 'default_location' => $channel['channel_location'], - 'nickname' => $channel['channel_address'], - 'lockstate' => (($acl->is_private()) ? 'lock' : 'unlock'), - 'acl' => populate_acl($channel_acl, true, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_stream'), get_post_aclDialogDescription(), 'acl_dialog_post'), - 'permissions' => $channel_acl, - 'bang' => '', - 'visitor' => true, - 'profile_uid' => local_channel(), - 'title' => $_REQUEST['title'], - 'body' => $_REQUEST['body'], - 'attachment' => $_REQUEST['attachment'], - 'source' => ((x($_REQUEST,'source')) ? strip_tags($_REQUEST['source']) : ''), - 'return_path' => 'rpost/return', - 'bbco_autocomplete' => 'bbcode', - 'editor_autocomplete'=> true, - 'bbcode' => true, - 'jotnets' => true - + 'is_owner' => true, + 'allow_location' => ((intval(get_pconfig($channel['channel_id'],'system','use_browser_location'))) ? '1' : ''), + 'default_location' => $channel['channel_location'], + 'nickname' => $channel['channel_address'], + 'lockstate' => (($acl->is_private()) ? 'lock' : 'unlock'), + 'acl' => populate_acl($channel_acl, true, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_stream'), get_post_aclDialogDescription(), 'acl_dialog_post'), + 'permissions' => $channel_acl, + 'bang' => '', + 'visitor' => true, + 'profile_uid' => local_channel(), + 'title' => $_REQUEST['title'], + 'body' => $_REQUEST['body'], + 'attachment' => $_REQUEST['attachment'], + 'source' => ((x($_REQUEST,'source')) ? strip_tags($_REQUEST['source']) : ''), + 'return_path' => 'rpost/return', + 'bbco_autocomplete' => 'bbcode', + 'editor_autocomplete' => true, + 'bbcode' => true, + 'jotnets' => true ); $editor = status_editor($a,$x); diff --git a/Zotlabs/Module/Search.php b/Zotlabs/Module/Search.php index e1d35b879..37e9a336f 100644 --- a/Zotlabs/Module/Search.php +++ b/Zotlabs/Module/Search.php @@ -22,7 +22,7 @@ class Search extends \Zotlabs\Web\Controller { if($load) $_SESSION['loadtime'] = datetime_convert(); - nav_set_selected(t('Search')); + nav_set_selected('Search'); require_once("include/bbcode.php"); require_once('include/security.php'); diff --git a/Zotlabs/Module/Settings/Channel.php b/Zotlabs/Module/Settings/Channel.php index 3e6adcf8d..41e23b717 100644 --- a/Zotlabs/Module/Settings/Channel.php +++ b/Zotlabs/Module/Settings/Channel.php @@ -199,6 +199,10 @@ class Channel { $vnotify += intval($_POST['vnotify10']); if(x($_POST,'vnotify11')) $vnotify += intval($_POST['vnotify11']); + if(x($_POST,'vnotify12')) + $vnotify += intval($_POST['vnotify12']); + if(x($_POST,'vnotify13') && (get_config('system', 'disable_discover_tab') != 1)) + $vnotify += intval($_POST['vnotify13']); $always_show_in_notices = x($_POST,'always_show_in_notices') ? 1 : 0; @@ -505,7 +509,7 @@ class Channel { '$expire' => array('expire',t('Expire other channel content after this many days'),$expire, t('0 or blank to use the website limit.') . ' ' . ((intval($sys_expire)) ? sprintf( t('This website expires after %d days.'),intval($sys_expire)) : t('This website does not expire imported content.')) . ' ' . t('The website limit takes precedence if lower than your limit.')), '$maxreq' => array('maxreq', t('Maximum Friend Requests/Day:'), intval($channel['channel_max_friend_req']) , t('May reduce spam activity')), - '$permissions' => t('Default Access Control List (ACL)'), + '$permissions' => t('Default Privacy Group'), '$permdesc' => t("\x28click to open/close\x29"), '$aclselect' => populate_acl($perm_defaults, false, \Zotlabs\Lib\PermissionDescription::fromDescription(t('Use my default audience setting for the type of object published'))), '$allow_cid' => acl2json($perm_defaults['allow_cid']), @@ -555,6 +559,8 @@ class Channel { '$vnotify9' => array('vnotify9', t('System critical alerts'), ($vnotify & VNOTIFY_ALERT), VNOTIFY_ALERT, t('Recommended'), $yes_no), '$vnotify10' => array('vnotify10', t('New connections'), ($vnotify & VNOTIFY_INTRO), VNOTIFY_INTRO, t('Recommended'), $yes_no), '$vnotify11' => array('vnotify11', t('System Registrations'), ($vnotify & VNOTIFY_REGISTER), VNOTIFY_REGISTER, '', $yes_no), + '$vnotify12' => array('vnotify12', t('Unseen shared files'), ($vnotify & VNOTIFY_FILES), VNOTIFY_FILES, '', $yes_no), + '$vnotify13' => ((get_config('system', 'disable_discover_tab') != 1) ? array('vnotify13', t('Unseen public activity'), ($vnotify & VNOTIFY_PUBS), VNOTIFY_PUBS, '', $yes_no) : array()), '$always_show_in_notices' => array('always_show_in_notices', t('Also show new wall posts, private messages and connections under Notices'), $always_show_in_notices, 1, '', $yes_no), '$evdays' => array('evdays', t('Notify me of events this many days in advance'), $evdays, t('Must be greater than 0')), diff --git a/Zotlabs/Module/Suggest.php b/Zotlabs/Module/Suggest.php index c3f4a6d5a..f79e4e245 100644 --- a/Zotlabs/Module/Suggest.php +++ b/Zotlabs/Module/Suggest.php @@ -29,7 +29,7 @@ class Suggest extends \Zotlabs\Web\Controller { return; } - nav_set_selected(t('Suggest Channels')); + nav_set_selected('Suggest Channels'); $_SESSION['return_url'] = z_root() . '/' . \App::$cmd; diff --git a/Zotlabs/Module/Tasks.php b/Zotlabs/Module/Tasks.php index c8deb11bf..0709f31f6 100644 --- a/Zotlabs/Module/Tasks.php +++ b/Zotlabs/Module/Tasks.php @@ -19,8 +19,8 @@ class Tasks extends \Zotlabs\Web\Controller { $arr['all'] = 1; $x = tasks_fetch($arr); + $x['html'] = ''; if($x['tasks']) { - $x['html'] = ''; foreach($x['tasks'] as $y) { $x['html'] .= '<div class="tasklist-item"><input type="checkbox" onchange="taskComplete(' . $y['id'] . '); return false;" /> ' . $y['summary'] . '</div>'; } @@ -69,6 +69,7 @@ class Tasks extends \Zotlabs\Web\Controller { if($x) $ret['success'] = true; } + json_return_and_die($ret); } diff --git a/Zotlabs/Module/Thing.php b/Zotlabs/Module/Thing.php index 95c6c5636..f816632ab 100644 --- a/Zotlabs/Module/Thing.php +++ b/Zotlabs/Module/Thing.php @@ -91,6 +91,7 @@ class Thing extends \Zotlabs\Web\Controller { } $orig_record = $t[0]; if($photo != $orig_record['obj_imgurl']) { + delete_thing_photo($orig_record['obj_imgurl'],get_observer_hash()); $arr = import_xchan_photo($photo,get_observer_hash(),true); $local_photo = $arr[0]; $local_photo_type = $arr[3]; @@ -336,6 +337,9 @@ class Thing extends \Zotlabs\Web\Controller { return ''; } + + delete_thing_photo($r[0]['obj_imgurl'],get_observer_hash()); + $x = q("delete from obj where obj_obj = '%s' and obj_type = %d and obj_channel = %d", dbesc($thing_hash), intval(TERM_OBJ_THING), diff --git a/Zotlabs/Module/Update_cards.php b/Zotlabs/Module/Update_cards.php new file mode 100644 index 000000000..bb87357e8 --- /dev/null +++ b/Zotlabs/Module/Update_cards.php @@ -0,0 +1,39 @@ +<?php + +namespace Zotlabs\Module; + +/** + * Module: update_profile + * Purpose: AJAX synchronisation of profile page + * + */ + + +class Update_cards extends \Zotlabs\Web\Controller { + +function get() { + + $profile_uid = intval($_GET['p']); + $load = (((argc() > 1) && (argv(1) == 'load')) ? 1 : 0); + + header("Content-type: text/html"); + echo "<!DOCTYPE html><html><body><section></section></body></html>\r\n"; + + killme(); + + + $mod = new Cards(); + + $text = $mod->get($profile_uid,$load); + + /** + * reportedly some versions of MSIE don't handle tabs in XMLHttpRequest documents very well + */ + + echo str_replace("\t",' ',$text); + echo (($_GET['msie'] == 1) ? '</div>' : '</section>'); + echo "</body></html>\r\n"; + killme(); + +} +} diff --git a/Zotlabs/Module/Wall_attach.php b/Zotlabs/Module/Wall_attach.php index 03d4cb37b..e001ad929 100644 --- a/Zotlabs/Module/Wall_attach.php +++ b/Zotlabs/Module/Wall_attach.php @@ -97,6 +97,12 @@ class Wall_attach extends \Zotlabs\Web\Controller { $s = "\n\n" . '[attachment]' . $r['data']['hash'] . ',' . $r['data']['revision'] . '[/attachment]' . "\n"; } + + $sync = attach_export_data($channel,$r['data']['hash']); + if($sync) { + build_sync_packet($channel['channel_id'],array('file' => array($sync))); + } + if($using_api) return $s; diff --git a/Zotlabs/Module/Webpages.php b/Zotlabs/Module/Webpages.php index e449a790f..97ec55ba3 100644 --- a/Zotlabs/Module/Webpages.php +++ b/Zotlabs/Module/Webpages.php @@ -35,7 +35,7 @@ class Webpages extends \Zotlabs\Web\Controller { return; } - nav_set_selected(t('Webpages')); + nav_set_selected('Webpages'); $which = argv(1); diff --git a/Zotlabs/Module/Wfinger.php b/Zotlabs/Module/Wfinger.php index 07a7b7735..2e9307196 100644 --- a/Zotlabs/Module/Wfinger.php +++ b/Zotlabs/Module/Wfinger.php @@ -30,9 +30,15 @@ class Wfinger extends \Zotlabs\Web\Controller { $resource = $_REQUEST['resource']; logger('webfinger: ' . $resource,LOGGER_DEBUG); + + $root_resource = false; + + if(strcasecmp(rtrim($resource,'/'),z_root()) === 0) + $root_resource = true; + $r = null; - if($resource) { + if(($resource) && (! $root_resource)) { if(strpos($resource,'acct:') === 0) { $channel = str_replace('acct:','',$resource); @@ -60,7 +66,25 @@ class Wfinger extends \Zotlabs\Web\Controller { header('Access-Control-Allow-Origin: *'); + + if($root_resource) { + $result['subject'] = $resource; + $result['properties'] = [ + 'https://w3id.org/security/v1#publicKeyPem' => get_config('system','pubkey') + ]; + $result['links'] = [ + [ + 'rel' => 'http://purl.org/openwebauth/v1', + 'type' => 'application/x-zot+json', + 'href' => z_root() . '/owa', + ], + ]; + + + + } + if($resource && $r) { $h = q("select hubloc_addr from hubloc where hubloc_hash = '%s' and hubloc_deleted = 0", @@ -84,7 +108,8 @@ class Wfinger extends \Zotlabs\Web\Controller { $result['properties'] = [ 'http://webfinger.net/ns/name' => $r[0]['channel_name'], - 'http://xmlns.com/foaf/0.1/name' => $r[0]['channel_name'] + 'http://xmlns.com/foaf/0.1/name' => $r[0]['channel_name'], + 'https://w3id.org/security/v1#publicKeyPem' => $r[0]['xchan_pubkey'] ]; foreach($aliases as $alias) @@ -98,7 +123,13 @@ class Wfinger extends \Zotlabs\Web\Controller { 'type' => $r[0]['xchan_photo_mimetype'], 'href' => $r[0]['xchan_photo_l'] ], - + + [ + 'rel' => 'http://microformats.org/profile/hcard', + 'type' => 'text/html', + 'href' => z_root() . '/hcard/' . $r[0]['channel_address'] + ], + [ 'rel' => 'http://webfinger.net/rel/profile-page', 'href' => z_root() . '/profile/' . $r[0]['channel_address'], @@ -124,6 +155,13 @@ class Wfinger extends \Zotlabs\Web\Controller { 'rel' => 'http://purl.org/zot/protocol', 'href' => z_root() . '/.well-known/zot-info' . '?address=' . $r[0]['xchan_addr'], ], + + [ + 'rel' => 'http://purl.org/openwebauth/v1', + 'type' => 'application/x-zot+json', + 'href' => z_root() . '/owa', + ], + [ 'rel' => 'magic-public-key', @@ -136,14 +174,16 @@ class Wfinger extends \Zotlabs\Web\Controller { $result['zot'] = zotinfo( [ 'address' => $r[0]['xchan_addr'] ]); } } - else { + + if(! $result) { header($_SERVER["SERVER_PROTOCOL"] . ' ' . 400 . ' ' . 'Bad Request'); killme(); } $arr = [ 'channel' => $r[0], 'request' => $_REQUEST, 'result' => $result ]; call_hooks('webfinger',$arr); - + + json_return_and_die($arr['result'],'application/jrd+json'); } diff --git a/Zotlabs/Module/Wiki.php b/Zotlabs/Module/Wiki.php index 4dc11c683..d6a01af11 100644 --- a/Zotlabs/Module/Wiki.php +++ b/Zotlabs/Module/Wiki.php @@ -76,7 +76,7 @@ class Wiki extends \Zotlabs\Web\Controller { $wiki_owner = true; - nav_set_selected(t('Wiki')); + nav_set_selected('Wiki'); // Obtain the default permission settings of the channel $owner_acl = array( @@ -113,12 +113,13 @@ class Wiki extends \Zotlabs\Web\Controller { $o = ''; // Download a wiki -/* + if((argc() > 3) && (argv(2) === 'download') && (argv(3) === 'wiki')) { $resource_id = argv(4); + $w = Zlib\NativeWiki::get_wiki($owner['channel_id'],$observer_hash,$resource_id); - $w = Zlib\NativeWiki::get_wiki($owner,$observer_hash,$resource_id); +// $w = Zlib\NativeWiki::get_wiki($owner,$observer_hash,$resource_id); if(! $w['htmlName']) { notice(t('Error retrieving wiki') . EOL); } @@ -133,8 +134,41 @@ class Wiki extends \Zotlabs\Web\Controller { $zip_filename = $w['urlName']; $zip_filepath = '/tmp/' . $zip_folder_name . '/' . $zip_filename; + // Generate the zip file - ZLib\ExtendedZip::zipTree($w['path'], $zip_filepath, \ZipArchive::CREATE); + + $zip = new \ZipArchive; + $r = $zip->open($zip_filepath, \ZipArchive::CREATE); + if($r === true) { + $pages = []; + $i = q("select * from item where resource_type = 'nwikipage' and resource_id = '%s' order by revision desc", + dbesc($resource_id) + ); + + if($i) { + foreach($i as $iv) { + if(in_array($iv['mid'],$pages)) + continue; + + if($iv['mimetype'] === 'text/plain') { + $content = html_entity_decode($iv['body'],ENT_COMPAT,'UTF-8'); + } + elseif($iv['mimetype'] === 'text/bbcode') { + $content = html_entity_decode($iv['body'],ENT_COMPAT,'UTF-8'); + } + elseif($iv['mimetype'] === 'text/markdown') { + $content = html_entity_decode(Zlib\MarkdownSoap::unescape($iv['body']),ENT_COMPAT,'UTF-8'); + } + $fname = get_iconfig($iv['id'],'nwikipage','pagetitle') . Zlib\NativeWikiPage::get_file_ext($iv); + $zip->addFromString($fname,$content); + $pages[] = $iv['mid']; + } + + + } + + } + $zip->close(); // Output the file for download @@ -153,10 +187,11 @@ class Wiki extends \Zotlabs\Web\Controller { killme(); } -*/ + switch(argc()) { case 2: $wikis = Zlib\NativeWiki::listwikis($owner, get_observer_hash()); + if($wikis) { $o .= replace_macros(get_markup_template('wikilist.tpl'), array( '$header' => t('Wikis'), @@ -170,16 +205,19 @@ class Wiki extends \Zotlabs\Web\Controller { '$create' => t('Create New'), '$submit' => t('Submit'), '$wikiName' => array('wikiName', t('Wiki name')), - '$mimeType' => array('mimeType', t('Content type'), '', '', ['text/markdown' => 'Markdown', 'text/bbcode' => 'BB Code']), + '$mimeType' => array('mimeType', t('Content type'), '', '', ['text/markdown' => t('Markdown'), 'text/bbcode' => t('BBcode'), 'text/plain' => t('Text') ]), '$name' => t('Name'), '$type' => t('Type'), + '$unlocked' => t('Any type'), '$lockstate' => $x['lockstate'], '$acl' => $x['acl'], '$allow_cid' => $x['allow_cid'], '$allow_gid' => $x['allow_gid'], '$deny_cid' => $x['deny_cid'], '$deny_gid' => $x['deny_gid'], - '$notify' => array('postVisible', t('Create a status post for this wiki'), '', '', array(t('No'), t('Yes'))) + '$typelock' => array('typelock', t('Lock content type'), '', '', array(t('No'), t('Yes'))), + '$notify' => array('postVisible', t('Create a status post for this wiki'), '', '', array(t('No'), t('Yes'))), + '$edit_wiki_name' => t('Edit Wiki Name') )); return $o; @@ -259,9 +297,11 @@ class Wiki extends \Zotlabs\Web\Controller { goaway(z_root() . '/' . argv(0) . '/' . argv(1) ); } - $mimeType = $p['mimeType']; + $mimeType = $p['pageMimeType']; $sampleContent = (($mimeType == 'text/bbcode') ? '[h3]' . t('New page') . '[/h3]' : '### ' . t('New page')); + if($mimeType === 'text/plain') + $sampleContent = t('New page'); $content = (($p['content'] == '') ? $sampleContent : $p['content']); @@ -269,7 +309,10 @@ class Wiki extends \Zotlabs\Web\Controller { if($mimeType == 'text/bbcode') { $renderedContent = Zlib\NativeWikiPage::convert_links(zidify_links(smilies(bbcode($content))), argv(0) . '/' . argv(1) . '/' . $wikiUrlName); } - else { + elseif($mimeType === 'text/plain') { + $renderedContent = str_replace(["\n",' ',"\t"],[EOL,' ',' '],htmlentities($content,ENT_COMPAT,'UTF-8',false)); + } + elseif($mimeType === 'text/markdown') { $content = Zlib\MarkdownSoap::unescape($content); $html = Zlib\NativeWikiPage::generate_toc(zidify_text(MarkdownExtra::defaultTransform(Zlib\NativeWikiPage::bbcode($content)))); $renderedContent = Zlib\NativeWikiPage::convert_links($html, argv(0) . '/' . argv(1) . '/' . $wikiUrlName); @@ -290,6 +333,9 @@ class Wiki extends \Zotlabs\Web\Controller { '$cancel' => t('Cancel') )); + $types = [ 'text/bbcode' => t('BBcode'), 'text/markdown' => t('Markdown'), 'text/plain' => 'Text' ]; + $currenttype = $types[$mimeType]; + $placeholder = t('Short description of your changes (optional)'); $o .= replace_macros(get_markup_template('wiki.tpl'),array( @@ -304,6 +350,7 @@ class Wiki extends \Zotlabs\Web\Controller { '$resource_id' => $resource_id, '$page' => $pageUrlName, '$mimeType' => $mimeType, + '$typename' => $currenttype, '$content' => $content, '$renderedContent' => $renderedContent, '$pageRename' => array('pageRename', t('New page name'), '', ''), @@ -323,7 +370,7 @@ class Wiki extends \Zotlabs\Web\Controller { '$modalerroralbum' => t('Error getting album'), )); - if($p['mimeType'] != 'text/bbcode') + if($p['pageMimeType'] === 'text/markdown') head_add_js('/library/ace/ace.js'); // Ace Code Editor return $o; @@ -347,17 +394,17 @@ class Wiki extends \Zotlabs\Web\Controller { if((argc() > 2) && (argv(2) === 'preview')) { $content = $_POST['content']; $resource_id = $_POST['resource_id']; + $w = Zlib\NativeWiki::get_wiki($owner['channel_id'],$observer_hash,$resource_id); $wikiURL = argv(0) . '/' . argv(1) . '/' . $w['urlName']; - $mimeType = $w['mimeType']; + $mimeType = $_POST['mimetype']; - if($mimeType == 'text/bbcode') { + if($mimeType === 'text/bbcode') { $html = Zlib\NativeWikiPage::convert_links(zidify_links(smilies(bbcode($content))),$wikiURL); } - else { - + elseif($mimeType === 'text/markdown') { $bb = Zlib\NativeWikiPage::bbcode($content); $x = new ZLib\MarkdownSoap($bb); $md = $x->clean(); @@ -366,6 +413,9 @@ class Wiki extends \Zotlabs\Web\Controller { $html = Zlib\NativeWikiPage::generate_toc(zidify_text($html)); $html = Zlib\NativeWikiPage::convert_links($html,$wikiURL); } + elseif($mimeType === 'text/plain') { + $html = str_replace(["\n",' ',"\t"],[EOL,' ',' '],htmlentities($content,ENT_COMPAT,'UTF-8',false)); + } json_return_and_die(array('html' => $html, 'success' => true)); } @@ -386,6 +436,7 @@ class Wiki extends \Zotlabs\Web\Controller { $wiki['htmlName'] = escape_tags($_POST['wikiName']); $wiki['urlName'] = urlencode(urlencode($_POST['wikiName'])); $wiki['mimeType'] = $_POST['mimeType']; + $wiki['typelock'] = $_POST['typelock']; if($wiki['urlName'] === '') { notice( t('Error creating wiki. Invalid name.') . EOL); @@ -406,7 +457,7 @@ class Wiki extends \Zotlabs\Web\Controller { $r = Zlib\NativeWiki::create_wiki($owner, $observer_hash, $wiki, $acl); if($r['success']) { Zlib\NativeWiki::sync_a_wiki_item($owner['channel_id'],$r['item_id'],$r['item']['resource_id']); - $homePage = Zlib\NativeWikiPage::create_page($owner['channel_id'],$observer_hash,'Home', $r['item']['resource_id']); + $homePage = Zlib\NativeWikiPage::create_page($owner['channel_id'],$observer_hash,'Home', $r['item']['resource_id'], $wiki['mimeType']); if(! $homePage['success']) { notice( t('Wiki created, but error creating Home page.')); goaway(z_root() . '/wiki/' . $nick . '/' . $wiki['urlName']); @@ -420,6 +471,52 @@ class Wiki extends \Zotlabs\Web\Controller { } } + // Update a wiki + // /wiki/channel/update/wiki + if ((argc() > 3) && (argv(2) === 'update') && (argv(3) === 'wiki')) { + // Only the channel owner can update a wiki, at least until we create a + // more detail permissions framework + + if (local_channel() !== intval($owner['channel_id'])) { + goaway('/' . argv(0) . '/' . $nick . '/'); + } + + $arr = []; + + $arr['urlName'] = urlencode(urlencode($_POST['origRawName'])); + + if($_POST['updateRawName']) + $arr['updateRawName'] = $_POST['updateRawName']; + + if(($arr['urlName'] || $arr['updateRawName']) === '') { + notice( t('Error updating wiki. Invalid name.') . EOL); + goaway('/wiki'); + return; //not reached + } + + $wiki = Zlib\NativeWiki::exists_by_name($owner['channel_id'], $arr['urlName']); + + if($wiki['resource_id']) { + + $arr['resource_id'] = $wiki['resource_id']; + + $acl = new \Zotlabs\Access\AccessList($owner); + $acl->set_from_array($_POST); + + $r = Zlib\NativeWiki::update_wiki($owner['channel_id'], $observer_hash, $arr, $acl); + if($r['success']) { + Zlib\NativeWiki::sync_a_wiki_item($owner['channel_id'],$r['item_id'],$r['item']['resource_id']); + goaway(z_root() . '/wiki/' . $nick); + } + else { + notice( t('Error updating wiki')); + goaway(z_root() . '/wiki'); + } + + } + goaway(z_root() . '/wiki'); + } + // Delete a wiki if ((argc() > 3) && (argv(2) === 'delete') && (argv(3) === 'wiki')) { @@ -445,11 +542,13 @@ class Wiki extends \Zotlabs\Web\Controller { // Create a page if ((argc() === 4) && (argv(2) === 'create') && (argv(3) === 'page')) { + $mimetype = $_POST['mimetype']; + $resource_id = $_POST['resource_id']; // Determine if observer has permission to create a page + - - $perms = Zlib\NativeWiki::get_permissions($resource_id, intval($owner['channel_id']), $observer_hash); + $perms = Zlib\NativeWiki::get_permissions($resource_id, intval($owner['channel_id']), $observer_hash, $mimetype); if(! $perms['write']) { logger('Wiki write permission denied. ' . EOL); json_return_and_die(array('success' => false)); @@ -459,7 +558,7 @@ class Wiki extends \Zotlabs\Web\Controller { if(urlencode(escape_tags($_POST['pageName'])) === '') { json_return_and_die(array('message' => 'Error creating page. Invalid name.', 'success' => false)); } - $page = Zlib\NativeWikiPage::create_page($owner['channel_id'],$observer_hash, $name, $resource_id); + $page = Zlib\NativeWikiPage::create_page($owner['channel_id'],$observer_hash, $name, $resource_id, $mimetype); if($page['item_id']) { $commit = Zlib\NativeWikiPage::commit(array( diff --git a/Zotlabs/Module/Xrd.php b/Zotlabs/Module/Xrd.php index 60a8f58fa..959e31cbe 100644 --- a/Zotlabs/Module/Xrd.php +++ b/Zotlabs/Module/Xrd.php @@ -50,6 +50,7 @@ class Xrd extends \Zotlabs\Web\Controller { '$accturi' => $resource, '$subject' => $subject, '$aliases' => $aliases, + '$channel_url' => z_root() . '/channel/' . $r[0]['channel_address'], '$profile_url' => z_root() . '/channel/' . $r[0]['channel_address'], '$hcard_url' => z_root() . '/hcard/' . $r[0]['channel_address'], '$atom' => z_root() . '/ofeed/' . $r[0]['channel_address'], diff --git a/Zotlabs/Module/Zfinger.php b/Zotlabs/Module/Zfinger.php index 2ff605fc9..0f7f6a64b 100644 --- a/Zotlabs/Module/Zfinger.php +++ b/Zotlabs/Module/Zfinger.php @@ -9,8 +9,36 @@ class Zfinger extends \Zotlabs\Web\Controller { require_once('include/zot.php'); require_once('include/crypto.php'); - $x = zotinfo($_REQUEST); + + if($x && $x['guid'] && $x['guid_sig']) { + $chan_hash = make_xchan_hash($x['guid'],$x['guid_sig']); + if($chan_hash) { + $chan = channelx_by_hash($chan_hash); + } + } + + $headers = []; + $headers['Content-Type'] = 'application/json' ; + $ret = json_encode($x); + + if($chan) { + $hash = \Zotlabs\Web\HTTPSig::generate_digest($ret,false); + $headers['Digest'] = 'SHA-256=' . $hash; + \Zotlabs\Web\HTTPSig::create_sig('',$headers,$chan['channel_prvkey'], + 'acct:' . $chan['channel_address'] . '@' . \App::get_hostname(),true); + } + else { + foreach($headers as $k => $v) { + header($k . ': ' . $v); + } + } + + echo $ret; + killme(); + + + json_return_and_die($x); } diff --git a/Zotlabs/Render/Comanche.php b/Zotlabs/Render/Comanche.php index beee9796e..8831bd117 100644 --- a/Zotlabs/Render/Comanche.php +++ b/Zotlabs/Render/Comanche.php @@ -121,6 +121,11 @@ class Comanche { if($cnt) \App::$layout['theme'] = trim($matches[1]); + $cnt = preg_match("/\[navbar\](.*?)\[\/navbar\]/ism", $s, $matches); + if($cnt) + \App::$layout['navbar'] = trim($matches[1]); + + $cnt = preg_match_all("/\[webpage\](.*?)\[\/webpage\]/ism", $s, $matches, PREG_SET_ORDER); if($cnt) { // only the last webpage definition is used if there is more than one @@ -148,6 +153,7 @@ class Comanche { * $observer.address - xchan_addr or false * $observer.name - xchan_name or false * $observer - xchan_hash of observer or empty string + * $local_channel - logged in channel_id or false */ function get_condition_var($v) { @@ -157,6 +163,9 @@ class Comanche { return get_config($x[1],$x[2]); elseif($x[0] === 'request') return $_SERVER['REQUEST_URI']; + elseif($x[0] === 'local_channel') { + return local_channel(); + } elseif($x[0] === 'observer') { if(count($x) > 1) { if($x[1] == 'language') @@ -168,6 +177,8 @@ class Comanche { return $y['xchan_addr']; elseif($x[1] == 'name') return $y['xchan_name']; + elseif($x[1] == 'webname') + return substr($y['xchan_addr'],0,strpos($y['xchan_addr'],'@')); return false; } return get_observer_hash(); @@ -450,6 +461,9 @@ class Comanche { } } + if(! purify_filename($name)) + return ''; + $clsname = ucfirst($name); $nsname = "\\Zotlabs\\Widget\\" . $clsname; diff --git a/Zotlabs/Storage/Browser.php b/Zotlabs/Storage/Browser.php index 3af9fcab1..6f6f4a292 100644 --- a/Zotlabs/Storage/Browser.php +++ b/Zotlabs/Storage/Browser.php @@ -244,7 +244,7 @@ class Browser extends DAV\Browser\Plugin { $a = false; - nav_set_selected(t('Files')); + nav_set_selected('Files'); \App::$page['content'] = $html; load_pdl(); @@ -347,7 +347,8 @@ class Browser extends DAV\Browser\Plugin { '$return_url' => \App::$cmd, '$path' => $path, '$folder' => find_folder_hash_by_path($this->auth->owner_id, $path), - '$dragdroptext' => t('Drop files here to immediately upload') + '$dragdroptext' => t('Drop files here to immediately upload'), + '$notify' => ['notify', t('Show in your contacts shared folder'), 0, '', [t('No'), t('Yes')]] )); } diff --git a/Zotlabs/Storage/File.php b/Zotlabs/Storage/File.php index 7a102134f..332bf6896 100644 --- a/Zotlabs/Storage/File.php +++ b/Zotlabs/Storage/File.php @@ -254,7 +254,7 @@ class File extends DAV\Node implements DAV\IFile { // @todo this should be a global definition $unsafe_types = array('text/html', 'text/css', 'application/javascript'); - if (in_array($r[0]['filetype'], $unsafe_types)) { + if (in_array($r[0]['filetype'], $unsafe_types) && (! channel_codeallowed($this->data['uid']))) { header('Content-disposition: attachment; filename="' . $r[0]['filename'] . '"'); header('Content-type: text/plain'); } @@ -300,7 +300,7 @@ class File extends DAV\Node implements DAV\IFile { public function getContentType() { // @todo this should be a global definition. $unsafe_types = array('text/html', 'text/css', 'application/javascript'); - if (in_array($this->data['filetype'], $unsafe_types)) { + if (in_array($this->data['filetype'], $unsafe_types) && (! channel_codeallowed($this->data['uid']))) { return 'text/plain'; } return $this->data['filetype']; diff --git a/Zotlabs/Web/CheckJS.php b/Zotlabs/Web/CheckJS.php index 109790fa5..8179ceb15 100644 --- a/Zotlabs/Web/CheckJS.php +++ b/Zotlabs/Web/CheckJS.php @@ -21,9 +21,9 @@ class CheckJS { $page = urlencode(\App::$query_string); if($test) { - self::$jsdisabled = 1; + $this->jsdisabled = 1; if(array_key_exists('jsdisabled',$_COOKIE)) - self::$jsdisabled = $_COOKIE['jsdisabled']; + $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"; @@ -41,7 +41,7 @@ class CheckJS { } function disabled() { - return self::$jsdisabled; + return $this->jsdisabled; } diff --git a/Zotlabs/Web/HTTPHeaders.php b/Zotlabs/Web/HTTPHeaders.php index 1e4c1bf84..4be51a8f3 100644 --- a/Zotlabs/Web/HTTPHeaders.php +++ b/Zotlabs/Web/HTTPHeaders.php @@ -40,6 +40,20 @@ class HTTPHeaders { function fetch() { return $this->parsed; } + + function fetcharr() { + $ret = []; + if($this->parsed) { + foreach($this->parsed as $x) { + foreach($x as $y => $z) { + $ret[$y] = $z; + } + } + } + return $ret; + } + + } diff --git a/Zotlabs/Web/HTTPSig.php b/Zotlabs/Web/HTTPSig.php new file mode 100644 index 000000000..1c66b8cf4 --- /dev/null +++ b/Zotlabs/Web/HTTPSig.php @@ -0,0 +1,313 @@ +<?php + +namespace Zotlabs\Web; + +/** + * Implements HTTP Signatures per draft-cavage-http-signatures-07 + */ + + +class HTTPSig { + + // See RFC5843 + + static function generate_digest($body,$set = true) { + $digest = base64_encode(hash('sha256',$body,true)); + + if($set) { + header('Digest: SHA-256=' . $digest); + } + return $digest; + } + + // See draft-cavage-http-signatures-08 + + static function verify($data,$key = '') { + + $body = $data; + $headers = null; + $spoofable = false; + + $result = [ + 'signer' => '', + 'header_signed' => false, + 'header_valid' => false, + 'content_signed' => false, + 'content_valid' => false + ]; + + // decide if $data arrived via controller submission or curl + if(is_array($data) && $data['header']) { + if(! $data['success']) + return $result; + $h = new \Zotlabs\Web\HTTPHeaders($data['header']); + $headers = $h->fetcharr(); + $body = $data['body']; + } + + else { + $headers = []; + $headers['(request-target)'] = + strtolower($_SERVER['REQUEST_METHOD']) . ' ' . + $_SERVER['REQUEST_URI']; + foreach($_SERVER as $k => $v) { + if(strpos($k,'HTTP_') === 0) { + $field = str_replace('_','-',strtolower(substr($k,5))); + $headers[$field] = $v; + } + } + } + + $sig_block = null; + + if(array_key_exists('signature',$headers)) { + $sig_block = self::parse_sigheader($headers['signature']); + } + elseif(array_key_exists('authorization',$headers)) { + $sig_block = self::parse_sigheader($headers['authorization']); + } + + if(! $sig_block) { + logger('no signature provided.'); + return $result; + } + + // Warning: This log statement includes binary data + // logger('sig_block: ' . print_r($sig_block,true), LOGGER_DATA); + + $result['header_signed'] = true; + + $signed_headers = $sig_block['headers']; + if(! $signed_headers) + $signed_headers = [ 'date' ]; + + $signed_data = ''; + foreach($signed_headers as $h) { + if(array_key_exists($h,$headers)) { + $signed_data .= $h . ': ' . $headers[$h] . "\n"; + } + if(strpos($h,'.')) { + $spoofable = true; + } + } + $signed_data = rtrim($signed_data,"\n"); + + $algorithm = null; + if($sig_block['algorithm'] === 'rsa-sha256') { + $algorithm = 'sha256'; + } + if($sig_block['algorithm'] === 'rsa-sha512') { + $algorithm = 'sha512'; + } + + if($key && function_exists($key)) { + $result['signer'] = $sig_block['keyId']; + $key = $key($sig_block['keyId']); + } + + if(! $key) { + $result['signer'] = $sig_block['keyId']; + $key = self::get_activitypub_key($sig_block['keyId']); + } + + if(! $key) + return $result; + + $x = rsa_verify($signed_data,$sig_block['signature'],$key,$algorithm); + + logger('verified: ' . $x, LOGGER_DEBUG); + + if($x === false) + return $result; + + if(! $spoofable) + $result['header_valid'] = true; + + if(in_array('digest',$signed_headers)) { + $result['content_signed'] = true; + $digest = explode('=', $headers['digest']); + if($digest[0] === 'SHA-256') + $hashalg = 'sha256'; + if($digest[0] === 'SHA-512') + $hashalg = 'sha512'; + + // The explode operation will have stripped the '=' padding, so compare against unpadded base64 + if(rtrim(base64_encode(hash($hashalg,$body,true)),'=') === $digest[1]) { + $result['content_valid'] = true; + } + } + + logger('Content_Valid: ' . $result['content_valid']); + + return $result; + + } + + function get_activitypub_key($id) { + + if(strpos($id,'acct:') === 0) { + $x = q("select xchan_pubkey from xchan left join hubloc on xchan_hash = hubloc_hash where hubloc_addr = '%s' limit 1", + dbesc(str_replace('acct:','',$id)) + ); + } + else { + $x = q("select xchan_pubkey from xchan where xchan_hash = '%s' and xchan_network = 'activitypub' ", + dbesc($id) + ); + } + + if($x && $x[0]['xchan_pubkey']) { + return ($x[0]['xchan_pubkey']); + } + $r = as_fetch($id); + + if($r) { + $j = json_decode($r,true); + + if($j['id'] !== $id) + return false; + if(array_key_exists('publicKey',$j) && array_key_exists('publicKeyPem',$j['publicKey'])) { + return($j['publicKey']['publicKeyPem']); + } + } + return false; + } + + + + + static function create_sig($request,$head,$prvkey,$keyid = 'Key',$send_headers = false,$auth = false,$alg = 'sha256', + $crypt_key = null, $crypt_algo = 'aes256ctr') { + + $return_headers = []; + + if($alg === 'sha256') { + $algorithm = 'rsa-sha256'; + } + if($alg === 'sha512') { + $algorithm = 'rsa-sha512'; + } + + $x = self::sign($request,$head,$prvkey,$alg); + + $headerval = 'keyId="' . $keyid . '",algorithm="' . $algorithm + . '",headers="' . $x['headers'] . '",signature="' . $x['signature'] . '"'; + + if($crypt_key) { + $x = crypto_encapsulate($headerval,$crypt_key,$crypt_alg); + $headerval = 'iv="' . $x['iv'] . '",key="' . $x['key'] . '",alg="' . $x['alg'] . '",data="' . $x['data']; + } + + if($auth) { + $sighead = 'Authorization: Signature ' . $headerval; + } + else { + $sighead = 'Signature: ' . $headerval; + } + + if($head) { + foreach($head as $k => $v) { + if($send_headers) { + header($k . ': ' . $v); + } + else { + $return_headers[] = $k . ': ' . $v; + } + } + } + if($send_headers) { + header($sighead); + } + else { + $return_headers[] = $sighead; + } + return $return_headers; + } + + + + static function sign($request,$head,$prvkey,$alg = 'sha256') { + + $ret = []; + + $headers = ''; + $fields = ''; + if($request) { + $headers = '(request-target)' . ': ' . trim($request) . "\n"; + $fields = '(request-target)'; + } + + if(head) { + foreach($head as $k => $v) { + $headers .= strtolower($k) . ': ' . trim($v) . "\n"; + if($fields) + $fields .= ' '; + $fields .= strtolower($k); + } + // strip the trailing linefeed + $headers = rtrim($headers,"\n"); + } + + $sig = base64_encode(rsa_sign($headers,$prvkey,$alg)); + + $ret['headers'] = $fields; + $ret['signature'] = $sig; + + return $ret; + } + + static function parse_sigheader($header) { + + $ret = []; + $matches = []; + + // if the header is encrypted, decrypt with (default) site private key and continue + + if(preg_match('/iv="(.*?)"/ism',$header,$matches)) + $header = self::decrypt_sigheader($header); + + if(preg_match('/keyId="(.*?)"/ism',$header,$matches)) + $ret['keyId'] = $matches[1]; + if(preg_match('/algorithm="(.*?)"/ism',$header,$matches)) + $ret['algorithm'] = $matches[1]; + if(preg_match('/headers="(.*?)"/ism',$header,$matches)) + $ret['headers'] = explode(' ', $matches[1]); + if(preg_match('/signature="(.*?)"/ism',$header,$matches)) + $ret['signature'] = base64_decode(preg_replace('/\s+/','',$matches[1])); + + if(($ret['signature']) && ($ret['algorithm']) && (! $ret['headers'])) + $ret['headers'] = [ 'date' ]; + + return $ret; + } + + + static function decrypt_sigheader($header,$prvkey = null) { + + $iv = $key = $alg = $data = null; + + if(! $prvkey) { + $prvkey = get_config('system','prvkey'); + } + + $matches = []; + + if(preg_match('/iv="(.*?)"/ism',$header,$matches)) + $iv = $matches[1]; + if(preg_match('/key="(.*?)"/ism',$header,$matches)) + $key = $matches[1]; + if(preg_match('/alg="(.*?)"/ism',$header,$matches)) + $alg = $matches[1]; + if(preg_match('/data="(.*?)"/ism',$header,$matches)) + $data = $matches[1]; + + if($iv && $key && $alg && $data) { + return crypto_unencapsulate([ 'iv' => $iv, 'key' => $key, 'alg' => $alg, 'data' => $data ] , $prvkey); + } + return ''; + + } + +} + + diff --git a/Zotlabs/Web/Router.php b/Zotlabs/Web/Router.php index 3190369c8..9486130cb 100644 --- a/Zotlabs/Web/Router.php +++ b/Zotlabs/Web/Router.php @@ -119,6 +119,18 @@ class Router { if(! (\App::$module_loaded)) { + // undo the setting of a letsencrypt acme-challenge rewrite rule + // which blocks access to our .well-known routes. + // Also provide a config setting for sites that have a legitimate need + // for a custom .htaccess in the .well-known directory; but they should + // make the file read-only so letsencrypt doesn't modify it + + if(strpos($_SERVER['REQUEST_URI'],'/.well-known/') === 0) { + if(file_exists('.well-known/.htaccess') && get_config('system','fix_apache_acme',true)) { + rename('.well-known/.htaccess','.well-known/.htaccess.old'); + } + } + $x = [ 'module' => $module, 'installed' => \App::$module_loaded, @@ -166,6 +178,7 @@ class Router { */ if(\App::$module_loaded) { + \App::$page['page_title'] = \App::$module; $placeholder = ''; diff --git a/Zotlabs/Web/WebServer.php b/Zotlabs/Web/WebServer.php index 4e8dc6786..9e6af8c4c 100644 --- a/Zotlabs/Web/WebServer.php +++ b/Zotlabs/Web/WebServer.php @@ -58,7 +58,11 @@ class WebServer { if((x($_GET,'zid')) && (! \App::$install)) { \App::$query_string = strip_zids(\App::$query_string); if(! local_channel()) { - $_SESSION['my_address'] = $_GET['zid']; + if ($_SESSION['my_address']!=$_GET['zid']) + { + $_SESSION['my_address'] = $_GET['zid']; + $_SESSION['authenticated'] = 0; + } zid_init(); } } @@ -70,6 +74,12 @@ class WebServer { } } + if((x($_REQUEST,'owt')) && (! \App::$install)) { + $token = $_REQUEST['owt']; + \App::$query_string = strip_query_param(\App::$query_string,'owt'); + owt_init($token); + } + if((x($_SESSION, 'authenticated')) || (x($_POST, 'auth-params')) || (\App::$module === 'login')) require('include/auth.php'); @@ -97,10 +107,38 @@ class WebServer { check_config(); } - nav_set_selected('nothing'); + //nav_set_selected('nothing'); $Router = new Router($a); + /* Initialise the Link: response header if this is a channel page. + * This cannot be done inside the channel module because some protocol + * addons over-ride the module functions and these links are common + * to all protocol drivers; thus doing it here avoids duplication. + */ + + if (( \App::$module === 'channel' ) && argc() > 1) { + \App::$channel_links = [ + [ + 'rel' => 'lrdd', + 'type' => 'application/xrd+xml', + 'url' => z_root() . '/xrd?f=&uri=acct%3A' . argv(1) . '%40' . \App::get_hostname() + ], + [ + 'rel' => 'jrd', + 'type' => 'application/jrd+json', + 'url' => z_root() . '/.well-known/webfinger?f=&resource=acct%3A' . argv(1) . '%40' . \App::get_hostname() + ], + ]; + $x = [ 'channel_address' => argv(1), 'channel_links' => \App::$channel_links ]; + call_hooks('channel_links', $x ); + \App::$channel_links = $x['channel_links']; + header('Link: ' . \App::get_channel_links()); + } + + + + /* initialise content region */ if(! x(\App::$page, 'content')) @@ -137,4 +175,4 @@ class WebServer { killme(); } -}
\ No newline at end of file +} diff --git a/Zotlabs/Widget/Categories.php b/Zotlabs/Widget/Categories.php index d1dcfda93..305869706 100644 --- a/Zotlabs/Widget/Categories.php +++ b/Zotlabs/Widget/Categories.php @@ -8,16 +8,25 @@ class Categories { function widget($arr) { + $cards = ((array_key_exists('cards',$arr) && $arr['cards']) ? true : false); + + if(($cards) && (! feature_enabled(\App::$profile['profile_uid'],'cards'))) + return ''; + if((! \App::$profile['profile_uid']) - || (! perm_is_allowed(\App::$profile['profile_uid'],get_observer_hash(),'view_stream'))) { + || (! perm_is_allowed(\App::$profile['profile_uid'],get_observer_hash(),(($cards) ? 'view_pages' : 'view_stream')))) { return ''; } $cat = ((x($_REQUEST,'cat')) ? htmlspecialchars($_REQUEST['cat'],ENT_COMPAT,'UTF-8') : ''); - $srchurl = \App::$query_string; + $srchurl = (($cards) ? \App::$argv[0] . '/' . \App::$argv[1] : \App::$query_string); $srchurl = rtrim(preg_replace('/cat\=[^\&].*?(\&|$)/is','',$srchurl),'&'); $srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl); - return categories_widget($srchurl, $cat); + if($cards) + return cardcategories_widget($srchurl, $cat); + else + return categories_widget($srchurl, $cat); + } } diff --git a/Zotlabs/Widget/Common_friends.php b/Zotlabs/Widget/Common_friends.php new file mode 100644 index 000000000..a67b9312c --- /dev/null +++ b/Zotlabs/Widget/Common_friends.php @@ -0,0 +1,19 @@ +<?php + +namespace Zotlabs\Widget; + +require_once('include/contact_widgets.php'); + +class Common_friends { + + function widget($arr) { + + if((! \App::$profile['profile_uid']) + || (! perm_is_allowed(\App::$profile['profile_uid'],get_observer_hash(),'view_contacts'))) { + return ''; + } + + return common_friends_visitor_widget(\App::$profile['profile_uid']); + + } +} diff --git a/Zotlabs/Widget/Helpindex.php b/Zotlabs/Widget/Helpindex.php index f23e73e75..6c8748194 100644 --- a/Zotlabs/Widget/Helpindex.php +++ b/Zotlabs/Widget/Helpindex.php @@ -9,14 +9,23 @@ class Helpindex { $o .= '<div class="widget">'; $level_0 = get_help_content('sitetoc'); - if(! $level_0) - $level_0 = get_help_content('toc'); + if(! $level_0) { + $path = 'toc'; + $x = determine_help_language(); + $lang = $x['language']; + if($lang !== 'en') { + $path = $lang . '/toc'; + } + $level_0 = get_help_content($path); + } $level_0 = preg_replace('/\<ul(.*?)\>/','<ul class="nav nav-pills flex-column">',$level_0); $levels = array(); + // TODO: Implement support for translations in hierarchical table of content files + /* if(argc() > 2) { $path = ''; for($x = 1; $x < argc(); $x ++) { @@ -28,6 +37,7 @@ class Helpindex { $levels[] = preg_replace('/\<ul(.*?)\>/','<ul class="nav nav-pills flex-column">',$y); } } + */ if($level_0) $o .= $level_0; diff --git a/Zotlabs/Widget/Notifications.php b/Zotlabs/Widget/Notifications.php new file mode 100644 index 000000000..a857f1ad9 --- /dev/null +++ b/Zotlabs/Widget/Notifications.php @@ -0,0 +1,150 @@ +<?php + +namespace Zotlabs\Widget; + +class Notifications { + + function widget($arr) { + + $channel = \App::get_channel(); + + if(local_channel()) { + $notifications[] = [ + 'type' => 'network', + 'icon' => 'th', + 'severity' => 'secondary', + 'label' => t('New Network Activity'), + 'title' => t('New Network Activity Notifications'), + 'viewall' => [ + 'url' => 'network', + 'label' => t('View your network activity') + ], + 'markall' => [ + 'url' => '#', + 'label' => t('Mark all notifications read') + ] + ]; + + $notifications[] = [ + 'type' => 'home', + 'icon' => 'home', + 'severity' => 'danger', + 'label' => t('New Home Activity'), + 'title' => t('New Home Activity Notifications'), + 'viewall' => [ + 'url' => 'channel/' . $channel['channel_address'], + 'label' => t('View your home activity') + ], + 'markall' => [ + 'url' => '#', + 'label' => t('Mark all notifications seen') + ] + ]; + + $notifications[] = [ + 'type' => 'mail', + 'icon' => 'envelope', + 'severity' => 'danger', + 'label' => t('New Mails'), + 'title' => t('New Mails Notifications'), + 'viewall' => [ + 'url' => 'mail/combined', + 'label' => t('View your private mails') + ], + 'markall' => [ + 'url' => '#', + 'label' => t('Mark all messages seen') + ] + ]; + + $notifications[] = [ + 'type' => 'all_events', + 'icon' => 'calendar', + 'severity' => 'secondary', + 'label' => t('New Events'), + 'title' => t('New Events Notifications'), + 'viewall' => [ + 'url' => 'mail/combined', + 'label' => t('View events') + ], + 'markall' => [ + 'url' => '#', + 'label' => t('Mark all events seen') + ] + ]; + + $notifications[] = [ + 'type' => 'intros', + 'icon' => 'users', + 'severity' => 'danger', + 'label' => t('New Connections'), + 'title' => t('New Connections Notifications'), + 'viewall' => [ + 'url' => 'connections', + 'label' => t('View all connections') + ] + ]; + + $notifications[] = [ + 'type' => 'files', + 'icon' => 'folder', + 'severity' => 'danger', + 'label' => t('New Files'), + 'title' => t('New Files Notifications'), + ]; + + $notifications[] = [ + 'type' => 'notify', + 'icon' => 'exclamation', + 'severity' => 'danger', + 'label' => t('Notices'), + 'title' => t('Notices'), + 'viewall' => [ + 'url' => 'notifications/system', + 'label' => t('View all notices') + ], + 'markall' => [ + 'url' => '#', + 'label' => t('Mark all notices seen') + ] + ]; + } + + if(local_channel() && is_site_admin()) { + $notifications[] = [ + 'type' => 'register', + 'icon' => 'user-o', + 'severity' => 'danger', + 'label' => t('New Registrations'), + 'title' => t('New Registrations Notifications'), + ]; + } + + if(get_config('system', 'disable_discover_tab') != 1) { + $notifications[] = [ + 'type' => 'pubs', + 'icon' => 'globe', + 'severity' => 'secondary', + 'label' => t('Public Stream'), + 'title' => t('Public Stream Notifications'), + 'viewall' => [ + 'url' => 'pubstream', + 'label' => t('View the public stream') + ], + 'markall' => [ + 'url' => '#', + 'label' => t('Mark all notifications seen') + ] + ]; + } + + $o = replace_macros(get_markup_template('notifications_widget.tpl'), array( + '$notifications' => $notifications, + '$loading' => t('Loading...') + )); + + return $o; + + } +} + diff --git a/Zotlabs/Widget/Wiki_pages.php b/Zotlabs/Widget/Wiki_pages.php index a07c348ff..6e3a22551 100644 --- a/Zotlabs/Widget/Wiki_pages.php +++ b/Zotlabs/Widget/Wiki_pages.php @@ -37,6 +37,7 @@ class Wiki_pages { if (!$wikiname) { $wikiname = ''; } + $typelock = $w['typelock']; } $can_create = perm_is_allowed(\App::$profile['uid'],get_observer_hash(),'write_wiki'); @@ -52,8 +53,14 @@ class Wiki_pages { '$canadd' => $can_create, '$candel' => $can_delete, '$addnew' => t('Add new page'), + '$typelock' => $typelock, + '$lockedtype' => $w['mimeType'], + '$mimetype' => mimetype_select(0,$w['mimeType'], + [ 'text/markdown' => t('Markdown'), 'text/bbcode' => t('BBcode'), 'text/plain' => t('Text') ]), '$pageName' => array('pageName', t('Page name')), - '$refresh' => $arr['refresh'] + '$refresh' => $arr['refresh'], + '$options' => t('Options'), + '$submit' => t('Submit') )); } } diff --git a/Zotlabs/Zot/Auth.php b/Zotlabs/Zot/Auth.php index 92b0fff78..8d198f506 100644 --- a/Zotlabs/Zot/Auth.php +++ b/Zotlabs/Zot/Auth.php @@ -43,6 +43,12 @@ class Auth { $this->Finalise(); } + if(strpbrk($this->sec,'.:')) { + logger('illegal security context'); + $this->Debug('illegal security context.'); + $this->Finalise(); + } + $x = $this->GetHublocs($this->address); if($x) { @@ -109,6 +115,14 @@ class Auth { $this->remote_hub = $hubloc['hubloc_url']; $this->dnt = 0; + if(! $this->sec) { + logger('missing security context.'); + if($this->test) + $this->Debug('missing security context.'); + return false; + } + + // check credentials and access // If they are already authenticated and haven't changed credentials, diff --git a/Zotlabs/Zot/Finger.php b/Zotlabs/Zot/Finger.php index 9871b5bbd..348171bdc 100644 --- a/Zotlabs/Zot/Finger.php +++ b/Zotlabs/Zot/Finger.php @@ -22,6 +22,7 @@ class Finger { * * @return zotinfo array (with 'success' => true) or array('success' => false); */ + static public function run($webbie, $channel = null, $autofallback = true) { $ret = array('success' => false); @@ -84,18 +85,27 @@ class Finger { 'token' => self::$token ); - $result = z_post_url($url . $rhs,$postvars); + $headers = []; + $headers['X-Zot-Channel'] = $channel['channel_address'] . '@' . \App::get_hostname(); + $headers['X-Zot-Nonce'] = random_string(); + $xhead = \Zotlabs\Web\HTTPSig::create_sig('',$headers,$channel['channel_prvkey'], + 'acct:' . $channel['channel_address'] . '@' . \App::get_hostname(),false); + + $retries = 0; + + $result = z_post_url($url . $rhs,$postvars,$retries, [ 'headers' => $xhead ]); if ((! $result['success']) && ($autofallback)) { if ($https) { logger('zot_finger: https failed. falling back to http'); - $result = z_post_url('http://' . $host . $rhs,$postvars); + $result = z_post_url('http://' . $host . $rhs,$postvars, $retries, [ 'headers' => $xhead ]); } } - } else { + } + else { $rhs .= '?f=&address=' . urlencode($address) . '&token=' . self::$token; - $result = z_fetch_url($url . $rhs); + $result = z_fetch_url($url . $rhs); if((! $result['success']) && ($autofallback)) { if($https) { logger('zot_finger: https failed. falling back to http'); @@ -111,7 +121,10 @@ class Finger { } $x = json_decode($result['body'], true); - if($x) { + + $verify = \Zotlabs\Web\HTTPSig::verify($result,(($x) ? $x['key'] : '')); + + if($x && (! $verify['header_valid'])) { $signed_token = ((is_array($x) && array_key_exists('signed_token', $x)) ? $x['signed_token'] : null); if($signed_token) { $valid = rsa_verify('token.' . self::$token, base64url_decode($signed_token), $x['key']); diff --git a/Zotlabs/Zot/IHandler.php b/Zotlabs/Zot/IHandler.php index eeca1555c..dd82f5be6 100644 --- a/Zotlabs/Zot/IHandler.php +++ b/Zotlabs/Zot/IHandler.php @@ -12,6 +12,8 @@ interface IHandler { function Request($data); + function Rekey($sender,$data); + function AuthCheck($data,$encrypted); function Purge($sender,$recipients); diff --git a/Zotlabs/Zot/Receiver.php b/Zotlabs/Zot/Receiver.php index 0050a2559..c521c9d64 100644 --- a/Zotlabs/Zot/Receiver.php +++ b/Zotlabs/Zot/Receiver.php @@ -120,6 +120,10 @@ class Receiver { $this->handler->Notify($this->data); break; + case 'rekey': + $this->handler->Rekey($this->sender, $this->data); + break; + default: $this->response['message'] = 'Not implemented'; json_return_and_die($this->response); diff --git a/Zotlabs/Zot/Verify.php b/Zotlabs/Zot/Verify.php index 06bd3188c..1d9e6de3f 100644 --- a/Zotlabs/Zot/Verify.php +++ b/Zotlabs/Zot/Verify.php @@ -31,6 +31,22 @@ class Verify { return false; } + + function get_meta($type,$channel_id,$token) { + $r = q("select id, meta from verify where vtype = '%s' and channel = %d and token = '%s' limit 1", + dbesc($type), + intval($channel_id), + dbesc($token) + ); + if($r) { + q("delete from verify where id = %d", + intval($r[0]['id']) + ); + return $r[0]['meta']; + } + return false; + } + function purge($type,$interval) { q("delete from verify where vtype = '%s' and created < %s - INTERVAL %s", dbesc($type), diff --git a/Zotlabs/Zot/ZotHandler.php b/Zotlabs/Zot/ZotHandler.php index aab336545..ab8815b3d 100644 --- a/Zotlabs/Zot/ZotHandler.php +++ b/Zotlabs/Zot/ZotHandler.php @@ -20,6 +20,10 @@ class ZotHandler implements IHandler { zot_reply_message_request($data); } + function Rekey($sender,$data) { + zot_rekey_request($sender,$data); + } + function AuthCheck($data,$encrypted) { zot_reply_auth_check($data,$encrypted); } diff --git a/app/admin.apd b/app/admin.apd new file mode 100644 index 000000000..68c07568e --- /dev/null +++ b/app/admin.apd @@ -0,0 +1,6 @@ +version: 1 +url: $baseurl/admin +requires: admin +name: Admin +photo: icon:wrench +categories: nav_featured_app diff --git a/app/cards.apd b/app/cards.apd new file mode 100644 index 000000000..047aaeac9 --- /dev/null +++ b/app/cards.apd @@ -0,0 +1,6 @@ +version: 1.1 +url: $baseurl/cards/$nick +name: Cards +requires: local_channel, cards +photo: icon:list +categories: Productivity diff --git a/app/pubstream.apd b/app/pubstream.apd new file mode 100644 index 000000000..ebfcf38b0 --- /dev/null +++ b/app/pubstream.apd @@ -0,0 +1,6 @@ +version: 2 +url: $baseurl/pubstream +requires: config:disable_discover_tab=0 +name: Public Stream +photo: icon:globe +categories: Social @@ -49,10 +49,10 @@ require_once('include/hubloc.php'); require_once('include/attach.php'); define ( 'PLATFORM_NAME', 'hubzilla' ); -define ( 'STD_VERSION', '2.6.3' ); -define ( 'ZOT_REVISION', '1.2' ); +define ( 'STD_VERSION', '2.8' ); +define ( 'ZOT_REVISION', '1.3' ); -define ( 'DB_UPDATE_VERSION', 1193 ); +define ( 'DB_UPDATE_VERSION', 1196 ); define ( 'PROJECT_BASE', __DIR__ ); @@ -64,7 +64,7 @@ define ( 'PROJECT_BASE', __DIR__ ); * This can be used in HTML and JavaScript where needed a line break. */ define ( 'EOL', '<br>' . "\r\n" ); -define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); +define ( 'ATOM_TIME', 'Y-m-d\\TH:i:s\\Z' ); // aka ISO 8601 "Zulu" define ( 'TEMPLATE_BUILD_PATH', 'store/[data]/smarty3' ); define ( 'DIRECTORY_MODE_NORMAL', 0x0000); // A directory client @@ -256,6 +256,7 @@ define ( 'NETWORK_OSTATUS', 'stat'); // status.net, identi.ca, GNU-s define ( 'NETWORK_GNUSOCIAL', 'gnusoc'); // status.net, identi.ca, GNU-social, other OStatus implementations define ( 'NETWORK_FEED', 'rss'); // RSS/Atom feeds with no known "post/notify" protocol define ( 'NETWORK_DIASPORA', 'diaspora'); // Diaspora +define ( 'NETWORK_ACTIVITYPUB', 'activitypub'); define ( 'NETWORK_MAIL', 'mail'); // IMAP/POP define ( 'NETWORK_MAIL2', 'mai2'); // extended IMAP/POP define ( 'NETWORK_FACEBOOK', 'face'); // Facebook API @@ -402,6 +403,8 @@ define ( 'VNOTIFY_INFO', 0x0080 ); define ( 'VNOTIFY_ALERT', 0x0100 ); define ( 'VNOTIFY_INTRO', 0x0200 ); define ( 'VNOTIFY_REGISTER', 0x0400 ); +define ( 'VNOTIFY_FILES', 0x0800 ); +define ( 'VNOTIFY_PUBS', 0x1000 ); @@ -420,6 +423,7 @@ define ( 'TERM_THING', 7 ); define ( 'TERM_BOOKMARK', 8 ); define ( 'TERM_HIERARCHY', 9 ); define ( 'TERM_COMMUNITYTAG', 10 ); +define ( 'TERM_FORUM', 11 ); define ( 'TERM_OBJ_POST', 1 ); define ( 'TERM_OBJ_PHOTO', 2 ); @@ -451,6 +455,17 @@ define ( 'NAMESPACE_STATUSNET', 'http://status.net/schema/api/1/' ); define ( 'NAMESPACE_ATOM1', 'http://www.w3.org/2005/Atom' ); define ( 'NAMESPACE_YMEDIA', 'http://search.yahoo.com/mrss/' ); +// We should be using versioned jsonld contexts so that signatures will be slightly more reliable. +// Why signatures are unreliable by design is a problem nobody seems to care about +// "because it's a proposed W3C standard". . + +// Anyway, if you use versioned contexts, communication with Mastodon fails. Have not yet investigated +// the reason for the dependency but for the current time, use the standard non-versioned context. +//define ( 'ACTIVITYSTREAMS_JSONLD_REV', 'https://www.w3.org/ns/activitystreams-history/v1.8.jsonld' ); + +define ( 'ACTIVITYSTREAMS_JSONLD_REV', 'https://www.w3.org/ns/activitystreams' ); + +define ( 'ZOT_APSCHEMA_REV', '/apschema/v1.2' ); /** * activity stream defines */ @@ -482,6 +497,7 @@ define ( 'ACTIVITY_TAG', NAMESPACE_ACTIVITY_SCHEMA . 'tag' ); define ( 'ACTIVITY_SHARE', NAMESPACE_ACTIVITY_SCHEMA . 'share' ); define ( 'ACTIVITY_FAVORITE', NAMESPACE_ACTIVITY_SCHEMA . 'favorite' ); define ( 'ACTIVITY_CREATE', NAMESPACE_ACTIVITY_SCHEMA . 'create' ); +define ( 'ACTIVITY_DELETE', NAMESPACE_ACTIVITY_SCHEMA . 'delete' ); define ( 'ACTIVITY_WIN', NAMESPACE_ACTIVITY_SCHEMA . 'win' ); define ( 'ACTIVITY_LOSE', NAMESPACE_ACTIVITY_SCHEMA . 'lose' ); define ( 'ACTIVITY_TIE', NAMESPACE_ACTIVITY_SCHEMA . 'tie' ); @@ -506,6 +522,7 @@ define ( 'ACTIVITY_OBJ_PROFILE', NAMESPACE_ZOT . '/activity/profile' ); define ( 'ACTIVITY_OBJ_THING', NAMESPACE_ZOT . '/activity/thing' ); define ( 'ACTIVITY_OBJ_LOCATION',NAMESPACE_ZOT . '/activity/location' ); define ( 'ACTIVITY_OBJ_FILE', NAMESPACE_ZOT . '/activity/file' ); +define ( 'ACTIVITY_OBJ_CARD', NAMESPACE_ZOT . '/activity/card' ); /** * Account Flags @@ -544,6 +561,8 @@ define ( 'ITEM_PDL', 0x0200); // Page Description Language - e.g. Comanche define ( 'ITEM_BUG', 0x0400); // Is a bug, can be used by the internal bug tracker define ( 'ITEM_PENDING_REMOVE', 0x0800); // deleted, notification period has lapsed define ( 'ITEM_DOC', 0x1000); // hubzilla only, define here so that item import does the right thing +define ( 'ITEM_CARD', 0x2000); + define ( 'ITEM_TYPE_POST', 0 ); define ( 'ITEM_TYPE_BLOCK', 1 ); @@ -551,6 +570,7 @@ define ( 'ITEM_TYPE_PDL', 2 ); define ( 'ITEM_TYPE_WEBPAGE', 3 ); define ( 'ITEM_TYPE_BUG', 4 ); define ( 'ITEM_TYPE_DOC', 5 ); +define ( 'ITEM_TYPE_CARD', 6 ); define ( 'ITEM_IS_STICKY', 1000 ); @@ -771,6 +791,10 @@ class App { public static $is_tablet = false; public static $comanche; + + public static $channel_links; + + public static $category; // Allow themes to control internal parameters @@ -898,6 +922,9 @@ class App { * * There will always be one argument. If provided a naked domain * URL, self::$argv[0] is set to "home". + * + * If $argv[0] has a period in it, for example foo.json; rewrite + * to module = 'foo' and set $_REQUEST['module_format'] = 'json'; */ self::$argv = explode('/', self::$cmd); @@ -918,6 +945,7 @@ class App { self::$module = 'home'; } + /* * See if there is any page number information, and initialise * pagination @@ -1015,6 +1043,19 @@ class App { return self::$path; } + public static function get_channel_links() { + $s = ''; + $x = self::$channel_links; + if($x && is_array($x) && count($x)) { + foreach($x as $y) { + if($s) { + $s .= ','; + } + $s .= '<' . $y['url'] . '>; rel="' . $y['rel'] . '"; type="' . $y['type'] . '"'; + } + } + return $s; + } public static function set_account($acct) { self::$account = $acct; } @@ -1596,6 +1637,7 @@ function login($register = false, $form_id = 'main-login', $hiddens=false, $logi '$login_page' => $login_page, '$logout' => t('Logout'), '$login' => t('Login'), + '$remote_login' => t('Remote Authentication'), '$form_id' => $form_id, '$lname' => array('username', t('Login/Email') , '', ''), '$lpassword' => array('password', t('Password'), '', ''), @@ -2048,17 +2090,23 @@ function construct_page() { $installing = false; + $uid = ((App::$profile_uid) ? App::$profile_uid : local_channel()); + + $navbar = get_config('system','navbar','default'); + if($uid) { + $navbar = get_pconfig($uid,'system','navbar',$navbar); + } + + if($comanche && App::$layout['navbar']) { + $navbar = App::$layout['navbar']; + } + if (App::$module == 'setup') { $installing = true; } else { - nav($a); + nav($navbar); } - if ($comanche) { - if (App::$layout['nav']) { - App::$page['nav'] = get_custom_nav(App::$layout['nav']); - } - } $current_theme = Zotlabs\Render\Theme::current(); diff --git a/doc/addons.bb b/doc/addons.bb index 85bb2dca3..e6841d3d0 100644 --- a/doc/addons.bb +++ b/doc/addons.bb @@ -61,6 +61,7 @@ [*] piwik - open source website analytics [*] planets - set location field to a random planet from Star Wars [*] pong - classic pong game +[*] pubcrawl - ActivityPub protocol emulator [*] pubsubhubbub - PuSH protocol for optimised delivery to feed subscribers (required by GNU-Social protocol) [*] pumpio - crosspost to Pump.io [*] qrator - generate QR code images diff --git a/doc/admin/administrator_guide.md b/doc/admin/administrator_guide.md index 9e0ee3c59..2fa52c7c6 100644 --- a/doc/admin/administrator_guide.md +++ b/doc/admin/administrator_guide.md @@ -246,7 +246,7 @@ a _standard_ and _premium_ class using the following lines: App::$config['system']['default_service_class']='standard'; // this is the default service class that is attached to every new account - // configuration for parent service class + // configuration for standard service class App::$config['service_class']['standard'] = array('photo_upload_limit'=>2097152, // total photo storage limit per channel (here 2MB) 'total_identities' =>1, // number of channels an account can create @@ -256,7 +256,7 @@ a _standard_ and _premium_ class using the following lines: 'attach_upload_limit' =>2097152, // total attachment storage limit per channel (here 2MB) 'chatters_inroom' =>20); - // configuration for teacher service class + // configuration for premium service class App::$config['service_class']['premium'] = array('photo_upload_limit'=>20000000000, // total photo storage limit per channel (here 20GB) 'total_identities' =>20, // number of channels an account can create @@ -346,6 +346,19 @@ empty: 1. After successful import (check!) delete your channel on the old RedMatrix Server. 1. On the $Projectname server visit new.hub/locs and upgrade to your channel to a primary one. And when the old Redmatrix server is still listed delete them here as well. Press "Sync" to inform all other server in the grid. +### Administration + +#### Site Administration + +Administration of the website is commonly done through the admin webpage located at /admin on your website. In order to access this page you must have administration rights to the server. Administration rights are granted to the first account to register on your site, **provided** the email address of that account exactly matches the email address you provided as the administrator's email address during setup. + +There are several ways that this can fail and leave the system without an administrator account, for instance if the first account that was created provided a different email address than the administrator email address that was supplied during setup. + +For security reasons there is no web page or interface on the system which will give you administrator access. If you need to correct a situation where a system has no administrator account it **must** be done by editing the account table in the database. There is no other way. To do this, you will need to locate the entry in the account table which belongs to the desired administrator, and set 'account_roles' for that entry to 4096. You will then be able to access the admin page from your system's profile menu or directly via /admin . + +A hub can have multiple admins and there is no limit to how administrators you can have. Repeat the above process for every account you wish to provide with administration rights. + + ### Troubleshooting #### Log files diff --git a/doc/context/en/appman/help.html b/doc/context/en/appman/help.html new file mode 100644 index 000000000..27cb03624 --- /dev/null +++ b/doc/context/en/appman/help.html @@ -0,0 +1,4 @@ +<dl class="dl-horizontal"> + <dt>General</dt> + <dd>Edit individual properties of the app you selected. Categories allow you to sort your apps to help you find them in the list more easily. Support for custom apps you or your administrator may choose to create includes fields such as "Price of app" and "Location for purchase" that are not applicable to core Hubzilla apps.</dd> +</dl>
\ No newline at end of file diff --git a/doc/context/en/apps/edit/help.html b/doc/context/en/apps/edit/help.html new file mode 100644 index 000000000..1d378f962 --- /dev/null +++ b/doc/context/en/apps/edit/help.html @@ -0,0 +1,4 @@ +<dl class="dl-horizontal"> + <dt>General</dt> + <dd>Edit or delete your apps using the control buttons beside each app icon in the list.</dd> +</dl>
\ No newline at end of file diff --git a/doc/context/en/apps/help.html b/doc/context/en/apps/help.html new file mode 100644 index 000000000..ad6daade5 --- /dev/null +++ b/doc/context/en/apps/help.html @@ -0,0 +1,6 @@ +<dl class="dl-horizontal"> + <dt>General</dt> + <dd>This page shows you what apps are available to your channel, including both core apps and those supplied by addons. To add an app to the <a href='#' onclick='contextualHelpFocus("#app-menu", 1); return false;' title="Click to open...">app menu</a> "star" the app in the list below.</dd> + <dt>Manage Apps</dt> + <dd>Press the "Manage Apps" button to open a page where you can edit the name, categories, and other properties of your apps.</dd> +</dl>
\ No newline at end of file diff --git a/doc/context/en/channel/help.html b/doc/context/en/channel/help.html index 6e3181cbf..0c5b99754 100644 --- a/doc/context/en/channel/help.html +++ b/doc/context/en/channel/help.html @@ -3,6 +3,4 @@ <dd>This is the home page of a channel. It is similar to someone's profile "wall" in a social network context. Posts created by the channel are displayed according to the observer's viewing permissions.</dd> <dt>Create a Post</dt> <dd>If you have permission to create posts on the channel page, then you will see the post editor at the top.</dd> - <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Click to highlight element...">Channel Content Tabs</a></dt> - <dd>The channel content tabs are links to other content published by the channel. The <b>About</b> tab links to the channel profile. The <b>Photos</b> tab links to the channel photo galleries. The <b>Files</b> tab links to the general shared files published by the channel.</dd> -</dl>
\ No newline at end of file +</dl> diff --git a/doc/context/en/wiki/help.html b/doc/context/en/wiki/help.html index 5ac9b22ae..5dee85375 100644 --- a/doc/context/en/wiki/help.html +++ b/doc/context/en/wiki/help.html @@ -1,12 +1,10 @@ <dl class="dl-horizontal"> <dt>General</dt> <dd>Each wiki is a collection of pages, composed as Markdown-formatted text files.</dd> - <dt><a href='#' onclick='contextualHelpFocus("#wikis-index", 1); return false;' title="Click to highlight element...">Wiki List</a></dt> + <dt>Wiki List</dt> <dd>Wikis owned by the channel <i>that you have permission to view</i> are listed in the side panel.</dd> - <dt><a href='#' onclick='contextualHelpFocus("#wiki-get-history", 0); return false;' title="Click to highlight element...">Page History</a></dt> + <dt>Page History</dt> <dd>Every revision of a page is saved to allow quick reversion. Click the <b>History</b> tab to view a history of page revisions, including the date and author of each. The revert button will load the selected revision but will not automatically save the page.</dd> - <dt><a href='#' onclick='contextualHelpFocus("#wiki_page_list", 1); return false;' title="Click to highlight element...">Pages</a></dt> + <dt>Pages</dt> <dd>The list of pages in the wiki are listed in the <b>Wiki Pages</b> panel. Prior to saving page edits using the <b>Page</b> control dropdown menu, you may <a href='#' onclick='contextualHelpFocus("#id_commitMsg", 0); return false;' title="Click to highlight element...">enter a custom message</a> to be displayed in the <a href='#' onclick='contextualHelpFocus("#wiki-get-history", 0); return false;' title="Click to highlight element..."><b>Page History</b></a> viewer along with the revision.</dd> - <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Click to highlight element...">Channel Content Tabs</a></dt> - <dd>The channel content tabs are links to other content published by the channel. The <b>About</b> tab links to the channel profile. The <b>Photos</b> tab links to the channel photo galleries. The <b>Files</b> tab links to the general shared files published by the channel.</dd> -</dl>
\ No newline at end of file +</dl> diff --git a/doc/developer/zot_protocol.bb b/doc/developer/zot_protocol.bb index b87e1cd73..e9355bca8 100644 --- a/doc/developer/zot_protocol.bb +++ b/doc/developer/zot_protocol.bb @@ -79,7 +79,7 @@ We may also attempt to recover with even less information, but doing so is prone In order to implement high performance communications, the data transfer format for all aspects of Zot is JSON. XML communications require way too much overhead. -Bi-directional encryption is based on RSA 4096-bit keys expressed in DER/ASN.1 format using the PKCS#8 encoding variant, with AES-256-CBC used for block encryption of variable length or large items. +Bi-directional encryption is based on RSA 4096-bit keys expressed in DER/ASN.1 format using the PKCS#8 encoding variant, with AES encryption of variable length or large items. The precise encryption algorithms are negotiable between sites. Some aspects of well known "federation protocols" (webfinger, salmon, activitystreams, portablecontacts, etc.) may be used in zot, but we are not tied to them and will not be bound by them. $Projectname project is attempting some rather novel developments in decentralised communications and if there is any need to diverge from such "standard protocols" we will do so without question or hesitation. @@ -242,7 +242,7 @@ Example of discovery packet for 'mike@zothub.com' Discovery returns a JSON array with the following components: -'success' => ('1' or '') Operation was successful if '1'. Otherwise an optional 'message' may be present indicating the source of error. +'success' => (true or false) Operation was successful if true. Otherwise an optional 'message' may be present indicating the source of error. 'signed_token' => If a token parameter was provided in the request, it is prepended with the text 'token.' and then RSA signed with the channel private key and base64url encoded and returned as 'signed_token'. @@ -272,12 +272,11 @@ Discovery returns a JSON array with the following components: 'target_sig' => if a permissions target was specified, the signature is mirrored. -'searchable' => ('1' or '') '1' indicates this entry can be searched in a directory +'searchable' => (true or false) true indicates this entry can be searched in a directory [h5]Permissions[/h5] - -'permisssions' => extensible array of permissions appropriate to this target, values are '1' or '' +'permissions' => extensible array of permissions appropriate to this target, values are true or false Permissions may include: [list] @@ -328,7 +327,7 @@ Each location is an array of 'address' => the webbie or user@host identifier associated with this location -'primary' => ('1' or '') whether or not this is the primary location for this channel where files and web pages are generally found +'primary' => (true or false) whether or not this is the primary location for this channel where files and web pages are generally found 'url' => url of the root of this DNS location e.g. https://example.com @@ -391,7 +390,7 @@ When this packet is received, a Zot message is initiated to the auth identity: } [/code] -auth_check messages MUST be encrypted with AES256CBC. This message is sent to the origination site, which checks the 'secret' to see if it is the same as the 'sec' which it passed originally. It also checks the secret_sig which is the secret signed by the destination channel's private key and base64url encoded. If everything checks out, a json packet is returned: +auth_check messages MUST be encrypted. This message is sent to the origination site, which checks the 'secret' to see if it is the same as the 'sec' which it passed originally. It also checks the secret_sig which is the secret signed by the destination channel's private key and base64url encoded. If everything checks out, a json packet is returned: [code nowrap] { "success":1, @@ -404,11 +403,11 @@ auth_check messages MUST be encrypted with AES256CBC. This message is sent to th [h4]Zot Signatures[/h4] All signed data in Zot is accomplished by performing an RSA sign operation using the private key of the initiator. The binary result is then base64url encoded for transport. [h4]Zot Encryption[/h4] -Encryption is currently provided by AES256-CBC, the Advanced Encryption Standard using 256-bit keys and the Cipher Block Chaining mode of operation. Additional algorithms MAY be supported. A 32-octet key and 16-octet initialisation vector are randomly generated. The desired data is then encrypted using these generated strings and the result base64url encoded. Then we build an array: +Encryption is currently provided by AES256CTR. Additional algorithms MAY be supported. A 32-octet key and 16-octet initialisation vector are randomly generated. The desired data is then encrypted using these generated strings and the result base64url encoded. Then we build an array: [dl terms="b"] [*= data]The base64url encoded encrypted data -[*= alg]The chosen algorithm, in this case the string 'aes256cbc'. +[*= alg]The chosen algorithm, in this case the string 'aes256ctr'. [*= key]The randomly generated key, RSA encrypted using the recipients public key, and the result base64url encoded [*= iv]The randomly generated initialization vector, RSA encrypted using the recipient's public key, and the result base64url encoded [/dl] @@ -449,7 +448,7 @@ M23in0xqMVsyQvzjNkpImrO/QdbEFRIIMee83IHq+adbyjQR49Z2hNEIZhkLPc3U "callback":"\/post", "version":"1.2", "encryption":{ - "aes256cbc" + "aes256ctr" }, "secret":"1eaa6613699be6ebb2adcefa5379c61a3678aa0df89025470fac871431b70467", "secret_sig":"0uShifsvhHnxnPIlDM9lWuZ1hSJTrk3NN9Ds6AKpyNRqf3DUdz81-Xvs8I2kj6y5vfFtm-FPKAqu77XP05r74vGaWbqb1r8zpWC7zxXakVVOHHC4plG6rLINjQzvdSFKCQb5R_xtGsPPfvuE24bv4fvN4ZG2ILvb6X4Dly37WW_HXBqBnUs24mngoTxFaPgNmz1nDQNYQu91-ekX4-BNaovjDx4tP379qIG3-NygHTjFoOMDVUvs-pOPi1kfaoMjmYF2mdZAmVYS2nNLWxbeUymkHXF8lT_iVsJSzyaRFJS1Iqn7zbvwH1iUBjD_pB9EmtNmnUraKrCU9eHES27xTwD-yaaH_GHNc1XwXNbhWJaPFAm35U8ki1Le4WbUVRluFx0qwVqlEF3ieGO84PMidrp51FPm83B_oGt80xpvf6P8Ht5WvVpytjMU8UG7-js8hAzWQeYiK05YTXk-78xg0AO6NoNe_RSRk05zYpF6KlA2yQ_My79rZBv9GFt4kUfIxNjd9OiV1wXdidO7Iaq_Q" diff --git a/doc/hook/channel_links.bb b/doc/hook/channel_links.bb new file mode 100644 index 000000000..c0243dac6 --- /dev/null +++ b/doc/hook/channel_links.bb @@ -0,0 +1,12 @@ +[h2]channel_links[/h2] + +Called when generating the Link HTTP header for the channel page. Different protocol stacks can add links to this header. + +Hook data = array + 'channel_address' => channel nickname, no checking is done to see if it is valid + 'channel_links' => array of channel links in the format + 'url' => url of resource + 'rel' => link relation + 'type' => MIME type + +All fields are required
\ No newline at end of file diff --git a/doc/hook/update_unseen.bb b/doc/hook/update_unseen.bb new file mode 100644 index 000000000..8fb02c239 --- /dev/null +++ b/doc/hook/update_unseen.bb @@ -0,0 +1,9 @@ +[h3]update_unseen[/h3] + +Called prior to automatically marking items 'seen'; allowing a plugin the choice to not perform this action. + +hook data + +[ 'channel_id' => local_channel(), 'update' => 'unset' ]; + +If 'update' is set to 0 or false on return, the update operation is not performed.
\ No newline at end of file diff --git a/doc/hooklist.bb b/doc/hooklist.bb index da4d9596b..1192a1506 100644 --- a/doc/hooklist.bb +++ b/doc/hooklist.bb @@ -91,6 +91,9 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the [zrl=[baseurl]/help/hook/channel_remove]channel_remove[/zrl] Called when removing a channel +[zrl=[baseurl]/help/hook/channel_links]channel_links[/zrl] + Called when generating the Link: HTTP header for a channel + [zrl=[baseurl]/help/hook/channel_settings]channel_settings[/zrl] Called when displaying the channel settings page @@ -572,6 +575,9 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the [zrl=[baseurl]/help/hook/tagged]tagged[/zrl] Called when a delivery is processed which results in you being tagged +[zrl=[baseurl]/help/hook/update_unseen]update_unseen[/zrl] + Called prior to automatically marking items seen which were loaded in the browser + [zrl=[baseurl]/help/hook/validate_channelname]validate_channelname[/zrl] Used to validate the names used by a channel diff --git a/doc/member/member_guide.bb b/doc/member/member_guide.bb index 0a2d11a88..20d273f44 100644 --- a/doc/member/member_guide.bb +++ b/doc/member/member_guide.bb @@ -190,7 +190,18 @@ You may also connect with any channel by visiting the "Connections" pa To connect with channels on other networks: -The process for connecting to channels on other networks (such as GNU-Social, Mastodon, and Diaspora) is similar - type their "webbie" into the "Add New Connections" box on the "Connections" page. Before you do this however, please visit your Settings page (Feature/Addon Settings) and ensure that the relevant protocol (Diaspora or GNU-Social) is provided on your hub and [b][i]activated[/i] for your channel[/b]. These networks/protocols do not support account migration and location independence so if you move location or clone your channel elsewhere, communications with these connections may fail. For this reason these protocols are not activated by default, but only through your consent. Activating these protocols involves an important decision between communicating with friends on these networks or providing fail-safe account resilience if your server fails. +The process for connecting to channels on other networks (such as GNU-Social, Mastodon, and Diaspora) is similar - type their "webbie" into the "Add New Connections" box on the "Connections" page. Before you do this however, please visit your Settings page (Feature/Addon Settings) and ensure that the relevant protocol (Diaspora, GNU-Social/OStatus, or ActivityPub) is provided on your hub and [b][i]activated[/i] for your channel[/b]. These networks/protocols do not support account migration and location independence so if you move location or clone your channel elsewhere, communications with these connections may fail. For this reason these protocols are not activated by default, but only through your consent. Activating these protocols involves an important decision between communicating with friends on these networks or providing fail-safe account resilience if your server fails. + +Some communications offer more than one protocol. If you wish to connect with somebody on Mastodon (for instance) they can use either the 'ostatus' or the 'activitypub' protocol for communication. Generally the 'activitypub' protocol will provide a better experience than 'ostatus', but $Projectname will often choose the first protocol it discovers and this may not be the one you want. You may connect with somebody over a specific protocol by prepending the protocol name in square brackets to their "webbie". For example + +[code] +[activitypub]foobar@foo.bar +[ostatus]foobar@foo.bar +[diaspora]foobar@foo.bar +[zot]foobar@foo.bar +[rss]https://foo.bar/foobar +[/code] + To connect with RSS feeds: @@ -634,6 +645,15 @@ This will select the theme named "suckerberg" and select the "pas The condensed notation isn't part of Comanche itself but is recognised by $Projectname platform as a theme specifier. +[h4]Navbar[/h4] + +[code] + [navbar]tucson[/navbar] +[/code] + +Use the 'tucson' navbar template and CSS rules. By default the 'default' navbar template will be used. + + [h4]Regions[/h4] Each region has a name, as noted above. You will specify the region of interest using a 'region' tag, which includes the name. Any content you wish placed in this region should be placed between the opening region tag and the closing tag. diff --git a/doc/toc.html b/doc/toc.html index 4da01d55d..1b7de3cb3 100644 --- a/doc/toc.html +++ b/doc/toc.html @@ -71,65 +71,3 @@ </div> </div> </div> -<script> - toc = {}; - // Generate the table of contents in the side nav menu (see view/tpl/help.tpl) - $(document).ready(function () { - $(".doco-section").find('a').each(function(){ - var url = document.createElement('a'); - url.href = window.location; - var pageName = url.href.split('/').pop().split('#').shift().split('?').shift(); - var linkName = $(this).attr('href').split('/').pop(); - if(pageName === linkName) { - var tocUl = $(this).closest('a').append('<ul>').find('ul'); - tocUl.removeClass(); // Classes are automatically added to <ul> elements by something else - tocUl.toc({content: "#doco-content", headings: "h3"}); - tocUl.addClass('toc-content'); - tocUl.addClass('list-unstyled'); - tocUl.attr('id', 'doco-side-toc'); - - } - }); - - $(document.body).trigger("sticky_kit:recalc"); - - toc.contentTop = []; - toc.edgeMargin = 20; // margin above the top or margin from the end of the page - toc.topRange = 200; // measure from the top of the viewport to X pixels down - // Set up content an array of locations - $('#doco-side-toc').find('a').each(function(){ - toc.contentTop.push( $( '#'+$(this).attr('href').split('#').pop() ).offset().top ); - }); - - - // adjust side menu - $(window).scroll(function(){ - var winTop = $(window).scrollTop(), - bodyHt = $(document).height(), - vpHt = $(window).height() + toc.edgeMargin; // viewport height + margin - $.each( toc.contentTop, function(i,loc){ - if ( ( loc > winTop - toc.edgeMargin && ( loc < winTop + toc.topRange || ( winTop + vpHt ) >= bodyHt ) ) ){ - $('#doco-side-toc li') - .removeClass('selected-doco-nav') - .eq(i).addClass('selected-doco-nav'); - if (typeof($('#doco-side-toc li').eq(i).find('a').attr('href').split('#')[1]) !== 'undefined') { - window.history.pushState({}, '', location.href.split('#')[0] + '#' + $('#doco-side-toc li').eq(i).find('a').attr('href').split('#')[1]); - } - } - }); - }); - - // When the page loads, it does not scroll to the section specified in the URL because it - // has not been constructed yet by the script. This will reload the URL - if (typeof(location.href.split('#')[1]) !== 'undefined') { - var p = document.createElement('a'); - p.href = location.href; - var portstr = ''; - if(p.port !== '') { - portstr = ':'+ p.port; - } - var newref = p.protocol + '//'+ p.hostname + portstr + p.pathname + p.hash.split('?').shift(); - location.replace(newref) - } - }); -</script> diff --git a/include/api_auth.php b/include/api_auth.php index e5cd7cab3..0818fa54b 100644 --- a/include/api_auth.php +++ b/include/api_auth.php @@ -7,6 +7,8 @@ function api_login(&$a){ $record = null; + $remote_auth = false; + $sigblock = null; require_once('include/oauth.php'); @@ -33,21 +35,66 @@ function api_login(&$a){ // workarounds for HTTP-auth in CGI mode - if(x($_SERVER,'REDIRECT_REMOTE_USER')) { - $userpass = base64_decode(substr($_SERVER["REDIRECT_REMOTE_USER"],6)) ; - if(strlen($userpass)) { - list($name, $password) = explode(':', $userpass); - $_SERVER['PHP_AUTH_USER'] = $name; - $_SERVER['PHP_AUTH_PW'] = $password; + foreach([ 'REDIRECT_REMOTE_USER', 'HTTP_AUTHORIZATION' ] as $head) { + + /* Basic authentication */ + + if(array_key_exists($head,$_SERVER) && substr(trim($_SERVER[$head]),0,5) === 'Basic') { + $userpass = @base64_decode(substr(trim($_SERVER[$head]),6)) ; + if(strlen($userpass)) { + list($name, $password) = explode(':', $userpass); + $_SERVER['PHP_AUTH_USER'] = $name; + $_SERVER['PHP_AUTH_PW'] = $password; + } + break; } - } - if(x($_SERVER,'HTTP_AUTHORIZATION')) { - $userpass = base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"],6)) ; - if(strlen($userpass)) { - list($name, $password) = explode(':', $userpass); - $_SERVER['PHP_AUTH_USER'] = $name; - $_SERVER['PHP_AUTH_PW'] = $password; + /* Signature authentication */ + + if(array_key_exists($head,$_SERVER) && substr(trim($_SERVER[$head]),0,9) === 'Signature') { + if($head !== 'HTTP_AUTHORIZATION') { + $_SERVER['HTTP_AUTHORIZATION'] = $_SERVER[$head]; + continue; + } + + $sigblock = \Zotlabs\Web\HTTPSig::parse_sigheader($_SERVER[$head]); + if($sigblock) { + $keyId = $sigblock['keyId']; + if($keyId) { + $r = q("select * from hubloc where hubloc_addr = '%s' limit 1", + dbesc($keyId) + ); + if($r) { + $c = channelx_by_hash($r[0]['hubloc_hash']); + if($c) { + $a = q("select * from account where account_id = %d limit 1", + intval($c['channel_account_id']) + ); + if($a) { + $record = [ 'channel' => $c, 'account' => $a[0] ]; + $channel_login = $c['channel_id']; + } + else { + continue; + } + } + else { + continue; + } + } + else { + continue; + } + + if($record) { + $verified = \Zotlabs\Web\HTTPSig::verify('',$record['channel']['channel_pubkey']); + if(! ($verified && $verified['header_signed'] && $verified['header_valid'])) { + $record = null; + } + break; + } + } + } } } @@ -64,8 +111,6 @@ function api_login(&$a){ } } - - if($record['account']) { authenticate_success($record['account']); @@ -85,8 +130,8 @@ function api_login(&$a){ } -function retry_basic_auth() { - header('WWW-Authenticate: Basic realm="Hubzilla"'); +function retry_basic_auth($method = 'Basic') { + header('WWW-Authenticate: ' . $method . ' realm="Hubzilla"'); header('HTTP/1.0 401 Unauthorized'); echo('This api requires login'); killme(); diff --git a/include/attach.php b/include/attach.php index 50de3ac53..78e133b03 100644 --- a/include/attach.php +++ b/include/attach.php @@ -423,6 +423,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { $hash = (($arr && $arr['hash']) ? $arr['hash'] : null); $upload_path = (($arr && $arr['directory']) ? $arr['directory'] : ''); $visible = (($arr && $arr['visible']) ? $arr['visible'] : ''); + $notify = (($arr && $arr['notify']) ? $arr['notify'] : ''); $observer = array(); @@ -459,6 +460,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { // By default remove $src when finished $remove_when_processed = true; + $import_replace = false; if($options === 'import') { $src = $arr['src']; @@ -475,6 +477,9 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { if($arr['preserve_original']) $remove_when_processed = false; + if($arr['replace']) + $import_replace = true; + // if importing a directory, just do it now and go home - we're done. if(array_key_exists('is_dir',$arr) && intval($arr['is_dir'])) { @@ -616,8 +621,10 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { dbesc($folder_hash) ); if($r) { - $overwrite = get_pconfig($channel_id,'system','overwrite_dup_files'); + $overwrite = (($import_replace || get_pconfig($channel_id,'system','overwrite_dup_files')) ? true : false); if(($overwrite) || ($options === 'import')) { + if(! array_key_exists('edited',$arr)) + $arr['edited'] = datetime_convert(); $options = 'replace'; $existing_id = $x[0]['id']; $existing_size = intval($x[0]['filesize']); @@ -709,7 +716,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { $os_relpath = ltrim($os_relpath,'/'); $os_path = $os_relpath; - $display_path = $pathname . '/' . $filename; + $display_path = ltrim($pathname . '/' . $filename,'/'); if($src) @file_put_contents($os_basepath . $os_relpath,@file_get_contents($src)); @@ -886,6 +893,12 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { build_sync_packet($channel['channel_id'],array('file' => array($sync))); } + if($notify) { + //$cloudPath = z_root() . '/cloud/' . $channel['channel_address'] . '/' . $r['0']['display_path']; + //$object = get_file_activity_object($channel['channel_id'], $r['0']['hash'], $cloudPath); + //file_activity($channel['channel_id'], $object, $r['0']['allow_cid'], $r['0']['allow_gid'], $r['0']['deny_cid'], $r['0']['deny_gid'], 'post', $notify); + } + return $ret; } @@ -1299,8 +1312,8 @@ function attach_delete($channel_id, $resource, $is_photo = 0) { return; } - $cloudpath = get_parent_cloudpath($channel_id, $channel_address, $resource); - $object = get_file_activity_object($channel_id, $resource, $cloudpath); + $url = get_cloudpath($channel_id, $channel_address, $resource); + $object = get_file_activity_object($channel_id, $resource, $url); // If resource is a directory delete everything in the directory recursive if(intval($r[0]['is_dir'])) { @@ -1441,7 +1454,7 @@ function get_cloudpath($arr) { * @param string $attachHash * @return string with the full folder path */ -function get_parent_cloudpath($channel_id, $channel_name, $attachHash) { +function get_cloud_url($channel_id, $channel_name, $attachHash) { $parentFullPath = ''; // build directory tree $parentHash = $attachHash; @@ -1453,9 +1466,9 @@ function get_parent_cloudpath($channel_id, $channel_name, $attachHash) { } } while ($parentHash); - $parentFullPath = z_root() . '/cloud/' . $channel_name . '/' . $parentFullPath; + $url = z_root() . '/cloud/' . $channel_name . '/' . $parentFullPath . find_filename_by_hash($channel_id, $attachHash); - return $parentFullPath; + return $url; } /** @@ -1719,14 +1732,14 @@ function file_activity($channel_id, $object, $allow_cid, $allow_gid, $deny_cid, * @param string $hash * @param string $cloudpath */ -function get_file_activity_object($channel_id, $hash, $cloudpath) { +function get_file_activity_object($channel_id, $hash, $url) { $x = q("SELECT creator, filename, filetype, filesize, revision, folder, os_storage, is_photo, is_dir, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid FROM attach WHERE uid = %d AND hash = '%s' LIMIT 1", intval($channel_id), dbesc($hash) ); - $url = rawurlencode($cloudpath . $x[0]['filename']); + $url = rawurlencode($url); $links = array(); $links[] = array( diff --git a/include/auth.php b/include/auth.php index c7be69583..78be32bf4 100644 --- a/include/auth.php +++ b/include/auth.php @@ -83,7 +83,7 @@ function account_verify_password($login, $pass) { if(($email_verify) && ($register_policy == REGISTER_OPEN) && ($account['account_flags'] & ACCOUNT_UNVERIFIED)) { logger('email verification required for ' . $login); - return null; + return ( [ 'reason' => 'unvalidated' ] ); } if(($account['account_flags'] == ACCOUNT_OK) @@ -259,7 +259,10 @@ else { } else { $verify = account_verify_password($_POST['username'], $_POST['password']); - if($verify) { + if($verify && array_key_exists('reason',$verify) && $verify['reason'] === 'unvalidated') { + notice( t('Email validation is incomplete. Please check your email.')); + } + elseif($verify) { $atoken = $verify['xchan']; $channel = $verify['channel']; $account = App::$account = $verify['account']; diff --git a/include/bbcode.php b/include/bbcode.php index 9f9b5c5e1..9a2a6eb9b 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -327,11 +327,16 @@ function bb_ShareAttributes($match) { if ($avatar != "") $headline .= '<a href="' . zid($profile) . '" ><img src="' . $avatar . '" alt="' . $author . '" height="32" width="32" /></a>'; + if(strpos($link,'/cards/')) + $type = t('card'); + else + $type = t('post'); + // Bob Smith wrote the following post 2 hours ago $fmt = sprintf( t('%1$s wrote the following %2$s %3$s'), '<a href="' . zid($profile) . '" >' . $author . '</a>', - '<a href="' . zid($link) . '" >' . t('post') . '</a>', + '<a href="' . zid($link) . '" >' . $type . '</a>', $reldate ); @@ -1255,6 +1260,9 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false) $Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_unspacefy_and_trim', $Text); } + // replace escaped links in code= blocks + $Text = str_replace('%eY9-!','http', $Text); + $Text = preg_replace('/\[\&\;([#a-z0-9]+)\;\]/', '&$1;', $Text); // fix any escaped ampersands that may have been converted into links diff --git a/include/channel.php b/include/channel.php index 49da57fd6..d7116ce28 100644 --- a/include/channel.php +++ b/include/channel.php @@ -7,6 +7,7 @@ require_once('include/zot.php'); require_once('include/crypto.php'); require_once('include/menu.php'); require_once('include/perm_upgrade.php'); +require_once('include/photo/photo_driver.php'); /** * @brief Called when creating a new channel. @@ -52,7 +53,7 @@ function identity_check_service_class($account_id) { * * This action is pluggable. * We're currently only checking for an empty name or one that exceeds our - * storage limit (255 chars). 255 chars is probably going to create a mess on + * storage limit (191 chars). 191 chars is probably going to create a mess on * some pages. * Plugins can set additional policies such as full name requirements, character * sets, multi-byte length, etc. @@ -67,7 +68,7 @@ function validate_channelname($name) { if (! $name) return t('Empty name'); - if (strlen($name) > 255) + if (mb_strlen($name) > 191) return t('Name too long'); $arr = ['name' => $name]; @@ -273,6 +274,19 @@ function create_identity($arr) { return $ret; } + $a = q("select * from account where account_id = %d", + intval($arr['account_id']) + ); + + $photo_type = null; + + $z = [ 'account' => $a[0], 'channel' => $r[0], 'photo_url' => '' ]; + call_hooks('create_channel_photo',$z); + + if($z['photo_url']) { + $photo_type = import_channel_photo_from_url($z['photo_url'],$arr['account_id'],$r[0]['channel_id']); + } + if($role_permissions && array_key_exists('limits',$role_permissions)) $perm_limits = $role_permissions['limits']; else @@ -318,6 +332,7 @@ function create_identity($arr) { '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}", @@ -454,6 +469,194 @@ function create_identity($arr) { return $ret; } + +function change_channel_keys($channel) { + + $ret = array('success' => false); + + $stored = []; + + $key = new_keypair(4096); + + $sig = base64url_encode(rsa_sign($channel['channel_guid'],$key['prvkey'])); + $hash = make_xchan_hash($channel['channel_guid'],$sig); + + $stored['old_guid'] = $channel['channel_guid']; + $stored['old_guid_sig'] = $channel['channel_guid_sig']; + $stored['old_key'] = $channel['channel_pubkey']; + $stored['old_hash'] = $channel['channel_hash']; + + $stored['new_key'] = $key['pubkey']; + $stored['new_sig'] = base64url_encode(rsa_sign($key['pubkey'],$channel['channel_prvkey'])); + + // Save this info for the notifier to collect + + set_pconfig($channel['channel_id'],'system','keychange',$stored); + + $r = q("update channel set channel_prvkey = '%s', channel_pubkey = '%s', channel_guid_sig = '%s', channel_hash = '%s' where channel_id = %d", + dbesc($key['prvkey']), + dbesc($key['pubkey']), + dbesc($sig), + dbesc($hash), + intval($channel['channel_id']) + ); + if(! $r) { + return $ret; + } + + $r = q("select * from channel where channel_id = %d", + intval($channel['channel_id']) + ); + + if(! $r) { + $ret['message'] = t('Unable to retrieve modified identity'); + return $ret; + } + + $modified = $r[0]; + + $h = q("select * from hubloc where hubloc_hash = '%s' and hubloc_url = '%s' ", + dbesc($stored['old_hash']), + dbesc(z_root()) + ); + + if($h) { + foreach($h as $hv) { + $hv['hubloc_guid_sig'] = $sig; + $hv['hubloc_hash'] = $hash; + $hv['hubloc_url_sig'] = base64url_encode(rsa_sign(z_root(),$modifed['channel_prvkey'])); + hubloc_store_lowlevel($hv); + } + } + + $x = q("select * from xchan where xchan_hash = '%s' ", + dbesc($stored['old_hash']) + ); + + $check = q("select * from xchan where xchan_hash = '%s'", + dbesc($hash) + ); + + if(($x) && (! $check)) { + $oldxchan = $x[0]; + foreach($x as $xv) { + $xv['xchan_guid_sig'] = $sig; + $xv['xchan_hash'] = $hash; + $xv['xchan_pubkey'] = $key['pubkey']; + xchan_store_lowlevel($xv); + $newxchan = $xv; + } + } + + build_sync_packet($channel['channel_id'], [ 'keychange' => $stored ]); + + $a = q("select * from abook where abook_xchan = '%s' and abook_self = 1", + dbesc($stored['old_hash']) + ); + + if($a) { + q("update abook set abook_xchan = '%s' where abook_id = %d", + dbesc($hash), + intval($a[0]['abook_id']) + ); + } + + xchan_change_key($oldxchan,$newxchan,$stored); + + Zotlabs\Daemon\Master::Summon(array('Notifier', 'keychange', $channel['channel_id'])); + + $ret['success'] = true; + return $ret; +} + +function channel_change_address($channel,$new_address) { + + $ret = array('success' => false); + + $old_address = $channel['channel_address']; + + if($new_address === 'sys') { + $ret['message'] = t('Reserved nickname. Please choose another.'); + return $ret; + } + + if(check_webbie(array($new_address)) !== $new_address) { + $ret['message'] = t('Nickname has unsupported characters or is already being used on this site.'); + return $ret; + } + + $r = q("update channel set channel_address = '%s' where channel_id = %d", + dbesc($new_address), + intval($channel['channel_id']) + ); + if(! $r) { + return $ret; + } + + $r = q("select * from channel where channel_id = %d", + intval($channel['channel_id']) + ); + + if(! $r) { + $ret['message'] = t('Unable to retrieve modified identity'); + return $ret; + } + + $r = q("update xchan set xchan_addr = '%s' where xchan_hash = '%s'", + dbesc($new_address . '@' . App::get_hostname()), + dbesc($channel['channel_hash']) + ); + + $h = q("select * from hubloc where hubloc_hash = '%s' and hubloc_url = '%s' ", + dbesc($channel['channel_hash']), + dbesc(z_root()) + ); + + if($h) { + foreach($h as $hv) { + if($hv['hubloc_primary']) { + q("update hubloc set hubloc_primary = 0 where hubloc_id = %d", + intval($hv['hubloc_id']) + ); + } + q("update hubloc set hubloc_deleted = 1 where hubloc_id = %d", + intval($hv['hubloc_id']) + ); + + unset($hv['hubloc_id']); + $hv['hubloc_addr'] = $new_address . '@' . App::get_hostname(); + hubloc_store_lowlevel($hv); + } + } + + // fix apps which were stored with the actual name rather than a macro + + $r = q("select * from app where app_channel = %d and app_system = 1", + intval($channel['channel_id']) + ); + if($r) { + foreach($r as $rv) { + $replace = preg_replace('/([\=\/])(' . $old_address . ')($|[\%\/])/ism','$1' . $new_address . '$3',$rv['app_url']); + if($replace != $rv['app_url']) { + q("update app set app_url = '%s' where id = %d", + dbesc($replace), + intval($rv['id']) + ); + } + } + } + + Zotlabs\Daemon\Master::Summon(array('Notifier', 'refresh_all', $channel['channel_id'])); + + $ret['success'] = true; + return $ret; +} + + + + + + /** * @brief Set default channel to be used on login. * @@ -1170,7 +1373,6 @@ function profile_sidebar($profile, $block = 0, $show_connect = true, $zcard = fa ? trim(substr($profile['channel_name'],0,strpos($profile['channel_name'],' '))) : $profile['channel_name']); $lastname = (($firstname === $profile['channel_name']) ? '' : trim(substr($profile['channel_name'],strlen($firstname)))); - // @fixme move this to the diaspora plugin itself $contact_block = contact_block(); @@ -1428,13 +1630,15 @@ function get_my_address() { function zid_init() { $tmp_str = get_my_address(); if(validate_email($tmp_str)) { - Zotlabs\Daemon\Master::Summon(array('Gprobe',bin2hex($tmp_str))); $arr = array('zid' => $tmp_str, 'url' => App::$cmd); call_hooks('zid_init',$arr); if(! local_channel()) { $r = q("select * from hubloc where hubloc_addr = '%s' order by hubloc_connected desc limit 1", dbesc($tmp_str) ); + if(! $r) { + Zotlabs\Daemon\Master::Summon(array('Gprobe',bin2hex($tmp_str))); + } if($r && remote_channel() && remote_channel() === $r[0]['hubloc_hash']) return; logger('zid_init: not authenticated. Invoking reverse magic-auth for ' . $tmp_str); @@ -1443,7 +1647,7 @@ function zid_init() { $query = str_replace(array('?zid=','&zid='),array('?rzid=','&rzid='),$query); $dest = '/' . urlencode($query); if($r && ($r[0]['hubloc_url'] != z_root()) && (! strstr($dest,'/magic')) && (! strstr($dest,'/rmagic'))) { - goaway($r[0]['hubloc_url'] . '/magic' . '?f=&rev=1&dest=' . z_root() . $dest); + goaway($r[0]['hubloc_url'] . '/magic' . '?f=&rev=1&owa=1&dest=' . z_root() . $dest); } else logger('zid_init: no hubloc found.'); @@ -2104,7 +2308,7 @@ function profile_store_lowlevel($arr) { // It is the caller's responsibility to confirm the requestor's intent and // authorisation to do this. -function account_remove($account_id,$local = true,$unset_session=true) { +function account_remove($account_id,$local = true,$unset_session = true) { logger('account_remove: ' . $account_id); @@ -2149,13 +2353,12 @@ function account_remove($account_id,$local = true,$unset_session=true) { if ($unset_session) { - unset($_SESSION['authenticated']); - unset($_SESSION['uid']); - notice( sprintf(t("User '%s' deleted"),$account_email) . EOL); + App::$session->nuke(); + notice( sprintf(t('Account \'%s\' deleted'),$account_email) . EOL); goaway(z_root()); } - return $r; + return $r; } /** diff --git a/include/config.php b/include/config.php index 0b0e639ab..0be791715 100644 --- a/include/config.php +++ b/include/config.php @@ -126,3 +126,19 @@ function set_iconfig(&$item, $family, $key, $value, $sharing = false) { function del_iconfig(&$item, $family, $key) { return Zlib\IConfig::Delete($item, $family, $key); } + +function load_sconfig($server_id) { + Zlib\SConfig::Load($server_id); +} + +function get_sconfig($server_id, $family, $key, $default = false) { + return Zlib\SConfig::Get($server_id, $family, $key, $default); +} + +function set_sconfig($server_id, $family, $key, $value) { + return Zlib\SConfig::Set($server_id, $family, $key, $value); +} + +function del_sconfig($server_id, $family, $key) { + return Zlib\SConfig::Delete($server_id, $family, $key); +} diff --git a/include/connections.php b/include/connections.php index 8df795190..60bce018e 100644 --- a/include/connections.php +++ b/include/connections.php @@ -115,7 +115,7 @@ function vcard_from_xchan($xchan, $observer = null, $mode = '') { App::$profile_uid = $xchan['channel_id']; $url = (($observer) - ? z_root() . '/magic?f=&dest=' . $xchan['xchan_url'] . '&addr=' . $xchan['xchan_addr'] + ? z_root() . '/magic?f=&owa=1&dest=' . $xchan['xchan_url'] . '&addr=' . $xchan['xchan_addr'] : $xchan['xchan_url'] ); @@ -369,7 +369,8 @@ function contact_remove($channel_id, $abook_id) { return false; - $r = q("select * from item where author_xchan = '%s' and uid = %d", + $r = q("select * from item where (owner_xchan = '%s' or author_xchan = '%s') and uid = %d", + dbesc($abook['abook_xchan']), dbesc($abook['abook_xchan']), intval($channel_id) ); @@ -629,13 +630,20 @@ function get_vcard_array($vc,$id) { if($vc->ADR) { foreach($vc->ADR as $adr) { $type = (($adr['TYPE']) ? vcard_translate_type((string)$adr['TYPE']) : ''); - $adrs[] = [ + $entry = [ 'type' => $type, 'address' => $adr->getParts() ]; - $last_entry = end($adrs); - if($last_entry && is_array($adrs[$last_entry]['address'])) - array_walk($adrs[$last_entry]['address'],'array_escape_tags'); + + if(is_array($entry['address'])) { + array_walk($entry['address'],'array_escape_tags'); + } + else { + $entry['address'] = (string) escape_tags($entry['address']); + } + + $adrs[] = $entry; + } } diff --git a/include/contact_widgets.php b/include/contact_widgets.php index 8f76bb4bc..9cc9f0baf 100644 --- a/include/contact_widgets.php +++ b/include/contact_widgets.php @@ -65,6 +65,10 @@ function categories_widget($baseurl,$selected = '') { if(! feature_enabled(App::$profile['profile_uid'],'categories')) return ''; + require_once('include/security.php'); + + $sql_extra = item_permissions_sql(App::$profile['profile_uid']); + $item_normal = item_normal(); $terms = array(); @@ -77,6 +81,7 @@ function categories_widget($baseurl,$selected = '') { and item.owner_xchan = '%s' and item.item_wall = 1 $item_normal + $sql_extra order by term.term asc", intval(App::$profile['profile_uid']), intval(TERM_CATEGORY), @@ -100,7 +105,53 @@ function categories_widget($baseurl,$selected = '') { return ''; } -function common_friends_visitor_widget($profile_uid) { +function cardcategories_widget($baseurl,$selected = '') { + + if(! feature_enabled(App::$profile['profile_uid'],'categories')) + return ''; + + $sql_extra = item_permissions_sql(App::$profile['profile_uid']); + + $item_normal = "and item.item_hidden = 0 and item.item_type = 6 and item.item_deleted = 0 + and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_pending_remove = 0 + and item.item_blocked = 0 "; + + $terms = array(); + $r = q("select distinct(term.term) + from term join item on term.oid = item.id + where item.uid = %d + and term.uid = item.uid + and term.ttype = %d + and term.otype = %d + and item.owner_xchan = '%s' + $item_normal + $sql_extra + order by term.term asc", + intval(App::$profile['profile_uid']), + intval(TERM_CATEGORY), + intval(TERM_OBJ_POST), + dbesc(App::$profile['channel_hash']) + ); + if($r && count($r)) { + foreach($r as $rr) + $terms[] = array('name' => $rr['term'], 'selected' => (($selected == $rr['term']) ? 'selected' : '')); + + return replace_macros(get_markup_template('categories_widget.tpl'),array( + '$title' => t('Categories'), + '$desc' => '', + '$sel_all' => (($selected == '') ? 'selected' : ''), + '$all' => t('Everything'), + '$terms' => $terms, + '$base' => $baseurl, + + )); + } + return ''; +} + + + +function common_friends_visitor_widget($profile_uid,$cnt = 25) { if(local_channel() == $profile_uid) return; @@ -113,19 +164,20 @@ function common_friends_visitor_widget($profile_uid) { require_once('include/socgraph.php'); $t = count_common_friends($profile_uid,$observer_hash); + if(! $t) return; - $r = common_friends($profile_uid,$observer_hash,0,5,true); - + $r = common_friends($profile_uid,$observer_hash,0,$cnt,true); + return replace_macros(get_markup_template('remote_friends_common.tpl'), array( - '$desc' => sprintf( tt("%d connection in common", "%d connections in common", $t), $t), - '$base' => z_root(), - '$uid' => $profile_uid, - '$cid' => $observer, - '$linkmore' => (($t > 5) ? 'true' : ''), - '$more' => t('show more'), - '$items' => $r + '$desc' => t('Common Connections'), + '$base' => z_root(), + '$uid' => $profile_uid, + '$cid' => $observer, + '$linkmore' => (($t > $cnt) ? 'true' : ''), + '$more' => sprintf( t('View all %d common connections'), $t), + '$items' => $r )); }; diff --git a/include/conversation.php b/include/conversation.php index 23220b390..f395b2cbe 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -295,7 +295,7 @@ function localize_item(&$item){ } $plink = '[zrl=' . $obj['plink'] . ']' . $post_type . '[/zrl]'; - $parsedobj = parse_xml_string($xmlhead.$item['obj']); +// $parsedobj = parse_xml_string($xmlhead.$item['obj']); $tag = sprintf('#[zrl=%s]%s[/zrl]', $parsedobj->id, $parsedobj->content); $item['body'] = sprintf( t('%1$s tagged %2$s\'s %3$s with %4$s'), $author, $objauthor, $plink, $tag ); @@ -312,7 +312,7 @@ function localize_item(&$item){ $xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">"; - $obj = parse_xml_string($xmlhead.$item['obj']); +// $obj = parse_xml_string($xmlhead.$item['obj']); if(strlen($obj->id)) { $r = q("select * from item where mid = '%s' and uid = %d limit 1", dbesc($obj->id), @@ -464,9 +464,11 @@ function conversation($items, $mode, $update, $page_mode = 'traditional', $prepa $profile_owner = 0; $page_writeable = false; $live_update_div = ''; + $jsreload = ''; $preview = (($page_mode === 'preview') ? true : false); $previewing = (($preview) ? ' preview ' : ''); + $preview_lbl = t('This is an unsaved preview'); if ($mode === 'network') { @@ -516,6 +518,16 @@ function conversation($items, $mode, $update, $page_mode = 'traditional', $prepa } } + elseif ($mode === 'cards') { + $profile_owner = App::$profile['profile_uid']; + $page_writeable = ($profile_owner == local_channel()); + $live_update_div = '<div id="live-cards"></div>' . "\r\n" + . "<script> var profile_uid = " . App::$profile['profile_uid'] + . "; var netargs = '?f='; var profile_page = " . App::$pager['page'] . "; </script>\r\n"; + $jsreload = $_SESSION['return_url']; + } + + elseif ($mode === 'display') { $profile_owner = local_channel(); $page_writeable = false; @@ -549,6 +561,19 @@ function conversation($items, $mode, $update, $page_mode = 'traditional', $prepa if (! feature_enabled($profile_owner,'multi_delete')) $page_dropping = false; + $uploading = true; + + if($profile_owner > 0) { + $owner_channel = channelx_by_n($profile_owner); + if($owner_channel['channel_allow_cid'] || $owner_channel['channel_allow_gid'] + || $owner_channel['channel_deny_cid'] || $owner_channel['channel_deny_gid']) { + $uploading = false; + } + } + else { + $uploading = false; + } + $channel = App::get_channel(); $observer = App::get_observer(); @@ -678,12 +703,19 @@ function conversation($items, $mode, $update, $page_mode = 'traditional', $prepa if(strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC','now - 12 hours')) > 0) $is_new = true; + $conv_link_mid = (($mode == 'moderate') ? $item['parent_mid'] : $item['mid']); + + $conv_link = (($item['item_type'] == ITEM_TYPE_CARD) ? $item['plink'] : z_root() . '/display/' . gen_link_id($conv_link_mid)); + + $tmp_item = array( 'template' => $tpl, 'toplevel' => 'toplevel_item', + 'item_type' => intval($item['item_type']), 'mode' => $mode, 'approve' => t('Approve'), 'delete' => t('Delete'), + 'preview_lbl' => $preview_lbl, 'id' => (($preview) ? 'P0' : $item['item_id']), 'linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, $profile_url), 'profile_url' => $profile_link, @@ -731,7 +763,7 @@ function conversation($items, $mode, $update, $page_mode = 'traditional', $prepa 'like' => '', 'dislike' => '', 'comment' => '', - 'conv' => (($preview) ? '' : array('href'=> z_root() . '/display/' . gen_link_id($item['mid']), 'title'=> t('View in context'))), + 'conv' => (($preview) ? '' : array('href'=> $conv_link, 'title'=> t('View in context'))), 'previewing' => $previewing, 'wait' => t('Please wait'), 'thread_level' => 1, @@ -751,7 +783,7 @@ function conversation($items, $mode, $update, $page_mode = 'traditional', $prepa // Normal View // logger('conv: items: ' . print_r($items,true)); - $conv = new Zotlabs\Lib\ThreadStream($mode, $preview, $prepared_item); + $conv = new Zotlabs\Lib\ThreadStream($mode, $preview, $uploading, $prepared_item); // In the display mode we don't have a profile owner. @@ -793,6 +825,10 @@ function conversation($items, $mode, $update, $page_mode = 'traditional', $prepa $item_object->set_template('conv_list.tpl'); $item_object->set_display_mode('list'); } + if($page_mode === 'cards') { + $item_object->set_reload($jsreload); + } + } } @@ -1290,6 +1326,11 @@ function status_editor($a, $x, $popup = false) { if(! $cipher) $cipher = 'aes256'; + if(array_key_exists('catsenabled',$x)) + $catsenabled = $x['catsenabled']; + else + $catsenabled = ((feature_enabled($x['profile_uid'], 'categories') && (! $webpage)) ? 'categories' : ''); + // avoid illegal offset errors if(! array_key_exists('permissions',$x)) $x['permissions'] = [ 'allow_cid' => '', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '' ]; @@ -1302,10 +1343,14 @@ function status_editor($a, $x, $popup = false) { call_hooks('jot_networks', $jotnets); } + $sharebutton = (x($x,'button') ? $x['button'] : t('Share')); + $placeholdtext = (x($x,'content_label') ? $x['content_label'] : $sharebutton); + $o .= replace_macros($tpl, array( '$return_path' => ((x($x, 'return_path')) ? $x['return_path'] : App::$query_string), '$action' => z_root() . '/item', - '$share' => (x($x,'button') ? $x['button'] : t('Share')), + '$share' => $sharebutton, + '$placeholdtext' => $placeholdtext, '$webpage' => $webpage, '$placeholdpagetitle' => ((x($x,'ptlabel')) ? $x['ptlabel'] : t('Page link name')), '$pagetitle' => (x($x,'pagetitle') ? $x['pagetitle'] : ''), @@ -1334,7 +1379,7 @@ function status_editor($a, $x, $popup = false) { '$clearloc' => $clearloc, '$title' => ((x($x, 'title')) ? htmlspecialchars($x['title'], ENT_COMPAT,'UTF-8') : ''), '$placeholdertitle' => ((x($x, 'placeholdertitle')) ? $x['placeholdertitle'] : t('Title (optional)')), - '$catsenabled' => ((feature_enabled($x['profile_uid'], 'categories') && (! $webpage)) ? 'categories' : ''), + '$catsenabled' => $catsenabled, '$category' => ((x($x, 'category')) ? $x['category'] : ''), '$placeholdercategory' => t('Categories (optional, comma-separated list)'), '$permset' => t('Permission settings'), @@ -1441,6 +1486,8 @@ function conv_sort($arr, $order) { usort($parents,'sort_thr_created'); elseif(stristr($order,'commented')) usort($parents,'sort_thr_commented'); + elseif(stristr($order,'updated')) + usort($parents,'sort_thr_updated'); elseif(stristr($order,'ascending')) usort($parents,'sort_thr_created_rev'); @@ -1482,6 +1529,12 @@ function sort_thr_commented($a,$b) { return strcmp($b['commented'],$a['commented']); } +function sort_thr_updated($a,$b) { + $indexa = (($a['changed'] > $a['edited']) ? $a['changed'] : $a['edited']); + $indexb = (($b['changed'] > $b['edited']) ? $b['changed'] : $b['edited']); + return strcmp($indexb,$indexa); +} + function find_thread_parent_index($arr,$x) { foreach($arr as $k => $v) if($v['id'] == $x['parent']) @@ -1573,7 +1626,6 @@ function network_tabs() { $conv_active = ''; $spam_active = ''; $postord_active = ''; - $public_active = ''; if(x($_GET,'new')) { $new_active = 'active'; @@ -1595,16 +1647,11 @@ function network_tabs() { $spam_active = 'active'; } - if(x($_GET,'fh')) { - $public_active = 'active'; - } - if (($new_active == '') && ($starred_active == '') && ($conv_active == '') && ($search_active == '') - && ($spam_active == '') - && ($public_active == '')) { + && ($spam_active == '')) { $no_active = 'active'; } @@ -1622,17 +1669,6 @@ function network_tabs() { // tabs $tabs = array(); - $disable_discover_tab = get_config('system','disable_discover_tab') || get_config('system','disable_discover_tab') === false; - - if(! $disable_discover_tab) { - $tabs[] = array( - 'label' => t('Discover'), - 'url' => z_root() . '/' . $cmd . '?f=&fh=1' , - 'sel' => $public_active, - 'title' => t('Imported public streams'), - ); - } - $tabs[] = array( 'label' => t('Commented Order'), 'url'=>z_root() . '/' . $cmd . '?f=&order=comment' . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : '') . ((x($_GET,'gid')) ? '&gid=' . $_GET['gid'] : ''), @@ -1820,7 +1856,8 @@ function profile_tabs($a, $is_owner = false, $nickname = null){ require_once('include/menu.php'); $has_bookmarks = menu_list_count(local_channel(),'',MENU_BOOKMARK) + menu_list_count(local_channel(),'',MENU_SYSTEM|MENU_BOOKMARK); - if ($is_owner && $has_bookmarks) { + + if($is_owner && $has_bookmarks) { $tabs[] = array( 'label' => t('Bookmarks'), 'url' => z_root() . '/bookmarks', @@ -1831,6 +1868,17 @@ function profile_tabs($a, $is_owner = false, $nickname = null){ ); } + if(feature_enabled($uid,'cards')) { + $tabs[] = array( + 'label' => t('Cards'), + 'url' => z_root() . '/cards/' . $nickname, + 'sel' => ((argv(0) == 'cards') ? 'active' : ''), + 'title' => t('View Cards'), + 'id' => 'cards-tab', + 'icon' => 'list' + ); + } + if($has_webpages && feature_enabled($uid,'webpages')) { $tabs[] = array( 'label' => t('Webpages'), @@ -1841,7 +1889,7 @@ function profile_tabs($a, $is_owner = false, $nickname = null){ 'icon' => 'newspaper-o' ); } - + if ($p['view_wiki']) { if(feature_enabled($uid,'wiki') && (get_account_techlevel($account_id) > 3)) { diff --git a/include/crypto.php b/include/crypto.php index 2c5545e9b..622add4dc 100644 --- a/include/crypto.php +++ b/include/crypto.php @@ -148,6 +148,7 @@ function other_encapsulate($data,$pubkey,$alg) { // compromised by state actors and evidence is mounting that this has // already happened. + $result = [ 'encrypted' => true ]; $key = openssl_random_pseudo_bytes(256); $iv = openssl_random_pseudo_bytes(256); $result['data'] = base64url_encode($fn($data,$key,$iv),true); @@ -185,11 +186,24 @@ function crypto_methods() { } +function signing_methods() { + + + $r = [ 'sha256' ]; + call_hooks('signing_methods',$r); + return $r; + +} + + function aes_encapsulate($data,$pubkey) { if(! $pubkey) logger('aes_encapsulate: no key. data: ' . $data); $key = openssl_random_pseudo_bytes(32); $iv = openssl_random_pseudo_bytes(16); + + $result = [ 'encrypted' => true ]; + $result['data'] = base64url_encode(AES256CBC_encrypt($data,$key,$iv),true); // log the offending call so we can track it down if(! openssl_public_encrypt($key,$k,$pubkey)) { diff --git a/include/features.php b/include/features.php index f32dbe82e..f84c9cb05 100644 --- a/include/features.php +++ b/include/features.php @@ -118,6 +118,15 @@ function get_features($filtered = true) { ], [ + 'cards', + t('Cards'), + t('Create personal planning cards'), + false, + get_config('feature_lock','cards'), + feature_level('cards',1), + ], + + [ 'nav_channel_select', t('Navigation Channel Select'), t('Change channels directly from within the navigation dropdown menu'), diff --git a/include/feedutils.php b/include/feedutils.php index 07cb79340..217da8188 100644 --- a/include/feedutils.php +++ b/include/feedutils.php @@ -255,7 +255,7 @@ function get_atom_elements($feed, $item, &$author) { $author['author_is_feed'] = false; $rawauthor = $feed->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author'); - logger('rawauthor: ' . print_r($rawauthor, true)); + //logger('rawauthor: ' . print_r($rawauthor, true)); } else { @@ -519,7 +519,7 @@ function get_atom_elements($feed, $item, &$author) { // turn Mastodon content warning into a #nsfw hashtag if($mastodon && $summary) { - $res['body'] .= "\n\n#ContentWarning\n"; + $res['body'] = $summary . "\n\n" . $res['body'] . "\n\n#ContentWarning\n"; } @@ -811,6 +811,7 @@ function feed_get_reshare(&$res,$item) { } $attach = $share['links']; + if($attach) { foreach($attach as $att) { if($att['rel'] === 'alternate') { @@ -845,6 +846,10 @@ function feed_get_reshare(&$res,$item) { } } + if((! $body) && ($share['alternate'])) { + $body = $share['alternate']; + } + $res['body'] = "[share author='" . urlencode($share['author']) . "' profile='" . $share['profile'] . "' avatar='" . $share['avatar'] . @@ -895,6 +900,41 @@ function encode_rel_links($links) { return $o; } + +function process_feed_tombstones($feed,$importer,$contact,$pass) { + + $arr_deleted = []; + + $del_entries = $feed->get_feed_tags(NAMESPACE_TOMB, 'deleted-entry'); + if(is_array($del_entries) && count($del_entries) && $pass != 2) { + foreach($del_entries as $dentry) { + if(isset($dentry['attribs']['']['ref'])) { + $arr_deleted[] = normalise_id($dentry['attribs']['']['ref']); + } + } + } + + if($arr_deleted && is_array($contact)) { + foreach($arr_deleted as $mid) { + $r = q("SELECT * from item where mid = '%s' and author_xchan = '%s' and uid = %d limit 1", + dbesc($mid), + dbesc($contact['xchan_hash']), + intval($importer['channel_id']) + ); + + if($r) { + $item = $r[0]; + + if(! intval($item['item_deleted'])) { + logger('deleting item ' . $item['id'] . ' mid=' . $item['mid'], LOGGER_DEBUG); + drop_item($item['id'],false); + } + } + } + } +} + + /** * @brief Process atom feed and update anything/everything we might need to update. * @@ -950,43 +990,11 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) { $permalink = $feed->get_permalink(); - // Check at the feed level for updated contact name and/or photo - // process any deleted entries + // Check at the feed level for tombstones - $del_entries = $feed->get_feed_tags(NAMESPACE_TOMB, 'deleted-entry'); - if(is_array($del_entries) && count($del_entries) && $pass != 2) { - foreach($del_entries as $dentry) { - $deleted = false; - if(isset($dentry['attribs']['']['ref'])) { - $mid = normalise_id($dentry['attribs']['']['ref']); - $deleted = true; - if(isset($dentry['attribs']['']['when'])) { - $when = $dentry['attribs']['']['when']; - $when = datetime_convert('UTC','UTC', $when, 'Y-m-d H:i:s'); - } - else - $when = datetime_convert('UTC','UTC','now','Y-m-d H:i:s'); - } + process_feed_tombstones($feed,$importer,$contact,$pass); - if($deleted && is_array($contact)) { - $r = q("SELECT * from item where mid = '%s' and author_xchan = '%s' and uid = %d limit 1", - dbesc($mid), - dbesc($contact['xchan_hash']), - intval($importer['channel_id']) - ); - - if($r) { - $item = $r[0]; - - if(! intval($item['item_deleted'])) { - logger('deleting item ' . $item['id'] . ' mid=' . $item['mid'], LOGGER_DEBUG); - drop_item($item['id'],false); - } - } - } - } - } // Now process the feed @@ -1028,6 +1036,13 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) { if(! $datarray['mid']) continue; + + $item_parent_mid = q("select parent_mid from item where mid = '%s' and uid = %d limit 1", + dbesc($parent_mid), + intval($importer['channel_id']) + ); + + // This probably isn't an appropriate default but we're about to change it // if it's wrong. @@ -1079,7 +1094,7 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) { $datarray['owner_xchan'] = $contact['xchan_hash']; - $r = q("SELECT id, edited FROM item WHERE mid = '%s' AND uid = %d LIMIT 1", + $r = q("SELECT id, edited, author_xchan, item_deleted FROM item WHERE mid = '%s' AND uid = %d LIMIT 1", dbesc($datarray['mid']), intval($importer['channel_id']) ); @@ -1088,6 +1103,15 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) { // Update content if 'updated' changes if($r) { + if(activity_match($datarray['verb'],ACTIVITY_DELETE) + && $datarray['author_xchan'] === $r[0]['author_xchan']) { + if(! intval($r[0]['item_deleted'])) { + logger('deleting item ' . $r[0]['id'] . ' mid=' . $datarray['mid'], LOGGER_DEBUG); + drop_item($r[0]['id'],false); + } + continue; + } + if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) { @@ -1123,18 +1147,12 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) { $datarray['parent_mid'] = $pmid; } } - if(! $pmid) { - $x = q("select parent_mid from item where mid = '%s' and uid = %d limit 1", - dbesc($parent_mid), - intval($importer['channel_id']) - ); - - if($x) { - logger('find_parent: matched in-reply-to: ' . $parent_mid, LOGGER_DEBUG); - $pmid = $x[0]['parent_mid']; - $datarray['parent_mid'] = $pmid; - } + if(($item_parent_mid) && (! $pmid)) { + logger('find_parent: matched in-reply-to: ' . $parent_mid, LOGGER_DEBUG); + $pmid = $item_parent_mid[0]['parent_mid']; + $datarray['parent_mid'] = $pmid; } + if((! $pmid) && $parent_link !== '') { $f = feed_conversation_fetch($importer,$contact,$parent_link); if($f) { @@ -1156,6 +1174,7 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) { ); if($x) { + $item_parent_mid = $x; $pmid = $x[0]['parent_mid']; $datarray['parent_mid'] = $pmid; } @@ -1237,6 +1256,13 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) { set_iconfig($datarray,'system','parent_mid',$parent_mid,true); } + + // allow likes of comments + + if($item_parent_mid && activity_match($datarray['verb'],ACTVITY_LIKE)) { + $datarray['thr_parent'] = $item_parent_mid[0]['parent_mid']; + } + $datarray['aid'] = $importer['channel_account_id']; $datarray['uid'] = $importer['channel_id']; @@ -1330,8 +1356,7 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) { } } - - $r = q("SELECT id, edited FROM item WHERE mid = '%s' AND uid = %d LIMIT 1", + $r = q("SELECT id, edited, author_xchan, item_deleted FROM item WHERE mid = '%s' AND uid = %d LIMIT 1", dbesc($datarray['mid']), intval($importer['channel_id']) ); @@ -1339,6 +1364,15 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) { // Update content if 'updated' changes if($r) { + if(activity_match($datarray['verb'],ACTIVITY_DELETE) + && $datarray['author_xchan'] === $r[0]['author_xchan']) { + if(! intval($r[0]['item_deleted'])) { + logger('deleting item ' . $r[0]['id'] . ' mid=' . $datarray['mid'], LOGGER_DEBUG); + drop_item($r[0]['id'],false); + } + continue; + } + if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) { @@ -1706,7 +1740,7 @@ function compat_photos_list($s) { $found = preg_match_all('/\[[zi]mg(.*?)\](.*?)\[/ism',$s,$matches,PREG_SET_ORDER); if($found) { - foreach($matches as $match) { + foreach($matches as $match) { $ret[] = [ 'href' => $match[2], 'length' => 0, diff --git a/include/follow.php b/include/follow.php index 9e2fd6a9c..56d8294c5 100644 --- a/include/follow.php +++ b/include/follow.php @@ -17,6 +17,17 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false) $my_perms = false; $is_zot = false; + $protocol = ''; + + + if(substr($url,0,1) === '[') { + $x = strpos($url,']'); + if($x) { + $protocol = substr($url,1,$x-1); + $url = substr($url,$x+1); + } + } + $is_http = ((strpos($url,'://') !== false) ? true : false); if($is_http && substr($url,-1,1) === '/') @@ -47,13 +58,13 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false) } - $arr = array('url' => $url, 'channel' => array()); + $arr = array('url' => $url, 'protocol', 'channel' => array()); call_hooks('follow_init', $arr); if($arr['channel']['success']) $ret = $arr['channel']; - elseif(! $is_http) + elseif((! $is_http) && ((! $protocol) || (strtolower($protocol) === 'zot'))) $ret = Zotlabs\Zot\Finger::run($url,$channel); if($ret && is_array($ret) && $ret['success']) { @@ -118,26 +129,31 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false) else { $xchan_hash = ''; + $sql_options = (($protocol) ? " and xchan_network = '" . dbesc($protocol) . "' " : ''); + - $r = q("select * from xchan where xchan_hash = '%s' or xchan_url = '%s' limit 1", + $r = q("select * from xchan where xchan_hash = '%s' or xchan_url = '%s' $sql_options limit 1", dbesc($url), dbesc($url) ); if(! $r) { + // attempt network auto-discovery - $d = discover_by_webbie($url); + $d = discover_by_webbie($url,$protocol); if((! $d) && ($is_http)) { // try RSS discovery - if(get_config('system','feed_contacts')) { + $feeds = get_config('system','feed_contacts'); + + if(($feeds) && ($protocol === '' || $protocol === 'feed')) { $d = discover_by_url($url); } else { - $result['message'] = t('Protocol disabled.'); + $result['message'] = t('Remote channel or protocol unavailable.'); return $result; } } diff --git a/include/help.php b/include/help.php index 4f9251b1b..02c3cb8e4 100644 --- a/include/help.php +++ b/include/help.php @@ -28,10 +28,23 @@ function get_help_content($tocpath = false) { } if($path) { + $title = basename($path); if(! $tocpath) \App::$page['title'] = t('Help:') . ' ' . ucwords(str_replace('-',' ',notags($title))); + // Check that there is a "toc" or "sitetoc" located at the specified path. + // If there is not, then there was not a translation of the table of contents + // available and so default back to the English TOC at /doc/toc.{html,bb,md} + // TODO: This is incompatible with the hierarchical TOC construction + // defined in /Zotlabs/Widget/Helpindex.php. + if($tocpath !== false && + load_doc_file('doc/' . $path . '.md') === '' && + load_doc_file('doc/' . $path . '.bb') === '' && + load_doc_file('doc/' . $path . '.html') === '' + ) { + $path = $title; + } $text = load_doc_file('doc/' . $path . '.md'); if(! $text) { @@ -107,20 +120,55 @@ function preg_callback_help_include($matches) { } - +function determine_help_language() { + require_once('Text/LanguageDetect.php'); + $lang_detect = new Text_LanguageDetect(); + // Set this mode to recognize language by the short code like "en", "ru", etc. + $lang_detect->setNameMode(2); + // If the language was specified in the URL, override the language preference + // of the browser. Default to English if both of these are absent. + if($lang_detect->languageExists(argv(1))) { + $lang = argv(1); + $from_url = true; + } else { + $lang = \App::$language; + if(! isset($lang)) + $lang = 'en'; + $from_url = false; + } + return array('language' => $lang, 'from_url' => $from_url); +} function load_doc_file($s) { - $lang = \App::$language; - if(! isset($lang)) - $lang = 'en'; - $b = basename($s); - $d = dirname($s); + $path = 'doc'; + // Determine the language and modify the path accordingly + $x = determine_help_language(); + $lang = $x['language']; + $url_idx = ($x['from_url'] ? 1 : 0); + // The English translation is at the root of /doc/. Other languages are in + // subfolders named by the language code such as "de", "es", etc. + if($lang !== 'en') { + $path .= '/' . $lang; + } - if($dirname !== '-') { - $c = find_doc_file("$d/$lang/$b"); - if($c) - return $c; + $b = basename($s); + + for($i=1+$url_idx; $i<argc()-1; $i++) { + $path .= '/' . argv($i); + } + $c = find_doc_file($path . '/' . $b); + if($c) + return $c; + // Possibly a translation was requested that has not been translated, so fall + // back to the English version + $path = 'doc'; + for($i=1+$url_idx; $i<argc()-1; $i++) { + $path .= '/' . argv($i); } + $c = find_doc_file($path . '/' . $b); + if($c) + return $c; + // Try one last time to find the file at the explicit path input to the function $c = find_doc_file($s); if($c) return $c; diff --git a/include/html2bbcode.php b/include/html2bbcode.php index 29880a627..d7fbd8660 100644 --- a/include/html2bbcode.php +++ b/include/html2bbcode.php @@ -87,9 +87,6 @@ function deletenode(&$doc, $node) function html2bbcode($message) { - //$file = tempnam("/tmp/", "html"); - //file_put_contents($file, $message); - $message = str_replace("\r", "", $message); $message = str_replace(array( diff --git a/include/import.php b/include/import.php index 5cb354cc3..f32f655da 100644 --- a/include/import.php +++ b/include/import.php @@ -603,6 +603,11 @@ function import_items($channel, $items, $sync = false, $relocate = null) { if(! $item) continue; + // deprecated + + if(array_key_exists('diaspora_meta',$item)) + unset($item['diaspora_meta']); + if($relocate && $item['mid'] === $item['parent_mid']) { item_url_replace($channel,$item,$relocate['url'],z_root(),$relocate['channel_address']); } @@ -640,6 +645,12 @@ function import_items($channel, $items, $sync = false, $relocate = null) { fix_attached_file_permissions($channel,$item['author_xchan'],$item['body'],$item['allow_cid'],$item['allow_gid'],$item['deny_cid'],$item['deny_gid']); + if($sync && $item['item_wall']) { + // deliver singletons if we have any + if($item_result && $item_result['success']) { + Zotlabs\Daemon\Master::Summon( [ 'Notifier','single_activity',$item_result['item_id'] ]); + } + } } } } @@ -1013,6 +1024,9 @@ function import_mail($channel, $mails, $sync = false) { $m['aid'] = $channel['channel_account_id']; $m['uid'] = $channel['channel_id']; $mail_id = mail_store($m); + if($sync && $mail_id) { + Zotlabs\Daemon\Master::Summon(array('Notifier','single_mail',$mail_id)); + } } } } diff --git a/include/items.php b/include/items.php index 5a0ca01c6..dd8b394d3 100755 --- a/include/items.php +++ b/include/items.php @@ -177,7 +177,13 @@ function item_normal() { } function item_normal_search() { - return " and item.item_hidden = 0 and item.item_type in (0,3) and item.item_deleted = 0 + return " and item.item_hidden = 0 and item.item_type in (0,3,6) and item.item_deleted = 0 + and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_pending_remove = 0 + and item.item_blocked = 0 "; +} + +function item_normal_update() { + return " and item.item_hidden = 0 and item.item_type = 0 and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_pending_remove = 0 and item.item_blocked = 0 "; } @@ -1124,7 +1130,7 @@ function encode_item_xchan($xchan) { function encode_item_terms($terms,$mirror = false) { $ret = array(); - $allowed_export_terms = array( TERM_UNKNOWN, TERM_HASHTAG, TERM_MENTION, TERM_CATEGORY, TERM_BOOKMARK, TERM_COMMUNITYTAG ); + $allowed_export_terms = array( TERM_UNKNOWN, TERM_HASHTAG, TERM_MENTION, TERM_CATEGORY, TERM_BOOKMARK, TERM_COMMUNITYTAG, TERM_FORUM ); if($mirror) { $allowed_export_terms[] = TERM_PCATEGORY; @@ -1172,7 +1178,7 @@ function decode_item_meta($meta) { * @return string */ function termtype($t) { - $types = array('unknown','hashtag','mention','category','private_category','file','search','thing','bookmark', 'hierarchy', 'communitytag'); + $types = array('unknown','hashtag','mention','category','private_category','file','search','thing','bookmark', 'hierarchy', 'communitytag', 'forum'); return(($types[$t]) ? $types[$t] : 'unknown'); } @@ -1221,6 +1227,9 @@ function decode_tags($t) { case 'communitytag': $tag['ttype'] = TERM_COMMUNITYTAG; break; + case 'forum': + $tag['ttype'] = TERM_FORUM; + break; default: case 'unknown': $tag['ttype'] = TERM_UNKNOWN; @@ -1600,7 +1609,6 @@ function item_store($arr, $allow_exec = false, $deliver = true) { $arr['aid'] = ((x($arr,'aid')) ? intval($arr['aid']) : 0); $arr['mid'] = ((x($arr,'mid')) ? notags(trim($arr['mid'])) : random_string()); $arr['revision'] = ((x($arr,'revision') && intval($arr['revision']) > 0) ? intval($arr['revision']) : 0); -logger('revision: ' . $arr['revision']); $arr['author_xchan'] = ((x($arr,'author_xchan')) ? notags(trim($arr['author_xchan'])) : ''); $arr['owner_xchan'] = ((x($arr,'owner_xchan')) ? notags(trim($arr['owner_xchan'])) : ''); @@ -1999,17 +2007,17 @@ function item_store_update($arr,$allow_exec = false, $deliver = true) { $arr = $translate['item']; } - if((x($arr,'obj')) && is_array($arr['obj'])) { + if((array_key_exists('obj',$arr)) && is_array($arr['obj'])) { activity_sanitise($arr['obj']); $arr['obj'] = json_encode($arr['obj']); } - if((x($arr,'target')) && is_array($arr['target'])) { + if((array_key_exists('target',$arr)) && is_array($arr['target'])) { activity_sanitise($arr['target']); $arr['target'] = json_encode($arr['target']); } - if((x($arr,'attach')) && is_array($arr['attach'])) { + if((array_key_exists('attach',$arr)) && is_array($arr['attach'])) { activity_sanitise($arr['attach']); $arr['attach'] = json_encode($arr['attach']); } @@ -2452,7 +2460,7 @@ function tag_deliver($uid, $item_id) { * Now we've got those out of the way. Let's see if this is a post that's tagged for re-delivery */ - $terms = get_terms_oftype($item['term'],TERM_MENTION); + $terms = array_merge(get_terms_oftype($item['term'],TERM_MENTION),get_terms_oftype($item['term'],TERM_FORUM)); if($terms) logger('tag_deliver: post mentions: ' . print_r($terms,true), LOGGER_DATA); @@ -2487,22 +2495,46 @@ function tag_deliver($uid, $item_id) { $plustagged = false; $matches = array(); - $pattern = '/@\!?\[zrl\=' . preg_quote($term['url'],'/') . '\]' . preg_quote($term['term'],'/') . '\[\/zrl\]/'; + $pattern = '/[\!@]\!?\[zrl\=' . preg_quote($term['url'],'/') . '\]' . preg_quote($term['term'],'/') . '\[\/zrl\]/'; if(preg_match($pattern,$body,$matches)) $tagged = true; - $pattern = '/@\!?\[zrl\=([^\]]*?)\]((?:.(?!\[zrl\=))*?)\+\[\/zrl\]/'; + // original red forum tagging sequence @forumname+ + // standard forum tagging sequence !forumname + + $pluspattern = '/@\!?\[zrl\=([^\]]*?)\]((?:.(?!\[zrl\=))*?)\+\[\/zrl\]/'; + + $forumpattern = '/\!\!?\[zrl\=([^\]]*?)\]((?:.(?!\[zrl\=))*?)\[\/zrl\]/'; - if(preg_match_all($pattern,$body,$matches,PREG_SET_ORDER)) { - $max_forums = get_config('system','max_tagged_forums'); - if(! $max_forums) - $max_forums = 2; - $matched_forums = 0; + $found = false; + + $max_forums = get_config('system','max_tagged_forums'); + if(! $max_forums) + $max_forums = 2; + $matched_forums = 0; + $matches = array(); + + if(preg_match_all($pluspattern,$body,$matches,PREG_SET_ORDER)) { foreach($matches as $match) { $matched_forums ++; if($term['url'] === $match[1] && $term['term'] === $match[2]) { if($matched_forums <= $max_forums) { $plustagged = true; + $found = true; + break; + } + logger('forum ' . $term['term'] . ' exceeded max_tagged_forums - ignoring'); + } + } + } + + 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]) { + if($matched_forums <= $max_forums) { + $plustagged = true; + $found = true; break; } logger('forum ' . $term['term'] . ' exceeded max_tagged_forums - ignoring'); @@ -2601,7 +2633,8 @@ function tgroup_check($uid,$item) { if(! $u) return false; - $terms = get_terms_oftype($item['term'],TERM_MENTION); + + $terms = array_merge(get_terms_oftype($item['term'],TERM_MENTION),get_terms_oftype($item['term'],TERM_FORUM)); if($terms) logger('tgroup_check: post mentions: ' . print_r($terms,true), LOGGER_DATA); @@ -2632,18 +2665,34 @@ function tgroup_check($uid,$item) { $body = preg_replace('/\[share(.*?)\[\/share\]/','',$body); -// $pattern = '/@\!?\[zrl\=' . preg_quote($term['url'],'/') . '\]' . preg_quote($term['term'] . '+','/') . '\[\/zrl\]/'; - $pattern = '/@\!?\[zrl\=([^\]]*?)\]((?:.(?!\[zrl\=))*?)\+\[\/zrl\]/'; + $pluspattern = '/@\!?\[zrl\=([^\]]*?)\]((?:.(?!\[zrl\=))*?)\+\[\/zrl\]/'; + + $forumpattern = '/\!\!?\[zrl\=([^\]]*?)\]((?:.(?!\[zrl\=))*?)\[\/zrl\]/'; + $found = false; + + $max_forums = get_config('system','max_tagged_forums'); + if(! $max_forums) + $max_forums = 2; + $matched_forums = 0; $matches = array(); - if(preg_match_all($pattern,$body,$matches,PREG_SET_ORDER)) { - $max_forums = get_config('system','max_tagged_forums'); - if(! $max_forums) - $max_forums = 2; - $matched_forums = 0; + if(preg_match_all($pluspattern,$body,$matches,PREG_SET_ORDER)) { + foreach($matches as $match) { + $matched_forums ++; + if($term['url'] === $match[1] && $term['term'] === $match[2]) { + if($matched_forums <= $max_forums) { + $found = true; + break; + } + logger('forum ' . $term['term'] . ' exceeded max_tagged_forums - ignoring'); + } + } + } + + 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]) { @@ -4084,7 +4133,7 @@ function items_fetch($arr,$channel = null,$observer_hash = null,$client_mode = C //$third = dba_timer(); - $items = fetch_post_tags($items,true); + $items = fetch_post_tags($items,false); //$fourth = dba_timer(); @@ -4112,6 +4161,8 @@ function webpage_to_namespace($webpage) { $page_type = 'BUILDBLOCK'; elseif($webpage == ITEM_TYPE_PDL) $page_type = 'PDL'; + elseif($webpage == ITEM_TYPE_CARD) + $page_type = 'CARD'; elseif($webpage == ITEM_TYPE_DOC) $page_type = 'docfile'; else diff --git a/include/nav.php b/include/nav.php index 2004f6ae3..89947e270 100644 --- a/include/nav.php +++ b/include/nav.php @@ -6,7 +6,7 @@ require_once('include/security.php'); require_once('include/menu.php'); -function nav() { +function nav($template = 'default') { /** * @@ -62,7 +62,6 @@ EOT; if($banner === false) $banner = get_config('system','sitename'); - //the notifications template is in hdr.tpl App::$page['header'] .= replace_macros(get_markup_template('hdr.tpl'), array( //we could additionally use this to display important system notifications e.g. for updates )); @@ -92,34 +91,77 @@ EOT; $nav['loginmenu'][] = Array('rmagic',t('Remote authentication'),'',t('Click to authenticate to your home hub'),'rmagic_nav_btn'); } + if(local_channel()) { - if(local_channel()) { + + $nav['network'] = array('network', t('Activity'), "", t('Network Activity'),'network_nav_btn'); + $nav['network']['all'] = [ 'network', t('View your network activity'), '','' ]; + $nav['network']['mark'] = array('', t('Mark all activity notifications seen'), '',''); + + $nav['home'] = array('channel/' . $channel['channel_address'], t('Channel Home'), "", t('Channel home'),'home_nav_btn'); + $nav['home']['all'] = [ 'channel/' . $channel['channel_address'], t('View your channel home'), '' , '' ]; + $nav['home']['mark'] = array('', t('Mark all channel notifications seen'), '',''); + + + $nav['intros'] = array('connections/ifpending', t('Connections'), "", t('Connections'),'connections_nav_btn'); + if(is_site_admin()) + $nav['registrations'] = array('admin/accounts', t('Registrations'), "", t('Registrations'),'registrations_nav_btn'); + + + $nav['notifications'] = array('notifications/system', t('Notices'), "", t('Notifications'),'notifications_nav_btn'); + $nav['notifications']['all']=array('notifications/system', t('View all notifications'), "", ""); + $nav['notifications']['mark'] = array('', t('Mark all system notifications seen'), '',''); + + $nav['messages'] = array('mail/combined', t('Mail'), "", t('Private mail'),'mail_nav_btn'); + $nav['messages']['all']=array('mail/combined', t('View your private messages'), "", ""); + $nav['messages']['mark'] = array('', t('Mark all private messages seen'), '',''); + $nav['messages']['inbox'] = array('mail/inbox', t('Inbox'), "", t('Inbox')); + $nav['messages']['outbox']= array('mail/outbox', t('Outbox'), "", t('Outbox')); + $nav['messages']['new'] = array('mail/new', t('New Message'), "", t('New Message')); + + + $nav['all_events'] = array('events', t('Events'), "", t('Event Calendar'),'events_nav_btn'); + $nav['all_events']['all']=array('events', t('View events'), "", ""); + $nav['all_events']['mark'] = array('', t('Mark all events seen'), '',''); + + if(! $_SESSION['delegate']) { + $nav['manage'] = array('manage', t('Channel Manager'), "", t('Manage Your Channels'),'manage_nav_btn'); + } + + $nav['settings'] = array('settings', t('Settings'),"", t('Account/Channel Settings'),'settings_nav_btn'); + + if($chans && count($chans) > 1 && feature_enabled(local_channel(),'nav_channel_select')) $nav['channels'] = $chans; $nav['logout'] = ['logout',t('Logout'), "", t('End this session'),'logout_nav_btn']; // user menu - $nav['usermenu'][] = ['profile/' . $channel['channel_address'], t('View Profile'), ((\App::$nav_sel['active'] == 'Profile') ? 'active' : ''), t('Your profile page'),'profile_nav_btn']; + $nav['usermenu'][] = ['profile/' . $channel['channel_address'], t('View Profile'), ((\App::$nav_sel['name'] == 'Profile') ? 'active' : ''), t('Your profile page'),'profile_nav_btn']; if(feature_enabled(local_channel(),'multi_profiles')) - $nav['usermenu'][] = ['profiles', t('Edit Profiles'), ((\App::$nav_sel['active'] == 'Profiles') ? 'active' : '') , t('Manage/Edit profiles'),'profiles_nav_btn']; + $nav['usermenu'][] = ['profiles', t('Edit Profiles'), ((\App::$nav_sel['name'] == 'Profiles') ? 'active' : '') , t('Manage/Edit profiles'),'profiles_nav_btn']; else - $nav['usermenu'][] = ['profiles/' . $prof[0]['id'], t('Edit Profile'), ((\App::$nav_sel['active'] == 'Profiles') ? 'active' : ''), t('Edit your profile'),'profiles_nav_btn']; + $nav['usermenu'][] = ['profiles/' . $prof[0]['id'], t('Edit Profile'), ((\App::$nav_sel['name'] == 'Profiles') ? 'active' : ''), t('Edit your profile'),'profiles_nav_btn']; } else { if(! get_account_id()) { - $nav['login'] = login(true,'main-login',false,false); - $nav['loginmenu'][] = ['login',t('Login'),'',t('Sign in'),'login_nav_btn']; - App::$page['content'] .= replace_macros(get_markup_template('nav_login.tpl'), - [ - '$nav' => $nav, - 'userinfo' => $userinfo - ] - ); - + if(App::$module === 'channel') { + $nav['login'] = login(true,'main-login',false,false); + $nav['loginmenu'][] = ['login',t('Login'),'',t('Sign in'),'']; + } + else { + $nav['login'] = login(true,'main-login',false,false); + $nav['loginmenu'][] = ['login',t('Login'),'',t('Sign in'),'login_nav_btn']; + App::$page['content'] .= replace_macros(get_markup_template('nav_login.tpl'), + [ + '$nav' => $nav, + 'userinfo' => $userinfo + ] + ); + } } else $nav['alogout'] = ['logout',t('Logout'), "", t('End this session'),'logout_nav_btn']; @@ -169,47 +211,16 @@ EOT; */ if(local_channel()) { - - $nav['network'] = array('network', t('Grid'), "", t('Your grid'),'network_nav_btn'); - $nav['network']['all'] = [ 'network', t('View your network/grid'), '','' ]; - $nav['network']['mark'] = array('', t('Mark all grid notifications seen'), '',''); - - $nav['home'] = array('channel/' . $channel['channel_address'], t('Channel Home'), "", t('Channel home'),'home_nav_btn'); - $nav['home']['all'] = [ 'channel/' . $channel['channel_address'], t('View your channel home'), '' , '' ]; - $nav['home']['mark'] = array('', t('Mark all channel notifications seen'), '',''); - - - $nav['intros'] = array('connections/ifpending', t('Connections'), "", t('Connections'),'connections_nav_btn'); - - - $nav['notifications'] = array('notifications/system', t('Notices'), "", t('Notifications'),'notifications_nav_btn'); - $nav['notifications']['all']=array('notifications/system', t('View all notifications'), "", ""); - $nav['notifications']['mark'] = array('', t('Mark all system notifications seen'), '',''); - - $nav['messages'] = array('mail/combined', t('Mail'), "", t('Private mail'),'mail_nav_btn'); - $nav['messages']['all']=array('mail/combined', t('View your private messages'), "", ""); - $nav['messages']['mark'] = array('', t('Mark all private messages seen'), '',''); - $nav['messages']['inbox'] = array('mail/inbox', t('Inbox'), "", t('Inbox')); - $nav['messages']['outbox']= array('mail/outbox', t('Outbox'), "", t('Outbox')); - $nav['messages']['new'] = array('mail/new', t('New Message'), "", t('New Message')); - - - $nav['all_events'] = array('events', t('Events'), "", t('Event Calendar'),'events_nav_btn'); - $nav['all_events']['all']=array('events', t('View events'), "", ""); - $nav['all_events']['mark'] = array('', t('Mark all events seen'), '',''); - if(! $_SESSION['delegate']) { $nav['manage'] = array('manage', t('Channel Manager'), "", t('Manage Your Channels'),'manage_nav_btn'); } - $nav['settings'] = array('settings', t('Settings'),"", t('Account/Channel Settings'),'settings_nav_btn'); - } /** * Admin page */ - if (is_site_admin()){ + if (is_site_admin()) { $nav['admin'] = array('admin/', t('Admin'), "", t('Site Setup and Configuration'),'admin_nav_btn'); } @@ -221,6 +232,17 @@ EOT; // turned off until somebody discovers this and figures out a good location for it. $powered_by = ''; + if(App::$profile_uid && App::$nav_sel['raw_name']) { + $active_app = q("SELECT app_url FROM app WHERE app_channel = %d AND app_name = '%s' LIMIT 1", + intval(App::$profile_uid), + dbesc(App::$nav_sel['raw_name']) + ); + + if($active_app) { + $url = $active_app[0]['app_url']; + } + } + //app bin if($is_owner) { if(get_pconfig(local_channel(), 'system','initial_import_system_apps') === false) { @@ -246,16 +268,33 @@ EOT; $syslist = Zlib\Apps::app_order(local_channel(),$syslist); foreach($syslist as $app) { - if(\App::$nav_sel['active'] == $app['name']) + if(\App::$nav_sel['name'] == $app['name']) $app['active'] = true; - if($is_owner) + if($is_owner) { $nav_apps[] = Zlib\Apps::app_render($app,'nav'); - elseif(! $is_owner && strpos($app['requires'], 'local_channel') === false) + if(strpos($app['categories'],'navbar_' . $template)) { + $navbar_apps[] = Zlib\Apps::app_render($app,'navbar'); + } + } + elseif(! $is_owner && strpos($app['requires'], 'local_channel') === false) { $nav_apps[] = Zlib\Apps::app_render($app,'nav'); + if(strpos($app['categories'],'navbar_' . $template)) { + $navbar_apps[] = Zlib\Apps::app_render($app,'navbar'); + } + } } - $tpl = get_markup_template('nav.tpl'); + $c = theme_include('navbar_' . purify_filename($template) . '.css'); + $tpl = get_markup_template('navbar_' . purify_filename($template) . '.tpl'); + + if($c && $tpl) { + head_add_css('navbar_' . $template . '.css'); + } + + if(! $tpl) { + $tpl = get_markup_template('navbar_default.tpl'); + } App::$page['nav'] .= replace_macros($tpl, array( '$baseurl' => z_root(), @@ -267,15 +306,19 @@ EOT; '$userinfo' => $x['usermenu'], '$localuser' => local_channel(), '$is_owner' => $is_owner, - '$sel' => App::$nav_sel, + '$sel' => App::$nav_sel, '$powered_by' => $powered_by, '$help' => t('@name, #tag, ?doc, content'), '$pleasewait' => t('Please wait...'), '$nav_apps' => $nav_apps, + '$navbar_apps' => $navbar_apps, + '$channel_menu' => get_config('system','channel_menu'), + '$channel_thumb' => ((App::$profile) ? App::$profile['thumb'] : ''), '$channel_apps' => $channel_apps, '$addapps' => t('Add Apps'), '$orderapps' => t('Arrange Apps'), - '$sysapps_toggle' => t('Toggle System Apps') + '$sysapps_toggle' => t('Toggle System Apps'), + '$url' => (($url) ? $url : App::$cmd) )); if(x($_SESSION, 'reload_avatar') && $observer) { @@ -298,7 +341,10 @@ EOT; * */ function nav_set_selected($item){ - App::$nav_sel['active'] = $item; + App::$nav_sel['raw_name'] = $item; + $item = ['name' => $item]; + Zlib\Apps::translate_system_apps($item); + App::$nav_sel['name'] = $item['name']; } @@ -428,6 +474,18 @@ function channel_apps($is_owner = false, $nickname = null) { ]; } + if($p['view_pages'] && feature_enabled($uid,'cards')) { + $tabs[] = [ + 'label' => t('Cards'), + 'url' => z_root() . '/cards/' . $nickname , + 'sel' => ((argv(0) == 'cards') ? 'active' : ''), + 'title' => t('View Cards'), + 'id' => 'cards-tab', + 'icon' => 'list' + ]; + } + + if($has_webpages && feature_enabled($uid,'webpages')) { $tabs[] = [ 'label' => t('Webpages'), @@ -461,7 +519,7 @@ function channel_apps($is_owner = false, $nickname = null) { [ '$tabs' => $arr['tabs'], '$name' => App::$profile['channel_name'], - '$thumb' => App::$profile['thumb'] + '$thumb' => App::$profile['thumb'], ] ); } diff --git a/include/network.php b/include/network.php index 5f814ef32..7e2dbf4cf 100644 --- a/include/network.php +++ b/include/network.php @@ -411,7 +411,7 @@ function http_status($val, $msg = '') { if ($val >= 200 && $val < 300) $msg = (($msg) ? $msg : 'OK'); - logger('' . $val . ' ' . $msg); + logger(\App::$query_string . ':' . $val . ' ' . $msg); header($_SERVER['SERVER_PROTOCOL'] . ' ' . $val . ' ' . $msg); } @@ -1137,13 +1137,13 @@ function discover_by_url($url, $arr = null) { return true; } -function discover_by_webbie($webbie) { +function discover_by_webbie($webbie,$protocol = '') { $result = []; $network = null; - $webbie = strtolower($webbie); +// $webbie = strtolower($webbie); $x = webfinger_rfc7033($webbie,true); if($x && array_key_exists('links',$x) && $x['links']) { @@ -1153,7 +1153,7 @@ function discover_by_webbie($webbie) { // If we discover zot - don't search further; grab the info and get out of // here. - if($link['rel'] === PROTOCOL_ZOT) { + if($link['rel'] === PROTOCOL_ZOT && ((! $protocol) || (strtolower($protocol) === 'zot'))) { logger('discover_by_webbie: zot found for ' . $webbie, LOGGER_DEBUG); if(array_key_exists('zot',$x) && $x['zot']['success']) { $i = import_xchan($x['zot']); @@ -1174,7 +1174,7 @@ function discover_by_webbie($webbie) { logger('webfinger: ' . print_r($x,true), LOGGER_DATA, LOG_INFO); - $arr = array('address' => $webbie, 'success' => false, 'webfinger' => $x); + $arr = array('address' => $webbie, 'protocol' => $protocol, 'success' => false, 'webfinger' => $x); call_hooks('discover_channel_webfinger', $arr); if($arr['success']) return true; @@ -1291,7 +1291,7 @@ function fetch_xrd_links($url) { return array(); $h = parse_xml_string($xml); - if(! $h) + if($h === false) return array(); $arr = convert_xml_element_to_array($h); @@ -1652,9 +1652,17 @@ function check_channelallowed($hash) { } function deliverable_singleton($channel_id,$xchan) { + + if(array_key_exists('xchan_hash',$xchan)) + $xchan_hash = $xchan['xchan_hash']; + elseif(array_key_exists('hubloc_hash',$xchan)) + $xchan_hash = $xchan['hubloc_hash']; + else + return true; + $r = q("select abook_instance from abook where abook_channel = %d and abook_xchan = '%s' limit 1", intval($channel_id), - dbesc($xchan['xchan_hash']) + dbesc($xchan_hash) ); if($r) { if(! $r[0]['abook_instance']) @@ -1689,18 +1697,19 @@ function get_repository_version($branch = 'master') { function network_to_name($s) { $nets = array( - NETWORK_DFRN => t('Friendica'), - NETWORK_FRND => t('Friendica'), - NETWORK_OSTATUS => t('OStatus'), - NETWORK_GNUSOCIAL => t('GNU-Social'), - NETWORK_FEED => t('RSS/Atom'), - NETWORK_MAIL => t('Email'), - NETWORK_DIASPORA => t('Diaspora'), - NETWORK_FACEBOOK => t('Facebook'), - NETWORK_ZOT => t('Zot'), - NETWORK_LINKEDIN => t('LinkedIn'), - NETWORK_XMPP => t('XMPP/IM'), - NETWORK_MYSPACE => t('MySpace'), + NETWORK_DFRN => t('Friendica'), + NETWORK_FRND => t('Friendica'), + NETWORK_OSTATUS => t('OStatus'), + NETWORK_GNUSOCIAL => t('GNU-Social'), + NETWORK_FEED => t('RSS/Atom'), + NETWORK_ACTIVITYPUB => t('ActivityPub'), + NETWORK_MAIL => t('Email'), + NETWORK_DIASPORA => t('Diaspora'), + NETWORK_FACEBOOK => t('Facebook'), + NETWORK_ZOT => t('Zot'), + NETWORK_LINKEDIN => t('LinkedIn'), + NETWORK_XMPP => t('XMPP/IM'), + NETWORK_MYSPACE => t('MySpace'), ); call_hooks('network_to_name', $nets); @@ -1934,4 +1943,35 @@ function getBestSupportedMimeType($mimeTypes = null, $acceptedTypes = false) { } // no mime-type found return null; +} + + +function jsonld_document_loader($url) { + + // perform caching for jsonld normaliser + + require_once('library/jsonld/jsonld.php'); + + $cachepath = 'store/[data]/ldcache'; + if(! is_dir($cachepath)) + os_mkdir($cachepath,STORAGE_DEFAULT_PERMISSIONS,true); + + $filename = $cachepath . '/' . urlencode($url); + if(file_exists($filename) && filemtime($filename) > time() - (12 * 60 * 60)) { + return json_decode(file_get_contents($filename)); + } + + $r = jsonld_default_document_loader($url); + if($r) { + file_put_contents($filename,json_encode($r)); + return $r; + } + + logger('not found'); + if(file_exists($filename)) { + return json_decode(file_get_contents($filename)); + } + + return []; + }
\ No newline at end of file diff --git a/include/oembed.php b/include/oembed.php index 460e0244e..c2bf0a0ed 100755 --- a/include/oembed.php +++ b/include/oembed.php @@ -225,6 +225,17 @@ function oembed_fetch_url($embedurl){ if($j['html']) { $orig = $j['html']; $allow_position = (($is_matrix) ? true : false); + + // some sites wrap their entire embed in an iframe + // which we will purify away and which we provide anyway. + // So if we see this, grab the frame src url and use that + // as the embed content - which will still need to be purified. + + if(preg_match('#\<iframe(.*?)src\=[\'\"](.*?)[\'\"]#',$j['html'],$matches)) { + $x = z_fetch_url($matches[2]); + $j['html'] = $x['body']; + } + $j['html'] = purify_html($j['html'],$allow_position); if($j['html'] != $orig) { logger('oembed html was purified. original: ' . $orig . ' purified: ' . $j['html'], LOGGER_DEBUG, LOG_INFO); diff --git a/include/perm_upgrade.php b/include/perm_upgrade.php index 5be1ffbb2..9eb1efba2 100644 --- a/include/perm_upgrade.php +++ b/include/perm_upgrade.php @@ -135,6 +135,9 @@ function translate_abook_perms_outbound(&$abook) { $my_perms = 0; $their_perms = 0; + if(! $abook) + return; + if(array_key_exists('abconfig',$abook) && is_array($abook['abconfig']) && $abook['abconfig']) { foreach($abook['abconfig'] as $p) { if($p['cat'] === 'their_perms') { diff --git a/include/photo/photo_driver.php b/include/photo/photo_driver.php index f47a9c878..5eb1f9113 100644 --- a/include/photo/photo_driver.php +++ b/include/photo/photo_driver.php @@ -446,7 +446,7 @@ abstract class photo_driver { */ function guess_image_type($filename, $headers = '') { - logger('Photo: guess_image_type: '.$filename . ($headers?' from curl headers':''), LOGGER_DEBUG); +// logger('Photo: guess_image_type: '.$filename . ($headers?' from curl headers':''), LOGGER_DEBUG); $type = null; if ($headers) { @@ -513,11 +513,32 @@ function guess_image_type($filename, $headers = '') { } } - logger('Photo: guess_image_type: type = ' . $type, LOGGER_DEBUG); + logger('Photo: guess_image_type: filename = ' . $filename . ' type = ' . $type, LOGGER_DEBUG); return $type; } + +function delete_thing_photo($url,$ob_hash) { + + $hash = basename($url); + $hash = substr($hash,0,strpos($hash,'-')); + + // hashes should be 32 bytes. + + if((! $ob_hash) || (strlen($hash) < 16)) + return; + + $r = q("delete from photo where xchan = '%s' and photo_usage = %d and resource_id = '%s'", + dbesc($ob_hash), + intval(PHOTO_THING), + dbesc($hash) + ); + +} + + + function import_xchan_photo($photo,$xchan,$thing = false) { $flags = (($thing) ? PHOTO_THING : PHOTO_XCHAN); @@ -637,6 +658,37 @@ function import_xchan_photo($photo,$xchan,$thing = false) { } +function import_channel_photo_from_url($photo,$aid,$uid) { + + if($photo) { + $filename = basename($photo); + + $result = z_fetch_url($photo,true); + + if($result['success']) { + $img_str = $result['body']; + $type = guess_image_type($photo, $result['header']); + + $h = explode("\n",$result['header']); + if($h) { + foreach($h as $hl) { + if(stristr($hl,'content-type:')) { + if(! stristr($hl,'image/')) { + $photo_failure = true; + } + } + } + } + } + } + else { + $photo_failure = true; + } + + import_channel_photo($img_str,$type,$aid,$uid); + + return $type; +} function import_channel_photo($photo,$type,$aid,$uid) { diff --git a/include/photos.php b/include/photos.php index f5d5fdb48..5de68f162 100644 --- a/include/photos.php +++ b/include/photos.php @@ -66,7 +66,19 @@ function photo_upload($channel, $observer, $args) { $os_storage = 0; if($args['os_syspath'] && $args['getimagesize']) { - $imagedata = @file_get_contents($args['os_syspath']); + if($args['getimagesize'][0] > 1600 || $args['getimagesize'][1] > 1600) { + $imagick_path = get_config('system','imagick_convert_path'); + if($imagick_path && @file_exists($imagick_path)) { + $tmp_name = $args['os_syspath'] . '-001'; + $newsize = photo_calculate_1600_scale($args['getimagesize']); + exec($imagick_path . ' ' . $args['os_syspath'] . ' -resize ' . $newsize . '^ ' . $tmp_name); + $imagedata = @file_get_contents($tmp_name); + @unlink($tmp_name); + } + } + else { + $imagedata = @file_get_contents($args['os_syspath']); + } $filename = $args['filename']; $filesize = strlen($imagedata); // this is going to be deleted if it exists @@ -122,7 +134,6 @@ function photo_upload($channel, $observer, $args) { } logger('photo_upload: loading the contents of ' . $src , LOGGER_DEBUG); - $imagedata = @file_get_contents($src); } @@ -428,6 +439,70 @@ function photo_upload($channel, $observer, $args) { return $ret; } + +function photo_calculate_1600_scale($arr) { + + $max = 1600; + $width = $arr[0]; + $height = $arr[1]; + + $dest_width = $dest_height = 0; + + if((! $width)|| (! $height)) + return FALSE; + + if($width > $max && $height > $max) { + + // very tall image (greater than 16:9) + // constrain the width - let the height float. + + if((($height * 9) / 16) > $width) { + $dest_width = $max; + $dest_height = intval(( $height * $max ) / $width); + } + + // else constrain both dimensions + + elseif($width > $height) { + $dest_width = $max; + $dest_height = intval(( $height * $max ) / $width); + } + else { + $dest_width = intval(( $width * $max ) / $height); + $dest_height = $max; + } + } + else { + if( $width > $max ) { + $dest_width = $max; + $dest_height = intval(( $height * $max ) / $width); + } + else { + if( $height > $max ) { + // very tall image (greater than 16:9) + // but width is OK - don't do anything + + if((($height * 9) / 16) > $width) { + $dest_width = $width; + $dest_height = $height; + } + else { + $dest_width = intval(( $width * $max ) / $height); + $dest_height = $max; + } + } + else { + $dest_width = $width; + $dest_height = $height; + } + } + } + + return $dest_width . 'x' . $dest_height; + +} + + /** * @brief Returns a list with all photo albums observer is allowed to see. * @@ -595,7 +670,7 @@ function photos_album_exists($channel_id, $observer_hash, $album) { // partial backward compatibility with Hubzilla < 2.4 when we used the filename only // (ambiguous which would get chosen if you had two albums of the same name in different directories) - if(!$r) { + if(!$r && ctype_xdigit($album)) { $r = q("SELECT folder, hash, is_dir, filename, os_path, display_path FROM attach WHERE filename = '%s' AND is_dir = 1 AND uid = %d $sql_extra limit 1", dbesc(hex2bin($album)), intval($channel_id) diff --git a/include/security.php b/include/security.php index 6e7b3dbb2..450cc4f69 100644 --- a/include/security.php +++ b/include/security.php @@ -114,9 +114,9 @@ function atoken_xchan($atoken) { 'atoken_id' => $atoken['atoken_id'], 'xchan_hash' => substr($c['channel_hash'],0,16) . '.' . $atoken['atoken_name'], 'xchan_name' => $atoken['atoken_name'], - 'xchan_addr' => t('guest:') . $atoken['atoken_name'] . '@' . \App::get_hostname(), + 'xchan_addr' => 'guest:' . $atoken['atoken_name'] . '@' . \App::get_hostname(), 'xchan_network' => 'unknown', - 'xchan_url' => z_root(), + 'xchan_url' => z_root() . '/guest/' . substr($c['channel_hash'],0,16) . '.' . $atoken['atoken_name'], 'xchan_hidden' => 1, 'xchan_photo_mimetype' => 'image/jpeg', 'xchan_photo_l' => get_default_profile_photo(300), @@ -640,7 +640,7 @@ function stream_perms_xchans($perms = NULL ) { if(local_channel()) $ret[] = get_observer_hash(); - $x = q("select uid from pconfig where cat = 'perm_limits' and k = 'view_stream' "); + $x = q("select uid, v from pconfig where cat = 'perm_limits' and k = 'view_stream' "); if($x) { $y = []; foreach($x as $xv) { @@ -650,6 +650,7 @@ function stream_perms_xchans($perms = NULL ) { } if($y) { $ids = ids_to_querystr($y,'uid'); + $r = q("select channel_hash from channel where channel_id in ( $ids ) and ( channel_pageflags & %d ) = 0 and channel_system = 0 and channel_removed = 0 ", intval(PAGE_ADULT|PAGE_CENSORED) ); diff --git a/include/taxonomy.php b/include/taxonomy.php index 46d661581..23acaa24d 100644 --- a/include/taxonomy.php +++ b/include/taxonomy.php @@ -134,6 +134,8 @@ function format_term_for_display($term) { $s = ''; if(($term['ttype'] == TERM_HASHTAG) || ($term['ttype'] == TERM_COMMUNITYTAG)) $s .= '#'; + elseif($term['ttype'] == TERM_FORUM) + $s .= '!'; elseif($term['ttype'] == TERM_MENTION) $s .= '@'; else @@ -199,6 +201,62 @@ function tagadelic($uid, $count = 0, $authors = '', $owner = '', $flags = 0, $re } + + +function card_tagadelic($uid, $count = 0, $authors = '', $owner = '', $flags = 0, $restrict = 0, $type = TERM_CATEGORY) { + + require_once('include/security.php'); + + if(! perm_is_allowed($uid,get_observer_hash(),'view_pages')) + return array(); + + + $item_normal = item_normal(); + $sql_options = item_permissions_sql($uid); + $count = intval($count); + + if($flags) { + if($flags === 'wall') + $sql_options .= " and item_wall = 1 "; + } + + if($authors) { + if(! is_array($authors)) + $authors = array($authors); + + stringify_array_elms($authors,true); + $sql_options .= " and author_xchan in (" . implode(',',$authors) . ") "; + } + + if($owner) { + $sql_options .= " and owner_xchan = '" . dbesc($owner) . "' "; + } + + + // Fetch tags + $r = q("select term, count(term) as total from term left join item on term.oid = item.id + where term.uid = %d and term.ttype = %d + and otype = %d and item_type = %d and item_private = 0 + $sql_options $item_normal + group by term order by total desc %s", + intval($uid), + intval($type), + intval(TERM_OBJ_POST), + intval($restrict), + ((intval($count)) ? "limit $count" : '') + ); + + if(! $r) + return array(); + + return Zotlabs\Text\Tagadelic::calc($r); + +} + + + + + function dir_tagadelic($count = 0) { $count = intval($count); @@ -316,6 +374,26 @@ function catblock($uid,$count = 0,$authors = '',$owner = '', $flags = 0,$restric return $o; } +function card_catblock($uid,$count = 0,$authors = '',$owner = '', $flags = 0,$restrict = 0,$type = TERM_CATEGORY) { + $o = ''; + + $r = card_tagadelic($uid,$count,$authors,$owner,$flags,$restrict,$type); + + if($r) { + $c = q("select channel_address from channel where channel_id = %d limit 1", + intval($uid) + ); + + $o = '<div class="tagblock widget"><h3>' . t('Categories') . '</h3><div class="tags" align="center">'; + foreach($r as $rr) { + $o .= '<a href="cards/' . $c[0]['channel_address']. '?f=&cat=' . urlencode($rr[0]).'" class="tag'.$rr[2].'">'.$rr[0].'</a> ' . "\r\n"; + } + $o .= '</div></div>'; + } + + return $o; +} + function dir_tagblock($link,$r) { $o = ''; diff --git a/include/text.php b/include/text.php index 5af4f1b67..d81b59d75 100644 --- a/include/text.php +++ b/include/text.php @@ -651,7 +651,7 @@ function logger($msg, $level = LOGGER_NORMAL, $priority = LOG_INFO) { $stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); $where = basename($stack[0]['file']) . ':' . $stack[0]['line'] . ':' . $stack[1]['function'] . ': '; - $s = datetime_convert() . ':' . log_priority_str($priority) . ':' . session_id() . ':' . $where . $msg . PHP_EOL; + $s = datetime_convert('UTC','UTC', 'now', ATOM_TIME) . ':' . log_priority_str($priority) . ':' . session_id() . ':' . $where . $msg . PHP_EOL; $pluginfo = array('filename' => $logfile, 'loglevel' => $level, 'message' => $s,'priority' => $priority, 'logged' => false); if(! (App::$module == 'setup')) @@ -679,7 +679,7 @@ function btlogger($msg, $level = LOGGER_NORMAL, $priority = LOG_INFO) { if(file_exists(BTLOGGER_DEBUG_FILE) && is_writable(BTLOGGER_DEBUG_FILE)) { $stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); $where = basename($stack[0]['file']) . ':' . $stack[0]['line'] . ':' . $stack[1]['function'] . ': '; - $s = datetime_convert() . ':' . log_priority_str($priority) . ':' . session_id() . ':' . $where . $msg . PHP_EOL; + $s = datetime_convert('UTC','UTC', 'now', ATOM_TIME) . ':' . log_priority_str($priority) . ':' . session_id() . ':' . $where . $msg . PHP_EOL; @file_put_contents(BTLOGGER_DEBUG_FILE, $s, FILE_APPEND); } @@ -750,7 +750,7 @@ function dlogger($msg, $level = 0) { $where = basename($stack[0]['file']) . ':' . $stack[0]['line'] . ':' . $stack[1]['function'] . ': '; - @file_put_contents($logfile, datetime_convert() . ':' . session_id() . ' ' . $where . $msg . PHP_EOL, FILE_APPEND); + @file_put_contents($logfile, datetime_convert('UTC','UTC', 'now', ATOM_TIME) . ':' . session_id() . ' ' . $where . $msg . PHP_EOL, FILE_APPEND); } @@ -761,9 +761,17 @@ function profiler($t1,$t2,$label) { function activity_match($haystack,$needle) { - if(($haystack === $needle) || ((basename($needle) === $haystack) && strstr($needle,NAMESPACE_ACTIVITY_SCHEMA))) - return true; + if(! is_array($needle)) + $needle = [ $needle ]; + + if($needle) { + foreach($needle as $n) { + if(($haystack === $n) || (strtolower(basename($n)) === strtolower(basename($haystack)))) { + return true; + } + } + } return false; } @@ -794,7 +802,7 @@ function get_tags($s) { // match any double quoted tags - if(preg_match_all('/([@#]\"\;.*?\"\;)/',$s,$match)) { + if(preg_match_all('/([@#!]\"\;.*?\"\;)/',$s,$match)) { foreach($match[1] as $mtch) { $ret[] = $mtch; } @@ -823,7 +831,7 @@ function get_tags($s) { // Otherwise pull out single word tags. These can be @nickname, @first_last // and #hash tags. - if(preg_match_all('/(?<![a-zA-Z0-9=\/\?\;])([@#][^ \x0D\x0A,;:?\[]+)/',$s,$match)) { + if(preg_match_all('/(?<![a-zA-Z0-9=\/\?\;])([@#\!][^ \x0D\x0A,;:?\[]+)/',$s,$match)) { foreach($match[1] as $mtch) { if(substr($mtch,-1,1) === '.') $mtch = substr($mtch,0,-1); @@ -987,7 +995,7 @@ function chanlink_cid($d) { function magiclink_url($observer,$myaddr,$url) { return (($observer) - ? z_root() . '/magic?f=&dest=' . $url . '&addr=' . $myaddr + ? z_root() . '/magic?f=&owa=1&dest=' . $url . '&addr=' . $myaddr : $url ); } @@ -1389,7 +1397,7 @@ function theme_attachments(&$item) { if(is_foreigner($item['author_xchan'])) $url = $r['href']; else - $url = z_root() . '/magic?f=&hash=' . $item['author_xchan'] . '&dest=' . $r['href'] . '/' . $r['revision']; + $url = z_root() . '/magic?f=&owa=1&hash=' . $item['author_xchan'] . '&dest=' . $r['href'] . '/' . $r['revision']; //$s .= '<a href="' . $url . '" title="' . $title . '" class="attachlink" >' . $icon . '</a>'; $attaches[] = array('label' => $label, 'url' => $url, 'icon' => $icon, 'title' => $title); @@ -1786,28 +1794,28 @@ function layout_select($channel_id, $current = '') { } -function mimetype_select($channel_id, $current = 'text/bbcode') { +function mimetype_select($channel_id, $current = 'text/bbcode', $choices = null, $element = 'mimetype') { - $x = array( - 'text/bbcode', - 'text/html', - 'text/markdown', - 'text/plain', - 'application/x-pdl' - ); + $x = (($choices) ? $choices : [ + 'text/bbcode' => t('BBcode'), + 'text/html' => t('HTML'), + 'text/markdown' => t('Markdown'), + 'text/plain' => t('Text'), + 'application/x-pdl' => t('Comanche Layout') + ]); if((App::$is_sys) || (channel_codeallowed($channel_id) && $channel_id == local_channel())){ - $x[] = 'application/x-php'; + $x['application/x-php'] = t('PHP'); } - foreach($x as $y) { + foreach($x as $y => $z) { $selected = (($y == $current) ? ' selected="selected" ' : ''); - $options .= '<option name="' . $y . '"' . $selected . '>' . $y . '</option>'; + $options .= '<option value="' . $y . '"' . $selected . '>' . $z . '</option>'; } $o = replace_macros(get_markup_template('field_select_raw.tpl'), array( - '$field' => array('mimetype', t('Page content type'), $selected, '', $options) + '$field' => array( $element, t('Page content type'), $selected, '', $options) )); return $o; @@ -1984,14 +1992,14 @@ function is_a_date_arg($s) { } function legal_webbie($s) { - if(! strlen($s)) + if(! $s) return ''; - // WARNING: This regex will not work in a federated environment. + // WARNING: This regex may not work in a federated environment. // You will probably want something like // preg_replace('/([^a-z0-9\_])/','',strtolower($s)); - $r = preg_replace('/([^a-z0-9\-\_\.])/','',strtolower($s)); + $r = preg_replace('/([^a-z0-9\-\_])/','',strtolower($s)); $x = [ 'input' => $s, 'output' => $r ]; call_hooks('legal_webbie',$x); @@ -2003,7 +2011,7 @@ function legal_webbie_text() { // WARNING: This will not work in a federated environment. - $s = t('a-z, 0-9, -, _, and . only'); + $s = t('a-z, 0-9, -, and _ only'); $x = [ 'text' => $s ]; call_hooks('legal_webbie_text',$x); @@ -2383,8 +2391,9 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d $r = null; $match = array(); - $termtype = ((strpos($tag,'#') === 0) ? TERM_HASHTAG : TERM_UNKNOWN); - $termtype = ((strpos($tag,'@') === 0) ? TERM_MENTION : $termtype); + $termtype = ((strpos($tag,'#') === 0) ? TERM_HASHTAG : TERM_UNKNOWN); + $termtype = ((strpos($tag,'@') === 0) ? TERM_MENTION : $termtype); + $termtype = ((strpos($tag,'!') === 0) ? TERM_FORUM : $termtype); $termtype = ((strpos($tag,'#^[') === 0) ? TERM_BOOKMARK : $termtype); //is it a hash tag? @@ -2401,16 +2410,9 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d //...do nothing return $replaced; } - if($tag == '#getzot') { - $basetag = 'getzot'; - $url = 'http://hubzilla.org'; - $newtag = '#[zrl=' . $url . ']' . $basetag . '[/zrl]'; - $body = str_replace($tag,$newtag,$body); - $replaced = true; - } if(! $replaced) { - //base tag has the tags name only + // base tag has the tags name only if((substr($tag,0,7) === '#"') && (substr($tag,-6,6) === '"')) { $basetag = substr($tag,7); @@ -2448,10 +2450,16 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d //is it a person tag? - if(strpos($tag,'@') === 0) { + $grouptag = false; + + if(strpos($tag,'!') === 0) { + $grouptag = true; + } + + if(strpos($tag,'@') === 0 || $grouptag) { // The @! tag will alter permissions - $exclusive = ((strpos($tag,'!') === 1 && (! $diaspora)) ? true : false); + $exclusive = (((! $grouptag) && (strpos($tag,'!') === 1) && (! $diaspora)) ? true : false); //is it already replaced? if(strpos($tag,'[zrl=')) @@ -2492,7 +2500,7 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d if(($t2) && (! $diaspora)) { //get the id - $tagcid = substr($newname,$t2 + 1); + $tagcid = urldecode(substr($newname,$t2 + 1)); if(strrpos($tagcid,' ')) $tagcid = substr($tagcid,0,strrpos($tagcid,' ')); @@ -2623,8 +2631,15 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d //create profile link $profile = str_replace(',','%2c',$profile); $url = $profile; - $newtag = '@' . (($exclusive) ? '!' : '') . '[zrl=' . $profile . ']' . $newname . (($forum && ! $trailing_plus_name) ? '+' : '') . '[/zrl]'; - $body = str_replace('@' . (($exclusive) ? '!' : '') . $name, $newtag, $body); + if($grouptag) { + $newtag = '!' . '[zrl=' . $profile . ']' . $newname . '[/zrl]'; + $body = str_replace('!' . $name, $newtag, $body); + } + else { + $newtag = '@' . (($exclusive) ? '!' : '') . '[zrl=' . $profile . ']' . $newname . (($forum && ! $trailing_plus_name) ? '+' : '') . '[/zrl]'; + $body = str_replace('@' . (($exclusive) ? '!' : '') . $name, $newtag, $body); + } + //append tag to str_tags if(! stristr($str_tags,$newtag)) { if(strlen($str_tags)) @@ -2831,7 +2846,7 @@ function item_url_replace($channel,&$item,$old,$new,$oldnick = '') { */ function sanitise_acl(&$item) { if (strlen($item)) - $item = '<' . notags(trim($item)) . '>'; + $item = '<' . notags(trim(urldecode($item))) . '>'; else unset($item); } @@ -2973,6 +2988,9 @@ function flatten_array_recursive($arr) { * @param string $s Text to highlight * @param string $lang Which language should be highlighted * @return string + * Important: The returned text has the text pattern 'http' translated to '%eY9-!' which should be converted back + * after further processing. This was done to prevent oembed links from occurring inside code blocks. + * See include/bbcode.php */ function text_highlight($s, $lang) { @@ -2993,6 +3011,8 @@ function text_highlight($s, $lang) { else $o = $s; + $o = str_replace('http','%eY9-!',$o); + return('<code>' . $o . '</code>'); } @@ -3136,3 +3156,9 @@ function ellipsify($s,$maxlen) { return mb_substr($s,0,$maxlen / 2) . '...' . mb_substr($s,mb_strlen($s) - ($maxlen / 2)); } + +function purify_filename($s) { + if(($s[0] === '.') || strpos($s,'/') !== false) + return ''; + return $s; +} diff --git a/include/xchan.php b/include/xchan.php index 12eb674fa..8c9c09c72 100644 --- a/include/xchan.php +++ b/include/xchan.php @@ -137,3 +137,83 @@ function xchan_fetch($arr) { } +function xchan_keychange_table($table,$column,$oldxchan,$newxchan) { + $r = q("update $table set $column = '%s' where $column = '%s'", + dbesc($newxchan['xchan_hash']), + dbesc($oldxchan['xchan_hash']) + ); + return $r; +} + +function xchan_keychange_acl($table,$column,$oldxchan,$newxchan) { + + $allow = (($table === 'channel') ? 'channel_allow_cid' : 'allow_cid'); + $deny = (($table === 'channel') ? 'channel_deny_cid' : 'deny_cid'); + + + $r = q("select $column, $allow, $deny from $table where ($allow like '%s' or $deny like '%s') ", + dbesc('<' . $oldxchan['xchan_hash'] . '>'), + dbesc('<' . $oldxchan['xchan_hash'] . '>') + ); + + if($r) { + foreach($r as $rv) { + $z = q("update $table set $allow = '%s', $deny = '%s' where $column = %d", + dbesc(str_replace('<' . $oldxchan['xchan_hash'] . '>', '<' . $newxchan['xchan_hash'] . '>', + $rv[$allow])), + dbesc(str_replace('<' . $oldxchan['xchan_hash'] . '>', '<' . $newxchan['xchan_hash'] . '>', + $rv[$deny])), + intval($rv[$column]) + ); + } + } + return $z; +} + + +function xchan_change_key($oldx,$newx,$data) { + + $tables = [ + 'abook' => 'abook_xchan', + 'abconfig' => 'xchan', + 'group_member' => 'xchan', + 'chat' => 'chat_xchan', + 'chatpresence' => 'cp_xchan', + 'event' => 'event_xchan', + 'item' => 'owner_xchan', + 'item' => 'author_xchan', + 'item' => 'source_xchan', + 'mail' => 'from_xchan', + 'mail' => 'to_xchan', + 'shares' => 'share_xchan', + 'source' => 'src_channel_xchan', + 'source' => 'src_xchan', + 'xchat' => 'xchat_xchan', + 'xconfig' => 'xchan', + 'xign' => 'xchan', + 'xlink' => 'xlink_xchan', + 'xprof' => 'xprof_hash', + 'xtag' => 'xtag_hash' + ]; + + + $acls = [ + 'channel' => 'channel_id', + 'attach' => 'id', + 'chatroom' => 'cr_id', + 'event' => 'id', + 'item' => 'id', + 'menu_item' => 'mitem_id', + 'obj' => 'obj_id', + 'photo' => 'id' + ]; + + + foreach($tables as $k => $v) { + xchan_keychange_table($k,$v,$oldx,$newx); + } + + foreach($acls as $k => $v) { + xchan_keychange_acl($k,$v,$oldx,$newx); + } +}
\ No newline at end of file diff --git a/include/zid.php b/include/zid.php index ee43fd7c8..ce9f70385 100644 --- a/include/zid.php +++ b/include/zid.php @@ -81,6 +81,10 @@ function zid($s,$address = '') { } +function strip_query_param($s,$param) { + return preg_replace('/[\?&]' . $param . '=(.*?)(&|$)/ism','$2',$s); +} + function strip_zids($s) { return preg_replace('/[\?&]zid=(.*?)(&|$)/ism','$2',$s); } @@ -230,3 +234,76 @@ function red_zrlify_img_callback($matches) { return $matches[0]; } +function owt_init($token) { + + \Zotlabs\Zot\Verify::purge('owt','3 MINUTE'); + + $ob_hash = \Zotlabs\Zot\Verify::get_meta('owt',0,$token); + + if($ob_hash === false) { + return; + } + + $r = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash + where hubloc_addr = '%s' order by hubloc_id desc", + dbesc($ob_hash) + ); + + if(! $r) { + // finger them if they can't be found. + $j = \Zotlabs\Zot\Finger::run($ob_hash, null); + if ($j['success']) { + import_xchan($j); + $r = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash + where hubloc_addr = '%s' order by hubloc_id desc", + dbesc($ob_hash) + ); + } + } + if(! $r) { + logger('owt: unable to finger ' . $ob_hash); + return; + } + $hubloc = $r[0]; + + $_SESSION['authenticated'] = 1; + + $delegate_success = false; + if($_REQUEST['delegate']) { + $r = q("select * from channel left join xchan on channel_hash = xchan_hash where xchan_addr = '%s' limit 1", + dbesc($_REQUEST['delegate']) + ); + if ($r && intval($r[0]['channel_id'])) { + $allowed = perm_is_allowed($r[0]['channel_id'],$hubloc['xchan_hash'],'delegate'); + if($allowed) { + $_SESSION['delegate_channel'] = $r[0]['channel_id']; + $_SESSION['delegate'] = $hubloc['xchan_hash']; + $_SESSION['account_id'] = intval($r[0]['channel_account_id']); + require_once('include/security.php'); + // this will set the local_channel authentication in the session + change_channel($r[0]['channel_id']); + $delegate_success = true; + } + } + } + + if (! $delegate_success) { + // normal visitor (remote_channel) login session credentials + $_SESSION['visitor_id'] = $hubloc['xchan_hash']; + $_SESSION['my_url'] = $hubloc['xchan_url']; + $_SESSION['my_address'] = $hubloc['hubloc_addr']; + $_SESSION['remote_hub'] = $hubloc['hubloc_url']; + $_SESSION['DNT'] = 1; + } + + $arr = array('xchan' => $hubloc, 'url' => \App::$query_string, 'session' => $_SESSION); + call_hooks('magic_auth_success',$arr); + \App::set_observer($hubloc); + require_once('include/security.php'); + \App::set_groups(init_groups_visitor($_SESSION['visitor_id'])); + if(! get_config('system','hide_owa_greeting')) + info(sprintf( t('OpenWebAuth: %1$s welcomes %2$s'),\App::get_hostname(), $hubloc['xchan_name'])); + logger('OpenWebAuth: auth success from ' . $hubloc['xchan_addr']); + + +}
\ No newline at end of file diff --git a/include/zot.php b/include/zot.php index e120755b5..37c3c1444 100644 --- a/include/zot.php +++ b/include/zot.php @@ -31,9 +31,9 @@ require_once('include/perm_upgrade.php'); * @param string $channel_nick a unique nickname of controlling entity * @returns string */ + function zot_new_uid($channel_nick) { $rawstr = z_root() . '/' . $channel_nick . '.' . mt_rand(); - return(base64url_encode(hash('whirlpool', $rawstr, true), true)); } @@ -49,6 +49,7 @@ function zot_new_uid($channel_nick) { * @param string $guid * @param string $guid_sig */ + function make_xchan_hash($guid, $guid_sig) { return base64url_encode(hash('whirlpool', $guid . $guid_sig, true)); } @@ -62,17 +63,17 @@ function make_xchan_hash($guid, $guid_sig) { * @param string $hash - xchan_hash * @returns array of hubloc (hub location structures) * * \b hubloc_id int - * * \b hubloc_guid char(255) + * * \b hubloc_guid char(191) * * \b hubloc_guid_sig text - * * \b hubloc_hash char(255) - * * \b hubloc_addr char(255) + * * \b hubloc_hash char(191) + * * \b hubloc_addr char(191) * * \b hubloc_flags int * * \b hubloc_status int - * * \b hubloc_url char(255) + * * \b hubloc_url char(191) * * \b hubloc_url_sig text - * * \b hubloc_host char(255) - * * \b hubloc_callback char(255) - * * \b hubloc_connect char(255) + * * \b hubloc_host char(191) + * * \b hubloc_callback char(191) + * * \b hubloc_connect char(191) * * \b hubloc_sitekey text * * \b hubloc_updated datetime * * \b hubloc_connected datetime @@ -97,7 +98,7 @@ function zot_get_hublocs($hash) { * @param array $channel * sender channel structure * @param string $type - * packet type: one of 'ping', 'pickup', 'purge', 'refresh', 'force_refresh', 'notify', 'auth_check' + * packet type: one of 'ping', 'pickup', 'purge', 'refresh', 'keychange', 'force_refresh', 'notify', 'auth_check' * @param array $recipients * envelope information, array ( 'guid' => string, 'guid_sig' => string ); empty for public posts * @param string $remote_key @@ -111,18 +112,21 @@ function zot_get_hublocs($hash) { */ function zot_build_packet($channel, $type = 'notify', $recipients = null, $remote_key = null, $methods = '', $secret = null, $extra = null) { + $sig_method = get_config('system','signature_algorithm','sha256'); + $data = [ 'type' => $type, 'sender' => [ 'guid' => $channel['channel_guid'], - 'guid_sig' => base64url_encode(rsa_sign($channel['channel_guid'],$channel['channel_prvkey'])), + 'guid_sig' => base64url_encode(rsa_sign($channel['channel_guid'],$channel['channel_prvkey'],$sig_method)), 'url' => z_root(), - 'url_sig' => base64url_encode(rsa_sign(z_root(),$channel['channel_prvkey'])), + 'url_sig' => base64url_encode(rsa_sign(z_root(),$channel['channel_prvkey'],$sig_method)), 'sitekey' => get_config('system','pubkey') ], 'callback' => '/post', - 'version' => ZOT_REVISION, - 'encryption' => crypto_methods() + 'version' => Zotlabs\Lib\System::get_zot_revision(), + 'encryption' => crypto_methods(), + 'signing' => signing_methods() ]; if ($recipients) { @@ -134,7 +138,7 @@ function zot_build_packet($channel, $type = 'notify', $recipients = null, $remot if ($secret) { $data['secret'] = preg_replace('/[^0-9a-fA-F]/','',$secret); - $data['secret_sig'] = base64url_encode(rsa_sign($secret,$channel['channel_prvkey'])); + $data['secret_sig'] = base64url_encode(rsa_sign($secret,$channel['channel_prvkey'],$sig_method)); } if ($extra) { @@ -308,6 +312,7 @@ function zot_refresh($them, $channel = null, $force = false) { logger('zot_refresh: ' . $url, LOGGER_DATA, LOG_INFO); + $result = z_post_url($url . $rhs,$postvars); if ($result['success']) { @@ -356,8 +361,6 @@ function zot_refresh($them, $channel = null, $force = false) { else $permissions = $j['permissions']; - $connected_set = false; - if($permissions && is_array($permissions)) { $old_read_stream_perm = get_abconfig($channel['channel_id'],$x['hash'],'their_perms','view_stream'); @@ -529,7 +532,7 @@ function zot_gethub($arr, $multiple = false) { } $limit = (($multiple) ? '' : ' limit 1 '); - $sitekey = ((array_key_exists('sitekey',$arr) && $arr['sitekey']) ? " and hubloc_sitekey = '" . protect_sprintf($arr['sitekey']) . "' " : ''); + $sitekey = ((array_key_exists('sitekey',$arr) && $arr['sitekey']) ? " and hubloc_sitekey = '" . dbesc(protect_sprintf($arr['sitekey'])) . "' " : ''); $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' @@ -575,6 +578,8 @@ function zot_register_hub($arr) { if($arr['url'] && $arr['url_sig'] && $arr['guid'] && $arr['guid_sig']) { + $sig_methods = ((array_key_exists('signing',$arr) && is_array($arr['signing'])) ? $arr['signing'] : [ 'sha256' ]); + $guid_hash = make_xchan_hash($arr['guid'],$arr['guid_sig']); $url = $arr['url'] . '/.well-known/zot-info/?f=&guid_hash=' . $guid_hash; @@ -594,17 +599,18 @@ function zot_register_hub($arr) { * our current communication. */ - if((rsa_verify($arr['guid'],base64url_decode($arr['guid_sig']),$record['key'])) - && (rsa_verify($arr['url'],base64url_decode($arr['url_sig']),$record['key'])) + foreach($sig_methods as $method) { + if((rsa_verify($arr['guid'],base64url_decode($arr['guid_sig']),$record['key'],$method)) + && (rsa_verify($arr['url'],base64url_decode($arr['url_sig']),$record['key'],$method)) && ($arr['guid'] === $record['guid']) && ($arr['guid_sig'] === $record['guid_sig'])) { - - $c = import_xchan($record); - if($c['success']) - $result['success'] = true; - } - else { - logger('zot_register_hub: failure to verify returned packet.'); + $c = import_xchan($record); + if($c['success']) + $result['success'] = true; + } + else { + logger('zot_register_hub: failure to verify returned packet using ' . $method); + } } } } @@ -657,8 +663,19 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) { $import_photos = false; - if(! rsa_verify($arr['guid'],base64url_decode($arr['guid_sig']),$arr['key'])) { - logger('import_xchan: Unable to verify channel signature for ' . $arr['address']); + $sig_methods = ((array_key_exists('signing',$arr) && is_array($arr['signing'])) ? $arr['signing'] : [ 'sha256' ]); + $verified = false; + + foreach($sig_methods as $method) { + if(! rsa_verify($arr['guid'],base64url_decode($arr['guid_sig']),$arr['key'],$method)) { + logger('import_xchan: Unable to verify channel signature for ' . $arr['address'] . ' using ' . $method); + continue; + } + else { + $verified = true; + } + } + if(! $verified) { $ret['message'] = t('Unable to verify channel signature'); return $ret; } @@ -700,6 +717,16 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) { if(intval($r[0]['xchan_pubforum']) != intval($arr['public_forum'])) $pubforum_changed = 1; + if($arr['protocols']) { + $protocols = implode(',',$arr['protocols']); + if($protocols !== 'zot') { + set_xconfig($xchan_hash,'system','protocols',$protocols); + } + else { + del_xconfig($xchan_hash,'system','protocols'); + } + } + if(($r[0]['xchan_name_date'] != $arr['name_updated']) || ($r[0]['xchan_connurl'] != $arr['connections_url']) || ($r[0]['xchan_addr'] != $arr['address']) @@ -917,7 +944,7 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) { } elseif(! $ud_flags) { // nothing changed but we still need to update the updates record - q("update updates set ud_flags = ( ud_flags | %d ) where ud_addr = '%s' and not (ud_flags & %d)>0 ", + q("update updates set ud_flags = ( ud_flags | %d ) where ud_addr = '%s' and not (ud_flags & %d) > 0 ", intval(UPDATE_FLAGS_UPDATED), dbesc($address), intval(UPDATE_FLAGS_UPDATED) @@ -959,6 +986,18 @@ function zot_process_response($hub, $arr, $outq) { } if(is_array($x) && array_key_exists('delivery_report',$x) && is_array($x['delivery_report'])) { + + if(array_key_exists('iv',$x['delivery_report'])) { + $j = crypto_unencapsulate($x['delivery_report'],get_config('system','prvkey')); + if($j) { + $x['delivery_report'] = json_decode($j,true); + } + if(! (is_array($x['delivery_report']) && count($x['delivery_report']))) { + logger('encrypted delivery report could not be decrypted'); + return; + } + } + foreach($x['delivery_report'] as $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' ) ", @@ -1030,13 +1069,15 @@ function zot_fetch($arr) { foreach($ret_hubs as $ret_hub) { + $secret = substr(preg_replace('/[^0-9a-fA-F]/','',$arr['secret']),0,64); + $data = [ 'type' => 'pickup', 'url' => z_root(), 'callback_sig' => base64url_encode(rsa_sign(z_root() . '/post', get_config('system','prvkey'))), 'callback' => z_root() . '/post', - 'secret' => $arr['secret'], - 'secret_sig' => base64url_encode(rsa_sign($arr['secret'], get_config('system','prvkey'))) + 'secret' => $secret, + 'secret_sig' => base64url_encode(rsa_sign($secret, get_config('system','prvkey'))) ]; $algorithm = zot_best_algorithm($ret_hub['site_crypto']); @@ -1046,8 +1087,11 @@ function zot_fetch($arr) { $result = zot_import($fetch, $arr['sender']['url']); - if($result) + if($result) { + $result = crypto_encapsulate(json_encode($result),$ret_hub['hubloc_sitekey'], $algorithm); return $result; + } + } return; @@ -1397,7 +1441,7 @@ function public_recips($msg) { if($msg['message']['tags']) { if(is_array($msg['message']['tags']) && $msg['message']['tags']) { foreach($msg['message']['tags'] as $tag) { - if(($tag['type'] === 'mention') && (strpos($tag['url'],z_root()) !== false)) { + if(($tag['type'] === 'mention' || $tag['type'] === 'forum') && (strpos($tag['url'],z_root()) !== false)) { $address = basename($tag['url']); if($address) { $z = q("select channel_hash as hash from channel where channel_address = '%s' @@ -2857,8 +2901,14 @@ function import_site($arr, $pubkey) { $site_directory = DIRECTORY_MODE_NORMAL; } + $site_flags = $site_directory; + + if(array_key_exists('zot',$arr)) { + set_sconfig($arr['url'],'system','zot_version',$arr['zot']); + } + if($exists) { - if(($siterecord['site_flags'] != $site_directory) + if(($siterecord['site_flags'] != $site_flags) || ($siterecord['site_access'] != $access_policy) || ($siterecord['site_directory'] != $directory_url) || ($siterecord['site_sellpage'] != $sellpage) @@ -2878,7 +2928,7 @@ function import_site($arr, $pubkey) { $r = q("update site set site_dead = 0, site_location = '%s', site_flags = %d, site_access = %d, site_directory = '%s', site_register = %d, site_update = '%s', site_sellpage = '%s', site_realm = '%s', site_type = %d, site_project = '%s', site_version = '%s', site_crypto = '%s' where site_url = '%s'", dbesc($site_location), - intval($site_directory), + intval($site_flags), intval($access_policy), dbesc($directory_url), intval($register_policy), @@ -2911,7 +2961,7 @@ function import_site($arr, $pubkey) { 'site_location' => $site_location, 'site_url' => $url, 'site_access' => intval($access_policy), - 'site_flags' => intval($site_directory), + 'site_flags' => intval($site_flags), 'site_update' => datetime_convert(), 'site_directory' => $directory_url, 'site_register' => intval($register_policy), @@ -2947,8 +2997,11 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) { logger('build_sync_packet'); - if($packet) - logger('packet: ' . print_r($packet, true),LOGGER_DATA, LOG_DEBUG); + + $keychange = (($packet && array_key_exists('keychange',$packet)) ? true : false); + if($keychange) { + logger('keychange sync'); + } if(! $uid) $uid = local_channel(); @@ -2963,6 +3016,7 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) { return; $channel = $r[0]; + unset($channel['channel_password']); unset($channel['channel_salt']); @@ -2973,12 +3027,11 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) { } } - if(intval($channel['channel_removed'])) return; $h = q("select hubloc.*, site.site_crypto from hubloc left join site on site_url = hubloc_url where hubloc_hash = '%s' and hubloc_deleted = 0", - dbesc($channel['channel_hash']) + dbesc(($keychange) ? $packet['keychange']['old_hash'] : $channel['channel_hash']) ); if(! $h) @@ -3010,6 +3063,9 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) { $env_recips = array(); $env_recips[] = array('guid' => $r[0]['xchan_guid'],'guid_sig' => $r[0]['xchan_guid_sig']); + if($packet) + logger('packet: ' . print_r($packet, true),LOGGER_DATA, LOG_DEBUG); + $info = (($packet) ? $packet : array()); $info['type'] = 'channel_sync'; $info['encoding'] = 'red'; // note: not zot, this packet is very platform specific @@ -3033,7 +3089,15 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) { // don't pass these elements, they should not be synchronised - $disallowed = array('channel_id','channel_account_id','channel_primary','channel_prvkey','channel_address','channel_deleted','channel_removed','channel_system'); + + $disallowed = [ + 'channel_id','channel_account_id','channel_primary','channel_address', + 'channel_deleted','channel_removed','channel_system' + ]; + + if(! $keychange) { + $disallowed[] = 'channel_prvkey'; + } if(in_array($k,$disallowed)) continue; @@ -3093,17 +3157,18 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) { function process_channel_sync_delivery($sender, $arr, $deliveries) { - require_once('include/import.php'); /** @FIXME this will sync red structures (channel, pconfig and abook). Eventually we need to make this application agnostic. */ - $result = array(); + $result = []; + + $keychange = ((array_key_exists('keychange',$arr)) ? true : false); foreach ($deliveries as $d) { $r = q("select * from channel where channel_hash = '%s' limit 1", - dbesc($d['hash']) + dbesc(($keychange) ? $arr['keychange']['old_hash'] : $d['hash']) ); if (! $r) { @@ -3122,6 +3187,94 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) { continue; } + if($keychange) { + // verify the keychange operation + if(! rsa_verify($arr['channel']['channel_pubkey'],base64url_decode($arr['keychange']['new_sig']),$channel['channel_prvkey'])) { + logger('sync keychange: verification failed'); + continue; + } + + $sig = base64url_encode(rsa_sign($channel['channel_guid'],$arr['channel']['channel_prvkey'])); + $hash = make_xchan_hash($channel['channel_guid'],$sig); + + + $r = q("update channel set channel_prvkey = '%s', channel_pubkey = '%s', channel_guid_sig = '%s', + channel_hash = '%s' where channel_id = %d", + dbesc($arr['channel']['channel_prvkey']), + dbesc($arr['channel']['channel_pubkey']), + dbesc($sig), + dbesc($hash), + intval($channel['channel_id']) + ); + if(! $r) { + logger('keychange sync: channel update failed'); + continue; + } + + $r = q("select * from channel where channel_id = %d", + intval($channel['channel_id']) + ); + + if(! $r) { + logger('keychange sync: channel retrieve failed'); + continue; + } + + $channel = $r[0]; + + $h = q("select * from hubloc where hubloc_hash = '%s' and hubloc_url = '%s' ", + dbesc($arr['keychange']['old_hash']), + dbesc(z_root()) + ); + + if($h) { + foreach($h as $hv) { + $hv['hubloc_guid_sig'] = $sig; + $hv['hubloc_hash'] = $hash; + $hv['hubloc_url_sig'] = base64url_encode(rsa_sign(z_root(),$channel['channel_prvkey'])); + hubloc_store_lowlevel($hv); + } + } + + $x = q("select * from xchan where xchan_hash = '%s' ", + dbesc($arr['keychange']['old_hash']) + ); + + $check = q("select * from xchan where xchan_hash = '%s'", + dbesc($hash) + ); + + if(($x) && (! $check)) { + $oldxchan = $x[0]; + foreach($x as $xv) { + $xv['xchan_guid_sig'] = $sig; + $xv['xchan_hash'] = $hash; + $xv['xchan_pubkey'] = $channel['channel_pubkey']; + xchan_store_lowlevel($xv); + $newxchan = $xv; + } + } + + $a = q("select * from abook where abook_xchan = '%s' and abook_self = 1", + dbesc($arr['keychange']['old_hash']) + ); + + if($a) { + q("update abook set abook_xchan = '%s' where abook_id = %d", + dbesc($hash), + intval($a[0]['abook_id']) + ); + } + + xchan_change_key($oldxchan,$newxchan,$arr['keychange']); + + // keychange operations can end up in a confused state if you try and sync anything else + // besides the channel keys, so ignore any other packets. + + continue; + } + + if(array_key_exists('config',$arr) && is_array($arr['config']) && count($arr['config'])) { foreach($arr['config'] as $cat => $k) { foreach($arr['config'][$cat] as $k => $v) @@ -3759,11 +3912,57 @@ function zot_reply_message_request($data) { json_return_and_die($ret); } +function zot_rekey_request($sender,$data) { + + $ret = array('success' => false); + + // newsig is newkey signed with oldkey + + // The original xchan will remain. In Zot/Receiver we will have imported the new xchan and hubloc to verify + // the packet authenticity. What we will do now is verify that the keychange operation was signed by the + // oldkey, and if so change all the abook, abconfig, group, and permission elements which reference the + // old xchan_hash. + + if((! $data['old_key']) && (! $data['new_key']) && (! $data['new_sig'])) + json_return_and_die($ret); + + $oldhash = make_xchan_hash($data['old_guid'],$data['old_guid_sig']); + + $r = q("select * from xchan where xchan_hash = '%s' limit 1", + dbesc($oldhash) + ); + + if(! $r) { + json_return_and_die($ret); + } + + $xchan = $r[0]; + + if(! rsa_verify($data['new_key'],base64url_decode($data['new_sig']),$xchan['xchan_pubkey'])) { + json_return_and_die($ret); + } + + $newhash = make_xchan_hash($sender['guid'],$sender['guid_sig']); + + $r = q("select * from xchan where xchan_hash = '%s' limit 1", + dbesc($newhash) + ); + + $newxchan = $r[0]; + + xchan_change_key($xchan,$newxchan,$data); + + $ret['success'] = true; + json_return_and_die($ret); +} + function zotinfo($arr) { $ret = array('success' => false); + $sig_method = get_config('system','signature_algorithm','sha256'); + $zhash = ((x($arr,'guid_hash')) ? $arr['guid_hash'] : ''); $zguid = ((x($arr,'guid')) ? $arr['guid'] : ''); $zguid_sig = ((x($arr,'guid_sig')) ? $arr['guid_sig'] : ''); @@ -3845,6 +4044,11 @@ function zotinfo($arr) { $id = $e['channel_id']; + $x = [ 'channel_id' => $id, 'protocols' => ['zot'] ]; + call_hooks('channel_protocols',$x); + $protocols = $x['protocols']; + + $sys_channel = (intval($e['channel_system']) ? true : false); $special_channel = (($e['channel_pageflags'] & PAGE_PREMIUM) ? true : false); $adult_channel = (($e['channel_pageflags'] & PAGE_ADULT) ? true : false); @@ -3927,7 +4131,7 @@ function zotinfo($arr) { // Communication details if($token) - $ret['signed_token'] = base64url_encode(rsa_sign('token.' . $token,$e['channel_prvkey'])); + $ret['signed_token'] = base64url_encode(rsa_sign('token.' . $token,$e['channel_prvkey'],$sig_method)); $ret['guid'] = $e['xchan_guid']; @@ -3945,6 +4149,7 @@ function zotinfo($arr) { $ret['target'] = $ztarget; $ret['target_sig'] = $zsig; $ret['searchable'] = $searchable; + $ret['protocols'] = $protocols; $ret['adult_content'] = $adult_channel; $ret['public_forum'] = $public_forum; if($deleted) @@ -3970,7 +4175,7 @@ function zotinfo($arr) { if($ztarget_hash) { $permissions['connected'] = false; - $b = q("select * from abook where abook_xchan = '%s' and abook_channel = %d limit 1", + $b = q("select * from abook where abook_xchan = '%s' and abook_channel = %d and abook_pending = 0 limit 1", dbesc($ztarget_hash), intval($e['channel_id']) ); @@ -3994,10 +4199,33 @@ function zotinfo($arr) { if($x) $ret['locations'] = $x; - $ret['site'] = array(); + $ret['site'] = zot_site_info($e['channel_prvkey']); + + check_zotinfo($e,$x,$ret); + + + call_hooks('zot_finger',$ret); + return($ret); + +} + + +function zot_site_info($channel_key = '') { + + $signing_key = get_config('system','prvkey'); + $sig_method = get_config('system','signature_algorithm','sha256'); + + $ret = []; + $ret['site'] = []; $ret['site']['url'] = z_root(); - $ret['site']['url_sig'] = base64url_encode(rsa_sign(z_root(),$e['channel_prvkey'])); - $ret['site']['zot_auth'] = z_root() . '/magic'; + if($channel_key) { + $ret['site']['url_sig'] = base64url_encode(rsa_sign(z_root(),$channel_key,$sig_method)); + } + $ret['site']['url_site_sig'] = base64url_encode(rsa_sign(z_root(),$signing_key,$sig_method)); + $ret['site']['post'] = z_root() . '/post'; + $ret['site']['openWebAuth'] = z_root() . '/owa'; + $ret['site']['authRedirect'] = z_root() . '/magic'; + $ret['site']['key'] = get_config('system','pubkey'); $dirmode = get_config('system','directory_mode'); if(($dirmode === false) || ($dirmode == DIRECTORY_MODE_NORMAL)) @@ -4014,6 +4242,8 @@ function zotinfo($arr) { $ret['site']['encryption'] = crypto_methods(); + $ret['site']['signing'] = signing_methods(); + $ret['site']['zot'] = Zotlabs\Lib\System::get_zot_revision(); // hide detailed site information if you're off the grid @@ -4066,15 +4296,10 @@ function zotinfo($arr) { } - check_zotinfo($e,$x,$ret); - - - call_hooks('zot_finger',$ret); - return($ret); + return $ret['site']; } - function check_zotinfo($channel,$locations,&$ret) { diff --git a/install/INSTALL.txt b/install/INSTALL.txt index 754504a33..88269f032 100644 --- a/install/INSTALL.txt +++ b/install/INSTALL.txt @@ -7,14 +7,14 @@ such as XAMPP and WAMP are not officially supported at this time - however we welcome patches if you manage to get it working. Be aware that this software is more than a simple web application. It is a -complex communications system which more closely resembles an email server -than a web server. For reliability and performance, messages are delivered in -the background and are queued for later delivery when sites are down. This -kind of functionality requires a bit more of the host system than the typical -blog. Not every PHP/MySQL hosting provider will be able to support the -Hubzilla. Many will - but please review the requirements and confirm these -with your hosting provider prior to installation. (And preferably before -entering into a long-term contract.) +complex communications and content management system which more closely +resembles an email server than a web server. For reliability and performance, +messages are delivered in the background and are queued for later delivery +when sites are down. This kind of functionality requires a bit more of the +host system than the typical blog. Not every PHP/MySQL hosting provider will +be able to support Hubzilla. Many will - but please review the requirements +and confirm these with your hosting provider prior to installation. (And +preferably before entering into a long-term contract.) If you encounter installation issues, please let us know via the Github issue tracker where you downloaded the software. Please be as clear as @@ -75,27 +75,6 @@ location may prevent some of these services from working correctly. This should not be a problem with Apache, but may be an issue with nginx or other web server platforms. -**Server Roles** - -During installation you will be asked to choose a server role. Your choices are -1. Basic -2. Standard -3. Pro - -Basic is highly simplified, with almost all the advanced functionality and -complexity removed or permanently disabled. - -Standard is typically used for federated network use, when you wish to interact -with other networks using other protocols. Not all the built in features and -functionality work correctly when other networks are involved. All advanced -and complex features are available to all members by default. - -Pro is for sites that wish to make full use of the built-in abilities and -features, but **not** to interact with other networks. Advanced features are -enabled according to a per-account 'techlevel' which reduces complexity -initially and allows members to adjust the software complexity to match their -technical abilities. - **Installation** 1. Requirements @@ -173,7 +152,8 @@ technical abilities. cd mywebsite util/update_addon_repo hzaddons - - Create searchable representations of the online documentation. You may do this any time + - Once the software is configured and the database installed, create searchable + representations of the online documentation. You may do this any time that the documentation is updated. cd mywebsite diff --git a/install/schema_mysql.sql b/install/schema_mysql.sql index 9e2e401b5..3143854f5 100644 --- a/install/schema_mysql.sql +++ b/install/schema_mysql.sql @@ -650,11 +650,13 @@ CREATE TABLE IF NOT EXISTS `item` ( KEY `created` (`created`), KEY `edited` (`edited`), KEY `received` (`received`), - KEY `uid_commented` (`uid`,`commented`), - KEY `uid_created` (`uid`,`created`), + KEY `uid_commented` (`uid`, `commented`), + KEY `uid_created` (`uid`, `created`), + KEY `uid_item_unseen` (`uid`, `item_unseen`), KEY `aid` (`aid`), KEY `owner_xchan` (`owner_xchan`), KEY `author_xchan` (`author_xchan`), + KEY `resource_id` (`resource_id`), KEY `resource_type` (`resource_type`), KEY `item_restrict` (`item_restrict`), KEY `item_flags` (`item_flags`), diff --git a/install/schema_postgres.sql b/install/schema_postgres.sql index 197cbb4d1..b8bbf5867 100644 --- a/install/schema_postgres.sql +++ b/install/schema_postgres.sql @@ -621,11 +621,13 @@ create index "item_edited" on item ("edited"); create index "item_received" on item ("received"); create index "item_uid_commented" on item ("uid","commented"); create index "item_uid_created" on item ("uid","created"); +create index "item_uid_unseen" on item ("uid","item_unseen"); create index "item_changed" on item ("changed"); create index "item_comments_closed" on item ("comments_closed"); create index "item_aid" on item ("aid"); create index "item_owner_xchan" on item ("owner_xchan"); create index "item_author_xchan" on item ("author_xchan"); +create index "item_resource_id" on item ("resource_id"); create index "item_resource_type" on item ("resource_type"); create index "item_restrict" on item ("item_restrict"); create index "item_flags" on item ("item_flags"); diff --git a/install/update.php b/install/update.php index 8798a3d69..07675a973 100644 --- a/install/update.php +++ b/install/update.php @@ -1,6 +1,6 @@ <?php -define( 'UPDATE_VERSION' , 1193 ); +define( 'UPDATE_VERSION' , 1196 ); /** * @@ -2978,3 +2978,47 @@ function update_r1192() { return UPDATE_SUCCESS; return UPDATE_FAILED; } + +function update_r1193() { + + if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) { + $r1 = q("CREATE INDEX item_uid_unseen ON item (uid, item_unseen)"); + } + else { + $r1 = q("ALTER TABLE item ADD INDEX uid_item_unseen (uid, item_unseen)"); + } + + if($r1) + return UPDATE_SUCCESS; + return UPDATE_FAILED; +} + + +function update_r1194() { + $r = q("select id, resource_id from item where resource_type = 'nwiki'"); + if($r) { + foreach($r as $rv) { + $mimetype = get_iconfig($rv['id'],'wiki','mimeType'); + q("update item set mimetype = '%s' where resource_type = 'nwikipage' and resource_id = '%s'", + dbesc($mimetype), + dbesc($rv['resource_id']) + ); + } + } + + return UPDATE_SUCCESS; +} + +function update_r1195() { + + if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) { + $r1 = q("CREATE INDEX item_resource_id ON item (resource_id)"); + } + else { + $r1 = q("ALTER TABLE item ADD INDEX (resource_id)"); + } + + if($r1) + return UPDATE_SUCCESS; + return UPDATE_FAILED; +} diff --git a/library/cacert.pem b/library/cacert.pem index 29dbfa286..55958581d 100644 --- a/library/cacert.pem +++ b/library/cacert.pem @@ -1,20 +1,20 @@ ## ## Bundle of CA Root Certificates ## -## Certificate data from Mozilla as of: Wed Apr 20 03:12:05 2016 +## Certificate data from Mozilla as of: Wed Jun 7 03:12:05 2017 GMT ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates ## file (certdata.txt). This file can be found in the mozilla source tree: -## http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt +## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt ## ## It contains the certificates in PEM format and therefore ## can be directly used with curl / libcurl / php_curl, or with ## an Apache+mod_ssl webserver for SSL client authentication. ## Just configure this file as the SSLCACertificateFile. ## -## Conversion done with mk-ca-bundle.pl version 1.25. -## SHA1: 5df367cda83086392e1acdf22bfef00c48d5eba6 +## Conversion done with mk-ca-bundle.pl version 1.27. +## SHA256: 93753268e1c596aee21893fb1c6975338389132f15c942ed65fc394a904371d7 ## @@ -252,27 +252,6 @@ W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- -RSA Security 2048 v3 -==================== ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK -ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy -MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb -BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 -Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb -WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH -KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP -+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E -FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY -v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj -0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj -VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 -nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA -pKnXwiJPZ9d37CAFYd4= ------END CERTIFICATE----- - GeoTrust Global CA ================== -----BEGIN CERTIFICATE----- @@ -1241,33 +1220,6 @@ wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- -WellsSecure Public Root Certificate Authority -============================================= ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM -F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw -NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl -bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD -VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 -iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 -i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 -bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB -K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB -AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu -cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm -lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB -i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww -GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI -K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 -bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj -qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es -E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ -tylv2G0xffX8oRAHh84vWdw+WNs= ------END CERTIFICATE----- - COMODO ECC Certification Authority ================================== -----BEGIN CERTIFICATE----- @@ -1285,30 +1237,6 @@ FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- -IGC/A -===== ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD -VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE -Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy -MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI -EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT -STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 -TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW -So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy -HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd -frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ -tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB -egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC -iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK -q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q -MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI -lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF -0mBWWg== ------END CERTIFICATE----- - Security Communication EV RootCA1 ================================= -----BEGIN CERTIFICATE----- @@ -1353,46 +1281,6 @@ hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= -----END CERTIFICATE----- -Microsec e-Szigno Root CA -========================= ------BEGIN CERTIFICATE----- -MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE -BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL -EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 -MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz -dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT -GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG -d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N -oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc -QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ -PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb -MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG -IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD -VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 -LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A -dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn -AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA -4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg -AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA -egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 -Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO -PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv -c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h -cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw -IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT -WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV -MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER -MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp -Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal -HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT -nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE -aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a -86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK -yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB -S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= ------END CERTIFICATE----- - Certigna ======== -----BEGIN CERTIFICATE----- @@ -1518,58 +1406,6 @@ LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= -----END CERTIFICATE----- -Buypass Class 2 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 -MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M -cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 -0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 -0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R -uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV -1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt -7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 -fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w -wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho ------END CERTIFICATE----- - -EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 -========================================================================== ------BEGIN CERTIFICATE----- -MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg -QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe -Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p -ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt -IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by -X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b -gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr -eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ -TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy -Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn -uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI -qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm -ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0 -Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB -/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW -Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t -FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm -zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k -XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT -bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU -RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK -1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt -2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ -Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9 -AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT ------END CERTIFICATE----- - certSIGN ROOT CA ================ -----BEGIN CERTIFICATE----- @@ -1611,28 +1447,6 @@ G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m mxE= -----END CERTIFICATE----- -ApplicationCA - Japanese Government -=================================== ------BEGIN CERTIFICATE----- -MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT -SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw -MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl -cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 -fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN -wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE -jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu -nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU -WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV -BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD -vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs -o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g -/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD -io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW -dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL -rosot4LKGAfmt1t06SAZf7IbiVQ= ------END CERTIFICATE----- - GeoTrust Primary Certification Authority - G3 ============================================= -----BEGIN CERTIFICATE----- @@ -1764,7 +1578,7 @@ AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- NetLock Arany (Class Gold) Főtanúsítvány -============================================ +======================================== -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 @@ -1819,34 +1633,6 @@ IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm 66+KAQ== -----END CERTIFICATE----- -Juur-SK -======= ------BEGIN CERTIFICATE----- -MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA -c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw -DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG -SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy -aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf -TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC -+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw -UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa -Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF -MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD -HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh -AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA -cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr -AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw -cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE -FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G -A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo -ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL -abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 -IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh -Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 -yyqcjg== ------END CERTIFICATE----- - Hongkong Post Root CA 1 ======================= -----BEGIN CERTIFICATE----- @@ -2280,7 +2066,7 @@ Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -----END CERTIFICATE----- Certinomis - Autorité Racine -============================= +============================ -----BEGIN CERTIFICATE----- MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg @@ -2310,41 +2096,6 @@ wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ vgt2Fl43N+bYdJeimUV5 -----END CERTIFICATE----- -Root CA Generalitat Valenciana -============================== ------BEGIN CERTIFICATE----- -MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE -ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 -IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 -WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE -CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 -F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B -ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ -D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte -JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB -AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n -dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB -ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl -AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA -YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy -AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA -aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt -AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA -YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu -AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA -OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 -dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV -BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G -A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S -b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh -TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz -Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 -NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH -iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt -+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= ------END CERTIFICATE----- - TWCA Root Certification Authority ================================= -----BEGIN CERTIFICATE----- @@ -3675,7 +3426,7 @@ ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 -========================================================= +==================================================== -----BEGIN CERTIFICATE----- MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp @@ -3698,30 +3449,6 @@ lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8 B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU= -----END CERTIFICATE----- -TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6 -========================================================= ------BEGIN CERTIFICATE----- -MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G -A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls -acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5 -MDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL -BgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf -aSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm -aWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a -2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED -wnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb -HH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV -+DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT -9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG -9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R -fdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy -o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW -hvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1 -O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw== ------END CERTIFICATE----- - Certinomis - Root CA ==================== -----BEGIN CERTIFICATE----- @@ -3863,6 +3590,369 @@ ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 zAYspsbiDrW5viSP -----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2015 +======================================================= +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT +BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 +aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx +MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg +QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV +BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw +MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv +bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh +iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ +6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd +FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr +i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F +GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 +fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu +iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI +hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ +D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM +d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y +d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn +82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb +davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F +Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt +J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa +JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q +p/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions ECC RootCA 2015 +=========================================================== +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 +aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw +MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj +IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD +VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 +Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP +dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK +Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA +GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn +dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +Certplus Root CA G1 +=================== +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUAMD4xCzAJBgNV +BAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTAe +Fw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhD +ZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHN +r49aiZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt6kuJPKNx +Qv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP0FG7Yn2ksYyy/yARujVj +BYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTv +LRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDEEW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2 +z4QTd28n6v+WZxcIbekN1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc +4nBvCGrch2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCTmehd +4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV4EJQeIQEQWGw9CEj +jy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPOWftwenMGE9nTdDckQQoRb5fc5+R+ +ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0G +A1UdDgQWBBSowcCbkahDFXxdBie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHY +lwuBsTANBgkqhkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh +66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7/SMNkPX0XtPG +YX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BSS7CTKtQ+FjPlnsZlFT5kOwQ/ +2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F +6ALEUz65noe8zDUa3qHpimOHZR4RKttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilX +CNQ314cnrUlZp5GrRHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWe +tUNy6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEVV/xuZDDC +VRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5g4VCXA9DO2pJNdWY9BW/ ++mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl++O/QmueD6i9a5jc2NvLi6Td11n0bt3+ +qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= +-----END CERTIFICATE----- + +Certplus Root CA G2 +=================== +-----BEGIN CERTIFICATE----- +MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4xCzAJBgNVBAYT +AkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjAeFw0x +NDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0 +cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BM0PW1aC3/BFGtat93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uN +Am8xIk0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMB8GA1Ud +IwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqGSM49BAMDA2gAMGUCMHD+sAvZ94OX7PNV +HdTcswYO/jOYnYs5kGuUIe22113WTNchp+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjl +vPl5adytRSv3tjFzzAalU5ORGpOucGpnutee5WEaXw== +-----END CERTIFICATE----- + +OpenTrust Root CA G1 +==================== +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUAMEAxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcx +MB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM +CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7fa +Yp6bwiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX/uMftk87 +ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR077F9jAHiOH3BX2pfJLKO +YheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGPuY4zbGneWK2gDqdkVBFpRGZPTBKnjix9 +xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLxp2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO +9z0M+Yo0FMT7MzUj8czxKselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq +3ywgsNw2TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+WG+Oi +n6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPwvFEVVJSmdz7QdFG9 +URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYYEQRVzXR7z2FwefR7LFxckvzluFqr +TJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUl0YhVyE12jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/Px +N3DlCPaTKbYwDQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E +PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kfgLMtMrpkZ2Cv +uVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbSFXJfLkur1J1juONI5f6ELlgK +n0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLh +X4SPgPL0DTatdrOjteFkdjpY3H1PXlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80 +nR14SohWZ25g/4/Ii+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcm +GS3tTAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L9109S5zvE/ +bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/KyPu1svf0OnWZzsD2097+o +4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJAwSQiumPv+i2tCqjI40cHLI5kqiPAlxA +OXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj1oxx +-----END CERTIFICATE----- + +OpenTrust Root CA G2 +==================== +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUAMEAxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcy +MB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM +CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+ +Ntmh/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78eCbY2albz +4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/61UWY0jUJ9gNDlP7ZvyCV +eYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fEFY8ElggGQgT4hNYdvJGmQr5J1WqIP7wt +UdGejeBSzFfdNTVY27SPJIjki9/ca1TSgSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz +3GIZ38i1MH/1PCZ1Eb3XG7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj +3CzMpSZyYhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaHvGOz +9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4t/bQWVyJ98LVtZR0 +0dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/gh7PU3+06yzbXfZqfUAkBXKJOAGT +y3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUajn6QiL35okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59 +M4PLuG53hq8wDQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz +Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0nXGEL8pZ0keI +mUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qTRmTFAHneIWv2V6CG1wZy7HBG +S4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpTwm+bREx50B1ws9efAvSyB7DH5fitIw6mVskp +EndI2S9G/Tvw/HRwkqWOOAgfZDC2t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ +6e18CL13zSdkzJTaTkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97kr +gCf2o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU3jg9CcCo +SmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eAiN1nE28daCSLT7d0geX0 +YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14fWKGVyasvc0rQLW6aWQ9VGHgtPFGml4vm +u7JwqkwR3v98KzfUetF3NI/n+UL3PIEMS1IK +-----END CERTIFICATE----- + +OpenTrust Root CA G3 +==================== +-----BEGIN CERTIFICATE----- +MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEczMB4X +DTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9w +ZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAARK7liuTcpm3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5B +ta1doYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4GA1UdDwEB +/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAf +BgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAKBggqhkjOPQQDAwNpADBmAjEAj6jcnboM +BBf6Fek9LykBl7+BFjNAk2z8+e2AcG+qj9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta +3U1fJAuwACEl74+nBCZx4nxp5V2a+EEfOzmTk51V6s2N8fvB +-----END CERTIFICATE----- + +ISRG Root X1 +============ +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE +BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD +EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG +EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT +DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r +Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 +3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K +b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN +Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ +4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf +1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu +hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH +usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r +OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY +9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV +0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt +hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw +TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx +e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA +JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD +YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n +JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ +m+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM +================ +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT +AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw +MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD +TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf +qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr +btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL +j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou +08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw +WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT +tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ +47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC +ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa +i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o +dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s +D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ +j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT +Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW ++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 +Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d +8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm +5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG +rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +Amazon Root CA 1 +================ +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 +MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH +FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ +gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t +dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce +VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 +DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM +CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy +8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa +2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 +xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +Amazon Root CA 2 +================ +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 +MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 +kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp +N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 +AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd +fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx +kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS +btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 +Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN +c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ +3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw +DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA +A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE +YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW +xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ +gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW +aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV +Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 +KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi +JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= +-----END CERTIFICATE----- + +Amazon Root CA 3 +================ +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB +f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr +Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 +rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc +eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +Amazon Root CA 4 +================ +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN +/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri +83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA +MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 +AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +LuxTrust Global Root 2 +====================== +-----BEGIN CERTIFICATE----- +MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQELBQAwRjELMAkG +A1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNVBAMMFkx1eFRydXN0IEdsb2Jh +bCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUwMzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEW +MBQGA1UECgwNTHV4VHJ1c3QgUy5BLjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCC +AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wm +Kb3FibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTemhfY7RBi2 +xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1EMShduxq3sVs35a0VkBC +wGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsnXpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm +1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkm +FRseTJIpgp7VkoGSQXAZ96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niF +wpN6cj5mj5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4gDEa/ +a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+8kPREd8vZS9kzl8U +ubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2jX5t/Lax5Gw5CMZdjpPuKadUiDTSQ +MC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmHhFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB +/zBCBgNVHSAEOzA5MDcGByuBKwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5 +Lmx1eHRydXN0Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT ++Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQELBQADggIBAGoZ +FO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9BzZAcg4atmpZ1gDlaCDdLnIN +H2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTOjFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW +7MM3LGVYvlcAGvI1+ut7MV3CwRI9loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIu +ZY+kt9J/Z93I055cqqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWA +VWe+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/JEAdemrR +TxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKrezrnK+T+Tb/mjuuqlPpmt +/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQfLSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc +7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31I +iyBMz2TWuJdGsE7RKlY6oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr +-----END CERTIFICATE----- + +TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT +D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr +IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g +TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp +ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD +VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt +c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth +bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 +IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 +6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc +wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 +3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 +WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU +ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc +lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R +e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j +q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIGCDCCA/CgAwIBAgIQKy5u6tl1NmwUim7bo3yMBzANBgkqhkiG9w0BAQwFADCB hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G diff --git a/library/certs/cacert.pem b/library/certs/cacert.pem index c15368bdc..8f1357b66 100644 --- a/library/certs/cacert.pem +++ b/library/certs/cacert.pem @@ -1,20 +1,20 @@ ## ## Bundle of CA Root Certificates ## -## Certificate data from Mozilla as of: Wed Apr 20 03:12:05 2016 +## Certificate data from Mozilla as of: Wed Jun 7 03:12:05 2017 GMT ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates ## file (certdata.txt). This file can be found in the mozilla source tree: -## http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt +## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt ## ## It contains the certificates in PEM format and therefore ## can be directly used with curl / libcurl / php_curl, or with ## an Apache+mod_ssl webserver for SSL client authentication. ## Just configure this file as the SSLCACertificateFile. ## -## Conversion done with mk-ca-bundle.pl version 1.25. -## SHA1: 5df367cda83086392e1acdf22bfef00c48d5eba6 +## Conversion done with mk-ca-bundle.pl version 1.27. +## SHA256: 93753268e1c596aee21893fb1c6975338389132f15c942ed65fc394a904371d7 ## @@ -252,27 +252,6 @@ W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- -RSA Security 2048 v3 -==================== ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK -ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy -MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb -BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 -Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb -WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH -KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP -+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E -FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY -v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj -0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj -VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 -nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA -pKnXwiJPZ9d37CAFYd4= ------END CERTIFICATE----- - GeoTrust Global CA ================== -----BEGIN CERTIFICATE----- @@ -1241,33 +1220,6 @@ wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- -WellsSecure Public Root Certificate Authority -============================================= ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM -F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw -NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl -bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD -VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 -iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 -i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 -bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB -K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB -AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu -cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm -lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB -i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww -GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI -K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 -bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj -qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es -E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ -tylv2G0xffX8oRAHh84vWdw+WNs= ------END CERTIFICATE----- - COMODO ECC Certification Authority ================================== -----BEGIN CERTIFICATE----- @@ -1285,30 +1237,6 @@ FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- -IGC/A -===== ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD -VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE -Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy -MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI -EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT -STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 -TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW -So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy -HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd -frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ -tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB -egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC -iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK -q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q -MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI -lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF -0mBWWg== ------END CERTIFICATE----- - Security Communication EV RootCA1 ================================= -----BEGIN CERTIFICATE----- @@ -1353,46 +1281,6 @@ hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= -----END CERTIFICATE----- -Microsec e-Szigno Root CA -========================= ------BEGIN CERTIFICATE----- -MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE -BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL -EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 -MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz -dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT -GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG -d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N -oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc -QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ -PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb -MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG -IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD -VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 -LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A -dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn -AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA -4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg -AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA -egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 -Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO -PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv -c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h -cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw -IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT -WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV -MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER -MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp -Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal -HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT -nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE -aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a -86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK -yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB -S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= ------END CERTIFICATE----- - Certigna ======== -----BEGIN CERTIFICATE----- @@ -1518,58 +1406,6 @@ LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= -----END CERTIFICATE----- -Buypass Class 2 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 -MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M -cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 -0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 -0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R -uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV -1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt -7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 -fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w -wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho ------END CERTIFICATE----- - -EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 -========================================================================== ------BEGIN CERTIFICATE----- -MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg -QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe -Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p -ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt -IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by -X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b -gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr -eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ -TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy -Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn -uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI -qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm -ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0 -Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB -/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW -Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t -FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm -zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k -XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT -bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU -RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK -1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt -2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ -Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9 -AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT ------END CERTIFICATE----- - certSIGN ROOT CA ================ -----BEGIN CERTIFICATE----- @@ -1611,28 +1447,6 @@ G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m mxE= -----END CERTIFICATE----- -ApplicationCA - Japanese Government -=================================== ------BEGIN CERTIFICATE----- -MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT -SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw -MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl -cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 -fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN -wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE -jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu -nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU -WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV -BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD -vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs -o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g -/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD -io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW -dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL -rosot4LKGAfmt1t06SAZf7IbiVQ= ------END CERTIFICATE----- - GeoTrust Primary Certification Authority - G3 ============================================= -----BEGIN CERTIFICATE----- @@ -1764,7 +1578,7 @@ AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- NetLock Arany (Class Gold) Főtanúsítvány -============================================ +======================================== -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 @@ -1819,34 +1633,6 @@ IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm 66+KAQ== -----END CERTIFICATE----- -Juur-SK -======= ------BEGIN CERTIFICATE----- -MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA -c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw -DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG -SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy -aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf -TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC -+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw -UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa -Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF -MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD -HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh -AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA -cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr -AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw -cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE -FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G -A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo -ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL -abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 -IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh -Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 -yyqcjg== ------END CERTIFICATE----- - Hongkong Post Root CA 1 ======================= -----BEGIN CERTIFICATE----- @@ -2280,7 +2066,7 @@ Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -----END CERTIFICATE----- Certinomis - Autorité Racine -============================= +============================ -----BEGIN CERTIFICATE----- MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg @@ -2310,41 +2096,6 @@ wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ vgt2Fl43N+bYdJeimUV5 -----END CERTIFICATE----- -Root CA Generalitat Valenciana -============================== ------BEGIN CERTIFICATE----- -MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE -ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 -IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 -WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE -CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 -F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B -ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ -D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte -JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB -AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n -dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB -ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl -AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA -YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy -AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA -aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt -AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA -YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu -AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA -OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 -dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV -BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G -A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S -b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh -TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz -Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 -NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH -iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt -+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= ------END CERTIFICATE----- - TWCA Root Certification Authority ================================= -----BEGIN CERTIFICATE----- @@ -3675,7 +3426,7 @@ ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 -========================================================= +==================================================== -----BEGIN CERTIFICATE----- MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp @@ -3698,30 +3449,6 @@ lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8 B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU= -----END CERTIFICATE----- -TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6 -========================================================= ------BEGIN CERTIFICATE----- -MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G -A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls -acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5 -MDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL -BgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf -aSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm -aWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a -2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED -wnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb -HH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV -+DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT -9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG -9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R -fdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy -o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW -hvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1 -O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw== ------END CERTIFICATE----- - Certinomis - Root CA ==================== -----BEGIN CERTIFICATE----- @@ -3863,3 +3590,366 @@ ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 zAYspsbiDrW5viSP -----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2015 +======================================================= +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT +BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 +aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx +MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg +QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV +BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw +MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv +bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh +iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ +6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd +FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr +i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F +GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 +fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu +iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI +hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ +D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM +d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y +d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn +82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb +davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F +Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt +J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa +JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q +p/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions ECC RootCA 2015 +=========================================================== +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 +aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw +MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj +IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD +VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 +Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP +dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK +Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA +GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn +dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +Certplus Root CA G1 +=================== +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUAMD4xCzAJBgNV +BAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTAe +Fw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhD +ZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHN +r49aiZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt6kuJPKNx +Qv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP0FG7Yn2ksYyy/yARujVj +BYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTv +LRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDEEW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2 +z4QTd28n6v+WZxcIbekN1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc +4nBvCGrch2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCTmehd +4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV4EJQeIQEQWGw9CEj +jy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPOWftwenMGE9nTdDckQQoRb5fc5+R+ +ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0G +A1UdDgQWBBSowcCbkahDFXxdBie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHY +lwuBsTANBgkqhkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh +66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7/SMNkPX0XtPG +YX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BSS7CTKtQ+FjPlnsZlFT5kOwQ/ +2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F +6ALEUz65noe8zDUa3qHpimOHZR4RKttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilX +CNQ314cnrUlZp5GrRHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWe +tUNy6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEVV/xuZDDC +VRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5g4VCXA9DO2pJNdWY9BW/ ++mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl++O/QmueD6i9a5jc2NvLi6Td11n0bt3+ +qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= +-----END CERTIFICATE----- + +Certplus Root CA G2 +=================== +-----BEGIN CERTIFICATE----- +MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4xCzAJBgNVBAYT +AkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjAeFw0x +NDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0 +cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BM0PW1aC3/BFGtat93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uN +Am8xIk0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMB8GA1Ud +IwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqGSM49BAMDA2gAMGUCMHD+sAvZ94OX7PNV +HdTcswYO/jOYnYs5kGuUIe22113WTNchp+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjl +vPl5adytRSv3tjFzzAalU5ORGpOucGpnutee5WEaXw== +-----END CERTIFICATE----- + +OpenTrust Root CA G1 +==================== +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUAMEAxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcx +MB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM +CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7fa +Yp6bwiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX/uMftk87 +ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR077F9jAHiOH3BX2pfJLKO +YheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGPuY4zbGneWK2gDqdkVBFpRGZPTBKnjix9 +xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLxp2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO +9z0M+Yo0FMT7MzUj8czxKselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq +3ywgsNw2TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+WG+Oi +n6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPwvFEVVJSmdz7QdFG9 +URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYYEQRVzXR7z2FwefR7LFxckvzluFqr +TJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUl0YhVyE12jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/Px +N3DlCPaTKbYwDQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E +PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kfgLMtMrpkZ2Cv +uVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbSFXJfLkur1J1juONI5f6ELlgK +n0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLh +X4SPgPL0DTatdrOjteFkdjpY3H1PXlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80 +nR14SohWZ25g/4/Ii+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcm +GS3tTAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L9109S5zvE/ +bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/KyPu1svf0OnWZzsD2097+o +4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJAwSQiumPv+i2tCqjI40cHLI5kqiPAlxA +OXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj1oxx +-----END CERTIFICATE----- + +OpenTrust Root CA G2 +==================== +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUAMEAxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcy +MB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM +CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+ +Ntmh/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78eCbY2albz +4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/61UWY0jUJ9gNDlP7ZvyCV +eYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fEFY8ElggGQgT4hNYdvJGmQr5J1WqIP7wt +UdGejeBSzFfdNTVY27SPJIjki9/ca1TSgSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz +3GIZ38i1MH/1PCZ1Eb3XG7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj +3CzMpSZyYhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaHvGOz +9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4t/bQWVyJ98LVtZR0 +0dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/gh7PU3+06yzbXfZqfUAkBXKJOAGT +y3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUajn6QiL35okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59 +M4PLuG53hq8wDQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz +Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0nXGEL8pZ0keI +mUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qTRmTFAHneIWv2V6CG1wZy7HBG +S4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpTwm+bREx50B1ws9efAvSyB7DH5fitIw6mVskp +EndI2S9G/Tvw/HRwkqWOOAgfZDC2t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ +6e18CL13zSdkzJTaTkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97kr +gCf2o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU3jg9CcCo +SmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eAiN1nE28daCSLT7d0geX0 +YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14fWKGVyasvc0rQLW6aWQ9VGHgtPFGml4vm +u7JwqkwR3v98KzfUetF3NI/n+UL3PIEMS1IK +-----END CERTIFICATE----- + +OpenTrust Root CA G3 +==================== +-----BEGIN CERTIFICATE----- +MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEczMB4X +DTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9w +ZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAARK7liuTcpm3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5B +ta1doYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4GA1UdDwEB +/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAf +BgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAKBggqhkjOPQQDAwNpADBmAjEAj6jcnboM +BBf6Fek9LykBl7+BFjNAk2z8+e2AcG+qj9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta +3U1fJAuwACEl74+nBCZx4nxp5V2a+EEfOzmTk51V6s2N8fvB +-----END CERTIFICATE----- + +ISRG Root X1 +============ +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE +BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD +EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG +EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT +DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r +Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 +3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K +b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN +Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ +4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf +1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu +hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH +usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r +OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY +9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV +0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt +hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw +TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx +e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA +JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD +YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n +JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ +m+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM +================ +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT +AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw +MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD +TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf +qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr +btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL +j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou +08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw +WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT +tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ +47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC +ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa +i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o +dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s +D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ +j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT +Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW ++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 +Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d +8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm +5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG +rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +Amazon Root CA 1 +================ +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 +MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH +FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ +gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t +dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce +VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 +DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM +CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy +8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa +2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 +xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +Amazon Root CA 2 +================ +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 +MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 +kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp +N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 +AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd +fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx +kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS +btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 +Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN +c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ +3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw +DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA +A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE +YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW +xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ +gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW +aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV +Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 +KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi +JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= +-----END CERTIFICATE----- + +Amazon Root CA 3 +================ +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB +f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr +Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 +rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc +eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +Amazon Root CA 4 +================ +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN +/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri +83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA +MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 +AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +LuxTrust Global Root 2 +====================== +-----BEGIN CERTIFICATE----- +MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQELBQAwRjELMAkG +A1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNVBAMMFkx1eFRydXN0IEdsb2Jh +bCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUwMzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEW +MBQGA1UECgwNTHV4VHJ1c3QgUy5BLjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCC +AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wm +Kb3FibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTemhfY7RBi2 +xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1EMShduxq3sVs35a0VkBC +wGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsnXpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm +1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkm +FRseTJIpgp7VkoGSQXAZ96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niF +wpN6cj5mj5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4gDEa/ +a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+8kPREd8vZS9kzl8U +ubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2jX5t/Lax5Gw5CMZdjpPuKadUiDTSQ +MC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmHhFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB +/zBCBgNVHSAEOzA5MDcGByuBKwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5 +Lmx1eHRydXN0Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT ++Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQELBQADggIBAGoZ +FO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9BzZAcg4atmpZ1gDlaCDdLnIN +H2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTOjFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW +7MM3LGVYvlcAGvI1+ut7MV3CwRI9loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIu +ZY+kt9J/Z93I055cqqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWA +VWe+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/JEAdemrR +TxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKrezrnK+T+Tb/mjuuqlPpmt +/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQfLSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc +7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31I +iyBMz2TWuJdGsE7RKlY6oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr +-----END CERTIFICATE----- + +TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT +D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr +IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g +TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp +ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD +VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt +c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth +bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 +IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 +6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc +wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 +3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 +WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU +ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc +lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R +e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j +q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- diff --git a/library/jquery_ac/friendica.complete.js b/library/jquery_ac/friendica.complete.js index 73a6e91d5..3012a754b 100644 --- a/library/jquery_ac/friendica.complete.js +++ b/library/jquery_ac/friendica.complete.js @@ -243,7 +243,7 @@ } else if (!this.isBadQuery(q)) {
me = this;
me.options.params.query = q;
- $('#nav-search-spinner').spin('tiny');
+ $('#nav-search-spinner').show();
$.get(this.serviceUrl, me.options.params, function(txt) { me.processResponse(txt); }, 'text');
}
},
@@ -306,7 +306,7 @@ this.data = response.data;
this.suggest();
}
- $('#nav-search-spinner').spin(false);
+ $('#nav-search-spinner').hide();
},
activate: function(index) {
diff --git a/library/jsonld/LICENSE b/library/jsonld/LICENSE new file mode 100644 index 000000000..bd572d3e0 --- /dev/null +++ b/library/jsonld/LICENSE @@ -0,0 +1,30 @@ +BSD 3-Clause License +Copyright (c) 2011, Digital Bazaar, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +Neither the name of the Digital Bazaar, Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/library/jsonld/README.md b/library/jsonld/README.md new file mode 100644 index 000000000..5853c94bf --- /dev/null +++ b/library/jsonld/README.md @@ -0,0 +1,193 @@ +php-json-ld +=========== + +[![Build Status][travis-ci-png]][travis-ci-site] +[travis-ci-png]: https://travis-ci.org/digitalbazaar/php-json-ld.png?branch=master +[travis-ci-site]: https://travis-ci.org/digitalbazaar/php-json-ld + +Introduction +------------ + +This library is an implementation of the [JSON-LD][] specification in [PHP][]. + +JSON, as specified in [RFC7159][], is a simple language for representing +objects on the Web. Linked Data is a way of describing content across +different documents or Web sites. Web resources are described using +IRIs, and typically are dereferencable entities that may be used to find +more information, creating a "Web of Knowledge". [JSON-LD][] is intended +to be a simple publishing method for expressing not only Linked Data in +JSON, but for adding semantics to existing JSON. + +JSON-LD is designed as a light-weight syntax that can be used to express +Linked Data. It is primarily intended to be a way to express Linked Data +in JavaScript and other Web-based programming environments. It is also +useful when building interoperable Web Services and when storing Linked +Data in JSON-based document storage engines. It is practical and +designed to be as simple as possible, utilizing the large number of JSON +parsers and existing code that is in use today. It is designed to be +able to express key-value pairs, RDF data, [RDFa][] data, +[Microformats][] data, and [Microdata][]. That is, it supports every +major Web-based structured data model in use today. + +The syntax does not require many applications to change their JSON, but +easily add meaning by adding context in a way that is either in-band or +out-of-band. The syntax is designed to not disturb already deployed +systems running on JSON, but provide a smooth migration path from JSON +to JSON with added semantics. Finally, the format is intended to be fast +to parse, fast to generate, stream-based and document-based processing +compatible, and require a very small memory footprint in order to operate. + +## Quick Examples + +```php +$doc = (object)array( + "http://schema.org/name" => "Manu Sporny", + "http://schema.org/url" => (object)array("@id" => "http://manu.sporny.org/"), + "http://schema.org/image" => (object)array("@id" => "http://manu.sporny.org/images/manu.png") +); + +$context = (object)array( + "name" => "http://schema.org/name", + "homepage" => (object)array("@id" => "http://schema.org/url", "@type" => "@id"), + "image" => (object)array("@id" => "http://schema.org/image", "@type" => "@id") +); + +// compact a document according to a particular context +// see: http://json-ld.org/spec/latest/json-ld/#compacted-document-form +$compacted = jsonld_compact($doc, $context); + +echo json_encode($compacted, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); +/* Output: +{ + "@context": {...}, + "image": "http://manu.sporny.org/images/manu.png", + "homepage": "http://manu.sporny.org/", + "name": "Manu Sporny" +} +*/ + +// compact using URLs +jsonld_compact('http://example.org/doc', 'http://example.org/context'); + +// expand a document, removing its context +// see: http://json-ld.org/spec/latest/json-ld/#expanded-document-form +$expanded = jsonld_expand($compacted) { +echo json_encode($expanded, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); +/* Output: +{ + "http://schema.org/image": [{"@id": "http://manu.sporny.org/images/manu.png"}], + "http://schema.org/name": [{"@value": "Manu Sporny"}], + "http://schema.org/url": [{"@id": "http://manu.sporny.org/"}] +} +*/ + +// expand using URLs +jsonld_expand('http://example.org/doc'); + +// flatten a document +// see: http://json-ld.org/spec/latest/json-ld/#flattened-document-form +$flattened = jsonld_flatten($doc); +// all deep-level trees flattened to the top-level + +// frame a document +// see: http://json-ld.org/spec/latest/json-ld-framing/#introduction +$framed = jsonld_frame($doc, $frame); +// document transformed into a particular tree structure per the given frame + +// normalize a document using the RDF Dataset Normalization Algorithm +// (URDNA2015), see: http://json-ld.github.io/normalization/spec/ +$normalized = jsonld_normalize( + $doc, array('algorithm' => 'URDNA2015', 'format' => 'application/nquads')); +// normalized is a string that is a canonical representation of the document +// that can be used for hashing, comparison, etc. + +// force HTTPS-only context loading: +// use built-in secure document loader +jsonld_set_document_loader('jsonld_default_secure_document_loader'); + +// set a default custom document loader +jsonld_set_document_loader('my_custom_doc_loader'); + +// a custom loader that demonstrates using a simple in-memory mock for +// certain contexts before falling back to the default loader +// note: if you want to set this loader as the new default, you'll need to +// store the previous default in another variable first and access that inside +// the loader +global $mocks; +$mocks = array('http://example.com/mycontext' => (object)array( + 'hombre' => 'http://schema.org/name')); +function mock_load($url) { + global $jsonld_default_load_document, $mocks; + if(isset($mocks[$url])) { + // return a "RemoteDocument", it has these three properties: + return (object)array( + 'contextUrl' => null, + 'document' => $mocks[$url], + 'documentUrl' => $url); + } + // use default loader + return call_user_func($jsonld_default_load_document, $url); +} + +// use the mock loader for just this call, witout modifying the default one +$compacted = jsonld_compact($foo, 'http://example.com/mycontext', array( + 'documentLoader' => 'mock_load')); + +// a custom loader that uses a simplistic in-memory cache (no invalidation) +global $cache; +$cache = array(); +function cache_load($url) { + global $jsonld_default_load_document, $cache; + if(isset($cache[$url])) { + return $cache[$url]; + } + // use default loader + $doc = call_user_func($jsonld_default_load_document, $url); + $cache[$url] = $doc; + return $doc; +} + +// use the cache loader for just this call, witout modifying the default one +$compacted = jsonld_compact($foo, 'http://schema.org', array( + 'documentLoader' => 'cache_load')); +``` + +Commercial Support +------------------ + +Commercial support for this library is available upon request from +[Digital Bazaar][]: support@digitalbazaar.com + +Source +------ + +The source code for the PHP implementation of the JSON-LD API +is available at: + +http://github.com/digitalbazaar/php-json-ld + +Tests +----- + +This library includes a sample testing utility which may be used to verify +that changes to the processor maintain the correct output. + +To run the sample tests you will need to get the test suite files by cloning +the `json-ld.org` and `normalization` repositories hosted on GitHub: + +- https://github.com/json-ld/json-ld.org +- https://github.com/json-ld/normalization + +Then run the PHPUnit test.php application and point it at the directories +containing the tests: + + phpunit --group json-ld.org test.php -d {PATH_TO_JSON_LD_ORG/test-suite} + phpunit --group normalization test.php -d {PATH_TO_NORMALIZATION/tests} + +[Digital Bazaar]: http://digitalbazaar.com/ +[JSON-LD]: http://json-ld.org/ +[Microdata]: http://www.w3.org/TR/microdata/ +[Microformats]: http://microformats.org/ +[PHP]: http://php.net +[RDFa]: http://www.w3.org/TR/rdfa-core/ +[RFC7159]: http://tools.ietf.org/html/rfc7159 diff --git a/library/jsonld/composer.json b/library/jsonld/composer.json new file mode 100644 index 000000000..cc985b23e --- /dev/null +++ b/library/jsonld/composer.json @@ -0,0 +1,29 @@ +{ + "name": "digitalbazaar/json-ld", + "type": "library", + "description": "A JSON-LD Processor and API implementation in PHP.", + "keywords": [ + "JSON", + "Linked Data", + "JSON-LD", + "RDF", + "Semantic Web", + "jsonld" + ], + "homepage": "https://github.com/digitalbazaar/php-json-ld", + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Digital Bazaar, Inc.", + "email": "support@digitalbazaar.com", + "url": "http://digitalbazaar.com/" + } + ], + "require": { + "php": ">=5.3.0", + "ext-json": "*" + }, + "autoload": { + "files": [ "jsonld.php" ] + } +} diff --git a/library/jsonld/jsonld.php b/library/jsonld/jsonld.php new file mode 100644 index 000000000..28b3e7ce3 --- /dev/null +++ b/library/jsonld/jsonld.php @@ -0,0 +1,6038 @@ +<?php +/** + * PHP implementation of the JSON-LD API. + * Version: 0.4.8-dev + * + * @author Dave Longley + * + * BSD 3-Clause License + * Copyright (c) 2011-2014 Digital Bazaar, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Digital Bazaar, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * Performs JSON-LD compaction. + * + * @param mixed $input the JSON-LD object to compact. + * @param mixed $ctx the context to compact with. + * @param assoc [$options] options to use: + * [base] the base IRI to use. + * [graph] true to always output a top-level graph (default: false). + * [documentLoader(url)] the document loader. + * + * @return mixed the compacted JSON-LD output. + */ +function jsonld_compact($input, $ctx, $options=array()) { + $p = new JsonLdProcessor(); + return $p->compact($input, $ctx, $options); +} + +/** + * Performs JSON-LD expansion. + * + * @param mixed $input the JSON-LD object to expand. + * @param assoc[$options] the options to use: + * [base] the base IRI to use. + * [documentLoader(url)] the document loader. + * + * @return array the expanded JSON-LD output. + */ +function jsonld_expand($input, $options=array()) { + $p = new JsonLdProcessor(); + return $p->expand($input, $options); +} + +/** + * Performs JSON-LD flattening. + * + * @param mixed $input the JSON-LD to flatten. + * @param mixed $ctx the context to use to compact the flattened output, or + * null. + * @param [options] the options to use: + * [base] the base IRI to use. + * [documentLoader(url)] the document loader. + * + * @return mixed the flattened JSON-LD output. + */ +function jsonld_flatten($input, $ctx, $options=array()) { + $p = new JsonLdProcessor(); + return $p->flatten($input, $ctx, $options); +} + +/** + * Performs JSON-LD framing. + * + * @param mixed $input the JSON-LD object to frame. + * @param stdClass $frame the JSON-LD frame to use. + * @param assoc [$options] the framing options. + * [base] the base IRI to use. + * [embed] default @embed flag (default: true). + * [explicit] default @explicit flag (default: false). + * [requireAll] default @requireAll flag (default: true). + * [omitDefault] default @omitDefault flag (default: false). + * [documentLoader(url)] the document loader. + * + * @return stdClass the framed JSON-LD output. + */ +function jsonld_frame($input, $frame, $options=array()) { + $p = new JsonLdProcessor(); + return $p->frame($input, $frame, $options); +} + +/** + * **Experimental** + * + * Links a JSON-LD document's nodes in memory. + * + * @param mixed $input the JSON-LD document to link. + * @param mixed $ctx the JSON-LD context to apply or null. + * @param assoc [$options] the options to use: + * [base] the base IRI to use. + * [expandContext] a context to expand with. + * [documentLoader(url)] the document loader. + * + * @return the linked JSON-LD output. + */ +function jsonld_link($input, $ctx, $options) { + // API matches running frame with a wildcard frame and embed: '@link' + // get arguments + $frame = new stdClass(); + if($ctx) { + $frame->{'@context'} = $ctx; + } + $frame->{'@embed'} = '@link'; + return jsonld_frame($input, $frame, $options); +}; + +/** + * Performs RDF dataset normalization on the given input. The input is + * JSON-LD unless the 'inputFormat' option is used. The output is an RDF + * dataset unless the 'format' option is used. + * + * @param mixed $input the JSON-LD object to normalize. + * @param assoc [$options] the options to use: + * [base] the base IRI to use. + * [intputFormat] the format if input is not JSON-LD: + * 'application/nquads' for N-Quads. + * [format] the format if output is a string: + * 'application/nquads' for N-Quads. + * [documentLoader(url)] the document loader. + * + * @return mixed the normalized output. + */ +function jsonld_normalize($input, $options=array()) { + $p = new JsonLdProcessor(); + return $p->normalize($input, $options); +} + +/** + * Converts an RDF dataset to JSON-LD. + * + * @param mixed $input a serialized string of RDF in a format specified + * by the format option or an RDF dataset to convert. + * @param assoc [$options] the options to use: + * [format] the format if input not an array: + * 'application/nquads' for N-Quads (default). + * [useRdfType] true to use rdf:type, false to use @type + * (default: false). + * [useNativeTypes] true to convert XSD types into native types + * (boolean, integer, double), false not to (default: false). + * + * @return array the JSON-LD output. + */ +function jsonld_from_rdf($input, $options=array()) { + $p = new JsonLdProcessor(); + return $p->fromRDF($input, $options); +} + +/** + * Outputs the RDF dataset found in the given JSON-LD object. + * + * @param mixed $input the JSON-LD object. + * @param assoc [$options] the options to use: + * [base] the base IRI to use. + * [format] the format to use to output a string: + * 'application/nquads' for N-Quads. + * [produceGeneralizedRdf] true to output generalized RDF, false + * to produce only standard RDF (default: false). + * [documentLoader(url)] the document loader. + * + * @return mixed the resulting RDF dataset (or a serialization of it). + */ +function jsonld_to_rdf($input, $options=array()) { + $p = new JsonLdProcessor(); + return $p->toRDF($input, $options); +} + +/** + * JSON-encodes (with unescaped slashes) the given stdClass or array. + * + * @param mixed $input the native PHP stdClass or array which will be + * converted to JSON by json_encode(). + * @param int $options the options to use. + * [JSON_PRETTY_PRINT] pretty print. + * @param int $depth the maximum depth to use. + * + * @return the encoded JSON data. + */ +function jsonld_encode($input, $options=0, $depth=512) { + // newer PHP has a flag to avoid escaped '/' + if(defined('JSON_UNESCAPED_SLASHES')) { + return json_encode($input, JSON_UNESCAPED_SLASHES | $options, $depth); + } + // use a simple string replacement of '\/' to '/'. + return str_replace('\\/', '/', json_encode($input, $options, $depth)); +} + +/** + * Decodes a serialized JSON-LD object. + * + * @param string $input the JSON-LD input. + * + * @return mixed the resolved JSON-LD object, null on error. + */ +function jsonld_decode($input) { + return json_decode($input); +} + +/** + * Parses a link header. The results will be key'd by the value of "rel". + * + * Link: <http://json-ld.org/contexts/person.jsonld>; rel="http://www.w3.org/ns/json-ld#context"; type="application/ld+json" + * + * Parses as: { + * 'http://www.w3.org/ns/json-ld#context': { + * target: http://json-ld.org/contexts/person.jsonld, + * type: 'application/ld+json' + * } + * } + * + * If there is more than one "rel" with the same IRI, then entries in the + * resulting map for that "rel" will be arrays of objects, otherwise they will + * be single objects. + * + * @param string $header the link header to parse. + * + * @return assoc the parsed result. + */ +function jsonld_parse_link_header($header) { + $rval = array(); + // split on unbracketed/unquoted commas + if(!preg_match_all( + '/(?:<[^>]*?>|"[^"]*?"|[^,])+/', $header, $entries, PREG_SET_ORDER)) { + return $rval; + } + $r_link_header = '/\s*<([^>]*?)>\s*(?:;\s*(.*))?/'; + foreach($entries as $entry) { + if(!preg_match($r_link_header, $entry[0], $match)) { + continue; + } + $result = (object)array('target' => $match[1]); + $params = $match[2]; + $r_params = '/(.*?)=(?:(?:"([^"]*?)")|([^"]*?))\s*(?:(?:;\s*)|$)/'; + preg_match_all($r_params, $params, $matches, PREG_SET_ORDER); + foreach($matches as $match) { + $result->{$match[1]} = $match[2] ?: $match[3]; + } + $rel = property_exists($result, 'rel') ? $result->rel : ''; + if(!isset($rval[$rel])) { + $rval[$rel] = $result; + } else if(is_array($rval[$rel])) { + $rval[$rel][] = $result; + } else { + $rval[$rel] = array($rval[$rel], $result); + } + } + return $rval; +} + +/** + * Relabels all blank nodes in the given JSON-LD input. + * + * @param mixed input the JSON-LD input. + */ +function jsonld_relabel_blank_nodes($input) { + $p = new JsonLdProcessor(); + return $p->_labelBlankNodes(new UniqueNamer('_:b'), $input); +} + +/** JSON-LD shared in-memory cache. */ +global $jsonld_cache; +$jsonld_cache = new stdClass(); + +/** The default active context cache. */ +$jsonld_cache->activeCtx = new ActiveContextCache(); + +/** Stores the default JSON-LD document loader. */ +global $jsonld_default_load_document; +$jsonld_default_load_document = 'jsonld_default_document_loader'; + +/** + * Sets the default JSON-LD document loader. + * + * @param callable load_document(url) the document loader. + */ +function jsonld_set_document_loader($load_document) { + global $jsonld_default_load_document; + $jsonld_default_load_document = $load_document; +} + +/** + * Retrieves JSON-LD at the given URL. + * + * @param string $url the URL to retrieve. + * + * @return the JSON-LD. + */ +function jsonld_get_url($url) { + global $jsonld_default_load_document; + if($jsonld_default_load_document !== null) { + $document_loader = $jsonld_default_load_document; + } else { + $document_loader = 'jsonld_default_document_loader'; + } + + $remote_doc = call_user_func($document_loader, $url); + if($remote_doc) { + return $remote_doc->document; + } + return null; +} + +/** + * The default implementation to retrieve JSON-LD at the given URL. + * + * @param string $url the URL to to retrieve. + * + * @return stdClass the RemoteDocument object. + */ +function jsonld_default_document_loader($url) { + $doc = (object)array( + 'contextUrl' => null, 'document' => null, 'documentUrl' => $url); + $redirects = array(); + + $opts = array( + 'http' => array( + 'method' => 'GET', + 'header' => + "Accept: application/ld+json\r\n"), + /* Note: Use jsonld_default_secure_document_loader for security. */ + 'ssl' => array( + 'verify_peer' => false, + 'allow_self_signed' => true) + ); + + $context = stream_context_create($opts); + $content_type = null; + stream_context_set_params($context, array('notification' => + function($notification_code, $severity, $message) use ( + &$redirects, &$content_type) { + switch($notification_code) { + case STREAM_NOTIFY_REDIRECTED: + $redirects[] = $message; + break; + case STREAM_NOTIFY_MIME_TYPE_IS: + $content_type = $message; + break; + }; + })); + $result = @file_get_contents($url, false, $context); + if($result === false) { + throw new JsonLdException( + 'Could not retrieve a JSON-LD document from the URL: ' . $url, + 'jsonld.LoadDocumentError', 'loading document failed'); + } + $link_header = array(); + foreach($http_response_header as $header) { + if(strpos($header, 'link') === 0) { + $value = explode(': ', $header); + if(count($value) > 1) { + $link_header[] = $value[1]; + } + } + } + $link_header = jsonld_parse_link_header(join(',', $link_header)); + if(isset($link_header['http://www.w3.org/ns/json-ld#context'])) { + $link_header = $link_header['http://www.w3.org/ns/json-ld#context']; + } else { + $link_header = null; + } + if($link_header && $content_type !== 'application/ld+json') { + // only 1 related link header permitted + if(is_array($link_header)) { + throw new JsonLdException( + 'URL could not be dereferenced, it has more than one ' . + 'associated HTTP Link Header.', 'jsonld.LoadDocumentError', + 'multiple context link headers', array('url' => $url)); + } + $doc->{'contextUrl'} = $link_header->target; + } + + // update document url based on redirects + $redirs = count($redirects); + if($redirs > 0) { + $url = $redirects[$redirs - 1]; + } + $doc->document = $result; + $doc->documentUrl = $url; + return $doc; +} + +/** + * The default implementation to retrieve JSON-LD at the given secure URL. + * + * @param string $url the secure URL to to retrieve. + * + * @return stdClass the RemoteDocument object. + */ +function jsonld_default_secure_document_loader($url) { + if(strpos($url, 'https') !== 0) { + throw new JsonLdException( + "Could not GET url: '$url'; 'https' is required.", + 'jsonld.LoadDocumentError', 'loading document failed'); + } + + $doc = (object)array( + 'contextUrl' => null, 'document' => null, 'documentUrl' => $url); + $redirects = array(); + + // default JSON-LD https GET implementation + $opts = array( + 'http' => array( + 'method' => 'GET', + 'header' => + "Accept: application/ld+json\r\n"), + 'ssl' => array( + 'verify_peer' => true, + 'allow_self_signed' => false, + 'cafile' => '/etc/ssl/certs/ca-certificates.crt')); + $context = stream_context_create($opts); + $content_type = null; + stream_context_set_params($context, array('notification' => + function($notification_code, $severity, $message) use ( + &$redirects, &$content_type) { + switch($notification_code) { + case STREAM_NOTIFY_REDIRECTED: + $redirects[] = $message; + break; + case STREAM_NOTIFY_MIME_TYPE_IS: + $content_type = $message; + break; + }; + })); + $result = @file_get_contents($url, false, $context); + if($result === false) { + throw new JsonLdException( + 'Could not retrieve a JSON-LD document from the URL: ' + $url, + 'jsonld.LoadDocumentError', 'loading document failed'); + } + $link_header = array(); + foreach($http_response_header as $header) { + if(strpos($header, 'link') === 0) { + $value = explode(': ', $header); + if(count($value) > 1) { + $link_header[] = $value[1]; + } + } + } + $link_header = jsonld_parse_link_header(join(',', $link_header)); + if(isset($link_header['http://www.w3.org/ns/json-ld#context'])) { + $link_header = $link_header['http://www.w3.org/ns/json-ld#context']; + } else { + $link_header = null; + } + if($link_header && $content_type !== 'application/ld+json') { + // only 1 related link header permitted + if(is_array($link_header)) { + throw new JsonLdException( + 'URL could not be dereferenced, it has more than one ' . + 'associated HTTP Link Header.', 'jsonld.LoadDocumentError', + 'multiple context link headers', array('url' => $url)); + } + $doc->{'contextUrl'} = $link_header->target; + } + + // update document url based on redirects + foreach($redirects as $redirect) { + if(strpos($redirect, 'https') !== 0) { + throw new JsonLdException( + "Could not GET redirected url: '$redirect'; 'https' is required.", + 'jsonld.LoadDocumentError', 'loading document failed'); + } + $url = $redirect; + } + $doc->document = $result; + $doc->documentUrl = $url; + return $doc; +} + +/** Registered global RDF dataset parsers hashed by content-type. */ +global $jsonld_rdf_parsers; +$jsonld_rdf_parsers = new stdClass(); + +/** + * Registers a global RDF dataset parser by content-type, for use with + * jsonld_from_rdf. Global parsers will be used by JsonLdProcessors that do + * not register their own parsers. + * + * @param string $content_type the content-type for the parser. + * @param callable $parser(input) the parser function (takes a string as + * a parameter and returns an RDF dataset). + */ +function jsonld_register_rdf_parser($content_type, $parser) { + global $jsonld_rdf_parsers; + $jsonld_rdf_parsers->{$content_type} = $parser; +} + +/** + * Unregisters a global RDF dataset parser by content-type. + * + * @param string $content_type the content-type for the parser. + */ +function jsonld_unregister_rdf_parser($content_type) { + global $jsonld_rdf_parsers; + if(property_exists($jsonld_rdf_parsers, $content_type)) { + unset($jsonld_rdf_parsers->{$content_type}); + } +} + +/** + * Parses a URL into its component parts. + * + * @param string $url the URL to parse. + * + * @return assoc the parsed URL. + */ +function jsonld_parse_url($url) { + if($url === null) { + $url = ''; + } + + $keys = array( + 'href', 'protocol', 'scheme', '?authority', 'authority', + '?auth', 'auth', 'user', 'pass', 'host', '?port', 'port', 'path', + '?query', 'query', '?fragment', 'fragment'); + $regex = "/^(([^:\/?#]+):)?(\/\/(((([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(:(\d*))?))?([^?#]*)(\?([^#]*))?(#(.*))?/"; + preg_match($regex, $url, $match); + + $rval = array(); + $flags = array(); + $len = count($keys); + for($i = 0; $i < $len; ++$i) { + $key = $keys[$i]; + if(strpos($key, '?') === 0) { + $flags[substr($key, 1)] = !empty($match[$i]); + } else if(!isset($match[$i])) { + $rval[$key] = null; + } else { + $rval[$key] = $match[$i]; + } + } + + if(!$flags['authority']) { + $rval['authority'] = null; + } + if(!$flags['auth']) { + $rval['auth'] = $rval['user'] = $rval['pass'] = null; + } + if(!$flags['port']) { + $rval['port'] = null; + } + if(!$flags['query']) { + $rval['query'] = null; + } + if(!$flags['fragment']) { + $rval['fragment'] = null; + } + + $rval['normalizedPath'] = jsonld_remove_dot_segments( + $rval['path'], !!$rval['authority']); + + return $rval; +} + +/** + * Removes dot segments from a URL path. + * + * @param string $path the path to remove dot segments from. + * @param bool $has_authority true if the URL has an authority, false if not. + */ +function jsonld_remove_dot_segments($path, $has_authority) { + $rval = ''; + + if(strpos($path, '/') === 0) { + $rval = '/'; + } + + // RFC 3986 5.2.4 (reworked) + $input = explode('/', $path); + $output = array(); + while(count($input) > 0) { + if($input[0] === '.' || ($input[0] === '' && count($input) > 1)) { + array_shift($input); + continue; + } + if($input[0] === '..') { + array_shift($input); + if($has_authority || + (count($output) > 0 && $output[count($output) - 1] !== '..')) { + array_pop($output); + } else { + // leading relative URL '..' + $output[] = '..'; + } + continue; + } + $output[] = array_shift($input); + } + + return $rval . implode('/', $output); +} + +/** + * Prepends a base IRI to the given relative IRI. + * + * @param mixed $base a string or the parsed base IRI. + * @param string $iri the relative IRI. + * + * @return string the absolute IRI. + */ +function jsonld_prepend_base($base, $iri) { + // skip IRI processing + if($base === null) { + return $iri; + } + + // already an absolute IRI + if(strpos($iri, ':') !== false) { + return $iri; + } + + // parse base if it is a string + if(is_string($base)) { + $base = jsonld_parse_url($base); + } + + // parse given IRI + $rel = jsonld_parse_url($iri); + + // per RFC3986 5.2.2 + $transform = array('protocol' => $base['protocol']); + + if($rel['authority'] !== null) { + $transform['authority'] = $rel['authority']; + $transform['path'] = $rel['path']; + $transform['query'] = $rel['query']; + } else { + $transform['authority'] = $base['authority']; + + if($rel['path'] === '') { + $transform['path'] = $base['path']; + if($rel['query'] !== null) { + $transform['query'] = $rel['query']; + } else { + $transform['query'] = $base['query']; + } + } else { + if(strpos($rel['path'], '/') === 0) { + // IRI represents an absolute path + $transform['path'] = $rel['path']; + } else { + // merge paths + $path = $base['path']; + + // append relative path to the end of the last directory from base + if($rel['path'] !== '') { + $idx = strrpos($path, '/'); + $idx = ($idx === false) ? 0 : $idx + 1; + $path = substr($path, 0, $idx); + if(strlen($path) > 0 && substr($path, -1) !== '/') { + $path .= '/'; + } + $path .= $rel['path']; + } + + $transform['path'] = $path; + } + $transform['query'] = $rel['query']; + } + } + + // remove slashes and dots in path + $transform['path'] = jsonld_remove_dot_segments( + $transform['path'], !!$transform['authority']); + + // construct URL + $rval = $transform['protocol']; + if($transform['authority'] !== null) { + $rval .= '//' . $transform['authority']; + } + $rval .= $transform['path']; + if($transform['query'] !== null) { + $rval .= '?' . $transform['query']; + } + if($rel['fragment'] !== null) { + $rval .= '#' . $rel['fragment']; + } + + // handle empty base + if($rval === '') { + $rval = './'; + } + + return $rval; +} + +/** + * Removes a base IRI from the given absolute IRI. + * + * @param mixed $base the base IRI. + * @param string $iri the absolute IRI. + * + * @return string the relative IRI if relative to base, otherwise the absolute + * IRI. + */ +function jsonld_remove_base($base, $iri) { + // skip IRI processing + if($base === null) { + return $iri; + } + + if(is_string($base)) { + $base = jsonld_parse_url($base); + } + + // establish base root + $root = ''; + if($base['href'] !== '') { + $root .= "{$base['protocol']}//{$base['authority']}"; + } else if(strpos($iri, '//') === false) { + // support network-path reference with empty base + $root .= '//'; + } + + // IRI not relative to base + if($root === '' || strpos($iri, $root) !== 0) { + return $iri; + } + + // remove root from IRI + $rel = jsonld_parse_url(substr($iri, strlen($root))); + + // remove path segments that match (do not remove last segment unless there + // is a hash or query) + $base_segments = explode('/', $base['normalizedPath']); + $iri_segments = explode('/', $rel['normalizedPath']); + $last = ($rel['query'] || $rel['fragment']) ? 0 : 1; + while(count($base_segments) > 0 && count($iri_segments) > $last) { + if($base_segments[0] !== $iri_segments[0]) { + break; + } + array_shift($base_segments); + array_shift($iri_segments); + } + + // use '../' for each non-matching base segment + $rval = ''; + if(count($base_segments) > 0) { + // don't count the last segment (if it ends with '/' last path doesn't + // count and if it doesn't end with '/' it isn't a path) + array_pop($base_segments); + foreach($base_segments as $segment) { + $rval .= '../'; + } + } + + // prepend remaining segments + $rval .= implode('/', $iri_segments); + + // add query and hash + if($rel['query'] !== null) { + $rval .= "?{$rel['query']}"; + } + if($rel['fragment'] !== null) { + $rval .= "#{$rel['fragment']}"; + } + + if($rval === '') { + $rval = './'; + } + + return $rval; +} + + +/** + * A JSON-LD processor. + */ +class JsonLdProcessor { + /** XSD constants */ + const XSD_BOOLEAN = 'http://www.w3.org/2001/XMLSchema#boolean'; + const XSD_DOUBLE = 'http://www.w3.org/2001/XMLSchema#double'; + const XSD_INTEGER = 'http://www.w3.org/2001/XMLSchema#integer'; + const XSD_STRING = 'http://www.w3.org/2001/XMLSchema#string'; + + /** RDF constants */ + const RDF_LIST = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#List'; + const RDF_FIRST = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#first'; + const RDF_REST = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#rest'; + const RDF_NIL = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'; + const RDF_TYPE = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type'; + const RDF_LANGSTRING = + 'http://www.w3.org/1999/02/22-rdf-syntax-ns#langString'; + + /** Restraints */ + const MAX_CONTEXT_URLS = 10; + + /** Processor-specific RDF dataset parsers. */ + protected $rdfParsers = null; + + /** + * Constructs a JSON-LD processor. + */ + public function __construct() {} + + /** + * Performs JSON-LD compaction. + * + * @param mixed $input the JSON-LD object to compact. + * @param mixed $ctx the context to compact with. + * @param assoc $options the compaction options. + * [base] the base IRI to use. + * [compactArrays] true to compact arrays to single values when + * appropriate, false not to (default: true). + * [graph] true to always output a top-level graph (default: false). + * [skipExpansion] true to assume the input is expanded and skip + * expansion, false not to, defaults to false. + * [activeCtx] true to also return the active context used. + * [documentLoader(url)] the document loader. + * + * @return mixed the compacted JSON-LD output. + */ + public function compact($input, $ctx, $options) { + global $jsonld_default_load_document; + + if($ctx === null) { + throw new JsonLdException( + 'The compaction context must not be null.', + 'jsonld.CompactError', 'invalid local context'); + } + + // nothing to compact + if($input === null) { + return null; + } + + self::setdefaults($options, array( + 'base' => is_string($input) ? $input : '', + 'compactArrays' => true, + 'graph' => false, + 'skipExpansion' => false, + 'activeCtx' => false, + 'documentLoader' => $jsonld_default_load_document, + 'link' => false)); + if($options['link']) { + // force skip expansion when linking, "link" is not part of the + // public API, it should only be called from framing + $options['skipExpansion'] = true; + } + + if($options['skipExpansion'] === true) { + $expanded = $input; + } else { + // expand input + try { + $expanded = $this->expand($input, $options); + } catch(JsonLdException $e) { + throw new JsonLdException( + 'Could not expand input before compaction.', + 'jsonld.CompactError', null, null, $e); + } + } + + // process context + $active_ctx = $this->_getInitialContext($options); + try { + $active_ctx = $this->processContext($active_ctx, $ctx, $options); + } catch(JsonLdException $e) { + throw new JsonLdException( + 'Could not process context before compaction.', + 'jsonld.CompactError', null, null, $e); + } + + // do compaction + $compacted = $this->_compact($active_ctx, null, $expanded, $options); + + if($options['compactArrays'] && + !$options['graph'] && is_array($compacted)) { + if(count($compacted) === 1) { + // simplify to a single item + $compacted = $compacted[0]; + } else if(count($compacted) === 0) { + // simplify to an empty object + $compacted = new stdClass(); + } + } else if($options['graph']) { + // always use array if graph option is on + $compacted = self::arrayify($compacted); + } + + // follow @context key + if(is_object($ctx) && property_exists($ctx, '@context')) { + $ctx = $ctx->{'@context'}; + } + + // build output context + $ctx = self::copy($ctx); + $ctx = self::arrayify($ctx); + + // remove empty contexts + $tmp = $ctx; + $ctx = array(); + foreach($tmp as $v) { + if(!is_object($v) || count(array_keys((array)$v)) > 0) { + $ctx[] = $v; + } + } + + // remove array if only one context + $ctx_length = count($ctx); + $has_context = ($ctx_length > 0); + if($ctx_length === 1) { + $ctx = $ctx[0]; + } + + // add context and/or @graph + if(is_array($compacted)) { + // use '@graph' keyword + $kwgraph = $this->_compactIri($active_ctx, '@graph'); + $graph = $compacted; + $compacted = new stdClass(); + if($has_context) { + $compacted->{'@context'} = $ctx; + } + $compacted->{$kwgraph} = $graph; + } else if(is_object($compacted) && $has_context) { + // reorder keys so @context is first + $graph = $compacted; + $compacted = new stdClass(); + $compacted->{'@context'} = $ctx; + foreach($graph as $k => $v) { + $compacted->{$k} = $v; + } + } + + if($options['activeCtx']) { + return array('compacted' => $compacted, 'activeCtx' => $active_ctx); + } + + return $compacted; + } + + /** + * Performs JSON-LD expansion. + * + * @param mixed $input the JSON-LD object to expand. + * @param assoc $options the options to use: + * [base] the base IRI to use. + * [expandContext] a context to expand with. + * [keepFreeFloatingNodes] true to keep free-floating nodes, + * false not to, defaults to false. + * [documentLoader(url)] the document loader. + * + * @return array the expanded JSON-LD output. + */ + public function expand($input, $options) { + global $jsonld_default_load_document; + self::setdefaults($options, array( + 'keepFreeFloatingNodes' => false, + 'documentLoader' => $jsonld_default_load_document)); + + // if input is a string, attempt to dereference remote document + if(is_string($input)) { + $remote_doc = call_user_func($options['documentLoader'], $input); + } else { + $remote_doc = (object)array( + 'contextUrl' => null, + 'documentUrl' => null, + 'document' => $input); + } + + try { + if($remote_doc->document === null) { + throw new JsonLdException( + 'No remote document found at the given URL.', + 'jsonld.NullRemoteDocument'); + } + if(is_string($remote_doc->document)) { + $remote_doc->document = self::_parse_json($remote_doc->document); + } + } catch(Exception $e) { + throw new JsonLdException( + 'Could not retrieve a JSON-LD document from the URL.', + 'jsonld.LoadDocumentError', 'loading document failed', + array('remoteDoc' => $remote_doc), $e); + } + + // set default base + self::setdefault($options, 'base', $remote_doc->documentUrl ?: ''); + + // build meta-object and retrieve all @context urls + $input = (object)array( + 'document' => self::copy($remote_doc->document), + 'remoteContext' => (object)array( + '@context' => $remote_doc->contextUrl)); + if(isset($options['expandContext'])) { + $expand_context = self::copy($options['expandContext']); + if(is_object($expand_context) && + property_exists($expand_context, '@context')) { + $input->expandContext = $expand_context; + } else { + $input->expandContext = (object)array('@context' => $expand_context); + } + } + + // retrieve all @context URLs in the input + try { + $this->_retrieveContextUrls( + $input, new stdClass(), $options['documentLoader'], $options['base']); + } catch(Exception $e) { + throw new JsonLdException( + 'Could not perform JSON-LD expansion.', + 'jsonld.ExpandError', null, null, $e); + } + + $active_ctx = $this->_getInitialContext($options); + $document = $input->document; + $remote_context = $input->remoteContext->{'@context'}; + + // process optional expandContext + if(property_exists($input, 'expandContext')) { + $active_ctx = self::_processContext( + $active_ctx, $input->expandContext, $options); + } + + // process remote context from HTTP Link Header + if($remote_context) { + $active_ctx = self::_processContext( + $active_ctx, $remote_context, $options); + } + + // do expansion + $expanded = $this->_expand($active_ctx, null, $document, $options, false); + + // optimize away @graph with no other properties + if(is_object($expanded) && property_exists($expanded, '@graph') && + count(array_keys((array)$expanded)) === 1) { + $expanded = $expanded->{'@graph'}; + } else if($expanded === null) { + $expanded = array(); + } + // normalize to an array + return self::arrayify($expanded); + } + + /** + * Performs JSON-LD flattening. + * + * @param mixed $input the JSON-LD to flatten. + * @param ctx the context to use to compact the flattened output, or null. + * @param assoc $options the options to use: + * [base] the base IRI to use. + * [expandContext] a context to expand with. + * [documentLoader(url)] the document loader. + * + * @return array the flattened output. + */ + public function flatten($input, $ctx, $options) { + global $jsonld_default_load_document; + self::setdefaults($options, array( + 'base' => is_string($input) ? $input : '', + 'documentLoader' => $jsonld_default_load_document)); + + try { + // expand input + $expanded = $this->expand($input, $options); + } catch(Exception $e) { + throw new JsonLdException( + 'Could not expand input before flattening.', + 'jsonld.FlattenError', null, null, $e); + } + + // do flattening + $flattened = $this->_flatten($expanded); + + if($ctx === null) { + return $flattened; + } + + // compact result (force @graph option to true, skip expansion) + $options['graph'] = true; + $options['skipExpansion'] = true; + try { + $compacted = $this->compact($flattened, $ctx, $options); + } catch(Exception $e) { + throw new JsonLdException( + 'Could not compact flattened output.', + 'jsonld.FlattenError', null, null, $e); + } + + return $compacted; + } + + /** + * Performs JSON-LD framing. + * + * @param mixed $input the JSON-LD object to frame. + * @param stdClass $frame the JSON-LD frame to use. + * @param $options the framing options. + * [base] the base IRI to use. + * [expandContext] a context to expand with. + * [embed] default @embed flag: '@last', '@always', '@never', '@link' + * (default: '@last'). + * [explicit] default @explicit flag (default: false). + * [requireAll] default @requireAll flag (default: true). + * [omitDefault] default @omitDefault flag (default: false). + * [documentLoader(url)] the document loader. + * + * @return stdClass the framed JSON-LD output. + */ + public function frame($input, $frame, $options) { + global $jsonld_default_load_document; + self::setdefaults($options, array( + 'base' => is_string($input) ? $input : '', + 'compactArrays' => true, + 'embed' => '@last', + 'explicit' => false, + 'requireAll' => true, + 'omitDefault' => false, + 'documentLoader' => $jsonld_default_load_document)); + + // if frame is a string, attempt to dereference remote document + if(is_string($frame)) { + $remote_frame = call_user_func($options['documentLoader'], $frame); + } else { + $remote_frame = (object)array( + 'contextUrl' => null, + 'documentUrl' => null, + 'document' => $frame); + } + + try { + if($remote_frame->document === null) { + throw new JsonLdException( + 'No remote document found at the given URL.', + 'jsonld.NullRemoteDocument'); + } + if(is_string($remote_frame->document)) { + $remote_frame->document = self::_parse_json($remote_frame->document); + } + } catch(Exception $e) { + throw new JsonLdException( + 'Could not retrieve a JSON-LD document from the URL.', + 'jsonld.LoadDocumentError', 'loading document failed', + array('remoteDoc' => $remote_frame), $e); + } + + // preserve frame context + $frame = $remote_frame->document; + if($frame !== null) { + $ctx = (property_exists($frame, '@context') ? + $frame->{'@context'} : new stdClass()); + if($remote_frame->contextUrl !== null) { + if($ctx !== null) { + $ctx = $remote_frame->contextUrl; + } else { + $ctx = self::arrayify($ctx); + $ctx[] = $remote_frame->contextUrl; + } + $frame->{'@context'} = $ctx; + } + } + + try { + // expand input + $expanded = $this->expand($input, $options); + } catch(Exception $e) { + throw new JsonLdException( + 'Could not expand input before framing.', + 'jsonld.FrameError', null, null, $e); + } + + try { + // expand frame + $opts = $options; + $opts['keepFreeFloatingNodes'] = true; + $expanded_frame = $this->expand($frame, $opts); + } catch(Exception $e) { + throw new JsonLdException( + 'Could not expand frame before framing.', + 'jsonld.FrameError', null, null, $e); + } + + // do framing + $framed = $this->_frame($expanded, $expanded_frame, $options); + + try { + // compact result (force @graph option to true, skip expansion, check + // for linked embeds) + $options['graph'] = true; + $options['skipExpansion'] = true; + $options['link'] = new ArrayObject(); + $options['activeCtx'] = true; + $result = $this->compact($framed, $ctx, $options); + } catch(Exception $e) { + throw new JsonLdException( + 'Could not compact framed output.', + 'jsonld.FrameError', null, null, $e); + } + + $compacted = $result['compacted']; + $active_ctx = $result['activeCtx']; + + // get graph alias + $graph = $this->_compactIri($active_ctx, '@graph'); + // remove @preserve from results + $options['link'] = new ArrayObject(); + $compacted->{$graph} = $this->_removePreserve( + $active_ctx, $compacted->{$graph}, $options); + return $compacted; + } + + /** + * Performs JSON-LD normalization. + * + * @param mixed $input the JSON-LD object to normalize. + * @param assoc $options the options to use: + * [base] the base IRI to use. + * [expandContext] a context to expand with. + * [inputFormat] the format if input is not JSON-LD: + * 'application/nquads' for N-Quads. + * [format] the format if output is a string: + * 'application/nquads' for N-Quads. + * [documentLoader(url)] the document loader. + * + * @return mixed the normalized output. + */ + public function normalize($input, $options) { + global $jsonld_default_load_document; + self::setdefaults($options, array( + 'base' => is_string($input) ? $input : '', + 'documentLoader' => $jsonld_default_load_document)); + + if(isset($options['inputFormat'])) { + if($options['inputFormat'] != 'application/nquads') { + throw new JsonLdException( + 'Unknown normalization input format.', 'jsonld.NormalizeError'); + } + $dataset = $this->parseNQuads($input); + } else { + try { + // convert to RDF dataset then do normalization + $opts = $options; + if(isset($opts['format'])) { + unset($opts['format']); + } + $opts['produceGeneralizedRdf'] = false; + $dataset = $this->toRDF($input, $opts); + } catch(Exception $e) { + throw new JsonLdException( + 'Could not convert input to RDF dataset before normalization.', + 'jsonld.NormalizeError', null, null, $e); + } + } + + // do normalization + return $this->_normalize($dataset, $options); + } + + /** + * Converts an RDF dataset to JSON-LD. + * + * @param mixed $dataset a serialized string of RDF in a format specified + * by the format option or an RDF dataset to convert. + * @param assoc $options the options to use: + * [format] the format if input is a string: + * 'application/nquads' for N-Quads (default). + * [useRdfType] true to use rdf:type, false to use @type + * (default: false). + * [useNativeTypes] true to convert XSD types into native types + * (boolean, integer, double), false not to (default: false). + * + * @return array the JSON-LD output. + */ + public function fromRDF($dataset, $options) { + global $jsonld_rdf_parsers; + + self::setdefaults($options, array( + 'useRdfType' => false, + 'useNativeTypes' => false)); + + if(!isset($options['format']) && is_string($dataset)) { + // set default format to nquads + $options['format'] = 'application/nquads'; + } + + // handle special format + if(isset($options['format']) && $options['format']) { + // supported formats (processor-specific and global) + if(($this->rdfParsers !== null && + !property_exists($this->rdfParsers, $options['format'])) || + $this->rdfParsers === null && + !property_exists($jsonld_rdf_parsers, $options['format'])) { + throw new JsonLdException( + 'Unknown input format.', + 'jsonld.UnknownFormat', null, array('format' => $options['format'])); + } + if($this->rdfParsers !== null) { + $callable = $this->rdfParsers->{$options['format']}; + } else { + $callable = $jsonld_rdf_parsers->{$options['format']}; + } + $dataset = call_user_func($callable, $dataset); + } + + // convert from RDF + return $this->_fromRDF($dataset, $options); + } + + /** + * Outputs the RDF dataset found in the given JSON-LD object. + * + * @param mixed $input the JSON-LD object. + * @param assoc $options the options to use: + * [base] the base IRI to use. + * [expandContext] a context to expand with. + * [format] the format to use to output a string: + * 'application/nquads' for N-Quads. + * [produceGeneralizedRdf] true to output generalized RDF, false + * to produce only standard RDF (default: false). + * [documentLoader(url)] the document loader. + * + * @return mixed the resulting RDF dataset (or a serialization of it). + */ + public function toRDF($input, $options) { + global $jsonld_default_load_document; + self::setdefaults($options, array( + 'base' => is_string($input) ? $input : '', + 'produceGeneralizedRdf' => false, + 'documentLoader' => $jsonld_default_load_document)); + + try { + // expand input + $expanded = $this->expand($input, $options); + } catch(JsonLdException $e) { + throw new JsonLdException( + 'Could not expand input before serialization to RDF.', + 'jsonld.RdfError', null, null, $e); + } + + // create node map for default graph (and any named graphs) + $namer = new UniqueNamer('_:b'); + $node_map = (object)array('@default' => new stdClass()); + $this->_createNodeMap($expanded, $node_map, '@default', $namer); + + // output RDF dataset + $dataset = new stdClass(); + $graph_names = array_keys((array)$node_map); + sort($graph_names); + foreach($graph_names as $graph_name) { + $graph = $node_map->{$graph_name}; + // skip relative IRIs + if($graph_name === '@default' || self::_isAbsoluteIri($graph_name)) { + $dataset->{$graph_name} = $this->_graphToRDF($graph, $namer, $options); + } + } + + $rval = $dataset; + + // convert to output format + if(isset($options['format']) && $options['format']) { + // supported formats + if($options['format'] === 'application/nquads') { + $rval = self::toNQuads($dataset); + } else { + throw new JsonLdException( + 'Unknown output format.', 'jsonld.UnknownFormat', + null, array('format' => $options['format'])); + } + } + + return $rval; + } + + /** + * Processes a local context, resolving any URLs as necessary, and returns a + * new active context in its callback. + * + * @param stdClass $active_ctx the current active context. + * @param mixed $local_ctx the local context to process. + * @param assoc $options the options to use: + * [documentLoader(url)] the document loader. + * + * @return stdClass the new active context. + */ + public function processContext($active_ctx, $local_ctx, $options) { + global $jsonld_default_load_document; + self::setdefaults($options, array( + 'base' => '', + 'documentLoader' => $jsonld_default_load_document)); + + // return initial context early for null context + if($local_ctx === null) { + return $this->_getInitialContext($options); + } + + // retrieve URLs in local_ctx + $local_ctx = self::copy($local_ctx); + if(is_string($local_ctx) or ( + is_object($local_ctx) && !property_exists($local_ctx, '@context'))) { + $local_ctx = (object)array('@context' => $local_ctx); + } + try { + $this->_retrieveContextUrls( + $local_ctx, new stdClass(), + $options['documentLoader'], $options['base']); + } catch(Exception $e) { + throw new JsonLdException( + 'Could not process JSON-LD context.', + 'jsonld.ContextError', null, null, $e); + } + + // process context + return $this->_processContext($active_ctx, $local_ctx, $options); + } + + /** + * Returns true if the given subject has the given property. + * + * @param stdClass $subject the subject to check. + * @param string $property the property to look for. + * + * @return bool true if the subject has the given property, false if not. + */ + public static function hasProperty($subject, $property) { + $rval = false; + if(property_exists($subject, $property)) { + $value = $subject->{$property}; + $rval = (!is_array($value) || count($value) > 0); + } + return $rval; + } + + /** + * Determines if the given value is a property of the given subject. + * + * @param stdClass $subject the subject to check. + * @param string $property the property to check. + * @param mixed $value the value to check. + * + * @return bool true if the value exists, false if not. + */ + public static function hasValue($subject, $property, $value) { + $rval = false; + if(self::hasProperty($subject, $property)) { + $val = $subject->{$property}; + $is_list = self::_isList($val); + if(is_array($val) || $is_list) { + if($is_list) { + $val = $val->{'@list'}; + } + foreach($val as $v) { + if(self::compareValues($value, $v)) { + $rval = true; + break; + } + } + } else if(!is_array($value)) { + // avoid matching the set of values with an array value parameter + $rval = self::compareValues($value, $val); + } + } + return $rval; + } + + /** + * Adds a value to a subject. If the value is an array, all values in the + * array will be added. + * + * Note: If the value is a subject that already exists as a property of the + * given subject, this method makes no attempt to deeply merge properties. + * Instead, the value will not be added. + * + * @param stdClass $subject the subject to add the value to. + * @param string $property the property that relates the value to the subject. + * @param mixed $value the value to add. + * @param assoc [$options] the options to use: + * [propertyIsArray] true if the property is always an array, false + * if not (default: false). + * [allowDuplicate] true to allow duplicates, false not to (uses a + * simple shallow comparison of subject ID or value) + * (default: true). + */ + public static function addValue( + $subject, $property, $value, $options=array()) { + self::setdefaults($options, array( + 'allowDuplicate' => true, + 'propertyIsArray' => false)); + + if(is_array($value)) { + if(count($value) === 0 && $options['propertyIsArray'] && + !property_exists($subject, $property)) { + $subject->{$property} = array(); + } + foreach($value as $v) { + self::addValue($subject, $property, $v, $options); + } + } else if(property_exists($subject, $property)) { + // check if subject already has value if duplicates not allowed + $has_value = (!$options['allowDuplicate'] && + self::hasValue($subject, $property, $value)); + + // make property an array if value not present or always an array + if(!is_array($subject->{$property}) && + (!$has_value || $options['propertyIsArray'])) { + $subject->{$property} = array($subject->{$property}); + } + + // add new value + if(!$has_value) { + $subject->{$property}[] = $value; + } + } else { + // add new value as set or single value + $subject->{$property} = ($options['propertyIsArray'] ? + array($value) : $value); + } + } + + /** + * Gets all of the values for a subject's property as an array. + * + * @param stdClass $subject the subject. + * @param string $property the property. + * + * @return array all of the values for a subject's property as an array. + */ + public static function getValues($subject, $property) { + $rval = (property_exists($subject, $property) ? + $subject->{$property} : array()); + return self::arrayify($rval); + } + + /** + * Removes a property from a subject. + * + * @param stdClass $subject the subject. + * @param string $property the property. + */ + public static function removeProperty($subject, $property) { + unset($subject->{$property}); + } + + /** + * Removes a value from a subject. + * + * @param stdClass $subject the subject. + * @param string $property the property that relates the value to the subject. + * @param mixed $value the value to remove. + * @param assoc [$options] the options to use: + * [propertyIsArray] true if the property is always an array, + * false if not (default: false). + */ + public static function removeValue( + $subject, $property, $value, $options=array()) { + self::setdefaults($options, array( + 'propertyIsArray' => false)); + + // filter out value + $filter = function($e) use ($value) { + return !self::compareValues($e, $value); + }; + $values = self::getValues($subject, $property); + $values = array_values(array_filter($values, $filter)); + + if(count($values) === 0) { + self::removeProperty($subject, $property); + } else if(count($values) === 1 && !$options['propertyIsArray']) { + $subject->{$property} = $values[0]; + } else { + $subject->{$property} = $values; + } + } + + /** + * Compares two JSON-LD values for equality. Two JSON-LD values will be + * considered equal if: + * + * 1. They are both primitives of the same type and value. + * 2. They are both @values with the same @value, @type, @language, + * and @index, OR + * 3. They both have @ids that are the same. + * + * @param mixed $v1 the first value. + * @param mixed $v2 the second value. + * + * @return bool true if v1 and v2 are considered equal, false if not. + */ + public static function compareValues($v1, $v2) { + // 1. equal primitives + if($v1 === $v2) { + return true; + } + + // 2. equal @values + if(self::_isValue($v1) && self::_isValue($v2)) { + return ( + self::_compareKeyValues($v1, $v2, '@value') && + self::_compareKeyValues($v1, $v2, '@type') && + self::_compareKeyValues($v1, $v2, '@language') && + self::_compareKeyValues($v1, $v2, '@index')); + } + + // 3. equal @ids + if(is_object($v1) && property_exists($v1, '@id') && + is_object($v2) && property_exists($v2, '@id')) { + return $v1->{'@id'} === $v2->{'@id'}; + } + + return false; + } + + /** + * Gets the value for the given active context key and type, null if none is + * set. + * + * @param stdClass $ctx the active context. + * @param string $key the context key. + * @param string [$type] the type of value to get (eg: '@id', '@type'), if not + * specified gets the entire entry for a key, null if not found. + * + * @return mixed the value. + */ + public static function getContextValue($ctx, $key, $type) { + $rval = null; + + // return null for invalid key + if($key === null) { + return $rval; + } + + // get default language + if($type === '@language' && property_exists($ctx, $type)) { + $rval = $ctx->{$type}; + } + + // get specific entry information + if(property_exists($ctx->mappings, $key)) { + $entry = $ctx->mappings->{$key}; + if($entry === null) { + return null; + } + + if($type === null) { + // return whole entry + $rval = $entry; + } else if(property_exists($entry, $type)) { + // return entry value for type + $rval = $entry->{$type}; + } + } + + return $rval; + } + + /** + * Parses RDF in the form of N-Quads. + * + * @param string $input the N-Quads input to parse. + * + * @return stdClass an RDF dataset. + */ + public static function parseNQuads($input) { + // define partial regexes + $iri = '(?:<([^:]+:[^>]*)>)'; + $bnode = '(_:(?:[A-Za-z][A-Za-z0-9]*))'; + $plain = '"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"'; + $datatype = "(?:\\^\\^$iri)"; + $language = '(?:@([a-z]+(?:-[a-z0-9]+)*))'; + $literal = "(?:$plain(?:$datatype|$language)?)"; + $ws = '[ \\t]'; + $eoln = '/(?:\r\n)|(?:\n)|(?:\r)/'; + $empty = "/^$ws*$/"; + + // define quad part regexes + $subject = "(?:$iri|$bnode)$ws+"; + $property = "$iri$ws+"; + $object = "(?:$iri|$bnode|$literal)$ws*"; + $graph_name = "(?:\\.|(?:(?:$iri|$bnode)$ws*\\.))"; + + // full quad regex + $quad = "/^$ws*$subject$property$object$graph_name$ws*$/"; + + // build RDF dataset + $dataset = new stdClass(); + + // split N-Quad input into lines + $lines = preg_split($eoln, $input); + $line_number = 0; + foreach($lines as $line) { + $line_number += 1; + + // skip empty lines + if(preg_match($empty, $line)) { + continue; + } + + // parse quad + if(!preg_match($quad, $line, $match)) { + throw new JsonLdException( + 'Error while parsing N-Quads; invalid quad.', + 'jsonld.ParseError', null, array('line' => $line_number)); + } + + // create RDF triple + $triple = (object)array( + 'subject' => new stdClass(), + 'predicate' => new stdClass(), + 'object' => new stdClass()); + + // get subject + if($match[1] !== '') { + $triple->subject->type = 'IRI'; + $triple->subject->value = $match[1]; + } else { + $triple->subject->type = 'blank node'; + $triple->subject->value = $match[2]; + } + + // get predicate + $triple->predicate->type = 'IRI'; + $triple->predicate->value = $match[3]; + + // get object + if($match[4] !== '') { + $triple->object->type = 'IRI'; + $triple->object->value = $match[4]; + } else if($match[5] !== '') { + $triple->object->type = 'blank node'; + $triple->object->value = $match[5]; + } else { + $triple->object->type = 'literal'; + $unescaped = str_replace( + array('\"', '\t', '\n', '\r', '\\\\'), + array('"', "\t", "\n", "\r", '\\'), + $match[6]); + if(isset($match[7]) && $match[7] !== '') { + $triple->object->datatype = $match[7]; + } else if(isset($match[8]) && $match[8] !== '') { + $triple->object->datatype = self::RDF_LANGSTRING; + $triple->object->language = $match[8]; + } else { + $triple->object->datatype = self::XSD_STRING; + } + $triple->object->value = $unescaped; + } + + // get graph name ('@default' is used for the default graph) + $name = '@default'; + if(isset($match[9]) && $match[9] !== '') { + $name = $match[9]; + } else if(isset($match[10]) && $match[10] !== '') { + $name = $match[10]; + } + + // initialize graph in dataset + if(!property_exists($dataset, $name)) { + $dataset->{$name} = array($triple); + } else { + // add triple if unique to its graph + $unique = true; + $triples = &$dataset->{$name}; + foreach($triples as $t) { + if(self::_compareRDFTriples($t, $triple)) { + $unique = false; + break; + } + } + if($unique) { + $triples[] = $triple; + } + } + } + + return $dataset; + } + + /** + * Converts an RDF dataset to N-Quads. + * + * @param stdClass $dataset the RDF dataset to convert. + * + * @return string the N-Quads string. + */ + public static function toNQuads($dataset) { + $quads = array(); + foreach($dataset as $graph_name => $triples) { + foreach($triples as $triple) { + if($graph_name === '@default') { + $graph_name = null; + } + $quads[] = self::toNQuad($triple, $graph_name); + } + } + sort($quads); + return implode($quads); + } + + /** + * Converts an RDF triple and graph name to an N-Quad string (a single quad). + * + * @param stdClass $triple the RDF triple to convert. + * @param mixed $graph_name the name of the graph containing the triple, null + * for the default graph. + * @param string $bnode the bnode the quad is mapped to (optional, for + * use during normalization only). + * + * @return string the N-Quad string. + */ + public static function toNQuad($triple, $graph_name, $bnode=null) { + $s = $triple->subject; + $p = $triple->predicate; + $o = $triple->object; + $g = $graph_name; + + $quad = ''; + + // subject is an IRI + if($s->type === 'IRI') { + $quad .= "<{$s->value}>"; + } else if($bnode !== null) { + // bnode normalization mode + $quad .= ($s->value === $bnode) ? '_:a' : '_:z'; + } else { + // bnode normal mode + $quad .= $s->value; + } + $quad .= ' '; + + // predicate is an IRI + if($p->type === 'IRI') { + $quad .= "<{$p->value}>"; + } else if($bnode !== null) { + // FIXME: TBD what to do with bnode predicates during normalization + // bnode normalization mode + $quad .= '_:p'; + } else { + // bnode normal mode + $quad .= $p->value; + } + $quad .= ' '; + + // object is IRI, bnode, or literal + if($o->type === 'IRI') { + $quad .= "<{$o->value}>"; + } else if($o->type === 'blank node') { + if($bnode !== null) { + // normalization mode + $quad .= ($o->value === $bnode) ? '_:a' : '_:z'; + } else { + // normal mode + $quad .= $o->value; + } + } else { + $escaped = str_replace( + array('\\', "\t", "\n", "\r", '"'), + array('\\\\', '\t', '\n', '\r', '\"'), + $o->value); + $quad .= '"' . $escaped . '"'; + if($o->datatype === self::RDF_LANGSTRING) { + if($o->language) { + $quad .= "@{$o->language}"; + } + } else if($o->datatype !== self::XSD_STRING) { + $quad .= "^^<{$o->datatype}>"; + } + } + + // graph + if($g !== null) { + if(strpos($g, '_:') !== 0) { + $quad .= " <$g>"; + } else if($bnode) { + $quad .= ' _:g'; + } else { + $quad .= " $g"; + } + } + + $quad .= " .\n"; + return $quad; + } + + /** + * Registers a processor-specific RDF dataset parser by content-type. + * Global parsers will no longer be used by this processor. + * + * @param string $content_type the content-type for the parser. + * @param callable $parser(input) the parser function (takes a string as + * a parameter and returns an RDF dataset). + */ + public function registerRDFParser($content_type, $parser) { + if($this->rdfParsers === null) { + $this->rdfParsers = new stdClass(); + } + $this->rdfParsers->{$content_type} = $parser; + } + + /** + * Unregisters a process-specific RDF dataset parser by content-type. If + * there are no remaining processor-specific parsers, then the global + * parsers will be re-enabled. + * + * @param string $content_type the content-type for the parser. + */ + public function unregisterRDFParser($content_type) { + if($this->rdfParsers !== null && + property_exists($this->rdfParsers, $content_type)) { + unset($this->rdfParsers->{$content_type}); + if(count(get_object_vars($content_type)) === 0) { + $this->rdfParsers = null; + } + } + } + + /** + * If $value is an array, returns $value, otherwise returns an array + * containing $value as the only element. + * + * @param mixed $value the value. + * + * @return array an array. + */ + public static function arrayify($value) { + return is_array($value) ? $value : array($value); + } + + /** + * Clones an object, array, or string/number. + * + * @param mixed $value the value to clone. + * + * @return mixed the cloned value. + */ + public static function copy($value) { + if(is_object($value) || is_array($value)) { + return unserialize(serialize($value)); + } + return $value; + } + + /** + * Sets the value of a key for the given array if that property + * has not already been set. + * + * @param &assoc $arr the object to update. + * @param string $key the key to update. + * @param mixed $value the value to set. + */ + public static function setdefault(&$arr, $key, $value) { + isset($arr[$key]) or $arr[$key] = $value; + } + + /** + * Sets default values for keys in the given array. + * + * @param &assoc $arr the object to update. + * @param assoc $defaults the default keys and values. + */ + public static function setdefaults(&$arr, $defaults) { + foreach($defaults as $key => $value) { + self::setdefault($arr, $key, $value); + } + } + + /** + * Recursively compacts an element using the given active context. All values + * must be in expanded form before this method is called. + * + * @param stdClass $active_ctx the active context to use. + * @param mixed $active_property the compacted property with the element + * to compact, null for none. + * @param mixed $element the element to compact. + * @param assoc $options the compaction options. + * + * @return mixed the compacted value. + */ + protected function _compact( + $active_ctx, $active_property, $element, $options) { + // recursively compact array + if(is_array($element)) { + $rval = array(); + foreach($element as $e) { + // compact, dropping any null values + $compacted = $this->_compact( + $active_ctx, $active_property, $e, $options); + if($compacted !== null) { + $rval[] = $compacted; + } + } + if($options['compactArrays'] && count($rval) === 1) { + // use single element if no container is specified + $container = self::getContextValue( + $active_ctx, $active_property, '@container'); + if($container === null) { + $rval = $rval[0]; + } + } + return $rval; + } + + // recursively compact object + if(is_object($element)) { + if($options['link'] && property_exists($element, '@id') && + isset($options['link'][$element->{'@id'}])) { + // check for a linked element to reuse + $linked = $options['link'][$element->{'@id'}]; + foreach($linked as $link) { + if($link['expanded'] === $element) { + return $link['compacted']; + } + } + } + + // do value compaction on @values and subject references + if(self::_isValue($element) || self::_isSubjectReference($element)) { + $rval = $this->_compactValue($active_ctx, $active_property, $element); + if($options['link'] && self::_isSubjectReference($element)) { + // store linked element + if(!isset($options['link'][$element->{'@id'}])) { + $options['link'][$element->{'@id'}] = array(); + } + $options['link'][$element->{'@id'}][] = array( + 'expanded' => $element, 'compacted' => $rval); + } + return $rval; + } + + // FIXME: avoid misuse of active property as an expanded property? + $inside_reverse = ($active_property === '@reverse'); + + $rval = new stdClass(); + + if($options['link'] && property_exists($element, '@id')) { + // store linked element + if(!isset($options['link'][$element->{'@id'}])) { + $options['link'][$element->{'@id'}] = array(); + } + $options['link'][$element->{'@id'}][] = array( + 'expanded' => $element, 'compacted' => $rval); + } + + // process element keys in order + $keys = array_keys((array)$element); + sort($keys); + foreach($keys as $expanded_property) { + $expanded_value = $element->{$expanded_property}; + + // compact @id and @type(s) + if($expanded_property === '@id' || $expanded_property === '@type') { + if(is_string($expanded_value)) { + // compact single @id + $compacted_value = $this->_compactIri( + $active_ctx, $expanded_value, null, + array('vocab' => ($expanded_property === '@type'))); + } else { + // expanded value must be a @type array + $compacted_value = array(); + foreach($expanded_value as $ev) { + $compacted_value[] = $this->_compactIri( + $active_ctx, $ev, null, array('vocab' => true)); + } + } + + // use keyword alias and add value + $alias = $this->_compactIri($active_ctx, $expanded_property); + $is_array = (is_array($compacted_value) && + count($expanded_value) === 0); + self::addValue( + $rval, $alias, $compacted_value, + array('propertyIsArray' => $is_array)); + continue; + } + + // handle @reverse + if($expanded_property === '@reverse') { + // recursively compact expanded value + $compacted_value = $this->_compact( + $active_ctx, '@reverse', $expanded_value, $options); + + // handle double-reversed properties + foreach($compacted_value as $compacted_property => $value) { + if(property_exists($active_ctx->mappings, $compacted_property) && + $active_ctx->mappings->{$compacted_property} && + $active_ctx->mappings->{$compacted_property}->reverse) { + $container = self::getContextValue( + $active_ctx, $compacted_property, '@container'); + $use_array = ($container === '@set' || + !$options['compactArrays']); + self::addValue( + $rval, $compacted_property, $value, + array('propertyIsArray' => $use_array)); + unset($compacted_value->{$compacted_property}); + } + } + + if(count(array_keys((array)$compacted_value)) > 0) { + // use keyword alias and add value + $alias = $this->_compactIri($active_ctx, $expanded_property); + self::addValue($rval, $alias, $compacted_value); + } + + continue; + } + + // handle @index property + if($expanded_property === '@index') { + // drop @index if inside an @index container + $container = self::getContextValue( + $active_ctx, $active_property, '@container'); + if($container === '@index') { + continue; + } + + // use keyword alias and add value + $alias = $this->_compactIri($active_ctx, $expanded_property); + self::addValue($rval, $alias, $expanded_value); + continue; + } + + // skip array processing for keywords that aren't @graph or @list + if($expanded_property !== '@graph' && $expanded_property !== '@list' && + self::_isKeyword($expanded_property)) { + // use keyword alias and add value as is + $alias = $this->_compactIri($active_ctx, $expanded_property); + self::addValue($rval, $alias, $expanded_value); + continue; + } + + // Note: expanded value must be an array due to expansion algorithm. + + // preserve empty arrays + if(count($expanded_value) === 0) { + $item_active_property = $this->_compactIri( + $active_ctx, $expanded_property, $expanded_value, + array('vocab' => true), $inside_reverse); + self::addValue( + $rval, $item_active_property, array(), + array('propertyIsArray' => true)); + } + + // recusively process array values + foreach($expanded_value as $expanded_item) { + // compact property and get container type + $item_active_property = $this->_compactIri( + $active_ctx, $expanded_property, $expanded_item, + array('vocab' => true), $inside_reverse); + $container = self::getContextValue( + $active_ctx, $item_active_property, '@container'); + + // get @list value if appropriate + $is_list = self::_isList($expanded_item); + $list = null; + if($is_list) { + $list = $expanded_item->{'@list'}; + } + + // recursively compact expanded item + $compacted_item = $this->_compact( + $active_ctx, $item_active_property, + $is_list ? $list : $expanded_item, $options); + + // handle @list + if($is_list) { + // ensure @list value is an array + $compacted_item = self::arrayify($compacted_item); + + if($container !== '@list') { + // wrap using @list alias + $compacted_item = (object)array( + $this->_compactIri($active_ctx, '@list') => $compacted_item); + + // include @index from expanded @list, if any + if(property_exists($expanded_item, '@index')) { + $compacted_item->{$this->_compactIri($active_ctx, '@index')} = + $expanded_item->{'@index'}; + } + } else if(property_exists($rval, $item_active_property)) { + // can't use @list container for more than 1 list + throw new JsonLdException( + 'JSON-LD compact error; property has a "@list" @container ' . + 'rule but there is more than a single @list that matches ' . + 'the compacted term in the document. Compaction might mix ' . + 'unwanted items into the list.', 'jsonld.SyntaxError', + 'compaction to list of lists'); + } + } + + // handle language and index maps + if($container === '@language' || $container === '@index') { + // get or create the map object + if(property_exists($rval, $item_active_property)) { + $map_object = $rval->{$item_active_property}; + } else { + $rval->{$item_active_property} = $map_object = new stdClass(); + } + + // if container is a language map, simplify compacted value to + // a simple string + if($container === '@language' && self::_isValue($compacted_item)) { + $compacted_item = $compacted_item->{'@value'}; + } + + // add compact value to map object using key from expanded value + // based on the container type + self::addValue( + $map_object, $expanded_item->{$container}, $compacted_item); + } else { + // use an array if: compactArrays flag is false, + // @container is @set or @list, value is an empty + // array, or key is @graph + $is_array = (!$options['compactArrays'] || + $container === '@set' || $container === '@list' || + (is_array($compacted_item) && count($compacted_item) === 0) || + $expanded_property === '@list' || + $expanded_property === '@graph'); + + // add compact value + self::addValue( + $rval, $item_active_property, $compacted_item, + array('propertyIsArray' => $is_array)); + } + } + } + + return $rval; + } + + // only primitives remain which are already compact + return $element; + } + + /** + * Recursively expands an element using the given context. Any context in + * the element will be removed. All context URLs must have been retrieved + * before calling this method. + * + * @param stdClass $active_ctx the active context to use. + * @param mixed $active_property the property for the element, null for none. + * @param mixed $element the element to expand. + * @param assoc $options the expansion options. + * @param bool $inside_list true if the property is a list, false if not. + * + * @return mixed the expanded value. + */ + protected function _expand( + $active_ctx, $active_property, $element, $options, $inside_list) { + // nothing to expand + if($element === null) { + return $element; + } + + // recursively expand array + if(is_array($element)) { + $rval = array(); + $container = self::getContextValue( + $active_ctx, $active_property, '@container'); + $inside_list = $inside_list || $container === '@list'; + foreach($element as $e) { + // expand element + $e = $this->_expand( + $active_ctx, $active_property, $e, $options, $inside_list); + if($inside_list && (is_array($e) || self::_isList($e))) { + // lists of lists are illegal + throw new JsonLdException( + 'Invalid JSON-LD syntax; lists of lists are not permitted.', + 'jsonld.SyntaxError', 'list of lists'); + } + // drop null values + if($e !== null) { + if(is_array($e)) { + $rval = array_merge($rval, $e); + } else { + $rval[] = $e; + } + } + } + return $rval; + } + + if(!is_object($element)) { + // drop free-floating scalars that are not in lists + if(!$inside_list && + ($active_property === null || + $this->_expandIri($active_ctx, $active_property, + array('vocab' => true)) === '@graph')) { + return null; + } + + // expand element according to value expansion rules + return $this->_expandValue($active_ctx, $active_property, $element); + } + + // recursively expand object: + + // if element has a context, process it + if(property_exists($element, '@context')) { + $active_ctx = $this->_processContext( + $active_ctx, $element->{'@context'}, $options); + } + + // expand the active property + $expanded_active_property = $this->_expandIri( + $active_ctx, $active_property, array('vocab' => true)); + + $rval = new stdClass(); + $keys = array_keys((array)$element); + sort($keys); + foreach($keys as $key) { + $value = $element->{$key}; + + if($key === '@context') { + continue; + } + + // expand key to IRI + $expanded_property = $this->_expandIri( + $active_ctx, $key, array('vocab' => true)); + + // drop non-absolute IRI keys that aren't keywords + if($expanded_property === null || + !(self::_isAbsoluteIri($expanded_property) || + self::_isKeyword($expanded_property))) { + continue; + } + + if(self::_isKeyword($expanded_property)) { + if($expanded_active_property === '@reverse') { + throw new JsonLdException( + 'Invalid JSON-LD syntax; a keyword cannot be used as a @reverse ' . + 'property.', 'jsonld.SyntaxError', 'invalid reverse property map', + array('value' => $value)); + } + if(property_exists($rval, $expanded_property)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; colliding keywords detected.', + 'jsonld.SyntaxError', 'colliding keywords', + array('keyword' => $expanded_property)); + } + } + + // syntax error if @id is not a string + if($expanded_property === '@id' && !is_string($value)) { + if(!isset($options['isFrame']) || !$options['isFrame']) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; "@id" value must a string.', + 'jsonld.SyntaxError', 'invalid @id value', + array('value' => $value)); + } + if(!is_object($value)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; "@id" value must a string or an object.', + 'jsonld.SyntaxError', 'invalid @id value', + array('value' => $value)); + } + } + + // validate @type value + if($expanded_property === '@type') { + $this->_validateTypeValue($value); + } + + // @graph must be an array or an object + if($expanded_property === '@graph' && + !(is_object($value) || is_array($value))) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; "@graph" value must not be an ' . + 'object or an array.', 'jsonld.SyntaxError', + 'invalid @graph value', array('value' => $value)); + } + + // @value must not be an object or an array + if($expanded_property === '@value' && + (is_object($value) || is_array($value))) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; "@value" value must not be an ' . + 'object or an array.', 'jsonld.SyntaxError', + 'invalid value object value', array('value' => $value)); + } + + // @language must be a string + if($expanded_property === '@language') { + if($value === null) { + // drop null @language values, they expand as if they didn't exist + continue; + } + if(!is_string($value)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; "@language" value must not be a string.', + 'jsonld.SyntaxError', 'invalid language-tagged string', + array('value' => $value)); + } + // ensure language value is lowercase + $value = strtolower($value); + } + + // @index must be a string + if($expanded_property === '@index') { + if(!is_string($value)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; "@index" value must be a string.', + 'jsonld.SyntaxError', 'invalid @index value', + array('value' => $value)); + } + } + + // @reverse must be an object + if($expanded_property === '@reverse') { + if(!is_object($value)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; "@reverse" value must be an object.', + 'jsonld.SyntaxError', 'invalid @reverse value', + array('value' => $value)); + } + + $expanded_value = $this->_expand( + $active_ctx, '@reverse', $value, $options, $inside_list); + + // properties double-reversed + if(property_exists($expanded_value, '@reverse')) { + foreach($expanded_value->{'@reverse'} as $rproperty => $rvalue) { + self::addValue( + $rval, $rproperty, $rvalue, array('propertyIsArray' => true)); + } + } + + // FIXME: can this be merged with code below to simplify? + // merge in all reversed properties + if(property_exists($rval, '@reverse')) { + $reverse_map = $rval->{'@reverse'}; + } else { + $reverse_map = null; + } + foreach($expanded_value as $property => $items) { + if($property === '@reverse') { + continue; + } + if($reverse_map === null) { + $reverse_map = $rval->{'@reverse'} = new stdClass(); + } + self::addValue( + $reverse_map, $property, array(), + array('propertyIsArray' => true)); + foreach($items as $item) { + if(self::_isValue($item) || self::_isList($item)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; "@reverse" value must not be a ' + + '@value or an @list.', 'jsonld.SyntaxError', + 'invalid reverse property value', + array('value' => $expanded_value)); + } + self::addValue( + $reverse_map, $property, $item, + array('propertyIsArray' => true)); + } + } + + continue; + } + + $container = self::getContextValue($active_ctx, $key, '@container'); + + if($container === '@language' && is_object($value)) { + // handle language map container (skip if value is not an object) + $expanded_value = $this->_expandLanguageMap($value); + } else if($container === '@index' && is_object($value)) { + // handle index container (skip if value is not an object) + $expanded_value = array(); + $value_keys = array_keys((array)$value); + sort($value_keys); + foreach($value_keys as $value_key) { + $val = $value->{$value_key}; + $val = self::arrayify($val); + $val = $this->_expand($active_ctx, $key, $val, $options, false); + foreach($val as $item) { + if(!property_exists($item, '@index')) { + $item->{'@index'} = $value_key; + } + $expanded_value[] = $item; + } + } + } else { + // recurse into @list or @set + $is_list = ($expanded_property === '@list'); + if($is_list || $expanded_property === '@set') { + $next_active_property = $active_property; + if($is_list && $expanded_active_property === '@graph') { + $next_active_property = null; + } + $expanded_value = $this->_expand( + $active_ctx, $next_active_property, $value, $options, $is_list); + if($is_list && self::_isList($expanded_value)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; lists of lists are not permitted.', + 'jsonld.SyntaxError', 'list of lists'); + } + } else { + // recursively expand value with key as new active property + $expanded_value = $this->_expand( + $active_ctx, $key, $value, $options, false); + } + } + + // drop null values if property is not @value + if($expanded_value === null && $expanded_property !== '@value') { + continue; + } + + // convert expanded value to @list if container specifies it + if($expanded_property !== '@list' && !self::_isList($expanded_value) && + $container === '@list') { + // ensure expanded value is an array + $expanded_value = (object)array( + '@list' => self::arrayify($expanded_value)); + } + + // FIXME: can this be merged with code above to simplify? + // merge in reverse properties + if(property_exists($active_ctx->mappings, $key) && + $active_ctx->mappings->{$key} && + $active_ctx->mappings->{$key}->reverse) { + if(property_exists($rval, '@reverse')) { + $reverse_map = $rval->{'@reverse'}; + } else { + $reverse_map = $rval->{'@reverse'} = new stdClass(); + } + $expanded_value = self::arrayify($expanded_value); + foreach($expanded_value as $item) { + if(self::_isValue($item) || self::_isList($item)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; "@reverse" value must not be a ' + + '@value or an @list.', 'jsonld.SyntaxError', + 'invalid reverse property value', + array('value' => $expanded_value)); + } + self::addValue( + $reverse_map, $expanded_property, $item, + array('propertyIsArray' => true)); + } + continue; + } + + // add value for property + // use an array except for certain keywords + $use_array = (!in_array( + $expanded_property, array( + '@index', '@id', '@type', '@value', '@language'))); + self::addValue( + $rval, $expanded_property, $expanded_value, + array('propertyIsArray' => $use_array)); + } + + // get property count on expanded output + $keys = array_keys((array)$rval); + $count = count($keys); + + // @value must only have @language or @type + if(property_exists($rval, '@value')) { + // @value must only have @language or @type + if(property_exists($rval, '@type') && + property_exists($rval, '@language')) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; an element containing "@value" may not ' . + 'contain both "@type" and "@language".', + 'jsonld.SyntaxError', 'invalid value object', + array('element' => $rval)); + } + $valid_count = $count - 1; + if(property_exists($rval, '@type')) { + $valid_count -= 1; + } + if(property_exists($rval, '@index')) { + $valid_count -= 1; + } + if(property_exists($rval, '@language')) { + $valid_count -= 1; + } + if($valid_count !== 0) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; an element containing "@value" may only ' . + 'have an "@index" property and at most one other property ' . + 'which can be "@type" or "@language".', + 'jsonld.SyntaxError', 'invalid value object', + array('element' => $rval)); + } + // drop null @values + if($rval->{'@value'} === null) { + $rval = null; + } else if(property_exists($rval, '@language') && + !is_string($rval->{'@value'})) { + // if @language is present, @value must be a string + throw new JsonLdException( + 'Invalid JSON-LD syntax; only strings may be language-tagged.', + 'jsonld.SyntaxError', 'invalid language-tagged value', + array('element' => $rval)); + } else if(property_exists($rval, '@type') && + (!self::_isAbsoluteIri($rval->{'@type'}) || + strpos($rval->{'@type'}, '_:') === 0)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; an element containing "@value" ' . + 'and "@type" must have an absolute IRI for the value ' . + 'of "@type".', 'jsonld.SyntaxError', 'invalid typed value', + array('element' => $rval)); + } + } else if(property_exists($rval, '@type') && !is_array($rval->{'@type'})) { + // convert @type to an array + $rval->{'@type'} = array($rval->{'@type'}); + } else if(property_exists($rval, '@set') || + property_exists($rval, '@list')) { + // handle @set and @list + if($count > 1 && !($count === 2 && property_exists($rval, '@index'))) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; if an element has the property "@set" ' . + 'or "@list", then it can have at most one other property that is ' . + '"@index".', 'jsonld.SyntaxError', 'invalid set or list object', + array('element' => $rval)); + } + // optimize away @set + if(property_exists($rval, '@set')) { + $rval = $rval->{'@set'}; + $keys = array_keys((array)$rval); + $count = count($keys); + } + } else if($count === 1 && property_exists($rval, '@language')) { + // drop objects with only @language + $rval = null; + } + + // drop certain top-level objects that do not occur in lists + if(is_object($rval) && + !$options['keepFreeFloatingNodes'] && !$inside_list && + ($active_property === null || $expanded_active_property === '@graph')) { + // drop empty object or top-level @value/@list, or object with only @id + if($count === 0 || property_exists($rval, '@value') || + property_exists($rval, '@list') || + ($count === 1 && property_exists($rval, '@id'))) { + $rval = null; + } + } + + return $rval; + } + + /** + * Performs JSON-LD flattening. + * + * @param array $input the expanded JSON-LD to flatten. + * + * @return array the flattened output. + */ + protected function _flatten($input) { + // produce a map of all subjects and name each bnode + $namer = new UniqueNamer('_:b'); + $graphs = (object)array('@default' => new stdClass()); + $this->_createNodeMap($input, $graphs, '@default', $namer); + + // add all non-default graphs to default graph + $default_graph = $graphs->{'@default'}; + $graph_names = array_keys((array)$graphs); + foreach($graph_names as $graph_name) { + if($graph_name === '@default') { + continue; + } + $node_map = $graphs->{$graph_name}; + if(!property_exists($default_graph, $graph_name)) { + $default_graph->{$graph_name} = (object)array( + '@id' => $graph_name, '@graph' => array()); + } + $subject = $default_graph->{$graph_name}; + if(!property_exists($subject, '@graph')) { + $subject->{'@graph'} = array(); + } + $ids = array_keys((array)$node_map); + sort($ids); + foreach($ids as $id) { + $node = $node_map->{$id}; + // only add full subjects + if(!self::_isSubjectReference($node)) { + $subject->{'@graph'}[] = $node; + } + } + } + + // produce flattened output + $flattened = array(); + $keys = array_keys((array)$default_graph); + sort($keys); + foreach($keys as $key) { + $node = $default_graph->{$key}; + // only add full subjects to top-level + if(!self::_isSubjectReference($node)) { + $flattened[] = $node; + } + } + return $flattened; + } + + /** + * Performs JSON-LD framing. + * + * @param array $input the expanded JSON-LD to frame. + * @param array $frame the expanded JSON-LD frame to use. + * @param assoc $options the framing options. + * + * @return array the framed output. + */ + protected function _frame($input, $frame, $options) { + // create framing state + $state = (object)array( + 'options' => $options, + 'graphs' => (object)array( + '@default' => new stdClass(), + '@merged' => new stdClass()), + 'subjectStack' => array(), + 'link' => new stdClass()); + + // produce a map of all graphs and name each bnode + // FIXME: currently uses subjects from @merged graph only + $namer = new UniqueNamer('_:b'); + $this->_createNodeMap($input, $state->graphs, '@merged', $namer); + $state->subjects = $state->graphs->{'@merged'}; + + // frame the subjects + $framed = new ArrayObject(); + $keys = array_keys((array)$state->subjects); + sort($keys); + $this->_matchFrame($state, $keys, $frame, $framed, null); + return (array)$framed; + } + + /** + * Performs normalization on the given RDF dataset. + * + * @param stdClass $dataset the RDF dataset to normalize. + * @param assoc $options the normalization options. + * + * @return mixed the normalized output. + */ + protected function _normalize($dataset, $options) { + // create quads and map bnodes to their associated quads + $quads = array(); + $bnodes = new stdClass(); + foreach($dataset as $graph_name => $triples) { + if($graph_name === '@default') { + $graph_name = null; + } + foreach($triples as $triple) { + $quad = $triple; + if($graph_name !== null) { + if(strpos($graph_name, '_:') === 0) { + $quad->name = (object)array( + 'type' => 'blank node', 'value' => $graph_name); + } else { + $quad->name = (object)array( + 'type' => 'IRI', 'value' => $graph_name); + } + } + $quads[] = $quad; + + foreach(array('subject', 'object', 'name') as $attr) { + if(property_exists($quad, $attr) && + $quad->{$attr}->type === 'blank node') { + $id = $quad->{$attr}->value; + if(property_exists($bnodes, $id)) { + $bnodes->{$id}->quads[] = $quad; + } else { + $bnodes->{$id} = (object)array('quads' => array($quad)); + } + } + } + } + } + + // mapping complete, start canonical naming + $namer = new UniqueNamer('_:c14n'); + + // continue to hash bnode quads while bnodes are assigned names + $unnamed = null; + $nextUnnamed = array_keys((array)$bnodes); + $duplicates = null; + do { + $unnamed = $nextUnnamed; + $nextUnnamed = array(); + $duplicates = new stdClass(); + $unique = new stdClass(); + foreach($unnamed as $bnode) { + // hash quads for each unnamed bnode + $hash = $this->_hashQuads($bnode, $bnodes, $namer); + + // store hash as unique or a duplicate + if(property_exists($duplicates, $hash)) { + $duplicates->{$hash}[] = $bnode; + $nextUnnamed[] = $bnode; + } else if(property_exists($unique, $hash)) { + $duplicates->{$hash} = array($unique->{$hash}, $bnode); + $nextUnnamed[] = $unique->{$hash}; + $nextUnnamed[] = $bnode; + unset($unique->{$hash}); + } else { + $unique->{$hash} = $bnode; + } + } + + // name unique bnodes in sorted hash order + $hashes = array_keys((array)$unique); + sort($hashes); + foreach($hashes as $hash) { + $namer->getName($unique->{$hash}); + } + } + while(count($unnamed) > count($nextUnnamed)); + + // enumerate duplicate hash groups in sorted order + $hashes = array_keys((array)$duplicates); + sort($hashes); + foreach($hashes as $hash) { + // process group + $group = $duplicates->{$hash}; + $results = array(); + foreach($group as $bnode) { + // skip already-named bnodes + if($namer->isNamed($bnode)) { + continue; + } + + // hash bnode paths + $path_namer = new UniqueNamer('_:b'); + $path_namer->getName($bnode); + $results[] = $this->_hashPaths($bnode, $bnodes, $namer, $path_namer); + } + + // name bnodes in hash order + usort($results, function($a, $b) { + $a = $a->hash; + $b = $b->hash; + return ($a < $b) ? -1 : (($a > $b) ? 1 : 0); + }); + foreach($results as $result) { + // name all bnodes in path namer in key-entry order + foreach($result->pathNamer->order as $bnode) { + $namer->getName($bnode); + } + } + } + + // create normalized array + $normalized = array(); + + /* Note: At this point all bnodes in the set of RDF quads have been + assigned canonical names, which have been stored in the 'namer' object. + Here each quad is updated by assigning each of its bnodes its new name + via the 'namer' object. */ + + // update bnode names in each quad and serialize + foreach($quads as $quad) { + foreach(array('subject', 'object', 'name') as $attr) { + if(property_exists($quad, $attr) && + $quad->{$attr}->type === 'blank node' && + strpos($quad->{$attr}->value, '_:c14n') !== 0) { + $quad->{$attr}->value = $namer->getName($quad->{$attr}->value); + } + } + $normalized[] = $this->toNQuad($quad, property_exists($quad, 'name') ? + $quad->name->value : null); + } + + // sort normalized output + sort($normalized); + + // handle output format + if(isset($options['format']) && $options['format']) { + if($options['format'] === 'application/nquads') { + return implode($normalized); + } + throw new JsonLdException( + 'Unknown output format.', + 'jsonld.UnknownFormat', null, array('format' => $options['format'])); + } + + // return RDF dataset + return $this->parseNQuads(implode($normalized)); + } + + /** + * Converts an RDF dataset to JSON-LD. + * + * @param stdClass $dataset the RDF dataset. + * @param assoc $options the RDF serialization options. + * + * @return array the JSON-LD output. + */ + protected function _fromRDF($dataset, $options) { + $default_graph = new stdClass(); + $graph_map = (object)array('@default' => $default_graph); + $referenced_once = (object)array(); + + foreach($dataset as $name => $graph) { + if(!property_exists($graph_map, $name)) { + $graph_map->{$name} = new stdClass(); + } + if($name !== '@default' && !property_exists($default_graph, $name)) { + $default_graph->{$name} = (object)array('@id' => $name); + } + $node_map = $graph_map->{$name}; + foreach($graph as $triple) { + // get subject, predicate, object + $s = $triple->subject->value; + $p = $triple->predicate->value; + $o = $triple->object; + + if(!property_exists($node_map, $s)) { + $node_map->{$s} = (object)array('@id' => $s); + } + $node = $node_map->{$s}; + + $object_is_id = ($o->type === 'IRI' || $o->type === 'blank node'); + if($object_is_id && !property_exists($node_map, $o->value)) { + $node_map->{$o->value} = (object)array('@id' => $o->value); + } + + if($p === self::RDF_TYPE && !$options['useRdfType'] && $object_is_id) { + self::addValue( + $node, '@type', $o->value, array('propertyIsArray' => true)); + continue; + } + + $value = self::_RDFToObject($o, $options['useNativeTypes']); + self::addValue($node, $p, $value, array('propertyIsArray' => true)); + + // object may be an RDF list/partial list node but we can't know + // easily until all triples are read + if($object_is_id) { + if($o->value === self::RDF_NIL) { + $object = $node_map->{$o->value}; + if(!property_exists($object, 'usages')) { + $object->usages = array(); + } + $object->usages[] = (object)array( + 'node' => $node, + 'property' => $p, + 'value' => $value); + } else if(property_exists($referenced_once, $o->value)) { + // object referenced more than once + $referenced_once->{$o->value} = false; + } else { + // track single reference + $referenced_once->{$o->value} = (object)array( + 'node' => $node, + 'property' => $p, + 'value' => $value); + } + } + } + } + + // convert linked lists to @list arrays + foreach($graph_map as $name => $graph_object) { + // no @lists to be converted, continue + if(!property_exists($graph_object, self::RDF_NIL)) { + continue; + } + + // iterate backwards through each RDF list + $nil = $graph_object->{self::RDF_NIL}; + foreach($nil->usages as $usage) { + $node = $usage->node; + $property = $usage->property; + $head = $usage->value; + $list = array(); + $list_nodes = array(); + + // ensure node is a well-formed list node; it must: + // 1. Be referenced only once. + // 2. Have an array for rdf:first that has 1 item. + // 3. Have an array for rdf:rest that has 1 item. + // 4. Have no keys other than: @id, rdf:first, rdf:rest, and, + // optionally, @type where the value is rdf:List. + $node_key_count = count(array_keys((array)$node)); + while($property === self::RDF_REST && + property_exists($referenced_once, $node->{'@id'}) && + is_object($referenced_once->{$node->{'@id'}}) && + property_exists($node, self::RDF_FIRST) && + property_exists($node, self::RDF_REST) && + is_array($node->{self::RDF_FIRST}) && + is_array($node->{self::RDF_REST}) && + count($node->{self::RDF_FIRST}) === 1 && + count($node->{self::RDF_REST}) === 1 && + ($node_key_count === 3 || ($node_key_count === 4 && + property_exists($node, '@type') && is_array($node->{'@type'}) && + count($node->{'@type'}) === 1 && + $node->{'@type'}[0] === self::RDF_LIST))) { + $list[] = $node->{self::RDF_FIRST}[0]; + $list_nodes[] = $node->{'@id'}; + + // get next node, moving backwards through list + $usage = $referenced_once->{$node->{'@id'}}; + $node = $usage->node; + $property = $usage->property; + $head = $usage->value; + $node_key_count = count(array_keys((array)$node)); + + // if node is not a blank node, then list head found + if(strpos($node->{'@id'}, '_:') !== 0) { + break; + } + } + + // list is nested in another list + if($property === self::RDF_FIRST) { + // empty list + if($node->{'@id'} === self::RDF_NIL) { + // can't convert rdf:nil to a @list object because it would + // result in a list of lists which isn't supported + continue; + } + + // preserve list head + $head = $graph_object->{$head->{'@id'}}->{self::RDF_REST}[0]; + array_pop($list); + array_pop($list_nodes); + } + + // transform list into @list object + unset($head->{'@id'}); + $head->{'@list'} = array_reverse($list); + foreach($list_nodes as $list_node) { + unset($graph_object->{$list_node}); + } + } + + unset($nil->usages); + } + + $result = array(); + $subjects = array_keys((array)$default_graph); + sort($subjects); + foreach($subjects as $subject) { + $node = $default_graph->{$subject}; + if(property_exists($graph_map, $subject)) { + $node->{'@graph'} = array(); + $graph_object = $graph_map->{$subject}; + $subjects_ = array_keys((array)$graph_object); + sort($subjects_); + foreach($subjects_ as $subject_) { + $node_ = $graph_object->{$subject_}; + // only add full subjects to top-level + if(!self::_isSubjectReference($node_)) { + $node->{'@graph'}[] = $node_; + } + } + } + // only add full subjects to top-level + if(!self::_isSubjectReference($node)) { + $result[] = $node; + } + } + + return $result; + } + + /** + * Processes a local context and returns a new active context. + * + * @param stdClass $active_ctx the current active context. + * @param mixed $local_ctx the local context to process. + * @param assoc $options the context processing options. + * + * @return stdClass the new active context. + */ + protected function _processContext($active_ctx, $local_ctx, $options) { + global $jsonld_cache; + + // normalize local context to an array + if(is_object($local_ctx) && property_exists($local_ctx, '@context') && + is_array($local_ctx->{'@context'})) { + $local_ctx = $local_ctx->{'@context'}; + } + $ctxs = self::arrayify($local_ctx); + + // no contexts in array, clone existing context + if(count($ctxs) === 0) { + return self::_cloneActiveContext($active_ctx); + } + + // process each context in order, update active context + // on each iteration to ensure proper caching + $rval = $active_ctx; + foreach($ctxs as $ctx) { + // reset to initial context + if($ctx === null) { + $rval = $active_ctx = $this->_getInitialContext($options); + continue; + } + + // dereference @context key if present + if(is_object($ctx) && property_exists($ctx, '@context')) { + $ctx = $ctx->{'@context'}; + } + + // context must be an object by now, all URLs retrieved before this call + if(!is_object($ctx)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; @context must be an object.', + 'jsonld.SyntaxError', 'invalid local context', + array('context' => $ctx)); + } + + // get context from cache if available + if(property_exists($jsonld_cache, 'activeCtx')) { + $cached = $jsonld_cache->activeCtx->get($active_ctx, $ctx); + if($cached) { + $rval = $active_ctx = $cached; + $must_clone = true; + continue; + } + } + + // update active context and clone new one before updating + $active_ctx = $rval; + $rval = self::_cloneActiveContext($rval); + + // define context mappings for keys in local context + $defined = new stdClass(); + + // handle @base + if(property_exists($ctx, '@base')) { + $base = $ctx->{'@base'}; + if($base === null) { + $base = null; + } else if(!is_string($base)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; the value of "@base" in a ' . + '@context must be a string or null.', + 'jsonld.SyntaxError', 'invalid base IRI', array('context' => $ctx)); + } else if($base !== '' && !self::_isAbsoluteIri($base)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; the value of "@base" in a ' . + '@context must be an absolute IRI or the empty string.', + 'jsonld.SyntaxError', 'invalid base IRI', array('context' => $ctx)); + } + if($base !== null) { + $base = jsonld_parse_url($base); + } + $rval->{'@base'} = $base; + $defined->{'@base'} = true; + } + + // handle @vocab + if(property_exists($ctx, '@vocab')) { + $value = $ctx->{'@vocab'}; + if($value === null) { + unset($rval->{'@vocab'}); + } else if(!is_string($value)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; the value of "@vocab" in a ' . + '@context must be a string or null.', + 'jsonld.SyntaxError', 'invalid vocab mapping', + array('context' => $ctx)); + } else if(!self::_isAbsoluteIri($value)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; the value of "@vocab" in a ' . + '@context must be an absolute IRI.', + 'jsonld.SyntaxError', 'invalid vocab mapping', + array('context' => $ctx)); + } else { + $rval->{'@vocab'} = $value; + } + $defined->{'@vocab'} = true; + } + + // handle @language + if(property_exists($ctx, '@language')) { + $value = $ctx->{'@language'}; + if($value === null) { + unset($rval->{'@language'}); + } else if(!is_string($value)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; the value of "@language" in a ' . + '@context must be a string or null.', + 'jsonld.SyntaxError', 'invalid default language', + array('context' => $ctx)); + } else { + $rval->{'@language'} = strtolower($value); + } + $defined->{'@language'} = true; + } + + // process all other keys + foreach($ctx as $k => $v) { + $this->_createTermDefinition($rval, $ctx, $k, $defined); + } + + // cache result + if(property_exists($jsonld_cache, 'activeCtx')) { + $jsonld_cache->activeCtx->set($active_ctx, $ctx, $rval); + } + } + + return $rval; + } + + /** + * Expands a language map. + * + * @param stdClass $language_map the language map to expand. + * + * @return array the expanded language map. + */ + protected function _expandLanguageMap($language_map) { + $rval = array(); + $keys = array_keys((array)$language_map); + sort($keys); + foreach($keys as $key) { + $values = $language_map->{$key}; + $values = self::arrayify($values); + foreach($values as $item) { + if($item === null) { + continue; + } + if(!is_string($item)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; language map values must be strings.', + 'jsonld.SyntaxError', 'invalid language map value', + array('languageMap', $language_map)); + } + $rval[] = (object)array( + '@value' => $item, + '@language' => strtolower($key)); + } + } + return $rval; + } + + /** + * Labels the blank nodes in the given value using the given UniqueNamer. + * + * @param UniqueNamer $namer the UniqueNamer to use. + * @param mixed $element the element with blank nodes to rename. + * + * @return mixed the element. + */ + public function _labelBlankNodes($namer, $element) { + if(is_array($element)) { + $length = count($element); + for($i = 0; $i < $length; ++$i) { + $element[$i] = $this->_labelBlankNodes($namer, $element[$i]); + } + } else if(self::_isList($element)) { + $element->{'@list'} = $this->_labelBlankNodes( + $namer, $element->{'@list'}); + } else if(is_object($element)) { + // rename blank node + if(self::_isBlankNode($element)) { + $name = null; + if(property_exists($element, '@id')) { + $name = $element->{'@id'}; + } + $element->{'@id'} = $namer->getName($name); + } + + // recursively apply to all keys + $keys = array_keys((array)$element); + sort($keys); + foreach($keys as $key) { + if($key !== '@id') { + $element->{$key} = $this->_labelBlankNodes($namer, $element->{$key}); + } + } + } + + return $element; + } + + /** + * Expands the given value by using the coercion and keyword rules in the + * given context. + * + * @param stdClass $active_ctx the active context to use. + * @param string $active_property the property the value is associated with. + * @param mixed $value the value to expand. + * + * @return mixed the expanded value. + */ + protected function _expandValue($active_ctx, $active_property, $value) { + // nothing to expand + if($value === null) { + return null; + } + + // special-case expand @id and @type (skips '@id' expansion) + $expanded_property = $this->_expandIri( + $active_ctx, $active_property, array('vocab' => true)); + if($expanded_property === '@id') { + return $this->_expandIri($active_ctx, $value, array('base' => true)); + } else if($expanded_property === '@type') { + return $this->_expandIri( + $active_ctx, $value, array('vocab' => true, 'base' => true)); + } + + // get type definition from context + $type = self::getContextValue($active_ctx, $active_property, '@type'); + + // do @id expansion (automatic for @graph) + if($type === '@id' || ($expanded_property === '@graph' && + is_string($value))) { + return (object)array('@id' => $this->_expandIri( + $active_ctx, $value, array('base' => true))); + } + // do @id expansion w/vocab + if($type === '@vocab') { + return (object)array('@id' => $this->_expandIri( + $active_ctx, $value, array('vocab' => true, 'base' => true))); + } + + // do not expand keyword values + if(self::_isKeyword($expanded_property)) { + return $value; + } + + $rval = new stdClass(); + + // other type + if($type !== null) { + $rval->{'@type'} = $type; + } else if(is_string($value)) { + // check for language tagging for strings + $language = self::getContextValue( + $active_ctx, $active_property, '@language'); + if($language !== null) { + $rval->{'@language'} = $language; + } + } + $rval->{'@value'} = $value; + + return $rval; + } + + /** + * Creates an array of RDF triples for the given graph. + * + * @param stdClass $graph the graph to create RDF triples for. + * @param UniqueNamer $namer for assigning bnode names. + * @param assoc $options the RDF serialization options. + * + * @return array the array of RDF triples for the given graph. + */ + protected function _graphToRDF($graph, $namer, $options) { + $rval = array(); + + $ids = array_keys((array)$graph); + sort($ids); + foreach($ids as $id) { + $node = $graph->{$id}; + if($id === '"') { + $id = ''; + } + $properties = array_keys((array)$node); + sort($properties); + foreach($properties as $property) { + $items = $node->{$property}; + if($property === '@type') { + $property = self::RDF_TYPE; + } else if(self::_isKeyword($property)) { + continue; + } + + foreach($items as $item) { + // skip relative IRI subjects and predicates + if(!(self::_isAbsoluteIri($id) && self::_isAbsoluteIri($property))) { + continue; + } + + // RDF subject + $subject = new stdClass(); + $subject->type = (strpos($id, '_:') === 0) ? 'blank node' : 'IRI'; + $subject->value = $id; + + // RDF predicate + $predicate = new stdClass(); + $predicate->type = (strpos($property, '_:') === 0 ? + 'blank node' : 'IRI'); + $predicate->value = $property; + + // skip bnode predicates unless producing generalized RDF + if($predicate->type === 'blank node' && + !$options['produceGeneralizedRdf']) { + continue; + } + + if(self::_isList($item)) { + // convert @list to triples + $this->_listToRDF( + $item->{'@list'}, $namer, $subject, $predicate, $rval); + } else { + // convert value or node object to triple + $object = $this->_objectToRDF($item); + // skip null objects (they are relative IRIs) + if($object) { + $rval[] = (object)array( + 'subject' => $subject, + 'predicate' => $predicate, + 'object' => $object); + } + } + } + } + } + + return $rval; + } + + /** + * Converts a @list value into linked list of blank node RDF triples + * (an RDF collection). + * + * @param array $list the @list value. + * @param UniqueNamer $namer for assigning blank node names. + * @param stdClass $subject the subject for the head of the list. + * @param stdClass $predicate the predicate for the head of the list. + * @param &array $triples the array of triples to append to. + */ + protected function _listToRDF( + $list, $namer, $subject, $predicate, &$triples) { + $first = (object)array('type' => 'IRI', 'value' => self::RDF_FIRST); + $rest = (object)array('type' => 'IRI', 'value' => self::RDF_REST); + $nil = (object)array('type' => 'IRI', 'value' => self::RDF_NIL); + + foreach($list as $item) { + $blank_node = (object)array( + 'type' => 'blank node', 'value' => $namer->getName()); + $triples[] = (object)array( + 'subject' => $subject, + 'predicate' => $predicate, + 'object' => $blank_node); + + $subject = $blank_node; + $predicate = $first; + $object = $this->_objectToRDF($item); + // skip null objects (they are relative IRIs) + if($object) { + $triples[] = (object)array( + 'subject' => $subject, + 'predicate' => $predicate, + 'object' => $object); + } + + $predicate = $rest; + } + + $triples[] = (object)array( + 'subject' => $subject, 'predicate' => $predicate, 'object' => $nil); + } + + /** + * Converts a JSON-LD value object to an RDF literal or a JSON-LD string or + * node object to an RDF resource. + * + * @param mixed $item the JSON-LD value or node object. + * + * @return stdClass the RDF literal or RDF resource. + */ + protected function _objectToRDF($item) { + $object = new stdClass(); + + if(self::_isValue($item)) { + $object->type = 'literal'; + $value = $item->{'@value'}; + $datatype = property_exists($item, '@type') ? $item->{'@type'} : null; + + // convert to XSD datatypes as appropriate + if(is_bool($value)) { + $object->value = ($value ? 'true' : 'false'); + $object->datatype = $datatype ? $datatype : self::XSD_BOOLEAN; + } else if(is_double($value) || $datatype == self::XSD_DOUBLE) { + // canonical double representation + $object->value = preg_replace( + '/(\d)0*E\+?/', '$1E', sprintf('%1.15E', $value)); + $object->datatype = $datatype ? $datatype : self::XSD_DOUBLE; + } else if(is_integer($value)) { + $object->value = strval($value); + $object->datatype = $datatype ? $datatype : self::XSD_INTEGER; + } else if(property_exists($item, '@language')) { + $object->value = $value; + $object->datatype = $datatype ? $datatype : self::RDF_LANGSTRING; + $object->language = $item->{'@language'}; + } else { + $object->value = $value; + $object->datatype = $datatype ? $datatype : self::XSD_STRING; + } + } else { + // convert string/node object to RDF + $id = is_object($item) ? $item->{'@id'} : $item; + $object->type = (strpos($id, '_:') === 0) ? 'blank node' : 'IRI'; + $object->value = $id; + } + + // skip relative IRIs + if($object->type === 'IRI' && !self::_isAbsoluteIri($object->value)) { + return null; + } + + return $object; + } + + /** + * Converts an RDF triple object to a JSON-LD object. + * + * @param stdClass $o the RDF triple object to convert. + * @param bool $use_native_types true to output native types, false not to. + * + * @return stdClass the JSON-LD object. + */ + protected function _RDFToObject($o, $use_native_types) { + // convert IRI/blank node object to JSON-LD + if($o->type === 'IRI' || $o->type === 'blank node') { + return (object)array('@id' => $o->value); + } + + // convert literal object to JSON-LD + $rval = (object)array('@value' => $o->value); + + if(property_exists($o, 'language')) { + // add language + $rval->{'@language'} = $o->language; + } else { + // add datatype + $type = $o->datatype; + // use native types for certain xsd types + if($use_native_types) { + if($type === self::XSD_BOOLEAN) { + if($rval->{'@value'} === 'true') { + $rval->{'@value'} = true; + } else if($rval->{'@value'} === 'false') { + $rval->{'@value'} = false; + } + } else if(is_numeric($rval->{'@value'})) { + if($type === self::XSD_INTEGER) { + $i = intval($rval->{'@value'}); + if(strval($i) === $rval->{'@value'}) { + $rval->{'@value'} = $i; + } + } else if($type === self::XSD_DOUBLE) { + $rval->{'@value'} = doubleval($rval->{'@value'}); + } + } + // do not add native type + if(!in_array($type, array( + self::XSD_BOOLEAN, self::XSD_INTEGER, self::XSD_DOUBLE, + self::XSD_STRING))) { + $rval->{'@type'} = $type; + } + } else if($type !== self::XSD_STRING) { + $rval->{'@type'} = $type; + } + } + + return $rval; + } + + /** + * Recursively flattens the subjects in the given JSON-LD expanded input + * into a node map. + * + * @param mixed $input the JSON-LD expanded input. + * @param stdClass $graphs a map of graph name to subject map. + * @param string $graph the name of the current graph. + * @param UniqueNamer $namer the blank node namer. + * @param mixed $name the name assigned to the current input if it is a bnode. + * @param mixed $list the list to append to, null for none. + */ + protected function _createNodeMap( + $input, $graphs, $graph, $namer, $name=null, $list=null) { + // recurse through array + if(is_array($input)) { + foreach($input as $e) { + $this->_createNodeMap($e, $graphs, $graph, $namer, null, $list); + } + return; + } + + // add non-object to list + if(!is_object($input)) { + if($list !== null) { + $list[] = $input; + } + return; + } + + // add values to list + if(self::_isValue($input)) { + if(property_exists($input, '@type')) { + $type = $input->{'@type'}; + // rename @type blank node + if(strpos($type, '_:') === 0) { + $type = $input->{'@type'} = $namer->getName($type); + } + } + if($list !== null) { + $list[] = $input; + } + return; + } + + // Note: At this point, input must be a subject. + + // spec requires @type to be named first, so assign names early + if(property_exists($input, '@type')) { + foreach($input->{'@type'} as $type) { + if(strpos($type, '_:') === 0) { + $namer->getName($type); + } + } + } + + // get name for subject + if($name === null) { + if(property_exists($input, '@id')) { + $name = $input->{'@id'}; + } + if(self::_isBlankNode($input)) { + $name = $namer->getName($name); + } + } + + // add subject reference to list + if($list !== null) { + $list[] = (object)array('@id' => $name); + } + + // create new subject or merge into existing one + if(!property_exists($graphs, $graph)) { + $graphs->{$graph} = new stdClass(); + } + $subjects = $graphs->{$graph}; + if(!property_exists($subjects, $name)) { + if($name === '') { + $subjects->{'"'} = new stdClass(); + } else { + $subjects->{$name} = new stdClass(); + } + } + if($name === '') { + $subject = $subjects->{'"'}; + } else { + $subject = $subjects->{$name}; + } + $subject->{'@id'} = $name; + $properties = array_keys((array)$input); + sort($properties); + foreach($properties as $property) { + // skip @id + if($property === '@id') { + continue; + } + + // handle reverse properties + if($property === '@reverse') { + $referenced_node = (object)array('@id' => $name); + $reverse_map = $input->{'@reverse'}; + foreach($reverse_map as $reverse_property => $items) { + foreach($items as $item) { + $item_name = null; + if(property_exists($item, '@id')) { + $item_name = $item->{'@id'}; + } + if(self::_isBlankNode($item)) { + $item_name = $namer->getName($item_name); + } + $this->_createNodeMap($item, $graphs, $graph, $namer, $item_name); + if($item_name === '') { + $item_name = '"'; + } + self::addValue( + $subjects->{$item_name}, $reverse_property, $referenced_node, + array('propertyIsArray' => true, 'allowDuplicate' => false)); + } + } + continue; + } + + // recurse into graph + if($property === '@graph') { + // add graph subjects map entry + if(!property_exists($graphs, $name)) { + // FIXME: temporary hack to avoid empty property bug + if(!$name) { + $name = '"'; + } + $graphs->{$name} = new stdClass(); + } + $g = ($graph === '@merged') ? $graph : $name; + $this->_createNodeMap( + $input->{$property}, $graphs, $g, $namer, null, null); + continue; + } + + // copy non-@type keywords + if($property !== '@type' && self::_isKeyword($property)) { + if($property === '@index' && property_exists($subject, '@index') && + ($input->{'@index'} !== $subject->{'@index'} || + $input->{'@index'}->{'@id'} !== $subject->{'@index'}->{'@id'})) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; conflicting @index property detected.', + 'jsonld.SyntaxError', 'conflicting indexes', + array('subject' => $subject)); + } + $subject->{$property} = $input->{$property}; + continue; + } + + // iterate over objects + $objects = $input->{$property}; + + // if property is a bnode, assign it a new id + if(strpos($property, '_:') === 0) { + $property = $namer->getName($property); + } + + // ensure property is added for empty arrays + if(count($objects) === 0) { + self::addValue( + $subject, $property, array(), array('propertyIsArray' => true)); + continue; + } + foreach($objects as $o) { + if($property === '@type') { + // rename @type blank nodes + $o = (strpos($o, '_:') === 0) ? $namer->getName($o) : $o; + } + + // handle embedded subject or subject reference + if(self::_isSubject($o) || self::_isSubjectReference($o)) { + // rename blank node @id + $id = property_exists($o, '@id') ? $o->{'@id'} : null; + if(self::_isBlankNode($o)) { + $id = $namer->getName($id); + } + + // add reference and recurse + self::addValue( + $subject, $property, (object)array('@id' => $id), + array('propertyIsArray' => true, 'allowDuplicate' => false)); + $this->_createNodeMap($o, $graphs, $graph, $namer, $id, null); + } else if(self::_isList($o)) { + // handle @list + $_list = new ArrayObject(); + $this->_createNodeMap( + $o->{'@list'}, $graphs, $graph, $namer, $name, $_list); + $o = (object)array('@list' => (array)$_list); + self::addValue( + $subject, $property, $o, + array('propertyIsArray' => true, 'allowDuplicate' => false)); + } else { + // handle @value + $this->_createNodeMap($o, $graphs, $graph, $namer, $name, null); + self::addValue( + $subject, $property, $o, + array('propertyIsArray' => true, 'allowDuplicate' => false)); + } + } + } + } + + /** + * Frames subjects according to the given frame. + * + * @param stdClass $state the current framing state. + * @param array $subjects the subjects to filter. + * @param array $frame the frame. + * @param mixed $parent the parent subject or top-level array. + * @param mixed $property the parent property, initialized to null. + */ + protected function _matchFrame( + $state, $subjects, $frame, $parent, $property) { + // validate the frame + $this->_validateFrame($frame); + $frame = $frame[0]; + + // get flags for current frame + $options = $state->options; + $flags = array( + 'embed' => $this->_getFrameFlag($frame, $options, 'embed'), + 'explicit' => $this->_getFrameFlag($frame, $options, 'explicit'), + 'requireAll' => $this->_getFrameFlag($frame, $options, 'requireAll')); + + // filter out subjects that match the frame + $matches = $this->_filterSubjects($state, $subjects, $frame, $flags); + + // add matches to output + foreach($matches as $id => $subject) { + if($flags['embed'] === '@link' && property_exists($state->link, $id)) { + // TODO: may want to also match an existing linked subject against + // the current frame ... so different frames could produce different + // subjects that are only shared in-memory when the frames are the same + + // add existing linked subject + $this->_addFrameOutput($parent, $property, $state->link->{$id}); + continue; + } + + /* Note: In order to treat each top-level match as a compartmentalized + result, clear the unique embedded subjects map when the property is null, + which only occurs at the top-level. */ + if($property === null) { + $state->uniqueEmbeds = new stdClass(); + } + + // start output for subject + $output = new stdClass(); + $output->{'@id'} = $id; + $state->link->{$id} = $output; + + // if embed is @never or if a circular reference would be created by an + // embed, the subject cannot be embedded, just add the reference; + // note that a circular reference won't occur when the embed flag is + // `@link` as the above check will short-circuit before reaching this point + if($flags['embed'] === '@never' || + $this->_createsCircularReference($subject, $state->subjectStack)) { + $this->_addFrameOutput($parent, $property, $output); + continue; + } + + // if only the last match should be embedded + if($flags['embed'] === '@last') { + // remove any existing embed + if(property_exists($state->uniqueEmbeds, $id)) { + $this->_removeEmbed($state, $id); + } + $state->uniqueEmbeds->{$id} = array( + 'parent' => $parent, 'property' => $property); + } + + // push matching subject onto stack to enable circular embed checks + $state->subjectStack[] = $subject; + + // iterate over subject properties + $props = array_keys((array)$subject); + sort($props); + foreach($props as $prop) { + // copy keywords to output + if(self::_isKeyword($prop)) { + $output->{$prop} = self::copy($subject->{$prop}); + continue; + } + + // explicit is on and property isn't in the frame, skip processing + if($flags['explicit'] && !property_exists($frame, $prop)) { + continue; + } + + // add objects + $objects = $subject->{$prop}; + foreach($objects as $o) { + // recurse into list + if(self::_isList($o)) { + // add empty list + $list = (object)array('@list' => array()); + $this->_addFrameOutput($output, $prop, $list); + + // add list objects + $src = $o->{'@list'}; + foreach($src as $o) { + if(self::_isSubjectReference($o)) { + // recurse into subject reference + $subframe = (property_exists($frame, $prop) ? + $frame->{$prop}[0]->{'@list'} : + $this->_createImplicitFrame($flags)); + $this->_matchFrame( + $state, array($o->{'@id'}), $subframe, $list, '@list'); + } else { + // include other values automatically + $this->_addFrameOutput($list, '@list', self::copy($o)); + } + } + continue; + } + + if(self::_isSubjectReference($o)) { + // recurse into subject reference + $subframe = (property_exists($frame, $prop) ? + $frame->{$prop} : $this->_createImplicitFrame($flags)); + $this->_matchFrame( + $state, array($o->{'@id'}), $subframe, $output, $prop); + } else { + // include other values automatically + $this->_addFrameOutput($output, $prop, self::copy($o)); + } + } + } + + // handle defaults + $props = array_keys((array)$frame); + sort($props); + foreach($props as $prop) { + // skip keywords + if(self::_isKeyword($prop)) { + continue; + } + + // if omit default is off, then include default values for properties + // that appear in the next frame but are not in the matching subject + $next = $frame->{$prop}[0]; + $omit_default_on = $this->_getFrameFlag( + $next, $options, 'omitDefault'); + if(!$omit_default_on && !property_exists($output, $prop)) { + $preserve = '@null'; + if(property_exists($next, '@default')) { + $preserve = self::copy($next->{'@default'}); + } + $preserve = self::arrayify($preserve); + $output->{$prop} = array((object)array('@preserve' => $preserve)); + } + } + + // add output to parent + $this->_addFrameOutput($parent, $property, $output); + + // pop matching subject from circular ref-checking stack + array_pop($state->subjectStack); + } + } + + /** + * Creates an implicit frame when recursing through subject matches. If + * a frame doesn't have an explicit frame for a particular property, then + * a wildcard child frame will be created that uses the same flags that the + * parent frame used. + * + * @param assoc flags the current framing flags. + * + * @return array the implicit frame. + */ + function _createImplicitFrame($flags) { + $frame = new stdClass(); + foreach($flags as $key => $value) { + $frame->{'@' . $key} = array($flags[$key]); + } + return array($frame); + } + + /** + * Checks the current subject stack to see if embedding the given subject + * would cause a circular reference. + * + * @param stdClass subject_to_embed the subject to embed. + * @param assoc subject_stack the current stack of subjects. + * + * @return bool true if a circular reference would be created, false if not. + */ + function _createsCircularReference($subject_to_embed, $subject_stack) { + for($i = count($subject_stack) - 1; $i >= 0; --$i) { + if($subject_stack[$i]->{'@id'} === $subject_to_embed->{'@id'}) { + return true; + } + } + return false; + } + + /** + * Gets the frame flag value for the given flag name. + * + * @param stdClass $frame the frame. + * @param stdClass $options the framing options. + * @param string $name the flag name. + * + * @return mixed $the flag value. + */ + protected function _getFrameFlag($frame, $options, $name) { + $flag = "@$name"; + $rval = (property_exists($frame, $flag) ? + $frame->{$flag}[0] : $options[$name]); + if($name === 'embed') { + // default is "@last" + // backwards-compatibility support for "embed" maps: + // true => "@last" + // false => "@never" + if($rval === true) { + $rval = '@last'; + } else if($rval === false) { + $rval = '@never'; + } else if($rval !== '@always' && $rval !== '@never' && + $rval !== '@link') { + $rval = '@last'; + } + } + return $rval; + } + + /** + * Validates a JSON-LD frame, throwing an exception if the frame is invalid. + * + * @param array $frame the frame to validate. + */ + protected function _validateFrame($frame) { + if(!is_array($frame) || count($frame) !== 1 || !is_object($frame[0])) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; a JSON-LD frame must be a single object.', + 'jsonld.SyntaxError', null, array('frame' => $frame)); + } + } + + /** + * Returns a map of all of the subjects that match a parsed frame. + * + * @param stdClass $state the current framing state. + * @param array $subjects the set of subjects to filter. + * @param stdClass $frame the parsed frame. + * @param assoc $flags the frame flags. + * + * @return stdClass all of the matched subjects. + */ + protected function _filterSubjects($state, $subjects, $frame, $flags) { + $rval = new stdClass(); + sort($subjects); + foreach($subjects as $id) { + $subject = $state->subjects->{$id}; + if($this->_filterSubject($subject, $frame, $flags)) { + $rval->{$id} = $subject; + } + } + return $rval; + } + + /** + * Returns true if the given subject matches the given frame. + * + * @param stdClass $subject the subject to check. + * @param stdClass $frame the frame to check. + * @param assoc $flags the frame flags. + * + * @return bool true if the subject matches, false if not. + */ + protected function _filterSubject($subject, $frame, $flags) { + // check @type (object value means 'any' type, fall through to ducktyping) + if(property_exists($frame, '@type') && + !(count($frame->{'@type'}) === 1 && is_object($frame->{'@type'}[0]))) { + $types = $frame->{'@type'}; + foreach($types as $type) { + // any matching @type is a match + if(self::hasValue($subject, '@type', $type)) { + return true; + } + } + return false; + } + + // check ducktype + $wildcard = true; + $matches_some = false; + foreach($frame as $k => $v) { + if(self::_isKeyword($k)) { + // skip non-@id and non-@type + if($k !== '@id' && $k !== '@type') { + continue; + } + $wildcard = false; + + // check @id for a specific @id value + if($k === '@id' && is_string($v)) { + if(!property_exists($subject, $k) || $subject->{$k} !== $v) { + return false; + } + $matches_some = true; + continue; + } + } + + $wildcard = false; + + if(property_exists($subject, $k)) { + // $v === [] means do not match if property is present + if(is_array($v) && count($v) === 0) { + return false; + } + $matches_some = true; + continue; + } + + // all properties must match to be a duck unless a @default is specified + $has_default = (is_array($v) && count($v) === 1 && is_object($v[0]) && + property_exists($v[0], '@default')); + if($flags['requireAll'] && !$has_default) { + return false; + } + } + + // return true if wildcard or subject matches some properties + return $wildcard || $matches_some; + } + + /** + * Removes an existing embed. + * + * @param stdClass $state the current framing state. + * @param string $id the @id of the embed to remove. + */ + protected function _removeEmbed($state, $id) { + // get existing embed + $embeds = $state->uniqueEmbeds; + $embed = $embeds->{$id}; + $property = $embed['property']; + + // create reference to replace embed + $subject = (object)array('@id' => $id); + + // remove existing embed + if(is_array($embed->parent)) { + // replace subject with reference + foreach($embed->parent as $i => $parent) { + if(self::compareValues($parent, $subject)) { + $embed->parent[$i] = $subject; + break; + } + } + } else { + // replace subject with reference + $use_array = is_array($embed->parent->{$property}); + self::removeValue($embed->parent, $property, $subject, + array('propertyIsArray' => $use_array)); + self::addValue($embed->parent, $property, $subject, + array('propertyIsArray' => $use_array)); + } + + // recursively remove dependent dangling embeds + $removeDependents = function($id) { + // get embed keys as a separate array to enable deleting keys in map + $ids = array_keys((array)$embeds); + foreach($ids as $next) { + if(property_exists($embeds, $next) && + is_object($embeds->{$next}->parent) && + $embeds->{$next}->parent->{'@id'} === $id) { + unset($embeds->{$next}); + $removeDependents($next); + } + } + }; + $removeDependents($id); + } + + /** + * Adds framing output to the given parent. + * + * @param mixed $parent the parent to add to. + * @param string $property the parent property. + * @param mixed $output the output to add. + */ + protected function _addFrameOutput($parent, $property, $output) { + if(is_object($parent) && !($parent instanceof ArrayObject)) { + self::addValue( + $parent, $property, $output, array('propertyIsArray' => true)); + } else { + $parent[] = $output; + } + } + + /** + * Removes the @preserve keywords as the last step of the framing algorithm. + * + * @param stdClass $ctx the active context used to compact the input. + * @param mixed $input the framed, compacted output. + * @param assoc $options the compaction options used. + * + * @return mixed the resulting output. + */ + protected function _removePreserve($ctx, $input, $options) { + // recurse through arrays + if(is_array($input)) { + $output = array(); + foreach($input as $e) { + $result = $this->_removePreserve($ctx, $e, $options); + // drop nulls from arrays + if($result !== null) { + $output[] = $result; + } + } + $input = $output; + } else if(is_object($input)) { + // remove @preserve + if(property_exists($input, '@preserve')) { + if($input->{'@preserve'} === '@null') { + return null; + } + return $input->{'@preserve'}; + } + + // skip @values + if(self::_isValue($input)) { + return $input; + } + + // recurse through @lists + if(self::_isList($input)) { + $input->{'@list'} = $this->_removePreserve( + $ctx, $input->{'@list'}, $options); + return $input; + } + + // handle in-memory linked nodes + $id_alias = $this->_compactIri($ctx, '@id'); + if(property_exists($input, $id_alias)) { + $id = $input->{$id_alias}; + if(isset($options['link'][$id])) { + $idx = array_search($input, $options['link'][$id]); + if($idx === false) { + // prevent circular visitation + $options['link'][$id][] = $input; + } else { + // already visited + return $options['link'][$id][$idx]; + } + } else { + // prevent circular visitation + $options['link'][$id] = array($input); + } + } + + // recurse through properties + foreach($input as $prop => $v) { + $result = $this->_removePreserve($ctx, $v, $options); + $container = self::getContextValue($ctx, $prop, '@container'); + if($options['compactArrays'] && + is_array($result) && count($result) === 1 && + $container !== '@set' && $container !== '@list') { + $result = $result[0]; + } + $input->{$prop} = $result; + } + } + return $input; + } + + /** + * Compares two RDF triples for equality. + * + * @param stdClass $t1 the first triple. + * @param stdClass $t2 the second triple. + * + * @return true if the triples are the same, false if not. + */ + protected static function _compareRDFTriples($t1, $t2) { + foreach(array('subject', 'predicate', 'object') as $attr) { + if($t1->{$attr}->type !== $t2->{$attr}->type || + $t1->{$attr}->value !== $t2->{$attr}->value) { + return false; + } + } + if(property_exists($t1->object, 'language') !== + property_exists($t1->object, 'language')) { + return false; + } + if(property_exists($t1->object, 'language') && + $t1->object->language !== $t2->object->language) { + return false; + } + if(property_exists($t1->object, 'datatype') && + $t1->object->datatype !== $t2->object->datatype) { + return false; + } + return true; + } + + /** + * Hashes all of the quads about a blank node. + * + * @param string $id the ID of the bnode to hash quads for. + * @param stdClass $bnodes the mapping of bnodes to quads. + * @param UniqueNamer $namer the canonical bnode namer. + * + * @return string the new hash. + */ + protected function _hashQuads($id, $bnodes, $namer) { + // return cached hash + if(property_exists($bnodes->{$id}, 'hash')) { + return $bnodes->{$id}->hash; + } + + // serialize all of bnode's quads + $quads = $bnodes->{$id}->quads; + $nquads = array(); + foreach($quads as $quad) { + $nquads[] = $this->toNQuad($quad, property_exists($quad, 'name') ? + $quad->name->value : null, $id); + } + + // sort serialized quads + sort($nquads); + + // cache and return hashed quads + $hash = $bnodes->{$id}->hash = sha1(implode($nquads)); + return $hash; + } + + /** + * Produces a hash for the paths of adjacent bnodes for a bnode, + * incorporating all information about its subgraph of bnodes. This + * method will recursively pick adjacent bnode permutations that produce the + * lexicographically-least 'path' serializations. + * + * @param string $id the ID of the bnode to hash paths for. + * @param stdClass $bnodes the map of bnode quads. + * @param UniqueNamer $namer the canonical bnode namer. + * @param UniqueNamer $path_namer the namer used to assign names to adjacent + * bnodes. + * + * @return stdClass the hash and path namer used. + */ + protected function _hashPaths($id, $bnodes, $namer, $path_namer) { + // create SHA-1 digest + $md = hash_init('sha1'); + + // group adjacent bnodes by hash, keep properties and references separate + $groups = new stdClass(); + $quads = $bnodes->{$id}->quads; + foreach($quads as $quad) { + // get adjacent bnode + $bnode = $this->_getAdjacentBlankNodeName($quad->subject, $id); + if($bnode !== null) { + // normal property + $direction = 'p'; + } else { + $bnode = $this->_getAdjacentBlankNodeName($quad->object, $id); + if($bnode !== null) { + // reverse property + $direction = 'r'; + } + } + if($bnode !== null) { + // get bnode name (try canonical, path, then hash) + if($namer->isNamed($bnode)) { + $name = $namer->getName($bnode); + } else if($path_namer->isNamed($bnode)) { + $name = $path_namer->getName($bnode); + } else { + $name = $this->_hashQuads($bnode, $bnodes, $namer); + } + + // hash direction, property, and bnode name/hash + $group_md = hash_init('sha1'); + hash_update($group_md, $direction); + hash_update($group_md, $quad->predicate->value); + hash_update($group_md, $name); + $group_hash = hash_final($group_md); + + // add bnode to hash group + if(property_exists($groups, $group_hash)) { + $groups->{$group_hash}[] = $bnode; + } else { + $groups->{$group_hash} = array($bnode); + } + } + } + + // iterate over groups in sorted hash order + $group_hashes = array_keys((array)$groups); + sort($group_hashes); + foreach($group_hashes as $group_hash) { + // digest group hash + hash_update($md, $group_hash); + + // choose a path and namer from the permutations + $chosen_path = null; + $chosen_namer = null; + $permutator = new Permutator($groups->{$group_hash}); + while($permutator->hasNext()) { + $permutation = $permutator->next(); + $path_namer_copy = clone $path_namer; + + // build adjacent path + $path = ''; + $skipped = false; + $recurse = array(); + foreach($permutation as $bnode) { + // use canonical name if available + if($namer->isNamed($bnode)) { + $path .= $namer->getName($bnode); + } else { + // recurse if bnode isn't named in the path yet + if(!$path_namer_copy->isNamed($bnode)) { + $recurse[] = $bnode; + } + $path .= $path_namer_copy->getName($bnode); + } + + // skip permutation if path is already >= chosen path + if($chosen_path !== null && strlen($path) >= strlen($chosen_path) && + $path > $chosen_path) { + $skipped = true; + break; + } + } + + // recurse + if(!$skipped) { + foreach($recurse as $bnode) { + $result = $this->_hashPaths( + $bnode, $bnodes, $namer, $path_namer_copy); + $path .= $path_namer_copy->getName($bnode); + $path .= "<{$result->hash}>"; + $path_namer_copy = $result->pathNamer; + + // skip permutation if path is already >= chosen path + if($chosen_path !== null && + strlen($path) >= strlen($chosen_path) && $path > $chosen_path) { + $skipped = true; + break; + } + } + } + + if(!$skipped && ($chosen_path === null || $path < $chosen_path)) { + $chosen_path = $path; + $chosen_namer = $path_namer_copy; + } + } + + // digest chosen path and update namer + hash_update($md, $chosen_path); + $path_namer = $chosen_namer; + } + + // return SHA-1 hash and path namer + return (object)array( + 'hash' => hash_final($md), 'pathNamer' => $path_namer); + } + + /** + * A helper function that gets the blank node name from an RDF quad + * node (subject or object). If the node is not a blank node or its + * value does not match the given blank node ID, it will be returned. + * + * @param stdClass $node the RDF quad node. + * @param string $id the ID of the blank node to look next to. + * + * @return mixed the adjacent blank node name or null if none was found. + */ + protected function _getAdjacentBlankNodeName($node, $id) { + if($node->type === 'blank node' && $node->value !== $id) { + return $node->value; + } + return null; + } + + /** + * Compares two strings first based on length and then lexicographically. + * + * @param string $a the first string. + * @param string $b the second string. + * + * @return integer -1 if a < b, 1 if a > b, 0 if a == b. + */ + protected function _compareShortestLeast($a, $b) { + $len_a = strlen($a); + $len_b = strlen($b); + if($len_a < $len_b) { + return -1; + } + if($len_b < $len_a) { + return 1; + } + if($a === $b) { + return 0; + } + return ($a < $b) ? -1 : 1; + } + + /** + * Picks the preferred compaction term from the given inverse context entry. + * + * @param active_ctx the active context. + * @param iri the IRI to pick the term for. + * @param value the value to pick the term for. + * @param containers the preferred containers. + * @param type_or_language either '@type' or '@language'. + * @param type_or_language_value the preferred value for '@type' or + * '@language'. + * + * @return mixed the preferred term. + */ + protected function _selectTerm( + $active_ctx, $iri, $value, $containers, + $type_or_language, $type_or_language_value) { + if($type_or_language_value === null) { + $type_or_language_value = '@null'; + } + + // options for the value of @type or @language + $prefs = array(); + + // determine prefs for @id based on whether or not value compacts to a term + if(($type_or_language_value === '@id' || + $type_or_language_value === '@reverse') && + self::_isSubjectReference($value)) { + // prefer @reverse first + if($type_or_language_value === '@reverse') { + $prefs[] = '@reverse'; + } + // try to compact value to a term + $term = $this->_compactIri( + $active_ctx, $value->{'@id'}, null, array('vocab' => true)); + if(property_exists($active_ctx->mappings, $term) && + $active_ctx->mappings->{$term} && + $active_ctx->mappings->{$term}->{'@id'} === $value->{'@id'}) { + // prefer @vocab + array_push($prefs, '@vocab', '@id'); + } else { + // prefer @id + array_push($prefs, '@id', '@vocab'); + } + } else { + $prefs[] = $type_or_language_value; + } + $prefs[] = '@none'; + + $container_map = $active_ctx->inverse->{$iri}; + foreach($containers as $container) { + // if container not available in the map, continue + if(!property_exists($container_map, $container)) { + continue; + } + + $type_or_language_value_map = + $container_map->{$container}->{$type_or_language}; + foreach($prefs as $pref) { + // if type/language option not available in the map, continue + if(!property_exists($type_or_language_value_map, $pref)) { + continue; + } + + // select term + return $type_or_language_value_map->{$pref}; + } + } + return null; + } + + /** + * Compacts an IRI or keyword into a term or prefix if it can be. If the + * IRI has an associated value it may be passed. + * + * @param stdClass $active_ctx the active context to use. + * @param string $iri the IRI to compact. + * @param mixed $value the value to check or null. + * @param assoc $relative_to options for how to compact IRIs: + * vocab: true to split after @vocab, false not to. + * @param bool $reverse true if a reverse property is being compacted, false + * if not. + * + * @return string the compacted term, prefix, keyword alias, or original IRI. + */ + protected function _compactIri( + $active_ctx, $iri, $value=null, $relative_to=array(), $reverse=false) { + // can't compact null + if($iri === null) { + return $iri; + } + + $inverse_ctx = $this->_getInverseContext($active_ctx); + + if(self::_isKeyword($iri)) { + // a keyword can only be compacted to simple alias + if(property_exists($inverse_ctx, $iri)) { + return $inverse_ctx->$iri->{'@none'}->{'@type'}->{'@none'}; + } + return $iri; + } + + if(!isset($relative_to['vocab'])) { + $relative_to['vocab'] = false; + } + + // use inverse context to pick a term if iri is relative to vocab + if($relative_to['vocab'] && property_exists($inverse_ctx, $iri)) { + $default_language = '@none'; + if(property_exists($active_ctx, '@language')) { + $default_language = $active_ctx->{'@language'}; + } + + // prefer @index if available in value + $containers = array(); + if(is_object($value) && property_exists($value, '@index')) { + $containers[] = '@index'; + } + + // defaults for term selection based on type/language + $type_or_language = '@language'; + $type_or_language_value = '@null'; + + if($reverse) { + $type_or_language = '@type'; + $type_or_language_value = '@reverse'; + $containers[] = '@set'; + } else if(self::_isList($value)) { + // choose the most specific term that works for all elements in @list + // only select @list containers if @index is NOT in value + if(!property_exists($value, '@index')) { + $containers[] = '@list'; + } + $list = $value->{'@list'}; + $common_language = (count($list) === 0) ? $default_language : null; + $common_type = null; + foreach($list as $item) { + $item_language = '@none'; + $item_type = '@none'; + if(self::_isValue($item)) { + if(property_exists($item, '@language')) { + $item_language = $item->{'@language'}; + } else if(property_exists($item, '@type')) { + $item_type = $item->{'@type'}; + } else { + // plain literal + $item_language = '@null'; + } + } else { + $item_type = '@id'; + } + if($common_language === null) { + $common_language = $item_language; + } else if($item_language !== $common_language && + self::_isValue($item)) { + $common_language = '@none'; + } + if($common_type === null) { + $common_type = $item_type; + } else if($item_type !== $common_type) { + $common_type = '@none'; + } + // there are different languages and types in the list, so choose + // the most generic term, no need to keep iterating the list + if($common_language === '@none' && $common_type === '@none') { + break; + } + } + if($common_language === null) { + $common_language = '@none'; + } + if($common_type === null) { + $common_type = '@none'; + } + if($common_type !== '@none') { + $type_or_language = '@type'; + $type_or_language_value = $common_type; + } else { + $type_or_language_value = $common_language; + } + } else { + if(self::_isValue($value)) { + if(property_exists($value, '@language') && + !property_exists($value, '@index')) { + $containers[] = '@language'; + $type_or_language_value = $value->{'@language'}; + } else if(property_exists($value, '@type')) { + $type_or_language = '@type'; + $type_or_language_value = $value->{'@type'}; + } + } else { + $type_or_language = '@type'; + $type_or_language_value = '@id'; + } + $containers[] = '@set'; + } + + // do term selection + $containers[] = '@none'; + $term = $this->_selectTerm( + $active_ctx, $iri, $value, + $containers, $type_or_language, $type_or_language_value); + if($term !== null) { + return $term; + } + } + + // no term match, use @vocab if available + if($relative_to['vocab']) { + if(property_exists($active_ctx, '@vocab')) { + // determine if vocab is a prefix of the iri + $vocab = $active_ctx->{'@vocab'}; + if(strpos($iri, $vocab) === 0 && $iri !== $vocab) { + // use suffix as relative iri if it is not a term in the active + // context + $suffix = substr($iri, strlen($vocab)); + if(!property_exists($active_ctx->mappings, $suffix)) { + return $suffix; + } + } + } + } + + // no term or @vocab match, check for possible CURIEs + $choice = null; + $idx = 0; + $partial_matches = array(); + $iri_map = $active_ctx->fast_curie_map; + // check for partial matches of against `iri`, which means look until + // iri.length - 1, not full length + $max_partial_length = strlen($iri) - 1; + for(; $idx < $max_partial_length && isset($iri_map[$iri[$idx]]); ++$idx) { + $iri_map = $iri_map[$iri[$idx]]; + if(isset($iri_map[''])) { + $entry = $iri_map[''][0]; + $entry->iri_length = $idx + 1; + $partial_matches[] = $entry; + } + } + // check partial matches in reverse order to prefer longest ones first + $partial_matches = array_reverse($partial_matches); + foreach($partial_matches as $entry) { + $terms = $entry->terms; + foreach($terms as $term) { + // a CURIE is usable if: + // 1. it has no mapping, OR + // 2. value is null, which means we're not compacting an @value, AND + // the mapping matches the IRI + $curie = $term . ':' . substr($iri, $entry->iri_length); + $is_usable_curie = (!property_exists($active_ctx->mappings, $curie) || + ($value === null && + $active_ctx->mappings->{$curie}->{'@id'} === $iri)); + + // select curie if it is shorter or the same length but + // lexicographically less than the current choice + if($is_usable_curie && ($choice === null || + self::_compareShortestLeast($curie, $choice) < 0)) { + $choice = $curie; + } + } + } + + // return chosen curie + if($choice !== null) { + return $choice; + } + + // compact IRI relative to base + if(!$relative_to['vocab']) { + return jsonld_remove_base($active_ctx->{'@base'}, $iri); + } + + // return IRI as is + return $iri; + } + + /** + * Performs value compaction on an object with '@value' or '@id' as the only + * property. + * + * @param stdClass $active_ctx the active context. + * @param string $active_property the active property that points to the + * value. + * @param mixed $value the value to compact. + * + * @return mixed the compaction result. + */ + protected function _compactValue($active_ctx, $active_property, $value) { + // value is a @value + if(self::_isValue($value)) { + // get context rules + $type = self::getContextValue($active_ctx, $active_property, '@type'); + $language = self::getContextValue( + $active_ctx, $active_property, '@language'); + $container = self::getContextValue( + $active_ctx, $active_property, '@container'); + + // whether or not the value has an @index that must be preserved + $preserve_index = (property_exists($value, '@index') && + $container !== '@index'); + + // if there's no @index to preserve + if(!$preserve_index) { + // matching @type or @language specified in context, compact value + if(self::_hasKeyValue($value, '@type', $type) || + self::_hasKeyValue($value, '@language', $language)) { + return $value->{'@value'}; + } + } + + // return just the value of @value if all are true: + // 1. @value is the only key or @index isn't being preserved + // 2. there is no default language or @value is not a string or + // the key has a mapping with a null @language + $key_count = count(array_keys((array)$value)); + $is_value_only_key = ($key_count === 1 || + ($key_count === 2 && property_exists($value, '@index') && + !$preserve_index)); + $has_default_language = property_exists($active_ctx, '@language'); + $is_value_string = is_string($value->{'@value'}); + $has_null_mapping = ( + property_exists($active_ctx->mappings, $active_property) && + $active_ctx->mappings->{$active_property} !== null && + self::_hasKeyValue( + $active_ctx->mappings->{$active_property}, '@language', null)); + if($is_value_only_key && + (!$has_default_language || !$is_value_string || $has_null_mapping)) { + return $value->{'@value'}; + } + + $rval = new stdClass(); + + // preserve @index + if($preserve_index) { + $rval->{$this->_compactIri($active_ctx, '@index')} = $value->{'@index'}; + } + + // compact @type IRI + if(property_exists($value, '@type')) { + $rval->{$this->_compactIri($active_ctx, '@type')} = $this->_compactIri( + $active_ctx, $value->{'@type'}, null, array('vocab' => true)); + } else if(property_exists($value, '@language')) { + // alias @language + $rval->{$this->_compactIri($active_ctx, '@language')} = + $value->{'@language'}; + } + + // alias @value + $rval->{$this->_compactIri($active_ctx, '@value')} = $value->{'@value'}; + + return $rval; + } + + // value is a subject reference + $expanded_property = $this->_expandIri( + $active_ctx, $active_property, array('vocab' => true)); + $type = self::getContextValue($active_ctx, $active_property, '@type'); + $compacted = $this->_compactIri( + $active_ctx, $value->{'@id'}, null, + array('vocab' => ($type === '@vocab'))); + + // compact to scalar + if($type === '@id' || $type === '@vocab' || + $expanded_property === '@graph') { + return $compacted; + } + + $rval = (object)array( + $this->_compactIri($active_ctx, '@id') => $compacted); + return $rval; + } + + /** + * Creates a term definition during context processing. + * + * @param stdClass $active_ctx the current active context. + * @param stdClass $local_ctx the local context being processed. + * @param string $term the key in the local context to define the mapping for. + * @param stdClass $defined a map of defining/defined keys to detect cycles + * and prevent double definitions. + */ + protected function _createTermDefinition( + $active_ctx, $local_ctx, $term, $defined) { + if(property_exists($defined, $term)) { + // term already defined + if($defined->{$term}) { + return; + } + // cycle detected + throw new JsonLdException( + 'Cyclical context definition detected.', + 'jsonld.CyclicalContext', 'cyclic IRI mapping', + array('context' => $local_ctx, 'term' => $term)); + } + + // now defining term + $defined->{$term} = false; + + if(self::_isKeyword($term)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; keywords cannot be overridden.', + 'jsonld.SyntaxError', 'keyword redefinition', + array('context' => $local_ctx, 'term' => $term)); + } + + // remove old mapping + if(property_exists($active_ctx->mappings, $term)) { + unset($active_ctx->mappings->{$term}); + } + + // get context term value + $value = $local_ctx->{$term}; + + // clear context entry + if($value === null || (is_object($value) && + self::_hasKeyValue($value, '@id', null))) { + $active_ctx->mappings->{$term} = null; + $defined->{$term} = true; + return; + } + + // convert short-hand value to object w/@id + if(is_string($value)) { + $value = (object)array('@id' => $value); + } + + if(!is_object($value)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; @context property values must be ' . + 'strings or objects.', 'jsonld.SyntaxError', 'invalid term definition', + array('context' => $local_ctx)); + } + + // create new mapping + $mapping = $active_ctx->mappings->{$term} = new stdClass(); + $mapping->reverse = false; + + if(property_exists($value, '@reverse')) { + if(property_exists($value, '@id')) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; a @reverse term definition must not ' + + 'contain @id.', 'jsonld.SyntaxError', 'invalid reverse property', + array('context' => $local_ctx)); + } + $reverse = $value->{'@reverse'}; + if(!is_string($reverse)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; a @context @reverse value must be a string.', + 'jsonld.SyntaxError', 'invalid IRI mapping', + array('context' => $local_ctx)); + } + + // expand and add @id mapping + $id = $this->_expandIri( + $active_ctx, $reverse, array('vocab' => true, 'base' => false), + $local_ctx, $defined); + if(!self::_isAbsoluteIri($id)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; @context @reverse value must be ' . + 'an absolute IRI or a blank node identifier.', + 'jsonld.SyntaxError', 'invalid IRI mapping', + array('context' => $local_ctx)); + } + $mapping->{'@id'} = $id; + $mapping->reverse = true; + } else if(property_exists($value, '@id')) { + $id = $value->{'@id'}; + if(!is_string($id)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; @context @id value must be a string.', + 'jsonld.SyntaxError', 'invalid IRI mapping', + array('context' => $local_ctx)); + } + if($id !== $term) { + // add @id to mapping + $id = $this->_expandIri( + $active_ctx, $id, array('vocab' => true, 'base' => false), + $local_ctx, $defined); + if(!self::_isAbsoluteIri($id) && !self::_isKeyword($id)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; @context @id value must be an ' . + 'absolute IRI, a blank node identifier, or a keyword.', + 'jsonld.SyntaxError', 'invalid IRI mapping', + array('context' => $local_ctx)); + } + $mapping->{'@id'} = $id; + } + } + + // always compute whether term has a colon as an optimization for + // _compactIri + $colon = strpos($term, ':'); + $mapping->_term_has_colon = ($colon !== false); + + if(!property_exists($mapping, '@id')) { + // see if the term has a prefix + if($mapping->_term_has_colon) { + $prefix = substr($term, 0, $colon); + if(property_exists($local_ctx, $prefix)) { + // define parent prefix + $this->_createTermDefinition( + $active_ctx, $local_ctx, $prefix, $defined); + } + + if(property_exists($active_ctx->mappings, $prefix) && + $active_ctx->mappings->{$prefix}) { + // set @id based on prefix parent + $suffix = substr($term, $colon + 1); + $mapping->{'@id'} = $active_ctx->mappings->{$prefix}->{'@id'} . + $suffix; + } else { + // term is an absolute IRI + $mapping->{'@id'} = $term; + } + } else { + // non-IRIs *must* define @ids if @vocab is not available + if(!property_exists($active_ctx, '@vocab')) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; @context terms must define an @id.', + 'jsonld.SyntaxError', 'invalid IRI mapping', + array('context' => $local_ctx, 'term' => $term)); + } + // prepend vocab to term + $mapping->{'@id'} = $active_ctx->{'@vocab'} . $term; + } + } + + // optimization to store length of @id once for _compactIri + $mapping->_id_length = strlen($mapping->{'@id'}); + + // IRI mapping now defined + $defined->{$term} = true; + + if(property_exists($value, '@type')) { + $type = $value->{'@type'}; + if(!is_string($type)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; @context @type values must be strings.', + 'jsonld.SyntaxError', 'invalid type mapping', + array('context' => $local_ctx)); + } + + if($type !== '@id' && $type !== '@vocab') { + // expand @type to full IRI + $type = $this->_expandIri( + $active_ctx, $type, array('vocab' => true), $local_ctx, $defined); + if(!self::_isAbsoluteIri($type)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; an @context @type value must ' . + 'be an absolute IRI.', 'jsonld.SyntaxError', + 'invalid type mapping', array('context' => $local_ctx)); + } + if(strpos($type, '_:') === 0) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; an @context @type values must ' . + 'be an IRI, not a blank node identifier.', + 'jsonld.SyntaxError', 'invalid type mapping', + array('context' => $local_ctx)); + } + } + + // add @type to mapping + $mapping->{'@type'} = $type; + } + + if(property_exists($value, '@container')) { + $container = $value->{'@container'}; + if($container !== '@list' && $container !== '@set' && + $container !== '@index' && $container !== '@language') { + throw new JsonLdException( + 'Invalid JSON-LD syntax; @context @container value must be ' . + 'one of the following: @list, @set, @index, or @language.', + 'jsonld.SyntaxError', 'invalid container mapping', + array('context' => $local_ctx)); + } + if($mapping->reverse && $container !== '@index' && + $container !== '@set' && $container !== null) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; @context @container value for a @reverse ' + + 'type definition must be @index or @set.', + 'jsonld.SyntaxError', 'invalid reverse property', + array('context' => $local_ctx)); + } + + // add @container to mapping + $mapping->{'@container'} = $container; + } + + if(property_exists($value, '@language') && + !property_exists($value, '@type')) { + $language = $value->{'@language'}; + if($language !== null && !is_string($language)) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; @context @language value must be ' . + 'a string or null.', 'jsonld.SyntaxError', + 'invalid language mapping', array('context' => $local_ctx)); + } + + // add @language to mapping + if($language !== null) { + $language = strtolower($language); + } + $mapping->{'@language'} = $language; + } + + // disallow aliasing @context and @preserve + $id = $mapping->{'@id'}; + if($id === '@context' || $id === '@preserve') { + throw new JsonLdException( + 'Invalid JSON-LD syntax; @context and @preserve cannot be aliased.', + 'jsonld.SyntaxError', 'invalid keyword alias', + array('context' => $local_ctx)); + } + } + + /** + * Expands a string to a full IRI. The string may be a term, a prefix, a + * relative IRI, or an absolute IRI. The associated absolute IRI will be + * returned. + * + * @param stdClass $active_ctx the current active context. + * @param string $value the string to expand. + * @param assoc $relative_to options for how to resolve relative IRIs: + * base: true to resolve against the base IRI, false not to. + * vocab: true to concatenate after @vocab, false not to. + * @param stdClass $local_ctx the local context being processed (only given + * if called during document processing). + * @param defined a map for tracking cycles in context definitions (only given + * if called during document processing). + * + * @return mixed the expanded value. + */ + function _expandIri( + $active_ctx, $value, $relative_to=array(), $local_ctx=null, $defined=null) { + // already expanded + if($value === null || self::_isKeyword($value)) { + return $value; + } + + // define term dependency if not defined + if($local_ctx !== null && property_exists($local_ctx, $value) && + !self::_hasKeyValue($defined, $value, true)) { + $this->_createTermDefinition($active_ctx, $local_ctx, $value, $defined); + } + + if(isset($relative_to['vocab']) && $relative_to['vocab']) { + if(property_exists($active_ctx->mappings, $value)) { + $mapping = $active_ctx->mappings->{$value}; + + // value is explicitly ignored with a null mapping + if($mapping === null) { + return null; + } + + // value is a term + return $mapping->{'@id'}; + } + } + + // split value into prefix:suffix + $colon = strpos($value, ':'); + if($colon !== false) { + $prefix = substr($value, 0, $colon); + $suffix = substr($value, $colon + 1); + + // do not expand blank nodes (prefix of '_') or already-absolute + // IRIs (suffix of '//') + if($prefix === '_' || strpos($suffix, '//') === 0) { + return $value; + } + + // prefix dependency not defined, define it + if($local_ctx !== null && property_exists($local_ctx, $prefix)) { + $this->_createTermDefinition( + $active_ctx, $local_ctx, $prefix, $defined); + } + + // use mapping if prefix is defined + if(property_exists($active_ctx->mappings, $prefix)) { + $mapping = $active_ctx->mappings->{$prefix}; + if($mapping) { + return $mapping->{'@id'} . $suffix; + } + } + + // already absolute IRI + return $value; + } + + // prepend vocab + if(isset($relative_to['vocab']) && $relative_to['vocab'] && + property_exists($active_ctx, '@vocab')) { + return $active_ctx->{'@vocab'} . $value; + } + + // prepend base + $rval = $value; + if(isset($relative_to['base']) && $relative_to['base']) { + $rval = jsonld_prepend_base($active_ctx->{'@base'}, $rval); + } + + return $rval; + } + + /** + * Finds all @context URLs in the given JSON-LD input. + * + * @param mixed $input the JSON-LD input. + * @param stdClass $urls a map of URLs (url => false/@contexts). + * @param bool $replace true to replace the URLs in the given input with + * the @contexts from the urls map, false not to. + * @param string $base the base URL to resolve relative URLs with. + */ + protected function _findContextUrls($input, $urls, $replace, $base) { + if(is_array($input)) { + foreach($input as $e) { + $this->_findContextUrls($e, $urls, $replace, $base); + } + } else if(is_object($input)) { + foreach($input as $k => &$v) { + if($k !== '@context') { + $this->_findContextUrls($v, $urls, $replace, $base); + continue; + } + + // array @context + if(is_array($v)) { + $length = count($v); + for($i = 0; $i < $length; ++$i) { + if(is_string($v[$i])) { + $url = jsonld_prepend_base($base, $v[$i]); + // replace w/@context if requested + if($replace) { + $ctx = $urls->{$url}; + if(is_array($ctx)) { + // add flattened context + array_splice($v, $i, 1, $ctx); + $i += count($ctx) - 1; + $length = count($v); + } else { + $v[$i] = $ctx; + } + } else if(!property_exists($urls, $url)) { + // @context URL found + $urls->{$url} = false; + } + } + } + } else if(is_string($v)) { + // string @context + $v = jsonld_prepend_base($base, $v); + // replace w/@context if requested + if($replace) { + $input->{$k} = $urls->{$v}; + } else if(!property_exists($urls, $v)) { + // @context URL found + $urls->{$v} = false; + } + } + } + } + } + + /** + * Retrieves external @context URLs using the given document loader. Each + * instance of @context in the input that refers to a URL will be replaced + * with the JSON @context found at that URL. + * + * @param mixed $input the JSON-LD input with possible contexts. + * @param stdClass $cycles an object for tracking context cycles. + * @param callable $load_document(url) the document loader. + * @param base $base the base URL to resolve relative URLs against. + * + * @return mixed the result. + */ + protected function _retrieveContextUrls( + &$input, $cycles, $load_document, $base='') { + if(count(get_object_vars($cycles)) > self::MAX_CONTEXT_URLS) { + throw new JsonLdException( + 'Maximum number of @context URLs exceeded.', + 'jsonld.ContextUrlError', 'loading remote context failed', + array('max' => self::MAX_CONTEXT_URLS)); + } + + // for tracking the URLs to retrieve + $urls = new stdClass(); + + // regex for validating URLs + $regex = '/(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/'; + + // find all URLs in the given input + $this->_findContextUrls($input, $urls, false, $base); + + // queue all unretrieved URLs + $queue = array(); + foreach($urls as $url => $ctx) { + if($ctx === false) { + // validate URL + if(!preg_match($regex, $url)) { + throw new JsonLdException( + 'Malformed or unsupported URL.', 'jsonld.InvalidUrl', + 'loading remote context failed', array('url' => $url)); + } + $queue[] = $url; + } + } + + // retrieve URLs in queue + foreach($queue as $url) { + // check for context URL cycle + if(property_exists($cycles, $url)) { + throw new JsonLdException( + 'Cyclical @context URLs detected.', + 'jsonld.ContextUrlError', 'recursive context inclusion', + array('url' => $url)); + } + $_cycles = self::copy($cycles); + $_cycles->{$url} = true; + + // retrieve URL + $remote_doc = call_user_func($load_document, $url); + $ctx = $remote_doc->document; + + // parse string context as JSON + if(is_string($ctx)) { + try { + $ctx = self::_parse_json($ctx); + } catch(Exception $e) { + throw new JsonLdException( + 'Could not parse JSON from URL.', + 'jsonld.ParseError', 'loading remote context failed', + array('url' => $url), $e); + } + } + + // ensure ctx is an object + if(!is_object($ctx)) { + throw new JsonLdException( + 'Derefencing a URL did not result in a valid JSON-LD object.', + 'jsonld.InvalidUrl', 'invalid remote context', array('url' => $url)); + } + + // use empty context if no @context key is present + if(!property_exists($ctx, '@context')) { + $ctx = (object)array('@context' => new stdClass()); + } else { + $ctx = (object)array('@context' => $ctx->{'@context'}); + } + + // append context URL to context if given + if($remote_doc->contextUrl !== null) { + $ctx->{'@context'} = self::arrayify($ctx->{'@context'}); + $ctx->{'@context'}[] = $remote_doc->contextUrl; + } + + // recurse + $this->_retrieveContextUrls($ctx, $_cycles, $load_document, $url); + $urls->{$url} = $ctx->{'@context'}; + } + + // replace all URLS in the input + $this->_findContextUrls($input, $urls, true, $base); + } + + /** + * Gets the initial context. + * + * @param assoc $options the options to use. + * base the document base IRI. + * + * @return stdClass the initial context. + */ + protected function _getInitialContext($options) { + return (object)array( + '@base' => jsonld_parse_url($options['base']), + 'mappings' => new stdClass(), + 'inverse' => null); + } + + /** + * Generates an inverse context for use in the compaction algorithm, if + * not already generated for the given active context. + * + * @param stdClass $active_ctx the active context to use. + * + * @return stdClass the inverse context. + */ + protected function _getInverseContext($active_ctx) { + // inverse context already generated + if($active_ctx->inverse) { + return $active_ctx->inverse; + } + + $inverse = $active_ctx->inverse = new stdClass(); + + // variables for building fast CURIE map + $fast_curie_map = $active_ctx->fast_curie_map = new ArrayObject(); + $iris_to_terms = array(); + + // handle default language + $default_language = '@none'; + if(property_exists($active_ctx, '@language')) { + $default_language = $active_ctx->{'@language'}; + } + + // create term selections for each mapping in the context, ordered by + // shortest and then lexicographically least + $mappings = $active_ctx->mappings; + $terms = array_keys((array)$mappings); + usort($terms, array($this, '_compareShortestLeast')); + foreach($terms as $term) { + $mapping = $mappings->{$term}; + if($mapping === null) { + continue; + } + + // add term selection where it applies + if(property_exists($mapping, '@container')) { + $container = $mapping->{'@container'}; + } else { + $container = '@none'; + } + + // iterate over every IRI in the mapping + $iris = $mapping->{'@id'}; + $iris = self::arrayify($iris); + foreach($iris as $iri) { + $is_keyword = self::_isKeyword($iri); + + // initialize container map + if(!property_exists($inverse, $iri)) { + $inverse->{$iri} = new stdClass(); + if(!$is_keyword && !$mapping->_term_has_colon) { + // init IRI to term map and fast CURIE map + $iris_to_terms[$iri] = new ArrayObject(); + $iris_to_terms[$iri][] = $term; + $fast_curie_entry = (object)array( + 'iri' => $iri, 'terms' => $iris_to_terms[$iri]); + if(!array_key_exists($iri[0], (array)$fast_curie_map)) { + $fast_curie_map[$iri[0]] = new ArrayObject(); + } + $fast_curie_map[$iri[0]][] = $fast_curie_entry; + } + } else if(!$is_keyword && !$mapping->_term_has_colon) { + // add IRI to term match + $iris_to_terms[$iri][] = $term; + } + $container_map = $inverse->{$iri}; + + // add new entry + if(!property_exists($container_map, $container)) { + $container_map->{$container} = (object)array( + '@language' => new stdClass(), + '@type' => new stdClass()); + } + $entry = $container_map->{$container}; + + if($mapping->reverse) { + // term is preferred for values using @reverse + $this->_addPreferredTerm( + $mapping, $term, $entry->{'@type'}, '@reverse'); + } else if(property_exists($mapping, '@type')) { + // term is preferred for values using specific type + $this->_addPreferredTerm( + $mapping, $term, $entry->{'@type'}, $mapping->{'@type'}); + } else if(property_exists($mapping, '@language')) { + // term is preferred for values using specific language + $language = $mapping->{'@language'}; + if($language === null) { + $language = '@null'; + } + $this->_addPreferredTerm( + $mapping, $term, $entry->{'@language'}, $language); + } else { + // term is preferred for values w/default language or no type and + // no language + // add an entry for the default language + $this->_addPreferredTerm( + $mapping, $term, $entry->{'@language'}, $default_language); + + // add entries for no type and no language + $this->_addPreferredTerm( + $mapping, $term, $entry->{'@type'}, '@none'); + $this->_addPreferredTerm( + $mapping, $term, $entry->{'@language'}, '@none'); + } + } + } + + // build fast CURIE map + foreach($fast_curie_map as $key => $value) { + $this->_buildIriMap($fast_curie_map, $key, 1); + } + + return $inverse; + } + + /** + * Runs a recursive algorithm to build a lookup map for quickly finding + * potential CURIEs. + * + * @param ArrayObject $iri_map the map to build. + * @param string $key the current key in the map to work on. + * @param int $idx the index into the IRI to compare. + */ + function _buildIriMap($iri_map, $key, $idx) { + $entries = $iri_map[$key]; + $next = $iri_map[$key] = new ArrayObject(); + + foreach($entries as $entry) { + $iri = $entry->iri; + if($idx >= strlen($iri)) { + $letter = ''; + } else { + $letter = $iri[$idx]; + } + if(!isset($next[$letter])) { + $next[$letter] = new ArrayObject(); + } + $next[$letter][] = $entry; + } + + foreach($next as $key => $value) { + if($key === '') { + continue; + } + $this->_buildIriMap($next, $key, $idx + 1); + } + } + + /** + * Adds the term for the given entry if not already added. + * + * @param stdClass $mapping the term mapping. + * @param string $term the term to add. + * @param stdClass $entry the inverse context type_or_language entry to + * add to. + * @param string $type_or_language_value the key in the entry to add to. + */ + function _addPreferredTerm($mapping, $term, $entry, $type_or_language_value) { + if(!property_exists($entry, $type_or_language_value)) { + $entry->{$type_or_language_value} = $term; + } + } + + /** + * Clones an active context, creating a child active context. + * + * @return stdClass a clone (child) of the active context. + */ + protected function _cloneActiveContext($active_ctx) { + $child = new stdClass(); + $child->{'@base'} = $active_ctx->{'@base'}; + $child->mappings = self::copy($active_ctx->mappings); + $child->inverse = null; + if(property_exists($active_ctx, '@language')) { + $child->{'@language'} = $active_ctx->{'@language'}; + } + if(property_exists($active_ctx, '@vocab')) { + $child->{'@vocab'} = $active_ctx->{'@vocab'}; + } + return $child; + } + + /** + * Returns whether or not the given value is a keyword. + * + * @param string $v the value to check. + * + * @return bool true if the value is a keyword, false if not. + */ + protected static function _isKeyword($v) { + if(!is_string($v)) { + return false; + } + switch($v) { + case '@base': + case '@context': + case '@container': + case '@default': + case '@embed': + case '@explicit': + case '@graph': + case '@id': + case '@index': + case '@language': + case '@list': + case '@omitDefault': + case '@preserve': + case '@requireAll': + case '@reverse': + case '@set': + case '@type': + case '@value': + case '@vocab': + return true; + } + return false; + } + + /** + * Returns true if the given value is an empty Object. + * + * @param mixed $v the value to check. + * + * @return bool true if the value is an empty Object, false if not. + */ + protected static function _isEmptyObject($v) { + return is_object($v) && count(get_object_vars($v)) === 0; + } + + /** + * Throws an exception if the given value is not a valid @type value. + * + * @param mixed $v the value to check. + */ + protected static function _validateTypeValue($v) { + // must be a string or empty object + if(is_string($v) || self::_isEmptyObject($v)) { + return; + } + + // must be an array + $is_valid = false; + if(is_array($v)) { + // must contain only strings + $is_valid = true; + foreach($v as $e) { + if(!(is_string($e))) { + $is_valid = false; + break; + } + } + } + + if(!$is_valid) { + throw new JsonLdException( + 'Invalid JSON-LD syntax; "@type" value must a string, an array ' . + 'of strings, or an empty object.', + 'jsonld.SyntaxError', 'invalid type value', array('value' => $v)); + } + } + + /** + * Returns true if the given value is a subject with properties. + * + * @param mixed $v the value to check. + * + * @return bool true if the value is a subject with properties, false if not. + */ + protected static function _isSubject($v) { + // Note: A value is a subject if all of these hold true: + // 1. It is an Object. + // 2. It is not a @value, @set, or @list. + // 3. It has more than 1 key OR any existing key is not @id. + $rval = false; + if(is_object($v) && + !property_exists($v, '@value') && + !property_exists($v, '@set') && + !property_exists($v, '@list')) { + $count = count(get_object_vars($v)); + $rval = ($count > 1 || !property_exists($v, '@id')); + } + return $rval; + } + + /** + * Returns true if the given value is a subject reference. + * + * @param mixed $v the value to check. + * + * @return bool true if the value is a subject reference, false if not. + */ + protected static function _isSubjectReference($v) { + // Note: A value is a subject reference if all of these hold true: + // 1. It is an Object. + // 2. It has a single key: @id. + return (is_object($v) && count(get_object_vars($v)) === 1 && + property_exists($v, '@id')); + } + + /** + * Returns true if the given value is a @value. + * + * @param mixed $v the value to check. + * + * @return bool true if the value is a @value, false if not. + */ + protected static function _isValue($v) { + // Note: A value is a @value if all of these hold true: + // 1. It is an Object. + // 2. It has the @value property. + return is_object($v) && property_exists($v, '@value'); + } + + /** + * Returns true if the given value is a @list. + * + * @param mixed $v the value to check. + * + * @return bool true if the value is a @list, false if not. + */ + protected static function _isList($v) { + // Note: A value is a @list if all of these hold true: + // 1. It is an Object. + // 2. It has the @list property. + return is_object($v) && property_exists($v, '@list'); + } + + /** + * Returns true if the given value is a blank node. + * + * @param mixed $v the value to check. + * + * @return bool true if the value is a blank node, false if not. + */ + protected static function _isBlankNode($v) { + // Note: A value is a blank node if all of these hold true: + // 1. It is an Object. + // 2. If it has an @id key its value begins with '_:'. + // 3. It has no keys OR is not a @value, @set, or @list. + $rval = false; + if(is_object($v)) { + if(property_exists($v, '@id')) { + $rval = (strpos($v->{'@id'}, '_:') === 0); + } else { + $rval = (count(get_object_vars($v)) === 0 || + !(property_exists($v, '@value') || + property_exists($v, '@set') || + property_exists($v, '@list'))); + } + } + return $rval; + } + + /** + * Returns true if the given value is an absolute IRI, false if not. + * + * @param string $v the value to check. + * + * @return bool true if the value is an absolute IRI, false if not. + */ + protected static function _isAbsoluteIri($v) { + return strpos($v, ':') !== false; + } + + /** + * Returns true if the given target has the given key and its + * value equals is the given value. + * + * @param stdClass $target the target object. + * @param string key the key to check. + * @param mixed $value the value to check. + * + * @return bool true if the target has the given key and its value matches. + */ + protected static function _hasKeyValue($target, $key, $value) { + return (property_exists($target, $key) && $target->{$key} === $value); + } + + /** + * Returns true if both of the given objects have the same value for the + * given key or if neither of the objects contain the given key. + * + * @param stdClass $o1 the first object. + * @param stdClass $o2 the second object. + * @param string key the key to check. + * + * @return bool true if both objects have the same value for the key or + * neither has the key. + */ + protected static function _compareKeyValues($o1, $o2, $key) { + if(property_exists($o1, $key)) { + return property_exists($o2, $key) && $o1->{$key} === $o2->{$key}; + } + return !property_exists($o2, $key); + } + + /** + * Parses JSON and sets an appropriate exception message on error. + * + * @param string $json the JSON to parse. + * + * @return mixed the parsed JSON object or array. + */ + protected static function _parse_json($json) { + $rval = json_decode($json); + $error = json_last_error(); + if($error === JSON_ERROR_NONE && $rval === null) { + $error = JSON_ERROR_SYNTAX; + } + switch($error) { + case JSON_ERROR_NONE: + break; + case JSON_ERROR_DEPTH: + throw new JsonLdException( + 'Could not parse JSON; the maximum stack depth has been exceeded.', + 'jsonld.ParseError'); + case JSON_ERROR_STATE_MISMATCH: + throw new JsonLdException( + 'Could not parse JSON; invalid or malformed JSON.', + 'jsonld.ParseError'); + case JSON_ERROR_CTRL_CHAR: + case JSON_ERROR_SYNTAX: + throw new JsonLdException( + 'Could not parse JSON; syntax error, malformed JSON.', + 'jsonld.ParseError'); + case JSON_ERROR_UTF8: + throw new JsonLdException( + 'Could not parse JSON from URL; malformed UTF-8 characters.', + 'jsonld.ParseError'); + default: + throw new JsonLdException( + 'Could not parse JSON from URL; unknown error.', + 'jsonld.ParseError'); + } + return $rval; + } +} + +// register the N-Quads RDF parser +jsonld_register_rdf_parser( + 'application/nquads', array('JsonLdProcessor', 'parseNQuads')); + +/** + * A JSON-LD Exception. + */ +class JsonLdException extends Exception { + public function __construct( + $msg, $type, $code='error', $details=null, $previous=null) { + $this->type = $type; + $this->code = $code; + $this->details = $details; + $this->cause = $previous; + parent::__construct($msg, 0, $previous); + } + public function __toString() { + $rval = __CLASS__ . ": [{$this->type}]: {$this->message}\n"; + if($this->code) { + $rval .= 'Code: ' . $this->code . "\n"; + } + if($this->details) { + $rval .= 'Details: ' . print_r($this->details, true) . "\n"; + } + if($this->cause) { + $rval .= 'Cause: ' . $this->cause; + } + $rval .= $this->getTraceAsString() . "\n"; + return $rval; + } +}; + +/** + * A UniqueNamer issues unique names, keeping track of any previously issued + * names. + */ +class UniqueNamer { + /** + * Constructs a new UniqueNamer. + * + * @param prefix the prefix to use ('<prefix><counter>'). + */ + public function __construct($prefix) { + $this->prefix = $prefix; + $this->counter = 0; + $this->existing = new stdClass(); + $this->order = array(); + } + + /** + * Clones this UniqueNamer. + */ + public function __clone() { + $this->existing = clone $this->existing; + } + + /** + * Gets the new name for the given old name, where if no old name is given + * a new name will be generated. + * + * @param mixed [$old_name] the old name to get the new name for. + * + * @return string the new name. + */ + public function getName($old_name=null) { + // return existing old name + if($old_name && property_exists($this->existing, $old_name)) { + return $this->existing->{$old_name}; + } + + // get next name + $name = $this->prefix . $this->counter; + $this->counter += 1; + + // save mapping + if($old_name !== null) { + $this->existing->{$old_name} = $name; + $this->order[] = $old_name; + } + + return $name; + } + + /** + * Returns true if the given old name has already been assigned a new name. + * + * @param string $old_name the old name to check. + * + * @return true if the old name has been assigned a new name, false if not. + */ + public function isNamed($old_name) { + return property_exists($this->existing, $old_name); + } +} + +/** + * A Permutator iterates over all possible permutations of the given array + * of elements. + */ +class Permutator { + /** + * Constructs a new Permutator. + * + * @param array $list the array of elements to iterate over. + */ + public function __construct($list) { + // original array + $this->list = $list; + sort($this->list); + // indicates whether there are more permutations + $this->done = false; + // directional info for permutation algorithm + $this->left = new stdClass(); + foreach($list as $v) { + $this->left->{$v} = true; + } + } + + /** + * Returns true if there is another permutation. + * + * @return bool true if there is another permutation, false if not. + */ + public function hasNext() { + return !$this->done; + } + + /** + * Gets the next permutation. Call hasNext() to ensure there is another one + * first. + * + * @return array the next permutation. + */ + public function next() { + // copy current permutation + $rval = $this->list; + + /* Calculate the next permutation using the Steinhaus-Johnson-Trotter + permutation algorithm. */ + + // get largest mobile element k + // (mobile: element is greater than the one it is looking at) + $k = null; + $pos = 0; + $length = count($this->list); + for($i = 0; $i < $length; ++$i) { + $element = $this->list[$i]; + $left = $this->left->{$element}; + if(($k === null || $element > $k) && + (($left && $i > 0 && $element > $this->list[$i - 1]) || + (!$left && $i < ($length - 1) && $element > $this->list[$i + 1]))) { + $k = $element; + $pos = $i; + } + } + + // no more permutations + if($k === null) { + $this->done = true; + } else { + // swap k and the element it is looking at + $swap = $this->left->{$k} ? $pos - 1 : $pos + 1; + $this->list[$pos] = $this->list[$swap]; + $this->list[$swap] = $k; + + // reverse the direction of all elements larger than k + for($i = 0; $i < $length; ++$i) { + if($this->list[$i] > $k) { + $this->left->{$this->list[$i]} = !$this->left->{$this->list[$i]}; + } + } + } + + return $rval; + } +} + +/** + * An ActiveContextCache caches active contexts so they can be reused without + * the overhead of recomputing them. + */ +class ActiveContextCache { + /** + * Constructs a new ActiveContextCache. + * + * @param int size the maximum size of the cache, defaults to 100. + */ + public function __construct($size=100) { + $this->order = array(); + $this->cache = new stdClass(); + $this->size = $size; + } + + /** + * Gets an active context from the cache based on the current active + * context and the new local context. + * + * @param stdClass $active_ctx the current active context. + * @param stdClass $local_ctx the new local context. + * + * @return mixed a shared copy of the cached active context or null. + */ + public function get($active_ctx, $local_ctx) { + $key1 = serialize($active_ctx); + $key2 = serialize($local_ctx); + if(property_exists($this->cache, $key1)) { + $level1 = $this->cache->{$key1}; + if(property_exists($level1, $key2)) { + return $level1->{$key2}; + } + } + return null; + } + + /** + * Sets an active context in the cache based on the previous active + * context and the just-processed local context. + * + * @param stdClass $active_ctx the previous active context. + * @param stdClass $local_ctx the just-processed local context. + * @param stdClass $result the resulting active context. + */ + public function set($active_ctx, $local_ctx, $result) { + if(count($this->order) === $this->size) { + $entry = array_shift($this->order); + unset($this->cache->{$entry->activeCtx}->{$entry->localCtx}); + } + $key1 = serialize($active_ctx); + $key2 = serialize($local_ctx); + $this->order[] = (object)array( + 'activeCtx' => $key1, 'localCtx' => $key2); + if(!property_exists($this->cache, $key1)) { + $this->cache->{$key1} = new stdClass(); + } + $this->cache->{$key1}->{$key2} = JsonLdProcessor::copy($result); + } +} + +/* end of file, omit ?> */ diff --git a/library/jsonld/test.php b/library/jsonld/test.php new file mode 100644 index 000000000..11b72ac09 --- /dev/null +++ b/library/jsonld/test.php @@ -0,0 +1,765 @@ +<?php +/** + * PHP unit tests for JSON-LD. + * + * @author Dave Longley + * + * Copyright (c) 2013-2014 Digital Bazaar, Inc. All rights reserved. + */ +require_once('jsonld.php'); + +class JsonLdTestCase extends PHPUnit_Framework_TestCase { + /** + * Runs this test case. Overridden to attach to EARL report w/o need for + * an external XML configuration file. + * + * @param PHPUnit_Framework_TestResult $result the test result. + */ + public function run(PHPUnit_Framework_TestResult $result = NULL) { + global $EARL; + $EARL->attach($result); + $this->result = $result; + parent::run($result); + } + + /** + * Tests expansion. + * + * @param JsonLdTest $test the test to run. + * + * @group expand + * @group json-ld.org + * @dataProvider expandProvider + */ + public function testExpand($test) { + $this->test = $test; + $input = $test->readUrl('input'); + $options = $test->createOptions(); + $test->run('jsonld_expand', array($input, $options)); + } + + /** + * Tests compaction. + * + * @param JsonLdTest $test the test to run. + * + * @group compact + * @group json-ld.org + * @dataProvider compactProvider + */ + public function testCompact($test) { + $this->test = $test; + $input = $test->readUrl('input'); + $context = $test->readProperty('context'); + $options = $test->createOptions(); + $test->run('jsonld_compact', array($input, $context, $options)); + } + + /** + * Tests flatten. + * + * @param JsonLdTest $test the test to run. + * + * @group flatten + * @group json-ld.org + * @dataProvider flattenProvider + */ + public function testFlatten($test) { + $this->test = $test; + $input = $test->readUrl('input'); + $context = $test->readProperty('context'); + $options = $test->createOptions(); + $test->run('jsonld_flatten', array($input, $context, $options)); + } + + /** + * Tests serialization to RDF. + * + * @param JsonLdTest $test the test to run. + * + * @group toRdf + * @group json-ld.org + * @dataProvider toRdfProvider + */ + public function testToRdf($test) { + $this->test = $test; + $input = $test->readUrl('input'); + $options = $test->createOptions(array('format' => 'application/nquads')); + $test->run('jsonld_to_rdf', array($input, $options)); + } + + /** + * Tests deserialization from RDF. + * + * @param JsonLdTest $test the test to run. + * + * @group fromRdf + * @group json-ld.org + * @dataProvider fromRdfProvider + */ + public function testFromRdf($test) { + $this->test = $test; + $input = $test->readProperty('input'); + $options = $test->createOptions(array('format' => 'application/nquads')); + $test->run('jsonld_from_rdf', array($input, $options)); + } + + /** + * Tests framing. + * + * @param JsonLdTest $test the test to run. + * + * @group frame + * @group json-ld.org + * @dataProvider frameProvider + */ + public function testFrame($test) { + $this->test = $test; + $input = $test->readUrl('input'); + $frame = $test->readProperty('frame'); + $options = $test->createOptions(); + $test->run('jsonld_frame', array($input, $frame, $options)); + } + + /** + * Tests normalization. + * + * @param JsonLdTest $test the test to run. + * + * @group normalize + * @group json-ld.org + * @dataProvider normalizeProvider + */ + public function testNormalize($test) { + $this->test = $test; + $input = $test->readUrl('input'); + $options = $test->createOptions(array('format' => 'application/nquads')); + $test->run('jsonld_normalize', array($input, $options)); + } + + /** + * Tests URGNA2012 normalization. + * + * @param JsonLdTest $test the test to run. + * + * @group normalize + * @group normalization + * @dataProvider urgna2012Provider + */ + public function testUrgna2012($test) { + $this->test = $test; + $input = $test->readProperty('action'); + $options = $test->createOptions(array( + 'algorithm' => 'URGNA2012', + 'inputFormat' => 'application/nquads', + 'format' => 'application/nquads')); + $test->run('jsonld_normalize', array($input, $options)); + } + + /** + * Tests URDNA2015 normalization. + * + * @param JsonLdTest $test the test to run. + * + * @group normalize + * @group normalization + * @dataProvider urdna2015Provider + */ + public function testUrdna2015($test) { + $this->test = $test; + $input = $test->readProperty('action'); + $options = $test->createOptions(array( + 'algorithm' => 'URDNA2015', + 'inputFormat' => 'application/nquads', + 'format' => 'application/nquads')); + $test->run('jsonld_normalize', array($input, $options)); + } + + public function expandProvider() { + return new JsonLdTestIterator('jld:ExpandTest'); + } + + public function compactProvider() { + return new JsonLdTestIterator('jld:CompactTest'); + } + + public function flattenProvider() { + return new JsonLdTestIterator('jld:FlattenTest'); + } + + public function toRdfProvider() { + return new JsonLdTestIterator('jld:ToRDFTest'); + } + + public function fromRdfProvider() { + return new JsonLdTestIterator('jld:FromRDFTest'); + } + + public function normalizeProvider() { + return new JsonLdTestIterator('jld:NormalizeTest'); + } + + public function frameProvider() { + return new JsonLdTestIterator('jld:FrameTest'); + } + + public function urgna2012Provider() { + return new JsonLdTestIterator('rdfn:Urgna2012EvalTest'); + } + + public function urdna2015Provider() { + return new JsonLdTestIterator('rdfn:Urdna2015EvalTest'); + } +} + +class JsonLdManifest { + public function __construct($data, $filename) { + $this->data = $data; + $this->filename = $filename; + $this->dirname = dirname($filename); + } + + public function load(&$tests) { + $entries = array_merge( + JsonLdProcessor::getValues($this->data, 'sequence'), + JsonLdProcessor::getValues($this->data, 'entries')); + $includes = JsonLdProcessor::getValues($this->data, 'include'); + foreach($includes as $include) { + array_push($entries, $include . '.jsonld'); + } + foreach($entries as $entry) { + if(is_string($entry)) { + $filename = join( + DIRECTORY_SEPARATOR, array($this->dirname, $entry)); + $entry = Util::readJson($filename); + } else { + $filename = $this->filename; + } + + if(JsonLdProcessor::hasValue($entry, '@type', 'mf:Manifest') || + JsonLdProcessor::hasValue($entry, 'type', 'mf:Manifest')) { + // entry is another manifest + $manifest = new JsonLdManifest($entry, $filename); + $manifest->load($tests); + } else { + // assume entry is a test + $test = new JsonLdTest($this, $entry, $filename); + $types = array_merge( + JsonLdProcessor::getValues($test->data, '@type'), + JsonLdProcessor::getValues($test->data, 'type')); + foreach($types as $type) { + if(!isset($tests[$type])) { + $tests[$type] = array(); + } + $tests[$type][] = $test; + } + } + } + } +} + +class JsonLdTest { + public function __construct($manifest, $data, $filename) { + $this->manifest = $manifest; + $this->data = $data; + $this->filename = $filename; + $this->dirname = dirname($filename); + $this->isPositive = + JsonLdProcessor::hasValue( + $data, '@type', 'jld:PositiveEvaluationTest') || + JsonLdProcessor::hasValue( + $data, 'type', 'jld:PositiveEvaluationTest'); + $this->isNegative = + JsonLdProcessor::hasValue( + $data, '@type', 'jld:NegativeEvaluationTest') || + JsonLdProcessor::hasValue( + $data, 'type', 'jld:NegativeEvaluationTest'); + + // generate test name + if(isset($manifest->data->name)) { + $manifestLabel = $manifest->data->name; + } else if(isset($manifest->data->label)) { + $manifestLabel = $manifest->data->label; + } else { + $manifestLabel = 'UNNAMED'; + } + if(isset($this->data->id)) { + $testId = $this->data->id; + } else { + $testId = $this->data->{'@id'}; + } + if(isset($this->data->name)) { + $testLabel = $this->data->name; + } else if(isset($this->data->label)) { + $testLabel = $this->data->label; + } else { + $testLabel = 'UNNAMED'; + } + + $this->name = $manifestLabel . ' ' . $testId . ' - ' . $testLabel; + + // expand @id and input base + if(isset($manifest->data->baseIri)) { + $data->{'@id'} = ($manifest->data->baseIri . + basename($manifest->filename) . $data->{'@id'}); + $this->base = $manifest->data->baseIri . $data->input; + } + } + + private function _getResultProperty() { + if(isset($this->data->expect)) { + return 'expect'; + } else if(isset($this->data->result)) { + return 'result'; + } else { + throw new Exception('No test result property found.'); + } + } + + public function run($fn, $params) { + // read expected data + if($this->isNegative) { + $this->expected = $this->data->expect; + } else { + $this->expected = $this->readProperty($this->_getResultProperty()); + } + + try { + $this->actual = call_user_func_array($fn, $params); + if($this->isNegative) { + throw new Exception('Expected an error; one was not raised.'); + } + PHPUnit_Framework_TestCase::assertEquals($this->expected, $this->actual); + } catch(Exception $e) { + // assume positive test + if($this->isNegative) { + $this->actual = $this->getJsonLdErrorCode($e); + PHPUnit_Framework_TestCase::assertEquals( + $this->expected, $this->actual); + } else { + throw $e; + } + } + } + + public function readUrl($property) { + if(!property_exists($this->data, $property)) { + return null; + } + return $this->manifest->data->baseIri . $this->data->{$property}; + } + + public function readProperty($property) { + $data = $this->data; + if(!property_exists($data, $property)) { + return null; + } + $filename = join( + DIRECTORY_SEPARATOR, array($this->dirname, $data->{$property})); + $extension = pathinfo($filename, PATHINFO_EXTENSION); + if($extension === 'jsonld') { + return Util::readJson($filename); + } + return Util::readFile($filename); + } + + public function createOptions($opts=array()) { + $http_options = array( + 'contentType', 'httpLink', 'httpStatus', 'redirectTo'); + $test_options = (property_exists($this->data, 'option') ? + $this->data->option : array()); + $options = array(); + foreach($test_options as $k => $v) { + if(!in_array($k, $http_options)) { + $options[$k] = $v; + } + } + $options['documentLoader'] = $this->createDocumentLoader(); + $options = array_merge($options, $opts); + if(isset($options['expandContext'])) { + $filename = join( + DIRECTORY_SEPARATOR, array($this->dirname, $options['expandContext'])); + $options['expandContext'] = Util::readJson($filename); + } + return $options; + } + + public function createDocumentLoader() { + $base = 'http://json-ld.org/test-suite'; + $test = $this; + + $load_locally = function($url) use ($test, $base) { + $doc = (object)array( + 'contextUrl' => null, 'documentUrl' => $url, 'document' => null); + $options = (property_exists($test->data, 'option') ? + $test->data->option : null); + if($options and $url === $test->base) { + if(property_exists($options, 'redirectTo') && + property_exists($options, 'httpStatus') && + $options->httpStatus >= '300') { + $doc->documentUrl = ($test->manifest->data->baseIri . + $options->redirectTo); + } else if(property_exists($options, 'httpLink')) { + $content_type = (property_exists($options, 'contentType') ? + $options->contentType : null); + $extension = pathinfo($url, PATHINFO_EXTENSION); + if(!$content_type && $extension === 'jsonld') { + $content_type = 'application/ld+json'; + } + $link_header = $options->httpLink; + if(is_array($link_header)) { + $link_header = join(',', $link_header); + } + $link_header = jsonld_parse_link_header($link_header); + if(isset($link_header['http://www.w3.org/ns/json-ld#context'])) { + $link_header = $link_header['http://www.w3.org/ns/json-ld#context']; + } else { + $link_header = null; + } + if($link_header && $content_type !== 'application/ld+json') { + if(is_array($link_header)) { + throw new Exception('multiple context link headers'); + } + $doc->contextUrl = $link_header->target; + } + } + } + global $ROOT_MANIFEST_DIR; + if(strpos($doc->documentUrl, ':') === false) { + $filename = join( + DIRECTORY_SEPARATOR, array( + $ROOT_MANIFEST_DIR, $doc->documentUrl)); + $doc->documentUrl = 'file://' . $filename; + } else { + $filename = join( + DIRECTORY_SEPARATOR, array( + $ROOT_MANIFEST_DIR, substr($doc->documentUrl, strlen($base)))); + } + try { + $doc->document = Util::readJson($filename); + } catch(Exception $e) { + throw new Exception('loading document failed'); + } + return $doc; + }; + + $local_loader = function($url) use ($test, $base, $load_locally) { + // always load remote-doc and non-base tests remotely + if((strpos($url, $base) !== 0 && strpos($url, ':') !== false) || + $test->manifest->data->name === 'Remote document') { + return call_user_func('jsonld_default_document_loader', $url); + } + + // attempt to load locally + return call_user_func($load_locally, $url); + }; + + return $local_loader; + } + + public function getJsonLdErrorCode($err) { + if($err instanceof JsonLdException) { + if($err->getCode()) { + return $err->getCode(); + } + if($err->cause) { + return $this->getJsonLdErrorCode($err->cause); + } + } + return $err->getMessage(); + } +} + +class JsonLdTestIterator implements Iterator { + /** + * The current test index. + */ + protected $index = 0; + + /** + * The total number of tests. + */ + protected $count = 0; + + /** + * Creates a TestIterator. + * + * @param string $type the type of tests to iterate over. + */ + public function __construct($type) { + global $TESTS; + if(isset($TESTS[$type])) { + $this->tests = $TESTS[$type]; + } else { + $this->tests = array(); + } + $this->count = count($this->tests); + } + + /** + * Gets the parameters for the next test. + * + * @return assoc the parameters for the next test. + */ + public function current() { + return array('test' => $this->tests[$this->index]); + } + + /** + * Gets the current test number. + * + * @return int the current test number. + */ + public function key() { + return $this->index; + } + + /** + * Proceeds to the next test. + */ + public function next() { + $this->index += 1; + } + + /** + * Rewinds to the first test. + */ + public function rewind() { + $this->index = 0; + } + + /** + * Returns true if there are more tests to be run. + * + * @return bool true if there are more tests to be run. + */ + public function valid() { + return $this->index < $this->count; + } +} + +class EarlReport extends PHPUnit_Util_Printer + implements PHPUnit_Framework_TestListener { + public function __construct() { + $this->filename = null; + $this->attached = false; + $this->report = (object)array( + '@context' => (object)array( + 'doap' => 'http://usefulinc.com/ns/doap#', + 'foaf' => 'http://xmlns.com/foaf/0.1/', + 'dc' => 'http://purl.org/dc/terms/', + 'earl' => 'http://www.w3.org/ns/earl#', + 'xsd' => 'http://www.w3.org/2001/XMLSchema#', + 'doap:homepage' => (object)array('@type' => '@id'), + 'doap:license' => (object)array('@type' => '@id'), + 'dc:creator' => (object)array('@type' => '@id'), + 'foaf:homepage' => (object)array('@type' => '@id'), + 'subjectOf' => (object)array('@reverse' => 'earl:subject'), + 'earl:assertedBy' => (object)array('@type' => '@id'), + 'earl:mode' => (object)array('@type' => '@id'), + 'earl:test' => (object)array('@type' => '@id'), + 'earl:outcome' => (object)array('@type' => '@id'), + 'dc:date' => (object)array('@type' => 'xsd:date') + ), + '@id' => 'https://github.com/digitalbazaar/php-json-ld', + '@type' => array('doap:Project', 'earl:TestSubject', 'earl:Software'), + 'doap:name' => 'php-json-ld', + 'dc:title' => 'php-json-ld', + 'doap:homepage' => 'https://github.com/digitalbazaar/php-json-ld', + 'doap:license' => 'https://github.com/digitalbazaar/php-json-ld/blob/master/LICENSE', + 'doap:description' => 'A JSON-LD processor for PHP', + 'doap:programming-language' => 'PHP', + 'dc:creator' => 'https://github.com/dlongley', + 'doap:developer' => (object)array( + '@id' => 'https://github.com/dlongley', + '@type' => array('foaf:Person', 'earl:Assertor'), + 'foaf:name' => 'Dave Longley', + 'foaf:homepage' => 'https://github.com/dlongley' + ), + 'dc:date' => array( + '@value' => gmdate('Y-m-d'), + '@type' => 'xsd:date' + ), + 'subjectOf' => array() + ); + } + + /** + * Attaches to the given test result, if not yet attached. + * + * @param PHPUnit_Framework_Test $result the result to attach to. + */ + public function attach(PHPUnit_Framework_TestResult $result) { + if(!$this->attached && $this->filename) { + $this->attached = true; + $result->addListener($this); + } + } + + /** + * Adds an assertion to this EARL report. + * + * @param JsonLdTest $test the JsonLdTest for the assertion is for. + * @param bool $passed whether or not the test passed. + */ + public function addAssertion($test, $passed) { + $this->report->{'subjectOf'}[] = (object)array( + '@type' => 'earl:Assertion', + 'earl:assertedBy' => $this->report->{'doap:developer'}->{'@id'}, + 'earl:mode' => 'earl:automatic', + 'earl:test' => $test->data->{'@id'}, + 'earl:result' => (object)array( + '@type' => 'earl:TestResult', + 'dc:date' => gmdate(DateTime::ISO8601), + 'earl:outcome' => $passed ? 'earl:passed' : 'earl:failed' + ) + ); + return $this; + } + + /** + * Writes this EARL report to a file. + */ + public function flush() { + if($this->filename) { + printf("\nWriting EARL report to: %s\n", $this->filename); + $fd = fopen($this->filename, 'w'); + fwrite($fd, Util::jsonldEncode($this->report)); + fclose($fd); + } + } + + public function endTest(PHPUnit_Framework_Test $test, $time) { + $this->addAssertion($test->test, true); + } + + public function addError( + PHPUnit_Framework_Test $test, Exception $e, $time) { + $this->addAssertion($test->test, false); + } + + public function addFailure( + PHPUnit_Framework_Test $test, + PHPUnit_Framework_AssertionFailedError $e, $time) { + $this->addAssertion($test->test, false); + if($test->result->shouldStop()) { + if(isset($test->test->name)) { + $name = $test->test->name; + } else if(isset($test->test->label)) { + $name = $test->test->label; + } else { + $name = 'UNNAMED'; + } + printf("\n\nFAILED\n"); + printf("Test: %s\n", $name); + printf("Purpose: %s\n", $test->test->data->purpose); + printf("EXPECTED: %s\n", Util::jsonldEncode($test->test->expected)); + printf("ACTUAL: %s\n", Util::jsonldEncode($test->test->actual)); + } + } + + public function addIncompleteTest( + PHPUnit_Framework_Test $test, Exception $e, $time) { + $this->addAssertion($test->test, false); + } + + public function addRiskyTest( + PHPUnit_Framework_Test $test, Exception $e, $time) {} + public function addSkippedTest( + PHPUnit_Framework_Test $test, Exception $e, $time) {} + public function startTest(PHPUnit_Framework_Test $test) {} + public function startTestSuite(PHPUnit_Framework_TestSuite $suite) {} + public function endTestSuite(PHPUnit_Framework_TestSuite $suite) {} +} + +class Util { + public static function readFile($filename) { + $rval = @file_get_contents($filename); + if($rval === false) { + throw new Exception('File read error: ' . $filename); + } + return $rval; + } + + public static function readJson($filename) { + $rval = json_decode(self::readFile($filename)); + if($rval === null) { + throw new Exception('JSON parse error'); + } + return $rval; + } + + public static function readNQuads($filename) { + return self::readFile($filename); + } + + public static function jsonldEncode($input) { + // newer PHP has a flag to avoid escaped '/' + if(defined('JSON_UNESCAPED_SLASHES')) { + $options = JSON_UNESCAPED_SLASHES; + if(defined('JSON_PRETTY_PRINT')) { + $options |= JSON_PRETTY_PRINT; + } + $json = json_encode($input, $options); + } else { + // use a simple string replacement of '\/' to '/'. + $json = str_replace('\\/', '/', json_encode($input)); + } + return $json; + } +} + +// tests to skip +$SKIP_TESTS = array(); + +// root manifest directory +$ROOT_MANIFEST_DIR; + +// parsed tests; keyed by type +$TESTS = array(); + +// parsed command line options +$OPTIONS = array(); + +// parse command line options +global $argv; +$args = $argv; +$total = count($args); +$start = false; +for($i = 0; $i < $total; ++$i) { + $arg = $args[$i]; + if(!$start) { + if(realpath($arg) === realpath(__FILE__)) { + $start = true; + } + continue; + } + if($arg[0] !== '-') { + break; + } + $i += 1; + $OPTIONS[$arg] = $args[$i]; +} +if(!isset($OPTIONS['-d'])) { + $dvar = 'path to json-ld.org/test-suite'; + $evar = 'file to write EARL report to'; + echo "php-json-ld Tests\n"; + echo "Usage: phpunit test.php -d <$dvar> [-e <$evar>]\n\n"; + exit(0); +} + +// EARL Report +$EARL = new EarlReport(); +if(isset($OPTIONS['-e'])) { + $EARL->filename = $OPTIONS['-e']; +} + +// load root manifest +$ROOT_MANIFEST_DIR = realpath($OPTIONS['-d']); +$filename = join( + DIRECTORY_SEPARATOR, array($ROOT_MANIFEST_DIR, 'manifest.jsonld')); +$root_manifest = Util::readJson($filename); +$manifest = new JsonLdManifest($root_manifest, $filename); +$manifest->load($TESTS); + +/* end of file, omit ?> */ diff --git a/library/sticky-kit/sticky-kit.js b/library/sticky-kit/sticky-kit.js index eb2ea8a26..00b1ea2ff 100644 --- a/library/sticky-kit/sticky-kit.js +++ b/library/sticky-kit/sticky-kit.js @@ -77,7 +77,7 @@ padding_top = parseInt(parent.css("padding-top"), 10); padding_bottom = parseInt(parent.css("padding-bottom"), 10); parent_top = parent.offset().top + border_top + padding_top; - parent_height = parent.outerHeight(true); + parent_height = parent.height(); if (fixed) { fixed = false; bottomed = false; diff --git a/util/dcp b/util/dcp new file mode 100755 index 000000000..2817ad4f1 --- /dev/null +++ b/util/dcp @@ -0,0 +1,143 @@ +#!/usr/bin/env php +<?php + +// file import to DAV utility + +if(!file_exists('include/cli_startup.php')) { + echo 'Run dcp from the top level Hubzilla web directory, as util/dcp <args>' . PHP_EOL; + exit(1); +} + +require_once('include/cli_startup.php'); +require_once('include/attach.php'); + +cli_startup(); + + +if($argc <= 3) { + echo "Usage: " . $argv[0] . ' src dstdir' . "\n"; + echo 'Always run from the toplevel web directory.' . "\n"; + echo 'destination should begin with store/$nickname/desired/path or $nickname/desired/path' . "\n"; + echo 'Example: util/dcp /etc/motd store/joe/etc' . "\n"; + exit; +} + + $recursive = false; + $dstfile = $argv[$argc - 1]; + + if(strpos($dstfile,'store/') === 0) + $dstfile = substr($dstfile,6); + + $nick = substr($dstfile,0,strpos($dstfile,'/')); + + $dstfile = substr($dstfile,strlen($nick)+1); + + $channel = channelx_by_nick($nick); + if(! $channel) + return; + + for($x = 1; $x < ($argc - 1); $x ++) { + if(($argv[$x] === '-r') || ($argv[$x] === '-R')) { + $recursive = true; + break; + } + } + + + $isadir = false; + + if(($recursive) || ($argc > 3)) + $isadir = true; + + + $r = q("select * from attach where display_path = '%s' and uid = %d limit 1", + dbesc($dstfile), + intval($channel['channel_id']) + ); + + if($r && $r[0]['is_dir']) { + $isadir = true; + $basepath = $dstfile; + $folder = $r[0]['hash']; + } + else { + $pathname = (($isadir) ? $dstfile : dirname($dstfile)); + $arr = [ + 'pathname' => $pathname, + 'allow_cid' => $channel['channel_allow_cid'], + 'allow_gid' => $channel['channel_allow_gid'], + 'deny_cid' => $channel['channel_deny_cid'], + 'deny_gid' => $channel['channel_deny_gid'], + ]; + + $folder = ''; + if($pathname && $isadir) { + $x = attach_mkdirp($channel,$channel['channel_hash'],$arr); + if($x['success']) + $folder = $x['data']['hash']; + } + } + + for($x = 1; $x < ($argc - 1); $x ++) { + if(($argv[$x] === '-r') || ($argv[$x] === '-R')) { + continue; + } + + if(is_dir($argv[$x])) { + if($recursive) { + dcp_recurse($channel,$argv[$x],$basepath,$folder); + } + else { + continue; + } + } + else { + $dstname = (($isadir) ? '' : basename($dstfile)); + $cmd = [ 'Importfile', $channel['channel_id'], $argv[$x], $folder, $dstname ]; + \Zotlabs\Daemon\Master::Summon($cmd); + } + } + + + function dcp_recurse($channel,$src,$basepath,$folder) { + $dir = opendir($src); + if($dir) { + while(($entry = readdir($dir)) !== false) { + if($entry === '.' || $entry === '..') + continue; + + $dstfile = $basepath . '/' . $entry; + if(is_dir($src . '/' . $entry)) { + $r = q("select * from attach where display_path = '%s' and uid = %d limit 1", + dbesc($dstfile), + intval($channel['channel_id']) + ); + + if($r && $r[0]['is_dir']) { + $folder = $r[0]['hash']; + } + else { + + $arr = [ + 'pathname' => $dstfile, + 'allow_cid' => $channel['channel_allow_cid'], + 'allow_gid' => $channel['channel_allow_gid'], + 'deny_cid' => $channel['channel_deny_cid'], + 'deny_gid' => $channel['channel_deny_gid'], + ]; + + $folder = ''; + $x = attach_mkdirp($channel,$channel['channel_hash'],$arr); + if($x['success']) + $folder = $x['data']['hash']; + } + dcp_recurse($channel,$src . '/' . $entry,$dstfile,$folder); + } + else { + $cmd = [ 'Importfile', $channel['channel_id'], $src . '/' . $entry, $folder ]; + \Zotlabs\Daemon\Master::Summon($cmd); + } + } + closedir($dir); + } + } diff --git a/util/dmkdir b/util/dmkdir new file mode 100755 index 000000000..72ab22431 --- /dev/null +++ b/util/dmkdir @@ -0,0 +1,57 @@ +#!/usr/bin/env php +<?php + +// file import to DAV utility + +if(!file_exists('include/cli_startup.php')) { + echo 'Run dmkdir from the top level Hubzilla web directory, as util/dmkdir <args>' . PHP_EOL; + exit(1); +} + +require_once('include/cli_startup.php'); +require_once('include/attach.php'); + +cli_startup(); + +$dstfile = $argv[1]; + +if($argc != 2) { + echo "Usage: " . $argv[0] . ' directory' . "\n"; + echo 'Always run from the toplevel web directory.' . "\n"; + echo 'directory should begin with store/$nickname/desired/path or $nickname/desired/path' . "\n"; + echo 'Example: util/dmkdir store/bob/photos/2017' . "\n"; + exit; +} + + + + if(strpos($dstfile,'store/') === 0) + $dstfile = substr($dstfile,6); + + $nick = substr($dstfile,0,strpos($dstfile,'/')); + + $dstfile = substr($dstfile,strlen($nick)+1); + + $channel = channelx_by_nick($nick); + if(! $channel) + return; + + + $arr = [ + 'pathname' => $dstfile, + 'allow_cid' => $channel['channel_allow_cid'], + 'allow_gid' => $channel['channel_allow_gid'], + 'deny_cid' => $channel['channel_deny_cid'], + 'deny_gid' => $channel['channel_deny_gid'], + ]; + + $x = attach_mkdirp($channel,$channel['channel_hash'],$arr); + + if($x['success']) { + $hash = $x['data']['hash']; + + $sync = attach_export_data($channel,$hash); + if($sync) { + build_sync_packet($channel['channel_id'],array('file' => array($sync))); + } + }
\ No newline at end of file diff --git a/util/hmessages.po b/util/hmessages.po index 2fa62031d..b1be04b10 100644 --- a/util/hmessages.po +++ b/util/hmessages.po @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: 2.6RC\n" +"Project-Id-Version: 2.9\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-08-01 11:59+0200\n" +"POT-Creation-Date: 2017-10-19 12:01+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -146,14 +146,14 @@ msgid "Special - Group Repository" msgstr "" #: ../../Zotlabs/Access/PermissionRoles.php:270 -#: ../../Zotlabs/Module/Cdav.php:1123 ../../Zotlabs/Module/New_channel.php:132 -#: ../../Zotlabs/Module/Settings/Channel.php:463 -#: ../../Zotlabs/Module/Connedit.php:931 ../../Zotlabs/Module/Profiles.php:798 +#: ../../Zotlabs/Module/Cdav.php:1182 ../../Zotlabs/Module/New_channel.php:132 +#: ../../Zotlabs/Module/Settings/Channel.php:467 +#: ../../Zotlabs/Module/Connedit.php:936 ../../Zotlabs/Module/Profiles.php:798 #: ../../Zotlabs/Module/Register.php:213 ../../include/selectors.php:49 #: ../../include/selectors.php:66 ../../include/selectors.php:104 #: ../../include/selectors.php:140 ../../include/event.php:1297 -#: ../../include/event.php:1304 ../../include/connections.php:681 -#: ../../include/connections.php:688 +#: ../../include/event.php:1304 ../../include/connections.php:689 +#: ../../include/connections.php:696 msgid "Other" msgstr "" @@ -165,16 +165,17 @@ msgstr "" #: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Achievements.php:15 #: ../../Zotlabs/Module/Hcard.php:12 ../../Zotlabs/Module/Editblock.php:31 #: ../../Zotlabs/Module/Profile.php:20 ../../Zotlabs/Module/Layouts.php:31 -#: ../../Zotlabs/Module/Editwebpage.php:32 ../../Zotlabs/Module/Webpages.php:33 -#: ../../Zotlabs/Module/Filestorage.php:51 ../../include/channel.php:960 +#: ../../Zotlabs/Module/Editwebpage.php:32 ../../Zotlabs/Module/Cards.php:29 +#: ../../Zotlabs/Module/Webpages.php:33 ../../Zotlabs/Module/Filestorage.php:51 +#: ../../include/channel.php:1163 msgid "Requested profile is not available." msgstr "" #: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80 #: ../../Zotlabs/Module/Invite.php:17 ../../Zotlabs/Module/Invite.php:94 #: ../../Zotlabs/Module/Editlayout.php:67 -#: ../../Zotlabs/Module/Editlayout.php:90 ../../Zotlabs/Module/Channel.php:115 -#: ../../Zotlabs/Module/Channel.php:245 ../../Zotlabs/Module/Channel.php:285 +#: ../../Zotlabs/Module/Editlayout.php:90 ../../Zotlabs/Module/Channel.php:110 +#: ../../Zotlabs/Module/Channel.php:248 ../../Zotlabs/Module/Channel.php:288 #: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Locs.php:87 #: ../../Zotlabs/Module/Mitem.php:115 ../../Zotlabs/Module/Events.php:271 #: ../../Zotlabs/Module/Appman.php:82 ../../Zotlabs/Module/Regmod.php:21 @@ -182,21 +183,21 @@ msgstr "" #: ../../Zotlabs/Module/New_channel.php:104 #: ../../Zotlabs/Module/Sharedwithme.php:16 ../../Zotlabs/Module/Setup.php:209 #: ../../Zotlabs/Module/Moderate.php:13 -#: ../../Zotlabs/Module/Achievements.php:34 ../../Zotlabs/Module/Thing.php:274 -#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335 +#: ../../Zotlabs/Module/Achievements.php:34 ../../Zotlabs/Module/Thing.php:275 +#: ../../Zotlabs/Module/Thing.php:295 ../../Zotlabs/Module/Thing.php:336 #: ../../Zotlabs/Module/Api.php:24 ../../Zotlabs/Module/Editblock.php:67 -#: ../../Zotlabs/Module/Profile.php:85 ../../Zotlabs/Module/Profile.php:102 +#: ../../Zotlabs/Module/Profile.php:85 ../../Zotlabs/Module/Profile.php:101 #: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Connections.php:29 #: ../../Zotlabs/Module/Viewsrc.php:19 ../../Zotlabs/Module/Bookmarks.php:64 #: ../../Zotlabs/Module/Photos.php:69 ../../Zotlabs/Module/Wiki.php:50 -#: ../../Zotlabs/Module/Wiki.php:235 ../../Zotlabs/Module/Wiki.php:341 +#: ../../Zotlabs/Module/Wiki.php:273 ../../Zotlabs/Module/Wiki.php:388 #: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Poke.php:149 -#: ../../Zotlabs/Module/Profile_photo.php:280 -#: ../../Zotlabs/Module/Profile_photo.php:293 +#: ../../Zotlabs/Module/Profile_photo.php:288 +#: ../../Zotlabs/Module/Profile_photo.php:301 #: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Item.php:223 #: ../../Zotlabs/Module/Item.php:240 ../../Zotlabs/Module/Item.php:250 -#: ../../Zotlabs/Module/Item.php:1076 ../../Zotlabs/Module/Page.php:34 -#: ../../Zotlabs/Module/Page.php:125 ../../Zotlabs/Module/Connedit.php:385 +#: ../../Zotlabs/Module/Item.php:1102 ../../Zotlabs/Module/Page.php:34 +#: ../../Zotlabs/Module/Page.php:125 ../../Zotlabs/Module/Connedit.php:389 #: ../../Zotlabs/Module/Chat.php:100 ../../Zotlabs/Module/Chat.php:105 #: ../../Zotlabs/Module/Menu.php:78 ../../Zotlabs/Module/Layouts.php:71 #: ../../Zotlabs/Module/Layouts.php:78 ../../Zotlabs/Module/Layouts.php:89 @@ -206,31 +207,34 @@ msgstr "" #: ../../Zotlabs/Module/Editwebpage.php:89 #: ../../Zotlabs/Module/Editwebpage.php:107 #: ../../Zotlabs/Module/Editwebpage.php:121 ../../Zotlabs/Module/Manage.php:10 -#: ../../Zotlabs/Module/Webpages.php:118 ../../Zotlabs/Module/Block.php:24 -#: ../../Zotlabs/Module/Block.php:74 ../../Zotlabs/Module/Editpost.php:17 -#: ../../Zotlabs/Module/Sources.php:74 ../../Zotlabs/Module/Like.php:181 -#: ../../Zotlabs/Module/Suggest.php:28 ../../Zotlabs/Module/Message.php:18 -#: ../../Zotlabs/Module/Mail.php:146 ../../Zotlabs/Module/Register.php:77 +#: ../../Zotlabs/Module/Cards.php:68 ../../Zotlabs/Module/Webpages.php:118 +#: ../../Zotlabs/Module/Block.php:24 ../../Zotlabs/Module/Block.php:74 +#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Sources.php:74 +#: ../../Zotlabs/Module/Like.php:181 ../../Zotlabs/Module/Suggest.php:28 +#: ../../Zotlabs/Module/Message.php:18 ../../Zotlabs/Module/Mail.php:146 +#: ../../Zotlabs/Module/Register.php:77 #: ../../Zotlabs/Module/Cover_photo.php:281 -#: ../../Zotlabs/Module/Cover_photo.php:294 ../../Zotlabs/Module/Network.php:15 +#: ../../Zotlabs/Module/Cover_photo.php:294 +#: ../../Zotlabs/Module/Display.php:343 ../../Zotlabs/Module/Network.php:15 #: ../../Zotlabs/Module/Filestorage.php:15 #: ../../Zotlabs/Module/Filestorage.php:70 #: ../../Zotlabs/Module/Filestorage.php:85 -#: ../../Zotlabs/Module/Filestorage.php:112 ../../Zotlabs/Module/Common.php:39 +#: ../../Zotlabs/Module/Filestorage.php:112 ../../Zotlabs/Module/Common.php:38 #: ../../Zotlabs/Module/Viewconnections.php:28 #: ../../Zotlabs/Module/Viewconnections.php:33 #: ../../Zotlabs/Module/Service_limits.php:11 ../../Zotlabs/Module/Rate.php:113 +#: ../../Zotlabs/Module/Card_edit.php:51 #: ../../Zotlabs/Module/Notifications.php:11 ../../Zotlabs/Lib/Chatroom.php:137 -#: ../../Zotlabs/Web/WebServer.php:131 ../../addon/keepout/keepout.php:36 +#: ../../Zotlabs/Web/WebServer.php:169 ../../addon/keepout/keepout.php:36 #: ../../addon/openid/Mod_Id.php:53 ../../addon/gitwiki/Mod_Gitwiki.php:196 #: ../../addon/gitwiki/Mod_Gitwiki.php:292 ../../addon/pumpio/pumpio.php:40 #: ../../include/attach.php:144 ../../include/attach.php:191 #: ../../include/attach.php:255 ../../include/attach.php:269 #: ../../include/attach.php:276 ../../include/attach.php:344 #: ../../include/attach.php:358 ../../include/attach.php:365 -#: ../../include/attach.php:442 ../../include/attach.php:911 -#: ../../include/attach.php:985 ../../include/attach.php:1150 -#: ../../include/items.php:3440 ../../include/photos.php:28 +#: ../../include/attach.php:443 ../../include/attach.php:924 +#: ../../include/attach.php:998 ../../include/attach.php:1163 +#: ../../include/items.php:3489 ../../include/photos.php:28 msgid "Permission denied." msgstr "" @@ -239,7 +243,7 @@ msgstr "" msgid "Block Name" msgstr "" -#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2280 +#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2288 msgid "Blocks" msgstr "" @@ -257,62 +261,64 @@ msgstr "" msgid "Edited" msgstr "" -#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Cdav.php:1126 +#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Cdav.php:1185 #: ../../Zotlabs/Module/New_channel.php:147 -#: ../../Zotlabs/Module/Connedit.php:934 ../../Zotlabs/Module/Menu.php:118 +#: ../../Zotlabs/Module/Connedit.php:939 ../../Zotlabs/Module/Menu.php:118 #: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Module/Profiles.php:801 -#: ../../Zotlabs/Module/Webpages.php:239 ../../Zotlabs/Storage/Browser.php:229 -#: ../../Zotlabs/Storage/Browser.php:335 ../../Zotlabs/Widget/Cdav.php:127 -#: ../../Zotlabs/Widget/Cdav.php:164 +#: ../../Zotlabs/Module/Cards.php:96 ../../Zotlabs/Module/Webpages.php:239 +#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:335 +#: ../../Zotlabs/Widget/Cdav.php:127 ../../Zotlabs/Widget/Cdav.php:164 msgid "Create" msgstr "" #: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Editlayout.php:114 #: ../../Zotlabs/Module/Admin/Profs.php:154 #: ../../Zotlabs/Module/Settings/Oauth.php:149 -#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Module/Editblock.php:114 +#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Module/Editblock.php:114 #: ../../Zotlabs/Module/Connections.php:260 #: ../../Zotlabs/Module/Connections.php:297 -#: ../../Zotlabs/Module/Connections.php:317 ../../Zotlabs/Module/Wiki.php:167 -#: ../../Zotlabs/Module/Wiki.php:300 ../../Zotlabs/Module/Menu.php:112 +#: ../../Zotlabs/Module/Connections.php:317 ../../Zotlabs/Module/Wiki.php:202 +#: ../../Zotlabs/Module/Wiki.php:346 ../../Zotlabs/Module/Menu.php:112 #: ../../Zotlabs/Module/Layouts.php:193 #: ../../Zotlabs/Module/Editwebpage.php:142 #: ../../Zotlabs/Module/Webpages.php:240 ../../Zotlabs/Module/Editpost.php:85 -#: ../../Zotlabs/Lib/Apps.php:368 ../../Zotlabs/Lib/ThreadItem.php:107 -#: ../../Zotlabs/Storage/Browser.php:239 ../../Zotlabs/Widget/Cdav.php:125 -#: ../../Zotlabs/Widget/Cdav.php:161 ../../addon/gitwiki/Mod_Gitwiki.php:151 -#: ../../addon/gitwiki/Mod_Gitwiki.php:252 ../../include/channel.php:1059 -#: ../../include/channel.php:1063 ../../include/menu.php:113 +#: ../../Zotlabs/Module/Card_edit.php:99 ../../Zotlabs/Lib/Apps.php:399 +#: ../../Zotlabs/Lib/ThreadItem.php:111 ../../Zotlabs/Storage/Browser.php:239 +#: ../../Zotlabs/Widget/Cdav.php:125 ../../Zotlabs/Widget/Cdav.php:161 +#: ../../addon/gitwiki/Mod_Gitwiki.php:151 +#: ../../addon/gitwiki/Mod_Gitwiki.php:252 ../../include/channel.php:1262 +#: ../../include/channel.php:1266 ../../include/menu.php:113 msgid "Edit" msgstr "" -#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1044 +#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1049 #: ../../Zotlabs/Module/Layouts.php:194 ../../Zotlabs/Module/Webpages.php:241 -#: ../../Zotlabs/Widget/Cdav.php:123 ../../include/conversation.php:1308 +#: ../../Zotlabs/Widget/Cdav.php:123 ../../include/conversation.php:1346 msgid "Share" msgstr "" #: ../../Zotlabs/Module/Blocks.php:162 ../../Zotlabs/Module/Editlayout.php:138 -#: ../../Zotlabs/Module/Cdav.php:838 ../../Zotlabs/Module/Cdav.php:1128 +#: ../../Zotlabs/Module/Cdav.php:897 ../../Zotlabs/Module/Cdav.php:1187 #: ../../Zotlabs/Module/Admin/Accounts.php:173 #: ../../Zotlabs/Module/Admin/Channels.php:149 #: ../../Zotlabs/Module/Admin/Profs.php:155 #: ../../Zotlabs/Module/Settings/Oauth.php:150 -#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Module/Editblock.php:139 +#: ../../Zotlabs/Module/Thing.php:262 ../../Zotlabs/Module/Editblock.php:139 #: ../../Zotlabs/Module/Connections.php:268 -#: ../../Zotlabs/Module/Photos.php:1145 ../../Zotlabs/Module/Connedit.php:650 -#: ../../Zotlabs/Module/Connedit.php:936 ../../Zotlabs/Module/Group.php:179 +#: ../../Zotlabs/Module/Photos.php:1150 ../../Zotlabs/Module/Connedit.php:654 +#: ../../Zotlabs/Module/Connedit.php:941 ../../Zotlabs/Module/Group.php:179 #: ../../Zotlabs/Module/Profiles.php:803 #: ../../Zotlabs/Module/Editwebpage.php:167 -#: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Lib/Apps.php:369 -#: ../../Zotlabs/Lib/ThreadItem.php:127 ../../Zotlabs/Storage/Browser.php:240 -#: ../../include/conversation.php:649 ../../include/conversation.php:686 +#: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Module/Card_edit.php:129 +#: ../../Zotlabs/Lib/Apps.php:400 ../../Zotlabs/Lib/ThreadItem.php:131 +#: ../../Zotlabs/Storage/Browser.php:240 ../../include/conversation.php:674 +#: ../../include/conversation.php:717 msgid "Delete" msgstr "" #: ../../Zotlabs/Module/Blocks.php:166 ../../Zotlabs/Module/Events.php:694 -#: ../../Zotlabs/Module/Wiki.php:169 ../../Zotlabs/Module/Layouts.php:198 -#: ../../Zotlabs/Module/Webpages.php:246 ../../Zotlabs/Module/Pubsites.php:59 +#: ../../Zotlabs/Module/Wiki.php:204 ../../Zotlabs/Module/Layouts.php:198 +#: ../../Zotlabs/Module/Webpages.php:246 ../../Zotlabs/Module/Pubsites.php:60 #: ../../addon/gitwiki/Mod_Gitwiki.php:153 msgid "View" msgstr "" @@ -346,10 +352,6 @@ msgid_plural "%d messages sent." msgstr[0] "" msgstr[1] "" -#: ../../Zotlabs/Module/Invite.php:98 ../../Zotlabs/Lib/Apps.php:242 -msgid "Invite" -msgstr "" - #: ../../Zotlabs/Module/Invite.php:107 msgid "You have no more invitations available" msgstr "" @@ -401,33 +403,35 @@ msgstr "" #: ../../Zotlabs/Module/Admin/Logs.php:84 #: ../../Zotlabs/Module/Admin/Channels.php:147 #: ../../Zotlabs/Module/Admin/Themes.php:158 -#: ../../Zotlabs/Module/Admin/Site.php:271 +#: ../../Zotlabs/Module/Admin/Site.php:273 #: ../../Zotlabs/Module/Admin/Profs.php:157 #: ../../Zotlabs/Module/Admin/Account_edit.php:74 #: ../../Zotlabs/Module/Admin/Security.php:104 #: ../../Zotlabs/Module/Settings/Permcats.php:110 -#: ../../Zotlabs/Module/Settings/Channel.php:476 +#: ../../Zotlabs/Module/Settings/Channel.php:480 #: ../../Zotlabs/Module/Settings/Features.php:47 #: ../../Zotlabs/Module/Settings/Tokens.php:168 #: ../../Zotlabs/Module/Settings/Account.php:118 #: ../../Zotlabs/Module/Settings/Featured.php:52 -#: ../../Zotlabs/Module/Settings/Display.php:203 +#: ../../Zotlabs/Module/Settings/Display.php:207 #: ../../Zotlabs/Module/Settings/Oauth.php:87 -#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370 -#: ../../Zotlabs/Module/Import.php:518 ../../Zotlabs/Module/Cal.php:343 +#: ../../Zotlabs/Module/Thing.php:321 ../../Zotlabs/Module/Thing.php:374 +#: ../../Zotlabs/Module/Import.php:529 ../../Zotlabs/Module/Cal.php:343 #: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Photos.php:659 -#: ../../Zotlabs/Module/Photos.php:1024 ../../Zotlabs/Module/Photos.php:1064 -#: ../../Zotlabs/Module/Photos.php:1182 ../../Zotlabs/Module/Wiki.php:171 -#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Poke.php:200 -#: ../../Zotlabs/Module/Connedit.php:899 ../../Zotlabs/Module/Chat.php:196 +#: ../../Zotlabs/Module/Photos.php:1029 ../../Zotlabs/Module/Photos.php:1069 +#: ../../Zotlabs/Module/Photos.php:1187 ../../Zotlabs/Module/Wiki.php:206 +#: ../../Zotlabs/Module/Pdledit.php:94 ../../Zotlabs/Module/Poke.php:200 +#: ../../Zotlabs/Module/Connedit.php:904 ../../Zotlabs/Module/Chat.php:196 #: ../../Zotlabs/Module/Chat.php:242 ../../Zotlabs/Module/Pconfig.php:107 #: ../../Zotlabs/Module/Group.php:87 ../../Zotlabs/Module/Profiles.php:726 #: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149 #: ../../Zotlabs/Module/Xchan.php:15 ../../Zotlabs/Module/Mail.php:431 -#: ../../Zotlabs/Module/Filestorage.php:157 ../../Zotlabs/Module/Rate.php:166 -#: ../../Zotlabs/Lib/ThreadItem.php:730 ../../Zotlabs/Widget/Eventstools.php:16 -#: ../../view/theme/redbasic/php/config.php:95 -#: ../../addon/skeleton/skeleton.php:65 ../../addon/gnusoc/gnusoc.php:226 +#: ../../Zotlabs/Module/Filestorage.php:155 ../../Zotlabs/Module/Rate.php:166 +#: ../../Zotlabs/Lib/ThreadItem.php:743 ../../Zotlabs/Widget/Eventstools.php:16 +#: ../../Zotlabs/Widget/Wiki_pages.php:61 +#: ../../view/theme/redbasic_c/php/config.php:95 +#: ../../view/theme/redbasic/php/config.php:93 +#: ../../addon/skeleton/skeleton.php:65 ../../addon/gnusoc/gnusoc.php:269 #: ../../addon/planets/planets.php:153 #: ../../addon/openclipatar/openclipatar.php:53 #: ../../addon/wppost/wppost.php:113 ../../addon/nsfw/nsfw.php:92 @@ -436,7 +440,7 @@ msgstr "" #: ../../addon/likebanner/likebanner.php:57 #: ../../addon/redphotos/redphotos.php:136 ../../addon/irc/irc.php:53 #: ../../addon/ljpost/ljpost.php:86 ../../addon/startpage/startpage.php:113 -#: ../../addon/diaspora/diaspora.php:759 +#: ../../addon/diaspora/diaspora.php:807 #: ../../addon/gitwiki/Mod_Gitwiki.php:155 #: ../../addon/rainbowtag/rainbowtag.php:85 ../../addon/visage/visage.php:170 #: ../../addon/nsabait/nsabait.php:161 ../../addon/mailtest/mailtest.php:100 @@ -444,8 +448,8 @@ msgstr "" #: ../../addon/rtof/rtof.php:101 ../../addon/jappixmini/jappixmini.php:371 #: ../../addon/superblock/superblock.php:120 ../../addon/nofed/nofed.php:80 #: ../../addon/redred/redred.php:119 ../../addon/logrot/logrot.php:35 -#: ../../addon/frphotos/frphotos.php:96 ../../addon/chords/Mod_Chords.php:60 -#: ../../addon/libertree/libertree.php:85 +#: ../../addon/frphotos/frphotos.php:96 ../../addon/pubcrawl/pubcrawl.php:1049 +#: ../../addon/chords/Mod_Chords.php:60 ../../addon/libertree/libertree.php:85 #: ../../addon/flattrwidget/flattrwidget.php:124 #: ../../addon/statusnet/statusnet.php:322 #: ../../addon/statusnet/statusnet.php:380 @@ -463,6 +467,7 @@ msgstr "" #: ../../Zotlabs/Module/Editlayout.php:79 ../../Zotlabs/Module/Editblock.php:79 #: ../../Zotlabs/Module/Editblock.php:95 #: ../../Zotlabs/Module/Editwebpage.php:80 ../../Zotlabs/Module/Editpost.php:24 +#: ../../Zotlabs/Module/Card_edit.php:17 ../../Zotlabs/Module/Card_edit.php:33 msgid "Item not found" msgstr "" @@ -482,9 +487,9 @@ msgstr "" #: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:62 #: ../../Zotlabs/Module/Import_items.php:120 ../../Zotlabs/Module/Group.php:74 #: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:68 -#: ../../Zotlabs/Module/Like.php:283 ../../Zotlabs/Web/WebServer.php:130 +#: ../../Zotlabs/Module/Like.php:283 ../../Zotlabs/Web/WebServer.php:168 #: ../../addon/redphotos/redphotos.php:119 ../../addon/frphotos/frphotos.php:81 -#: ../../addon/redfiles/redfiles.php:109 ../../include/items.php:340 +#: ../../addon/redfiles/redfiles.php:109 ../../include/items.php:346 msgid "Permission denied" msgstr "" @@ -496,7 +501,7 @@ msgstr "" msgid "Profile Visibility Editor" msgstr "" -#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1383 +#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1585 msgid "Profile" msgstr "" @@ -513,159 +518,152 @@ msgstr "" msgid "All Connections" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:726 +#: ../../Zotlabs/Module/Cdav.php:785 msgid "INVALID EVENT DISMISSED!" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:727 +#: ../../Zotlabs/Module/Cdav.php:786 msgid "Summary: " msgstr "" -#: ../../Zotlabs/Module/Cdav.php:727 ../../Zotlabs/Module/Cdav.php:728 -#: ../../Zotlabs/Module/Cdav.php:735 ../../Zotlabs/Module/Embedphotos.php:146 -#: ../../Zotlabs/Module/Photos.php:759 ../../Zotlabs/Module/Photos.php:1215 -#: ../../Zotlabs/Lib/Apps.php:696 ../../Zotlabs/Lib/Apps.php:774 +#: ../../Zotlabs/Module/Cdav.php:786 ../../Zotlabs/Module/Cdav.php:787 +#: ../../Zotlabs/Module/Cdav.php:794 ../../Zotlabs/Module/Embedphotos.php:146 +#: ../../Zotlabs/Module/Photos.php:764 ../../Zotlabs/Module/Photos.php:1220 +#: ../../Zotlabs/Lib/Apps.php:727 ../../Zotlabs/Lib/Apps.php:805 #: ../../Zotlabs/Storage/Browser.php:164 ../../Zotlabs/Widget/Portfolio.php:86 -#: ../../Zotlabs/Widget/Album.php:84 ../../include/conversation.php:1107 +#: ../../Zotlabs/Widget/Album.php:84 ../../addon/pubcrawl/as.php:841 +#: ../../include/conversation.php:1143 msgid "Unknown" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:728 +#: ../../Zotlabs/Module/Cdav.php:787 msgid "Date: " msgstr "" -#: ../../Zotlabs/Module/Cdav.php:729 ../../Zotlabs/Module/Cdav.php:736 +#: ../../Zotlabs/Module/Cdav.php:788 ../../Zotlabs/Module/Cdav.php:795 msgid "Reason: " msgstr "" -#: ../../Zotlabs/Module/Cdav.php:734 +#: ../../Zotlabs/Module/Cdav.php:793 msgid "INVALID CARD DISMISSED!" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:735 +#: ../../Zotlabs/Module/Cdav.php:794 msgid "Name: " msgstr "" -#: ../../Zotlabs/Module/Cdav.php:768 -msgid "CalDAV" -msgstr "" - -#: ../../Zotlabs/Module/Cdav.php:809 ../../Zotlabs/Module/Events.php:460 +#: ../../Zotlabs/Module/Cdav.php:868 ../../Zotlabs/Module/Events.php:460 msgid "Event title" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:810 ../../Zotlabs/Module/Events.php:466 +#: ../../Zotlabs/Module/Cdav.php:869 ../../Zotlabs/Module/Events.php:466 msgid "Start date and time" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:810 ../../Zotlabs/Module/Cdav.php:811 +#: ../../Zotlabs/Module/Cdav.php:869 ../../Zotlabs/Module/Cdav.php:870 msgid "Example: YYYY-MM-DD HH:mm" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:811 +#: ../../Zotlabs/Module/Cdav.php:870 msgid "End date and time" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:812 ../../Zotlabs/Module/Events.php:473 +#: ../../Zotlabs/Module/Cdav.php:871 ../../Zotlabs/Module/Events.php:473 #: ../../Zotlabs/Module/Appman.php:138 ../../Zotlabs/Module/Rbmark.php:101 #: ../../addon/rendezvous/rendezvous.php:173 msgid "Description" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:813 ../../Zotlabs/Module/Locs.php:117 +#: ../../Zotlabs/Module/Cdav.php:872 ../../Zotlabs/Module/Locs.php:117 #: ../../Zotlabs/Module/Events.php:475 ../../Zotlabs/Module/Profiles.php:509 -#: ../../Zotlabs/Module/Profiles.php:737 ../../Zotlabs/Module/Pubsites.php:51 +#: ../../Zotlabs/Module/Profiles.php:737 ../../Zotlabs/Module/Pubsites.php:52 #: ../../include/js_strings.php:25 msgid "Location" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:820 ../../Zotlabs/Module/Events.php:689 +#: ../../Zotlabs/Module/Cdav.php:879 ../../Zotlabs/Module/Events.php:689 #: ../../Zotlabs/Module/Events.php:698 ../../Zotlabs/Module/Cal.php:337 -#: ../../Zotlabs/Module/Cal.php:344 ../../Zotlabs/Module/Photos.php:913 +#: ../../Zotlabs/Module/Cal.php:344 ../../Zotlabs/Module/Photos.php:918 msgid "Previous" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:821 ../../Zotlabs/Module/Events.php:690 +#: ../../Zotlabs/Module/Cdav.php:880 ../../Zotlabs/Module/Events.php:690 #: ../../Zotlabs/Module/Events.php:699 ../../Zotlabs/Module/Setup.php:263 #: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Cal.php:345 -#: ../../Zotlabs/Module/Photos.php:922 +#: ../../Zotlabs/Module/Photos.php:927 msgid "Next" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:822 ../../Zotlabs/Module/Events.php:700 +#: ../../Zotlabs/Module/Cdav.php:881 ../../Zotlabs/Module/Events.php:700 #: ../../Zotlabs/Module/Cal.php:346 msgid "Today" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:823 ../../Zotlabs/Module/Events.php:695 +#: ../../Zotlabs/Module/Cdav.php:882 ../../Zotlabs/Module/Events.php:695 msgid "Month" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:824 ../../Zotlabs/Module/Events.php:696 +#: ../../Zotlabs/Module/Cdav.php:883 ../../Zotlabs/Module/Events.php:696 msgid "Week" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:825 ../../Zotlabs/Module/Events.php:697 +#: ../../Zotlabs/Module/Cdav.php:884 ../../Zotlabs/Module/Events.php:697 msgid "Day" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:826 +#: ../../Zotlabs/Module/Cdav.php:885 msgid "List month" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:827 +#: ../../Zotlabs/Module/Cdav.php:886 msgid "List week" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:828 +#: ../../Zotlabs/Module/Cdav.php:887 msgid "List day" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:835 +#: ../../Zotlabs/Module/Cdav.php:894 msgid "More" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:836 +#: ../../Zotlabs/Module/Cdav.php:895 msgid "Less" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:837 +#: ../../Zotlabs/Module/Cdav.php:896 msgid "Select calendar" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:839 +#: ../../Zotlabs/Module/Cdav.php:898 msgid "Delete all" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:840 ../../Zotlabs/Module/Cdav.php:1129 +#: ../../Zotlabs/Module/Cdav.php:899 ../../Zotlabs/Module/Cdav.php:1188 #: ../../Zotlabs/Module/Admin/Plugins.php:423 #: ../../Zotlabs/Module/Settings/Oauth.php:88 #: ../../Zotlabs/Module/Settings/Oauth.php:114 -#: ../../Zotlabs/Module/Wiki.php:290 ../../Zotlabs/Module/Wiki.php:316 -#: ../../Zotlabs/Module/Connedit.php:937 ../../Zotlabs/Module/Fbrowser.php:66 +#: ../../Zotlabs/Module/Wiki.php:333 ../../Zotlabs/Module/Wiki.php:363 +#: ../../Zotlabs/Module/Connedit.php:942 ../../Zotlabs/Module/Fbrowser.php:66 #: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Profiles.php:804 #: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Module/Tagrm.php:15 #: ../../Zotlabs/Module/Tagrm.php:138 ../../addon/js_upload/js_upload.php:46 #: ../../addon/gitwiki/Mod_Gitwiki.php:244 -#: ../../addon/gitwiki/Mod_Gitwiki.php:267 ../../include/conversation.php:1324 -#: ../../include/conversation.php:1373 +#: ../../addon/gitwiki/Mod_Gitwiki.php:267 ../../include/conversation.php:1369 +#: ../../include/conversation.php:1418 msgid "Cancel" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:841 +#: ../../Zotlabs/Module/Cdav.php:900 msgid "Sorry! Editing of recurrent events is not yet implemented." msgstr "" -#: ../../Zotlabs/Module/Cdav.php:969 -msgid "CardDAV" -msgstr "" - -#: ../../Zotlabs/Module/Cdav.php:1111 ../../Zotlabs/Module/Sharedwithme.php:105 +#: ../../Zotlabs/Module/Cdav.php:1170 ../../Zotlabs/Module/Sharedwithme.php:105 #: ../../Zotlabs/Module/Admin/Channels.php:159 #: ../../Zotlabs/Module/Settings/Oauth.php:89 #: ../../Zotlabs/Module/Settings/Oauth.php:115 -#: ../../Zotlabs/Module/Wiki.php:174 ../../Zotlabs/Module/Connedit.php:919 -#: ../../Zotlabs/Module/Chat.php:251 ../../Zotlabs/Lib/NativeWikiPage.php:539 +#: ../../Zotlabs/Module/Wiki.php:209 ../../Zotlabs/Module/Connedit.php:924 +#: ../../Zotlabs/Module/Chat.php:251 ../../Zotlabs/Lib/NativeWikiPage.php:554 #: ../../Zotlabs/Storage/Browser.php:234 #: ../../Zotlabs/Widget/Wiki_page_history.php:22 #: ../../addon/rendezvous/rendezvous.php:172 @@ -673,123 +671,123 @@ msgstr "" msgid "Name" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1112 ../../Zotlabs/Module/Connedit.php:920 +#: ../../Zotlabs/Module/Cdav.php:1171 ../../Zotlabs/Module/Connedit.php:925 msgid "Organisation" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1113 ../../Zotlabs/Module/Connedit.php:921 +#: ../../Zotlabs/Module/Cdav.php:1172 ../../Zotlabs/Module/Connedit.php:926 msgid "Title" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1114 ../../Zotlabs/Module/Connedit.php:922 +#: ../../Zotlabs/Module/Cdav.php:1173 ../../Zotlabs/Module/Connedit.php:927 #: ../../Zotlabs/Module/Profiles.php:789 msgid "Phone" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1115 +#: ../../Zotlabs/Module/Cdav.php:1174 #: ../../Zotlabs/Module/Admin/Accounts.php:169 #: ../../Zotlabs/Module/Admin/Accounts.php:181 -#: ../../Zotlabs/Module/Connedit.php:923 ../../Zotlabs/Module/Profiles.php:790 +#: ../../Zotlabs/Module/Connedit.php:928 ../../Zotlabs/Module/Profiles.php:790 #: ../../addon/openid/MysqlProvider.php:56 #: ../../addon/openid/MysqlProvider.php:57 ../../addon/rtof/rtof.php:93 -#: ../../addon/redred/redred.php:107 ../../include/network.php:1696 +#: ../../addon/redred/redred.php:107 ../../include/network.php:1706 msgid "Email" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1116 ../../Zotlabs/Module/Connedit.php:924 +#: ../../Zotlabs/Module/Cdav.php:1175 ../../Zotlabs/Module/Connedit.php:929 #: ../../Zotlabs/Module/Profiles.php:791 msgid "Instant messenger" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1117 ../../Zotlabs/Module/Connedit.php:925 +#: ../../Zotlabs/Module/Cdav.php:1176 ../../Zotlabs/Module/Connedit.php:930 #: ../../Zotlabs/Module/Profiles.php:792 msgid "Website" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1118 ../../Zotlabs/Module/Locs.php:118 +#: ../../Zotlabs/Module/Cdav.php:1177 ../../Zotlabs/Module/Locs.php:118 #: ../../Zotlabs/Module/Admin/Channels.php:160 -#: ../../Zotlabs/Module/Connedit.php:926 ../../Zotlabs/Module/Profiles.php:502 +#: ../../Zotlabs/Module/Connedit.php:931 ../../Zotlabs/Module/Profiles.php:502 #: ../../Zotlabs/Module/Profiles.php:793 msgid "Address" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1119 ../../Zotlabs/Module/Connedit.php:927 +#: ../../Zotlabs/Module/Cdav.php:1178 ../../Zotlabs/Module/Connedit.php:932 #: ../../Zotlabs/Module/Profiles.php:794 msgid "Note" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1120 ../../Zotlabs/Module/Connedit.php:928 +#: ../../Zotlabs/Module/Cdav.php:1179 ../../Zotlabs/Module/Connedit.php:933 #: ../../Zotlabs/Module/Profiles.php:795 ../../include/event.php:1290 -#: ../../include/connections.php:674 +#: ../../include/connections.php:682 msgid "Mobile" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1121 ../../Zotlabs/Module/Connedit.php:929 +#: ../../Zotlabs/Module/Cdav.php:1180 ../../Zotlabs/Module/Connedit.php:934 #: ../../Zotlabs/Module/Profiles.php:796 ../../include/event.php:1291 -#: ../../include/connections.php:675 +#: ../../include/connections.php:683 msgid "Home" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1122 ../../Zotlabs/Module/Connedit.php:930 +#: ../../Zotlabs/Module/Cdav.php:1181 ../../Zotlabs/Module/Connedit.php:935 #: ../../Zotlabs/Module/Profiles.php:797 ../../include/event.php:1294 -#: ../../include/connections.php:678 +#: ../../include/connections.php:686 msgid "Work" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1124 ../../Zotlabs/Module/Connedit.php:932 +#: ../../Zotlabs/Module/Cdav.php:1183 ../../Zotlabs/Module/Connedit.php:937 #: ../../Zotlabs/Module/Profiles.php:799 #: ../../addon/jappixmini/jappixmini.php:368 msgid "Add Contact" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1125 ../../Zotlabs/Module/Connedit.php:933 +#: ../../Zotlabs/Module/Cdav.php:1184 ../../Zotlabs/Module/Connedit.php:938 #: ../../Zotlabs/Module/Profiles.php:800 msgid "Add Field" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1127 +#: ../../Zotlabs/Module/Cdav.php:1186 #: ../../Zotlabs/Module/Admin/Plugins.php:453 #: ../../Zotlabs/Module/Settings/Oauth.php:42 #: ../../Zotlabs/Module/Settings/Oauth.php:113 -#: ../../Zotlabs/Module/Connedit.php:935 ../../Zotlabs/Module/Profiles.php:802 -#: ../../Zotlabs/Lib/Apps.php:359 +#: ../../Zotlabs/Module/Connedit.php:940 ../../Zotlabs/Module/Profiles.php:802 +#: ../../Zotlabs/Lib/Apps.php:383 msgid "Update" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1130 ../../Zotlabs/Module/Connedit.php:938 +#: ../../Zotlabs/Module/Cdav.php:1189 ../../Zotlabs/Module/Connedit.php:943 msgid "P.O. Box" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1131 ../../Zotlabs/Module/Connedit.php:939 +#: ../../Zotlabs/Module/Cdav.php:1190 ../../Zotlabs/Module/Connedit.php:944 msgid "Additional" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1132 ../../Zotlabs/Module/Connedit.php:940 +#: ../../Zotlabs/Module/Cdav.php:1191 ../../Zotlabs/Module/Connedit.php:945 msgid "Street" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1133 ../../Zotlabs/Module/Connedit.php:941 +#: ../../Zotlabs/Module/Cdav.php:1192 ../../Zotlabs/Module/Connedit.php:946 msgid "Locality" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1134 ../../Zotlabs/Module/Connedit.php:942 +#: ../../Zotlabs/Module/Cdav.php:1193 ../../Zotlabs/Module/Connedit.php:947 msgid "Region" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1135 ../../Zotlabs/Module/Connedit.php:943 +#: ../../Zotlabs/Module/Cdav.php:1194 ../../Zotlabs/Module/Connedit.php:948 msgid "ZIP Code" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1136 ../../Zotlabs/Module/Connedit.php:944 +#: ../../Zotlabs/Module/Cdav.php:1195 ../../Zotlabs/Module/Connedit.php:949 #: ../../Zotlabs/Module/Profiles.php:760 msgid "Country" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1183 +#: ../../Zotlabs/Module/Cdav.php:1242 msgid "Default Calendar" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1193 +#: ../../Zotlabs/Module/Cdav.php:1252 msgid "Default Addressbook" msgstr "" @@ -798,7 +796,7 @@ msgid "This site is not a directory server" msgstr "" #: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Chat.php:25 -#: ../../addon/gitwiki/Mod_Gitwiki.php:28 ../../addon/chess/chess.php:403 +#: ../../addon/gitwiki/Mod_Gitwiki.php:28 ../../addon/chess/chess.php:431 msgid "You must be logged in to see this page." msgstr "" @@ -812,20 +810,10 @@ msgstr "" msgid "Only posts" msgstr "" -#: ../../Zotlabs/Module/Channel.php:97 ../../Zotlabs/Lib/Apps.php:228 -#: ../../include/nav.php:175 -msgid "Channel Home" -msgstr "" - -#: ../../Zotlabs/Module/Channel.php:112 +#: ../../Zotlabs/Module/Channel.php:107 msgid "Insufficient permissions. Request redirected to profile page." msgstr "" -#: ../../Zotlabs/Module/Lang.php:8 ../../Zotlabs/Lib/Apps.php:244 -#: ../../addon/openid/MysqlProvider.php:69 -msgid "Language" -msgstr "" - #: ../../Zotlabs/Module/Uexport.php:57 ../../Zotlabs/Module/Uexport.php:58 msgid "Export Channel" msgstr "" @@ -886,16 +874,15 @@ msgstr "" #: ../../Zotlabs/Module/Search.php:17 ../../Zotlabs/Module/Photos.php:490 #: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Directory.php:63 -#: ../../Zotlabs/Module/Display.php:22 +#: ../../Zotlabs/Module/Display.php:21 #: ../../Zotlabs/Module/Viewconnections.php:23 msgid "Public access denied." msgstr "" -#: ../../Zotlabs/Module/Search.php:25 ../../Zotlabs/Module/Search.php:44 -#: ../../Zotlabs/Module/Connections.php:313 ../../Zotlabs/Lib/Apps.php:238 -#: ../../Zotlabs/Widget/Sitesearch.php:31 ../../include/text.php:1021 -#: ../../include/text.php:1033 ../../include/acl_selectors.php:213 -#: ../../include/nav.php:160 +#: ../../Zotlabs/Module/Search.php:44 ../../Zotlabs/Module/Connections.php:313 +#: ../../Zotlabs/Lib/Apps.php:250 ../../Zotlabs/Widget/Sitesearch.php:31 +#: ../../include/text.php:1029 ../../include/text.php:1041 +#: ../../include/acl_selectors.php:213 ../../include/nav.php:204 msgid "Search" msgstr "" @@ -909,6 +896,11 @@ msgstr "" msgid "Search results for: %s" msgstr "" +#: ../../Zotlabs/Module/Pubstream.php:38 +#: ../../Zotlabs/Widget/Notifications.php:128 +msgid "Public Stream" +msgstr "" + #: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54 msgid "Location not found." msgstr "" @@ -961,11 +953,11 @@ msgstr "" msgid "Use this form to drop the location if the hub is no longer operating." msgstr "" -#: ../../Zotlabs/Module/Apporder.php:34 +#: ../../Zotlabs/Module/Apporder.php:39 msgid "Change Order of Navigation Apps" msgstr "" -#: ../../Zotlabs/Module/Apporder.php:35 +#: ../../Zotlabs/Module/Apporder.php:40 msgid "Use arrows to move the corresponding app up or down in the display list" msgstr "" @@ -995,7 +987,7 @@ msgid "Menu Item Permissions" msgstr "" #: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231 -#: ../../Zotlabs/Module/Settings/Channel.php:509 +#: ../../Zotlabs/Module/Settings/Channel.php:513 msgid "(click to open/close)" msgstr "" @@ -1018,17 +1010,20 @@ msgstr "" #: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:163 #: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241 #: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471 -#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Admin/Site.php:235 -#: ../../Zotlabs/Module/Settings/Channel.php:294 +#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Admin/Site.php:237 +#: ../../Zotlabs/Module/Settings/Channel.php:298 #: ../../Zotlabs/Module/Settings/Display.php:103 #: ../../Zotlabs/Module/Api.php:97 ../../Zotlabs/Module/Photos.php:644 -#: ../../Zotlabs/Module/Wiki.php:182 ../../Zotlabs/Module/Connedit.php:392 -#: ../../Zotlabs/Module/Connedit.php:775 ../../Zotlabs/Module/Menu.php:100 -#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Profiles.php:681 -#: ../../Zotlabs/Module/Filestorage.php:152 -#: ../../Zotlabs/Module/Filestorage.php:160 ../../boot.php:1602 -#: ../../view/theme/redbasic/php/config.php:100 -#: ../../view/theme/redbasic/php/config.php:115 +#: ../../Zotlabs/Module/Wiki.php:218 ../../Zotlabs/Module/Wiki.php:219 +#: ../../Zotlabs/Module/Connedit.php:396 ../../Zotlabs/Module/Connedit.php:779 +#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157 +#: ../../Zotlabs/Module/Profiles.php:681 +#: ../../Zotlabs/Module/Filestorage.php:150 +#: ../../Zotlabs/Module/Filestorage.php:158 +#: ../../Zotlabs/Storage/Browser.php:351 ../../boot.php:1644 +#: ../../view/theme/redbasic_c/php/config.php:100 +#: ../../view/theme/redbasic_c/php/config.php:115 +#: ../../view/theme/redbasic/php/config.php:98 #: ../../addon/planets/planets.php:149 ../../addon/wppost/wppost.php:82 #: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109 #: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73 @@ -1065,17 +1060,19 @@ msgstr "" #: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:163 #: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241 #: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471 -#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Admin/Site.php:237 -#: ../../Zotlabs/Module/Settings/Channel.php:294 +#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Admin/Site.php:239 +#: ../../Zotlabs/Module/Settings/Channel.php:298 #: ../../Zotlabs/Module/Settings/Display.php:103 #: ../../Zotlabs/Module/Api.php:96 ../../Zotlabs/Module/Photos.php:644 -#: ../../Zotlabs/Module/Wiki.php:182 ../../Zotlabs/Module/Connedit.php:392 -#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157 -#: ../../Zotlabs/Module/Profiles.php:681 -#: ../../Zotlabs/Module/Filestorage.php:152 -#: ../../Zotlabs/Module/Filestorage.php:160 ../../boot.php:1602 -#: ../../view/theme/redbasic/php/config.php:100 -#: ../../view/theme/redbasic/php/config.php:115 +#: ../../Zotlabs/Module/Wiki.php:218 ../../Zotlabs/Module/Wiki.php:219 +#: ../../Zotlabs/Module/Connedit.php:396 ../../Zotlabs/Module/Menu.php:100 +#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Profiles.php:681 +#: ../../Zotlabs/Module/Filestorage.php:150 +#: ../../Zotlabs/Module/Filestorage.php:158 +#: ../../Zotlabs/Storage/Browser.php:351 ../../boot.php:1644 +#: ../../view/theme/redbasic_c/php/config.php:100 +#: ../../view/theme/redbasic_c/php/config.php:115 +#: ../../view/theme/redbasic/php/config.php:98 #: ../../addon/planets/planets.php:149 ../../addon/wppost/wppost.php:82 #: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109 #: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73 @@ -1216,17 +1213,10 @@ msgstr "" #: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Tagger.php:51 #: ../../Zotlabs/Module/Like.php:372 ../../include/conversation.php:119 -#: ../../include/text.php:1933 ../../include/event.php:1145 +#: ../../include/text.php:1941 ../../include/event.php:1145 msgid "event" msgstr "" -#: ../../Zotlabs/Module/Events.php:275 ../../Zotlabs/Lib/Apps.php:231 -#: ../../include/conversation.php:1799 ../../include/conversation.php:1802 -#: ../../include/nav.php:195 ../../include/nav.php:391 -#: ../../include/nav.php:394 -msgid "Events" -msgstr "" - #: ../../Zotlabs/Module/Events.php:460 msgid "Edit event title" msgstr "" @@ -1284,13 +1274,13 @@ msgstr "" msgid "Edit Location" msgstr "" -#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1065 -#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/ThreadItem.php:739 -#: ../../include/conversation.php:1277 +#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1070 +#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/ThreadItem.php:753 +#: ../../include/conversation.php:1313 msgid "Preview" msgstr "" -#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1340 +#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1385 msgid "Permission settings" msgstr "" @@ -1315,7 +1305,7 @@ msgid "Delete event" msgstr "" #: ../../Zotlabs/Module/Events.php:660 ../../Zotlabs/Module/Cal.php:313 -#: ../../include/text.php:1752 +#: ../../include/text.php:1760 msgid "Link to Source" msgstr "" @@ -1332,7 +1322,7 @@ msgid "Create Event" msgstr "" #: ../../Zotlabs/Module/Events.php:691 ../../Zotlabs/Module/Cal.php:339 -#: ../../include/channel.php:1386 +#: ../../include/channel.php:1588 msgid "Export" msgstr "" @@ -1400,21 +1390,21 @@ msgstr "" msgid "Please login." msgstr "" -#: ../../Zotlabs/Module/Magic.php:71 +#: ../../Zotlabs/Module/Magic.php:72 msgid "Hub not found." msgstr "" #: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Tagger.php:47 #: ../../Zotlabs/Module/Like.php:370 #: ../../addon/redphotos/redphotohelper.php:71 -#: ../../addon/diaspora/Receiver.php:1370 ../../include/conversation.php:116 -#: ../../include/text.php:1930 +#: ../../addon/diaspora/Receiver.php:1424 ../../addon/pubcrawl/as.php:1288 +#: ../../include/conversation.php:116 ../../include/text.php:1938 msgid "photo" msgstr "" #: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Like.php:370 -#: ../../addon/diaspora/Receiver.php:1370 ../../include/conversation.php:144 -#: ../../include/text.php:1936 +#: ../../addon/diaspora/Receiver.php:1424 ../../addon/pubcrawl/as.php:1288 +#: ../../include/conversation.php:144 ../../include/text.php:1944 msgid "status" msgstr "" @@ -1459,7 +1449,7 @@ msgid "Use this form to import existing posts and content from an export file." msgstr "" #: ../../Zotlabs/Module/Import_items.php:127 -#: ../../Zotlabs/Module/Import.php:505 +#: ../../Zotlabs/Module/Import.php:516 msgid "File to Upload" msgstr "" @@ -1536,6 +1526,7 @@ msgstr "" #: ../../Zotlabs/Module/Removeme.php:61 #: ../../Zotlabs/Module/Removeaccount.php:58 +#: ../../Zotlabs/Module/Changeaddr.php:78 msgid "WARNING: " msgstr "" @@ -1550,6 +1541,7 @@ msgstr "" #: ../../Zotlabs/Module/Removeme.php:62 #: ../../Zotlabs/Module/Removeaccount.php:59 +#: ../../Zotlabs/Module/Changeaddr.php:79 msgid "Please enter your password for verification:" msgstr "" @@ -1564,7 +1556,7 @@ msgid "" msgstr "" #: ../../Zotlabs/Module/Removeme.php:64 -#: ../../Zotlabs/Module/Settings/Channel.php:574 +#: ../../Zotlabs/Module/Settings/Channel.php:580 msgid "Remove Channel" msgstr "" @@ -1577,7 +1569,7 @@ msgid "NEW" msgstr "" #: ../../Zotlabs/Module/Sharedwithme.php:107 -#: ../../Zotlabs/Storage/Browser.php:236 ../../include/text.php:1386 +#: ../../Zotlabs/Storage/Browser.php:236 ../../include/text.php:1394 msgid "Size" msgstr "" @@ -2167,9 +2159,9 @@ msgstr "" #: ../../Zotlabs/Module/Admin/Plugins.php:259 #: ../../Zotlabs/Module/Admin/Themes.php:72 ../../Zotlabs/Module/Thing.php:89 -#: ../../Zotlabs/Module/Viewsrc.php:25 ../../Zotlabs/Module/Display.php:35 -#: ../../Zotlabs/Module/Filestorage.php:24 ../../Zotlabs/Module/Admin.php:62 -#: ../../include/items.php:3361 +#: ../../Zotlabs/Module/Viewsrc.php:25 ../../Zotlabs/Module/Display.php:33 +#: ../../Zotlabs/Module/Display.php:347 ../../Zotlabs/Module/Filestorage.php:24 +#: ../../Zotlabs/Module/Admin.php:62 ../../include/items.php:3410 msgid "Item not found." msgstr "" @@ -2200,7 +2192,7 @@ msgstr "" #: ../../Zotlabs/Module/Admin/Channels.php:145 #: ../../Zotlabs/Module/Admin/Themes.php:122 #: ../../Zotlabs/Module/Admin/Themes.php:156 -#: ../../Zotlabs/Module/Admin/Site.php:269 +#: ../../Zotlabs/Module/Admin/Site.php:271 #: ../../Zotlabs/Module/Admin/Security.php:86 #: ../../Zotlabs/Module/Admin.php:136 msgid "Administration" @@ -2217,8 +2209,9 @@ msgid "Toggle" msgstr "" #: ../../Zotlabs/Module/Admin/Plugins.php:344 -#: ../../Zotlabs/Module/Admin/Themes.php:125 ../../Zotlabs/Lib/Apps.php:224 -#: ../../Zotlabs/Widget/Settings_menu.php:133 ../../include/nav.php:201 +#: ../../Zotlabs/Module/Admin/Themes.php:125 ../../Zotlabs/Lib/Apps.php:236 +#: ../../Zotlabs/Widget/Settings_menu.php:133 ../../include/nav.php:132 +#: ../../include/nav.php:217 msgid "Settings" msgstr "" @@ -2281,7 +2274,7 @@ msgstr "" msgid "Install new repo" msgstr "" -#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:359 +#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:383 msgid "Install" msgstr "" @@ -2302,7 +2295,7 @@ msgid "Switch branch" msgstr "" #: ../../Zotlabs/Module/Admin/Plugins.php:455 -#: ../../Zotlabs/Module/Photos.php:962 ../../Zotlabs/Module/Tagrm.php:137 +#: ../../Zotlabs/Module/Photos.php:967 ../../Zotlabs/Module/Tagrm.php:137 #: ../../addon/superblock/superblock.php:116 msgid "Remove" msgstr "" @@ -2325,7 +2318,7 @@ msgstr[1] "" msgid "Account not found" msgstr "" -#: ../../Zotlabs/Module/Admin/Accounts.php:90 +#: ../../Zotlabs/Module/Admin/Accounts.php:90 ../../include/channel.php:2357 #, php-format msgid "Account '%s' deleted" msgstr "" @@ -2364,7 +2357,7 @@ msgid "No registrations." msgstr "" #: ../../Zotlabs/Module/Admin/Accounts.php:171 -#: ../../Zotlabs/Module/Connections.php:282 ../../include/conversation.php:685 +#: ../../Zotlabs/Module/Connections.php:282 ../../include/conversation.php:716 msgid "Approve" msgstr "" @@ -2373,12 +2366,12 @@ msgid "Deny" msgstr "" #: ../../Zotlabs/Module/Admin/Accounts.php:174 -#: ../../Zotlabs/Module/Connedit.php:618 +#: ../../Zotlabs/Module/Connedit.php:622 msgid "Block" msgstr "" #: ../../Zotlabs/Module/Admin/Accounts.php:175 -#: ../../Zotlabs/Module/Connedit.php:618 +#: ../../Zotlabs/Module/Connedit.php:622 msgid "Unblock" msgstr "" @@ -2521,7 +2514,7 @@ msgid "Disallow Code" msgstr "" #: ../../Zotlabs/Module/Admin/Channels.php:154 -#: ../../include/conversation.php:1757 ../../include/nav.php:349 +#: ../../include/conversation.php:1791 ../../include/nav.php:399 msgid "Channel" msgstr "" @@ -2566,379 +2559,391 @@ msgstr "" msgid "[Unsupported]" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:142 +#: ../../Zotlabs/Module/Admin/Site.php:144 msgid "Site settings updated." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:168 -#: ../../view/theme/redbasic/php/config.php:15 ../../include/text.php:2928 +#: ../../Zotlabs/Module/Admin/Site.php:170 +#: ../../view/theme/redbasic_c/php/config.php:15 +#: ../../view/theme/redbasic/php/config.php:15 ../../include/text.php:2943 msgid "Default" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:179 +#: ../../Zotlabs/Module/Admin/Site.php:181 #: ../../Zotlabs/Module/Settings/Display.php:137 #, php-format msgid "%s - (Incompatible)" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:186 +#: ../../Zotlabs/Module/Admin/Site.php:188 #: ../../Zotlabs/Module/Settings/Display.php:151 msgid "mobile" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:188 +#: ../../Zotlabs/Module/Admin/Site.php:190 msgid "experimental" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:190 +#: ../../Zotlabs/Module/Admin/Site.php:192 msgid "unsupported" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:236 +#: ../../Zotlabs/Module/Admin/Site.php:238 msgid "Yes - with approval" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:242 +#: ../../Zotlabs/Module/Admin/Site.php:244 msgid "My site is not a public server" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:243 +#: ../../Zotlabs/Module/Admin/Site.php:245 msgid "My site has paid access only" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:244 +#: ../../Zotlabs/Module/Admin/Site.php:246 msgid "My site has free access only" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:245 +#: ../../Zotlabs/Module/Admin/Site.php:247 msgid "My site offers free accounts with optional paid upgrades" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:256 +#: ../../Zotlabs/Module/Admin/Site.php:258 msgid "Beginner/Basic" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:257 +#: ../../Zotlabs/Module/Admin/Site.php:259 msgid "Novice - not skilled but willing to learn" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:258 +#: ../../Zotlabs/Module/Admin/Site.php:260 msgid "Intermediate - somewhat comfortable" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:259 +#: ../../Zotlabs/Module/Admin/Site.php:261 msgid "Advanced - very comfortable" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:260 +#: ../../Zotlabs/Module/Admin/Site.php:262 msgid "Expert - I can write computer code" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:261 +#: ../../Zotlabs/Module/Admin/Site.php:263 msgid "Wizard - I probably know more than you do" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:270 ../../Zotlabs/Widget/Admin.php:22 +#: ../../Zotlabs/Module/Admin/Site.php:272 ../../Zotlabs/Widget/Admin.php:22 msgid "Site" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:272 +#: ../../Zotlabs/Module/Admin/Site.php:274 #: ../../Zotlabs/Module/Register.php:251 msgid "Registration" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:273 +#: ../../Zotlabs/Module/Admin/Site.php:275 msgid "File upload" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:274 +#: ../../Zotlabs/Module/Admin/Site.php:276 msgid "Policies" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:275 ../../include/contact_widgets.php:16 +#: ../../Zotlabs/Module/Admin/Site.php:277 ../../include/contact_widgets.php:16 msgid "Advanced" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:279 +#: ../../Zotlabs/Module/Admin/Site.php:281 #: ../../addon/statusnet/statusnet.php:890 msgid "Site name" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:281 +#: ../../Zotlabs/Module/Admin/Site.php:283 msgid "Site default technical skill level" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:281 +#: ../../Zotlabs/Module/Admin/Site.php:283 msgid "Used to provide a member experience matched to technical comfort level" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:283 +#: ../../Zotlabs/Module/Admin/Site.php:285 msgid "Lock the technical skill level setting" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:283 +#: ../../Zotlabs/Module/Admin/Site.php:285 msgid "Members can set their own technical comfort level by default" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:285 +#: ../../Zotlabs/Module/Admin/Site.php:287 msgid "Banner/Logo" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:286 +#: ../../Zotlabs/Module/Admin/Site.php:288 msgid "Administrator Information" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:286 +#: ../../Zotlabs/Module/Admin/Site.php:288 msgid "" "Contact information for site administrators. Displayed on siteinfo page. " "BBCode can be used here" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:287 ../../Zotlabs/Module/Siteinfo.php:22 +#: ../../Zotlabs/Module/Admin/Site.php:289 ../../Zotlabs/Module/Siteinfo.php:22 msgid "Site Information" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:287 +#: ../../Zotlabs/Module/Admin/Site.php:289 msgid "" "Publicly visible description of this site. Displayed on siteinfo page. " "BBCode can be used here" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:288 +#: ../../Zotlabs/Module/Admin/Site.php:290 msgid "System language" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:289 +#: ../../Zotlabs/Module/Admin/Site.php:291 msgid "System theme" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:289 +#: ../../Zotlabs/Module/Admin/Site.php:291 msgid "" "Default system theme - may be over-ridden by user profiles - <a href='#' " "id='cnftheme'>change theme settings</a>" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:290 +#: ../../Zotlabs/Module/Admin/Site.php:292 msgid "Mobile system theme" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:290 +#: ../../Zotlabs/Module/Admin/Site.php:292 msgid "Theme for mobile devices" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:292 +#: ../../Zotlabs/Module/Admin/Site.php:294 msgid "Allow Feeds as Connections" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:292 +#: ../../Zotlabs/Module/Admin/Site.php:294 msgid "(Heavy system resource usage)" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:293 +#: ../../Zotlabs/Module/Admin/Site.php:295 msgid "Maximum image size" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:293 +#: ../../Zotlabs/Module/Admin/Site.php:295 msgid "" "Maximum size in bytes of uploaded images. Default is 0, which means no " "limits." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:294 +#: ../../Zotlabs/Module/Admin/Site.php:296 msgid "Does this site allow new member registration?" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:295 +#: ../../Zotlabs/Module/Admin/Site.php:297 msgid "Invitation only" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:295 +#: ../../Zotlabs/Module/Admin/Site.php:297 msgid "" "Only allow new member registrations with an invitation code. Above register " "policy must be set to Yes." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:296 +#: ../../Zotlabs/Module/Admin/Site.php:298 msgid "Which best describes the types of account offered by this hub?" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:297 +#: ../../Zotlabs/Module/Admin/Site.php:299 msgid "Register text" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:297 +#: ../../Zotlabs/Module/Admin/Site.php:299 msgid "Will be displayed prominently on the registration page." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:298 +#: ../../Zotlabs/Module/Admin/Site.php:300 msgid "Site homepage to show visitors (default: login box)" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:298 +#: ../../Zotlabs/Module/Admin/Site.php:300 msgid "" "example: 'public' to show public stream, 'page/sys/home' to show a system " "webpage called 'home' or 'include:home.html' to include a file." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:299 +#: ../../Zotlabs/Module/Admin/Site.php:301 msgid "Preserve site homepage URL" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:299 +#: ../../Zotlabs/Module/Admin/Site.php:301 msgid "" "Present the site homepage in a frame at the original location instead of " "redirecting" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:300 +#: ../../Zotlabs/Module/Admin/Site.php:302 msgid "Accounts abandoned after x days" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:300 +#: ../../Zotlabs/Module/Admin/Site.php:302 msgid "" "Will not waste system resources polling external sites for abandonded " "accounts. Enter 0 for no time limit." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:301 +#: ../../Zotlabs/Module/Admin/Site.php:303 msgid "Allowed friend domains" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:301 +#: ../../Zotlabs/Module/Admin/Site.php:303 msgid "" "Comma separated list of domains which are allowed to establish friendships " "with this site. Wildcards are accepted. Empty to allow any domains" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:302 +#: ../../Zotlabs/Module/Admin/Site.php:304 msgid "Verify Email Addresses" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:302 +#: ../../Zotlabs/Module/Admin/Site.php:304 msgid "" "Check to verify email addresses used in account registration (recommended)." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:303 +#: ../../Zotlabs/Module/Admin/Site.php:305 msgid "Force publish" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:303 +#: ../../Zotlabs/Module/Admin/Site.php:305 msgid "" "Check to force all profiles on this site to be listed in the site directory." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:304 +#: ../../Zotlabs/Module/Admin/Site.php:306 msgid "Import Public Streams" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:304 +#: ../../Zotlabs/Module/Admin/Site.php:306 msgid "" "Import and allow access to public content pulled from other sites. Warning: " "this content is unmoderated." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:305 +#: ../../Zotlabs/Module/Admin/Site.php:307 msgid "Login on Homepage" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:305 +#: ../../Zotlabs/Module/Admin/Site.php:307 msgid "" "Present a login box to visitors on the home page if no other content has " "been configured." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:306 +#: ../../Zotlabs/Module/Admin/Site.php:308 msgid "Enable context help" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:306 +#: ../../Zotlabs/Module/Admin/Site.php:308 msgid "" "Display contextual help for the current page when the help button is pressed." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:308 +#: ../../Zotlabs/Module/Admin/Site.php:310 msgid "Reply-to email address for system generated email." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:309 +#: ../../Zotlabs/Module/Admin/Site.php:311 msgid "Sender (From) email address for system generated email." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:310 +#: ../../Zotlabs/Module/Admin/Site.php:312 msgid "Name of email sender for system generated email." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:312 +#: ../../Zotlabs/Module/Admin/Site.php:314 msgid "Directory Server URL" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:312 +#: ../../Zotlabs/Module/Admin/Site.php:314 msgid "Default directory server" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:314 +#: ../../Zotlabs/Module/Admin/Site.php:316 msgid "Proxy user" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:315 +#: ../../Zotlabs/Module/Admin/Site.php:317 msgid "Proxy URL" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:316 +#: ../../Zotlabs/Module/Admin/Site.php:318 msgid "Network timeout" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:316 +#: ../../Zotlabs/Module/Admin/Site.php:318 msgid "Value is in seconds. Set to 0 for unlimited (not recommended)." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:317 +#: ../../Zotlabs/Module/Admin/Site.php:319 msgid "Delivery interval" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:317 +#: ../../Zotlabs/Module/Admin/Site.php:319 msgid "" "Delay background delivery processes by this many seconds to reduce system " "load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 " "for large dedicated servers." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:318 +#: ../../Zotlabs/Module/Admin/Site.php:320 msgid "Deliveries per process" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:318 +#: ../../Zotlabs/Module/Admin/Site.php:320 msgid "" "Number of deliveries to attempt in a single operating system process. Adjust " "if necessary to tune system performance. Recommend: 1-5." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:319 +#: ../../Zotlabs/Module/Admin/Site.php:321 msgid "Poll interval" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:319 +#: ../../Zotlabs/Module/Admin/Site.php:321 msgid "" "Delay background polling processes by this many seconds to reduce system " "load. If 0, use delivery interval." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:320 +#: ../../Zotlabs/Module/Admin/Site.php:322 +msgid "Path to ImageMagick convert program" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Site.php:322 +msgid "" +"If set, use this program to generate photo thumbnails for huge images ( > " +"4000 pixels in either dimension), otherwise memory exhaustion may occur. " +"Example: /usr/bin/convert" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Site.php:323 msgid "Maximum Load Average" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:320 +#: ../../Zotlabs/Module/Admin/Site.php:323 msgid "" "Maximum system load before delivery and poll processes are deferred - " "default 50." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:321 +#: ../../Zotlabs/Module/Admin/Site.php:324 msgid "Expiration period in days for imported (grid/network) content" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:321 +#: ../../Zotlabs/Module/Admin/Site.php:324 msgid "0 for no expiration of imported content" msgstr "" @@ -2984,8 +2989,8 @@ msgstr "" #: ../../Zotlabs/Module/Admin/Profs.php:74 #: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32 #: ../../Zotlabs/Module/Rbmark.php:104 ../../Zotlabs/Module/Filer.php:53 -#: ../../Zotlabs/Widget/Notes.php:18 ../../include/text.php:1022 -#: ../../include/text.php:1034 +#: ../../Zotlabs/Widget/Notes.php:18 ../../include/text.php:1030 +#: ../../include/text.php:1042 msgid "Save" msgstr "" @@ -3182,16 +3187,16 @@ msgid "Visible to:" msgstr "" #: ../../Zotlabs/Module/Lockview.php:117 ../../Zotlabs/Module/Lockview.php:153 -#: ../../Zotlabs/Module/Acl.php:117 ../../include/acl_selectors.php:183 +#: ../../Zotlabs/Module/Acl.php:118 ../../include/acl_selectors.php:183 msgctxt "acl" msgid "Profile" msgstr "" -#: ../../Zotlabs/Module/Moderate.php:37 +#: ../../Zotlabs/Module/Moderate.php:55 msgid "Comment approved" msgstr "" -#: ../../Zotlabs/Module/Moderate.php:41 +#: ../../Zotlabs/Module/Moderate.php:59 msgid "Comment deleted" msgstr "" @@ -3215,25 +3220,25 @@ msgstr "" #: ../../Zotlabs/Module/Settings/Permcats.php:103 #: ../../Zotlabs/Module/Settings/Tokens.php:161 -#: ../../Zotlabs/Module/Connedit.php:903 +#: ../../Zotlabs/Module/Connedit.php:908 msgid "My Settings" msgstr "" #: ../../Zotlabs/Module/Settings/Permcats.php:105 #: ../../Zotlabs/Module/Settings/Tokens.php:163 -#: ../../Zotlabs/Module/Connedit.php:898 +#: ../../Zotlabs/Module/Connedit.php:903 msgid "inherited" msgstr "" #: ../../Zotlabs/Module/Settings/Permcats.php:108 #: ../../Zotlabs/Module/Settings/Tokens.php:166 -#: ../../Zotlabs/Module/Connedit.php:905 +#: ../../Zotlabs/Module/Connedit.php:910 msgid "Individual Permissions" msgstr "" #: ../../Zotlabs/Module/Settings/Permcats.php:109 #: ../../Zotlabs/Module/Settings/Tokens.php:167 -#: ../../Zotlabs/Module/Connedit.php:906 +#: ../../Zotlabs/Module/Connedit.php:911 msgid "" "Some permissions may be inherited from your channel's <a href=\"settings" "\"><strong>privacy settings</strong></a>, which have higher priority than " @@ -3245,13 +3250,13 @@ msgstr "" #: ../../Zotlabs/Module/Settings/Channel.php:67 #: ../../Zotlabs/Module/Settings/Channel.php:70 #: ../../Zotlabs/Module/Settings/Channel.php:81 -#: ../../Zotlabs/Module/Connedit.php:707 ../../Zotlabs/Widget/Affinity.php:28 -#: ../../include/selectors.php:123 ../../include/channel.php:408 -#: ../../include/channel.php:409 ../../include/channel.php:416 +#: ../../Zotlabs/Module/Connedit.php:711 ../../Zotlabs/Widget/Affinity.php:28 +#: ../../include/selectors.php:123 ../../include/channel.php:423 +#: ../../include/channel.php:424 ../../include/channel.php:431 msgid "Friends" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:251 +#: ../../Zotlabs/Module/Settings/Channel.php:255 #: ../../addon/rendezvous/rendezvous.php:82 #: ../../addon/openstreetmap/openstreetmap.php:184 #: ../../addon/msgfooter/msgfooter.php:54 ../../addon/logrot/logrot.php:54 @@ -3260,379 +3265,387 @@ msgstr "" msgid "Settings updated." msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:312 +#: ../../Zotlabs/Module/Settings/Channel.php:316 msgid "Nobody except yourself" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:313 +#: ../../Zotlabs/Module/Settings/Channel.php:317 msgid "Only those you specifically allow" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:314 +#: ../../Zotlabs/Module/Settings/Channel.php:318 msgid "Approved connections" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:315 +#: ../../Zotlabs/Module/Settings/Channel.php:319 msgid "Any connections" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:316 +#: ../../Zotlabs/Module/Settings/Channel.php:320 msgid "Anybody on this website" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:317 +#: ../../Zotlabs/Module/Settings/Channel.php:321 msgid "Anybody in this network" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:318 +#: ../../Zotlabs/Module/Settings/Channel.php:322 msgid "Anybody authenticated" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:319 +#: ../../Zotlabs/Module/Settings/Channel.php:323 msgid "Anybody on the internet" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:395 +#: ../../Zotlabs/Module/Settings/Channel.php:399 msgid "Publish your default profile in the network directory" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:400 +#: ../../Zotlabs/Module/Settings/Channel.php:404 msgid "Allow us to suggest you as a potential friend to new members?" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:404 -#: ../../Zotlabs/Module/Profile_photo.php:429 +#: ../../Zotlabs/Module/Settings/Channel.php:408 +#: ../../Zotlabs/Module/Profile_photo.php:437 #: ../../Zotlabs/Module/Cover_photo.php:365 msgid "or" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:409 +#: ../../Zotlabs/Module/Settings/Channel.php:413 msgid "Your channel address is" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:412 +#: ../../Zotlabs/Module/Settings/Channel.php:416 msgid "Your files/photos are accessible via WebDAV at" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:474 +#: ../../Zotlabs/Module/Settings/Channel.php:478 msgid "Channel Settings" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:481 +#: ../../Zotlabs/Module/Settings/Channel.php:485 msgid "Basic Settings" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:482 ../../include/channel.php:1271 +#: ../../Zotlabs/Module/Settings/Channel.php:486 ../../include/channel.php:1473 msgid "Full Name:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:483 +#: ../../Zotlabs/Module/Settings/Channel.php:487 #: ../../Zotlabs/Module/Settings/Account.php:119 msgid "Email Address:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:484 +#: ../../Zotlabs/Module/Settings/Channel.php:488 msgid "Your Timezone:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:485 +#: ../../Zotlabs/Module/Settings/Channel.php:489 msgid "Default Post Location:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:485 +#: ../../Zotlabs/Module/Settings/Channel.php:489 msgid "Geographical location to display on your posts" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:486 +#: ../../Zotlabs/Module/Settings/Channel.php:490 msgid "Use Browser Location:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:488 +#: ../../Zotlabs/Module/Settings/Channel.php:492 msgid "Adult Content" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:488 +#: ../../Zotlabs/Module/Settings/Channel.php:492 msgid "" "This channel frequently or regularly publishes adult content. (Please tag " "any adult material and/or nudity with #NSFW)" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:490 +#: ../../Zotlabs/Module/Settings/Channel.php:494 msgid "Security and Privacy Settings" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:492 +#: ../../Zotlabs/Module/Settings/Channel.php:496 msgid "Your permissions are already configured. Click to view/adjust" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:494 +#: ../../Zotlabs/Module/Settings/Channel.php:498 msgid "Hide my online presence" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:494 +#: ../../Zotlabs/Module/Settings/Channel.php:498 msgid "Prevents displaying in your profile that you are online" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:496 +#: ../../Zotlabs/Module/Settings/Channel.php:500 msgid "Simple Privacy Settings:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:497 +#: ../../Zotlabs/Module/Settings/Channel.php:501 msgid "" "Very Public - <em>extremely permissive (should be used with caution)</em>" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:498 +#: ../../Zotlabs/Module/Settings/Channel.php:502 msgid "" "Typical - <em>default public, privacy when desired (similar to social " "network permissions but with improved privacy)</em>" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:499 +#: ../../Zotlabs/Module/Settings/Channel.php:503 msgid "Private - <em>default private, never open or public</em>" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:500 +#: ../../Zotlabs/Module/Settings/Channel.php:504 msgid "Blocked - <em>default blocked to/from everybody</em>" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:502 +#: ../../Zotlabs/Module/Settings/Channel.php:506 msgid "Allow others to tag your posts" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:502 +#: ../../Zotlabs/Module/Settings/Channel.php:506 msgid "" "Often used by the community to retro-actively flag inappropriate content" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:504 +#: ../../Zotlabs/Module/Settings/Channel.php:508 msgid "Channel Permission Limits" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:506 +#: ../../Zotlabs/Module/Settings/Channel.php:510 msgid "Expire other channel content after this many days" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:506 +#: ../../Zotlabs/Module/Settings/Channel.php:510 msgid "0 or blank to use the website limit." msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:506 +#: ../../Zotlabs/Module/Settings/Channel.php:510 #, php-format msgid "This website expires after %d days." msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:506 +#: ../../Zotlabs/Module/Settings/Channel.php:510 msgid "This website does not expire imported content." msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:506 +#: ../../Zotlabs/Module/Settings/Channel.php:510 msgid "The website limit takes precedence if lower than your limit." msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:507 +#: ../../Zotlabs/Module/Settings/Channel.php:511 msgid "Maximum Friend Requests/Day:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:507 +#: ../../Zotlabs/Module/Settings/Channel.php:511 msgid "May reduce spam activity" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:508 -msgid "Default Access Control List (ACL)" +#: ../../Zotlabs/Module/Settings/Channel.php:512 +msgid "Default Privacy Group" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:510 +#: ../../Zotlabs/Module/Settings/Channel.php:514 msgid "Use my default audience setting for the type of object published" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:517 +#: ../../Zotlabs/Module/Settings/Channel.php:521 msgid "Channel permissions category:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:518 +#: ../../Zotlabs/Module/Settings/Channel.php:522 msgid "Default Permissions Group" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:524 +#: ../../Zotlabs/Module/Settings/Channel.php:528 msgid "Maximum private messages per day from unknown people:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:524 +#: ../../Zotlabs/Module/Settings/Channel.php:528 msgid "Useful to reduce spamming" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:527 +#: ../../Zotlabs/Module/Settings/Channel.php:531 msgid "Notification Settings" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:528 +#: ../../Zotlabs/Module/Settings/Channel.php:532 msgid "By default post a status message when:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:529 +#: ../../Zotlabs/Module/Settings/Channel.php:533 msgid "accepting a friend request" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:530 +#: ../../Zotlabs/Module/Settings/Channel.php:534 msgid "joining a forum/community" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:531 +#: ../../Zotlabs/Module/Settings/Channel.php:535 msgid "making an <em>interesting</em> profile change" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:532 +#: ../../Zotlabs/Module/Settings/Channel.php:536 msgid "Send a notification email when:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:533 +#: ../../Zotlabs/Module/Settings/Channel.php:537 msgid "You receive a connection request" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:534 +#: ../../Zotlabs/Module/Settings/Channel.php:538 msgid "Your connections are confirmed" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:535 +#: ../../Zotlabs/Module/Settings/Channel.php:539 msgid "Someone writes on your profile wall" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:536 +#: ../../Zotlabs/Module/Settings/Channel.php:540 msgid "Someone writes a followup comment" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:537 +#: ../../Zotlabs/Module/Settings/Channel.php:541 msgid "You receive a private message" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:538 +#: ../../Zotlabs/Module/Settings/Channel.php:542 msgid "You receive a friend suggestion" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:539 +#: ../../Zotlabs/Module/Settings/Channel.php:543 msgid "You are tagged in a post" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:540 +#: ../../Zotlabs/Module/Settings/Channel.php:544 msgid "You are poked/prodded/etc. in a post" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:542 +#: ../../Zotlabs/Module/Settings/Channel.php:546 msgid "Someone likes your post/comment" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:545 +#: ../../Zotlabs/Module/Settings/Channel.php:549 msgid "Show visual notifications including:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:547 +#: ../../Zotlabs/Module/Settings/Channel.php:551 msgid "Unseen grid activity" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:548 +#: ../../Zotlabs/Module/Settings/Channel.php:552 msgid "Unseen channel activity" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:549 +#: ../../Zotlabs/Module/Settings/Channel.php:553 msgid "Unseen private messages" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:549 -#: ../../Zotlabs/Module/Settings/Channel.php:554 -#: ../../Zotlabs/Module/Settings/Channel.php:555 -#: ../../Zotlabs/Module/Settings/Channel.php:556 +#: ../../Zotlabs/Module/Settings/Channel.php:553 +#: ../../Zotlabs/Module/Settings/Channel.php:558 +#: ../../Zotlabs/Module/Settings/Channel.php:559 +#: ../../Zotlabs/Module/Settings/Channel.php:560 #: ../../addon/jappixmini/jappixmini.php:343 msgid "Recommended" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:550 +#: ../../Zotlabs/Module/Settings/Channel.php:554 msgid "Upcoming events" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:551 +#: ../../Zotlabs/Module/Settings/Channel.php:555 msgid "Events today" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:552 +#: ../../Zotlabs/Module/Settings/Channel.php:556 msgid "Upcoming birthdays" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:552 +#: ../../Zotlabs/Module/Settings/Channel.php:556 msgid "Not available in all themes" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:553 +#: ../../Zotlabs/Module/Settings/Channel.php:557 msgid "System (personal) notifications" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:554 +#: ../../Zotlabs/Module/Settings/Channel.php:558 msgid "System info messages" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:555 +#: ../../Zotlabs/Module/Settings/Channel.php:559 msgid "System critical alerts" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:556 +#: ../../Zotlabs/Module/Settings/Channel.php:560 msgid "New connections" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:557 +#: ../../Zotlabs/Module/Settings/Channel.php:561 msgid "System Registrations" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:558 +#: ../../Zotlabs/Module/Settings/Channel.php:562 +msgid "Unseen shared files" +msgstr "" + +#: ../../Zotlabs/Module/Settings/Channel.php:563 +msgid "Unseen public activity" +msgstr "" + +#: ../../Zotlabs/Module/Settings/Channel.php:564 msgid "" "Also show new wall posts, private messages and connections under Notices" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:560 +#: ../../Zotlabs/Module/Settings/Channel.php:566 msgid "Notify me of events this many days in advance" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:560 +#: ../../Zotlabs/Module/Settings/Channel.php:566 msgid "Must be greater than 0" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:566 +#: ../../Zotlabs/Module/Settings/Channel.php:572 msgid "Advanced Account/Page Type Settings" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:567 +#: ../../Zotlabs/Module/Settings/Channel.php:573 msgid "Change the behaviour of this account for special situations" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:569 +#: ../../Zotlabs/Module/Settings/Channel.php:575 msgid "Miscellaneous Settings" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:570 +#: ../../Zotlabs/Module/Settings/Channel.php:576 msgid "Default photo upload folder" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:570 -#: ../../Zotlabs/Module/Settings/Channel.php:571 +#: ../../Zotlabs/Module/Settings/Channel.php:576 +#: ../../Zotlabs/Module/Settings/Channel.php:577 msgid "%Y - current year, %m - current month" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:571 +#: ../../Zotlabs/Module/Settings/Channel.php:577 msgid "Default file upload folder" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:573 +#: ../../Zotlabs/Module/Settings/Channel.php:579 msgid "Personal menu to display in your channel pages" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:575 +#: ../../Zotlabs/Module/Settings/Channel.php:581 msgid "Remove this channel." msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:576 +#: ../../Zotlabs/Module/Settings/Channel.php:582 msgid "Firefox Share $Projectname provider" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:577 +#: ../../Zotlabs/Module/Settings/Channel.php:583 msgid "Start calendar week on Monday" msgstr "" @@ -3685,7 +3698,7 @@ msgid "Expires (yyyy-mm-dd)" msgstr "" #: ../../Zotlabs/Module/Settings/Tokens.php:160 -#: ../../Zotlabs/Module/Connedit.php:902 +#: ../../Zotlabs/Module/Connedit.php:907 msgid "Their Settings" msgstr "" @@ -3795,107 +3808,107 @@ msgstr "" msgid "%s - (Experimental)" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:198 +#: ../../Zotlabs/Module/Settings/Display.php:202 msgid "Display Settings" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:199 +#: ../../Zotlabs/Module/Settings/Display.php:203 msgid "Theme Settings" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:200 +#: ../../Zotlabs/Module/Settings/Display.php:204 msgid "Custom Theme Settings" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:201 +#: ../../Zotlabs/Module/Settings/Display.php:205 msgid "Content Settings" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:207 +#: ../../Zotlabs/Module/Settings/Display.php:211 msgid "Display Theme:" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:208 +#: ../../Zotlabs/Module/Settings/Display.php:212 msgid "Select scheme" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:210 +#: ../../Zotlabs/Module/Settings/Display.php:214 msgid "Mobile Theme:" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:211 +#: ../../Zotlabs/Module/Settings/Display.php:215 msgid "Preload images before rendering the page" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:211 +#: ../../Zotlabs/Module/Settings/Display.php:215 msgid "" "The subjective page load time will be longer but the page will be ready when " "displayed" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:212 +#: ../../Zotlabs/Module/Settings/Display.php:216 msgid "Enable user zoom on mobile devices" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:213 +#: ../../Zotlabs/Module/Settings/Display.php:217 msgid "Update browser every xx seconds" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:213 +#: ../../Zotlabs/Module/Settings/Display.php:217 msgid "Minimum of 10 seconds, no maximum" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:214 +#: ../../Zotlabs/Module/Settings/Display.php:218 msgid "Maximum number of conversations to load at any time:" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:214 +#: ../../Zotlabs/Module/Settings/Display.php:218 msgid "Maximum of 100 items" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:215 +#: ../../Zotlabs/Module/Settings/Display.php:219 msgid "Show emoticons (smilies) as images" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:216 +#: ../../Zotlabs/Module/Settings/Display.php:220 msgid "Manual conversation updates" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:216 +#: ../../Zotlabs/Module/Settings/Display.php:220 msgid "Default is on, turning this off may increase screen jumping" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:217 +#: ../../Zotlabs/Module/Settings/Display.php:221 msgid "Link post titles to source" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:218 +#: ../../Zotlabs/Module/Settings/Display.php:222 msgid "System Page Layout Editor - (advanced)" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:221 +#: ../../Zotlabs/Module/Settings/Display.php:225 msgid "Use blog/list mode on channel page" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:221 -#: ../../Zotlabs/Module/Settings/Display.php:222 +#: ../../Zotlabs/Module/Settings/Display.php:225 +#: ../../Zotlabs/Module/Settings/Display.php:226 msgid "(comments displayed separately)" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:222 +#: ../../Zotlabs/Module/Settings/Display.php:226 msgid "Use blog/list mode on grid page" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:223 +#: ../../Zotlabs/Module/Settings/Display.php:227 msgid "Channel page max height of content (in pixels)" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:223 -#: ../../Zotlabs/Module/Settings/Display.php:224 +#: ../../Zotlabs/Module/Settings/Display.php:227 +#: ../../Zotlabs/Module/Settings/Display.php:228 msgid "click to expand content exceeding this height" msgstr "" -#: ../../Zotlabs/Module/Settings/Display.php:224 +#: ../../Zotlabs/Module/Settings/Display.php:228 msgid "Grid page max height of content (in pixels)" msgstr "" @@ -3974,20 +3987,20 @@ msgstr "" msgid "Remove authorization" msgstr "" -#: ../../Zotlabs/Module/Embedphotos.php:140 ../../Zotlabs/Module/Photos.php:753 -#: ../../Zotlabs/Module/Photos.php:1292 ../../Zotlabs/Widget/Portfolio.php:78 +#: ../../Zotlabs/Module/Embedphotos.php:140 ../../Zotlabs/Module/Photos.php:758 +#: ../../Zotlabs/Module/Photos.php:1297 ../../Zotlabs/Widget/Portfolio.php:78 #: ../../Zotlabs/Widget/Album.php:78 msgid "View Photo" msgstr "" -#: ../../Zotlabs/Module/Embedphotos.php:156 ../../Zotlabs/Module/Photos.php:784 +#: ../../Zotlabs/Module/Embedphotos.php:156 ../../Zotlabs/Module/Photos.php:789 #: ../../Zotlabs/Widget/Portfolio.php:97 ../../Zotlabs/Widget/Album.php:95 msgid "Edit Album" msgstr "" -#: ../../Zotlabs/Module/Embedphotos.php:158 ../../Zotlabs/Module/Photos.php:786 -#: ../../Zotlabs/Module/Photos.php:1323 -#: ../../Zotlabs/Module/Profile_photo.php:423 +#: ../../Zotlabs/Module/Embedphotos.php:158 ../../Zotlabs/Module/Photos.php:791 +#: ../../Zotlabs/Module/Photos.php:1328 +#: ../../Zotlabs/Module/Profile_photo.php:431 #: ../../Zotlabs/Module/Cover_photo.php:361 #: ../../Zotlabs/Storage/Browser.php:230 ../../Zotlabs/Storage/Browser.php:337 #: ../../Zotlabs/Widget/Cdav.php:132 ../../Zotlabs/Widget/Cdav.php:168 @@ -3999,75 +4012,75 @@ msgstr "" msgid "Some blurb about what to do when you're new here" msgstr "" -#: ../../Zotlabs/Module/Thing.php:114 +#: ../../Zotlabs/Module/Thing.php:115 msgid "Thing updated" msgstr "" -#: ../../Zotlabs/Module/Thing.php:166 +#: ../../Zotlabs/Module/Thing.php:167 msgid "Object store: failed" msgstr "" -#: ../../Zotlabs/Module/Thing.php:170 +#: ../../Zotlabs/Module/Thing.php:171 msgid "Thing added" msgstr "" -#: ../../Zotlabs/Module/Thing.php:196 +#: ../../Zotlabs/Module/Thing.php:197 #, php-format msgid "OBJ: %1$s %2$s %3$s" msgstr "" -#: ../../Zotlabs/Module/Thing.php:259 +#: ../../Zotlabs/Module/Thing.php:260 msgid "Show Thing" msgstr "" -#: ../../Zotlabs/Module/Thing.php:266 +#: ../../Zotlabs/Module/Thing.php:267 msgid "item not found." msgstr "" -#: ../../Zotlabs/Module/Thing.php:299 +#: ../../Zotlabs/Module/Thing.php:300 msgid "Edit Thing" msgstr "" -#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355 +#: ../../Zotlabs/Module/Thing.php:302 ../../Zotlabs/Module/Thing.php:359 msgid "Select a profile" msgstr "" -#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358 +#: ../../Zotlabs/Module/Thing.php:306 ../../Zotlabs/Module/Thing.php:362 msgid "Post an activity" msgstr "" -#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358 +#: ../../Zotlabs/Module/Thing.php:306 ../../Zotlabs/Module/Thing.php:362 msgid "Only sends to viewers of the applicable profile" msgstr "" -#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360 +#: ../../Zotlabs/Module/Thing.php:308 ../../Zotlabs/Module/Thing.php:364 msgid "Name of thing e.g. something" msgstr "" -#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361 +#: ../../Zotlabs/Module/Thing.php:310 ../../Zotlabs/Module/Thing.php:365 msgid "URL of thing (optional)" msgstr "" -#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362 +#: ../../Zotlabs/Module/Thing.php:312 ../../Zotlabs/Module/Thing.php:366 msgid "URL for photo of thing (optional)" msgstr "" -#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:363 -#: ../../Zotlabs/Module/Photos.php:649 ../../Zotlabs/Module/Photos.php:1013 -#: ../../Zotlabs/Module/Connedit.php:672 ../../Zotlabs/Module/Chat.php:235 -#: ../../Zotlabs/Module/Filestorage.php:144 ../../include/acl_selectors.php:218 +#: ../../Zotlabs/Module/Thing.php:314 ../../Zotlabs/Module/Thing.php:367 +#: ../../Zotlabs/Module/Photos.php:649 ../../Zotlabs/Module/Photos.php:1018 +#: ../../Zotlabs/Module/Connedit.php:676 ../../Zotlabs/Module/Chat.php:235 +#: ../../Zotlabs/Module/Filestorage.php:142 ../../include/acl_selectors.php:218 msgid "Permissions" msgstr "" -#: ../../Zotlabs/Module/Thing.php:353 +#: ../../Zotlabs/Module/Thing.php:357 msgid "Add Thing to your Profile" msgstr "" -#: ../../Zotlabs/Module/Notify.php:57 ../../Zotlabs/Module/Notifications.php:38 +#: ../../Zotlabs/Module/Notify.php:61 ../../Zotlabs/Module/Notifications.php:38 msgid "No more system notifications." msgstr "" -#: ../../Zotlabs/Module/Notify.php:61 ../../Zotlabs/Module/Notifications.php:42 +#: ../../Zotlabs/Module/Notify.php:65 ../../Zotlabs/Module/Notifications.php:42 msgid "System Notifications" msgstr "" @@ -4084,43 +4097,43 @@ msgstr "" msgid "No channel. Import failed." msgstr "" -#: ../../Zotlabs/Module/Import.php:470 +#: ../../Zotlabs/Module/Import.php:481 #: ../../addon/diaspora/import_diaspora.php:142 msgid "Import completed." msgstr "" -#: ../../Zotlabs/Module/Import.php:498 +#: ../../Zotlabs/Module/Import.php:509 msgid "You must be logged in to use this feature." msgstr "" -#: ../../Zotlabs/Module/Import.php:503 +#: ../../Zotlabs/Module/Import.php:514 msgid "Import Channel" msgstr "" -#: ../../Zotlabs/Module/Import.php:504 +#: ../../Zotlabs/Module/Import.php:515 msgid "" "Use this form to import an existing channel from a different server/hub. You " "may retrieve the channel identity from the old server/hub via the network or " "provide an export file." msgstr "" -#: ../../Zotlabs/Module/Import.php:506 +#: ../../Zotlabs/Module/Import.php:517 msgid "Or provide the old server/hub details" msgstr "" -#: ../../Zotlabs/Module/Import.php:507 +#: ../../Zotlabs/Module/Import.php:518 msgid "Your old identity address (xyz@example.com)" msgstr "" -#: ../../Zotlabs/Module/Import.php:508 +#: ../../Zotlabs/Module/Import.php:519 msgid "Your old login email address" msgstr "" -#: ../../Zotlabs/Module/Import.php:509 +#: ../../Zotlabs/Module/Import.php:520 msgid "Your old login password" msgstr "" -#: ../../Zotlabs/Module/Import.php:510 +#: ../../Zotlabs/Module/Import.php:521 msgid "" "For either option, please choose whether to make this hub your new primary " "address, or whether your old location should continue this role. You will be " @@ -4128,19 +4141,19 @@ msgid "" "location for files, photos, and media." msgstr "" -#: ../../Zotlabs/Module/Import.php:511 +#: ../../Zotlabs/Module/Import.php:522 msgid "Make this hub my primary location" msgstr "" -#: ../../Zotlabs/Module/Import.php:512 +#: ../../Zotlabs/Module/Import.php:523 msgid "Move this channel (disable all previous locations)" msgstr "" -#: ../../Zotlabs/Module/Import.php:513 +#: ../../Zotlabs/Module/Import.php:524 msgid "Import a few months of posts if possible (limited by available memory" msgstr "" -#: ../../Zotlabs/Module/Import.php:514 +#: ../../Zotlabs/Module/Import.php:525 msgid "" "This process may take several minutes to complete. Please submit the form " "only once and leave this page open until finished." @@ -4150,21 +4163,22 @@ msgstr "" msgid "Authentication failed." msgstr "" -#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:2000 +#: ../../Zotlabs/Module/Rmagic.php:75 ../../boot.php:1640 +#: ../../include/channel.php:2204 msgid "Remote Authentication" msgstr "" -#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:2001 +#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:2205 msgid "Enter your channel address (e.g. channel@example.com)" msgstr "" -#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:2002 +#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:2206 msgid "Authenticate" msgstr "" #: ../../Zotlabs/Module/Cal.php:62 ../../Zotlabs/Module/Chanview.php:96 #: ../../Zotlabs/Module/Page.php:75 ../../Zotlabs/Module/Wall_upload.php:31 -#: ../../Zotlabs/Module/Block.php:41 +#: ../../Zotlabs/Module/Block.php:41 ../../Zotlabs/Module/Card_edit.php:44 msgid "Channel not found." msgstr "" @@ -4172,7 +4186,7 @@ msgstr "" msgid "Permissions denied." msgstr "" -#: ../../Zotlabs/Module/Cal.php:342 ../../include/text.php:2304 +#: ../../Zotlabs/Module/Cal.php:342 ../../include/text.php:2312 msgid "Import" msgstr "" @@ -4200,11 +4214,13 @@ msgstr "" #: ../../Zotlabs/Module/Editblock.php:116 ../../Zotlabs/Module/Chat.php:207 #: ../../Zotlabs/Module/Editwebpage.php:143 ../../Zotlabs/Module/Mail.php:288 -#: ../../Zotlabs/Module/Mail.php:430 ../../include/conversation.php:1225 +#: ../../Zotlabs/Module/Mail.php:430 ../../Zotlabs/Module/Card_edit.php:101 +#: ../../include/conversation.php:1261 msgid "Insert web link" msgstr "" -#: ../../Zotlabs/Module/Editblock.php:129 ../../include/conversation.php:1336 +#: ../../Zotlabs/Module/Editblock.php:129 +#: ../../Zotlabs/Module/Card_edit.php:117 ../../include/conversation.php:1381 msgid "Title (optional)" msgstr "" @@ -4216,15 +4232,15 @@ msgstr "" msgid "vcard" msgstr "" -#: ../../Zotlabs/Module/Apps.php:45 ../../Zotlabs/Lib/Apps.php:212 +#: ../../Zotlabs/Module/Apps.php:47 ../../Zotlabs/Lib/Apps.php:223 msgid "Apps" msgstr "" -#: ../../Zotlabs/Module/Apps.php:48 +#: ../../Zotlabs/Module/Apps.php:50 msgid "Manage apps" msgstr "" -#: ../../Zotlabs/Module/Apps.php:49 +#: ../../Zotlabs/Module/Apps.php:51 msgid "Create new app" msgstr "" @@ -4234,8 +4250,7 @@ msgctxt "mood" msgid "%1$s is %2$s" msgstr "" -#: ../../Zotlabs/Module/Mood.php:120 ../../Zotlabs/Module/Mood.php:135 -#: ../../Zotlabs/Lib/Apps.php:235 +#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:247 msgid "Mood" msgstr "" @@ -4243,12 +4258,6 @@ msgstr "" msgid "Set your current mood and tell your friends" msgstr "" -#: ../../Zotlabs/Module/Connections.php:33 -#: ../../Zotlabs/Module/Connections.php:309 ../../Zotlabs/Lib/Apps.php:217 -#: ../../include/text.php:951 ../../include/nav.php:180 -msgid "Connections" -msgstr "" - #: ../../Zotlabs/Module/Connections.php:54 #: ../../Zotlabs/Module/Connections.php:156 #: ../../Zotlabs/Module/Connections.php:245 @@ -4274,17 +4283,18 @@ msgstr "" #: ../../Zotlabs/Module/Connections.php:74 #: ../../Zotlabs/Module/Connections.php:83 ../../Zotlabs/Module/Menu.php:116 -#: ../../include/conversation.php:1663 +#: ../../include/conversation.php:1697 msgid "New" msgstr "" #: ../../Zotlabs/Module/Connections.php:88 #: ../../Zotlabs/Module/Connections.php:102 -#: ../../Zotlabs/Module/Connedit.php:709 ../../Zotlabs/Widget/Affinity.php:30 +#: ../../Zotlabs/Module/Connedit.php:713 ../../Zotlabs/Widget/Affinity.php:30 msgid "All" msgstr "" #: ../../Zotlabs/Module/Connections.php:133 +#: ../../Zotlabs/Widget/Notifications.php:80 msgid "New Connections" msgstr "" @@ -4366,7 +4376,7 @@ msgid "Ignore connection" msgstr "" #: ../../Zotlabs/Module/Connections.php:284 -#: ../../Zotlabs/Module/Connedit.php:626 +#: ../../Zotlabs/Module/Connedit.php:630 msgid "Ignore" msgstr "" @@ -4374,6 +4384,11 @@ msgstr "" msgid "Recent activity" msgstr "" +#: ../../Zotlabs/Module/Connections.php:309 ../../Zotlabs/Lib/Apps.php:229 +#: ../../include/text.php:959 ../../include/nav.php:107 +msgid "Connections" +msgstr "" + #: ../../Zotlabs/Module/Connections.php:314 msgid "Search your connections" msgstr "" @@ -4396,10 +4411,6 @@ msgstr "" msgid "Source of Item" msgstr "" -#: ../../Zotlabs/Module/Bookmarks.php:11 ../../Zotlabs/Lib/Apps.php:215 -msgid "View Bookmarks" -msgstr "" - #: ../../Zotlabs/Module/Bookmarks.php:56 msgid "Bookmark added" msgstr "" @@ -4452,7 +4463,7 @@ msgstr "" msgid "Delete Album" msgstr "" -#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1025 +#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1030 msgid "Delete Photo" msgstr "" @@ -4464,12 +4475,6 @@ msgstr "" msgid "Access to this item is restricted." msgstr "" -#: ../../Zotlabs/Module/Photos.php:558 ../../Zotlabs/Module/Fbrowser.php:29 -#: ../../Zotlabs/Lib/Apps.php:230 ../../include/conversation.php:1780 -#: ../../include/nav.php:372 -msgid "Photos" -msgstr "" - #: ../../Zotlabs/Module/Photos.php:593 #, php-format msgid "%1$.2f MB of %2$.2f MB photo storage used." @@ -4504,192 +4509,192 @@ msgstr "" msgid "Description (optional):" msgstr "" -#: ../../Zotlabs/Module/Photos.php:727 +#: ../../Zotlabs/Module/Photos.php:732 msgid "Show Newest First" msgstr "" -#: ../../Zotlabs/Module/Photos.php:729 +#: ../../Zotlabs/Module/Photos.php:734 msgid "Show Oldest First" msgstr "" -#: ../../Zotlabs/Module/Photos.php:834 +#: ../../Zotlabs/Module/Photos.php:839 msgid "Permission denied. Access to this item may be restricted." msgstr "" -#: ../../Zotlabs/Module/Photos.php:836 +#: ../../Zotlabs/Module/Photos.php:841 msgid "Photo not available" msgstr "" -#: ../../Zotlabs/Module/Photos.php:894 +#: ../../Zotlabs/Module/Photos.php:899 msgid "Use as profile photo" msgstr "" -#: ../../Zotlabs/Module/Photos.php:895 +#: ../../Zotlabs/Module/Photos.php:900 msgid "Use as cover photo" msgstr "" -#: ../../Zotlabs/Module/Photos.php:902 +#: ../../Zotlabs/Module/Photos.php:907 msgid "Private Photo" msgstr "" -#: ../../Zotlabs/Module/Photos.php:917 +#: ../../Zotlabs/Module/Photos.php:922 msgid "View Full Size" msgstr "" -#: ../../Zotlabs/Module/Photos.php:999 +#: ../../Zotlabs/Module/Photos.php:1004 msgid "Edit photo" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1001 +#: ../../Zotlabs/Module/Photos.php:1006 msgid "Rotate CW (right)" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1002 +#: ../../Zotlabs/Module/Photos.php:1007 msgid "Rotate CCW (left)" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1005 +#: ../../Zotlabs/Module/Photos.php:1010 msgid "Move photo to album" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1006 +#: ../../Zotlabs/Module/Photos.php:1011 msgid "Enter a new album name" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1007 +#: ../../Zotlabs/Module/Photos.php:1012 msgid "or select an existing one (doubleclick)" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1010 +#: ../../Zotlabs/Module/Photos.php:1015 msgid "Caption" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1012 +#: ../../Zotlabs/Module/Photos.php:1017 msgid "Add a Tag" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1020 +#: ../../Zotlabs/Module/Photos.php:1025 msgid "Example: @bob, @Barbara_Jensen, @jim@example.com" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1023 +#: ../../Zotlabs/Module/Photos.php:1028 msgid "Flag as adult in album view" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1042 ../../Zotlabs/Lib/ThreadItem.php:267 +#: ../../Zotlabs/Module/Photos.php:1047 ../../Zotlabs/Lib/ThreadItem.php:271 msgid "I like this (toggle)" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1043 ../../Zotlabs/Lib/ThreadItem.php:268 +#: ../../Zotlabs/Module/Photos.php:1048 ../../Zotlabs/Lib/ThreadItem.php:272 msgid "I don't like this (toggle)" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1045 ../../Zotlabs/Lib/ThreadItem.php:410 -#: ../../include/conversation.php:736 +#: ../../Zotlabs/Module/Photos.php:1050 ../../Zotlabs/Lib/ThreadItem.php:416 +#: ../../include/conversation.php:768 msgid "Please wait" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1061 ../../Zotlabs/Module/Photos.php:1179 -#: ../../Zotlabs/Lib/ThreadItem.php:727 +#: ../../Zotlabs/Module/Photos.php:1066 ../../Zotlabs/Module/Photos.php:1184 +#: ../../Zotlabs/Lib/ThreadItem.php:740 msgid "This is you" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1063 ../../Zotlabs/Module/Photos.php:1181 -#: ../../Zotlabs/Lib/ThreadItem.php:729 ../../include/js_strings.php:6 +#: ../../Zotlabs/Module/Photos.php:1068 ../../Zotlabs/Module/Photos.php:1186 +#: ../../Zotlabs/Lib/ThreadItem.php:742 ../../include/js_strings.php:6 msgid "Comment" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:569 +#: ../../Zotlabs/Module/Photos.php:1084 ../../include/conversation.php:594 msgctxt "title" msgid "Likes" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:569 +#: ../../Zotlabs/Module/Photos.php:1084 ../../include/conversation.php:594 msgctxt "title" msgid "Dislikes" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1080 ../../include/conversation.php:570 +#: ../../Zotlabs/Module/Photos.php:1085 ../../include/conversation.php:595 msgctxt "title" msgid "Agree" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1080 ../../include/conversation.php:570 +#: ../../Zotlabs/Module/Photos.php:1085 ../../include/conversation.php:595 msgctxt "title" msgid "Disagree" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1080 ../../include/conversation.php:570 +#: ../../Zotlabs/Module/Photos.php:1085 ../../include/conversation.php:595 msgctxt "title" msgid "Abstain" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1081 ../../include/conversation.php:571 +#: ../../Zotlabs/Module/Photos.php:1086 ../../include/conversation.php:596 msgctxt "title" msgid "Attending" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1081 ../../include/conversation.php:571 +#: ../../Zotlabs/Module/Photos.php:1086 ../../include/conversation.php:596 msgctxt "title" msgid "Not attending" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1081 ../../include/conversation.php:571 +#: ../../Zotlabs/Module/Photos.php:1086 ../../include/conversation.php:596 msgctxt "title" msgid "Might attend" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1098 ../../Zotlabs/Module/Photos.php:1110 -#: ../../Zotlabs/Lib/ThreadItem.php:187 ../../Zotlabs/Lib/ThreadItem.php:199 +#: ../../Zotlabs/Module/Photos.php:1103 ../../Zotlabs/Module/Photos.php:1115 +#: ../../Zotlabs/Lib/ThreadItem.php:191 ../../Zotlabs/Lib/ThreadItem.php:203 msgid "View all" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1102 ../../Zotlabs/Lib/ThreadItem.php:191 -#: ../../include/conversation.php:1904 ../../include/channel.php:1289 -#: ../../include/taxonomy.php:442 +#: ../../Zotlabs/Module/Photos.php:1107 ../../Zotlabs/Lib/ThreadItem.php:195 +#: ../../include/conversation.php:1950 ../../include/channel.php:1491 +#: ../../include/taxonomy.php:520 msgctxt "noun" msgid "Like" msgid_plural "Likes" msgstr[0] "" msgstr[1] "" -#: ../../Zotlabs/Module/Photos.php:1107 ../../Zotlabs/Lib/ThreadItem.php:196 -#: ../../include/conversation.php:1907 +#: ../../Zotlabs/Module/Photos.php:1112 ../../Zotlabs/Lib/ThreadItem.php:200 +#: ../../include/conversation.php:1953 msgctxt "noun" msgid "Dislike" msgid_plural "Dislikes" msgstr[0] "" msgstr[1] "" -#: ../../Zotlabs/Module/Photos.php:1207 +#: ../../Zotlabs/Module/Photos.php:1212 msgid "Photo Tools" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1216 +#: ../../Zotlabs/Module/Photos.php:1221 msgid "In This Photo:" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1221 +#: ../../Zotlabs/Module/Photos.php:1226 msgid "Map" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1229 ../../Zotlabs/Lib/ThreadItem.php:399 +#: ../../Zotlabs/Module/Photos.php:1234 ../../Zotlabs/Lib/ThreadItem.php:404 msgctxt "noun" msgid "Likes" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1230 ../../Zotlabs/Lib/ThreadItem.php:400 +#: ../../Zotlabs/Module/Photos.php:1235 ../../Zotlabs/Lib/ThreadItem.php:405 msgctxt "noun" msgid "Dislikes" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1235 ../../Zotlabs/Lib/ThreadItem.php:405 +#: ../../Zotlabs/Module/Photos.php:1240 ../../Zotlabs/Lib/ThreadItem.php:410 #: ../../include/acl_selectors.php:220 msgid "Close" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1307 ../../Zotlabs/Module/Photos.php:1320 -#: ../../Zotlabs/Module/Photos.php:1321 ../../include/photos.php:526 +#: ../../Zotlabs/Module/Photos.php:1312 ../../Zotlabs/Module/Photos.php:1325 +#: ../../Zotlabs/Module/Photos.php:1326 ../../include/photos.php:601 msgid "Recent Photos" msgstr "" @@ -4705,165 +4710,206 @@ msgstr "" msgid "Invalid channel" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:79 ../../Zotlabs/Lib/Apps.php:227 -#: ../../include/conversation.php:1854 ../../include/features.php:95 -#: ../../include/nav.php:445 -msgid "Wiki" +#: ../../Zotlabs/Module/Wiki.php:124 ../../addon/gitwiki/Mod_Gitwiki.php:107 +msgid "Error retrieving wiki" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:162 ../../addon/gitwiki/Mod_Gitwiki.php:146 -#: ../../include/conversation.php:1851 ../../include/nav.php:442 +#: ../../Zotlabs/Module/Wiki.php:131 ../../addon/gitwiki/Mod_Gitwiki.php:114 +msgid "Error creating zip file export folder" +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:182 ../../addon/gitwiki/Mod_Gitwiki.php:132 +msgid "Error downloading wiki: " +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:197 ../../addon/gitwiki/Mod_Gitwiki.php:146 +#: ../../include/conversation.php:1897 ../../include/nav.php:504 msgid "Wikis" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:168 ../../addon/gitwiki/Mod_Gitwiki.php:152 +#: ../../Zotlabs/Module/Wiki.php:203 ../../addon/gitwiki/Mod_Gitwiki.php:152 msgid "Download" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:170 ../../Zotlabs/Module/Chat.php:256 +#: ../../Zotlabs/Module/Wiki.php:205 ../../Zotlabs/Module/Chat.php:256 #: ../../Zotlabs/Module/Profiles.php:834 ../../Zotlabs/Module/Manage.php:145 #: ../../addon/gitwiki/Mod_Gitwiki.php:154 msgid "Create New" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:172 ../../addon/gitwiki/Mod_Gitwiki.php:156 +#: ../../Zotlabs/Module/Wiki.php:207 ../../addon/gitwiki/Mod_Gitwiki.php:156 msgid "Wiki name" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:173 ../../addon/gitwiki/Mod_Gitwiki.php:157 +#: ../../Zotlabs/Module/Wiki.php:208 ../../addon/gitwiki/Mod_Gitwiki.php:157 msgid "Content type" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:175 ../../Zotlabs/Storage/Browser.php:235 +#: ../../Zotlabs/Module/Wiki.php:208 ../../Zotlabs/Module/Wiki.php:336 +#: ../../Zotlabs/Widget/Wiki_pages.php:57 ../../include/text.php:1802 +msgid "Markdown" +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:208 ../../Zotlabs/Module/Wiki.php:336 +#: ../../Zotlabs/Widget/Wiki_pages.php:57 ../../include/text.php:1800 +msgid "BBcode" +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:208 ../../Zotlabs/Widget/Wiki_pages.php:57 +#: ../../include/text.php:1803 +msgid "Text" +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:210 ../../Zotlabs/Storage/Browser.php:235 #: ../../addon/gitwiki/Mod_Gitwiki.php:159 msgid "Type" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:182 ../../addon/gitwiki/Mod_Gitwiki.php:166 +#: ../../Zotlabs/Module/Wiki.php:211 +msgid "Any type" +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:218 +msgid "Lock content type" +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:219 ../../addon/gitwiki/Mod_Gitwiki.php:166 msgid "Create a status post for this wiki" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:224 ../../addon/gitwiki/Mod_Gitwiki.php:185 +#: ../../Zotlabs/Module/Wiki.php:220 +msgid "Edit Wiki Name" +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:262 ../../addon/gitwiki/Mod_Gitwiki.php:185 msgid "Wiki not found" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:248 ../../addon/gitwiki/Mod_Gitwiki.php:210 +#: ../../Zotlabs/Module/Wiki.php:286 ../../addon/gitwiki/Mod_Gitwiki.php:210 msgid "Rename page" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:258 ../../addon/gitwiki/Mod_Gitwiki.php:214 +#: ../../Zotlabs/Module/Wiki.php:296 ../../addon/gitwiki/Mod_Gitwiki.php:214 msgid "Error retrieving page content" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:264 +#: ../../Zotlabs/Module/Wiki.php:302 ../../Zotlabs/Module/Wiki.php:304 msgid "New page" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:288 ../../addon/gitwiki/Mod_Gitwiki.php:242 +#: ../../Zotlabs/Module/Wiki.php:331 ../../addon/gitwiki/Mod_Gitwiki.php:242 msgid "Revision Comparison" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:289 ../../addon/gitwiki/Mod_Gitwiki.php:243 +#: ../../Zotlabs/Module/Wiki.php:332 ../../addon/gitwiki/Mod_Gitwiki.php:243 msgid "Revert" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:293 +#: ../../Zotlabs/Module/Wiki.php:339 msgid "Short description of your changes (optional)" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:300 ../../addon/gitwiki/Mod_Gitwiki.php:252 +#: ../../Zotlabs/Module/Wiki.php:346 ../../addon/gitwiki/Mod_Gitwiki.php:252 msgid "Source" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:309 ../../addon/gitwiki/Mod_Gitwiki.php:260 +#: ../../Zotlabs/Module/Wiki.php:356 ../../addon/gitwiki/Mod_Gitwiki.php:260 msgid "New page name" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:314 ../../addon/gitwiki/Mod_Gitwiki.php:265 -#: ../../include/conversation.php:1229 +#: ../../Zotlabs/Module/Wiki.php:361 ../../addon/gitwiki/Mod_Gitwiki.php:265 +#: ../../include/conversation.php:1265 msgid "Embed image from photo albums" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:315 ../../addon/gitwiki/Mod_Gitwiki.php:266 -#: ../../include/conversation.php:1323 +#: ../../Zotlabs/Module/Wiki.php:362 ../../addon/gitwiki/Mod_Gitwiki.php:266 +#: ../../include/conversation.php:1368 msgid "Embed an image from your albums" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:317 ../../addon/gitwiki/Mod_Gitwiki.php:268 -#: ../../include/conversation.php:1325 ../../include/conversation.php:1372 +#: ../../Zotlabs/Module/Wiki.php:364 ../../addon/gitwiki/Mod_Gitwiki.php:268 +#: ../../include/conversation.php:1370 ../../include/conversation.php:1417 msgid "OK" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:318 ../../addon/gitwiki/Mod_Gitwiki.php:269 -#: ../../include/conversation.php:1265 +#: ../../Zotlabs/Module/Wiki.php:365 ../../addon/gitwiki/Mod_Gitwiki.php:269 +#: ../../include/conversation.php:1301 msgid "Choose images to embed" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:319 ../../addon/gitwiki/Mod_Gitwiki.php:270 -#: ../../include/conversation.php:1266 +#: ../../Zotlabs/Module/Wiki.php:366 ../../addon/gitwiki/Mod_Gitwiki.php:270 +#: ../../include/conversation.php:1302 msgid "Choose an album" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:320 ../../addon/gitwiki/Mod_Gitwiki.php:271 +#: ../../Zotlabs/Module/Wiki.php:367 ../../addon/gitwiki/Mod_Gitwiki.php:271 msgid "Choose a different album" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:321 ../../addon/gitwiki/Mod_Gitwiki.php:272 -#: ../../include/conversation.php:1268 +#: ../../Zotlabs/Module/Wiki.php:368 ../../addon/gitwiki/Mod_Gitwiki.php:272 +#: ../../include/conversation.php:1304 msgid "Error getting album list" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:322 ../../addon/gitwiki/Mod_Gitwiki.php:273 -#: ../../include/conversation.php:1269 +#: ../../Zotlabs/Module/Wiki.php:369 ../../addon/gitwiki/Mod_Gitwiki.php:273 +#: ../../include/conversation.php:1305 msgid "Error getting photo link" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:323 ../../addon/gitwiki/Mod_Gitwiki.php:274 -#: ../../include/conversation.php:1270 +#: ../../Zotlabs/Module/Wiki.php:370 ../../addon/gitwiki/Mod_Gitwiki.php:274 +#: ../../include/conversation.php:1306 msgid "Error getting album" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:391 ../../addon/gitwiki/Mod_Gitwiki.php:337 +#: ../../Zotlabs/Module/Wiki.php:442 ../../addon/gitwiki/Mod_Gitwiki.php:337 msgid "Error creating wiki. Invalid name." msgstr "" -#: ../../Zotlabs/Module/Wiki.php:398 +#: ../../Zotlabs/Module/Wiki.php:449 msgid "A wiki with this name already exists." msgstr "" -#: ../../Zotlabs/Module/Wiki.php:411 ../../addon/gitwiki/Mod_Gitwiki.php:348 +#: ../../Zotlabs/Module/Wiki.php:462 ../../addon/gitwiki/Mod_Gitwiki.php:348 msgid "Wiki created, but error creating Home page." msgstr "" -#: ../../Zotlabs/Module/Wiki.php:418 ../../addon/gitwiki/Mod_Gitwiki.php:353 +#: ../../Zotlabs/Module/Wiki.php:469 ../../addon/gitwiki/Mod_Gitwiki.php:353 msgid "Error creating wiki" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:430 +#: ../../Zotlabs/Module/Wiki.php:492 +msgid "Error updating wiki. Invalid name." +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:512 +msgid "Error updating wiki" +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:527 msgid "Wiki delete permission denied." msgstr "" -#: ../../Zotlabs/Module/Wiki.php:440 +#: ../../Zotlabs/Module/Wiki.php:537 msgid "Error deleting wiki" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:466 ../../addon/gitwiki/Mod_Gitwiki.php:400 +#: ../../Zotlabs/Module/Wiki.php:565 ../../addon/gitwiki/Mod_Gitwiki.php:400 msgid "New page created" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:587 +#: ../../Zotlabs/Module/Wiki.php:686 msgid "Cannot delete Home" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:651 +#: ../../Zotlabs/Module/Wiki.php:750 msgid "Current Revision" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:651 +#: ../../Zotlabs/Module/Wiki.php:750 msgid "Selected Revision" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:701 +#: ../../Zotlabs/Module/Wiki.php:800 msgid "You must be authenticated." msgstr "" @@ -4879,24 +4925,36 @@ msgstr "" msgid "Feature disabled." msgstr "" -#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69 +#: ../../Zotlabs/Module/Pdledit.php:47 ../../Zotlabs/Module/Pdledit.php:88 msgid "Edit System Page Description" msgstr "" -#: ../../Zotlabs/Module/Pdledit.php:64 +#: ../../Zotlabs/Module/Pdledit.php:68 +msgid "(modified)" +msgstr "" + +#: ../../Zotlabs/Module/Pdledit.php:68 ../../Zotlabs/Module/Lostpass.php:133 +msgid "Reset" +msgstr "" + +#: ../../Zotlabs/Module/Pdledit.php:83 msgid "Layout not found." msgstr "" -#: ../../Zotlabs/Module/Pdledit.php:70 +#: ../../Zotlabs/Module/Pdledit.php:89 msgid "Module Name:" msgstr "" -#: ../../Zotlabs/Module/Pdledit.php:71 +#: ../../Zotlabs/Module/Pdledit.php:90 msgid "Layout Help" msgstr "" -#: ../../Zotlabs/Module/Poke.php:153 ../../Zotlabs/Module/Poke.php:182 -#: ../../Zotlabs/Lib/Apps.php:236 ../../include/conversation.php:1039 +#: ../../Zotlabs/Module/Pdledit.php:91 +msgid "Edit another layout" +msgstr "" + +#: ../../Zotlabs/Module/Poke.php:182 ../../Zotlabs/Lib/Apps.php:248 +#: ../../include/conversation.php:1075 msgid "Poke" msgstr "" @@ -4930,8 +4988,8 @@ msgid "Image uploaded but image cropping failed." msgstr "" #: ../../Zotlabs/Module/Profile_photo.php:115 -#: ../../Zotlabs/Module/Profile_photo.php:226 -#: ../../include/photo/photo_driver.php:658 +#: ../../Zotlabs/Module/Profile_photo.php:234 +#: ../../include/photo/photo_driver.php:710 msgid "Profile Photos" msgstr "" @@ -4940,80 +4998,80 @@ msgstr "" msgid "Image resize failed." msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:196 +#: ../../Zotlabs/Module/Profile_photo.php:204 #: ../../addon/openclipatar/openclipatar.php:298 msgid "" "Shift-reload the page or clear browser cache if the new photo does not " "display immediately." msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:203 -#: ../../Zotlabs/Module/Cover_photo.php:173 ../../include/photos.php:145 +#: ../../Zotlabs/Module/Profile_photo.php:211 +#: ../../Zotlabs/Module/Cover_photo.php:173 ../../include/photos.php:156 msgid "Unable to process image" msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:238 +#: ../../Zotlabs/Module/Profile_photo.php:246 #: ../../Zotlabs/Module/Cover_photo.php:197 msgid "Image upload failed." msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:257 +#: ../../Zotlabs/Module/Profile_photo.php:265 #: ../../Zotlabs/Module/Cover_photo.php:214 msgid "Unable to process image." msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:318 -#: ../../Zotlabs/Module/Profile_photo.php:365 +#: ../../Zotlabs/Module/Profile_photo.php:326 +#: ../../Zotlabs/Module/Profile_photo.php:373 #: ../../Zotlabs/Module/Cover_photo.php:307 #: ../../Zotlabs/Module/Cover_photo.php:322 msgid "Photo not available." msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:420 +#: ../../Zotlabs/Module/Profile_photo.php:428 #: ../../Zotlabs/Module/Cover_photo.php:358 msgid "Upload File:" msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:421 +#: ../../Zotlabs/Module/Profile_photo.php:429 #: ../../Zotlabs/Module/Cover_photo.php:359 msgid "Select a profile:" msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:422 +#: ../../Zotlabs/Module/Profile_photo.php:430 msgid "Use Photo for Profile" msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:422 +#: ../../Zotlabs/Module/Profile_photo.php:430 msgid "Upload Profile Photo" msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:423 +#: ../../Zotlabs/Module/Profile_photo.php:431 #: ../../addon/openclipatar/openclipatar.php:182 #: ../../addon/openclipatar/openclipatar.php:194 msgid "Use" msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:429 +#: ../../Zotlabs/Module/Profile_photo.php:437 #: ../../Zotlabs/Module/Cover_photo.php:365 msgid "skip this step" msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:429 +#: ../../Zotlabs/Module/Profile_photo.php:437 #: ../../Zotlabs/Module/Cover_photo.php:365 msgid "select a photo from your photo albums" msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:448 +#: ../../Zotlabs/Module/Profile_photo.php:456 #: ../../Zotlabs/Module/Cover_photo.php:381 msgid "Crop Image" msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:449 +#: ../../Zotlabs/Module/Profile_photo.php:457 #: ../../Zotlabs/Module/Cover_photo.php:382 msgid "Please adjust the image cropping for optimum viewing." msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:451 +#: ../../Zotlabs/Module/Profile_photo.php:459 #: ../../Zotlabs/Module/Cover_photo.php:384 msgid "Done Editing" msgstr "" @@ -5034,60 +5092,68 @@ msgstr "" msgid "Empty post discarded." msgstr "" -#: ../../Zotlabs/Module/Item.php:844 +#: ../../Zotlabs/Module/Item.php:870 msgid "Duplicate post suppressed." msgstr "" -#: ../../Zotlabs/Module/Item.php:989 +#: ../../Zotlabs/Module/Item.php:1015 msgid "System error. Post not saved." msgstr "" -#: ../../Zotlabs/Module/Item.php:1025 +#: ../../Zotlabs/Module/Item.php:1051 msgid "Your comment is awaiting approval." msgstr "" -#: ../../Zotlabs/Module/Item.php:1123 +#: ../../Zotlabs/Module/Item.php:1156 msgid "Unable to obtain post information from database." msgstr "" -#: ../../Zotlabs/Module/Item.php:1130 +#: ../../Zotlabs/Module/Item.php:1163 #, php-format msgid "You have reached your limit of %1$.0f top level posts." msgstr "" -#: ../../Zotlabs/Module/Item.php:1137 +#: ../../Zotlabs/Module/Item.php:1170 #, php-format msgid "You have reached your limit of %1$.0f webpages." msgstr "" -#: ../../Zotlabs/Module/Ping.php:254 +#: ../../Zotlabs/Module/Ping.php:318 msgid "sent you a private message" msgstr "" -#: ../../Zotlabs/Module/Ping.php:302 +#: ../../Zotlabs/Module/Ping.php:369 msgid "added your channel" msgstr "" -#: ../../Zotlabs/Module/Ping.php:312 +#: ../../Zotlabs/Module/Ping.php:393 +msgid "requires approval" +msgstr "" + +#: ../../Zotlabs/Module/Ping.php:403 msgid "g A l F d" msgstr "" -#: ../../Zotlabs/Module/Ping.php:330 +#: ../../Zotlabs/Module/Ping.php:421 msgid "[today]" msgstr "" -#: ../../Zotlabs/Module/Ping.php:339 +#: ../../Zotlabs/Module/Ping.php:430 msgid "posted an event" msgstr "" +#: ../../Zotlabs/Module/Ping.php:463 +msgid "shared a file with you" +msgstr "" + #: ../../Zotlabs/Module/Page.php:39 ../../Zotlabs/Module/Block.php:29 msgid "Invalid item." msgstr "" #: ../../Zotlabs/Module/Page.php:128 ../../Zotlabs/Module/Block.php:77 -#: ../../Zotlabs/Module/Display.php:122 -#: ../../Zotlabs/Lib/NativeWikiPage.php:500 ../../Zotlabs/Web/Router.php:146 -#: ../../include/help.php:68 +#: ../../Zotlabs/Module/Display.php:120 +#: ../../Zotlabs/Lib/NativeWikiPage.php:515 ../../Zotlabs/Web/Router.php:158 +#: ../../include/help.php:81 msgid "Page not found." msgstr "" @@ -5117,297 +5183,293 @@ msgstr "" msgid "Failed to update connection record." msgstr "" -#: ../../Zotlabs/Module/Connedit.php:298 +#: ../../Zotlabs/Module/Connedit.php:302 msgid "is now connected to" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:423 +#: ../../Zotlabs/Module/Connedit.php:427 msgid "Could not access address book record." msgstr "" -#: ../../Zotlabs/Module/Connedit.php:471 +#: ../../Zotlabs/Module/Connedit.php:475 msgid "Refresh failed - channel is currently unavailable." msgstr "" -#: ../../Zotlabs/Module/Connedit.php:486 ../../Zotlabs/Module/Connedit.php:495 -#: ../../Zotlabs/Module/Connedit.php:504 ../../Zotlabs/Module/Connedit.php:513 -#: ../../Zotlabs/Module/Connedit.php:526 +#: ../../Zotlabs/Module/Connedit.php:490 ../../Zotlabs/Module/Connedit.php:499 +#: ../../Zotlabs/Module/Connedit.php:508 ../../Zotlabs/Module/Connedit.php:517 +#: ../../Zotlabs/Module/Connedit.php:530 msgid "Unable to set address book parameters." msgstr "" -#: ../../Zotlabs/Module/Connedit.php:550 +#: ../../Zotlabs/Module/Connedit.php:554 msgid "Connection has been removed." msgstr "" -#: ../../Zotlabs/Module/Connedit.php:590 ../../Zotlabs/Lib/Apps.php:229 +#: ../../Zotlabs/Module/Connedit.php:594 ../../Zotlabs/Lib/Apps.php:241 #: ../../addon/openclipatar/openclipatar.php:57 -#: ../../include/conversation.php:979 ../../include/nav.php:102 +#: ../../include/conversation.php:1015 ../../include/nav.php:141 msgid "View Profile" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:593 +#: ../../Zotlabs/Module/Connedit.php:597 #, php-format msgid "View %s's profile" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:597 +#: ../../Zotlabs/Module/Connedit.php:601 msgid "Refresh Permissions" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:600 +#: ../../Zotlabs/Module/Connedit.php:604 msgid "Fetch updated permissions" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:604 +#: ../../Zotlabs/Module/Connedit.php:608 msgid "Refresh Photo" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:607 +#: ../../Zotlabs/Module/Connedit.php:611 msgid "Fetch updated photo" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:611 +#: ../../Zotlabs/Module/Connedit.php:615 msgid "Recent Activity" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:614 +#: ../../Zotlabs/Module/Connedit.php:618 msgid "View recent posts and comments" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:621 +#: ../../Zotlabs/Module/Connedit.php:625 msgid "Block (or Unblock) all communications with this connection" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:622 +#: ../../Zotlabs/Module/Connedit.php:626 msgid "This connection is blocked!" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:626 +#: ../../Zotlabs/Module/Connedit.php:630 msgid "Unignore" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:629 +#: ../../Zotlabs/Module/Connedit.php:633 msgid "Ignore (or Unignore) all inbound communications from this connection" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:630 +#: ../../Zotlabs/Module/Connedit.php:634 msgid "This connection is ignored!" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:634 +#: ../../Zotlabs/Module/Connedit.php:638 msgid "Unarchive" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:634 +#: ../../Zotlabs/Module/Connedit.php:638 msgid "Archive" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:637 +#: ../../Zotlabs/Module/Connedit.php:641 msgid "" "Archive (or Unarchive) this connection - mark channel dead but keep content" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:638 +#: ../../Zotlabs/Module/Connedit.php:642 msgid "This connection is archived!" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:642 +#: ../../Zotlabs/Module/Connedit.php:646 msgid "Unhide" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:642 +#: ../../Zotlabs/Module/Connedit.php:646 msgid "Hide" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:645 +#: ../../Zotlabs/Module/Connedit.php:649 msgid "Hide or Unhide this connection from your other connections" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:646 +#: ../../Zotlabs/Module/Connedit.php:650 msgid "This connection is hidden!" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:653 +#: ../../Zotlabs/Module/Connedit.php:657 msgid "Delete this connection" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:661 +#: ../../Zotlabs/Module/Connedit.php:665 msgid "Fetch Vcard" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:664 +#: ../../Zotlabs/Module/Connedit.php:668 msgid "Fetch electronic calling card for this connection" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:675 +#: ../../Zotlabs/Module/Connedit.php:679 msgid "Open Individual Permissions section by default" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:698 +#: ../../Zotlabs/Module/Connedit.php:702 msgid "Affinity" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:701 +#: ../../Zotlabs/Module/Connedit.php:705 msgid "Open Set Affinity section by default" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:705 ../../Zotlabs/Widget/Affinity.php:26 +#: ../../Zotlabs/Module/Connedit.php:709 ../../Zotlabs/Widget/Affinity.php:26 msgid "Me" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:706 ../../Zotlabs/Widget/Affinity.php:27 +#: ../../Zotlabs/Module/Connedit.php:710 ../../Zotlabs/Widget/Affinity.php:27 msgid "Family" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:708 ../../Zotlabs/Widget/Affinity.php:29 +#: ../../Zotlabs/Module/Connedit.php:712 ../../Zotlabs/Widget/Affinity.php:29 msgid "Acquaintances" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:735 +#: ../../Zotlabs/Module/Connedit.php:739 msgid "Filter" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:738 +#: ../../Zotlabs/Module/Connedit.php:742 msgid "Open Custom Filter section by default" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:775 +#: ../../Zotlabs/Module/Connedit.php:779 msgid "Approve this connection" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:775 +#: ../../Zotlabs/Module/Connedit.php:779 msgid "Accept connection to allow communication" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:780 +#: ../../Zotlabs/Module/Connedit.php:784 msgid "Set Affinity" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:783 +#: ../../Zotlabs/Module/Connedit.php:787 msgid "Set Profile" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:786 +#: ../../Zotlabs/Module/Connedit.php:790 msgid "Set Affinity & Profile" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:844 -msgid "none" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:851 +#: ../../Zotlabs/Module/Connedit.php:855 msgid "This connection is unreachable from this location." msgstr "" -#: ../../Zotlabs/Module/Connedit.php:852 +#: ../../Zotlabs/Module/Connedit.php:856 msgid "This connection may be unreachable from other channel locations." msgstr "" -#: ../../Zotlabs/Module/Connedit.php:854 +#: ../../Zotlabs/Module/Connedit.php:858 msgid "Location independence is not supported by their network." msgstr "" -#: ../../Zotlabs/Module/Connedit.php:860 +#: ../../Zotlabs/Module/Connedit.php:864 msgid "" "This connection is unreachable from this location. Location independence is " "not supported by their network." msgstr "" -#: ../../Zotlabs/Module/Connedit.php:863 +#: ../../Zotlabs/Module/Connedit.php:867 #: ../../Zotlabs/Widget/Settings_menu.php:109 msgid "Connection Default Permissions" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:863 ../../include/items.php:3925 +#: ../../Zotlabs/Module/Connedit.php:867 ../../include/items.php:3974 #, php-format msgid "Connection: %s" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:864 +#: ../../Zotlabs/Module/Connedit.php:868 msgid "Apply these permissions automatically" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:864 +#: ../../Zotlabs/Module/Connedit.php:868 msgid "Connection requests will be approved without your interaction" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:865 +#: ../../Zotlabs/Module/Connedit.php:869 msgid "Permission role" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:866 +#: ../../Zotlabs/Module/Connedit.php:870 msgid "Add permission role" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:872 +#: ../../Zotlabs/Module/Connedit.php:877 msgid "This connection's primary address is" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:873 +#: ../../Zotlabs/Module/Connedit.php:878 msgid "Available locations:" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:878 +#: ../../Zotlabs/Module/Connedit.php:883 msgid "" "The permissions indicated on this page will be applied to all new " "connections." msgstr "" -#: ../../Zotlabs/Module/Connedit.php:879 +#: ../../Zotlabs/Module/Connedit.php:884 msgid "Connection Tools" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:881 +#: ../../Zotlabs/Module/Connedit.php:886 msgid "Slide to adjust your degree of friendship" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:882 ../../Zotlabs/Module/Rate.php:155 +#: ../../Zotlabs/Module/Connedit.php:887 ../../Zotlabs/Module/Rate.php:155 #: ../../include/js_strings.php:20 msgid "Rating" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:883 +#: ../../Zotlabs/Module/Connedit.php:888 msgid "Slide to adjust your rating" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:884 ../../Zotlabs/Module/Connedit.php:889 +#: ../../Zotlabs/Module/Connedit.php:889 ../../Zotlabs/Module/Connedit.php:894 msgid "Optionally explain your rating" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:886 +#: ../../Zotlabs/Module/Connedit.php:891 msgid "Custom Filter" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:887 +#: ../../Zotlabs/Module/Connedit.php:892 msgid "Only import posts with this text" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:887 ../../Zotlabs/Module/Connedit.php:888 +#: ../../Zotlabs/Module/Connedit.php:892 ../../Zotlabs/Module/Connedit.php:893 msgid "" "words one per line or #tags or /patterns/ or lang=xx, leave blank to import " "all posts" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:888 +#: ../../Zotlabs/Module/Connedit.php:893 msgid "Do not import posts with this text" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:890 +#: ../../Zotlabs/Module/Connedit.php:895 msgid "This information is public!" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:895 +#: ../../Zotlabs/Module/Connedit.php:900 msgid "Connection Pending Approval" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:900 +#: ../../Zotlabs/Module/Connedit.php:905 #, php-format msgid "" "Please choose the profile you would like to display to %s when viewing your " "profile securely." msgstr "" -#: ../../Zotlabs/Module/Connedit.php:907 +#: ../../Zotlabs/Module/Connedit.php:912 msgid "" "Some permissions may be inherited from your channel's <a href=\"settings" "\"><strong>privacy settings</strong></a>, which have higher priority than " @@ -5415,18 +5477,14 @@ msgid "" "any impact unless the inherited setting changes." msgstr "" -#: ../../Zotlabs/Module/Connedit.php:908 +#: ../../Zotlabs/Module/Connedit.php:913 msgid "Last update:" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:917 +#: ../../Zotlabs/Module/Connedit.php:922 msgid "Details" msgstr "" -#: ../../Zotlabs/Module/Chat.php:94 ../../Zotlabs/Lib/Apps.php:216 -msgid "My Chatrooms" -msgstr "" - #: ../../Zotlabs/Module/Chat.php:181 msgid "Room not found" msgstr "" @@ -5452,13 +5510,13 @@ msgid "Bookmark this room" msgstr "" #: ../../Zotlabs/Module/Chat.php:205 ../../Zotlabs/Module/Mail.php:241 -#: ../../Zotlabs/Module/Mail.php:362 ../../include/conversation.php:1260 +#: ../../Zotlabs/Module/Mail.php:362 ../../include/conversation.php:1296 msgid "Please enter a link URL:" msgstr "" #: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Module/Mail.php:294 -#: ../../Zotlabs/Module/Mail.php:436 ../../Zotlabs/Lib/ThreadItem.php:742 -#: ../../include/conversation.php:1370 +#: ../../Zotlabs/Module/Mail.php:436 ../../Zotlabs/Lib/ThreadItem.php:757 +#: ../../include/conversation.php:1415 msgid "Encrypt text" msgstr "" @@ -5491,9 +5549,14 @@ msgstr "" msgid "min" msgstr "" -#: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:225 -#: ../../Zotlabs/Storage/Browser.php:225 ../../Zotlabs/Storage/Browser.php:247 -#: ../../include/conversation.php:1788 ../../include/nav.php:380 +#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:242 +#: ../../include/conversation.php:1814 ../../include/nav.php:422 +msgid "Photos" +msgstr "" + +#: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:237 +#: ../../Zotlabs/Storage/Browser.php:225 ../../include/conversation.php:1822 +#: ../../include/nav.php:430 msgid "Files" msgstr "" @@ -5533,7 +5596,7 @@ msgstr "" msgid "Submit and proceed" msgstr "" -#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2281 +#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2289 msgid "Menus" msgstr "" @@ -5585,14 +5648,13 @@ msgstr "" msgid "Allow bookmarks" msgstr "" -#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2282 +#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2290 msgid "Layouts" msgstr "" -#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Module/Help.php:18 -#: ../../Zotlabs/Lib/Apps.php:233 ../../include/nav.php:157 -#: ../../include/nav.php:258 ../../include/help.php:55 -#: ../../include/help.php:61 +#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Lib/Apps.php:245 +#: ../../include/nav.php:201 ../../include/nav.php:301 +#: ../../include/help.php:68 ../../include/help.php:74 msgid "Help" msgstr "" @@ -5609,12 +5671,12 @@ msgid "Download PDL file" msgstr "" #: ../../Zotlabs/Module/Tagger.php:55 ../../include/markdown.php:141 -#: ../../include/bbcode.php:334 +#: ../../include/bbcode.php:333 msgid "post" msgstr "" #: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:146 -#: ../../include/text.php:1938 +#: ../../include/text.php:1946 msgid "comment" msgstr "" @@ -5647,7 +5709,7 @@ msgid "Could not create privacy group." msgstr "" #: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:143 -#: ../../include/items.php:3892 +#: ../../include/items.php:3941 msgid "Privacy group not found." msgstr "" @@ -5782,7 +5844,7 @@ msgid "View this profile" msgstr "" #: ../../Zotlabs/Module/Profiles.php:728 ../../Zotlabs/Module/Profiles.php:827 -#: ../../include/channel.php:1081 +#: ../../include/channel.php:1284 msgid "Edit visibility" msgstr "" @@ -5794,7 +5856,7 @@ msgstr "" msgid "Change cover photo" msgstr "" -#: ../../Zotlabs/Module/Profiles.php:731 ../../include/channel.php:1052 +#: ../../Zotlabs/Module/Profiles.php:731 ../../include/channel.php:1255 msgid "Change profile photo" msgstr "" @@ -5814,7 +5876,7 @@ msgstr "" msgid "Add profile things" msgstr "" -#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1654 +#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1688 msgid "Personal" msgstr "" @@ -5959,12 +6021,12 @@ msgstr "" msgid "Communications" msgstr "" -#: ../../Zotlabs/Module/Profiles.php:823 ../../include/channel.php:1077 +#: ../../Zotlabs/Module/Profiles.php:823 ../../include/channel.php:1280 msgid "Profile Image" msgstr "" -#: ../../Zotlabs/Module/Profiles.php:833 ../../include/channel.php:1059 -#: ../../include/nav.php:105 +#: ../../Zotlabs/Module/Profiles.php:833 ../../include/channel.php:1262 +#: ../../include/nav.php:144 msgid "Edit Profiles" msgstr "" @@ -5980,8 +6042,8 @@ msgstr "" msgid "Create a new channel" msgstr "" -#: ../../Zotlabs/Module/Manage.php:170 ../../Zotlabs/Lib/Apps.php:222 -#: ../../include/nav.php:199 +#: ../../Zotlabs/Module/Manage.php:170 ../../Zotlabs/Lib/Apps.php:234 +#: ../../include/nav.php:129 ../../include/nav.php:215 msgid "Channel Manager" msgstr "" @@ -6015,6 +6077,16 @@ msgstr "" msgid "Delegated Channel" msgstr "" +#: ../../Zotlabs/Module/Cards.php:38 ../../Zotlabs/Module/Cards.php:178 +#: ../../Zotlabs/Lib/Apps.php:224 ../../include/conversation.php:1873 +#: ../../include/features.php:122 ../../include/nav.php:479 +msgid "Cards" +msgstr "" + +#: ../../Zotlabs/Module/Cards.php:95 +msgid "Add Card" +msgstr "" + #: ../../Zotlabs/Module/Dirsearch.php:33 msgid "This directory server requires an access token" msgstr "" @@ -6066,7 +6138,7 @@ msgid "No ratings" msgstr "" #: ../../Zotlabs/Module/Ratings.php:97 ../../Zotlabs/Module/Pubsites.php:35 -#: ../../include/conversation.php:1029 +#: ../../include/conversation.php:1065 msgid "Ratings" msgstr "" @@ -6082,12 +6154,6 @@ msgstr "" msgid "Description: " msgstr "" -#: ../../Zotlabs/Module/Webpages.php:38 ../../Zotlabs/Module/Webpages.php:237 -#: ../../Zotlabs/Lib/Apps.php:226 ../../include/conversation.php:1838 -#: ../../include/nav.php:429 -msgid "Webpages" -msgstr "" - #: ../../Zotlabs/Module/Webpages.php:54 msgid "Import Webpage Elements" msgstr "" @@ -6104,6 +6170,11 @@ msgstr "" msgid "Export selected" msgstr "" +#: ../../Zotlabs/Module/Webpages.php:237 ../../Zotlabs/Lib/Apps.php:238 +#: ../../include/conversation.php:1884 ../../include/nav.php:491 +msgid "Webpages" +msgstr "" + #: ../../Zotlabs/Module/Webpages.php:248 msgid "Actions" msgstr "" @@ -6136,11 +6207,44 @@ msgstr "" msgid "Import complete." msgstr "" +#: ../../Zotlabs/Module/Changeaddr.php:35 +msgid "" +"Channel name changes are not allowed within 48 hours of changing the account " +"password." +msgstr "" + +#: ../../Zotlabs/Module/Changeaddr.php:46 ../../include/channel.php:209 +#: ../../include/channel.php:579 +msgid "Reserved nickname. Please choose another." +msgstr "" + +#: ../../Zotlabs/Module/Changeaddr.php:51 ../../include/channel.php:214 +#: ../../include/channel.php:584 +msgid "" +"Nickname has unsupported characters or is already being used on this site." +msgstr "" + +#: ../../Zotlabs/Module/Changeaddr.php:77 +msgid "Change channel nickname/address" +msgstr "" + +#: ../../Zotlabs/Module/Changeaddr.php:78 +msgid "Any/all connections on other networks will be lost!" +msgstr "" + +#: ../../Zotlabs/Module/Changeaddr.php:80 +msgid "New channel address" +msgstr "" + +#: ../../Zotlabs/Module/Changeaddr.php:81 +msgid "Rename Channel" +msgstr "" + #: ../../Zotlabs/Module/Editpost.php:38 ../../Zotlabs/Module/Editpost.php:43 msgid "Item is not editable" msgstr "" -#: ../../Zotlabs/Module/Editpost.php:108 ../../Zotlabs/Module/Rpost.php:140 +#: ../../Zotlabs/Module/Editpost.php:108 ../../Zotlabs/Module/Rpost.php:178 msgid "Edit post" msgstr "" @@ -6201,7 +6305,7 @@ msgstr "" msgid "Delivery report for %1$s" msgstr "" -#: ../../Zotlabs/Module/Dreport.php:151 +#: ../../Zotlabs/Module/Dreport.php:151 ../../Zotlabs/Widget/Wiki_pages.php:60 msgid "Options" msgstr "" @@ -6209,81 +6313,74 @@ msgstr "" msgid "Redeliver" msgstr "" -#: ../../Zotlabs/Module/Sources.php:37 -msgid "Failed to create source. No channel selected." +#: ../../Zotlabs/Module/Profiles.php:728 ../../Zotlabs/Module/Profiles.php:827 +#: ../../include/channel.php:1081 +msgid "Edit visibility" msgstr "" -#: ../../Zotlabs/Module/Sources.php:51 -msgid "Source created." +#: ../../Zotlabs/Module/Profiles.php:729 +msgid "Profile Tools" msgstr "" -#: ../../Zotlabs/Module/Sources.php:64 -msgid "Source updated." +#: ../../Zotlabs/Module/Profiles.php:730 +msgid "Change cover photo" msgstr "" -#: ../../Zotlabs/Module/Sources.php:90 -msgid "*" +#: ../../Zotlabs/Module/Profiles.php:731 ../../include/channel.php:1052 +msgid "Change profile photo" msgstr "" #: ../../Zotlabs/Module/Sources.php:96 -#: ../../Zotlabs/Widget/Settings_menu.php:125 ../../include/features.php:209 +#: ../../Zotlabs/Widget/Settings_menu.php:125 ../../include/features.php:218 msgid "Channel Sources" msgstr "" -#: ../../Zotlabs/Module/Sources.php:97 -msgid "Manage remote sources of content for your channel." +#: ../../Zotlabs/Module/Profiles.php:733 +msgid "Clone this profile" msgstr "" -#: ../../Zotlabs/Module/Sources.php:98 ../../Zotlabs/Module/Sources.php:108 -msgid "New Source" +#: ../../Zotlabs/Module/Profiles.php:734 +msgid "Delete this profile" msgstr "" -#: ../../Zotlabs/Module/Sources.php:109 ../../Zotlabs/Module/Sources.php:143 -msgid "" -"Import all or selected content from the following channel into this channel " -"and distribute it according to your channel settings." +#: ../../Zotlabs/Module/Profiles.php:735 +msgid "Add profile things" msgstr "" -#: ../../Zotlabs/Module/Sources.php:110 ../../Zotlabs/Module/Sources.php:144 -msgid "Only import content with these words (one per line)" +#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1654 +msgid "Personal" msgstr "" -#: ../../Zotlabs/Module/Sources.php:110 ../../Zotlabs/Module/Sources.php:144 -msgid "Leave blank to import all public content" +#: ../../Zotlabs/Module/Profiles.php:738 +msgid "Relation" msgstr "" -#: ../../Zotlabs/Module/Sources.php:111 ../../Zotlabs/Module/Sources.php:148 -msgid "Channel Name" +#: ../../Zotlabs/Module/Profiles.php:739 ../../include/datetime.php:55 +msgid "Miscellaneous" msgstr "" -#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147 -msgid "" -"Add the following categories to posts imported from this source (comma " -"separated)" +#: ../../Zotlabs/Module/Profiles.php:741 +msgid "Import profile from file" msgstr "" #: ../../Zotlabs/Module/Sources.php:133 ../../Zotlabs/Module/Sources.php:161 msgid "Source not found." msgstr "" -#: ../../Zotlabs/Module/Sources.php:140 -msgid "Edit Source" -msgstr "" - -#: ../../Zotlabs/Module/Sources.php:141 -msgid "Delete Source" +#: ../../Zotlabs/Module/Profiles.php:744 +msgid "Marital status" msgstr "" -#: ../../Zotlabs/Module/Sources.php:169 -msgid "Source removed" +#: ../../Zotlabs/Module/Profiles.php:745 +msgid "Sexual preference" msgstr "" -#: ../../Zotlabs/Module/Sources.php:171 -msgid "Unable to remove source." +#: ../../Zotlabs/Module/Profiles.php:748 +msgid "Profile name" msgstr "" -#: ../../Zotlabs/Module/Rpost.php:63 ../../Zotlabs/Lib/Apps.php:245 -msgid "Post" +#: ../../Zotlabs/Module/Profiles.php:750 +msgid "This is your default profile." msgstr "" #: ../../Zotlabs/Module/Like.php:19 @@ -6321,13 +6418,14 @@ msgstr "" msgid "Previous action reversed." msgstr "" -#: ../../Zotlabs/Module/Like.php:423 ../../addon/diaspora/Receiver.php:1399 -#: ../../include/conversation.php:160 +#: ../../Zotlabs/Module/Like.php:423 ../../addon/diaspora/Receiver.php:1453 +#: ../../addon/pubcrawl/as.php:1323 ../../include/conversation.php:160 #, php-format msgid "%1$s likes %2$s's %3$s" msgstr "" -#: ../../Zotlabs/Module/Like.php:425 ../../include/conversation.php:163 +#: ../../Zotlabs/Module/Like.php:425 ../../addon/pubcrawl/as.php:1325 +#: ../../include/conversation.php:163 #, php-format msgid "%1$s doesn't like %2$s's %3$s" msgstr "" @@ -6370,10 +6468,6 @@ msgstr "" msgid "Thank you." msgstr "" -#: ../../Zotlabs/Module/Directory.php:80 ../../Zotlabs/Lib/Apps.php:232 -msgid "Directory" -msgstr "" - #: ../../Zotlabs/Module/Directory.php:245 #, php-format msgid "%d rating" @@ -6393,11 +6487,11 @@ msgstr "" msgid "Homepage: " msgstr "" -#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1314 +#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1516 msgid "Age:" msgstr "" -#: ../../Zotlabs/Module/Directory.php:314 ../../include/channel.php:1149 +#: ../../Zotlabs/Module/Directory.php:314 ../../include/channel.php:1352 #: ../../include/event.php:52 ../../include/event.php:84 msgid "Location:" msgstr "" @@ -6406,17 +6500,17 @@ msgstr "" msgid "Description:" msgstr "" -#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1330 +#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1532 msgid "Hometown:" msgstr "" -#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1338 +#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1540 msgid "About:" msgstr "" #: ../../Zotlabs/Module/Directory.php:328 ../../Zotlabs/Module/Suggest.php:56 #: ../../Zotlabs/Widget/Follow.php:32 ../../Zotlabs/Widget/Suggestions.php:44 -#: ../../include/conversation.php:999 ../../include/channel.php:1134 +#: ../../include/conversation.php:1035 ../../include/channel.php:1337 #: ../../include/connections.php:111 msgid "Connect" msgstr "" @@ -6494,11 +6588,6 @@ msgstr "" msgid "Lookup xchan beginning with (or webbie): " msgstr "" -#: ../../Zotlabs/Module/Suggest.php:32 ../../Zotlabs/Lib/Apps.php:220 -#: ../../include/features.php:333 -msgid "Suggest Channels" -msgstr "" - #: ../../Zotlabs/Module/Suggest.php:39 msgid "" "No suggestions available. If this is a new site, please try again in 24 " @@ -6533,11 +6622,6 @@ msgstr "" msgid "Selected channel has private message restrictions. Send failed." msgstr "" -#: ../../Zotlabs/Module/Mail.php:143 ../../Zotlabs/Lib/Apps.php:234 -#: ../../include/nav.php:187 -msgid "Mail" -msgstr "" - #: ../../Zotlabs/Module/Mail.php:160 msgid "Messages" msgstr "" @@ -6575,7 +6659,7 @@ msgid "Subject:" msgstr "" #: ../../Zotlabs/Module/Mail.php:287 ../../Zotlabs/Module/Mail.php:429 -#: ../../include/conversation.php:1320 +#: ../../include/conversation.php:1365 msgid "Attach file" msgstr "" @@ -6584,7 +6668,7 @@ msgid "Send" msgstr "" #: ../../Zotlabs/Module/Mail.php:292 ../../Zotlabs/Module/Mail.php:434 -#: ../../include/conversation.php:1365 +#: ../../include/conversation.php:1410 msgid "Set expiration date" msgstr "" @@ -6656,7 +6740,7 @@ msgstr "" msgid "Software" msgstr "" -#: ../../Zotlabs/Module/Pubsites.php:48 +#: ../../Zotlabs/Module/Pubsites.php:49 msgid "Rate" msgstr "" @@ -6710,14 +6794,10 @@ msgstr "" msgid "or select an existing folder (doubleclick)" msgstr "" -#: ../../Zotlabs/Module/Filer.php:54 ../../Zotlabs/Lib/ThreadItem.php:137 +#: ../../Zotlabs/Module/Filer.php:54 ../../Zotlabs/Lib/ThreadItem.php:141 msgid "Save to Folder" msgstr "" -#: ../../Zotlabs/Module/Probe.php:11 ../../Zotlabs/Lib/Apps.php:219 -msgid "Remote Diagnostics" -msgstr "" - #: ../../Zotlabs/Module/Probe.php:30 ../../Zotlabs/Module/Probe.php:34 #, php-format msgid "Fetching URL returns error: %1$s" @@ -6805,8 +6885,8 @@ msgstr "" msgid "Membership on this site is by invitation only." msgstr "" -#: ../../Zotlabs/Module/Register.php:268 ../../boot.php:1579 -#: ../../include/nav.php:145 +#: ../../Zotlabs/Module/Register.php:268 ../../boot.php:1620 +#: ../../include/nav.php:189 msgid "Register" msgstr "" @@ -6821,30 +6901,30 @@ msgstr "" msgid "Cover Photos" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:237 ../../include/items.php:4273 +#: ../../Zotlabs/Module/Cover_photo.php:237 ../../include/items.php:4320 msgid "female" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4274 +#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4321 #, php-format msgid "%1$s updated her %2$s" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:239 ../../include/items.php:4275 +#: ../../Zotlabs/Module/Cover_photo.php:239 ../../include/items.php:4322 msgid "male" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/items.php:4276 +#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/items.php:4323 #, php-format msgid "%1$s updated his %2$s" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:242 ../../include/items.php:4278 +#: ../../Zotlabs/Module/Cover_photo.php:242 ../../include/items.php:4325 #, php-format msgid "%1$s updated their %2$s" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:244 ../../include/channel.php:1776 +#: ../../Zotlabs/Module/Cover_photo.php:244 ../../include/channel.php:1980 msgid "cover photo" msgstr "" @@ -6856,8 +6936,8 @@ msgstr "" msgid "Documentation Search" msgstr "" -#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1770 -#: ../../include/nav.php:362 +#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1804 +#: ../../include/nav.php:412 msgid "About" msgstr "" @@ -6873,14 +6953,18 @@ msgstr "" msgid "Tutorials" msgstr "" -#: ../../Zotlabs/Module/Help.php:93 +#: ../../Zotlabs/Module/Help.php:95 msgid "$Projectname Documentation" msgstr "" -#: ../../Zotlabs/Module/Help.php:94 +#: ../../Zotlabs/Module/Help.php:96 msgid "Contents" msgstr "" +#: ../../Zotlabs/Module/Display.php:340 +msgid "Item has been removed." +msgstr "" + #: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98 msgid "Tag removed" msgstr "" @@ -6893,7 +6977,7 @@ msgstr "" msgid "Select a tag to remove: " msgstr "" -#: ../../Zotlabs/Module/Network.php:96 +#: ../../Zotlabs/Module/Network.php:97 msgid "No such group" msgstr "" @@ -6909,10 +6993,6 @@ msgstr "" msgid "Search Results For:" msgstr "" -#: ../../Zotlabs/Module/Network.php:157 ../../Zotlabs/Lib/Apps.php:223 -msgid "Activity" -msgstr "" - #: ../../Zotlabs/Module/Network.php:221 msgid "Privacy group is empty" msgstr "" @@ -6929,14 +7009,10 @@ msgstr "" msgid "Invalid channel." msgstr "" -#: ../../Zotlabs/Module/Acl.php:344 +#: ../../Zotlabs/Module/Acl.php:351 msgid "network" msgstr "" -#: ../../Zotlabs/Module/Acl.php:354 -msgid "RSS" -msgstr "" - #: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82 #: ../../addon/opensearch/opensearch.php:42 msgid "$Projectname" @@ -6955,52 +7031,53 @@ msgstr "" msgid "File not found." msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:138 +#: ../../Zotlabs/Module/Filestorage.php:137 msgid "Edit file permissions" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:151 +#: ../../Zotlabs/Module/Filestorage.php:149 msgid "Set/edit permissions" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:152 +#: ../../Zotlabs/Module/Filestorage.php:150 msgid "Include all files and sub folders" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:153 +#: ../../Zotlabs/Module/Filestorage.php:151 msgid "Return to file list" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:155 +#: ../../Zotlabs/Module/Filestorage.php:153 msgid "Copy/paste this code to attach file to a post" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:156 +#: ../../Zotlabs/Module/Filestorage.php:154 msgid "Copy/paste this URL to link file from a web page" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:158 +#: ../../Zotlabs/Module/Filestorage.php:156 msgid "Share this file" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:159 +#: ../../Zotlabs/Module/Filestorage.php:157 msgid "Show URL to this file" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:160 -msgid "Notify your contacts about this file" +#: ../../Zotlabs/Module/Filestorage.php:158 +#: ../../Zotlabs/Storage/Browser.php:351 +msgid "Show in your contacts shared folder" msgstr "" #: ../../Zotlabs/Module/Common.php:14 msgid "No channel." msgstr "" -#: ../../Zotlabs/Module/Common.php:43 -msgid "Common connections" +#: ../../Zotlabs/Module/Common.php:45 +msgid "No connections in common." msgstr "" -#: ../../Zotlabs/Module/Common.php:48 -msgid "No connections in common." +#: ../../Zotlabs/Module/Common.php:65 +msgid "View Common Connections" msgstr "" #: ../../Zotlabs/Module/Viewconnections.php:65 @@ -7093,6 +7170,10 @@ msgstr "" msgid "Optionally explain your rating (this information is public)" msgstr "" +#: ../../Zotlabs/Module/Card_edit.php:128 +msgid "Edit Card" +msgstr "" + #: ../../Zotlabs/Module/Lostpass.php:19 msgid "No valid account found." msgstr "" @@ -7117,7 +7198,7 @@ msgid "" "Password reset failed." msgstr "" -#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1606 +#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1648 msgid "Password Reset" msgstr "" @@ -7162,12 +7243,8 @@ msgstr "" msgid "Email Address" msgstr "" -#: ../../Zotlabs/Module/Lostpass.php:133 -msgid "Reset" -msgstr "" - #: ../../Zotlabs/Module/Notifications.php:43 -#: ../../Zotlabs/Lib/ThreadItem.php:392 +#: ../../Zotlabs/Lib/ThreadItem.php:397 msgid "Mark all seen" msgstr "" @@ -7195,61 +7272,117 @@ msgstr "" msgid "5. Wizard - I probably know more than you do" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:213 +#: ../../Zotlabs/Lib/Apps.php:225 msgid "Site Admin" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:214 ../../addon/buglink/buglink.php:16 +#: ../../Zotlabs/Lib/Apps.php:226 ../../addon/buglink/buglink.php:16 msgid "Report Bug" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:218 +#: ../../Zotlabs/Lib/Apps.php:227 +msgid "View Bookmarks" +msgstr "" + +#: ../../Zotlabs/Lib/Apps.php:228 +msgid "My Chatrooms" +msgstr "" + +#: ../../Zotlabs/Lib/Apps.php:230 msgid "Firefox Share" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:221 ../../boot.php:1598 ../../include/nav.php:113 +#: ../../Zotlabs/Lib/Apps.php:231 +msgid "Remote Diagnostics" +msgstr "" + +#: ../../Zotlabs/Lib/Apps.php:232 ../../include/features.php:342 +msgid "Suggest Channels" +msgstr "" + +#: ../../Zotlabs/Lib/Apps.php:233 ../../boot.php:1639 ../../include/nav.php:153 +#: ../../include/nav.php:157 msgid "Login" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:237 +#: ../../Zotlabs/Lib/Apps.php:235 ../../include/nav.php:98 +msgid "Activity" +msgstr "" + +#: ../../Zotlabs/Lib/Apps.php:239 ../../include/conversation.php:1900 +#: ../../include/features.php:95 ../../include/nav.php:507 +msgid "Wiki" +msgstr "" + +#: ../../Zotlabs/Lib/Apps.php:240 ../../include/nav.php:102 +msgid "Channel Home" +msgstr "" + +#: ../../Zotlabs/Lib/Apps.php:243 ../../include/conversation.php:1833 +#: ../../include/conversation.php:1836 ../../include/nav.php:124 +#: ../../include/nav.php:441 ../../include/nav.php:444 +msgid "Events" +msgstr "" + +#: ../../Zotlabs/Lib/Apps.php:244 +msgid "Directory" +msgstr "" + +#: ../../Zotlabs/Lib/Apps.php:246 ../../include/nav.php:116 +msgid "Mail" +msgstr "" + +#: ../../Zotlabs/Lib/Apps.php:249 msgid "Chat" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:239 +#: ../../Zotlabs/Lib/Apps.php:251 msgid "Probe" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:240 +#: ../../Zotlabs/Lib/Apps.php:252 msgid "Suggest" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:241 +#: ../../Zotlabs/Lib/Apps.php:253 msgid "Random Channel" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:243 ../../Zotlabs/Widget/Admin.php:26 +#: ../../Zotlabs/Lib/Apps.php:254 +msgid "Invite" +msgstr "" + +#: ../../Zotlabs/Lib/Apps.php:255 ../../Zotlabs/Widget/Admin.php:26 msgid "Features" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:246 ../../addon/openid/MysqlProvider.php:58 +#: ../../Zotlabs/Lib/Apps.php:256 ../../addon/openid/MysqlProvider.php:69 +msgid "Language" +msgstr "" + +#: ../../Zotlabs/Lib/Apps.php:257 +msgid "Post" +msgstr "" + +#: ../../Zotlabs/Lib/Apps.php:258 ../../addon/openid/MysqlProvider.php:58 #: ../../addon/openid/MysqlProvider.php:59 #: ../../addon/openid/MysqlProvider.php:60 msgid "Profile Photo" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:366 +#: ../../Zotlabs/Lib/Apps.php:397 msgid "Purchase" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:370 +#: ../../Zotlabs/Lib/Apps.php:401 msgid "Undelete" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:376 +#: ../../Zotlabs/Lib/Apps.php:407 msgid "Add to app-tray" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:377 +#: ../../Zotlabs/Lib/Apps.php:408 msgid "Remove from app-tray" msgstr "" @@ -7274,71 +7407,71 @@ msgid "publisher" msgstr "" #: ../../Zotlabs/Lib/NativeWikiPage.php:42 -#: ../../Zotlabs/Lib/NativeWikiPage.php:83 +#: ../../Zotlabs/Lib/NativeWikiPage.php:90 msgid "(No Title)" msgstr "" -#: ../../Zotlabs/Lib/NativeWikiPage.php:97 +#: ../../Zotlabs/Lib/NativeWikiPage.php:104 msgid "Wiki page create failed." msgstr "" -#: ../../Zotlabs/Lib/NativeWikiPage.php:110 +#: ../../Zotlabs/Lib/NativeWikiPage.php:117 msgid "Wiki not found." msgstr "" -#: ../../Zotlabs/Lib/NativeWikiPage.php:121 +#: ../../Zotlabs/Lib/NativeWikiPage.php:128 msgid "Destination name already exists" msgstr "" -#: ../../Zotlabs/Lib/NativeWikiPage.php:147 -#: ../../Zotlabs/Lib/NativeWikiPage.php:342 +#: ../../Zotlabs/Lib/NativeWikiPage.php:160 +#: ../../Zotlabs/Lib/NativeWikiPage.php:355 msgid "Page not found" msgstr "" -#: ../../Zotlabs/Lib/NativeWikiPage.php:177 +#: ../../Zotlabs/Lib/NativeWikiPage.php:191 msgid "Error reading page content" msgstr "" -#: ../../Zotlabs/Lib/NativeWikiPage.php:333 -#: ../../Zotlabs/Lib/NativeWikiPage.php:381 -#: ../../Zotlabs/Lib/NativeWikiPage.php:448 -#: ../../Zotlabs/Lib/NativeWikiPage.php:489 +#: ../../Zotlabs/Lib/NativeWikiPage.php:347 +#: ../../Zotlabs/Lib/NativeWikiPage.php:396 +#: ../../Zotlabs/Lib/NativeWikiPage.php:463 +#: ../../Zotlabs/Lib/NativeWikiPage.php:504 msgid "Error reading wiki" msgstr "" -#: ../../Zotlabs/Lib/NativeWikiPage.php:369 +#: ../../Zotlabs/Lib/NativeWikiPage.php:384 msgid "Page update failed." msgstr "" -#: ../../Zotlabs/Lib/NativeWikiPage.php:403 +#: ../../Zotlabs/Lib/NativeWikiPage.php:418 msgid "Nothing deleted" msgstr "" -#: ../../Zotlabs/Lib/NativeWikiPage.php:469 +#: ../../Zotlabs/Lib/NativeWikiPage.php:484 msgid "Compare: object not found." msgstr "" -#: ../../Zotlabs/Lib/NativeWikiPage.php:475 +#: ../../Zotlabs/Lib/NativeWikiPage.php:490 msgid "Page updated" msgstr "" -#: ../../Zotlabs/Lib/NativeWikiPage.php:478 +#: ../../Zotlabs/Lib/NativeWikiPage.php:493 msgid "Untitled" msgstr "" -#: ../../Zotlabs/Lib/NativeWikiPage.php:484 +#: ../../Zotlabs/Lib/NativeWikiPage.php:499 msgid "Wiki resource_id required for git commit" msgstr "" -#: ../../Zotlabs/Lib/NativeWikiPage.php:540 +#: ../../Zotlabs/Lib/NativeWikiPage.php:555 #: ../../Zotlabs/Widget/Wiki_page_history.php:23 msgctxt "wiki_history" msgid "Message" msgstr "" -#: ../../Zotlabs/Lib/NativeWikiPage.php:578 -#: ../../addon/gitwiki/gitwiki_backend.php:579 ../../include/bbcode.php:667 -#: ../../include/bbcode.php:813 +#: ../../Zotlabs/Lib/NativeWikiPage.php:593 +#: ../../addon/gitwiki/gitwiki_backend.php:579 ../../include/bbcode.php:672 +#: ../../include/bbcode.php:818 msgid "Different viewers will see this text differently" msgstr "" @@ -7430,7 +7563,7 @@ msgid "$Projectname Notification" msgstr "" #: ../../Zotlabs/Lib/Enotify.php:61 ../../addon/diaspora/util.php:283 -#: ../../addon/diaspora/util.php:296 ../../addon/diaspora/p.php:46 +#: ../../addon/diaspora/util.php:296 ../../addon/diaspora/p.php:48 msgid "$projectname" msgstr "" @@ -7438,7 +7571,7 @@ msgstr "" msgid "Thank You," msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:65 +#: ../../Zotlabs/Lib/Enotify.php:65 ../../addon/hubwall/hubwall.php:33 #, php-format msgid "%s Administrator" msgstr "" @@ -7655,7 +7788,11 @@ msgstr "" msgid "commented on %s's post" msgstr "" -#: ../../Zotlabs/Lib/NativeWiki.php:128 +#: ../../Zotlabs/Lib/NativeWiki.php:151 +msgid "Wiki updated successfully" +msgstr "" + +#: ../../Zotlabs/Lib/NativeWiki.php:198 msgid "Wiki files deleted successfully" msgstr "" @@ -7669,210 +7806,218 @@ msgstr "" msgid "Update %s failed. See error logs." msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:96 ../../include/conversation.php:656 +#: ../../Zotlabs/Lib/ThreadItem.php:97 ../../include/conversation.php:681 msgid "Private Message" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:133 ../../include/conversation.php:648 +#: ../../Zotlabs/Lib/ThreadItem.php:137 ../../include/conversation.php:673 msgid "Select" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:158 +#: ../../Zotlabs/Lib/ThreadItem.php:162 msgid "I will attend" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:158 +#: ../../Zotlabs/Lib/ThreadItem.php:162 msgid "I will not attend" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:158 +#: ../../Zotlabs/Lib/ThreadItem.php:162 msgid "I might attend" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:168 +#: ../../Zotlabs/Lib/ThreadItem.php:172 msgid "I agree" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:168 +#: ../../Zotlabs/Lib/ThreadItem.php:172 msgid "I disagree" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:168 +#: ../../Zotlabs/Lib/ThreadItem.php:172 msgid "I abstain" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:224 +#: ../../Zotlabs/Lib/ThreadItem.php:228 msgid "Add Star" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:225 +#: ../../Zotlabs/Lib/ThreadItem.php:229 msgid "Remove Star" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:226 +#: ../../Zotlabs/Lib/ThreadItem.php:230 msgid "Toggle Star Status" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:230 +#: ../../Zotlabs/Lib/ThreadItem.php:234 msgid "starred" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:663 +#: ../../Zotlabs/Lib/ThreadItem.php:244 ../../include/conversation.php:688 msgid "Message signature validated" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:241 ../../include/conversation.php:664 +#: ../../Zotlabs/Lib/ThreadItem.php:245 ../../include/conversation.php:689 msgid "Message signature incorrect" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:249 +#: ../../Zotlabs/Lib/ThreadItem.php:253 msgid "Add Tag" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:267 ../../include/taxonomy.php:355 +#: ../../Zotlabs/Lib/ThreadItem.php:271 ../../include/taxonomy.php:433 msgid "like" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:268 ../../include/taxonomy.php:356 +#: ../../Zotlabs/Lib/ThreadItem.php:272 ../../include/taxonomy.php:434 msgid "dislike" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:272 +#: ../../Zotlabs/Lib/ThreadItem.php:276 msgid "Share This" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:272 +#: ../../Zotlabs/Lib/ThreadItem.php:276 msgid "share" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:281 +#: ../../Zotlabs/Lib/ThreadItem.php:285 msgid "Delivery Report" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:299 +#: ../../Zotlabs/Lib/ThreadItem.php:303 #, php-format msgid "%d comment" msgid_plural "%d comments" msgstr[0] "" msgstr[1] "" -#: ../../Zotlabs/Lib/ThreadItem.php:328 ../../Zotlabs/Lib/ThreadItem.php:329 +#: ../../Zotlabs/Lib/ThreadItem.php:333 ../../Zotlabs/Lib/ThreadItem.php:334 #, php-format msgid "View %s's profile - %s" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:332 +#: ../../Zotlabs/Lib/ThreadItem.php:337 msgid "to" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:333 +#: ../../Zotlabs/Lib/ThreadItem.php:338 msgid "via" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:334 +#: ../../Zotlabs/Lib/ThreadItem.php:339 msgid "Wall-to-Wall" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:335 +#: ../../Zotlabs/Lib/ThreadItem.php:340 msgid "via Wall-To-Wall:" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:348 ../../include/conversation.php:715 +#: ../../Zotlabs/Lib/ThreadItem.php:353 ../../include/conversation.php:747 #, php-format msgid "from %s" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:351 ../../include/conversation.php:718 +#: ../../Zotlabs/Lib/ThreadItem.php:356 ../../include/conversation.php:750 #, php-format msgid "last edited: %s" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:352 ../../include/conversation.php:719 +#: ../../Zotlabs/Lib/ThreadItem.php:357 ../../include/conversation.php:751 #, php-format msgid "Expires: %s" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:358 +#: ../../Zotlabs/Lib/ThreadItem.php:363 msgid "Attend" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:359 +#: ../../Zotlabs/Lib/ThreadItem.php:364 msgid "Attendance Options" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:360 +#: ../../Zotlabs/Lib/ThreadItem.php:365 msgid "Vote" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:361 +#: ../../Zotlabs/Lib/ThreadItem.php:366 msgid "Voting Options" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:382 +#: ../../Zotlabs/Lib/ThreadItem.php:387 #: ../../addon/bookmarker/bookmarker.php:38 msgid "Save Bookmarks" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:383 +#: ../../Zotlabs/Lib/ThreadItem.php:388 msgid "Add to Calendar" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:441 ../../include/js_strings.php:7 +#: ../../Zotlabs/Lib/ThreadItem.php:415 ../../include/conversation.php:471 +msgid "This is an unsaved preview" +msgstr "" + +#: ../../Zotlabs/Lib/ThreadItem.php:447 ../../include/js_strings.php:7 #, php-format msgid "%s show all" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/conversation.php:1315 +#: ../../Zotlabs/Lib/ThreadItem.php:744 ../../include/conversation.php:1360 msgid "Bold" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../include/conversation.php:1316 +#: ../../Zotlabs/Lib/ThreadItem.php:745 ../../include/conversation.php:1361 msgid "Italic" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1317 +#: ../../Zotlabs/Lib/ThreadItem.php:746 ../../include/conversation.php:1362 msgid "Underline" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1318 +#: ../../Zotlabs/Lib/ThreadItem.php:747 ../../include/conversation.php:1363 msgid "Quote" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1319 +#: ../../Zotlabs/Lib/ThreadItem.php:748 ../../include/conversation.php:1364 msgid "Code" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:736 +#: ../../Zotlabs/Lib/ThreadItem.php:749 msgid "Image" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:737 +#: ../../Zotlabs/Lib/ThreadItem.php:750 +msgid "Attach File" +msgstr "" + +#: ../../Zotlabs/Lib/ThreadItem.php:751 msgid "Insert Link" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:738 +#: ../../Zotlabs/Lib/ThreadItem.php:752 msgid "Video" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:747 +#: ../../Zotlabs/Lib/ThreadItem.php:762 msgid "Your full name (required)" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:748 +#: ../../Zotlabs/Lib/ThreadItem.php:763 msgid "Your email address (required)" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:749 +#: ../../Zotlabs/Lib/ThreadItem.php:764 msgid "Your website URL (optional)" msgstr "" -#: ../../Zotlabs/Zot/Auth.php:138 +#: ../../Zotlabs/Zot/Auth.php:152 msgid "" "Remote authentication blocked. You are logged into this site locally. Please " "logout and retry." msgstr "" -#: ../../Zotlabs/Zot/Auth.php:250 ../../addon/openid/Mod_Openid.php:76 +#: ../../Zotlabs/Zot/Auth.php:264 ../../addon/openid/Mod_Openid.php:76 #: ../../addon/openid/Mod_Openid.php:178 #, php-format msgid "Welcome %s. Remote authentication successful." @@ -7882,7 +8027,7 @@ msgstr "" msgid "parent" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:131 ../../include/text.php:2692 +#: ../../Zotlabs/Storage/Browser.php:131 ../../include/text.php:2707 msgid "Collection" msgstr "" @@ -8029,12 +8174,14 @@ msgstr "" #: ../../Zotlabs/Widget/Appcategories.php:39 #: ../../Zotlabs/Widget/Tagcloud.php:25 ../../include/contact_widgets.php:91 -#: ../../include/taxonomy.php:227 ../../include/taxonomy.php:309 +#: ../../include/contact_widgets.php:132 ../../include/taxonomy.php:285 +#: ../../include/taxonomy.php:367 ../../include/taxonomy.php:387 msgid "Categories" msgstr "" #: ../../Zotlabs/Widget/Appcategories.php:42 ../../Zotlabs/Widget/Filer.php:31 #: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94 +#: ../../include/contact_widgets.php:135 msgid "Everything" msgstr "" @@ -8062,21 +8209,21 @@ msgstr "" msgid "Combined View" msgstr "" -#: ../../Zotlabs/Widget/Mailmenu.php:20 ../../include/nav.php:190 +#: ../../Zotlabs/Widget/Mailmenu.php:20 ../../include/nav.php:119 msgid "Inbox" msgstr "" -#: ../../Zotlabs/Widget/Mailmenu.php:25 ../../include/nav.php:191 +#: ../../Zotlabs/Widget/Mailmenu.php:25 ../../include/nav.php:120 msgid "Outbox" msgstr "" -#: ../../Zotlabs/Widget/Mailmenu.php:30 ../../include/nav.php:192 +#: ../../Zotlabs/Widget/Mailmenu.php:30 ../../include/nav.php:121 msgid "New Message" msgstr "" #: ../../Zotlabs/Widget/Chatroom_list.php:16 -#: ../../include/conversation.php:1813 ../../include/conversation.php:1816 -#: ../../include/nav.php:405 ../../include/nav.php:408 +#: ../../include/conversation.php:1847 ../../include/conversation.php:1850 +#: ../../include/nav.php:455 ../../include/nav.php:458 msgid "Chatrooms" msgstr "" @@ -8158,7 +8305,7 @@ msgstr "" msgid "Remove term" msgstr "" -#: ../../Zotlabs/Widget/Savedsearch.php:83 ../../include/features.php:297 +#: ../../Zotlabs/Widget/Savedsearch.php:83 ../../include/features.php:306 msgid "Saved Searches" msgstr "" @@ -8170,15 +8317,15 @@ msgstr "" msgid "Notes" msgstr "" -#: ../../Zotlabs/Widget/Wiki_pages.php:52 ../../addon/gitwiki/gitwiki.php:76 +#: ../../Zotlabs/Widget/Wiki_pages.php:47 ../../addon/gitwiki/gitwiki.php:76 msgid "Wiki Pages" msgstr "" -#: ../../Zotlabs/Widget/Wiki_pages.php:58 ../../addon/gitwiki/gitwiki.php:81 +#: ../../Zotlabs/Widget/Wiki_pages.php:53 ../../addon/gitwiki/gitwiki.php:81 msgid "Add new page" msgstr "" -#: ../../Zotlabs/Widget/Wiki_pages.php:59 ../../addon/gitwiki/gitwiki.php:82 +#: ../../Zotlabs/Widget/Wiki_pages.php:58 ../../addon/gitwiki/gitwiki.php:82 msgid "Page name" msgstr "" @@ -8199,7 +8346,7 @@ msgid "See more..." msgstr "" #: ../../Zotlabs/Widget/Filer.php:28 ../../include/contact_widgets.php:53 -#: ../../include/features.php:386 +#: ../../include/features.php:395 msgid "Saved Folders" msgstr "" @@ -8219,7 +8366,7 @@ msgstr "" msgid "DB updates" msgstr "" -#: ../../Zotlabs/Widget/Admin.php:55 ../../include/nav.php:209 +#: ../../Zotlabs/Widget/Admin.php:55 ../../include/nav.php:224 msgid "Admin" msgstr "" @@ -8259,7 +8406,7 @@ msgstr "" msgid "Connected apps" msgstr "" -#: ../../Zotlabs/Widget/Settings_menu.php:100 ../../include/features.php:149 +#: ../../Zotlabs/Widget/Settings_menu.php:100 ../../include/features.php:158 msgid "Permission Groups" msgstr "" @@ -8271,151 +8418,289 @@ msgstr "" msgid "Bookmarked Chatrooms" msgstr "" +#: ../../Zotlabs/Widget/Notifications.php:16 +msgid "New Network Activity" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:17 +msgid "New Network Activity Notifications" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:20 ../../include/nav.php:99 +msgid "View your network activity" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:24 +msgid "Mark all notifications read" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:32 +msgid "New Home Activity" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:33 +msgid "New Home Activity Notifications" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:36 +msgid "View your home activity" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:40 +#: ../../Zotlabs/Widget/Notifications.php:136 +msgid "Mark all notifications seen" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:48 +msgid "New Mails" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:49 +msgid "New Mails Notifications" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:52 +msgid "View your private mails" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:56 +msgid "Mark all messages seen" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:64 +msgid "New Events" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:65 +msgid "New Events Notifications" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:68 ../../include/nav.php:125 +msgid "View events" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:72 ../../include/nav.php:126 +msgid "Mark all events seen" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:81 +msgid "New Connections Notifications" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:84 +msgid "View all connections" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:92 +msgid "New Files" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:93 +msgid "New Files Notifications" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:100 +#: ../../Zotlabs/Widget/Notifications.php:101 ../../include/nav.php:112 +msgid "Notices" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:104 +msgid "View all notices" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:108 +msgid "Mark all notices seen" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:118 +msgid "New Registrations" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:119 +msgid "New Registrations Notifications" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:129 +msgid "Public Stream Notifications" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:132 +msgid "View the public stream" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:143 +#: ../../include/conversation.php:871 ../../include/nav.php:305 +msgid "Loading..." +msgstr "" + #: ../../util/nconfig.php:34 msgid "Source channel not found." msgstr "" -#: ../../boot.php:1578 +#: ../../boot.php:1619 msgid "Create an account to access services and applications" msgstr "" -#: ../../boot.php:1597 ../../include/nav.php:99 ../../include/nav.php:123 -#: ../../include/nav.php:140 +#: ../../boot.php:1638 ../../include/nav.php:138 ../../include/nav.php:167 +#: ../../include/nav.php:184 msgid "Logout" msgstr "" -#: ../../boot.php:1600 +#: ../../boot.php:1642 msgid "Login/Email" msgstr "" -#: ../../boot.php:1601 +#: ../../boot.php:1643 msgid "Password" msgstr "" -#: ../../boot.php:1602 +#: ../../boot.php:1644 msgid "Remember me" msgstr "" -#: ../../boot.php:1605 +#: ../../boot.php:1647 msgid "Forgot your password?" msgstr "" -#: ../../boot.php:2143 +#: ../../boot.php:2191 msgid "toggle mobile" msgstr "" -#: ../../boot.php:2296 +#: ../../boot.php:2344 #, php-format msgid "[$Projectname] Website SSL error for %s" msgstr "" -#: ../../boot.php:2301 +#: ../../boot.php:2349 msgid "Website SSL certificate is not valid. Please correct." msgstr "" -#: ../../boot.php:2420 +#: ../../boot.php:2468 #, php-format msgid "[$Projectname] Cron tasks not running on %s" msgstr "" -#: ../../boot.php:2425 +#: ../../boot.php:2473 msgid "Cron/Scheduled tasks not running." msgstr "" -#: ../../boot.php:2426 ../../include/datetime.php:286 +#: ../../boot.php:2474 ../../include/datetime.php:286 msgid "never" msgstr "" +#: ../../view/theme/redbasic_c/php/config.php:16 +#: ../../view/theme/redbasic_c/php/config.php:19 #: ../../view/theme/redbasic/php/config.php:16 #: ../../view/theme/redbasic/php/config.php:19 msgid "Focus (Hubzilla default)" msgstr "" -#: ../../view/theme/redbasic/php/config.php:99 +#: ../../view/theme/redbasic_c/php/config.php:99 +#: ../../view/theme/redbasic/php/config.php:97 msgid "Theme settings" msgstr "" -#: ../../view/theme/redbasic/php/config.php:100 +#: ../../view/theme/redbasic_c/php/config.php:100 +#: ../../view/theme/redbasic/php/config.php:98 msgid "Narrow navbar" msgstr "" -#: ../../view/theme/redbasic/php/config.php:101 +#: ../../view/theme/redbasic_c/php/config.php:101 +#: ../../view/theme/redbasic/php/config.php:99 msgid "Navigation bar background color" msgstr "" -#: ../../view/theme/redbasic/php/config.php:102 +#: ../../view/theme/redbasic_c/php/config.php:102 +#: ../../view/theme/redbasic/php/config.php:100 msgid "Navigation bar icon color " msgstr "" -#: ../../view/theme/redbasic/php/config.php:103 +#: ../../view/theme/redbasic_c/php/config.php:103 +#: ../../view/theme/redbasic/php/config.php:101 msgid "Navigation bar active icon color " msgstr "" -#: ../../view/theme/redbasic/php/config.php:104 +#: ../../view/theme/redbasic_c/php/config.php:104 +#: ../../view/theme/redbasic/php/config.php:102 msgid "Link color" msgstr "" -#: ../../view/theme/redbasic/php/config.php:105 +#: ../../view/theme/redbasic_c/php/config.php:105 +#: ../../view/theme/redbasic/php/config.php:103 msgid "Set font-color for banner" msgstr "" -#: ../../view/theme/redbasic/php/config.php:106 +#: ../../view/theme/redbasic_c/php/config.php:106 +#: ../../view/theme/redbasic/php/config.php:104 msgid "Set the background color" msgstr "" -#: ../../view/theme/redbasic/php/config.php:107 +#: ../../view/theme/redbasic_c/php/config.php:107 +#: ../../view/theme/redbasic/php/config.php:105 msgid "Set the background image" msgstr "" -#: ../../view/theme/redbasic/php/config.php:108 +#: ../../view/theme/redbasic_c/php/config.php:108 +#: ../../view/theme/redbasic/php/config.php:106 msgid "Set the background color of items" msgstr "" -#: ../../view/theme/redbasic/php/config.php:109 +#: ../../view/theme/redbasic_c/php/config.php:109 +#: ../../view/theme/redbasic/php/config.php:107 msgid "Set the background color of comments" msgstr "" -#: ../../view/theme/redbasic/php/config.php:110 +#: ../../view/theme/redbasic_c/php/config.php:110 +#: ../../view/theme/redbasic/php/config.php:108 msgid "Set font-size for the entire application" msgstr "" -#: ../../view/theme/redbasic/php/config.php:110 +#: ../../view/theme/redbasic_c/php/config.php:110 +#: ../../view/theme/redbasic/php/config.php:108 msgid "Examples: 1rem, 100%, 16px" msgstr "" -#: ../../view/theme/redbasic/php/config.php:111 +#: ../../view/theme/redbasic_c/php/config.php:111 +#: ../../view/theme/redbasic/php/config.php:109 msgid "Set font-color for posts and comments" msgstr "" -#: ../../view/theme/redbasic/php/config.php:112 +#: ../../view/theme/redbasic_c/php/config.php:112 +#: ../../view/theme/redbasic/php/config.php:110 msgid "Set radius of corners" msgstr "" -#: ../../view/theme/redbasic/php/config.php:112 +#: ../../view/theme/redbasic_c/php/config.php:112 +#: ../../view/theme/redbasic/php/config.php:110 msgid "Example: 4px" msgstr "" -#: ../../view/theme/redbasic/php/config.php:113 +#: ../../view/theme/redbasic_c/php/config.php:113 +#: ../../view/theme/redbasic/php/config.php:111 msgid "Set shadow depth of photos" msgstr "" -#: ../../view/theme/redbasic/php/config.php:114 +#: ../../view/theme/redbasic_c/php/config.php:114 +#: ../../view/theme/redbasic/php/config.php:112 msgid "Set maximum width of content region in pixel" msgstr "" -#: ../../view/theme/redbasic/php/config.php:114 +#: ../../view/theme/redbasic_c/php/config.php:114 +#: ../../view/theme/redbasic/php/config.php:112 msgid "Leave empty for default width" msgstr "" -#: ../../view/theme/redbasic/php/config.php:115 +#: ../../view/theme/redbasic_c/php/config.php:115 msgid "Left align page content" msgstr "" -#: ../../view/theme/redbasic/php/config.php:116 +#: ../../view/theme/redbasic_c/php/config.php:116 +#: ../../view/theme/redbasic/php/config.php:113 msgid "Set size of conversation author photo" msgstr "" -#: ../../view/theme/redbasic/php/config.php:117 +#: ../../view/theme/redbasic_c/php/config.php:117 +#: ../../view/theme/redbasic/php/config.php:114 msgid "Set size of followup author photos" msgstr "" @@ -8556,30 +8841,30 @@ msgstr "" msgid "Skeleton Settings" msgstr "" -#: ../../addon/gnusoc/gnusoc.php:200 +#: ../../addon/gnusoc/gnusoc.php:243 msgid "GNU-Social Protocol Settings updated." msgstr "" -#: ../../addon/gnusoc/gnusoc.php:219 +#: ../../addon/gnusoc/gnusoc.php:262 msgid "" "The GNU-Social protocol does not support location independence. Connections " "you make within that network may be unreachable from alternate channel " "locations." msgstr "" -#: ../../addon/gnusoc/gnusoc.php:222 +#: ../../addon/gnusoc/gnusoc.php:265 msgid "Enable the GNU-Social protocol for this channel" msgstr "" -#: ../../addon/gnusoc/gnusoc.php:226 +#: ../../addon/gnusoc/gnusoc.php:269 msgid "GNU-Social Protocol Settings" msgstr "" -#: ../../addon/gnusoc/gnusoc.php:417 +#: ../../addon/gnusoc/gnusoc.php:460 msgid "Follow" msgstr "" -#: ../../addon/gnusoc/gnusoc.php:420 +#: ../../addon/gnusoc/gnusoc.php:463 #, php-format msgid "%1$s is now following %2$s" msgstr "" @@ -8625,8 +8910,8 @@ msgstr "" msgid "Page to load after image selection." msgstr "" -#: ../../addon/openclipatar/openclipatar.php:58 ../../include/channel.php:1063 -#: ../../include/nav.php:107 +#: ../../addon/openclipatar/openclipatar.php:58 ../../include/channel.php:1266 +#: ../../include/nav.php:146 msgid "Edit Profile" msgstr "" @@ -8699,6 +8984,10 @@ msgstr "" msgid "Profile photo updated successfully." msgstr "" +#: ../../addon/zotvi/zot6.php:25 ../../include/zot.php:3983 +msgid "invalid target signature" +msgstr "" + #: ../../addon/adultphotoflag/adultphotoflag.php:24 msgid "Flag Adult Photos" msgstr "" @@ -9160,17 +9449,17 @@ msgstr "" msgid "OpenID protocol error. No ID returned." msgstr "" -#: ../../addon/openid/Mod_Openid.php:188 ../../include/auth.php:286 +#: ../../addon/openid/Mod_Openid.php:188 ../../include/auth.php:289 msgid "Login failed." msgstr "" #: ../../addon/openid/Mod_Id.php:85 ../../include/selectors.php:49 -#: ../../include/selectors.php:66 ../../include/channel.php:1230 +#: ../../include/selectors.php:66 ../../include/channel.php:1432 msgid "Male" msgstr "" #: ../../addon/openid/Mod_Id.php:87 ../../include/selectors.php:49 -#: ../../include/selectors.php:66 ../../include/channel.php:1228 +#: ../../include/selectors.php:66 ../../include/channel.php:1430 msgid "Female" msgstr "" @@ -9357,38 +9646,38 @@ msgstr "" msgid "declared undying love for" msgstr "" -#: ../../addon/diaspora/diaspora.php:715 +#: ../../addon/diaspora/diaspora.php:763 msgid "Diaspora Protocol Settings updated." msgstr "" -#: ../../addon/diaspora/diaspora.php:734 +#: ../../addon/diaspora/diaspora.php:782 msgid "" "The Diaspora protocol does not support location independence. Connections " "you make within that network may be unreachable from alternate channel " "locations." msgstr "" -#: ../../addon/diaspora/diaspora.php:737 +#: ../../addon/diaspora/diaspora.php:785 msgid "Enable the Diaspora protocol for this channel" msgstr "" -#: ../../addon/diaspora/diaspora.php:741 +#: ../../addon/diaspora/diaspora.php:789 msgid "Allow any Diaspora member to comment on your public posts" msgstr "" -#: ../../addon/diaspora/diaspora.php:745 +#: ../../addon/diaspora/diaspora.php:793 msgid "Prevent your hashtags from being redirected to other sites" msgstr "" -#: ../../addon/diaspora/diaspora.php:749 +#: ../../addon/diaspora/diaspora.php:797 msgid "Sign and forward posts and comments with no existing Diaspora signature" msgstr "" -#: ../../addon/diaspora/diaspora.php:754 +#: ../../addon/diaspora/diaspora.php:802 msgid "Followed hashtags (comma separated, do not include the #)" msgstr "" -#: ../../addon/diaspora/diaspora.php:759 +#: ../../addon/diaspora/diaspora.php:807 msgid "Diaspora Protocol Settings" msgstr "" @@ -9400,18 +9689,6 @@ msgstr "" msgid "Unable to create a unique channel address. Import failed." msgstr "" -#: ../../addon/gitwiki/Mod_Gitwiki.php:107 -msgid "Error retrieving wiki" -msgstr "" - -#: ../../addon/gitwiki/Mod_Gitwiki.php:114 -msgid "Error creating zip file export folder" -msgstr "" - -#: ../../addon/gitwiki/Mod_Gitwiki.php:132 -msgid "Error downloading wiki: " -msgstr "" - #: ../../addon/testdrive/testdrive.php:104 #, php-format msgid "Your account on %s will expire in a few days." @@ -9449,6 +9726,66 @@ msgstr "" msgid "PHP post_max_size (must be larger than upload_max_filesize): " msgstr "" +#: ../../addon/gravatar/gravatar.php:123 +msgid "generic profile image" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:124 +msgid "random geometric pattern" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:125 +msgid "monster face" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:126 +msgid "computer generated face" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:127 +msgid "retro arcade style face" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:128 +msgid "Hub default profile photo" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:143 +msgid "Information" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:143 +msgid "" +"Libravatar addon is installed, too. Please disable Libravatar addon or this " +"Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if " +"nothing was found at Libravatar." +msgstr "" + +#: ../../addon/gravatar/gravatar.php:150 ../../addon/msgfooter/msgfooter.php:46 +#: ../../addon/xmpp/xmpp.php:91 +msgid "Save Settings" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:151 +msgid "Default avatar image" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:151 +msgid "Select default avatar image if none was found at Gravatar. See README" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:152 +msgid "Rating of images" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:152 +msgid "Select the appropriate avatar rating for your site. See README" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:165 +msgid "Gravatar settings updated." +msgstr "" + #: ../../addon/visage/visage.php:93 msgid "Recent Channel/Profile Viewers" msgstr "" @@ -9555,10 +9892,6 @@ msgstr "" msgid "Include a marker on the map." msgstr "" -#: ../../addon/msgfooter/msgfooter.php:46 ../../addon/xmpp/xmpp.php:91 -msgid "Save Settings" -msgstr "" - #: ../../addon/msgfooter/msgfooter.php:47 msgid "text to include in all outgoing posts from this site" msgstr "" @@ -9599,8 +9932,8 @@ msgstr "" msgid "Hubzilla to Friendica Post Settings" msgstr "" -#: ../../addon/jappixmini/jappixmini.php:305 ../../include/channel.php:1154 -#: ../../include/channel.php:1317 +#: ../../addon/jappixmini/jappixmini.php:305 ../../include/channel.php:1357 +#: ../../include/channel.php:1519 msgid "Status:" msgstr "" @@ -9765,6 +10098,30 @@ msgstr "" msgid "Friendica Login Password" msgstr "" +#: ../../addon/pubcrawl/as.php:1076 ../../addon/pubcrawl/as.php:1160 +#: ../../addon/pubcrawl/as.php:1332 ../../include/network.php:1705 +msgid "ActivityPub" +msgstr "" + +#: ../../addon/pubcrawl/pubcrawl.php:1032 +msgid "ActivityPub Protocol Settings updated." +msgstr "" + +#: ../../addon/pubcrawl/pubcrawl.php:1041 +msgid "" +"The ActivityPub protocol does not support location independence. Connections " +"you make within that network may be unreachable from alternate channel " +"locations." +msgstr "" + +#: ../../addon/pubcrawl/pubcrawl.php:1044 +msgid "Enable the ActivityPub protocol for this channel" +msgstr "" + +#: ../../addon/pubcrawl/pubcrawl.php:1049 +msgid "ActivityPub Protocol Settings" +msgstr "" + #: ../../addon/donate/donate.php:21 msgid "Project Servers and Resources" msgstr "" @@ -10126,43 +10483,39 @@ msgstr "" msgid "Enter some text" msgstr "" -#: ../../addon/chess/chess.php:276 ../../addon/chess/chess.php:433 +#: ../../addon/chess/chess.php:278 ../../addon/chess/chess.php:465 msgid "Invalid game." msgstr "" -#: ../../addon/chess/chess.php:282 ../../addon/chess/chess.php:439 +#: ../../addon/chess/chess.php:284 ../../addon/chess/chess.php:471 msgid "You are not a player in this game." msgstr "" -#: ../../addon/chess/chess.php:315 +#: ../../addon/chess/chess.php:340 msgid "You must be a local channel to create a game." msgstr "" -#: ../../addon/chess/chess.php:333 +#: ../../addon/chess/chess.php:358 msgid "You must select one opponent that is not yourself." msgstr "" -#: ../../addon/chess/chess.php:336 -msgid "Creating new game..." -msgstr "" - -#: ../../addon/chess/chess.php:342 +#: ../../addon/chess/chess.php:367 msgid "You must select white or black." msgstr "" -#: ../../addon/chess/chess.php:349 +#: ../../addon/chess/chess.php:375 msgid "Error creating new game." msgstr "" -#: ../../addon/chess/chess.php:381 ../../include/channel.php:914 +#: ../../addon/chess/chess.php:409 ../../include/channel.php:1117 msgid "Requested channel is not available." msgstr "" -#: ../../addon/chess/chess.php:395 +#: ../../addon/chess/chess.php:423 msgid "You must select a local channel /chess/channelname" msgstr "" -#: ../../addon/chess/chess.php:923 +#: ../../addon/chess/chess.php:969 msgid "Enable notifications" msgstr "" @@ -10176,17 +10529,13 @@ msgstr "" #: ../../addon/twitter/twitter.php:183 msgid "" -"No consumer key pair for Twitter found. Please contact your site " -"administrator." +"<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project only)" msgstr "" #: ../../addon/twitter/twitter.php:205 msgid "" -"At this Hubzilla instance the Twitter plugin was enabled but you have not " -"yet connected your account to your Twitter account. To do so click the " -"button below to get a PIN from Twitter which you have to copy into the input " -"box below and submit the form. Only your <strong>public</strong> posts will " -"be posted to Twitter." +"Please indicate if you would like your first name or full name (or nothing) " +"to appear in our sponsor listing" msgstr "" #: ../../addon/twitter/twitter.php:207 @@ -10199,10 +10548,11 @@ msgstr "" #: ../../addon/twitter/twitter.php:237 msgid "" -"<strong>Note:</strong> Due your privacy settings (<em>Hide your profile " -"details from unknown viewers?</em>) the link potentially included in public " -"postings relayed to Twitter will lead the visitor to a blank page informing " -"the visitor that the access to your profile has been restricted." +"This is a fairly comprehensive and complete guitar chord dictionary which " +"will list most of the available ways to play a certain chord, starting from " +"the base of the fingerboard up to a few frets beyond the twelfth fret " +"(beyond which everything repeats). A couple of non-standard tunings are " +"provided for the benefit of slide players, etc." msgstr "" #: ../../addon/twitter/twitter.php:242 @@ -10211,8 +10561,8 @@ msgstr "" #: ../../addon/twitter/twitter.php:242 msgid "" -"If enabled your public postings can be posted to the associated Twitter " -"account" +"Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, " +"E7b13b11 ..." msgstr "" #: ../../addon/twitter/twitter.php:246 @@ -10761,11 +11111,6 @@ msgstr "" msgid "Send email to all members" msgstr "" -#: ../../addon/hubwall/hubwall.php:33 -#, php-format -msgid "$1%s Administrator" -msgstr "" - #: ../../addon/hubwall/hubwall.php:73 #, php-format msgid "%1$d of %2$d messages sent." @@ -10839,11 +11184,11 @@ msgstr "" msgid "Hermaphrodite" msgstr "" -#: ../../include/selectors.php:49 ../../include/channel.php:1234 +#: ../../include/selectors.php:49 ../../include/channel.php:1436 msgid "Neuter" msgstr "" -#: ../../include/selectors.php:49 ../../include/channel.php:1236 +#: ../../include/selectors.php:49 ../../include/channel.php:1438 msgid "Non-specific" msgstr "" @@ -11033,282 +11378,274 @@ msgstr "" msgid "%1$s poked %2$s" msgstr "" -#: ../../include/conversation.php:239 ../../include/text.php:1096 -#: ../../include/text.php:1101 +#: ../../include/conversation.php:239 ../../include/text.php:1104 +#: ../../include/text.php:1109 msgid "poked" msgstr "" -#: ../../include/conversation.php:688 +#: ../../include/conversation.php:720 #, php-format msgid "View %s's profile @ %s" msgstr "" -#: ../../include/conversation.php:708 +#: ../../include/conversation.php:740 msgid "Categories:" msgstr "" -#: ../../include/conversation.php:709 +#: ../../include/conversation.php:741 msgid "Filed under:" msgstr "" -#: ../../include/conversation.php:734 +#: ../../include/conversation.php:766 msgid "View in context" msgstr "" -#: ../../include/conversation.php:831 +#: ../../include/conversation.php:867 msgid "remove" msgstr "" -#: ../../include/conversation.php:835 ../../include/nav.php:262 -msgid "Loading..." -msgstr "" - -#: ../../include/conversation.php:836 +#: ../../include/conversation.php:872 msgid "Delete Selected Items" msgstr "" -#: ../../include/conversation.php:879 +#: ../../include/conversation.php:915 msgid "View Source" msgstr "" -#: ../../include/conversation.php:889 +#: ../../include/conversation.php:925 msgid "Follow Thread" msgstr "" -#: ../../include/conversation.php:898 +#: ../../include/conversation.php:934 msgid "Unfollow Thread" msgstr "" -#: ../../include/conversation.php:989 +#: ../../include/conversation.php:1025 msgid "Activity/Posts" msgstr "" -#: ../../include/conversation.php:1009 +#: ../../include/conversation.php:1045 msgid "Edit Connection" msgstr "" -#: ../../include/conversation.php:1019 +#: ../../include/conversation.php:1055 msgid "Message" msgstr "" -#: ../../include/conversation.php:1153 +#: ../../include/conversation.php:1189 #, php-format msgid "%s likes this." msgstr "" -#: ../../include/conversation.php:1153 +#: ../../include/conversation.php:1189 #, php-format msgid "%s doesn't like this." msgstr "" -#: ../../include/conversation.php:1157 +#: ../../include/conversation.php:1193 #, php-format msgid "<span %1$s>%2$d people</span> like this." msgid_plural "<span %1$s>%2$d people</span> like this." msgstr[0] "" msgstr[1] "" -#: ../../include/conversation.php:1159 +#: ../../include/conversation.php:1195 #, php-format msgid "<span %1$s>%2$d people</span> don't like this." msgid_plural "<span %1$s>%2$d people</span> don't like this." msgstr[0] "" msgstr[1] "" -#: ../../include/conversation.php:1165 +#: ../../include/conversation.php:1201 msgid "and" msgstr "" -#: ../../include/conversation.php:1168 +#: ../../include/conversation.php:1204 #, php-format msgid ", and %d other people" msgid_plural ", and %d other people" msgstr[0] "" msgstr[1] "" -#: ../../include/conversation.php:1169 +#: ../../include/conversation.php:1205 #, php-format msgid "%s like this." msgstr "" -#: ../../include/conversation.php:1169 +#: ../../include/conversation.php:1205 #, php-format msgid "%s don't like this." msgstr "" -#: ../../include/conversation.php:1212 +#: ../../include/conversation.php:1248 msgid "Set your location" msgstr "" -#: ../../include/conversation.php:1213 +#: ../../include/conversation.php:1249 msgid "Clear browser location" msgstr "" -#: ../../include/conversation.php:1261 +#: ../../include/conversation.php:1297 msgid "Tag term:" msgstr "" -#: ../../include/conversation.php:1262 +#: ../../include/conversation.php:1298 msgid "Where are you right now?" msgstr "" -#: ../../include/conversation.php:1267 +#: ../../include/conversation.php:1303 msgid "Choose a different album..." msgstr "" -#: ../../include/conversation.php:1271 +#: ../../include/conversation.php:1307 msgid "Comments enabled" msgstr "" -#: ../../include/conversation.php:1272 +#: ../../include/conversation.php:1308 msgid "Comments disabled" msgstr "" -#: ../../include/conversation.php:1310 +#: ../../include/conversation.php:1355 msgid "Page link name" msgstr "" -#: ../../include/conversation.php:1313 +#: ../../include/conversation.php:1358 msgid "Post as" msgstr "" -#: ../../include/conversation.php:1327 +#: ../../include/conversation.php:1372 msgid "Toggle voting" msgstr "" -#: ../../include/conversation.php:1330 +#: ../../include/conversation.php:1375 msgid "Disable comments" msgstr "" -#: ../../include/conversation.php:1331 +#: ../../include/conversation.php:1376 msgid "Toggle comments" msgstr "" -#: ../../include/conversation.php:1339 +#: ../../include/conversation.php:1384 msgid "Categories (optional, comma-separated list)" msgstr "" -#: ../../include/conversation.php:1362 +#: ../../include/conversation.php:1407 msgid "Other networks and post services" msgstr "" -#: ../../include/conversation.php:1368 +#: ../../include/conversation.php:1413 msgid "Set publish date" msgstr "" -#: ../../include/conversation.php:1631 -msgid "Discover" -msgstr "" - -#: ../../include/conversation.php:1634 -msgid "Imported public streams" -msgstr "" - -#: ../../include/conversation.php:1639 +#: ../../include/conversation.php:1673 msgid "Commented Order" msgstr "" -#: ../../include/conversation.php:1642 +#: ../../include/conversation.php:1676 msgid "Sort by Comment Date" msgstr "" -#: ../../include/conversation.php:1646 +#: ../../include/conversation.php:1680 msgid "Posted Order" msgstr "" -#: ../../include/conversation.php:1649 +#: ../../include/conversation.php:1683 msgid "Sort by Post Date" msgstr "" -#: ../../include/conversation.php:1657 +#: ../../include/conversation.php:1691 msgid "Posts that mention or involve you" msgstr "" -#: ../../include/conversation.php:1666 +#: ../../include/conversation.php:1700 msgid "Activity Stream - by date" msgstr "" -#: ../../include/conversation.php:1672 +#: ../../include/conversation.php:1706 msgid "Starred" msgstr "" -#: ../../include/conversation.php:1675 +#: ../../include/conversation.php:1709 msgid "Favourite Posts" msgstr "" -#: ../../include/conversation.php:1682 +#: ../../include/conversation.php:1716 msgid "Spam" msgstr "" -#: ../../include/conversation.php:1685 +#: ../../include/conversation.php:1719 msgid "Posts flagged as SPAM" msgstr "" -#: ../../include/conversation.php:1760 ../../include/nav.php:352 +#: ../../include/conversation.php:1794 ../../include/nav.php:402 msgid "Status Messages and Posts" msgstr "" -#: ../../include/conversation.php:1773 ../../include/nav.php:365 +#: ../../include/conversation.php:1807 ../../include/nav.php:415 msgid "Profile Details" msgstr "" -#: ../../include/conversation.php:1783 ../../include/nav.php:375 -#: ../../include/photos.php:525 +#: ../../include/conversation.php:1817 ../../include/nav.php:425 +#: ../../include/photos.php:600 msgid "Photo Albums" msgstr "" -#: ../../include/conversation.php:1791 ../../include/nav.php:383 +#: ../../include/conversation.php:1825 ../../include/nav.php:433 msgid "Files and Storage" msgstr "" -#: ../../include/conversation.php:1827 ../../include/nav.php:418 +#: ../../include/conversation.php:1862 ../../include/nav.php:468 msgid "Bookmarks" msgstr "" -#: ../../include/conversation.php:1830 ../../include/nav.php:421 +#: ../../include/conversation.php:1865 ../../include/nav.php:471 msgid "Saved Bookmarks" msgstr "" -#: ../../include/conversation.php:1841 ../../include/nav.php:432 +#: ../../include/conversation.php:1876 ../../include/nav.php:482 +msgid "View Cards" +msgstr "" + +#: ../../include/conversation.php:1887 ../../include/nav.php:494 msgid "View Webpages" msgstr "" -#: ../../include/conversation.php:1910 +#: ../../include/conversation.php:1956 msgctxt "noun" msgid "Attending" msgid_plural "Attending" msgstr[0] "" msgstr[1] "" -#: ../../include/conversation.php:1913 +#: ../../include/conversation.php:1959 msgctxt "noun" msgid "Not Attending" msgid_plural "Not Attending" msgstr[0] "" msgstr[1] "" -#: ../../include/conversation.php:1916 +#: ../../include/conversation.php:1962 msgctxt "noun" msgid "Undecided" msgid_plural "Undecided" msgstr[0] "" msgstr[1] "" -#: ../../include/conversation.php:1919 +#: ../../include/conversation.php:1965 msgctxt "noun" msgid "Agree" msgid_plural "Agrees" msgstr[0] "" msgstr[1] "" -#: ../../include/conversation.php:1922 +#: ../../include/conversation.php:1968 msgctxt "noun" msgid "Disagree" msgid_plural "Disagrees" msgstr[0] "" msgstr[1] "" -#: ../../include/conversation.php:1925 +#: ../../include/conversation.php:1971 msgctxt "noun" msgid "Abstain" msgid_plural "Abstains" @@ -11369,328 +11706,340 @@ msgstr "" msgid "newer" msgstr "" -#: ../../include/text.php:939 +#: ../../include/text.php:947 msgid "No connections" msgstr "" -#: ../../include/text.php:964 +#: ../../include/text.php:972 #, php-format msgid "View all %s connections" msgstr "" -#: ../../include/text.php:1096 ../../include/text.php:1101 +#: ../../include/text.php:1104 ../../include/text.php:1109 msgid "poke" msgstr "" -#: ../../include/text.php:1102 +#: ../../include/text.php:1110 msgid "ping" msgstr "" -#: ../../include/text.php:1102 +#: ../../include/text.php:1110 msgid "pinged" msgstr "" -#: ../../include/text.php:1103 +#: ../../include/text.php:1111 msgid "prod" msgstr "" -#: ../../include/text.php:1103 +#: ../../include/text.php:1111 msgid "prodded" msgstr "" -#: ../../include/text.php:1104 +#: ../../include/text.php:1112 msgid "slap" msgstr "" -#: ../../include/text.php:1104 +#: ../../include/text.php:1112 msgid "slapped" msgstr "" -#: ../../include/text.php:1105 +#: ../../include/text.php:1113 msgid "finger" msgstr "" -#: ../../include/text.php:1105 +#: ../../include/text.php:1113 msgid "fingered" msgstr "" -#: ../../include/text.php:1106 +#: ../../include/text.php:1114 msgid "rebuff" msgstr "" -#: ../../include/text.php:1106 +#: ../../include/text.php:1114 msgid "rebuffed" msgstr "" -#: ../../include/text.php:1118 +#: ../../include/text.php:1126 msgid "happy" msgstr "" -#: ../../include/text.php:1119 +#: ../../include/text.php:1127 msgid "sad" msgstr "" -#: ../../include/text.php:1120 +#: ../../include/text.php:1128 msgid "mellow" msgstr "" -#: ../../include/text.php:1121 +#: ../../include/text.php:1129 msgid "tired" msgstr "" -#: ../../include/text.php:1122 +#: ../../include/text.php:1130 msgid "perky" msgstr "" -#: ../../include/text.php:1123 +#: ../../include/text.php:1131 msgid "angry" msgstr "" -#: ../../include/text.php:1124 +#: ../../include/text.php:1132 msgid "stupefied" msgstr "" -#: ../../include/text.php:1125 +#: ../../include/text.php:1133 msgid "puzzled" msgstr "" -#: ../../include/text.php:1126 +#: ../../include/text.php:1134 msgid "interested" msgstr "" -#: ../../include/text.php:1127 +#: ../../include/text.php:1135 msgid "bitter" msgstr "" -#: ../../include/text.php:1128 +#: ../../include/text.php:1136 msgid "cheerful" msgstr "" -#: ../../include/text.php:1129 +#: ../../include/text.php:1137 msgid "alive" msgstr "" -#: ../../include/text.php:1130 +#: ../../include/text.php:1138 msgid "annoyed" msgstr "" -#: ../../include/text.php:1131 +#: ../../include/text.php:1139 msgid "anxious" msgstr "" -#: ../../include/text.php:1132 +#: ../../include/text.php:1140 msgid "cranky" msgstr "" -#: ../../include/text.php:1133 +#: ../../include/text.php:1141 msgid "disturbed" msgstr "" -#: ../../include/text.php:1134 +#: ../../include/text.php:1142 msgid "frustrated" msgstr "" -#: ../../include/text.php:1135 +#: ../../include/text.php:1143 msgid "depressed" msgstr "" -#: ../../include/text.php:1136 +#: ../../include/text.php:1144 msgid "motivated" msgstr "" -#: ../../include/text.php:1137 +#: ../../include/text.php:1145 msgid "relaxed" msgstr "" -#: ../../include/text.php:1138 +#: ../../include/text.php:1146 msgid "surprised" msgstr "" -#: ../../include/text.php:1312 ../../include/js_strings.php:70 +#: ../../include/text.php:1320 ../../include/js_strings.php:70 msgid "Monday" msgstr "" -#: ../../include/text.php:1312 ../../include/js_strings.php:71 +#: ../../include/text.php:1320 ../../include/js_strings.php:71 msgid "Tuesday" msgstr "" -#: ../../include/text.php:1312 ../../include/js_strings.php:72 +#: ../../include/text.php:1320 ../../include/js_strings.php:72 msgid "Wednesday" msgstr "" -#: ../../include/text.php:1312 ../../include/js_strings.php:73 +#: ../../include/text.php:1320 ../../include/js_strings.php:73 msgid "Thursday" msgstr "" -#: ../../include/text.php:1312 ../../include/js_strings.php:74 +#: ../../include/text.php:1320 ../../include/js_strings.php:74 msgid "Friday" msgstr "" -#: ../../include/text.php:1312 ../../include/js_strings.php:75 +#: ../../include/text.php:1320 ../../include/js_strings.php:75 msgid "Saturday" msgstr "" -#: ../../include/text.php:1312 ../../include/js_strings.php:69 +#: ../../include/text.php:1320 ../../include/js_strings.php:69 msgid "Sunday" msgstr "" -#: ../../include/text.php:1316 ../../include/js_strings.php:45 +#: ../../include/text.php:1324 ../../include/js_strings.php:45 msgid "January" msgstr "" -#: ../../include/text.php:1316 ../../include/js_strings.php:46 +#: ../../include/text.php:1324 ../../include/js_strings.php:46 msgid "February" msgstr "" -#: ../../include/text.php:1316 ../../include/js_strings.php:47 +#: ../../include/text.php:1324 ../../include/js_strings.php:47 msgid "March" msgstr "" -#: ../../include/text.php:1316 ../../include/js_strings.php:48 +#: ../../include/text.php:1324 ../../include/js_strings.php:48 msgid "April" msgstr "" -#: ../../include/text.php:1316 +#: ../../include/text.php:1324 msgid "May" msgstr "" -#: ../../include/text.php:1316 ../../include/js_strings.php:50 +#: ../../include/text.php:1324 ../../include/js_strings.php:50 msgid "June" msgstr "" -#: ../../include/text.php:1316 ../../include/js_strings.php:51 +#: ../../include/text.php:1324 ../../include/js_strings.php:51 msgid "July" msgstr "" -#: ../../include/text.php:1316 ../../include/js_strings.php:52 +#: ../../include/text.php:1324 ../../include/js_strings.php:52 msgid "August" msgstr "" -#: ../../include/text.php:1316 ../../include/js_strings.php:53 +#: ../../include/text.php:1324 ../../include/js_strings.php:53 msgid "September" msgstr "" -#: ../../include/text.php:1316 ../../include/js_strings.php:54 +#: ../../include/text.php:1324 ../../include/js_strings.php:54 msgid "October" msgstr "" -#: ../../include/text.php:1316 ../../include/js_strings.php:55 +#: ../../include/text.php:1324 ../../include/js_strings.php:55 msgid "November" msgstr "" -#: ../../include/text.php:1316 ../../include/js_strings.php:56 +#: ../../include/text.php:1324 ../../include/js_strings.php:56 msgid "December" msgstr "" -#: ../../include/text.php:1380 ../../include/text.php:1384 +#: ../../include/text.php:1388 ../../include/text.php:1392 msgid "Unknown Attachment" msgstr "" -#: ../../include/text.php:1386 ../../include/feedutils.php:780 +#: ../../include/text.php:1394 ../../include/feedutils.php:780 msgid "unknown" msgstr "" -#: ../../include/text.php:1422 +#: ../../include/text.php:1430 msgid "remove category" msgstr "" -#: ../../include/text.php:1496 +#: ../../include/text.php:1504 msgid "remove from file" msgstr "" -#: ../../include/text.php:1615 ../../include/message.php:12 +#: ../../include/text.php:1623 ../../include/message.php:12 msgid "Download binary/encrypted content" msgstr "" -#: ../../include/text.php:1774 ../../include/language.php:367 +#: ../../include/text.php:1782 ../../include/language.php:367 msgid "default" msgstr "" -#: ../../include/text.php:1782 +#: ../../include/text.php:1790 msgid "Page layout" msgstr "" -#: ../../include/text.php:1782 +#: ../../include/text.php:1790 msgid "You can create your own with the layouts tool" msgstr "" -#: ../../include/text.php:1810 +#: ../../include/text.php:1801 +msgid "HTML" +msgstr "" + +#: ../../include/text.php:1804 +msgid "Comanche Layout" +msgstr "" + +#: ../../include/text.php:1809 +msgid "PHP" +msgstr "" + +#: ../../include/text.php:1818 msgid "Page content type" msgstr "" -#: ../../include/text.php:1943 +#: ../../include/text.php:1951 msgid "activity" msgstr "" -#: ../../include/text.php:2006 -msgid "a-z, 0-9, -, _, and . only" +#: ../../include/text.php:2014 +msgid "a-z, 0-9, -, and _ only" msgstr "" -#: ../../include/text.php:2277 +#: ../../include/text.php:2285 msgid "Design Tools" msgstr "" -#: ../../include/text.php:2283 +#: ../../include/text.php:2291 msgid "Pages" msgstr "" -#: ../../include/text.php:2305 +#: ../../include/text.php:2313 msgid "Import website..." msgstr "" -#: ../../include/text.php:2306 +#: ../../include/text.php:2314 msgid "Select folder to import" msgstr "" -#: ../../include/text.php:2307 +#: ../../include/text.php:2315 msgid "Import from a zipped folder:" msgstr "" -#: ../../include/text.php:2308 +#: ../../include/text.php:2316 msgid "Import from cloud files:" msgstr "" -#: ../../include/text.php:2309 +#: ../../include/text.php:2317 msgid "/cloud/channel/path/to/folder" msgstr "" -#: ../../include/text.php:2310 +#: ../../include/text.php:2318 msgid "Enter path to website files" msgstr "" -#: ../../include/text.php:2311 +#: ../../include/text.php:2319 msgid "Select folder" msgstr "" -#: ../../include/text.php:2312 +#: ../../include/text.php:2320 msgid "Export website..." msgstr "" -#: ../../include/text.php:2313 +#: ../../include/text.php:2321 msgid "Export to a zip file" msgstr "" -#: ../../include/text.php:2314 +#: ../../include/text.php:2322 msgid "website.zip" msgstr "" -#: ../../include/text.php:2315 +#: ../../include/text.php:2323 msgid "Enter a name for the zip file." msgstr "" -#: ../../include/text.php:2316 +#: ../../include/text.php:2324 msgid "Export to cloud files" msgstr "" -#: ../../include/text.php:2317 +#: ../../include/text.php:2325 msgid "/path/to/export/folder" msgstr "" -#: ../../include/text.php:2318 +#: ../../include/text.php:2326 msgid "Enter a path to a cloud files destination." msgstr "" -#: ../../include/text.php:2319 +#: ../../include/text.php:2327 msgid "Specify folder" msgstr "" @@ -11729,47 +12078,49 @@ msgstr "" msgid "Advanced example: name=fred and country=iceland" msgstr "" -#: ../../include/contact_widgets.php:122 -#, php-format -msgid "%d connection in common" -msgid_plural "%d connections in common" -msgstr[0] "" -msgstr[1] "" +#: ../../include/contact_widgets.php:166 +msgid "Common Connections" +msgstr "" -#: ../../include/contact_widgets.php:127 -msgid "show more" +#: ../../include/contact_widgets.php:171 +#, php-format +msgid "View all %d common connections" msgstr "" -#: ../../include/markdown.php:139 ../../include/bbcode.php:332 +#: ../../include/markdown.php:139 ../../include/bbcode.php:337 #, php-format msgid "%1$s wrote the following %2$s %3$s" msgstr "" -#: ../../include/follow.php:26 +#: ../../include/follow.php:37 msgid "Channel is blocked on this site." msgstr "" -#: ../../include/follow.php:31 +#: ../../include/follow.php:42 msgid "Channel location missing." msgstr "" -#: ../../include/follow.php:73 +#: ../../include/follow.php:84 msgid "Response from remote channel was incomplete." msgstr "" -#: ../../include/follow.php:90 +#: ../../include/follow.php:101 msgid "Channel was deleted and no longer exists." msgstr "" -#: ../../include/follow.php:140 ../../include/follow.php:175 -msgid "Protocol disabled." +#: ../../include/follow.php:156 +msgid "Remote channel or protocol unavailable." msgstr "" -#: ../../include/follow.php:163 +#: ../../include/follow.php:179 msgid "Channel discovery failed." msgstr "" -#: ../../include/follow.php:186 +#: ../../include/follow.php:191 +msgid "Protocol disabled." +msgstr "" + +#: ../../include/follow.php:202 msgid "Cannot connect to yourself." msgstr "" @@ -12063,298 +12414,284 @@ msgstr "" msgid "Item was not found." msgstr "" -#: ../../include/attach.php:500 +#: ../../include/attach.php:505 msgid "No source file." msgstr "" -#: ../../include/attach.php:522 +#: ../../include/attach.php:527 msgid "Cannot locate file to replace" msgstr "" -#: ../../include/attach.php:540 +#: ../../include/attach.php:545 msgid "Cannot locate file to revise/update" msgstr "" -#: ../../include/attach.php:673 +#: ../../include/attach.php:680 #, php-format msgid "File exceeds size limit of %d" msgstr "" -#: ../../include/attach.php:687 +#: ../../include/attach.php:694 #, php-format msgid "You have reached your limit of %1$.0f Mbytes attachment storage." msgstr "" -#: ../../include/attach.php:857 +#: ../../include/attach.php:864 msgid "File upload failed. Possible system limit or action terminated." msgstr "" -#: ../../include/attach.php:870 +#: ../../include/attach.php:877 msgid "Stored file could not be verified. Upload failed." msgstr "" -#: ../../include/attach.php:925 ../../include/attach.php:941 +#: ../../include/attach.php:938 ../../include/attach.php:954 msgid "Path not available." msgstr "" -#: ../../include/attach.php:990 ../../include/attach.php:1155 +#: ../../include/attach.php:1003 ../../include/attach.php:1168 msgid "Empty pathname" msgstr "" -#: ../../include/attach.php:1016 +#: ../../include/attach.php:1029 msgid "duplicate filename or path" msgstr "" -#: ../../include/attach.php:1041 +#: ../../include/attach.php:1054 msgid "Path not found." msgstr "" -#: ../../include/attach.php:1109 +#: ../../include/attach.php:1122 msgid "mkdir failed." msgstr "" -#: ../../include/attach.php:1113 +#: ../../include/attach.php:1126 msgid "database storage failed." msgstr "" -#: ../../include/attach.php:1161 +#: ../../include/attach.php:1174 msgid "Empty path" msgstr "" -#: ../../include/security.php:117 -msgid "guest:" -msgstr "" - #: ../../include/security.php:531 msgid "" "The form security token was not correct. This probably happened because the " "form has been opened for too long (>3 hours) before submitting it." msgstr "" -#: ../../include/items.php:851 ../../include/items.php:903 +#: ../../include/items.php:857 ../../include/items.php:909 msgid "(Unknown)" msgstr "" -#: ../../include/items.php:1087 +#: ../../include/items.php:1093 msgid "Visible to anybody on the internet." msgstr "" -#: ../../include/items.php:1089 +#: ../../include/items.php:1095 msgid "Visible to you only." msgstr "" -#: ../../include/items.php:1091 +#: ../../include/items.php:1097 msgid "Visible to anybody in this network." msgstr "" -#: ../../include/items.php:1093 +#: ../../include/items.php:1099 msgid "Visible to anybody authenticated." msgstr "" -#: ../../include/items.php:1095 +#: ../../include/items.php:1101 #, php-format msgid "Visible to anybody on %s." msgstr "" -#: ../../include/items.php:1097 +#: ../../include/items.php:1103 msgid "Visible to all connections." msgstr "" -#: ../../include/items.php:1099 +#: ../../include/items.php:1105 msgid "Visible to approved connections." msgstr "" -#: ../../include/items.php:1101 +#: ../../include/items.php:1107 msgid "Visible to specific connections." msgstr "" -#: ../../include/items.php:3908 +#: ../../include/items.php:3957 msgid "Privacy group is empty." msgstr "" -#: ../../include/items.php:3915 +#: ../../include/items.php:3964 #, php-format msgid "Privacy group: %s" msgstr "" -#: ../../include/items.php:3927 +#: ../../include/items.php:3976 msgid "Connection not found." msgstr "" -#: ../../include/items.php:4280 +#: ../../include/items.php:4327 msgid "profile photo" msgstr "" -#: ../../include/items.php:4473 +#: ../../include/items.php:4520 #, php-format msgid "[Edited %s]" msgstr "" -#: ../../include/items.php:4473 +#: ../../include/items.php:4520 msgctxt "edit_activity" msgid "Post" msgstr "" -#: ../../include/items.php:4473 +#: ../../include/items.php:4520 msgctxt "edit_activity" msgid "Comment" msgstr "" -#: ../../include/channel.php:33 +#: ../../include/channel.php:34 msgid "Unable to obtain identity information from database" msgstr "" -#: ../../include/channel.php:68 +#: ../../include/channel.php:69 msgid "Empty name" msgstr "" -#: ../../include/channel.php:71 +#: ../../include/channel.php:72 msgid "Name too long" msgstr "" -#: ../../include/channel.php:182 +#: ../../include/channel.php:183 msgid "No account identifier" msgstr "" -#: ../../include/channel.php:194 +#: ../../include/channel.php:195 msgid "Nickname is required." msgstr "" -#: ../../include/channel.php:208 -msgid "Reserved nickname. Please choose another." -msgstr "" - -#: ../../include/channel.php:213 -msgid "" -"Nickname has unsupported characters or is already being used on this site." -msgstr "" - -#: ../../include/channel.php:272 +#: ../../include/channel.php:273 msgid "Unable to retrieve created identity" msgstr "" -#: ../../include/channel.php:344 +#: ../../include/channel.php:359 msgid "Default Profile" msgstr "" -#: ../../include/channel.php:1060 +#: ../../include/channel.php:512 ../../include/channel.php:601 +msgid "Unable to retrieve modified identity" +msgstr "" + +#: ../../include/channel.php:1263 msgid "Create New Profile" msgstr "" -#: ../../include/channel.php:1080 +#: ../../include/channel.php:1283 msgid "Visible to everybody" msgstr "" -#: ../../include/channel.php:1153 ../../include/channel.php:1273 +#: ../../include/channel.php:1356 ../../include/channel.php:1475 msgid "Gender:" msgstr "" -#: ../../include/channel.php:1155 ../../include/channel.php:1328 +#: ../../include/channel.php:1358 ../../include/channel.php:1530 msgid "Homepage:" msgstr "" -#: ../../include/channel.php:1156 +#: ../../include/channel.php:1359 msgid "Online Now" msgstr "" -#: ../../include/channel.php:1232 +#: ../../include/channel.php:1434 msgid "Trans" msgstr "" -#: ../../include/channel.php:1278 +#: ../../include/channel.php:1480 msgid "Like this channel" msgstr "" -#: ../../include/channel.php:1302 +#: ../../include/channel.php:1504 msgid "j F, Y" msgstr "" -#: ../../include/channel.php:1303 +#: ../../include/channel.php:1505 msgid "j F" msgstr "" -#: ../../include/channel.php:1310 +#: ../../include/channel.php:1512 msgid "Birthday:" msgstr "" -#: ../../include/channel.php:1323 +#: ../../include/channel.php:1525 #, php-format msgid "for %1$d %2$s" msgstr "" -#: ../../include/channel.php:1326 +#: ../../include/channel.php:1528 msgid "Sexual Preference:" msgstr "" -#: ../../include/channel.php:1332 +#: ../../include/channel.php:1534 msgid "Tags:" msgstr "" -#: ../../include/channel.php:1334 +#: ../../include/channel.php:1536 msgid "Political Views:" msgstr "" -#: ../../include/channel.php:1336 +#: ../../include/channel.php:1538 msgid "Religion:" msgstr "" -#: ../../include/channel.php:1340 +#: ../../include/channel.php:1542 msgid "Hobbies/Interests:" msgstr "" -#: ../../include/channel.php:1342 +#: ../../include/channel.php:1544 msgid "Likes:" msgstr "" -#: ../../include/channel.php:1344 +#: ../../include/channel.php:1546 msgid "Dislikes:" msgstr "" -#: ../../include/channel.php:1346 +#: ../../include/channel.php:1548 msgid "Contact information and Social Networks:" msgstr "" -#: ../../include/channel.php:1348 +#: ../../include/channel.php:1550 msgid "My other channels:" msgstr "" -#: ../../include/channel.php:1350 +#: ../../include/channel.php:1552 msgid "Musical interests:" msgstr "" -#: ../../include/channel.php:1352 +#: ../../include/channel.php:1554 msgid "Books, literature:" msgstr "" -#: ../../include/channel.php:1354 +#: ../../include/channel.php:1556 msgid "Television:" msgstr "" -#: ../../include/channel.php:1356 +#: ../../include/channel.php:1558 msgid "Film/dance/culture/entertainment:" msgstr "" -#: ../../include/channel.php:1358 +#: ../../include/channel.php:1560 msgid "Love/Romance:" msgstr "" -#: ../../include/channel.php:1360 +#: ../../include/channel.php:1562 msgid "Work/employment:" msgstr "" -#: ../../include/channel.php:1362 +#: ../../include/channel.php:1564 msgid "School/education:" msgstr "" -#: ../../include/channel.php:1385 +#: ../../include/channel.php:1587 msgid "Like this thing" msgstr "" -#: ../../include/channel.php:2154 -#, php-format -msgid "User '%s' deleted" -msgstr "" - #: ../../include/event.php:22 ../../include/event.php:69 msgid "l F d, Y \\@ g:i A" msgstr "" @@ -12391,63 +12728,63 @@ msgstr "" msgid "Cancelled" msgstr "" -#: ../../include/event.php:1292 ../../include/connections.php:676 +#: ../../include/event.php:1292 ../../include/connections.php:684 msgid "Home, Voice" msgstr "" -#: ../../include/event.php:1293 ../../include/connections.php:677 +#: ../../include/event.php:1293 ../../include/connections.php:685 msgid "Home, Fax" msgstr "" -#: ../../include/event.php:1295 ../../include/connections.php:679 +#: ../../include/event.php:1295 ../../include/connections.php:687 msgid "Work, Voice" msgstr "" -#: ../../include/event.php:1296 ../../include/connections.php:680 +#: ../../include/event.php:1296 ../../include/connections.php:688 msgid "Work, Fax" msgstr "" -#: ../../include/network.php:751 +#: ../../include/network.php:752 msgid "view full size" msgstr "" -#: ../../include/network.php:1691 ../../include/network.php:1692 +#: ../../include/network.php:1700 ../../include/network.php:1701 msgid "Friendica" msgstr "" -#: ../../include/network.php:1693 +#: ../../include/network.php:1702 msgid "OStatus" msgstr "" -#: ../../include/network.php:1694 +#: ../../include/network.php:1703 msgid "GNU-Social" msgstr "" -#: ../../include/network.php:1695 +#: ../../include/network.php:1704 msgid "RSS/Atom" msgstr "" -#: ../../include/network.php:1697 +#: ../../include/network.php:1707 msgid "Diaspora" msgstr "" -#: ../../include/network.php:1698 +#: ../../include/network.php:1708 msgid "Facebook" msgstr "" -#: ../../include/network.php:1699 +#: ../../include/network.php:1709 msgid "Zot" msgstr "" -#: ../../include/network.php:1700 +#: ../../include/network.php:1710 msgid "LinkedIn" msgstr "" -#: ../../include/network.php:1701 +#: ../../include/network.php:1711 msgid "XMPP/IM" msgstr "" -#: ../../include/network.php:1702 +#: ../../include/network.php:1712 msgid "MySpace" msgstr "" @@ -12489,60 +12826,67 @@ msgstr "" msgid "Cannot locate DNS info for database server '%s'" msgstr "" -#: ../../include/bbcode.php:194 ../../include/bbcode.php:1097 -#: ../../include/bbcode.php:1100 ../../include/bbcode.php:1105 -#: ../../include/bbcode.php:1108 ../../include/bbcode.php:1111 -#: ../../include/bbcode.php:1114 ../../include/bbcode.php:1119 -#: ../../include/bbcode.php:1122 ../../include/bbcode.php:1127 -#: ../../include/bbcode.php:1130 ../../include/bbcode.php:1133 -#: ../../include/bbcode.php:1136 +#: ../../include/bbcode.php:194 ../../include/bbcode.php:1102 +#: ../../include/bbcode.php:1105 ../../include/bbcode.php:1110 +#: ../../include/bbcode.php:1113 ../../include/bbcode.php:1116 +#: ../../include/bbcode.php:1119 ../../include/bbcode.php:1124 +#: ../../include/bbcode.php:1127 ../../include/bbcode.php:1132 +#: ../../include/bbcode.php:1135 ../../include/bbcode.php:1138 +#: ../../include/bbcode.php:1141 msgid "Image/photo" msgstr "" -#: ../../include/bbcode.php:233 ../../include/bbcode.php:1147 +#: ../../include/bbcode.php:233 ../../include/bbcode.php:1152 msgid "Encrypted content" msgstr "" -#: ../../include/bbcode.php:249 +#: ../../include/attach.php:673 #, php-format -msgid "Install %s element: " +msgid "File exceeds size limit of %d" msgstr "" -#: ../../include/bbcode.php:253 +#: ../../include/attach.php:687 #, php-format -msgid "" -"This post contains an installable %s element, however you lack permissions " -"to install it on this site." +msgid "You have reached your limit of %1$.0f Mbytes attachment storage." +msgstr "" + +#: ../../include/bbcode.php:331 +msgid "card" msgstr "" -#: ../../include/bbcode.php:409 ../../include/bbcode.php:417 +#: ../../include/bbcode.php:414 ../../include/bbcode.php:422 msgid "Click to open/close" msgstr "" -#: ../../include/bbcode.php:417 +#: ../../include/bbcode.php:422 msgid "spoiler" msgstr "" -#: ../../include/bbcode.php:1085 +#: ../../include/bbcode.php:1090 msgid "$1 wrote:" msgstr "" -#: ../../include/oembed.php:317 +#: ../../include/oembed.php:328 msgid " by " msgstr "" -#: ../../include/oembed.php:318 +#: ../../include/oembed.php:329 msgid " on " msgstr "" -#: ../../include/oembed.php:347 +#: ../../include/oembed.php:358 msgid "Embedded content" msgstr "" -#: ../../include/oembed.php:356 +#: ../../include/oembed.php:367 msgid "Embedding disabled" msgstr "" +#: ../../include/zid.php:305 +#, php-format +msgid "OpenWebAuth: %1$s welcomes %2$s" +msgstr "" + #: ../../include/features.php:54 msgid "General Features" msgstr "" @@ -12591,292 +12935,296 @@ msgstr "" msgid "Enables a tool to store notes and reminders (note: not encrypted)" msgstr "" -#: ../../include/features.php:122 +#: ../../include/features.php:123 +msgid "Create personal planning cards" +msgstr "" + +#: ../../include/features.php:131 msgid "Navigation Channel Select" msgstr "" -#: ../../include/features.php:123 +#: ../../include/features.php:132 msgid "Change channels directly from within the navigation dropdown menu" msgstr "" -#: ../../include/features.php:131 +#: ../../include/features.php:140 msgid "Photo Location" msgstr "" -#: ../../include/features.php:132 +#: ../../include/features.php:141 msgid "If location data is available on uploaded photos, link this to a map." msgstr "" -#: ../../include/features.php:140 +#: ../../include/features.php:149 msgid "Access Controlled Chatrooms" msgstr "" -#: ../../include/features.php:141 +#: ../../include/features.php:150 msgid "Provide chatrooms and chat services with access control." msgstr "" -#: ../../include/features.php:150 +#: ../../include/features.php:159 msgid "Provide alternate connection permission roles." msgstr "" -#: ../../include/features.php:158 +#: ../../include/features.php:167 msgid "Smart Birthdays" msgstr "" -#: ../../include/features.php:159 +#: ../../include/features.php:168 msgid "" "Make birthday events timezone aware in case your friends are scattered " "across the planet." msgstr "" -#: ../../include/features.php:167 +#: ../../include/features.php:176 msgid "Event Timezone Selection" msgstr "" -#: ../../include/features.php:168 +#: ../../include/features.php:177 msgid "Allow event creation in timezones other than your own." msgstr "" -#: ../../include/features.php:176 +#: ../../include/features.php:185 msgid "Advanced Directory Search" msgstr "" -#: ../../include/features.php:177 +#: ../../include/features.php:186 msgid "Allows creation of complex directory search queries" msgstr "" -#: ../../include/features.php:185 +#: ../../include/features.php:194 msgid "Advanced Theme and Layout Settings" msgstr "" -#: ../../include/features.php:186 +#: ../../include/features.php:195 msgid "Allows fine tuning of themes and page layouts" msgstr "" -#: ../../include/features.php:196 +#: ../../include/features.php:205 msgid "Post Composition Features" msgstr "" -#: ../../include/features.php:200 +#: ../../include/features.php:209 msgid "Large Photos" msgstr "" -#: ../../include/features.php:201 +#: ../../include/features.php:210 msgid "" "Include large (1024px) photo thumbnails in posts. If not enabled, use small " "(640px) photo thumbnails" msgstr "" -#: ../../include/features.php:210 +#: ../../include/features.php:219 msgid "Automatically import channel content from other channels or feeds" msgstr "" -#: ../../include/features.php:218 +#: ../../include/features.php:227 msgid "Even More Encryption" msgstr "" -#: ../../include/features.php:219 +#: ../../include/features.php:228 msgid "" "Allow optional encryption of content end-to-end with a shared secret key" msgstr "" -#: ../../include/features.php:227 +#: ../../include/features.php:236 msgid "Enable Voting Tools" msgstr "" -#: ../../include/features.php:228 +#: ../../include/features.php:237 msgid "Provide a class of post which others can vote on" msgstr "" -#: ../../include/features.php:236 +#: ../../include/features.php:245 msgid "Disable Comments" msgstr "" -#: ../../include/features.php:237 +#: ../../include/features.php:246 msgid "Provide the option to disable comments for a post" msgstr "" -#: ../../include/features.php:245 +#: ../../include/features.php:254 msgid "Delayed Posting" msgstr "" -#: ../../include/features.php:246 +#: ../../include/features.php:255 msgid "Allow posts to be published at a later date" msgstr "" -#: ../../include/features.php:254 +#: ../../include/features.php:263 msgid "Content Expiration" msgstr "" -#: ../../include/features.php:255 +#: ../../include/features.php:264 msgid "Remove posts/comments and/or private messages at a future time" msgstr "" -#: ../../include/features.php:263 +#: ../../include/features.php:272 msgid "Suppress Duplicate Posts/Comments" msgstr "" -#: ../../include/features.php:264 +#: ../../include/features.php:273 msgid "" "Prevent posts with identical content to be published with less than two " "minutes in between submissions." msgstr "" -#: ../../include/features.php:275 +#: ../../include/features.php:284 msgid "Network and Stream Filtering" msgstr "" -#: ../../include/features.php:279 +#: ../../include/features.php:288 msgid "Search by Date" msgstr "" -#: ../../include/features.php:280 +#: ../../include/features.php:289 msgid "Ability to select posts by date ranges" msgstr "" -#: ../../include/features.php:288 ../../include/group.php:332 +#: ../../include/features.php:297 ../../include/group.php:332 msgid "Privacy Groups" msgstr "" -#: ../../include/features.php:289 +#: ../../include/features.php:298 msgid "Enable management and selection of privacy groups" msgstr "" -#: ../../include/features.php:298 +#: ../../include/features.php:307 msgid "Save search terms for re-use" msgstr "" -#: ../../include/features.php:306 +#: ../../include/features.php:315 msgid "Network Personal Tab" msgstr "" -#: ../../include/features.php:307 +#: ../../include/features.php:316 msgid "Enable tab to display only Network posts that you've interacted on" msgstr "" -#: ../../include/features.php:315 +#: ../../include/features.php:324 msgid "Network New Tab" msgstr "" -#: ../../include/features.php:316 +#: ../../include/features.php:325 msgid "Enable tab to display all new Network activity" msgstr "" -#: ../../include/features.php:324 +#: ../../include/features.php:333 msgid "Affinity Tool" msgstr "" -#: ../../include/features.php:325 +#: ../../include/features.php:334 msgid "Filter stream activity by depth of relationships" msgstr "" -#: ../../include/features.php:334 +#: ../../include/features.php:343 msgid "Show friend and connection suggestions" msgstr "" -#: ../../include/features.php:342 +#: ../../include/features.php:351 msgid "Connection Filtering" msgstr "" -#: ../../include/features.php:343 +#: ../../include/features.php:352 msgid "Filter incoming posts from connections based on keywords/content" msgstr "" -#: ../../include/features.php:355 +#: ../../include/features.php:364 msgid "Post/Comment Tools" msgstr "" -#: ../../include/features.php:359 +#: ../../include/features.php:368 msgid "Community Tagging" msgstr "" -#: ../../include/features.php:360 +#: ../../include/features.php:369 msgid "Ability to tag existing posts" msgstr "" -#: ../../include/features.php:368 +#: ../../include/features.php:377 msgid "Post Categories" msgstr "" -#: ../../include/features.php:369 +#: ../../include/features.php:378 msgid "Add categories to your posts" msgstr "" -#: ../../include/features.php:377 +#: ../../include/features.php:386 msgid "Emoji Reactions" msgstr "" -#: ../../include/features.php:378 +#: ../../include/features.php:387 msgid "Add emoji reaction ability to posts" msgstr "" -#: ../../include/features.php:387 +#: ../../include/features.php:396 msgid "Ability to file posts under folders" msgstr "" -#: ../../include/features.php:395 +#: ../../include/features.php:404 msgid "Dislike Posts" msgstr "" -#: ../../include/features.php:396 +#: ../../include/features.php:405 msgid "Ability to dislike posts/comments" msgstr "" -#: ../../include/features.php:404 +#: ../../include/features.php:413 msgid "Star Posts" msgstr "" -#: ../../include/features.php:405 +#: ../../include/features.php:414 msgid "Ability to mark special posts with a star indicator" msgstr "" -#: ../../include/features.php:413 +#: ../../include/features.php:422 msgid "Tag Cloud" msgstr "" -#: ../../include/features.php:414 +#: ../../include/features.php:423 msgid "Provide a personal tag cloud on your channel page" msgstr "" -#: ../../include/features.php:425 +#: ../../include/features.php:434 msgid "Premium Channel" msgstr "" -#: ../../include/features.php:426 +#: ../../include/features.php:435 msgid "" "Allows you to set restrictions and terms on those that connect with your " "channel" msgstr "" -#: ../../include/taxonomy.php:267 ../../include/taxonomy.php:288 +#: ../../include/taxonomy.php:325 ../../include/taxonomy.php:346 msgid "Tags" msgstr "" -#: ../../include/taxonomy.php:332 +#: ../../include/taxonomy.php:410 msgid "Keywords" msgstr "" -#: ../../include/taxonomy.php:353 +#: ../../include/taxonomy.php:431 msgid "have" msgstr "" -#: ../../include/taxonomy.php:353 +#: ../../include/taxonomy.php:431 msgid "has" msgstr "" -#: ../../include/taxonomy.php:354 +#: ../../include/taxonomy.php:432 msgid "want" msgstr "" -#: ../../include/taxonomy.php:354 +#: ../../include/taxonomy.php:432 msgid "wants" msgstr "" -#: ../../include/taxonomy.php:355 +#: ../../include/taxonomy.php:433 msgid "likes" msgstr "" -#: ../../include/taxonomy.php:356 +#: ../../include/taxonomy.php:434 msgid "dislikes" msgstr "" @@ -13029,198 +13377,178 @@ msgstr "" msgid "Happy Birthday %1$s" msgstr "" -#: ../../include/nav.php:90 +#: ../../include/nav.php:91 msgid "Remote authentication" msgstr "" -#: ../../include/nav.php:90 +#: ../../include/nav.php:91 msgid "Click to authenticate to your home hub" msgstr "" -#: ../../include/nav.php:99 ../../include/nav.php:123 -msgid "End this session" +#: ../../include/nav.php:98 +msgid "Network Activity" msgstr "" -#: ../../include/nav.php:102 -msgid "Your profile page" +#: ../../include/nav.php:100 +msgid "Mark all activity notifications seen" msgstr "" -#: ../../include/nav.php:105 -msgid "Manage/Edit profiles" -msgstr "" - -#: ../../include/nav.php:107 -msgid "Edit your profile" +#: ../../include/nav.php:102 +msgid "Channel home" msgstr "" -#: ../../include/nav.php:113 -msgid "Sign in" +#: ../../include/nav.php:103 +msgid "View your channel home" msgstr "" -#: ../../include/nav.php:138 -msgid "Take me home" +#: ../../include/nav.php:104 +msgid "Mark all channel notifications seen" msgstr "" -#: ../../include/nav.php:140 -msgid "Log me out of this site" +#: ../../include/nav.php:109 +msgid "Registrations" msgstr "" -#: ../../include/nav.php:145 -msgid "Create an account" +#: ../../include/nav.php:112 +msgid "Notifications" msgstr "" -#: ../../include/nav.php:157 -msgid "Help and documentation" +#: ../../include/nav.php:113 +msgid "View all notifications" msgstr "" -#: ../../include/nav.php:160 -msgid "Search site @name, #tag, ?docs, content" +#: ../../include/nav.php:114 +msgid "Mark all system notifications seen" msgstr "" -#: ../../include/nav.php:171 -msgid "Grid" +#: ../../include/nav.php:116 +msgid "Private mail" msgstr "" -#: ../../include/nav.php:171 -msgid "Your grid" +#: ../../include/nav.php:117 +msgid "View your private messages" msgstr "" -#: ../../include/nav.php:172 -msgid "View your network/grid" +#: ../../include/nav.php:118 +msgid "Mark all private messages seen" msgstr "" -#: ../../include/nav.php:173 -msgid "Mark all grid notifications seen" +#: ../../include/nav.php:124 +msgid "Event Calendar" msgstr "" -#: ../../include/nav.php:175 -msgid "Channel home" +#: ../../include/nav.php:129 ../../include/nav.php:215 +msgid "Manage Your Channels" msgstr "" -#: ../../include/nav.php:176 -msgid "View your channel home" +#: ../../include/nav.php:132 ../../include/nav.php:217 +msgid "Account/Channel Settings" msgstr "" -#: ../../include/nav.php:177 -msgid "Mark all channel notifications seen" +#: ../../include/nav.php:138 ../../include/nav.php:167 +msgid "End this session" msgstr "" -#: ../../include/nav.php:183 -msgid "Notices" +#: ../../include/nav.php:141 +msgid "Your profile page" msgstr "" -#: ../../include/nav.php:183 -msgid "Notifications" +#: ../../include/nav.php:144 +msgid "Manage/Edit profiles" msgstr "" -#: ../../include/nav.php:184 -msgid "View all notifications" +#: ../../include/nav.php:146 +msgid "Edit your profile" msgstr "" -#: ../../include/nav.php:185 -msgid "Mark all system notifications seen" +#: ../../include/nav.php:153 ../../include/nav.php:157 +msgid "Sign in" msgstr "" -#: ../../include/nav.php:187 -msgid "Private mail" +#: ../../include/nav.php:182 +msgid "Take me home" msgstr "" -#: ../../include/nav.php:188 -msgid "View your private messages" +#: ../../include/nav.php:184 +msgid "Log me out of this site" msgstr "" #: ../../include/nav.php:189 -msgid "Mark all private messages seen" -msgstr "" - -#: ../../include/nav.php:195 -msgid "Event Calendar" -msgstr "" - -#: ../../include/nav.php:196 -msgid "View events" -msgstr "" - -#: ../../include/nav.php:197 -msgid "Mark all events seen" +msgid "Create an account" msgstr "" -#: ../../include/nav.php:199 -msgid "Manage Your Channels" +#: ../../include/nav.php:201 +msgid "Help and documentation" msgstr "" -#: ../../include/nav.php:201 -msgid "Account/Channel Settings" +#: ../../include/nav.php:204 +msgid "Search site @name, #tag, ?docs, content" msgstr "" -#: ../../include/nav.php:209 +#: ../../include/nav.php:224 msgid "Site Setup and Configuration" msgstr "" -#: ../../include/nav.php:268 +#: ../../include/nav.php:311 msgid "@name, #tag, ?doc, content" msgstr "" -#: ../../include/nav.php:269 +#: ../../include/nav.php:312 msgid "Please wait..." msgstr "" -#: ../../include/nav.php:272 +#: ../../include/nav.php:318 msgid "Add Apps" msgstr "" -#: ../../include/nav.php:273 +#: ../../include/nav.php:319 msgid "Arrange Apps" msgstr "" -#: ../../include/nav.php:274 +#: ../../include/nav.php:320 msgid "Toggle System Apps" msgstr "" -#: ../../include/photos.php:111 +#: ../../include/photos.php:123 #, php-format msgid "Image exceeds website size limit of %lu bytes" msgstr "" -#: ../../include/photos.php:118 +#: ../../include/photos.php:130 msgid "Image file is empty." msgstr "" -#: ../../include/photos.php:257 +#: ../../include/photos.php:268 msgid "Photo storage failed." msgstr "" -#: ../../include/photos.php:297 +#: ../../include/photos.php:308 msgid "a new photo" msgstr "" -#: ../../include/photos.php:301 +#: ../../include/photos.php:312 #, php-format msgctxt "photo_upload" msgid "%1$s posted %2$s to %3$s" msgstr "" -#: ../../include/photos.php:530 +#: ../../include/photos.php:605 msgid "Upload New Photos" msgstr "" -#: ../../include/zot.php:646 +#: ../../include/zot.php:654 msgid "Invalid data packet" msgstr "" -#: ../../include/zot.php:662 +#: ../../include/zot.php:681 msgid "Unable to verify channel signature" msgstr "" -#: ../../include/zot.php:2320 +#: ../../include/zot.php:2368 #, php-format msgid "Unable to verify site signature for %s" msgstr "" -#: ../../include/zot.php:3780 -msgid "invalid target signature" -msgstr "" - #: ../../include/group.php:26 msgid "" "A deleted group with this name was revived. Existing item permissions " @@ -13260,14 +13588,18 @@ msgstr "" msgid "Logged out." msgstr "" -#: ../../include/auth.php:275 +#: ../../include/auth.php:263 +msgid "Email validation is incomplete. Please check your email." +msgstr "" + +#: ../../include/auth.php:278 msgid "Failed authentication" msgstr "" -#: ../../include/help.php:33 +#: ../../include/help.php:34 msgid "Help:" msgstr "" -#: ../../include/help.php:65 +#: ../../include/help.php:78 msgid "Not Found" msgstr "" diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index f650246d3..5bdec71aa 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -736,6 +736,7 @@ return array( 'Zotlabs\\Daemon\\Externals' => $baseDir . '/Zotlabs/Daemon/Externals.php', 'Zotlabs\\Daemon\\Gprobe' => $baseDir . '/Zotlabs/Daemon/Gprobe.php', 'Zotlabs\\Daemon\\Importdoc' => $baseDir . '/Zotlabs/Daemon/Importdoc.php', + 'Zotlabs\\Daemon\\Importfile' => $baseDir . '/Zotlabs/Daemon/Importfile.php', 'Zotlabs\\Daemon\\Master' => $baseDir . '/Zotlabs/Daemon/Master.php', 'Zotlabs\\Daemon\\Notifier' => $baseDir . '/Zotlabs/Daemon/Notifier.php', 'Zotlabs\\Daemon\\Onedirsync' => $baseDir . '/Zotlabs/Daemon/Onedirsync.php', @@ -748,7 +749,7 @@ return array( 'Zotlabs\\Identity\\ProfilePhoto\\ProfilePhoto' => $baseDir . '/Zotlabs/Identity/ProfilePhoto.php', 'Zotlabs\\Lib\\AConfig' => $baseDir . '/Zotlabs/Lib/AConfig.php', 'Zotlabs\\Lib\\AbConfig' => $baseDir . '/Zotlabs/Lib/AbConfig.php', - 'Zotlabs\\Lib\\ActivityStreams2' => $baseDir . '/Zotlabs/Lib/ActivityStreams2.php', + 'Zotlabs\\Lib\\ActivityStreams' => $baseDir . '/Zotlabs/Lib/ActivityStreams.php', 'Zotlabs\\Lib\\Api_router' => $baseDir . '/Zotlabs/Lib/Api_router.php', 'Zotlabs\\Lib\\Apps' => $baseDir . '/Zotlabs/Lib/Apps.php', 'Zotlabs\\Lib\\Cache' => $baseDir . '/Zotlabs/Lib/Cache.php', @@ -758,6 +759,8 @@ return array( 'Zotlabs\\Lib\\Enotify' => $baseDir . '/Zotlabs/Lib/Enotify.php', 'Zotlabs\\Lib\\ExtendedZip' => $baseDir . '/Zotlabs/Lib/ExtendedZip.php', 'Zotlabs\\Lib\\IConfig' => $baseDir . '/Zotlabs/Lib/IConfig.php', + 'Zotlabs\\Lib\\JSalmon' => $baseDir . '/Zotlabs/Lib/JSalmon.php', + 'Zotlabs\\Lib\\LDSignatures' => $baseDir . '/Zotlabs/Lib/LDSignatures.php', 'Zotlabs\\Lib\\MarkdownSoap' => $baseDir . '/Zotlabs/Lib/MarkdownSoap.php', 'Zotlabs\\Lib\\NativeWiki' => $baseDir . '/Zotlabs/Lib/NativeWiki.php', 'Zotlabs\\Lib\\NativeWikiPage' => $baseDir . '/Zotlabs/Lib/NativeWikiPage.php', @@ -765,6 +768,7 @@ return array( 'Zotlabs\\Lib\\Permcat' => $baseDir . '/Zotlabs/Lib/Permcat.php', 'Zotlabs\\Lib\\PermissionDescription' => $baseDir . '/Zotlabs/Lib/PermissionDescription.php', 'Zotlabs\\Lib\\ProtoDriver' => $baseDir . '/Zotlabs/Lib/ProtoDriver.php', + 'Zotlabs\\Lib\\SConfig' => $baseDir . '/Zotlabs/Lib/SConfig.php', 'Zotlabs\\Lib\\SuperCurl' => $baseDir . '/Zotlabs/Lib/SuperCurl.php', 'Zotlabs\\Lib\\System' => $baseDir . '/Zotlabs/Lib/System.php', 'Zotlabs\\Lib\\Techlevels' => $baseDir . '/Zotlabs/Lib/Techlevels.php', @@ -800,7 +804,10 @@ return array( 'Zotlabs\\Module\\Bookmarks' => $baseDir . '/Zotlabs/Module/Bookmarks.php', 'Zotlabs\\Module\\Branchtopic' => $baseDir . '/Zotlabs/Module/Branchtopic.php', 'Zotlabs\\Module\\Cal' => $baseDir . '/Zotlabs/Module/Cal.php', + 'Zotlabs\\Module\\Card_edit' => $baseDir . '/Zotlabs/Module/Card_edit.php', + 'Zotlabs\\Module\\Cards' => $baseDir . '/Zotlabs/Module/Cards.php', 'Zotlabs\\Module\\Cdav' => $baseDir . '/Zotlabs/Module/Cdav.php', + 'Zotlabs\\Module\\Changeaddr' => $baseDir . '/Zotlabs/Module/Changeaddr.php', 'Zotlabs\\Module\\Channel' => $baseDir . '/Zotlabs/Module/Channel.php', 'Zotlabs\\Module\\Chanview' => $baseDir . '/Zotlabs/Module/Chanview.php', 'Zotlabs\\Module\\Chat' => $baseDir . '/Zotlabs/Module/Chat.php', @@ -849,6 +856,7 @@ return array( 'Zotlabs\\Module\\Lockview' => $baseDir . '/Zotlabs/Module/Lockview.php', 'Zotlabs\\Module\\Locs' => $baseDir . '/Zotlabs/Module/Locs.php', 'Zotlabs\\Module\\Login' => $baseDir . '/Zotlabs/Module/Login.php', + 'Zotlabs\\Module\\Logout' => $baseDir . '/Zotlabs/Module/Logout.php', 'Zotlabs\\Module\\Lostpass' => $baseDir . '/Zotlabs/Module/Lostpass.php', 'Zotlabs\\Module\\Magic' => $baseDir . '/Zotlabs/Module/Magic.php', 'Zotlabs\\Module\\Mail' => $baseDir . '/Zotlabs/Module/Mail.php', @@ -869,6 +877,7 @@ return array( 'Zotlabs\\Module\\Oexchange' => $baseDir . '/Zotlabs/Module/Oexchange.php', 'Zotlabs\\Module\\Ofeed' => $baseDir . '/Zotlabs/Module/Ofeed.php', 'Zotlabs\\Module\\Online' => $baseDir . '/Zotlabs/Module/Online.php', + 'Zotlabs\\Module\\Owa' => $baseDir . '/Zotlabs/Module/Owa.php', 'Zotlabs\\Module\\Page' => $baseDir . '/Zotlabs/Module/Page.php', 'Zotlabs\\Module\\Pconfig' => $baseDir . '/Zotlabs/Module/Pconfig.php', 'Zotlabs\\Module\\Pdledit' => $baseDir . '/Zotlabs/Module/Pdledit.php', @@ -935,6 +944,7 @@ return array( 'Zotlabs\\Module\\Toggle_safesearch' => $baseDir . '/Zotlabs/Module/Toggle_safesearch.php', 'Zotlabs\\Module\\Token' => $baseDir . '/Zotlabs/Module/Token.php', 'Zotlabs\\Module\\Uexport' => $baseDir . '/Zotlabs/Module/Uexport.php', + 'Zotlabs\\Module\\Update_cards' => $baseDir . '/Zotlabs/Module/Update_cards.php', 'Zotlabs\\Module\\Update_channel' => $baseDir . '/Zotlabs/Module/Update_channel.php', 'Zotlabs\\Module\\Update_display' => $baseDir . '/Zotlabs/Module/Update_display.php', 'Zotlabs\\Module\\Update_home' => $baseDir . '/Zotlabs/Module/Update_home.php', @@ -974,6 +984,7 @@ return array( 'Zotlabs\\Web\\CheckJS' => $baseDir . '/Zotlabs/Web/CheckJS.php', 'Zotlabs\\Web\\Controller' => $baseDir . '/Zotlabs/Web/Controller.php', 'Zotlabs\\Web\\HTTPHeaders' => $baseDir . '/Zotlabs/Web/HTTPHeaders.php', + 'Zotlabs\\Web\\HTTPSig' => $baseDir . '/Zotlabs/Web/HTTPSig.php', 'Zotlabs\\Web\\HttpMeta' => $baseDir . '/Zotlabs/Web/HttpMeta.php', 'Zotlabs\\Web\\Router' => $baseDir . '/Zotlabs/Web/Router.php', 'Zotlabs\\Web\\Session' => $baseDir . '/Zotlabs/Web/Session.php', @@ -995,6 +1006,7 @@ return array( 'Zotlabs\\Widget\\Chatroom_members' => $baseDir . '/Zotlabs/Widget/Chatroom_members.php', 'Zotlabs\\Widget\\Clock' => $baseDir . '/Zotlabs/Widget/Clock.php', 'Zotlabs\\Widget\\Collections' => $baseDir . '/Zotlabs/Widget/Collections.php', + 'Zotlabs\\Widget\\Common_friends' => $baseDir . '/Zotlabs/Widget/Common_friends.php', 'Zotlabs\\Widget\\Conversations' => $baseDir . '/Zotlabs/Widget/Conversations.php', 'Zotlabs\\Widget\\Cover_photo' => $baseDir . '/Zotlabs/Widget/Cover_photo.php', 'Zotlabs\\Widget\\Design_tools' => $baseDir . '/Zotlabs/Widget/Design_tools.php', @@ -1011,6 +1023,7 @@ return array( 'Zotlabs\\Widget\\Mailmenu' => $baseDir . '/Zotlabs/Widget/Mailmenu.php', 'Zotlabs\\Widget\\Menu_preview' => $baseDir . '/Zotlabs/Widget/Menu_preview.php', 'Zotlabs\\Widget\\Notes' => $baseDir . '/Zotlabs/Widget/Notes.php', + 'Zotlabs\\Widget\\Notifications' => $baseDir . '/Zotlabs/Widget/Notifications.php', 'Zotlabs\\Widget\\Photo' => $baseDir . '/Zotlabs/Widget/Photo.php', 'Zotlabs\\Widget\\Photo_albums' => $baseDir . '/Zotlabs/Widget/Photo_albums.php', 'Zotlabs\\Widget\\Photo_rand' => $baseDir . '/Zotlabs/Widget/Photo_rand.php', diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index bd3e9a87c..c2fe0cc04 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -865,6 +865,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Zotlabs\\Daemon\\Externals' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Externals.php', 'Zotlabs\\Daemon\\Gprobe' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Gprobe.php', 'Zotlabs\\Daemon\\Importdoc' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Importdoc.php', + 'Zotlabs\\Daemon\\Importfile' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Importfile.php', 'Zotlabs\\Daemon\\Master' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Master.php', 'Zotlabs\\Daemon\\Notifier' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Notifier.php', 'Zotlabs\\Daemon\\Onedirsync' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Onedirsync.php', @@ -877,7 +878,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Zotlabs\\Identity\\ProfilePhoto\\ProfilePhoto' => __DIR__ . '/../..' . '/Zotlabs/Identity/ProfilePhoto.php', 'Zotlabs\\Lib\\AConfig' => __DIR__ . '/../..' . '/Zotlabs/Lib/AConfig.php', 'Zotlabs\\Lib\\AbConfig' => __DIR__ . '/../..' . '/Zotlabs/Lib/AbConfig.php', - 'Zotlabs\\Lib\\ActivityStreams2' => __DIR__ . '/../..' . '/Zotlabs/Lib/ActivityStreams2.php', + 'Zotlabs\\Lib\\ActivityStreams' => __DIR__ . '/../..' . '/Zotlabs/Lib/ActivityStreams.php', 'Zotlabs\\Lib\\Api_router' => __DIR__ . '/../..' . '/Zotlabs/Lib/Api_router.php', 'Zotlabs\\Lib\\Apps' => __DIR__ . '/../..' . '/Zotlabs/Lib/Apps.php', 'Zotlabs\\Lib\\Cache' => __DIR__ . '/../..' . '/Zotlabs/Lib/Cache.php', @@ -887,6 +888,8 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Zotlabs\\Lib\\Enotify' => __DIR__ . '/../..' . '/Zotlabs/Lib/Enotify.php', 'Zotlabs\\Lib\\ExtendedZip' => __DIR__ . '/../..' . '/Zotlabs/Lib/ExtendedZip.php', 'Zotlabs\\Lib\\IConfig' => __DIR__ . '/../..' . '/Zotlabs/Lib/IConfig.php', + 'Zotlabs\\Lib\\JSalmon' => __DIR__ . '/../..' . '/Zotlabs/Lib/JSalmon.php', + 'Zotlabs\\Lib\\LDSignatures' => __DIR__ . '/../..' . '/Zotlabs/Lib/LDSignatures.php', 'Zotlabs\\Lib\\MarkdownSoap' => __DIR__ . '/../..' . '/Zotlabs/Lib/MarkdownSoap.php', 'Zotlabs\\Lib\\NativeWiki' => __DIR__ . '/../..' . '/Zotlabs/Lib/NativeWiki.php', 'Zotlabs\\Lib\\NativeWikiPage' => __DIR__ . '/../..' . '/Zotlabs/Lib/NativeWikiPage.php', @@ -894,6 +897,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Zotlabs\\Lib\\Permcat' => __DIR__ . '/../..' . '/Zotlabs/Lib/Permcat.php', 'Zotlabs\\Lib\\PermissionDescription' => __DIR__ . '/../..' . '/Zotlabs/Lib/PermissionDescription.php', 'Zotlabs\\Lib\\ProtoDriver' => __DIR__ . '/../..' . '/Zotlabs/Lib/ProtoDriver.php', + 'Zotlabs\\Lib\\SConfig' => __DIR__ . '/../..' . '/Zotlabs/Lib/SConfig.php', 'Zotlabs\\Lib\\SuperCurl' => __DIR__ . '/../..' . '/Zotlabs/Lib/SuperCurl.php', 'Zotlabs\\Lib\\System' => __DIR__ . '/../..' . '/Zotlabs/Lib/System.php', 'Zotlabs\\Lib\\Techlevels' => __DIR__ . '/../..' . '/Zotlabs/Lib/Techlevels.php', @@ -929,7 +933,10 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Zotlabs\\Module\\Bookmarks' => __DIR__ . '/../..' . '/Zotlabs/Module/Bookmarks.php', 'Zotlabs\\Module\\Branchtopic' => __DIR__ . '/../..' . '/Zotlabs/Module/Branchtopic.php', 'Zotlabs\\Module\\Cal' => __DIR__ . '/../..' . '/Zotlabs/Module/Cal.php', + 'Zotlabs\\Module\\Card_edit' => __DIR__ . '/../..' . '/Zotlabs/Module/Card_edit.php', + 'Zotlabs\\Module\\Cards' => __DIR__ . '/../..' . '/Zotlabs/Module/Cards.php', 'Zotlabs\\Module\\Cdav' => __DIR__ . '/../..' . '/Zotlabs/Module/Cdav.php', + 'Zotlabs\\Module\\Changeaddr' => __DIR__ . '/../..' . '/Zotlabs/Module/Changeaddr.php', 'Zotlabs\\Module\\Channel' => __DIR__ . '/../..' . '/Zotlabs/Module/Channel.php', 'Zotlabs\\Module\\Chanview' => __DIR__ . '/../..' . '/Zotlabs/Module/Chanview.php', 'Zotlabs\\Module\\Chat' => __DIR__ . '/../..' . '/Zotlabs/Module/Chat.php', @@ -978,6 +985,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Zotlabs\\Module\\Lockview' => __DIR__ . '/../..' . '/Zotlabs/Module/Lockview.php', 'Zotlabs\\Module\\Locs' => __DIR__ . '/../..' . '/Zotlabs/Module/Locs.php', 'Zotlabs\\Module\\Login' => __DIR__ . '/../..' . '/Zotlabs/Module/Login.php', + 'Zotlabs\\Module\\Logout' => __DIR__ . '/../..' . '/Zotlabs/Module/Logout.php', 'Zotlabs\\Module\\Lostpass' => __DIR__ . '/../..' . '/Zotlabs/Module/Lostpass.php', 'Zotlabs\\Module\\Magic' => __DIR__ . '/../..' . '/Zotlabs/Module/Magic.php', 'Zotlabs\\Module\\Mail' => __DIR__ . '/../..' . '/Zotlabs/Module/Mail.php', @@ -998,6 +1006,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Zotlabs\\Module\\Oexchange' => __DIR__ . '/../..' . '/Zotlabs/Module/Oexchange.php', 'Zotlabs\\Module\\Ofeed' => __DIR__ . '/../..' . '/Zotlabs/Module/Ofeed.php', 'Zotlabs\\Module\\Online' => __DIR__ . '/../..' . '/Zotlabs/Module/Online.php', + 'Zotlabs\\Module\\Owa' => __DIR__ . '/../..' . '/Zotlabs/Module/Owa.php', 'Zotlabs\\Module\\Page' => __DIR__ . '/../..' . '/Zotlabs/Module/Page.php', 'Zotlabs\\Module\\Pconfig' => __DIR__ . '/../..' . '/Zotlabs/Module/Pconfig.php', 'Zotlabs\\Module\\Pdledit' => __DIR__ . '/../..' . '/Zotlabs/Module/Pdledit.php', @@ -1064,6 +1073,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Zotlabs\\Module\\Toggle_safesearch' => __DIR__ . '/../..' . '/Zotlabs/Module/Toggle_safesearch.php', 'Zotlabs\\Module\\Token' => __DIR__ . '/../..' . '/Zotlabs/Module/Token.php', 'Zotlabs\\Module\\Uexport' => __DIR__ . '/../..' . '/Zotlabs/Module/Uexport.php', + 'Zotlabs\\Module\\Update_cards' => __DIR__ . '/../..' . '/Zotlabs/Module/Update_cards.php', 'Zotlabs\\Module\\Update_channel' => __DIR__ . '/../..' . '/Zotlabs/Module/Update_channel.php', 'Zotlabs\\Module\\Update_display' => __DIR__ . '/../..' . '/Zotlabs/Module/Update_display.php', 'Zotlabs\\Module\\Update_home' => __DIR__ . '/../..' . '/Zotlabs/Module/Update_home.php', @@ -1103,6 +1113,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Zotlabs\\Web\\CheckJS' => __DIR__ . '/../..' . '/Zotlabs/Web/CheckJS.php', 'Zotlabs\\Web\\Controller' => __DIR__ . '/../..' . '/Zotlabs/Web/Controller.php', 'Zotlabs\\Web\\HTTPHeaders' => __DIR__ . '/../..' . '/Zotlabs/Web/HTTPHeaders.php', + 'Zotlabs\\Web\\HTTPSig' => __DIR__ . '/../..' . '/Zotlabs/Web/HTTPSig.php', 'Zotlabs\\Web\\HttpMeta' => __DIR__ . '/../..' . '/Zotlabs/Web/HttpMeta.php', 'Zotlabs\\Web\\Router' => __DIR__ . '/../..' . '/Zotlabs/Web/Router.php', 'Zotlabs\\Web\\Session' => __DIR__ . '/../..' . '/Zotlabs/Web/Session.php', @@ -1124,6 +1135,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Zotlabs\\Widget\\Chatroom_members' => __DIR__ . '/../..' . '/Zotlabs/Widget/Chatroom_members.php', 'Zotlabs\\Widget\\Clock' => __DIR__ . '/../..' . '/Zotlabs/Widget/Clock.php', 'Zotlabs\\Widget\\Collections' => __DIR__ . '/../..' . '/Zotlabs/Widget/Collections.php', + 'Zotlabs\\Widget\\Common_friends' => __DIR__ . '/../..' . '/Zotlabs/Widget/Common_friends.php', 'Zotlabs\\Widget\\Conversations' => __DIR__ . '/../..' . '/Zotlabs/Widget/Conversations.php', 'Zotlabs\\Widget\\Cover_photo' => __DIR__ . '/../..' . '/Zotlabs/Widget/Cover_photo.php', 'Zotlabs\\Widget\\Design_tools' => __DIR__ . '/../..' . '/Zotlabs/Widget/Design_tools.php', @@ -1140,6 +1152,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Zotlabs\\Widget\\Mailmenu' => __DIR__ . '/../..' . '/Zotlabs/Widget/Mailmenu.php', 'Zotlabs\\Widget\\Menu_preview' => __DIR__ . '/../..' . '/Zotlabs/Widget/Menu_preview.php', 'Zotlabs\\Widget\\Notes' => __DIR__ . '/../..' . '/Zotlabs/Widget/Notes.php', + 'Zotlabs\\Widget\\Notifications' => __DIR__ . '/../..' . '/Zotlabs/Widget/Notifications.php', 'Zotlabs\\Widget\\Photo' => __DIR__ . '/../..' . '/Zotlabs/Widget/Photo.php', 'Zotlabs\\Widget\\Photo_albums' => __DIR__ . '/../..' . '/Zotlabs/Widget/Photo_albums.php', 'Zotlabs\\Widget\\Photo_rand' => __DIR__ . '/../..' . '/Zotlabs/Widget/Photo_rand.php', diff --git a/view/css/bootstrap-red.css b/view/css/bootstrap-red.css index a3a8ce0be..2dfc9e07b 100644 --- a/view/css/bootstrap-red.css +++ b/view/css/bootstrap-red.css @@ -7,6 +7,10 @@ nav .badge { font-size: 0.75rem; } +nav .dropdown-menu { + min-width: 16rem; +} + @media screen and (min-width: 767px) { nav .badge { top: 0px; @@ -15,6 +19,7 @@ nav .badge { } } + @media screen and (max-width: 767px) { .navbar { padding: .5rem 7px; @@ -71,10 +76,6 @@ nav .dropdown-menu { min-width: auto; } -code { - white-space: normal; -} - label { font-weight: bold; } diff --git a/view/css/conversation.css b/view/css/conversation.css index d10e1e14e..d2736acaa 100644 --- a/view/css/conversation.css +++ b/view/css/conversation.css @@ -1,3 +1,4 @@ + /* jot */ .jothidden input[type="text"] { @@ -67,10 +68,6 @@ border-top: 1px solid #ccc; } -#profile-rotator { - padding: 15px 0px 0px 15px; -} - /* conversation */ @@ -140,11 +137,6 @@ a.wall-item-name-link { cursor: pointer; } -.like-rotator { - float: right; - margin: 16px; -} - .item-select { opacity: 0.1; filter:alpha(opacity=10); @@ -183,24 +175,19 @@ a.wall-item-name-link { /* comment_item */ -.comment-edit-text-empty, -.comment-edit-text-full { + +.comment-edit-text { padding: 0.5rem; width: 100%; display: inherit; -} - -.comment-edit-text-empty { - height: 2rem; line-height: 1; - overflow: hidden; + height: 2rem; resize: none; } -.comment-edit-text-full { - height: 7rem; +.comment-edit-text.expanded { line-height: 1.25; - overflow: auto; + height: 7rem; resize: vertical; } @@ -278,6 +265,7 @@ code { font-size: 1em; padding: 1em 1.5em; display: block; + white-space: pre-wrap; } code.inline-code { diff --git a/view/css/mod_mail.css b/view/css/mod_mail.css index 8072b4668..bcc7a8f94 100644 --- a/view/css/mod_mail.css +++ b/view/css/mod_mail.css @@ -1,3 +1,7 @@ .mail-conv-body img { max-width: 100%; } + +.prvmail-rotator-wrapper { + margin: 1rem; +} diff --git a/view/css/mod_wiki.css b/view/css/mod_wiki.css index b77645d4f..4e4c71e1d 100644 --- a/view/css/mod_wiki.css +++ b/view/css/mod_wiki.css @@ -33,23 +33,18 @@ width: 100%; } +td i { + padding: 7px 5px; + cursor: pointer; +} + #wikis-index th:nth-child(1), #wikis-index td:nth-child(1){ padding: 7px 3px 7px 10px; } -#wikis-index th:nth-child(4), -#wikis-index td:nth-child(4){ - padding: 7px 10px 7px 7px; - white-space: nowrap; -} - -#wikis-index th:nth-child(5), -#wikis-index td:nth-child(5){ - padding: 7px 10px 7px 7px; -} - -.wikis-index-tool { - padding: 7px 10px; +#wikis-index th:nth-last-child(1), +#wikis-index td:nth-last-child(1){ + padding-right: 10px; } diff --git a/view/css/navbar_tucson.css b/view/css/navbar_tucson.css new file mode 100644 index 000000000..79f95fe63 --- /dev/null +++ b/view/css/navbar_tucson.css @@ -0,0 +1,3 @@ +#notifications { + display: none; +} diff --git a/view/css/widgets.css b/view/css/widgets.css index 6cd61ae6f..cea3a3820 100644 --- a/view/css/widgets.css +++ b/view/css/widgets.css @@ -57,7 +57,13 @@ li:hover .widget-nav-pills-icons { /* affinity slider */ #main-slider { - margin: 10px 7px 45px 7px; + margin: 10px 7px 4rem 7px; +} + +@media screen and (max-width: 767px) { + #main-slider { + margin: 4rem 7px 4rem 7px; + } } /* posted date */ diff --git a/view/de/hmessages.po b/view/de/hmessages.po index db906e701..6f0c1b05f 100644 --- a/view/de/hmessages.po +++ b/view/de/hmessages.po @@ -25,8 +25,8 @@ msgid "" msgstr "" "Project-Id-Version: Redmatrix\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-08-01 12:13+0200\n" -"PO-Revision-Date: 2017-08-05 12:18+0000\n" +"POT-Creation-Date: 2017-10-19 12:01+0200\n" +"PO-Revision-Date: 2017-10-21 11:21+0000\n" "Last-Translator: Phellmes <forum@suschka.de>\n" "Language-Team: German (http://www.transifex.com/Friendica/red-matrix/language/de/)\n" "MIME-Version: 1.0\n" @@ -164,14 +164,14 @@ msgid "Special - Group Repository" msgstr "Speziell - Gruppenarchiv" #: ../../Zotlabs/Access/PermissionRoles.php:270 -#: ../../Zotlabs/Module/Cdav.php:1123 ../../Zotlabs/Module/New_channel.php:132 +#: ../../Zotlabs/Module/Cdav.php:1182 ../../Zotlabs/Module/New_channel.php:132 #: ../../Zotlabs/Module/Settings/Channel.php:467 -#: ../../Zotlabs/Module/Connedit.php:932 ../../Zotlabs/Module/Profiles.php:798 +#: ../../Zotlabs/Module/Connedit.php:936 ../../Zotlabs/Module/Profiles.php:798 #: ../../Zotlabs/Module/Register.php:213 ../../include/selectors.php:49 #: ../../include/selectors.php:66 ../../include/selectors.php:104 #: ../../include/selectors.php:140 ../../include/event.php:1297 -#: ../../include/event.php:1304 ../../include/connections.php:681 -#: ../../include/connections.php:688 +#: ../../include/event.php:1304 ../../include/connections.php:689 +#: ../../include/connections.php:696 msgid "Other" msgstr "Andere" @@ -184,16 +184,16 @@ msgstr "Benutzerdefiniert/Expertenmodus" #: ../../Zotlabs/Module/Achievements.php:15 ../../Zotlabs/Module/Hcard.php:12 #: ../../Zotlabs/Module/Editblock.php:31 ../../Zotlabs/Module/Profile.php:20 #: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Editwebpage.php:32 -#: ../../Zotlabs/Module/Webpages.php:33 -#: ../../Zotlabs/Module/Filestorage.php:51 ../../include/channel.php:1062 +#: ../../Zotlabs/Module/Cards.php:29 ../../Zotlabs/Module/Webpages.php:33 +#: ../../Zotlabs/Module/Filestorage.php:51 ../../include/channel.php:1163 msgid "Requested profile is not available." msgstr "Das angefragte Profil ist nicht verfügbar." #: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80 #: ../../Zotlabs/Module/Invite.php:17 ../../Zotlabs/Module/Invite.php:94 #: ../../Zotlabs/Module/Editlayout.php:67 -#: ../../Zotlabs/Module/Editlayout.php:90 ../../Zotlabs/Module/Channel.php:115 -#: ../../Zotlabs/Module/Channel.php:245 ../../Zotlabs/Module/Channel.php:285 +#: ../../Zotlabs/Module/Editlayout.php:90 ../../Zotlabs/Module/Channel.php:110 +#: ../../Zotlabs/Module/Channel.php:248 ../../Zotlabs/Module/Channel.php:288 #: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Locs.php:87 #: ../../Zotlabs/Module/Mitem.php:115 ../../Zotlabs/Module/Events.php:271 #: ../../Zotlabs/Module/Appman.php:82 ../../Zotlabs/Module/Regmod.php:21 @@ -201,21 +201,21 @@ msgstr "Das angefragte Profil ist nicht verfügbar." #: ../../Zotlabs/Module/New_channel.php:104 #: ../../Zotlabs/Module/Sharedwithme.php:16 ../../Zotlabs/Module/Setup.php:209 #: ../../Zotlabs/Module/Moderate.php:13 -#: ../../Zotlabs/Module/Achievements.php:34 ../../Zotlabs/Module/Thing.php:274 -#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335 +#: ../../Zotlabs/Module/Achievements.php:34 ../../Zotlabs/Module/Thing.php:275 +#: ../../Zotlabs/Module/Thing.php:295 ../../Zotlabs/Module/Thing.php:336 #: ../../Zotlabs/Module/Api.php:24 ../../Zotlabs/Module/Editblock.php:67 -#: ../../Zotlabs/Module/Profile.php:85 ../../Zotlabs/Module/Profile.php:102 +#: ../../Zotlabs/Module/Profile.php:85 ../../Zotlabs/Module/Profile.php:101 #: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Connections.php:29 #: ../../Zotlabs/Module/Viewsrc.php:19 ../../Zotlabs/Module/Bookmarks.php:64 #: ../../Zotlabs/Module/Photos.php:69 ../../Zotlabs/Module/Wiki.php:50 -#: ../../Zotlabs/Module/Wiki.php:235 ../../Zotlabs/Module/Wiki.php:341 +#: ../../Zotlabs/Module/Wiki.php:273 ../../Zotlabs/Module/Wiki.php:388 #: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Poke.php:149 -#: ../../Zotlabs/Module/Profile_photo.php:280 -#: ../../Zotlabs/Module/Profile_photo.php:293 +#: ../../Zotlabs/Module/Profile_photo.php:288 +#: ../../Zotlabs/Module/Profile_photo.php:301 #: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Item.php:223 #: ../../Zotlabs/Module/Item.php:240 ../../Zotlabs/Module/Item.php:250 -#: ../../Zotlabs/Module/Item.php:1076 ../../Zotlabs/Module/Page.php:34 -#: ../../Zotlabs/Module/Page.php:125 ../../Zotlabs/Module/Connedit.php:385 +#: ../../Zotlabs/Module/Item.php:1102 ../../Zotlabs/Module/Page.php:34 +#: ../../Zotlabs/Module/Page.php:125 ../../Zotlabs/Module/Connedit.php:389 #: ../../Zotlabs/Module/Chat.php:100 ../../Zotlabs/Module/Chat.php:105 #: ../../Zotlabs/Module/Menu.php:78 ../../Zotlabs/Module/Layouts.php:71 #: ../../Zotlabs/Module/Layouts.php:78 ../../Zotlabs/Module/Layouts.php:89 @@ -225,22 +225,25 @@ msgstr "Das angefragte Profil ist nicht verfügbar." #: ../../Zotlabs/Module/Editwebpage.php:89 #: ../../Zotlabs/Module/Editwebpage.php:107 #: ../../Zotlabs/Module/Editwebpage.php:121 ../../Zotlabs/Module/Manage.php:10 -#: ../../Zotlabs/Module/Webpages.php:118 ../../Zotlabs/Module/Block.php:24 -#: ../../Zotlabs/Module/Block.php:74 ../../Zotlabs/Module/Editpost.php:17 -#: ../../Zotlabs/Module/Sources.php:74 ../../Zotlabs/Module/Like.php:181 -#: ../../Zotlabs/Module/Suggest.php:28 ../../Zotlabs/Module/Message.php:18 -#: ../../Zotlabs/Module/Mail.php:146 ../../Zotlabs/Module/Register.php:77 +#: ../../Zotlabs/Module/Cards.php:68 ../../Zotlabs/Module/Webpages.php:118 +#: ../../Zotlabs/Module/Block.php:24 ../../Zotlabs/Module/Block.php:74 +#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Sources.php:74 +#: ../../Zotlabs/Module/Like.php:181 ../../Zotlabs/Module/Suggest.php:28 +#: ../../Zotlabs/Module/Message.php:18 ../../Zotlabs/Module/Mail.php:146 +#: ../../Zotlabs/Module/Register.php:77 #: ../../Zotlabs/Module/Cover_photo.php:281 #: ../../Zotlabs/Module/Cover_photo.php:294 -#: ../../Zotlabs/Module/Network.php:15 ../../Zotlabs/Module/Filestorage.php:15 +#: ../../Zotlabs/Module/Display.php:343 ../../Zotlabs/Module/Network.php:15 +#: ../../Zotlabs/Module/Filestorage.php:15 #: ../../Zotlabs/Module/Filestorage.php:70 #: ../../Zotlabs/Module/Filestorage.php:85 -#: ../../Zotlabs/Module/Filestorage.php:112 ../../Zotlabs/Module/Common.php:39 +#: ../../Zotlabs/Module/Filestorage.php:112 ../../Zotlabs/Module/Common.php:38 #: ../../Zotlabs/Module/Viewconnections.php:28 #: ../../Zotlabs/Module/Viewconnections.php:33 #: ../../Zotlabs/Module/Service_limits.php:11 -#: ../../Zotlabs/Module/Rate.php:113 ../../Zotlabs/Module/Notifications.php:11 -#: ../../Zotlabs/Lib/Chatroom.php:137 ../../Zotlabs/Web/WebServer.php:131 +#: ../../Zotlabs/Module/Rate.php:113 ../../Zotlabs/Module/Card_edit.php:51 +#: ../../Zotlabs/Module/Notifications.php:11 +#: ../../Zotlabs/Lib/Chatroom.php:137 ../../Zotlabs/Web/WebServer.php:169 #: ../../addon/keepout/keepout.php:36 ../../addon/openid/Mod_Id.php:53 #: ../../addon/gitwiki/Mod_Gitwiki.php:196 #: ../../addon/gitwiki/Mod_Gitwiki.php:292 ../../addon/pumpio/pumpio.php:40 @@ -248,9 +251,9 @@ msgstr "Das angefragte Profil ist nicht verfügbar." #: ../../include/attach.php:255 ../../include/attach.php:269 #: ../../include/attach.php:276 ../../include/attach.php:344 #: ../../include/attach.php:358 ../../include/attach.php:365 -#: ../../include/attach.php:443 ../../include/attach.php:918 -#: ../../include/attach.php:992 ../../include/attach.php:1157 -#: ../../include/items.php:3440 ../../include/photos.php:28 +#: ../../include/attach.php:443 ../../include/attach.php:924 +#: ../../include/attach.php:998 ../../include/attach.php:1163 +#: ../../include/items.php:3489 ../../include/photos.php:28 msgid "Permission denied." msgstr "Berechtigung verweigert." @@ -259,7 +262,7 @@ msgstr "Berechtigung verweigert." msgid "Block Name" msgstr "Block-Name" -#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2280 +#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2288 msgid "Blocks" msgstr "Blöcke" @@ -277,62 +280,64 @@ msgstr "Erstellt" msgid "Edited" msgstr "Geändert" -#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Cdav.php:1126 +#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Cdav.php:1185 #: ../../Zotlabs/Module/New_channel.php:147 -#: ../../Zotlabs/Module/Connedit.php:935 ../../Zotlabs/Module/Menu.php:118 +#: ../../Zotlabs/Module/Connedit.php:939 ../../Zotlabs/Module/Menu.php:118 #: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Module/Profiles.php:801 -#: ../../Zotlabs/Module/Webpages.php:239 ../../Zotlabs/Storage/Browser.php:229 -#: ../../Zotlabs/Storage/Browser.php:335 ../../Zotlabs/Widget/Cdav.php:127 -#: ../../Zotlabs/Widget/Cdav.php:164 +#: ../../Zotlabs/Module/Cards.php:96 ../../Zotlabs/Module/Webpages.php:239 +#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:335 +#: ../../Zotlabs/Widget/Cdav.php:127 ../../Zotlabs/Widget/Cdav.php:164 msgid "Create" msgstr "Erstelle" #: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Editlayout.php:114 #: ../../Zotlabs/Module/Admin/Profs.php:154 #: ../../Zotlabs/Module/Settings/Oauth.php:149 -#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Module/Editblock.php:114 +#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Module/Editblock.php:114 #: ../../Zotlabs/Module/Connections.php:260 #: ../../Zotlabs/Module/Connections.php:297 -#: ../../Zotlabs/Module/Connections.php:317 ../../Zotlabs/Module/Wiki.php:167 -#: ../../Zotlabs/Module/Wiki.php:300 ../../Zotlabs/Module/Menu.php:112 +#: ../../Zotlabs/Module/Connections.php:317 ../../Zotlabs/Module/Wiki.php:202 +#: ../../Zotlabs/Module/Wiki.php:346 ../../Zotlabs/Module/Menu.php:112 #: ../../Zotlabs/Module/Layouts.php:193 #: ../../Zotlabs/Module/Editwebpage.php:142 #: ../../Zotlabs/Module/Webpages.php:240 ../../Zotlabs/Module/Editpost.php:85 -#: ../../Zotlabs/Lib/Apps.php:393 ../../Zotlabs/Lib/ThreadItem.php:107 -#: ../../Zotlabs/Storage/Browser.php:239 ../../Zotlabs/Widget/Cdav.php:125 -#: ../../Zotlabs/Widget/Cdav.php:161 ../../addon/gitwiki/Mod_Gitwiki.php:151 -#: ../../addon/gitwiki/Mod_Gitwiki.php:252 ../../include/channel.php:1161 -#: ../../include/channel.php:1165 ../../include/menu.php:113 +#: ../../Zotlabs/Module/Card_edit.php:99 ../../Zotlabs/Lib/Apps.php:399 +#: ../../Zotlabs/Lib/ThreadItem.php:111 ../../Zotlabs/Storage/Browser.php:239 +#: ../../Zotlabs/Widget/Cdav.php:125 ../../Zotlabs/Widget/Cdav.php:161 +#: ../../addon/gitwiki/Mod_Gitwiki.php:151 +#: ../../addon/gitwiki/Mod_Gitwiki.php:252 ../../include/channel.php:1262 +#: ../../include/channel.php:1266 ../../include/menu.php:113 msgid "Edit" msgstr "Bearbeiten" -#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1044 +#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1049 #: ../../Zotlabs/Module/Layouts.php:194 ../../Zotlabs/Module/Webpages.php:241 -#: ../../Zotlabs/Widget/Cdav.php:123 ../../include/conversation.php:1308 +#: ../../Zotlabs/Widget/Cdav.php:123 ../../include/conversation.php:1346 msgid "Share" msgstr "Teilen" #: ../../Zotlabs/Module/Blocks.php:162 ../../Zotlabs/Module/Editlayout.php:138 -#: ../../Zotlabs/Module/Cdav.php:838 ../../Zotlabs/Module/Cdav.php:1128 +#: ../../Zotlabs/Module/Cdav.php:897 ../../Zotlabs/Module/Cdav.php:1187 #: ../../Zotlabs/Module/Admin/Accounts.php:173 #: ../../Zotlabs/Module/Admin/Channels.php:149 #: ../../Zotlabs/Module/Admin/Profs.php:155 #: ../../Zotlabs/Module/Settings/Oauth.php:150 -#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Module/Editblock.php:139 +#: ../../Zotlabs/Module/Thing.php:262 ../../Zotlabs/Module/Editblock.php:139 #: ../../Zotlabs/Module/Connections.php:268 -#: ../../Zotlabs/Module/Photos.php:1145 ../../Zotlabs/Module/Connedit.php:650 -#: ../../Zotlabs/Module/Connedit.php:937 ../../Zotlabs/Module/Group.php:179 +#: ../../Zotlabs/Module/Photos.php:1150 ../../Zotlabs/Module/Connedit.php:654 +#: ../../Zotlabs/Module/Connedit.php:941 ../../Zotlabs/Module/Group.php:179 #: ../../Zotlabs/Module/Profiles.php:803 #: ../../Zotlabs/Module/Editwebpage.php:167 -#: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Lib/Apps.php:394 -#: ../../Zotlabs/Lib/ThreadItem.php:127 ../../Zotlabs/Storage/Browser.php:240 -#: ../../include/conversation.php:649 ../../include/conversation.php:686 +#: ../../Zotlabs/Module/Webpages.php:242 +#: ../../Zotlabs/Module/Card_edit.php:129 ../../Zotlabs/Lib/Apps.php:400 +#: ../../Zotlabs/Lib/ThreadItem.php:131 ../../Zotlabs/Storage/Browser.php:240 +#: ../../include/conversation.php:674 ../../include/conversation.php:717 msgid "Delete" msgstr "Löschen" #: ../../Zotlabs/Module/Blocks.php:166 ../../Zotlabs/Module/Events.php:694 -#: ../../Zotlabs/Module/Wiki.php:169 ../../Zotlabs/Module/Layouts.php:198 -#: ../../Zotlabs/Module/Webpages.php:246 ../../Zotlabs/Module/Pubsites.php:59 +#: ../../Zotlabs/Module/Wiki.php:204 ../../Zotlabs/Module/Layouts.php:198 +#: ../../Zotlabs/Module/Webpages.php:246 ../../Zotlabs/Module/Pubsites.php:60 #: ../../addon/gitwiki/Mod_Gitwiki.php:153 msgid "View" msgstr "Ansicht" @@ -366,10 +371,6 @@ msgid_plural "%d messages sent." msgstr[0] "%d Nachricht gesendet." msgstr[1] "%d Nachrichten gesendet." -#: ../../Zotlabs/Module/Invite.php:98 ../../Zotlabs/Lib/Apps.php:254 -msgid "Invite" -msgstr "Einladen" - #: ../../Zotlabs/Module/Invite.php:107 msgid "You have no more invitations available" msgstr "Du hast keine weiteren verfügbare Einladungen" @@ -423,7 +424,7 @@ msgstr "3. Klicke auf [Verbinden]" #: ../../Zotlabs/Module/Admin/Logs.php:84 #: ../../Zotlabs/Module/Admin/Channels.php:147 #: ../../Zotlabs/Module/Admin/Themes.php:158 -#: ../../Zotlabs/Module/Admin/Site.php:271 +#: ../../Zotlabs/Module/Admin/Site.php:273 #: ../../Zotlabs/Module/Admin/Profs.php:157 #: ../../Zotlabs/Module/Admin/Account_edit.php:74 #: ../../Zotlabs/Module/Admin/Security.php:104 @@ -433,24 +434,26 @@ msgstr "3. Klicke auf [Verbinden]" #: ../../Zotlabs/Module/Settings/Tokens.php:168 #: ../../Zotlabs/Module/Settings/Account.php:118 #: ../../Zotlabs/Module/Settings/Featured.php:52 -#: ../../Zotlabs/Module/Settings/Display.php:203 +#: ../../Zotlabs/Module/Settings/Display.php:207 #: ../../Zotlabs/Module/Settings/Oauth.php:87 -#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370 -#: ../../Zotlabs/Module/Import.php:518 ../../Zotlabs/Module/Cal.php:343 +#: ../../Zotlabs/Module/Thing.php:321 ../../Zotlabs/Module/Thing.php:374 +#: ../../Zotlabs/Module/Import.php:529 ../../Zotlabs/Module/Cal.php:343 #: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Photos.php:659 -#: ../../Zotlabs/Module/Photos.php:1024 ../../Zotlabs/Module/Photos.php:1064 -#: ../../Zotlabs/Module/Photos.php:1182 ../../Zotlabs/Module/Wiki.php:171 -#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Poke.php:200 -#: ../../Zotlabs/Module/Connedit.php:900 ../../Zotlabs/Module/Chat.php:196 +#: ../../Zotlabs/Module/Photos.php:1029 ../../Zotlabs/Module/Photos.php:1069 +#: ../../Zotlabs/Module/Photos.php:1187 ../../Zotlabs/Module/Wiki.php:206 +#: ../../Zotlabs/Module/Pdledit.php:94 ../../Zotlabs/Module/Poke.php:200 +#: ../../Zotlabs/Module/Connedit.php:904 ../../Zotlabs/Module/Chat.php:196 #: ../../Zotlabs/Module/Chat.php:242 ../../Zotlabs/Module/Pconfig.php:107 #: ../../Zotlabs/Module/Group.php:87 ../../Zotlabs/Module/Profiles.php:726 #: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149 #: ../../Zotlabs/Module/Xchan.php:15 ../../Zotlabs/Module/Mail.php:431 #: ../../Zotlabs/Module/Filestorage.php:155 ../../Zotlabs/Module/Rate.php:166 -#: ../../Zotlabs/Lib/ThreadItem.php:730 +#: ../../Zotlabs/Lib/ThreadItem.php:743 #: ../../Zotlabs/Widget/Eventstools.php:16 -#: ../../view/theme/redbasic/php/config.php:95 -#: ../../addon/skeleton/skeleton.php:65 ../../addon/gnusoc/gnusoc.php:226 +#: ../../Zotlabs/Widget/Wiki_pages.php:61 +#: ../../view/theme/redbasic_c/php/config.php:95 +#: ../../view/theme/redbasic/php/config.php:93 +#: ../../addon/skeleton/skeleton.php:65 ../../addon/gnusoc/gnusoc.php:269 #: ../../addon/planets/planets.php:153 #: ../../addon/openclipatar/openclipatar.php:53 #: ../../addon/wppost/wppost.php:113 ../../addon/nsfw/nsfw.php:92 @@ -459,7 +462,7 @@ msgstr "3. Klicke auf [Verbinden]" #: ../../addon/likebanner/likebanner.php:57 #: ../../addon/redphotos/redphotos.php:136 ../../addon/irc/irc.php:53 #: ../../addon/ljpost/ljpost.php:86 ../../addon/startpage/startpage.php:113 -#: ../../addon/diaspora/diaspora.php:759 +#: ../../addon/diaspora/diaspora.php:807 #: ../../addon/gitwiki/Mod_Gitwiki.php:155 #: ../../addon/rainbowtag/rainbowtag.php:85 ../../addon/visage/visage.php:170 #: ../../addon/nsabait/nsabait.php:161 ../../addon/mailtest/mailtest.php:100 @@ -467,8 +470,8 @@ msgstr "3. Klicke auf [Verbinden]" #: ../../addon/rtof/rtof.php:101 ../../addon/jappixmini/jappixmini.php:371 #: ../../addon/superblock/superblock.php:120 ../../addon/nofed/nofed.php:80 #: ../../addon/redred/redred.php:119 ../../addon/logrot/logrot.php:35 -#: ../../addon/frphotos/frphotos.php:96 ../../addon/chords/Mod_Chords.php:60 -#: ../../addon/libertree/libertree.php:85 +#: ../../addon/frphotos/frphotos.php:96 ../../addon/pubcrawl/pubcrawl.php:1049 +#: ../../addon/chords/Mod_Chords.php:60 ../../addon/libertree/libertree.php:85 #: ../../addon/flattrwidget/flattrwidget.php:124 #: ../../addon/statusnet/statusnet.php:322 #: ../../addon/statusnet/statusnet.php:380 @@ -486,7 +489,8 @@ msgstr "Absenden" #: ../../Zotlabs/Module/Editlayout.php:79 #: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95 #: ../../Zotlabs/Module/Editwebpage.php:80 -#: ../../Zotlabs/Module/Editpost.php:24 +#: ../../Zotlabs/Module/Editpost.php:24 ../../Zotlabs/Module/Card_edit.php:17 +#: ../../Zotlabs/Module/Card_edit.php:33 msgid "Item not found" msgstr "Element nicht gefunden" @@ -507,10 +511,10 @@ msgstr "Layout bearbeiten" #: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:62 #: ../../Zotlabs/Module/Import_items.php:120 ../../Zotlabs/Module/Group.php:74 #: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:68 -#: ../../Zotlabs/Module/Like.php:283 ../../Zotlabs/Web/WebServer.php:130 +#: ../../Zotlabs/Module/Like.php:283 ../../Zotlabs/Web/WebServer.php:168 #: ../../addon/redphotos/redphotos.php:119 #: ../../addon/frphotos/frphotos.php:81 ../../addon/redfiles/redfiles.php:109 -#: ../../include/items.php:340 +#: ../../include/items.php:346 msgid "Permission denied" msgstr "Keine Berechtigung" @@ -522,7 +526,7 @@ msgstr "Ungültiger Profil-Identifikator" msgid "Profile Visibility Editor" msgstr "Profil-Sichtbarkeits-Editor" -#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1485 +#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1585 msgid "Profile" msgstr "Profil" @@ -539,160 +543,153 @@ msgstr "Sichtbar für" msgid "All Connections" msgstr "Alle Verbindungen" -#: ../../Zotlabs/Module/Cdav.php:726 +#: ../../Zotlabs/Module/Cdav.php:785 msgid "INVALID EVENT DISMISSED!" msgstr "UNGÜLTIGEN TERMIN ABGELEHNT!" -#: ../../Zotlabs/Module/Cdav.php:727 +#: ../../Zotlabs/Module/Cdav.php:786 msgid "Summary: " msgstr "Zusammenfassung:" -#: ../../Zotlabs/Module/Cdav.php:727 ../../Zotlabs/Module/Cdav.php:728 -#: ../../Zotlabs/Module/Cdav.php:735 ../../Zotlabs/Module/Embedphotos.php:146 -#: ../../Zotlabs/Module/Photos.php:759 ../../Zotlabs/Module/Photos.php:1215 -#: ../../Zotlabs/Lib/Apps.php:721 ../../Zotlabs/Lib/Apps.php:799 +#: ../../Zotlabs/Module/Cdav.php:786 ../../Zotlabs/Module/Cdav.php:787 +#: ../../Zotlabs/Module/Cdav.php:794 ../../Zotlabs/Module/Embedphotos.php:146 +#: ../../Zotlabs/Module/Photos.php:764 ../../Zotlabs/Module/Photos.php:1220 +#: ../../Zotlabs/Lib/Apps.php:727 ../../Zotlabs/Lib/Apps.php:805 #: ../../Zotlabs/Storage/Browser.php:164 ../../Zotlabs/Widget/Portfolio.php:86 -#: ../../Zotlabs/Widget/Album.php:84 ../../include/conversation.php:1107 +#: ../../Zotlabs/Widget/Album.php:84 ../../addon/pubcrawl/as.php:841 +#: ../../include/conversation.php:1143 msgid "Unknown" msgstr "Unbekannt" -#: ../../Zotlabs/Module/Cdav.php:728 +#: ../../Zotlabs/Module/Cdav.php:787 msgid "Date: " msgstr "Datum:" -#: ../../Zotlabs/Module/Cdav.php:729 ../../Zotlabs/Module/Cdav.php:736 +#: ../../Zotlabs/Module/Cdav.php:788 ../../Zotlabs/Module/Cdav.php:795 msgid "Reason: " msgstr "Grund:" -#: ../../Zotlabs/Module/Cdav.php:734 +#: ../../Zotlabs/Module/Cdav.php:793 msgid "INVALID CARD DISMISSED!" msgstr "UNGÜLTIGE KARTE ABGELEHNT!" -#: ../../Zotlabs/Module/Cdav.php:735 +#: ../../Zotlabs/Module/Cdav.php:794 msgid "Name: " msgstr "Name: " -#: ../../Zotlabs/Module/Cdav.php:768 -msgid "CalDAV" -msgstr "CalDAV" - -#: ../../Zotlabs/Module/Cdav.php:809 ../../Zotlabs/Module/Events.php:460 +#: ../../Zotlabs/Module/Cdav.php:868 ../../Zotlabs/Module/Events.php:460 msgid "Event title" msgstr "Termintitel" -#: ../../Zotlabs/Module/Cdav.php:810 ../../Zotlabs/Module/Events.php:466 +#: ../../Zotlabs/Module/Cdav.php:869 ../../Zotlabs/Module/Events.php:466 msgid "Start date and time" msgstr "Startdatum und -zeit" -#: ../../Zotlabs/Module/Cdav.php:810 ../../Zotlabs/Module/Cdav.php:811 +#: ../../Zotlabs/Module/Cdav.php:869 ../../Zotlabs/Module/Cdav.php:870 msgid "Example: YYYY-MM-DD HH:mm" msgstr "Beispiel: JJJJ-MM-TT HH:mm" -#: ../../Zotlabs/Module/Cdav.php:811 +#: ../../Zotlabs/Module/Cdav.php:870 msgid "End date and time" msgstr "Enddatum und -zeit" -#: ../../Zotlabs/Module/Cdav.php:812 ../../Zotlabs/Module/Events.php:473 +#: ../../Zotlabs/Module/Cdav.php:871 ../../Zotlabs/Module/Events.php:473 #: ../../Zotlabs/Module/Appman.php:138 ../../Zotlabs/Module/Rbmark.php:101 #: ../../addon/rendezvous/rendezvous.php:173 msgid "Description" msgstr "Beschreibung" -#: ../../Zotlabs/Module/Cdav.php:813 ../../Zotlabs/Module/Locs.php:117 +#: ../../Zotlabs/Module/Cdav.php:872 ../../Zotlabs/Module/Locs.php:117 #: ../../Zotlabs/Module/Events.php:475 ../../Zotlabs/Module/Profiles.php:509 -#: ../../Zotlabs/Module/Profiles.php:737 ../../Zotlabs/Module/Pubsites.php:51 +#: ../../Zotlabs/Module/Profiles.php:737 ../../Zotlabs/Module/Pubsites.php:52 #: ../../include/js_strings.php:25 msgid "Location" msgstr "Ort" -#: ../../Zotlabs/Module/Cdav.php:820 ../../Zotlabs/Module/Events.php:689 +#: ../../Zotlabs/Module/Cdav.php:879 ../../Zotlabs/Module/Events.php:689 #: ../../Zotlabs/Module/Events.php:698 ../../Zotlabs/Module/Cal.php:337 -#: ../../Zotlabs/Module/Cal.php:344 ../../Zotlabs/Module/Photos.php:913 +#: ../../Zotlabs/Module/Cal.php:344 ../../Zotlabs/Module/Photos.php:918 msgid "Previous" msgstr "Voriges" -#: ../../Zotlabs/Module/Cdav.php:821 ../../Zotlabs/Module/Events.php:690 +#: ../../Zotlabs/Module/Cdav.php:880 ../../Zotlabs/Module/Events.php:690 #: ../../Zotlabs/Module/Events.php:699 ../../Zotlabs/Module/Setup.php:263 #: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Cal.php:345 -#: ../../Zotlabs/Module/Photos.php:922 +#: ../../Zotlabs/Module/Photos.php:927 msgid "Next" msgstr "Nächste" -#: ../../Zotlabs/Module/Cdav.php:822 ../../Zotlabs/Module/Events.php:700 +#: ../../Zotlabs/Module/Cdav.php:881 ../../Zotlabs/Module/Events.php:700 #: ../../Zotlabs/Module/Cal.php:346 msgid "Today" msgstr "Heute" -#: ../../Zotlabs/Module/Cdav.php:823 ../../Zotlabs/Module/Events.php:695 +#: ../../Zotlabs/Module/Cdav.php:882 ../../Zotlabs/Module/Events.php:695 msgid "Month" msgstr "Monat" -#: ../../Zotlabs/Module/Cdav.php:824 ../../Zotlabs/Module/Events.php:696 +#: ../../Zotlabs/Module/Cdav.php:883 ../../Zotlabs/Module/Events.php:696 msgid "Week" msgstr "Woche" -#: ../../Zotlabs/Module/Cdav.php:825 ../../Zotlabs/Module/Events.php:697 +#: ../../Zotlabs/Module/Cdav.php:884 ../../Zotlabs/Module/Events.php:697 msgid "Day" msgstr "Tag" -#: ../../Zotlabs/Module/Cdav.php:826 +#: ../../Zotlabs/Module/Cdav.php:885 msgid "List month" msgstr "Liste Monat" -#: ../../Zotlabs/Module/Cdav.php:827 +#: ../../Zotlabs/Module/Cdav.php:886 msgid "List week" msgstr "Liste Woche" -#: ../../Zotlabs/Module/Cdav.php:828 +#: ../../Zotlabs/Module/Cdav.php:887 msgid "List day" msgstr "Liste Tag" -#: ../../Zotlabs/Module/Cdav.php:835 +#: ../../Zotlabs/Module/Cdav.php:894 msgid "More" msgstr "Mehr" -#: ../../Zotlabs/Module/Cdav.php:836 +#: ../../Zotlabs/Module/Cdav.php:895 msgid "Less" msgstr "Weniger" -#: ../../Zotlabs/Module/Cdav.php:837 +#: ../../Zotlabs/Module/Cdav.php:896 msgid "Select calendar" msgstr "Kalender auswählen" -#: ../../Zotlabs/Module/Cdav.php:839 +#: ../../Zotlabs/Module/Cdav.php:898 msgid "Delete all" msgstr "Alles löschen" -#: ../../Zotlabs/Module/Cdav.php:840 ../../Zotlabs/Module/Cdav.php:1129 +#: ../../Zotlabs/Module/Cdav.php:899 ../../Zotlabs/Module/Cdav.php:1188 #: ../../Zotlabs/Module/Admin/Plugins.php:423 #: ../../Zotlabs/Module/Settings/Oauth.php:88 #: ../../Zotlabs/Module/Settings/Oauth.php:114 -#: ../../Zotlabs/Module/Wiki.php:290 ../../Zotlabs/Module/Wiki.php:316 -#: ../../Zotlabs/Module/Connedit.php:938 ../../Zotlabs/Module/Fbrowser.php:66 +#: ../../Zotlabs/Module/Wiki.php:333 ../../Zotlabs/Module/Wiki.php:363 +#: ../../Zotlabs/Module/Connedit.php:942 ../../Zotlabs/Module/Fbrowser.php:66 #: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Profiles.php:804 #: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Module/Tagrm.php:15 #: ../../Zotlabs/Module/Tagrm.php:138 ../../addon/js_upload/js_upload.php:46 #: ../../addon/gitwiki/Mod_Gitwiki.php:244 -#: ../../addon/gitwiki/Mod_Gitwiki.php:267 ../../include/conversation.php:1324 -#: ../../include/conversation.php:1373 +#: ../../addon/gitwiki/Mod_Gitwiki.php:267 ../../include/conversation.php:1369 +#: ../../include/conversation.php:1418 msgid "Cancel" msgstr "Abbrechen" -#: ../../Zotlabs/Module/Cdav.php:841 +#: ../../Zotlabs/Module/Cdav.php:900 msgid "Sorry! Editing of recurrent events is not yet implemented." msgstr "Entschuldigung, aber das Bearbeiten von wiederkehrenden Veranstaltungen ist leider noch nicht implementiert." -#: ../../Zotlabs/Module/Cdav.php:969 -msgid "CardDAV" -msgstr "CardDAV" - -#: ../../Zotlabs/Module/Cdav.php:1111 +#: ../../Zotlabs/Module/Cdav.php:1170 #: ../../Zotlabs/Module/Sharedwithme.php:105 #: ../../Zotlabs/Module/Admin/Channels.php:159 #: ../../Zotlabs/Module/Settings/Oauth.php:89 #: ../../Zotlabs/Module/Settings/Oauth.php:115 -#: ../../Zotlabs/Module/Wiki.php:174 ../../Zotlabs/Module/Connedit.php:920 -#: ../../Zotlabs/Module/Chat.php:251 ../../Zotlabs/Lib/NativeWikiPage.php:539 +#: ../../Zotlabs/Module/Wiki.php:209 ../../Zotlabs/Module/Connedit.php:924 +#: ../../Zotlabs/Module/Chat.php:251 ../../Zotlabs/Lib/NativeWikiPage.php:554 #: ../../Zotlabs/Storage/Browser.php:234 #: ../../Zotlabs/Widget/Wiki_page_history.php:22 #: ../../addon/rendezvous/rendezvous.php:172 @@ -700,123 +697,123 @@ msgstr "CardDAV" msgid "Name" msgstr "Name" -#: ../../Zotlabs/Module/Cdav.php:1112 ../../Zotlabs/Module/Connedit.php:921 +#: ../../Zotlabs/Module/Cdav.php:1171 ../../Zotlabs/Module/Connedit.php:925 msgid "Organisation" msgstr "Organisation" -#: ../../Zotlabs/Module/Cdav.php:1113 ../../Zotlabs/Module/Connedit.php:922 +#: ../../Zotlabs/Module/Cdav.php:1172 ../../Zotlabs/Module/Connedit.php:926 msgid "Title" msgstr "Titel" -#: ../../Zotlabs/Module/Cdav.php:1114 ../../Zotlabs/Module/Connedit.php:923 +#: ../../Zotlabs/Module/Cdav.php:1173 ../../Zotlabs/Module/Connedit.php:927 #: ../../Zotlabs/Module/Profiles.php:789 msgid "Phone" msgstr "Telefon" -#: ../../Zotlabs/Module/Cdav.php:1115 +#: ../../Zotlabs/Module/Cdav.php:1174 #: ../../Zotlabs/Module/Admin/Accounts.php:169 #: ../../Zotlabs/Module/Admin/Accounts.php:181 -#: ../../Zotlabs/Module/Connedit.php:924 ../../Zotlabs/Module/Profiles.php:790 +#: ../../Zotlabs/Module/Connedit.php:928 ../../Zotlabs/Module/Profiles.php:790 #: ../../addon/openid/MysqlProvider.php:56 #: ../../addon/openid/MysqlProvider.php:57 ../../addon/rtof/rtof.php:93 -#: ../../addon/redred/redred.php:107 ../../include/network.php:1697 +#: ../../addon/redred/redred.php:107 ../../include/network.php:1706 msgid "Email" msgstr "E-Mail" -#: ../../Zotlabs/Module/Cdav.php:1116 ../../Zotlabs/Module/Connedit.php:925 +#: ../../Zotlabs/Module/Cdav.php:1175 ../../Zotlabs/Module/Connedit.php:929 #: ../../Zotlabs/Module/Profiles.php:791 msgid "Instant messenger" msgstr "Sofortnachrichtendienst" -#: ../../Zotlabs/Module/Cdav.php:1117 ../../Zotlabs/Module/Connedit.php:926 +#: ../../Zotlabs/Module/Cdav.php:1176 ../../Zotlabs/Module/Connedit.php:930 #: ../../Zotlabs/Module/Profiles.php:792 msgid "Website" msgstr "Webseite" -#: ../../Zotlabs/Module/Cdav.php:1118 ../../Zotlabs/Module/Locs.php:118 +#: ../../Zotlabs/Module/Cdav.php:1177 ../../Zotlabs/Module/Locs.php:118 #: ../../Zotlabs/Module/Admin/Channels.php:160 -#: ../../Zotlabs/Module/Connedit.php:927 ../../Zotlabs/Module/Profiles.php:502 +#: ../../Zotlabs/Module/Connedit.php:931 ../../Zotlabs/Module/Profiles.php:502 #: ../../Zotlabs/Module/Profiles.php:793 msgid "Address" msgstr "Adresse" -#: ../../Zotlabs/Module/Cdav.php:1119 ../../Zotlabs/Module/Connedit.php:928 +#: ../../Zotlabs/Module/Cdav.php:1178 ../../Zotlabs/Module/Connedit.php:932 #: ../../Zotlabs/Module/Profiles.php:794 msgid "Note" msgstr "Hinweis" -#: ../../Zotlabs/Module/Cdav.php:1120 ../../Zotlabs/Module/Connedit.php:929 +#: ../../Zotlabs/Module/Cdav.php:1179 ../../Zotlabs/Module/Connedit.php:933 #: ../../Zotlabs/Module/Profiles.php:795 ../../include/event.php:1290 -#: ../../include/connections.php:674 +#: ../../include/connections.php:682 msgid "Mobile" msgstr "Mobil" -#: ../../Zotlabs/Module/Cdav.php:1121 ../../Zotlabs/Module/Connedit.php:930 +#: ../../Zotlabs/Module/Cdav.php:1180 ../../Zotlabs/Module/Connedit.php:934 #: ../../Zotlabs/Module/Profiles.php:796 ../../include/event.php:1291 -#: ../../include/connections.php:675 +#: ../../include/connections.php:683 msgid "Home" msgstr "Home" -#: ../../Zotlabs/Module/Cdav.php:1122 ../../Zotlabs/Module/Connedit.php:931 +#: ../../Zotlabs/Module/Cdav.php:1181 ../../Zotlabs/Module/Connedit.php:935 #: ../../Zotlabs/Module/Profiles.php:797 ../../include/event.php:1294 -#: ../../include/connections.php:678 +#: ../../include/connections.php:686 msgid "Work" msgstr "Arbeit" -#: ../../Zotlabs/Module/Cdav.php:1124 ../../Zotlabs/Module/Connedit.php:933 +#: ../../Zotlabs/Module/Cdav.php:1183 ../../Zotlabs/Module/Connedit.php:937 #: ../../Zotlabs/Module/Profiles.php:799 #: ../../addon/jappixmini/jappixmini.php:368 msgid "Add Contact" msgstr "Kontakt hinzufügen" -#: ../../Zotlabs/Module/Cdav.php:1125 ../../Zotlabs/Module/Connedit.php:934 +#: ../../Zotlabs/Module/Cdav.php:1184 ../../Zotlabs/Module/Connedit.php:938 #: ../../Zotlabs/Module/Profiles.php:800 msgid "Add Field" msgstr "Feld hinzufügen" -#: ../../Zotlabs/Module/Cdav.php:1127 +#: ../../Zotlabs/Module/Cdav.php:1186 #: ../../Zotlabs/Module/Admin/Plugins.php:453 #: ../../Zotlabs/Module/Settings/Oauth.php:42 #: ../../Zotlabs/Module/Settings/Oauth.php:113 -#: ../../Zotlabs/Module/Connedit.php:936 ../../Zotlabs/Module/Profiles.php:802 -#: ../../Zotlabs/Lib/Apps.php:384 +#: ../../Zotlabs/Module/Connedit.php:940 ../../Zotlabs/Module/Profiles.php:802 +#: ../../Zotlabs/Lib/Apps.php:383 msgid "Update" msgstr "Aktualisieren" -#: ../../Zotlabs/Module/Cdav.php:1130 ../../Zotlabs/Module/Connedit.php:939 +#: ../../Zotlabs/Module/Cdav.php:1189 ../../Zotlabs/Module/Connedit.php:943 msgid "P.O. Box" msgstr "Postfach" -#: ../../Zotlabs/Module/Cdav.php:1131 ../../Zotlabs/Module/Connedit.php:940 +#: ../../Zotlabs/Module/Cdav.php:1190 ../../Zotlabs/Module/Connedit.php:944 msgid "Additional" msgstr "Zusätzlich" -#: ../../Zotlabs/Module/Cdav.php:1132 ../../Zotlabs/Module/Connedit.php:941 +#: ../../Zotlabs/Module/Cdav.php:1191 ../../Zotlabs/Module/Connedit.php:945 msgid "Street" msgstr "Straße" -#: ../../Zotlabs/Module/Cdav.php:1133 ../../Zotlabs/Module/Connedit.php:942 +#: ../../Zotlabs/Module/Cdav.php:1192 ../../Zotlabs/Module/Connedit.php:946 msgid "Locality" msgstr "Ortschaft" -#: ../../Zotlabs/Module/Cdav.php:1134 ../../Zotlabs/Module/Connedit.php:943 +#: ../../Zotlabs/Module/Cdav.php:1193 ../../Zotlabs/Module/Connedit.php:947 msgid "Region" msgstr "Region" -#: ../../Zotlabs/Module/Cdav.php:1135 ../../Zotlabs/Module/Connedit.php:944 +#: ../../Zotlabs/Module/Cdav.php:1194 ../../Zotlabs/Module/Connedit.php:948 msgid "ZIP Code" msgstr "Postleitzahl" -#: ../../Zotlabs/Module/Cdav.php:1136 ../../Zotlabs/Module/Connedit.php:945 +#: ../../Zotlabs/Module/Cdav.php:1195 ../../Zotlabs/Module/Connedit.php:949 #: ../../Zotlabs/Module/Profiles.php:760 msgid "Country" msgstr "Land" -#: ../../Zotlabs/Module/Cdav.php:1183 +#: ../../Zotlabs/Module/Cdav.php:1242 msgid "Default Calendar" msgstr "Standardkalender" -#: ../../Zotlabs/Module/Cdav.php:1193 +#: ../../Zotlabs/Module/Cdav.php:1252 msgid "Default Addressbook" msgstr "Standardadressbuch" @@ -825,7 +822,7 @@ msgid "This site is not a directory server" msgstr "Diese Webseite ist kein Verzeichnisserver" #: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Chat.php:25 -#: ../../addon/gitwiki/Mod_Gitwiki.php:28 ../../addon/chess/chess.php:403 +#: ../../addon/gitwiki/Mod_Gitwiki.php:28 ../../addon/chess/chess.php:431 msgid "You must be logged in to see this page." msgstr "Du musst angemeldet sein, um diese Seite betrachten zu können." @@ -839,12 +836,7 @@ msgstr "Beiträge und Kommentare" msgid "Only posts" msgstr "Nur Beiträge" -#: ../../Zotlabs/Module/Channel.php:97 ../../Zotlabs/Lib/Apps.php:240 -#: ../../include/nav.php:175 -msgid "Channel Home" -msgstr "Mein Kanal" - -#: ../../Zotlabs/Module/Channel.php:112 +#: ../../Zotlabs/Module/Channel.php:107 msgid "Insufficient permissions. Request redirected to profile page." msgstr "Unzureichende Zugriffsrechte. Die Anfrage wurde zur Profil-Seite umgeleitet." @@ -913,16 +905,15 @@ msgstr "Diese Inhalts-Sicherungen können wiederhergestellt werden, indem Du <a #: ../../Zotlabs/Module/Search.php:17 ../../Zotlabs/Module/Photos.php:490 #: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Directory.php:63 -#: ../../Zotlabs/Module/Display.php:22 +#: ../../Zotlabs/Module/Display.php:21 #: ../../Zotlabs/Module/Viewconnections.php:23 msgid "Public access denied." msgstr "Öffentlichen Zugriff verweigert." -#: ../../Zotlabs/Module/Search.php:25 ../../Zotlabs/Module/Search.php:44 -#: ../../Zotlabs/Module/Connections.php:313 ../../Zotlabs/Lib/Apps.php:250 -#: ../../Zotlabs/Widget/Sitesearch.php:31 ../../include/text.php:1021 -#: ../../include/text.php:1033 ../../include/acl_selectors.php:213 -#: ../../include/nav.php:160 +#: ../../Zotlabs/Module/Search.php:44 ../../Zotlabs/Module/Connections.php:313 +#: ../../Zotlabs/Lib/Apps.php:250 ../../Zotlabs/Widget/Sitesearch.php:31 +#: ../../include/text.php:1029 ../../include/text.php:1041 +#: ../../include/acl_selectors.php:213 ../../include/nav.php:204 msgid "Search" msgstr "Suche" @@ -936,6 +927,11 @@ msgstr "Beiträge mit Schlagwort: %s" msgid "Search results for: %s" msgstr "Suchergebnisse für: %s" +#: ../../Zotlabs/Module/Pubstream.php:38 +#: ../../Zotlabs/Widget/Notifications.php:128 +msgid "Public Stream" +msgstr "Öffentlicher Beitrags-Stream" + #: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54 msgid "Location not found." msgstr "Klon nicht gefunden." @@ -988,11 +984,11 @@ msgstr "Wenn möglich, lösche einen Klon, indem Du Dich auf dem jeweiligen Hub msgid "Use this form to drop the location if the hub is no longer operating." msgstr "Benutze dieses Formular zum Löschen eines Klons, wenn es den Hub nicht mehr gibt." -#: ../../Zotlabs/Module/Apporder.php:34 +#: ../../Zotlabs/Module/Apporder.php:39 msgid "Change Order of Navigation Apps" msgstr "App-Reihenfolge in der Navigation ändern" -#: ../../Zotlabs/Module/Apporder.php:35 +#: ../../Zotlabs/Module/Apporder.php:40 msgid "" "Use arrows to move the corresponding app up or down in the display list" msgstr "Benutze die Pfeiltasten, um die jeweilige App in der Anzeigeliste auf- oder abwärts zu bewegen." @@ -1047,18 +1043,20 @@ msgstr "Magic-Auth verwenden, falls verfügbar" #: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241 #: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471 #: ../../Zotlabs/Module/Removeme.php:63 -#: ../../Zotlabs/Module/Admin/Site.php:235 +#: ../../Zotlabs/Module/Admin/Site.php:237 #: ../../Zotlabs/Module/Settings/Channel.php:298 #: ../../Zotlabs/Module/Settings/Display.php:103 #: ../../Zotlabs/Module/Api.php:97 ../../Zotlabs/Module/Photos.php:644 -#: ../../Zotlabs/Module/Wiki.php:182 ../../Zotlabs/Module/Connedit.php:392 -#: ../../Zotlabs/Module/Connedit.php:775 ../../Zotlabs/Module/Menu.php:100 -#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Profiles.php:681 +#: ../../Zotlabs/Module/Wiki.php:218 ../../Zotlabs/Module/Wiki.php:219 +#: ../../Zotlabs/Module/Connedit.php:396 ../../Zotlabs/Module/Connedit.php:779 +#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157 +#: ../../Zotlabs/Module/Profiles.php:681 #: ../../Zotlabs/Module/Filestorage.php:150 #: ../../Zotlabs/Module/Filestorage.php:158 -#: ../../Zotlabs/Storage/Browser.php:351 ../../boot.php:1605 -#: ../../view/theme/redbasic/php/config.php:100 -#: ../../view/theme/redbasic/php/config.php:115 +#: ../../Zotlabs/Storage/Browser.php:351 ../../boot.php:1644 +#: ../../view/theme/redbasic_c/php/config.php:100 +#: ../../view/theme/redbasic_c/php/config.php:115 +#: ../../view/theme/redbasic/php/config.php:98 #: ../../addon/planets/planets.php:149 ../../addon/wppost/wppost.php:82 #: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109 #: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73 @@ -1096,18 +1094,19 @@ msgstr "Nein" #: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241 #: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471 #: ../../Zotlabs/Module/Removeme.php:63 -#: ../../Zotlabs/Module/Admin/Site.php:237 +#: ../../Zotlabs/Module/Admin/Site.php:239 #: ../../Zotlabs/Module/Settings/Channel.php:298 #: ../../Zotlabs/Module/Settings/Display.php:103 #: ../../Zotlabs/Module/Api.php:96 ../../Zotlabs/Module/Photos.php:644 -#: ../../Zotlabs/Module/Wiki.php:182 ../../Zotlabs/Module/Connedit.php:392 -#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157 -#: ../../Zotlabs/Module/Profiles.php:681 +#: ../../Zotlabs/Module/Wiki.php:218 ../../Zotlabs/Module/Wiki.php:219 +#: ../../Zotlabs/Module/Connedit.php:396 ../../Zotlabs/Module/Menu.php:100 +#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Profiles.php:681 #: ../../Zotlabs/Module/Filestorage.php:150 #: ../../Zotlabs/Module/Filestorage.php:158 -#: ../../Zotlabs/Storage/Browser.php:351 ../../boot.php:1605 -#: ../../view/theme/redbasic/php/config.php:100 -#: ../../view/theme/redbasic/php/config.php:115 +#: ../../Zotlabs/Storage/Browser.php:351 ../../boot.php:1644 +#: ../../view/theme/redbasic_c/php/config.php:100 +#: ../../view/theme/redbasic_c/php/config.php:115 +#: ../../view/theme/redbasic/php/config.php:98 #: ../../addon/planets/planets.php:149 ../../addon/wppost/wppost.php:82 #: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109 #: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73 @@ -1248,7 +1247,7 @@ msgstr "Termin nicht gefunden." #: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Tagger.php:51 #: ../../Zotlabs/Module/Like.php:372 ../../include/conversation.php:119 -#: ../../include/text.php:1933 ../../include/event.php:1145 +#: ../../include/text.php:1941 ../../include/event.php:1145 msgid "event" msgstr "Termin" @@ -1316,13 +1315,13 @@ msgstr "Beschreibung bearbeiten" msgid "Edit Location" msgstr "Ort bearbeiten" -#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1065 -#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/ThreadItem.php:739 -#: ../../include/conversation.php:1277 +#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1070 +#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/ThreadItem.php:753 +#: ../../include/conversation.php:1313 msgid "Preview" msgstr "Vorschau" -#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1340 +#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1385 msgid "Permission settings" msgstr "Berechtigungs-Einstellungen" @@ -1347,7 +1346,7 @@ msgid "Delete event" msgstr "Termin löschen" #: ../../Zotlabs/Module/Events.php:660 ../../Zotlabs/Module/Cal.php:313 -#: ../../include/text.php:1752 +#: ../../include/text.php:1760 msgid "Link to Source" msgstr "Link zur Quelle" @@ -1364,7 +1363,7 @@ msgid "Create Event" msgstr "Termin anlegen" #: ../../Zotlabs/Module/Events.php:691 ../../Zotlabs/Module/Cal.php:339 -#: ../../include/channel.php:1488 +#: ../../include/channel.php:1588 msgid "Export" msgstr "Exportieren" @@ -1432,21 +1431,21 @@ msgstr "Ort (URL), um die App zu kaufen" msgid "Please login." msgstr "Bitte melde dich an." -#: ../../Zotlabs/Module/Magic.php:71 +#: ../../Zotlabs/Module/Magic.php:72 msgid "Hub not found." msgstr "Server nicht gefunden." #: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Tagger.php:47 #: ../../Zotlabs/Module/Like.php:370 #: ../../addon/redphotos/redphotohelper.php:71 -#: ../../addon/diaspora/Receiver.php:1370 ../../include/conversation.php:116 -#: ../../include/text.php:1930 +#: ../../addon/diaspora/Receiver.php:1424 ../../addon/pubcrawl/as.php:1288 +#: ../../include/conversation.php:116 ../../include/text.php:1938 msgid "photo" msgstr "Foto" #: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Like.php:370 -#: ../../addon/diaspora/Receiver.php:1370 ../../include/conversation.php:144 -#: ../../include/text.php:1936 +#: ../../addon/diaspora/Receiver.php:1424 ../../addon/pubcrawl/as.php:1288 +#: ../../include/conversation.php:144 ../../include/text.php:1944 msgid "status" msgstr "Status" @@ -1494,7 +1493,7 @@ msgid "" msgstr "Mit diesem Formular kannst Du existierende Beiträge und Inhalte aus einer Sicherungsdatei importieren." #: ../../Zotlabs/Module/Import_items.php:127 -#: ../../Zotlabs/Module/Import.php:505 +#: ../../Zotlabs/Module/Import.php:516 msgid "File to Upload" msgstr "Hochzuladende Datei:" @@ -1570,6 +1569,7 @@ msgstr "Diesen Kanal löschen" #: ../../Zotlabs/Module/Removeme.php:61 #: ../../Zotlabs/Module/Removeaccount.php:58 +#: ../../Zotlabs/Module/Changeaddr.php:78 msgid "WARNING: " msgstr "WARNUNG: " @@ -1584,6 +1584,7 @@ msgstr "Dieser Schritt ist endgültig und kann nicht rückgängig gemacht werden #: ../../Zotlabs/Module/Removeme.php:62 #: ../../Zotlabs/Module/Removeaccount.php:59 +#: ../../Zotlabs/Module/Changeaddr.php:79 msgid "Please enter your password for verification:" msgstr "Bitte gib zur Bestätigung Dein Passwort ein:" @@ -1611,7 +1612,7 @@ msgid "NEW" msgstr "NEU" #: ../../Zotlabs/Module/Sharedwithme.php:107 -#: ../../Zotlabs/Storage/Browser.php:236 ../../include/text.php:1386 +#: ../../Zotlabs/Storage/Browser.php:236 ../../include/text.php:1394 msgid "Size" msgstr "Größe" @@ -2204,9 +2205,10 @@ msgstr "Versuche, diesen Updateschritt automatisch auszuführen" #: ../../Zotlabs/Module/Admin/Plugins.php:259 #: ../../Zotlabs/Module/Admin/Themes.php:72 ../../Zotlabs/Module/Thing.php:89 -#: ../../Zotlabs/Module/Viewsrc.php:25 ../../Zotlabs/Module/Display.php:35 +#: ../../Zotlabs/Module/Viewsrc.php:25 ../../Zotlabs/Module/Display.php:33 +#: ../../Zotlabs/Module/Display.php:347 #: ../../Zotlabs/Module/Filestorage.php:24 ../../Zotlabs/Module/Admin.php:62 -#: ../../include/items.php:3361 +#: ../../include/items.php:3410 msgid "Item not found." msgstr "Element nicht gefunden." @@ -2237,7 +2239,7 @@ msgstr "Aktivieren" #: ../../Zotlabs/Module/Admin/Channels.php:145 #: ../../Zotlabs/Module/Admin/Themes.php:122 #: ../../Zotlabs/Module/Admin/Themes.php:156 -#: ../../Zotlabs/Module/Admin/Site.php:269 +#: ../../Zotlabs/Module/Admin/Site.php:271 #: ../../Zotlabs/Module/Admin/Security.php:86 #: ../../Zotlabs/Module/Admin.php:136 msgid "Administration" @@ -2256,7 +2258,8 @@ msgstr "Umschalten" #: ../../Zotlabs/Module/Admin/Plugins.php:344 #: ../../Zotlabs/Module/Admin/Themes.php:125 ../../Zotlabs/Lib/Apps.php:236 -#: ../../Zotlabs/Widget/Settings_menu.php:133 ../../include/nav.php:201 +#: ../../Zotlabs/Widget/Settings_menu.php:133 ../../include/nav.php:132 +#: ../../include/nav.php:217 msgid "Settings" msgstr "Einstellungen" @@ -2319,7 +2322,7 @@ msgstr "Plugin-Repository herunterladen" msgid "Install new repo" msgstr "Neues Repository installieren" -#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:384 +#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:383 msgid "Install" msgstr "Installieren" @@ -2340,7 +2343,7 @@ msgid "Switch branch" msgstr "Zweig/Branch wechseln" #: ../../Zotlabs/Module/Admin/Plugins.php:455 -#: ../../Zotlabs/Module/Photos.php:962 ../../Zotlabs/Module/Tagrm.php:137 +#: ../../Zotlabs/Module/Photos.php:967 ../../Zotlabs/Module/Tagrm.php:137 #: ../../addon/superblock/superblock.php:116 msgid "Remove" msgstr "Entfernen" @@ -2363,7 +2366,7 @@ msgstr[1] "%s Konten gelöscht" msgid "Account not found" msgstr "Konto nicht gefunden" -#: ../../Zotlabs/Module/Admin/Accounts.php:90 +#: ../../Zotlabs/Module/Admin/Accounts.php:90 ../../include/channel.php:2357 #, php-format msgid "Account '%s' deleted" msgstr "Konto '%s' gelöscht" @@ -2402,7 +2405,7 @@ msgid "No registrations." msgstr "Keine Registrierungen." #: ../../Zotlabs/Module/Admin/Accounts.php:171 -#: ../../Zotlabs/Module/Connections.php:282 ../../include/conversation.php:685 +#: ../../Zotlabs/Module/Connections.php:282 ../../include/conversation.php:716 msgid "Approve" msgstr "Genehmigen" @@ -2411,12 +2414,12 @@ msgid "Deny" msgstr "Verweigern" #: ../../Zotlabs/Module/Admin/Accounts.php:174 -#: ../../Zotlabs/Module/Connedit.php:618 +#: ../../Zotlabs/Module/Connedit.php:622 msgid "Block" msgstr "Blockieren" #: ../../Zotlabs/Module/Admin/Accounts.php:175 -#: ../../Zotlabs/Module/Connedit.php:618 +#: ../../Zotlabs/Module/Connedit.php:622 msgid "Unblock" msgstr "Freigeben" @@ -2559,7 +2562,7 @@ msgid "Disallow Code" msgstr "Code sperren" #: ../../Zotlabs/Module/Admin/Channels.php:154 -#: ../../include/conversation.php:1757 ../../include/nav.php:355 +#: ../../include/conversation.php:1791 ../../include/nav.php:399 msgid "Channel" msgstr "Kanal" @@ -2608,8 +2611,9 @@ msgstr "[Nicht unterstützt]" msgid "Site settings updated." msgstr "Site-Einstellungen aktualisiert." -#: ../../Zotlabs/Module/Admin/Site.php:168 -#: ../../view/theme/redbasic/php/config.php:15 ../../include/text.php:2928 +#: ../../Zotlabs/Module/Admin/Site.php:170 +#: ../../view/theme/redbasic_c/php/config.php:15 +#: ../../view/theme/redbasic/php/config.php:15 ../../include/text.php:2943 msgid "Default" msgstr "Standard" @@ -2652,334 +2656,345 @@ msgstr "Meine Seite hat nur freien Zugriff" msgid "My site offers free accounts with optional paid upgrades" msgstr "Mein Server bietet kostenlose Konten mit der Möglichkeit zu bezahlten Upgrades" -#: ../../Zotlabs/Module/Admin/Site.php:256 +#: ../../Zotlabs/Module/Admin/Site.php:258 msgid "Beginner/Basic" msgstr "Anfänger/Basis" -#: ../../Zotlabs/Module/Admin/Site.php:257 +#: ../../Zotlabs/Module/Admin/Site.php:259 msgid "Novice - not skilled but willing to learn" msgstr "Anfänger - unerfahren, aber bereit zu lernen" -#: ../../Zotlabs/Module/Admin/Site.php:258 +#: ../../Zotlabs/Module/Admin/Site.php:260 msgid "Intermediate - somewhat comfortable" msgstr "Fortgeschritten - relativ komfortabel" -#: ../../Zotlabs/Module/Admin/Site.php:259 +#: ../../Zotlabs/Module/Admin/Site.php:261 msgid "Advanced - very comfortable" msgstr "Fortgeschritten - sehr komfortabel" -#: ../../Zotlabs/Module/Admin/Site.php:260 +#: ../../Zotlabs/Module/Admin/Site.php:262 msgid "Expert - I can write computer code" msgstr "Experte - Ich kann Computercode schreiben" -#: ../../Zotlabs/Module/Admin/Site.php:261 +#: ../../Zotlabs/Module/Admin/Site.php:263 msgid "Wizard - I probably know more than you do" msgstr "Zauberer - ich kann wahrscheinlich mehr als Du" -#: ../../Zotlabs/Module/Admin/Site.php:270 ../../Zotlabs/Widget/Admin.php:22 +#: ../../Zotlabs/Module/Admin/Site.php:272 ../../Zotlabs/Widget/Admin.php:22 msgid "Site" msgstr "Seite" -#: ../../Zotlabs/Module/Admin/Site.php:272 +#: ../../Zotlabs/Module/Admin/Site.php:274 #: ../../Zotlabs/Module/Register.php:251 msgid "Registration" msgstr "Registrierung" -#: ../../Zotlabs/Module/Admin/Site.php:273 +#: ../../Zotlabs/Module/Admin/Site.php:275 msgid "File upload" msgstr "Dateiupload" -#: ../../Zotlabs/Module/Admin/Site.php:274 +#: ../../Zotlabs/Module/Admin/Site.php:276 msgid "Policies" msgstr "Richtlinien" -#: ../../Zotlabs/Module/Admin/Site.php:275 +#: ../../Zotlabs/Module/Admin/Site.php:277 #: ../../include/contact_widgets.php:16 msgid "Advanced" msgstr "Fortgeschritten" -#: ../../Zotlabs/Module/Admin/Site.php:279 +#: ../../Zotlabs/Module/Admin/Site.php:281 #: ../../addon/statusnet/statusnet.php:890 msgid "Site name" msgstr "Seitenname" -#: ../../Zotlabs/Module/Admin/Site.php:281 +#: ../../Zotlabs/Module/Admin/Site.php:283 msgid "Site default technical skill level" msgstr "Standard-Qualifikationsstufe der Website" -#: ../../Zotlabs/Module/Admin/Site.php:281 +#: ../../Zotlabs/Module/Admin/Site.php:283 msgid "Used to provide a member experience matched to technical comfort level" msgstr "Dies wird verwendet, um eine Benutzererfahrung passend zur technischen Qualifikationsstufe zu bieten." -#: ../../Zotlabs/Module/Admin/Site.php:283 +#: ../../Zotlabs/Module/Admin/Site.php:285 msgid "Lock the technical skill level setting" msgstr "Sperre die technische Qualifikationsstufe" -#: ../../Zotlabs/Module/Admin/Site.php:283 +#: ../../Zotlabs/Module/Admin/Site.php:285 msgid "Members can set their own technical comfort level by default" msgstr "Benutzer können standardmäßig ihre eigene technische Qualifikationsstufe einstellen" -#: ../../Zotlabs/Module/Admin/Site.php:285 +#: ../../Zotlabs/Module/Admin/Site.php:287 msgid "Banner/Logo" msgstr "Banner/Logo" -#: ../../Zotlabs/Module/Admin/Site.php:286 +#: ../../Zotlabs/Module/Admin/Site.php:288 msgid "Administrator Information" msgstr "Administrator-Informationen" -#: ../../Zotlabs/Module/Admin/Site.php:286 +#: ../../Zotlabs/Module/Admin/Site.php:288 msgid "" "Contact information for site administrators. Displayed on siteinfo page. " "BBCode can be used here" msgstr "Kontaktinformationen für Administratoren des Servers. Wird auf der siteinfo-Seite angezeigt. BBCode kann verwendet werden." -#: ../../Zotlabs/Module/Admin/Site.php:287 +#: ../../Zotlabs/Module/Admin/Site.php:289 #: ../../Zotlabs/Module/Siteinfo.php:22 msgid "Site Information" msgstr "Seiteninformationen" -#: ../../Zotlabs/Module/Admin/Site.php:287 +#: ../../Zotlabs/Module/Admin/Site.php:289 msgid "" "Publicly visible description of this site. Displayed on siteinfo page. " "BBCode can be used here" msgstr "Öffentlich sichtbare Beschreibung dieses Servers. Wird auf der siteinfo-Seite angezeigt. BBCode kann hier verwendet werden." -#: ../../Zotlabs/Module/Admin/Site.php:288 +#: ../../Zotlabs/Module/Admin/Site.php:290 msgid "System language" msgstr "System-Sprache" -#: ../../Zotlabs/Module/Admin/Site.php:289 +#: ../../Zotlabs/Module/Admin/Site.php:291 msgid "System theme" msgstr "System-Design" -#: ../../Zotlabs/Module/Admin/Site.php:289 +#: ../../Zotlabs/Module/Admin/Site.php:291 msgid "" "Default system theme - may be over-ridden by user profiles - <a href='#' " "id='cnftheme'>change theme settings</a>" msgstr "Standard-System-Design – kann durch Nutzerprofile überschieben werden – <a href='#' id='cnftheme'>Design-Einstellungen ändern</a>" -#: ../../Zotlabs/Module/Admin/Site.php:290 +#: ../../Zotlabs/Module/Admin/Site.php:292 msgid "Mobile system theme" msgstr "System-Design für mobile Geräte:" -#: ../../Zotlabs/Module/Admin/Site.php:290 +#: ../../Zotlabs/Module/Admin/Site.php:292 msgid "Theme for mobile devices" msgstr "Theme für mobile Geräte" -#: ../../Zotlabs/Module/Admin/Site.php:292 +#: ../../Zotlabs/Module/Admin/Site.php:294 msgid "Allow Feeds as Connections" msgstr "Feeds als Verbindungen erlauben" -#: ../../Zotlabs/Module/Admin/Site.php:292 +#: ../../Zotlabs/Module/Admin/Site.php:294 msgid "(Heavy system resource usage)" msgstr "(führt zu hoher Systemlast)" -#: ../../Zotlabs/Module/Admin/Site.php:293 +#: ../../Zotlabs/Module/Admin/Site.php:295 msgid "Maximum image size" msgstr "Maximale Bildgröße" -#: ../../Zotlabs/Module/Admin/Site.php:293 +#: ../../Zotlabs/Module/Admin/Site.php:295 msgid "" "Maximum size in bytes of uploaded images. Default is 0, which means no " "limits." msgstr "Maximale Größe hochgeladener Bilder in Bytes. Standard ist 0 (keine Einschränkung)." -#: ../../Zotlabs/Module/Admin/Site.php:294 +#: ../../Zotlabs/Module/Admin/Site.php:296 msgid "Does this site allow new member registration?" msgstr "Erlaubt dieser Server die Registrierung neuer Nutzer?" -#: ../../Zotlabs/Module/Admin/Site.php:295 +#: ../../Zotlabs/Module/Admin/Site.php:297 msgid "Invitation only" msgstr "Nur mit Einladung" -#: ../../Zotlabs/Module/Admin/Site.php:295 +#: ../../Zotlabs/Module/Admin/Site.php:297 msgid "" "Only allow new member registrations with an invitation code. Above register " "policy must be set to Yes." msgstr "Erlaube die Neuregistrierung von Mitglieder nur mit einem Einladungscode. Die Registrierungs-Politik muss oben auf Ja gesetzt werden." -#: ../../Zotlabs/Module/Admin/Site.php:296 +#: ../../Zotlabs/Module/Admin/Site.php:298 msgid "Which best describes the types of account offered by this hub?" msgstr "Was ist die passendste Beschreibung der Konten auf diesem Hub?" -#: ../../Zotlabs/Module/Admin/Site.php:297 +#: ../../Zotlabs/Module/Admin/Site.php:299 msgid "Register text" msgstr "Registrierungstext" -#: ../../Zotlabs/Module/Admin/Site.php:297 +#: ../../Zotlabs/Module/Admin/Site.php:299 msgid "Will be displayed prominently on the registration page." msgstr "Wird gut sichtbar auf der Registrierungs-Seite angezeigt." -#: ../../Zotlabs/Module/Admin/Site.php:298 +#: ../../Zotlabs/Module/Admin/Site.php:300 msgid "Site homepage to show visitors (default: login box)" msgstr "Homepage des Hubs, die Besuchern angezeigt wird (Voreinstellung: Anmeldemaske)" -#: ../../Zotlabs/Module/Admin/Site.php:298 +#: ../../Zotlabs/Module/Admin/Site.php:300 msgid "" "example: 'public' to show public stream, 'page/sys/home' to show a system " "webpage called 'home' or 'include:home.html' to include a file." msgstr "Beispiele: 'public', um den Stream aller öffentlichen Beiträge anzuzeigen, 'page/sys/home', um eine System-Webseite namens 'home' anzuzeigen, 'include:home.html', um eine Datei einzufügen." -#: ../../Zotlabs/Module/Admin/Site.php:299 +#: ../../Zotlabs/Module/Admin/Site.php:301 msgid "Preserve site homepage URL" msgstr "Homepage-URL schützen" -#: ../../Zotlabs/Module/Admin/Site.php:299 +#: ../../Zotlabs/Module/Admin/Site.php:301 msgid "" "Present the site homepage in a frame at the original location instead of " "redirecting" msgstr "Zeigt die Homepage an der Original-URL in einem Frame an, statt auf die eigentliche Adresse der Seite umzuleiten." -#: ../../Zotlabs/Module/Admin/Site.php:300 +#: ../../Zotlabs/Module/Admin/Site.php:302 msgid "Accounts abandoned after x days" msgstr "Konten gelten nach X Tagen als unbenutzt" -#: ../../Zotlabs/Module/Admin/Site.php:300 +#: ../../Zotlabs/Module/Admin/Site.php:302 msgid "" "Will not waste system resources polling external sites for abandonded " "accounts. Enter 0 for no time limit." msgstr "Verschwende keine Systemressourcen auf das Pollen von externen Seiten, wenn das Konto nicht mehr benutzt wird. Trage hier 0 für kein zeitliches Limit." -#: ../../Zotlabs/Module/Admin/Site.php:301 +#: ../../Zotlabs/Module/Admin/Site.php:303 msgid "Allowed friend domains" msgstr "Erlaubte Domains für Kontakte" -#: ../../Zotlabs/Module/Admin/Site.php:301 +#: ../../Zotlabs/Module/Admin/Site.php:303 msgid "" "Comma separated list of domains which are allowed to establish friendships " "with this site. Wildcards are accepted. Empty to allow any domains" msgstr "Liste der Domains, die für Freundschaften erlaubt sind, durch Kommas getrennt. Platzhalter werden akzeptiert. Leer lassen, um alle Domains zu erlauben." -#: ../../Zotlabs/Module/Admin/Site.php:302 +#: ../../Zotlabs/Module/Admin/Site.php:304 msgid "Verify Email Addresses" msgstr "E-Mail-Adressen überprüfen" -#: ../../Zotlabs/Module/Admin/Site.php:302 +#: ../../Zotlabs/Module/Admin/Site.php:304 msgid "" "Check to verify email addresses used in account registration (recommended)." msgstr "Aktivieren, um die Überprüfung von E-Mail-Adressen bei der Registrierung von Benutzerkonten zu aktivieren (empfohlen)." -#: ../../Zotlabs/Module/Admin/Site.php:303 +#: ../../Zotlabs/Module/Admin/Site.php:305 msgid "Force publish" msgstr "Veröffentlichung erzwingen" -#: ../../Zotlabs/Module/Admin/Site.php:303 +#: ../../Zotlabs/Module/Admin/Site.php:305 msgid "" "Check to force all profiles on this site to be listed in the site directory." msgstr "Die Veröffentlichung aller Profile dieses Servers im Verzeichnis erzwingen." -#: ../../Zotlabs/Module/Admin/Site.php:304 +#: ../../Zotlabs/Module/Admin/Site.php:306 msgid "Import Public Streams" msgstr "Öffentliche Beiträge importieren" -#: ../../Zotlabs/Module/Admin/Site.php:304 +#: ../../Zotlabs/Module/Admin/Site.php:306 msgid "" "Import and allow access to public content pulled from other sites. Warning: " "this content is unmoderated." msgstr "Öffentliche Beiträge von anderen Servern importieren und zur Verfügung stellen. Warnung: Diese Inhalte sind nicht moderiert." -#: ../../Zotlabs/Module/Admin/Site.php:305 +#: ../../Zotlabs/Module/Admin/Site.php:307 msgid "Login on Homepage" msgstr "Log-in auf der Startseite" -#: ../../Zotlabs/Module/Admin/Site.php:305 +#: ../../Zotlabs/Module/Admin/Site.php:307 msgid "" "Present a login box to visitors on the home page if no other content has " "been configured." msgstr "Zeigt Besuchern der Homepage eine Anmeldemaske, falls keine anderen Inhalte konfiguriert wurden." -#: ../../Zotlabs/Module/Admin/Site.php:306 +#: ../../Zotlabs/Module/Admin/Site.php:308 msgid "Enable context help" msgstr "Kontext-Hilfe aktivieren" -#: ../../Zotlabs/Module/Admin/Site.php:306 +#: ../../Zotlabs/Module/Admin/Site.php:308 msgid "" "Display contextual help for the current page when the help button is " "pressed." msgstr "Zeigt Kontext-sensitive Hilfe für die aktuelle Seite an, wenn der Hilfe-Knopf geklickt wird." -#: ../../Zotlabs/Module/Admin/Site.php:308 +#: ../../Zotlabs/Module/Admin/Site.php:310 msgid "Reply-to email address for system generated email." msgstr "Antwortadresse (reply-to) für Emails, die vom System generiert wurden." -#: ../../Zotlabs/Module/Admin/Site.php:309 +#: ../../Zotlabs/Module/Admin/Site.php:311 msgid "Sender (From) email address for system generated email." msgstr "Absenderadresse (from) für Emails, die vom System generiert wurden." -#: ../../Zotlabs/Module/Admin/Site.php:310 +#: ../../Zotlabs/Module/Admin/Site.php:312 msgid "Name of email sender for system generated email." msgstr "Name des Versenders von Emails, die vom System generiert wurden." -#: ../../Zotlabs/Module/Admin/Site.php:312 +#: ../../Zotlabs/Module/Admin/Site.php:314 msgid "Directory Server URL" msgstr "Verzeichnisserver-URL" -#: ../../Zotlabs/Module/Admin/Site.php:312 +#: ../../Zotlabs/Module/Admin/Site.php:314 msgid "Default directory server" msgstr "Standard-Verzeichnisserver" -#: ../../Zotlabs/Module/Admin/Site.php:314 +#: ../../Zotlabs/Module/Admin/Site.php:316 msgid "Proxy user" msgstr "Proxy Benutzer" -#: ../../Zotlabs/Module/Admin/Site.php:315 +#: ../../Zotlabs/Module/Admin/Site.php:317 msgid "Proxy URL" msgstr "Proxy URL" -#: ../../Zotlabs/Module/Admin/Site.php:316 +#: ../../Zotlabs/Module/Admin/Site.php:318 msgid "Network timeout" msgstr "Netzwerk-Timeout" -#: ../../Zotlabs/Module/Admin/Site.php:316 +#: ../../Zotlabs/Module/Admin/Site.php:318 msgid "Value is in seconds. Set to 0 for unlimited (not recommended)." msgstr "Wert in Sekunden. 0 für unbegrenzt (nicht empfohlen)." -#: ../../Zotlabs/Module/Admin/Site.php:317 +#: ../../Zotlabs/Module/Admin/Site.php:319 msgid "Delivery interval" msgstr "Auslieferung Intervall" -#: ../../Zotlabs/Module/Admin/Site.php:317 +#: ../../Zotlabs/Module/Admin/Site.php:319 msgid "" "Delay background delivery processes by this many seconds to reduce system " "load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 " "for large dedicated servers." msgstr "Verzögere im Hintergrund laufende Auslieferungsprozesse um die angegebene Anzahl Sekunden, um die Systemlast zu verringern. Empfehlungen: 4-5 für Shared Hosts, 2-3 für VPS, 0-1 für große dedizierte Server." -#: ../../Zotlabs/Module/Admin/Site.php:318 +#: ../../Zotlabs/Module/Admin/Site.php:320 msgid "Deliveries per process" msgstr "Zustellungen pro Prozess" -#: ../../Zotlabs/Module/Admin/Site.php:318 +#: ../../Zotlabs/Module/Admin/Site.php:320 msgid "" "Number of deliveries to attempt in a single operating system process. Adjust" " if necessary to tune system performance. Recommend: 1-5." msgstr "Anzahl der Zustellungen, die innerhalb eines einzelnen Betriebssystemprozesses versucht werden. Anpassen, falls nötig, um die System-Performance zu verbessern. Empfehlung: 1-5." -#: ../../Zotlabs/Module/Admin/Site.php:319 +#: ../../Zotlabs/Module/Admin/Site.php:321 msgid "Poll interval" msgstr "Abfrageintervall" -#: ../../Zotlabs/Module/Admin/Site.php:319 +#: ../../Zotlabs/Module/Admin/Site.php:321 msgid "" "Delay background polling processes by this many seconds to reduce system " "load. If 0, use delivery interval." msgstr "Verzögere Hintergrundprozesse um diese Anzahl Sekunden, um die Systemlast zu reduzieren. Bei 0 wird das Auslieferungsintervall verwendet." -#: ../../Zotlabs/Module/Admin/Site.php:320 +#: ../../Zotlabs/Module/Admin/Site.php:322 +msgid "Path to ImageMagick convert program" +msgstr "Pfad zum ImageMagick-Programm convert" + +#: ../../Zotlabs/Module/Admin/Site.php:322 +msgid "" +"If set, use this program to generate photo thumbnails for huge images ( > " +"4000 pixels in either dimension), otherwise memory exhaustion may occur. " +"Example: /usr/bin/convert" +msgstr "Wenn gesetzt, dann verwende dieses Programm zum Erzeugen von Vorschaubildern großer Fotos (>4000 Pixel in beiden Richtungen), anderenfalls kann Speicherüberlauf auftreten. Beispiel: /usr/bin/convert" + +#: ../../Zotlabs/Module/Admin/Site.php:323 msgid "Maximum Load Average" msgstr "Maximales Load Average" -#: ../../Zotlabs/Module/Admin/Site.php:320 +#: ../../Zotlabs/Module/Admin/Site.php:323 msgid "" "Maximum system load before delivery and poll processes are deferred - " "default 50." msgstr "Maximale Systemlast, bevor Verteil- und Empfangsprozesse verschoben werden – Standard 50" -#: ../../Zotlabs/Module/Admin/Site.php:321 +#: ../../Zotlabs/Module/Admin/Site.php:324 msgid "Expiration period in days for imported (grid/network) content" msgstr "Setze den Zeitraum (in Tagen), ab wann importierte (aus dem Netzwerk) Inhalte ablaufen sollen" -#: ../../Zotlabs/Module/Admin/Site.php:321 +#: ../../Zotlabs/Module/Admin/Site.php:324 msgid "0 for no expiration of imported content" msgstr "0 = keine Löschung importierter Inhalte" @@ -3025,8 +3040,8 @@ msgstr "Zusätzliche Informationen (optional)" #: ../../Zotlabs/Module/Admin/Profs.php:74 #: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32 #: ../../Zotlabs/Module/Rbmark.php:104 ../../Zotlabs/Module/Filer.php:53 -#: ../../Zotlabs/Widget/Notes.php:18 ../../include/text.php:1022 -#: ../../include/text.php:1034 +#: ../../Zotlabs/Widget/Notes.php:18 ../../include/text.php:1030 +#: ../../include/text.php:1042 msgid "Save" msgstr "Speichern" @@ -3225,16 +3240,16 @@ msgid "Visible to:" msgstr "Sichtbar für:" #: ../../Zotlabs/Module/Lockview.php:117 ../../Zotlabs/Module/Lockview.php:153 -#: ../../Zotlabs/Module/Acl.php:117 ../../include/acl_selectors.php:183 +#: ../../Zotlabs/Module/Acl.php:118 ../../include/acl_selectors.php:183 msgctxt "acl" msgid "Profile" msgstr "Profil" -#: ../../Zotlabs/Module/Moderate.php:37 +#: ../../Zotlabs/Module/Moderate.php:55 msgid "Comment approved" msgstr "Kommentar bestätigt" -#: ../../Zotlabs/Module/Moderate.php:41 +#: ../../Zotlabs/Module/Moderate.php:59 msgid "Comment deleted" msgstr "Kommentar gelöscht" @@ -3258,25 +3273,25 @@ msgstr "Name der Berechtigungsrolle" #: ../../Zotlabs/Module/Settings/Permcats.php:103 #: ../../Zotlabs/Module/Settings/Tokens.php:161 -#: ../../Zotlabs/Module/Connedit.php:904 +#: ../../Zotlabs/Module/Connedit.php:908 msgid "My Settings" msgstr "Meine Einstellungen" #: ../../Zotlabs/Module/Settings/Permcats.php:105 #: ../../Zotlabs/Module/Settings/Tokens.php:163 -#: ../../Zotlabs/Module/Connedit.php:899 +#: ../../Zotlabs/Module/Connedit.php:903 msgid "inherited" msgstr "geerbt" #: ../../Zotlabs/Module/Settings/Permcats.php:108 #: ../../Zotlabs/Module/Settings/Tokens.php:166 -#: ../../Zotlabs/Module/Connedit.php:906 +#: ../../Zotlabs/Module/Connedit.php:910 msgid "Individual Permissions" msgstr "Individuelle Zugriffsrechte" #: ../../Zotlabs/Module/Settings/Permcats.php:109 #: ../../Zotlabs/Module/Settings/Tokens.php:167 -#: ../../Zotlabs/Module/Connedit.php:907 +#: ../../Zotlabs/Module/Connedit.php:911 msgid "" "Some permissions may be inherited from your channel's <a " "href=\"settings\"><strong>privacy settings</strong></a>, which have higher " @@ -3289,9 +3304,9 @@ msgstr "Einige Berechtigungen werden möglicherweise von den globalen <a href=\" #: ../../Zotlabs/Module/Settings/Channel.php:67 #: ../../Zotlabs/Module/Settings/Channel.php:70 #: ../../Zotlabs/Module/Settings/Channel.php:81 -#: ../../Zotlabs/Module/Connedit.php:707 ../../Zotlabs/Widget/Affinity.php:28 -#: ../../include/selectors.php:123 ../../include/channel.php:408 -#: ../../include/channel.php:409 ../../include/channel.php:416 +#: ../../Zotlabs/Module/Connedit.php:711 ../../Zotlabs/Widget/Affinity.php:28 +#: ../../include/selectors.php:123 ../../include/channel.php:423 +#: ../../include/channel.php:424 ../../include/channel.php:431 msgid "Friends" msgstr "Freunde" @@ -3345,7 +3360,7 @@ msgid "Allow us to suggest you as a potential friend to new members?" msgstr "Dürfen wir Dich neuen Mitgliedern als potentiellen Kontakt vorschlagen?" #: ../../Zotlabs/Module/Settings/Channel.php:408 -#: ../../Zotlabs/Module/Profile_photo.php:429 +#: ../../Zotlabs/Module/Profile_photo.php:437 #: ../../Zotlabs/Module/Cover_photo.php:365 msgid "or" msgstr "oder" @@ -3367,7 +3382,7 @@ msgid "Basic Settings" msgstr "Grundeinstellungen" #: ../../Zotlabs/Module/Settings/Channel.php:486 -#: ../../include/channel.php:1373 +#: ../../include/channel.php:1473 msgid "Full Name:" msgstr "Voller Name:" @@ -3484,8 +3499,8 @@ msgid "May reduce spam activity" msgstr "Kann die Spam-Aktivität verringern" #: ../../Zotlabs/Module/Settings/Channel.php:512 -msgid "Default Access Control List (ACL)" -msgstr "Standard-Zugriffsberechtigungsliste (ACL)" +msgid "Default Privacy Group" +msgstr "Standard-Gruppe" #: ../../Zotlabs/Module/Settings/Channel.php:514 msgid "Use my default audience setting for the type of object published" @@ -3738,7 +3753,7 @@ msgid "Expires (yyyy-mm-dd)" msgstr "Läuft ab (jjjj-mm-tt)" #: ../../Zotlabs/Module/Settings/Tokens.php:160 -#: ../../Zotlabs/Module/Connedit.php:903 +#: ../../Zotlabs/Module/Connedit.php:907 msgid "Their Settings" msgstr "Deren Einstellungen" @@ -3848,107 +3863,107 @@ msgstr "Kein spezielles Design für mobile Geräte" msgid "%s - (Experimental)" msgstr "%s – (experimentell)" -#: ../../Zotlabs/Module/Settings/Display.php:198 +#: ../../Zotlabs/Module/Settings/Display.php:202 msgid "Display Settings" msgstr "Anzeige-Einstellungen" -#: ../../Zotlabs/Module/Settings/Display.php:199 +#: ../../Zotlabs/Module/Settings/Display.php:203 msgid "Theme Settings" msgstr "Design-Einstellungen" -#: ../../Zotlabs/Module/Settings/Display.php:200 +#: ../../Zotlabs/Module/Settings/Display.php:204 msgid "Custom Theme Settings" msgstr "Benutzerdefinierte Design-Einstellungen" -#: ../../Zotlabs/Module/Settings/Display.php:201 +#: ../../Zotlabs/Module/Settings/Display.php:205 msgid "Content Settings" msgstr "Inhaltseinstellungen" -#: ../../Zotlabs/Module/Settings/Display.php:207 +#: ../../Zotlabs/Module/Settings/Display.php:211 msgid "Display Theme:" msgstr "Anzeige-Design:" -#: ../../Zotlabs/Module/Settings/Display.php:208 +#: ../../Zotlabs/Module/Settings/Display.php:212 msgid "Select scheme" msgstr "Schema wählen" -#: ../../Zotlabs/Module/Settings/Display.php:210 +#: ../../Zotlabs/Module/Settings/Display.php:214 msgid "Mobile Theme:" msgstr "Design für mobile Geräte:" -#: ../../Zotlabs/Module/Settings/Display.php:211 +#: ../../Zotlabs/Module/Settings/Display.php:215 msgid "Preload images before rendering the page" msgstr "Bilder im voraus laden, bevor die Seite angezeigt wird" -#: ../../Zotlabs/Module/Settings/Display.php:211 +#: ../../Zotlabs/Module/Settings/Display.php:215 msgid "" "The subjective page load time will be longer but the page will be ready when" " displayed" msgstr "Die empfundene Ladezeit wird sich erhöhen, aber dafür ist das Layout stabil, sobald eine Seite angezeigt wird" -#: ../../Zotlabs/Module/Settings/Display.php:212 +#: ../../Zotlabs/Module/Settings/Display.php:216 msgid "Enable user zoom on mobile devices" msgstr "Zoom auf Mobilgeräten aktivieren" -#: ../../Zotlabs/Module/Settings/Display.php:213 +#: ../../Zotlabs/Module/Settings/Display.php:217 msgid "Update browser every xx seconds" msgstr "Browser alle xx Sekunden aktualisieren" -#: ../../Zotlabs/Module/Settings/Display.php:213 +#: ../../Zotlabs/Module/Settings/Display.php:217 msgid "Minimum of 10 seconds, no maximum" msgstr "Minimum 10 Sekunden, kein Maximum" -#: ../../Zotlabs/Module/Settings/Display.php:214 +#: ../../Zotlabs/Module/Settings/Display.php:218 msgid "Maximum number of conversations to load at any time:" msgstr "Maximale Anzahl von Unterhaltungen, die auf einmal geladen werden sollen:" -#: ../../Zotlabs/Module/Settings/Display.php:214 +#: ../../Zotlabs/Module/Settings/Display.php:218 msgid "Maximum of 100 items" msgstr "Maximum: 100 Beiträge" -#: ../../Zotlabs/Module/Settings/Display.php:215 +#: ../../Zotlabs/Module/Settings/Display.php:219 msgid "Show emoticons (smilies) as images" msgstr "Emoticons (Smilies) als Bilder anzeigen" -#: ../../Zotlabs/Module/Settings/Display.php:216 +#: ../../Zotlabs/Module/Settings/Display.php:220 msgid "Manual conversation updates" msgstr "Manuelle Konversationsaktualisierung" -#: ../../Zotlabs/Module/Settings/Display.php:216 +#: ../../Zotlabs/Module/Settings/Display.php:220 msgid "Default is on, turning this off may increase screen jumping" msgstr "Voreinstellung ist An, dies abzuschalten kann das unerwartete Springen der Seitenanzeige erhöhen." -#: ../../Zotlabs/Module/Settings/Display.php:217 +#: ../../Zotlabs/Module/Settings/Display.php:221 msgid "Link post titles to source" msgstr "Beitragstitel zum Originalbeitrag verlinken" -#: ../../Zotlabs/Module/Settings/Display.php:218 +#: ../../Zotlabs/Module/Settings/Display.php:222 msgid "System Page Layout Editor - (advanced)" msgstr "System-Seitenlayout-Editor (für Experten)" -#: ../../Zotlabs/Module/Settings/Display.php:221 +#: ../../Zotlabs/Module/Settings/Display.php:225 msgid "Use blog/list mode on channel page" msgstr "Blog-/Listenmodus auf der Kanalseite verwenden" -#: ../../Zotlabs/Module/Settings/Display.php:221 -#: ../../Zotlabs/Module/Settings/Display.php:222 +#: ../../Zotlabs/Module/Settings/Display.php:225 +#: ../../Zotlabs/Module/Settings/Display.php:226 msgid "(comments displayed separately)" msgstr "(Kommentare werden separat angezeigt)" -#: ../../Zotlabs/Module/Settings/Display.php:222 +#: ../../Zotlabs/Module/Settings/Display.php:226 msgid "Use blog/list mode on grid page" msgstr "Blog-/Listenmodus auf der Netzwerkseite verwenden" -#: ../../Zotlabs/Module/Settings/Display.php:223 +#: ../../Zotlabs/Module/Settings/Display.php:227 msgid "Channel page max height of content (in pixels)" msgstr "Maximale Höhe von Beitragsblöcken auf der Kanalseite (in Pixeln)" -#: ../../Zotlabs/Module/Settings/Display.php:223 -#: ../../Zotlabs/Module/Settings/Display.php:224 +#: ../../Zotlabs/Module/Settings/Display.php:227 +#: ../../Zotlabs/Module/Settings/Display.php:228 msgid "click to expand content exceeding this height" msgstr "Blöcke, deren Inhalt diese Höhe überschreitet, können per Klick vergrößert werden." -#: ../../Zotlabs/Module/Settings/Display.php:224 +#: ../../Zotlabs/Module/Settings/Display.php:228 msgid "Grid page max height of content (in pixels)" msgstr "Maximale Höhe (in Pixel) des Inhalts der Netzwerkseite" @@ -4029,20 +4044,20 @@ msgid "Remove authorization" msgstr "Authorisierung aufheben" #: ../../Zotlabs/Module/Embedphotos.php:140 -#: ../../Zotlabs/Module/Photos.php:753 ../../Zotlabs/Module/Photos.php:1292 +#: ../../Zotlabs/Module/Photos.php:758 ../../Zotlabs/Module/Photos.php:1297 #: ../../Zotlabs/Widget/Portfolio.php:78 ../../Zotlabs/Widget/Album.php:78 msgid "View Photo" msgstr "Foto ansehen" #: ../../Zotlabs/Module/Embedphotos.php:156 -#: ../../Zotlabs/Module/Photos.php:784 ../../Zotlabs/Widget/Portfolio.php:97 +#: ../../Zotlabs/Module/Photos.php:789 ../../Zotlabs/Widget/Portfolio.php:97 #: ../../Zotlabs/Widget/Album.php:95 msgid "Edit Album" msgstr "Album bearbeiten" #: ../../Zotlabs/Module/Embedphotos.php:158 -#: ../../Zotlabs/Module/Photos.php:786 ../../Zotlabs/Module/Photos.php:1323 -#: ../../Zotlabs/Module/Profile_photo.php:423 +#: ../../Zotlabs/Module/Photos.php:791 ../../Zotlabs/Module/Photos.php:1328 +#: ../../Zotlabs/Module/Profile_photo.php:431 #: ../../Zotlabs/Module/Cover_photo.php:361 #: ../../Zotlabs/Storage/Browser.php:230 ../../Zotlabs/Storage/Browser.php:337 #: ../../Zotlabs/Widget/Cdav.php:132 ../../Zotlabs/Widget/Cdav.php:168 @@ -4054,77 +4069,77 @@ msgstr "Hochladen" msgid "Some blurb about what to do when you're new here" msgstr "Ein Hinweis, was man tun kann, wenn man neu hier ist" -#: ../../Zotlabs/Module/Thing.php:114 +#: ../../Zotlabs/Module/Thing.php:115 msgid "Thing updated" msgstr "Sache aktualisiert" -#: ../../Zotlabs/Module/Thing.php:166 +#: ../../Zotlabs/Module/Thing.php:167 msgid "Object store: failed" msgstr "Speichern des Objekts fehlgeschlagen" -#: ../../Zotlabs/Module/Thing.php:170 +#: ../../Zotlabs/Module/Thing.php:171 msgid "Thing added" msgstr "Sache hinzugefügt" -#: ../../Zotlabs/Module/Thing.php:196 +#: ../../Zotlabs/Module/Thing.php:197 #, php-format msgid "OBJ: %1$s %2$s %3$s" msgstr "OBJ: %1$s %2$s %3$s" -#: ../../Zotlabs/Module/Thing.php:259 +#: ../../Zotlabs/Module/Thing.php:260 msgid "Show Thing" msgstr "Sache anzeigen" -#: ../../Zotlabs/Module/Thing.php:266 +#: ../../Zotlabs/Module/Thing.php:267 msgid "item not found." msgstr "Eintrag nicht gefunden" -#: ../../Zotlabs/Module/Thing.php:299 +#: ../../Zotlabs/Module/Thing.php:300 msgid "Edit Thing" msgstr "Sache bearbeiten" -#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355 +#: ../../Zotlabs/Module/Thing.php:302 ../../Zotlabs/Module/Thing.php:359 msgid "Select a profile" msgstr "Wähle ein Profil" -#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358 +#: ../../Zotlabs/Module/Thing.php:306 ../../Zotlabs/Module/Thing.php:362 msgid "Post an activity" msgstr "Aktivitätsnachricht senden" -#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358 +#: ../../Zotlabs/Module/Thing.php:306 ../../Zotlabs/Module/Thing.php:362 msgid "Only sends to viewers of the applicable profile" msgstr "Nur an Betrachter des ausgewählten Profils senden" -#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360 +#: ../../Zotlabs/Module/Thing.php:308 ../../Zotlabs/Module/Thing.php:364 msgid "Name of thing e.g. something" msgstr "Name der Sache, z. B. irgendwas" -#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361 +#: ../../Zotlabs/Module/Thing.php:310 ../../Zotlabs/Module/Thing.php:365 msgid "URL of thing (optional)" msgstr "URL der Sache (optional)" -#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362 +#: ../../Zotlabs/Module/Thing.php:312 ../../Zotlabs/Module/Thing.php:366 msgid "URL for photo of thing (optional)" msgstr "URL eines Fotos der Sache (optional)" -#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:363 -#: ../../Zotlabs/Module/Photos.php:649 ../../Zotlabs/Module/Photos.php:1013 -#: ../../Zotlabs/Module/Connedit.php:672 ../../Zotlabs/Module/Chat.php:235 +#: ../../Zotlabs/Module/Thing.php:314 ../../Zotlabs/Module/Thing.php:367 +#: ../../Zotlabs/Module/Photos.php:649 ../../Zotlabs/Module/Photos.php:1018 +#: ../../Zotlabs/Module/Connedit.php:676 ../../Zotlabs/Module/Chat.php:235 #: ../../Zotlabs/Module/Filestorage.php:142 #: ../../include/acl_selectors.php:218 msgid "Permissions" msgstr "Berechtigungen" -#: ../../Zotlabs/Module/Thing.php:353 +#: ../../Zotlabs/Module/Thing.php:357 msgid "Add Thing to your Profile" msgstr "Die Sache Deinem Profil hinzufügen" -#: ../../Zotlabs/Module/Notify.php:57 +#: ../../Zotlabs/Module/Notify.php:61 #: ../../Zotlabs/Module/Notifications.php:38 msgid "No more system notifications." msgstr "Keine System-Benachrichtigungen mehr." -#: ../../Zotlabs/Module/Notify.php:61 +#: ../../Zotlabs/Module/Notify.php:65 #: ../../Zotlabs/Module/Notifications.php:42 msgid "System Notifications" msgstr "System-Benachrichtigungen" @@ -4142,43 +4157,43 @@ msgstr "Dein Vertrag erlaubt nur %d Kanäle." msgid "No channel. Import failed." msgstr "Kein Kanal. Import fehlgeschlagen." -#: ../../Zotlabs/Module/Import.php:470 +#: ../../Zotlabs/Module/Import.php:481 #: ../../addon/diaspora/import_diaspora.php:142 msgid "Import completed." msgstr "Import abgeschlossen." -#: ../../Zotlabs/Module/Import.php:498 +#: ../../Zotlabs/Module/Import.php:509 msgid "You must be logged in to use this feature." msgstr "Du musst angemeldet sein um diese Funktion zu nutzen." -#: ../../Zotlabs/Module/Import.php:503 +#: ../../Zotlabs/Module/Import.php:514 msgid "Import Channel" msgstr "Kanal importieren" -#: ../../Zotlabs/Module/Import.php:504 +#: ../../Zotlabs/Module/Import.php:515 msgid "" "Use this form to import an existing channel from a different server/hub. You" " may retrieve the channel identity from the old server/hub via the network " "or provide an export file." msgstr "Verwende dieses Formular, um einen existierenden Kanal von einem anderen Hub zu importieren. Du kannst den Kanal direkt vom bisherigen Hub über das Netzwerk oder aus einer exportierten Sicherheitskopie importieren." -#: ../../Zotlabs/Module/Import.php:506 +#: ../../Zotlabs/Module/Import.php:517 msgid "Or provide the old server/hub details" msgstr "Oder gib die Details Deines bisherigen $Projectname-Hubs ein" -#: ../../Zotlabs/Module/Import.php:507 +#: ../../Zotlabs/Module/Import.php:518 msgid "Your old identity address (xyz@example.com)" msgstr "Bisherige Kanal-Adresse (xyz@example.com)" -#: ../../Zotlabs/Module/Import.php:508 +#: ../../Zotlabs/Module/Import.php:519 msgid "Your old login email address" msgstr "Deine alte Login-E-Mail-Adresse" -#: ../../Zotlabs/Module/Import.php:509 +#: ../../Zotlabs/Module/Import.php:520 msgid "Your old login password" msgstr "Dein altes Passwort" -#: ../../Zotlabs/Module/Import.php:510 +#: ../../Zotlabs/Module/Import.php:521 msgid "" "For either option, please choose whether to make this hub your new primary " "address, or whether your old location should continue this role. You will be" @@ -4186,19 +4201,19 @@ msgid "" "primary location for files, photos, and media." msgstr "Egal, welche Option Du wählst – bitte lege fest, ob dieser Server die neue primäre Adresse dieses Kanals sein soll, oder ob der bisherige $Projectname-Hub diese Rolle weiterhin wahrnimmt. Du kannst von beiden Servern aus posten, aber nur einer kann der primäre Ort Deiner Dateien, Fotos und Medien sein." -#: ../../Zotlabs/Module/Import.php:511 +#: ../../Zotlabs/Module/Import.php:522 msgid "Make this hub my primary location" msgstr "Dieser $Pojectname-Hub ist mein primärer Hub." -#: ../../Zotlabs/Module/Import.php:512 +#: ../../Zotlabs/Module/Import.php:523 msgid "Move this channel (disable all previous locations)" msgstr "Verschiebe diesen Kanal (deaktiviere alle vorherigen Adressen/Klone)" -#: ../../Zotlabs/Module/Import.php:513 +#: ../../Zotlabs/Module/Import.php:524 msgid "Import a few months of posts if possible (limited by available memory" msgstr "Importiere die Beiträge einiger Monate, sofern möglich (beschränkt durch verfügbaren Speicher)" -#: ../../Zotlabs/Module/Import.php:514 +#: ../../Zotlabs/Module/Import.php:525 msgid "" "This process may take several minutes to complete. Please submit the form " "only once and leave this page open until finished." @@ -4208,21 +4223,22 @@ msgstr "Dieser Vorgang kann einige Minuten dauern. Bitte sende das Formular nur msgid "Authentication failed." msgstr "Authentifizierung fehlgeschlagen." -#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:2102 +#: ../../Zotlabs/Module/Rmagic.php:75 ../../boot.php:1640 +#: ../../include/channel.php:2204 msgid "Remote Authentication" msgstr "Entfernte Authentifizierung" -#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:2103 +#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:2205 msgid "Enter your channel address (e.g. channel@example.com)" msgstr "Deine Kanal-Adresse (z. B. channel@example.com)" -#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:2104 +#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:2206 msgid "Authenticate" msgstr "Authentifizieren" #: ../../Zotlabs/Module/Cal.php:62 ../../Zotlabs/Module/Chanview.php:96 #: ../../Zotlabs/Module/Page.php:75 ../../Zotlabs/Module/Wall_upload.php:31 -#: ../../Zotlabs/Module/Block.php:41 +#: ../../Zotlabs/Module/Block.php:41 ../../Zotlabs/Module/Card_edit.php:44 msgid "Channel not found." msgstr "Kanal nicht gefunden." @@ -4230,7 +4246,7 @@ msgstr "Kanal nicht gefunden." msgid "Permissions denied." msgstr "Berechtigung verweigert." -#: ../../Zotlabs/Module/Cal.php:342 ../../include/text.php:2304 +#: ../../Zotlabs/Module/Cal.php:342 ../../include/text.php:2312 msgid "Import" msgstr "Import" @@ -4258,11 +4274,13 @@ msgstr "Element nicht verfügbar." #: ../../Zotlabs/Module/Editblock.php:116 ../../Zotlabs/Module/Chat.php:207 #: ../../Zotlabs/Module/Editwebpage.php:143 ../../Zotlabs/Module/Mail.php:288 -#: ../../Zotlabs/Module/Mail.php:430 ../../include/conversation.php:1225 +#: ../../Zotlabs/Module/Mail.php:430 ../../Zotlabs/Module/Card_edit.php:101 +#: ../../include/conversation.php:1261 msgid "Insert web link" msgstr "Link einfügen" -#: ../../Zotlabs/Module/Editblock.php:129 ../../include/conversation.php:1336 +#: ../../Zotlabs/Module/Editblock.php:129 +#: ../../Zotlabs/Module/Card_edit.php:117 ../../include/conversation.php:1381 msgid "Title (optional)" msgstr "Titel (optional)" @@ -4274,15 +4292,15 @@ msgstr "Block bearbeiten" msgid "vcard" msgstr "VCard" -#: ../../Zotlabs/Module/Apps.php:45 ../../Zotlabs/Lib/Apps.php:224 +#: ../../Zotlabs/Module/Apps.php:47 ../../Zotlabs/Lib/Apps.php:223 msgid "Apps" msgstr "Apps" -#: ../../Zotlabs/Module/Apps.php:48 +#: ../../Zotlabs/Module/Apps.php:50 msgid "Manage apps" msgstr "Apps verwalten" -#: ../../Zotlabs/Module/Apps.php:49 +#: ../../Zotlabs/Module/Apps.php:51 msgid "Create new app" msgstr "Neue App erstellen" @@ -4292,8 +4310,7 @@ msgctxt "mood" msgid "%1$s is %2$s" msgstr "%1$s ist %2$s" -#: ../../Zotlabs/Module/Mood.php:120 ../../Zotlabs/Module/Mood.php:135 -#: ../../Zotlabs/Lib/Apps.php:247 +#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:247 msgid "Mood" msgstr "Laune" @@ -4301,12 +4318,6 @@ msgstr "Laune" msgid "Set your current mood and tell your friends" msgstr "Wähle Deine aktuelle Stimmung und teile sie mit Deinen Freunden" -#: ../../Zotlabs/Module/Connections.php:33 -#: ../../Zotlabs/Module/Connections.php:309 ../../Zotlabs/Lib/Apps.php:229 -#: ../../include/text.php:951 ../../include/nav.php:180 -msgid "Connections" -msgstr "Verbindungen" - #: ../../Zotlabs/Module/Connections.php:54 #: ../../Zotlabs/Module/Connections.php:156 #: ../../Zotlabs/Module/Connections.php:245 @@ -4332,17 +4343,18 @@ msgstr "Archiviert/Unerreichbar" #: ../../Zotlabs/Module/Connections.php:74 #: ../../Zotlabs/Module/Connections.php:83 ../../Zotlabs/Module/Menu.php:116 -#: ../../include/conversation.php:1663 +#: ../../include/conversation.php:1697 msgid "New" msgstr "Neu" #: ../../Zotlabs/Module/Connections.php:88 #: ../../Zotlabs/Module/Connections.php:102 -#: ../../Zotlabs/Module/Connedit.php:709 ../../Zotlabs/Widget/Affinity.php:30 +#: ../../Zotlabs/Module/Connedit.php:713 ../../Zotlabs/Widget/Affinity.php:30 msgid "All" msgstr "Alle" #: ../../Zotlabs/Module/Connections.php:133 +#: ../../Zotlabs/Widget/Notifications.php:80 msgid "New Connections" msgstr "Neue Verbindungen" @@ -4424,7 +4436,7 @@ msgid "Ignore connection" msgstr "Verbindung ignorieren" #: ../../Zotlabs/Module/Connections.php:284 -#: ../../Zotlabs/Module/Connedit.php:626 +#: ../../Zotlabs/Module/Connedit.php:630 msgid "Ignore" msgstr "Ignorieren" @@ -4432,6 +4444,11 @@ msgstr "Ignorieren" msgid "Recent activity" msgstr "Kürzliche Aktivitäten" +#: ../../Zotlabs/Module/Connections.php:309 ../../Zotlabs/Lib/Apps.php:229 +#: ../../include/text.php:959 ../../include/nav.php:107 +msgid "Connections" +msgstr "Verbindungen" + #: ../../Zotlabs/Module/Connections.php:314 msgid "Search your connections" msgstr "Verbindungen durchsuchen" @@ -4454,10 +4471,6 @@ msgstr "Beitrag" msgid "Source of Item" msgstr "Quelle des Elements" -#: ../../Zotlabs/Module/Bookmarks.php:11 ../../Zotlabs/Lib/Apps.php:227 -msgid "View Bookmarks" -msgstr "Lesezeichen ansehen" - #: ../../Zotlabs/Module/Bookmarks.php:56 msgid "Bookmark added" msgstr "Lesezeichen hinzugefügt" @@ -4510,7 +4523,7 @@ msgstr "Album nicht gefunden." msgid "Delete Album" msgstr "Album löschen" -#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1025 +#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1030 msgid "Delete Photo" msgstr "Foto löschen" @@ -4522,12 +4535,6 @@ msgstr "Keine Fotos ausgewählt" msgid "Access to this item is restricted." msgstr "Der Zugriff auf dieses Foto ist eingeschränkt." -#: ../../Zotlabs/Module/Photos.php:558 ../../Zotlabs/Module/Fbrowser.php:29 -#: ../../Zotlabs/Lib/Apps.php:242 ../../include/conversation.php:1780 -#: ../../include/nav.php:378 -msgid "Photos" -msgstr "Fotos" - #: ../../Zotlabs/Module/Photos.php:593 #, php-format msgid "%1$.2f MB of %2$.2f MB photo storage used." @@ -4562,192 +4569,192 @@ msgstr "Beschriftung (optional):" msgid "Description (optional):" msgstr "Beschreibung (optional):" -#: ../../Zotlabs/Module/Photos.php:727 +#: ../../Zotlabs/Module/Photos.php:732 msgid "Show Newest First" msgstr "Neueste zuerst anzeigen" -#: ../../Zotlabs/Module/Photos.php:729 +#: ../../Zotlabs/Module/Photos.php:734 msgid "Show Oldest First" msgstr "Älteste zuerst anzeigen" -#: ../../Zotlabs/Module/Photos.php:834 +#: ../../Zotlabs/Module/Photos.php:839 msgid "Permission denied. Access to this item may be restricted." msgstr "Berechtigung verweigert. Der Zugriff ist wahrscheinlich eingeschränkt worden." -#: ../../Zotlabs/Module/Photos.php:836 +#: ../../Zotlabs/Module/Photos.php:841 msgid "Photo not available" msgstr "Foto nicht verfügbar" -#: ../../Zotlabs/Module/Photos.php:894 +#: ../../Zotlabs/Module/Photos.php:899 msgid "Use as profile photo" msgstr "Als Profilfoto verwenden" -#: ../../Zotlabs/Module/Photos.php:895 +#: ../../Zotlabs/Module/Photos.php:900 msgid "Use as cover photo" msgstr "Als Titelbild verwenden" -#: ../../Zotlabs/Module/Photos.php:902 +#: ../../Zotlabs/Module/Photos.php:907 msgid "Private Photo" msgstr "Privates Foto" -#: ../../Zotlabs/Module/Photos.php:917 +#: ../../Zotlabs/Module/Photos.php:922 msgid "View Full Size" msgstr "In voller Größe anzeigen" -#: ../../Zotlabs/Module/Photos.php:999 +#: ../../Zotlabs/Module/Photos.php:1004 msgid "Edit photo" msgstr "Foto bearbeiten" -#: ../../Zotlabs/Module/Photos.php:1001 +#: ../../Zotlabs/Module/Photos.php:1006 msgid "Rotate CW (right)" msgstr "Drehen im UZS (rechts)" -#: ../../Zotlabs/Module/Photos.php:1002 +#: ../../Zotlabs/Module/Photos.php:1007 msgid "Rotate CCW (left)" msgstr "Drehen gegen UZS (links)" -#: ../../Zotlabs/Module/Photos.php:1005 +#: ../../Zotlabs/Module/Photos.php:1010 msgid "Move photo to album" msgstr "Foto in Album verschieben" -#: ../../Zotlabs/Module/Photos.php:1006 +#: ../../Zotlabs/Module/Photos.php:1011 msgid "Enter a new album name" msgstr "Gib einen Namen für ein neues Album ein" -#: ../../Zotlabs/Module/Photos.php:1007 +#: ../../Zotlabs/Module/Photos.php:1012 msgid "or select an existing one (doubleclick)" msgstr "oder wähle ein bereits vorhandenes aus (Doppelklick)" -#: ../../Zotlabs/Module/Photos.php:1010 +#: ../../Zotlabs/Module/Photos.php:1015 msgid "Caption" msgstr "Bildunterschrift" -#: ../../Zotlabs/Module/Photos.php:1012 +#: ../../Zotlabs/Module/Photos.php:1017 msgid "Add a Tag" msgstr "Schlagwort hinzufügen" -#: ../../Zotlabs/Module/Photos.php:1020 +#: ../../Zotlabs/Module/Photos.php:1025 msgid "Example: @bob, @Barbara_Jensen, @jim@example.com" msgstr "Beispiele: @ben, @Karl_Prester, @lieschen@example.com" -#: ../../Zotlabs/Module/Photos.php:1023 +#: ../../Zotlabs/Module/Photos.php:1028 msgid "Flag as adult in album view" msgstr "In der Albumansicht als nicht jugendfrei markieren" -#: ../../Zotlabs/Module/Photos.php:1042 ../../Zotlabs/Lib/ThreadItem.php:267 +#: ../../Zotlabs/Module/Photos.php:1047 ../../Zotlabs/Lib/ThreadItem.php:271 msgid "I like this (toggle)" msgstr "Mir gefällt das (Umschalter)" -#: ../../Zotlabs/Module/Photos.php:1043 ../../Zotlabs/Lib/ThreadItem.php:268 +#: ../../Zotlabs/Module/Photos.php:1048 ../../Zotlabs/Lib/ThreadItem.php:272 msgid "I don't like this (toggle)" msgstr "Mir gefällt das nicht (Umschalter)" -#: ../../Zotlabs/Module/Photos.php:1045 ../../Zotlabs/Lib/ThreadItem.php:410 -#: ../../include/conversation.php:736 +#: ../../Zotlabs/Module/Photos.php:1050 ../../Zotlabs/Lib/ThreadItem.php:416 +#: ../../include/conversation.php:768 msgid "Please wait" msgstr "Bitte warten" -#: ../../Zotlabs/Module/Photos.php:1061 ../../Zotlabs/Module/Photos.php:1179 -#: ../../Zotlabs/Lib/ThreadItem.php:727 +#: ../../Zotlabs/Module/Photos.php:1066 ../../Zotlabs/Module/Photos.php:1184 +#: ../../Zotlabs/Lib/ThreadItem.php:740 msgid "This is you" msgstr "Das bist Du" -#: ../../Zotlabs/Module/Photos.php:1063 ../../Zotlabs/Module/Photos.php:1181 -#: ../../Zotlabs/Lib/ThreadItem.php:729 ../../include/js_strings.php:6 +#: ../../Zotlabs/Module/Photos.php:1068 ../../Zotlabs/Module/Photos.php:1186 +#: ../../Zotlabs/Lib/ThreadItem.php:742 ../../include/js_strings.php:6 msgid "Comment" msgstr "Kommentar" -#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:569 +#: ../../Zotlabs/Module/Photos.php:1084 ../../include/conversation.php:594 msgctxt "title" msgid "Likes" msgstr "Gefällt mir" -#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:569 +#: ../../Zotlabs/Module/Photos.php:1084 ../../include/conversation.php:594 msgctxt "title" msgid "Dislikes" msgstr "Gefällt mir nicht" -#: ../../Zotlabs/Module/Photos.php:1080 ../../include/conversation.php:570 +#: ../../Zotlabs/Module/Photos.php:1085 ../../include/conversation.php:595 msgctxt "title" msgid "Agree" msgstr "Zustimmungen" -#: ../../Zotlabs/Module/Photos.php:1080 ../../include/conversation.php:570 +#: ../../Zotlabs/Module/Photos.php:1085 ../../include/conversation.php:595 msgctxt "title" msgid "Disagree" msgstr "Ablehnungen" -#: ../../Zotlabs/Module/Photos.php:1080 ../../include/conversation.php:570 +#: ../../Zotlabs/Module/Photos.php:1085 ../../include/conversation.php:595 msgctxt "title" msgid "Abstain" msgstr "Enthaltungen" -#: ../../Zotlabs/Module/Photos.php:1081 ../../include/conversation.php:571 +#: ../../Zotlabs/Module/Photos.php:1086 ../../include/conversation.php:596 msgctxt "title" msgid "Attending" msgstr "Zusagen" -#: ../../Zotlabs/Module/Photos.php:1081 ../../include/conversation.php:571 +#: ../../Zotlabs/Module/Photos.php:1086 ../../include/conversation.php:596 msgctxt "title" msgid "Not attending" msgstr "Absagen" -#: ../../Zotlabs/Module/Photos.php:1081 ../../include/conversation.php:571 +#: ../../Zotlabs/Module/Photos.php:1086 ../../include/conversation.php:596 msgctxt "title" msgid "Might attend" msgstr "Vielleicht" -#: ../../Zotlabs/Module/Photos.php:1098 ../../Zotlabs/Module/Photos.php:1110 -#: ../../Zotlabs/Lib/ThreadItem.php:187 ../../Zotlabs/Lib/ThreadItem.php:199 +#: ../../Zotlabs/Module/Photos.php:1103 ../../Zotlabs/Module/Photos.php:1115 +#: ../../Zotlabs/Lib/ThreadItem.php:191 ../../Zotlabs/Lib/ThreadItem.php:203 msgid "View all" msgstr "Alles anzeigen" -#: ../../Zotlabs/Module/Photos.php:1102 ../../Zotlabs/Lib/ThreadItem.php:191 -#: ../../include/conversation.php:1904 ../../include/channel.php:1391 -#: ../../include/taxonomy.php:442 +#: ../../Zotlabs/Module/Photos.php:1107 ../../Zotlabs/Lib/ThreadItem.php:195 +#: ../../include/conversation.php:1950 ../../include/channel.php:1491 +#: ../../include/taxonomy.php:520 msgctxt "noun" msgid "Like" msgid_plural "Likes" msgstr[0] "Gefällt mir" msgstr[1] "Gefällt mir" -#: ../../Zotlabs/Module/Photos.php:1107 ../../Zotlabs/Lib/ThreadItem.php:196 -#: ../../include/conversation.php:1907 +#: ../../Zotlabs/Module/Photos.php:1112 ../../Zotlabs/Lib/ThreadItem.php:200 +#: ../../include/conversation.php:1953 msgctxt "noun" msgid "Dislike" msgid_plural "Dislikes" msgstr[0] "Gefällt nicht" msgstr[1] "Gefällt nicht" -#: ../../Zotlabs/Module/Photos.php:1207 +#: ../../Zotlabs/Module/Photos.php:1212 msgid "Photo Tools" msgstr "Fotowerkzeuge" -#: ../../Zotlabs/Module/Photos.php:1216 +#: ../../Zotlabs/Module/Photos.php:1221 msgid "In This Photo:" msgstr "Auf diesem Foto:" -#: ../../Zotlabs/Module/Photos.php:1221 +#: ../../Zotlabs/Module/Photos.php:1226 msgid "Map" msgstr "Karte" -#: ../../Zotlabs/Module/Photos.php:1229 ../../Zotlabs/Lib/ThreadItem.php:399 +#: ../../Zotlabs/Module/Photos.php:1234 ../../Zotlabs/Lib/ThreadItem.php:404 msgctxt "noun" msgid "Likes" msgstr "Gefällt mir" -#: ../../Zotlabs/Module/Photos.php:1230 ../../Zotlabs/Lib/ThreadItem.php:400 +#: ../../Zotlabs/Module/Photos.php:1235 ../../Zotlabs/Lib/ThreadItem.php:405 msgctxt "noun" msgid "Dislikes" msgstr "Gefällt nicht" -#: ../../Zotlabs/Module/Photos.php:1235 ../../Zotlabs/Lib/ThreadItem.php:405 +#: ../../Zotlabs/Module/Photos.php:1240 ../../Zotlabs/Lib/ThreadItem.php:410 #: ../../include/acl_selectors.php:220 msgid "Close" msgstr "Schließen" -#: ../../Zotlabs/Module/Photos.php:1307 ../../Zotlabs/Module/Photos.php:1320 -#: ../../Zotlabs/Module/Photos.php:1321 ../../include/photos.php:526 +#: ../../Zotlabs/Module/Photos.php:1312 ../../Zotlabs/Module/Photos.php:1325 +#: ../../Zotlabs/Module/Photos.php:1326 ../../include/photos.php:601 msgid "Recent Photos" msgstr "Neueste Fotos" @@ -4763,165 +4770,206 @@ msgstr "Nicht gefunden" msgid "Invalid channel" msgstr "Ungültiger Kanal" -#: ../../Zotlabs/Module/Wiki.php:79 ../../Zotlabs/Lib/Apps.php:239 -#: ../../include/conversation.php:1854 ../../include/features.php:95 -#: ../../include/nav.php:451 -msgid "Wiki" -msgstr "Wiki" +#: ../../Zotlabs/Module/Wiki.php:124 ../../addon/gitwiki/Mod_Gitwiki.php:107 +msgid "Error retrieving wiki" +msgstr "Fehler beim Abrufen des Wiki" -#: ../../Zotlabs/Module/Wiki.php:162 ../../addon/gitwiki/Mod_Gitwiki.php:146 -#: ../../include/conversation.php:1851 ../../include/nav.php:448 +#: ../../Zotlabs/Module/Wiki.php:131 ../../addon/gitwiki/Mod_Gitwiki.php:114 +msgid "Error creating zip file export folder" +msgstr "Fehler bei der Erzeugung des Zip-Datei Export-Verzeichnisses " + +#: ../../Zotlabs/Module/Wiki.php:182 ../../addon/gitwiki/Mod_Gitwiki.php:132 +msgid "Error downloading wiki: " +msgstr "Fehler beim Herunterladen des Wiki:" + +#: ../../Zotlabs/Module/Wiki.php:197 ../../addon/gitwiki/Mod_Gitwiki.php:146 +#: ../../include/conversation.php:1897 ../../include/nav.php:504 msgid "Wikis" msgstr "Wikis" -#: ../../Zotlabs/Module/Wiki.php:168 ../../addon/gitwiki/Mod_Gitwiki.php:152 +#: ../../Zotlabs/Module/Wiki.php:203 ../../addon/gitwiki/Mod_Gitwiki.php:152 msgid "Download" msgstr "Herunterladen" -#: ../../Zotlabs/Module/Wiki.php:170 ../../Zotlabs/Module/Chat.php:256 +#: ../../Zotlabs/Module/Wiki.php:205 ../../Zotlabs/Module/Chat.php:256 #: ../../Zotlabs/Module/Profiles.php:834 ../../Zotlabs/Module/Manage.php:145 #: ../../addon/gitwiki/Mod_Gitwiki.php:154 msgid "Create New" msgstr "Neu anlegen" -#: ../../Zotlabs/Module/Wiki.php:172 ../../addon/gitwiki/Mod_Gitwiki.php:156 +#: ../../Zotlabs/Module/Wiki.php:207 ../../addon/gitwiki/Mod_Gitwiki.php:156 msgid "Wiki name" msgstr "Name des Wiki" -#: ../../Zotlabs/Module/Wiki.php:173 ../../addon/gitwiki/Mod_Gitwiki.php:157 +#: ../../Zotlabs/Module/Wiki.php:208 ../../addon/gitwiki/Mod_Gitwiki.php:157 msgid "Content type" msgstr "Inhaltstyp" -#: ../../Zotlabs/Module/Wiki.php:175 ../../Zotlabs/Storage/Browser.php:235 +#: ../../Zotlabs/Module/Wiki.php:208 ../../Zotlabs/Module/Wiki.php:336 +#: ../../Zotlabs/Widget/Wiki_pages.php:57 ../../include/text.php:1802 +msgid "Markdown" +msgstr "Markdown" + +#: ../../Zotlabs/Module/Wiki.php:208 ../../Zotlabs/Module/Wiki.php:336 +#: ../../Zotlabs/Widget/Wiki_pages.php:57 ../../include/text.php:1800 +msgid "BBcode" +msgstr "BBcode" + +#: ../../Zotlabs/Module/Wiki.php:208 ../../Zotlabs/Widget/Wiki_pages.php:57 +#: ../../include/text.php:1803 +msgid "Text" +msgstr "Text" + +#: ../../Zotlabs/Module/Wiki.php:210 ../../Zotlabs/Storage/Browser.php:235 #: ../../addon/gitwiki/Mod_Gitwiki.php:159 msgid "Type" msgstr "Typ" -#: ../../Zotlabs/Module/Wiki.php:182 ../../addon/gitwiki/Mod_Gitwiki.php:166 +#: ../../Zotlabs/Module/Wiki.php:211 +msgid "Any type" +msgstr "Alle Arten" + +#: ../../Zotlabs/Module/Wiki.php:218 +msgid "Lock content type" +msgstr "Inhaltstyp sperren" + +#: ../../Zotlabs/Module/Wiki.php:219 ../../addon/gitwiki/Mod_Gitwiki.php:166 msgid "Create a status post for this wiki" msgstr "Erzeuge einen Statusbeitrag für dieses Wiki" -#: ../../Zotlabs/Module/Wiki.php:224 ../../addon/gitwiki/Mod_Gitwiki.php:185 +#: ../../Zotlabs/Module/Wiki.php:220 +msgid "Edit Wiki Name" +msgstr "Wiki-Namen bearbeiten" + +#: ../../Zotlabs/Module/Wiki.php:262 ../../addon/gitwiki/Mod_Gitwiki.php:185 msgid "Wiki not found" msgstr "Wiki nicht gefunden" -#: ../../Zotlabs/Module/Wiki.php:248 ../../addon/gitwiki/Mod_Gitwiki.php:210 +#: ../../Zotlabs/Module/Wiki.php:286 ../../addon/gitwiki/Mod_Gitwiki.php:210 msgid "Rename page" msgstr "Seite umbenennen" -#: ../../Zotlabs/Module/Wiki.php:258 ../../addon/gitwiki/Mod_Gitwiki.php:214 +#: ../../Zotlabs/Module/Wiki.php:296 ../../addon/gitwiki/Mod_Gitwiki.php:214 msgid "Error retrieving page content" msgstr "Fehler beim Abrufen des Seiteninhalts" -#: ../../Zotlabs/Module/Wiki.php:264 +#: ../../Zotlabs/Module/Wiki.php:302 ../../Zotlabs/Module/Wiki.php:304 msgid "New page" msgstr "Neue Seite" -#: ../../Zotlabs/Module/Wiki.php:288 ../../addon/gitwiki/Mod_Gitwiki.php:242 +#: ../../Zotlabs/Module/Wiki.php:331 ../../addon/gitwiki/Mod_Gitwiki.php:242 msgid "Revision Comparison" msgstr "Revisionsvergleich" -#: ../../Zotlabs/Module/Wiki.php:289 ../../addon/gitwiki/Mod_Gitwiki.php:243 +#: ../../Zotlabs/Module/Wiki.php:332 ../../addon/gitwiki/Mod_Gitwiki.php:243 msgid "Revert" msgstr "Rückgängig machen" -#: ../../Zotlabs/Module/Wiki.php:293 +#: ../../Zotlabs/Module/Wiki.php:339 msgid "Short description of your changes (optional)" msgstr "Kurze Beschreibung Ihrer Änderungen (optional)" -#: ../../Zotlabs/Module/Wiki.php:300 ../../addon/gitwiki/Mod_Gitwiki.php:252 +#: ../../Zotlabs/Module/Wiki.php:346 ../../addon/gitwiki/Mod_Gitwiki.php:252 msgid "Source" msgstr "Quelle" -#: ../../Zotlabs/Module/Wiki.php:309 ../../addon/gitwiki/Mod_Gitwiki.php:260 +#: ../../Zotlabs/Module/Wiki.php:356 ../../addon/gitwiki/Mod_Gitwiki.php:260 msgid "New page name" msgstr "Neuer Seitenname" -#: ../../Zotlabs/Module/Wiki.php:314 ../../addon/gitwiki/Mod_Gitwiki.php:265 -#: ../../include/conversation.php:1229 +#: ../../Zotlabs/Module/Wiki.php:361 ../../addon/gitwiki/Mod_Gitwiki.php:265 +#: ../../include/conversation.php:1265 msgid "Embed image from photo albums" msgstr "Bild aus Fotoalben einbetten" -#: ../../Zotlabs/Module/Wiki.php:315 ../../addon/gitwiki/Mod_Gitwiki.php:266 -#: ../../include/conversation.php:1323 +#: ../../Zotlabs/Module/Wiki.php:362 ../../addon/gitwiki/Mod_Gitwiki.php:266 +#: ../../include/conversation.php:1368 msgid "Embed an image from your albums" msgstr "Betten Sie ein Bild aus Ihren Alben ein" -#: ../../Zotlabs/Module/Wiki.php:317 ../../addon/gitwiki/Mod_Gitwiki.php:268 -#: ../../include/conversation.php:1325 ../../include/conversation.php:1372 +#: ../../Zotlabs/Module/Wiki.php:364 ../../addon/gitwiki/Mod_Gitwiki.php:268 +#: ../../include/conversation.php:1370 ../../include/conversation.php:1417 msgid "OK" msgstr "Ok" -#: ../../Zotlabs/Module/Wiki.php:318 ../../addon/gitwiki/Mod_Gitwiki.php:269 -#: ../../include/conversation.php:1265 +#: ../../Zotlabs/Module/Wiki.php:365 ../../addon/gitwiki/Mod_Gitwiki.php:269 +#: ../../include/conversation.php:1301 msgid "Choose images to embed" msgstr "Wählen Sie Bilder zum Einbetten aus" -#: ../../Zotlabs/Module/Wiki.php:319 ../../addon/gitwiki/Mod_Gitwiki.php:270 -#: ../../include/conversation.php:1266 +#: ../../Zotlabs/Module/Wiki.php:366 ../../addon/gitwiki/Mod_Gitwiki.php:270 +#: ../../include/conversation.php:1302 msgid "Choose an album" msgstr "Wählen Sie ein Album aus" -#: ../../Zotlabs/Module/Wiki.php:320 ../../addon/gitwiki/Mod_Gitwiki.php:271 +#: ../../Zotlabs/Module/Wiki.php:367 ../../addon/gitwiki/Mod_Gitwiki.php:271 msgid "Choose a different album" msgstr "Wählen Sie ein anderes Album aus" -#: ../../Zotlabs/Module/Wiki.php:321 ../../addon/gitwiki/Mod_Gitwiki.php:272 -#: ../../include/conversation.php:1268 +#: ../../Zotlabs/Module/Wiki.php:368 ../../addon/gitwiki/Mod_Gitwiki.php:272 +#: ../../include/conversation.php:1304 msgid "Error getting album list" msgstr "Fehler beim Holen der Albenliste" -#: ../../Zotlabs/Module/Wiki.php:322 ../../addon/gitwiki/Mod_Gitwiki.php:273 -#: ../../include/conversation.php:1269 +#: ../../Zotlabs/Module/Wiki.php:369 ../../addon/gitwiki/Mod_Gitwiki.php:273 +#: ../../include/conversation.php:1305 msgid "Error getting photo link" msgstr "Fehler beim Holen des Fotolinks" -#: ../../Zotlabs/Module/Wiki.php:323 ../../addon/gitwiki/Mod_Gitwiki.php:274 -#: ../../include/conversation.php:1270 +#: ../../Zotlabs/Module/Wiki.php:370 ../../addon/gitwiki/Mod_Gitwiki.php:274 +#: ../../include/conversation.php:1306 msgid "Error getting album" msgstr "Fehler beim Holen des Albums" -#: ../../Zotlabs/Module/Wiki.php:391 ../../addon/gitwiki/Mod_Gitwiki.php:337 +#: ../../Zotlabs/Module/Wiki.php:442 ../../addon/gitwiki/Mod_Gitwiki.php:337 msgid "Error creating wiki. Invalid name." msgstr "Fehler beim Erstellen des Wiki. Ungültiger Name." -#: ../../Zotlabs/Module/Wiki.php:398 +#: ../../Zotlabs/Module/Wiki.php:449 msgid "A wiki with this name already exists." msgstr "Es existiert bereits ein Wiki mit diesem Namen." -#: ../../Zotlabs/Module/Wiki.php:411 ../../addon/gitwiki/Mod_Gitwiki.php:348 +#: ../../Zotlabs/Module/Wiki.php:462 ../../addon/gitwiki/Mod_Gitwiki.php:348 msgid "Wiki created, but error creating Home page." msgstr "Das Wiki wurde erzeugt, aber es gab einen Fehler bei der Erstellung der Startseite" -#: ../../Zotlabs/Module/Wiki.php:418 ../../addon/gitwiki/Mod_Gitwiki.php:353 +#: ../../Zotlabs/Module/Wiki.php:469 ../../addon/gitwiki/Mod_Gitwiki.php:353 msgid "Error creating wiki" msgstr "Fehler beim Erstellen des Wiki" -#: ../../Zotlabs/Module/Wiki.php:430 +#: ../../Zotlabs/Module/Wiki.php:492 +msgid "Error updating wiki. Invalid name." +msgstr "Fehler beim Aktualisieren des Wikis. Ungültiger Name." + +#: ../../Zotlabs/Module/Wiki.php:512 +msgid "Error updating wiki" +msgstr "Fehler beim Aktualisieren des Wikis" + +#: ../../Zotlabs/Module/Wiki.php:527 msgid "Wiki delete permission denied." msgstr "Wiki-Löschberechtigung verweigert." -#: ../../Zotlabs/Module/Wiki.php:440 +#: ../../Zotlabs/Module/Wiki.php:537 msgid "Error deleting wiki" msgstr "Fehler beim Löschen des Wiki" -#: ../../Zotlabs/Module/Wiki.php:466 ../../addon/gitwiki/Mod_Gitwiki.php:400 +#: ../../Zotlabs/Module/Wiki.php:565 ../../addon/gitwiki/Mod_Gitwiki.php:400 msgid "New page created" msgstr "Neue Seite erstellt" -#: ../../Zotlabs/Module/Wiki.php:587 +#: ../../Zotlabs/Module/Wiki.php:686 msgid "Cannot delete Home" msgstr "Kann die Startseite nicht löschen" -#: ../../Zotlabs/Module/Wiki.php:651 +#: ../../Zotlabs/Module/Wiki.php:750 msgid "Current Revision" msgstr "Aktuelle Revision" -#: ../../Zotlabs/Module/Wiki.php:651 +#: ../../Zotlabs/Module/Wiki.php:750 msgid "Selected Revision" msgstr "Ausgewählte Revision" -#: ../../Zotlabs/Module/Wiki.php:701 +#: ../../Zotlabs/Module/Wiki.php:800 msgid "You must be authenticated." msgstr "Sie müssen authenzifiziert sein." @@ -4937,24 +4985,36 @@ msgstr "Layout aktualisiert." msgid "Feature disabled." msgstr "Funktion deaktiviert." -#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69 +#: ../../Zotlabs/Module/Pdledit.php:47 ../../Zotlabs/Module/Pdledit.php:88 msgid "Edit System Page Description" msgstr "Systemseitenbeschreibung bearbeiten" -#: ../../Zotlabs/Module/Pdledit.php:64 +#: ../../Zotlabs/Module/Pdledit.php:68 +msgid "(modified)" +msgstr "(geändert)" + +#: ../../Zotlabs/Module/Pdledit.php:68 ../../Zotlabs/Module/Lostpass.php:133 +msgid "Reset" +msgstr "Zurücksetzen" + +#: ../../Zotlabs/Module/Pdledit.php:83 msgid "Layout not found." msgstr "Layout nicht gefunden." -#: ../../Zotlabs/Module/Pdledit.php:70 +#: ../../Zotlabs/Module/Pdledit.php:89 msgid "Module Name:" msgstr "Modulname:" -#: ../../Zotlabs/Module/Pdledit.php:71 +#: ../../Zotlabs/Module/Pdledit.php:90 msgid "Layout Help" msgstr "Layout-Hilfe" -#: ../../Zotlabs/Module/Poke.php:153 ../../Zotlabs/Module/Poke.php:182 -#: ../../Zotlabs/Lib/Apps.php:248 ../../include/conversation.php:1039 +#: ../../Zotlabs/Module/Pdledit.php:91 +msgid "Edit another layout" +msgstr "Ein weiteres Layout bearbeiten" + +#: ../../Zotlabs/Module/Poke.php:182 ../../Zotlabs/Lib/Apps.php:248 +#: ../../include/conversation.php:1075 msgid "Poke" msgstr "Anstupsen" @@ -4988,8 +5048,8 @@ msgid "Image uploaded but image cropping failed." msgstr "Bild hochgeladen, aber das Zurechtschneiden schlug fehl." #: ../../Zotlabs/Module/Profile_photo.php:115 -#: ../../Zotlabs/Module/Profile_photo.php:226 -#: ../../include/photo/photo_driver.php:658 +#: ../../Zotlabs/Module/Profile_photo.php:234 +#: ../../include/photo/photo_driver.php:710 msgid "Profile Photos" msgstr "Profilfotos" @@ -4998,80 +5058,80 @@ msgstr "Profilfotos" msgid "Image resize failed." msgstr "Bild-Anpassung fehlgeschlagen." -#: ../../Zotlabs/Module/Profile_photo.php:196 +#: ../../Zotlabs/Module/Profile_photo.php:204 #: ../../addon/openclipatar/openclipatar.php:298 msgid "" "Shift-reload the page or clear browser cache if the new photo does not " "display immediately." msgstr "Leere den Browser Cache oder nutze Umschalten-Neu Laden, falls das neue Foto nicht sofort angezeigt wird." -#: ../../Zotlabs/Module/Profile_photo.php:203 -#: ../../Zotlabs/Module/Cover_photo.php:173 ../../include/photos.php:145 +#: ../../Zotlabs/Module/Profile_photo.php:211 +#: ../../Zotlabs/Module/Cover_photo.php:173 ../../include/photos.php:156 msgid "Unable to process image" msgstr "Kann Bild nicht verarbeiten" -#: ../../Zotlabs/Module/Profile_photo.php:238 +#: ../../Zotlabs/Module/Profile_photo.php:246 #: ../../Zotlabs/Module/Cover_photo.php:197 msgid "Image upload failed." msgstr "Hochladen des Bilds fehlgeschlagen." -#: ../../Zotlabs/Module/Profile_photo.php:257 +#: ../../Zotlabs/Module/Profile_photo.php:265 #: ../../Zotlabs/Module/Cover_photo.php:214 msgid "Unable to process image." msgstr "Kann Bild nicht verarbeiten." -#: ../../Zotlabs/Module/Profile_photo.php:318 -#: ../../Zotlabs/Module/Profile_photo.php:365 +#: ../../Zotlabs/Module/Profile_photo.php:326 +#: ../../Zotlabs/Module/Profile_photo.php:373 #: ../../Zotlabs/Module/Cover_photo.php:307 #: ../../Zotlabs/Module/Cover_photo.php:322 msgid "Photo not available." msgstr "Foto nicht verfügbar." -#: ../../Zotlabs/Module/Profile_photo.php:420 +#: ../../Zotlabs/Module/Profile_photo.php:428 #: ../../Zotlabs/Module/Cover_photo.php:358 msgid "Upload File:" msgstr "Datei hochladen:" -#: ../../Zotlabs/Module/Profile_photo.php:421 +#: ../../Zotlabs/Module/Profile_photo.php:429 #: ../../Zotlabs/Module/Cover_photo.php:359 msgid "Select a profile:" msgstr "Wähle ein Profil:" -#: ../../Zotlabs/Module/Profile_photo.php:422 +#: ../../Zotlabs/Module/Profile_photo.php:430 msgid "Use Photo for Profile" msgstr "Foto für Profil verwenden" -#: ../../Zotlabs/Module/Profile_photo.php:422 +#: ../../Zotlabs/Module/Profile_photo.php:430 msgid "Upload Profile Photo" msgstr "Lade neues Profilfoto hoch" -#: ../../Zotlabs/Module/Profile_photo.php:423 +#: ../../Zotlabs/Module/Profile_photo.php:431 #: ../../addon/openclipatar/openclipatar.php:182 #: ../../addon/openclipatar/openclipatar.php:194 msgid "Use" msgstr "Verwenden" -#: ../../Zotlabs/Module/Profile_photo.php:429 +#: ../../Zotlabs/Module/Profile_photo.php:437 #: ../../Zotlabs/Module/Cover_photo.php:365 msgid "skip this step" msgstr "diesen Schritt überspringen" -#: ../../Zotlabs/Module/Profile_photo.php:429 +#: ../../Zotlabs/Module/Profile_photo.php:437 #: ../../Zotlabs/Module/Cover_photo.php:365 msgid "select a photo from your photo albums" msgstr "ein Foto aus meinen Fotoalben" -#: ../../Zotlabs/Module/Profile_photo.php:448 +#: ../../Zotlabs/Module/Profile_photo.php:456 #: ../../Zotlabs/Module/Cover_photo.php:381 msgid "Crop Image" msgstr "Bild zuschneiden" -#: ../../Zotlabs/Module/Profile_photo.php:449 +#: ../../Zotlabs/Module/Profile_photo.php:457 #: ../../Zotlabs/Module/Cover_photo.php:382 msgid "Please adjust the image cropping for optimum viewing." msgstr "Bitte schneide das Bild für eine optimale Anzeige passend zu." -#: ../../Zotlabs/Module/Profile_photo.php:451 +#: ../../Zotlabs/Module/Profile_photo.php:459 #: ../../Zotlabs/Module/Cover_photo.php:384 msgid "Done Editing" msgstr "Bearbeitung fertigstellen" @@ -5092,60 +5152,68 @@ msgstr "Originalbeitrag nicht gefunden." msgid "Empty post discarded." msgstr "Leeren Beitrag verworfen." -#: ../../Zotlabs/Module/Item.php:844 +#: ../../Zotlabs/Module/Item.php:870 msgid "Duplicate post suppressed." msgstr "Doppelter Beitrag unterdrückt." -#: ../../Zotlabs/Module/Item.php:989 +#: ../../Zotlabs/Module/Item.php:1015 msgid "System error. Post not saved." msgstr "Systemfehler. Beitrag nicht gespeichert." -#: ../../Zotlabs/Module/Item.php:1025 +#: ../../Zotlabs/Module/Item.php:1051 msgid "Your comment is awaiting approval." msgstr "Dein Kommentar muss noch bestätigt werden." -#: ../../Zotlabs/Module/Item.php:1123 +#: ../../Zotlabs/Module/Item.php:1156 msgid "Unable to obtain post information from database." msgstr "Beitragsinformationen können nicht aus der Datenbank abgerufen werden." -#: ../../Zotlabs/Module/Item.php:1130 +#: ../../Zotlabs/Module/Item.php:1163 #, php-format msgid "You have reached your limit of %1$.0f top level posts." msgstr "Du hast die maximale Anzahl von %1$.0f Beiträgen erreicht." -#: ../../Zotlabs/Module/Item.php:1137 +#: ../../Zotlabs/Module/Item.php:1170 #, php-format msgid "You have reached your limit of %1$.0f webpages." msgstr "Du hast die maximale Anzahl von %1$.0f Webseiten erreicht." -#: ../../Zotlabs/Module/Ping.php:280 +#: ../../Zotlabs/Module/Ping.php:318 msgid "sent you a private message" msgstr "hat Dir eine private Nachricht geschickt" -#: ../../Zotlabs/Module/Ping.php:331 +#: ../../Zotlabs/Module/Ping.php:369 msgid "added your channel" msgstr "hat deinen Kanal hinzugefügt" -#: ../../Zotlabs/Module/Ping.php:341 +#: ../../Zotlabs/Module/Ping.php:393 +msgid "requires approval" +msgstr "Zustimmung erforderlich" + +#: ../../Zotlabs/Module/Ping.php:403 msgid "g A l F d" msgstr "l, d. F, G:i \\U\\h\\r" -#: ../../Zotlabs/Module/Ping.php:359 +#: ../../Zotlabs/Module/Ping.php:421 msgid "[today]" msgstr "[Heute]" -#: ../../Zotlabs/Module/Ping.php:368 +#: ../../Zotlabs/Module/Ping.php:430 msgid "posted an event" msgstr "hat einen Termin veröffentlicht" +#: ../../Zotlabs/Module/Ping.php:463 +msgid "shared a file with you" +msgstr "hat eine Datei mit Dir geteilt" + #: ../../Zotlabs/Module/Page.php:39 ../../Zotlabs/Module/Block.php:29 msgid "Invalid item." msgstr "Ungültiges Element." #: ../../Zotlabs/Module/Page.php:128 ../../Zotlabs/Module/Block.php:77 -#: ../../Zotlabs/Module/Display.php:122 -#: ../../Zotlabs/Lib/NativeWikiPage.php:500 ../../Zotlabs/Web/Router.php:146 -#: ../../include/help.php:68 +#: ../../Zotlabs/Module/Display.php:120 +#: ../../Zotlabs/Lib/NativeWikiPage.php:515 ../../Zotlabs/Web/Router.php:158 +#: ../../include/help.php:81 msgid "Page not found." msgstr "Seite nicht gefunden." @@ -5175,293 +5243,293 @@ msgstr "Verbindung aktualisiert." msgid "Failed to update connection record." msgstr "Konnte den Verbindungseintrag nicht aktualisieren." -#: ../../Zotlabs/Module/Connedit.php:298 +#: ../../Zotlabs/Module/Connedit.php:302 msgid "is now connected to" msgstr "ist jetzt verbunden mit" -#: ../../Zotlabs/Module/Connedit.php:423 +#: ../../Zotlabs/Module/Connedit.php:427 msgid "Could not access address book record." msgstr "Konnte nicht auf den Adressbuch-Eintrag zugreifen." -#: ../../Zotlabs/Module/Connedit.php:471 +#: ../../Zotlabs/Module/Connedit.php:475 msgid "Refresh failed - channel is currently unavailable." msgstr "Aktualisierung fehlgeschlagen – der Kanal ist im Moment nicht erreichbar." -#: ../../Zotlabs/Module/Connedit.php:486 ../../Zotlabs/Module/Connedit.php:495 -#: ../../Zotlabs/Module/Connedit.php:504 ../../Zotlabs/Module/Connedit.php:513 -#: ../../Zotlabs/Module/Connedit.php:526 +#: ../../Zotlabs/Module/Connedit.php:490 ../../Zotlabs/Module/Connedit.php:499 +#: ../../Zotlabs/Module/Connedit.php:508 ../../Zotlabs/Module/Connedit.php:517 +#: ../../Zotlabs/Module/Connedit.php:530 msgid "Unable to set address book parameters." msgstr "Konnte die Adressbuch-Parameter nicht setzen." -#: ../../Zotlabs/Module/Connedit.php:550 +#: ../../Zotlabs/Module/Connedit.php:554 msgid "Connection has been removed." msgstr "Verbindung wurde gelöscht." -#: ../../Zotlabs/Module/Connedit.php:590 ../../Zotlabs/Lib/Apps.php:241 +#: ../../Zotlabs/Module/Connedit.php:594 ../../Zotlabs/Lib/Apps.php:241 #: ../../addon/openclipatar/openclipatar.php:57 -#: ../../include/conversation.php:979 ../../include/nav.php:102 +#: ../../include/conversation.php:1015 ../../include/nav.php:141 msgid "View Profile" msgstr "Profil ansehen" -#: ../../Zotlabs/Module/Connedit.php:593 +#: ../../Zotlabs/Module/Connedit.php:597 #, php-format msgid "View %s's profile" msgstr "%ss Profil ansehen" -#: ../../Zotlabs/Module/Connedit.php:597 +#: ../../Zotlabs/Module/Connedit.php:601 msgid "Refresh Permissions" msgstr "Zugriffsrechte neu laden" -#: ../../Zotlabs/Module/Connedit.php:600 +#: ../../Zotlabs/Module/Connedit.php:604 msgid "Fetch updated permissions" msgstr "Aktualisierte Zugriffsrechte abrufen" -#: ../../Zotlabs/Module/Connedit.php:604 +#: ../../Zotlabs/Module/Connedit.php:608 msgid "Refresh Photo" msgstr "Foto aktualisieren" -#: ../../Zotlabs/Module/Connedit.php:607 +#: ../../Zotlabs/Module/Connedit.php:611 msgid "Fetch updated photo" msgstr "Aktualisiertes Profilfoto abrufen" -#: ../../Zotlabs/Module/Connedit.php:611 +#: ../../Zotlabs/Module/Connedit.php:615 msgid "Recent Activity" msgstr "Kürzliche Aktivitäten" -#: ../../Zotlabs/Module/Connedit.php:614 +#: ../../Zotlabs/Module/Connedit.php:618 msgid "View recent posts and comments" msgstr "Betrachte die neuesten Beiträge und Kommentare" -#: ../../Zotlabs/Module/Connedit.php:621 +#: ../../Zotlabs/Module/Connedit.php:625 msgid "Block (or Unblock) all communications with this connection" msgstr "Jegliche Kommunikation mit dieser Verbindung blockieren/zulassen" -#: ../../Zotlabs/Module/Connedit.php:622 +#: ../../Zotlabs/Module/Connedit.php:626 msgid "This connection is blocked!" msgstr "Die Verbindung ist geblockt!" -#: ../../Zotlabs/Module/Connedit.php:626 +#: ../../Zotlabs/Module/Connedit.php:630 msgid "Unignore" msgstr "Nicht ignorieren" -#: ../../Zotlabs/Module/Connedit.php:629 +#: ../../Zotlabs/Module/Connedit.php:633 msgid "Ignore (or Unignore) all inbound communications from this connection" msgstr "Jegliche eingehende Kommunikation von dieser Verbindung ignorieren/zulassen" -#: ../../Zotlabs/Module/Connedit.php:630 +#: ../../Zotlabs/Module/Connedit.php:634 msgid "This connection is ignored!" msgstr "Die Verbindung wird ignoriert!" -#: ../../Zotlabs/Module/Connedit.php:634 +#: ../../Zotlabs/Module/Connedit.php:638 msgid "Unarchive" msgstr "Aus Archiv zurückholen" -#: ../../Zotlabs/Module/Connedit.php:634 +#: ../../Zotlabs/Module/Connedit.php:638 msgid "Archive" msgstr "Archivieren" -#: ../../Zotlabs/Module/Connedit.php:637 +#: ../../Zotlabs/Module/Connedit.php:641 msgid "" "Archive (or Unarchive) this connection - mark channel dead but keep content" msgstr "Verbindung archivieren/aus dem Archiv zurückholen (Archiv = Kanal als erloschen markieren, aber die Beiträge behalten)" -#: ../../Zotlabs/Module/Connedit.php:638 +#: ../../Zotlabs/Module/Connedit.php:642 msgid "This connection is archived!" msgstr "Die Verbindung ist archiviert!" -#: ../../Zotlabs/Module/Connedit.php:642 +#: ../../Zotlabs/Module/Connedit.php:646 msgid "Unhide" msgstr "Wieder sichtbar machen" -#: ../../Zotlabs/Module/Connedit.php:642 +#: ../../Zotlabs/Module/Connedit.php:646 msgid "Hide" msgstr "Verstecken" -#: ../../Zotlabs/Module/Connedit.php:645 +#: ../../Zotlabs/Module/Connedit.php:649 msgid "Hide or Unhide this connection from your other connections" msgstr "Diese Verbindung vor anderen Verbindungen verstecken/zeigen" -#: ../../Zotlabs/Module/Connedit.php:646 +#: ../../Zotlabs/Module/Connedit.php:650 msgid "This connection is hidden!" msgstr "Die Verbindung ist versteckt!" -#: ../../Zotlabs/Module/Connedit.php:653 +#: ../../Zotlabs/Module/Connedit.php:657 msgid "Delete this connection" msgstr "Verbindung löschen" -#: ../../Zotlabs/Module/Connedit.php:661 +#: ../../Zotlabs/Module/Connedit.php:665 msgid "Fetch Vcard" msgstr "Vcard abrufen" -#: ../../Zotlabs/Module/Connedit.php:664 +#: ../../Zotlabs/Module/Connedit.php:668 msgid "Fetch electronic calling card for this connection" msgstr "Rufe eine digitale Visitenkarte für diese Verbindung ab" -#: ../../Zotlabs/Module/Connedit.php:675 +#: ../../Zotlabs/Module/Connedit.php:679 msgid "Open Individual Permissions section by default" msgstr "Öffne standardmäßig den Bereich für individuelle Berechtigungen" -#: ../../Zotlabs/Module/Connedit.php:698 +#: ../../Zotlabs/Module/Connedit.php:702 msgid "Affinity" msgstr "Beziehung" -#: ../../Zotlabs/Module/Connedit.php:701 +#: ../../Zotlabs/Module/Connedit.php:705 msgid "Open Set Affinity section by default" msgstr "Öffne standardmäßig den Bereich für Beziehungsgrad-Einstellungen" -#: ../../Zotlabs/Module/Connedit.php:705 ../../Zotlabs/Widget/Affinity.php:26 +#: ../../Zotlabs/Module/Connedit.php:709 ../../Zotlabs/Widget/Affinity.php:26 msgid "Me" msgstr "Ich" -#: ../../Zotlabs/Module/Connedit.php:706 ../../Zotlabs/Widget/Affinity.php:27 +#: ../../Zotlabs/Module/Connedit.php:710 ../../Zotlabs/Widget/Affinity.php:27 msgid "Family" msgstr "Familie" -#: ../../Zotlabs/Module/Connedit.php:708 ../../Zotlabs/Widget/Affinity.php:29 +#: ../../Zotlabs/Module/Connedit.php:712 ../../Zotlabs/Widget/Affinity.php:29 msgid "Acquaintances" msgstr "Bekannte" -#: ../../Zotlabs/Module/Connedit.php:735 +#: ../../Zotlabs/Module/Connedit.php:739 msgid "Filter" msgstr "Filter" -#: ../../Zotlabs/Module/Connedit.php:738 +#: ../../Zotlabs/Module/Connedit.php:742 msgid "Open Custom Filter section by default" msgstr "Öffne standardmäßig den Bereich für benutzerdefinierte Filter" -#: ../../Zotlabs/Module/Connedit.php:775 +#: ../../Zotlabs/Module/Connedit.php:779 msgid "Approve this connection" msgstr "Verbindung genehmigen" -#: ../../Zotlabs/Module/Connedit.php:775 +#: ../../Zotlabs/Module/Connedit.php:779 msgid "Accept connection to allow communication" msgstr "Akzeptiere die Verbindung, um Kommunikation zu ermöglichen" -#: ../../Zotlabs/Module/Connedit.php:780 +#: ../../Zotlabs/Module/Connedit.php:784 msgid "Set Affinity" msgstr "Beziehung festlegen" -#: ../../Zotlabs/Module/Connedit.php:783 +#: ../../Zotlabs/Module/Connedit.php:787 msgid "Set Profile" msgstr "Profil festlegen" -#: ../../Zotlabs/Module/Connedit.php:786 +#: ../../Zotlabs/Module/Connedit.php:790 msgid "Set Affinity & Profile" msgstr "Beziehung und Profile festlegen" -#: ../../Zotlabs/Module/Connedit.php:851 +#: ../../Zotlabs/Module/Connedit.php:855 msgid "This connection is unreachable from this location." msgstr "Diese Verbindung ist von diesem Ort unerreichbar." -#: ../../Zotlabs/Module/Connedit.php:852 +#: ../../Zotlabs/Module/Connedit.php:856 msgid "This connection may be unreachable from other channel locations." msgstr "Diese Verbindung könnte von anderen Standpunkten des Kanals nicht erreichbar sein." -#: ../../Zotlabs/Module/Connedit.php:854 +#: ../../Zotlabs/Module/Connedit.php:858 msgid "Location independence is not supported by their network." msgstr "Standort Unabhängigkeit wird vom anderen Netzwerk nicht unterstützt." -#: ../../Zotlabs/Module/Connedit.php:860 +#: ../../Zotlabs/Module/Connedit.php:864 msgid "" "This connection is unreachable from this location. Location independence is " "not supported by their network." msgstr "Diese Verbindung ist von diesem Standort aus unerreichbar. Standort Unabhängigkeit wird vom anderen Netzwerk nicht unterstützt." -#: ../../Zotlabs/Module/Connedit.php:863 +#: ../../Zotlabs/Module/Connedit.php:867 #: ../../Zotlabs/Widget/Settings_menu.php:109 msgid "Connection Default Permissions" msgstr "Standardzugriffsrechte für neue Verbindungen:" -#: ../../Zotlabs/Module/Connedit.php:863 ../../include/items.php:3925 +#: ../../Zotlabs/Module/Connedit.php:867 ../../include/items.php:3974 #, php-format msgid "Connection: %s" msgstr "Verbindung: %s" -#: ../../Zotlabs/Module/Connedit.php:864 +#: ../../Zotlabs/Module/Connedit.php:868 msgid "Apply these permissions automatically" msgstr "Diese Berechtigungen automatisch anwenden" -#: ../../Zotlabs/Module/Connedit.php:864 +#: ../../Zotlabs/Module/Connedit.php:868 msgid "Connection requests will be approved without your interaction" msgstr "Verbindungsanfragen werden sofort bestätigt, ohne dass Deine aktive Zustimmung erforderlich ist." -#: ../../Zotlabs/Module/Connedit.php:865 +#: ../../Zotlabs/Module/Connedit.php:869 msgid "Permission role" msgstr "Berechtigungsrolle" -#: ../../Zotlabs/Module/Connedit.php:866 +#: ../../Zotlabs/Module/Connedit.php:870 msgid "Add permission role" msgstr "Berechtigungsrolle hinzufügen" -#: ../../Zotlabs/Module/Connedit.php:873 +#: ../../Zotlabs/Module/Connedit.php:877 msgid "This connection's primary address is" msgstr "Die Hauptadresse der Verbindung ist" -#: ../../Zotlabs/Module/Connedit.php:874 +#: ../../Zotlabs/Module/Connedit.php:878 msgid "Available locations:" msgstr "Verfügbare Klone:" -#: ../../Zotlabs/Module/Connedit.php:879 +#: ../../Zotlabs/Module/Connedit.php:883 msgid "" "The permissions indicated on this page will be applied to all new " "connections." msgstr "Die auf dieser Seite angegebenen Berechtigungen werden auf alle neuen Verbindungen angewendet." -#: ../../Zotlabs/Module/Connedit.php:880 +#: ../../Zotlabs/Module/Connedit.php:884 msgid "Connection Tools" msgstr "Verbindungswerkzeuge" -#: ../../Zotlabs/Module/Connedit.php:882 +#: ../../Zotlabs/Module/Connedit.php:886 msgid "Slide to adjust your degree of friendship" msgstr "Verschieben, um den Grad der Freundschaft zu einzustellen" -#: ../../Zotlabs/Module/Connedit.php:883 ../../Zotlabs/Module/Rate.php:155 +#: ../../Zotlabs/Module/Connedit.php:887 ../../Zotlabs/Module/Rate.php:155 #: ../../include/js_strings.php:20 msgid "Rating" msgstr "Bewertung" -#: ../../Zotlabs/Module/Connedit.php:884 +#: ../../Zotlabs/Module/Connedit.php:888 msgid "Slide to adjust your rating" msgstr "Verschieben, um Deine Bewertung einzustellen" -#: ../../Zotlabs/Module/Connedit.php:885 ../../Zotlabs/Module/Connedit.php:890 +#: ../../Zotlabs/Module/Connedit.php:889 ../../Zotlabs/Module/Connedit.php:894 msgid "Optionally explain your rating" msgstr "Optional kannst Du Deine Bewertung begründen" -#: ../../Zotlabs/Module/Connedit.php:887 +#: ../../Zotlabs/Module/Connedit.php:891 msgid "Custom Filter" msgstr "Benutzerdefinierter Filter" -#: ../../Zotlabs/Module/Connedit.php:888 +#: ../../Zotlabs/Module/Connedit.php:892 msgid "Only import posts with this text" msgstr "Nur Beiträge mit diesem Text importieren" -#: ../../Zotlabs/Module/Connedit.php:888 ../../Zotlabs/Module/Connedit.php:889 +#: ../../Zotlabs/Module/Connedit.php:892 ../../Zotlabs/Module/Connedit.php:893 msgid "" "words one per line or #tags or /patterns/ or lang=xx, leave blank to import " "all posts" msgstr "Einzelne Wörter pro Zeile, #Tags oder /Reguläre Ausdrücke/. lang=xx (z.B. lang=de) ermöglicht Filterung nach Sprache. Leer lassen, um alle Beiträge zu importieren." -#: ../../Zotlabs/Module/Connedit.php:889 +#: ../../Zotlabs/Module/Connedit.php:893 msgid "Do not import posts with this text" msgstr "Beiträge mit diesem Text nicht importieren" -#: ../../Zotlabs/Module/Connedit.php:891 +#: ../../Zotlabs/Module/Connedit.php:895 msgid "This information is public!" msgstr "Diese Information ist öffentlich!" -#: ../../Zotlabs/Module/Connedit.php:896 +#: ../../Zotlabs/Module/Connedit.php:900 msgid "Connection Pending Approval" msgstr "Verbindung wartet auf Bestätigung" -#: ../../Zotlabs/Module/Connedit.php:901 +#: ../../Zotlabs/Module/Connedit.php:905 #, php-format msgid "" "Please choose the profile you would like to display to %s when viewing your " "profile securely." msgstr "Bitte wähle ein Profil, das wir %s zeigen sollen, wenn Deine Profilseite über eine verifizierte Verbindung aufgerufen wird." -#: ../../Zotlabs/Module/Connedit.php:908 +#: ../../Zotlabs/Module/Connedit.php:912 msgid "" "Some permissions may be inherited from your channel's <a " "href=\"settings\"><strong>privacy settings</strong></a>, which have higher " @@ -5469,18 +5537,14 @@ msgid "" "they wont have any impact unless the inherited setting changes." msgstr "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals geerbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung. Werden geerbte Einstellungen hier geändert, hat dies keine Auswirkungen." -#: ../../Zotlabs/Module/Connedit.php:909 +#: ../../Zotlabs/Module/Connedit.php:913 msgid "Last update:" msgstr "Letzte Aktualisierung:" -#: ../../Zotlabs/Module/Connedit.php:918 +#: ../../Zotlabs/Module/Connedit.php:922 msgid "Details" msgstr "Details" -#: ../../Zotlabs/Module/Chat.php:94 ../../Zotlabs/Lib/Apps.php:228 -msgid "My Chatrooms" -msgstr "Meine Chaträume" - #: ../../Zotlabs/Module/Chat.php:181 msgid "Room not found" msgstr "Chatraum nicht gefunden" @@ -5506,13 +5570,13 @@ msgid "Bookmark this room" msgstr "Lesezeichen für diesen Raum setzen" #: ../../Zotlabs/Module/Chat.php:205 ../../Zotlabs/Module/Mail.php:241 -#: ../../Zotlabs/Module/Mail.php:362 ../../include/conversation.php:1260 +#: ../../Zotlabs/Module/Mail.php:362 ../../include/conversation.php:1296 msgid "Please enter a link URL:" msgstr "Gib eine URL ein:" #: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Module/Mail.php:294 -#: ../../Zotlabs/Module/Mail.php:436 ../../Zotlabs/Lib/ThreadItem.php:742 -#: ../../include/conversation.php:1370 +#: ../../Zotlabs/Module/Mail.php:436 ../../Zotlabs/Lib/ThreadItem.php:757 +#: ../../include/conversation.php:1415 msgid "Encrypt text" msgstr "Text verschlüsseln" @@ -5545,9 +5609,14 @@ msgstr "Verfall" msgid "min" msgstr "min" +#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:242 +#: ../../include/conversation.php:1814 ../../include/nav.php:422 +msgid "Photos" +msgstr "Fotos" + #: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:237 -#: ../../Zotlabs/Storage/Browser.php:225 ../../Zotlabs/Storage/Browser.php:247 -#: ../../include/conversation.php:1788 ../../include/nav.php:386 +#: ../../Zotlabs/Storage/Browser.php:225 ../../include/conversation.php:1822 +#: ../../include/nav.php:430 msgid "Files" msgstr "Dateien" @@ -5587,7 +5656,7 @@ msgstr "Im Menü können gespeicherte Lesezeichen abgelegt werden" msgid "Submit and proceed" msgstr "Absenden und fortfahren" -#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2281 +#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2289 msgid "Menus" msgstr "Menüs" @@ -5639,14 +5708,13 @@ msgstr "Menü Titel wie er von anderen gesehen wird" msgid "Allow bookmarks" msgstr "Erlaube Lesezeichen" -#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2282 +#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2290 msgid "Layouts" msgstr "Layouts" -#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Module/Help.php:18 -#: ../../Zotlabs/Lib/Apps.php:245 ../../include/nav.php:157 -#: ../../include/nav.php:264 ../../include/help.php:55 -#: ../../include/help.php:61 +#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Lib/Apps.php:245 +#: ../../include/nav.php:201 ../../include/nav.php:301 +#: ../../include/help.php:68 ../../include/help.php:74 msgid "Help" msgstr "Hilfe" @@ -5663,12 +5731,12 @@ msgid "Download PDL file" msgstr "PDL-Datei herunterladen" #: ../../Zotlabs/Module/Tagger.php:55 ../../include/markdown.php:141 -#: ../../include/bbcode.php:334 +#: ../../include/bbcode.php:333 msgid "post" msgstr "Beitrag" #: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:146 -#: ../../include/text.php:1938 +#: ../../include/text.php:1946 msgid "comment" msgstr "Kommentar" @@ -5701,7 +5769,7 @@ msgid "Could not create privacy group." msgstr "Gruppe konnte nicht erstellt werden." #: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:143 -#: ../../include/items.php:3892 +#: ../../include/items.php:3941 msgid "Privacy group not found." msgstr "Gruppe nicht gefunden." @@ -5836,7 +5904,7 @@ msgid "View this profile" msgstr "Dieses Profil ansehen" #: ../../Zotlabs/Module/Profiles.php:728 ../../Zotlabs/Module/Profiles.php:827 -#: ../../include/channel.php:1183 +#: ../../include/channel.php:1284 msgid "Edit visibility" msgstr "Sichtbarkeit bearbeiten" @@ -5848,7 +5916,7 @@ msgstr "Profilwerkzeuge" msgid "Change cover photo" msgstr "Titelbild ändern" -#: ../../Zotlabs/Module/Profiles.php:731 ../../include/channel.php:1154 +#: ../../Zotlabs/Module/Profiles.php:731 ../../include/channel.php:1255 msgid "Change profile photo" msgstr "Profilfoto ändern" @@ -5868,7 +5936,7 @@ msgstr "Dieses Profil löschen" msgid "Add profile things" msgstr "Sachen zum Profil hinzufügen" -#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1654 +#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1688 msgid "Personal" msgstr "Persönlich" @@ -6013,12 +6081,12 @@ msgstr "Meine anderen Kanäle" msgid "Communications" msgstr "Kommunikation" -#: ../../Zotlabs/Module/Profiles.php:823 ../../include/channel.php:1179 +#: ../../Zotlabs/Module/Profiles.php:823 ../../include/channel.php:1280 msgid "Profile Image" msgstr "Profilfoto:" -#: ../../Zotlabs/Module/Profiles.php:833 ../../include/channel.php:1161 -#: ../../include/nav.php:105 +#: ../../Zotlabs/Module/Profiles.php:833 ../../include/channel.php:1262 +#: ../../include/nav.php:144 msgid "Edit Profiles" msgstr "Profile bearbeiten" @@ -6035,7 +6103,7 @@ msgid "Create a new channel" msgstr "Neuen Kanal anlegen" #: ../../Zotlabs/Module/Manage.php:170 ../../Zotlabs/Lib/Apps.php:234 -#: ../../include/nav.php:199 +#: ../../include/nav.php:129 ../../include/nav.php:215 msgid "Channel Manager" msgstr "Kanal-Manager" @@ -6069,6 +6137,16 @@ msgstr "%d neue Vorstellungen" msgid "Delegated Channel" msgstr "Delegierte Kanäle" +#: ../../Zotlabs/Module/Cards.php:38 ../../Zotlabs/Module/Cards.php:178 +#: ../../Zotlabs/Lib/Apps.php:224 ../../include/conversation.php:1873 +#: ../../include/features.php:122 ../../include/nav.php:479 +msgid "Cards" +msgstr "Karten" + +#: ../../Zotlabs/Module/Cards.php:95 +msgid "Add Card" +msgstr "Karte hinzufügen" + #: ../../Zotlabs/Module/Dirsearch.php:33 msgid "This directory server requires an access token" msgstr "Dieser Verzeichnisserver benötigt einen Zugriffstoken" @@ -6120,7 +6198,7 @@ msgid "No ratings" msgstr "Keine Bewertungen" #: ../../Zotlabs/Module/Ratings.php:97 ../../Zotlabs/Module/Pubsites.php:35 -#: ../../include/conversation.php:1029 +#: ../../include/conversation.php:1065 msgid "Ratings" msgstr "Bewertungen" @@ -6136,12 +6214,6 @@ msgstr "Webseite: " msgid "Description: " msgstr "Beschreibung: " -#: ../../Zotlabs/Module/Webpages.php:38 ../../Zotlabs/Module/Webpages.php:237 -#: ../../Zotlabs/Lib/Apps.php:238 ../../include/conversation.php:1838 -#: ../../include/nav.php:435 -msgid "Webpages" -msgstr "Webseiten" - #: ../../Zotlabs/Module/Webpages.php:54 msgid "Import Webpage Elements" msgstr "Webseitenelemente importieren" @@ -6158,6 +6230,11 @@ msgstr "Webseitenelemente exportieren" msgid "Export selected" msgstr "Exportieren ausgewählt" +#: ../../Zotlabs/Module/Webpages.php:237 ../../Zotlabs/Lib/Apps.php:238 +#: ../../include/conversation.php:1884 ../../include/nav.php:491 +msgid "Webpages" +msgstr "Webseiten" + #: ../../Zotlabs/Module/Webpages.php:248 msgid "Actions" msgstr "Aktionen" @@ -6190,11 +6267,44 @@ msgstr "Keine Webseitenelemente erkannt." msgid "Import complete." msgstr "Import abgeschlossen." +#: ../../Zotlabs/Module/Changeaddr.php:35 +msgid "" +"Channel name changes are not allowed within 48 hours of changing the account" +" password." +msgstr "Innerhalb von 48 Stunden nach einer Änderung des Konto-Passworts können Kanäle nicht umbenannt werden." + +#: ../../Zotlabs/Module/Changeaddr.php:46 ../../include/channel.php:209 +#: ../../include/channel.php:579 +msgid "Reserved nickname. Please choose another." +msgstr "Reservierter Kurzname. Bitte wähle einen anderen." + +#: ../../Zotlabs/Module/Changeaddr.php:51 ../../include/channel.php:214 +#: ../../include/channel.php:584 +msgid "" +"Nickname has unsupported characters or is already being used on this site." +msgstr "Der Spitzname enthält nicht-unterstütze Zeichen oder wird bereits auf dieser Seite genutzt." + +#: ../../Zotlabs/Module/Changeaddr.php:77 +msgid "Change channel nickname/address" +msgstr "Kanalname/-adresse ändern" + +#: ../../Zotlabs/Module/Changeaddr.php:78 +msgid "Any/all connections on other networks will be lost!" +msgstr "Jegliche/alle Verbindungen zu anderen Netzwerken gehen verloren!" + +#: ../../Zotlabs/Module/Changeaddr.php:80 +msgid "New channel address" +msgstr "Neue Kanaladresse" + +#: ../../Zotlabs/Module/Changeaddr.php:81 +msgid "Rename Channel" +msgstr "Kanal umbenennen" + #: ../../Zotlabs/Module/Editpost.php:38 ../../Zotlabs/Module/Editpost.php:43 msgid "Item is not editable" msgstr "Element kann nicht bearbeitet werden." -#: ../../Zotlabs/Module/Editpost.php:108 ../../Zotlabs/Module/Rpost.php:140 +#: ../../Zotlabs/Module/Editpost.php:108 ../../Zotlabs/Module/Rpost.php:178 msgid "Edit post" msgstr "Bearbeite Beitrag" @@ -6255,7 +6365,7 @@ msgstr "Mail zugestellt" msgid "Delivery report for %1$s" msgstr "Zustellungsbericht für %1$s" -#: ../../Zotlabs/Module/Dreport.php:151 +#: ../../Zotlabs/Module/Dreport.php:151 ../../Zotlabs/Widget/Wiki_pages.php:60 msgid "Options" msgstr "Optionen" @@ -6280,7 +6390,7 @@ msgid "*" msgstr "*" #: ../../Zotlabs/Module/Sources.php:96 -#: ../../Zotlabs/Widget/Settings_menu.php:125 ../../include/features.php:209 +#: ../../Zotlabs/Widget/Settings_menu.php:125 ../../include/features.php:218 msgid "Channel Sources" msgstr "Kanal-Quellen" @@ -6375,13 +6485,14 @@ msgstr "Kanal nicht vorhanden." msgid "Previous action reversed." msgstr "Die vorherige Aktion wurde rückgängig gemacht." -#: ../../Zotlabs/Module/Like.php:423 ../../addon/diaspora/Receiver.php:1399 -#: ../../include/conversation.php:160 +#: ../../Zotlabs/Module/Like.php:423 ../../addon/diaspora/Receiver.php:1453 +#: ../../addon/pubcrawl/as.php:1323 ../../include/conversation.php:160 #, php-format msgid "%1$s likes %2$s's %3$s" msgstr "%1$s gefällt %2$ss %3$s" -#: ../../Zotlabs/Module/Like.php:425 ../../include/conversation.php:163 +#: ../../Zotlabs/Module/Like.php:425 ../../addon/pubcrawl/as.php:1325 +#: ../../include/conversation.php:163 #, php-format msgid "%1$s doesn't like %2$s's %3$s" msgstr "%1$s gefällt %2$ss %3$s nicht" @@ -6447,11 +6558,11 @@ msgstr "Status:" msgid "Homepage: " msgstr "Webseite:" -#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1416 +#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1516 msgid "Age:" msgstr "Alter:" -#: ../../Zotlabs/Module/Directory.php:314 ../../include/channel.php:1251 +#: ../../Zotlabs/Module/Directory.php:314 ../../include/channel.php:1352 #: ../../include/event.php:52 ../../include/event.php:84 msgid "Location:" msgstr "Ort:" @@ -6460,17 +6571,17 @@ msgstr "Ort:" msgid "Description:" msgstr "Beschreibung:" -#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1432 +#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1532 msgid "Hometown:" msgstr "Heimatstadt:" -#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1440 +#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1540 msgid "About:" msgstr "Über:" #: ../../Zotlabs/Module/Directory.php:328 ../../Zotlabs/Module/Suggest.php:56 #: ../../Zotlabs/Widget/Follow.php:32 ../../Zotlabs/Widget/Suggestions.php:44 -#: ../../include/conversation.php:999 ../../include/channel.php:1236 +#: ../../include/conversation.php:1035 ../../include/channel.php:1337 #: ../../include/connections.php:111 msgid "Connect" msgstr "Verbinden" @@ -6548,11 +6659,6 @@ msgstr "Xchan-Suche" msgid "Lookup xchan beginning with (or webbie): " msgstr "Nach xchans oder Webbies (Kanal-Adressen) suchen, die wie folgt beginnen:" -#: ../../Zotlabs/Module/Suggest.php:32 ../../Zotlabs/Lib/Apps.php:232 -#: ../../include/features.php:333 -msgid "Suggest Channels" -msgstr "Kanäle vorschlagen" - #: ../../Zotlabs/Module/Suggest.php:39 msgid "" "No suggestions available. If this is a new site, please try again in 24 " @@ -6587,11 +6693,6 @@ msgstr "Verifizierung des angeforderten Kanals fehlgeschlagen." msgid "Selected channel has private message restrictions. Send failed." msgstr "Der ausgewählte Kanal hat Einschränkungen bzgl. privater Nachrichten. Senden fehlgeschlagen." -#: ../../Zotlabs/Module/Mail.php:143 ../../Zotlabs/Lib/Apps.php:246 -#: ../../include/nav.php:187 -msgid "Mail" -msgstr "Mail" - #: ../../Zotlabs/Module/Mail.php:160 msgid "Messages" msgstr "Nachrichten" @@ -6629,7 +6730,7 @@ msgid "Subject:" msgstr "Betreff:" #: ../../Zotlabs/Module/Mail.php:287 ../../Zotlabs/Module/Mail.php:429 -#: ../../include/conversation.php:1320 +#: ../../include/conversation.php:1365 msgid "Attach file" msgstr "Datei anhängen" @@ -6638,7 +6739,7 @@ msgid "Send" msgstr "Absenden" #: ../../Zotlabs/Module/Mail.php:292 ../../Zotlabs/Module/Mail.php:434 -#: ../../include/conversation.php:1365 +#: ../../include/conversation.php:1410 msgid "Set expiration date" msgstr "Verfallsdatum" @@ -6710,7 +6811,7 @@ msgstr "Statistiken" msgid "Software" msgstr "Software" -#: ../../Zotlabs/Module/Pubsites.php:48 +#: ../../Zotlabs/Module/Pubsites.php:49 msgid "Rate" msgstr "Bewerten" @@ -6764,14 +6865,10 @@ msgstr "Gib einen Ordnernamen ein" msgid "or select an existing folder (doubleclick)" msgstr "oder wähle einen vorhanden Ordner aus (Doppelklick)" -#: ../../Zotlabs/Module/Filer.php:54 ../../Zotlabs/Lib/ThreadItem.php:137 +#: ../../Zotlabs/Module/Filer.php:54 ../../Zotlabs/Lib/ThreadItem.php:141 msgid "Save to Folder" msgstr "In Ordner speichern" -#: ../../Zotlabs/Module/Probe.php:11 ../../Zotlabs/Lib/Apps.php:231 -msgid "Remote Diagnostics" -msgstr "Ferndiagnose" - #: ../../Zotlabs/Module/Probe.php:30 ../../Zotlabs/Module/Probe.php:34 #, php-format msgid "Fetching URL returns error: %1$s" @@ -6860,8 +6957,8 @@ msgstr "ja" msgid "Membership on this site is by invitation only." msgstr "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich." -#: ../../Zotlabs/Module/Register.php:268 ../../boot.php:1582 -#: ../../include/nav.php:145 +#: ../../Zotlabs/Module/Register.php:268 ../../boot.php:1620 +#: ../../include/nav.php:189 msgid "Register" msgstr "Registrieren" @@ -6876,30 +6973,30 @@ msgstr "Diese Seite verlangt möglicherweise eine Emailbestätigung nach dem Abs msgid "Cover Photos" msgstr "Cover Foto" -#: ../../Zotlabs/Module/Cover_photo.php:237 ../../include/items.php:4273 +#: ../../Zotlabs/Module/Cover_photo.php:237 ../../include/items.php:4320 msgid "female" msgstr "weiblich" -#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4274 +#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4321 #, php-format msgid "%1$s updated her %2$s" msgstr "%1$s hat ihr %2$s aktualisiert" -#: ../../Zotlabs/Module/Cover_photo.php:239 ../../include/items.php:4275 +#: ../../Zotlabs/Module/Cover_photo.php:239 ../../include/items.php:4322 msgid "male" msgstr "männlich" -#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/items.php:4276 +#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/items.php:4323 #, php-format msgid "%1$s updated his %2$s" msgstr "%1$s hat sein %2$s aktualisiert" -#: ../../Zotlabs/Module/Cover_photo.php:242 ../../include/items.php:4278 +#: ../../Zotlabs/Module/Cover_photo.php:242 ../../include/items.php:4325 #, php-format msgid "%1$s updated their %2$s" msgstr "%1$s hat sein/ihr %2$s aktualisiert" -#: ../../Zotlabs/Module/Cover_photo.php:244 ../../include/channel.php:1878 +#: ../../Zotlabs/Module/Cover_photo.php:244 ../../include/channel.php:1980 msgid "cover photo" msgstr "Cover Foto" @@ -6911,8 +7008,8 @@ msgstr "Cover Foto hochladen" msgid "Documentation Search" msgstr "Suche in der Dokumentation" -#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1770 -#: ../../include/nav.php:368 +#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1804 +#: ../../include/nav.php:412 msgid "About" msgstr "Über" @@ -6928,14 +7025,18 @@ msgstr "Entwickler" msgid "Tutorials" msgstr "Tutorials" -#: ../../Zotlabs/Module/Help.php:93 +#: ../../Zotlabs/Module/Help.php:95 msgid "$Projectname Documentation" msgstr "$Projectname-Dokumentation" -#: ../../Zotlabs/Module/Help.php:94 +#: ../../Zotlabs/Module/Help.php:96 msgid "Contents" msgstr "Inhalt" +#: ../../Zotlabs/Module/Display.php:340 +msgid "Item has been removed." +msgstr "Der Beitrag wurde entfernt." + #: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98 msgid "Tag removed" msgstr "Schlagwort entfernt" @@ -6948,7 +7049,7 @@ msgstr "Schlagwort entfernen" msgid "Select a tag to remove: " msgstr "Schlagwort zum Entfernen auswählen:" -#: ../../Zotlabs/Module/Network.php:96 +#: ../../Zotlabs/Module/Network.php:97 msgid "No such group" msgstr "Gruppe nicht gefunden" @@ -6984,14 +7085,10 @@ msgstr "Ungültige Verbindung." msgid "Invalid channel." msgstr "Ungültiger Kanal." -#: ../../Zotlabs/Module/Acl.php:344 +#: ../../Zotlabs/Module/Acl.php:351 msgid "network" msgstr "Netzwerk" -#: ../../Zotlabs/Module/Acl.php:354 -msgid "RSS" -msgstr "RSS" - #: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82 #: ../../addon/opensearch/opensearch.php:42 msgid "$Projectname" @@ -7051,14 +7148,14 @@ msgstr "Im geteilten Ordner Deiner Kontakte anzeigen" msgid "No channel." msgstr "Kein Kanal." -#: ../../Zotlabs/Module/Common.php:43 -msgid "Common connections" -msgstr "Gemeinsame Verbindungen" - -#: ../../Zotlabs/Module/Common.php:48 +#: ../../Zotlabs/Module/Common.php:45 msgid "No connections in common." msgstr "Keine gemeinsamen Verbindungen." +#: ../../Zotlabs/Module/Common.php:65 +msgid "View Common Connections" +msgstr "Zeige gemeinsame Verbindungen" + #: ../../Zotlabs/Module/Viewconnections.php:65 msgid "No connections." msgstr "Keine Verbindungen." @@ -7149,6 +7246,10 @@ msgstr "Bewertung (öffentlich sichtbar)" msgid "Optionally explain your rating (this information is public)" msgstr "Optional kannst du deine Bewertung erklären (öffentlich sichtbar)" +#: ../../Zotlabs/Module/Card_edit.php:128 +msgid "Edit Card" +msgstr "Karte bearbeiten" + #: ../../Zotlabs/Module/Lostpass.php:19 msgid "No valid account found." msgstr "Kein gültiges Konto gefunden." @@ -7173,7 +7274,7 @@ msgid "" "Password reset failed." msgstr "Die Anfrage konnte nicht verifiziert werden. (Vielleicht hast Du schon einmal auf den Link in der E-Mail geklickt?) Passwort-Rücksetzung fehlgeschlagen." -#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1609 +#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1648 msgid "Password Reset" msgstr "Zurücksetzen des Kennworts" @@ -7218,12 +7319,8 @@ msgstr "Gib Deine E-Mail-Adresse ein, um Dein Passwort zurücksetzen zu lassen. msgid "Email Address" msgstr "E-Mail Adresse" -#: ../../Zotlabs/Module/Lostpass.php:133 -msgid "Reset" -msgstr "Zurücksetzen" - #: ../../Zotlabs/Module/Notifications.php:43 -#: ../../Zotlabs/Lib/ThreadItem.php:392 +#: ../../Zotlabs/Lib/ThreadItem.php:397 msgid "Mark all seen" msgstr "Alle als gelesen markieren" @@ -7259,15 +7356,58 @@ msgstr "Hub-Administration" msgid "Report Bug" msgstr "Fehler melden" +#: ../../Zotlabs/Lib/Apps.php:227 +msgid "View Bookmarks" +msgstr "Lesezeichen ansehen" + +#: ../../Zotlabs/Lib/Apps.php:228 +msgid "My Chatrooms" +msgstr "Meine Chaträume" + #: ../../Zotlabs/Lib/Apps.php:230 msgid "Firefox Share" msgstr "Teilen-Knopf für Firefox" -#: ../../Zotlabs/Lib/Apps.php:233 ../../boot.php:1601 -#: ../../include/nav.php:113 +#: ../../Zotlabs/Lib/Apps.php:231 +msgid "Remote Diagnostics" +msgstr "Ferndiagnose" + +#: ../../Zotlabs/Lib/Apps.php:232 ../../include/features.php:342 +msgid "Suggest Channels" +msgstr "Kanäle vorschlagen" + +#: ../../Zotlabs/Lib/Apps.php:233 ../../boot.php:1639 +#: ../../include/nav.php:153 ../../include/nav.php:157 msgid "Login" msgstr "Anmelden" +#: ../../Zotlabs/Lib/Apps.php:235 ../../include/nav.php:98 +msgid "Activity" +msgstr "Aktivität" + +#: ../../Zotlabs/Lib/Apps.php:239 ../../include/conversation.php:1900 +#: ../../include/features.php:95 ../../include/nav.php:507 +msgid "Wiki" +msgstr "Wiki" + +#: ../../Zotlabs/Lib/Apps.php:240 ../../include/nav.php:102 +msgid "Channel Home" +msgstr "Mein Kanal" + +#: ../../Zotlabs/Lib/Apps.php:243 ../../include/conversation.php:1833 +#: ../../include/conversation.php:1836 ../../include/nav.php:124 +#: ../../include/nav.php:441 ../../include/nav.php:444 +msgid "Events" +msgstr "Termine" + +#: ../../Zotlabs/Lib/Apps.php:244 +msgid "Directory" +msgstr "Verzeichnis" + +#: ../../Zotlabs/Lib/Apps.php:246 ../../include/nav.php:116 +msgid "Mail" +msgstr "Mail" + #: ../../Zotlabs/Lib/Apps.php:249 msgid "Chat" msgstr "Chat" @@ -7284,29 +7424,41 @@ msgstr "Empfehlen" msgid "Random Channel" msgstr "Zufälliger Kanal" +#: ../../Zotlabs/Lib/Apps.php:254 +msgid "Invite" +msgstr "Einladen" + #: ../../Zotlabs/Lib/Apps.php:255 ../../Zotlabs/Widget/Admin.php:26 msgid "Features" msgstr "Funktionen" +#: ../../Zotlabs/Lib/Apps.php:256 ../../addon/openid/MysqlProvider.php:69 +msgid "Language" +msgstr "Sprache" + +#: ../../Zotlabs/Lib/Apps.php:257 +msgid "Post" +msgstr "Beitrag schreiben" + #: ../../Zotlabs/Lib/Apps.php:258 ../../addon/openid/MysqlProvider.php:58 #: ../../addon/openid/MysqlProvider.php:59 #: ../../addon/openid/MysqlProvider.php:60 msgid "Profile Photo" msgstr "Profilfoto" -#: ../../Zotlabs/Lib/Apps.php:391 +#: ../../Zotlabs/Lib/Apps.php:397 msgid "Purchase" msgstr "Kaufen" -#: ../../Zotlabs/Lib/Apps.php:395 +#: ../../Zotlabs/Lib/Apps.php:401 msgid "Undelete" msgstr "Wieder hergestellt" -#: ../../Zotlabs/Lib/Apps.php:401 +#: ../../Zotlabs/Lib/Apps.php:407 msgid "Add to app-tray" msgstr "Zum App-Menü hinzufügen" -#: ../../Zotlabs/Lib/Apps.php:402 +#: ../../Zotlabs/Lib/Apps.php:408 msgid "Remove from app-tray" msgstr "Aus dem App-Menü entfernen" @@ -7331,71 +7483,71 @@ msgid "publisher" msgstr "Autor" #: ../../Zotlabs/Lib/NativeWikiPage.php:42 -#: ../../Zotlabs/Lib/NativeWikiPage.php:83 +#: ../../Zotlabs/Lib/NativeWikiPage.php:90 msgid "(No Title)" msgstr "(Kein Titel)" -#: ../../Zotlabs/Lib/NativeWikiPage.php:97 +#: ../../Zotlabs/Lib/NativeWikiPage.php:104 msgid "Wiki page create failed." msgstr "Anlegen der Wiki-Seite fehlgeschlagen." -#: ../../Zotlabs/Lib/NativeWikiPage.php:110 +#: ../../Zotlabs/Lib/NativeWikiPage.php:117 msgid "Wiki not found." msgstr "Wiki nicht gefunden." -#: ../../Zotlabs/Lib/NativeWikiPage.php:121 +#: ../../Zotlabs/Lib/NativeWikiPage.php:128 msgid "Destination name already exists" msgstr "Zielname bereits vorhanden" -#: ../../Zotlabs/Lib/NativeWikiPage.php:147 -#: ../../Zotlabs/Lib/NativeWikiPage.php:342 +#: ../../Zotlabs/Lib/NativeWikiPage.php:160 +#: ../../Zotlabs/Lib/NativeWikiPage.php:355 msgid "Page not found" msgstr "Seite nicht gefunden" -#: ../../Zotlabs/Lib/NativeWikiPage.php:177 +#: ../../Zotlabs/Lib/NativeWikiPage.php:191 msgid "Error reading page content" msgstr "Fehler beim Lesen des Seiteninhalts" -#: ../../Zotlabs/Lib/NativeWikiPage.php:333 -#: ../../Zotlabs/Lib/NativeWikiPage.php:381 -#: ../../Zotlabs/Lib/NativeWikiPage.php:448 -#: ../../Zotlabs/Lib/NativeWikiPage.php:489 +#: ../../Zotlabs/Lib/NativeWikiPage.php:347 +#: ../../Zotlabs/Lib/NativeWikiPage.php:396 +#: ../../Zotlabs/Lib/NativeWikiPage.php:463 +#: ../../Zotlabs/Lib/NativeWikiPage.php:504 msgid "Error reading wiki" msgstr "Fehler beim Lesen des Wiki" -#: ../../Zotlabs/Lib/NativeWikiPage.php:369 +#: ../../Zotlabs/Lib/NativeWikiPage.php:384 msgid "Page update failed." msgstr "Seitenaktualisierung fehlgeschlagen." -#: ../../Zotlabs/Lib/NativeWikiPage.php:403 +#: ../../Zotlabs/Lib/NativeWikiPage.php:418 msgid "Nothing deleted" msgstr "Nichts gelöscht" -#: ../../Zotlabs/Lib/NativeWikiPage.php:469 +#: ../../Zotlabs/Lib/NativeWikiPage.php:484 msgid "Compare: object not found." msgstr "Vergleichen: Objekt nicht gefunden." -#: ../../Zotlabs/Lib/NativeWikiPage.php:475 +#: ../../Zotlabs/Lib/NativeWikiPage.php:490 msgid "Page updated" msgstr "Seite aktualisiert" -#: ../../Zotlabs/Lib/NativeWikiPage.php:478 +#: ../../Zotlabs/Lib/NativeWikiPage.php:493 msgid "Untitled" msgstr "Ohne Titel" -#: ../../Zotlabs/Lib/NativeWikiPage.php:484 +#: ../../Zotlabs/Lib/NativeWikiPage.php:499 msgid "Wiki resource_id required for git commit" msgstr "Die resource_id des Wiki wird benötigt für den git commit." -#: ../../Zotlabs/Lib/NativeWikiPage.php:540 +#: ../../Zotlabs/Lib/NativeWikiPage.php:555 #: ../../Zotlabs/Widget/Wiki_page_history.php:23 msgctxt "wiki_history" msgid "Message" msgstr "Nachricht" -#: ../../Zotlabs/Lib/NativeWikiPage.php:578 -#: ../../addon/gitwiki/gitwiki_backend.php:579 ../../include/bbcode.php:667 -#: ../../include/bbcode.php:813 +#: ../../Zotlabs/Lib/NativeWikiPage.php:593 +#: ../../addon/gitwiki/gitwiki_backend.php:579 ../../include/bbcode.php:672 +#: ../../include/bbcode.php:818 msgid "Different viewers will see this text differently" msgstr "Verschiedene Betrachter werden diesen Text unterschiedlich sehen" @@ -7487,7 +7639,7 @@ msgid "$Projectname Notification" msgstr "$Projectname-Benachrichtigung" #: ../../Zotlabs/Lib/Enotify.php:61 ../../addon/diaspora/util.php:283 -#: ../../addon/diaspora/util.php:296 ../../addon/diaspora/p.php:46 +#: ../../addon/diaspora/util.php:296 ../../addon/diaspora/p.php:48 msgid "$projectname" msgstr "$projectname" @@ -7495,7 +7647,7 @@ msgstr "$projectname" msgid "Thank You," msgstr "Danke." -#: ../../Zotlabs/Lib/Enotify.php:65 +#: ../../Zotlabs/Lib/Enotify.php:65 ../../addon/hubwall/hubwall.php:33 #, php-format msgid "%s Administrator" msgstr "der Administrator von %s" @@ -7713,7 +7865,11 @@ msgstr "Neuer Beitrag wurde erzeugt" msgid "commented on %s's post" msgstr "hat %s's Beitrag kommentiert" -#: ../../Zotlabs/Lib/NativeWiki.php:128 +#: ../../Zotlabs/Lib/NativeWiki.php:151 +msgid "Wiki updated successfully" +msgstr "Wiki erfolgreich aktualisiert" + +#: ../../Zotlabs/Lib/NativeWiki.php:198 msgid "Wiki files deleted successfully" msgstr "Wiki-Dateien erfolgreich gelöscht" @@ -7727,210 +7883,218 @@ msgstr "Aktualisierungsfehler auf %s" msgid "Update %s failed. See error logs." msgstr "Aktualisierung %s fehlgeschlagen. Details in den Fehlerprotokollen." -#: ../../Zotlabs/Lib/ThreadItem.php:96 ../../include/conversation.php:656 +#: ../../Zotlabs/Lib/ThreadItem.php:97 ../../include/conversation.php:681 msgid "Private Message" msgstr "Private Nachricht" -#: ../../Zotlabs/Lib/ThreadItem.php:133 ../../include/conversation.php:648 +#: ../../Zotlabs/Lib/ThreadItem.php:137 ../../include/conversation.php:673 msgid "Select" msgstr "Auswählen" -#: ../../Zotlabs/Lib/ThreadItem.php:158 +#: ../../Zotlabs/Lib/ThreadItem.php:162 msgid "I will attend" msgstr "Ich werde teilnehmen" -#: ../../Zotlabs/Lib/ThreadItem.php:158 +#: ../../Zotlabs/Lib/ThreadItem.php:162 msgid "I will not attend" msgstr "Ich werde nicht teilnehmen" -#: ../../Zotlabs/Lib/ThreadItem.php:158 +#: ../../Zotlabs/Lib/ThreadItem.php:162 msgid "I might attend" msgstr "Ich werde vielleicht teilnehmen" -#: ../../Zotlabs/Lib/ThreadItem.php:168 +#: ../../Zotlabs/Lib/ThreadItem.php:172 msgid "I agree" msgstr "Ich stimme zu" -#: ../../Zotlabs/Lib/ThreadItem.php:168 +#: ../../Zotlabs/Lib/ThreadItem.php:172 msgid "I disagree" msgstr "Ich lehne ab" -#: ../../Zotlabs/Lib/ThreadItem.php:168 +#: ../../Zotlabs/Lib/ThreadItem.php:172 msgid "I abstain" msgstr "Ich enthalte mich" -#: ../../Zotlabs/Lib/ThreadItem.php:224 +#: ../../Zotlabs/Lib/ThreadItem.php:228 msgid "Add Star" msgstr "Stern hinzufügen" -#: ../../Zotlabs/Lib/ThreadItem.php:225 +#: ../../Zotlabs/Lib/ThreadItem.php:229 msgid "Remove Star" msgstr "Stern entfernen" -#: ../../Zotlabs/Lib/ThreadItem.php:226 +#: ../../Zotlabs/Lib/ThreadItem.php:230 msgid "Toggle Star Status" msgstr "Markierungsstatus (Stern) umschalten" -#: ../../Zotlabs/Lib/ThreadItem.php:230 +#: ../../Zotlabs/Lib/ThreadItem.php:234 msgid "starred" msgstr "markiert" -#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:663 +#: ../../Zotlabs/Lib/ThreadItem.php:244 ../../include/conversation.php:688 msgid "Message signature validated" msgstr "Signatur überprüft" -#: ../../Zotlabs/Lib/ThreadItem.php:241 ../../include/conversation.php:664 +#: ../../Zotlabs/Lib/ThreadItem.php:245 ../../include/conversation.php:689 msgid "Message signature incorrect" msgstr "Signatur nicht korrekt" -#: ../../Zotlabs/Lib/ThreadItem.php:249 +#: ../../Zotlabs/Lib/ThreadItem.php:253 msgid "Add Tag" msgstr "Tag hinzufügen" -#: ../../Zotlabs/Lib/ThreadItem.php:267 ../../include/taxonomy.php:355 +#: ../../Zotlabs/Lib/ThreadItem.php:271 ../../include/taxonomy.php:433 msgid "like" msgstr "mag" -#: ../../Zotlabs/Lib/ThreadItem.php:268 ../../include/taxonomy.php:356 +#: ../../Zotlabs/Lib/ThreadItem.php:272 ../../include/taxonomy.php:434 msgid "dislike" msgstr "verurteile" -#: ../../Zotlabs/Lib/ThreadItem.php:272 +#: ../../Zotlabs/Lib/ThreadItem.php:276 msgid "Share This" msgstr "Teilen" -#: ../../Zotlabs/Lib/ThreadItem.php:272 +#: ../../Zotlabs/Lib/ThreadItem.php:276 msgid "share" msgstr "Teilen" -#: ../../Zotlabs/Lib/ThreadItem.php:281 +#: ../../Zotlabs/Lib/ThreadItem.php:285 msgid "Delivery Report" msgstr "Zustellungsbericht" -#: ../../Zotlabs/Lib/ThreadItem.php:299 +#: ../../Zotlabs/Lib/ThreadItem.php:303 #, php-format msgid "%d comment" msgid_plural "%d comments" msgstr[0] "%d Kommentar" msgstr[1] "%d Kommentare" -#: ../../Zotlabs/Lib/ThreadItem.php:328 ../../Zotlabs/Lib/ThreadItem.php:329 +#: ../../Zotlabs/Lib/ThreadItem.php:333 ../../Zotlabs/Lib/ThreadItem.php:334 #, php-format msgid "View %s's profile - %s" msgstr "Schaue Dir %ss Profil an – %s" -#: ../../Zotlabs/Lib/ThreadItem.php:332 +#: ../../Zotlabs/Lib/ThreadItem.php:337 msgid "to" msgstr "an" -#: ../../Zotlabs/Lib/ThreadItem.php:333 +#: ../../Zotlabs/Lib/ThreadItem.php:338 msgid "via" msgstr "via" -#: ../../Zotlabs/Lib/ThreadItem.php:334 +#: ../../Zotlabs/Lib/ThreadItem.php:339 msgid "Wall-to-Wall" msgstr "Wall-to-Wall" -#: ../../Zotlabs/Lib/ThreadItem.php:335 +#: ../../Zotlabs/Lib/ThreadItem.php:340 msgid "via Wall-To-Wall:" msgstr "via Wall-To-Wall:" -#: ../../Zotlabs/Lib/ThreadItem.php:348 ../../include/conversation.php:715 +#: ../../Zotlabs/Lib/ThreadItem.php:353 ../../include/conversation.php:747 #, php-format msgid "from %s" msgstr "via %s" -#: ../../Zotlabs/Lib/ThreadItem.php:351 ../../include/conversation.php:718 +#: ../../Zotlabs/Lib/ThreadItem.php:356 ../../include/conversation.php:750 #, php-format msgid "last edited: %s" msgstr "zuletzt bearbeitet: %s" -#: ../../Zotlabs/Lib/ThreadItem.php:352 ../../include/conversation.php:719 +#: ../../Zotlabs/Lib/ThreadItem.php:357 ../../include/conversation.php:751 #, php-format msgid "Expires: %s" msgstr "Verfällt: %s" -#: ../../Zotlabs/Lib/ThreadItem.php:358 +#: ../../Zotlabs/Lib/ThreadItem.php:363 msgid "Attend" msgstr "Zusagen" -#: ../../Zotlabs/Lib/ThreadItem.php:359 +#: ../../Zotlabs/Lib/ThreadItem.php:364 msgid "Attendance Options" msgstr "Zusageoptionen" -#: ../../Zotlabs/Lib/ThreadItem.php:360 +#: ../../Zotlabs/Lib/ThreadItem.php:365 msgid "Vote" msgstr "Abstimmen" -#: ../../Zotlabs/Lib/ThreadItem.php:361 +#: ../../Zotlabs/Lib/ThreadItem.php:366 msgid "Voting Options" msgstr "Abstimmungsoptionen" -#: ../../Zotlabs/Lib/ThreadItem.php:382 +#: ../../Zotlabs/Lib/ThreadItem.php:387 #: ../../addon/bookmarker/bookmarker.php:38 msgid "Save Bookmarks" msgstr "Favoriten speichern" -#: ../../Zotlabs/Lib/ThreadItem.php:383 +#: ../../Zotlabs/Lib/ThreadItem.php:388 msgid "Add to Calendar" msgstr "Zum Kalender hinzufügen" -#: ../../Zotlabs/Lib/ThreadItem.php:441 ../../include/js_strings.php:7 +#: ../../Zotlabs/Lib/ThreadItem.php:415 ../../include/conversation.php:471 +msgid "This is an unsaved preview" +msgstr "Dies ist eine nicht gespeicherte Vorschau" + +#: ../../Zotlabs/Lib/ThreadItem.php:447 ../../include/js_strings.php:7 #, php-format msgid "%s show all" msgstr "%s mehr anzeigen" -#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/conversation.php:1315 +#: ../../Zotlabs/Lib/ThreadItem.php:744 ../../include/conversation.php:1360 msgid "Bold" msgstr "Fett" -#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../include/conversation.php:1316 +#: ../../Zotlabs/Lib/ThreadItem.php:745 ../../include/conversation.php:1361 msgid "Italic" msgstr "Kursiv" -#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1317 +#: ../../Zotlabs/Lib/ThreadItem.php:746 ../../include/conversation.php:1362 msgid "Underline" msgstr "Unterstrichen" -#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1318 +#: ../../Zotlabs/Lib/ThreadItem.php:747 ../../include/conversation.php:1363 msgid "Quote" msgstr "Zitat" -#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1319 +#: ../../Zotlabs/Lib/ThreadItem.php:748 ../../include/conversation.php:1364 msgid "Code" msgstr "Code" -#: ../../Zotlabs/Lib/ThreadItem.php:736 +#: ../../Zotlabs/Lib/ThreadItem.php:749 msgid "Image" msgstr "Bild" -#: ../../Zotlabs/Lib/ThreadItem.php:737 +#: ../../Zotlabs/Lib/ThreadItem.php:750 +msgid "Attach File" +msgstr "Datei anhängen" + +#: ../../Zotlabs/Lib/ThreadItem.php:751 msgid "Insert Link" msgstr "Link einfügen" -#: ../../Zotlabs/Lib/ThreadItem.php:738 +#: ../../Zotlabs/Lib/ThreadItem.php:752 msgid "Video" msgstr "Video" -#: ../../Zotlabs/Lib/ThreadItem.php:747 +#: ../../Zotlabs/Lib/ThreadItem.php:762 msgid "Your full name (required)" msgstr "Ihr vollständiger Name (erforderlich)" -#: ../../Zotlabs/Lib/ThreadItem.php:748 +#: ../../Zotlabs/Lib/ThreadItem.php:763 msgid "Your email address (required)" msgstr "Ihre E-Mail-Adresse (erforderlich)" -#: ../../Zotlabs/Lib/ThreadItem.php:749 +#: ../../Zotlabs/Lib/ThreadItem.php:764 msgid "Your website URL (optional)" msgstr "Ihre Webseiten-URL (optional)" -#: ../../Zotlabs/Zot/Auth.php:138 +#: ../../Zotlabs/Zot/Auth.php:152 msgid "" "Remote authentication blocked. You are logged into this site locally. Please" " logout and retry." msgstr "Fern-Authentifizierung blockiert. Du bist lokal auf diesem Server angemeldet. Bitte melde Dich ab und versuche es erneut." -#: ../../Zotlabs/Zot/Auth.php:250 ../../addon/openid/Mod_Openid.php:76 +#: ../../Zotlabs/Zot/Auth.php:264 ../../addon/openid/Mod_Openid.php:76 #: ../../addon/openid/Mod_Openid.php:178 #, php-format msgid "Welcome %s. Remote authentication successful." @@ -7940,7 +8104,7 @@ msgstr "Willkommen %s. Entfernte Authentifizierung erfolgreich." msgid "parent" msgstr "Übergeordnetes Verzeichnis" -#: ../../Zotlabs/Storage/Browser.php:131 ../../include/text.php:2692 +#: ../../Zotlabs/Storage/Browser.php:131 ../../include/text.php:2707 msgid "Collection" msgstr "Sammlung" @@ -8087,12 +8251,14 @@ msgstr "Adressbuch zum Hineinimportieren auswählen" #: ../../Zotlabs/Widget/Appcategories.php:39 #: ../../Zotlabs/Widget/Tagcloud.php:25 ../../include/contact_widgets.php:91 -#: ../../include/taxonomy.php:227 ../../include/taxonomy.php:309 +#: ../../include/contact_widgets.php:132 ../../include/taxonomy.php:285 +#: ../../include/taxonomy.php:367 ../../include/taxonomy.php:387 msgid "Categories" msgstr "Kategorien" #: ../../Zotlabs/Widget/Appcategories.php:42 ../../Zotlabs/Widget/Filer.php:31 #: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94 +#: ../../include/contact_widgets.php:135 msgid "Everything" msgstr "Alles" @@ -8120,21 +8286,21 @@ msgstr "Private Nachrichten" msgid "Combined View" msgstr "Kombinierte Anzeige" -#: ../../Zotlabs/Widget/Mailmenu.php:20 ../../include/nav.php:190 +#: ../../Zotlabs/Widget/Mailmenu.php:20 ../../include/nav.php:119 msgid "Inbox" msgstr "Eingang" -#: ../../Zotlabs/Widget/Mailmenu.php:25 ../../include/nav.php:191 +#: ../../Zotlabs/Widget/Mailmenu.php:25 ../../include/nav.php:120 msgid "Outbox" msgstr "Ausgang" -#: ../../Zotlabs/Widget/Mailmenu.php:30 ../../include/nav.php:192 +#: ../../Zotlabs/Widget/Mailmenu.php:30 ../../include/nav.php:121 msgid "New Message" msgstr "Neue Nachricht" #: ../../Zotlabs/Widget/Chatroom_list.php:16 -#: ../../include/conversation.php:1813 ../../include/conversation.php:1816 -#: ../../include/nav.php:411 ../../include/nav.php:414 +#: ../../include/conversation.php:1847 ../../include/conversation.php:1850 +#: ../../include/nav.php:455 ../../include/nav.php:458 msgid "Chatrooms" msgstr "Chaträume" @@ -8216,7 +8382,7 @@ msgstr "Foto/Bild" msgid "Remove term" msgstr "Eintrag löschen" -#: ../../Zotlabs/Widget/Savedsearch.php:83 ../../include/features.php:297 +#: ../../Zotlabs/Widget/Savedsearch.php:83 ../../include/features.php:306 msgid "Saved Searches" msgstr "Gespeicherte Suchanfragen" @@ -8228,15 +8394,15 @@ msgstr "hinzufügen" msgid "Notes" msgstr "Notizen" -#: ../../Zotlabs/Widget/Wiki_pages.php:52 ../../addon/gitwiki/gitwiki.php:76 +#: ../../Zotlabs/Widget/Wiki_pages.php:47 ../../addon/gitwiki/gitwiki.php:76 msgid "Wiki Pages" msgstr "Wikiseiten" -#: ../../Zotlabs/Widget/Wiki_pages.php:58 ../../addon/gitwiki/gitwiki.php:81 +#: ../../Zotlabs/Widget/Wiki_pages.php:53 ../../addon/gitwiki/gitwiki.php:81 msgid "Add new page" msgstr "Neue Seite hinzufügen" -#: ../../Zotlabs/Widget/Wiki_pages.php:59 ../../addon/gitwiki/gitwiki.php:82 +#: ../../Zotlabs/Widget/Wiki_pages.php:58 ../../addon/gitwiki/gitwiki.php:82 msgid "Page name" msgstr "Seitenname" @@ -8257,7 +8423,7 @@ msgid "See more..." msgstr "Mehr anzeigen …" #: ../../Zotlabs/Widget/Filer.php:28 ../../include/contact_widgets.php:53 -#: ../../include/features.php:386 +#: ../../include/features.php:395 msgid "Saved Folders" msgstr "Gespeicherte Ordner" @@ -8277,7 +8443,7 @@ msgstr "Warteschlange kontrollieren" msgid "DB updates" msgstr "DB-Aktualisierungen" -#: ../../Zotlabs/Widget/Admin.php:55 ../../include/nav.php:215 +#: ../../Zotlabs/Widget/Admin.php:55 ../../include/nav.php:224 msgid "Admin" msgstr "Administration" @@ -8317,7 +8483,7 @@ msgstr "Kanal exportieren" msgid "Connected apps" msgstr "Verbundene Apps" -#: ../../Zotlabs/Widget/Settings_menu.php:100 ../../include/features.php:149 +#: ../../Zotlabs/Widget/Settings_menu.php:100 ../../include/features.php:158 msgid "Permission Groups" msgstr "Berechtigungsrollen" @@ -8329,151 +8495,289 @@ msgstr "Premium-Kanal-Einstellungen" msgid "Bookmarked Chatrooms" msgstr "Gespeicherte Chatrooms" +#: ../../Zotlabs/Widget/Notifications.php:16 +msgid "New Network Activity" +msgstr "Neue Netzwerk-Aktivitäten" + +#: ../../Zotlabs/Widget/Notifications.php:17 +msgid "New Network Activity Notifications" +msgstr "Benachrichtigungen für neue Netzwerk-Aktivitäten" + +#: ../../Zotlabs/Widget/Notifications.php:20 ../../include/nav.php:99 +msgid "View your network activity" +msgstr "Zeige Deine Netzwerk-Aktivitäten" + +#: ../../Zotlabs/Widget/Notifications.php:24 +msgid "Mark all notifications read" +msgstr "Alle Benachrichtigungen als gesehen markieren" + +#: ../../Zotlabs/Widget/Notifications.php:32 +msgid "New Home Activity" +msgstr "Neue Kanal-Aktivitäten" + +#: ../../Zotlabs/Widget/Notifications.php:33 +msgid "New Home Activity Notifications" +msgstr "Benachrichtigungen für neue Kanal-Aktivitäten" + +#: ../../Zotlabs/Widget/Notifications.php:36 +msgid "View your home activity" +msgstr "Zeige Deine Kanal-Aktivitäten" + +#: ../../Zotlabs/Widget/Notifications.php:40 +#: ../../Zotlabs/Widget/Notifications.php:136 +msgid "Mark all notifications seen" +msgstr "Alle Benachrichtigungen als gesehen markieren" + +#: ../../Zotlabs/Widget/Notifications.php:48 +msgid "New Mails" +msgstr "Neue Mails" + +#: ../../Zotlabs/Widget/Notifications.php:49 +msgid "New Mails Notifications" +msgstr "Benachrichtigungen für neue Mails" + +#: ../../Zotlabs/Widget/Notifications.php:52 +msgid "View your private mails" +msgstr "Zeige Deine persönlichen Mails" + +#: ../../Zotlabs/Widget/Notifications.php:56 +msgid "Mark all messages seen" +msgstr "Alle Mails als gelesen markieren" + +#: ../../Zotlabs/Widget/Notifications.php:64 +msgid "New Events" +msgstr "Neue Termine" + +#: ../../Zotlabs/Widget/Notifications.php:65 +msgid "New Events Notifications" +msgstr "Benachrichtigungen für neue Termine" + +#: ../../Zotlabs/Widget/Notifications.php:68 ../../include/nav.php:125 +msgid "View events" +msgstr "Termine ansehen" + +#: ../../Zotlabs/Widget/Notifications.php:72 ../../include/nav.php:126 +msgid "Mark all events seen" +msgstr "Markiere alle Termine als gesehen" + +#: ../../Zotlabs/Widget/Notifications.php:81 +msgid "New Connections Notifications" +msgstr "Benachrichtigungen für neue Verbindungen" + +#: ../../Zotlabs/Widget/Notifications.php:84 +msgid "View all connections" +msgstr "Zeige alle Verbindungen" + +#: ../../Zotlabs/Widget/Notifications.php:92 +msgid "New Files" +msgstr "Neue Dateien" + +#: ../../Zotlabs/Widget/Notifications.php:93 +msgid "New Files Notifications" +msgstr "Benachrichtigungen für neue Dateien" + +#: ../../Zotlabs/Widget/Notifications.php:100 +#: ../../Zotlabs/Widget/Notifications.php:101 ../../include/nav.php:112 +msgid "Notices" +msgstr "Benachrichtigungen" + +#: ../../Zotlabs/Widget/Notifications.php:104 +msgid "View all notices" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:108 +msgid "Mark all notices seen" +msgstr "" + +#: ../../Zotlabs/Widget/Notifications.php:118 +msgid "New Registrations" +msgstr "Neue Registrierungen" + +#: ../../Zotlabs/Widget/Notifications.php:119 +msgid "New Registrations Notifications" +msgstr "Benachrichtigungen für neue Registrierungen" + +#: ../../Zotlabs/Widget/Notifications.php:129 +msgid "Public Stream Notifications" +msgstr "Benachrichtigungen für öffentlichen Beitrags-Stream" + +#: ../../Zotlabs/Widget/Notifications.php:132 +msgid "View the public stream" +msgstr "Zeige öffentlichen Beitrags-Stream" + +#: ../../Zotlabs/Widget/Notifications.php:143 +#: ../../include/conversation.php:871 ../../include/nav.php:305 +msgid "Loading..." +msgstr "Lädt ..." + #: ../../util/nconfig.php:34 msgid "Source channel not found." msgstr "Quellkanal nicht gefunden." -#: ../../boot.php:1581 +#: ../../boot.php:1619 msgid "Create an account to access services and applications" msgstr "Erstelle ein Konto, um auf Dienste und Anwendungen zugreifen zu können." -#: ../../boot.php:1600 ../../include/nav.php:99 ../../include/nav.php:123 -#: ../../include/nav.php:140 +#: ../../boot.php:1638 ../../include/nav.php:138 ../../include/nav.php:167 +#: ../../include/nav.php:184 msgid "Logout" msgstr "Abmelden" -#: ../../boot.php:1603 +#: ../../boot.php:1642 msgid "Login/Email" msgstr "Anmelden/E-Mail" -#: ../../boot.php:1604 +#: ../../boot.php:1643 msgid "Password" msgstr "Kennwort" -#: ../../boot.php:1605 +#: ../../boot.php:1644 msgid "Remember me" msgstr "Angaben speichern" -#: ../../boot.php:1608 +#: ../../boot.php:1647 msgid "Forgot your password?" msgstr "Passwort vergessen?" -#: ../../boot.php:2146 +#: ../../boot.php:2191 msgid "toggle mobile" msgstr "auf/von mobile Ansicht wechseln" -#: ../../boot.php:2299 +#: ../../boot.php:2344 #, php-format msgid "[$Projectname] Website SSL error for %s" msgstr "[$Projectname] Webseiten-SSL-Fehler für %s" -#: ../../boot.php:2304 +#: ../../boot.php:2349 msgid "Website SSL certificate is not valid. Please correct." msgstr "Das SSL-Zertifikat der Website ist nicht gültig. Bitte beheben." -#: ../../boot.php:2423 +#: ../../boot.php:2468 #, php-format msgid "[$Projectname] Cron tasks not running on %s" msgstr "[$Projectname] Cron-Jobs laufen nicht auf %s" -#: ../../boot.php:2428 +#: ../../boot.php:2473 msgid "Cron/Scheduled tasks not running." msgstr "Cron-Aufgaben laufen nicht." -#: ../../boot.php:2429 ../../include/datetime.php:286 +#: ../../boot.php:2474 ../../include/datetime.php:286 msgid "never" msgstr "Nie" +#: ../../view/theme/redbasic_c/php/config.php:16 +#: ../../view/theme/redbasic_c/php/config.php:19 #: ../../view/theme/redbasic/php/config.php:16 #: ../../view/theme/redbasic/php/config.php:19 msgid "Focus (Hubzilla default)" msgstr "Focus (Voreinstellung für Hubzilla)" -#: ../../view/theme/redbasic/php/config.php:99 +#: ../../view/theme/redbasic_c/php/config.php:99 +#: ../../view/theme/redbasic/php/config.php:97 msgid "Theme settings" msgstr "Design-Einstellungen" -#: ../../view/theme/redbasic/php/config.php:100 +#: ../../view/theme/redbasic_c/php/config.php:100 +#: ../../view/theme/redbasic/php/config.php:98 msgid "Narrow navbar" msgstr "Schmale Navigationsleiste" -#: ../../view/theme/redbasic/php/config.php:101 +#: ../../view/theme/redbasic_c/php/config.php:101 +#: ../../view/theme/redbasic/php/config.php:99 msgid "Navigation bar background color" msgstr "Hintergrundfarbe der Navigationsleiste" -#: ../../view/theme/redbasic/php/config.php:102 +#: ../../view/theme/redbasic_c/php/config.php:102 +#: ../../view/theme/redbasic/php/config.php:100 msgid "Navigation bar icon color " msgstr "Farbe für die Icons der Navigationsleiste" -#: ../../view/theme/redbasic/php/config.php:103 +#: ../../view/theme/redbasic_c/php/config.php:103 +#: ../../view/theme/redbasic/php/config.php:101 msgid "Navigation bar active icon color " msgstr "Farbe für aktive Icons der Navigationsleiste" -#: ../../view/theme/redbasic/php/config.php:104 +#: ../../view/theme/redbasic_c/php/config.php:104 +#: ../../view/theme/redbasic/php/config.php:102 msgid "Link color" msgstr "Linkfarbe" -#: ../../view/theme/redbasic/php/config.php:105 +#: ../../view/theme/redbasic_c/php/config.php:105 +#: ../../view/theme/redbasic/php/config.php:103 msgid "Set font-color for banner" msgstr "Farbe der Schrift des Banners" -#: ../../view/theme/redbasic/php/config.php:106 +#: ../../view/theme/redbasic_c/php/config.php:106 +#: ../../view/theme/redbasic/php/config.php:104 msgid "Set the background color" msgstr "Hintergrundfarbe" -#: ../../view/theme/redbasic/php/config.php:107 +#: ../../view/theme/redbasic_c/php/config.php:107 +#: ../../view/theme/redbasic/php/config.php:105 msgid "Set the background image" msgstr "Hintergrundbild" -#: ../../view/theme/redbasic/php/config.php:108 +#: ../../view/theme/redbasic_c/php/config.php:108 +#: ../../view/theme/redbasic/php/config.php:106 msgid "Set the background color of items" msgstr "Hintergrundfarbe für Beiträge" -#: ../../view/theme/redbasic/php/config.php:109 +#: ../../view/theme/redbasic_c/php/config.php:109 +#: ../../view/theme/redbasic/php/config.php:107 msgid "Set the background color of comments" msgstr "Hintergrundfarbe für Kommentare" -#: ../../view/theme/redbasic/php/config.php:110 +#: ../../view/theme/redbasic_c/php/config.php:110 +#: ../../view/theme/redbasic/php/config.php:108 msgid "Set font-size for the entire application" msgstr "Schriftgröße für die gesamte Anwendung" -#: ../../view/theme/redbasic/php/config.php:110 +#: ../../view/theme/redbasic_c/php/config.php:110 +#: ../../view/theme/redbasic/php/config.php:108 msgid "Examples: 1rem, 100%, 16px" msgstr "Beispiele: 1rem, 100%, 16px" -#: ../../view/theme/redbasic/php/config.php:111 +#: ../../view/theme/redbasic_c/php/config.php:111 +#: ../../view/theme/redbasic/php/config.php:109 msgid "Set font-color for posts and comments" msgstr "Schriftfarbe für Beiträge und Kommentare" -#: ../../view/theme/redbasic/php/config.php:112 +#: ../../view/theme/redbasic_c/php/config.php:112 +#: ../../view/theme/redbasic/php/config.php:110 msgid "Set radius of corners" msgstr "Ecken-Radius" -#: ../../view/theme/redbasic/php/config.php:112 +#: ../../view/theme/redbasic_c/php/config.php:112 +#: ../../view/theme/redbasic/php/config.php:110 msgid "Example: 4px" msgstr "Beispiel: 4px" -#: ../../view/theme/redbasic/php/config.php:113 +#: ../../view/theme/redbasic_c/php/config.php:113 +#: ../../view/theme/redbasic/php/config.php:111 msgid "Set shadow depth of photos" msgstr "Schattentiefe von Fotos" -#: ../../view/theme/redbasic/php/config.php:114 +#: ../../view/theme/redbasic_c/php/config.php:114 +#: ../../view/theme/redbasic/php/config.php:112 msgid "Set maximum width of content region in pixel" msgstr "Maximalbreite des Inhaltsbereichs in Pixel festlegen" -#: ../../view/theme/redbasic/php/config.php:114 +#: ../../view/theme/redbasic_c/php/config.php:114 +#: ../../view/theme/redbasic/php/config.php:112 msgid "Leave empty for default width" msgstr "Leer lassen für Standardbreite" -#: ../../view/theme/redbasic/php/config.php:115 +#: ../../view/theme/redbasic_c/php/config.php:115 msgid "Left align page content" msgstr "Seiteninhalt linksbündig anzeigen" -#: ../../view/theme/redbasic/php/config.php:116 +#: ../../view/theme/redbasic_c/php/config.php:116 +#: ../../view/theme/redbasic/php/config.php:113 msgid "Set size of conversation author photo" msgstr "Größe der Avatare von Themenstartern" -#: ../../view/theme/redbasic/php/config.php:117 +#: ../../view/theme/redbasic_c/php/config.php:117 +#: ../../view/theme/redbasic/php/config.php:114 msgid "Set size of followup author photos" msgstr "Größe der Avatare von Kommentatoren" @@ -8615,30 +8919,30 @@ msgstr "Eine Einstellung" msgid "Skeleton Settings" msgstr "Skeleton Einstellungen" -#: ../../addon/gnusoc/gnusoc.php:200 +#: ../../addon/gnusoc/gnusoc.php:243 msgid "GNU-Social Protocol Settings updated." msgstr "GNU social Protokoll Einstellungen aktualisiert" -#: ../../addon/gnusoc/gnusoc.php:219 +#: ../../addon/gnusoc/gnusoc.php:262 msgid "" "The GNU-Social protocol does not support location independence. Connections " "you make within that network may be unreachable from alternate channel " "locations." msgstr "Das GNU-Social-Protokoll unterstützt keine Server-unabhängigen Identitäten. Verbindungen, die Du mit diesem Netzwerk eingehst, können von anderen Orten (Klonen) dieses Kanals aus unerreichbar sein." -#: ../../addon/gnusoc/gnusoc.php:222 +#: ../../addon/gnusoc/gnusoc.php:265 msgid "Enable the GNU-Social protocol for this channel" msgstr "Aktiviere das GNU social Protokoll für diesen Kanal" -#: ../../addon/gnusoc/gnusoc.php:226 +#: ../../addon/gnusoc/gnusoc.php:269 msgid "GNU-Social Protocol Settings" msgstr "GNU social Protokoll Einstellungen" -#: ../../addon/gnusoc/gnusoc.php:417 +#: ../../addon/gnusoc/gnusoc.php:460 msgid "Follow" msgstr "Folgen" -#: ../../addon/gnusoc/gnusoc.php:420 +#: ../../addon/gnusoc/gnusoc.php:463 #, php-format msgid "%1$s is now following %2$s" msgstr "%1$s folgt nun %2$s" @@ -8684,8 +8988,8 @@ msgstr "Zurückkehren nach" msgid "Page to load after image selection." msgstr "Die Seite, die nach Auswahl eines Bildes geladen werden soll." -#: ../../addon/openclipatar/openclipatar.php:58 ../../include/channel.php:1165 -#: ../../include/nav.php:107 +#: ../../addon/openclipatar/openclipatar.php:58 ../../include/channel.php:1266 +#: ../../include/nav.php:146 msgid "Edit Profile" msgstr "Profil bearbeiten" @@ -8758,6 +9062,10 @@ msgstr "Unbekannter Fehler. Bitte versuchen Sie es später erneut." msgid "Profile photo updated successfully." msgstr "Profilfoto erfolgreich aktualisiert." +#: ../../addon/zotvi/zot6.php:25 ../../include/zot.php:3983 +msgid "invalid target signature" +msgstr "Ungültige Signatur des Ziels" + #: ../../addon/adultphotoflag/adultphotoflag.php:24 msgid "Flag Adult Photos" msgstr "Nicht jugendfreie Fotos markieren" @@ -9219,17 +9527,17 @@ msgstr "Geburtsdatum" msgid "OpenID protocol error. No ID returned." msgstr "OpenID-Protokollfehler. Keine Kennung zurückgegeben." -#: ../../addon/openid/Mod_Openid.php:188 ../../include/auth.php:286 +#: ../../addon/openid/Mod_Openid.php:188 ../../include/auth.php:289 msgid "Login failed." msgstr "Login fehlgeschlagen." #: ../../addon/openid/Mod_Id.php:85 ../../include/selectors.php:49 -#: ../../include/selectors.php:66 ../../include/channel.php:1332 +#: ../../include/selectors.php:66 ../../include/channel.php:1432 msgid "Male" msgstr "Männlich" #: ../../addon/openid/Mod_Id.php:87 ../../include/selectors.php:49 -#: ../../include/selectors.php:66 ../../include/channel.php:1330 +#: ../../include/selectors.php:66 ../../include/channel.php:1430 msgid "Female" msgstr "Weiblich" @@ -9239,7 +9547,7 @@ msgstr "Gern geschehen." #: ../../addon/randpost/randpost.php:98 msgid "Ah shucks..." -msgstr "" +msgstr "Ach Mist..." #: ../../addon/randpost/randpost.php:99 msgid "Don't mention it." @@ -9416,39 +9724,39 @@ msgstr "" msgid "declared undying love for" msgstr "" -#: ../../addon/diaspora/diaspora.php:715 +#: ../../addon/diaspora/diaspora.php:763 msgid "Diaspora Protocol Settings updated." msgstr "Diaspora Protokoll Einstellungen aktualisiert" -#: ../../addon/diaspora/diaspora.php:734 +#: ../../addon/diaspora/diaspora.php:782 msgid "" "The Diaspora protocol does not support location independence. Connections " "you make within that network may be unreachable from alternate channel " "locations." msgstr "Das Diaspora-Protokoll unterstützt keine Server-unabhängigen Identitäten. Verbindungen, die Du mit diesem Netzwerk eingehst, können von anderen Orten (Klonen) dieses Kanals aus unerreichbar sein." -#: ../../addon/diaspora/diaspora.php:737 +#: ../../addon/diaspora/diaspora.php:785 msgid "Enable the Diaspora protocol for this channel" msgstr "Das Diaspora Protokoll für diesen Kanal aktivieren" -#: ../../addon/diaspora/diaspora.php:741 +#: ../../addon/diaspora/diaspora.php:789 msgid "Allow any Diaspora member to comment on your public posts" msgstr "Erlaube jedem Diaspora Nutzer deine öffentlichen Beiträge zu kommentieren" -#: ../../addon/diaspora/diaspora.php:745 +#: ../../addon/diaspora/diaspora.php:793 msgid "Prevent your hashtags from being redirected to other sites" msgstr "Verhindern, dass Deine Hashtags zu anderen Seiten umgeleitet werden" -#: ../../addon/diaspora/diaspora.php:749 +#: ../../addon/diaspora/diaspora.php:797 msgid "" "Sign and forward posts and comments with no existing Diaspora signature" msgstr "Signieren und Weiterleiten von Beiträgen und Kommentaren ohne vorhandene Diaspora-Signatur" -#: ../../addon/diaspora/diaspora.php:754 +#: ../../addon/diaspora/diaspora.php:802 msgid "Followed hashtags (comma separated, do not include the #)" msgstr "Verfolgte Hashtags (Komma separierte Liste, ohne die #)" -#: ../../addon/diaspora/diaspora.php:759 +#: ../../addon/diaspora/diaspora.php:807 msgid "Diaspora Protocol Settings" msgstr "Diaspora Protokoll Einstellungen" @@ -9460,18 +9768,6 @@ msgstr "Es wurde kein Nutzername in der importierten Datei gefunden." msgid "Unable to create a unique channel address. Import failed." msgstr "Es war nicht möglich, eine eindeutige Kanal-Adresse zu erzeugen. Der Import ist fehlgeschlagen." -#: ../../addon/gitwiki/Mod_Gitwiki.php:107 -msgid "Error retrieving wiki" -msgstr "Fehler beim Abrufen des Wiki" - -#: ../../addon/gitwiki/Mod_Gitwiki.php:114 -msgid "Error creating zip file export folder" -msgstr "Fehler bei der Erzeugung des Zip-Datei Export-Verzeichnisses " - -#: ../../addon/gitwiki/Mod_Gitwiki.php:132 -msgid "Error downloading wiki: " -msgstr "Fehler beim Herunterladen des Wiki:" - #: ../../addon/testdrive/testdrive.php:104 #, php-format msgid "Your account on %s will expire in a few days." @@ -9509,6 +9805,66 @@ msgstr "PHP upload_max_filesize:" msgid "PHP post_max_size (must be larger than upload_max_filesize): " msgstr "PHP post_max_size (muss größer sein als upload_max_filesize):" +#: ../../addon/gravatar/gravatar.php:123 +msgid "generic profile image" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:124 +msgid "random geometric pattern" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:125 +msgid "monster face" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:126 +msgid "computer generated face" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:127 +msgid "retro arcade style face" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:128 +msgid "Hub default profile photo" +msgstr "Standard-Profilfoto für diesen Hub" + +#: ../../addon/gravatar/gravatar.php:143 +msgid "Information" +msgstr "Information" + +#: ../../addon/gravatar/gravatar.php:143 +msgid "" +"Libravatar addon is installed, too. Please disable Libravatar addon or this " +"Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if " +"nothing was found at Libravatar." +msgstr "" + +#: ../../addon/gravatar/gravatar.php:150 +#: ../../addon/msgfooter/msgfooter.php:46 ../../addon/xmpp/xmpp.php:91 +msgid "Save Settings" +msgstr "Einstellungen speichern" + +#: ../../addon/gravatar/gravatar.php:151 +msgid "Default avatar image" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:151 +msgid "Select default avatar image if none was found at Gravatar. See README" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:152 +msgid "Rating of images" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:152 +msgid "Select the appropriate avatar rating for your site. See README" +msgstr "" + +#: ../../addon/gravatar/gravatar.php:165 +msgid "Gravatar settings updated." +msgstr "" + #: ../../addon/visage/visage.php:93 msgid "Recent Channel/Profile Viewers" msgstr "Kürzliche Kanal/Profil Besucher" @@ -9615,10 +9971,6 @@ msgstr "Markierung auf der Karte einschließen" msgid "Include a marker on the map." msgstr "Binde eine Markierung auf der Karte ein." -#: ../../addon/msgfooter/msgfooter.php:46 ../../addon/xmpp/xmpp.php:91 -msgid "Save Settings" -msgstr "Einstellungen speichern" - #: ../../addon/msgfooter/msgfooter.php:47 msgid "text to include in all outgoing posts from this site" msgstr "Test der in alle Beiträge angefügt werden soll, die von dieser Seite ausgehen" @@ -9659,8 +10011,8 @@ msgstr "Friendica-Passwort" msgid "Hubzilla to Friendica Post Settings" msgstr "Hubzilla-zu-Friendica Beitragseinstellungen" -#: ../../addon/jappixmini/jappixmini.php:305 ../../include/channel.php:1256 -#: ../../include/channel.php:1419 +#: ../../addon/jappixmini/jappixmini.php:305 ../../include/channel.php:1357 +#: ../../include/channel.php:1519 msgid "Status:" msgstr "Status:" @@ -9825,6 +10177,30 @@ msgstr "Friendica-Anmeldebenutzername" msgid "Friendica Login Password" msgstr "Friendica-Anmeldepasswort" +#: ../../addon/pubcrawl/as.php:1076 ../../addon/pubcrawl/as.php:1160 +#: ../../addon/pubcrawl/as.php:1332 ../../include/network.php:1705 +msgid "ActivityPub" +msgstr "ActivityPub" + +#: ../../addon/pubcrawl/pubcrawl.php:1032 +msgid "ActivityPub Protocol Settings updated." +msgstr "" + +#: ../../addon/pubcrawl/pubcrawl.php:1041 +msgid "" +"The ActivityPub protocol does not support location independence. Connections" +" you make within that network may be unreachable from alternate channel " +"locations." +msgstr "" + +#: ../../addon/pubcrawl/pubcrawl.php:1044 +msgid "Enable the ActivityPub protocol for this channel" +msgstr "" + +#: ../../addon/pubcrawl/pubcrawl.php:1049 +msgid "ActivityPub Protocol Settings" +msgstr "" + #: ../../addon/donate/donate.php:21 msgid "Project Servers and Resources" msgstr "Projektserver und -ressourcen" @@ -10187,43 +10563,39 @@ msgstr "QR-Generator" msgid "Enter some text" msgstr "Etwas Text eingeben" -#: ../../addon/chess/chess.php:276 ../../addon/chess/chess.php:433 +#: ../../addon/chess/chess.php:278 ../../addon/chess/chess.php:465 msgid "Invalid game." msgstr "Ungültiges Spiel." -#: ../../addon/chess/chess.php:282 ../../addon/chess/chess.php:439 +#: ../../addon/chess/chess.php:284 ../../addon/chess/chess.php:471 msgid "You are not a player in this game." msgstr "Sie sind kein Spieler in diesem Spiel." -#: ../../addon/chess/chess.php:315 +#: ../../addon/chess/chess.php:340 msgid "You must be a local channel to create a game." msgstr "Um ein Spiel zu eröffnen, musst du ein lokaler Kanal sein" -#: ../../addon/chess/chess.php:333 +#: ../../addon/chess/chess.php:358 msgid "You must select one opponent that is not yourself." msgstr "Du musst einen Gegner wählen, der nicht du selbst ist" -#: ../../addon/chess/chess.php:336 -msgid "Creating new game..." -msgstr "Neues Spiel wird erstellt..." - -#: ../../addon/chess/chess.php:342 +#: ../../addon/chess/chess.php:367 msgid "You must select white or black." msgstr "Sie müssen weiß oder schwarz auswählen." -#: ../../addon/chess/chess.php:349 +#: ../../addon/chess/chess.php:375 msgid "Error creating new game." msgstr "Fehler beim Erstellen eines neuen Spiels." -#: ../../addon/chess/chess.php:381 ../../include/channel.php:1016 +#: ../../addon/chess/chess.php:409 ../../include/channel.php:1117 msgid "Requested channel is not available." msgstr "Angeforderte Kanal nicht verfügbar." -#: ../../addon/chess/chess.php:395 +#: ../../addon/chess/chess.php:423 msgid "You must select a local channel /chess/channelname" msgstr "Du musst einen lokalen Kanal/Schach(Kanalnamen aufwählen" -#: ../../addon/chess/chess.php:923 +#: ../../addon/chess/chess.php:969 msgid "Enable notifications" msgstr "Benachrichtigungen aktivieren" @@ -10821,11 +11193,6 @@ msgstr "Datei" msgid "Send email to all members" msgstr "E-Mail an alle Mitglieder senden" -#: ../../addon/hubwall/hubwall.php:33 -#, php-format -msgid "$1%s Administrator" -msgstr "$1%s Administrator" - #: ../../addon/hubwall/hubwall.php:73 #, php-format msgid "%1$d of %2$d messages sent." @@ -10899,11 +11266,11 @@ msgstr "Transsexuell" msgid "Hermaphrodite" msgstr "Zwitter" -#: ../../include/selectors.php:49 ../../include/channel.php:1336 +#: ../../include/selectors.php:49 ../../include/channel.php:1436 msgid "Neuter" msgstr "Geschlechtslos" -#: ../../include/selectors.php:49 ../../include/channel.php:1338 +#: ../../include/selectors.php:49 ../../include/channel.php:1438 msgid "Non-specific" msgstr "unklar" @@ -11093,282 +11460,274 @@ msgstr "%1$s ist jetzt mit %2$s verbunden" msgid "%1$s poked %2$s" msgstr "%1$s stupste %2$s an" -#: ../../include/conversation.php:239 ../../include/text.php:1096 -#: ../../include/text.php:1101 +#: ../../include/conversation.php:239 ../../include/text.php:1104 +#: ../../include/text.php:1109 msgid "poked" msgstr "stupste" -#: ../../include/conversation.php:688 +#: ../../include/conversation.php:720 #, php-format msgid "View %s's profile @ %s" msgstr "%ss Profil auf %s ansehen" -#: ../../include/conversation.php:708 +#: ../../include/conversation.php:740 msgid "Categories:" msgstr "Kategorien:" -#: ../../include/conversation.php:709 +#: ../../include/conversation.php:741 msgid "Filed under:" msgstr "Gespeichert unter:" -#: ../../include/conversation.php:734 +#: ../../include/conversation.php:766 msgid "View in context" msgstr "Im Zusammenhang anschauen" -#: ../../include/conversation.php:831 +#: ../../include/conversation.php:867 msgid "remove" msgstr "lösche" -#: ../../include/conversation.php:835 ../../include/nav.php:268 -msgid "Loading..." -msgstr "Lädt ..." - -#: ../../include/conversation.php:836 +#: ../../include/conversation.php:872 msgid "Delete Selected Items" msgstr "Lösche die ausgewählten Elemente" -#: ../../include/conversation.php:879 +#: ../../include/conversation.php:915 msgid "View Source" msgstr "Quelle anzeigen" -#: ../../include/conversation.php:889 +#: ../../include/conversation.php:925 msgid "Follow Thread" msgstr "Unterhaltung folgen" -#: ../../include/conversation.php:898 +#: ../../include/conversation.php:934 msgid "Unfollow Thread" msgstr "Unterhaltung nicht mehr folgen" -#: ../../include/conversation.php:989 +#: ../../include/conversation.php:1025 msgid "Activity/Posts" msgstr "Aktivitäten/Beiträge" -#: ../../include/conversation.php:1009 +#: ../../include/conversation.php:1045 msgid "Edit Connection" msgstr "Verbindung bearbeiten" -#: ../../include/conversation.php:1019 +#: ../../include/conversation.php:1055 msgid "Message" msgstr "Nachricht" -#: ../../include/conversation.php:1153 +#: ../../include/conversation.php:1189 #, php-format msgid "%s likes this." msgstr "%s gefällt das." -#: ../../include/conversation.php:1153 +#: ../../include/conversation.php:1189 #, php-format msgid "%s doesn't like this." msgstr "%s gefällt das nicht." -#: ../../include/conversation.php:1157 +#: ../../include/conversation.php:1193 #, php-format msgid "<span %1$s>%2$d people</span> like this." msgid_plural "<span %1$s>%2$d people</span> like this." msgstr[0] "<span %1$s>%2$d Person</span> gefällt das." msgstr[1] "<span %1$s>%2$d Leuten</span> gefällt das." -#: ../../include/conversation.php:1159 +#: ../../include/conversation.php:1195 #, php-format msgid "<span %1$s>%2$d people</span> don't like this." msgid_plural "<span %1$s>%2$d people</span> don't like this." msgstr[0] "<span %1$s>%2$d Person</span> gefällt das nicht." msgstr[1] "<span %1$s>%2$d Leuten</span> gefällt das nicht." -#: ../../include/conversation.php:1165 +#: ../../include/conversation.php:1201 msgid "and" msgstr "und" -#: ../../include/conversation.php:1168 +#: ../../include/conversation.php:1204 #, php-format msgid ", and %d other people" msgid_plural ", and %d other people" msgstr[0] "" msgstr[1] ", und %d andere" -#: ../../include/conversation.php:1169 +#: ../../include/conversation.php:1205 #, php-format msgid "%s like this." msgstr "%s gefällt das." -#: ../../include/conversation.php:1169 +#: ../../include/conversation.php:1205 #, php-format msgid "%s don't like this." msgstr "%s gefällt das nicht." -#: ../../include/conversation.php:1212 +#: ../../include/conversation.php:1248 msgid "Set your location" msgstr "Standort" -#: ../../include/conversation.php:1213 +#: ../../include/conversation.php:1249 msgid "Clear browser location" msgstr "Browser-Standort löschen" -#: ../../include/conversation.php:1261 +#: ../../include/conversation.php:1297 msgid "Tag term:" msgstr "Schlagwort:" -#: ../../include/conversation.php:1262 +#: ../../include/conversation.php:1298 msgid "Where are you right now?" msgstr "Wo bist Du jetzt grade?" -#: ../../include/conversation.php:1267 +#: ../../include/conversation.php:1303 msgid "Choose a different album..." msgstr "Wählen Sie ein anderes Album aus..." -#: ../../include/conversation.php:1271 +#: ../../include/conversation.php:1307 msgid "Comments enabled" msgstr "Kommentare aktiviert" -#: ../../include/conversation.php:1272 +#: ../../include/conversation.php:1308 msgid "Comments disabled" msgstr "Kommentare deaktiviert" -#: ../../include/conversation.php:1310 +#: ../../include/conversation.php:1355 msgid "Page link name" msgstr "Link zur Seite" -#: ../../include/conversation.php:1313 +#: ../../include/conversation.php:1358 msgid "Post as" msgstr "Veröffentlichen als" -#: ../../include/conversation.php:1327 +#: ../../include/conversation.php:1372 msgid "Toggle voting" msgstr "Umfragewerkzeug aktivieren" -#: ../../include/conversation.php:1330 +#: ../../include/conversation.php:1375 msgid "Disable comments" msgstr "Kommentare deaktivieren" -#: ../../include/conversation.php:1331 +#: ../../include/conversation.php:1376 msgid "Toggle comments" msgstr "Kommentare umschalten" -#: ../../include/conversation.php:1339 +#: ../../include/conversation.php:1384 msgid "Categories (optional, comma-separated list)" msgstr "Kategorien (optional, kommagetrennte Liste)" -#: ../../include/conversation.php:1362 +#: ../../include/conversation.php:1407 msgid "Other networks and post services" msgstr "Andere Netzwerke und Platformen" -#: ../../include/conversation.php:1368 +#: ../../include/conversation.php:1413 msgid "Set publish date" msgstr "Veröffentlichungsdatum festlegen" -#: ../../include/conversation.php:1631 -msgid "Discover" -msgstr "Entdecken" - -#: ../../include/conversation.php:1634 -msgid "Imported public streams" -msgstr "Importierte öffentliche Beiträge" - -#: ../../include/conversation.php:1639 +#: ../../include/conversation.php:1673 msgid "Commented Order" msgstr "Neueste Kommentare" -#: ../../include/conversation.php:1642 +#: ../../include/conversation.php:1676 msgid "Sort by Comment Date" msgstr "Nach Kommentardatum sortiert" -#: ../../include/conversation.php:1646 +#: ../../include/conversation.php:1680 msgid "Posted Order" msgstr "Neueste Beiträge" -#: ../../include/conversation.php:1649 +#: ../../include/conversation.php:1683 msgid "Sort by Post Date" msgstr "Nach Beitragsdatum sortiert" -#: ../../include/conversation.php:1657 +#: ../../include/conversation.php:1691 msgid "Posts that mention or involve you" msgstr "Beiträge mit Beteiligung Deinerseits" -#: ../../include/conversation.php:1666 +#: ../../include/conversation.php:1700 msgid "Activity Stream - by date" msgstr "Activity Stream – nach Datum sortiert" -#: ../../include/conversation.php:1672 +#: ../../include/conversation.php:1706 msgid "Starred" msgstr "Markiert" -#: ../../include/conversation.php:1675 +#: ../../include/conversation.php:1709 msgid "Favourite Posts" msgstr "Markierte Beiträge" -#: ../../include/conversation.php:1682 +#: ../../include/conversation.php:1716 msgid "Spam" msgstr "Spam" -#: ../../include/conversation.php:1685 +#: ../../include/conversation.php:1719 msgid "Posts flagged as SPAM" msgstr "Nachrichten, die als SPAM markiert wurden" -#: ../../include/conversation.php:1760 ../../include/nav.php:358 +#: ../../include/conversation.php:1794 ../../include/nav.php:402 msgid "Status Messages and Posts" msgstr "Statusnachrichten und Beiträge" -#: ../../include/conversation.php:1773 ../../include/nav.php:371 +#: ../../include/conversation.php:1807 ../../include/nav.php:415 msgid "Profile Details" msgstr "Profil-Details" -#: ../../include/conversation.php:1783 ../../include/nav.php:381 -#: ../../include/photos.php:525 +#: ../../include/conversation.php:1817 ../../include/nav.php:425 +#: ../../include/photos.php:600 msgid "Photo Albums" msgstr "Fotoalben" -#: ../../include/conversation.php:1791 ../../include/nav.php:389 +#: ../../include/conversation.php:1825 ../../include/nav.php:433 msgid "Files and Storage" msgstr "Dateien und Speicher" -#: ../../include/conversation.php:1827 ../../include/nav.php:424 +#: ../../include/conversation.php:1862 ../../include/nav.php:468 msgid "Bookmarks" msgstr "Lesezeichen" -#: ../../include/conversation.php:1830 ../../include/nav.php:427 +#: ../../include/conversation.php:1865 ../../include/nav.php:471 msgid "Saved Bookmarks" msgstr "Gespeicherte Lesezeichen" -#: ../../include/conversation.php:1841 ../../include/nav.php:438 +#: ../../include/conversation.php:1876 ../../include/nav.php:482 +msgid "View Cards" +msgstr "" + +#: ../../include/conversation.php:1887 ../../include/nav.php:494 msgid "View Webpages" msgstr "Webseiten anzeigen" -#: ../../include/conversation.php:1910 +#: ../../include/conversation.php:1956 msgctxt "noun" msgid "Attending" msgid_plural "Attending" msgstr[0] "Zusage" msgstr[1] "Zusagen" -#: ../../include/conversation.php:1913 +#: ../../include/conversation.php:1959 msgctxt "noun" msgid "Not Attending" msgid_plural "Not Attending" msgstr[0] "Absage" msgstr[1] "Absagen" -#: ../../include/conversation.php:1916 +#: ../../include/conversation.php:1962 msgctxt "noun" msgid "Undecided" msgid_plural "Undecided" msgstr[0] " Unentschlossen" msgstr[1] "Unentschlossene" -#: ../../include/conversation.php:1919 +#: ../../include/conversation.php:1965 msgctxt "noun" msgid "Agree" msgid_plural "Agrees" msgstr[0] "Zustimmung" msgstr[1] "Zustimmungen" -#: ../../include/conversation.php:1922 +#: ../../include/conversation.php:1968 msgctxt "noun" msgid "Disagree" msgid_plural "Disagrees" msgstr[0] "Ablehnung" msgstr[1] "Ablehnungen" -#: ../../include/conversation.php:1925 +#: ../../include/conversation.php:1971 msgctxt "noun" msgid "Abstain" msgid_plural "Abstains" @@ -11429,328 +11788,340 @@ msgstr "älter" msgid "newer" msgstr "neuer" -#: ../../include/text.php:939 +#: ../../include/text.php:947 msgid "No connections" msgstr "Keine Verbindungen" -#: ../../include/text.php:964 +#: ../../include/text.php:972 #, php-format msgid "View all %s connections" msgstr "Alle Verbindungen von %s anzeigen" -#: ../../include/text.php:1096 ../../include/text.php:1101 +#: ../../include/text.php:1104 ../../include/text.php:1109 msgid "poke" msgstr "anstupsen" -#: ../../include/text.php:1102 +#: ../../include/text.php:1110 msgid "ping" msgstr "anpingen" -#: ../../include/text.php:1102 +#: ../../include/text.php:1110 msgid "pinged" msgstr "pingte" -#: ../../include/text.php:1103 +#: ../../include/text.php:1111 msgid "prod" msgstr "knuffen" -#: ../../include/text.php:1103 +#: ../../include/text.php:1111 msgid "prodded" msgstr "knuffte" -#: ../../include/text.php:1104 +#: ../../include/text.php:1112 msgid "slap" msgstr "ohrfeigen" -#: ../../include/text.php:1104 +#: ../../include/text.php:1112 msgid "slapped" msgstr "ohrfeigte" -#: ../../include/text.php:1105 +#: ../../include/text.php:1113 msgid "finger" msgstr "befummeln" -#: ../../include/text.php:1105 +#: ../../include/text.php:1113 msgid "fingered" msgstr "befummelte" -#: ../../include/text.php:1106 +#: ../../include/text.php:1114 msgid "rebuff" msgstr "eine Abfuhr erteilen" -#: ../../include/text.php:1106 +#: ../../include/text.php:1114 msgid "rebuffed" msgstr "zurückgewiesen" -#: ../../include/text.php:1118 +#: ../../include/text.php:1126 msgid "happy" msgstr "glücklich" -#: ../../include/text.php:1119 +#: ../../include/text.php:1127 msgid "sad" msgstr "traurig" -#: ../../include/text.php:1120 +#: ../../include/text.php:1128 msgid "mellow" msgstr "sanft" -#: ../../include/text.php:1121 +#: ../../include/text.php:1129 msgid "tired" msgstr "müde" -#: ../../include/text.php:1122 +#: ../../include/text.php:1130 msgid "perky" msgstr "frech" -#: ../../include/text.php:1123 +#: ../../include/text.php:1131 msgid "angry" msgstr "sauer" -#: ../../include/text.php:1124 +#: ../../include/text.php:1132 msgid "stupefied" msgstr "verblüfft" -#: ../../include/text.php:1125 +#: ../../include/text.php:1133 msgid "puzzled" msgstr "verwirrt" -#: ../../include/text.php:1126 +#: ../../include/text.php:1134 msgid "interested" msgstr "interessiert" -#: ../../include/text.php:1127 +#: ../../include/text.php:1135 msgid "bitter" msgstr "verbittert" -#: ../../include/text.php:1128 +#: ../../include/text.php:1136 msgid "cheerful" msgstr "fröhlich" -#: ../../include/text.php:1129 +#: ../../include/text.php:1137 msgid "alive" msgstr "lebendig" -#: ../../include/text.php:1130 +#: ../../include/text.php:1138 msgid "annoyed" msgstr "verärgert" -#: ../../include/text.php:1131 +#: ../../include/text.php:1139 msgid "anxious" msgstr "unruhig" -#: ../../include/text.php:1132 +#: ../../include/text.php:1140 msgid "cranky" msgstr "schrullig" -#: ../../include/text.php:1133 +#: ../../include/text.php:1141 msgid "disturbed" msgstr "verstört" -#: ../../include/text.php:1134 +#: ../../include/text.php:1142 msgid "frustrated" msgstr "frustriert" -#: ../../include/text.php:1135 +#: ../../include/text.php:1143 msgid "depressed" msgstr "deprimiert" -#: ../../include/text.php:1136 +#: ../../include/text.php:1144 msgid "motivated" msgstr "motiviert" -#: ../../include/text.php:1137 +#: ../../include/text.php:1145 msgid "relaxed" msgstr "entspannt" -#: ../../include/text.php:1138 +#: ../../include/text.php:1146 msgid "surprised" msgstr "überrascht" -#: ../../include/text.php:1312 ../../include/js_strings.php:70 +#: ../../include/text.php:1320 ../../include/js_strings.php:70 msgid "Monday" msgstr "Montag" -#: ../../include/text.php:1312 ../../include/js_strings.php:71 +#: ../../include/text.php:1320 ../../include/js_strings.php:71 msgid "Tuesday" msgstr "Dienstag" -#: ../../include/text.php:1312 ../../include/js_strings.php:72 +#: ../../include/text.php:1320 ../../include/js_strings.php:72 msgid "Wednesday" msgstr "Mittwoch" -#: ../../include/text.php:1312 ../../include/js_strings.php:73 +#: ../../include/text.php:1320 ../../include/js_strings.php:73 msgid "Thursday" msgstr "Donnerstag" -#: ../../include/text.php:1312 ../../include/js_strings.php:74 +#: ../../include/text.php:1320 ../../include/js_strings.php:74 msgid "Friday" msgstr "Freitag" -#: ../../include/text.php:1312 ../../include/js_strings.php:75 +#: ../../include/text.php:1320 ../../include/js_strings.php:75 msgid "Saturday" msgstr "Samstag" -#: ../../include/text.php:1312 ../../include/js_strings.php:69 +#: ../../include/text.php:1320 ../../include/js_strings.php:69 msgid "Sunday" msgstr "Sonntag" -#: ../../include/text.php:1316 ../../include/js_strings.php:45 +#: ../../include/text.php:1324 ../../include/js_strings.php:45 msgid "January" msgstr "Januar" -#: ../../include/text.php:1316 ../../include/js_strings.php:46 +#: ../../include/text.php:1324 ../../include/js_strings.php:46 msgid "February" msgstr "Februar" -#: ../../include/text.php:1316 ../../include/js_strings.php:47 +#: ../../include/text.php:1324 ../../include/js_strings.php:47 msgid "March" msgstr "März" -#: ../../include/text.php:1316 ../../include/js_strings.php:48 +#: ../../include/text.php:1324 ../../include/js_strings.php:48 msgid "April" msgstr "April" -#: ../../include/text.php:1316 +#: ../../include/text.php:1324 msgid "May" msgstr "Mai" -#: ../../include/text.php:1316 ../../include/js_strings.php:50 +#: ../../include/text.php:1324 ../../include/js_strings.php:50 msgid "June" msgstr "Juni" -#: ../../include/text.php:1316 ../../include/js_strings.php:51 +#: ../../include/text.php:1324 ../../include/js_strings.php:51 msgid "July" msgstr "Juli" -#: ../../include/text.php:1316 ../../include/js_strings.php:52 +#: ../../include/text.php:1324 ../../include/js_strings.php:52 msgid "August" msgstr "August" -#: ../../include/text.php:1316 ../../include/js_strings.php:53 +#: ../../include/text.php:1324 ../../include/js_strings.php:53 msgid "September" msgstr "September" -#: ../../include/text.php:1316 ../../include/js_strings.php:54 +#: ../../include/text.php:1324 ../../include/js_strings.php:54 msgid "October" msgstr "Oktober" -#: ../../include/text.php:1316 ../../include/js_strings.php:55 +#: ../../include/text.php:1324 ../../include/js_strings.php:55 msgid "November" msgstr "November" -#: ../../include/text.php:1316 ../../include/js_strings.php:56 +#: ../../include/text.php:1324 ../../include/js_strings.php:56 msgid "December" msgstr "Dezember" -#: ../../include/text.php:1380 ../../include/text.php:1384 +#: ../../include/text.php:1388 ../../include/text.php:1392 msgid "Unknown Attachment" msgstr "Unbekannter Anhang" -#: ../../include/text.php:1386 ../../include/feedutils.php:780 +#: ../../include/text.php:1394 ../../include/feedutils.php:780 msgid "unknown" msgstr "unbekannt" -#: ../../include/text.php:1422 +#: ../../include/text.php:1430 msgid "remove category" msgstr "Kategorie entfernen" -#: ../../include/text.php:1496 +#: ../../include/text.php:1504 msgid "remove from file" msgstr "aus der Datei entfernen" -#: ../../include/text.php:1615 ../../include/message.php:12 +#: ../../include/text.php:1623 ../../include/message.php:12 msgid "Download binary/encrypted content" msgstr "Binären/verschlüsselten Inhalt herunterladen" -#: ../../include/text.php:1774 ../../include/language.php:367 +#: ../../include/text.php:1782 ../../include/language.php:367 msgid "default" msgstr "Standard" -#: ../../include/text.php:1782 +#: ../../include/text.php:1790 msgid "Page layout" msgstr "Seiten-Layout" -#: ../../include/text.php:1782 +#: ../../include/text.php:1790 msgid "You can create your own with the layouts tool" msgstr "Mit dem Gestaltungswerkzeug kannst Du Deine eigenen Layouts erstellen" -#: ../../include/text.php:1810 +#: ../../include/text.php:1801 +msgid "HTML" +msgstr "" + +#: ../../include/text.php:1804 +msgid "Comanche Layout" +msgstr "" + +#: ../../include/text.php:1809 +msgid "PHP" +msgstr "" + +#: ../../include/text.php:1818 msgid "Page content type" msgstr "Art des Seiteninhalts" -#: ../../include/text.php:1943 +#: ../../include/text.php:1951 msgid "activity" msgstr "Aktivität" -#: ../../include/text.php:2006 -msgid "a-z, 0-9, -, _, and . only" -msgstr "nur a-z, 0-9, -, _, und ." +#: ../../include/text.php:2014 +msgid "a-z, 0-9, -, and _ only" +msgstr "" -#: ../../include/text.php:2277 +#: ../../include/text.php:2285 msgid "Design Tools" msgstr "Gestaltungswerkzeuge" -#: ../../include/text.php:2283 +#: ../../include/text.php:2291 msgid "Pages" msgstr "Seiten" -#: ../../include/text.php:2305 +#: ../../include/text.php:2313 msgid "Import website..." msgstr "Webseite importieren..." -#: ../../include/text.php:2306 +#: ../../include/text.php:2314 msgid "Select folder to import" msgstr "Ordner zum Importieren auswählen" -#: ../../include/text.php:2307 +#: ../../include/text.php:2315 msgid "Import from a zipped folder:" msgstr "Aus einem gezippten Ordner importieren:" -#: ../../include/text.php:2308 +#: ../../include/text.php:2316 msgid "Import from cloud files:" msgstr "Aus Cloud-Dateien importieren:" -#: ../../include/text.php:2309 +#: ../../include/text.php:2317 msgid "/cloud/channel/path/to/folder" msgstr "/Cloud/Kanal/Pfad/zum/Ordner" -#: ../../include/text.php:2310 +#: ../../include/text.php:2318 msgid "Enter path to website files" msgstr "Pfad zu Webseitendateien eingeben" -#: ../../include/text.php:2311 +#: ../../include/text.php:2319 msgid "Select folder" msgstr "Ordner auswählen" -#: ../../include/text.php:2312 +#: ../../include/text.php:2320 msgid "Export website..." msgstr "Webseite exportieren..." -#: ../../include/text.php:2313 +#: ../../include/text.php:2321 msgid "Export to a zip file" msgstr "In eine ZIP-Datei exportieren" -#: ../../include/text.php:2314 +#: ../../include/text.php:2322 msgid "website.zip" msgstr "website.zip" -#: ../../include/text.php:2315 +#: ../../include/text.php:2323 msgid "Enter a name for the zip file." msgstr "Geben Sie einen für die ZIP-Datei ein." -#: ../../include/text.php:2316 +#: ../../include/text.php:2324 msgid "Export to cloud files" msgstr "In Cloud-Dateien exportieren" -#: ../../include/text.php:2317 +#: ../../include/text.php:2325 msgid "/path/to/export/folder" msgstr "/Pfad/zum/exportierenden/Ordner" -#: ../../include/text.php:2318 +#: ../../include/text.php:2326 msgid "Enter a path to a cloud files destination." msgstr "Gib den Pfad zu einem Datei-Speicherort in der Cloud ein." -#: ../../include/text.php:2319 +#: ../../include/text.php:2327 msgid "Specify folder" msgstr "Ordner angeben" @@ -11789,47 +12160,49 @@ msgstr "Lade Freunde ein" msgid "Advanced example: name=fred and country=iceland" msgstr "Fortgeschrittenes Beispiel: name=fred and country=iceland" -#: ../../include/contact_widgets.php:122 -#, php-format -msgid "%d connection in common" -msgid_plural "%d connections in common" -msgstr[0] "%d gemeinsame Verbindung" -msgstr[1] "%d gemeinsame Verbindungen" +#: ../../include/contact_widgets.php:166 +msgid "Common Connections" +msgstr "" -#: ../../include/contact_widgets.php:127 -msgid "show more" -msgstr "mehr zeigen" +#: ../../include/contact_widgets.php:171 +#, php-format +msgid "View all %d common connections" +msgstr "" -#: ../../include/markdown.php:139 ../../include/bbcode.php:332 +#: ../../include/markdown.php:139 ../../include/bbcode.php:337 #, php-format msgid "%1$s wrote the following %2$s %3$s" msgstr "%1$s schrieb den folgenden %2$s %3$s" -#: ../../include/follow.php:26 +#: ../../include/follow.php:37 msgid "Channel is blocked on this site." msgstr "Der Kanal ist auf dieser Seite blockiert " -#: ../../include/follow.php:31 +#: ../../include/follow.php:42 msgid "Channel location missing." msgstr "Adresse des Kanals fehlt." -#: ../../include/follow.php:73 +#: ../../include/follow.php:84 msgid "Response from remote channel was incomplete." msgstr "Antwort des entfernten Kanals war unvollständig." -#: ../../include/follow.php:90 +#: ../../include/follow.php:101 msgid "Channel was deleted and no longer exists." msgstr "Kanal wurde gelöscht und existiert nicht mehr." -#: ../../include/follow.php:140 ../../include/follow.php:175 -msgid "Protocol disabled." -msgstr "Protokoll deaktiviert." +#: ../../include/follow.php:156 +msgid "Remote channel or protocol unavailable." +msgstr "" -#: ../../include/follow.php:163 +#: ../../include/follow.php:179 msgid "Channel discovery failed." msgstr "Kanalsuche fehlgeschlagen" -#: ../../include/follow.php:186 +#: ../../include/follow.php:191 +msgid "Protocol disabled." +msgstr "Protokoll deaktiviert." + +#: ../../include/follow.php:202 msgid "Cannot connect to yourself." msgstr "Du kannst Dich nicht mit Dir selbst verbinden." @@ -12123,302 +12496,284 @@ msgstr "%1$s hat ein aktualisiertes %2$s, %3$s wurde verändert." msgid "Item was not found." msgstr "Beitrag wurde nicht gefunden." -#: ../../include/attach.php:501 +#: ../../include/attach.php:505 msgid "No source file." msgstr "Keine Quelldatei." -#: ../../include/attach.php:523 +#: ../../include/attach.php:527 msgid "Cannot locate file to replace" msgstr "Kann Datei zum Ersetzen nicht finden" -#: ../../include/attach.php:541 +#: ../../include/attach.php:545 msgid "Cannot locate file to revise/update" msgstr "Kann Datei zum Prüfen/Aktualisieren nicht finden" -#: ../../include/attach.php:674 +#: ../../include/attach.php:680 #, php-format msgid "File exceeds size limit of %d" msgstr "Datei überschreitet das Größen-Limit von %d" -#: ../../include/attach.php:688 +#: ../../include/attach.php:694 #, php-format msgid "You have reached your limit of %1$.0f Mbytes attachment storage." msgstr "Die Größe Deiner Datei-Anhänge hat das Maximum von %1$.0f MByte erreicht." -#: ../../include/attach.php:858 +#: ../../include/attach.php:864 msgid "File upload failed. Possible system limit or action terminated." msgstr "Datei-Upload fehlgeschlagen. Mögliche Systembegrenzung oder abgebrochener Prozess." -#: ../../include/attach.php:871 +#: ../../include/attach.php:877 msgid "Stored file could not be verified. Upload failed." msgstr "Gespeichert Datei konnte nicht verifiziert werden. Upload abgebrochen." -#: ../../include/attach.php:932 ../../include/attach.php:948 +#: ../../include/attach.php:938 ../../include/attach.php:954 msgid "Path not available." msgstr "Pfad nicht verfügbar." -#: ../../include/attach.php:997 ../../include/attach.php:1162 +#: ../../include/attach.php:1003 ../../include/attach.php:1168 msgid "Empty pathname" msgstr "Leere Pfadangabe" -#: ../../include/attach.php:1023 +#: ../../include/attach.php:1029 msgid "duplicate filename or path" msgstr "doppelter Dateiname oder Pfad" -#: ../../include/attach.php:1048 +#: ../../include/attach.php:1054 msgid "Path not found." msgstr "Pfad nicht gefunden." -#: ../../include/attach.php:1116 +#: ../../include/attach.php:1122 msgid "mkdir failed." msgstr "mkdir fehlgeschlagen." -#: ../../include/attach.php:1120 +#: ../../include/attach.php:1126 msgid "database storage failed." msgstr "Speichern in der Datenbank fehlgeschlagen." -#: ../../include/attach.php:1168 +#: ../../include/attach.php:1174 msgid "Empty path" msgstr "Leere Pfadangabe" -#: ../../include/security.php:117 -msgid "guest:" -msgstr "Gast:" - #: ../../include/security.php:531 msgid "" "The form security token was not correct. This probably happened because the " "form has been opened for too long (>3 hours) before submitting it." msgstr "Das Security-Token des Formulars war nicht korrekt. Das ist wahrscheinlich passiert, weil das Formular zu lange (>3 Stunden) offen war, bevor es abgeschickt wurde." -#: ../../include/items.php:851 ../../include/items.php:903 +#: ../../include/items.php:857 ../../include/items.php:909 msgid "(Unknown)" msgstr "(Unbekannt)" -#: ../../include/items.php:1087 +#: ../../include/items.php:1093 msgid "Visible to anybody on the internet." msgstr "Für jeden im Internet sichtbar." -#: ../../include/items.php:1089 +#: ../../include/items.php:1095 msgid "Visible to you only." msgstr "Nur für Dich sichtbar." -#: ../../include/items.php:1091 +#: ../../include/items.php:1097 msgid "Visible to anybody in this network." msgstr "Für jedes $Projectname-Mitglied sichtbar." -#: ../../include/items.php:1093 +#: ../../include/items.php:1099 msgid "Visible to anybody authenticated." msgstr "Für jeden sichtbar, der angemeldet ist." -#: ../../include/items.php:1095 +#: ../../include/items.php:1101 #, php-format msgid "Visible to anybody on %s." msgstr "Für jeden auf %s sichtbar." -#: ../../include/items.php:1097 +#: ../../include/items.php:1103 msgid "Visible to all connections." msgstr "Für alle Verbindungen sichtbar." -#: ../../include/items.php:1099 +#: ../../include/items.php:1105 msgid "Visible to approved connections." msgstr "Nur für akzeptierte Verbindungen sichtbar." -#: ../../include/items.php:1101 +#: ../../include/items.php:1107 msgid "Visible to specific connections." msgstr "Sichtbar für bestimmte Verbindungen." -#: ../../include/items.php:3908 +#: ../../include/items.php:3957 msgid "Privacy group is empty." msgstr "Gruppe ist leer." -#: ../../include/items.php:3915 +#: ../../include/items.php:3964 #, php-format msgid "Privacy group: %s" msgstr "Gruppe: %s" -#: ../../include/items.php:3927 +#: ../../include/items.php:3976 msgid "Connection not found." msgstr "Die Verbindung wurde nicht gefunden." -#: ../../include/items.php:4280 +#: ../../include/items.php:4327 msgid "profile photo" msgstr "Profilfoto" -#: ../../include/items.php:4473 +#: ../../include/items.php:4520 #, php-format msgid "[Edited %s]" msgstr "[%s wurde bearbeitet]" -#: ../../include/items.php:4473 +#: ../../include/items.php:4520 msgctxt "edit_activity" msgid "Post" msgstr "Beitrag" -#: ../../include/items.php:4473 +#: ../../include/items.php:4520 msgctxt "edit_activity" msgid "Comment" msgstr "Kommentar" -#: ../../include/channel.php:33 +#: ../../include/channel.php:34 msgid "Unable to obtain identity information from database" msgstr "Kann keine Identitäts-Informationen aus Datenbank beziehen" -#: ../../include/channel.php:68 +#: ../../include/channel.php:69 msgid "Empty name" msgstr "Namensfeld leer" -#: ../../include/channel.php:71 +#: ../../include/channel.php:72 msgid "Name too long" msgstr "Name ist zu lang" -#: ../../include/channel.php:182 +#: ../../include/channel.php:183 msgid "No account identifier" msgstr "Keine Account-Kennung" -#: ../../include/channel.php:194 +#: ../../include/channel.php:195 msgid "Nickname is required." msgstr "Spitzname ist erforderlich." -#: ../../include/channel.php:208 -msgid "Reserved nickname. Please choose another." -msgstr "Reservierter Kurzname. Bitte wähle einen anderen." - -#: ../../include/channel.php:213 -msgid "" -"Nickname has unsupported characters or is already being used on this site." -msgstr "Der Spitzname enthält nicht-unterstütze Zeichen oder wird bereits auf dieser Seite genutzt." - -#: ../../include/channel.php:272 +#: ../../include/channel.php:273 msgid "Unable to retrieve created identity" msgstr "Kann die erstellte Identität nicht empfangen" -#: ../../include/channel.php:344 +#: ../../include/channel.php:359 msgid "Default Profile" msgstr "Standard-Profil" -#: ../../include/channel.php:497 +#: ../../include/channel.php:512 ../../include/channel.php:601 msgid "Unable to retrieve modified identity" msgstr "Geänderte Identität kann nicht empfangen werden" -#: ../../include/channel.php:1162 +#: ../../include/channel.php:1263 msgid "Create New Profile" msgstr "Neues Profil erstellen" -#: ../../include/channel.php:1182 +#: ../../include/channel.php:1283 msgid "Visible to everybody" msgstr "Für jeden sichtbar" -#: ../../include/channel.php:1255 ../../include/channel.php:1375 +#: ../../include/channel.php:1356 ../../include/channel.php:1475 msgid "Gender:" msgstr "Geschlecht:" -#: ../../include/channel.php:1257 ../../include/channel.php:1430 +#: ../../include/channel.php:1358 ../../include/channel.php:1530 msgid "Homepage:" msgstr "Homepage:" -#: ../../include/channel.php:1258 +#: ../../include/channel.php:1359 msgid "Online Now" msgstr "gerade online" -#: ../../include/channel.php:1334 +#: ../../include/channel.php:1434 msgid "Trans" msgstr "" -#: ../../include/channel.php:1380 +#: ../../include/channel.php:1480 msgid "Like this channel" msgstr "Dieser Kanal gefällt mir" -#: ../../include/channel.php:1404 +#: ../../include/channel.php:1504 msgid "j F, Y" msgstr "j. F Y" -#: ../../include/channel.php:1405 +#: ../../include/channel.php:1505 msgid "j F" msgstr "j. F" -#: ../../include/channel.php:1412 +#: ../../include/channel.php:1512 msgid "Birthday:" msgstr "Geburtstag:" -#: ../../include/channel.php:1425 +#: ../../include/channel.php:1525 #, php-format msgid "for %1$d %2$s" msgstr "seit %1$d %2$s" -#: ../../include/channel.php:1428 +#: ../../include/channel.php:1528 msgid "Sexual Preference:" msgstr "Sexuelle Orientierung:" -#: ../../include/channel.php:1434 +#: ../../include/channel.php:1534 msgid "Tags:" msgstr "Schlagworte:" -#: ../../include/channel.php:1436 +#: ../../include/channel.php:1536 msgid "Political Views:" msgstr "Politische Ansichten:" -#: ../../include/channel.php:1438 +#: ../../include/channel.php:1538 msgid "Religion:" msgstr "Religion:" -#: ../../include/channel.php:1442 +#: ../../include/channel.php:1542 msgid "Hobbies/Interests:" msgstr "Hobbys/Interessen:" -#: ../../include/channel.php:1444 +#: ../../include/channel.php:1544 msgid "Likes:" msgstr "Gefällt:" -#: ../../include/channel.php:1446 +#: ../../include/channel.php:1546 msgid "Dislikes:" msgstr "Gefällt nicht:" -#: ../../include/channel.php:1448 +#: ../../include/channel.php:1548 msgid "Contact information and Social Networks:" msgstr "Kontaktinformation und soziale Netzwerke:" -#: ../../include/channel.php:1450 +#: ../../include/channel.php:1550 msgid "My other channels:" msgstr "Meine anderen Kanäle:" -#: ../../include/channel.php:1452 +#: ../../include/channel.php:1552 msgid "Musical interests:" msgstr "Musikalische Interessen:" -#: ../../include/channel.php:1454 +#: ../../include/channel.php:1554 msgid "Books, literature:" msgstr "Bücher, Literatur:" -#: ../../include/channel.php:1456 +#: ../../include/channel.php:1556 msgid "Television:" msgstr "Fernsehen:" -#: ../../include/channel.php:1458 +#: ../../include/channel.php:1558 msgid "Film/dance/culture/entertainment:" msgstr "Film/Tanz/Kultur/Unterhaltung:" -#: ../../include/channel.php:1460 +#: ../../include/channel.php:1560 msgid "Love/Romance:" msgstr "Liebe/Romantik:" -#: ../../include/channel.php:1462 +#: ../../include/channel.php:1562 msgid "Work/employment:" msgstr "Arbeit/Anstellung:" -#: ../../include/channel.php:1464 +#: ../../include/channel.php:1564 msgid "School/education:" msgstr "Schule/Ausbildung:" -#: ../../include/channel.php:1487 +#: ../../include/channel.php:1587 msgid "Like this thing" msgstr "Gefällt mir" -#: ../../include/channel.php:2256 -#, php-format -msgid "User '%s' deleted" -msgstr "Benutzer '%s' gelöscht" - #: ../../include/event.php:22 ../../include/event.php:69 msgid "l F d, Y \\@ g:i A" msgstr "l, d. F Y, H:i" @@ -12455,67 +12810,63 @@ msgstr "In Bearbeitung" msgid "Cancelled" msgstr "gestrichen" -#: ../../include/event.php:1292 ../../include/connections.php:676 +#: ../../include/event.php:1292 ../../include/connections.php:684 msgid "Home, Voice" msgstr "Zuhause, Sprache" -#: ../../include/event.php:1293 ../../include/connections.php:677 +#: ../../include/event.php:1293 ../../include/connections.php:685 msgid "Home, Fax" msgstr "Zuhause, Fax" -#: ../../include/event.php:1295 ../../include/connections.php:679 +#: ../../include/event.php:1295 ../../include/connections.php:687 msgid "Work, Voice" msgstr "Arbeit, Sprache" -#: ../../include/event.php:1296 ../../include/connections.php:680 +#: ../../include/event.php:1296 ../../include/connections.php:688 msgid "Work, Fax" msgstr "Arbeit, Fax" -#: ../../include/network.php:751 +#: ../../include/network.php:752 msgid "view full size" msgstr "In Vollbildansicht anschauen" -#: ../../include/network.php:1691 ../../include/network.php:1692 +#: ../../include/network.php:1700 ../../include/network.php:1701 msgid "Friendica" msgstr "Friendica" -#: ../../include/network.php:1693 +#: ../../include/network.php:1702 msgid "OStatus" msgstr "OStatus" -#: ../../include/network.php:1694 +#: ../../include/network.php:1703 msgid "GNU-Social" msgstr "GNU-Social" -#: ../../include/network.php:1695 +#: ../../include/network.php:1704 msgid "RSS/Atom" msgstr "RSS/Atom" -#: ../../include/network.php:1696 -msgid "ActivityPub" -msgstr "ActivityPub" - -#: ../../include/network.php:1698 +#: ../../include/network.php:1707 msgid "Diaspora" msgstr "Diaspora" -#: ../../include/network.php:1699 +#: ../../include/network.php:1708 msgid "Facebook" msgstr "Facebook" -#: ../../include/network.php:1700 +#: ../../include/network.php:1709 msgid "Zot" msgstr "Zot!" -#: ../../include/network.php:1701 +#: ../../include/network.php:1710 msgid "LinkedIn" msgstr "LinkedIn" -#: ../../include/network.php:1702 +#: ../../include/network.php:1711 msgid "XMPP/IM" msgstr "XMPP/IM" -#: ../../include/network.php:1703 +#: ../../include/network.php:1712 msgid "MySpace" msgstr "MySpace" @@ -12557,17 +12908,17 @@ msgstr "Beitragsberechtigungen %s können nicht geändert werden %s, nachdem der msgid "Cannot locate DNS info for database server '%s'" msgstr "Kann die DNS-Informationen für den Datenbank-Server '%s' nicht finden" -#: ../../include/bbcode.php:194 ../../include/bbcode.php:1097 -#: ../../include/bbcode.php:1100 ../../include/bbcode.php:1105 -#: ../../include/bbcode.php:1108 ../../include/bbcode.php:1111 -#: ../../include/bbcode.php:1114 ../../include/bbcode.php:1119 -#: ../../include/bbcode.php:1122 ../../include/bbcode.php:1127 -#: ../../include/bbcode.php:1130 ../../include/bbcode.php:1133 -#: ../../include/bbcode.php:1136 +#: ../../include/bbcode.php:194 ../../include/bbcode.php:1102 +#: ../../include/bbcode.php:1105 ../../include/bbcode.php:1110 +#: ../../include/bbcode.php:1113 ../../include/bbcode.php:1116 +#: ../../include/bbcode.php:1119 ../../include/bbcode.php:1124 +#: ../../include/bbcode.php:1127 ../../include/bbcode.php:1132 +#: ../../include/bbcode.php:1135 ../../include/bbcode.php:1138 +#: ../../include/bbcode.php:1141 msgid "Image/photo" msgstr "Bild/Foto" -#: ../../include/bbcode.php:233 ../../include/bbcode.php:1147 +#: ../../include/bbcode.php:233 ../../include/bbcode.php:1152 msgid "Encrypted content" msgstr "Verschlüsselter Inhalt" @@ -12583,34 +12934,43 @@ msgid "" "to install it on this site." msgstr "Dieser Beitrag beinhaltet ein installierbares %s Element, aber Du hast nicht die nötigen Rechte, um es auf diesem Hub zu installieren." -#: ../../include/bbcode.php:409 ../../include/bbcode.php:417 +#: ../../include/bbcode.php:331 +msgid "card" +msgstr "Karte" + +#: ../../include/bbcode.php:414 ../../include/bbcode.php:422 msgid "Click to open/close" msgstr "Klicke zum Öffnen/Schließen" -#: ../../include/bbcode.php:417 +#: ../../include/bbcode.php:422 msgid "spoiler" msgstr "Spoiler" -#: ../../include/bbcode.php:1085 +#: ../../include/bbcode.php:1090 msgid "$1 wrote:" msgstr "$1 schrieb:" -#: ../../include/oembed.php:317 +#: ../../include/oembed.php:328 msgid " by " msgstr "von" -#: ../../include/oembed.php:318 +#: ../../include/oembed.php:329 msgid " on " msgstr "am" -#: ../../include/oembed.php:347 +#: ../../include/oembed.php:358 msgid "Embedded content" msgstr "Eingebetteter Inhalt" -#: ../../include/oembed.php:356 +#: ../../include/oembed.php:367 msgid "Embedding disabled" msgstr "Einbetten deaktiviert" +#: ../../include/zid.php:305 +#, php-format +msgid "OpenWebAuth: %1$s welcomes %2$s" +msgstr "" + #: ../../include/features.php:54 msgid "General Features" msgstr "Allgemeine Funktionen" @@ -12659,292 +13019,296 @@ msgstr "Private Notizen" msgid "Enables a tool to store notes and reminders (note: not encrypted)" msgstr "Aktiviert ein Werkzeug mit dem Notizen und Erinnerungen gespeichert werden können (Hinweis: nicht verschlüsselt)" -#: ../../include/features.php:122 +#: ../../include/features.php:123 +msgid "Create personal planning cards" +msgstr "Erstelle persönliche (Notiz-)Karten zur Planung/Koordination oder ähnlichen Zwecken" + +#: ../../include/features.php:131 msgid "Navigation Channel Select" msgstr "Kanal-Auswahl in der Navigationsleiste" -#: ../../include/features.php:123 +#: ../../include/features.php:132 msgid "Change channels directly from within the navigation dropdown menu" msgstr "Ermöglicht den direkten Wechsel zu anderen Kanälen über das Navigationsmenü" -#: ../../include/features.php:131 +#: ../../include/features.php:140 msgid "Photo Location" msgstr "Aufnahmeort" -#: ../../include/features.php:132 +#: ../../include/features.php:141 msgid "If location data is available on uploaded photos, link this to a map." msgstr "Verlinkt den Aufnahmeort von Fotos (falls verfügbar) auf einer Karte" -#: ../../include/features.php:140 +#: ../../include/features.php:149 msgid "Access Controlled Chatrooms" msgstr "Zugriffskontrollierte Chaträume" -#: ../../include/features.php:141 +#: ../../include/features.php:150 msgid "Provide chatrooms and chat services with access control." msgstr "Bieten Sie Chaträume und Chatdienste mit Zugriffskontrolle an." -#: ../../include/features.php:150 +#: ../../include/features.php:159 msgid "Provide alternate connection permission roles." msgstr "Stelle benutzerdefinierte Berechtigungsrollen für Verbindungen zur Verfügung." -#: ../../include/features.php:158 +#: ../../include/features.php:167 msgid "Smart Birthdays" msgstr "Smarte Geburtstage" -#: ../../include/features.php:159 +#: ../../include/features.php:168 msgid "" "Make birthday events timezone aware in case your friends are scattered " "across the planet." msgstr "Stellt für Geburtstage einen Zeitzonenbezug her, falls deine Freunde über den ganzen Planeten verstreut sind." -#: ../../include/features.php:167 +#: ../../include/features.php:176 msgid "Event Timezone Selection" msgstr "Termin-Zeitzonenauswahl" -#: ../../include/features.php:168 +#: ../../include/features.php:177 msgid "Allow event creation in timezones other than your own." msgstr "Ermögliche das Erstellen von Terminen in anderen Zeitzonen als Deiner eigenen." -#: ../../include/features.php:176 +#: ../../include/features.php:185 msgid "Advanced Directory Search" msgstr "Erweiterte Verzeichnissuche" -#: ../../include/features.php:177 +#: ../../include/features.php:186 msgid "Allows creation of complex directory search queries" msgstr "Ermöglicht die Erstellung komplexer Verzeichnis-Suchabfragen" -#: ../../include/features.php:185 +#: ../../include/features.php:194 msgid "Advanced Theme and Layout Settings" msgstr "Erweiterte Design- und Layout-Einstellungen" -#: ../../include/features.php:186 +#: ../../include/features.php:195 msgid "Allows fine tuning of themes and page layouts" msgstr "Erlaubt die Feineinstellung von Designs und Seitenlayouts" -#: ../../include/features.php:196 +#: ../../include/features.php:205 msgid "Post Composition Features" msgstr "Nachbearbeitungsfunktionen" -#: ../../include/features.php:200 +#: ../../include/features.php:209 msgid "Large Photos" msgstr "Große Fotos" -#: ../../include/features.php:201 +#: ../../include/features.php:210 msgid "" "Include large (1024px) photo thumbnails in posts. If not enabled, use small " "(640px) photo thumbnails" msgstr "Große Vorschaubilder (1024px) in Beiträgen anzeigen. Falls nicht aktiviert, werden kleine Vorschaubilder (640px) verwendet." -#: ../../include/features.php:210 +#: ../../include/features.php:219 msgid "Automatically import channel content from other channels or feeds" msgstr "Ermöglicht den automatischen Import von Inhalten für diesen Kanal von anderen Kanälen oder Feeds" -#: ../../include/features.php:218 +#: ../../include/features.php:227 msgid "Even More Encryption" msgstr "Noch mehr Verschlüsselung" -#: ../../include/features.php:219 +#: ../../include/features.php:228 msgid "" "Allow optional encryption of content end-to-end with a shared secret key" msgstr "Ermöglicht optional die zusätzliche Verschlüsselung von Inhalten (Ende-zu-Ende mit geteiltem Schlüssel)" -#: ../../include/features.php:227 +#: ../../include/features.php:236 msgid "Enable Voting Tools" msgstr "Umfragewerkzeuge aktivieren" -#: ../../include/features.php:228 +#: ../../include/features.php:237 msgid "Provide a class of post which others can vote on" msgstr "Aktiviert die Umfragewerkzeuge, um anderen die Möglichkeit zu geben, einem Beitrag zuzustimmen, ihn abzulehnen oder sich zu enthalten. (Muss im Beitrag selbst noch aktiviert werden.)" -#: ../../include/features.php:236 +#: ../../include/features.php:245 msgid "Disable Comments" msgstr "Kommentare deaktivieren" -#: ../../include/features.php:237 +#: ../../include/features.php:246 msgid "Provide the option to disable comments for a post" msgstr "Ermöglicht, die Kommentarfunktion für einzelne Beiträge abzuschalten" -#: ../../include/features.php:245 +#: ../../include/features.php:254 msgid "Delayed Posting" msgstr "Verzögertes Senden" -#: ../../include/features.php:246 +#: ../../include/features.php:255 msgid "Allow posts to be published at a later date" msgstr "Ermöglicht es, Beiträge zu einem späteren Zeitpunkt zu veröffentlichen" -#: ../../include/features.php:254 +#: ../../include/features.php:263 msgid "Content Expiration" msgstr "Verfall von Inhalten" -#: ../../include/features.php:255 +#: ../../include/features.php:264 msgid "Remove posts/comments and/or private messages at a future time" msgstr "Ermöglicht das automatische Löschen von Beiträgen, Kommentaren und/oder privaten Nachrichten zu einem zukünftigen Datum." -#: ../../include/features.php:263 +#: ../../include/features.php:272 msgid "Suppress Duplicate Posts/Comments" msgstr "Doppelte Beiträge unterdrücken" -#: ../../include/features.php:264 +#: ../../include/features.php:273 msgid "" "Prevent posts with identical content to be published with less than two " "minutes in between submissions." msgstr "Verhindert, dass innerhalb von zwei Minuten Beiträge mit identischem Inhalt veröffentlicht werden." -#: ../../include/features.php:275 +#: ../../include/features.php:284 msgid "Network and Stream Filtering" msgstr "Netzwerk- und Stream-Filter" -#: ../../include/features.php:279 +#: ../../include/features.php:288 msgid "Search by Date" msgstr "Suche nach Datum" -#: ../../include/features.php:280 +#: ../../include/features.php:289 msgid "Ability to select posts by date ranges" msgstr "Möglichkeit, Beiträge nach Zeiträumen auszuwählen" -#: ../../include/features.php:288 ../../include/group.php:332 +#: ../../include/features.php:297 ../../include/group.php:332 msgid "Privacy Groups" msgstr "Gruppen" -#: ../../include/features.php:289 +#: ../../include/features.php:298 msgid "Enable management and selection of privacy groups" msgstr "Auswahl und Verwaltung von Gruppen für Kanäle aktivieren" -#: ../../include/features.php:298 +#: ../../include/features.php:307 msgid "Save search terms for re-use" msgstr "Ermöglicht das Abspeichern von Suchbegriffen zur Wiederverwendung" -#: ../../include/features.php:306 +#: ../../include/features.php:315 msgid "Network Personal Tab" msgstr "Persönlicher Netzwerkreiter" -#: ../../include/features.php:307 +#: ../../include/features.php:316 msgid "Enable tab to display only Network posts that you've interacted on" msgstr "Aktiviert einen Reiter in der Grid-Ansicht, der nur Netzwerk-Beiträge anzeigt, mit denen Du interagiert hast" -#: ../../include/features.php:315 +#: ../../include/features.php:324 msgid "Network New Tab" msgstr "Netzwerkreiter Neu" -#: ../../include/features.php:316 +#: ../../include/features.php:325 msgid "Enable tab to display all new Network activity" msgstr "Aktiviert einen Reiter in der Grid-Ansicht, der alle neuen Netzwerkaktivitäten anzeigt" -#: ../../include/features.php:324 +#: ../../include/features.php:333 msgid "Affinity Tool" msgstr "Beziehungs-Tool" -#: ../../include/features.php:325 +#: ../../include/features.php:334 msgid "Filter stream activity by depth of relationships" msgstr "Aktiviert ein Werkzeug in der Grid-Ansicht, das den Stream nach Grad der Beziehung filtern kann" -#: ../../include/features.php:334 +#: ../../include/features.php:343 msgid "Show friend and connection suggestions" msgstr "Freund- und Verbindungsvorschläge anzeigen" -#: ../../include/features.php:342 +#: ../../include/features.php:351 msgid "Connection Filtering" msgstr "Filter für Verbindungen" -#: ../../include/features.php:343 +#: ../../include/features.php:352 msgid "Filter incoming posts from connections based on keywords/content" msgstr "Ermöglicht die Filterung eingehender Beiträge anhand von Schlüsselwörtern (muss an der Verbindung konfiguriert werden)" -#: ../../include/features.php:355 +#: ../../include/features.php:364 msgid "Post/Comment Tools" msgstr "Beitrag-/Kommentar-Tools" -#: ../../include/features.php:359 +#: ../../include/features.php:368 msgid "Community Tagging" msgstr "Gemeinschaftliches Verschlagworten" -#: ../../include/features.php:360 +#: ../../include/features.php:369 msgid "Ability to tag existing posts" msgstr "Ermöglicht das Verschlagworten existierender Beiträge" -#: ../../include/features.php:368 +#: ../../include/features.php:377 msgid "Post Categories" msgstr "Beitrags-Kategorien" -#: ../../include/features.php:369 +#: ../../include/features.php:378 msgid "Add categories to your posts" msgstr "Aktiviert Kategorien für Beiträge" -#: ../../include/features.php:377 +#: ../../include/features.php:386 msgid "Emoji Reactions" msgstr "Emoji Reaktionen" -#: ../../include/features.php:378 +#: ../../include/features.php:387 msgid "Add emoji reaction ability to posts" msgstr "Aktiviert Emoji-Reaktionen für Beiträge" -#: ../../include/features.php:387 +#: ../../include/features.php:396 msgid "Ability to file posts under folders" msgstr "Möglichkeit, Beiträge in Verzeichnissen zu sammeln" -#: ../../include/features.php:395 +#: ../../include/features.php:404 msgid "Dislike Posts" msgstr "Gefällt-mir-nicht-Beiträge" -#: ../../include/features.php:396 +#: ../../include/features.php:405 msgid "Ability to dislike posts/comments" msgstr "Aktiviert die „Gefällt mir nicht“-Schaltfläche" -#: ../../include/features.php:404 +#: ../../include/features.php:413 msgid "Star Posts" msgstr "Beiträge mit Sternchen versehen" -#: ../../include/features.php:405 +#: ../../include/features.php:414 msgid "Ability to mark special posts with a star indicator" msgstr "Ermöglicht die lokale Markierung spezieller Beiträge mit einem Sternchen-Symbol" -#: ../../include/features.php:413 +#: ../../include/features.php:422 msgid "Tag Cloud" msgstr "Schlagwort-Wolke" -#: ../../include/features.php:414 +#: ../../include/features.php:423 msgid "Provide a personal tag cloud on your channel page" msgstr "Aktiviert die Anzeige einer Schlagwort-Wolke (Tag Cloud) auf Deiner Kanal-Seite" -#: ../../include/features.php:425 +#: ../../include/features.php:434 msgid "Premium Channel" msgstr "Premium-Kanal" -#: ../../include/features.php:426 +#: ../../include/features.php:435 msgid "" "Allows you to set restrictions and terms on those that connect with your " "channel" msgstr "Ermöglicht es, Einschränkungen und Bedingungen für Verbindungen dieses Kanals festzulegen" -#: ../../include/taxonomy.php:267 ../../include/taxonomy.php:288 +#: ../../include/taxonomy.php:325 ../../include/taxonomy.php:346 msgid "Tags" msgstr "Schlagwörter" -#: ../../include/taxonomy.php:332 +#: ../../include/taxonomy.php:410 msgid "Keywords" msgstr "Schlüsselwörter" -#: ../../include/taxonomy.php:353 +#: ../../include/taxonomy.php:431 msgid "have" msgstr "habe" -#: ../../include/taxonomy.php:353 +#: ../../include/taxonomy.php:431 msgid "has" msgstr "hat" -#: ../../include/taxonomy.php:354 +#: ../../include/taxonomy.php:432 msgid "want" msgstr "will" -#: ../../include/taxonomy.php:354 +#: ../../include/taxonomy.php:432 msgid "wants" msgstr "will" -#: ../../include/taxonomy.php:355 +#: ../../include/taxonomy.php:433 msgid "likes" msgstr "gefällt" -#: ../../include/taxonomy.php:356 +#: ../../include/taxonomy.php:434 msgid "dislikes" msgstr "missfällt" @@ -13097,214 +13461,178 @@ msgstr "%1$ss Geburtstag" msgid "Happy Birthday %1$s" msgstr "Alles Gute zum Geburtstag, %1$s" -#: ../../include/nav.php:90 +#: ../../include/nav.php:91 msgid "Remote authentication" msgstr "Über Konto auf anderem Server einloggen" -#: ../../include/nav.php:90 +#: ../../include/nav.php:91 msgid "Click to authenticate to your home hub" msgstr "Klicke, um Dich über Deinen Heimat-Server zu authentifizieren" -#: ../../include/nav.php:99 ../../include/nav.php:123 -msgid "End this session" -msgstr "Beende diese Sitzung" - -#: ../../include/nav.php:102 -msgid "Your profile page" -msgstr "Deine Profilseite" - -#: ../../include/nav.php:105 -msgid "Manage/Edit profiles" -msgstr "Profile verwalten" - -#: ../../include/nav.php:107 -msgid "Edit your profile" -msgstr "Profil bearbeiten" - -#: ../../include/nav.php:113 -msgid "Sign in" -msgstr "Anmelden" - -#: ../../include/nav.php:138 -msgid "Take me home" -msgstr "Bringe mich nach Hause (eigener Kanal)" - -#: ../../include/nav.php:140 -msgid "Log me out of this site" -msgstr "Logge mich von dieser Seite aus" - -#: ../../include/nav.php:145 -msgid "Create an account" -msgstr "Erzeuge ein Konto" - -#: ../../include/nav.php:157 -msgid "Help and documentation" -msgstr "Hilfe und Dokumentation" - -#: ../../include/nav.php:160 -msgid "Search site @name, #tag, ?docs, content" -msgstr "Hub durchsuchen: @Name. #Schlagwort, ?Dokumentation, Inhalt" - -#: ../../include/nav.php:171 -msgid "Grid" -msgstr "Grid" - -#: ../../include/nav.php:171 -msgid "Your grid" -msgstr "Dein Grid" +#: ../../include/nav.php:98 +msgid "Network Activity" +msgstr "Netzwerk-Aktivitäten" -#: ../../include/nav.php:172 -msgid "View your network/grid" -msgstr "Zeige Dein Netzwerk/Grid an" +#: ../../include/nav.php:100 +msgid "Mark all activity notifications seen" +msgstr "Alle Benachrichtigungen als gesehen markieren" -#: ../../include/nav.php:173 -msgid "Mark all grid notifications seen" -msgstr "Alle Grid-Benachrichtigungen als angesehen markieren" - -#: ../../include/nav.php:175 +#: ../../include/nav.php:102 msgid "Channel home" msgstr "Mein Kanal" -#: ../../include/nav.php:176 +#: ../../include/nav.php:103 msgid "View your channel home" msgstr "Zeige Deine Kanalseite an" -#: ../../include/nav.php:177 +#: ../../include/nav.php:104 msgid "Mark all channel notifications seen" msgstr "Markiere alle Kanal-Benachrichtigungen als angesehen" -#: ../../include/nav.php:183 -msgid "Notices" -msgstr "Benachrichtigungen" +#: ../../include/nav.php:109 +msgid "Registrations" +msgstr "Registrierungen" -#: ../../include/nav.php:183 +#: ../../include/nav.php:112 msgid "Notifications" msgstr "Benachrichtigungen" -#: ../../include/nav.php:184 +#: ../../include/nav.php:113 msgid "View all notifications" msgstr "Alle Benachrichtigungen ansehen" -#: ../../include/nav.php:185 +#: ../../include/nav.php:114 msgid "Mark all system notifications seen" msgstr "Markiere alle System-Benachrichtigungen als gesehen" -#: ../../include/nav.php:187 +#: ../../include/nav.php:116 msgid "Private mail" msgstr "Persönliche Mail" -#: ../../include/nav.php:188 +#: ../../include/nav.php:117 msgid "View your private messages" msgstr "Zeige Deine persönlichen Nachrichten an" -#: ../../include/nav.php:189 +#: ../../include/nav.php:118 msgid "Mark all private messages seen" msgstr "Markiere alle persönlichen Nachrichten als gesehen" -#: ../../include/nav.php:195 +#: ../../include/nav.php:124 msgid "Event Calendar" msgstr "Terminkalender" -#: ../../include/nav.php:196 -msgid "View events" -msgstr "Termine ansehen" - -#: ../../include/nav.php:197 -msgid "Mark all events seen" -msgstr "Markiere alle Termine als gesehen" - -#: ../../include/nav.php:199 +#: ../../include/nav.php:129 ../../include/nav.php:215 msgid "Manage Your Channels" msgstr "Verwalte Deine Kanäle" -#: ../../include/nav.php:201 +#: ../../include/nav.php:132 ../../include/nav.php:217 msgid "Account/Channel Settings" msgstr "Konto-/Kanal-Einstellungen" -#: ../../include/nav.php:203 -msgid "Shared Files" -msgstr "Geteilte Dateien" +#: ../../include/nav.php:138 ../../include/nav.php:167 +msgid "End this session" +msgstr "Beende diese Sitzung" + +#: ../../include/nav.php:141 +msgid "Your profile page" +msgstr "Deine Profilseite" -#: ../../include/nav.php:203 -msgid "New files shared with me" -msgstr "Neue Dateien, die mit mir geteilt wurden" +#: ../../include/nav.php:144 +msgid "Manage/Edit profiles" +msgstr "Profile verwalten" -#: ../../include/nav.php:208 -msgid "Public stream" -msgstr "Öffentlicher Beitrags-Stream" +#: ../../include/nav.php:146 +msgid "Edit your profile" +msgstr "Profil bearbeiten" -#: ../../include/nav.php:208 -msgid "Public stream activities" -msgstr "Öffentliche Netzwerk-Aktivitäten" +#: ../../include/nav.php:153 ../../include/nav.php:157 +msgid "Sign in" +msgstr "Anmelden" -#: ../../include/nav.php:215 +#: ../../include/nav.php:182 +msgid "Take me home" +msgstr "Bringe mich nach Hause (eigener Kanal)" + +#: ../../include/nav.php:184 +msgid "Log me out of this site" +msgstr "Logge mich von dieser Seite aus" + +#: ../../include/nav.php:189 +msgid "Create an account" +msgstr "Erzeuge ein Konto" + +#: ../../include/nav.php:201 +msgid "Help and documentation" +msgstr "Hilfe und Dokumentation" + +#: ../../include/nav.php:204 +msgid "Search site @name, #tag, ?docs, content" +msgstr "Hub durchsuchen: @Name. #Schlagwort, ?Dokumentation, Inhalt" + +#: ../../include/nav.php:224 msgid "Site Setup and Configuration" msgstr "Seiten-Einrichtung und -Konfiguration" -#: ../../include/nav.php:274 +#: ../../include/nav.php:311 msgid "@name, #tag, ?doc, content" msgstr "@Name, #Schlagwort, ?Dokumentation, Inhalt" -#: ../../include/nav.php:275 +#: ../../include/nav.php:312 msgid "Please wait..." msgstr "Bitte warten..." -#: ../../include/nav.php:278 +#: ../../include/nav.php:318 msgid "Add Apps" msgstr "Apps hinzufügen" -#: ../../include/nav.php:279 +#: ../../include/nav.php:319 msgid "Arrange Apps" msgstr "Apps anordnen" -#: ../../include/nav.php:280 +#: ../../include/nav.php:320 msgid "Toggle System Apps" msgstr "System-Apps umschalten" -#: ../../include/photos.php:111 +#: ../../include/photos.php:123 #, php-format msgid "Image exceeds website size limit of %lu bytes" msgstr "Bild überschreitet das Webseitenlimit von %lu Bytes" -#: ../../include/photos.php:118 +#: ../../include/photos.php:130 msgid "Image file is empty." msgstr "Bilddatei ist leer." -#: ../../include/photos.php:257 +#: ../../include/photos.php:268 msgid "Photo storage failed." msgstr "Fotospeicherung fehlgeschlagen." -#: ../../include/photos.php:297 +#: ../../include/photos.php:308 msgid "a new photo" msgstr "ein neues Foto" -#: ../../include/photos.php:301 +#: ../../include/photos.php:312 #, php-format msgctxt "photo_upload" msgid "%1$s posted %2$s to %3$s" msgstr "%1$s hat %2$s auf %3$s veröffentlicht" -#: ../../include/photos.php:530 +#: ../../include/photos.php:605 msgid "Upload New Photos" msgstr "Neue Fotos hochladen" -#: ../../include/zot.php:653 +#: ../../include/zot.php:654 msgid "Invalid data packet" msgstr "Ungültiges Datenpaket" -#: ../../include/zot.php:680 +#: ../../include/zot.php:681 msgid "Unable to verify channel signature" msgstr "Konnte die Signatur des Kanals nicht verifizieren" -#: ../../include/zot.php:2338 +#: ../../include/zot.php:2368 #, php-format msgid "Unable to verify site signature for %s" msgstr "Kann die Signatur der Seite von %s nicht verifizieren" -#: ../../include/zot.php:3946 -msgid "invalid target signature" -msgstr "Ungültige Signatur des Ziels" - #: ../../include/group.php:26 msgid "" "A deleted group with this name was revived. Existing item permissions " @@ -13344,14 +13672,18 @@ msgstr "Öffne die markierte Adresse in einem neuen Browserfenster oder Tab" msgid "Logged out." msgstr "Ausgeloggt." -#: ../../include/auth.php:275 +#: ../../include/auth.php:263 +msgid "Email validation is incomplete. Please check your email." +msgstr "E-Mail-Bestätigung nicht abgeschlossen. Bitte prüfe Deine E-Mails (ggf. Spam-Filterung mit berücksichtigen)." + +#: ../../include/auth.php:278 msgid "Failed authentication" msgstr "Authentifizierung fehlgeschlagen" -#: ../../include/help.php:33 +#: ../../include/help.php:34 msgid "Help:" msgstr "Hilfe:" -#: ../../include/help.php:65 +#: ../../include/help.php:78 msgid "Not Found" msgstr "Nicht gefunden" diff --git a/view/de/hstrings.php b/view/de/hstrings.php index 2ee8d8a89..a5e81d36c 100644 --- a/view/de/hstrings.php +++ b/view/de/hstrings.php @@ -90,7 +90,6 @@ App::$strings["Date: "] = "Datum:"; App::$strings["Reason: "] = "Grund:"; App::$strings["INVALID CARD DISMISSED!"] = "UNGÜLTIGE KARTE ABGELEHNT!"; App::$strings["Name: "] = "Name: "; -App::$strings["CalDAV"] = "CalDAV"; App::$strings["Event title"] = "Termintitel"; App::$strings["Start date and time"] = "Startdatum und -zeit"; App::$strings["Example: YYYY-MM-DD HH:mm"] = "Beispiel: JJJJ-MM-TT HH:mm"; @@ -112,7 +111,6 @@ App::$strings["Select calendar"] = "Kalender auswählen"; App::$strings["Delete all"] = "Alles löschen"; App::$strings["Cancel"] = "Abbrechen"; App::$strings["Sorry! Editing of recurrent events is not yet implemented."] = "Entschuldigung, aber das Bearbeiten von wiederkehrenden Veranstaltungen ist leider noch nicht implementiert."; -App::$strings["CardDAV"] = "CardDAV"; App::$strings["Name"] = "Name"; App::$strings["Organisation"] = "Organisation"; App::$strings["Title"] = "Titel"; @@ -157,6 +155,7 @@ App::$strings["Public access denied."] = "Öffentlichen Zugriff verweigert."; App::$strings["Search"] = "Suche"; App::$strings["Items tagged with: %s"] = "Beiträge mit Schlagwort: %s"; App::$strings["Search results for: %s"] = "Suchergebnisse für: %s"; +App::$strings["Public Stream"] = "Öffentlicher Beitrags-Stream"; App::$strings["Location not found."] = "Klon nicht gefunden."; App::$strings["Location lookup failed."] = "Nachschlagen des Kanal-Ortes fehlgeschlagen"; App::$strings["Please select another location to become primary before removing the primary location."] = "Bitte mache einen anderen Kanal-Ort zum primären Ort, bevor Du den primären Ort löschst."; @@ -589,6 +588,8 @@ App::$strings["Deliveries per process"] = "Zustellungen pro Prozess"; App::$strings["Number of deliveries to attempt in a single operating system process. Adjust if necessary to tune system performance. Recommend: 1-5."] = "Anzahl der Zustellungen, die innerhalb eines einzelnen Betriebssystemprozesses versucht werden. Anpassen, falls nötig, um die System-Performance zu verbessern. Empfehlung: 1-5."; App::$strings["Poll interval"] = "Abfrageintervall"; App::$strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "Verzögere Hintergrundprozesse um diese Anzahl Sekunden, um die Systemlast zu reduzieren. Bei 0 wird das Auslieferungsintervall verwendet."; +App::$strings["Path to ImageMagick convert program"] = "Pfad zum ImageMagick-Programm convert"; +App::$strings["If set, use this program to generate photo thumbnails for huge images ( > 4000 pixels in either dimension), otherwise memory exhaustion may occur. Example: /usr/bin/convert"] = "Wenn gesetzt, dann verwende dieses Programm zum Erzeugen von Vorschaubildern großer Fotos (>4000 Pixel in beiden Richtungen), anderenfalls kann Speicherüberlauf auftreten. Beispiel: /usr/bin/convert"; App::$strings["Maximum Load Average"] = "Maximales Load Average"; App::$strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Maximale Systemlast, bevor Verteil- und Empfangsprozesse verschoben werden – Standard 50"; App::$strings["Expiration period in days for imported (grid/network) content"] = "Setze den Zeitraum (in Tagen), ab wann importierte (aus dem Netzwerk) Inhalte ablaufen sollen"; @@ -700,7 +701,7 @@ App::$strings["This website does not expire imported content."] = "Diese Webseit App::$strings["The website limit takes precedence if lower than your limit."] = "Das Verfallslimit der Webseite hat Vorrang, wenn es niedriger als Deines hier ist."; App::$strings["Maximum Friend Requests/Day:"] = "Maximale Kontaktanfragen pro Tag:"; App::$strings["May reduce spam activity"] = "Kann die Spam-Aktivität verringern"; -App::$strings["Default Access Control List (ACL)"] = "Standard-Zugriffsberechtigungsliste (ACL)"; +App::$strings["Default Privacy Group"] = "Standard-Gruppe"; App::$strings["Use my default audience setting for the type of object published"] = "Verwende Deine eingestellte Standard-Zielgruppe des jeweiligen Inhaltstyps"; App::$strings["Channel permissions category:"] = "Zugriffsrechte-Kategorie des Kanals:"; App::$strings["Default Permissions Group"] = "Standard-Berechtigungsgruppe"; @@ -995,14 +996,22 @@ App::$strings["Recent Photos"] = "Neueste Fotos"; App::$strings["Profile Unavailable."] = "Profil nicht verfügbar."; App::$strings["Not found"] = "Nicht gefunden"; App::$strings["Invalid channel"] = "Ungültiger Kanal"; -App::$strings["Wiki"] = "Wiki"; +App::$strings["Error retrieving wiki"] = "Fehler beim Abrufen des Wiki"; +App::$strings["Error creating zip file export folder"] = "Fehler bei der Erzeugung des Zip-Datei Export-Verzeichnisses "; +App::$strings["Error downloading wiki: "] = "Fehler beim Herunterladen des Wiki:"; App::$strings["Wikis"] = "Wikis"; App::$strings["Download"] = "Herunterladen"; App::$strings["Create New"] = "Neu anlegen"; App::$strings["Wiki name"] = "Name des Wiki"; App::$strings["Content type"] = "Inhaltstyp"; +App::$strings["Markdown"] = "Markdown"; +App::$strings["BBcode"] = "BBcode"; +App::$strings["Text"] = "Text"; App::$strings["Type"] = "Typ"; +App::$strings["Any type"] = "Alle Arten"; +App::$strings["Lock content type"] = "Inhaltstyp sperren"; App::$strings["Create a status post for this wiki"] = "Erzeuge einen Statusbeitrag für dieses Wiki"; +App::$strings["Edit Wiki Name"] = "Wiki-Namen bearbeiten"; App::$strings["Wiki not found"] = "Wiki nicht gefunden"; App::$strings["Rename page"] = "Seite umbenennen"; App::$strings["Error retrieving page content"] = "Fehler beim Abrufen des Seiteninhalts"; @@ -1025,6 +1034,8 @@ App::$strings["Error creating wiki. Invalid name."] = "Fehler beim Erstellen des App::$strings["A wiki with this name already exists."] = "Es existiert bereits ein Wiki mit diesem Namen."; App::$strings["Wiki created, but error creating Home page."] = "Das Wiki wurde erzeugt, aber es gab einen Fehler bei der Erstellung der Startseite"; App::$strings["Error creating wiki"] = "Fehler beim Erstellen des Wiki"; +App::$strings["Error updating wiki. Invalid name."] = "Fehler beim Aktualisieren des Wikis. Ungültiger Name."; +App::$strings["Error updating wiki"] = "Fehler beim Aktualisieren des Wikis"; App::$strings["Wiki delete permission denied."] = "Wiki-Löschberechtigung verweigert."; App::$strings["Error deleting wiki"] = "Fehler beim Löschen des Wiki"; App::$strings["New page created"] = "Neue Seite erstellt"; @@ -1036,9 +1047,12 @@ App::$strings["toggle full screen mode"] = "auf Vollbildmodus umschalten"; App::$strings["Layout updated."] = "Layout aktualisiert."; App::$strings["Feature disabled."] = "Funktion deaktiviert."; App::$strings["Edit System Page Description"] = "Systemseitenbeschreibung bearbeiten"; +App::$strings["(modified)"] = "(geändert)"; +App::$strings["Reset"] = "Zurücksetzen"; App::$strings["Layout not found."] = "Layout nicht gefunden."; App::$strings["Module Name:"] = "Modulname:"; App::$strings["Layout Help"] = "Layout-Hilfe"; +App::$strings["Edit another layout"] = "Ein weiteres Layout bearbeiten"; App::$strings["Poke"] = "Anstupsen"; App::$strings["Poke somebody"] = "Jemanden anstupsen"; App::$strings["Poke/Prod"] = "Anstupsen/Knuffen"; @@ -1076,9 +1090,11 @@ App::$strings["You have reached your limit of %1$.0f top level posts."] = "Du ha App::$strings["You have reached your limit of %1$.0f webpages."] = "Du hast die maximale Anzahl von %1$.0f Webseiten erreicht."; App::$strings["sent you a private message"] = "hat Dir eine private Nachricht geschickt"; App::$strings["added your channel"] = "hat deinen Kanal hinzugefügt"; +App::$strings["requires approval"] = "Zustimmung erforderlich"; App::$strings["g A l F d"] = "l, d. F, G:i \\U\\h\\r"; App::$strings["[today]"] = "[Heute]"; App::$strings["posted an event"] = "hat einen Termin veröffentlicht"; +App::$strings["shared a file with you"] = "hat eine Datei mit Dir geteilt"; App::$strings["Invalid item."] = "Ungültiges Element."; App::$strings["Page not found."] = "Seite nicht gefunden."; App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; @@ -1156,7 +1172,6 @@ App::$strings["Please choose the profile you would like to display to %s when vi App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals geerbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung. Werden geerbte Einstellungen hier geändert, hat dies keine Auswirkungen."; App::$strings["Last update:"] = "Letzte Aktualisierung:"; App::$strings["Details"] = "Details"; -App::$strings["My Chatrooms"] = "Meine Chaträume"; App::$strings["Room not found"] = "Chatraum nicht gefunden"; App::$strings["Leave Room"] = "Raum verlassen"; App::$strings["Delete Room"] = "Raum löschen"; @@ -1298,6 +1313,8 @@ App::$strings["Make Default"] = "Zum Standard machen"; App::$strings["%d new messages"] = "%d neue Nachrichten"; App::$strings["%d new introductions"] = "%d neue Vorstellungen"; App::$strings["Delegated Channel"] = "Delegierte Kanäle"; +App::$strings["Cards"] = "Karten"; +App::$strings["Add Card"] = "Karte hinzufügen"; App::$strings["This directory server requires an access token"] = "Dieser Verzeichnisserver benötigt einen Zugriffstoken"; App::$strings["About this site"] = "Über diese Seite"; App::$strings["Site Name"] = "Seitenname"; @@ -1327,6 +1344,13 @@ App::$strings["Error opening zip file"] = "Fehler beim Öffnen der ZIP-Datei"; App::$strings["Invalid folder path."] = "Ungültiger Ordnerpfad."; App::$strings["No webpage elements detected."] = "Keine Webseitenelemente erkannt."; App::$strings["Import complete."] = "Import abgeschlossen."; +App::$strings["Channel name changes are not allowed within 48 hours of changing the account password."] = "Innerhalb von 48 Stunden nach einer Änderung des Konto-Passworts können Kanäle nicht umbenannt werden."; +App::$strings["Reserved nickname. Please choose another."] = "Reservierter Kurzname. Bitte wähle einen anderen."; +App::$strings["Nickname has unsupported characters or is already being used on this site."] = "Der Spitzname enthält nicht-unterstütze Zeichen oder wird bereits auf dieser Seite genutzt."; +App::$strings["Change channel nickname/address"] = "Kanalname/-adresse ändern"; +App::$strings["Any/all connections on other networks will be lost!"] = "Jegliche/alle Verbindungen zu anderen Netzwerken gehen verloren!"; +App::$strings["New channel address"] = "Neue Kanaladresse"; +App::$strings["Rename Channel"] = "Kanal umbenennen"; App::$strings["Item is not editable"] = "Element kann nicht bearbeitet werden."; App::$strings["Edit post"] = "Bearbeite Beitrag"; App::$strings["Invalid message"] = "Ungültige Beitrags-ID (mid)"; @@ -1502,6 +1526,7 @@ App::$strings["Developers"] = "Entwickler"; App::$strings["Tutorials"] = "Tutorials"; App::$strings["\$Projectname Documentation"] = "\$Projectname-Dokumentation"; App::$strings["Contents"] = "Inhalt"; +App::$strings["Item has been removed."] = "Der Beitrag wurde entfernt."; App::$strings["Tag removed"] = "Schlagwort entfernt"; App::$strings["Remove Item Tag"] = "Schlagwort entfernen"; App::$strings["Select a tag to remove: "] = "Schlagwort zum Entfernen auswählen:"; @@ -1515,7 +1540,6 @@ App::$strings["Privacy group: "] = "Gruppe:"; App::$strings["Invalid connection."] = "Ungültige Verbindung."; App::$strings["Invalid channel."] = "Ungültiger Kanal."; App::$strings["network"] = "Netzwerk"; -App::$strings["RSS"] = "RSS"; App::$strings["\$Projectname"] = "\$Projectname"; App::$strings["Welcome to %s"] = "Willkommen auf %s"; App::$strings["Permission Denied."] = "Zugriff verweigert."; @@ -1530,8 +1554,8 @@ App::$strings["Share this file"] = "Diese Datei freigeben"; App::$strings["Show URL to this file"] = "URL zu dieser Datei anzeigen"; App::$strings["Show in your contacts shared folder"] = "Im geteilten Ordner Deiner Kontakte anzeigen"; App::$strings["No channel."] = "Kein Kanal."; -App::$strings["Common connections"] = "Gemeinsame Verbindungen"; App::$strings["No connections in common."] = "Keine gemeinsamen Verbindungen."; +App::$strings["View Common Connections"] = "Zeige gemeinsame Verbindungen"; App::$strings["No connections."] = "Keine Verbindungen."; App::$strings["Visit %s's profile [%s]"] = "%ss Profil [%s] besuchen"; App::$strings["View Connections"] = "Verbindungen anzeigen"; @@ -1554,6 +1578,7 @@ App::$strings["Website:"] = "Webseite:"; App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Kanal [%s] (auf diesem Server noch unbekannt)"; App::$strings["Rating (this information is public)"] = "Bewertung (öffentlich sichtbar)"; App::$strings["Optionally explain your rating (this information is public)"] = "Optional kannst du deine Bewertung erklären (öffentlich sichtbar)"; +App::$strings["Edit Card"] = "Karte bearbeiten"; App::$strings["No valid account found."] = "Kein gültiges Konto gefunden."; App::$strings["Password reset request issued. Check your email."] = "Zurücksetzen des Passworts eingeleitet. Schau in Deine E-Mails."; App::$strings["Site Member (%s)"] = "Nutzer (%s)"; @@ -1569,7 +1594,6 @@ App::$strings["Your password has changed at %s"] = "Auf %s wurde Dein Passwort g App::$strings["Forgot your Password?"] = "Kennwort vergessen?"; App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Gib Deine E-Mail-Adresse ein, um Dein Passwort zurücksetzen zu lassen. Du erhältst dann weitere Anweisungen per E-Mail."; App::$strings["Email Address"] = "E-Mail Adresse"; -App::$strings["Reset"] = "Zurücksetzen"; App::$strings["Mark all seen"] = "Alle als gelesen markieren"; App::$strings["0. Beginner/Basic"] = "0. Einsteiger/Basis"; App::$strings["1. Novice - not skilled but willing to learn"] = "1. Anfänger - unerfahren, aber bereit zu lernen"; @@ -1676,6 +1700,7 @@ App::$strings["Please visit %s to approve or reject the suggestion."] = "Bitte b App::$strings["[\$Projectname:Notify]"] = "[\$Projectname:Benachrichtigung]"; App::$strings["created a new post"] = "Neuer Beitrag wurde erzeugt"; App::$strings["commented on %s's post"] = "hat %s's Beitrag kommentiert"; +App::$strings["Wiki updated successfully"] = "Wiki erfolgreich aktualisiert"; App::$strings["Wiki files deleted successfully"] = "Wiki-Dateien erfolgreich gelöscht"; App::$strings["Update Error at %s"] = "Aktualisierungsfehler auf %s"; App::$strings["Update %s failed. See error logs."] = "Aktualisierung %s fehlgeschlagen. Details in den Fehlerprotokollen."; @@ -1717,6 +1742,7 @@ App::$strings["Vote"] = "Abstimmen"; App::$strings["Voting Options"] = "Abstimmungsoptionen"; App::$strings["Save Bookmarks"] = "Favoriten speichern"; App::$strings["Add to Calendar"] = "Zum Kalender hinzufügen"; +App::$strings["This is an unsaved preview"] = "Dies ist eine nicht gespeicherte Vorschau"; App::$strings["%s show all"] = "%s mehr anzeigen"; App::$strings["Bold"] = "Fett"; App::$strings["Italic"] = "Kursiv"; @@ -1724,6 +1750,7 @@ App::$strings["Underline"] = "Unterstrichen"; App::$strings["Quote"] = "Zitat"; App::$strings["Code"] = "Code"; App::$strings["Image"] = "Bild"; +App::$strings["Attach File"] = "Datei anhängen"; App::$strings["Insert Link"] = "Link einfügen"; App::$strings["Video"] = "Video"; App::$strings["Your full name (required)"] = "Ihr vollständiger Name (erforderlich)"; @@ -1826,6 +1853,34 @@ App::$strings["Connected apps"] = "Verbundene Apps"; App::$strings["Permission Groups"] = "Berechtigungsrollen"; App::$strings["Premium Channel Settings"] = "Premium-Kanal-Einstellungen"; App::$strings["Bookmarked Chatrooms"] = "Gespeicherte Chatrooms"; +App::$strings["New Network Activity"] = "Neue Netzwerk-Aktivitäten"; +App::$strings["New Network Activity Notifications"] = "Benachrichtigungen für neue Netzwerk-Aktivitäten"; +App::$strings["View your network activity"] = "Zeige Deine Netzwerk-Aktivitäten"; +App::$strings["Mark all notifications read"] = "Alle Benachrichtigungen als gesehen markieren"; +App::$strings["New Home Activity"] = "Neue Kanal-Aktivitäten"; +App::$strings["New Home Activity Notifications"] = "Benachrichtigungen für neue Kanal-Aktivitäten"; +App::$strings["View your home activity"] = "Zeige Deine Kanal-Aktivitäten"; +App::$strings["Mark all notifications seen"] = "Alle Benachrichtigungen als gesehen markieren"; +App::$strings["New Mails"] = "Neue Mails"; +App::$strings["New Mails Notifications"] = "Benachrichtigungen für neue Mails"; +App::$strings["View your private mails"] = "Zeige Deine persönlichen Mails"; +App::$strings["Mark all messages seen"] = "Alle Mails als gelesen markieren"; +App::$strings["New Events"] = "Neue Termine"; +App::$strings["New Events Notifications"] = "Benachrichtigungen für neue Termine"; +App::$strings["View events"] = "Termine ansehen"; +App::$strings["Mark all events seen"] = "Markiere alle Termine als gesehen"; +App::$strings["New Connections Notifications"] = "Benachrichtigungen für neue Verbindungen"; +App::$strings["View all connections"] = "Zeige alle Verbindungen"; +App::$strings["New Files"] = "Neue Dateien"; +App::$strings["New Files Notifications"] = "Benachrichtigungen für neue Dateien"; +App::$strings["Notices"] = "Benachrichtigungen"; +App::$strings["View all notices"] = ""; +App::$strings["Mark all notices seen"] = ""; +App::$strings["New Registrations"] = "Neue Registrierungen"; +App::$strings["New Registrations Notifications"] = "Benachrichtigungen für neue Registrierungen"; +App::$strings["Public Stream Notifications"] = "Benachrichtigungen für öffentlichen Beitrags-Stream"; +App::$strings["View the public stream"] = "Zeige öffentlichen Beitrags-Stream"; +App::$strings["Loading..."] = "Lädt ..."; App::$strings["Source channel not found."] = "Quellkanal nicht gefunden."; App::$strings["Create an account to access services and applications"] = "Erstelle ein Konto, um auf Dienste und Anwendungen zugreifen zu können."; App::$strings["Logout"] = "Abmelden"; @@ -1925,6 +1980,7 @@ App::$strings["Or select from a free OpenClipart.org image:"] = "Oder wähle ein App::$strings["Search Term"] = "Suchbegriff"; App::$strings["Unknown error. Please try again later."] = "Unbekannter Fehler. Bitte versuchen Sie es später erneut."; App::$strings["Profile photo updated successfully."] = "Profilfoto erfolgreich aktualisiert."; +App::$strings["invalid target signature"] = "Ungültige Signatur des Ziels"; App::$strings["Flag Adult Photos"] = "Nicht jugendfreie Fotos markieren"; App::$strings["Provide photo edit option to hide inappropriate photos from default album view"] = "Stellt eine Option zum Verstecken von Fotos mit unangemessenen Inhalten in der Standard-Albumansicht bereit"; App::$strings["Post to WordPress"] = "Auf WordPress posten"; @@ -2040,7 +2096,7 @@ App::$strings["Login failed."] = "Login fehlgeschlagen."; App::$strings["Male"] = "Männlich"; App::$strings["Female"] = "Weiblich"; App::$strings["You're welcome."] = "Gern geschehen."; -App::$strings["Ah shucks..."] = ""; +App::$strings["Ah shucks..."] = "Ach Mist..."; App::$strings["Don't mention it."] = "Keine Ursache."; App::$strings["<blush>"] = ""; App::$strings["Page to load after login"] = "Seite, die nach dem Login geladen werden soll"; @@ -2094,9 +2150,6 @@ App::$strings["Followed hashtags (comma separated, do not include the #)"] = "Ve App::$strings["Diaspora Protocol Settings"] = "Diaspora Protokoll Einstellungen"; App::$strings["No username found in import file."] = "Es wurde kein Nutzername in der importierten Datei gefunden."; App::$strings["Unable to create a unique channel address. Import failed."] = "Es war nicht möglich, eine eindeutige Kanal-Adresse zu erzeugen. Der Import ist fehlgeschlagen."; -App::$strings["Error retrieving wiki"] = "Fehler beim Abrufen des Wiki"; -App::$strings["Error creating zip file export folder"] = "Fehler bei der Erzeugung des Zip-Datei Export-Verzeichnisses "; -App::$strings["Error downloading wiki: "] = "Fehler beim Herunterladen des Wiki:"; App::$strings["Your account on %s will expire in a few days."] = "Dein Account auf %s wird in ein paar Tagen ablaufen."; App::$strings["Your $Productname test account is about to expire."] = "Dein $Productname Test-Account wird bald auslaufen."; App::$strings["Enable Rainbowtag"] = "Rainbowtag aktivieren"; @@ -2106,6 +2159,20 @@ App::$strings["Show Upload Limits"] = "Hochladebeschränkungen anzeigen"; App::$strings["Hubzilla configured maximum size: "] = "Die in Hubzilla eingestellte maximale Größe:"; App::$strings["PHP upload_max_filesize: "] = "PHP upload_max_filesize:"; App::$strings["PHP post_max_size (must be larger than upload_max_filesize): "] = "PHP post_max_size (muss größer sein als upload_max_filesize):"; +App::$strings["generic profile image"] = ""; +App::$strings["random geometric pattern"] = ""; +App::$strings["monster face"] = ""; +App::$strings["computer generated face"] = ""; +App::$strings["retro arcade style face"] = ""; +App::$strings["Hub default profile photo"] = "Standard-Profilfoto für diesen Hub"; +App::$strings["Information"] = "Information"; +App::$strings["Libravatar addon is installed, too. Please disable Libravatar addon or this Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if nothing was found at Libravatar."] = ""; +App::$strings["Save Settings"] = "Einstellungen speichern"; +App::$strings["Default avatar image"] = ""; +App::$strings["Select default avatar image if none was found at Gravatar. See README"] = ""; +App::$strings["Rating of images"] = ""; +App::$strings["Select the appropriate avatar rating for your site. See README"] = ""; +App::$strings["Gravatar settings updated."] = ""; App::$strings["Recent Channel/Profile Viewers"] = "Kürzliche Kanal/Profil Besucher"; App::$strings["This plugin/addon has not been configured."] = "Dieses Plugin/Addon wurde noch nicht konfiguriert."; App::$strings["Please visit the Visage settings on %s"] = "Bitte rufe die Visage Einstellungen auf %s auf"; @@ -2131,7 +2198,6 @@ App::$strings["Default zoom"] = "Standardzoom"; App::$strings["The default zoom level. (1:world, 18:highest, also depends on tile server)"] = "Die Standard-Vergrößerungsstufe (1:Welt, 18:höchste, hängt außerdem vom Kachelserver ab)."; App::$strings["Include marker on map"] = "Markierung auf der Karte einschließen"; App::$strings["Include a marker on the map."] = "Binde eine Markierung auf der Karte ein."; -App::$strings["Save Settings"] = "Einstellungen speichern"; App::$strings["text to include in all outgoing posts from this site"] = "Test der in alle Beiträge angefügt werden soll, die von dieser Seite ausgehen"; App::$strings["Post to Friendica"] = "Bei Friendica veröffentlichen"; App::$strings["rtof Settings saved."] = "rtof-Einstellungen gespeichert."; @@ -2183,6 +2249,11 @@ App::$strings["This will import all your Friendica photo albums to this Red chan App::$strings["Friendica Server base URL"] = "BasisURL des Friendica Servers"; App::$strings["Friendica Login Username"] = "Friendica-Anmeldebenutzername"; App::$strings["Friendica Login Password"] = "Friendica-Anmeldepasswort"; +App::$strings["ActivityPub"] = "ActivityPub"; +App::$strings["ActivityPub Protocol Settings updated."] = ""; +App::$strings["The ActivityPub protocol does not support location independence. Connections you make within that network may be unreachable from alternate channel locations."] = ""; +App::$strings["Enable the ActivityPub protocol for this channel"] = ""; +App::$strings["ActivityPub Protocol Settings"] = ""; App::$strings["Project Servers and Resources"] = "Projektserver und -ressourcen"; App::$strings["Project Creator and Tech Lead"] = "Projektersteller und Technischer Leiter"; App::$strings["Admin, developer, directorymin, support bloke"] = "Administrator, Entwickler, Verzeichnis Betreibender, Supportleistende"; @@ -2265,7 +2336,6 @@ App::$strings["Invalid game."] = "Ungültiges Spiel."; App::$strings["You are not a player in this game."] = "Sie sind kein Spieler in diesem Spiel."; App::$strings["You must be a local channel to create a game."] = "Um ein Spiel zu eröffnen, musst du ein lokaler Kanal sein"; App::$strings["You must select one opponent that is not yourself."] = "Du musst einen Gegner wählen, der nicht du selbst ist"; -App::$strings["Creating new game..."] = "Neues Spiel wird erstellt..."; App::$strings["You must select white or black."] = "Sie müssen weiß oder schwarz auswählen."; App::$strings["Error creating new game."] = "Fehler beim Erstellen eines neuen Spiels."; App::$strings["Requested channel is not available."] = "Angeforderte Kanal nicht verfügbar."; @@ -2406,7 +2476,6 @@ App::$strings["Redmatrix File Storage Import"] = ""; App::$strings["This will import all your Redmatrix cloud files to this channel."] = "Hiermit werden alle deine Daten aus der Redmatrix Cloud in diesen Kanal importiert."; App::$strings["file"] = "Datei"; App::$strings["Send email to all members"] = "E-Mail an alle Mitglieder senden"; -App::$strings["$1%s Administrator"] = "$1%s Administrator"; App::$strings["%1\$d of %2\$d messages sent."] = "%1\$d von %2\$d Nachrichten gesendet."; App::$strings["Send email to all hub members."] = "Eine E-Mail an alle Mitglieder dieses Hubs senden."; App::$strings["Sender Email address"] = "E-Mail Adresse des Absenders"; @@ -2479,7 +2548,6 @@ App::$strings["Categories:"] = "Kategorien:"; App::$strings["Filed under:"] = "Gespeichert unter:"; App::$strings["View in context"] = "Im Zusammenhang anschauen"; App::$strings["remove"] = "lösche"; -App::$strings["Loading..."] = "Lädt ..."; App::$strings["Delete Selected Items"] = "Lösche die ausgewählten Elemente"; App::$strings["View Source"] = "Quelle anzeigen"; App::$strings["Follow Thread"] = "Unterhaltung folgen"; @@ -2519,8 +2587,6 @@ App::$strings["Toggle comments"] = "Kommentare umschalten"; App::$strings["Categories (optional, comma-separated list)"] = "Kategorien (optional, kommagetrennte Liste)"; App::$strings["Other networks and post services"] = "Andere Netzwerke und Platformen"; App::$strings["Set publish date"] = "Veröffentlichungsdatum festlegen"; -App::$strings["Discover"] = "Entdecken"; -App::$strings["Imported public streams"] = "Importierte öffentliche Beiträge"; App::$strings["Commented Order"] = "Neueste Kommentare"; App::$strings["Sort by Comment Date"] = "Nach Kommentardatum sortiert"; App::$strings["Posted Order"] = "Neueste Beiträge"; @@ -2537,6 +2603,7 @@ App::$strings["Photo Albums"] = "Fotoalben"; App::$strings["Files and Storage"] = "Dateien und Speicher"; App::$strings["Bookmarks"] = "Lesezeichen"; App::$strings["Saved Bookmarks"] = "Gespeicherte Lesezeichen"; +App::$strings["View Cards"] = ""; App::$strings["View Webpages"] = "Webseiten anzeigen"; App::$strings["__ctx:noun__ Attending"] = array( 0 => "Zusage", @@ -2636,9 +2703,12 @@ App::$strings["Download binary/encrypted content"] = "Binären/verschlüsselten App::$strings["default"] = "Standard"; App::$strings["Page layout"] = "Seiten-Layout"; App::$strings["You can create your own with the layouts tool"] = "Mit dem Gestaltungswerkzeug kannst Du Deine eigenen Layouts erstellen"; +App::$strings["HTML"] = ""; +App::$strings["Comanche Layout"] = ""; +App::$strings["PHP"] = ""; App::$strings["Page content type"] = "Art des Seiteninhalts"; App::$strings["activity"] = "Aktivität"; -App::$strings["a-z, 0-9, -, _, and . only"] = "nur a-z, 0-9, -, _, und ."; +App::$strings["a-z, 0-9, -, and _ only"] = ""; App::$strings["Design Tools"] = "Gestaltungswerkzeuge"; App::$strings["Pages"] = "Seiten"; App::$strings["Import website..."] = "Webseite importieren..."; @@ -2667,18 +2737,16 @@ App::$strings["Examples: Robert Morgenstein, Fishing"] = "Beispiele: Robert Morg App::$strings["Random Profile"] = "Zufallsprofil"; App::$strings["Invite Friends"] = "Lade Freunde ein"; App::$strings["Advanced example: name=fred and country=iceland"] = "Fortgeschrittenes Beispiel: name=fred and country=iceland"; -App::$strings["%d connection in common"] = array( - 0 => "%d gemeinsame Verbindung", - 1 => "%d gemeinsame Verbindungen", -); -App::$strings["show more"] = "mehr zeigen"; +App::$strings["Common Connections"] = ""; +App::$strings["View all %d common connections"] = ""; App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s schrieb den folgenden %2\$s %3\$s"; App::$strings["Channel is blocked on this site."] = "Der Kanal ist auf dieser Seite blockiert "; App::$strings["Channel location missing."] = "Adresse des Kanals fehlt."; App::$strings["Response from remote channel was incomplete."] = "Antwort des entfernten Kanals war unvollständig."; App::$strings["Channel was deleted and no longer exists."] = "Kanal wurde gelöscht und existiert nicht mehr."; -App::$strings["Protocol disabled."] = "Protokoll deaktiviert."; +App::$strings["Remote channel or protocol unavailable."] = ""; App::$strings["Channel discovery failed."] = "Kanalsuche fehlgeschlagen"; +App::$strings["Protocol disabled."] = "Protokoll deaktiviert."; App::$strings["Cannot connect to yourself."] = "Du kannst Dich nicht mit Dir selbst verbinden."; App::$strings["Delete this item?"] = "Dieses Element löschen?"; App::$strings["%s show less"] = "%s weniger anzeigen"; @@ -2762,7 +2830,6 @@ App::$strings["Path not found."] = "Pfad nicht gefunden."; App::$strings["mkdir failed."] = "mkdir fehlgeschlagen."; App::$strings["database storage failed."] = "Speichern in der Datenbank fehlgeschlagen."; App::$strings["Empty path"] = "Leere Pfadangabe"; -App::$strings["guest:"] = "Gast:"; App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "Das Security-Token des Formulars war nicht korrekt. Das ist wahrscheinlich passiert, weil das Formular zu lange (>3 Stunden) offen war, bevor es abgeschickt wurde."; App::$strings["(Unknown)"] = "(Unbekannt)"; App::$strings["Visible to anybody on the internet."] = "Für jeden im Internet sichtbar."; @@ -2785,8 +2852,6 @@ App::$strings["Empty name"] = "Namensfeld leer"; App::$strings["Name too long"] = "Name ist zu lang"; App::$strings["No account identifier"] = "Keine Account-Kennung"; App::$strings["Nickname is required."] = "Spitzname ist erforderlich."; -App::$strings["Reserved nickname. Please choose another."] = "Reservierter Kurzname. Bitte wähle einen anderen."; -App::$strings["Nickname has unsupported characters or is already being used on this site."] = "Der Spitzname enthält nicht-unterstütze Zeichen oder wird bereits auf dieser Seite genutzt."; App::$strings["Unable to retrieve created identity"] = "Kann die erstellte Identität nicht empfangen"; App::$strings["Default Profile"] = "Standard-Profil"; App::$strings["Unable to retrieve modified identity"] = "Geänderte Identität kann nicht empfangen werden"; @@ -2818,7 +2883,6 @@ App::$strings["Love/Romance:"] = "Liebe/Romantik:"; App::$strings["Work/employment:"] = "Arbeit/Anstellung:"; App::$strings["School/education:"] = "Schule/Ausbildung:"; App::$strings["Like this thing"] = "Gefällt mir"; -App::$strings["User '%s' deleted"] = "Benutzer '%s' gelöscht"; App::$strings["l F d, Y \\@ g:i A"] = "l, d. F Y, H:i"; App::$strings["Starts:"] = "Beginnt:"; App::$strings["Finishes:"] = "Endet:"; @@ -2856,6 +2920,7 @@ App::$strings["Image/photo"] = "Bild/Foto"; App::$strings["Encrypted content"] = "Verschlüsselter Inhalt"; App::$strings["Install %s element: "] = "Element %s installieren: "; App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Dieser Beitrag beinhaltet ein installierbares %s Element, aber Du hast nicht die nötigen Rechte, um es auf diesem Hub zu installieren."; +App::$strings["card"] = "Karte"; App::$strings["Click to open/close"] = "Klicke zum Öffnen/Schließen"; App::$strings["spoiler"] = "Spoiler"; App::$strings["$1 wrote:"] = "$1 schrieb:"; @@ -2863,6 +2928,7 @@ App::$strings[" by "] = "von"; App::$strings[" on "] = "am"; App::$strings["Embedded content"] = "Eingebetteter Inhalt"; App::$strings["Embedding disabled"] = "Einbetten deaktiviert"; +App::$strings["OpenWebAuth: %1\$s welcomes %2\$s"] = ""; App::$strings["General Features"] = "Allgemeine Funktionen"; App::$strings["Multiple Profiles"] = "Mehrfachprofile"; App::$strings["Ability to create multiple profiles"] = "Ermöglicht das Anlegen mehrerer Profile pro Kanal"; @@ -2875,6 +2941,7 @@ App::$strings["Provide managed web pages on your channel"] = "Ermöglicht das Er App::$strings["Provide a wiki for your channel"] = "Stelle ein Wiki in Deinem Kanal zur Verfügung"; App::$strings["Private Notes"] = "Private Notizen"; App::$strings["Enables a tool to store notes and reminders (note: not encrypted)"] = "Aktiviert ein Werkzeug mit dem Notizen und Erinnerungen gespeichert werden können (Hinweis: nicht verschlüsselt)"; +App::$strings["Create personal planning cards"] = "Erstelle persönliche (Notiz-)Karten zur Planung/Koordination oder ähnlichen Zwecken"; App::$strings["Navigation Channel Select"] = "Kanal-Auswahl in der Navigationsleiste"; App::$strings["Change channels directly from within the navigation dropdown menu"] = "Ermöglicht den direkten Wechsel zu anderen Kanälen über das Navigationsmenü"; App::$strings["Photo Location"] = "Aufnahmeort"; @@ -2998,24 +3065,12 @@ App::$strings["%1\$s's birthday"] = "%1\$ss Geburtstag"; App::$strings["Happy Birthday %1\$s"] = "Alles Gute zum Geburtstag, %1\$s"; App::$strings["Remote authentication"] = "Über Konto auf anderem Server einloggen"; App::$strings["Click to authenticate to your home hub"] = "Klicke, um Dich über Deinen Heimat-Server zu authentifizieren"; -App::$strings["End this session"] = "Beende diese Sitzung"; -App::$strings["Your profile page"] = "Deine Profilseite"; -App::$strings["Manage/Edit profiles"] = "Profile verwalten"; -App::$strings["Edit your profile"] = "Profil bearbeiten"; -App::$strings["Sign in"] = "Anmelden"; -App::$strings["Take me home"] = "Bringe mich nach Hause (eigener Kanal)"; -App::$strings["Log me out of this site"] = "Logge mich von dieser Seite aus"; -App::$strings["Create an account"] = "Erzeuge ein Konto"; -App::$strings["Help and documentation"] = "Hilfe und Dokumentation"; -App::$strings["Search site @name, #tag, ?docs, content"] = "Hub durchsuchen: @Name. #Schlagwort, ?Dokumentation, Inhalt"; -App::$strings["Grid"] = "Grid"; -App::$strings["Your grid"] = "Dein Grid"; -App::$strings["View your network/grid"] = "Zeige Dein Netzwerk/Grid an"; -App::$strings["Mark all grid notifications seen"] = "Alle Grid-Benachrichtigungen als angesehen markieren"; +App::$strings["Network Activity"] = "Netzwerk-Aktivitäten"; +App::$strings["Mark all activity notifications seen"] = "Alle Benachrichtigungen als gesehen markieren"; App::$strings["Channel home"] = "Mein Kanal"; App::$strings["View your channel home"] = "Zeige Deine Kanalseite an"; App::$strings["Mark all channel notifications seen"] = "Markiere alle Kanal-Benachrichtigungen als angesehen"; -App::$strings["Notices"] = "Benachrichtigungen"; +App::$strings["Registrations"] = "Registrierungen"; App::$strings["Notifications"] = "Benachrichtigungen"; App::$strings["View all notifications"] = "Alle Benachrichtigungen ansehen"; App::$strings["Mark all system notifications seen"] = "Markiere alle System-Benachrichtigungen als gesehen"; @@ -3023,14 +3078,18 @@ App::$strings["Private mail"] = "Persönliche Mail"; App::$strings["View your private messages"] = "Zeige Deine persönlichen Nachrichten an"; App::$strings["Mark all private messages seen"] = "Markiere alle persönlichen Nachrichten als gesehen"; App::$strings["Event Calendar"] = "Terminkalender"; -App::$strings["View events"] = "Termine ansehen"; -App::$strings["Mark all events seen"] = "Markiere alle Termine als gesehen"; App::$strings["Manage Your Channels"] = "Verwalte Deine Kanäle"; App::$strings["Account/Channel Settings"] = "Konto-/Kanal-Einstellungen"; -App::$strings["Shared Files"] = "Geteilte Dateien"; -App::$strings["New files shared with me"] = "Neue Dateien, die mit mir geteilt wurden"; -App::$strings["Public stream"] = "Öffentlicher Beitrags-Stream"; -App::$strings["Public stream activities"] = "Öffentliche Netzwerk-Aktivitäten"; +App::$strings["End this session"] = "Beende diese Sitzung"; +App::$strings["Your profile page"] = "Deine Profilseite"; +App::$strings["Manage/Edit profiles"] = "Profile verwalten"; +App::$strings["Edit your profile"] = "Profil bearbeiten"; +App::$strings["Sign in"] = "Anmelden"; +App::$strings["Take me home"] = "Bringe mich nach Hause (eigener Kanal)"; +App::$strings["Log me out of this site"] = "Logge mich von dieser Seite aus"; +App::$strings["Create an account"] = "Erzeuge ein Konto"; +App::$strings["Help and documentation"] = "Hilfe und Dokumentation"; +App::$strings["Search site @name, #tag, ?docs, content"] = "Hub durchsuchen: @Name. #Schlagwort, ?Dokumentation, Inhalt"; App::$strings["Site Setup and Configuration"] = "Seiten-Einrichtung und -Konfiguration"; App::$strings["@name, #tag, ?doc, content"] = "@Name, #Schlagwort, ?Dokumentation, Inhalt"; App::$strings["Please wait..."] = "Bitte warten..."; @@ -3046,7 +3105,6 @@ App::$strings["Upload New Photos"] = "Neue Fotos hochladen"; App::$strings["Invalid data packet"] = "Ungültiges Datenpaket"; App::$strings["Unable to verify channel signature"] = "Konnte die Signatur des Kanals nicht verifizieren"; App::$strings["Unable to verify site signature for %s"] = "Kann die Signatur der Seite von %s nicht verifizieren"; -App::$strings["invalid target signature"] = "Ungültige Signatur des Ziels"; App::$strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Es hat früher schon einmal eine Gruppe mit diesem Namen existiert, die gelöscht wurde. Es <strong>könnten</strong> von damals noch Elemente (Beiträge, Dateien etc.) vorhanden sein, die allen jetzigen und zukünftigen Mitgliedern dieser Gruppe den Zugriff erlauben. Wenn das nicht Deine Absicht ist, erstelle bitte eine neue Gruppe mit einem anderen Namen."; App::$strings["Add new connections to this privacy group"] = "Neue Verbindung zu dieser Gruppe hinzufügen"; App::$strings["edit"] = "Bearbeiten"; @@ -3056,6 +3114,7 @@ App::$strings["Channels not in any privacy group"] = "Kanäle, die in keiner Gru App::$strings["New window"] = "Neues Fenster"; App::$strings["Open the selected location in a different window or browser tab"] = "Öffne die markierte Adresse in einem neuen Browserfenster oder Tab"; App::$strings["Logged out."] = "Ausgeloggt."; +App::$strings["Email validation is incomplete. Please check your email."] = "E-Mail-Bestätigung nicht abgeschlossen. Bitte prüfe Deine E-Mails (ggf. Spam-Filterung mit berücksichtigen)."; App::$strings["Failed authentication"] = "Authentifizierung fehlgeschlagen"; App::$strings["Help:"] = "Hilfe:"; App::$strings["Not Found"] = "Nicht gefunden"; diff --git a/view/es-es/hmessages.po b/view/es-es/hmessages.po index 44c5309a4..901c37572 100644 --- a/view/es-es/hmessages.po +++ b/view/es-es/hmessages.po @@ -13,8 +13,8 @@ msgid "" msgstr "" "Project-Id-Version: Redmatrix\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-08-01 12:13+0200\n" -"PO-Revision-Date: 2017-08-02 06:49+0000\n" +"POT-Creation-Date: 2017-10-19 12:01+0200\n" +"PO-Revision-Date: 2017-10-20 10:42+0000\n" "Last-Translator: Manuel Jiménez Friaza <mjfriaza@openmailbox.org>\n" "Language-Team: Spanish (Spain) (http://www.transifex.com/Friendica/red-matrix/language/es_ES/)\n" "MIME-Version: 1.0\n" @@ -152,14 +152,14 @@ msgid "Special - Group Repository" msgstr "Especial - Repositorio de grupo" #: ../../Zotlabs/Access/PermissionRoles.php:270 -#: ../../Zotlabs/Module/Cdav.php:1123 ../../Zotlabs/Module/New_channel.php:132 +#: ../../Zotlabs/Module/Cdav.php:1182 ../../Zotlabs/Module/New_channel.php:132 #: ../../Zotlabs/Module/Settings/Channel.php:467 -#: ../../Zotlabs/Module/Connedit.php:932 ../../Zotlabs/Module/Profiles.php:798 +#: ../../Zotlabs/Module/Connedit.php:936 ../../Zotlabs/Module/Profiles.php:798 #: ../../Zotlabs/Module/Register.php:213 ../../include/selectors.php:49 #: ../../include/selectors.php:66 ../../include/selectors.php:104 #: ../../include/selectors.php:140 ../../include/event.php:1297 -#: ../../include/event.php:1304 ../../include/connections.php:681 -#: ../../include/connections.php:688 +#: ../../include/event.php:1304 ../../include/connections.php:689 +#: ../../include/connections.php:696 msgid "Other" msgstr "Otro" @@ -172,16 +172,16 @@ msgstr "Modo personalizado/experto" #: ../../Zotlabs/Module/Achievements.php:15 ../../Zotlabs/Module/Hcard.php:12 #: ../../Zotlabs/Module/Editblock.php:31 ../../Zotlabs/Module/Profile.php:20 #: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Editwebpage.php:32 -#: ../../Zotlabs/Module/Webpages.php:33 -#: ../../Zotlabs/Module/Filestorage.php:51 ../../include/channel.php:1062 +#: ../../Zotlabs/Module/Cards.php:29 ../../Zotlabs/Module/Webpages.php:33 +#: ../../Zotlabs/Module/Filestorage.php:51 ../../include/channel.php:1163 msgid "Requested profile is not available." msgstr "El perfil solicitado no está disponible." #: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80 #: ../../Zotlabs/Module/Invite.php:17 ../../Zotlabs/Module/Invite.php:94 #: ../../Zotlabs/Module/Editlayout.php:67 -#: ../../Zotlabs/Module/Editlayout.php:90 ../../Zotlabs/Module/Channel.php:115 -#: ../../Zotlabs/Module/Channel.php:245 ../../Zotlabs/Module/Channel.php:285 +#: ../../Zotlabs/Module/Editlayout.php:90 ../../Zotlabs/Module/Channel.php:110 +#: ../../Zotlabs/Module/Channel.php:248 ../../Zotlabs/Module/Channel.php:288 #: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Locs.php:87 #: ../../Zotlabs/Module/Mitem.php:115 ../../Zotlabs/Module/Events.php:271 #: ../../Zotlabs/Module/Appman.php:82 ../../Zotlabs/Module/Regmod.php:21 @@ -189,21 +189,21 @@ msgstr "El perfil solicitado no está disponible." #: ../../Zotlabs/Module/New_channel.php:104 #: ../../Zotlabs/Module/Sharedwithme.php:16 ../../Zotlabs/Module/Setup.php:209 #: ../../Zotlabs/Module/Moderate.php:13 -#: ../../Zotlabs/Module/Achievements.php:34 ../../Zotlabs/Module/Thing.php:274 -#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335 +#: ../../Zotlabs/Module/Achievements.php:34 ../../Zotlabs/Module/Thing.php:275 +#: ../../Zotlabs/Module/Thing.php:295 ../../Zotlabs/Module/Thing.php:336 #: ../../Zotlabs/Module/Api.php:24 ../../Zotlabs/Module/Editblock.php:67 -#: ../../Zotlabs/Module/Profile.php:85 ../../Zotlabs/Module/Profile.php:102 +#: ../../Zotlabs/Module/Profile.php:85 ../../Zotlabs/Module/Profile.php:101 #: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Connections.php:29 #: ../../Zotlabs/Module/Viewsrc.php:19 ../../Zotlabs/Module/Bookmarks.php:64 #: ../../Zotlabs/Module/Photos.php:69 ../../Zotlabs/Module/Wiki.php:50 -#: ../../Zotlabs/Module/Wiki.php:235 ../../Zotlabs/Module/Wiki.php:341 +#: ../../Zotlabs/Module/Wiki.php:273 ../../Zotlabs/Module/Wiki.php:388 #: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Poke.php:149 -#: ../../Zotlabs/Module/Profile_photo.php:280 -#: ../../Zotlabs/Module/Profile_photo.php:293 +#: ../../Zotlabs/Module/Profile_photo.php:288 +#: ../../Zotlabs/Module/Profile_photo.php:301 #: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Item.php:223 #: ../../Zotlabs/Module/Item.php:240 ../../Zotlabs/Module/Item.php:250 -#: ../../Zotlabs/Module/Item.php:1076 ../../Zotlabs/Module/Page.php:34 -#: ../../Zotlabs/Module/Page.php:125 ../../Zotlabs/Module/Connedit.php:385 +#: ../../Zotlabs/Module/Item.php:1102 ../../Zotlabs/Module/Page.php:34 +#: ../../Zotlabs/Module/Page.php:125 ../../Zotlabs/Module/Connedit.php:389 #: ../../Zotlabs/Module/Chat.php:100 ../../Zotlabs/Module/Chat.php:105 #: ../../Zotlabs/Module/Menu.php:78 ../../Zotlabs/Module/Layouts.php:71 #: ../../Zotlabs/Module/Layouts.php:78 ../../Zotlabs/Module/Layouts.php:89 @@ -213,22 +213,25 @@ msgstr "El perfil solicitado no está disponible." #: ../../Zotlabs/Module/Editwebpage.php:89 #: ../../Zotlabs/Module/Editwebpage.php:107 #: ../../Zotlabs/Module/Editwebpage.php:121 ../../Zotlabs/Module/Manage.php:10 -#: ../../Zotlabs/Module/Webpages.php:118 ../../Zotlabs/Module/Block.php:24 -#: ../../Zotlabs/Module/Block.php:74 ../../Zotlabs/Module/Editpost.php:17 -#: ../../Zotlabs/Module/Sources.php:74 ../../Zotlabs/Module/Like.php:181 -#: ../../Zotlabs/Module/Suggest.php:28 ../../Zotlabs/Module/Message.php:18 -#: ../../Zotlabs/Module/Mail.php:146 ../../Zotlabs/Module/Register.php:77 +#: ../../Zotlabs/Module/Cards.php:68 ../../Zotlabs/Module/Webpages.php:118 +#: ../../Zotlabs/Module/Block.php:24 ../../Zotlabs/Module/Block.php:74 +#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Sources.php:74 +#: ../../Zotlabs/Module/Like.php:181 ../../Zotlabs/Module/Suggest.php:28 +#: ../../Zotlabs/Module/Message.php:18 ../../Zotlabs/Module/Mail.php:146 +#: ../../Zotlabs/Module/Register.php:77 #: ../../Zotlabs/Module/Cover_photo.php:281 #: ../../Zotlabs/Module/Cover_photo.php:294 -#: ../../Zotlabs/Module/Network.php:15 ../../Zotlabs/Module/Filestorage.php:15 +#: ../../Zotlabs/Module/Display.php:343 ../../Zotlabs/Module/Network.php:15 +#: ../../Zotlabs/Module/Filestorage.php:15 #: ../../Zotlabs/Module/Filestorage.php:70 #: ../../Zotlabs/Module/Filestorage.php:85 -#: ../../Zotlabs/Module/Filestorage.php:112 ../../Zotlabs/Module/Common.php:39 +#: ../../Zotlabs/Module/Filestorage.php:112 ../../Zotlabs/Module/Common.php:38 #: ../../Zotlabs/Module/Viewconnections.php:28 #: ../../Zotlabs/Module/Viewconnections.php:33 #: ../../Zotlabs/Module/Service_limits.php:11 -#: ../../Zotlabs/Module/Rate.php:113 ../../Zotlabs/Module/Notifications.php:11 -#: ../../Zotlabs/Lib/Chatroom.php:137 ../../Zotlabs/Web/WebServer.php:131 +#: ../../Zotlabs/Module/Rate.php:113 ../../Zotlabs/Module/Card_edit.php:51 +#: ../../Zotlabs/Module/Notifications.php:11 +#: ../../Zotlabs/Lib/Chatroom.php:137 ../../Zotlabs/Web/WebServer.php:169 #: ../../addon/keepout/keepout.php:36 ../../addon/openid/Mod_Id.php:53 #: ../../addon/gitwiki/Mod_Gitwiki.php:196 #: ../../addon/gitwiki/Mod_Gitwiki.php:292 ../../addon/pumpio/pumpio.php:40 @@ -236,9 +239,9 @@ msgstr "El perfil solicitado no está disponible." #: ../../include/attach.php:255 ../../include/attach.php:269 #: ../../include/attach.php:276 ../../include/attach.php:344 #: ../../include/attach.php:358 ../../include/attach.php:365 -#: ../../include/attach.php:443 ../../include/attach.php:918 -#: ../../include/attach.php:992 ../../include/attach.php:1157 -#: ../../include/items.php:3440 ../../include/photos.php:28 +#: ../../include/attach.php:443 ../../include/attach.php:924 +#: ../../include/attach.php:998 ../../include/attach.php:1163 +#: ../../include/items.php:3489 ../../include/photos.php:28 msgid "Permission denied." msgstr "Acceso denegado." @@ -247,7 +250,7 @@ msgstr "Acceso denegado." msgid "Block Name" msgstr "Nombre del bloque" -#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2280 +#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2288 msgid "Blocks" msgstr "Bloques" @@ -265,62 +268,64 @@ msgstr "Creado" msgid "Edited" msgstr "Editado" -#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Cdav.php:1126 +#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Cdav.php:1185 #: ../../Zotlabs/Module/New_channel.php:147 -#: ../../Zotlabs/Module/Connedit.php:935 ../../Zotlabs/Module/Menu.php:118 +#: ../../Zotlabs/Module/Connedit.php:939 ../../Zotlabs/Module/Menu.php:118 #: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Module/Profiles.php:801 -#: ../../Zotlabs/Module/Webpages.php:239 ../../Zotlabs/Storage/Browser.php:229 -#: ../../Zotlabs/Storage/Browser.php:335 ../../Zotlabs/Widget/Cdav.php:127 -#: ../../Zotlabs/Widget/Cdav.php:164 +#: ../../Zotlabs/Module/Cards.php:96 ../../Zotlabs/Module/Webpages.php:239 +#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:335 +#: ../../Zotlabs/Widget/Cdav.php:127 ../../Zotlabs/Widget/Cdav.php:164 msgid "Create" msgstr "Crear" #: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Editlayout.php:114 #: ../../Zotlabs/Module/Admin/Profs.php:154 #: ../../Zotlabs/Module/Settings/Oauth.php:149 -#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Module/Editblock.php:114 +#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Module/Editblock.php:114 #: ../../Zotlabs/Module/Connections.php:260 #: ../../Zotlabs/Module/Connections.php:297 -#: ../../Zotlabs/Module/Connections.php:317 ../../Zotlabs/Module/Wiki.php:167 -#: ../../Zotlabs/Module/Wiki.php:300 ../../Zotlabs/Module/Menu.php:112 +#: ../../Zotlabs/Module/Connections.php:317 ../../Zotlabs/Module/Wiki.php:202 +#: ../../Zotlabs/Module/Wiki.php:346 ../../Zotlabs/Module/Menu.php:112 #: ../../Zotlabs/Module/Layouts.php:193 #: ../../Zotlabs/Module/Editwebpage.php:142 #: ../../Zotlabs/Module/Webpages.php:240 ../../Zotlabs/Module/Editpost.php:85 -#: ../../Zotlabs/Lib/Apps.php:393 ../../Zotlabs/Lib/ThreadItem.php:107 -#: ../../Zotlabs/Storage/Browser.php:239 ../../Zotlabs/Widget/Cdav.php:125 -#: ../../Zotlabs/Widget/Cdav.php:161 ../../addon/gitwiki/Mod_Gitwiki.php:151 -#: ../../addon/gitwiki/Mod_Gitwiki.php:252 ../../include/channel.php:1161 -#: ../../include/channel.php:1165 ../../include/menu.php:113 +#: ../../Zotlabs/Module/Card_edit.php:99 ../../Zotlabs/Lib/Apps.php:399 +#: ../../Zotlabs/Lib/ThreadItem.php:111 ../../Zotlabs/Storage/Browser.php:239 +#: ../../Zotlabs/Widget/Cdav.php:125 ../../Zotlabs/Widget/Cdav.php:161 +#: ../../addon/gitwiki/Mod_Gitwiki.php:151 +#: ../../addon/gitwiki/Mod_Gitwiki.php:252 ../../include/channel.php:1262 +#: ../../include/channel.php:1266 ../../include/menu.php:113 msgid "Edit" msgstr "Editar" -#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1044 +#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1049 #: ../../Zotlabs/Module/Layouts.php:194 ../../Zotlabs/Module/Webpages.php:241 -#: ../../Zotlabs/Widget/Cdav.php:123 ../../include/conversation.php:1308 +#: ../../Zotlabs/Widget/Cdav.php:123 ../../include/conversation.php:1346 msgid "Share" msgstr "Compartir" #: ../../Zotlabs/Module/Blocks.php:162 ../../Zotlabs/Module/Editlayout.php:138 -#: ../../Zotlabs/Module/Cdav.php:838 ../../Zotlabs/Module/Cdav.php:1128 +#: ../../Zotlabs/Module/Cdav.php:897 ../../Zotlabs/Module/Cdav.php:1187 #: ../../Zotlabs/Module/Admin/Accounts.php:173 #: ../../Zotlabs/Module/Admin/Channels.php:149 #: ../../Zotlabs/Module/Admin/Profs.php:155 #: ../../Zotlabs/Module/Settings/Oauth.php:150 -#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Module/Editblock.php:139 +#: ../../Zotlabs/Module/Thing.php:262 ../../Zotlabs/Module/Editblock.php:139 #: ../../Zotlabs/Module/Connections.php:268 -#: ../../Zotlabs/Module/Photos.php:1145 ../../Zotlabs/Module/Connedit.php:650 -#: ../../Zotlabs/Module/Connedit.php:937 ../../Zotlabs/Module/Group.php:179 +#: ../../Zotlabs/Module/Photos.php:1150 ../../Zotlabs/Module/Connedit.php:654 +#: ../../Zotlabs/Module/Connedit.php:941 ../../Zotlabs/Module/Group.php:179 #: ../../Zotlabs/Module/Profiles.php:803 #: ../../Zotlabs/Module/Editwebpage.php:167 -#: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Lib/Apps.php:394 -#: ../../Zotlabs/Lib/ThreadItem.php:127 ../../Zotlabs/Storage/Browser.php:240 -#: ../../include/conversation.php:649 ../../include/conversation.php:686 +#: ../../Zotlabs/Module/Webpages.php:242 +#: ../../Zotlabs/Module/Card_edit.php:129 ../../Zotlabs/Lib/Apps.php:400 +#: ../../Zotlabs/Lib/ThreadItem.php:131 ../../Zotlabs/Storage/Browser.php:240 +#: ../../include/conversation.php:674 ../../include/conversation.php:717 msgid "Delete" msgstr "Eliminar" #: ../../Zotlabs/Module/Blocks.php:166 ../../Zotlabs/Module/Events.php:694 -#: ../../Zotlabs/Module/Wiki.php:169 ../../Zotlabs/Module/Layouts.php:198 -#: ../../Zotlabs/Module/Webpages.php:246 ../../Zotlabs/Module/Pubsites.php:59 +#: ../../Zotlabs/Module/Wiki.php:204 ../../Zotlabs/Module/Layouts.php:198 +#: ../../Zotlabs/Module/Webpages.php:246 ../../Zotlabs/Module/Pubsites.php:60 #: ../../addon/gitwiki/Mod_Gitwiki.php:153 msgid "View" msgstr "Ver" @@ -354,10 +359,6 @@ msgid_plural "%d messages sent." msgstr[0] "%d mensajes enviados." msgstr[1] "%d mensajes enviados." -#: ../../Zotlabs/Module/Invite.php:98 ../../Zotlabs/Lib/Apps.php:254 -msgid "Invite" -msgstr "Invitar" - #: ../../Zotlabs/Module/Invite.php:107 msgid "You have no more invitations available" msgstr "No tiene más invitaciones disponibles" @@ -411,7 +412,7 @@ msgstr "3. Pulse [conectar]" #: ../../Zotlabs/Module/Admin/Logs.php:84 #: ../../Zotlabs/Module/Admin/Channels.php:147 #: ../../Zotlabs/Module/Admin/Themes.php:158 -#: ../../Zotlabs/Module/Admin/Site.php:271 +#: ../../Zotlabs/Module/Admin/Site.php:273 #: ../../Zotlabs/Module/Admin/Profs.php:157 #: ../../Zotlabs/Module/Admin/Account_edit.php:74 #: ../../Zotlabs/Module/Admin/Security.php:104 @@ -421,24 +422,26 @@ msgstr "3. Pulse [conectar]" #: ../../Zotlabs/Module/Settings/Tokens.php:168 #: ../../Zotlabs/Module/Settings/Account.php:118 #: ../../Zotlabs/Module/Settings/Featured.php:52 -#: ../../Zotlabs/Module/Settings/Display.php:203 +#: ../../Zotlabs/Module/Settings/Display.php:207 #: ../../Zotlabs/Module/Settings/Oauth.php:87 -#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370 -#: ../../Zotlabs/Module/Import.php:518 ../../Zotlabs/Module/Cal.php:343 +#: ../../Zotlabs/Module/Thing.php:321 ../../Zotlabs/Module/Thing.php:374 +#: ../../Zotlabs/Module/Import.php:529 ../../Zotlabs/Module/Cal.php:343 #: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Photos.php:659 -#: ../../Zotlabs/Module/Photos.php:1024 ../../Zotlabs/Module/Photos.php:1064 -#: ../../Zotlabs/Module/Photos.php:1182 ../../Zotlabs/Module/Wiki.php:171 -#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Poke.php:200 -#: ../../Zotlabs/Module/Connedit.php:900 ../../Zotlabs/Module/Chat.php:196 +#: ../../Zotlabs/Module/Photos.php:1029 ../../Zotlabs/Module/Photos.php:1069 +#: ../../Zotlabs/Module/Photos.php:1187 ../../Zotlabs/Module/Wiki.php:206 +#: ../../Zotlabs/Module/Pdledit.php:94 ../../Zotlabs/Module/Poke.php:200 +#: ../../Zotlabs/Module/Connedit.php:904 ../../Zotlabs/Module/Chat.php:196 #: ../../Zotlabs/Module/Chat.php:242 ../../Zotlabs/Module/Pconfig.php:107 #: ../../Zotlabs/Module/Group.php:87 ../../Zotlabs/Module/Profiles.php:726 #: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149 #: ../../Zotlabs/Module/Xchan.php:15 ../../Zotlabs/Module/Mail.php:431 #: ../../Zotlabs/Module/Filestorage.php:155 ../../Zotlabs/Module/Rate.php:166 -#: ../../Zotlabs/Lib/ThreadItem.php:730 +#: ../../Zotlabs/Lib/ThreadItem.php:743 #: ../../Zotlabs/Widget/Eventstools.php:16 -#: ../../view/theme/redbasic/php/config.php:95 -#: ../../addon/skeleton/skeleton.php:65 ../../addon/gnusoc/gnusoc.php:226 +#: ../../Zotlabs/Widget/Wiki_pages.php:61 +#: ../../view/theme/redbasic_c/php/config.php:95 +#: ../../view/theme/redbasic/php/config.php:93 +#: ../../addon/skeleton/skeleton.php:65 ../../addon/gnusoc/gnusoc.php:269 #: ../../addon/planets/planets.php:153 #: ../../addon/openclipatar/openclipatar.php:53 #: ../../addon/wppost/wppost.php:113 ../../addon/nsfw/nsfw.php:92 @@ -447,7 +450,7 @@ msgstr "3. Pulse [conectar]" #: ../../addon/likebanner/likebanner.php:57 #: ../../addon/redphotos/redphotos.php:136 ../../addon/irc/irc.php:53 #: ../../addon/ljpost/ljpost.php:86 ../../addon/startpage/startpage.php:113 -#: ../../addon/diaspora/diaspora.php:759 +#: ../../addon/diaspora/diaspora.php:807 #: ../../addon/gitwiki/Mod_Gitwiki.php:155 #: ../../addon/rainbowtag/rainbowtag.php:85 ../../addon/visage/visage.php:170 #: ../../addon/nsabait/nsabait.php:161 ../../addon/mailtest/mailtest.php:100 @@ -455,8 +458,8 @@ msgstr "3. Pulse [conectar]" #: ../../addon/rtof/rtof.php:101 ../../addon/jappixmini/jappixmini.php:371 #: ../../addon/superblock/superblock.php:120 ../../addon/nofed/nofed.php:80 #: ../../addon/redred/redred.php:119 ../../addon/logrot/logrot.php:35 -#: ../../addon/frphotos/frphotos.php:96 ../../addon/chords/Mod_Chords.php:60 -#: ../../addon/libertree/libertree.php:85 +#: ../../addon/frphotos/frphotos.php:96 ../../addon/pubcrawl/pubcrawl.php:1049 +#: ../../addon/chords/Mod_Chords.php:60 ../../addon/libertree/libertree.php:85 #: ../../addon/flattrwidget/flattrwidget.php:124 #: ../../addon/statusnet/statusnet.php:322 #: ../../addon/statusnet/statusnet.php:380 @@ -474,7 +477,8 @@ msgstr "Enviar" #: ../../Zotlabs/Module/Editlayout.php:79 #: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95 #: ../../Zotlabs/Module/Editwebpage.php:80 -#: ../../Zotlabs/Module/Editpost.php:24 +#: ../../Zotlabs/Module/Editpost.php:24 ../../Zotlabs/Module/Card_edit.php:17 +#: ../../Zotlabs/Module/Card_edit.php:33 msgid "Item not found" msgstr "Elemento no encontrado" @@ -495,10 +499,10 @@ msgstr "Modificar la plantilla" #: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:62 #: ../../Zotlabs/Module/Import_items.php:120 ../../Zotlabs/Module/Group.php:74 #: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:68 -#: ../../Zotlabs/Module/Like.php:283 ../../Zotlabs/Web/WebServer.php:130 +#: ../../Zotlabs/Module/Like.php:283 ../../Zotlabs/Web/WebServer.php:168 #: ../../addon/redphotos/redphotos.php:119 #: ../../addon/frphotos/frphotos.php:81 ../../addon/redfiles/redfiles.php:109 -#: ../../include/items.php:340 +#: ../../include/items.php:346 msgid "Permission denied" msgstr "Permiso denegado" @@ -510,7 +514,7 @@ msgstr "Identificador del perfil no válido" msgid "Profile Visibility Editor" msgstr "Editor de visibilidad del perfil" -#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1485 +#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1585 msgid "Profile" msgstr "Perfil" @@ -527,160 +531,153 @@ msgstr "Visible para" msgid "All Connections" msgstr "Todas las conexiones" -#: ../../Zotlabs/Module/Cdav.php:726 +#: ../../Zotlabs/Module/Cdav.php:785 msgid "INVALID EVENT DISMISSED!" msgstr "¡EVENTO NO VÁLIDO RECHAZADO!" -#: ../../Zotlabs/Module/Cdav.php:727 +#: ../../Zotlabs/Module/Cdav.php:786 msgid "Summary: " msgstr "Resumen: " -#: ../../Zotlabs/Module/Cdav.php:727 ../../Zotlabs/Module/Cdav.php:728 -#: ../../Zotlabs/Module/Cdav.php:735 ../../Zotlabs/Module/Embedphotos.php:146 -#: ../../Zotlabs/Module/Photos.php:759 ../../Zotlabs/Module/Photos.php:1215 -#: ../../Zotlabs/Lib/Apps.php:721 ../../Zotlabs/Lib/Apps.php:799 +#: ../../Zotlabs/Module/Cdav.php:786 ../../Zotlabs/Module/Cdav.php:787 +#: ../../Zotlabs/Module/Cdav.php:794 ../../Zotlabs/Module/Embedphotos.php:146 +#: ../../Zotlabs/Module/Photos.php:764 ../../Zotlabs/Module/Photos.php:1220 +#: ../../Zotlabs/Lib/Apps.php:727 ../../Zotlabs/Lib/Apps.php:805 #: ../../Zotlabs/Storage/Browser.php:164 ../../Zotlabs/Widget/Portfolio.php:86 -#: ../../Zotlabs/Widget/Album.php:84 ../../include/conversation.php:1107 +#: ../../Zotlabs/Widget/Album.php:84 ../../addon/pubcrawl/as.php:841 +#: ../../include/conversation.php:1143 msgid "Unknown" msgstr "Desconocido" -#: ../../Zotlabs/Module/Cdav.php:728 +#: ../../Zotlabs/Module/Cdav.php:787 msgid "Date: " msgstr "Fecha: " -#: ../../Zotlabs/Module/Cdav.php:729 ../../Zotlabs/Module/Cdav.php:736 +#: ../../Zotlabs/Module/Cdav.php:788 ../../Zotlabs/Module/Cdav.php:795 msgid "Reason: " msgstr "Razón: " -#: ../../Zotlabs/Module/Cdav.php:734 +#: ../../Zotlabs/Module/Cdav.php:793 msgid "INVALID CARD DISMISSED!" msgstr "¡TARJETA NO VÁLIDA RECHAZADA!" -#: ../../Zotlabs/Module/Cdav.php:735 +#: ../../Zotlabs/Module/Cdav.php:794 msgid "Name: " msgstr "Nombre: " -#: ../../Zotlabs/Module/Cdav.php:768 -msgid "CalDAV" -msgstr "CalDAV" - -#: ../../Zotlabs/Module/Cdav.php:809 ../../Zotlabs/Module/Events.php:460 +#: ../../Zotlabs/Module/Cdav.php:868 ../../Zotlabs/Module/Events.php:460 msgid "Event title" msgstr "Título del evento" -#: ../../Zotlabs/Module/Cdav.php:810 ../../Zotlabs/Module/Events.php:466 +#: ../../Zotlabs/Module/Cdav.php:869 ../../Zotlabs/Module/Events.php:466 msgid "Start date and time" msgstr "Fecha y hora de comienzo" -#: ../../Zotlabs/Module/Cdav.php:810 ../../Zotlabs/Module/Cdav.php:811 +#: ../../Zotlabs/Module/Cdav.php:869 ../../Zotlabs/Module/Cdav.php:870 msgid "Example: YYYY-MM-DD HH:mm" msgstr "Ejemplo: YYYY-MM-DD HH:mm" -#: ../../Zotlabs/Module/Cdav.php:811 +#: ../../Zotlabs/Module/Cdav.php:870 msgid "End date and time" msgstr "Fecha y hora de finalización" -#: ../../Zotlabs/Module/Cdav.php:812 ../../Zotlabs/Module/Events.php:473 +#: ../../Zotlabs/Module/Cdav.php:871 ../../Zotlabs/Module/Events.php:473 #: ../../Zotlabs/Module/Appman.php:138 ../../Zotlabs/Module/Rbmark.php:101 #: ../../addon/rendezvous/rendezvous.php:173 msgid "Description" msgstr "Descripción" -#: ../../Zotlabs/Module/Cdav.php:813 ../../Zotlabs/Module/Locs.php:117 +#: ../../Zotlabs/Module/Cdav.php:872 ../../Zotlabs/Module/Locs.php:117 #: ../../Zotlabs/Module/Events.php:475 ../../Zotlabs/Module/Profiles.php:509 -#: ../../Zotlabs/Module/Profiles.php:737 ../../Zotlabs/Module/Pubsites.php:51 +#: ../../Zotlabs/Module/Profiles.php:737 ../../Zotlabs/Module/Pubsites.php:52 #: ../../include/js_strings.php:25 msgid "Location" msgstr "Ubicación" -#: ../../Zotlabs/Module/Cdav.php:820 ../../Zotlabs/Module/Events.php:689 +#: ../../Zotlabs/Module/Cdav.php:879 ../../Zotlabs/Module/Events.php:689 #: ../../Zotlabs/Module/Events.php:698 ../../Zotlabs/Module/Cal.php:337 -#: ../../Zotlabs/Module/Cal.php:344 ../../Zotlabs/Module/Photos.php:913 +#: ../../Zotlabs/Module/Cal.php:344 ../../Zotlabs/Module/Photos.php:918 msgid "Previous" msgstr "Anterior" -#: ../../Zotlabs/Module/Cdav.php:821 ../../Zotlabs/Module/Events.php:690 +#: ../../Zotlabs/Module/Cdav.php:880 ../../Zotlabs/Module/Events.php:690 #: ../../Zotlabs/Module/Events.php:699 ../../Zotlabs/Module/Setup.php:263 #: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Cal.php:345 -#: ../../Zotlabs/Module/Photos.php:922 +#: ../../Zotlabs/Module/Photos.php:927 msgid "Next" msgstr "Siguiente" -#: ../../Zotlabs/Module/Cdav.php:822 ../../Zotlabs/Module/Events.php:700 +#: ../../Zotlabs/Module/Cdav.php:881 ../../Zotlabs/Module/Events.php:700 #: ../../Zotlabs/Module/Cal.php:346 msgid "Today" msgstr "Hoy" -#: ../../Zotlabs/Module/Cdav.php:823 ../../Zotlabs/Module/Events.php:695 +#: ../../Zotlabs/Module/Cdav.php:882 ../../Zotlabs/Module/Events.php:695 msgid "Month" msgstr "Mes" -#: ../../Zotlabs/Module/Cdav.php:824 ../../Zotlabs/Module/Events.php:696 +#: ../../Zotlabs/Module/Cdav.php:883 ../../Zotlabs/Module/Events.php:696 msgid "Week" msgstr "Semana" -#: ../../Zotlabs/Module/Cdav.php:825 ../../Zotlabs/Module/Events.php:697 +#: ../../Zotlabs/Module/Cdav.php:884 ../../Zotlabs/Module/Events.php:697 msgid "Day" msgstr "Día" -#: ../../Zotlabs/Module/Cdav.php:826 +#: ../../Zotlabs/Module/Cdav.php:885 msgid "List month" msgstr "Lista mensual" -#: ../../Zotlabs/Module/Cdav.php:827 +#: ../../Zotlabs/Module/Cdav.php:886 msgid "List week" msgstr "Lista semanal" -#: ../../Zotlabs/Module/Cdav.php:828 +#: ../../Zotlabs/Module/Cdav.php:887 msgid "List day" msgstr "Lista diaria" -#: ../../Zotlabs/Module/Cdav.php:835 +#: ../../Zotlabs/Module/Cdav.php:894 msgid "More" msgstr "Más" -#: ../../Zotlabs/Module/Cdav.php:836 +#: ../../Zotlabs/Module/Cdav.php:895 msgid "Less" msgstr "Menos" -#: ../../Zotlabs/Module/Cdav.php:837 +#: ../../Zotlabs/Module/Cdav.php:896 msgid "Select calendar" msgstr "Seleccionar un calendario" -#: ../../Zotlabs/Module/Cdav.php:839 +#: ../../Zotlabs/Module/Cdav.php:898 msgid "Delete all" msgstr "Eliminar todos" -#: ../../Zotlabs/Module/Cdav.php:840 ../../Zotlabs/Module/Cdav.php:1129 +#: ../../Zotlabs/Module/Cdav.php:899 ../../Zotlabs/Module/Cdav.php:1188 #: ../../Zotlabs/Module/Admin/Plugins.php:423 #: ../../Zotlabs/Module/Settings/Oauth.php:88 #: ../../Zotlabs/Module/Settings/Oauth.php:114 -#: ../../Zotlabs/Module/Wiki.php:290 ../../Zotlabs/Module/Wiki.php:316 -#: ../../Zotlabs/Module/Connedit.php:938 ../../Zotlabs/Module/Fbrowser.php:66 +#: ../../Zotlabs/Module/Wiki.php:333 ../../Zotlabs/Module/Wiki.php:363 +#: ../../Zotlabs/Module/Connedit.php:942 ../../Zotlabs/Module/Fbrowser.php:66 #: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Profiles.php:804 #: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Module/Tagrm.php:15 #: ../../Zotlabs/Module/Tagrm.php:138 ../../addon/js_upload/js_upload.php:46 #: ../../addon/gitwiki/Mod_Gitwiki.php:244 -#: ../../addon/gitwiki/Mod_Gitwiki.php:267 ../../include/conversation.php:1324 -#: ../../include/conversation.php:1373 +#: ../../addon/gitwiki/Mod_Gitwiki.php:267 ../../include/conversation.php:1369 +#: ../../include/conversation.php:1418 msgid "Cancel" msgstr "Cancelar" -#: ../../Zotlabs/Module/Cdav.php:841 +#: ../../Zotlabs/Module/Cdav.php:900 msgid "Sorry! Editing of recurrent events is not yet implemented." msgstr "¡Disculpas! La edición de eventos recurrentes aún no se ha implementado." -#: ../../Zotlabs/Module/Cdav.php:969 -msgid "CardDAV" -msgstr "CardDAV" - -#: ../../Zotlabs/Module/Cdav.php:1111 +#: ../../Zotlabs/Module/Cdav.php:1170 #: ../../Zotlabs/Module/Sharedwithme.php:105 #: ../../Zotlabs/Module/Admin/Channels.php:159 #: ../../Zotlabs/Module/Settings/Oauth.php:89 #: ../../Zotlabs/Module/Settings/Oauth.php:115 -#: ../../Zotlabs/Module/Wiki.php:174 ../../Zotlabs/Module/Connedit.php:920 -#: ../../Zotlabs/Module/Chat.php:251 ../../Zotlabs/Lib/NativeWikiPage.php:539 +#: ../../Zotlabs/Module/Wiki.php:209 ../../Zotlabs/Module/Connedit.php:924 +#: ../../Zotlabs/Module/Chat.php:251 ../../Zotlabs/Lib/NativeWikiPage.php:554 #: ../../Zotlabs/Storage/Browser.php:234 #: ../../Zotlabs/Widget/Wiki_page_history.php:22 #: ../../addon/rendezvous/rendezvous.php:172 @@ -688,123 +685,123 @@ msgstr "CardDAV" msgid "Name" msgstr "Nombre" -#: ../../Zotlabs/Module/Cdav.php:1112 ../../Zotlabs/Module/Connedit.php:921 +#: ../../Zotlabs/Module/Cdav.php:1171 ../../Zotlabs/Module/Connedit.php:925 msgid "Organisation" msgstr "Organización" -#: ../../Zotlabs/Module/Cdav.php:1113 ../../Zotlabs/Module/Connedit.php:922 +#: ../../Zotlabs/Module/Cdav.php:1172 ../../Zotlabs/Module/Connedit.php:926 msgid "Title" msgstr "Título" -#: ../../Zotlabs/Module/Cdav.php:1114 ../../Zotlabs/Module/Connedit.php:923 +#: ../../Zotlabs/Module/Cdav.php:1173 ../../Zotlabs/Module/Connedit.php:927 #: ../../Zotlabs/Module/Profiles.php:789 msgid "Phone" msgstr "Teléfono" -#: ../../Zotlabs/Module/Cdav.php:1115 +#: ../../Zotlabs/Module/Cdav.php:1174 #: ../../Zotlabs/Module/Admin/Accounts.php:169 #: ../../Zotlabs/Module/Admin/Accounts.php:181 -#: ../../Zotlabs/Module/Connedit.php:924 ../../Zotlabs/Module/Profiles.php:790 +#: ../../Zotlabs/Module/Connedit.php:928 ../../Zotlabs/Module/Profiles.php:790 #: ../../addon/openid/MysqlProvider.php:56 #: ../../addon/openid/MysqlProvider.php:57 ../../addon/rtof/rtof.php:93 -#: ../../addon/redred/redred.php:107 ../../include/network.php:1697 +#: ../../addon/redred/redred.php:107 ../../include/network.php:1706 msgid "Email" msgstr "Correo electrónico" -#: ../../Zotlabs/Module/Cdav.php:1116 ../../Zotlabs/Module/Connedit.php:925 +#: ../../Zotlabs/Module/Cdav.php:1175 ../../Zotlabs/Module/Connedit.php:929 #: ../../Zotlabs/Module/Profiles.php:791 msgid "Instant messenger" msgstr "Mensajería instantánea" -#: ../../Zotlabs/Module/Cdav.php:1117 ../../Zotlabs/Module/Connedit.php:926 +#: ../../Zotlabs/Module/Cdav.php:1176 ../../Zotlabs/Module/Connedit.php:930 #: ../../Zotlabs/Module/Profiles.php:792 msgid "Website" msgstr "Sitio web" -#: ../../Zotlabs/Module/Cdav.php:1118 ../../Zotlabs/Module/Locs.php:118 +#: ../../Zotlabs/Module/Cdav.php:1177 ../../Zotlabs/Module/Locs.php:118 #: ../../Zotlabs/Module/Admin/Channels.php:160 -#: ../../Zotlabs/Module/Connedit.php:927 ../../Zotlabs/Module/Profiles.php:502 +#: ../../Zotlabs/Module/Connedit.php:931 ../../Zotlabs/Module/Profiles.php:502 #: ../../Zotlabs/Module/Profiles.php:793 msgid "Address" msgstr "Dirección" -#: ../../Zotlabs/Module/Cdav.php:1119 ../../Zotlabs/Module/Connedit.php:928 +#: ../../Zotlabs/Module/Cdav.php:1178 ../../Zotlabs/Module/Connedit.php:932 #: ../../Zotlabs/Module/Profiles.php:794 msgid "Note" msgstr "Nota" -#: ../../Zotlabs/Module/Cdav.php:1120 ../../Zotlabs/Module/Connedit.php:929 +#: ../../Zotlabs/Module/Cdav.php:1179 ../../Zotlabs/Module/Connedit.php:933 #: ../../Zotlabs/Module/Profiles.php:795 ../../include/event.php:1290 -#: ../../include/connections.php:674 +#: ../../include/connections.php:682 msgid "Mobile" msgstr "Móvil" -#: ../../Zotlabs/Module/Cdav.php:1121 ../../Zotlabs/Module/Connedit.php:930 +#: ../../Zotlabs/Module/Cdav.php:1180 ../../Zotlabs/Module/Connedit.php:934 #: ../../Zotlabs/Module/Profiles.php:796 ../../include/event.php:1291 -#: ../../include/connections.php:675 +#: ../../include/connections.php:683 msgid "Home" msgstr "Inicio" -#: ../../Zotlabs/Module/Cdav.php:1122 ../../Zotlabs/Module/Connedit.php:931 +#: ../../Zotlabs/Module/Cdav.php:1181 ../../Zotlabs/Module/Connedit.php:935 #: ../../Zotlabs/Module/Profiles.php:797 ../../include/event.php:1294 -#: ../../include/connections.php:678 +#: ../../include/connections.php:686 msgid "Work" msgstr "Trabajo" -#: ../../Zotlabs/Module/Cdav.php:1124 ../../Zotlabs/Module/Connedit.php:933 +#: ../../Zotlabs/Module/Cdav.php:1183 ../../Zotlabs/Module/Connedit.php:937 #: ../../Zotlabs/Module/Profiles.php:799 #: ../../addon/jappixmini/jappixmini.php:368 msgid "Add Contact" msgstr "Añadir un contacto" -#: ../../Zotlabs/Module/Cdav.php:1125 ../../Zotlabs/Module/Connedit.php:934 +#: ../../Zotlabs/Module/Cdav.php:1184 ../../Zotlabs/Module/Connedit.php:938 #: ../../Zotlabs/Module/Profiles.php:800 msgid "Add Field" msgstr "Añadir un campo" -#: ../../Zotlabs/Module/Cdav.php:1127 +#: ../../Zotlabs/Module/Cdav.php:1186 #: ../../Zotlabs/Module/Admin/Plugins.php:453 #: ../../Zotlabs/Module/Settings/Oauth.php:42 #: ../../Zotlabs/Module/Settings/Oauth.php:113 -#: ../../Zotlabs/Module/Connedit.php:936 ../../Zotlabs/Module/Profiles.php:802 -#: ../../Zotlabs/Lib/Apps.php:384 +#: ../../Zotlabs/Module/Connedit.php:940 ../../Zotlabs/Module/Profiles.php:802 +#: ../../Zotlabs/Lib/Apps.php:383 msgid "Update" msgstr "Actualizar" -#: ../../Zotlabs/Module/Cdav.php:1130 ../../Zotlabs/Module/Connedit.php:939 +#: ../../Zotlabs/Module/Cdav.php:1189 ../../Zotlabs/Module/Connedit.php:943 msgid "P.O. Box" msgstr "Buzón de correos" -#: ../../Zotlabs/Module/Cdav.php:1131 ../../Zotlabs/Module/Connedit.php:940 +#: ../../Zotlabs/Module/Cdav.php:1190 ../../Zotlabs/Module/Connedit.php:944 msgid "Additional" msgstr "Adicional" -#: ../../Zotlabs/Module/Cdav.php:1132 ../../Zotlabs/Module/Connedit.php:941 +#: ../../Zotlabs/Module/Cdav.php:1191 ../../Zotlabs/Module/Connedit.php:945 msgid "Street" msgstr "Calle" -#: ../../Zotlabs/Module/Cdav.php:1133 ../../Zotlabs/Module/Connedit.php:942 +#: ../../Zotlabs/Module/Cdav.php:1192 ../../Zotlabs/Module/Connedit.php:946 msgid "Locality" msgstr "Localidad" -#: ../../Zotlabs/Module/Cdav.php:1134 ../../Zotlabs/Module/Connedit.php:943 +#: ../../Zotlabs/Module/Cdav.php:1193 ../../Zotlabs/Module/Connedit.php:947 msgid "Region" msgstr "Provincia, región o estado" -#: ../../Zotlabs/Module/Cdav.php:1135 ../../Zotlabs/Module/Connedit.php:944 +#: ../../Zotlabs/Module/Cdav.php:1194 ../../Zotlabs/Module/Connedit.php:948 msgid "ZIP Code" msgstr "Código postal" -#: ../../Zotlabs/Module/Cdav.php:1136 ../../Zotlabs/Module/Connedit.php:945 +#: ../../Zotlabs/Module/Cdav.php:1195 ../../Zotlabs/Module/Connedit.php:949 #: ../../Zotlabs/Module/Profiles.php:760 msgid "Country" msgstr "País" -#: ../../Zotlabs/Module/Cdav.php:1183 +#: ../../Zotlabs/Module/Cdav.php:1242 msgid "Default Calendar" msgstr "Calendario por defecto" -#: ../../Zotlabs/Module/Cdav.php:1193 +#: ../../Zotlabs/Module/Cdav.php:1252 msgid "Default Addressbook" msgstr "Agenda de direcciones por defecto" @@ -813,7 +810,7 @@ msgid "This site is not a directory server" msgstr "Este sitio no es un servidor de directorio" #: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Chat.php:25 -#: ../../addon/gitwiki/Mod_Gitwiki.php:28 ../../addon/chess/chess.php:403 +#: ../../addon/gitwiki/Mod_Gitwiki.php:28 ../../addon/chess/chess.php:431 msgid "You must be logged in to see this page." msgstr "Debe haber iniciado sesión para poder ver esta página." @@ -827,12 +824,7 @@ msgstr "Publicaciones y comentarios" msgid "Only posts" msgstr "Solo publicaciones" -#: ../../Zotlabs/Module/Channel.php:97 ../../Zotlabs/Lib/Apps.php:240 -#: ../../include/nav.php:175 -msgid "Channel Home" -msgstr "Mi canal" - -#: ../../Zotlabs/Module/Channel.php:112 +#: ../../Zotlabs/Module/Channel.php:107 msgid "Insufficient permissions. Request redirected to profile page." msgstr "Permisos insuficientes. Petición redirigida a la página del perfil." @@ -901,16 +893,15 @@ msgstr "Estos ficheros pueden ser importados o restaurados visitando <a href=\"% #: ../../Zotlabs/Module/Search.php:17 ../../Zotlabs/Module/Photos.php:490 #: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Directory.php:63 -#: ../../Zotlabs/Module/Display.php:22 +#: ../../Zotlabs/Module/Display.php:21 #: ../../Zotlabs/Module/Viewconnections.php:23 msgid "Public access denied." msgstr "Acceso público denegado." -#: ../../Zotlabs/Module/Search.php:25 ../../Zotlabs/Module/Search.php:44 -#: ../../Zotlabs/Module/Connections.php:313 ../../Zotlabs/Lib/Apps.php:250 -#: ../../Zotlabs/Widget/Sitesearch.php:31 ../../include/text.php:1021 -#: ../../include/text.php:1033 ../../include/acl_selectors.php:213 -#: ../../include/nav.php:160 +#: ../../Zotlabs/Module/Search.php:44 ../../Zotlabs/Module/Connections.php:313 +#: ../../Zotlabs/Lib/Apps.php:250 ../../Zotlabs/Widget/Sitesearch.php:31 +#: ../../include/text.php:1029 ../../include/text.php:1041 +#: ../../include/acl_selectors.php:213 ../../include/nav.php:204 msgid "Search" msgstr "Buscar" @@ -924,6 +915,11 @@ msgstr "elementos etiquetados con: %s" msgid "Search results for: %s" msgstr "Resultados de la búsqueda para: %s" +#: ../../Zotlabs/Module/Pubstream.php:38 +#: ../../Zotlabs/Widget/Notifications.php:128 +msgid "Public Stream" +msgstr "\"Stream\" público" + #: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54 msgid "Location not found." msgstr "Dirección no encontrada." @@ -976,11 +972,11 @@ msgstr "Cuando sea posible, elimine una ubicación iniciando sesión en el sitio msgid "Use this form to drop the location if the hub is no longer operating." msgstr "Utilice este formulario para eliminar la dirección si el \"hub\" no está funcionando desde hace tiempo." -#: ../../Zotlabs/Module/Apporder.php:34 +#: ../../Zotlabs/Module/Apporder.php:39 msgid "Change Order of Navigation Apps" msgstr "Cambiar el orden de las aplicaciones en la barra de navegación" -#: ../../Zotlabs/Module/Apporder.php:35 +#: ../../Zotlabs/Module/Apporder.php:40 msgid "" "Use arrows to move the corresponding app up or down in the display list" msgstr "Utilizar las flechas para mover la aplicación correspondiente hacia arriba o hacia abajo en la lista de visualización" @@ -1035,18 +1031,20 @@ msgstr "Usar la autenticación mágica si está disponible" #: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241 #: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471 #: ../../Zotlabs/Module/Removeme.php:63 -#: ../../Zotlabs/Module/Admin/Site.php:235 +#: ../../Zotlabs/Module/Admin/Site.php:237 #: ../../Zotlabs/Module/Settings/Channel.php:298 #: ../../Zotlabs/Module/Settings/Display.php:103 #: ../../Zotlabs/Module/Api.php:97 ../../Zotlabs/Module/Photos.php:644 -#: ../../Zotlabs/Module/Wiki.php:182 ../../Zotlabs/Module/Connedit.php:392 -#: ../../Zotlabs/Module/Connedit.php:775 ../../Zotlabs/Module/Menu.php:100 -#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Profiles.php:681 +#: ../../Zotlabs/Module/Wiki.php:218 ../../Zotlabs/Module/Wiki.php:219 +#: ../../Zotlabs/Module/Connedit.php:396 ../../Zotlabs/Module/Connedit.php:779 +#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157 +#: ../../Zotlabs/Module/Profiles.php:681 #: ../../Zotlabs/Module/Filestorage.php:150 #: ../../Zotlabs/Module/Filestorage.php:158 -#: ../../Zotlabs/Storage/Browser.php:351 ../../boot.php:1605 -#: ../../view/theme/redbasic/php/config.php:100 -#: ../../view/theme/redbasic/php/config.php:115 +#: ../../Zotlabs/Storage/Browser.php:351 ../../boot.php:1644 +#: ../../view/theme/redbasic_c/php/config.php:100 +#: ../../view/theme/redbasic_c/php/config.php:115 +#: ../../view/theme/redbasic/php/config.php:98 #: ../../addon/planets/planets.php:149 ../../addon/wppost/wppost.php:82 #: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109 #: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73 @@ -1084,18 +1082,19 @@ msgstr "No" #: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241 #: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471 #: ../../Zotlabs/Module/Removeme.php:63 -#: ../../Zotlabs/Module/Admin/Site.php:237 +#: ../../Zotlabs/Module/Admin/Site.php:239 #: ../../Zotlabs/Module/Settings/Channel.php:298 #: ../../Zotlabs/Module/Settings/Display.php:103 #: ../../Zotlabs/Module/Api.php:96 ../../Zotlabs/Module/Photos.php:644 -#: ../../Zotlabs/Module/Wiki.php:182 ../../Zotlabs/Module/Connedit.php:392 -#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157 -#: ../../Zotlabs/Module/Profiles.php:681 +#: ../../Zotlabs/Module/Wiki.php:218 ../../Zotlabs/Module/Wiki.php:219 +#: ../../Zotlabs/Module/Connedit.php:396 ../../Zotlabs/Module/Menu.php:100 +#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Profiles.php:681 #: ../../Zotlabs/Module/Filestorage.php:150 #: ../../Zotlabs/Module/Filestorage.php:158 -#: ../../Zotlabs/Storage/Browser.php:351 ../../boot.php:1605 -#: ../../view/theme/redbasic/php/config.php:100 -#: ../../view/theme/redbasic/php/config.php:115 +#: ../../Zotlabs/Storage/Browser.php:351 ../../boot.php:1644 +#: ../../view/theme/redbasic_c/php/config.php:100 +#: ../../view/theme/redbasic_c/php/config.php:115 +#: ../../view/theme/redbasic/php/config.php:98 #: ../../addon/planets/planets.php:149 ../../addon/wppost/wppost.php:82 #: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109 #: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73 @@ -1236,7 +1235,7 @@ msgstr "Evento no encontrado." #: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Tagger.php:51 #: ../../Zotlabs/Module/Like.php:372 ../../include/conversation.php:119 -#: ../../include/text.php:1933 ../../include/event.php:1145 +#: ../../include/text.php:1941 ../../include/event.php:1145 msgid "event" msgstr "evento" @@ -1304,13 +1303,13 @@ msgstr "Editar la descripción" msgid "Edit Location" msgstr "Modificar la dirección" -#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1065 -#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/ThreadItem.php:739 -#: ../../include/conversation.php:1277 +#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1070 +#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/ThreadItem.php:753 +#: ../../include/conversation.php:1313 msgid "Preview" msgstr "Previsualizar" -#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1340 +#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1385 msgid "Permission settings" msgstr "Configuración de permisos" @@ -1335,7 +1334,7 @@ msgid "Delete event" msgstr "Borrar evento" #: ../../Zotlabs/Module/Events.php:660 ../../Zotlabs/Module/Cal.php:313 -#: ../../include/text.php:1752 +#: ../../include/text.php:1760 msgid "Link to Source" msgstr "Enlazar con la entrada en su ubicación original" @@ -1352,7 +1351,7 @@ msgid "Create Event" msgstr "Crear un evento" #: ../../Zotlabs/Module/Events.php:691 ../../Zotlabs/Module/Cal.php:339 -#: ../../include/channel.php:1488 +#: ../../include/channel.php:1588 msgid "Export" msgstr "Exportar" @@ -1420,21 +1419,21 @@ msgstr "Dirección (URL) donde adquirir la aplicación" msgid "Please login." msgstr "Por favor, inicie sesión." -#: ../../Zotlabs/Module/Magic.php:71 +#: ../../Zotlabs/Module/Magic.php:72 msgid "Hub not found." msgstr "Servidor no encontrado" #: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Tagger.php:47 #: ../../Zotlabs/Module/Like.php:370 #: ../../addon/redphotos/redphotohelper.php:71 -#: ../../addon/diaspora/Receiver.php:1370 ../../include/conversation.php:116 -#: ../../include/text.php:1930 +#: ../../addon/diaspora/Receiver.php:1424 ../../addon/pubcrawl/as.php:1288 +#: ../../include/conversation.php:116 ../../include/text.php:1938 msgid "photo" msgstr "foto" #: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Like.php:370 -#: ../../addon/diaspora/Receiver.php:1370 ../../include/conversation.php:144 -#: ../../include/text.php:1936 +#: ../../addon/diaspora/Receiver.php:1424 ../../addon/pubcrawl/as.php:1288 +#: ../../include/conversation.php:144 ../../include/text.php:1944 msgid "status" msgstr "el mensaje de estado" @@ -1482,7 +1481,7 @@ msgid "" msgstr "Utilice este formulario para importar entradas existentes y contenido desde un archivo de exportación." #: ../../Zotlabs/Module/Import_items.php:127 -#: ../../Zotlabs/Module/Import.php:505 +#: ../../Zotlabs/Module/Import.php:516 msgid "File to Upload" msgstr "Fichero para subir" @@ -1558,6 +1557,7 @@ msgstr "Eliminar este canal" #: ../../Zotlabs/Module/Removeme.php:61 #: ../../Zotlabs/Module/Removeaccount.php:58 +#: ../../Zotlabs/Module/Changeaddr.php:78 msgid "WARNING: " msgstr "ATENCIÓN:" @@ -1572,6 +1572,7 @@ msgstr "¡Esta acción tiene carácter definitivo y no se puede deshacer!" #: ../../Zotlabs/Module/Removeme.php:62 #: ../../Zotlabs/Module/Removeaccount.php:59 +#: ../../Zotlabs/Module/Changeaddr.php:79 msgid "Please enter your password for verification:" msgstr "Por favor, introduzca su contraseña para su verificación:" @@ -1599,7 +1600,7 @@ msgid "NEW" msgstr "NUEVO" #: ../../Zotlabs/Module/Sharedwithme.php:107 -#: ../../Zotlabs/Storage/Browser.php:236 ../../include/text.php:1386 +#: ../../Zotlabs/Storage/Browser.php:236 ../../include/text.php:1394 msgid "Size" msgstr "Tamaño" @@ -2192,9 +2193,10 @@ msgstr "Intentar ejecutar este paso de actualización automáticamente" #: ../../Zotlabs/Module/Admin/Plugins.php:259 #: ../../Zotlabs/Module/Admin/Themes.php:72 ../../Zotlabs/Module/Thing.php:89 -#: ../../Zotlabs/Module/Viewsrc.php:25 ../../Zotlabs/Module/Display.php:35 +#: ../../Zotlabs/Module/Viewsrc.php:25 ../../Zotlabs/Module/Display.php:33 +#: ../../Zotlabs/Module/Display.php:347 #: ../../Zotlabs/Module/Filestorage.php:24 ../../Zotlabs/Module/Admin.php:62 -#: ../../include/items.php:3361 +#: ../../include/items.php:3410 msgid "Item not found." msgstr "Elemento no encontrado." @@ -2225,7 +2227,7 @@ msgstr "Activar" #: ../../Zotlabs/Module/Admin/Channels.php:145 #: ../../Zotlabs/Module/Admin/Themes.php:122 #: ../../Zotlabs/Module/Admin/Themes.php:156 -#: ../../Zotlabs/Module/Admin/Site.php:269 +#: ../../Zotlabs/Module/Admin/Site.php:271 #: ../../Zotlabs/Module/Admin/Security.php:86 #: ../../Zotlabs/Module/Admin.php:136 msgid "Administration" @@ -2244,7 +2246,8 @@ msgstr "Cambiar" #: ../../Zotlabs/Module/Admin/Plugins.php:344 #: ../../Zotlabs/Module/Admin/Themes.php:125 ../../Zotlabs/Lib/Apps.php:236 -#: ../../Zotlabs/Widget/Settings_menu.php:133 ../../include/nav.php:201 +#: ../../Zotlabs/Widget/Settings_menu.php:133 ../../include/nav.php:132 +#: ../../include/nav.php:217 msgid "Settings" msgstr "Ajustes" @@ -2307,7 +2310,7 @@ msgstr "Descargar el repositorio" msgid "Install new repo" msgstr "Instalar un nuevo repositorio" -#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:384 +#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:383 msgid "Install" msgstr "Instalar" @@ -2328,7 +2331,7 @@ msgid "Switch branch" msgstr "Cambiar la rama" #: ../../Zotlabs/Module/Admin/Plugins.php:455 -#: ../../Zotlabs/Module/Photos.php:962 ../../Zotlabs/Module/Tagrm.php:137 +#: ../../Zotlabs/Module/Photos.php:967 ../../Zotlabs/Module/Tagrm.php:137 #: ../../addon/superblock/superblock.php:116 msgid "Remove" msgstr "Eliminar" @@ -2351,7 +2354,7 @@ msgstr[1] "%s cuentas eliminadas" msgid "Account not found" msgstr "Cuenta no encontrada" -#: ../../Zotlabs/Module/Admin/Accounts.php:90 +#: ../../Zotlabs/Module/Admin/Accounts.php:90 ../../include/channel.php:2357 #, php-format msgid "Account '%s' deleted" msgstr "La cuenta '%s' ha sido eliminada" @@ -2390,7 +2393,7 @@ msgid "No registrations." msgstr "Sin registros." #: ../../Zotlabs/Module/Admin/Accounts.php:171 -#: ../../Zotlabs/Module/Connections.php:282 ../../include/conversation.php:685 +#: ../../Zotlabs/Module/Connections.php:282 ../../include/conversation.php:716 msgid "Approve" msgstr "Aprobar" @@ -2399,12 +2402,12 @@ msgid "Deny" msgstr "Rechazar" #: ../../Zotlabs/Module/Admin/Accounts.php:174 -#: ../../Zotlabs/Module/Connedit.php:618 +#: ../../Zotlabs/Module/Connedit.php:622 msgid "Block" msgstr "Bloquear" #: ../../Zotlabs/Module/Admin/Accounts.php:175 -#: ../../Zotlabs/Module/Connedit.php:618 +#: ../../Zotlabs/Module/Connedit.php:622 msgid "Unblock" msgstr "Desbloquear" @@ -2547,7 +2550,7 @@ msgid "Disallow Code" msgstr "No permitir código" #: ../../Zotlabs/Module/Admin/Channels.php:154 -#: ../../include/conversation.php:1757 ../../include/nav.php:355 +#: ../../include/conversation.php:1791 ../../include/nav.php:399 msgid "Channel" msgstr "Canal" @@ -2596,8 +2599,9 @@ msgstr "[No soportado]" msgid "Site settings updated." msgstr "Ajustes del sitio actualizados." -#: ../../Zotlabs/Module/Admin/Site.php:168 -#: ../../view/theme/redbasic/php/config.php:15 ../../include/text.php:2928 +#: ../../Zotlabs/Module/Admin/Site.php:170 +#: ../../view/theme/redbasic_c/php/config.php:15 +#: ../../view/theme/redbasic/php/config.php:15 ../../include/text.php:2943 msgid "Default" msgstr "Predeterminado" @@ -2640,334 +2644,345 @@ msgstr "Mi sitio es un servicio gratuito" msgid "My site offers free accounts with optional paid upgrades" msgstr "Mi sitio ofrece cuentas gratuitas con opciones extra de pago" -#: ../../Zotlabs/Module/Admin/Site.php:256 +#: ../../Zotlabs/Module/Admin/Site.php:258 msgid "Beginner/Basic" msgstr "Principiante / Básico" -#: ../../Zotlabs/Module/Admin/Site.php:257 +#: ../../Zotlabs/Module/Admin/Site.php:259 msgid "Novice - not skilled but willing to learn" msgstr "Novato: no cualificado, pero dispuesto a aprender" -#: ../../Zotlabs/Module/Admin/Site.php:258 +#: ../../Zotlabs/Module/Admin/Site.php:260 msgid "Intermediate - somewhat comfortable" msgstr "Intermedio: bastante cómodo" -#: ../../Zotlabs/Module/Admin/Site.php:259 +#: ../../Zotlabs/Module/Admin/Site.php:261 msgid "Advanced - very comfortable" msgstr "Avanzado: muy cómodo" -#: ../../Zotlabs/Module/Admin/Site.php:260 +#: ../../Zotlabs/Module/Admin/Site.php:262 msgid "Expert - I can write computer code" msgstr "Experto: puedo escribir código informático" -#: ../../Zotlabs/Module/Admin/Site.php:261 +#: ../../Zotlabs/Module/Admin/Site.php:263 msgid "Wizard - I probably know more than you do" -msgstr "Asistente: probablemente sé más que tú" +msgstr "Colaborador: probablemente sé más que tú" -#: ../../Zotlabs/Module/Admin/Site.php:270 ../../Zotlabs/Widget/Admin.php:22 +#: ../../Zotlabs/Module/Admin/Site.php:272 ../../Zotlabs/Widget/Admin.php:22 msgid "Site" msgstr "Sitio" -#: ../../Zotlabs/Module/Admin/Site.php:272 +#: ../../Zotlabs/Module/Admin/Site.php:274 #: ../../Zotlabs/Module/Register.php:251 msgid "Registration" msgstr "Registro" -#: ../../Zotlabs/Module/Admin/Site.php:273 +#: ../../Zotlabs/Module/Admin/Site.php:275 msgid "File upload" msgstr "Subir fichero" -#: ../../Zotlabs/Module/Admin/Site.php:274 +#: ../../Zotlabs/Module/Admin/Site.php:276 msgid "Policies" msgstr "Políticas" -#: ../../Zotlabs/Module/Admin/Site.php:275 +#: ../../Zotlabs/Module/Admin/Site.php:277 #: ../../include/contact_widgets.php:16 msgid "Advanced" msgstr "Avanzado" -#: ../../Zotlabs/Module/Admin/Site.php:279 +#: ../../Zotlabs/Module/Admin/Site.php:281 #: ../../addon/statusnet/statusnet.php:890 msgid "Site name" msgstr "Nombre del sitio" -#: ../../Zotlabs/Module/Admin/Site.php:281 +#: ../../Zotlabs/Module/Admin/Site.php:283 msgid "Site default technical skill level" msgstr "Nivel de habilidad técnica predeterminado del sitio" -#: ../../Zotlabs/Module/Admin/Site.php:281 +#: ../../Zotlabs/Module/Admin/Site.php:283 msgid "Used to provide a member experience matched to technical comfort level" msgstr "Se utiliza para proporcionar una experiencia a los miembros adaptada a su nivel de comodidad técnica" -#: ../../Zotlabs/Module/Admin/Site.php:283 +#: ../../Zotlabs/Module/Admin/Site.php:285 msgid "Lock the technical skill level setting" msgstr "Bloquear el ajuste del nivel de habilidad técnica" -#: ../../Zotlabs/Module/Admin/Site.php:283 +#: ../../Zotlabs/Module/Admin/Site.php:285 msgid "Members can set their own technical comfort level by default" msgstr "Los miembros pueden configurar su nivel de comodidad técnica por defecto" -#: ../../Zotlabs/Module/Admin/Site.php:285 +#: ../../Zotlabs/Module/Admin/Site.php:287 msgid "Banner/Logo" msgstr "Banner/Logo" -#: ../../Zotlabs/Module/Admin/Site.php:286 +#: ../../Zotlabs/Module/Admin/Site.php:288 msgid "Administrator Information" msgstr "Información del Administrador" -#: ../../Zotlabs/Module/Admin/Site.php:286 +#: ../../Zotlabs/Module/Admin/Site.php:288 msgid "" "Contact information for site administrators. Displayed on siteinfo page. " "BBCode can be used here" msgstr "Información de contacto de los administradores del sitio. Visible en la página \"siteinfo\". Se puede usar BBCode" -#: ../../Zotlabs/Module/Admin/Site.php:287 +#: ../../Zotlabs/Module/Admin/Site.php:289 #: ../../Zotlabs/Module/Siteinfo.php:22 msgid "Site Information" msgstr "Información sobre el sitio" -#: ../../Zotlabs/Module/Admin/Site.php:287 +#: ../../Zotlabs/Module/Admin/Site.php:289 msgid "" "Publicly visible description of this site. Displayed on siteinfo page. " "BBCode can be used here" msgstr "Descripción pública de este sitio. Visible en la página \"siteinfo\". Se puede usar BBCode" -#: ../../Zotlabs/Module/Admin/Site.php:288 +#: ../../Zotlabs/Module/Admin/Site.php:290 msgid "System language" msgstr "Idioma del sistema" -#: ../../Zotlabs/Module/Admin/Site.php:289 +#: ../../Zotlabs/Module/Admin/Site.php:291 msgid "System theme" msgstr "Tema gráfico del sistema" -#: ../../Zotlabs/Module/Admin/Site.php:289 +#: ../../Zotlabs/Module/Admin/Site.php:291 msgid "" "Default system theme - may be over-ridden by user profiles - <a href='#' " "id='cnftheme'>change theme settings</a>" msgstr "Tema del sistema por defecto - se puede cambiar por cada perfil de usuario - <a href='#' id='cnftheme'>modificar los ajustes del tema</a>" -#: ../../Zotlabs/Module/Admin/Site.php:290 +#: ../../Zotlabs/Module/Admin/Site.php:292 msgid "Mobile system theme" msgstr "Tema del sistema para móviles" -#: ../../Zotlabs/Module/Admin/Site.php:290 +#: ../../Zotlabs/Module/Admin/Site.php:292 msgid "Theme for mobile devices" msgstr "Tema para dispositivos móviles" -#: ../../Zotlabs/Module/Admin/Site.php:292 +#: ../../Zotlabs/Module/Admin/Site.php:294 msgid "Allow Feeds as Connections" msgstr "Permitir contenidos RSS como conexiones" -#: ../../Zotlabs/Module/Admin/Site.php:292 +#: ../../Zotlabs/Module/Admin/Site.php:294 msgid "(Heavy system resource usage)" msgstr "(Uso intenso de los recursos del sistema)" -#: ../../Zotlabs/Module/Admin/Site.php:293 +#: ../../Zotlabs/Module/Admin/Site.php:295 msgid "Maximum image size" msgstr "Tamaño máximo de la imagen" -#: ../../Zotlabs/Module/Admin/Site.php:293 +#: ../../Zotlabs/Module/Admin/Site.php:295 msgid "" "Maximum size in bytes of uploaded images. Default is 0, which means no " "limits." msgstr "Tamaño máximo en bytes de la imagen subida. Por defecto, es 0, lo que significa que no hay límites." -#: ../../Zotlabs/Module/Admin/Site.php:294 +#: ../../Zotlabs/Module/Admin/Site.php:296 msgid "Does this site allow new member registration?" msgstr "¿Debe este sitio permitir el registro de nuevos miembros?" -#: ../../Zotlabs/Module/Admin/Site.php:295 +#: ../../Zotlabs/Module/Admin/Site.php:297 msgid "Invitation only" msgstr "Solo con una invitación" -#: ../../Zotlabs/Module/Admin/Site.php:295 +#: ../../Zotlabs/Module/Admin/Site.php:297 msgid "" "Only allow new member registrations with an invitation code. Above register " "policy must be set to Yes." msgstr "Solo se permiten inscripciones de nuevos miembros con un código de invitación. Además, deben aceptarse los términos del registro marcando \"Sí\"." -#: ../../Zotlabs/Module/Admin/Site.php:296 +#: ../../Zotlabs/Module/Admin/Site.php:298 msgid "Which best describes the types of account offered by this hub?" msgstr "¿Cómo describiría el tipo de servicio ofrecido por este servidor?" -#: ../../Zotlabs/Module/Admin/Site.php:297 +#: ../../Zotlabs/Module/Admin/Site.php:299 msgid "Register text" msgstr "Texto del registro" -#: ../../Zotlabs/Module/Admin/Site.php:297 +#: ../../Zotlabs/Module/Admin/Site.php:299 msgid "Will be displayed prominently on the registration page." msgstr "Se mostrará de forma destacada en la página de registro." -#: ../../Zotlabs/Module/Admin/Site.php:298 +#: ../../Zotlabs/Module/Admin/Site.php:300 msgid "Site homepage to show visitors (default: login box)" msgstr "Página personal que se mostrará a los visitantes (por defecto: la página de identificación)" -#: ../../Zotlabs/Module/Admin/Site.php:298 +#: ../../Zotlabs/Module/Admin/Site.php:300 msgid "" "example: 'public' to show public stream, 'page/sys/home' to show a system " "webpage called 'home' or 'include:home.html' to include a file." msgstr "ejemplo: 'public' para mostrar contenido público, 'page/sys/home' para mostrar la página web definida como \"home\" o 'include:home.html' para mostrar el contenido de un fichero." -#: ../../Zotlabs/Module/Admin/Site.php:299 +#: ../../Zotlabs/Module/Admin/Site.php:301 msgid "Preserve site homepage URL" msgstr "Preservar la dirección de la página personal" -#: ../../Zotlabs/Module/Admin/Site.php:299 +#: ../../Zotlabs/Module/Admin/Site.php:301 msgid "" "Present the site homepage in a frame at the original location instead of " "redirecting" msgstr "Presenta la página personal del sitio en un marco en la ubicación original, en vez de redirigirla." -#: ../../Zotlabs/Module/Admin/Site.php:300 +#: ../../Zotlabs/Module/Admin/Site.php:302 msgid "Accounts abandoned after x days" msgstr "Cuentas abandonadas después de x días" -#: ../../Zotlabs/Module/Admin/Site.php:300 +#: ../../Zotlabs/Module/Admin/Site.php:302 msgid "" "Will not waste system resources polling external sites for abandonded " "accounts. Enter 0 for no time limit." msgstr "Para evitar consumir recursos del sistema intentando poner al día las cuentas abandonadas. Introduzca 0 para no tener límite de tiempo." -#: ../../Zotlabs/Module/Admin/Site.php:301 +#: ../../Zotlabs/Module/Admin/Site.php:303 msgid "Allowed friend domains" msgstr "Dominios amigos permitidos" -#: ../../Zotlabs/Module/Admin/Site.php:301 +#: ../../Zotlabs/Module/Admin/Site.php:303 msgid "" "Comma separated list of domains which are allowed to establish friendships " "with this site. Wildcards are accepted. Empty to allow any domains" msgstr "Lista separada por comas de dominios a los que está permitido establecer relaciones de amistad con este sitio. Se permiten comodines. Dejar en claro para aceptar cualquier dominio." -#: ../../Zotlabs/Module/Admin/Site.php:302 +#: ../../Zotlabs/Module/Admin/Site.php:304 msgid "Verify Email Addresses" msgstr "Verificar las direcciones de correo electrónico" -#: ../../Zotlabs/Module/Admin/Site.php:302 +#: ../../Zotlabs/Module/Admin/Site.php:304 msgid "" "Check to verify email addresses used in account registration (recommended)." msgstr "Activar para la verificación de la dirección de correo electrónico en el registro de una cuenta (recomendado)." -#: ../../Zotlabs/Module/Admin/Site.php:303 +#: ../../Zotlabs/Module/Admin/Site.php:305 msgid "Force publish" msgstr "Forzar la publicación" -#: ../../Zotlabs/Module/Admin/Site.php:303 +#: ../../Zotlabs/Module/Admin/Site.php:305 msgid "" "Check to force all profiles on this site to be listed in the site directory." msgstr "Intentar forzar todos los perfiles para que sean listados en el directorio de este sitio." -#: ../../Zotlabs/Module/Admin/Site.php:304 +#: ../../Zotlabs/Module/Admin/Site.php:306 msgid "Import Public Streams" msgstr "Importar contenido público" -#: ../../Zotlabs/Module/Admin/Site.php:304 +#: ../../Zotlabs/Module/Admin/Site.php:306 msgid "" "Import and allow access to public content pulled from other sites. Warning: " "this content is unmoderated." msgstr "Importar y permitir acceso al contenido público sacado de otros sitios. Advertencia: este contenido no está moderado, por lo que podría encontrar cosas inapropiadas u ofensivas." -#: ../../Zotlabs/Module/Admin/Site.php:305 +#: ../../Zotlabs/Module/Admin/Site.php:307 msgid "Login on Homepage" msgstr "Iniciar sesión en la página personal" -#: ../../Zotlabs/Module/Admin/Site.php:305 +#: ../../Zotlabs/Module/Admin/Site.php:307 msgid "" "Present a login box to visitors on the home page if no other content has " "been configured." msgstr "Presentar a los visitantes una casilla de identificación en la página de inicio, si no se ha configurado otro tipo de contenido." -#: ../../Zotlabs/Module/Admin/Site.php:306 +#: ../../Zotlabs/Module/Admin/Site.php:308 msgid "Enable context help" msgstr "Habilitar la ayuda contextual" -#: ../../Zotlabs/Module/Admin/Site.php:306 +#: ../../Zotlabs/Module/Admin/Site.php:308 msgid "" "Display contextual help for the current page when the help button is " "pressed." msgstr "Ver la ayuda contextual para la página actual cuando se pulse el botón de Ayuda." -#: ../../Zotlabs/Module/Admin/Site.php:308 +#: ../../Zotlabs/Module/Admin/Site.php:310 msgid "Reply-to email address for system generated email." msgstr "Dirección de respuesta para el correo electrónico generado por el sistema." -#: ../../Zotlabs/Module/Admin/Site.php:309 +#: ../../Zotlabs/Module/Admin/Site.php:311 msgid "Sender (From) email address for system generated email." msgstr "Dirección del remitente (From) para el correo electrónico generado por el sistema." -#: ../../Zotlabs/Module/Admin/Site.php:310 +#: ../../Zotlabs/Module/Admin/Site.php:312 msgid "Name of email sender for system generated email." msgstr "Nombre del remitente del correo electrónico generado por el sistema." -#: ../../Zotlabs/Module/Admin/Site.php:312 +#: ../../Zotlabs/Module/Admin/Site.php:314 msgid "Directory Server URL" msgstr "URL del servidor de directorio" -#: ../../Zotlabs/Module/Admin/Site.php:312 +#: ../../Zotlabs/Module/Admin/Site.php:314 msgid "Default directory server" msgstr "Servidor de directorio predeterminado" -#: ../../Zotlabs/Module/Admin/Site.php:314 +#: ../../Zotlabs/Module/Admin/Site.php:316 msgid "Proxy user" msgstr "Usuario del proxy" -#: ../../Zotlabs/Module/Admin/Site.php:315 +#: ../../Zotlabs/Module/Admin/Site.php:317 msgid "Proxy URL" msgstr "Dirección del proxy" -#: ../../Zotlabs/Module/Admin/Site.php:316 +#: ../../Zotlabs/Module/Admin/Site.php:318 msgid "Network timeout" msgstr "Tiempo de espera de la red" -#: ../../Zotlabs/Module/Admin/Site.php:316 +#: ../../Zotlabs/Module/Admin/Site.php:318 msgid "Value is in seconds. Set to 0 for unlimited (not recommended)." msgstr "Valor en segundos. Poner a 0 para que no haya tiempo límite (no recomendado)" -#: ../../Zotlabs/Module/Admin/Site.php:317 +#: ../../Zotlabs/Module/Admin/Site.php:319 msgid "Delivery interval" msgstr "Intervalo de entrega" -#: ../../Zotlabs/Module/Admin/Site.php:317 +#: ../../Zotlabs/Module/Admin/Site.php:319 msgid "" "Delay background delivery processes by this many seconds to reduce system " "load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 " "for large dedicated servers." msgstr "Retrasar los procesos de transmisión en segundo plano por esta cantidad de segundos para reducir la carga del sistema. Recomendado: 4-5 para sitios compartidos, 2-3 para servidores virtuales privados, 0-1 para grandes servidores dedicados." -#: ../../Zotlabs/Module/Admin/Site.php:318 +#: ../../Zotlabs/Module/Admin/Site.php:320 msgid "Deliveries per process" msgstr "Intentos de envío por proceso" -#: ../../Zotlabs/Module/Admin/Site.php:318 +#: ../../Zotlabs/Module/Admin/Site.php:320 msgid "" "Number of deliveries to attempt in a single operating system process. Adjust" " if necessary to tune system performance. Recommend: 1-5." msgstr "Numero de envíos a intentar en un único proceso del sistema operativo. Ajustar si es necesario mejorar el rendimiento. Se recomienda: 1-5." -#: ../../Zotlabs/Module/Admin/Site.php:319 +#: ../../Zotlabs/Module/Admin/Site.php:321 msgid "Poll interval" msgstr "Intervalo máximo de tiempo entre dos mensajes sucesivos" -#: ../../Zotlabs/Module/Admin/Site.php:319 +#: ../../Zotlabs/Module/Admin/Site.php:321 msgid "" "Delay background polling processes by this many seconds to reduce system " "load. If 0, use delivery interval." msgstr "Retrasar el intervalo de envío en segundo plano, en esta cantidad de segundos, para reducir la carga del sistema. Si es 0, usar el intervalo de entrega." -#: ../../Zotlabs/Module/Admin/Site.php:320 +#: ../../Zotlabs/Module/Admin/Site.php:322 +msgid "Path to ImageMagick convert program" +msgstr "Ruta al programa de conversión de ImageMagick" + +#: ../../Zotlabs/Module/Admin/Site.php:322 +msgid "" +"If set, use this program to generate photo thumbnails for huge images ( > " +"4000 pixels in either dimension), otherwise memory exhaustion may occur. " +"Example: /usr/bin/convert" +msgstr "Si está configurado, utilice este programa para generar miniaturas de fotos para imágenes de gran tamaño ( > 4000 píxeles en cualquiera de las dos dimensiones), de lo contrario se puede agotar la memoria. Ejemplo: /usr/bin/convert" + +#: ../../Zotlabs/Module/Admin/Site.php:323 msgid "Maximum Load Average" msgstr "Carga media máxima" -#: ../../Zotlabs/Module/Admin/Site.php:320 +#: ../../Zotlabs/Module/Admin/Site.php:323 msgid "" "Maximum system load before delivery and poll processes are deferred - " "default 50." msgstr "Carga máxima del sistema antes de que los procesos de entrega y envío se hayan retardado - por defecto, 50." -#: ../../Zotlabs/Module/Admin/Site.php:321 +#: ../../Zotlabs/Module/Admin/Site.php:324 msgid "Expiration period in days for imported (grid/network) content" msgstr "Caducidad del contenido importado de otros sitios (en días)" -#: ../../Zotlabs/Module/Admin/Site.php:321 +#: ../../Zotlabs/Module/Admin/Site.php:324 msgid "0 for no expiration of imported content" msgstr "0 para que no caduque el contenido importado" @@ -3013,8 +3028,8 @@ msgstr "Información adicional (opcional)" #: ../../Zotlabs/Module/Admin/Profs.php:74 #: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32 #: ../../Zotlabs/Module/Rbmark.php:104 ../../Zotlabs/Module/Filer.php:53 -#: ../../Zotlabs/Widget/Notes.php:18 ../../include/text.php:1022 -#: ../../include/text.php:1034 +#: ../../Zotlabs/Widget/Notes.php:18 ../../include/text.php:1030 +#: ../../include/text.php:1042 msgid "Save" msgstr "Guardar" @@ -3215,16 +3230,16 @@ msgid "Preview" msgstr "Previsualizar" #: ../../Zotlabs/Module/Lockview.php:117 ../../Zotlabs/Module/Lockview.php:153 -#: ../../Zotlabs/Module/Acl.php:117 ../../include/acl_selectors.php:183 +#: ../../Zotlabs/Module/Acl.php:118 ../../include/acl_selectors.php:183 msgctxt "acl" msgid "Profile" msgstr "Perfil" -#: ../../Zotlabs/Module/Moderate.php:37 +#: ../../Zotlabs/Module/Moderate.php:55 msgid "Comment approved" msgstr "El comentario ha sido aprobado" -#: ../../Zotlabs/Module/Moderate.php:41 +#: ../../Zotlabs/Module/Moderate.php:59 msgid "Comment deleted" msgstr "Se ha eliminado el comentario" @@ -3240,7 +3255,7 @@ msgstr "Utilice este formulario para crear reglas de permiso para varias clases #: ../../Zotlabs/Module/Settings/Permcats.php:94 msgid "Permission Categories" -msgstr "Categorías de autorización" +msgstr "Tipos de permisos" #: ../../Zotlabs/Module/Settings/Permcats.php:102 msgid "Permission Name" @@ -3248,25 +3263,25 @@ msgstr "Nombre de la autorización" #: ../../Zotlabs/Module/Settings/Permcats.php:103 #: ../../Zotlabs/Module/Settings/Tokens.php:161 -#: ../../Zotlabs/Module/Connedit.php:904 +#: ../../Zotlabs/Module/Connedit.php:908 msgid "My Settings" msgstr "Mis ajustes" #: ../../Zotlabs/Module/Settings/Permcats.php:105 #: ../../Zotlabs/Module/Settings/Tokens.php:163 -#: ../../Zotlabs/Module/Connedit.php:899 +#: ../../Zotlabs/Module/Connedit.php:903 msgid "inherited" msgstr "heredado" #: ../../Zotlabs/Module/Settings/Permcats.php:108 #: ../../Zotlabs/Module/Settings/Tokens.php:166 -#: ../../Zotlabs/Module/Connedit.php:906 +#: ../../Zotlabs/Module/Connedit.php:910 msgid "Individual Permissions" msgstr "Permisos individuales" #: ../../Zotlabs/Module/Settings/Permcats.php:109 #: ../../Zotlabs/Module/Settings/Tokens.php:167 -#: ../../Zotlabs/Module/Connedit.php:907 +#: ../../Zotlabs/Module/Connedit.php:911 msgid "" "Some permissions may be inherited from your channel's <a " "href=\"settings\"><strong>privacy settings</strong></a>, which have higher " @@ -3279,9 +3294,9 @@ msgstr "Algunos permisos pueden ser heredados de los <a href=\"settings\"><stron #: ../../Zotlabs/Module/Settings/Channel.php:67 #: ../../Zotlabs/Module/Settings/Channel.php:70 #: ../../Zotlabs/Module/Settings/Channel.php:81 -#: ../../Zotlabs/Module/Connedit.php:707 ../../Zotlabs/Widget/Affinity.php:28 -#: ../../include/selectors.php:123 ../../include/channel.php:408 -#: ../../include/channel.php:409 ../../include/channel.php:416 +#: ../../Zotlabs/Module/Connedit.php:711 ../../Zotlabs/Widget/Affinity.php:28 +#: ../../include/selectors.php:123 ../../include/channel.php:423 +#: ../../include/channel.php:424 ../../include/channel.php:431 msgid "Friends" msgstr "Amigos/as" @@ -3335,7 +3350,7 @@ msgid "Allow us to suggest you as a potential friend to new members?" msgstr "¿Nos permite sugerirle como amigo potencial a los nuevos miembros?" #: ../../Zotlabs/Module/Settings/Channel.php:408 -#: ../../Zotlabs/Module/Profile_photo.php:429 +#: ../../Zotlabs/Module/Profile_photo.php:437 #: ../../Zotlabs/Module/Cover_photo.php:365 msgid "or" msgstr "o" @@ -3357,7 +3372,7 @@ msgid "Basic Settings" msgstr "Configuración básica" #: ../../Zotlabs/Module/Settings/Channel.php:486 -#: ../../include/channel.php:1373 +#: ../../include/channel.php:1473 msgid "Full Name:" msgstr "Nombre completo:" @@ -3474,8 +3489,8 @@ msgid "May reduce spam activity" msgstr "Podría reducir la actividad de spam" #: ../../Zotlabs/Module/Settings/Channel.php:512 -msgid "Default Access Control List (ACL)" -msgstr "Lista de control de acceso (ACL) por defecto" +msgid "Default Privacy Group" +msgstr "Grupo de canales por defecto" #: ../../Zotlabs/Module/Settings/Channel.php:514 msgid "Use my default audience setting for the type of object published" @@ -3487,7 +3502,7 @@ msgstr "Categoría de los permisos del canal:" #: ../../Zotlabs/Module/Settings/Channel.php:522 msgid "Default Permissions Group" -msgstr "Grupo de permisos predeterminado" +msgstr "Grupo de permisos predeterminados" #: ../../Zotlabs/Module/Settings/Channel.php:528 msgid "Maximum private messages per day from unknown people:" @@ -3728,7 +3743,7 @@ msgid "Expires (yyyy-mm-dd)" msgstr "Expira (aaaa-mm-dd)" #: ../../Zotlabs/Module/Settings/Tokens.php:160 -#: ../../Zotlabs/Module/Connedit.php:903 +#: ../../Zotlabs/Module/Connedit.php:907 msgid "Their Settings" msgstr "Sus ajustes" @@ -3838,107 +3853,107 @@ msgstr "Sin tema especial para dispositivos móviles" msgid "%s - (Experimental)" msgstr "%s - (Experimental)" -#: ../../Zotlabs/Module/Settings/Display.php:198 +#: ../../Zotlabs/Module/Settings/Display.php:202 msgid "Display Settings" msgstr "Ajustes de visualización" -#: ../../Zotlabs/Module/Settings/Display.php:199 +#: ../../Zotlabs/Module/Settings/Display.php:203 msgid "Theme Settings" msgstr "Ajustes del tema" -#: ../../Zotlabs/Module/Settings/Display.php:200 +#: ../../Zotlabs/Module/Settings/Display.php:204 msgid "Custom Theme Settings" msgstr "Ajustes personalizados del tema" -#: ../../Zotlabs/Module/Settings/Display.php:201 +#: ../../Zotlabs/Module/Settings/Display.php:205 msgid "Content Settings" msgstr "Ajustes del contenido" -#: ../../Zotlabs/Module/Settings/Display.php:207 +#: ../../Zotlabs/Module/Settings/Display.php:211 msgid "Display Theme:" msgstr "Tema gráfico del perfil:" -#: ../../Zotlabs/Module/Settings/Display.php:208 +#: ../../Zotlabs/Module/Settings/Display.php:212 msgid "Select scheme" msgstr "Elegir un esquema" -#: ../../Zotlabs/Module/Settings/Display.php:210 +#: ../../Zotlabs/Module/Settings/Display.php:214 msgid "Mobile Theme:" msgstr "Tema para el móvil:" -#: ../../Zotlabs/Module/Settings/Display.php:211 +#: ../../Zotlabs/Module/Settings/Display.php:215 msgid "Preload images before rendering the page" msgstr "Carga previa de las imágenes antes de generar la página" -#: ../../Zotlabs/Module/Settings/Display.php:211 +#: ../../Zotlabs/Module/Settings/Display.php:215 msgid "" "The subjective page load time will be longer but the page will be ready when" " displayed" msgstr "El tiempo subjetivo de carga de la página será más largo, pero la página estará lista cuando se muestre." -#: ../../Zotlabs/Module/Settings/Display.php:212 +#: ../../Zotlabs/Module/Settings/Display.php:216 msgid "Enable user zoom on mobile devices" msgstr "Habilitar zoom de usuario en dispositivos móviles" -#: ../../Zotlabs/Module/Settings/Display.php:213 +#: ../../Zotlabs/Module/Settings/Display.php:217 msgid "Update browser every xx seconds" msgstr "Actualizar navegador cada xx segundos" -#: ../../Zotlabs/Module/Settings/Display.php:213 +#: ../../Zotlabs/Module/Settings/Display.php:217 msgid "Minimum of 10 seconds, no maximum" msgstr "Mínimo de 10 segundos, sin máximo" -#: ../../Zotlabs/Module/Settings/Display.php:214 +#: ../../Zotlabs/Module/Settings/Display.php:218 msgid "Maximum number of conversations to load at any time:" msgstr "Máximo número de conversaciones a cargar en cualquier momento:" -#: ../../Zotlabs/Module/Settings/Display.php:214 +#: ../../Zotlabs/Module/Settings/Display.php:218 msgid "Maximum of 100 items" msgstr "Máximo de 100 elementos" -#: ../../Zotlabs/Module/Settings/Display.php:215 +#: ../../Zotlabs/Module/Settings/Display.php:219 msgid "Show emoticons (smilies) as images" msgstr "Mostrar emoticonos (smilies) como imágenes" -#: ../../Zotlabs/Module/Settings/Display.php:216 +#: ../../Zotlabs/Module/Settings/Display.php:220 msgid "Manual conversation updates" msgstr "Actualizaciones manuales de la conversación" -#: ../../Zotlabs/Module/Settings/Display.php:216 +#: ../../Zotlabs/Module/Settings/Display.php:220 msgid "Default is on, turning this off may increase screen jumping" msgstr "El valor predeterminado está activado, al desactivarlo puede aumentar el salto de pantalla" -#: ../../Zotlabs/Module/Settings/Display.php:217 +#: ../../Zotlabs/Module/Settings/Display.php:221 msgid "Link post titles to source" msgstr "Enlazar título de la publicación a la fuente original" -#: ../../Zotlabs/Module/Settings/Display.php:218 +#: ../../Zotlabs/Module/Settings/Display.php:222 msgid "System Page Layout Editor - (advanced)" msgstr "Editor de plantilla de página del sistema - (avanzado)" -#: ../../Zotlabs/Module/Settings/Display.php:221 +#: ../../Zotlabs/Module/Settings/Display.php:225 msgid "Use blog/list mode on channel page" msgstr "Usar modo blog/lista en la página de inicio del canal" -#: ../../Zotlabs/Module/Settings/Display.php:221 -#: ../../Zotlabs/Module/Settings/Display.php:222 +#: ../../Zotlabs/Module/Settings/Display.php:225 +#: ../../Zotlabs/Module/Settings/Display.php:226 msgid "(comments displayed separately)" msgstr "(comentarios mostrados de forma separada)" -#: ../../Zotlabs/Module/Settings/Display.php:222 +#: ../../Zotlabs/Module/Settings/Display.php:226 msgid "Use blog/list mode on grid page" msgstr "Mostrar mi red en modo blog" -#: ../../Zotlabs/Module/Settings/Display.php:223 +#: ../../Zotlabs/Module/Settings/Display.php:227 msgid "Channel page max height of content (in pixels)" msgstr "Altura máxima del contenido de la página del canal (en píxeles)" -#: ../../Zotlabs/Module/Settings/Display.php:223 -#: ../../Zotlabs/Module/Settings/Display.php:224 +#: ../../Zotlabs/Module/Settings/Display.php:227 +#: ../../Zotlabs/Module/Settings/Display.php:228 msgid "click to expand content exceeding this height" msgstr "Pulsar para expandir el contenido que exceda de esta altura" -#: ../../Zotlabs/Module/Settings/Display.php:224 +#: ../../Zotlabs/Module/Settings/Display.php:228 msgid "Grid page max height of content (in pixels)" msgstr "Altura máxima del contenido de mi red (en píxeles)" @@ -4019,20 +4034,20 @@ msgid "Remove authorization" msgstr "Eliminar autorización" #: ../../Zotlabs/Module/Embedphotos.php:140 -#: ../../Zotlabs/Module/Photos.php:753 ../../Zotlabs/Module/Photos.php:1292 +#: ../../Zotlabs/Module/Photos.php:758 ../../Zotlabs/Module/Photos.php:1297 #: ../../Zotlabs/Widget/Portfolio.php:78 ../../Zotlabs/Widget/Album.php:78 msgid "View Photo" msgstr "Ver foto" #: ../../Zotlabs/Module/Embedphotos.php:156 -#: ../../Zotlabs/Module/Photos.php:784 ../../Zotlabs/Widget/Portfolio.php:97 +#: ../../Zotlabs/Module/Photos.php:789 ../../Zotlabs/Widget/Portfolio.php:97 #: ../../Zotlabs/Widget/Album.php:95 msgid "Edit Album" msgstr "Editar álbum" #: ../../Zotlabs/Module/Embedphotos.php:158 -#: ../../Zotlabs/Module/Photos.php:786 ../../Zotlabs/Module/Photos.php:1323 -#: ../../Zotlabs/Module/Profile_photo.php:423 +#: ../../Zotlabs/Module/Photos.php:791 ../../Zotlabs/Module/Photos.php:1328 +#: ../../Zotlabs/Module/Profile_photo.php:431 #: ../../Zotlabs/Module/Cover_photo.php:361 #: ../../Zotlabs/Storage/Browser.php:230 ../../Zotlabs/Storage/Browser.php:337 #: ../../Zotlabs/Widget/Cdav.php:132 ../../Zotlabs/Widget/Cdav.php:168 @@ -4044,77 +4059,77 @@ msgstr "Subir" msgid "Some blurb about what to do when you're new here" msgstr "Algunas propuestas para el nuevo usuario sobre qué se puede hacer aquí" -#: ../../Zotlabs/Module/Thing.php:114 +#: ../../Zotlabs/Module/Thing.php:115 msgid "Thing updated" msgstr "Elemento actualizado." -#: ../../Zotlabs/Module/Thing.php:166 +#: ../../Zotlabs/Module/Thing.php:167 msgid "Object store: failed" msgstr "Guardar objeto: ha fallado" -#: ../../Zotlabs/Module/Thing.php:170 +#: ../../Zotlabs/Module/Thing.php:171 msgid "Thing added" msgstr "Elemento añadido" -#: ../../Zotlabs/Module/Thing.php:196 +#: ../../Zotlabs/Module/Thing.php:197 #, php-format msgid "OBJ: %1$s %2$s %3$s" msgstr "OBJ: %1$s %2$s %3$s" -#: ../../Zotlabs/Module/Thing.php:259 +#: ../../Zotlabs/Module/Thing.php:260 msgid "Show Thing" msgstr "Mostrar elemento" -#: ../../Zotlabs/Module/Thing.php:266 +#: ../../Zotlabs/Module/Thing.php:267 msgid "item not found." msgstr "elemento no encontrado." -#: ../../Zotlabs/Module/Thing.php:299 +#: ../../Zotlabs/Module/Thing.php:300 msgid "Edit Thing" msgstr "Editar elemento" -#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355 +#: ../../Zotlabs/Module/Thing.php:302 ../../Zotlabs/Module/Thing.php:359 msgid "Select a profile" msgstr "Seleccionar un perfil" -#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358 +#: ../../Zotlabs/Module/Thing.php:306 ../../Zotlabs/Module/Thing.php:362 msgid "Post an activity" msgstr "Publicar una actividad" -#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358 +#: ../../Zotlabs/Module/Thing.php:306 ../../Zotlabs/Module/Thing.php:362 msgid "Only sends to viewers of the applicable profile" msgstr "Sólo enviar a espectadores del perfil pertinente." -#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360 +#: ../../Zotlabs/Module/Thing.php:308 ../../Zotlabs/Module/Thing.php:364 msgid "Name of thing e.g. something" msgstr "Nombre del elemento, p. ej.:. \"algo\"" -#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361 +#: ../../Zotlabs/Module/Thing.php:310 ../../Zotlabs/Module/Thing.php:365 msgid "URL of thing (optional)" msgstr "Dirección del elemento (opcional)" -#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362 +#: ../../Zotlabs/Module/Thing.php:312 ../../Zotlabs/Module/Thing.php:366 msgid "URL for photo of thing (optional)" msgstr "Dirección para la foto o elemento (opcional)" -#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:363 -#: ../../Zotlabs/Module/Photos.php:649 ../../Zotlabs/Module/Photos.php:1013 -#: ../../Zotlabs/Module/Connedit.php:672 ../../Zotlabs/Module/Chat.php:235 +#: ../../Zotlabs/Module/Thing.php:314 ../../Zotlabs/Module/Thing.php:367 +#: ../../Zotlabs/Module/Photos.php:649 ../../Zotlabs/Module/Photos.php:1018 +#: ../../Zotlabs/Module/Connedit.php:676 ../../Zotlabs/Module/Chat.php:235 #: ../../Zotlabs/Module/Filestorage.php:142 #: ../../include/acl_selectors.php:218 msgid "Permissions" msgstr "Permisos" -#: ../../Zotlabs/Module/Thing.php:353 +#: ../../Zotlabs/Module/Thing.php:357 msgid "Add Thing to your Profile" msgstr "Añadir alguna cosa a su perfil" -#: ../../Zotlabs/Module/Notify.php:57 +#: ../../Zotlabs/Module/Notify.php:61 #: ../../Zotlabs/Module/Notifications.php:38 msgid "No more system notifications." msgstr "No hay más notificaciones del sistema" -#: ../../Zotlabs/Module/Notify.php:61 +#: ../../Zotlabs/Module/Notify.php:65 #: ../../Zotlabs/Module/Notifications.php:42 msgid "System Notifications" msgstr "Notificaciones del sistema" @@ -4132,43 +4147,43 @@ msgstr "Su paquete de servicios solo permite %d canales." msgid "No channel. Import failed." msgstr "No hay canal. La importación ha fallado" -#: ../../Zotlabs/Module/Import.php:470 +#: ../../Zotlabs/Module/Import.php:481 #: ../../addon/diaspora/import_diaspora.php:142 msgid "Import completed." msgstr "Importación completada." -#: ../../Zotlabs/Module/Import.php:498 +#: ../../Zotlabs/Module/Import.php:509 msgid "You must be logged in to use this feature." msgstr "Debe estar registrado para poder usar esta funcionalidad." -#: ../../Zotlabs/Module/Import.php:503 +#: ../../Zotlabs/Module/Import.php:514 msgid "Import Channel" msgstr "Importar canal" -#: ../../Zotlabs/Module/Import.php:504 +#: ../../Zotlabs/Module/Import.php:515 msgid "" "Use this form to import an existing channel from a different server/hub. You" " may retrieve the channel identity from the old server/hub via the network " "or provide an export file." msgstr "Emplee este formulario para importar un canal desde un servidor/hub diferente. Puede recuperar el canal desde el antiguo servidor/hub a través de la red o proporcionando un fichero de exportación." -#: ../../Zotlabs/Module/Import.php:506 +#: ../../Zotlabs/Module/Import.php:517 msgid "Or provide the old server/hub details" msgstr "O proporcione los detalles de su antiguo servidor/hub" -#: ../../Zotlabs/Module/Import.php:507 +#: ../../Zotlabs/Module/Import.php:518 msgid "Your old identity address (xyz@example.com)" msgstr "Su identidad en el antiguo servidor (canal@ejemplo.com)" -#: ../../Zotlabs/Module/Import.php:508 +#: ../../Zotlabs/Module/Import.php:519 msgid "Your old login email address" msgstr "Su antigua dirección de correo electrónico" -#: ../../Zotlabs/Module/Import.php:509 +#: ../../Zotlabs/Module/Import.php:520 msgid "Your old login password" msgstr "Su antigua contraseña" -#: ../../Zotlabs/Module/Import.php:510 +#: ../../Zotlabs/Module/Import.php:521 msgid "" "For either option, please choose whether to make this hub your new primary " "address, or whether your old location should continue this role. You will be" @@ -4176,19 +4191,19 @@ msgid "" "primary location for files, photos, and media." msgstr "Para cualquiera de las opciones, elija si hacer de este servidor su nueva dirección primaria, o si su antigua dirección debe continuar con este papel. Usted podrá publicar desde cualquier ubicación, pero sólo una puede estar marcada como la ubicación principal para los ficheros, fotos y otras imágenes o vídeos." -#: ../../Zotlabs/Module/Import.php:511 +#: ../../Zotlabs/Module/Import.php:522 msgid "Make this hub my primary location" msgstr "Convertir este servidor en mi ubicación primaria" -#: ../../Zotlabs/Module/Import.php:512 +#: ../../Zotlabs/Module/Import.php:523 msgid "Move this channel (disable all previous locations)" msgstr "Mover este canal (desactivar todas las ubicaciones anteriores)" -#: ../../Zotlabs/Module/Import.php:513 +#: ../../Zotlabs/Module/Import.php:524 msgid "Import a few months of posts if possible (limited by available memory" msgstr "Importar unos meses de mensajes si es posible (limitado por la memoria disponible" -#: ../../Zotlabs/Module/Import.php:514 +#: ../../Zotlabs/Module/Import.php:525 msgid "" "This process may take several minutes to complete. Please submit the form " "only once and leave this page open until finished." @@ -4198,21 +4213,22 @@ msgstr "Este proceso puede tardar varios minutos en completarse. Por favor enví msgid "Authentication failed." msgstr "Falló la autenticación." -#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:2102 +#: ../../Zotlabs/Module/Rmagic.php:75 ../../boot.php:1640 +#: ../../include/channel.php:2204 msgid "Remote Authentication" msgstr "Acceso desde su servidor" -#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:2103 +#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:2205 msgid "Enter your channel address (e.g. channel@example.com)" msgstr "Introduzca la dirección del canal (p.ej. canal@ejemplo.com)" -#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:2104 +#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:2206 msgid "Authenticate" msgstr "Acceder" #: ../../Zotlabs/Module/Cal.php:62 ../../Zotlabs/Module/Chanview.php:96 #: ../../Zotlabs/Module/Page.php:75 ../../Zotlabs/Module/Wall_upload.php:31 -#: ../../Zotlabs/Module/Block.php:41 +#: ../../Zotlabs/Module/Block.php:41 ../../Zotlabs/Module/Card_edit.php:44 msgid "Channel not found." msgstr "Canal no encontrado." @@ -4220,7 +4236,7 @@ msgstr "Canal no encontrado." msgid "Permissions denied." msgstr "Permisos denegados." -#: ../../Zotlabs/Module/Cal.php:342 ../../include/text.php:2304 +#: ../../Zotlabs/Module/Cal.php:342 ../../include/text.php:2312 msgid "Import" msgstr "Importar" @@ -4248,11 +4264,13 @@ msgstr "Elemento no disponible" #: ../../Zotlabs/Module/Editblock.php:116 ../../Zotlabs/Module/Chat.php:207 #: ../../Zotlabs/Module/Editwebpage.php:143 ../../Zotlabs/Module/Mail.php:288 -#: ../../Zotlabs/Module/Mail.php:430 ../../include/conversation.php:1225 +#: ../../Zotlabs/Module/Mail.php:430 ../../Zotlabs/Module/Card_edit.php:101 +#: ../../include/conversation.php:1261 msgid "Insert web link" msgstr "Insertar enlace web" -#: ../../Zotlabs/Module/Editblock.php:129 ../../include/conversation.php:1336 +#: ../../Zotlabs/Module/Editblock.php:129 +#: ../../Zotlabs/Module/Card_edit.php:117 ../../include/conversation.php:1381 msgid "Title (optional)" msgstr "Título (opcional)" @@ -4264,15 +4282,15 @@ msgstr "Modificar este bloque" msgid "vcard" msgstr "vcard" -#: ../../Zotlabs/Module/Apps.php:45 ../../Zotlabs/Lib/Apps.php:224 +#: ../../Zotlabs/Module/Apps.php:47 ../../Zotlabs/Lib/Apps.php:223 msgid "Apps" msgstr "Aplicaciones (apps)" -#: ../../Zotlabs/Module/Apps.php:48 +#: ../../Zotlabs/Module/Apps.php:50 msgid "Manage apps" msgstr "Gestionar las aplicaciones" -#: ../../Zotlabs/Module/Apps.php:49 +#: ../../Zotlabs/Module/Apps.php:51 msgid "Create new app" msgstr "Crear una nueva aplicación" @@ -4282,8 +4300,7 @@ msgctxt "mood" msgid "%1$s is %2$s" msgstr "%1$s está %2$s" -#: ../../Zotlabs/Module/Mood.php:120 ../../Zotlabs/Module/Mood.php:135 -#: ../../Zotlabs/Lib/Apps.php:247 +#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:247 msgid "Mood" msgstr "Estado de ánimo" @@ -4291,12 +4308,6 @@ msgstr "Estado de ánimo" msgid "Set your current mood and tell your friends" msgstr "Describir su estado de ánimo para comunicárselo a sus amigos" -#: ../../Zotlabs/Module/Connections.php:33 -#: ../../Zotlabs/Module/Connections.php:309 ../../Zotlabs/Lib/Apps.php:229 -#: ../../include/text.php:951 ../../include/nav.php:180 -msgid "Connections" -msgstr "Conexiones" - #: ../../Zotlabs/Module/Connections.php:54 #: ../../Zotlabs/Module/Connections.php:156 #: ../../Zotlabs/Module/Connections.php:245 @@ -4318,21 +4329,22 @@ msgstr "Ocultas" #: ../../Zotlabs/Module/Connections.php:69 #: ../../Zotlabs/Module/Connections.php:170 msgid "Archived/Unreachable" -msgstr "Archivada o inaccesible" +msgstr "Archivado o inaccesible" #: ../../Zotlabs/Module/Connections.php:74 #: ../../Zotlabs/Module/Connections.php:83 ../../Zotlabs/Module/Menu.php:116 -#: ../../include/conversation.php:1663 +#: ../../include/conversation.php:1697 msgid "New" msgstr "Nuevas" #: ../../Zotlabs/Module/Connections.php:88 #: ../../Zotlabs/Module/Connections.php:102 -#: ../../Zotlabs/Module/Connedit.php:709 ../../Zotlabs/Widget/Affinity.php:30 +#: ../../Zotlabs/Module/Connedit.php:713 ../../Zotlabs/Widget/Affinity.php:30 msgid "All" msgstr "Todos/as" #: ../../Zotlabs/Module/Connections.php:133 +#: ../../Zotlabs/Widget/Notifications.php:80 msgid "New Connections" msgstr "Nuevas conexiones" @@ -4354,7 +4366,7 @@ msgstr "Mostrar solo conexiones ignoradas" #: ../../Zotlabs/Module/Connections.php:173 msgid "Only show archived/unreachable connections" -msgstr "Mostrar solo las conexiones archivadas o inaccesibles" +msgstr "Mostrar solo las conexiones archivadas o no localizables" #: ../../Zotlabs/Module/Connections.php:180 msgid "Only show hidden connections" @@ -4414,7 +4426,7 @@ msgid "Ignore connection" msgstr "Ignorar esta conexión" #: ../../Zotlabs/Module/Connections.php:284 -#: ../../Zotlabs/Module/Connedit.php:626 +#: ../../Zotlabs/Module/Connedit.php:630 msgid "Ignore" msgstr "Ignorar" @@ -4422,6 +4434,11 @@ msgstr "Ignorar" msgid "Recent activity" msgstr "Actividad reciente" +#: ../../Zotlabs/Module/Connections.php:309 ../../Zotlabs/Lib/Apps.php:229 +#: ../../include/text.php:959 ../../include/nav.php:107 +msgid "Connections" +msgstr "Conexiones" + #: ../../Zotlabs/Module/Connections.php:314 msgid "Search your connections" msgstr "Buscar sus conexiones" @@ -4444,10 +4461,6 @@ msgstr "elemento" msgid "Source of Item" msgstr "Origen del elemento" -#: ../../Zotlabs/Module/Bookmarks.php:11 ../../Zotlabs/Lib/Apps.php:227 -msgid "View Bookmarks" -msgstr "Ver los marcadores" - #: ../../Zotlabs/Module/Bookmarks.php:56 msgid "Bookmark added" msgstr "Marcador añadido" @@ -4500,7 +4513,7 @@ msgstr "Álbum no encontrado." msgid "Delete Album" msgstr "Borrar álbum" -#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1025 +#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1030 msgid "Delete Photo" msgstr "Borrar foto" @@ -4512,12 +4525,6 @@ msgstr "No hay fotos seleccionadas" msgid "Access to this item is restricted." msgstr "El acceso a este elemento está restringido." -#: ../../Zotlabs/Module/Photos.php:558 ../../Zotlabs/Module/Fbrowser.php:29 -#: ../../Zotlabs/Lib/Apps.php:242 ../../include/conversation.php:1780 -#: ../../include/nav.php:378 -msgid "Photos" -msgstr "Fotos" - #: ../../Zotlabs/Module/Photos.php:593 #, php-format msgid "%1$.2f MB of %2$.2f MB photo storage used." @@ -4552,192 +4559,192 @@ msgstr "Título (opcional):" msgid "Description (optional):" msgstr "Descripción (opcional):" -#: ../../Zotlabs/Module/Photos.php:727 +#: ../../Zotlabs/Module/Photos.php:732 msgid "Show Newest First" msgstr "Mostrar lo más reciente primero" -#: ../../Zotlabs/Module/Photos.php:729 +#: ../../Zotlabs/Module/Photos.php:734 msgid "Show Oldest First" msgstr "Mostrar lo más antiguo primero" -#: ../../Zotlabs/Module/Photos.php:834 +#: ../../Zotlabs/Module/Photos.php:839 msgid "Permission denied. Access to this item may be restricted." msgstr "Permiso denegado. El acceso a este elemento puede estar restringido." -#: ../../Zotlabs/Module/Photos.php:836 +#: ../../Zotlabs/Module/Photos.php:841 msgid "Photo not available" msgstr "Foto no disponible" -#: ../../Zotlabs/Module/Photos.php:894 +#: ../../Zotlabs/Module/Photos.php:899 msgid "Use as profile photo" msgstr "Usar como foto del perfil" -#: ../../Zotlabs/Module/Photos.php:895 +#: ../../Zotlabs/Module/Photos.php:900 msgid "Use as cover photo" msgstr "Usar como imagen de portada del perfil" -#: ../../Zotlabs/Module/Photos.php:902 +#: ../../Zotlabs/Module/Photos.php:907 msgid "Private Photo" msgstr "Foto privada" -#: ../../Zotlabs/Module/Photos.php:917 +#: ../../Zotlabs/Module/Photos.php:922 msgid "View Full Size" msgstr "Ver tamaño completo" -#: ../../Zotlabs/Module/Photos.php:999 +#: ../../Zotlabs/Module/Photos.php:1004 msgid "Edit photo" msgstr "Editar foto" -#: ../../Zotlabs/Module/Photos.php:1001 +#: ../../Zotlabs/Module/Photos.php:1006 msgid "Rotate CW (right)" msgstr "Girar CW (a la derecha)" -#: ../../Zotlabs/Module/Photos.php:1002 +#: ../../Zotlabs/Module/Photos.php:1007 msgid "Rotate CCW (left)" msgstr "Girar CCW (a la izquierda)" -#: ../../Zotlabs/Module/Photos.php:1005 +#: ../../Zotlabs/Module/Photos.php:1010 msgid "Move photo to album" msgstr "Mover la foto a un álbum" -#: ../../Zotlabs/Module/Photos.php:1006 +#: ../../Zotlabs/Module/Photos.php:1011 msgid "Enter a new album name" msgstr "Introducir un nuevo nombre de álbum" -#: ../../Zotlabs/Module/Photos.php:1007 +#: ../../Zotlabs/Module/Photos.php:1012 msgid "or select an existing one (doubleclick)" msgstr "o seleccionar uno (doble click) existente" -#: ../../Zotlabs/Module/Photos.php:1010 +#: ../../Zotlabs/Module/Photos.php:1015 msgid "Caption" msgstr "Título" -#: ../../Zotlabs/Module/Photos.php:1012 +#: ../../Zotlabs/Module/Photos.php:1017 msgid "Add a Tag" msgstr "Añadir una etiqueta" -#: ../../Zotlabs/Module/Photos.php:1020 +#: ../../Zotlabs/Module/Photos.php:1025 msgid "Example: @bob, @Barbara_Jensen, @jim@example.com" msgstr "Ejemplos: @eva, @Carmen_Osuna, @jaime@ejemplo.com" -#: ../../Zotlabs/Module/Photos.php:1023 +#: ../../Zotlabs/Module/Photos.php:1028 msgid "Flag as adult in album view" msgstr "Marcar como \"solo para adultos\" en el álbum" -#: ../../Zotlabs/Module/Photos.php:1042 ../../Zotlabs/Lib/ThreadItem.php:267 +#: ../../Zotlabs/Module/Photos.php:1047 ../../Zotlabs/Lib/ThreadItem.php:271 msgid "I like this (toggle)" msgstr "Me gusta (cambiar)" -#: ../../Zotlabs/Module/Photos.php:1043 ../../Zotlabs/Lib/ThreadItem.php:268 +#: ../../Zotlabs/Module/Photos.php:1048 ../../Zotlabs/Lib/ThreadItem.php:272 msgid "I don't like this (toggle)" msgstr "No me gusta esto (cambiar)" -#: ../../Zotlabs/Module/Photos.php:1045 ../../Zotlabs/Lib/ThreadItem.php:410 -#: ../../include/conversation.php:736 +#: ../../Zotlabs/Module/Photos.php:1050 ../../Zotlabs/Lib/ThreadItem.php:416 +#: ../../include/conversation.php:768 msgid "Please wait" msgstr "Espere por favor" -#: ../../Zotlabs/Module/Photos.php:1061 ../../Zotlabs/Module/Photos.php:1179 -#: ../../Zotlabs/Lib/ThreadItem.php:727 +#: ../../Zotlabs/Module/Photos.php:1066 ../../Zotlabs/Module/Photos.php:1184 +#: ../../Zotlabs/Lib/ThreadItem.php:740 msgid "This is you" msgstr "Este es usted" -#: ../../Zotlabs/Module/Photos.php:1063 ../../Zotlabs/Module/Photos.php:1181 -#: ../../Zotlabs/Lib/ThreadItem.php:729 ../../include/js_strings.php:6 +#: ../../Zotlabs/Module/Photos.php:1068 ../../Zotlabs/Module/Photos.php:1186 +#: ../../Zotlabs/Lib/ThreadItem.php:742 ../../include/js_strings.php:6 msgid "Comment" msgstr "Comentar" -#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:569 +#: ../../Zotlabs/Module/Photos.php:1084 ../../include/conversation.php:594 msgctxt "title" msgid "Likes" msgstr "Me gusta" -#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:569 +#: ../../Zotlabs/Module/Photos.php:1084 ../../include/conversation.php:594 msgctxt "title" msgid "Dislikes" msgstr "No me gusta" -#: ../../Zotlabs/Module/Photos.php:1080 ../../include/conversation.php:570 +#: ../../Zotlabs/Module/Photos.php:1085 ../../include/conversation.php:595 msgctxt "title" msgid "Agree" msgstr "De acuerdo" -#: ../../Zotlabs/Module/Photos.php:1080 ../../include/conversation.php:570 +#: ../../Zotlabs/Module/Photos.php:1085 ../../include/conversation.php:595 msgctxt "title" msgid "Disagree" msgstr "En desacuerdo" -#: ../../Zotlabs/Module/Photos.php:1080 ../../include/conversation.php:570 +#: ../../Zotlabs/Module/Photos.php:1085 ../../include/conversation.php:595 msgctxt "title" msgid "Abstain" msgstr "Abstención" -#: ../../Zotlabs/Module/Photos.php:1081 ../../include/conversation.php:571 +#: ../../Zotlabs/Module/Photos.php:1086 ../../include/conversation.php:596 msgctxt "title" msgid "Attending" msgstr "Participaré" -#: ../../Zotlabs/Module/Photos.php:1081 ../../include/conversation.php:571 +#: ../../Zotlabs/Module/Photos.php:1086 ../../include/conversation.php:596 msgctxt "title" msgid "Not attending" msgstr "No participaré" -#: ../../Zotlabs/Module/Photos.php:1081 ../../include/conversation.php:571 +#: ../../Zotlabs/Module/Photos.php:1086 ../../include/conversation.php:596 msgctxt "title" msgid "Might attend" msgstr "Quizá participe" -#: ../../Zotlabs/Module/Photos.php:1098 ../../Zotlabs/Module/Photos.php:1110 -#: ../../Zotlabs/Lib/ThreadItem.php:187 ../../Zotlabs/Lib/ThreadItem.php:199 +#: ../../Zotlabs/Module/Photos.php:1103 ../../Zotlabs/Module/Photos.php:1115 +#: ../../Zotlabs/Lib/ThreadItem.php:191 ../../Zotlabs/Lib/ThreadItem.php:203 msgid "View all" msgstr "Ver todo" -#: ../../Zotlabs/Module/Photos.php:1102 ../../Zotlabs/Lib/ThreadItem.php:191 -#: ../../include/conversation.php:1904 ../../include/channel.php:1391 -#: ../../include/taxonomy.php:442 +#: ../../Zotlabs/Module/Photos.php:1107 ../../Zotlabs/Lib/ThreadItem.php:195 +#: ../../include/conversation.php:1950 ../../include/channel.php:1491 +#: ../../include/taxonomy.php:520 msgctxt "noun" msgid "Like" msgid_plural "Likes" msgstr[0] "Me gusta" msgstr[1] "Me gusta" -#: ../../Zotlabs/Module/Photos.php:1107 ../../Zotlabs/Lib/ThreadItem.php:196 -#: ../../include/conversation.php:1907 +#: ../../Zotlabs/Module/Photos.php:1112 ../../Zotlabs/Lib/ThreadItem.php:200 +#: ../../include/conversation.php:1953 msgctxt "noun" msgid "Dislike" msgid_plural "Dislikes" msgstr[0] "No me gusta" msgstr[1] "No me gusta" -#: ../../Zotlabs/Module/Photos.php:1207 +#: ../../Zotlabs/Module/Photos.php:1212 msgid "Photo Tools" msgstr "Gestión de las fotos" -#: ../../Zotlabs/Module/Photos.php:1216 +#: ../../Zotlabs/Module/Photos.php:1221 msgid "In This Photo:" msgstr "En esta foto:" -#: ../../Zotlabs/Module/Photos.php:1221 +#: ../../Zotlabs/Module/Photos.php:1226 msgid "Map" msgstr "Mapa" -#: ../../Zotlabs/Module/Photos.php:1229 ../../Zotlabs/Lib/ThreadItem.php:399 +#: ../../Zotlabs/Module/Photos.php:1234 ../../Zotlabs/Lib/ThreadItem.php:404 msgctxt "noun" msgid "Likes" msgstr "Me gusta" -#: ../../Zotlabs/Module/Photos.php:1230 ../../Zotlabs/Lib/ThreadItem.php:400 +#: ../../Zotlabs/Module/Photos.php:1235 ../../Zotlabs/Lib/ThreadItem.php:405 msgctxt "noun" msgid "Dislikes" msgstr "No me gusta" -#: ../../Zotlabs/Module/Photos.php:1235 ../../Zotlabs/Lib/ThreadItem.php:405 +#: ../../Zotlabs/Module/Photos.php:1240 ../../Zotlabs/Lib/ThreadItem.php:410 #: ../../include/acl_selectors.php:220 msgid "Close" msgstr "Cerrar" -#: ../../Zotlabs/Module/Photos.php:1307 ../../Zotlabs/Module/Photos.php:1320 -#: ../../Zotlabs/Module/Photos.php:1321 ../../include/photos.php:526 +#: ../../Zotlabs/Module/Photos.php:1312 ../../Zotlabs/Module/Photos.php:1325 +#: ../../Zotlabs/Module/Photos.php:1326 ../../include/photos.php:601 msgid "Recent Photos" msgstr "Fotos recientes" @@ -4753,165 +4760,206 @@ msgstr "No encontrado" msgid "Invalid channel" msgstr "Canal no válido" -#: ../../Zotlabs/Module/Wiki.php:79 ../../Zotlabs/Lib/Apps.php:239 -#: ../../include/conversation.php:1854 ../../include/features.php:95 -#: ../../include/nav.php:451 -msgid "Wiki" -msgstr "Wiki" +#: ../../Zotlabs/Module/Wiki.php:124 ../../addon/gitwiki/Mod_Gitwiki.php:107 +msgid "Error retrieving wiki" +msgstr "Error al recuperar el wiki" + +#: ../../Zotlabs/Module/Wiki.php:131 ../../addon/gitwiki/Mod_Gitwiki.php:114 +msgid "Error creating zip file export folder" +msgstr "Error al crear el fichero comprimido zip de la carpeta a exportar" + +#: ../../Zotlabs/Module/Wiki.php:182 ../../addon/gitwiki/Mod_Gitwiki.php:132 +msgid "Error downloading wiki: " +msgstr "Error al descargar el wiki: " -#: ../../Zotlabs/Module/Wiki.php:162 ../../addon/gitwiki/Mod_Gitwiki.php:146 -#: ../../include/conversation.php:1851 ../../include/nav.php:448 +#: ../../Zotlabs/Module/Wiki.php:197 ../../addon/gitwiki/Mod_Gitwiki.php:146 +#: ../../include/conversation.php:1897 ../../include/nav.php:504 msgid "Wikis" msgstr "Wikis" -#: ../../Zotlabs/Module/Wiki.php:168 ../../addon/gitwiki/Mod_Gitwiki.php:152 +#: ../../Zotlabs/Module/Wiki.php:203 ../../addon/gitwiki/Mod_Gitwiki.php:152 msgid "Download" msgstr "Descargar" -#: ../../Zotlabs/Module/Wiki.php:170 ../../Zotlabs/Module/Chat.php:256 +#: ../../Zotlabs/Module/Wiki.php:205 ../../Zotlabs/Module/Chat.php:256 #: ../../Zotlabs/Module/Profiles.php:834 ../../Zotlabs/Module/Manage.php:145 #: ../../addon/gitwiki/Mod_Gitwiki.php:154 msgid "Create New" msgstr "Crear" -#: ../../Zotlabs/Module/Wiki.php:172 ../../addon/gitwiki/Mod_Gitwiki.php:156 +#: ../../Zotlabs/Module/Wiki.php:207 ../../addon/gitwiki/Mod_Gitwiki.php:156 msgid "Wiki name" msgstr "Nombre del wiki" -#: ../../Zotlabs/Module/Wiki.php:173 ../../addon/gitwiki/Mod_Gitwiki.php:157 +#: ../../Zotlabs/Module/Wiki.php:208 ../../addon/gitwiki/Mod_Gitwiki.php:157 msgid "Content type" msgstr "Tipo de contenido" -#: ../../Zotlabs/Module/Wiki.php:175 ../../Zotlabs/Storage/Browser.php:235 +#: ../../Zotlabs/Module/Wiki.php:208 ../../Zotlabs/Module/Wiki.php:336 +#: ../../Zotlabs/Widget/Wiki_pages.php:57 ../../include/text.php:1802 +msgid "Markdown" +msgstr "Markdown" + +#: ../../Zotlabs/Module/Wiki.php:208 ../../Zotlabs/Module/Wiki.php:336 +#: ../../Zotlabs/Widget/Wiki_pages.php:57 ../../include/text.php:1800 +msgid "BBcode" +msgstr "BBcode" + +#: ../../Zotlabs/Module/Wiki.php:208 ../../Zotlabs/Widget/Wiki_pages.php:57 +#: ../../include/text.php:1803 +msgid "Text" +msgstr "Texto" + +#: ../../Zotlabs/Module/Wiki.php:210 ../../Zotlabs/Storage/Browser.php:235 #: ../../addon/gitwiki/Mod_Gitwiki.php:159 msgid "Type" msgstr "Tipo" -#: ../../Zotlabs/Module/Wiki.php:182 ../../addon/gitwiki/Mod_Gitwiki.php:166 +#: ../../Zotlabs/Module/Wiki.php:211 +msgid "Any type" +msgstr "Cualquier tipo" + +#: ../../Zotlabs/Module/Wiki.php:218 +msgid "Lock content type" +msgstr "Tipo de contenido bloqueado" + +#: ../../Zotlabs/Module/Wiki.php:219 ../../addon/gitwiki/Mod_Gitwiki.php:166 msgid "Create a status post for this wiki" msgstr "Crear un mensaje de estado para este wiki" -#: ../../Zotlabs/Module/Wiki.php:224 ../../addon/gitwiki/Mod_Gitwiki.php:185 +#: ../../Zotlabs/Module/Wiki.php:220 +msgid "Edit Wiki Name" +msgstr "Editar el nombre del wiki" + +#: ../../Zotlabs/Module/Wiki.php:262 ../../addon/gitwiki/Mod_Gitwiki.php:185 msgid "Wiki not found" msgstr "Wiki no encontrado" -#: ../../Zotlabs/Module/Wiki.php:248 ../../addon/gitwiki/Mod_Gitwiki.php:210 +#: ../../Zotlabs/Module/Wiki.php:286 ../../addon/gitwiki/Mod_Gitwiki.php:210 msgid "Rename page" msgstr "Renombrar la página" -#: ../../Zotlabs/Module/Wiki.php:258 ../../addon/gitwiki/Mod_Gitwiki.php:214 +#: ../../Zotlabs/Module/Wiki.php:296 ../../addon/gitwiki/Mod_Gitwiki.php:214 msgid "Error retrieving page content" msgstr "Error al recuperar el contenido de la página" -#: ../../Zotlabs/Module/Wiki.php:264 +#: ../../Zotlabs/Module/Wiki.php:302 ../../Zotlabs/Module/Wiki.php:304 msgid "New page" msgstr "Nueva página" -#: ../../Zotlabs/Module/Wiki.php:288 ../../addon/gitwiki/Mod_Gitwiki.php:242 +#: ../../Zotlabs/Module/Wiki.php:331 ../../addon/gitwiki/Mod_Gitwiki.php:242 msgid "Revision Comparison" msgstr "Comparación de revisiones" -#: ../../Zotlabs/Module/Wiki.php:289 ../../addon/gitwiki/Mod_Gitwiki.php:243 +#: ../../Zotlabs/Module/Wiki.php:332 ../../addon/gitwiki/Mod_Gitwiki.php:243 msgid "Revert" msgstr "Revertir" -#: ../../Zotlabs/Module/Wiki.php:293 +#: ../../Zotlabs/Module/Wiki.php:339 msgid "Short description of your changes (optional)" msgstr "Breve descripción de sus cambios (opcional)" -#: ../../Zotlabs/Module/Wiki.php:300 ../../addon/gitwiki/Mod_Gitwiki.php:252 +#: ../../Zotlabs/Module/Wiki.php:346 ../../addon/gitwiki/Mod_Gitwiki.php:252 msgid "Source" msgstr "Fuente" -#: ../../Zotlabs/Module/Wiki.php:309 ../../addon/gitwiki/Mod_Gitwiki.php:260 +#: ../../Zotlabs/Module/Wiki.php:356 ../../addon/gitwiki/Mod_Gitwiki.php:260 msgid "New page name" msgstr "Nombre de la nueva página" -#: ../../Zotlabs/Module/Wiki.php:314 ../../addon/gitwiki/Mod_Gitwiki.php:265 -#: ../../include/conversation.php:1229 +#: ../../Zotlabs/Module/Wiki.php:361 ../../addon/gitwiki/Mod_Gitwiki.php:265 +#: ../../include/conversation.php:1265 msgid "Embed image from photo albums" msgstr "Incluir una imagen de los álbumes de fotos" -#: ../../Zotlabs/Module/Wiki.php:315 ../../addon/gitwiki/Mod_Gitwiki.php:266 -#: ../../include/conversation.php:1323 +#: ../../Zotlabs/Module/Wiki.php:362 ../../addon/gitwiki/Mod_Gitwiki.php:266 +#: ../../include/conversation.php:1368 msgid "Embed an image from your albums" msgstr "Incluir una imagen de sus álbumes" -#: ../../Zotlabs/Module/Wiki.php:317 ../../addon/gitwiki/Mod_Gitwiki.php:268 -#: ../../include/conversation.php:1325 ../../include/conversation.php:1372 +#: ../../Zotlabs/Module/Wiki.php:364 ../../addon/gitwiki/Mod_Gitwiki.php:268 +#: ../../include/conversation.php:1370 ../../include/conversation.php:1417 msgid "OK" msgstr "OK" -#: ../../Zotlabs/Module/Wiki.php:318 ../../addon/gitwiki/Mod_Gitwiki.php:269 -#: ../../include/conversation.php:1265 +#: ../../Zotlabs/Module/Wiki.php:365 ../../addon/gitwiki/Mod_Gitwiki.php:269 +#: ../../include/conversation.php:1301 msgid "Choose images to embed" msgstr "Elegir imágenes para incluir" -#: ../../Zotlabs/Module/Wiki.php:319 ../../addon/gitwiki/Mod_Gitwiki.php:270 -#: ../../include/conversation.php:1266 +#: ../../Zotlabs/Module/Wiki.php:366 ../../addon/gitwiki/Mod_Gitwiki.php:270 +#: ../../include/conversation.php:1302 msgid "Choose an album" msgstr "Elegir un álbum" -#: ../../Zotlabs/Module/Wiki.php:320 ../../addon/gitwiki/Mod_Gitwiki.php:271 +#: ../../Zotlabs/Module/Wiki.php:367 ../../addon/gitwiki/Mod_Gitwiki.php:271 msgid "Choose a different album" msgstr "Elegir un álbum diferente..." -#: ../../Zotlabs/Module/Wiki.php:321 ../../addon/gitwiki/Mod_Gitwiki.php:272 -#: ../../include/conversation.php:1268 +#: ../../Zotlabs/Module/Wiki.php:368 ../../addon/gitwiki/Mod_Gitwiki.php:272 +#: ../../include/conversation.php:1304 msgid "Error getting album list" msgstr "Error al obtener la lista de álbumes" -#: ../../Zotlabs/Module/Wiki.php:322 ../../addon/gitwiki/Mod_Gitwiki.php:273 -#: ../../include/conversation.php:1269 +#: ../../Zotlabs/Module/Wiki.php:369 ../../addon/gitwiki/Mod_Gitwiki.php:273 +#: ../../include/conversation.php:1305 msgid "Error getting photo link" msgstr "Error al obtener el enlace de la foto" -#: ../../Zotlabs/Module/Wiki.php:323 ../../addon/gitwiki/Mod_Gitwiki.php:274 -#: ../../include/conversation.php:1270 +#: ../../Zotlabs/Module/Wiki.php:370 ../../addon/gitwiki/Mod_Gitwiki.php:274 +#: ../../include/conversation.php:1306 msgid "Error getting album" msgstr "Error al obtener el álbum" -#: ../../Zotlabs/Module/Wiki.php:391 ../../addon/gitwiki/Mod_Gitwiki.php:337 +#: ../../Zotlabs/Module/Wiki.php:442 ../../addon/gitwiki/Mod_Gitwiki.php:337 msgid "Error creating wiki. Invalid name." msgstr "Error al crear el wiki: el nombre no es válido." -#: ../../Zotlabs/Module/Wiki.php:398 +#: ../../Zotlabs/Module/Wiki.php:449 msgid "A wiki with this name already exists." msgstr "Ya hay un wiki con este nombre." -#: ../../Zotlabs/Module/Wiki.php:411 ../../addon/gitwiki/Mod_Gitwiki.php:348 +#: ../../Zotlabs/Module/Wiki.php:462 ../../addon/gitwiki/Mod_Gitwiki.php:348 msgid "Wiki created, but error creating Home page." msgstr "Se ha creado el wiki, pero se ha producido un error al crear la página de inicio." -#: ../../Zotlabs/Module/Wiki.php:418 ../../addon/gitwiki/Mod_Gitwiki.php:353 +#: ../../Zotlabs/Module/Wiki.php:469 ../../addon/gitwiki/Mod_Gitwiki.php:353 msgid "Error creating wiki" msgstr "Error al crear el wiki" -#: ../../Zotlabs/Module/Wiki.php:430 +#: ../../Zotlabs/Module/Wiki.php:492 +msgid "Error updating wiki. Invalid name." +msgstr "Error al actualizar el wiki. Nombre no válido." + +#: ../../Zotlabs/Module/Wiki.php:512 +msgid "Error updating wiki" +msgstr "Error al actualizar el wiki" + +#: ../../Zotlabs/Module/Wiki.php:527 msgid "Wiki delete permission denied." msgstr "Se ha denegado el permiso para eliminar el wiki." -#: ../../Zotlabs/Module/Wiki.php:440 +#: ../../Zotlabs/Module/Wiki.php:537 msgid "Error deleting wiki" msgstr "Se ha producido un error al eliminar el wiki" -#: ../../Zotlabs/Module/Wiki.php:466 ../../addon/gitwiki/Mod_Gitwiki.php:400 +#: ../../Zotlabs/Module/Wiki.php:565 ../../addon/gitwiki/Mod_Gitwiki.php:400 msgid "New page created" msgstr "Se ha creado la nueva página" -#: ../../Zotlabs/Module/Wiki.php:587 +#: ../../Zotlabs/Module/Wiki.php:686 msgid "Cannot delete Home" msgstr "No se puede eliminar la página principal" -#: ../../Zotlabs/Module/Wiki.php:651 +#: ../../Zotlabs/Module/Wiki.php:750 msgid "Current Revision" msgstr "Revisión actual" -#: ../../Zotlabs/Module/Wiki.php:651 +#: ../../Zotlabs/Module/Wiki.php:750 msgid "Selected Revision" msgstr "Revisión seleccionada" -#: ../../Zotlabs/Module/Wiki.php:701 +#: ../../Zotlabs/Module/Wiki.php:800 msgid "You must be authenticated." msgstr "Debe estar autenticado." @@ -4927,24 +4975,36 @@ msgstr "Plantilla actualizada." msgid "Feature disabled." msgstr "Funcionalidad deshabilitada." -#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69 +#: ../../Zotlabs/Module/Pdledit.php:47 ../../Zotlabs/Module/Pdledit.php:88 msgid "Edit System Page Description" msgstr "Editor del Sistema de Descripción de Páginas" -#: ../../Zotlabs/Module/Pdledit.php:64 +#: ../../Zotlabs/Module/Pdledit.php:68 +msgid "(modified)" +msgstr "(modificado)" + +#: ../../Zotlabs/Module/Pdledit.php:68 ../../Zotlabs/Module/Lostpass.php:133 +msgid "Reset" +msgstr "Reiniciar" + +#: ../../Zotlabs/Module/Pdledit.php:83 msgid "Layout not found." msgstr "Plantilla no encontrada" -#: ../../Zotlabs/Module/Pdledit.php:70 +#: ../../Zotlabs/Module/Pdledit.php:89 msgid "Module Name:" msgstr "Nombre del módulo:" -#: ../../Zotlabs/Module/Pdledit.php:71 +#: ../../Zotlabs/Module/Pdledit.php:90 msgid "Layout Help" msgstr "Ayuda para el diseño de plantillas de página" -#: ../../Zotlabs/Module/Poke.php:153 ../../Zotlabs/Module/Poke.php:182 -#: ../../Zotlabs/Lib/Apps.php:248 ../../include/conversation.php:1039 +#: ../../Zotlabs/Module/Pdledit.php:91 +msgid "Edit another layout" +msgstr "Editar otro diseño" + +#: ../../Zotlabs/Module/Poke.php:182 ../../Zotlabs/Lib/Apps.php:248 +#: ../../include/conversation.php:1075 msgid "Poke" msgstr "Toques y otras cosas" @@ -4978,8 +5038,8 @@ msgid "Image uploaded but image cropping failed." msgstr "Imagen actualizada, pero el recorte de la imagen ha fallado. " #: ../../Zotlabs/Module/Profile_photo.php:115 -#: ../../Zotlabs/Module/Profile_photo.php:226 -#: ../../include/photo/photo_driver.php:658 +#: ../../Zotlabs/Module/Profile_photo.php:234 +#: ../../include/photo/photo_driver.php:710 msgid "Profile Photos" msgstr "Fotos del perfil" @@ -4988,80 +5048,80 @@ msgstr "Fotos del perfil" msgid "Image resize failed." msgstr "El ajuste del tamaño de la imagen ha fallado." -#: ../../Zotlabs/Module/Profile_photo.php:196 +#: ../../Zotlabs/Module/Profile_photo.php:204 #: ../../addon/openclipatar/openclipatar.php:298 msgid "" "Shift-reload the page or clear browser cache if the new photo does not " "display immediately." msgstr "Recargue la página o limpie el caché del navegador si la nueva foto no se muestra inmediatamente." -#: ../../Zotlabs/Module/Profile_photo.php:203 -#: ../../Zotlabs/Module/Cover_photo.php:173 ../../include/photos.php:145 +#: ../../Zotlabs/Module/Profile_photo.php:211 +#: ../../Zotlabs/Module/Cover_photo.php:173 ../../include/photos.php:156 msgid "Unable to process image" msgstr "No ha sido posible procesar la imagen" -#: ../../Zotlabs/Module/Profile_photo.php:238 +#: ../../Zotlabs/Module/Profile_photo.php:246 #: ../../Zotlabs/Module/Cover_photo.php:197 msgid "Image upload failed." msgstr "La carga de la imagen ha fallado." -#: ../../Zotlabs/Module/Profile_photo.php:257 +#: ../../Zotlabs/Module/Profile_photo.php:265 #: ../../Zotlabs/Module/Cover_photo.php:214 msgid "Unable to process image." msgstr "No ha sido posible procesar la imagen." -#: ../../Zotlabs/Module/Profile_photo.php:318 -#: ../../Zotlabs/Module/Profile_photo.php:365 +#: ../../Zotlabs/Module/Profile_photo.php:326 +#: ../../Zotlabs/Module/Profile_photo.php:373 #: ../../Zotlabs/Module/Cover_photo.php:307 #: ../../Zotlabs/Module/Cover_photo.php:322 msgid "Photo not available." msgstr "Foto no disponible." -#: ../../Zotlabs/Module/Profile_photo.php:420 +#: ../../Zotlabs/Module/Profile_photo.php:428 #: ../../Zotlabs/Module/Cover_photo.php:358 msgid "Upload File:" msgstr "Subir fichero:" -#: ../../Zotlabs/Module/Profile_photo.php:421 +#: ../../Zotlabs/Module/Profile_photo.php:429 #: ../../Zotlabs/Module/Cover_photo.php:359 msgid "Select a profile:" msgstr "Seleccionar un perfil:" -#: ../../Zotlabs/Module/Profile_photo.php:422 +#: ../../Zotlabs/Module/Profile_photo.php:430 msgid "Use Photo for Profile" msgstr "Usar la fotografía para el perfil" -#: ../../Zotlabs/Module/Profile_photo.php:422 +#: ../../Zotlabs/Module/Profile_photo.php:430 msgid "Upload Profile Photo" msgstr "Subir foto de perfil" -#: ../../Zotlabs/Module/Profile_photo.php:423 +#: ../../Zotlabs/Module/Profile_photo.php:431 #: ../../addon/openclipatar/openclipatar.php:182 #: ../../addon/openclipatar/openclipatar.php:194 msgid "Use" msgstr "Usar" -#: ../../Zotlabs/Module/Profile_photo.php:429 +#: ../../Zotlabs/Module/Profile_photo.php:437 #: ../../Zotlabs/Module/Cover_photo.php:365 msgid "skip this step" msgstr "Omitir este paso" -#: ../../Zotlabs/Module/Profile_photo.php:429 +#: ../../Zotlabs/Module/Profile_photo.php:437 #: ../../Zotlabs/Module/Cover_photo.php:365 msgid "select a photo from your photo albums" msgstr "Seleccione una foto de sus álbumes de fotos" -#: ../../Zotlabs/Module/Profile_photo.php:448 +#: ../../Zotlabs/Module/Profile_photo.php:456 #: ../../Zotlabs/Module/Cover_photo.php:381 msgid "Crop Image" msgstr "Recortar imagen" -#: ../../Zotlabs/Module/Profile_photo.php:449 +#: ../../Zotlabs/Module/Profile_photo.php:457 #: ../../Zotlabs/Module/Cover_photo.php:382 msgid "Please adjust the image cropping for optimum viewing." msgstr "Por favor ajuste el recorte de la imagen para una visión óptima." -#: ../../Zotlabs/Module/Profile_photo.php:451 +#: ../../Zotlabs/Module/Profile_photo.php:459 #: ../../Zotlabs/Module/Cover_photo.php:384 msgid "Done Editing" msgstr "Edición completada" @@ -5090,60 +5150,68 @@ msgstr "No ha sido posible encontrar la entrada original." msgid "Empty post discarded." msgstr "La entrada vacía ha sido desechada." -#: ../../Zotlabs/Module/Item.php:844 +#: ../../Zotlabs/Module/Item.php:870 msgid "Duplicate post suppressed." msgstr "Se ha suprimido la entrada duplicada." -#: ../../Zotlabs/Module/Item.php:989 +#: ../../Zotlabs/Module/Item.php:1015 msgid "System error. Post not saved." msgstr "Error del sistema. La entrada no se ha podido salvar." -#: ../../Zotlabs/Module/Item.php:1025 +#: ../../Zotlabs/Module/Item.php:1051 msgid "Your comment is awaiting approval." msgstr "Su comentario está pendiente de aprobación." -#: ../../Zotlabs/Module/Item.php:1123 +#: ../../Zotlabs/Module/Item.php:1156 msgid "Unable to obtain post information from database." msgstr "No ha sido posible obtener información de la entrada en la base de datos." -#: ../../Zotlabs/Module/Item.php:1130 +#: ../../Zotlabs/Module/Item.php:1163 #, php-format msgid "You have reached your limit of %1$.0f top level posts." msgstr "Ha alcanzado su límite de %1$.0f entradas en la página principal." -#: ../../Zotlabs/Module/Item.php:1137 +#: ../../Zotlabs/Module/Item.php:1170 #, php-format msgid "You have reached your limit of %1$.0f webpages." msgstr "Ha alcanzado su límite de %1$.0f páginas web." -#: ../../Zotlabs/Module/Ping.php:280 +#: ../../Zotlabs/Module/Ping.php:318 msgid "sent you a private message" msgstr "le ha enviado un mensaje privado" -#: ../../Zotlabs/Module/Ping.php:331 +#: ../../Zotlabs/Module/Ping.php:369 msgid "added your channel" msgstr "añadió este canal a sus conexiones" -#: ../../Zotlabs/Module/Ping.php:341 +#: ../../Zotlabs/Module/Ping.php:393 +msgid "requires approval" +msgstr "requiere aprobación" + +#: ../../Zotlabs/Module/Ping.php:403 msgid "g A l F d" msgstr "g A l d F" -#: ../../Zotlabs/Module/Ping.php:359 +#: ../../Zotlabs/Module/Ping.php:421 msgid "[today]" msgstr "[hoy]" -#: ../../Zotlabs/Module/Ping.php:368 +#: ../../Zotlabs/Module/Ping.php:430 msgid "posted an event" msgstr "publicó un evento" +#: ../../Zotlabs/Module/Ping.php:463 +msgid "shared a file with you" +msgstr "compartió un archivo con usted" + #: ../../Zotlabs/Module/Page.php:39 ../../Zotlabs/Module/Block.php:29 msgid "Invalid item." msgstr "Elemento no válido." #: ../../Zotlabs/Module/Page.php:128 ../../Zotlabs/Module/Block.php:77 -#: ../../Zotlabs/Module/Display.php:122 -#: ../../Zotlabs/Lib/NativeWikiPage.php:500 ../../Zotlabs/Web/Router.php:146 -#: ../../include/help.php:68 +#: ../../Zotlabs/Module/Display.php:120 +#: ../../Zotlabs/Lib/NativeWikiPage.php:515 ../../Zotlabs/Web/Router.php:158 +#: ../../include/help.php:81 msgid "Page not found." msgstr "Página no encontrada." @@ -5173,293 +5241,293 @@ msgstr "Conexión actualizada." msgid "Failed to update connection record." msgstr "Error al actualizar el registro de la conexión." -#: ../../Zotlabs/Module/Connedit.php:298 +#: ../../Zotlabs/Module/Connedit.php:302 msgid "is now connected to" msgstr "ahora está conectado/a" -#: ../../Zotlabs/Module/Connedit.php:423 +#: ../../Zotlabs/Module/Connedit.php:427 msgid "Could not access address book record." msgstr "No se pudo acceder al registro en su libreta de direcciones." -#: ../../Zotlabs/Module/Connedit.php:471 +#: ../../Zotlabs/Module/Connedit.php:475 msgid "Refresh failed - channel is currently unavailable." msgstr "Recarga fallida - no se puede encontrar el canal en este momento." -#: ../../Zotlabs/Module/Connedit.php:486 ../../Zotlabs/Module/Connedit.php:495 -#: ../../Zotlabs/Module/Connedit.php:504 ../../Zotlabs/Module/Connedit.php:513 -#: ../../Zotlabs/Module/Connedit.php:526 +#: ../../Zotlabs/Module/Connedit.php:490 ../../Zotlabs/Module/Connedit.php:499 +#: ../../Zotlabs/Module/Connedit.php:508 ../../Zotlabs/Module/Connedit.php:517 +#: ../../Zotlabs/Module/Connedit.php:530 msgid "Unable to set address book parameters." msgstr "No ha sido posible establecer los parámetros de la libreta de direcciones." -#: ../../Zotlabs/Module/Connedit.php:550 +#: ../../Zotlabs/Module/Connedit.php:554 msgid "Connection has been removed." msgstr "La conexión ha sido eliminada." -#: ../../Zotlabs/Module/Connedit.php:590 ../../Zotlabs/Lib/Apps.php:241 +#: ../../Zotlabs/Module/Connedit.php:594 ../../Zotlabs/Lib/Apps.php:241 #: ../../addon/openclipatar/openclipatar.php:57 -#: ../../include/conversation.php:979 ../../include/nav.php:102 +#: ../../include/conversation.php:1015 ../../include/nav.php:141 msgid "View Profile" msgstr "Ver el perfil" -#: ../../Zotlabs/Module/Connedit.php:593 +#: ../../Zotlabs/Module/Connedit.php:597 #, php-format msgid "View %s's profile" msgstr "Ver el perfil de %s" -#: ../../Zotlabs/Module/Connedit.php:597 +#: ../../Zotlabs/Module/Connedit.php:601 msgid "Refresh Permissions" msgstr "Recargar los permisos" -#: ../../Zotlabs/Module/Connedit.php:600 +#: ../../Zotlabs/Module/Connedit.php:604 msgid "Fetch updated permissions" msgstr "Obtener los permisos actualizados" -#: ../../Zotlabs/Module/Connedit.php:604 +#: ../../Zotlabs/Module/Connedit.php:608 msgid "Refresh Photo" msgstr "Actualizar la foto" -#: ../../Zotlabs/Module/Connedit.php:607 +#: ../../Zotlabs/Module/Connedit.php:611 msgid "Fetch updated photo" msgstr "Obtener una foto actualizada" -#: ../../Zotlabs/Module/Connedit.php:611 +#: ../../Zotlabs/Module/Connedit.php:615 msgid "Recent Activity" msgstr "Actividad reciente" -#: ../../Zotlabs/Module/Connedit.php:614 +#: ../../Zotlabs/Module/Connedit.php:618 msgid "View recent posts and comments" msgstr "Ver publicaciones y comentarios recientes" -#: ../../Zotlabs/Module/Connedit.php:621 +#: ../../Zotlabs/Module/Connedit.php:625 msgid "Block (or Unblock) all communications with this connection" msgstr "Bloquear (o desbloquear) todas las comunicaciones con esta conexión" -#: ../../Zotlabs/Module/Connedit.php:622 +#: ../../Zotlabs/Module/Connedit.php:626 msgid "This connection is blocked!" msgstr "¡Esta conexión está bloqueada!" -#: ../../Zotlabs/Module/Connedit.php:626 +#: ../../Zotlabs/Module/Connedit.php:630 msgid "Unignore" msgstr "Dejar de ignorar" -#: ../../Zotlabs/Module/Connedit.php:629 +#: ../../Zotlabs/Module/Connedit.php:633 msgid "Ignore (or Unignore) all inbound communications from this connection" msgstr "Ignorar (o dejar de ignorar) todas las comunicaciones entrantes de esta conexión" -#: ../../Zotlabs/Module/Connedit.php:630 +#: ../../Zotlabs/Module/Connedit.php:634 msgid "This connection is ignored!" msgstr "¡Esta conexión es ignorada!" -#: ../../Zotlabs/Module/Connedit.php:634 +#: ../../Zotlabs/Module/Connedit.php:638 msgid "Unarchive" msgstr "Desarchivar" -#: ../../Zotlabs/Module/Connedit.php:634 +#: ../../Zotlabs/Module/Connedit.php:638 msgid "Archive" msgstr "Archivar" -#: ../../Zotlabs/Module/Connedit.php:637 +#: ../../Zotlabs/Module/Connedit.php:641 msgid "" "Archive (or Unarchive) this connection - mark channel dead but keep content" msgstr "Archiva (o desarchiva) esta conexión - marca el canal como muerto aunque mantiene sus contenidos" -#: ../../Zotlabs/Module/Connedit.php:638 +#: ../../Zotlabs/Module/Connedit.php:642 msgid "This connection is archived!" msgstr "¡Esta conexión esta archivada!" -#: ../../Zotlabs/Module/Connedit.php:642 +#: ../../Zotlabs/Module/Connedit.php:646 msgid "Unhide" msgstr "Mostrar" -#: ../../Zotlabs/Module/Connedit.php:642 +#: ../../Zotlabs/Module/Connedit.php:646 msgid "Hide" msgstr "Ocultar" -#: ../../Zotlabs/Module/Connedit.php:645 +#: ../../Zotlabs/Module/Connedit.php:649 msgid "Hide or Unhide this connection from your other connections" msgstr "Ocultar o mostrar esta conexión a sus otras conexiones" -#: ../../Zotlabs/Module/Connedit.php:646 +#: ../../Zotlabs/Module/Connedit.php:650 msgid "This connection is hidden!" msgstr "¡Esta conexión está oculta!" -#: ../../Zotlabs/Module/Connedit.php:653 +#: ../../Zotlabs/Module/Connedit.php:657 msgid "Delete this connection" msgstr "Eliminar esta conexión" -#: ../../Zotlabs/Module/Connedit.php:661 +#: ../../Zotlabs/Module/Connedit.php:665 msgid "Fetch Vcard" msgstr "Obtener una vcard" -#: ../../Zotlabs/Module/Connedit.php:664 +#: ../../Zotlabs/Module/Connedit.php:668 msgid "Fetch electronic calling card for this connection" msgstr "Obtener una tarjeta de llamada electrónica para esta conexión" -#: ../../Zotlabs/Module/Connedit.php:675 +#: ../../Zotlabs/Module/Connedit.php:679 msgid "Open Individual Permissions section by default" msgstr "Abrir la sección de permisos individuales por defecto" -#: ../../Zotlabs/Module/Connedit.php:698 +#: ../../Zotlabs/Module/Connedit.php:702 msgid "Affinity" msgstr "Afinidad" -#: ../../Zotlabs/Module/Connedit.php:701 +#: ../../Zotlabs/Module/Connedit.php:705 msgid "Open Set Affinity section by default" msgstr "Abrir por defecto la sección para definir la afinidad" -#: ../../Zotlabs/Module/Connedit.php:705 ../../Zotlabs/Widget/Affinity.php:26 +#: ../../Zotlabs/Module/Connedit.php:709 ../../Zotlabs/Widget/Affinity.php:26 msgid "Me" msgstr "Yo" -#: ../../Zotlabs/Module/Connedit.php:706 ../../Zotlabs/Widget/Affinity.php:27 +#: ../../Zotlabs/Module/Connedit.php:710 ../../Zotlabs/Widget/Affinity.php:27 msgid "Family" msgstr "Familia" -#: ../../Zotlabs/Module/Connedit.php:708 ../../Zotlabs/Widget/Affinity.php:29 +#: ../../Zotlabs/Module/Connedit.php:712 ../../Zotlabs/Widget/Affinity.php:29 msgid "Acquaintances" msgstr "Conocidos/as" -#: ../../Zotlabs/Module/Connedit.php:735 +#: ../../Zotlabs/Module/Connedit.php:739 msgid "Filter" msgstr "Filtrar" -#: ../../Zotlabs/Module/Connedit.php:738 +#: ../../Zotlabs/Module/Connedit.php:742 msgid "Open Custom Filter section by default" msgstr "Abrir por defecto la sección de personalización de filtros" -#: ../../Zotlabs/Module/Connedit.php:775 +#: ../../Zotlabs/Module/Connedit.php:779 msgid "Approve this connection" msgstr "Aprobar esta conexión" -#: ../../Zotlabs/Module/Connedit.php:775 +#: ../../Zotlabs/Module/Connedit.php:779 msgid "Accept connection to allow communication" msgstr "Aceptar la conexión para permitir la comunicación" -#: ../../Zotlabs/Module/Connedit.php:780 +#: ../../Zotlabs/Module/Connedit.php:784 msgid "Set Affinity" msgstr "Ajustar la afinidad" -#: ../../Zotlabs/Module/Connedit.php:783 +#: ../../Zotlabs/Module/Connedit.php:787 msgid "Set Profile" msgstr "Ajustar el perfil" -#: ../../Zotlabs/Module/Connedit.php:786 +#: ../../Zotlabs/Module/Connedit.php:790 msgid "Set Affinity & Profile" msgstr "Ajustar la afinidad y el perfil" -#: ../../Zotlabs/Module/Connedit.php:851 +#: ../../Zotlabs/Module/Connedit.php:855 msgid "This connection is unreachable from this location." msgstr "No se puede acceder a la conexión desde este sitio." -#: ../../Zotlabs/Module/Connedit.php:852 +#: ../../Zotlabs/Module/Connedit.php:856 msgid "This connection may be unreachable from other channel locations." msgstr "Esta conexión puede ser inaccesible desde otras ubicaciones del canal." -#: ../../Zotlabs/Module/Connedit.php:854 +#: ../../Zotlabs/Module/Connedit.php:858 msgid "Location independence is not supported by their network." msgstr "La independencia de ubicación no es compatible con su red." -#: ../../Zotlabs/Module/Connedit.php:860 +#: ../../Zotlabs/Module/Connedit.php:864 msgid "" "This connection is unreachable from this location. Location independence is " "not supported by their network." msgstr "Esta conexión no es accesible desde este sitio. La independencia de ubicación no es compatible con su red." -#: ../../Zotlabs/Module/Connedit.php:863 +#: ../../Zotlabs/Module/Connedit.php:867 #: ../../Zotlabs/Widget/Settings_menu.php:109 msgid "Connection Default Permissions" msgstr "Permisos predeterminados de conexión" -#: ../../Zotlabs/Module/Connedit.php:863 ../../include/items.php:3925 +#: ../../Zotlabs/Module/Connedit.php:867 ../../include/items.php:3974 #, php-format msgid "Connection: %s" msgstr "Conexión: %s" -#: ../../Zotlabs/Module/Connedit.php:864 +#: ../../Zotlabs/Module/Connedit.php:868 msgid "Apply these permissions automatically" msgstr "Aplicar estos permisos automaticamente" -#: ../../Zotlabs/Module/Connedit.php:864 +#: ../../Zotlabs/Module/Connedit.php:868 msgid "Connection requests will be approved without your interaction" msgstr "Las solicitudes de conexión serán aprobadas sin su intervención" -#: ../../Zotlabs/Module/Connedit.php:865 +#: ../../Zotlabs/Module/Connedit.php:869 msgid "Permission role" msgstr "Rol de acceso" -#: ../../Zotlabs/Module/Connedit.php:866 +#: ../../Zotlabs/Module/Connedit.php:870 msgid "Add permission role" msgstr "Añadir un rol de acceso" -#: ../../Zotlabs/Module/Connedit.php:873 +#: ../../Zotlabs/Module/Connedit.php:877 msgid "This connection's primary address is" msgstr "La dirección primaria de esta conexión es" -#: ../../Zotlabs/Module/Connedit.php:874 +#: ../../Zotlabs/Module/Connedit.php:878 msgid "Available locations:" msgstr "Ubicaciones disponibles:" -#: ../../Zotlabs/Module/Connedit.php:879 +#: ../../Zotlabs/Module/Connedit.php:883 msgid "" "The permissions indicated on this page will be applied to all new " "connections." msgstr "Los permisos indicados en esta página serán aplicados en todas las nuevas conexiones." -#: ../../Zotlabs/Module/Connedit.php:880 +#: ../../Zotlabs/Module/Connedit.php:884 msgid "Connection Tools" msgstr "Gestión de las conexiones" -#: ../../Zotlabs/Module/Connedit.php:882 +#: ../../Zotlabs/Module/Connedit.php:886 msgid "Slide to adjust your degree of friendship" msgstr "Deslizar para ajustar el grado de amistad" -#: ../../Zotlabs/Module/Connedit.php:883 ../../Zotlabs/Module/Rate.php:155 +#: ../../Zotlabs/Module/Connedit.php:887 ../../Zotlabs/Module/Rate.php:155 #: ../../include/js_strings.php:20 msgid "Rating" msgstr "Valoración" -#: ../../Zotlabs/Module/Connedit.php:884 +#: ../../Zotlabs/Module/Connedit.php:888 msgid "Slide to adjust your rating" msgstr "Deslizar para ajustar su valoración" -#: ../../Zotlabs/Module/Connedit.php:885 ../../Zotlabs/Module/Connedit.php:890 +#: ../../Zotlabs/Module/Connedit.php:889 ../../Zotlabs/Module/Connedit.php:894 msgid "Optionally explain your rating" msgstr "Opcionalmente, puede explicar su valoración" -#: ../../Zotlabs/Module/Connedit.php:887 +#: ../../Zotlabs/Module/Connedit.php:891 msgid "Custom Filter" msgstr "Filtro personalizado" -#: ../../Zotlabs/Module/Connedit.php:888 +#: ../../Zotlabs/Module/Connedit.php:892 msgid "Only import posts with this text" msgstr "Importar solo entradas que contengan este texto" -#: ../../Zotlabs/Module/Connedit.php:888 ../../Zotlabs/Module/Connedit.php:889 +#: ../../Zotlabs/Module/Connedit.php:892 ../../Zotlabs/Module/Connedit.php:893 msgid "" "words one per line or #tags or /patterns/ or lang=xx, leave blank to import " "all posts" msgstr "Una sola opción por línea: palabras, #etiquetas, /patrones/ o lang=xx. Dejar en blanco para importarlo todo" -#: ../../Zotlabs/Module/Connedit.php:889 +#: ../../Zotlabs/Module/Connedit.php:893 msgid "Do not import posts with this text" msgstr "No importar entradas que contengan este texto" -#: ../../Zotlabs/Module/Connedit.php:891 +#: ../../Zotlabs/Module/Connedit.php:895 msgid "This information is public!" msgstr "¡Esta información es pública!" -#: ../../Zotlabs/Module/Connedit.php:896 +#: ../../Zotlabs/Module/Connedit.php:900 msgid "Connection Pending Approval" msgstr "Conexión pendiente de aprobación" -#: ../../Zotlabs/Module/Connedit.php:901 +#: ../../Zotlabs/Module/Connedit.php:905 #, php-format msgid "" "Please choose the profile you would like to display to %s when viewing your " "profile securely." msgstr "Por favor, escoja el perfil que quiere mostrar a %s cuando esté viendo su perfil de forma segura." -#: ../../Zotlabs/Module/Connedit.php:908 +#: ../../Zotlabs/Module/Connedit.php:912 msgid "" "Some permissions may be inherited from your channel's <a " "href=\"settings\"><strong>privacy settings</strong></a>, which have higher " @@ -5467,18 +5535,14 @@ msgid "" "they wont have any impact unless the inherited setting changes." msgstr "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. Puede cambiar estos ajustes aquí, pero no tendrán ningún consecuencia hasta que cambie los ajustes heredados." -#: ../../Zotlabs/Module/Connedit.php:909 +#: ../../Zotlabs/Module/Connedit.php:913 msgid "Last update:" msgstr "Última actualización:" -#: ../../Zotlabs/Module/Connedit.php:918 +#: ../../Zotlabs/Module/Connedit.php:922 msgid "Details" msgstr "Detalles" -#: ../../Zotlabs/Module/Chat.php:94 ../../Zotlabs/Lib/Apps.php:228 -msgid "My Chatrooms" -msgstr "Mis salas de chat" - #: ../../Zotlabs/Module/Chat.php:181 msgid "Room not found" msgstr "Sala no encontrada" @@ -5504,13 +5568,13 @@ msgid "Bookmark this room" msgstr "Añadir esta sala a Marcadores" #: ../../Zotlabs/Module/Chat.php:205 ../../Zotlabs/Module/Mail.php:241 -#: ../../Zotlabs/Module/Mail.php:362 ../../include/conversation.php:1260 +#: ../../Zotlabs/Module/Mail.php:362 ../../include/conversation.php:1296 msgid "Please enter a link URL:" msgstr "Por favor, introduzca la dirección del enlace:" #: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Module/Mail.php:294 -#: ../../Zotlabs/Module/Mail.php:436 ../../Zotlabs/Lib/ThreadItem.php:742 -#: ../../include/conversation.php:1370 +#: ../../Zotlabs/Module/Mail.php:436 ../../Zotlabs/Lib/ThreadItem.php:757 +#: ../../include/conversation.php:1415 msgid "Encrypt text" msgstr "Cifrar texto" @@ -5543,9 +5607,14 @@ msgstr "Caducidad" msgid "min" msgstr "min" +#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:242 +#: ../../include/conversation.php:1814 ../../include/nav.php:422 +msgid "Photos" +msgstr "Fotos" + #: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:237 -#: ../../Zotlabs/Storage/Browser.php:225 ../../Zotlabs/Storage/Browser.php:247 -#: ../../include/conversation.php:1788 ../../include/nav.php:386 +#: ../../Zotlabs/Storage/Browser.php:225 ../../include/conversation.php:1822 +#: ../../include/nav.php:430 msgid "Files" msgstr "Ficheros" @@ -5585,7 +5654,7 @@ msgstr "El menú se puede usar para guardar marcadores" msgid "Submit and proceed" msgstr "Enviar y proceder" -#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2281 +#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2289 msgid "Menus" msgstr "Menús" @@ -5637,14 +5706,13 @@ msgstr "El título del menú tal como será visto por los demás" msgid "Allow bookmarks" msgstr "Permitir marcadores" -#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2282 +#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2290 msgid "Layouts" msgstr "Plantillas" -#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Module/Help.php:18 -#: ../../Zotlabs/Lib/Apps.php:245 ../../include/nav.php:157 -#: ../../include/nav.php:264 ../../include/help.php:55 -#: ../../include/help.php:61 +#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Lib/Apps.php:245 +#: ../../include/nav.php:201 ../../include/nav.php:301 +#: ../../include/help.php:68 ../../include/help.php:74 msgid "Help" msgstr "Ayuda" @@ -5661,12 +5729,12 @@ msgid "Download PDL file" msgstr "Descargar el fichero PDL" #: ../../Zotlabs/Module/Tagger.php:55 ../../include/markdown.php:141 -#: ../../include/bbcode.php:334 +#: ../../include/bbcode.php:333 msgid "post" msgstr "la entrada" #: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:146 -#: ../../include/text.php:1938 +#: ../../include/text.php:1946 msgid "comment" msgstr "el comentario" @@ -5699,7 +5767,7 @@ msgid "Could not create privacy group." msgstr "No se puede crear el grupo de canales" #: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:143 -#: ../../include/items.php:3892 +#: ../../include/items.php:3941 msgid "Privacy group not found." msgstr "Grupo de canales no encontrado." @@ -5834,7 +5902,7 @@ msgid "View this profile" msgstr "Ver este perfil" #: ../../Zotlabs/Module/Profiles.php:728 ../../Zotlabs/Module/Profiles.php:827 -#: ../../include/channel.php:1183 +#: ../../include/channel.php:1284 msgid "Edit visibility" msgstr "Editar visibilidad" @@ -5846,7 +5914,7 @@ msgstr "Gestión del perfil" msgid "Change cover photo" msgstr "Cambiar la imagen de portada del perfil" -#: ../../Zotlabs/Module/Profiles.php:731 ../../include/channel.php:1154 +#: ../../Zotlabs/Module/Profiles.php:731 ../../include/channel.php:1255 msgid "Change profile photo" msgstr "Cambiar la foto del perfil" @@ -5866,7 +5934,7 @@ msgstr "Eliminar este perfil" msgid "Add profile things" msgstr "Añadir cosas al perfil" -#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1654 +#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1688 msgid "Personal" msgstr "Personales" @@ -6011,12 +6079,12 @@ msgstr "Mis otros canales" msgid "Communications" msgstr "Comunicaciones" -#: ../../Zotlabs/Module/Profiles.php:823 ../../include/channel.php:1179 +#: ../../Zotlabs/Module/Profiles.php:823 ../../include/channel.php:1280 msgid "Profile Image" msgstr "Imagen del perfil" -#: ../../Zotlabs/Module/Profiles.php:833 ../../include/channel.php:1161 -#: ../../include/nav.php:105 +#: ../../Zotlabs/Module/Profiles.php:833 ../../include/channel.php:1262 +#: ../../include/nav.php:144 msgid "Edit Profiles" msgstr "Editar perfiles" @@ -6033,7 +6101,7 @@ msgid "Create a new channel" msgstr "Crear un nuevo canal" #: ../../Zotlabs/Module/Manage.php:170 ../../Zotlabs/Lib/Apps.php:234 -#: ../../include/nav.php:199 +#: ../../include/nav.php:129 ../../include/nav.php:215 msgid "Channel Manager" msgstr "Administración de canales" @@ -6067,6 +6135,16 @@ msgstr "%d nuevas solicitudes de conexión" msgid "Delegated Channel" msgstr "Canal delegado" +#: ../../Zotlabs/Module/Cards.php:38 ../../Zotlabs/Module/Cards.php:178 +#: ../../Zotlabs/Lib/Apps.php:224 ../../include/conversation.php:1873 +#: ../../include/features.php:122 ../../include/nav.php:479 +msgid "Cards" +msgstr "Fichas" + +#: ../../Zotlabs/Module/Cards.php:95 +msgid "Add Card" +msgstr "Añadir una ficha" + #: ../../Zotlabs/Module/Dirsearch.php:33 msgid "This directory server requires an access token" msgstr "El servidor de este directorio necesita un \"token\" de acceso" @@ -6118,7 +6196,7 @@ msgid "No ratings" msgstr "Ninguna valoración" #: ../../Zotlabs/Module/Ratings.php:97 ../../Zotlabs/Module/Pubsites.php:35 -#: ../../include/conversation.php:1029 +#: ../../include/conversation.php:1065 msgid "Ratings" msgstr "Valoraciones" @@ -6134,12 +6212,6 @@ msgstr "Sitio web:" msgid "Description: " msgstr "Descripción:" -#: ../../Zotlabs/Module/Webpages.php:38 ../../Zotlabs/Module/Webpages.php:237 -#: ../../Zotlabs/Lib/Apps.php:238 ../../include/conversation.php:1838 -#: ../../include/nav.php:435 -msgid "Webpages" -msgstr "Páginas web" - #: ../../Zotlabs/Module/Webpages.php:54 msgid "Import Webpage Elements" msgstr "Importar elementos de una página web" @@ -6156,6 +6228,11 @@ msgstr "Exportar elementos de una página web" msgid "Export selected" msgstr "Exportar los elementos seleccionados" +#: ../../Zotlabs/Module/Webpages.php:237 ../../Zotlabs/Lib/Apps.php:238 +#: ../../include/conversation.php:1884 ../../include/nav.php:491 +msgid "Webpages" +msgstr "Páginas web" + #: ../../Zotlabs/Module/Webpages.php:248 msgid "Actions" msgstr "Acciones" @@ -6188,11 +6265,44 @@ msgstr "No se han detectado elementos de ninguna página web." msgid "Import complete." msgstr "Importación completada." +#: ../../Zotlabs/Module/Changeaddr.php:35 +msgid "" +"Channel name changes are not allowed within 48 hours of changing the account" +" password." +msgstr "Los cambios en el nombre de un canal no está permitida hasta pasadas 48 horas desde el cambio de contraseña de la cuenta." + +#: ../../Zotlabs/Module/Changeaddr.php:46 ../../include/channel.php:209 +#: ../../include/channel.php:579 +msgid "Reserved nickname. Please choose another." +msgstr "Sobrenombre en uso. Por favor, elija otro." + +#: ../../Zotlabs/Module/Changeaddr.php:51 ../../include/channel.php:214 +#: ../../include/channel.php:584 +msgid "" +"Nickname has unsupported characters or is already being used on this site." +msgstr "El alias contiene caracteres no admitidos o está ya en uso por otros miembros de este sitio." + +#: ../../Zotlabs/Module/Changeaddr.php:77 +msgid "Change channel nickname/address" +msgstr "Cambiar el alias o la dirección del canal" + +#: ../../Zotlabs/Module/Changeaddr.php:78 +msgid "Any/all connections on other networks will be lost!" +msgstr "¡Cualquier/todas las conexiones en otras redes se perderán!" + +#: ../../Zotlabs/Module/Changeaddr.php:80 +msgid "New channel address" +msgstr "Nueva dirección del canal" + +#: ../../Zotlabs/Module/Changeaddr.php:81 +msgid "Rename Channel" +msgstr "Renombrar el canal" + #: ../../Zotlabs/Module/Editpost.php:38 ../../Zotlabs/Module/Editpost.php:43 msgid "Item is not editable" msgstr "El elemento no es editable" -#: ../../Zotlabs/Module/Editpost.php:108 ../../Zotlabs/Module/Rpost.php:140 +#: ../../Zotlabs/Module/Editpost.php:108 ../../Zotlabs/Module/Rpost.php:178 msgid "Edit post" msgstr "Editar la entrada" @@ -6253,7 +6363,7 @@ msgstr "correo enviado" msgid "Delivery report for %1$s" msgstr "Informe de entrega para %1$s" -#: ../../Zotlabs/Module/Dreport.php:151 +#: ../../Zotlabs/Module/Dreport.php:151 ../../Zotlabs/Widget/Wiki_pages.php:60 msgid "Options" msgstr "Opciones" @@ -6278,7 +6388,7 @@ msgid "*" msgstr "*" #: ../../Zotlabs/Module/Sources.php:96 -#: ../../Zotlabs/Widget/Settings_menu.php:125 ../../include/features.php:209 +#: ../../Zotlabs/Widget/Settings_menu.php:125 ../../include/features.php:218 msgid "Channel Sources" msgstr "Orígenes de los contenidos del canal" @@ -6373,13 +6483,14 @@ msgstr "Canal no disponible." msgid "Previous action reversed." msgstr "Acción anterior revocada." -#: ../../Zotlabs/Module/Like.php:423 ../../addon/diaspora/Receiver.php:1399 -#: ../../include/conversation.php:160 +#: ../../Zotlabs/Module/Like.php:423 ../../addon/diaspora/Receiver.php:1453 +#: ../../addon/pubcrawl/as.php:1323 ../../include/conversation.php:160 #, php-format msgid "%1$s likes %2$s's %3$s" msgstr "A %1$s le gusta %3$s de %2$s" -#: ../../Zotlabs/Module/Like.php:425 ../../include/conversation.php:163 +#: ../../Zotlabs/Module/Like.php:425 ../../addon/pubcrawl/as.php:1325 +#: ../../include/conversation.php:163 #, php-format msgid "%1$s doesn't like %2$s's %3$s" msgstr "A %1$s no le gusta %3$s de %2$s" @@ -6445,11 +6556,11 @@ msgstr "Estado:" msgid "Homepage: " msgstr "Página personal:" -#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1416 +#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1516 msgid "Age:" msgstr "Edad:" -#: ../../Zotlabs/Module/Directory.php:314 ../../include/channel.php:1251 +#: ../../Zotlabs/Module/Directory.php:314 ../../include/channel.php:1352 #: ../../include/event.php:52 ../../include/event.php:84 msgid "Location:" msgstr "Ubicación:" @@ -6458,17 +6569,17 @@ msgstr "Ubicación:" msgid "Description:" msgstr "Descripción:" -#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1432 +#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1532 msgid "Hometown:" msgstr "Lugar de nacimiento:" -#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1440 +#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1540 msgid "About:" msgstr "Sobre mí:" #: ../../Zotlabs/Module/Directory.php:328 ../../Zotlabs/Module/Suggest.php:56 #: ../../Zotlabs/Widget/Follow.php:32 ../../Zotlabs/Widget/Suggestions.php:44 -#: ../../include/conversation.php:999 ../../include/channel.php:1236 +#: ../../include/conversation.php:1035 ../../include/channel.php:1337 #: ../../include/connections.php:111 msgid "Connect" msgstr "Conectar" @@ -6546,11 +6657,6 @@ msgstr "Búsqueda de canales" msgid "Lookup xchan beginning with (or webbie): " msgstr "Buscar un canal (o un \"webbie\") que comience por:" -#: ../../Zotlabs/Module/Suggest.php:32 ../../Zotlabs/Lib/Apps.php:232 -#: ../../include/features.php:333 -msgid "Suggest Channels" -msgstr "Sugerir canales" - #: ../../Zotlabs/Module/Suggest.php:39 msgid "" "No suggestions available. If this is a new site, please try again in 24 " @@ -6585,11 +6691,6 @@ msgstr "No se puede verificar el canal solicitado." msgid "Selected channel has private message restrictions. Send failed." msgstr "El canal seleccionado tiene restricciones sobre los mensajes privados. El envío falló." -#: ../../Zotlabs/Module/Mail.php:143 ../../Zotlabs/Lib/Apps.php:246 -#: ../../include/nav.php:187 -msgid "Mail" -msgstr "Correo" - #: ../../Zotlabs/Module/Mail.php:160 msgid "Messages" msgstr "Mensajes" @@ -6627,7 +6728,7 @@ msgid "Subject:" msgstr "Asunto:" #: ../../Zotlabs/Module/Mail.php:287 ../../Zotlabs/Module/Mail.php:429 -#: ../../include/conversation.php:1320 +#: ../../include/conversation.php:1365 msgid "Attach file" msgstr "Adjuntar fichero" @@ -6636,7 +6737,7 @@ msgid "Send" msgstr "Enviar" #: ../../Zotlabs/Module/Mail.php:292 ../../Zotlabs/Module/Mail.php:434 -#: ../../include/conversation.php:1365 +#: ../../include/conversation.php:1410 msgid "Set expiration date" msgstr "Configurar fecha de caducidad" @@ -6708,7 +6809,7 @@ msgstr "Estadísticas" msgid "Software" msgstr "Software" -#: ../../Zotlabs/Module/Pubsites.php:48 +#: ../../Zotlabs/Module/Pubsites.php:49 msgid "Rate" msgstr "Valorar" @@ -6762,14 +6863,10 @@ msgstr "Escriba un nombre de carpeta" msgid "or select an existing folder (doubleclick)" msgstr "o seleccione una (con un doble click)" -#: ../../Zotlabs/Module/Filer.php:54 ../../Zotlabs/Lib/ThreadItem.php:137 +#: ../../Zotlabs/Module/Filer.php:54 ../../Zotlabs/Lib/ThreadItem.php:141 msgid "Save to Folder" msgstr "Guardar en carpeta" -#: ../../Zotlabs/Module/Probe.php:11 ../../Zotlabs/Lib/Apps.php:231 -msgid "Remote Diagnostics" -msgstr "Diagnóstico remoto" - #: ../../Zotlabs/Module/Probe.php:30 ../../Zotlabs/Module/Probe.php:34 #, php-format msgid "Fetching URL returns error: %1$s" @@ -6858,8 +6955,8 @@ msgstr "sí" msgid "Membership on this site is by invitation only." msgstr "Para registrarse en este sitio es necesaria una invitación." -#: ../../Zotlabs/Module/Register.php:268 ../../boot.php:1582 -#: ../../include/nav.php:145 +#: ../../Zotlabs/Module/Register.php:268 ../../boot.php:1620 +#: ../../include/nav.php:189 msgid "Register" msgstr "Registrarse" @@ -6874,30 +6971,30 @@ msgstr "Este sitio puede requerir una verificación de correo electrónico despu msgid "Cover Photos" msgstr "Imágenes de portada del perfil" -#: ../../Zotlabs/Module/Cover_photo.php:237 ../../include/items.php:4273 +#: ../../Zotlabs/Module/Cover_photo.php:237 ../../include/items.php:4320 msgid "female" msgstr "mujer" -#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4274 +#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4321 #, php-format msgid "%1$s updated her %2$s" msgstr "%1$s ha actualizado su %2$s" -#: ../../Zotlabs/Module/Cover_photo.php:239 ../../include/items.php:4275 +#: ../../Zotlabs/Module/Cover_photo.php:239 ../../include/items.php:4322 msgid "male" msgstr "hombre" -#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/items.php:4276 +#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/items.php:4323 #, php-format msgid "%1$s updated his %2$s" msgstr "%1$s ha actualizado su %2$s" -#: ../../Zotlabs/Module/Cover_photo.php:242 ../../include/items.php:4278 +#: ../../Zotlabs/Module/Cover_photo.php:242 ../../include/items.php:4325 #, php-format msgid "%1$s updated their %2$s" msgstr "%1$s ha actualizado su %2$s" -#: ../../Zotlabs/Module/Cover_photo.php:244 ../../include/channel.php:1878 +#: ../../Zotlabs/Module/Cover_photo.php:244 ../../include/channel.php:1980 msgid "cover photo" msgstr "Imagen de portada del perfil" @@ -6909,8 +7006,8 @@ msgstr "Subir imagen de portada del perfil" msgid "Documentation Search" msgstr "Búsqueda de Documentación" -#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1770 -#: ../../include/nav.php:368 +#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1804 +#: ../../include/nav.php:412 msgid "About" msgstr "Mi perfil" @@ -6926,14 +7023,18 @@ msgstr "Desarrolladores" msgid "Tutorials" msgstr "Tutoriales" -#: ../../Zotlabs/Module/Help.php:93 +#: ../../Zotlabs/Module/Help.php:95 msgid "$Projectname Documentation" msgstr "Documentación de $Projectname" -#: ../../Zotlabs/Module/Help.php:94 +#: ../../Zotlabs/Module/Help.php:96 msgid "Contents" msgstr "Contenidos" +#: ../../Zotlabs/Module/Display.php:340 +msgid "Item has been removed." +msgstr "Se ha eliminado el elemento." + #: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98 msgid "Tag removed" msgstr "Etiqueta eliminada." @@ -6946,7 +7047,7 @@ msgstr "Eliminar etiqueta del elemento." msgid "Select a tag to remove: " msgstr "Seleccionar una etiqueta para eliminar:" -#: ../../Zotlabs/Module/Network.php:96 +#: ../../Zotlabs/Module/Network.php:97 msgid "No such group" msgstr "No se encuentra el grupo" @@ -6982,14 +7083,10 @@ msgstr "Conexión no válida." msgid "Invalid channel." msgstr "El canal no es válido." -#: ../../Zotlabs/Module/Acl.php:344 +#: ../../Zotlabs/Module/Acl.php:351 msgid "network" msgstr "red" -#: ../../Zotlabs/Module/Acl.php:354 -msgid "RSS" -msgstr "RSS" - #: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82 #: ../../addon/opensearch/opensearch.php:42 msgid "$Projectname" @@ -7049,14 +7146,14 @@ msgstr "Mostrar en la carpeta compartida con sus contactos" msgid "No channel." msgstr "Ningún canal." -#: ../../Zotlabs/Module/Common.php:43 -msgid "Common connections" -msgstr "Conexiones comunes" - -#: ../../Zotlabs/Module/Common.php:48 +#: ../../Zotlabs/Module/Common.php:45 msgid "No connections in common." msgstr "Ninguna conexión en común." +#: ../../Zotlabs/Module/Common.php:65 +msgid "View Common Connections" +msgstr "Ver las conexiones comunes" + #: ../../Zotlabs/Module/Viewconnections.php:65 msgid "No connections." msgstr "Sin conexiones." @@ -7147,6 +7244,10 @@ msgstr "Valoración (esta información es pública)" msgid "Optionally explain your rating (this information is public)" msgstr "Opcionalmente puede explicar su valoración (esta información es pública)" +#: ../../Zotlabs/Module/Card_edit.php:128 +msgid "Edit Card" +msgstr "Editar la ficha" + #: ../../Zotlabs/Module/Lostpass.php:19 msgid "No valid account found." msgstr "No se ha encontrado una cuenta válida." @@ -7171,7 +7272,7 @@ msgid "" "Password reset failed." msgstr "La solicitud no ha podido ser verificada. (Puede que la haya enviado con anterioridad) El restablecimiento de la contraseña ha fallado." -#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1609 +#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1648 msgid "Password Reset" msgstr "Restablecer la contraseña" @@ -7216,12 +7317,8 @@ msgstr "Introduzca y envíe su dirección de correo electrónico para el restabl msgid "Email Address" msgstr "Dirección de correo electrónico" -#: ../../Zotlabs/Module/Lostpass.php:133 -msgid "Reset" -msgstr "Reiniciar" - #: ../../Zotlabs/Module/Notifications.php:43 -#: ../../Zotlabs/Lib/ThreadItem.php:392 +#: ../../Zotlabs/Lib/ThreadItem.php:397 msgid "Mark all seen" msgstr "Marcar todo como visto" @@ -7257,15 +7354,58 @@ msgstr "Administrador del sitio" msgid "Report Bug" msgstr "Informe de errores" +#: ../../Zotlabs/Lib/Apps.php:227 +msgid "View Bookmarks" +msgstr "Ver los marcadores" + +#: ../../Zotlabs/Lib/Apps.php:228 +msgid "My Chatrooms" +msgstr "Mis salas de chat" + #: ../../Zotlabs/Lib/Apps.php:230 msgid "Firefox Share" msgstr "Servicio de compartición de Firefox" -#: ../../Zotlabs/Lib/Apps.php:233 ../../boot.php:1601 -#: ../../include/nav.php:113 +#: ../../Zotlabs/Lib/Apps.php:231 +msgid "Remote Diagnostics" +msgstr "Diagnóstico remoto" + +#: ../../Zotlabs/Lib/Apps.php:232 ../../include/features.php:342 +msgid "Suggest Channels" +msgstr "Sugerir canales" + +#: ../../Zotlabs/Lib/Apps.php:233 ../../boot.php:1639 +#: ../../include/nav.php:153 ../../include/nav.php:157 msgid "Login" msgstr "Iniciar sesión" +#: ../../Zotlabs/Lib/Apps.php:235 ../../include/nav.php:98 +msgid "Activity" +msgstr "Actividad" + +#: ../../Zotlabs/Lib/Apps.php:239 ../../include/conversation.php:1900 +#: ../../include/features.php:95 ../../include/nav.php:507 +msgid "Wiki" +msgstr "Wiki" + +#: ../../Zotlabs/Lib/Apps.php:240 ../../include/nav.php:102 +msgid "Channel Home" +msgstr "Mi canal" + +#: ../../Zotlabs/Lib/Apps.php:243 ../../include/conversation.php:1833 +#: ../../include/conversation.php:1836 ../../include/nav.php:124 +#: ../../include/nav.php:441 ../../include/nav.php:444 +msgid "Events" +msgstr "Eventos" + +#: ../../Zotlabs/Lib/Apps.php:244 +msgid "Directory" +msgstr "Directorio" + +#: ../../Zotlabs/Lib/Apps.php:246 ../../include/nav.php:116 +msgid "Mail" +msgstr "Correo" + #: ../../Zotlabs/Lib/Apps.php:249 msgid "Chat" msgstr "Chat" @@ -7282,29 +7422,41 @@ msgstr "Sugerir" msgid "Random Channel" msgstr "Canal aleatorio" +#: ../../Zotlabs/Lib/Apps.php:254 +msgid "Invite" +msgstr "Invitar" + #: ../../Zotlabs/Lib/Apps.php:255 ../../Zotlabs/Widget/Admin.php:26 msgid "Features" msgstr "Funcionalidades" +#: ../../Zotlabs/Lib/Apps.php:256 ../../addon/openid/MysqlProvider.php:69 +msgid "Language" +msgstr "Idioma" + +#: ../../Zotlabs/Lib/Apps.php:257 +msgid "Post" +msgstr "Publicación" + #: ../../Zotlabs/Lib/Apps.php:258 ../../addon/openid/MysqlProvider.php:58 #: ../../addon/openid/MysqlProvider.php:59 #: ../../addon/openid/MysqlProvider.php:60 msgid "Profile Photo" msgstr "Foto del perfil" -#: ../../Zotlabs/Lib/Apps.php:391 +#: ../../Zotlabs/Lib/Apps.php:397 msgid "Purchase" msgstr "Comprar" -#: ../../Zotlabs/Lib/Apps.php:395 +#: ../../Zotlabs/Lib/Apps.php:401 msgid "Undelete" msgstr "Recuperar" -#: ../../Zotlabs/Lib/Apps.php:401 +#: ../../Zotlabs/Lib/Apps.php:407 msgid "Add to app-tray" msgstr "Añadir a la bandeja de aplicaciones" -#: ../../Zotlabs/Lib/Apps.php:402 +#: ../../Zotlabs/Lib/Apps.php:408 msgid "Remove from app-tray" msgstr "Quitar de la bandeja de aplicaciones" @@ -7329,71 +7481,71 @@ msgid "publisher" msgstr "editor" #: ../../Zotlabs/Lib/NativeWikiPage.php:42 -#: ../../Zotlabs/Lib/NativeWikiPage.php:83 +#: ../../Zotlabs/Lib/NativeWikiPage.php:90 msgid "(No Title)" msgstr "(Sin título)" -#: ../../Zotlabs/Lib/NativeWikiPage.php:97 +#: ../../Zotlabs/Lib/NativeWikiPage.php:104 msgid "Wiki page create failed." msgstr "Se ha producido un error en la creación de la página wiki." -#: ../../Zotlabs/Lib/NativeWikiPage.php:110 +#: ../../Zotlabs/Lib/NativeWikiPage.php:117 msgid "Wiki not found." msgstr "No se ha encontrado el wiki." -#: ../../Zotlabs/Lib/NativeWikiPage.php:121 +#: ../../Zotlabs/Lib/NativeWikiPage.php:128 msgid "Destination name already exists" msgstr "El nombre de destino ya existe" -#: ../../Zotlabs/Lib/NativeWikiPage.php:147 -#: ../../Zotlabs/Lib/NativeWikiPage.php:342 +#: ../../Zotlabs/Lib/NativeWikiPage.php:160 +#: ../../Zotlabs/Lib/NativeWikiPage.php:355 msgid "Page not found" msgstr "No se ha encontrado la página" -#: ../../Zotlabs/Lib/NativeWikiPage.php:177 +#: ../../Zotlabs/Lib/NativeWikiPage.php:191 msgid "Error reading page content" msgstr "Se ha producido un error al leer el contenido de la página" -#: ../../Zotlabs/Lib/NativeWikiPage.php:333 -#: ../../Zotlabs/Lib/NativeWikiPage.php:381 -#: ../../Zotlabs/Lib/NativeWikiPage.php:448 -#: ../../Zotlabs/Lib/NativeWikiPage.php:489 +#: ../../Zotlabs/Lib/NativeWikiPage.php:347 +#: ../../Zotlabs/Lib/NativeWikiPage.php:396 +#: ../../Zotlabs/Lib/NativeWikiPage.php:463 +#: ../../Zotlabs/Lib/NativeWikiPage.php:504 msgid "Error reading wiki" msgstr "Se ha producido un error al leer el wiki" -#: ../../Zotlabs/Lib/NativeWikiPage.php:369 +#: ../../Zotlabs/Lib/NativeWikiPage.php:384 msgid "Page update failed." msgstr "Se ha producido un error al actualizar la página." -#: ../../Zotlabs/Lib/NativeWikiPage.php:403 +#: ../../Zotlabs/Lib/NativeWikiPage.php:418 msgid "Nothing deleted" msgstr "No se ha eliminado nada" -#: ../../Zotlabs/Lib/NativeWikiPage.php:469 +#: ../../Zotlabs/Lib/NativeWikiPage.php:484 msgid "Compare: object not found." msgstr "No se ha encontrado un objeto para comparar." -#: ../../Zotlabs/Lib/NativeWikiPage.php:475 +#: ../../Zotlabs/Lib/NativeWikiPage.php:490 msgid "Page updated" msgstr "Se ha actualizado la página" -#: ../../Zotlabs/Lib/NativeWikiPage.php:478 +#: ../../Zotlabs/Lib/NativeWikiPage.php:493 msgid "Untitled" msgstr "Sin título" -#: ../../Zotlabs/Lib/NativeWikiPage.php:484 +#: ../../Zotlabs/Lib/NativeWikiPage.php:499 msgid "Wiki resource_id required for git commit" msgstr "Se necesita Wiki resource_id para el git commit" -#: ../../Zotlabs/Lib/NativeWikiPage.php:540 +#: ../../Zotlabs/Lib/NativeWikiPage.php:555 #: ../../Zotlabs/Widget/Wiki_page_history.php:23 msgctxt "wiki_history" msgid "Message" msgstr "Mensaje" -#: ../../Zotlabs/Lib/NativeWikiPage.php:578 -#: ../../addon/gitwiki/gitwiki_backend.php:579 ../../include/bbcode.php:667 -#: ../../include/bbcode.php:813 +#: ../../Zotlabs/Lib/NativeWikiPage.php:593 +#: ../../addon/gitwiki/gitwiki_backend.php:579 ../../include/bbcode.php:672 +#: ../../include/bbcode.php:818 msgid "Different viewers will see this text differently" msgstr "Visitantes diferentes verán este texto de forma distinta" @@ -7485,7 +7637,7 @@ msgid "$Projectname Notification" msgstr "Notificación de $Projectname" #: ../../Zotlabs/Lib/Enotify.php:61 ../../addon/diaspora/util.php:283 -#: ../../addon/diaspora/util.php:296 ../../addon/diaspora/p.php:46 +#: ../../addon/diaspora/util.php:296 ../../addon/diaspora/p.php:48 msgid "$projectname" msgstr "$projectname" @@ -7493,7 +7645,7 @@ msgstr "$projectname" msgid "Thank You," msgstr "Gracias," -#: ../../Zotlabs/Lib/Enotify.php:65 +#: ../../Zotlabs/Lib/Enotify.php:65 ../../addon/hubwall/hubwall.php:33 #, php-format msgid "%s Administrator" msgstr "%s Administrador" @@ -7711,7 +7863,11 @@ msgstr "ha creado una nueva entrada" msgid "commented on %s's post" msgstr "ha comentado la entrada de %s" -#: ../../Zotlabs/Lib/NativeWiki.php:128 +#: ../../Zotlabs/Lib/NativeWiki.php:151 +msgid "Wiki updated successfully" +msgstr "El wiki se ha actualizado con éxito" + +#: ../../Zotlabs/Lib/NativeWiki.php:198 msgid "Wiki files deleted successfully" msgstr "Se han borrado con éxito los ficheros del wiki" @@ -7725,210 +7881,218 @@ msgstr "Error de actualización en %s" msgid "Update %s failed. See error logs." msgstr "La actualización %s ha fallado. Mire el informe de errores." -#: ../../Zotlabs/Lib/ThreadItem.php:96 ../../include/conversation.php:656 +#: ../../Zotlabs/Lib/ThreadItem.php:97 ../../include/conversation.php:681 msgid "Private Message" msgstr "Mensaje Privado" -#: ../../Zotlabs/Lib/ThreadItem.php:133 ../../include/conversation.php:648 +#: ../../Zotlabs/Lib/ThreadItem.php:137 ../../include/conversation.php:673 msgid "Select" msgstr "Seleccionar" -#: ../../Zotlabs/Lib/ThreadItem.php:158 +#: ../../Zotlabs/Lib/ThreadItem.php:162 msgid "I will attend" msgstr "Participaré" -#: ../../Zotlabs/Lib/ThreadItem.php:158 +#: ../../Zotlabs/Lib/ThreadItem.php:162 msgid "I will not attend" msgstr "No participaré" -#: ../../Zotlabs/Lib/ThreadItem.php:158 +#: ../../Zotlabs/Lib/ThreadItem.php:162 msgid "I might attend" msgstr "Quizá participe" -#: ../../Zotlabs/Lib/ThreadItem.php:168 +#: ../../Zotlabs/Lib/ThreadItem.php:172 msgid "I agree" msgstr "Estoy de acuerdo" -#: ../../Zotlabs/Lib/ThreadItem.php:168 +#: ../../Zotlabs/Lib/ThreadItem.php:172 msgid "I disagree" msgstr "No estoy de acuerdo" -#: ../../Zotlabs/Lib/ThreadItem.php:168 +#: ../../Zotlabs/Lib/ThreadItem.php:172 msgid "I abstain" msgstr "Me abstengo" -#: ../../Zotlabs/Lib/ThreadItem.php:224 +#: ../../Zotlabs/Lib/ThreadItem.php:228 msgid "Add Star" msgstr "Destacar añadiendo una estrella" -#: ../../Zotlabs/Lib/ThreadItem.php:225 +#: ../../Zotlabs/Lib/ThreadItem.php:229 msgid "Remove Star" msgstr "Eliminar estrella" -#: ../../Zotlabs/Lib/ThreadItem.php:226 +#: ../../Zotlabs/Lib/ThreadItem.php:230 msgid "Toggle Star Status" msgstr "Activar o desactivar el estado de entrada preferida" -#: ../../Zotlabs/Lib/ThreadItem.php:230 +#: ../../Zotlabs/Lib/ThreadItem.php:234 msgid "starred" msgstr "preferidas" -#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:663 +#: ../../Zotlabs/Lib/ThreadItem.php:244 ../../include/conversation.php:688 msgid "Message signature validated" msgstr "Firma de mensaje validada" -#: ../../Zotlabs/Lib/ThreadItem.php:241 ../../include/conversation.php:664 +#: ../../Zotlabs/Lib/ThreadItem.php:245 ../../include/conversation.php:689 msgid "Message signature incorrect" msgstr "Firma de mensaje incorrecta" -#: ../../Zotlabs/Lib/ThreadItem.php:249 +#: ../../Zotlabs/Lib/ThreadItem.php:253 msgid "Add Tag" msgstr "Añadir etiqueta" -#: ../../Zotlabs/Lib/ThreadItem.php:267 ../../include/taxonomy.php:355 +#: ../../Zotlabs/Lib/ThreadItem.php:271 ../../include/taxonomy.php:433 msgid "like" msgstr "me gusta" -#: ../../Zotlabs/Lib/ThreadItem.php:268 ../../include/taxonomy.php:356 +#: ../../Zotlabs/Lib/ThreadItem.php:272 ../../include/taxonomy.php:434 msgid "dislike" msgstr "no me gusta" -#: ../../Zotlabs/Lib/ThreadItem.php:272 +#: ../../Zotlabs/Lib/ThreadItem.php:276 msgid "Share This" msgstr "Compartir esto" -#: ../../Zotlabs/Lib/ThreadItem.php:272 +#: ../../Zotlabs/Lib/ThreadItem.php:276 msgid "share" msgstr "compartir" -#: ../../Zotlabs/Lib/ThreadItem.php:281 +#: ../../Zotlabs/Lib/ThreadItem.php:285 msgid "Delivery Report" msgstr "Informe de transmisión" -#: ../../Zotlabs/Lib/ThreadItem.php:299 +#: ../../Zotlabs/Lib/ThreadItem.php:303 #, php-format msgid "%d comment" msgid_plural "%d comments" msgstr[0] "%d comentario" msgstr[1] "%d comentarios" -#: ../../Zotlabs/Lib/ThreadItem.php:328 ../../Zotlabs/Lib/ThreadItem.php:329 +#: ../../Zotlabs/Lib/ThreadItem.php:333 ../../Zotlabs/Lib/ThreadItem.php:334 #, php-format msgid "View %s's profile - %s" msgstr "Ver el perfil de %s - %s" -#: ../../Zotlabs/Lib/ThreadItem.php:332 +#: ../../Zotlabs/Lib/ThreadItem.php:337 msgid "to" msgstr "a" -#: ../../Zotlabs/Lib/ThreadItem.php:333 +#: ../../Zotlabs/Lib/ThreadItem.php:338 msgid "via" msgstr "mediante" -#: ../../Zotlabs/Lib/ThreadItem.php:334 +#: ../../Zotlabs/Lib/ThreadItem.php:339 msgid "Wall-to-Wall" msgstr "De página del perfil a página del perfil (de \"muro\" a \"muro\")" -#: ../../Zotlabs/Lib/ThreadItem.php:335 +#: ../../Zotlabs/Lib/ThreadItem.php:340 msgid "via Wall-To-Wall:" msgstr "Mediante el procedimiento página del perfil a página del perfil (de \"muro\" a \"muro\")" -#: ../../Zotlabs/Lib/ThreadItem.php:348 ../../include/conversation.php:715 +#: ../../Zotlabs/Lib/ThreadItem.php:353 ../../include/conversation.php:747 #, php-format msgid "from %s" msgstr "desde %s" -#: ../../Zotlabs/Lib/ThreadItem.php:351 ../../include/conversation.php:718 +#: ../../Zotlabs/Lib/ThreadItem.php:356 ../../include/conversation.php:750 #, php-format msgid "last edited: %s" msgstr "último cambio: %s" -#: ../../Zotlabs/Lib/ThreadItem.php:352 ../../include/conversation.php:719 +#: ../../Zotlabs/Lib/ThreadItem.php:357 ../../include/conversation.php:751 #, php-format msgid "Expires: %s" msgstr "Caduca: %s" -#: ../../Zotlabs/Lib/ThreadItem.php:358 +#: ../../Zotlabs/Lib/ThreadItem.php:363 msgid "Attend" msgstr "Participar o asistir" -#: ../../Zotlabs/Lib/ThreadItem.php:359 +#: ../../Zotlabs/Lib/ThreadItem.php:364 msgid "Attendance Options" msgstr "Opciones de participación o asistencia" -#: ../../Zotlabs/Lib/ThreadItem.php:360 +#: ../../Zotlabs/Lib/ThreadItem.php:365 msgid "Vote" msgstr "Votar" -#: ../../Zotlabs/Lib/ThreadItem.php:361 +#: ../../Zotlabs/Lib/ThreadItem.php:366 msgid "Voting Options" msgstr "Opciones de votación" -#: ../../Zotlabs/Lib/ThreadItem.php:382 +#: ../../Zotlabs/Lib/ThreadItem.php:387 #: ../../addon/bookmarker/bookmarker.php:38 msgid "Save Bookmarks" msgstr "Guardar en Marcadores" -#: ../../Zotlabs/Lib/ThreadItem.php:383 +#: ../../Zotlabs/Lib/ThreadItem.php:388 msgid "Add to Calendar" msgstr "Añadir al calendario" -#: ../../Zotlabs/Lib/ThreadItem.php:441 ../../include/js_strings.php:7 +#: ../../Zotlabs/Lib/ThreadItem.php:415 ../../include/conversation.php:471 +msgid "This is an unsaved preview" +msgstr "Esta es una previsualización sin guardar" + +#: ../../Zotlabs/Lib/ThreadItem.php:447 ../../include/js_strings.php:7 #, php-format msgid "%s show all" msgstr "%s mostrar todo" -#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/conversation.php:1315 +#: ../../Zotlabs/Lib/ThreadItem.php:744 ../../include/conversation.php:1360 msgid "Bold" msgstr "Negrita" -#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../include/conversation.php:1316 +#: ../../Zotlabs/Lib/ThreadItem.php:745 ../../include/conversation.php:1361 msgid "Italic" msgstr "Itálico " -#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1317 +#: ../../Zotlabs/Lib/ThreadItem.php:746 ../../include/conversation.php:1362 msgid "Underline" msgstr "Subrayar" -#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1318 +#: ../../Zotlabs/Lib/ThreadItem.php:747 ../../include/conversation.php:1363 msgid "Quote" msgstr "Citar" -#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1319 +#: ../../Zotlabs/Lib/ThreadItem.php:748 ../../include/conversation.php:1364 msgid "Code" msgstr "Código" -#: ../../Zotlabs/Lib/ThreadItem.php:736 +#: ../../Zotlabs/Lib/ThreadItem.php:749 msgid "Image" msgstr "Imagen" -#: ../../Zotlabs/Lib/ThreadItem.php:737 +#: ../../Zotlabs/Lib/ThreadItem.php:750 +msgid "Attach File" +msgstr "Fichero adjunto" + +#: ../../Zotlabs/Lib/ThreadItem.php:751 msgid "Insert Link" msgstr "Insertar enlace" -#: ../../Zotlabs/Lib/ThreadItem.php:738 +#: ../../Zotlabs/Lib/ThreadItem.php:752 msgid "Video" msgstr "Vídeo" -#: ../../Zotlabs/Lib/ThreadItem.php:747 +#: ../../Zotlabs/Lib/ThreadItem.php:762 msgid "Your full name (required)" msgstr "Su nombre completo (requerido)" -#: ../../Zotlabs/Lib/ThreadItem.php:748 +#: ../../Zotlabs/Lib/ThreadItem.php:763 msgid "Your email address (required)" msgstr "Su dirección de correo electrónico (requerido)" -#: ../../Zotlabs/Lib/ThreadItem.php:749 +#: ../../Zotlabs/Lib/ThreadItem.php:764 msgid "Your website URL (optional)" msgstr "La URL de su sitio web (opcional)" -#: ../../Zotlabs/Zot/Auth.php:138 +#: ../../Zotlabs/Zot/Auth.php:152 msgid "" "Remote authentication blocked. You are logged into this site locally. Please" " logout and retry." msgstr "La autenticación desde su servidor está bloqueada. Ha iniciado sesión localmente. Por favor, salga de la sesión y vuelva a intentarlo." -#: ../../Zotlabs/Zot/Auth.php:250 ../../addon/openid/Mod_Openid.php:76 +#: ../../Zotlabs/Zot/Auth.php:264 ../../addon/openid/Mod_Openid.php:76 #: ../../addon/openid/Mod_Openid.php:178 #, php-format msgid "Welcome %s. Remote authentication successful." @@ -7938,7 +8102,7 @@ msgstr "Bienvenido %s. La identificación desde su servidor se ha llevado a cabo msgid "parent" msgstr "padre" -#: ../../Zotlabs/Storage/Browser.php:131 ../../include/text.php:2692 +#: ../../Zotlabs/Storage/Browser.php:131 ../../include/text.php:2707 msgid "Collection" msgstr "Colección" @@ -8085,12 +8249,14 @@ msgstr "Seleccionar una agenda para importarla" #: ../../Zotlabs/Widget/Appcategories.php:39 #: ../../Zotlabs/Widget/Tagcloud.php:25 ../../include/contact_widgets.php:91 -#: ../../include/taxonomy.php:227 ../../include/taxonomy.php:309 +#: ../../include/contact_widgets.php:132 ../../include/taxonomy.php:285 +#: ../../include/taxonomy.php:367 ../../include/taxonomy.php:387 msgid "Categories" msgstr "Temas" #: ../../Zotlabs/Widget/Appcategories.php:42 ../../Zotlabs/Widget/Filer.php:31 #: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94 +#: ../../include/contact_widgets.php:135 msgid "Everything" msgstr "Todo" @@ -8118,21 +8284,21 @@ msgstr "Menú de correo privado" msgid "Combined View" msgstr "Vista combinada" -#: ../../Zotlabs/Widget/Mailmenu.php:20 ../../include/nav.php:190 +#: ../../Zotlabs/Widget/Mailmenu.php:20 ../../include/nav.php:119 msgid "Inbox" msgstr "Bandeja de entrada" -#: ../../Zotlabs/Widget/Mailmenu.php:25 ../../include/nav.php:191 +#: ../../Zotlabs/Widget/Mailmenu.php:25 ../../include/nav.php:120 msgid "Outbox" msgstr "Bandeja de salida" -#: ../../Zotlabs/Widget/Mailmenu.php:30 ../../include/nav.php:192 +#: ../../Zotlabs/Widget/Mailmenu.php:30 ../../include/nav.php:121 msgid "New Message" msgstr "Nuevo mensaje" #: ../../Zotlabs/Widget/Chatroom_list.php:16 -#: ../../include/conversation.php:1813 ../../include/conversation.php:1816 -#: ../../include/nav.php:411 ../../include/nav.php:414 +#: ../../include/conversation.php:1847 ../../include/conversation.php:1850 +#: ../../include/nav.php:455 ../../include/nav.php:458 msgid "Chatrooms" msgstr "Salas de chat" @@ -8214,7 +8380,7 @@ msgstr "foto/imagen" msgid "Remove term" msgstr "Eliminar término" -#: ../../Zotlabs/Widget/Savedsearch.php:83 ../../include/features.php:297 +#: ../../Zotlabs/Widget/Savedsearch.php:83 ../../include/features.php:306 msgid "Saved Searches" msgstr "Búsquedas guardadas" @@ -8226,15 +8392,15 @@ msgstr "añadir" msgid "Notes" msgstr "Notas" -#: ../../Zotlabs/Widget/Wiki_pages.php:52 ../../addon/gitwiki/gitwiki.php:76 +#: ../../Zotlabs/Widget/Wiki_pages.php:47 ../../addon/gitwiki/gitwiki.php:76 msgid "Wiki Pages" msgstr "Páginas del wiki" -#: ../../Zotlabs/Widget/Wiki_pages.php:58 ../../addon/gitwiki/gitwiki.php:81 +#: ../../Zotlabs/Widget/Wiki_pages.php:53 ../../addon/gitwiki/gitwiki.php:81 msgid "Add new page" msgstr "Añadir una nueva página" -#: ../../Zotlabs/Widget/Wiki_pages.php:59 ../../addon/gitwiki/gitwiki.php:82 +#: ../../Zotlabs/Widget/Wiki_pages.php:58 ../../addon/gitwiki/gitwiki.php:82 msgid "Page name" msgstr "Nombre de la página" @@ -8255,7 +8421,7 @@ msgid "See more..." msgstr "Ver más..." #: ../../Zotlabs/Widget/Filer.php:28 ../../include/contact_widgets.php:53 -#: ../../include/features.php:386 +#: ../../include/features.php:395 msgid "Saved Folders" msgstr "Carpetas guardadas" @@ -8275,7 +8441,7 @@ msgstr "Examinar la cola" msgid "DB updates" msgstr "Actualizaciones de la base de datos" -#: ../../Zotlabs/Widget/Admin.php:55 ../../include/nav.php:215 +#: ../../Zotlabs/Widget/Admin.php:55 ../../include/nav.php:224 msgid "Admin" msgstr "Administrador" @@ -8315,7 +8481,7 @@ msgstr "Exportar canal" msgid "Connected apps" msgstr "Aplicaciones (apps) conectadas" -#: ../../Zotlabs/Widget/Settings_menu.php:100 ../../include/features.php:149 +#: ../../Zotlabs/Widget/Settings_menu.php:100 ../../include/features.php:158 msgid "Permission Groups" msgstr "Grupos de permisos" @@ -8327,151 +8493,289 @@ msgstr "Configuración del canal premium" msgid "Bookmarked Chatrooms" msgstr "Salas de chat preferidas" +#: ../../Zotlabs/Widget/Notifications.php:16 +msgid "New Network Activity" +msgstr "Nueva actividad en la red" + +#: ../../Zotlabs/Widget/Notifications.php:17 +msgid "New Network Activity Notifications" +msgstr "Avisos de nueva actividad en la red" + +#: ../../Zotlabs/Widget/Notifications.php:20 ../../include/nav.php:99 +msgid "View your network activity" +msgstr "Ver su actividad en la red" + +#: ../../Zotlabs/Widget/Notifications.php:24 +msgid "Mark all notifications read" +msgstr "Marcar todas las notificaciones como leídas" + +#: ../../Zotlabs/Widget/Notifications.php:32 +msgid "New Home Activity" +msgstr "Nueva actividad en su página principal" + +#: ../../Zotlabs/Widget/Notifications.php:33 +msgid "New Home Activity Notifications" +msgstr "Avisos de nueva actividad en su página principal" + +#: ../../Zotlabs/Widget/Notifications.php:36 +msgid "View your home activity" +msgstr "Ver su actividad en su página principal" + +#: ../../Zotlabs/Widget/Notifications.php:40 +#: ../../Zotlabs/Widget/Notifications.php:136 +msgid "Mark all notifications seen" +msgstr "Marcar todas las notificaciones como vistas" + +#: ../../Zotlabs/Widget/Notifications.php:48 +msgid "New Mails" +msgstr "Nuevos mensajes de correo" + +#: ../../Zotlabs/Widget/Notifications.php:49 +msgid "New Mails Notifications" +msgstr "Avisos de nuevos mensajes de correo" + +#: ../../Zotlabs/Widget/Notifications.php:52 +msgid "View your private mails" +msgstr "Ver sus correos privados" + +#: ../../Zotlabs/Widget/Notifications.php:56 +msgid "Mark all messages seen" +msgstr "Marcar todos los mensajes como vistos" + +#: ../../Zotlabs/Widget/Notifications.php:64 +msgid "New Events" +msgstr "Eventos nuevos" + +#: ../../Zotlabs/Widget/Notifications.php:65 +msgid "New Events Notifications" +msgstr "Avisos de nuevos eventos" + +#: ../../Zotlabs/Widget/Notifications.php:68 ../../include/nav.php:125 +msgid "View events" +msgstr "Ver los eventos" + +#: ../../Zotlabs/Widget/Notifications.php:72 ../../include/nav.php:126 +msgid "Mark all events seen" +msgstr "Marcar todos los eventos como leidos" + +#: ../../Zotlabs/Widget/Notifications.php:81 +msgid "New Connections Notifications" +msgstr "Avisos de nuevas conexiones" + +#: ../../Zotlabs/Widget/Notifications.php:84 +msgid "View all connections" +msgstr "Ver todas las conexiones" + +#: ../../Zotlabs/Widget/Notifications.php:92 +msgid "New Files" +msgstr "Ficheros nuevos" + +#: ../../Zotlabs/Widget/Notifications.php:93 +msgid "New Files Notifications" +msgstr "Avisos de nuevos ficheros" + +#: ../../Zotlabs/Widget/Notifications.php:100 +#: ../../Zotlabs/Widget/Notifications.php:101 ../../include/nav.php:112 +msgid "Notices" +msgstr "Avisos" + +#: ../../Zotlabs/Widget/Notifications.php:104 +msgid "View all notices" +msgstr "Ver todos los avisos" + +#: ../../Zotlabs/Widget/Notifications.php:108 +msgid "Mark all notices seen" +msgstr "Marcar como leídos todos los avisos" + +#: ../../Zotlabs/Widget/Notifications.php:118 +msgid "New Registrations" +msgstr "Registros nuevos" + +#: ../../Zotlabs/Widget/Notifications.php:119 +msgid "New Registrations Notifications" +msgstr "Notificaciones de nuevos registros" + +#: ../../Zotlabs/Widget/Notifications.php:129 +msgid "Public Stream Notifications" +msgstr "Avisos del \"stream\" público" + +#: ../../Zotlabs/Widget/Notifications.php:132 +msgid "View the public stream" +msgstr "Ver el \"stream\" público" + +#: ../../Zotlabs/Widget/Notifications.php:143 +#: ../../include/conversation.php:871 ../../include/nav.php:305 +msgid "Loading..." +msgstr "Cargando..." + #: ../../util/nconfig.php:34 msgid "Source channel not found." msgstr "No se ha encontrado el canal de origen." -#: ../../boot.php:1581 +#: ../../boot.php:1619 msgid "Create an account to access services and applications" msgstr "Crear una cuenta para acceder a los servicios y aplicaciones" -#: ../../boot.php:1600 ../../include/nav.php:99 ../../include/nav.php:123 -#: ../../include/nav.php:140 +#: ../../boot.php:1638 ../../include/nav.php:138 ../../include/nav.php:167 +#: ../../include/nav.php:184 msgid "Logout" msgstr "Finalizar sesión" -#: ../../boot.php:1603 +#: ../../boot.php:1642 msgid "Login/Email" msgstr "Inicio de sesión / Correo electrónico" -#: ../../boot.php:1604 +#: ../../boot.php:1643 msgid "Password" msgstr "Contraseña" -#: ../../boot.php:1605 +#: ../../boot.php:1644 msgid "Remember me" msgstr "Recordarme" -#: ../../boot.php:1608 +#: ../../boot.php:1647 msgid "Forgot your password?" msgstr "¿Olvidó su contraseña?" -#: ../../boot.php:2146 +#: ../../boot.php:2191 msgid "toggle mobile" msgstr "cambiar a modo móvil" -#: ../../boot.php:2299 +#: ../../boot.php:2344 #, php-format msgid "[$Projectname] Website SSL error for %s" msgstr "[$Projectname] Error SSL del sitio web en %s" -#: ../../boot.php:2304 +#: ../../boot.php:2349 msgid "Website SSL certificate is not valid. Please correct." msgstr "El certificado SSL del sitio web no es válido. Por favor, solucione el problema." -#: ../../boot.php:2423 +#: ../../boot.php:2468 #, php-format msgid "[$Projectname] Cron tasks not running on %s" msgstr "[$Projectname] Las tareas de Cron no están funcionando en %s" -#: ../../boot.php:2428 +#: ../../boot.php:2473 msgid "Cron/Scheduled tasks not running." msgstr "Las tareas del Planificador/Cron no están funcionando." -#: ../../boot.php:2429 ../../include/datetime.php:286 +#: ../../boot.php:2474 ../../include/datetime.php:286 msgid "never" msgstr "nunca" +#: ../../view/theme/redbasic_c/php/config.php:16 +#: ../../view/theme/redbasic_c/php/config.php:19 #: ../../view/theme/redbasic/php/config.php:16 #: ../../view/theme/redbasic/php/config.php:19 msgid "Focus (Hubzilla default)" msgstr "Focus (predefinido)" -#: ../../view/theme/redbasic/php/config.php:99 +#: ../../view/theme/redbasic_c/php/config.php:99 +#: ../../view/theme/redbasic/php/config.php:97 msgid "Theme settings" msgstr "Ajustes del tema" -#: ../../view/theme/redbasic/php/config.php:100 +#: ../../view/theme/redbasic_c/php/config.php:100 +#: ../../view/theme/redbasic/php/config.php:98 msgid "Narrow navbar" msgstr "Estrechar la barra de navegación" -#: ../../view/theme/redbasic/php/config.php:101 +#: ../../view/theme/redbasic_c/php/config.php:101 +#: ../../view/theme/redbasic/php/config.php:99 msgid "Navigation bar background color" msgstr "Color de fondo de la barra de navegación" -#: ../../view/theme/redbasic/php/config.php:102 +#: ../../view/theme/redbasic_c/php/config.php:102 +#: ../../view/theme/redbasic/php/config.php:100 msgid "Navigation bar icon color " msgstr "Color del icono de la barra de navegación" -#: ../../view/theme/redbasic/php/config.php:103 +#: ../../view/theme/redbasic_c/php/config.php:103 +#: ../../view/theme/redbasic/php/config.php:101 msgid "Navigation bar active icon color " msgstr "Color del icono activo de la barra de navegación" -#: ../../view/theme/redbasic/php/config.php:104 +#: ../../view/theme/redbasic_c/php/config.php:104 +#: ../../view/theme/redbasic/php/config.php:102 msgid "Link color" msgstr "Color del enlace" -#: ../../view/theme/redbasic/php/config.php:105 +#: ../../view/theme/redbasic_c/php/config.php:105 +#: ../../view/theme/redbasic/php/config.php:103 msgid "Set font-color for banner" msgstr "Ajustar el color del tipo de letra para el \"banner\"" -#: ../../view/theme/redbasic/php/config.php:106 +#: ../../view/theme/redbasic_c/php/config.php:106 +#: ../../view/theme/redbasic/php/config.php:104 msgid "Set the background color" msgstr "Ajustar el color de fondo" -#: ../../view/theme/redbasic/php/config.php:107 +#: ../../view/theme/redbasic_c/php/config.php:107 +#: ../../view/theme/redbasic/php/config.php:105 msgid "Set the background image" msgstr "Ajustar la imagen de fondo" -#: ../../view/theme/redbasic/php/config.php:108 +#: ../../view/theme/redbasic_c/php/config.php:108 +#: ../../view/theme/redbasic/php/config.php:106 msgid "Set the background color of items" msgstr "Ajustar el color de los elementos de fondo" -#: ../../view/theme/redbasic/php/config.php:109 +#: ../../view/theme/redbasic_c/php/config.php:109 +#: ../../view/theme/redbasic/php/config.php:107 msgid "Set the background color of comments" msgstr "Ajustar el color de fondo de los comentarios" -#: ../../view/theme/redbasic/php/config.php:110 +#: ../../view/theme/redbasic_c/php/config.php:110 +#: ../../view/theme/redbasic/php/config.php:108 msgid "Set font-size for the entire application" msgstr "Ajustar el tamaño de letra para toda la aplicación" -#: ../../view/theme/redbasic/php/config.php:110 +#: ../../view/theme/redbasic_c/php/config.php:110 +#: ../../view/theme/redbasic/php/config.php:108 msgid "Examples: 1rem, 100%, 16px" msgstr "Ejemplos: 1rem, 100%, 16px" -#: ../../view/theme/redbasic/php/config.php:111 +#: ../../view/theme/redbasic_c/php/config.php:111 +#: ../../view/theme/redbasic/php/config.php:109 msgid "Set font-color for posts and comments" msgstr "Establecer el color de la letra para publicaciones y comentarios" -#: ../../view/theme/redbasic/php/config.php:112 +#: ../../view/theme/redbasic_c/php/config.php:112 +#: ../../view/theme/redbasic/php/config.php:110 msgid "Set radius of corners" msgstr "Establecer el radio de curvatura de las esquinas" -#: ../../view/theme/redbasic/php/config.php:112 +#: ../../view/theme/redbasic_c/php/config.php:112 +#: ../../view/theme/redbasic/php/config.php:110 msgid "Example: 4px" msgstr "Ejemplo: 4px" -#: ../../view/theme/redbasic/php/config.php:113 +#: ../../view/theme/redbasic_c/php/config.php:113 +#: ../../view/theme/redbasic/php/config.php:111 msgid "Set shadow depth of photos" msgstr "Ajustar la profundidad de sombras de las fotos" -#: ../../view/theme/redbasic/php/config.php:114 +#: ../../view/theme/redbasic_c/php/config.php:114 +#: ../../view/theme/redbasic/php/config.php:112 msgid "Set maximum width of content region in pixel" msgstr "Ajustar la anchura máxima de la región de contenido, en pixels" -#: ../../view/theme/redbasic/php/config.php:114 +#: ../../view/theme/redbasic_c/php/config.php:114 +#: ../../view/theme/redbasic/php/config.php:112 msgid "Leave empty for default width" msgstr "Dejar en blanco para la anchura predeterminada" -#: ../../view/theme/redbasic/php/config.php:115 +#: ../../view/theme/redbasic_c/php/config.php:115 msgid "Left align page content" msgstr "Alinear a la izquierda el contenido de la página" -#: ../../view/theme/redbasic/php/config.php:116 +#: ../../view/theme/redbasic_c/php/config.php:116 +#: ../../view/theme/redbasic/php/config.php:113 msgid "Set size of conversation author photo" msgstr "Ajustar el tamaño de la foto del autor de la conversación" -#: ../../view/theme/redbasic/php/config.php:117 +#: ../../view/theme/redbasic_c/php/config.php:117 +#: ../../view/theme/redbasic/php/config.php:114 msgid "Set size of followup author photos" msgstr "Ajustar el tamaño de foto de los seguidores del autor" @@ -8613,30 +8917,30 @@ msgstr "Un ajuste" msgid "Skeleton Settings" msgstr "Ajustes de Skeleton" -#: ../../addon/gnusoc/gnusoc.php:200 +#: ../../addon/gnusoc/gnusoc.php:243 msgid "GNU-Social Protocol Settings updated." msgstr "Se han actualizado los ajustes del protocolo de GNU-Social." -#: ../../addon/gnusoc/gnusoc.php:219 +#: ../../addon/gnusoc/gnusoc.php:262 msgid "" "The GNU-Social protocol does not support location independence. Connections " "you make within that network may be unreachable from alternate channel " "locations." msgstr "El protocolo de GNU-Social no admite la independencia de la ubicación. Las\n conexiones que realice dentro de esa red pueden ser inaccesibles desde \nubicaciones de canales alternativos." -#: ../../addon/gnusoc/gnusoc.php:222 +#: ../../addon/gnusoc/gnusoc.php:265 msgid "Enable the GNU-Social protocol for this channel" msgstr "Activar el protocolo de GNU-Social para este canal" -#: ../../addon/gnusoc/gnusoc.php:226 +#: ../../addon/gnusoc/gnusoc.php:269 msgid "GNU-Social Protocol Settings" msgstr "Ajustes del protocolo de GNU-Social" -#: ../../addon/gnusoc/gnusoc.php:417 +#: ../../addon/gnusoc/gnusoc.php:460 msgid "Follow" msgstr "Seguir" -#: ../../addon/gnusoc/gnusoc.php:420 +#: ../../addon/gnusoc/gnusoc.php:463 #, php-format msgid "%1$s is now following %2$s" msgstr "%1$s está siguiendo ahora a %2$s" @@ -8682,8 +8986,8 @@ msgstr "Regresar después" msgid "Page to load after image selection." msgstr "Página para cargar después de la selección de imágenes." -#: ../../addon/openclipatar/openclipatar.php:58 ../../include/channel.php:1165 -#: ../../include/nav.php:107 +#: ../../addon/openclipatar/openclipatar.php:58 ../../include/channel.php:1266 +#: ../../include/nav.php:146 msgid "Edit Profile" msgstr "Editar el perfil" @@ -8756,6 +9060,10 @@ msgstr "Error desconocido. Por favor, inténtelo otra vez." msgid "Profile photo updated successfully." msgstr "Se ha actualizado con éxito la foto de perfil." +#: ../../addon/zotvi/zot6.php:25 ../../include/zot.php:3983 +msgid "invalid target signature" +msgstr "La firma recibida no es válida" + #: ../../addon/adultphotoflag/adultphotoflag.php:24 msgid "Flag Adult Photos" msgstr "Indicador (\"flag\") de fotos de adultos" @@ -9217,17 +9525,17 @@ msgstr "Fecha de nacimiento" msgid "OpenID protocol error. No ID returned." msgstr "Error de protocolo OpenID. No se recuperó ninguna ID." -#: ../../addon/openid/Mod_Openid.php:188 ../../include/auth.php:286 +#: ../../addon/openid/Mod_Openid.php:188 ../../include/auth.php:289 msgid "Login failed." msgstr "El acceso ha fallado." #: ../../addon/openid/Mod_Id.php:85 ../../include/selectors.php:49 -#: ../../include/selectors.php:66 ../../include/channel.php:1332 +#: ../../include/selectors.php:66 ../../include/channel.php:1432 msgid "Male" msgstr "Hombre" #: ../../addon/openid/Mod_Id.php:87 ../../include/selectors.php:49 -#: ../../include/selectors.php:66 ../../include/channel.php:1330 +#: ../../include/selectors.php:66 ../../include/channel.php:1430 msgid "Female" msgstr "Mujer" @@ -9414,39 +9722,39 @@ msgstr "una declaración de amor eterno" msgid "declared undying love for" msgstr "ha declarado amor eterno a" -#: ../../addon/diaspora/diaspora.php:715 +#: ../../addon/diaspora/diaspora.php:763 msgid "Diaspora Protocol Settings updated." msgstr "Los ajustes del protocolo de Diaspora se han actualizado." -#: ../../addon/diaspora/diaspora.php:734 +#: ../../addon/diaspora/diaspora.php:782 msgid "" "The Diaspora protocol does not support location independence. Connections " "you make within that network may be unreachable from alternate channel " "locations." msgstr "El protocolo de Diaspora no admite la independencia de la ubicación. Las conexiones que realice dentro de esa red pueden ser inaccesibles desde ubicaciones de canales alternativos." -#: ../../addon/diaspora/diaspora.php:737 +#: ../../addon/diaspora/diaspora.php:785 msgid "Enable the Diaspora protocol for this channel" msgstr "Activar el protocolo de Diaspora para este canal" -#: ../../addon/diaspora/diaspora.php:741 +#: ../../addon/diaspora/diaspora.php:789 msgid "Allow any Diaspora member to comment on your public posts" msgstr "Permitir a cualquier miembro de Diaspora comentar sus entradas públicas" -#: ../../addon/diaspora/diaspora.php:745 +#: ../../addon/diaspora/diaspora.php:793 msgid "Prevent your hashtags from being redirected to other sites" msgstr "Impedir que sus \"hashtags\" sean redirigidos a otros sitios " -#: ../../addon/diaspora/diaspora.php:749 +#: ../../addon/diaspora/diaspora.php:797 msgid "" "Sign and forward posts and comments with no existing Diaspora signature" msgstr "Firmar y enviar entradas y comentarios sin firma de Diaspora" -#: ../../addon/diaspora/diaspora.php:754 +#: ../../addon/diaspora/diaspora.php:802 msgid "Followed hashtags (comma separated, do not include the #)" msgstr "\"Hashtags\" seguidos (separados por comas, sin incluir #)" -#: ../../addon/diaspora/diaspora.php:759 +#: ../../addon/diaspora/diaspora.php:807 msgid "Diaspora Protocol Settings" msgstr "Ajustes del protocolo de Diaspora" @@ -9458,18 +9766,6 @@ msgstr "No se ha encontrado el nombre de usuario en el fichero de importación." msgid "Unable to create a unique channel address. Import failed." msgstr "No se ha podido crear una dirección de canal única. Ha fallado la importación." -#: ../../addon/gitwiki/Mod_Gitwiki.php:107 -msgid "Error retrieving wiki" -msgstr "Error al recuperar el wiki" - -#: ../../addon/gitwiki/Mod_Gitwiki.php:114 -msgid "Error creating zip file export folder" -msgstr "Error al crear el fichero comprimido zip de la carpeta a exportar" - -#: ../../addon/gitwiki/Mod_Gitwiki.php:132 -msgid "Error downloading wiki: " -msgstr "Error al descargar el wiki: " - #: ../../addon/testdrive/testdrive.php:104 #, php-format msgid "Your account on %s will expire in a few days." @@ -9507,6 +9803,66 @@ msgstr "PHP upload_max_filesize: " msgid "PHP post_max_size (must be larger than upload_max_filesize): " msgstr "PHP post_max_size (debe ser mayor que upload_max_filesize): " +#: ../../addon/gravatar/gravatar.php:123 +msgid "generic profile image" +msgstr "imagen del perfil general" + +#: ../../addon/gravatar/gravatar.php:124 +msgid "random geometric pattern" +msgstr "patrón geométrico aleatorio" + +#: ../../addon/gravatar/gravatar.php:125 +msgid "monster face" +msgstr "cara de monstruo" + +#: ../../addon/gravatar/gravatar.php:126 +msgid "computer generated face" +msgstr "cara generada por ordenador" + +#: ../../addon/gravatar/gravatar.php:127 +msgid "retro arcade style face" +msgstr "cara de estilo retro arcade" + +#: ../../addon/gravatar/gravatar.php:128 +msgid "Hub default profile photo" +msgstr "Foto del perfil por defecto del hub" + +#: ../../addon/gravatar/gravatar.php:143 +msgid "Information" +msgstr "Información" + +#: ../../addon/gravatar/gravatar.php:143 +msgid "" +"Libravatar addon is installed, too. Please disable Libravatar addon or this " +"Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if " +"nothing was found at Libravatar." +msgstr "El addon Libravatar también está instalado. Por favor deshabilite el addon de Libravatar o este addon de Gravatar.<br> El addon de Libravatar volverá a Gravatar si no se encuentra nada en Libravatar." + +#: ../../addon/gravatar/gravatar.php:150 +#: ../../addon/msgfooter/msgfooter.php:46 ../../addon/xmpp/xmpp.php:91 +msgid "Save Settings" +msgstr "Guardar ajustes" + +#: ../../addon/gravatar/gravatar.php:151 +msgid "Default avatar image" +msgstr "Imagen del avatar por defecto" + +#: ../../addon/gravatar/gravatar.php:151 +msgid "Select default avatar image if none was found at Gravatar. See README" +msgstr "Selecciona la imagen de avatar predeterminada si no se encontró ninguna en Gravatar. Ver README" + +#: ../../addon/gravatar/gravatar.php:152 +msgid "Rating of images" +msgstr "Valoración de las imágenes" + +#: ../../addon/gravatar/gravatar.php:152 +msgid "Select the appropriate avatar rating for your site. See README" +msgstr "Seleccione la valoración adecuada del avatar para su sitio. Ver README" + +#: ../../addon/gravatar/gravatar.php:165 +msgid "Gravatar settings updated." +msgstr "Se han actualizado los ajustes de Gravatar." + #: ../../addon/visage/visage.php:93 msgid "Recent Channel/Profile Viewers" msgstr "Visitantes recientes del canal o perfil" @@ -9613,10 +9969,6 @@ msgstr "Incluir un marcador en el mapa" msgid "Include a marker on the map." msgstr "Incluir un marcador en el mapa." -#: ../../addon/msgfooter/msgfooter.php:46 ../../addon/xmpp/xmpp.php:91 -msgid "Save Settings" -msgstr "Guardar ajustes" - #: ../../addon/msgfooter/msgfooter.php:47 msgid "text to include in all outgoing posts from this site" msgstr "texto a incluir en todos los mensajes salientes de este sitio" @@ -9657,8 +10009,8 @@ msgstr "Contraseña de Friendica" msgid "Hubzilla to Friendica Post Settings" msgstr "Ajustes de publicación de Hubzilla a Friendica" -#: ../../addon/jappixmini/jappixmini.php:305 ../../include/channel.php:1256 -#: ../../include/channel.php:1419 +#: ../../addon/jappixmini/jappixmini.php:305 ../../include/channel.php:1357 +#: ../../include/channel.php:1519 msgid "Status:" msgstr "Estado:" @@ -9823,6 +10175,30 @@ msgstr "Nombre de inicio de sesión en Friendica" msgid "Friendica Login Password" msgstr "Contraseña de inicio de sesión en Friendica" +#: ../../addon/pubcrawl/as.php:1076 ../../addon/pubcrawl/as.php:1160 +#: ../../addon/pubcrawl/as.php:1332 ../../include/network.php:1705 +msgid "ActivityPub" +msgstr "ActivityPub" + +#: ../../addon/pubcrawl/pubcrawl.php:1032 +msgid "ActivityPub Protocol Settings updated." +msgstr "Se han actualizado los ajustes del protocolo ActivityPub." + +#: ../../addon/pubcrawl/pubcrawl.php:1041 +msgid "" +"The ActivityPub protocol does not support location independence. Connections" +" you make within that network may be unreachable from alternate channel " +"locations." +msgstr "El protocolo ActivityPub no soporta la independencia de ubicación. Las conexiones que realice dentro de esa red pueden no ser accesibles desde ubicaciones de canales alternativos." + +#: ../../addon/pubcrawl/pubcrawl.php:1044 +msgid "Enable the ActivityPub protocol for this channel" +msgstr "Activar el protocolo ActivityPub para este canal" + +#: ../../addon/pubcrawl/pubcrawl.php:1049 +msgid "ActivityPub Protocol Settings" +msgstr "Ajustes del protocolo ActivityPub" + #: ../../addon/donate/donate.php:21 msgid "Project Servers and Resources" msgstr "Servidores y recursos del proyecto" @@ -10185,43 +10561,39 @@ msgstr "Generador QR" msgid "Enter some text" msgstr "Escribir algún texto" -#: ../../addon/chess/chess.php:276 ../../addon/chess/chess.php:433 +#: ../../addon/chess/chess.php:278 ../../addon/chess/chess.php:465 msgid "Invalid game." msgstr "Juego no válido." -#: ../../addon/chess/chess.php:282 ../../addon/chess/chess.php:439 +#: ../../addon/chess/chess.php:284 ../../addon/chess/chess.php:471 msgid "You are not a player in this game." msgstr "Usted no participa en este juego." -#: ../../addon/chess/chess.php:315 +#: ../../addon/chess/chess.php:340 msgid "You must be a local channel to create a game." msgstr "Debe ser un canal local para crear un juego" -#: ../../addon/chess/chess.php:333 +#: ../../addon/chess/chess.php:358 msgid "You must select one opponent that is not yourself." msgstr "Debe seleccionar un oponente que no sea usted mismo." -#: ../../addon/chess/chess.php:336 -msgid "Creating new game..." -msgstr "Crear un nuevo juego..." - -#: ../../addon/chess/chess.php:342 +#: ../../addon/chess/chess.php:367 msgid "You must select white or black." msgstr "Debe elegir blancas o negras." -#: ../../addon/chess/chess.php:349 +#: ../../addon/chess/chess.php:375 msgid "Error creating new game." msgstr "Error al crear un nuevo juego." -#: ../../addon/chess/chess.php:381 ../../include/channel.php:1016 +#: ../../addon/chess/chess.php:409 ../../include/channel.php:1117 msgid "Requested channel is not available." msgstr "El canal solicitado no está disponible." -#: ../../addon/chess/chess.php:395 +#: ../../addon/chess/chess.php:423 msgid "You must select a local channel /chess/channelname" msgstr "Debe seleccionar un canal local /chess/nombredelcanal" -#: ../../addon/chess/chess.php:923 +#: ../../addon/chess/chess.php:969 msgid "Enable notifications" msgstr "Habilitar notificaciones" @@ -10819,11 +11191,6 @@ msgstr "fichero" msgid "Send email to all members" msgstr "Enviar un correo electrónico a todos los miembros" -#: ../../addon/hubwall/hubwall.php:33 -#, php-format -msgid "$1%s Administrator" -msgstr "Administrador de $1%s " - #: ../../addon/hubwall/hubwall.php:73 #, php-format msgid "%1$d of %2$d messages sent." @@ -10897,11 +11264,11 @@ msgstr "Transexual" msgid "Hermaphrodite" msgstr "Hermafrodita" -#: ../../include/selectors.php:49 ../../include/channel.php:1336 +#: ../../include/selectors.php:49 ../../include/channel.php:1436 msgid "Neuter" msgstr "Neutral" -#: ../../include/selectors.php:49 ../../include/channel.php:1338 +#: ../../include/selectors.php:49 ../../include/channel.php:1438 msgid "Non-specific" msgstr "No especificado" @@ -11091,282 +11458,274 @@ msgstr "%1$s ahora está conectado/a con %2$s" msgid "%1$s poked %2$s" msgstr "%1$s ha dado un toque a %2$s" -#: ../../include/conversation.php:239 ../../include/text.php:1096 -#: ../../include/text.php:1101 +#: ../../include/conversation.php:239 ../../include/text.php:1104 +#: ../../include/text.php:1109 msgid "poked" msgstr "ha dado un toque a" -#: ../../include/conversation.php:688 +#: ../../include/conversation.php:720 #, php-format msgid "View %s's profile @ %s" msgstr "Ver el perfil @ %s de %s" -#: ../../include/conversation.php:708 +#: ../../include/conversation.php:740 msgid "Categories:" msgstr "Temas:" -#: ../../include/conversation.php:709 +#: ../../include/conversation.php:741 msgid "Filed under:" msgstr "Archivado bajo:" -#: ../../include/conversation.php:734 +#: ../../include/conversation.php:766 msgid "View in context" msgstr "Mostrar en su contexto" -#: ../../include/conversation.php:831 +#: ../../include/conversation.php:867 msgid "remove" msgstr "eliminar" -#: ../../include/conversation.php:835 ../../include/nav.php:268 -msgid "Loading..." -msgstr "Cargando..." - -#: ../../include/conversation.php:836 +#: ../../include/conversation.php:872 msgid "Delete Selected Items" msgstr "Eliminar elementos seleccionados" -#: ../../include/conversation.php:879 +#: ../../include/conversation.php:915 msgid "View Source" msgstr "Ver el código fuente de la entrada" -#: ../../include/conversation.php:889 +#: ../../include/conversation.php:925 msgid "Follow Thread" msgstr "Seguir este hilo" -#: ../../include/conversation.php:898 +#: ../../include/conversation.php:934 msgid "Unfollow Thread" msgstr "Dejar de seguir este hilo" -#: ../../include/conversation.php:989 +#: ../../include/conversation.php:1025 msgid "Activity/Posts" msgstr "Actividad y publicaciones" -#: ../../include/conversation.php:1009 +#: ../../include/conversation.php:1045 msgid "Edit Connection" msgstr "Editar conexión" -#: ../../include/conversation.php:1019 +#: ../../include/conversation.php:1055 msgid "Message" msgstr "Mensaje" -#: ../../include/conversation.php:1153 +#: ../../include/conversation.php:1189 #, php-format msgid "%s likes this." msgstr "A %s le gusta esto." -#: ../../include/conversation.php:1153 +#: ../../include/conversation.php:1189 #, php-format msgid "%s doesn't like this." msgstr "A %s no le gusta esto." -#: ../../include/conversation.php:1157 +#: ../../include/conversation.php:1193 #, php-format msgid "<span %1$s>%2$d people</span> like this." msgid_plural "<span %1$s>%2$d people</span> like this." msgstr[0] "a <span %1$s>%2$d personas</span> le gusta esto." msgstr[1] "A <span %1$s>%2$d personas</span> les gusta esto." -#: ../../include/conversation.php:1159 +#: ../../include/conversation.php:1195 #, php-format msgid "<span %1$s>%2$d people</span> don't like this." msgid_plural "<span %1$s>%2$d people</span> don't like this." msgstr[0] "a <span %1$s>%2$d personas</span> no les gusta esto." msgstr[1] "A <span %1$s>%2$d personas</span> no les gusta esto." -#: ../../include/conversation.php:1165 +#: ../../include/conversation.php:1201 msgid "and" msgstr "y" -#: ../../include/conversation.php:1168 +#: ../../include/conversation.php:1204 #, php-format msgid ", and %d other people" msgid_plural ", and %d other people" msgstr[0] ", y %d persona más" msgstr[1] ", y %d personas más" -#: ../../include/conversation.php:1169 +#: ../../include/conversation.php:1205 #, php-format msgid "%s like this." msgstr "A %s le gusta esto." -#: ../../include/conversation.php:1169 +#: ../../include/conversation.php:1205 #, php-format msgid "%s don't like this." msgstr "A %s no le gusta esto." -#: ../../include/conversation.php:1212 +#: ../../include/conversation.php:1248 msgid "Set your location" msgstr "Establecer su ubicación" -#: ../../include/conversation.php:1213 +#: ../../include/conversation.php:1249 msgid "Clear browser location" msgstr "Eliminar los datos de localización geográfica del navegador" -#: ../../include/conversation.php:1261 +#: ../../include/conversation.php:1297 msgid "Tag term:" msgstr "Término de la etiqueta:" -#: ../../include/conversation.php:1262 +#: ../../include/conversation.php:1298 msgid "Where are you right now?" msgstr "¿Donde está ahora?" -#: ../../include/conversation.php:1267 +#: ../../include/conversation.php:1303 msgid "Choose a different album..." msgstr "Elegir un álbum diferente..." -#: ../../include/conversation.php:1271 +#: ../../include/conversation.php:1307 msgid "Comments enabled" msgstr "Comentarios habilitados" -#: ../../include/conversation.php:1272 +#: ../../include/conversation.php:1308 msgid "Comments disabled" msgstr "Comentarios deshabilitados" -#: ../../include/conversation.php:1310 +#: ../../include/conversation.php:1355 msgid "Page link name" msgstr "Nombre del enlace de la página" -#: ../../include/conversation.php:1313 +#: ../../include/conversation.php:1358 msgid "Post as" msgstr "Publicar como" -#: ../../include/conversation.php:1327 +#: ../../include/conversation.php:1372 msgid "Toggle voting" msgstr "Cambiar votación" -#: ../../include/conversation.php:1330 +#: ../../include/conversation.php:1375 msgid "Disable comments" msgstr "Dehabilitar los comentarios" -#: ../../include/conversation.php:1331 +#: ../../include/conversation.php:1376 msgid "Toggle comments" msgstr "Activar o desactivar los comentarios" -#: ../../include/conversation.php:1339 +#: ../../include/conversation.php:1384 msgid "Categories (optional, comma-separated list)" msgstr "Temas (opcional, lista separada por comas)" -#: ../../include/conversation.php:1362 +#: ../../include/conversation.php:1407 msgid "Other networks and post services" msgstr "Otras redes y servicios de publicación" -#: ../../include/conversation.php:1368 +#: ../../include/conversation.php:1413 msgid "Set publish date" msgstr "Establecer la fecha de publicación" -#: ../../include/conversation.php:1631 -msgid "Discover" -msgstr "Descubrir" - -#: ../../include/conversation.php:1634 -msgid "Imported public streams" -msgstr "Contenidos públicos importados" - -#: ../../include/conversation.php:1639 +#: ../../include/conversation.php:1673 msgid "Commented Order" msgstr "Comentarios recientes" -#: ../../include/conversation.php:1642 +#: ../../include/conversation.php:1676 msgid "Sort by Comment Date" msgstr "Ordenar por fecha de comentario" -#: ../../include/conversation.php:1646 +#: ../../include/conversation.php:1680 msgid "Posted Order" msgstr "Publicaciones recientes" -#: ../../include/conversation.php:1649 +#: ../../include/conversation.php:1683 msgid "Sort by Post Date" msgstr "Ordenar por fecha de publicación" -#: ../../include/conversation.php:1657 +#: ../../include/conversation.php:1691 msgid "Posts that mention or involve you" msgstr "Publicaciones que le mencionan o involucran" -#: ../../include/conversation.php:1666 +#: ../../include/conversation.php:1700 msgid "Activity Stream - by date" msgstr "Contenido - por fecha" -#: ../../include/conversation.php:1672 +#: ../../include/conversation.php:1706 msgid "Starred" msgstr "Preferidas" -#: ../../include/conversation.php:1675 +#: ../../include/conversation.php:1709 msgid "Favourite Posts" msgstr "Publicaciones favoritas" -#: ../../include/conversation.php:1682 +#: ../../include/conversation.php:1716 msgid "Spam" msgstr "Correo basura" -#: ../../include/conversation.php:1685 +#: ../../include/conversation.php:1719 msgid "Posts flagged as SPAM" msgstr "Publicaciones marcadas como basura" -#: ../../include/conversation.php:1760 ../../include/nav.php:358 +#: ../../include/conversation.php:1794 ../../include/nav.php:402 msgid "Status Messages and Posts" msgstr "Mensajes de estado y publicaciones" -#: ../../include/conversation.php:1773 ../../include/nav.php:371 +#: ../../include/conversation.php:1807 ../../include/nav.php:415 msgid "Profile Details" msgstr "Detalles del perfil" -#: ../../include/conversation.php:1783 ../../include/nav.php:381 -#: ../../include/photos.php:525 +#: ../../include/conversation.php:1817 ../../include/nav.php:425 +#: ../../include/photos.php:600 msgid "Photo Albums" msgstr "Álbumes de fotos" -#: ../../include/conversation.php:1791 ../../include/nav.php:389 +#: ../../include/conversation.php:1825 ../../include/nav.php:433 msgid "Files and Storage" msgstr "Ficheros y repositorio" -#: ../../include/conversation.php:1827 ../../include/nav.php:424 +#: ../../include/conversation.php:1862 ../../include/nav.php:468 msgid "Bookmarks" msgstr "Marcadores" -#: ../../include/conversation.php:1830 ../../include/nav.php:427 +#: ../../include/conversation.php:1865 ../../include/nav.php:471 msgid "Saved Bookmarks" msgstr "Marcadores guardados" -#: ../../include/conversation.php:1841 ../../include/nav.php:438 +#: ../../include/conversation.php:1876 ../../include/nav.php:482 +msgid "View Cards" +msgstr "Ver las fichas" + +#: ../../include/conversation.php:1887 ../../include/nav.php:494 msgid "View Webpages" msgstr "Ver páginas web" -#: ../../include/conversation.php:1910 +#: ../../include/conversation.php:1956 msgctxt "noun" msgid "Attending" msgid_plural "Attending" msgstr[0] "Participaré" msgstr[1] "Participaré" -#: ../../include/conversation.php:1913 +#: ../../include/conversation.php:1959 msgctxt "noun" msgid "Not Attending" msgid_plural "Not Attending" msgstr[0] "No participaré" msgstr[1] "No participaré" -#: ../../include/conversation.php:1916 +#: ../../include/conversation.php:1962 msgctxt "noun" msgid "Undecided" msgid_plural "Undecided" msgstr[0] "Indeciso/a" msgstr[1] "Indecisos/as" -#: ../../include/conversation.php:1919 +#: ../../include/conversation.php:1965 msgctxt "noun" msgid "Agree" msgid_plural "Agrees" msgstr[0] "De acuerdo" msgstr[1] "De acuerdo" -#: ../../include/conversation.php:1922 +#: ../../include/conversation.php:1968 msgctxt "noun" msgid "Disagree" msgid_plural "Disagrees" msgstr[0] "En desacuerdo" msgstr[1] "En desacuerdo" -#: ../../include/conversation.php:1925 +#: ../../include/conversation.php:1971 msgctxt "noun" msgid "Abstain" msgid_plural "Abstains" @@ -11427,328 +11786,340 @@ msgstr "más antiguas" msgid "newer" msgstr "más recientes" -#: ../../include/text.php:939 +#: ../../include/text.php:947 msgid "No connections" msgstr "Sin conexiones" -#: ../../include/text.php:964 +#: ../../include/text.php:972 #, php-format msgid "View all %s connections" msgstr "Ver todas las %s conexiones" -#: ../../include/text.php:1096 ../../include/text.php:1101 +#: ../../include/text.php:1104 ../../include/text.php:1109 msgid "poke" msgstr "un toque" -#: ../../include/text.php:1102 +#: ../../include/text.php:1110 msgid "ping" msgstr "un \"ping\"" -#: ../../include/text.php:1102 +#: ../../include/text.php:1110 msgid "pinged" msgstr "ha enviado un \"ping\" a" -#: ../../include/text.php:1103 +#: ../../include/text.php:1111 msgid "prod" msgstr "una incitación " -#: ../../include/text.php:1103 +#: ../../include/text.php:1111 msgid "prodded" msgstr "ha incitado a " -#: ../../include/text.php:1104 +#: ../../include/text.php:1112 msgid "slap" msgstr "una bofetada " -#: ../../include/text.php:1104 +#: ../../include/text.php:1112 msgid "slapped" msgstr "ha abofeteado a " -#: ../../include/text.php:1105 +#: ../../include/text.php:1113 msgid "finger" msgstr "un \"finger\" " -#: ../../include/text.php:1105 +#: ../../include/text.php:1113 msgid "fingered" msgstr "envió un \"finger\" a" -#: ../../include/text.php:1106 +#: ../../include/text.php:1114 msgid "rebuff" msgstr "un reproche" -#: ../../include/text.php:1106 +#: ../../include/text.php:1114 msgid "rebuffed" msgstr "ha hecho un reproche a " -#: ../../include/text.php:1118 +#: ../../include/text.php:1126 msgid "happy" msgstr "feliz " -#: ../../include/text.php:1119 +#: ../../include/text.php:1127 msgid "sad" msgstr "triste " -#: ../../include/text.php:1120 +#: ../../include/text.php:1128 msgid "mellow" msgstr "tranquilo/a" -#: ../../include/text.php:1121 +#: ../../include/text.php:1129 msgid "tired" msgstr "cansado/a " -#: ../../include/text.php:1122 +#: ../../include/text.php:1130 msgid "perky" msgstr "vivaz" -#: ../../include/text.php:1123 +#: ../../include/text.php:1131 msgid "angry" msgstr "enfadado/a" -#: ../../include/text.php:1124 +#: ../../include/text.php:1132 msgid "stupefied" msgstr "asombrado/a" -#: ../../include/text.php:1125 +#: ../../include/text.php:1133 msgid "puzzled" msgstr "perplejo/a" -#: ../../include/text.php:1126 +#: ../../include/text.php:1134 msgid "interested" msgstr "interesado/a" -#: ../../include/text.php:1127 +#: ../../include/text.php:1135 msgid "bitter" msgstr "amargado/a" -#: ../../include/text.php:1128 +#: ../../include/text.php:1136 msgid "cheerful" msgstr "alegre" -#: ../../include/text.php:1129 +#: ../../include/text.php:1137 msgid "alive" msgstr "animado/a" -#: ../../include/text.php:1130 +#: ../../include/text.php:1138 msgid "annoyed" msgstr "molesto/a" -#: ../../include/text.php:1131 +#: ../../include/text.php:1139 msgid "anxious" msgstr "ansioso/a" -#: ../../include/text.php:1132 +#: ../../include/text.php:1140 msgid "cranky" msgstr "de mal humor" -#: ../../include/text.php:1133 +#: ../../include/text.php:1141 msgid "disturbed" msgstr "perturbado/a" -#: ../../include/text.php:1134 +#: ../../include/text.php:1142 msgid "frustrated" msgstr "frustrado/a" -#: ../../include/text.php:1135 +#: ../../include/text.php:1143 msgid "depressed" msgstr "deprimido/a" -#: ../../include/text.php:1136 +#: ../../include/text.php:1144 msgid "motivated" msgstr "motivado/a" -#: ../../include/text.php:1137 +#: ../../include/text.php:1145 msgid "relaxed" msgstr "relajado/a" -#: ../../include/text.php:1138 +#: ../../include/text.php:1146 msgid "surprised" msgstr "sorprendido/a" -#: ../../include/text.php:1312 ../../include/js_strings.php:70 +#: ../../include/text.php:1320 ../../include/js_strings.php:70 msgid "Monday" msgstr "lunes" -#: ../../include/text.php:1312 ../../include/js_strings.php:71 +#: ../../include/text.php:1320 ../../include/js_strings.php:71 msgid "Tuesday" msgstr "martes" -#: ../../include/text.php:1312 ../../include/js_strings.php:72 +#: ../../include/text.php:1320 ../../include/js_strings.php:72 msgid "Wednesday" msgstr "miércoles" -#: ../../include/text.php:1312 ../../include/js_strings.php:73 +#: ../../include/text.php:1320 ../../include/js_strings.php:73 msgid "Thursday" msgstr "jueves" -#: ../../include/text.php:1312 ../../include/js_strings.php:74 +#: ../../include/text.php:1320 ../../include/js_strings.php:74 msgid "Friday" msgstr "viernes" -#: ../../include/text.php:1312 ../../include/js_strings.php:75 +#: ../../include/text.php:1320 ../../include/js_strings.php:75 msgid "Saturday" msgstr "sábado" -#: ../../include/text.php:1312 ../../include/js_strings.php:69 +#: ../../include/text.php:1320 ../../include/js_strings.php:69 msgid "Sunday" msgstr "domingo" -#: ../../include/text.php:1316 ../../include/js_strings.php:45 +#: ../../include/text.php:1324 ../../include/js_strings.php:45 msgid "January" msgstr "enero" -#: ../../include/text.php:1316 ../../include/js_strings.php:46 +#: ../../include/text.php:1324 ../../include/js_strings.php:46 msgid "February" msgstr "febrero" -#: ../../include/text.php:1316 ../../include/js_strings.php:47 +#: ../../include/text.php:1324 ../../include/js_strings.php:47 msgid "March" msgstr "marzo" -#: ../../include/text.php:1316 ../../include/js_strings.php:48 +#: ../../include/text.php:1324 ../../include/js_strings.php:48 msgid "April" msgstr "abril" -#: ../../include/text.php:1316 +#: ../../include/text.php:1324 msgid "May" msgstr "mayo" -#: ../../include/text.php:1316 ../../include/js_strings.php:50 +#: ../../include/text.php:1324 ../../include/js_strings.php:50 msgid "June" msgstr "junio" -#: ../../include/text.php:1316 ../../include/js_strings.php:51 +#: ../../include/text.php:1324 ../../include/js_strings.php:51 msgid "July" msgstr "julio" -#: ../../include/text.php:1316 ../../include/js_strings.php:52 +#: ../../include/text.php:1324 ../../include/js_strings.php:52 msgid "August" msgstr "agosto" -#: ../../include/text.php:1316 ../../include/js_strings.php:53 +#: ../../include/text.php:1324 ../../include/js_strings.php:53 msgid "September" msgstr "septiembre" -#: ../../include/text.php:1316 ../../include/js_strings.php:54 +#: ../../include/text.php:1324 ../../include/js_strings.php:54 msgid "October" msgstr "octubre" -#: ../../include/text.php:1316 ../../include/js_strings.php:55 +#: ../../include/text.php:1324 ../../include/js_strings.php:55 msgid "November" msgstr "noviembre" -#: ../../include/text.php:1316 ../../include/js_strings.php:56 +#: ../../include/text.php:1324 ../../include/js_strings.php:56 msgid "December" msgstr "diciembre" -#: ../../include/text.php:1380 ../../include/text.php:1384 +#: ../../include/text.php:1388 ../../include/text.php:1392 msgid "Unknown Attachment" msgstr "Adjunto no reconocido" -#: ../../include/text.php:1386 ../../include/feedutils.php:780 +#: ../../include/text.php:1394 ../../include/feedutils.php:780 msgid "unknown" msgstr "desconocido" -#: ../../include/text.php:1422 +#: ../../include/text.php:1430 msgid "remove category" msgstr "eliminar el tema" -#: ../../include/text.php:1496 +#: ../../include/text.php:1504 msgid "remove from file" msgstr "eliminar del fichero" -#: ../../include/text.php:1615 ../../include/message.php:12 +#: ../../include/text.php:1623 ../../include/message.php:12 msgid "Download binary/encrypted content" msgstr "Descargar contenido binario o cifrado" -#: ../../include/text.php:1774 ../../include/language.php:367 +#: ../../include/text.php:1782 ../../include/language.php:367 msgid "default" msgstr "por defecto" -#: ../../include/text.php:1782 +#: ../../include/text.php:1790 msgid "Page layout" msgstr "Plantilla de la página" -#: ../../include/text.php:1782 +#: ../../include/text.php:1790 msgid "You can create your own with the layouts tool" msgstr "Puede crear su propia disposición gráfica con la herramienta de plantillas" -#: ../../include/text.php:1810 +#: ../../include/text.php:1801 +msgid "HTML" +msgstr "HTML" + +#: ../../include/text.php:1804 +msgid "Comanche Layout" +msgstr "Plantilla de Comanche" + +#: ../../include/text.php:1809 +msgid "PHP" +msgstr "PHP" + +#: ../../include/text.php:1818 msgid "Page content type" msgstr "Tipo de contenido de la página" -#: ../../include/text.php:1943 +#: ../../include/text.php:1951 msgid "activity" msgstr "la actividad" -#: ../../include/text.php:2006 -msgid "a-z, 0-9, -, _, and . only" -msgstr "a-z, 0-9, -, _, and . only" +#: ../../include/text.php:2014 +msgid "a-z, 0-9, -, and _ only" +msgstr "a-z, 0-9, -, and _ only" -#: ../../include/text.php:2277 +#: ../../include/text.php:2285 msgid "Design Tools" msgstr "Herramientas de diseño web" -#: ../../include/text.php:2283 +#: ../../include/text.php:2291 msgid "Pages" msgstr "Páginas" -#: ../../include/text.php:2305 +#: ../../include/text.php:2313 msgid "Import website..." msgstr "Importar un sitio web..." -#: ../../include/text.php:2306 +#: ../../include/text.php:2314 msgid "Select folder to import" msgstr "Seleccionar la carpeta que se va a importar" -#: ../../include/text.php:2307 +#: ../../include/text.php:2315 msgid "Import from a zipped folder:" msgstr "Importar desde una carpeta comprimida: " -#: ../../include/text.php:2308 +#: ../../include/text.php:2316 msgid "Import from cloud files:" msgstr "Importar desde los ficheros en la nube: " -#: ../../include/text.php:2309 +#: ../../include/text.php:2317 msgid "/cloud/channel/path/to/folder" msgstr "/cloud/canal/ruta/a la/carpeta" -#: ../../include/text.php:2310 +#: ../../include/text.php:2318 msgid "Enter path to website files" msgstr "Ruta a los ficheros del sitio web" -#: ../../include/text.php:2311 +#: ../../include/text.php:2319 msgid "Select folder" msgstr "Seleccionar la carpeta" -#: ../../include/text.php:2312 +#: ../../include/text.php:2320 msgid "Export website..." msgstr "Exportar un sitio web..." -#: ../../include/text.php:2313 +#: ../../include/text.php:2321 msgid "Export to a zip file" msgstr "Exportar a un fichero comprimido .zip" -#: ../../include/text.php:2314 +#: ../../include/text.php:2322 msgid "website.zip" msgstr "sitio_web.zip" -#: ../../include/text.php:2315 +#: ../../include/text.php:2323 msgid "Enter a name for the zip file." msgstr "Escriba un nombre para el fichero zip." -#: ../../include/text.php:2316 +#: ../../include/text.php:2324 msgid "Export to cloud files" msgstr "Exportar a la nube de ficheros" -#: ../../include/text.php:2317 +#: ../../include/text.php:2325 msgid "/path/to/export/folder" msgstr "/ruta/para/exportar/carpeta" -#: ../../include/text.php:2318 +#: ../../include/text.php:2326 msgid "Enter a path to a cloud files destination." msgstr "Escriba una ruta de destino a la nube de ficheros." -#: ../../include/text.php:2319 +#: ../../include/text.php:2327 msgid "Specify folder" msgstr "Especificar una carpeta" @@ -11787,47 +12158,49 @@ msgstr "Invitar a amigos" msgid "Advanced example: name=fred and country=iceland" msgstr "Ejemplo avanzado: nombre=juan y país=españa" -#: ../../include/contact_widgets.php:122 -#, php-format -msgid "%d connection in common" -msgid_plural "%d connections in common" -msgstr[0] "%d conexión en común" -msgstr[1] "%d conexiones en común" +#: ../../include/contact_widgets.php:166 +msgid "Common Connections" +msgstr "Conexiones comunes" -#: ../../include/contact_widgets.php:127 -msgid "show more" -msgstr "mostrar más" +#: ../../include/contact_widgets.php:171 +#, php-format +msgid "View all %d common connections" +msgstr "Ver todas las %d conexiones comunes" -#: ../../include/markdown.php:139 ../../include/bbcode.php:332 +#: ../../include/markdown.php:139 ../../include/bbcode.php:337 #, php-format msgid "%1$s wrote the following %2$s %3$s" msgstr "%1$s escribió %2$s siguiente %3$s" -#: ../../include/follow.php:26 +#: ../../include/follow.php:37 msgid "Channel is blocked on this site." msgstr "El canal está bloqueado en este sitio." -#: ../../include/follow.php:31 +#: ../../include/follow.php:42 msgid "Channel location missing." msgstr "Falta la dirección del canal." -#: ../../include/follow.php:73 +#: ../../include/follow.php:84 msgid "Response from remote channel was incomplete." msgstr "Respuesta incompleta del canal." -#: ../../include/follow.php:90 +#: ../../include/follow.php:101 msgid "Channel was deleted and no longer exists." msgstr "El canal ha sido eliminado y ya no existe." -#: ../../include/follow.php:140 ../../include/follow.php:175 -msgid "Protocol disabled." -msgstr "Protocolo deshabilitado." +#: ../../include/follow.php:156 +msgid "Remote channel or protocol unavailable." +msgstr "Canal remoto o protocolo no disponible." -#: ../../include/follow.php:163 +#: ../../include/follow.php:179 msgid "Channel discovery failed." msgstr "El intento de acceder al canal ha fallado." -#: ../../include/follow.php:186 +#: ../../include/follow.php:191 +msgid "Protocol disabled." +msgstr "Protocolo deshabilitado." + +#: ../../include/follow.php:202 msgid "Cannot connect to yourself." msgstr "No puede conectarse consigo mismo." @@ -12118,302 +12491,284 @@ msgstr "un reproche" msgid "Item was not found." msgstr "Elemento no encontrado." -#: ../../include/attach.php:501 +#: ../../include/attach.php:505 msgid "No source file." msgstr "Ningún fichero de origen" -#: ../../include/attach.php:523 +#: ../../include/attach.php:527 msgid "Cannot locate file to replace" msgstr "No se puede localizar el fichero que va a ser sustituido." -#: ../../include/attach.php:541 +#: ../../include/attach.php:545 msgid "Cannot locate file to revise/update" msgstr "No se puede localizar el fichero para revisar/actualizar" -#: ../../include/attach.php:674 +#: ../../include/attach.php:680 #, php-format msgid "File exceeds size limit of %d" msgstr "El fichero supera el limite de tamaño de %d" -#: ../../include/attach.php:688 +#: ../../include/attach.php:694 #, php-format msgid "You have reached your limit of %1$.0f Mbytes attachment storage." msgstr "Ha alcanzado su límite de %1$.0f Mbytes de almacenamiento de adjuntos." -#: ../../include/attach.php:858 +#: ../../include/attach.php:864 msgid "File upload failed. Possible system limit or action terminated." msgstr "Error de carga, posiblemente por limite del sistema o porque la acción ha finalizado." -#: ../../include/attach.php:871 +#: ../../include/attach.php:877 msgid "Stored file could not be verified. Upload failed." msgstr "El fichero almacenado no ha podido ser verificado. El envío ha fallado." -#: ../../include/attach.php:932 ../../include/attach.php:948 +#: ../../include/attach.php:938 ../../include/attach.php:954 msgid "Path not available." msgstr "Ruta no disponible." -#: ../../include/attach.php:997 ../../include/attach.php:1162 +#: ../../include/attach.php:1003 ../../include/attach.php:1168 msgid "Empty pathname" msgstr "Ruta vacía" -#: ../../include/attach.php:1023 +#: ../../include/attach.php:1029 msgid "duplicate filename or path" msgstr "Nombre duplicado de ruta o fichero" -#: ../../include/attach.php:1048 +#: ../../include/attach.php:1054 msgid "Path not found." msgstr "Ruta no encontrada" -#: ../../include/attach.php:1116 +#: ../../include/attach.php:1122 msgid "mkdir failed." msgstr "mkdir ha fallado." -#: ../../include/attach.php:1120 +#: ../../include/attach.php:1126 msgid "database storage failed." msgstr "el almacenamiento en la base de datos ha fallado." -#: ../../include/attach.php:1168 +#: ../../include/attach.php:1174 msgid "Empty path" msgstr "Ruta vacía" -#: ../../include/security.php:117 -msgid "guest:" -msgstr "invitado: " - #: ../../include/security.php:531 msgid "" "The form security token was not correct. This probably happened because the " "form has been opened for too long (>3 hours) before submitting it." msgstr "El \"token\" de seguridad del formulario no es correcto. Esto ha ocurrido probablemente porque el formulario ha estado abierto demasiado tiempo (>3 horas) antes de ser enviado" -#: ../../include/items.php:851 ../../include/items.php:903 +#: ../../include/items.php:857 ../../include/items.php:909 msgid "(Unknown)" msgstr "(Desconocido)" -#: ../../include/items.php:1087 +#: ../../include/items.php:1093 msgid "Visible to anybody on the internet." msgstr "Visible para cualquiera en internet." -#: ../../include/items.php:1089 +#: ../../include/items.php:1095 msgid "Visible to you only." msgstr "Visible sólo para usted." -#: ../../include/items.php:1091 +#: ../../include/items.php:1097 msgid "Visible to anybody in this network." msgstr "Visible para cualquiera en esta red." -#: ../../include/items.php:1093 +#: ../../include/items.php:1099 msgid "Visible to anybody authenticated." msgstr "Visible para cualquiera que esté autenticado." -#: ../../include/items.php:1095 +#: ../../include/items.php:1101 #, php-format msgid "Visible to anybody on %s." msgstr "Visible para cualquiera en %s." -#: ../../include/items.php:1097 +#: ../../include/items.php:1103 msgid "Visible to all connections." msgstr "Visible para todas las conexiones." -#: ../../include/items.php:1099 +#: ../../include/items.php:1105 msgid "Visible to approved connections." msgstr "Visible para las conexiones permitidas." -#: ../../include/items.php:1101 +#: ../../include/items.php:1107 msgid "Visible to specific connections." msgstr "Visible para conexiones específicas." -#: ../../include/items.php:3908 +#: ../../include/items.php:3957 msgid "Privacy group is empty." msgstr "El grupo de canales está vacío." -#: ../../include/items.php:3915 +#: ../../include/items.php:3964 #, php-format msgid "Privacy group: %s" msgstr "Grupo de canales: %s" -#: ../../include/items.php:3927 +#: ../../include/items.php:3976 msgid "Connection not found." msgstr "Conexión no encontrada" -#: ../../include/items.php:4280 +#: ../../include/items.php:4327 msgid "profile photo" msgstr "foto del perfil" -#: ../../include/items.php:4473 +#: ../../include/items.php:4520 #, php-format msgid "[Edited %s]" msgstr "[se ha editado %s]" -#: ../../include/items.php:4473 +#: ../../include/items.php:4520 msgctxt "edit_activity" msgid "Post" msgstr "Publicar" -#: ../../include/items.php:4473 +#: ../../include/items.php:4520 msgctxt "edit_activity" msgid "Comment" msgstr "Comentar" -#: ../../include/text.php:1128 -msgid "interested" -msgstr "interesado/a" +#: ../../include/channel.php:34 +msgid "Unable to obtain identity information from database" +msgstr "No ha sido posible obtener información sobre la identidad desde la base de datos" -#: ../../include/channel.php:68 +#: ../../include/channel.php:69 msgid "Empty name" msgstr "Nombre vacío" -#: ../../include/channel.php:71 +#: ../../include/channel.php:72 msgid "Name too long" msgstr "Nombre demasiado largo" -#: ../../include/channel.php:182 +#: ../../include/channel.php:183 msgid "No account identifier" msgstr "Ningún identificador de la cuenta" -#: ../../include/channel.php:194 +#: ../../include/channel.php:195 msgid "Nickname is required." msgstr "Se requiere un sobrenombre (alias)." -#: ../../include/channel.php:208 -msgid "Reserved nickname. Please choose another." -msgstr "Sobrenombre en uso. Por favor, elija otro." - -#: ../../include/channel.php:213 -msgid "" -"Nickname has unsupported characters or is already being used on this site." -msgstr "El alias contiene caracteres no admitidos o está ya en uso por otros miembros de este sitio." - -#: ../../include/channel.php:272 +#: ../../include/channel.php:273 msgid "Unable to retrieve created identity" msgstr "No ha sido posible recuperar la identidad creada" -#: ../../include/channel.php:344 +#: ../../include/channel.php:359 msgid "Default Profile" msgstr "Perfil principal" -#: ../../include/channel.php:497 +#: ../../include/channel.php:512 ../../include/channel.php:601 msgid "Unable to retrieve modified identity" msgstr "No se puede recuperar la identidad modficada" -#: ../../include/channel.php:1162 +#: ../../include/channel.php:1263 msgid "Create New Profile" msgstr "Crear un nuevo perfil" -#: ../../include/channel.php:1182 +#: ../../include/channel.php:1283 msgid "Visible to everybody" msgstr "Visible para todos" -#: ../../include/channel.php:1255 ../../include/channel.php:1375 +#: ../../include/channel.php:1356 ../../include/channel.php:1475 msgid "Gender:" msgstr "Género:" -#: ../../include/channel.php:1257 ../../include/channel.php:1430 +#: ../../include/channel.php:1358 ../../include/channel.php:1530 msgid "Homepage:" msgstr "Página personal:" -#: ../../include/channel.php:1258 +#: ../../include/channel.php:1359 msgid "Online Now" msgstr "Ahora en línea" -#: ../../include/channel.php:1334 +#: ../../include/channel.php:1434 msgid "Trans" msgstr "Trans" -#: ../../include/channel.php:1380 +#: ../../include/channel.php:1480 msgid "Like this channel" msgstr "Me gusta este canal" -#: ../../include/channel.php:1404 +#: ../../include/channel.php:1504 msgid "j F, Y" msgstr "j F Y" -#: ../../include/channel.php:1405 +#: ../../include/channel.php:1505 msgid "j F" msgstr "j F" -#: ../../include/channel.php:1412 +#: ../../include/channel.php:1512 msgid "Birthday:" msgstr "Cumpleaños:" -#: ../../include/channel.php:1425 +#: ../../include/channel.php:1525 #, php-format msgid "for %1$d %2$s" msgstr "por %1$d %2$s" -#: ../../include/channel.php:1428 +#: ../../include/channel.php:1528 msgid "Sexual Preference:" msgstr "Orientación sexual:" -#: ../../include/channel.php:1434 +#: ../../include/channel.php:1534 msgid "Tags:" msgstr "Etiquetas:" -#: ../../include/channel.php:1436 +#: ../../include/channel.php:1536 msgid "Political Views:" msgstr "Posición política:" -#: ../../include/channel.php:1438 +#: ../../include/channel.php:1538 msgid "Religion:" msgstr "Religión:" -#: ../../include/channel.php:1442 +#: ../../include/channel.php:1542 msgid "Hobbies/Interests:" msgstr "Aficciones o intereses:" -#: ../../include/channel.php:1444 +#: ../../include/channel.php:1544 msgid "Likes:" msgstr "Me gusta:" -#: ../../include/channel.php:1446 +#: ../../include/channel.php:1546 msgid "Dislikes:" msgstr "No me gusta:" -#: ../../include/channel.php:1448 +#: ../../include/channel.php:1548 msgid "Contact information and Social Networks:" msgstr "Información de contacto y redes sociales:" -#: ../../include/channel.php:1450 +#: ../../include/channel.php:1550 msgid "My other channels:" msgstr "Mis otros canales:" -#: ../../include/channel.php:1452 +#: ../../include/channel.php:1552 msgid "Musical interests:" msgstr "Preferencias musicales:" -#: ../../include/channel.php:1454 +#: ../../include/channel.php:1554 msgid "Books, literature:" msgstr "Libros, literatura:" -#: ../../include/channel.php:1456 +#: ../../include/channel.php:1556 msgid "Television:" msgstr "Televisión:" -#: ../../include/channel.php:1458 +#: ../../include/channel.php:1558 msgid "Film/dance/culture/entertainment:" msgstr "Cine, danza, cultura, entretenimiento:" -#: ../../include/channel.php:1460 +#: ../../include/channel.php:1560 msgid "Love/Romance:" msgstr "Vida sentimental o amorosa:" -#: ../../include/channel.php:1462 +#: ../../include/channel.php:1562 msgid "Work/employment:" msgstr "Trabajo:" -#: ../../include/channel.php:1464 +#: ../../include/channel.php:1564 msgid "School/education:" msgstr "Estudios:" -#: ../../include/channel.php:1487 +#: ../../include/channel.php:1587 msgid "Like this thing" msgstr "Me gusta esto" -#: ../../include/channel.php:2256 -#, php-format -msgid "User '%s' deleted" -msgstr "El usuario '%s' ha sido eliminado" - #: ../../include/event.php:22 ../../include/event.php:69 msgid "l F d, Y \\@ g:i A" msgstr "l d de F, Y \\@ G:i" @@ -12450,67 +12805,63 @@ msgstr "En proceso" msgid "Cancelled" msgstr "Cancelado/a" -#: ../../include/event.php:1292 ../../include/connections.php:676 +#: ../../include/event.php:1292 ../../include/connections.php:684 msgid "Home, Voice" msgstr "Llamadas particulares" -#: ../../include/event.php:1293 ../../include/connections.php:677 +#: ../../include/event.php:1293 ../../include/connections.php:685 msgid "Home, Fax" msgstr "Fax particular" -#: ../../include/event.php:1295 ../../include/connections.php:679 +#: ../../include/event.php:1295 ../../include/connections.php:687 msgid "Work, Voice" msgstr "Llamadas de trabajo" -#: ../../include/event.php:1296 ../../include/connections.php:680 +#: ../../include/event.php:1296 ../../include/connections.php:688 msgid "Work, Fax" msgstr "Fax de trabajo" -#: ../../include/network.php:751 +#: ../../include/network.php:752 msgid "view full size" msgstr "Ver en el tamaño original" -#: ../../include/network.php:1691 ../../include/network.php:1692 +#: ../../include/network.php:1700 ../../include/network.php:1701 msgid "Friendica" msgstr "Friendica" -#: ../../include/network.php:1693 +#: ../../include/network.php:1702 msgid "OStatus" msgstr "OStatus" -#: ../../include/network.php:1694 +#: ../../include/network.php:1703 msgid "GNU-Social" msgstr "GNU Social" -#: ../../include/network.php:1695 +#: ../../include/network.php:1704 msgid "RSS/Atom" msgstr "RSS/Atom" -#: ../../include/network.php:1696 -msgid "ActivityPub" -msgstr "ActivityPub" - -#: ../../include/network.php:1698 +#: ../../include/network.php:1707 msgid "Diaspora" msgstr "Diaspora" -#: ../../include/network.php:1699 +#: ../../include/network.php:1708 msgid "Facebook" msgstr "Facebook" -#: ../../include/network.php:1700 +#: ../../include/network.php:1709 msgid "Zot" msgstr "Zot" -#: ../../include/network.php:1701 +#: ../../include/network.php:1710 msgid "LinkedIn" msgstr "LinkedIn" -#: ../../include/network.php:1702 +#: ../../include/network.php:1711 msgid "XMPP/IM" msgstr "XMPP/IM" -#: ../../include/network.php:1703 +#: ../../include/network.php:1712 msgid "MySpace" msgstr "MySpace" @@ -12552,17 +12903,17 @@ msgstr "Los permisos de la entrada %s no se pueden cambiar %s una vez que se ha msgid "Cannot locate DNS info for database server '%s'" msgstr "No se ha podido localizar información de DNS para el servidor de base de datos “%s”" -#: ../../include/bbcode.php:194 ../../include/bbcode.php:1097 -#: ../../include/bbcode.php:1100 ../../include/bbcode.php:1105 -#: ../../include/bbcode.php:1108 ../../include/bbcode.php:1111 -#: ../../include/bbcode.php:1114 ../../include/bbcode.php:1119 -#: ../../include/bbcode.php:1122 ../../include/bbcode.php:1127 -#: ../../include/bbcode.php:1130 ../../include/bbcode.php:1133 -#: ../../include/bbcode.php:1136 +#: ../../include/bbcode.php:194 ../../include/bbcode.php:1102 +#: ../../include/bbcode.php:1105 ../../include/bbcode.php:1110 +#: ../../include/bbcode.php:1113 ../../include/bbcode.php:1116 +#: ../../include/bbcode.php:1119 ../../include/bbcode.php:1124 +#: ../../include/bbcode.php:1127 ../../include/bbcode.php:1132 +#: ../../include/bbcode.php:1135 ../../include/bbcode.php:1138 +#: ../../include/bbcode.php:1141 msgid "Image/photo" msgstr "Imagen/foto" -#: ../../include/bbcode.php:233 ../../include/bbcode.php:1147 +#: ../../include/bbcode.php:233 ../../include/bbcode.php:1152 msgid "Encrypted content" msgstr "Contenido cifrado" @@ -12578,34 +12929,43 @@ msgid "" "to install it on this site." msgstr "Esta entrada contiene el elemento instalable %s, sin embargo le faltan permisos para instalarlo en este sitio." -#: ../../include/bbcode.php:409 ../../include/bbcode.php:417 +#: ../../include/bbcode.php:331 +msgid "card" +msgstr "ficha" + +#: ../../include/bbcode.php:414 ../../include/bbcode.php:422 msgid "Click to open/close" msgstr "Pulsar para abrir/cerrar" -#: ../../include/bbcode.php:417 +#: ../../include/bbcode.php:422 msgid "spoiler" msgstr "spoiler" -#: ../../include/bbcode.php:1085 +#: ../../include/bbcode.php:1090 msgid "$1 wrote:" msgstr "$1 escribió:" -#: ../../include/oembed.php:317 +#: ../../include/oembed.php:328 msgid " by " msgstr "por" -#: ../../include/oembed.php:318 +#: ../../include/oembed.php:329 msgid " on " msgstr "en" -#: ../../include/oembed.php:347 +#: ../../include/oembed.php:358 msgid "Embedded content" msgstr "Contenido incorporado" -#: ../../include/oembed.php:356 +#: ../../include/oembed.php:367 msgid "Embedding disabled" msgstr "Incrustación deshabilitada" +#: ../../include/zid.php:305 +#, php-format +msgid "OpenWebAuth: %1$s welcomes %2$s" +msgstr "OpenWebAuth: %1$sda la bienvenida a %2$s" + #: ../../include/features.php:54 msgid "General Features" msgstr "Funcionalidades básicas" @@ -12654,292 +13014,296 @@ msgstr "Notas privadas" msgid "Enables a tool to store notes and reminders (note: not encrypted)" msgstr "Habilita una herramienta para guardar notas y recordatorios (advertencia: las notas no estarán cifradas)" -#: ../../include/features.php:122 +#: ../../include/features.php:123 +msgid "Create personal planning cards" +msgstr "Crear fichas de planificación personal" + +#: ../../include/features.php:131 msgid "Navigation Channel Select" msgstr "Navegación por el selector de canales" -#: ../../include/features.php:123 +#: ../../include/features.php:132 msgid "Change channels directly from within the navigation dropdown menu" msgstr "Cambiar de canales directamente desde el menú de navegación desplegable" -#: ../../include/features.php:131 +#: ../../include/features.php:140 msgid "Photo Location" msgstr "Ubicación de las fotos" -#: ../../include/features.php:132 +#: ../../include/features.php:141 msgid "If location data is available on uploaded photos, link this to a map." msgstr "Si los datos de ubicación están disponibles en las fotos subidas, enlazar estas a un mapa." -#: ../../include/features.php:140 +#: ../../include/features.php:149 msgid "Access Controlled Chatrooms" msgstr "Salas de chat moderadas" -#: ../../include/features.php:141 +#: ../../include/features.php:150 msgid "Provide chatrooms and chat services with access control." msgstr "Proporcionar salas y servicios de chat moderados." -#: ../../include/features.php:150 +#: ../../include/features.php:159 msgid "Provide alternate connection permission roles." msgstr "Proporcionar roles de acceso alternativos para esta conexión." -#: ../../include/features.php:158 +#: ../../include/features.php:167 msgid "Smart Birthdays" msgstr "Cumpleaños inteligentes" -#: ../../include/features.php:159 +#: ../../include/features.php:168 msgid "" "Make birthday events timezone aware in case your friends are scattered " "across the planet." msgstr "Enlazar los eventos de cumpleaños con el huso horario en el caso de que sus amigos estén dispersos por el mundo." -#: ../../include/features.php:167 +#: ../../include/features.php:176 msgid "Event Timezone Selection" msgstr "Selección del huso horario del evento" -#: ../../include/features.php:168 +#: ../../include/features.php:177 msgid "Allow event creation in timezones other than your own." msgstr "Permitir la creación de eventos en husos horarios distintos del suyo." -#: ../../include/features.php:176 +#: ../../include/features.php:185 msgid "Advanced Directory Search" msgstr "Búsqueda avanzada en el directorio" -#: ../../include/features.php:177 +#: ../../include/features.php:186 msgid "Allows creation of complex directory search queries" msgstr "Permitir la creación de consultas complejas en las búsquedas en el directorio" -#: ../../include/features.php:185 +#: ../../include/features.php:194 msgid "Advanced Theme and Layout Settings" msgstr "Ajustes avanzados de temas y esquemas" -#: ../../include/features.php:186 +#: ../../include/features.php:195 msgid "Allows fine tuning of themes and page layouts" msgstr "Permitir el ajuste fino de temas y esquemas de páginas" -#: ../../include/features.php:196 +#: ../../include/features.php:205 msgid "Post Composition Features" msgstr "Opciones para la redacción de entradas" -#: ../../include/features.php:200 +#: ../../include/features.php:209 msgid "Large Photos" msgstr "Fotos de gran tamaño" -#: ../../include/features.php:201 +#: ../../include/features.php:210 msgid "" "Include large (1024px) photo thumbnails in posts. If not enabled, use small " "(640px) photo thumbnails" msgstr "Incluir miniaturas de fotos grandes (1024px) en publicaciones. Si no está habilitado, usar miniaturas pequeñas (640px)" -#: ../../include/features.php:210 +#: ../../include/features.php:219 msgid "Automatically import channel content from other channels or feeds" msgstr "Importar automáticamente contenido de otros canales o \"feeds\"" -#: ../../include/features.php:218 +#: ../../include/features.php:227 msgid "Even More Encryption" msgstr "Más cifrado todavía" -#: ../../include/features.php:219 +#: ../../include/features.php:228 msgid "" "Allow optional encryption of content end-to-end with a shared secret key" msgstr "Permitir cifrado adicional de contenido \"punto-a-punto\" con una clave secreta compartida." -#: ../../include/features.php:227 +#: ../../include/features.php:236 msgid "Enable Voting Tools" msgstr "Permitir entradas con votación" -#: ../../include/features.php:228 +#: ../../include/features.php:237 msgid "Provide a class of post which others can vote on" msgstr "Proveer una clase de publicación en la que otros puedan votar" -#: ../../include/features.php:236 +#: ../../include/features.php:245 msgid "Disable Comments" msgstr "Deshabilitar comentarios" -#: ../../include/features.php:237 +#: ../../include/features.php:246 msgid "Provide the option to disable comments for a post" msgstr "Proporcionar la opción de desactivar los comentarios para una entrada" -#: ../../include/features.php:245 +#: ../../include/features.php:254 msgid "Delayed Posting" msgstr "Publicación aplazada" -#: ../../include/features.php:246 +#: ../../include/features.php:255 msgid "Allow posts to be published at a later date" msgstr "Permitir mensajes que se publicarán en una fecha posterior" -#: ../../include/features.php:254 +#: ../../include/features.php:263 msgid "Content Expiration" msgstr "Caducidad del contenido" -#: ../../include/features.php:255 +#: ../../include/features.php:264 msgid "Remove posts/comments and/or private messages at a future time" msgstr "Eliminar publicaciones/comentarios y/o mensajes privados más adelante" -#: ../../include/features.php:263 +#: ../../include/features.php:272 msgid "Suppress Duplicate Posts/Comments" msgstr "Prevenir entradas o comentarios duplicados" -#: ../../include/features.php:264 +#: ../../include/features.php:273 msgid "" "Prevent posts with identical content to be published with less than two " "minutes in between submissions." msgstr "Prevenir que entradas con contenido idéntico se publiquen con menos de dos minutos de intervalo." -#: ../../include/features.php:275 +#: ../../include/features.php:284 msgid "Network and Stream Filtering" msgstr "Filtrado del contenido" -#: ../../include/features.php:279 +#: ../../include/features.php:288 msgid "Search by Date" msgstr "Buscar por fecha" -#: ../../include/features.php:280 +#: ../../include/features.php:289 msgid "Ability to select posts by date ranges" msgstr "Capacidad de seleccionar entradas por rango de fechas" -#: ../../include/features.php:288 ../../include/group.php:332 +#: ../../include/features.php:297 ../../include/group.php:332 msgid "Privacy Groups" msgstr "Grupos de canales" -#: ../../include/features.php:289 +#: ../../include/features.php:298 msgid "Enable management and selection of privacy groups" msgstr "Activar la gestión y selección de grupos de canales" -#: ../../include/features.php:298 +#: ../../include/features.php:307 msgid "Save search terms for re-use" msgstr "Guardar términos de búsqueda para su reutilización" -#: ../../include/features.php:306 +#: ../../include/features.php:315 msgid "Network Personal Tab" msgstr "Actividad personal" -#: ../../include/features.php:307 +#: ../../include/features.php:316 msgid "Enable tab to display only Network posts that you've interacted on" msgstr "Habilitar una pestaña en la cual se muestren solo las entradas en las que ha participado." -#: ../../include/features.php:315 +#: ../../include/features.php:324 msgid "Network New Tab" msgstr "Contenido nuevo" -#: ../../include/features.php:316 +#: ../../include/features.php:325 msgid "Enable tab to display all new Network activity" msgstr "Habilitar una pestaña en la que se muestre solo el contenido nuevo" -#: ../../include/features.php:324 +#: ../../include/features.php:333 msgid "Affinity Tool" msgstr "Herramienta de afinidad" -#: ../../include/features.php:325 +#: ../../include/features.php:334 msgid "Filter stream activity by depth of relationships" msgstr "Filtrar el contenido según la profundidad de las relaciones" -#: ../../include/features.php:334 +#: ../../include/features.php:343 msgid "Show friend and connection suggestions" msgstr "Mostrar sugerencias de amigos y conexiones" -#: ../../include/features.php:342 +#: ../../include/features.php:351 msgid "Connection Filtering" msgstr "Filtrado de conexiones" -#: ../../include/features.php:343 +#: ../../include/features.php:352 msgid "Filter incoming posts from connections based on keywords/content" msgstr "Filtrar publicaciones entrantes de conexiones por palabras clave o contenido" -#: ../../include/features.php:355 +#: ../../include/features.php:364 msgid "Post/Comment Tools" msgstr "Gestión de entradas y comentarios" -#: ../../include/features.php:359 +#: ../../include/features.php:368 msgid "Community Tagging" msgstr "Etiquetas de la comunidad" -#: ../../include/features.php:360 +#: ../../include/features.php:369 msgid "Ability to tag existing posts" msgstr "Capacidad de etiquetar entradas existentes" -#: ../../include/features.php:368 +#: ../../include/features.php:377 msgid "Post Categories" msgstr "Temas de las entradas" -#: ../../include/features.php:369 +#: ../../include/features.php:378 msgid "Add categories to your posts" msgstr "Añadir temas a sus publicaciones" -#: ../../include/features.php:377 +#: ../../include/features.php:386 msgid "Emoji Reactions" msgstr "Emoticonos \"emoji\"" -#: ../../include/features.php:378 +#: ../../include/features.php:387 msgid "Add emoji reaction ability to posts" msgstr "Activar la capacidad de añadir un emoticono \"emoji\" a las entradas" -#: ../../include/features.php:387 +#: ../../include/features.php:396 msgid "Ability to file posts under folders" msgstr "Capacidad de archivar entradas en carpetas" -#: ../../include/features.php:395 +#: ../../include/features.php:404 msgid "Dislike Posts" msgstr "Desagrado de publicaciones" -#: ../../include/features.php:396 +#: ../../include/features.php:405 msgid "Ability to dislike posts/comments" msgstr "Capacidad de mostrar desacuerdo con el contenido de entradas y comentarios" -#: ../../include/features.php:404 +#: ../../include/features.php:413 msgid "Star Posts" msgstr "Entradas destacadas" -#: ../../include/features.php:405 +#: ../../include/features.php:414 msgid "Ability to mark special posts with a star indicator" msgstr "Capacidad de marcar entradas destacadas con un indicador de estrella" -#: ../../include/features.php:413 +#: ../../include/features.php:422 msgid "Tag Cloud" msgstr "Nube de etiquetas" -#: ../../include/features.php:414 +#: ../../include/features.php:423 msgid "Provide a personal tag cloud on your channel page" msgstr "Proveer nube de etiquetas personal en su página de canal" -#: ../../include/features.php:425 +#: ../../include/features.php:434 msgid "Premium Channel" msgstr "Canal premium" -#: ../../include/features.php:426 +#: ../../include/features.php:435 msgid "" "Allows you to set restrictions and terms on those that connect with your " "channel" msgstr "Le permite configurar restricciones y normas de uso a aquellos que conectan con su canal" -#: ../../include/taxonomy.php:267 ../../include/taxonomy.php:288 +#: ../../include/taxonomy.php:325 ../../include/taxonomy.php:346 msgid "Tags" msgstr "Etiquetas" -#: ../../include/taxonomy.php:332 +#: ../../include/taxonomy.php:410 msgid "Keywords" msgstr "Palabras clave" -#: ../../include/taxonomy.php:353 +#: ../../include/taxonomy.php:431 msgid "have" msgstr "tener" -#: ../../include/taxonomy.php:353 +#: ../../include/taxonomy.php:431 msgid "has" msgstr "tiene" -#: ../../include/taxonomy.php:354 +#: ../../include/taxonomy.php:432 msgid "want" msgstr "quiero" -#: ../../include/taxonomy.php:354 +#: ../../include/taxonomy.php:432 msgid "wants" msgstr "quiere" -#: ../../include/taxonomy.php:355 +#: ../../include/taxonomy.php:433 msgid "likes" msgstr "gusta de" -#: ../../include/taxonomy.php:356 +#: ../../include/taxonomy.php:434 msgid "dislikes" msgstr "no gusta de" @@ -13092,214 +13456,178 @@ msgstr "Cumpleaños de %1$s" msgid "Happy Birthday %1$s" msgstr "Feliz cumpleaños %1$s" -#: ../../include/nav.php:90 +#: ../../include/nav.php:91 msgid "Remote authentication" msgstr "Acceder desde su servidor" -#: ../../include/nav.php:90 +#: ../../include/nav.php:91 msgid "Click to authenticate to your home hub" msgstr "Pulsar para identificarse en su servidor de inicio" -#: ../../include/nav.php:103 ../../include/nav.php:127 -msgid "End this session" -msgstr "Finalizar esta sesión" - -#: ../../include/nav.php:106 -msgid "Your profile page" -msgstr "Su página del perfil" - -#: ../../include/nav.php:109 -msgid "Manage/Edit profiles" -msgstr "Administrar/editar perfiles" - -#: ../../include/nav.php:111 -msgid "Edit your profile" -msgstr "Editar su perfil" - -#: ../../include/nav.php:117 -msgid "Sign in" -msgstr "Acceder" - -#: ../../include/nav.php:142 -msgid "Take me home" -msgstr "Volver a la página principal" - -#: ../../include/nav.php:144 -msgid "Log me out of this site" -msgstr "Salir de este sitio" - -#: ../../include/nav.php:149 -msgid "Create an account" -msgstr "Crear una cuenta" - -#: ../../include/nav.php:161 -msgid "Help and documentation" -msgstr "Ayuda y documentación" - -#: ../../include/nav.php:164 -msgid "Search site @name, #tag, ?docs, content" -msgstr "Buscar en el sitio por @nombre, #etiqueta, ?ayuda o contenido" - -#: ../../include/nav.php:171 -msgid "Grid" -msgstr "Red" - -#: ../../include/nav.php:171 -msgid "Your grid" -msgstr "Mi red" - -#: ../../include/nav.php:172 -msgid "View your network/grid" -msgstr "Ver su red" +#: ../../include/nav.php:98 +msgid "Network Activity" +msgstr "Actividad de la red" -#: ../../include/nav.php:173 -msgid "Mark all grid notifications seen" -msgstr "Marcar todas las notificaciones de la red como vistas" +#: ../../include/nav.php:100 +msgid "Mark all activity notifications seen" +msgstr "Marcar como vistas todas las notificaciones de actividad" -#: ../../include/nav.php:175 +#: ../../include/nav.php:102 msgid "Channel home" msgstr "Mi canal" -#: ../../include/nav.php:176 +#: ../../include/nav.php:103 msgid "View your channel home" msgstr "Ver su página principal del canal" -#: ../../include/nav.php:177 +#: ../../include/nav.php:104 msgid "Mark all channel notifications seen" msgstr "Marcar todas las notificaciones del canal como leídas" -#: ../../include/nav.php:183 -msgid "Notices" -msgstr "Avisos" +#: ../../include/nav.php:109 +msgid "Registrations" +msgstr "Registros" -#: ../../include/nav.php:183 +#: ../../include/nav.php:112 msgid "Notifications" msgstr "Notificaciones" -#: ../../include/nav.php:184 +#: ../../include/nav.php:113 msgid "View all notifications" msgstr "Ver todas las notificaciones" -#: ../../include/nav.php:185 +#: ../../include/nav.php:114 msgid "Mark all system notifications seen" msgstr "Marcar todas las notificaciones del sistema como leídas" -#: ../../include/nav.php:187 +#: ../../include/nav.php:116 msgid "Private mail" msgstr "Correo privado" -#: ../../include/nav.php:188 +#: ../../include/nav.php:117 msgid "View your private messages" msgstr "Ver sus mensajes privados" -#: ../../include/nav.php:189 +#: ../../include/nav.php:118 msgid "Mark all private messages seen" msgstr "Marcar todos los mensajes privados como leídos" -#: ../../include/nav.php:195 +#: ../../include/nav.php:124 msgid "Event Calendar" msgstr "Calendario de eventos" -#: ../../include/nav.php:196 -msgid "View events" -msgstr "Ver los eventos" - -#: ../../include/nav.php:197 -msgid "Mark all events seen" -msgstr "Marcar todos los eventos como leidos" - -#: ../../include/nav.php:199 +#: ../../include/nav.php:129 ../../include/nav.php:215 msgid "Manage Your Channels" msgstr "Gestionar sus canales" -#: ../../include/nav.php:201 +#: ../../include/nav.php:132 ../../include/nav.php:217 msgid "Account/Channel Settings" msgstr "Ajustes de cuenta/canales" -#: ../../include/nav.php:203 -msgid "Shared Files" -msgstr "Ficheros compartidos" +#: ../../include/nav.php:138 ../../include/nav.php:167 +msgid "End this session" +msgstr "Finalizar esta sesión" -#: ../../include/nav.php:203 -msgid "New files shared with me" -msgstr "Nuevos ficheros compartidos conmigo" +#: ../../include/nav.php:141 +msgid "Your profile page" +msgstr "Su página del perfil" -#: ../../include/nav.php:208 -msgid "Public stream" -msgstr "\"Stream\" público" +#: ../../include/nav.php:144 +msgid "Manage/Edit profiles" +msgstr "Administrar/editar perfiles" -#: ../../include/nav.php:208 -msgid "Public stream activities" -msgstr "Actividades del \"stream\" público" +#: ../../include/nav.php:146 +msgid "Edit your profile" +msgstr "Editar su perfil" -#: ../../include/nav.php:215 +#: ../../include/nav.php:153 ../../include/nav.php:157 +msgid "Sign in" +msgstr "Acceder" + +#: ../../include/nav.php:182 +msgid "Take me home" +msgstr "Volver a la página principal" + +#: ../../include/nav.php:184 +msgid "Log me out of this site" +msgstr "Salir de este sitio" + +#: ../../include/nav.php:189 +msgid "Create an account" +msgstr "Crear una cuenta" + +#: ../../include/nav.php:201 +msgid "Help and documentation" +msgstr "Ayuda y documentación" + +#: ../../include/nav.php:204 +msgid "Search site @name, #tag, ?docs, content" +msgstr "Buscar en el sitio por @nombre, #etiqueta, ?ayuda o contenido" + +#: ../../include/nav.php:224 msgid "Site Setup and Configuration" msgstr "Ajustes y configuración del sitio" -#: ../../include/nav.php:274 +#: ../../include/nav.php:311 msgid "@name, #tag, ?doc, content" msgstr "@nombre, #etiqueta, ?ayuda, contenido" -#: ../../include/nav.php:275 +#: ../../include/nav.php:312 msgid "Please wait..." msgstr "Espere por favor…" -#: ../../include/nav.php:278 +#: ../../include/nav.php:318 msgid "Add Apps" msgstr "Añadir aplicaciones" -#: ../../include/nav.php:279 +#: ../../include/nav.php:319 msgid "Arrange Apps" msgstr "Organizar aplicaciones" -#: ../../include/nav.php:280 +#: ../../include/nav.php:320 msgid "Toggle System Apps" msgstr "Alternar aplicaciones de sistema" -#: ../../include/photos.php:111 +#: ../../include/photos.php:123 #, php-format msgid "Image exceeds website size limit of %lu bytes" msgstr "La imagen excede el límite de %lu bytes del sitio" -#: ../../include/photos.php:118 +#: ../../include/photos.php:130 msgid "Image file is empty." msgstr "El fichero de imagen está vacío. " -#: ../../include/photos.php:257 +#: ../../include/photos.php:268 msgid "Photo storage failed." msgstr "La foto no ha podido ser guardada." -#: ../../include/photos.php:297 +#: ../../include/photos.php:308 msgid "a new photo" msgstr "una nueva foto" -#: ../../include/photos.php:301 +#: ../../include/photos.php:312 #, php-format msgctxt "photo_upload" msgid "%1$s posted %2$s to %3$s" msgstr "%1$s ha publicado %2$s en %3$s" -#: ../../include/photos.php:530 +#: ../../include/photos.php:605 msgid "Upload New Photos" msgstr "Subir nuevas fotos" -#: ../../include/zot.php:653 +#: ../../include/zot.php:654 msgid "Invalid data packet" msgstr "Paquete de datos no válido" -#: ../../include/zot.php:680 +#: ../../include/zot.php:681 msgid "Unable to verify channel signature" msgstr "No ha sido posible de verificar la firma del canal" -#: ../../include/zot.php:2338 +#: ../../include/zot.php:2368 #, php-format msgid "Unable to verify site signature for %s" msgstr "No ha sido posible de verificar la firma del sitio para %s" -#: ../../include/zot.php:3946 -msgid "invalid target signature" -msgstr "La firma recibida no es válida" - #: ../../include/group.php:26 msgid "" "A deleted group with this name was revived. Existing item permissions " @@ -13339,14 +13667,18 @@ msgstr "Abrir la dirección seleccionada en una ventana o pestaña aparte" msgid "Logged out." msgstr "Desconectado/a." -#: ../../include/auth.php:275 +#: ../../include/auth.php:263 +msgid "Email validation is incomplete. Please check your email." +msgstr "La validación del correo electrónico está incompleta. Por favor, compruebe su correo electrónico." + +#: ../../include/auth.php:278 msgid "Failed authentication" msgstr "Autenticación fallida." -#: ../../include/help.php:33 +#: ../../include/help.php:34 msgid "Help:" msgstr "Ayuda:" -#: ../../include/help.php:65 +#: ../../include/help.php:78 msgid "Not Found" msgstr "No encontrado" diff --git a/view/es-es/hstrings.php b/view/es-es/hstrings.php index 21e759cd2..1a3c6d997 100644 --- a/view/es-es/hstrings.php +++ b/view/es-es/hstrings.php @@ -90,7 +90,6 @@ App::$strings["Date: "] = "Fecha: "; App::$strings["Reason: "] = "Razón: "; App::$strings["INVALID CARD DISMISSED!"] = "¡TARJETA NO VÁLIDA RECHAZADA!"; App::$strings["Name: "] = "Nombre: "; -App::$strings["CalDAV"] = "CalDAV"; App::$strings["Event title"] = "Título del evento"; App::$strings["Start date and time"] = "Fecha y hora de comienzo"; App::$strings["Example: YYYY-MM-DD HH:mm"] = "Ejemplo: YYYY-MM-DD HH:mm"; @@ -112,7 +111,6 @@ App::$strings["Select calendar"] = "Seleccionar un calendario"; App::$strings["Delete all"] = "Eliminar todos"; App::$strings["Cancel"] = "Cancelar"; App::$strings["Sorry! Editing of recurrent events is not yet implemented."] = "¡Disculpas! La edición de eventos recurrentes aún no se ha implementado."; -App::$strings["CardDAV"] = "CardDAV"; App::$strings["Name"] = "Nombre"; App::$strings["Organisation"] = "Organización"; App::$strings["Title"] = "Título"; @@ -157,6 +155,7 @@ App::$strings["Public access denied."] = "Acceso público denegado."; App::$strings["Search"] = "Buscar"; App::$strings["Items tagged with: %s"] = "elementos etiquetados con: %s"; App::$strings["Search results for: %s"] = "Resultados de la búsqueda para: %s"; +App::$strings["Public Stream"] = "\"Stream\" público"; App::$strings["Location not found."] = "Dirección no encontrada."; App::$strings["Location lookup failed."] = "Ha fallado la búsqueda de la dirección."; App::$strings["Please select another location to become primary before removing the primary location."] = "Por favor, seleccione una copia de su canal (un clon) para convertirlo en primario antes de eliminar su canal principal."; @@ -527,7 +526,7 @@ App::$strings["Novice - not skilled but willing to learn"] = "Novato: no cualifi App::$strings["Intermediate - somewhat comfortable"] = "Intermedio: bastante cómodo"; App::$strings["Advanced - very comfortable"] = "Avanzado: muy cómodo"; App::$strings["Expert - I can write computer code"] = "Experto: puedo escribir código informático"; -App::$strings["Wizard - I probably know more than you do"] = "Asistente: probablemente sé más que tú"; +App::$strings["Wizard - I probably know more than you do"] = "Colaborador: probablemente sé más que tú"; App::$strings["Site"] = "Sitio"; App::$strings["Registration"] = "Registro"; App::$strings["File upload"] = "Subir fichero"; @@ -591,6 +590,8 @@ App::$strings["Deliveries per process"] = "Intentos de envío por proceso"; App::$strings["Number of deliveries to attempt in a single operating system process. Adjust if necessary to tune system performance. Recommend: 1-5."] = "Numero de envíos a intentar en un único proceso del sistema operativo. Ajustar si es necesario mejorar el rendimiento. Se recomienda: 1-5."; App::$strings["Poll interval"] = "Intervalo máximo de tiempo entre dos mensajes sucesivos"; App::$strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "Retrasar el intervalo de envío en segundo plano, en esta cantidad de segundos, para reducir la carga del sistema. Si es 0, usar el intervalo de entrega."; +App::$strings["Path to ImageMagick convert program"] = "Ruta al programa de conversión de ImageMagick"; +App::$strings["If set, use this program to generate photo thumbnails for huge images ( > 4000 pixels in either dimension), otherwise memory exhaustion may occur. Example: /usr/bin/convert"] = "Si está configurado, utilice este programa para generar miniaturas de fotos para imágenes de gran tamaño ( > 4000 píxeles en cualquiera de las dos dimensiones), de lo contrario se puede agotar la memoria. Ejemplo: /usr/bin/convert"; App::$strings["Maximum Load Average"] = "Carga media máxima"; App::$strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Carga máxima del sistema antes de que los procesos de entrega y envío se hayan retardado - por defecto, 50."; App::$strings["Expiration period in days for imported (grid/network) content"] = "Caducidad del contenido importado de otros sitios (en días)"; @@ -652,7 +653,7 @@ App::$strings["Comment approved"] = "El comentario ha sido aprobado"; App::$strings["Comment deleted"] = "Se ha eliminado el comentario"; App::$strings["Permission category saved."] = "Se ha guardado la categoría del permiso."; App::$strings["Use this form to create permission rules for various classes of people or connections."] = "Utilice este formulario para crear reglas de permiso para varias clases de personas o conexiones."; -App::$strings["Permission Categories"] = "Categorías de autorización"; +App::$strings["Permission Categories"] = "Tipos de permisos"; App::$strings["Permission Name"] = "Nombre de la autorización"; App::$strings["My Settings"] = "Mis ajustes"; App::$strings["inherited"] = "heredado"; @@ -702,10 +703,10 @@ App::$strings["This website does not expire imported content."] = "Este sitio we App::$strings["The website limit takes precedence if lower than your limit."] = "El límite del sitio web tiene prioridad si es inferior a su propio límite."; App::$strings["Maximum Friend Requests/Day:"] = "Máximo de solicitudes de amistad por día:"; App::$strings["May reduce spam activity"] = "Podría reducir la actividad de spam"; -App::$strings["Default Access Control List (ACL)"] = "Lista de control de acceso (ACL) por defecto"; +App::$strings["Default Privacy Group"] = "Grupo de canales por defecto"; App::$strings["Use my default audience setting for the type of object published"] = "Usar los ajustes de mi audiencia predeterminada para el tipo de publicación"; App::$strings["Channel permissions category:"] = "Categoría de los permisos del canal:"; -App::$strings["Default Permissions Group"] = "Grupo de permisos predeterminado"; +App::$strings["Default Permissions Group"] = "Grupo de permisos predeterminados"; App::$strings["Maximum private messages per day from unknown people:"] = "Máximo de mensajes privados por día de gente desconocida:"; App::$strings["Useful to reduce spamming"] = "Útil para reducir el envío de correo no deseado"; App::$strings["Notification Settings"] = "Configuración de las notificaciones"; @@ -893,7 +894,7 @@ App::$strings["Connections"] = "Conexiones"; App::$strings["Blocked"] = "Bloqueadas"; App::$strings["Ignored"] = "Ignoradas"; App::$strings["Hidden"] = "Ocultas"; -App::$strings["Archived/Unreachable"] = "Archivada o inaccesible"; +App::$strings["Archived/Unreachable"] = "Archivado o inaccesible"; App::$strings["New"] = "Nuevas"; App::$strings["All"] = "Todos/as"; App::$strings["New Connections"] = "Nuevas conexiones"; @@ -901,7 +902,7 @@ App::$strings["Show pending (new) connections"] = "Mostrar conexiones (nuevas) p App::$strings["Show all connections"] = "Mostrar todas las conexiones"; App::$strings["Only show blocked connections"] = "Mostrar solo las conexiones bloqueadas"; App::$strings["Only show ignored connections"] = "Mostrar solo conexiones ignoradas"; -App::$strings["Only show archived/unreachable connections"] = "Mostrar solo las conexiones archivadas o inaccesibles"; +App::$strings["Only show archived/unreachable connections"] = "Mostrar solo las conexiones archivadas o no localizables"; App::$strings["Only show hidden connections"] = "Mostrar solo las conexiones ocultas"; App::$strings["Pending approval"] = "Pendiente de aprobación"; App::$strings["Archived"] = "Archivadas"; @@ -997,14 +998,22 @@ App::$strings["Recent Photos"] = "Fotos recientes"; App::$strings["Profile Unavailable."] = "Perfil no disponible"; App::$strings["Not found"] = "No encontrado"; App::$strings["Invalid channel"] = "Canal no válido"; -App::$strings["Wiki"] = "Wiki"; +App::$strings["Error retrieving wiki"] = "Error al recuperar el wiki"; +App::$strings["Error creating zip file export folder"] = "Error al crear el fichero comprimido zip de la carpeta a exportar"; +App::$strings["Error downloading wiki: "] = "Error al descargar el wiki: "; App::$strings["Wikis"] = "Wikis"; App::$strings["Download"] = "Descargar"; App::$strings["Create New"] = "Crear"; App::$strings["Wiki name"] = "Nombre del wiki"; App::$strings["Content type"] = "Tipo de contenido"; +App::$strings["Markdown"] = "Markdown"; +App::$strings["BBcode"] = "BBcode"; +App::$strings["Text"] = "Texto"; App::$strings["Type"] = "Tipo"; +App::$strings["Any type"] = "Cualquier tipo"; +App::$strings["Lock content type"] = "Tipo de contenido bloqueado"; App::$strings["Create a status post for this wiki"] = "Crear un mensaje de estado para este wiki"; +App::$strings["Edit Wiki Name"] = "Editar el nombre del wiki"; App::$strings["Wiki not found"] = "Wiki no encontrado"; App::$strings["Rename page"] = "Renombrar la página"; App::$strings["Error retrieving page content"] = "Error al recuperar el contenido de la página"; @@ -1027,6 +1036,8 @@ App::$strings["Error creating wiki. Invalid name."] = "Error al crear el wiki: e App::$strings["A wiki with this name already exists."] = "Ya hay un wiki con este nombre."; App::$strings["Wiki created, but error creating Home page."] = "Se ha creado el wiki, pero se ha producido un error al crear la página de inicio."; App::$strings["Error creating wiki"] = "Error al crear el wiki"; +App::$strings["Error updating wiki. Invalid name."] = "Error al actualizar el wiki. Nombre no válido."; +App::$strings["Error updating wiki"] = "Error al actualizar el wiki"; App::$strings["Wiki delete permission denied."] = "Se ha denegado el permiso para eliminar el wiki."; App::$strings["Error deleting wiki"] = "Se ha producido un error al eliminar el wiki"; App::$strings["New page created"] = "Se ha creado la nueva página"; @@ -1038,9 +1049,12 @@ App::$strings["toggle full screen mode"] = "cambiar al modo de pantalla completa App::$strings["Layout updated."] = "Plantilla actualizada."; App::$strings["Feature disabled."] = "Funcionalidad deshabilitada."; App::$strings["Edit System Page Description"] = "Editor del Sistema de Descripción de Páginas"; +App::$strings["(modified)"] = "(modificado)"; +App::$strings["Reset"] = "Reiniciar"; App::$strings["Layout not found."] = "Plantilla no encontrada"; App::$strings["Module Name:"] = "Nombre del módulo:"; App::$strings["Layout Help"] = "Ayuda para el diseño de plantillas de página"; +App::$strings["Edit another layout"] = "Editar otro diseño"; App::$strings["Poke"] = "Toques y otras cosas"; App::$strings["Poke somebody"] = "Dar un toque a alguien"; App::$strings["Poke/Prod"] = "Toque/Incitación"; @@ -1078,9 +1092,11 @@ App::$strings["You have reached your limit of %1$.0f top level posts."] = "Ha al App::$strings["You have reached your limit of %1$.0f webpages."] = "Ha alcanzado su límite de %1$.0f páginas web."; App::$strings["sent you a private message"] = "le ha enviado un mensaje privado"; App::$strings["added your channel"] = "añadió este canal a sus conexiones"; +App::$strings["requires approval"] = "requiere aprobación"; App::$strings["g A l F d"] = "g A l d F"; App::$strings["[today]"] = "[hoy]"; App::$strings["posted an event"] = "publicó un evento"; +App::$strings["shared a file with you"] = "compartió un archivo con usted"; App::$strings["Invalid item."] = "Elemento no válido."; App::$strings["Page not found."] = "Página no encontrada."; App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; @@ -1158,7 +1174,6 @@ App::$strings["Please choose the profile you would like to display to %s when vi App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. Puede cambiar estos ajustes aquí, pero no tendrán ningún consecuencia hasta que cambie los ajustes heredados."; App::$strings["Last update:"] = "Última actualización:"; App::$strings["Details"] = "Detalles"; -App::$strings["My Chatrooms"] = "Mis salas de chat"; App::$strings["Room not found"] = "Sala no encontrada"; App::$strings["Leave Room"] = "Abandonar la sala"; App::$strings["Delete Room"] = "Eliminar esta sala"; @@ -1300,6 +1315,8 @@ App::$strings["Make Default"] = "Convertir en predeterminado"; App::$strings["%d new messages"] = "%d mensajes nuevos"; App::$strings["%d new introductions"] = "%d nuevas solicitudes de conexión"; App::$strings["Delegated Channel"] = "Canal delegado"; +App::$strings["Cards"] = "Fichas"; +App::$strings["Add Card"] = "Añadir una ficha"; App::$strings["This directory server requires an access token"] = "El servidor de este directorio necesita un \"token\" de acceso"; App::$strings["About this site"] = "Acerca de este sitio"; App::$strings["Site Name"] = "Nombre del sitio"; @@ -1329,6 +1346,13 @@ App::$strings["Error opening zip file"] = "Error al abrir el fichero comprimido App::$strings["Invalid folder path."] = "La ruta de la carpeta no es válida."; App::$strings["No webpage elements detected."] = "No se han detectado elementos de ninguna página web."; App::$strings["Import complete."] = "Importación completada."; +App::$strings["Channel name changes are not allowed within 48 hours of changing the account password."] = "Los cambios en el nombre de un canal no está permitida hasta pasadas 48 horas desde el cambio de contraseña de la cuenta."; +App::$strings["Reserved nickname. Please choose another."] = "Sobrenombre en uso. Por favor, elija otro."; +App::$strings["Nickname has unsupported characters or is already being used on this site."] = "El alias contiene caracteres no admitidos o está ya en uso por otros miembros de este sitio."; +App::$strings["Change channel nickname/address"] = "Cambiar el alias o la dirección del canal"; +App::$strings["Any/all connections on other networks will be lost!"] = "¡Cualquier/todas las conexiones en otras redes se perderán!"; +App::$strings["New channel address"] = "Nueva dirección del canal"; +App::$strings["Rename Channel"] = "Renombrar el canal"; App::$strings["Item is not editable"] = "El elemento no es editable"; App::$strings["Edit post"] = "Editar la entrada"; App::$strings["Invalid message"] = "Mensaje no válido"; @@ -1504,6 +1528,7 @@ App::$strings["Developers"] = "Desarrolladores"; App::$strings["Tutorials"] = "Tutoriales"; App::$strings["\$Projectname Documentation"] = "Documentación de \$Projectname"; App::$strings["Contents"] = "Contenidos"; +App::$strings["Item has been removed."] = "Se ha eliminado el elemento."; App::$strings["Tag removed"] = "Etiqueta eliminada."; App::$strings["Remove Item Tag"] = "Eliminar etiqueta del elemento."; App::$strings["Select a tag to remove: "] = "Seleccionar una etiqueta para eliminar:"; @@ -1517,7 +1542,6 @@ App::$strings["Privacy group: "] = "Grupo de canales: "; App::$strings["Invalid connection."] = "Conexión no válida."; App::$strings["Invalid channel."] = "El canal no es válido."; App::$strings["network"] = "red"; -App::$strings["RSS"] = "RSS"; App::$strings["\$Projectname"] = "\$Projectname"; App::$strings["Welcome to %s"] = "Bienvenido a %s"; App::$strings["Permission Denied."] = "Permiso denegado"; @@ -1532,8 +1556,8 @@ App::$strings["Share this file"] = "Compartir este fichero"; App::$strings["Show URL to this file"] = "Mostrar la dirección de este fichero"; App::$strings["Show in your contacts shared folder"] = "Mostrar en la carpeta compartida con sus contactos"; App::$strings["No channel."] = "Ningún canal."; -App::$strings["Common connections"] = "Conexiones comunes"; App::$strings["No connections in common."] = "Ninguna conexión en común."; +App::$strings["View Common Connections"] = "Ver las conexiones comunes"; App::$strings["No connections."] = "Sin conexiones."; App::$strings["Visit %s's profile [%s]"] = "Visitar el perfil de %s [%s]"; App::$strings["View Connections"] = "Ver conexiones"; @@ -1556,6 +1580,7 @@ App::$strings["Website:"] = "Sitio web:"; App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Canal remoto [%s] (aún no es conocido en este sitio)"; App::$strings["Rating (this information is public)"] = "Valoración (esta información es pública)"; App::$strings["Optionally explain your rating (this information is public)"] = "Opcionalmente puede explicar su valoración (esta información es pública)"; +App::$strings["Edit Card"] = "Editar la ficha"; App::$strings["No valid account found."] = "No se ha encontrado una cuenta válida."; App::$strings["Password reset request issued. Check your email."] = "Se ha recibido una solicitud de restablecimiento de contraseña. Consulte su correo electrónico."; App::$strings["Site Member (%s)"] = "Usuario del sitio (%s)"; @@ -1571,7 +1596,6 @@ App::$strings["Your password has changed at %s"] = "Su contraseña en %s ha sido App::$strings["Forgot your Password?"] = "¿Ha olvidado su contraseña?"; App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Introduzca y envíe su dirección de correo electrónico para el restablecimiento de su contraseña. Luego revise su correo para obtener más instrucciones."; App::$strings["Email Address"] = "Dirección de correo electrónico"; -App::$strings["Reset"] = "Reiniciar"; App::$strings["Mark all seen"] = "Marcar todo como visto"; App::$strings["0. Beginner/Basic"] = "0. Principiante/Básico"; App::$strings["1. Novice - not skilled but willing to learn"] = "1. Novicio - no está preparado pero está dispuestos a aprender"; @@ -1678,6 +1702,7 @@ App::$strings["Please visit %s to approve or reject the suggestion."] = "Por fav App::$strings["[\$Projectname:Notify]"] = "[\$Projectname:Aviso]"; App::$strings["created a new post"] = "ha creado una nueva entrada"; App::$strings["commented on %s's post"] = "ha comentado la entrada de %s"; +App::$strings["Wiki updated successfully"] = "El wiki se ha actualizado con éxito"; App::$strings["Wiki files deleted successfully"] = "Se han borrado con éxito los ficheros del wiki"; App::$strings["Update Error at %s"] = "Error de actualización en %s"; App::$strings["Update %s failed. See error logs."] = "La actualización %s ha fallado. Mire el informe de errores."; @@ -1719,6 +1744,7 @@ App::$strings["Vote"] = "Votar"; App::$strings["Voting Options"] = "Opciones de votación"; App::$strings["Save Bookmarks"] = "Guardar en Marcadores"; App::$strings["Add to Calendar"] = "Añadir al calendario"; +App::$strings["This is an unsaved preview"] = "Esta es una previsualización sin guardar"; App::$strings["%s show all"] = "%s mostrar todo"; App::$strings["Bold"] = "Negrita"; App::$strings["Italic"] = "Itálico "; @@ -1726,6 +1752,7 @@ App::$strings["Underline"] = "Subrayar"; App::$strings["Quote"] = "Citar"; App::$strings["Code"] = "Código"; App::$strings["Image"] = "Imagen"; +App::$strings["Attach File"] = "Fichero adjunto"; App::$strings["Insert Link"] = "Insertar enlace"; App::$strings["Video"] = "Vídeo"; App::$strings["Your full name (required)"] = "Su nombre completo (requerido)"; @@ -1828,6 +1855,34 @@ App::$strings["Connected apps"] = "Aplicaciones (apps) conectadas"; App::$strings["Permission Groups"] = "Grupos de permisos"; App::$strings["Premium Channel Settings"] = "Configuración del canal premium"; App::$strings["Bookmarked Chatrooms"] = "Salas de chat preferidas"; +App::$strings["New Network Activity"] = "Nueva actividad en la red"; +App::$strings["New Network Activity Notifications"] = "Avisos de nueva actividad en la red"; +App::$strings["View your network activity"] = "Ver su actividad en la red"; +App::$strings["Mark all notifications read"] = "Marcar todas las notificaciones como leídas"; +App::$strings["New Home Activity"] = "Nueva actividad en su página principal"; +App::$strings["New Home Activity Notifications"] = "Avisos de nueva actividad en su página principal"; +App::$strings["View your home activity"] = "Ver su actividad en su página principal"; +App::$strings["Mark all notifications seen"] = "Marcar todas las notificaciones como vistas"; +App::$strings["New Mails"] = "Nuevos mensajes de correo"; +App::$strings["New Mails Notifications"] = "Avisos de nuevos mensajes de correo"; +App::$strings["View your private mails"] = "Ver sus correos privados"; +App::$strings["Mark all messages seen"] = "Marcar todos los mensajes como vistos"; +App::$strings["New Events"] = "Eventos nuevos"; +App::$strings["New Events Notifications"] = "Avisos de nuevos eventos"; +App::$strings["View events"] = "Ver los eventos"; +App::$strings["Mark all events seen"] = "Marcar todos los eventos como leidos"; +App::$strings["New Connections Notifications"] = "Avisos de nuevas conexiones"; +App::$strings["View all connections"] = "Ver todas las conexiones"; +App::$strings["New Files"] = "Ficheros nuevos"; +App::$strings["New Files Notifications"] = "Avisos de nuevos ficheros"; +App::$strings["Notices"] = "Avisos"; +App::$strings["View all notices"] = "Ver todos los avisos"; +App::$strings["Mark all notices seen"] = "Marcar como leídos todos los avisos"; +App::$strings["New Registrations"] = "Registros nuevos"; +App::$strings["New Registrations Notifications"] = "Notificaciones de nuevos registros"; +App::$strings["Public Stream Notifications"] = "Avisos del \"stream\" público"; +App::$strings["View the public stream"] = "Ver el \"stream\" público"; +App::$strings["Loading..."] = "Cargando..."; App::$strings["Source channel not found."] = "No se ha encontrado el canal de origen."; App::$strings["Create an account to access services and applications"] = "Crear una cuenta para acceder a los servicios y aplicaciones"; App::$strings["Logout"] = "Finalizar sesión"; @@ -1927,6 +1982,7 @@ App::$strings["Or select from a free OpenClipart.org image:"] = "O seleccionar u App::$strings["Search Term"] = "Término de búsqueda"; App::$strings["Unknown error. Please try again later."] = "Error desconocido. Por favor, inténtelo otra vez."; App::$strings["Profile photo updated successfully."] = "Se ha actualizado con éxito la foto de perfil."; +App::$strings["invalid target signature"] = "La firma recibida no es válida"; App::$strings["Flag Adult Photos"] = "Indicador (\"flag\") de fotos de adultos"; App::$strings["Provide photo edit option to hide inappropriate photos from default album view"] = "Proporcionar una opción de edición de fotos para ocultar las fotos inapropiadas de la vista de álbum predeterminada"; App::$strings["Post to WordPress"] = "Publicar en WordPress"; @@ -2096,9 +2152,6 @@ App::$strings["Followed hashtags (comma separated, do not include the #)"] = "\" App::$strings["Diaspora Protocol Settings"] = "Ajustes del protocolo de Diaspora"; App::$strings["No username found in import file."] = "No se ha encontrado el nombre de usuario en el fichero de importación."; App::$strings["Unable to create a unique channel address. Import failed."] = "No se ha podido crear una dirección de canal única. Ha fallado la importación."; -App::$strings["Error retrieving wiki"] = "Error al recuperar el wiki"; -App::$strings["Error creating zip file export folder"] = "Error al crear el fichero comprimido zip de la carpeta a exportar"; -App::$strings["Error downloading wiki: "] = "Error al descargar el wiki: "; App::$strings["Your account on %s will expire in a few days."] = "Su cuenta en %s caducará en unos pocos días."; App::$strings["Your $Productname test account is about to expire."] = "Su cuenta de prueba de $Productname está a punto de caducar."; App::$strings["Enable Rainbowtag"] = "Habilitar Rainbowtag"; @@ -2108,6 +2161,20 @@ App::$strings["Show Upload Limits"] = "Mostrar los límites de subida"; App::$strings["Hubzilla configured maximum size: "] = "Tamaño máximo configurado por Hubzilla: "; App::$strings["PHP upload_max_filesize: "] = "PHP upload_max_filesize: "; App::$strings["PHP post_max_size (must be larger than upload_max_filesize): "] = "PHP post_max_size (debe ser mayor que upload_max_filesize): "; +App::$strings["generic profile image"] = "imagen del perfil general"; +App::$strings["random geometric pattern"] = "patrón geométrico aleatorio"; +App::$strings["monster face"] = "cara de monstruo"; +App::$strings["computer generated face"] = "cara generada por ordenador"; +App::$strings["retro arcade style face"] = "cara de estilo retro arcade"; +App::$strings["Hub default profile photo"] = "Foto del perfil por defecto del hub"; +App::$strings["Information"] = "Información"; +App::$strings["Libravatar addon is installed, too. Please disable Libravatar addon or this Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if nothing was found at Libravatar."] = "El addon Libravatar también está instalado. Por favor deshabilite el addon de Libravatar o este addon de Gravatar.<br> El addon de Libravatar volverá a Gravatar si no se encuentra nada en Libravatar."; +App::$strings["Save Settings"] = "Guardar ajustes"; +App::$strings["Default avatar image"] = "Imagen del avatar por defecto"; +App::$strings["Select default avatar image if none was found at Gravatar. See README"] = "Selecciona la imagen de avatar predeterminada si no se encontró ninguna en Gravatar. Ver README"; +App::$strings["Rating of images"] = "Valoración de las imágenes"; +App::$strings["Select the appropriate avatar rating for your site. See README"] = "Seleccione la valoración adecuada del avatar para su sitio. Ver README"; +App::$strings["Gravatar settings updated."] = "Se han actualizado los ajustes de Gravatar."; App::$strings["Recent Channel/Profile Viewers"] = "Visitantes recientes del canal o perfil"; App::$strings["This plugin/addon has not been configured."] = "El plugin o complemento no se ha configurado."; App::$strings["Please visit the Visage settings on %s"] = "Por favor, revise los ajustes de Visage en %s"; @@ -2133,7 +2200,6 @@ App::$strings["Default zoom"] = "Zoom predeterminado"; App::$strings["The default zoom level. (1:world, 18:highest, also depends on tile server)"] = "El nivel de zoom predeterminado. (1: mundo, 18: el más alto, también depende del servidor del mosaico de imágenes)"; App::$strings["Include marker on map"] = "Incluir un marcador en el mapa"; App::$strings["Include a marker on the map."] = "Incluir un marcador en el mapa."; -App::$strings["Save Settings"] = "Guardar ajustes"; App::$strings["text to include in all outgoing posts from this site"] = "texto a incluir en todos los mensajes salientes de este sitio"; App::$strings["Post to Friendica"] = "Publicar en Friendica"; App::$strings["rtof Settings saved."] = "Se han guardado los ajustes de rtof"; @@ -2185,6 +2251,11 @@ App::$strings["This will import all your Friendica photo albums to this Red chan App::$strings["Friendica Server base URL"] = "URL base del servidor de Friendica"; App::$strings["Friendica Login Username"] = "Nombre de inicio de sesión en Friendica"; App::$strings["Friendica Login Password"] = "Contraseña de inicio de sesión en Friendica"; +App::$strings["ActivityPub"] = "ActivityPub"; +App::$strings["ActivityPub Protocol Settings updated."] = "Se han actualizado los ajustes del protocolo ActivityPub."; +App::$strings["The ActivityPub protocol does not support location independence. Connections you make within that network may be unreachable from alternate channel locations."] = "El protocolo ActivityPub no soporta la independencia de ubicación. Las conexiones que realice dentro de esa red pueden no ser accesibles desde ubicaciones de canales alternativos."; +App::$strings["Enable the ActivityPub protocol for this channel"] = "Activar el protocolo ActivityPub para este canal"; +App::$strings["ActivityPub Protocol Settings"] = "Ajustes del protocolo ActivityPub"; App::$strings["Project Servers and Resources"] = "Servidores y recursos del proyecto"; App::$strings["Project Creator and Tech Lead"] = "Creador del proyecto y director técnico"; App::$strings["Admin, developer, directorymin, support bloke"] = "Administrador, desarrollador, administrador del directorio, trabajador de apoyo"; @@ -2267,7 +2338,6 @@ App::$strings["Invalid game."] = "Juego no válido."; App::$strings["You are not a player in this game."] = "Usted no participa en este juego."; App::$strings["You must be a local channel to create a game."] = "Debe ser un canal local para crear un juego"; App::$strings["You must select one opponent that is not yourself."] = "Debe seleccionar un oponente que no sea usted mismo."; -App::$strings["Creating new game..."] = "Crear un nuevo juego..."; App::$strings["You must select white or black."] = "Debe elegir blancas o negras."; App::$strings["Error creating new game."] = "Error al crear un nuevo juego."; App::$strings["Requested channel is not available."] = "El canal solicitado no está disponible."; @@ -2408,7 +2478,6 @@ App::$strings["Redmatrix File Storage Import"] = "Importar repositorio de ficher App::$strings["This will import all your Redmatrix cloud files to this channel."] = "Esto importará todos sus ficheros de la nube de Redmatrix a este canal."; App::$strings["file"] = "fichero"; App::$strings["Send email to all members"] = "Enviar un correo electrónico a todos los miembros"; -App::$strings["$1%s Administrator"] = "Administrador de $1%s "; App::$strings["%1\$d of %2\$d messages sent."] = "%1\$d de %2\$d mensajes enviados."; App::$strings["Send email to all hub members."] = "Enviar un correo electrónico a todos los miembros del hub."; App::$strings["Sender Email address"] = "Dirección de correo electrónico del remitente"; @@ -2481,7 +2550,6 @@ App::$strings["Categories:"] = "Temas:"; App::$strings["Filed under:"] = "Archivado bajo:"; App::$strings["View in context"] = "Mostrar en su contexto"; App::$strings["remove"] = "eliminar"; -App::$strings["Loading..."] = "Cargando..."; App::$strings["Delete Selected Items"] = "Eliminar elementos seleccionados"; App::$strings["View Source"] = "Ver el código fuente de la entrada"; App::$strings["Follow Thread"] = "Seguir este hilo"; @@ -2521,8 +2589,6 @@ App::$strings["Toggle comments"] = "Activar o desactivar los comentarios"; App::$strings["Categories (optional, comma-separated list)"] = "Temas (opcional, lista separada por comas)"; App::$strings["Other networks and post services"] = "Otras redes y servicios de publicación"; App::$strings["Set publish date"] = "Establecer la fecha de publicación"; -App::$strings["Discover"] = "Descubrir"; -App::$strings["Imported public streams"] = "Contenidos públicos importados"; App::$strings["Commented Order"] = "Comentarios recientes"; App::$strings["Sort by Comment Date"] = "Ordenar por fecha de comentario"; App::$strings["Posted Order"] = "Publicaciones recientes"; @@ -2539,6 +2605,7 @@ App::$strings["Photo Albums"] = "Álbumes de fotos"; App::$strings["Files and Storage"] = "Ficheros y repositorio"; App::$strings["Bookmarks"] = "Marcadores"; App::$strings["Saved Bookmarks"] = "Marcadores guardados"; +App::$strings["View Cards"] = "Ver las fichas"; App::$strings["View Webpages"] = "Ver páginas web"; App::$strings["__ctx:noun__ Attending"] = array( 0 => "Participaré", @@ -2638,9 +2705,12 @@ App::$strings["Download binary/encrypted content"] = "Descargar contenido binari App::$strings["default"] = "por defecto"; App::$strings["Page layout"] = "Plantilla de la página"; App::$strings["You can create your own with the layouts tool"] = "Puede crear su propia disposición gráfica con la herramienta de plantillas"; +App::$strings["HTML"] = "HTML"; +App::$strings["Comanche Layout"] = "Plantilla de Comanche"; +App::$strings["PHP"] = "PHP"; App::$strings["Page content type"] = "Tipo de contenido de la página"; App::$strings["activity"] = "la actividad"; -App::$strings["a-z, 0-9, -, _, and . only"] = "a-z, 0-9, -, _, and . only"; +App::$strings["a-z, 0-9, -, and _ only"] = "a-z, 0-9, -, and _ only"; App::$strings["Design Tools"] = "Herramientas de diseño web"; App::$strings["Pages"] = "Páginas"; App::$strings["Import website..."] = "Importar un sitio web..."; @@ -2669,18 +2739,16 @@ App::$strings["Examples: Robert Morgenstein, Fishing"] = "Ejemplos: José Ferná App::$strings["Random Profile"] = "Perfil aleatorio"; App::$strings["Invite Friends"] = "Invitar a amigos"; App::$strings["Advanced example: name=fred and country=iceland"] = "Ejemplo avanzado: nombre=juan y país=españa"; -App::$strings["%d connection in common"] = array( - 0 => "%d conexión en común", - 1 => "%d conexiones en común", -); -App::$strings["show more"] = "mostrar más"; +App::$strings["Common Connections"] = "Conexiones comunes"; +App::$strings["View all %d common connections"] = "Ver todas las %d conexiones comunes"; App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s escribió %2\$s siguiente %3\$s"; App::$strings["Channel is blocked on this site."] = "El canal está bloqueado en este sitio."; App::$strings["Channel location missing."] = "Falta la dirección del canal."; App::$strings["Response from remote channel was incomplete."] = "Respuesta incompleta del canal."; App::$strings["Channel was deleted and no longer exists."] = "El canal ha sido eliminado y ya no existe."; -App::$strings["Protocol disabled."] = "Protocolo deshabilitado."; +App::$strings["Remote channel or protocol unavailable."] = "Canal remoto o protocolo no disponible."; App::$strings["Channel discovery failed."] = "El intento de acceder al canal ha fallado."; +App::$strings["Protocol disabled."] = "Protocolo deshabilitado."; App::$strings["Cannot connect to yourself."] = "No puede conectarse consigo mismo."; App::$strings["Delete this item?"] = "¿Borrar este elemento?"; App::$strings["%s show less"] = "%s mostrar menos"; @@ -2764,7 +2832,6 @@ App::$strings["Path not found."] = "Ruta no encontrada"; App::$strings["mkdir failed."] = "mkdir ha fallado."; App::$strings["database storage failed."] = "el almacenamiento en la base de datos ha fallado."; App::$strings["Empty path"] = "Ruta vacía"; -App::$strings["guest:"] = "invitado: "; App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "El \"token\" de seguridad del formulario no es correcto. Esto ha ocurrido probablemente porque el formulario ha estado abierto demasiado tiempo (>3 horas) antes de ser enviado"; App::$strings["(Unknown)"] = "(Desconocido)"; App::$strings["Visible to anybody on the internet."] = "Visible para cualquiera en internet."; @@ -2787,8 +2854,6 @@ App::$strings["Empty name"] = "Nombre vacío"; App::$strings["Name too long"] = "Nombre demasiado largo"; App::$strings["No account identifier"] = "Ningún identificador de la cuenta"; App::$strings["Nickname is required."] = "Se requiere un sobrenombre (alias)."; -App::$strings["Reserved nickname. Please choose another."] = "Sobrenombre en uso. Por favor, elija otro."; -App::$strings["Nickname has unsupported characters or is already being used on this site."] = "El alias contiene caracteres no admitidos o está ya en uso por otros miembros de este sitio."; App::$strings["Unable to retrieve created identity"] = "No ha sido posible recuperar la identidad creada"; App::$strings["Default Profile"] = "Perfil principal"; App::$strings["Unable to retrieve modified identity"] = "No se puede recuperar la identidad modficada"; @@ -2820,7 +2885,6 @@ App::$strings["Love/Romance:"] = "Vida sentimental o amorosa:"; App::$strings["Work/employment:"] = "Trabajo:"; App::$strings["School/education:"] = "Estudios:"; App::$strings["Like this thing"] = "Me gusta esto"; -App::$strings["User '%s' deleted"] = "El usuario '%s' ha sido eliminado"; App::$strings["l F d, Y \\@ g:i A"] = "l d de F, Y \\@ G:i"; App::$strings["Starts:"] = "Comienza:"; App::$strings["Finishes:"] = "Finaliza:"; @@ -2858,6 +2922,7 @@ App::$strings["Image/photo"] = "Imagen/foto"; App::$strings["Encrypted content"] = "Contenido cifrado"; App::$strings["Install %s element: "] = "Instalar el elemento %s:"; App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Esta entrada contiene el elemento instalable %s, sin embargo le faltan permisos para instalarlo en este sitio."; +App::$strings["card"] = "ficha"; App::$strings["Click to open/close"] = "Pulsar para abrir/cerrar"; App::$strings["spoiler"] = "spoiler"; App::$strings["$1 wrote:"] = "$1 escribió:"; @@ -2865,6 +2930,7 @@ App::$strings[" by "] = "por"; App::$strings[" on "] = "en"; App::$strings["Embedded content"] = "Contenido incorporado"; App::$strings["Embedding disabled"] = "Incrustación deshabilitada"; +App::$strings["OpenWebAuth: %1\$s welcomes %2\$s"] = "OpenWebAuth: %1\$sda la bienvenida a %2\$s"; App::$strings["General Features"] = "Funcionalidades básicas"; App::$strings["Multiple Profiles"] = "Múltiples perfiles"; App::$strings["Ability to create multiple profiles"] = "Capacidad de crear múltiples perfiles"; @@ -2877,6 +2943,7 @@ App::$strings["Provide managed web pages on your channel"] = "Proveer páginas w App::$strings["Provide a wiki for your channel"] = "Proporcionar un wiki para su canal"; App::$strings["Private Notes"] = "Notas privadas"; App::$strings["Enables a tool to store notes and reminders (note: not encrypted)"] = "Habilita una herramienta para guardar notas y recordatorios (advertencia: las notas no estarán cifradas)"; +App::$strings["Create personal planning cards"] = "Crear fichas de planificación personal"; App::$strings["Navigation Channel Select"] = "Navegación por el selector de canales"; App::$strings["Change channels directly from within the navigation dropdown menu"] = "Cambiar de canales directamente desde el menú de navegación desplegable"; App::$strings["Photo Location"] = "Ubicación de las fotos"; @@ -3000,24 +3067,12 @@ App::$strings["%1\$s's birthday"] = "Cumpleaños de %1\$s"; App::$strings["Happy Birthday %1\$s"] = "Feliz cumpleaños %1\$s"; App::$strings["Remote authentication"] = "Acceder desde su servidor"; App::$strings["Click to authenticate to your home hub"] = "Pulsar para identificarse en su servidor de inicio"; -App::$strings["End this session"] = "Finalizar esta sesión"; -App::$strings["Your profile page"] = "Su página del perfil"; -App::$strings["Manage/Edit profiles"] = "Administrar/editar perfiles"; -App::$strings["Edit your profile"] = "Editar su perfil"; -App::$strings["Sign in"] = "Acceder"; -App::$strings["Take me home"] = "Volver a la página principal"; -App::$strings["Log me out of this site"] = "Salir de este sitio"; -App::$strings["Create an account"] = "Crear una cuenta"; -App::$strings["Help and documentation"] = "Ayuda y documentación"; -App::$strings["Search site @name, #tag, ?docs, content"] = "Buscar en el sitio por @nombre, #etiqueta, ?ayuda o contenido"; -App::$strings["Grid"] = "Red"; -App::$strings["Your grid"] = "Mi red"; -App::$strings["View your network/grid"] = "Ver su red"; -App::$strings["Mark all grid notifications seen"] = "Marcar todas las notificaciones de la red como vistas"; +App::$strings["Network Activity"] = "Actividad de la red"; +App::$strings["Mark all activity notifications seen"] = "Marcar como vistas todas las notificaciones de actividad"; App::$strings["Channel home"] = "Mi canal"; App::$strings["View your channel home"] = "Ver su página principal del canal"; App::$strings["Mark all channel notifications seen"] = "Marcar todas las notificaciones del canal como leídas"; -App::$strings["Notices"] = "Avisos"; +App::$strings["Registrations"] = "Registros"; App::$strings["Notifications"] = "Notificaciones"; App::$strings["View all notifications"] = "Ver todas las notificaciones"; App::$strings["Mark all system notifications seen"] = "Marcar todas las notificaciones del sistema como leídas"; @@ -3025,14 +3080,18 @@ App::$strings["Private mail"] = "Correo privado"; App::$strings["View your private messages"] = "Ver sus mensajes privados"; App::$strings["Mark all private messages seen"] = "Marcar todos los mensajes privados como leídos"; App::$strings["Event Calendar"] = "Calendario de eventos"; -App::$strings["View events"] = "Ver los eventos"; -App::$strings["Mark all events seen"] = "Marcar todos los eventos como leidos"; App::$strings["Manage Your Channels"] = "Gestionar sus canales"; App::$strings["Account/Channel Settings"] = "Ajustes de cuenta/canales"; -App::$strings["Shared Files"] = "Ficheros compartidos"; -App::$strings["New files shared with me"] = "Nuevos ficheros compartidos conmigo"; -App::$strings["Public stream"] = "\"Stream\" público"; -App::$strings["Public stream activities"] = "Actividades del \"stream\" público"; +App::$strings["End this session"] = "Finalizar esta sesión"; +App::$strings["Your profile page"] = "Su página del perfil"; +App::$strings["Manage/Edit profiles"] = "Administrar/editar perfiles"; +App::$strings["Edit your profile"] = "Editar su perfil"; +App::$strings["Sign in"] = "Acceder"; +App::$strings["Take me home"] = "Volver a la página principal"; +App::$strings["Log me out of this site"] = "Salir de este sitio"; +App::$strings["Create an account"] = "Crear una cuenta"; +App::$strings["Help and documentation"] = "Ayuda y documentación"; +App::$strings["Search site @name, #tag, ?docs, content"] = "Buscar en el sitio por @nombre, #etiqueta, ?ayuda o contenido"; App::$strings["Site Setup and Configuration"] = "Ajustes y configuración del sitio"; App::$strings["@name, #tag, ?doc, content"] = "@nombre, #etiqueta, ?ayuda, contenido"; App::$strings["Please wait..."] = "Espere por favor…"; @@ -3048,7 +3107,6 @@ App::$strings["Upload New Photos"] = "Subir nuevas fotos"; App::$strings["Invalid data packet"] = "Paquete de datos no válido"; App::$strings["Unable to verify channel signature"] = "No ha sido posible de verificar la firma del canal"; App::$strings["Unable to verify site signature for %s"] = "No ha sido posible de verificar la firma del sitio para %s"; -App::$strings["invalid target signature"] = "La firma recibida no es válida"; App::$strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Un grupo suprimido con este nombre ha sido restablecido. <strong>Es posible</strong> que los permisos existentes sean aplicados a este grupo y sus futuros miembros. Si no quiere esto, por favor cree otro grupo con un nombre diferente."; App::$strings["Add new connections to this privacy group"] = "Añadir conexiones nuevas a este grupo de canales"; App::$strings["edit"] = "editar"; @@ -3058,6 +3116,7 @@ App::$strings["Channels not in any privacy group"] = "Sin canales en ningún gru App::$strings["New window"] = "Nueva ventana"; App::$strings["Open the selected location in a different window or browser tab"] = "Abrir la dirección seleccionada en una ventana o pestaña aparte"; App::$strings["Logged out."] = "Desconectado/a."; +App::$strings["Email validation is incomplete. Please check your email."] = "La validación del correo electrónico está incompleta. Por favor, compruebe su correo electrónico."; App::$strings["Failed authentication"] = "Autenticación fallida."; App::$strings["Help:"] = "Ayuda:"; App::$strings["Not Found"] = "No encontrado"; diff --git a/view/js/autocomplete.js b/view/js/autocomplete.js index 313e501e2..08cf97173 100644 --- a/view/js/autocomplete.js +++ b/view/js/autocomplete.js @@ -5,7 +5,7 @@ */ function contact_search(term, callback, backend_url, type, extra_channels, spinelement) { if(spinelement) { - $(spinelement).spin('tiny'); + $(spinelement).show(); } // Check if there is a cached result that contains the same information we would get with a full server-side search var bt = backend_url+type; @@ -14,7 +14,7 @@ function contact_search(term, callback, backend_url, type, extra_channels, spine var lterm = term.toLowerCase(); // Ignore case for(var t in contact_search.cache[bt]) { if(lterm.indexOf(t) >= 0) { // A more broad search has been performed already, so use those results - $(spinelement).spin(false); + $(spinelement).hide(); // Filter old results locally var matching = contact_search.cache[bt][t].filter(function (x) { return (x.name.toLowerCase().indexOf(lterm) >= 0 || (typeof x.nick !== 'undefined' && x.nick.toLowerCase().indexOf(lterm) >= 0)); }); // Need to check that nick exists because groups don't have one matching.unshift({taggable:false, text: term, replace: term}); @@ -47,7 +47,7 @@ function contact_search(term, callback, backend_url, type, extra_channels, spine var items = data.items.slice(0); items.unshift({taggable:false, text: term, replace: term}); callback(items); - $(spinelement).spin(false); + $(spinelement).hide(); }, }).fail(function () {callback([]); }); // Callback must be invoked even if something went wrong. } @@ -192,6 +192,16 @@ function string2bb(element) { template: contact_format }; + // Autocomplete forums + forums = { + match: /(^|\s)(\!)([^ \n]+)$/, + index: 3, + search: function(term, callback) { contact_search(term, callback, backend_url, 'f', extra_channels, spinelement=false); }, + replace: editor_replace, + template: contact_format + }; + + smilies = { match: /(^|\s)(:[a-z_:]{2,})$/, index: 2, @@ -201,7 +211,7 @@ function string2bb(element) { template: smiley_format }; this.attr('autocomplete','off'); - this.textcomplete([contacts,smilies], {className:'acpopup', zIndex:1020}); + this.textcomplete([contacts,forums,smilies], {className:'acpopup', zIndex:1020}); }; })( jQuery ); diff --git a/view/js/jquery.js b/view/js/jquery.js index 046447ce9..9ddbf00a9 100644 --- a/view/js/jquery.js +++ b/view/js/jquery.js @@ -1,5 +1,5 @@ -/*! jQuery v3.1.0 | (c) jQuery Foundation | jquery.org/license */ -!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.0",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null!=a?a<0?this[a+this.length]:this[a]:f.call(this)},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"label"in b&&b.disabled===a||"form"in b&&b.disabled===a||"form"in b&&b.disabled===!1&&(b.isDisabled===a||b.isDisabled!==!a&&("label"in b||!ea(b))!==a)}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e)}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(_,aa),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=V.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(_,aa),$.test(j[0].type)&&qa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&sa(j),!a)return G.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||$.test(a)&&qa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){if(r.isFunction(b))return r.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return r.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(C.test(b))return r.filter(b,a,c);b=r.filter(b,a)}return r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType})}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/\S+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0, -r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c||"false"!==c&&("null"===c?null:+c+""===c?+c:X.test(c)?JSON.parse(c):c)}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),Z(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=Z(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=V.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var $=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,_=new RegExp("^(?:([+-])=|)("+$+")([a-z%]*)$","i"),aa=["Top","Right","Bottom","Left"],ba=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ca=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function da(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&_.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ea={};function fa(a){var b,c=a.ownerDocument,d=a.nodeName,e=ea[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ea[d]=e,e)}function ga(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=V.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&ba(d)&&(e[f]=fa(d))):"none"!==c&&(e[f]="none",V.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ga(this,!0)},hide:function(){return ga(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){ba(this)?r(this).show():r(this).hide()})}});var ha=/^(?:checkbox|radio)$/i,ia=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,ja=/^$|\/(?:java|ecma)script/i,ka={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ka.optgroup=ka.option,ka.tbody=ka.tfoot=ka.colgroup=ka.caption=ka.thead,ka.th=ka.td;function la(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function ma(a,b){for(var c=0,d=a.length;c<d;c++)V.set(a[c],"globalEval",!b||V.get(b[c],"globalEval"))}var na=/<|&#?\w+;/;function oa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(na.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ia.exec(f)||["",""])[1].toLowerCase(),i=ka[h]||ka._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=la(l.appendChild(f),"script"),j&&ma(g),c){k=0;while(f=g[k++])ja.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var pa=d.documentElement,qa=/^key/,ra=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,sa=/^([^.]*)(?:\.(.+)|)/;function ta(){return!0}function ua(){return!1}function va(){try{return d.activeElement}catch(a){}}function wa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)wa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ua;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(pa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;c<h;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?r(e,this).index(i)>-1:r.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==va()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===va()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&r.nodeName(this,"input"))return this.click(),!1},_default:function(a){return r.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ta:ua,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:ua,isPropagationStopped:ua,isImmediatePropagationStopped:ua,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ta,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ta,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ta,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&qa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ra.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return wa(this,a,b,c,d)},one:function(a,b,c,d){return wa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=ua),this.each(function(){r.event.remove(this,a,c,b)})}});var xa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,ya=/<script|<style|<link/i,za=/checked\s*(?:[^=]|=\s*.checked.)/i,Aa=/^true\/(.*)/,Ba=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ca(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Da(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ea(a){var b=Aa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function Ga(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ha.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ha(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&za.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(m&&(e=oa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(la(e,"script"),Da),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,la(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ea),l=0;l<i;l++)j=h[l],ja.test(j.type||"")&&!V.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Ba,""),k))}return a}function Ia(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(la(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&ma(la(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(xa,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=la(h),f=la(a),d=0,e=f.length;d<e;d++)Ga(f[d],g[d]);if(b)if(c)for(f=f||la(a),g=g||la(h),d=0,e=f.length;d<e;d++)Fa(f[d],g[d]);else Fa(a,h);return g=la(h,"script"),g.length>0&&ma(g,!i&&la(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(la(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!ya.test(a)&&!ka[(ia.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(la(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(la(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var Ja=/^margin/,Ka=new RegExp("^("+$+")(?!px)[a-z%]+$","i"),La=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",pa.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,pa.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Ma(a,b,c){var d,e,f,g,h=a.style;return c=c||La(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ka.test(g)&&Ja.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Na(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Oa=/^(none|table(?!-c[ea]).+)/,Pa={position:"absolute",visibility:"hidden",display:"block"},Qa={letterSpacing:"0",fontWeight:"400"},Ra=["Webkit","Moz","ms"],Sa=d.createElement("div").style;function Ta(a){if(a in Sa)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ra.length;while(c--)if(a=Ra[c]+b,a in Sa)return a}function Ua(a,b,c){var d=_.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Va(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+aa[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+aa[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+aa[f]+"Width",!0,e))):(g+=r.css(a,"padding"+aa[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+aa[f]+"Width",!0,e)));return g}function Wa(a,b,c){var d,e=!0,f=La(a),g="border-box"===r.css(a,"boxSizing",!1,f);if(a.getClientRects().length&&(d=a.getBoundingClientRect()[b]),d<=0||null==d){if(d=Ma(a,b,f),(d<0||null==d)&&(d=a.style[b]),Ka.test(d))return d;e=g&&(o.boxSizingReliable()||d===a.style[b]),d=parseFloat(d)||0}return d+Va(a,b,c||(g?"border":"content"),e,f)+"px"}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ma(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=a.style;return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=_.exec(c))&&e[1]&&(c=da(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b);return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Ma(a,b,d)),"normal"===e&&b in Qa&&(e=Qa[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Oa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?Wa(a,b,d):ca(a,Pa,function(){return Wa(a,b,d)})},set:function(a,c,d){var e,f=d&&La(a),g=d&&Va(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=_.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ua(a,c,g)}}}),r.cssHooks.marginLeft=Na(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Ma(a,"marginLeft"))||a.getBoundingClientRect().left-ca(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+aa[d]+b]=f[d]||f[d-2]||f[0];return e}},Ja.test(a)||(r.cssHooks[a+b].set=Ua)}),r.fn.extend({css:function(a,b){return S(this,function(a,b,c){var d,e,f={},g=0;if(r.isArray(b)){for(d=La(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function Xa(a,b,c,d,e){return new Xa.prototype.init(a,b,c,d,e)}r.Tween=Xa,Xa.prototype={constructor:Xa,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Xa.propHooks[this.prop];return a&&a.get?a.get(this):Xa.propHooks._default.get(this)},run:function(a){var b,c=Xa.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Xa.propHooks._default.set(this),this}},Xa.prototype.init.prototype=Xa.prototype,Xa.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Xa.propHooks.scrollTop=Xa.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Xa.prototype.init,r.fx.step={};var Ya,Za,$a=/^(?:toggle|show|hide)$/,_a=/queueHooks$/;function ab(){Za&&(a.requestAnimationFrame(ab),r.fx.tick())}function bb(){return a.setTimeout(function(){Ya=void 0}),Ya=r.now()}function cb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=aa[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function db(a,b,c){for(var d,e=(gb.tweeners[b]||[]).concat(gb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function eb(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&ba(a),q=V.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],$a.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=V.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ga([a],!0),j=a.style.display||j,k=r.css(a,"display"),ga([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=V.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ga([a],!0),m.done(function(){p||ga([a]),V.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=db(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function fb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],r.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function gb(a,b,c){var d,e,f=0,g=gb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Ya||bb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:Ya||bb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(fb(k,j.opts.specialEasing);f<g;f++)if(d=gb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,db,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}r.Animation=r.extend(gb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return da(c.elem,a,_.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(K);for(var c,d=0,e=a.length;d<e;d++)c=a[d],gb.tweeners[c]=gb.tweeners[c]||[],gb.tweeners[c].unshift(b)},prefilters:[eb],prefilter:function(a,b){b?gb.prefilters.unshift(a):gb.prefilters.push(a)}}),r.speed=function(a,b,c){var e=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off||d.hidden?e.duration=0:e.duration="number"==typeof e.duration?e.duration:e.duration in r.fx.speeds?r.fx.speeds[e.duration]:r.fx.speeds._default,null!=e.queue&&e.queue!==!0||(e.queue="fx"),e.old=e.complete,e.complete=function(){r.isFunction(e.old)&&e.old.call(this),e.queue&&r.dequeue(this,e.queue)},e},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(ba).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=gb(this,r.extend({},a),f);(e||V.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=V.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&_a.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=V.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(cb(b,!0),a,d,e)}}),r.each({slideDown:cb("show"),slideUp:cb("hide"),slideToggle:cb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(Ya=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),Ya=void 0},r.fx.timer=function(a){r.timers.push(a),a()?r.fx.start():r.timers.pop()},r.fx.interval=13,r.fx.start=function(){Za||(Za=a.requestAnimationFrame?a.requestAnimationFrame(ab):a.setInterval(r.fx.tick,r.fx.interval))},r.fx.stop=function(){a.cancelAnimationFrame?a.cancelAnimationFrame(Za):a.clearInterval(Za),Za=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var hb,ib=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return S(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?hb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K); -if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),hb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ib[b]||r.find.attr;ib[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ib[g],ib[g]=e,e=null!=c(a,b,d)?g:null,ib[g]=f),e}});var jb=/^(?:input|select|textarea|button)$/i,kb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):jb.test(a.nodeName)||kb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});var lb=/[\t\r\n\f]/g;function mb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,mb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,mb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,mb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=mb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(c)+" ").replace(lb," ").indexOf(b)>-1)return!0;return!1}});var nb=/\r/g,ob=/[\x20\t\r\n\f]+/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(nb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:r.trim(r.text(a)).replace(ob," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type,g=f?null:[],h=f?e+1:d.length,i=e<0?h:f?e:0;i<h;i++)if(c=d[i],(c.selected||i===e)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ha.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,""),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Qb=[],Rb=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Qb.pop()||r.expando+"_"+rb++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Rb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Rb.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Rb,"$1"+e):b.jsonp!==!1&&(b.url+=(sb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Qb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=B.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=oa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=r.trim(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length};function Sb(a){return r.isWindow(a)?a:9===a.nodeType&&a.defaultView}r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),d.width||d.height?(e=f.ownerDocument,c=Sb(e),b=e.documentElement,{top:d.top+c.pageYOffset-b.clientTop,left:d.left+c.pageXOffset-b.clientLeft}):d):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),r.nodeName(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||pa})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return S(this,function(a,d,e){var f=Sb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Na(o.pixelPosition,function(a,c){if(c)return c=Ma(a,b),Ka.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return S(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.parseJSON=JSON.parse,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Tb=a.jQuery,Ub=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Ub),b&&a.jQuery===r&&(a.jQuery=Tb),r},b||(a.jQuery=a.$=r),r}); +/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=Array.isArray(d)))?(e?(e=!1,f=c&&Array.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,N,e),g(f,c,O,e)):(f++,j.call(a,g(f,c,N,e),g(f,c,O,e),g(f,c,N,c.notifyWith))):(d!==N&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), +a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},U=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function V(){this.expando=r.expando+V.uid++}V.uid=1,V.prototype={cache:function(a){var b=a[this.expando];return b||(b={},U(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){Array.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(L)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var W=new V,X=new V,Y=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function $(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:Y.test(a)?JSON.parse(a):a)}function _(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Z,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=$(c)}catch(e){}X.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return X.hasData(a)||W.hasData(a)},data:function(a,b,c){return X.access(a,b,c)},removeData:function(a,b){X.remove(a,b)},_data:function(a,b,c){return W.access(a,b,c)},_removeData:function(a,b){W.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=X.get(f),1===f.nodeType&&!W.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),_(f,d,e[d])));W.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){X.set(this,a)}):T(this,function(b){var c;if(f&&void 0===b){if(c=X.get(f,a),void 0!==c)return c;if(c=_(f,a),void 0!==c)return c}else this.each(function(){X.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=W.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var aa=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ba=new RegExp("^(?:([+-])=|)("+aa+")([a-z%]*)$","i"),ca=["Top","Right","Bottom","Left"],da=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ea=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function fa(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&ba.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ga={};function ha(a){var b,c=a.ownerDocument,d=a.nodeName,e=ga[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ga[d]=e,e)}function ia(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=W.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&da(d)&&(e[f]=ha(d))):"none"!==c&&(e[f]="none",W.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ia(this,!0)},hide:function(){return ia(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){da(this)?r(this).show():r(this).hide()})}});var ja=/^(?:checkbox|radio)$/i,ka=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c<d;c++)W.set(a[c],"globalEval",!b||W.get(b[c],"globalEval"))}var pa=/<|&#?\w+;/;function qa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(pa.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ka.exec(f)||["",""])[1].toLowerCase(),i=ma[h]||ma._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==xa()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===xa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&B(this,"input"))return this.click(),!1},_default:function(a){return B(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?va:wa,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:wa,isPropagationStopped:wa,isImmediatePropagationStopped:wa,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=va,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=va,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=va,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&sa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ta.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return ya(this,a,b,c,d)},one:function(a,b,c,d){return ya(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=wa),this.each(function(){r.event.remove(this,a,c,b)})}});var za=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/<script|<style|<link/i,Ba=/checked\s*(?:[^=]|=\s*.checked.)/i,Ca=/^true\/(.*)/,Da=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}X.hasData(a)&&(h=X.access(a),i=r.extend({},h),X.set(b,i))}}function Ia(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ja.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ja(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,na(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ga),l=0;l<i;l++)j=h[l],la.test(j.type||"")&&!W.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Da,""),k))}return a}function Ka(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(na(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&oa(na(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(za,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d<e;d++)Ia(f[d],g[d]);if(b)if(c)for(f=f||na(a),g=g||na(h),d=0,e=f.length;d<e;d++)Ha(f[d],g[d]);else Ha(a,h);return g=na(h,"script"),g.length>0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(na(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ja(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(na(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var La=/^margin/,Ma=new RegExp("^("+aa+")(?!px)[a-z%]+$","i"),Na=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",ra.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,ra.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Oa(a,b,c){var d,e,f,g,h=a.style;return c=c||Na(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ma.test(g)&&La.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Pa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Qa=/^(none|table(?!-c[ea]).+)/,Ra=/^--/,Sa={position:"absolute",visibility:"hidden",display:"block"},Ta={letterSpacing:"0",fontWeight:"400"},Ua=["Webkit","Moz","ms"],Va=d.createElement("div").style;function Wa(a){if(a in Va)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ua.length;while(c--)if(a=Ua[c]+b,a in Va)return a}function Xa(a){var b=r.cssProps[a];return b||(b=r.cssProps[a]=Wa(a)||a),b}function Ya(a,b,c){var d=ba.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Za(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"width"===b?1:0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+ca[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+ca[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+ca[f]+"Width",!0,e))):(g+=r.css(a,"padding"+ca[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+ca[f]+"Width",!0,e)));return g}function $a(a,b,c){var d,e=Na(a),f=Oa(a,b,e),g="border-box"===r.css(a,"boxSizing",!1,e);return Ma.test(f)?f:(d=g&&(o.boxSizingReliable()||f===a.style[b]),"auto"===f&&(f=a["offset"+b[0].toUpperCase()+b.slice(1)]),f=parseFloat(f)||0,f+Za(a,b,c||(g?"border":"content"),d,e)+"px")}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Oa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=Ra.test(b),j=a.style;return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:j[b]:(f=typeof c,"string"===f&&(e=ba.exec(c))&&e[1]&&(c=fa(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(j[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i?j.setProperty(b,c):j[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b),i=Ra.test(b);return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Oa(a,b,d)),"normal"===e&&b in Ta&&(e=Ta[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Qa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?$a(a,b,d):ea(a,Sa,function(){return $a(a,b,d)})},set:function(a,c,d){var e,f=d&&Na(a),g=d&&Za(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=ba.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ya(a,c,g)}}}),r.cssHooks.marginLeft=Pa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Oa(a,"marginLeft"))||a.getBoundingClientRect().left-ea(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+ca[d]+b]=f[d]||f[d-2]||f[0];return e}},La.test(a)||(r.cssHooks[a+b].set=Ya)}),r.fn.extend({css:function(a,b){return T(this,function(a,b,c){var d,e,f={},g=0;if(Array.isArray(b)){for(d=Na(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&da(a),q=W.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],cb.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=W.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ia([a],!0),j=a.style.display||j,k=r.css(a,"display"),ia([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=W.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ia([a],!0),m.done(function(){p||ia([a]),W.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=hb(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],Array.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=kb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=ab||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(i||h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:ab||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);f<g;f++)if(d=kb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,hb,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j}r.Animation=r.extend(kb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return fa(c.elem,a,ba.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(L);for(var c,d=0,e=a.length;d<e;d++)c=a[d],kb.tweeners[c]=kb.tweeners[c]||[],kb.tweeners[c].unshift(b)},prefilters:[ib],prefilter:function(a,b){b?kb.prefilters.unshift(a):kb.prefilters.push(a)}}),r.speed=function(a,b,c){var d=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off?d.duration=0:"number"!=typeof d.duration&&(d.duration in r.fx.speeds?d.duration=r.fx.speeds[d.duration]:d.duration=r.fx.speeds._default),null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){r.isFunction(d.old)&&d.old.call(this),d.queue&&r.dequeue(this,d.queue)},d},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(da).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=kb(this,r.extend({},a),f);(e||W.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=W.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&db.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=W.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),r.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(ab=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),ab=void 0},r.fx.timer=function(a){r.timers.push(a),r.fx.start()},r.fx.interval=13,r.fx.start=function(){bb||(bb=!0,eb())},r.fx.stop=function(){bb=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var lb,mb=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return T(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), +null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!B(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Tb=[],Ub=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Tb.pop()||r.expando+"_"+ub++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Ub.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ub.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Ub,"$1"+e):b.jsonp!==!1&&(b.url+=(vb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Tb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=C.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=qa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=pb(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length},r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),b=f.ownerDocument,c=b.documentElement,e=b.defaultView,{top:d.top+e.pageYOffset-c.clientTop,left:d.left+e.pageXOffset-c.clientLeft}):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),B(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||ra})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return T(this,function(a,d,e){var f;return r.isWindow(a)?f=a:9===a.nodeType&&(f=a.defaultView),void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Pa(o.pixelPosition,function(a,c){if(c)return c=Oa(a,b),Ma.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return T(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.holdReady=function(a){a?r.readyWait++:r.ready(!0)},r.isArray=Array.isArray,r.parseJSON=JSON.parse,r.nodeName=B,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Vb=a.jQuery,Wb=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Wb),b&&a.jQuery===r&&(a.jQuery=Vb),r},b||(a.jQuery=a.$=r),r}); diff --git a/view/js/jquery.spin.js b/view/js/jquery.spin.js deleted file mode 100644 index 6b4fd656f..000000000 --- a/view/js/jquery.spin.js +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Copyright (c) 2011-2014 Felix Gnass - * Licensed under the MIT license - * http://spin.js.org/ - */ - -/* - -Basic Usage: -============ - -$('#el').spin() // Creates a default Spinner using the text color of #el. -$('#el').spin({ ... }) // Creates a Spinner using the provided options. - -$('#el').spin(false) // Stops and removes the spinner. - -Using Presets: -============== - -$('#el').spin('small') // Creates a 'small' Spinner using the text color of #el. -$('#el').spin('large', '#fff') // Creates a 'large' white Spinner. - -Adding a custom preset: -======================= - -$.fn.spin.presets.flower = { - lines: 9 -, length: 10 -, width: 20 -, radius: 0 -} - -$('#el').spin('flower', 'red') - -*/ - -;(function(factory) { - - if (typeof exports == 'object') { - // CommonJS - factory(require('jquery'), require('spin.js')) - } else if (typeof define == 'function' && define.amd) { - // AMD, register as anonymous module - define(['jquery', 'spin'], factory) - } else { - // Browser globals - if (!window.Spinner) throw new Error('Spin.js not present') - factory(window.jQuery, window.Spinner) - } - -}(function($, Spinner) { - - $.fn.spin = function(opts, color) { - - return this.each(function() { - var $this = $(this) - , data = $this.data() - - if (data.spinner) { - data.spinner.stop() - delete data.spinner - } - if (opts !== false) { - opts = $.extend( - { color: color || $this.css('color') } - , $.fn.spin.presets[opts] || opts - ) - data.spinner = new Spinner(opts).spin(this) - } - }) - } - - $.fn.spin.presets = { - tiny: { lines: 8, length: 2, width: 2, radius: 3, position: 'relative' } - , small: { lines: 8, length: 4, width: 3, radius: 5, position: 'relative' } - , large: { lines: 10, length: 8, width: 4, radius: 8, position: 'relative' } - } - -})); diff --git a/view/js/main.js b/view/js/main.js index 8f981fe31..882f50e8a 100644 --- a/view/js/main.js +++ b/view/js/main.js @@ -1,6 +1,55 @@ function confirmDelete() { return confirm(aStr.delitem); } +function handle_comment_form(e) { + e.stopPropagation(); + + //handle eventual expanded forms + var expanded = $('.comment-edit-text.expanded'); + var i = 0; + + if(expanded.length) { + expanded.each(function() { + var ex_form = $(expanded[i].form); + var ex_fields = ex_form.find(':input[type=text], textarea'); + var ex_fields_empty = true; + + ex_fields.each(function() { + if($(this).val() != '') + ex_fields_empty = false; + }); + if(ex_fields_empty) { + ex_form.find('.comment-edit-text').removeClass('expanded').attr('placeholder', aStr.comment); + ex_form.find(':not(.comment-edit-text)').hide(); + } + i++ + }); + } + + // handle clicked form + var form = $(this); + var fields = form.find(':input[type=text], textarea'); + var fields_empty = true; + + if(form.find('.comment-edit-text').length) { + form.find('.comment-edit-text').addClass('expanded').removeAttr('placeholder'); + form.find(':not(:visible)').show(); + } + + // handle click outside of form (close empty forms) + $(document).on('click', function(e) { + fields.each(function() { + if($(this).val() != '') + fields_empty = false; + }); + if(fields_empty) { + form.find('.comment-edit-text').removeClass('expanded').attr('placeholder', aStr.comment); + form.find(':not(.comment-edit-text)').hide(); + } + }); +} + +/* function commentOpenUI(obj, id) { $(document).unbind( "click.commentOpen", handler ); @@ -44,8 +93,7 @@ function commentCloseUI(obj, id) { function commentOpen(obj, id) { if(obj.value == aStr.comment) { obj.value = ''; - $("#comment-edit-text-" + id).addClass("comment-edit-text-full"); - $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty"); + $("#comment-edit-text-" + id).addClass("expanded"); $("#mod-cmnt-wrap-" + id).show(); $("#comment-tools-" + id).show(); $("#comment-edit-anon-" + id).show(); @@ -53,12 +101,11 @@ function commentOpen(obj, id) { } return false; } - +*/ function commentClose(obj, id) { if(obj.value === '') { obj.value = aStr.comment; - $("#comment-edit-text-" + id).removeClass("comment-edit-text-full"); - $("#comment-edit-text-" + id).addClass("comment-edit-text-empty"); + $("#comment-edit-text-" + id).removeClass("expanded"); $("#mod-cmnt-wrap-" + id).hide(); $("#comment-tools-" + id).hide(); $("#comment-edit-anon-" + id).hide(); @@ -67,6 +114,7 @@ function commentClose(obj, id) { return false; } + function showHideCommentBox(id) { if( $('#comment-edit-form-' + id).is(':visible')) { $('#comment-edit-form-' + id).hide(); @@ -79,8 +127,7 @@ function commentInsert(obj, id) { var tmpStr = $("#comment-edit-text-" + id).val(); if(tmpStr == '$comment') { tmpStr = ''; - $("#comment-edit-text-" + id).addClass("comment-edit-text-full"); - $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty"); + $("#comment-edit-text-" + id).addClass("expanded"); openMenu("comment-tools-" + id); } var ins = $(obj).html(); @@ -101,8 +148,7 @@ function insertbbcomment(comment, BBcode, id) { var tmpStr = $("#comment-edit-text-" + id).val(); if(tmpStr == comment) { tmpStr = ""; - $("#comment-edit-text-" + id).addClass("comment-edit-text-full"); - $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty"); + $("#comment-edit-text-" + id).addClass("expanded"); openMenu("comment-tools-" + id); $("#comment-edit-text-" + id).val(tmpStr); } @@ -138,6 +184,19 @@ function inserteditortag(BBcode, id) { return true; } +function insertCommentAttach(comment,id) { + + activeCommentID = id; + activeCommentText = comment; + + $('body').css('cursor', 'wait'); + + $('#invisible-comment-upload').trigger('click'); + + return false; + +} + function insertCommentURL(comment, id) { reply = prompt(aStr.linkurl); if(reply && reply.length) { @@ -147,14 +206,14 @@ function insertCommentURL(comment, id) { var tmpStr = $("#comment-edit-text-" + id).val(); if(tmpStr == comment) { tmpStr = ""; - $("#comment-edit-text-" + id).addClass("comment-edit-text-full"); - $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty"); + $("#comment-edit-text-" + id).addClass("expanded"); openMenu("comment-tools-" + id); $("#comment-edit-text-" + id).val(tmpStr); } textarea = document.getElementById("comment-edit-text-" +id); textarea.value = textarea.value + data; + preview_comment(id); $('body').css('cursor', 'auto'); }); } @@ -169,8 +228,7 @@ function qCommentInsert(obj, id) { var tmpStr = $("#comment-edit-text-" + id).val(); if(tmpStr == aStr.comment) { tmpStr = ''; - $("#comment-edit-text-" + id).addClass("comment-edit-text-full"); - $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty"); + $("#comment-edit-text-" + id).addClass("expanded"); openMenu("comment-edit-submit-wrapper-" + id); } var ins = $(obj).val(); @@ -204,6 +262,14 @@ function openClose(theID) { } } +function openCloseTR(theID) { + if(document.getElementById(theID).style.display == "table-row") { + document.getElementById(theID).style.display = "none"; + } else { + document.getElementById(theID).style.display = "table-row"; + } +} + function closeOpen(theID) { if(document.getElementById(theID).style.display == "none") { document.getElementById(theID).style.display = "block"; @@ -223,7 +289,7 @@ function closeMenu(theID) { function markRead(notifType) { $.get('ping?f=&markRead='+notifType); if(timer) clearTimeout(timer); - $('#' + notifType + '-update').html(''); + $('.' + notifType + '-button').hide(); timer = setTimeout(NavUpdate,2000); } @@ -258,6 +324,7 @@ var last_filestorage_id = null; var mediaPlaying = false; var contentHeightDiff = 0; var liveRecurse = 0; +var savedTitle = ''; $(function() { $.ajaxSetup({cache: false}); @@ -298,11 +365,6 @@ $(function() { return; }); - $('span[rel^="#"]').click(function(e){ - manage_popup_menu(this, e); - return; - }); - function manage_popup_menu(w,e) { menu = $( $(w).attr('rel') ); @@ -347,12 +409,13 @@ $(function() { function NavUpdate() { if(liking) - $('.like-rotator').spin(false); + $('.like-rotator').hide(); if((! stopped) && (! mediaPlaying)) { var pingCmd = 'ping' + ((localUser != 0) ? '?f=&uid=' + localUser : ''); $.get(pingCmd,function(data) { + if(data.invalid == 1) { window.location.href=window.location.href; } @@ -365,8 +428,9 @@ function NavUpdate() { if($('#live-pubstream').length) { src = 'pubstream'; liveUpdate(); } if($('#live-display').length) { src = 'display'; liveUpdate(); } if($('#live-search').length) { src = 'search'; liveUpdate(); } + // if($('#live-cards').length) { src = 'cards'; liveUpdate(); } - if($('#live-photos').length) { + if($('#live-photos').length || $('#live-cards').length) { if(liking) { liking = 0; window.location.href=window.location.href; @@ -376,7 +440,7 @@ function NavUpdate() { updateCountsOnly = false; - if(data.network || data.home || data.intros || data.mail || data.all_events || data.notify) { + if(data.network || data.home || data.intros || data.register || data.mail || data.all_events || data.notify || data.files || data.pubs) { $('#notifications-btn').css('opacity', 1); } else { @@ -384,46 +448,28 @@ function NavUpdate() { $('#navbar-collapse-1').removeClass('show'); } - if(data.network == 0) { - data.network = ''; - $('.net-update, .net-button').hide(); - } else { - $('.net-update, .net-button').show(); + if(data.home || data.intros || data.register || data.mail || data.notify || data.files) { + $('#notifications-btn-icon').removeClass('fa-exclamation-circle'); + $('#notifications-btn-icon').addClass('fa-exclamation-triangle'); + } + if(!data.home && !data.intros && !data.register && !data.mail && !data.notify && !data.files) { + $('#notifications-btn-icon').removeClass('fa-exclamation-triangle'); + $('#notifications-btn-icon').addClass('fa-exclamation-circle'); } - $('.net-update').html(data.network); - - if(data.home == 0) { data.home = ''; $('.home-update, .home-button').hide(); } else { $('.home-update, .home-button').show(); } - $('.home-update').html(data.home); - - if(data.intros == 0) { data.intros = ''; $('.intro-update, .intro-button').hide(); } else { $('.intro-update, .intro-button').show(); } - $('.intro-update').html(data.intros); - - if(data.mail == 0) { data.mail = ''; $('.mail-update, .mail-button').hide(); } else { $('.mail-update, .mail-button').show(); } - $('.mail-update').html(data.mail); - - if(data.notify == 0) { data.notify = ''; $('.notify-update, .notify-button').hide(); } else { $('.notify-update, .notify-button').show(); } - $('.notify-update').html(data.notify); - - if(data.register == 0) { data.register = ''; $('.register-update').removeClass('show'); } else { $('.register-update').addClass('show'); } - $('.register-update').html(data.register); - - if(data.events == 0) { data.events = ''; $('.events-update, .events-button').hide(); } else { $('.events-update, .events-button').show(); } - $('.events-update').html(data.events); - - if(data.events_today == 0) { data.events_today = ''; $('.events-today-update').removeClass('show'); } else { $('.events-today-update').addClass('show'); $('.events-update').html(data.events + '*'); } - $('.events-today-update').html(data.events_today); - - if(data.birthdays == 0) { data.birthdays = ''; $('.birthdays-update').removeClass('show'); } else { $('.birthdays-update').addClass('show'); } - $('.birthdays-update').html(data.birthdays); - - if(data.birthdays_today == 0) { data.birthdays_today = ''; $('.birthdays-today-update').removeClass('show'); } else { $('.birthdays-today-update').addClass('show'); $('.birthdays-update').html(data.birthdays + '*'); } - $('.birthdays-today-update').html(data.birthdays_today); - - if(data.all_events == 0) { data.all_events = ''; $('.all_events-update, .all_events-button').hide(); } else { $('.all_events-update, .all_events-button').show(); } - $('.all_events-update').html(data.all_events); - if(data.all_events_today == 0) { data.all_events_today = ''; $('.all_events-today-update').removeClass('show'); } else { $('.all_events-today-update').addClass('show'); $('.all_events-update').html(data.all_events + '*'); } - $('.all_events-today-update').html(data.all_events_today); + $.each(data, function(index, item) { + //do not process those + var arr = ['notice', 'info', 'invalid']; + if(arr.indexOf(index) !== -1) + return; + + if(item == 0) { + $('.' + index + '-button').hide(); + } else { + $('.' + index + '-button').show(); + $('.' + index + '-update').html(item); + } + }); $.jGrowl.defaults.closerTemplate = '<div>[ ' + aStr.closeAll + ']</div>'; @@ -499,141 +545,88 @@ function updatePageItems(mode, data) { function updateConvItems(mode,data) { - if(mode === 'update') { + if(mode === 'update' || mode === 'replace') { prev = 'threads-begin'; - - $('.thread-wrapper.toplevel_item',data).each(function() { - - var ident = $(this).attr('id'); - // This should probably use the context argument instead - var commentWrap = $('#'+ident+' .collapsed-comments').attr('id'); - var itmId = 0; - var isVisible = false; - - if(typeof commentWrap !== 'undefined') - itmId = commentWrap.replace('collapsed-comments-',''); - - if($('#' + ident).length == 0 && profile_page == 1) { - $('img',this).each(function() { - $(this).attr('src',$(this).attr('dst')); - }); - if($('#collapsed-comments-'+itmId).is(':visible')) - isVisible = true; - $('#' + prev).after($(this)); - if(isVisible) - showHideComments(itmId); - $("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago(); - $("> .shared_header .autotime",this).timeago(); - } - else { - $('img',this).each(function() { - $(this).attr('src',$(this).attr('dst')); - }); - if($('#collapsed-comments-'+itmId).is(':visible')) - isVisible = true; - $('#' + ident).replaceWith($(this)); - if(isVisible) - showHideComments(itmId); - $("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago(); - $("> .shared_header .autotime",this).timeago(); - } - prev = ident; - }); } if(mode === 'append') { - next = 'threads-end'; + } + + if(mode === 'replace') { + $('.thread-wrapper').remove(); // clear existing content + } - $('.thread-wrapper.toplevel_item',data).each(function() { - var ident = $(this).attr('id'); - var commentWrap = $('#'+ident+' .collapsed-comments').attr('id'); - var itmId = 0; - var isVisible = false; + $('.thread-wrapper.toplevel_item',data).each(function() { - if(typeof commentWrap !== 'undefined') - itmId = commentWrap.replace('collapsed-comments-', ''); + var ident = $(this).attr('id'); - if($('#' + ident).length == 0) { - $('img',this).each(function() { - $(this).attr('src',$(this).attr('dst')); - }); - if($('#collapsed-comments-'+itmId).is(':visible')) - isVisible = true; - $('#threads-end').before($(this)); - if(isVisible) - showHideComments(itmId); - $("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago(); - $("> .shared_header .autotime",this).timeago(); - } - else { - $('img',this).each(function() { - $(this).attr('src', $(this).attr('dst')); - }); - if($('#collapsed-comments-'+itmId).is(':visible')) - isVisible = true; - $('#' + ident).replaceWith($(this)); - if(isVisible) - showHideComments(itmId); - $("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago(); - $("> .shared_header .autotime",this).timeago(); - } - }); + var commentWrap = $('#'+ident+' .collapsed-comments').attr('id'); + var itmId = 0; + var isVisible = false; - if(loadingPage) { - loadingPage = false; - } - } - if(mode === 'replace') { - // clear existing content - $('.thread-wrapper').remove(); + // figure out the comment state + if(typeof commentWrap !== 'undefined') + itmId = commentWrap.replace('collapsed-comments-',''); + + if($('#collapsed-comments-'+itmId).is(':visible')) + isVisible = true; - prev = 'threads-begin'; + // insert the content according to the mode and first_page + // and whether or not the content exists already (overwrite it) - $('.thread-wrapper.toplevel_item',data).each(function() { + if($('#' + ident).length == 0) { + if((mode === 'update' || mode === 'replace') && profile_page == 1) { + $('#' + prev).after($(this)); + prev = ident; + } + if(mode === 'append') { + $('#' + next).before($(this)); + } + } + else { + $('#' + ident).replaceWith($(this)); + } - var ident = $(this).attr('id'); - var commentWrap = $('#'+ident+' .collapsed-comments').attr('id'); - var itmId = 0; - var isVisible = false; + // set the comment state to the state we discovered earlier - if(typeof commentWrap !== 'undefined') - itmId = commentWrap.replace('collapsed-comments-',''); + if(isVisible) + showHideComments(itmId); - if($('#' + ident).length == 0 && profile_page == 1) { - $('img',this).each(function() { - $(this).attr('src',$(this).attr('dst')); - }); - if($('#collapsed-comments-'+itmId).is(':visible')) - isVisible = true; - $('#' + prev).after($(this)); - if(isVisible) - showHideComments(itmId); - $("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago(); - $("> .shared_header .autotime",this).timeago(); - } - prev = ident; - }); + // trigger the autotime function on all newly created content - if(loadingPage) { + $("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago(); + $("> .shared_header .autotime",this).timeago(); + + if((mode === 'append' || mode === 'replace') && (loadingPage)) { loadingPage = false; } - if (window.location.search.indexOf("mid=") != -1 || window.location.pathname.indexOf("display") != -1) { - var title = $(".wall-item-title").text(); - title.replace(/^\s+/, ''); - title.replace(/\s+$/, ''); - if (title) - document.title = title + " - " + document.title; + // if single thread view and the item has a title, display it in the title bar + + if(mode === 'replace') { + if (window.location.search.indexOf("mid=") != -1 || window.location.pathname.indexOf("display") != -1) { + var title = $(".wall-item-title").text(); + title.replace(/^\s+/, ''); + title.replace(/\s+$/, ''); + if (title) { + savedTitle = title + " " + savedTitle; + } + } } - } + }); - $('.like-rotator').spin(false); + // reset rotators and cursors we may have set before reaching this place + + $('.like-rotator').hide(); if(commentBusy) { commentBusy = false; $('body').css('cursor', 'auto'); } + // Setup to determine if the media player is playing. This affects + // some content loading decisions. + $('video').off('playing'); $('video').off('pause'); $('audio').off('playing'); @@ -673,10 +666,12 @@ function updateConvItems(mode,data) { // auto-scroll to a particular comment in a thread (designated by mid) when in single-thread mode // use the same method to generate the submid as we use in ThreadItem, - // substr(0,32) + base64_encode + replace(['+','='],['','']); - var submid = bParam_mid; - var submid_encoded = ((submid.length) ? submid.substring(0,32) : 'abcdefg'); - submid_encoded = window.btoa(submid_encoded); + // base64_encode + replace(['+','='],['','']); + + var submid = ((bParam_mid.length) ? bParam_mid : 'abcdefg'); + var encoded = ((submid.substr(0,4) == 'b64.') ? true : false); + var submid_encoded = ((encoded) ? submid.substr(4) : window.btoa(submid)); + submid_encoded = submid_encoded.replace(/[\+\=]/g,''); if($('.item_' + submid_encoded).length && !$('.item_' + submid_encoded).hasClass('toplevel_item') && mode == 'replace') { if($('.collapsed-comments').length) { @@ -746,8 +741,8 @@ function collapseHeight() { function liveUpdate() { if(typeof profile_uid === 'undefined') profile_uid = false; /* Should probably be unified with channelId defined in head.tpl */ - if((src === null) || (stopped) || (! profile_uid)) { $('.like-rotator').spin(false); return; } - if(($('.comment-edit-text-full').length) || (in_progress)) { + if((src === null) || (stopped) || (! profile_uid)) { $('.like-rotator').hide(); return; } + if(($('.comment-edit-text.expanded').length) || (in_progress)) { if(livetime) { clearTimeout(livetime); } @@ -775,7 +770,7 @@ function liveUpdate() { update_url = buildCmd(); if(page_load) { - $("#page-spinner").spin('small'); + $("#page-spinner").show(); if(bParam_page == 1) update_mode = 'replace'; else @@ -824,8 +819,8 @@ function liveUpdate() { page_load = false; scroll_next = false; updateConvItems(update_mode,data); - $("#page-spinner").spin(false); - $("#profile-jot-text-loading").spin(false); + $("#page-spinner").hide(); + $("#profile-jot-text-loading").hide(); // adjust scroll position if new content was added above viewport if(update_mode === 'update') { @@ -854,8 +849,8 @@ function liveUpdate() { page_load = false; scroll_next = false; updateConvItems(update_mode,data); - $("#page-spinner").spin(false); - $("#profile-jot-text-loading").spin(false); + $("#page-spinner").hide(); + $("#profile-jot-text-loading").hide(); in_progress = false; @@ -895,14 +890,14 @@ function pageUpdate() { update_url = baseurl + '/' + page_query + '/?f=&aj=1&page=' + bParam_page + extra_args ; - $("#page-spinner").spin('small'); + $("#page-spinner").show(); update_mode = 'append'; $.get(update_url,function(data) { page_load = false; scroll_next = false; updatePageItems(update_mode,data); - $("#page-spinner").spin(false); + $("#page-spinner").hide(); $(".autotime").timeago(); in_progress = false; }); @@ -910,6 +905,7 @@ function pageUpdate() { function justifyPhotos(id) { justifiedGalleryActive = true; + $('#' + id).show(); $('#' + id).justifiedGallery({ selector: 'a, div:not(.spinner, #page-end)', margins: 3, @@ -932,7 +928,8 @@ function justifyPhotosAjax(id) { function notify_popup_loader(notifyType) { - /* notifications template */ + /* notifications template - different for navbar and notifications widget */ + var navbar_notifications_tpl= unescape($("#navbar-notifications-template[rel=template]").html()); var notifications_tpl= unescape($("#nav-notifications-template[rel=template]").html()); var notifications_all = unescape($('<div>').append( $("#nav-" + notifyType + "-see-all").clone() ).html()); //outerHtml hack var notifications_mark = unescape($('<div>').append( $("#nav-" + notifyType + "-mark-all").clone() ).html()); //outerHtml hack @@ -947,24 +944,30 @@ function notify_popup_loader(notifyType) { window.location.href=window.location.href; } - console.log(data); + $("#navbar-" + notifyType + "-menu").html(notifications_all + notifications_mark); + $("#nav-" + notifyType + "-menu").html(notifications_all + notifications_mark); + $("." + notifyType + "-update").html(data.notify.length); - if(data.notify.length == 0){ - $("#nav-" + notifyType + "-menu").html(aStr[nothingnew]); - } else { - $("#nav-" + notifyType + "-menu").html(notifications_all + notifications_mark); + $(data.notify).each(function() { + html = navbar_notifications_tpl.format(this.notify_link,this.photo,this.name,this.message,this.when,this.hclass); + $("#navbar-" + notifyType + "-menu").append(html); + html = notifications_tpl.format(this.notify_link,this.photo,this.name,this.message,this.when,this.hclass); + $("#nav-" + notifyType + "-menu").append(html); + }); - $(data.notify).each(function() { - html = notifications_tpl.format(this.notify_link,this.photo,this.name,this.message,this.when,this.hclass); - $("#nav-" + notifyType + "-menu").append(html); - }); - $(".dropdown-menu img[data-src]").each(function(i, el){ - // Replace data-src attribute with src attribute for every image - $(el).attr('src', $(el).data("src")); - $(el).removeAttr("data-src"); - }); - } + $(".dropdown-menu img[data-src], .notification img[data-src]").each(function(i, el){ + // Replace data-src attribute with src attribute for every image + $(el).attr('src', $(el).data("src")); + $(el).removeAttr("data-src"); + }); }); + + setTimeout(function() { + if(notify_menu.hasClass('show')) { + console.log('updating ' + notifyType + ' notifications...'); + setTimeout(notify_popup_loader, updateInterval, notifyType); + } + }, 1000); } @@ -981,7 +984,7 @@ function notify_popup_loader(notifyType) { function dolike(ident, verb) { unpause(); - $('#like-rotator-' + ident.toString()).spin('tiny'); + $('#like-rotator-' + ident.toString()).show(); $.get('like/' + ident.toString() + '?verb=' + verb, NavUpdate ); liking = 1; } @@ -1011,7 +1014,7 @@ function dropItem(url, object) { function dosubthread(ident) { unpause(); - $('#like-rotator-' + ident.toString()).spin('tiny'); + $('#like-rotator-' + ident.toString()).show(); $.get('subthread/sub/' + ident.toString(), NavUpdate ); liking = 1; } @@ -1019,7 +1022,7 @@ function dosubthread(ident) { function dounsubthread(ident) { unpause(); - $('#like-rotator-' + ident.toString()).spin('tiny'); + $('#like-rotator-' + ident.toString()).show(); $.get('subthread/unsub/' + ident.toString(), NavUpdate ); liking = 1; } @@ -1028,7 +1031,7 @@ function dounsubthread(ident) { function dostar(ident) { ident = ident.toString(); - $('#like-rotator-' + ident).spin('tiny'); + $('#like-rotator-' + ident).show(); $.get('starred/' + ident, function(data) { if(data.result == 1) { $('#starred-' + ident).addClass('starred'); @@ -1046,7 +1049,7 @@ function dostar(ident) { $('#star-' + ident).removeClass('hidden'); $('#unstar-' + ident).addClass('hidden'); } - $('#like-rotator-' + ident).spin(false); + $('#like-rotator-' + ident).hide(); }); } @@ -1080,11 +1083,11 @@ function lockview(type, id) { function filestorage(event, nick, id) { $('#cloud-index-' + last_filestorage_id).removeClass('cloud-index-active'); $('#perms-panel-' + last_filestorage_id).hide().html(''); - $('#file-edit-' + id).spin('tiny'); + $('#file-edit-' + id).show(); $.get('filestorage/' + nick + '/' + id + '/edit', function(data) { $('#cloud-index-' + id).addClass('cloud-index-active'); $('#perms-panel-' + id).html(data).show(); - $('#file-edit-' + id).spin(false); + $('#file-edit-' + id).hide(); last_filestorage_id = id; }); } @@ -1103,8 +1106,10 @@ function post_comment(id) { $("#comment-edit-wrapper-" + id).hide(); $("#comment-edit-text-" + id).val(''); var tarea = document.getElementById("comment-edit-text-" + id); - if(tarea) + if(tarea) { commentClose(tarea, id); + $(document).unbind( "click.commentOpen"); + } if(timer) clearTimeout(timer); timer = setTimeout(NavUpdate,1500); } @@ -1331,9 +1336,10 @@ Array.prototype.remove = function(item) { return this.push.apply(this, rest); }; - $(document).ready(function() { + $(document).on('click focus', '.comment-edit-form', handle_comment_form); + jQuery.timeago.settings.strings = { prefixAgo : aStr['t01'], prefixFromNow : aStr['t02'], @@ -1354,6 +1360,8 @@ $(document).ready(function() { numbers : aStr['t17'], }; + savedTitle = document.title; + }); function zFormError(elm,x) { diff --git a/view/js/mod_cards.js b/view/js/mod_cards.js new file mode 100644 index 000000000..8b31c0f52 --- /dev/null +++ b/view/js/mod_cards.js @@ -0,0 +1,9 @@ +$(document).ready( function() { + $(".autotime").timeago(); + + /* autocomplete @nicknames */ + $(".comment-edit-form textarea").editor_autocomplete(baseurl+"/acl?f=&n=1"); + /* autocomplete bbcode */ + $(".comment-edit-form textarea").bbco_autocomplete('bbcode'); + +});
\ No newline at end of file diff --git a/view/js/mod_display.js b/view/js/mod_display.js index 60a1cdaa8..7e24a7f86 100644 --- a/view/js/mod_display.js +++ b/view/js/mod_display.js @@ -1,7 +1,5 @@ -<script> $(document).ready(function() { $(".comment-edit-wrapper textarea").editor_autocomplete(baseurl+"/acl?f=&n=1"); // make auto-complete work in more places $(".wall-item-comment-wrapper textarea").editor_autocomplete(baseurl+"/acl?f=&n=1"); }); -</script> diff --git a/view/js/mod_help.js b/view/js/mod_help.js new file mode 100644 index 000000000..8ee89dd61 --- /dev/null +++ b/view/js/mod_help.js @@ -0,0 +1,124 @@ +function docoTocToggle() { + if ($('#doco-top-toc').is(':visible')) { + $('#doco-toc-toggle').removeClass('fa-cog').addClass('fa-caret-right'); + } else { + $('#doco-toc-toggle').removeClass('fa-caret-right').addClass('fa-caret-down'); + } + $('#doco-top-toc').toggle(); + + return false; +} + +toc = {}; +// Generate the table of contents in the side nav menu (see view/tpl/help.tpl) +$(document).ready(function () { + // Generate the table of contents in the side nav menu (see view/tpl/help.tpl) + $('#doco-top-toc').toc({content: "#doco-content", headings: "h3,h4,h5,h6"}); + + $(".doco-section").find('a').each(function () { + var url = document.createElement('a'); + url.href = window.location; + var pageName = url.href.split('/').pop().split('#').shift().split('?').shift(); + var linkName = $(this).attr('href').split('/').pop(); + if (pageName === linkName) { + var tocUl = $(this).closest('a').append('<ul>').find('ul'); + tocUl.removeClass(); // Classes are automatically added to <ul> elements by something else + tocUl.toc({content: "#doco-content", headings: "h3"}); + tocUl.addClass('toc-content'); + tocUl.addClass('list-unstyled'); + tocUl.attr('id', 'doco-side-toc'); + + } + }); + + $(document.body).trigger("sticky_kit:recalc"); + + toc.contentTop = []; + toc.edgeMargin = 20; // margin above the top or margin from the end of the page + toc.topRange = 200; // measure from the top of the viewport to X pixels down + // Set up content an array of locations + $('#doco-side-toc').find('a').each(function () { + toc.contentTop.push($('#' + $(this).attr('href').split('#').pop()).offset().top); + }); + + + // adjust side menu + $(window).scroll(function () { + var winTop = $(window).scrollTop(), + bodyHt = $(document).height(), + vpHt = $(window).height() + toc.edgeMargin; // viewport height + margin + $.each(toc.contentTop, function (i, loc) { + if ((loc > winTop - toc.edgeMargin && (loc < winTop + toc.topRange || (winTop + vpHt) >= bodyHt))) { + $('#doco-side-toc li') + .removeClass('selected-doco-nav') + .eq(i).addClass('selected-doco-nav'); + if (typeof ($('#doco-side-toc li').eq(i).find('a').attr('href').split('#')[1]) !== 'undefined') { + window.history.pushState({}, '', location.href.split('#')[0] + '#' + $('#doco-side-toc li').eq(i).find('a').attr('href').split('#')[1]); + } + } + }); + }); + + // When the page loads, it does not scroll to the section specified in the URL because it + // has not been constructed yet by the script. This will reload the URL + if (typeof (location.href.split('#')[1]) !== 'undefined') { + var p = document.createElement('a'); + p.href = location.href; + var portstr = ''; + if (p.port !== '') { + portstr = ':' + p.port; + } + var newref = p.protocol + '//' + p.hostname + portstr + p.pathname + p.hash.split('?').shift(); + location.replace(newref) + } + + + // Determine language translations available from the language selector menu itself + var langChoices = []; + $('.lang-selector').find('.lang-choice').each(function (idx, a) { + langChoices.push($(a).html()); + }); + // Parse the URL and insert the language code for the loaded language, based + // on the variable "help_language" that is declared in the help.tpl page template + var path = window.location.pathname.split('/'); + var pathParts = []; + var pick_me = true; + for (var i = 0; i < path.length; i++) { + if(i === 2 && pick_me ) { + if(path[i].length > 0) { + pathParts.push(help_language); + pick_me = false; + if($.inArray(path[i], langChoices) < 0) { + i--; + } + } + } else { + if(path[i].length > 0) { + pathParts.push(path[i]); + } + } + + } + // Update the address bar to reflect the loaded language + window.history.pushState({}, '', '/' + pathParts.join('/')); + + // Highlight the language in the language selector that is currently viewed + $('.lang-selector').find('.lang-choice:contains("' + help_language + '")').addClass('active'); + + // Construct the links to the available translations based and populate the selector menu + $('.lang-selector').find('.lang-choice').each(function (idx, a) { + var langLink = []; + + for (var i = 0; i < pathParts.length; i++) { + + if(i === 1) { + langLink.push($(a).html()); + } else { + langLink.push(pathParts[i]); + } + + } + $(a).attr('href', '/' + langLink.join('/')); + }); + +}); diff --git a/view/js/mod_new_channel.js b/view/js/mod_new_channel.js index 17b354a4b..e670e1a35 100644 --- a/view/js/mod_new_channel.js +++ b/view/js/mod_new_channel.js @@ -1,7 +1,7 @@ $(document).ready(function() { // $("#id_permissions_role").sSelect(); $("#id_name").blur(function() { - $("#name-spinner").spin('small'); + $("#name-spinner").show(); var zreg_name = $("#id_name").val(); $.get("new_channel/autofill.json?f=&name=" + encodeURIComponent(zreg_name),function(data) { $("#id_nickname").val(data); @@ -9,12 +9,12 @@ $("#help_name").html(""); zFormError("#help_name",data.error); } - $("#name-spinner").spin(false); + $("#name-spinner").hide(); }); }); $("#id_nickname").blur(function() { - $("#nick-spinner").spin('small'); + $("#nick-spinner").show(); var zreg_nick = $("#id_nickname").val(); $.get("new_channel/checkaddr.json?f=&nick=" + encodeURIComponent(zreg_nick),function(data) { $("#id_nickname").val(data); @@ -22,7 +22,7 @@ $("#help_nickname").html(""); zFormError("#help_nickname",data.error); } - $("#nick-spinner").spin(false); + $("#nick-spinner").hide(); }); }); diff --git a/view/js/mod_register.js b/view/js/mod_register.js index f1f3e7f71..6607579a2 100644 --- a/view/js/mod_register.js +++ b/view/js/mod_register.js @@ -28,7 +28,7 @@ $(document).ready(function() { }); $("#id_name").blur(function() { - $("#name-spinner").spin('small'); + $("#name-spinner").show(); var zreg_name = $("#id_name").val(); $.get("new_channel/autofill.json?f=&name=" + encodeURIComponent(zreg_name),function(data) { $("#id_nickname").val(data); @@ -36,12 +36,12 @@ $(document).ready(function() { $("#help_name").html(""); zFormError("#help_name",data.error); } - $("#name-spinner").spin(false); + $("#name-spinner").hide(); }); }); $("#id_nickname").blur(function() { - $("#nick-spinner").spin('small'); + $("#nick-spinner").show(); var zreg_nick = $("#id_nickname").val(); $.get("new_channel/checkaddr.json?f=&nick=" + encodeURIComponent(zreg_nick),function(data) { $("#id_nickname").val(data); @@ -49,7 +49,7 @@ $(document).ready(function() { $("#help_nickname").html(""); zFormError("#help_nickname",data.error); } - $("#nick-spinner").spin(false); + $("#nick-spinner").hide(); }); }); diff --git a/view/js/spin.js b/view/js/spin.js deleted file mode 100644 index 145ce1baf..000000000 --- a/view/js/spin.js +++ /dev/null @@ -1,377 +0,0 @@ -/** - * Copyright (c) 2011-2014 Felix Gnass - * Licensed under the MIT license - * http://spin.js.org/ - * - * Example: - var opts = { - lines: 12, // The number of lines to draw - , length: 7, // The length of each line - , width: 5, // The line thickness - , radius: 10 // The radius of the inner circle - , scale: 1.0 // Scales overall size of the spinner - , corners: 1 // Roundness (0..1) - , color: '#000' // #rgb or #rrggbb - , opacity: 1/4 // Opacity of the lines - , rotate: 0 // Rotation offset - , direction: 1 // 1: clockwise, -1: counterclockwise - , speed: 1 // Rounds per second - , trail: 100 // Afterglow percentage - , fps: 20 // Frames per second when using setTimeout() - , zIndex: 2e9 // Use a high z-index by default - , className: 'spinner' // CSS class to assign to the element - , top: '50%' // center vertically - , left: '50%' // center horizontally - , shadow: false // Whether to render a shadow - , hwaccel: false // Whether to use hardware acceleration (might be buggy) - , position: 'absolute' // Element positioning - } - var target = document.getElementById('foo') - var spinner = new Spinner(opts).spin(target) - */ -;(function (root, factory) { - - /* CommonJS */ - if (typeof exports == 'object') module.exports = factory() - - /* AMD module */ - else if (typeof define == 'function' && define.amd) define(factory) - - /* Browser global */ - else root.Spinner = factory() -}(this, function () { - "use strict" - - var prefixes = ['webkit', 'Moz', 'ms', 'O'] /* Vendor prefixes */ - , animations = {} /* Animation rules keyed by their name */ - , useCssAnimations /* Whether to use CSS animations or setTimeout */ - , sheet /* A stylesheet to hold the @keyframe or VML rules. */ - - /** - * Utility function to create elements. If no tag name is given, - * a DIV is created. Optionally properties can be passed. - */ - function createEl (tag, prop) { - var el = document.createElement(tag || 'div') - , n - - for (n in prop) el[n] = prop[n] - return el - } - - /** - * Appends children and returns the parent. - */ - function ins (parent /* child1, child2, ...*/) { - for (var i = 1, n = arguments.length; i < n; i++) { - parent.appendChild(arguments[i]) - } - - return parent - } - - /** - * Creates an opacity keyframe animation rule and returns its name. - * Since most mobile Webkits have timing issues with animation-delay, - * we create separate rules for each line/segment. - */ - function addAnimation (alpha, trail, i, lines) { - var name = ['opacity', trail, ~~(alpha * 100), i, lines].join('-') - , start = 0.01 + i/lines * 100 - , z = Math.max(1 - (1-alpha) / trail * (100-start), alpha) - , prefix = useCssAnimations.substring(0, useCssAnimations.indexOf('Animation')).toLowerCase() - , pre = prefix && '-' + prefix + '-' || '' - - if (!animations[name]) { - sheet.insertRule( - '@' + pre + 'keyframes ' + name + '{' + - '0%{opacity:' + z + '}' + - start + '%{opacity:' + alpha + '}' + - (start+0.01) + '%{opacity:1}' + - (start+trail) % 100 + '%{opacity:' + alpha + '}' + - '100%{opacity:' + z + '}' + - '}', sheet.cssRules.length) - - animations[name] = 1 - } - - return name - } - - /** - * Tries various vendor prefixes and returns the first supported property. - */ - function vendor (el, prop) { - var s = el.style - , pp - , i - - prop = prop.charAt(0).toUpperCase() + prop.slice(1) - if (s[prop] !== undefined) return prop - for (i = 0; i < prefixes.length; i++) { - pp = prefixes[i]+prop - if (s[pp] !== undefined) return pp - } - } - - /** - * Sets multiple style properties at once. - */ - function css (el, prop) { - for (var n in prop) { - el.style[vendor(el, n) || n] = prop[n] - } - - return el - } - - /** - * Fills in default values. - */ - function merge (obj) { - for (var i = 1; i < arguments.length; i++) { - var def = arguments[i] - for (var n in def) { - if (obj[n] === undefined) obj[n] = def[n] - } - } - return obj - } - - /** - * Returns the line color from the given string or array. - */ - function getColor (color, idx) { - return typeof color == 'string' ? color : color[idx % color.length] - } - - // Built-in defaults - - var defaults = { - lines: 12 // The number of lines to draw - , length: 7 // The length of each line - , width: 5 // The line thickness - , radius: 10 // The radius of the inner circle - , scale: 1.0 // Scales overall size of the spinner - , corners: 1 // Roundness (0..1) - , color: '#000' // #rgb or #rrggbb - , opacity: 1/4 // Opacity of the lines - , rotate: 0 // Rotation offset - , direction: 1 // 1: clockwise, -1: counterclockwise - , speed: 1 // Rounds per second - , trail: 100 // Afterglow percentage - , fps: 20 // Frames per second when using setTimeout() - , zIndex: 2e9 // Use a high z-index by default - , className: 'spinner' // CSS class to assign to the element - , top: '50%' // center vertically - , left: '50%' // center horizontally - , shadow: false // Whether to render a shadow - , hwaccel: false // Whether to use hardware acceleration (might be buggy) - , position: 'absolute' // Element positioning - } - - /** The constructor */ - function Spinner (o) { - this.opts = merge(o || {}, Spinner.defaults, defaults) - } - - // Global defaults that override the built-ins: - Spinner.defaults = {} - - merge(Spinner.prototype, { - /** - * Adds the spinner to the given target element. If this instance is already - * spinning, it is automatically removed from its previous target b calling - * stop() internally. - */ - spin: function (target) { - this.stop() - - var self = this - , o = self.opts - , el = self.el = createEl(null, {className: o.className}) - - css(el, { - position: o.position - , width: 0 - , zIndex: o.zIndex - , left: o.left - , top: o.top - }) - - if (target) { - target.insertBefore(el, target.firstChild || null) - } - - el.setAttribute('role', 'progressbar') - self.lines(el, self.opts) - - if (!useCssAnimations) { - // No CSS animation support, use setTimeout() instead - var i = 0 - , start = (o.lines - 1) * (1 - o.direction) / 2 - , alpha - , fps = o.fps - , f = fps / o.speed - , ostep = (1 - o.opacity) / (f * o.trail / 100) - , astep = f / o.lines - - ;(function anim () { - i++ - for (var j = 0; j < o.lines; j++) { - alpha = Math.max(1 - (i + (o.lines - j) * astep) % f * ostep, o.opacity) - - self.opacity(el, j * o.direction + start, alpha, o) - } - self.timeout = self.el && setTimeout(anim, ~~(1000 / fps)) - })() - } - return self - } - - /** - * Stops and removes the Spinner. - */ - , stop: function () { - var el = this.el - if (el) { - clearTimeout(this.timeout) - if (el.parentNode) el.parentNode.removeChild(el) - this.el = undefined - } - return this - } - - /** - * Internal method that draws the individual lines. Will be overwritten - * in VML fallback mode below. - */ - , lines: function (el, o) { - var i = 0 - , start = (o.lines - 1) * (1 - o.direction) / 2 - , seg - - function fill (color, shadow) { - return css(createEl(), { - position: 'absolute' - , width: o.scale * (o.length + o.width) + 'px' - , height: o.scale * o.width + 'px' - , background: color - , boxShadow: shadow - , transformOrigin: 'left' - , transform: 'rotate(' + ~~(360/o.lines*i + o.rotate) + 'deg) translate(' + o.scale*o.radius + 'px' + ',0)' - , borderRadius: (o.corners * o.scale * o.width >> 1) + 'px' - }) - } - - for (; i < o.lines; i++) { - seg = css(createEl(), { - position: 'absolute' - , top: 1 + ~(o.scale * o.width / 2) + 'px' - , transform: o.hwaccel ? 'translate3d(0,0,0)' : '' - , opacity: o.opacity - , animation: useCssAnimations && addAnimation(o.opacity, o.trail, start + i * o.direction, o.lines) + ' ' + 1 / o.speed + 's linear infinite' - }) - - if (o.shadow) ins(seg, css(fill('#000', '0 0 4px #000'), {top: '2px'})) - ins(el, ins(seg, fill(getColor(o.color, i), '0 0 1px rgba(0,0,0,.1)'))) - } - return el - } - - /** - * Internal method that adjusts the opacity of a single line. - * Will be overwritten in VML fallback mode below. - */ - , opacity: function (el, i, val) { - if (i < el.childNodes.length) el.childNodes[i].style.opacity = val - } - - }) - - - function initVML () { - - /* Utility function to create a VML tag */ - function vml (tag, attr) { - return createEl('<' + tag + ' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">', attr) - } - - // No CSS transforms but VML support, add a CSS rule for VML elements: - sheet.addRule('.spin-vml', 'behavior:url(#default#VML)') - - Spinner.prototype.lines = function (el, o) { - var r = o.scale * (o.length + o.width) - , s = o.scale * 2 * r - - function grp () { - return css( - vml('group', { - coordsize: s + ' ' + s - , coordorigin: -r + ' ' + -r - }) - , { width: s, height: s } - ) - } - - var margin = -(o.width + o.length) * o.scale * 2 + 'px' - , g = css(grp(), {position: 'absolute', top: margin, left: margin}) - , i - - function seg (i, dx, filter) { - ins( - g - , ins( - css(grp(), {rotation: 360 / o.lines * i + 'deg', left: ~~dx}) - , ins( - css( - vml('roundrect', {arcsize: o.corners}) - , { width: r - , height: o.scale * o.width - , left: o.scale * o.radius - , top: -o.scale * o.width >> 1 - , filter: filter - } - ) - , vml('fill', {color: getColor(o.color, i), opacity: o.opacity}) - , vml('stroke', {opacity: 0}) // transparent stroke to fix color bleeding upon opacity change - ) - ) - ) - } - - if (o.shadow) - for (i = 1; i <= o.lines; i++) { - seg(i, -2, 'progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)') - } - - for (i = 1; i <= o.lines; i++) seg(i) - return ins(el, g) - } - - Spinner.prototype.opacity = function (el, i, val, o) { - var c = el.firstChild - o = o.shadow && o.lines || 0 - if (c && i + o < c.childNodes.length) { - c = c.childNodes[i + o]; c = c && c.firstChild; c = c && c.firstChild - if (c) c.opacity = val - } - } - } - - if (typeof document !== 'undefined') { - sheet = (function () { - var el = createEl('style', {type : 'text/css'}) - ins(document.getElementsByTagName('head')[0], el) - return el.sheet || el.styleSheet - }()) - - var probe = css(createEl('group'), {behavior: 'url(#default#VML)'}) - - if (!vendor(probe, 'transform') && probe.adj) initVML() - else useCssAnimations = vendor(probe, 'animation') - } - - return Spinner - -})); diff --git a/view/pdl/mod_admin.pdl b/view/pdl/mod_admin.pdl index 5bd47ea37..deee4551b 100644 --- a/view/pdl/mod_admin.pdl +++ b/view/pdl/mod_admin.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=admin][/widget] -[/region]
\ No newline at end of file +[/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_appman.pdl b/view/pdl/mod_appman.pdl index 1209d85b9..d2b1379a5 100644 --- a/view/pdl/mod_appman.pdl +++ b/view/pdl/mod_appman.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=appcategories][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_apps.pdl b/view/pdl/mod_apps.pdl index 1209d85b9..d2b1379a5 100644 --- a/view/pdl/mod_apps.pdl +++ b/view/pdl/mod_apps.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=appcategories][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_blocks.pdl b/view/pdl/mod_blocks.pdl index cef69f194..6ef7993b5 100644 --- a/view/pdl/mod_blocks.pdl +++ b/view/pdl/mod_blocks.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=design_tools][/widget] -[/region]
\ No newline at end of file +[/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_cal.pdl b/view/pdl/mod_cal.pdl index f12bf39c3..c34898dd5 100644 --- a/view/pdl/mod_cal.pdl +++ b/view/pdl/mod_cal.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=fullprofile][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_cards.pdl b/view/pdl/mod_cards.pdl new file mode 100644 index 000000000..f5606dcb8 --- /dev/null +++ b/view/pdl/mod_cards.pdl @@ -0,0 +1,8 @@ +[region=aside] +[widget=categories][var=cards]1[/var][/widget] +[widget=tasklist][/widget] +[widget=notes][/widget] +[/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_cdav.pdl b/view/pdl/mod_cdav.pdl index ae26810c4..d31308d90 100644 --- a/view/pdl/mod_cdav.pdl +++ b/view/pdl/mod_cdav.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=cdav][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_channel.pdl b/view/pdl/mod_channel.pdl index 98dc71915..f7ac0b4ef 100644 --- a/view/pdl/mod_channel.pdl +++ b/view/pdl/mod_channel.pdl @@ -3,8 +3,11 @@ [/region] [region=aside] [widget=fullprofile][/widget] +[widget=common_friends][/widget] [widget=archive][var=wall]1[/var][/widget] [widget=categories][/widget] [widget=tagcloud_wall][var=limit]24[/var][/widget] [/region] - +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_chanview.pdl b/view/pdl/mod_chanview.pdl index d8f50ad7a..5c8ca77d5 100644 --- a/view/pdl/mod_chanview.pdl +++ b/view/pdl/mod_chanview.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=vcard][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_chat.pdl b/view/pdl/mod_chat.pdl index 664e77f53..2f1f5c8d1 100644 --- a/view/pdl/mod_chat.pdl +++ b/view/pdl/mod_chat.pdl @@ -5,3 +5,6 @@ [widget=suggestedchats][/widget] [widget=chatroom_members][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_cloud.pdl b/view/pdl/mod_cloud.pdl index d8f50ad7a..5c8ca77d5 100644 --- a/view/pdl/mod_cloud.pdl +++ b/view/pdl/mod_cloud.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=vcard][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_common.pdl b/view/pdl/mod_common.pdl index f12bf39c3..c34898dd5 100644 --- a/view/pdl/mod_common.pdl +++ b/view/pdl/mod_common.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=fullprofile][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_connect.pdl b/view/pdl/mod_connect.pdl index 6b1d2a15e..23b8d9f71 100644 --- a/view/pdl/mod_connect.pdl +++ b/view/pdl/mod_connect.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=profile][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_connections.pdl b/view/pdl/mod_connections.pdl index fd3f25483..7cead4fe8 100644 --- a/view/pdl/mod_connections.pdl +++ b/view/pdl/mod_connections.pdl @@ -4,3 +4,6 @@ [widget=suggestions][/widget] [widget=findpeople][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_connedit.pdl b/view/pdl/mod_connedit.pdl index 4b468e34c..3f57ed87b 100644 --- a/view/pdl/mod_connedit.pdl +++ b/view/pdl/mod_connedit.pdl @@ -4,3 +4,6 @@ [widget=suggestions][/widget] [widget=findpeople][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_directory.pdl b/view/pdl/mod_directory.pdl index 452ab66c7..7b430738b 100644 --- a/view/pdl/mod_directory.pdl +++ b/view/pdl/mod_directory.pdl @@ -4,3 +4,6 @@ [widget=dirtags][/widget] [widget=suggestions][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_display.pdl b/view/pdl/mod_display.pdl new file mode 100644 index 000000000..e657fa88b --- /dev/null +++ b/view/pdl/mod_display.pdl @@ -0,0 +1,3 @@ +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_editblock.pdl b/view/pdl/mod_editblock.pdl index cef69f194..6ef7993b5 100644 --- a/view/pdl/mod_editblock.pdl +++ b/view/pdl/mod_editblock.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=design_tools][/widget] -[/region]
\ No newline at end of file +[/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_editlayout.pdl b/view/pdl/mod_editlayout.pdl index cef69f194..6ef7993b5 100644 --- a/view/pdl/mod_editlayout.pdl +++ b/view/pdl/mod_editlayout.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=design_tools][/widget] -[/region]
\ No newline at end of file +[/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_editwebpage.pdl b/view/pdl/mod_editwebpage.pdl index cef69f194..6ef7993b5 100644 --- a/view/pdl/mod_editwebpage.pdl +++ b/view/pdl/mod_editwebpage.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=design_tools][/widget] -[/region]
\ No newline at end of file +[/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_events.pdl b/view/pdl/mod_events.pdl index 8347d4c59..b26f3b0d0 100644 --- a/view/pdl/mod_events.pdl +++ b/view/pdl/mod_events.pdl @@ -2,3 +2,6 @@ [widget=eventstools][/widget] [widget=tasklist][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_group.pdl b/view/pdl/mod_group.pdl index 8db29cf78..0a31e17d9 100644 --- a/view/pdl/mod_group.pdl +++ b/view/pdl/mod_group.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=collections][var=mode]groups[/var][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_help.pdl b/view/pdl/mod_help.pdl index bafad3839..2eab7aa63 100644 --- a/view/pdl/mod_help.pdl +++ b/view/pdl/mod_help.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=helpindex][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_id.pdl b/view/pdl/mod_id.pdl index 71ef7f898..c34898dd5 100644 --- a/view/pdl/mod_id.pdl +++ b/view/pdl/mod_id.pdl @@ -1,4 +1,6 @@ [region=aside] [widget=fullprofile][/widget] [/region] - +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_layouts.pdl b/view/pdl/mod_layouts.pdl index cef69f194..6ef7993b5 100644 --- a/view/pdl/mod_layouts.pdl +++ b/view/pdl/mod_layouts.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=design_tools][/widget] -[/region]
\ No newline at end of file +[/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_locs.pdl b/view/pdl/mod_locs.pdl index 0b0a99638..53a3ac9e5 100644 --- a/view/pdl/mod_locs.pdl +++ b/view/pdl/mod_locs.pdl @@ -1,4 +1,6 @@ [region=aside] [widget=settings_menu][/widget] [/region] - +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_mail.pdl b/view/pdl/mod_mail.pdl index 67632619e..52f908919 100644 --- a/view/pdl/mod_mail.pdl +++ b/view/pdl/mod_mail.pdl @@ -2,3 +2,6 @@ [widget=mailmenu][/widget] [widget=conversations][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_menu.pdl b/view/pdl/mod_menu.pdl index cef69f194..6ef7993b5 100644 --- a/view/pdl/mod_menu.pdl +++ b/view/pdl/mod_menu.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=design_tools][/widget] -[/region]
\ No newline at end of file +[/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_message.pdl b/view/pdl/mod_message.pdl index 2efb3de79..f9dd8f623 100644 --- a/view/pdl/mod_message.pdl +++ b/view/pdl/mod_message.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=mailmenu][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_mitem.pdl b/view/pdl/mod_mitem.pdl index c210606d0..4db06cb49 100644 --- a/view/pdl/mod_mitem.pdl +++ b/view/pdl/mod_mitem.pdl @@ -1,4 +1,7 @@ [region=aside] [widget=design_tools][/widget] [widget=menu_preview][/widget] -[/region]
\ No newline at end of file +[/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_network.pdl b/view/pdl/mod_network.pdl index b8817fd99..44e29ffbd 100644 --- a/view/pdl/mod_network.pdl +++ b/view/pdl/mod_network.pdl @@ -1,5 +1,3 @@ -[region=nav]$nav[/region] - [region=aside] [widget=collections][/widget] [widget=forums][/widget] @@ -14,3 +12,6 @@ $content [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_photos.pdl b/view/pdl/mod_photos.pdl index c37cf02fe..4d1a5b2ea 100644 --- a/view/pdl/mod_photos.pdl +++ b/view/pdl/mod_photos.pdl @@ -2,3 +2,6 @@ [widget=vcard][/widget] [widget=photo_albums][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_profile.pdl b/view/pdl/mod_profile.pdl index f12bf39c3..c34898dd5 100644 --- a/view/pdl/mod_profile.pdl +++ b/view/pdl/mod_profile.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=fullprofile][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_profile_photo.pdl b/view/pdl/mod_profile_photo.pdl index f12bf39c3..c34898dd5 100644 --- a/view/pdl/mod_profile_photo.pdl +++ b/view/pdl/mod_profile_photo.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=fullprofile][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_profiles.pdl b/view/pdl/mod_profiles.pdl index f12bf39c3..c34898dd5 100644 --- a/view/pdl/mod_profiles.pdl +++ b/view/pdl/mod_profiles.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=fullprofile][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_profperm.pdl b/view/pdl/mod_profperm.pdl index f12bf39c3..c34898dd5 100644 --- a/view/pdl/mod_profperm.pdl +++ b/view/pdl/mod_profperm.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=fullprofile][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_pubstream.pdl b/view/pdl/mod_pubstream.pdl new file mode 100644 index 000000000..e657fa88b --- /dev/null +++ b/view/pdl/mod_pubstream.pdl @@ -0,0 +1,3 @@ +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_rate.pdl b/view/pdl/mod_rate.pdl index d8f50ad7a..5c8ca77d5 100644 --- a/view/pdl/mod_rate.pdl +++ b/view/pdl/mod_rate.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=vcard][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_ratings.pdl b/view/pdl/mod_ratings.pdl index df1486c9b..cfa39e408 100644 --- a/view/pdl/mod_ratings.pdl +++ b/view/pdl/mod_ratings.pdl @@ -5,3 +5,6 @@ [widget=suggestions][/widget] [widget=findpeople][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_search.pdl b/view/pdl/mod_search.pdl index 5096508fa..8353b4571 100644 --- a/view/pdl/mod_search.pdl +++ b/view/pdl/mod_search.pdl @@ -1,3 +1,6 @@ [region=aside] [comment][widget=sitesearch][/widget][/comment] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_settings.pdl b/view/pdl/mod_settings.pdl index 0b0a99638..53a3ac9e5 100644 --- a/view/pdl/mod_settings.pdl +++ b/view/pdl/mod_settings.pdl @@ -1,4 +1,6 @@ [region=aside] [widget=settings_menu][/widget] [/region] - +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_sharedwithme.pdl b/view/pdl/mod_sharedwithme.pdl new file mode 100644 index 000000000..e657fa88b --- /dev/null +++ b/view/pdl/mod_sharedwithme.pdl @@ -0,0 +1,3 @@ +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_suggest.pdl b/view/pdl/mod_suggest.pdl index c2889f2fe..392a36dd6 100644 --- a/view/pdl/mod_suggest.pdl +++ b/view/pdl/mod_suggest.pdl @@ -1,4 +1,7 @@ [region=aside] [widget=follow][/widget] [widget=findpeople][/widget] -[/region]
\ No newline at end of file +[/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_uexport.pdl b/view/pdl/mod_uexport.pdl index 0b0a99638..53a3ac9e5 100644 --- a/view/pdl/mod_uexport.pdl +++ b/view/pdl/mod_uexport.pdl @@ -1,4 +1,6 @@ [region=aside] [widget=settings_menu][/widget] [/region] - +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_viewconnections.pdl b/view/pdl/mod_viewconnections.pdl index f12bf39c3..c34898dd5 100644 --- a/view/pdl/mod_viewconnections.pdl +++ b/view/pdl/mod_viewconnections.pdl @@ -1,3 +1,6 @@ [region=aside] [widget=fullprofile][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_webpages.pdl b/view/pdl/mod_webpages.pdl index 9e4d604ba..4e60dc2a7 100644 --- a/view/pdl/mod_webpages.pdl +++ b/view/pdl/mod_webpages.pdl @@ -1,4 +1,7 @@ [region=aside] [widget=design_tools][/widget] [widget=website_portation_tools][/widget] -[/region]
\ No newline at end of file +[/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/pdl/mod_wiki.pdl b/view/pdl/mod_wiki.pdl index 052ae61a1..1b98b6379 100644 --- a/view/pdl/mod_wiki.pdl +++ b/view/pdl/mod_wiki.pdl @@ -2,3 +2,6 @@ [widget=vcard][/widget] [widget=wiki_pages][/widget] [/region] +[region=right_aside] +[widget=notifications][/widget] +[/region] diff --git a/view/php/default.php b/view/php/default.php index bd4d7dc22..b180a6eb8 100644 --- a/view/php/default.php +++ b/view/php/default.php @@ -8,14 +8,14 @@ <body <?php if($page['direction']) echo 'dir="rtl"' ?> > <?php if(x($page,'banner')) echo $page['banner']; ?> <header><?php if(x($page,'header')) echo $page['header']; ?></header> - <nav class="navbar fixed-top navbar-expand-md navbar-dark bg-dark"><?php if(x($page,'nav')) echo $page['nav']; ?></nav> + <nav class="navbar fixed-top navbar-expand-xl navbar-dark bg-dark"><?php if(x($page,'nav')) echo $page['nav']; ?></nav> <main> <aside id="region_1"><div id="left_aside_spacer"><div id="left_aside_wrapper"><?php if(x($page,'aside')) echo $page['aside']; ?></div></div></aside> <section id="region_2"><?php if(x($page,'content')) echo $page['content']; ?> <div id="page-footer"></div> <div id="pause"></div> </section> - <aside id="region_3" class="d-none d-xl-table-cell"><?php if(x($page,'right_aside')) echo $page['right_aside']; ?></aside> + <aside id="region_3" class="d-none d-xl-table-cell"><div id="right_aside_spacer"><div id="right_aside_wrapper"><?php if(x($page,'right_aside')) echo $page['right_aside']; ?></div></div></aside> </main> <footer><?php if(x($page,'footer')) echo $page['footer']; ?></footer> </body> diff --git a/view/php/theme_init.php b/view/php/theme_init.php index ff37023cf..1e066c570 100644 --- a/view/php/theme_init.php +++ b/view/php/theme_init.php @@ -15,15 +15,13 @@ head_add_js('jquery.js'); head_add_js('/library/justifiedGallery/jquery.justifiedGallery.min.js'); head_add_js('/library/sprintf.js/dist/sprintf.min.js'); -head_add_js('spin.js'); -head_add_js('jquery.spin.js'); head_add_js('jquery.textinputs.js'); head_add_js('autocomplete.js'); head_add_js('/library/jquery-textcomplete/jquery.textcomplete.js'); head_add_js('/library/jquery.timeago.js'); head_add_js('/library/readmore.js/readmore.js'); -head_add_js('/library/sticky-kit/sticky-kit.js'); +head_add_js('/library/sticky-kit/sticky-kit.min.js'); head_add_js('/library/jgrowl/jquery.jgrowl_minimized.js'); head_add_js('/library/cryptojs/components/core-min.js'); head_add_js('/library/cryptojs/rollups/aes.js'); diff --git a/view/theme/redbasic/css/align_left.css b/view/theme/redbasic/css/align_left.css deleted file mode 100644 index acb2893e3..000000000 --- a/view/theme/redbasic/css/align_left.css +++ /dev/null @@ -1,8 +0,0 @@ -main { - margin-left: 0px; -} - -aside#region_3 { - width: auto; - padding: 0px 0px 0px 0px; -} diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css index fd2ceb2c9..aea75df65 100644 --- a/view/theme/redbasic/css/style.css +++ b/view/theme/redbasic/css/style.css @@ -7,6 +7,7 @@ /* generals */ + html { font-size: $font_size; } @@ -49,7 +50,7 @@ main { height: 100%; background: rgba(0, 0, 0, .5); cursor: pointer; - z-index: 1029; + z-index: 1028; } h1, .h1 { @@ -136,6 +137,7 @@ input, optgroup, select, textarea { pre code { border: none; + padding: 1em 1.5em; } code { @@ -147,6 +149,7 @@ pre { background: #F5F5F5; color: #333; border:1px solid #ccc; + border-radius: $radius; } .heart { @@ -158,6 +161,10 @@ nav { filter:alpha(opacity=$nav_percent_min_opacity); } +#nav-app-link { + white-space: nowrap; +} + #powered-by { font-size: 0.5rem; position: absolute; @@ -226,6 +233,81 @@ nav { /* contextual help end */ +/* spinner */ + +.spinner-wrapper { + display: none; +} + +.spinner.s { + height: 1rem; + width: 1rem; +} + +.spinner.m { + height: 2rem; + width: 2rem; +} + +.spinner.l { + height: 3rem; + width: 3rem; +} + +.spinner.s, +.spinner.m, +.spinner.l { + margin: 0 auto; + position: relative; + -webkit-animation: rotation 1s infinite linear; + -moz-animation: rotation 1s infinite linear; + -o-animation: rotation 1s infinite linear; + animation: rotation 1s infinite linear; + border-left: .2rem solid rgba(77, 77, 77, .15); + border-right: .2rem solid rgba(77, 77, 77, .15); + border-bottom: .2rem solid rgba(77, 77, 77, .15); + border-top: .2rem solid rgba(77, 77, 77, .5); + border-radius: 100%; +} + +@-webkit-keyframes rotation { + from { + -webkit-transform: rotate(0deg); + } + to { + -webkit-transform: rotate(359deg); + } +} + +@-moz-keyframes rotation { + from { + -moz-transform: rotate(0deg); + } + to { + -moz-transform: rotate(359deg); + } +} + +@-o-keyframes rotation { + from { + -o-transform: rotate(0deg); + } + to { + -o-transform: rotate(359deg); + } +} + +@keyframes rotation { + from { + transform: rotate(0deg); + } + to { + transform: rotate(359deg); + } +} + +/* spinner end */ + /* footer */ footer { @@ -251,8 +333,7 @@ footer { margin-top: 15px; } -.preview { - background: url('../img/gray_and_white_diagonal_stripes_background_seamless.gif'); +.preview-indicator { } #theme-preview { @@ -477,8 +558,8 @@ footer { #nav-search-spinner { float: right; - margin-top: -0.85rem; - margin-right: 1.6rem; + margin-top: -1.4rem; + margin-right: 1rem; } @@ -706,23 +787,21 @@ div.jGrowl div.jGrowl-notification { .contactname { font-weight: bold; + color: $font_colour; display: block; overflow: hidden; text-overflow: ellipsis; } .dropdown-notification, +.notification, .member-item { line-height: 1.1em; font-size: 0.75rem; overflow: hidden; text-overflow: ellipsis; display: block; -} - -#page-spinner { - color: #777; - margin: 24px; + white-space: nowrap; } #acl-search::-webkit-input-placeholder { @@ -972,10 +1051,6 @@ img.mail-conv-sender-photo { display: none; } -#profile-rotator { - color: #777; -} - .jot-icons.jot-lock-warn { color: darkorange; } @@ -1074,16 +1149,11 @@ img.mail-conv-sender-photo { } -.comment-edit-text-empty, -.comment-edit-text-full { +.comment-edit-text { border: 1px solid #ccc; border-radius: $radius; } -.comment-edit-text-empty { - color: gray; -} - .divgrow-showmore { display: block; border-top: 1px dashed #ccc; @@ -1198,7 +1268,8 @@ img.mail-conv-sender-photo { .generic-content-wrapper { border: 1px solid #ccc; box-shadow: 0px 0px 5px 1px rgba(0,0,0,0.2); - border-radius: $radius; + border-radius: $radius; + margin-bottom: 1.5rem; } .section-title-wrapper { @@ -1390,6 +1461,10 @@ blockquote { background-color: $nav_bg !important; } +.navbar { + z-index:1030; +} + .navbar-dark .navbar-nav .nav-link, .usermenu i { color: $nav_icon_colour; diff --git a/view/theme/redbasic/img/bbedit.png b/view/theme/redbasic/img/bbedit.png Binary files differdeleted file mode 100644 index b89f2f7a8..000000000 --- a/view/theme/redbasic/img/bbedit.png +++ /dev/null diff --git a/view/theme/redbasic/img/border.jpg b/view/theme/redbasic/img/border.jpg Binary files differdeleted file mode 100644 index 034a1cb63..000000000 --- a/view/theme/redbasic/img/border.jpg +++ /dev/null diff --git a/view/theme/redbasic/img/editicons.png b/view/theme/redbasic/img/editicons.png Binary files differdeleted file mode 100644 index 171a40876..000000000 --- a/view/theme/redbasic/img/editicons.png +++ /dev/null diff --git a/view/theme/redbasic/img/ff-16.jpg b/view/theme/redbasic/img/ff-16.jpg Binary files differdeleted file mode 100644 index 3621f5914..000000000 --- a/view/theme/redbasic/img/ff-16.jpg +++ /dev/null diff --git a/view/theme/redbasic/img/file.gif b/view/theme/redbasic/img/file.gif Binary files differdeleted file mode 100644 index c532335ed..000000000 --- a/view/theme/redbasic/img/file.gif +++ /dev/null diff --git a/view/theme/redbasic/img/friendika-16.png b/view/theme/redbasic/img/friendika-16.png Binary files differdeleted file mode 100644 index 1a742ecdc..000000000 --- a/view/theme/redbasic/img/friendika-16.png +++ /dev/null diff --git a/view/theme/redbasic/img/jotperms.png b/view/theme/redbasic/img/jotperms.png Binary files differdeleted file mode 100644 index d133a6e01..000000000 --- a/view/theme/redbasic/img/jotperms.png +++ /dev/null diff --git a/view/theme/redbasic/img/login-bg.gif b/view/theme/redbasic/img/login-bg.gif Binary files differdeleted file mode 100644 index cde836c89..000000000 --- a/view/theme/redbasic/img/login-bg.gif +++ /dev/null diff --git a/view/theme/redbasic/img/notify_on.png b/view/theme/redbasic/img/notify_on.png Binary files differdeleted file mode 100644 index 18002e15c..000000000 --- a/view/theme/redbasic/img/notify_on.png +++ /dev/null diff --git a/view/theme/redbasic/img/photo-menu.jpg b/view/theme/redbasic/img/photo-menu.jpg Binary files differdeleted file mode 100644 index fde5eb535..000000000 --- a/view/theme/redbasic/img/photo-menu.jpg +++ /dev/null diff --git a/view/theme/redbasic/img/shiny.png b/view/theme/redbasic/img/shiny.png Binary files differdeleted file mode 100644 index 994c0d05d..000000000 --- a/view/theme/redbasic/img/shiny.png +++ /dev/null diff --git a/view/theme/redbasic/js/redbasic.js b/view/theme/redbasic/js/redbasic.js index 5a586b9f9..04199ea95 100644 --- a/view/theme/redbasic/js/redbasic.js +++ b/view/theme/redbasic/js/redbasic.js @@ -16,20 +16,26 @@ $(document).ready(function() { } $('#css3-calc').remove(); // Remove the test element - - - if($(window).width() > 767) { + if($(window).width() >= 767) { $('#left_aside_wrapper').stick_in_parent({ - offset_top: $('nav').outerHeight(true) + 10, - parent: '#region_1', + offset_top: parseInt($('aside').css('padding-top')), + parent: 'main', spacer: '#left_aside_spacer' }); } - if(($(window).width() < 767) && ($('#left_aside_wrapper .widget, #left_aside_wrapper .vcard').length > 0)) - $('#expand-aside').show(); - else - $('#expand-aside').hide(); + if($(window).width() >= 1200) { + $('#right_aside_wrapper').stick_in_parent({ + offset_top: parseInt($('aside').css('padding-top')), + parent: 'main', + spacer: '#right_aside_spacer' + }); + } + + + $('#notifications_wrapper.fs #notifications').stick_in_parent({ + parent: '#notifications_wrapper' + }); $('#expand-aside').on('click', toggleAside); @@ -48,6 +54,16 @@ $(document).ready(function() { } }); + + var right_aside_height = $('#rightt_aside_wrapper').height(); + + $('#right_aside_wrapper').on('click', function() { + if(right_aside_height != $('#right_aside_wrapper').height()) { + $(document.body).trigger("sticky_kit:recalc"); + right_aside_height = $('#right_aside_wrapper').height(); + } + }); + $('.usermenu').click(function() { if($('#navbar-collapse-1, #navbar-collapse-2').hasClass('show')){ $('#navbar-collapse-1, #navbar-collapse-2').removeClass('show'); @@ -66,6 +82,19 @@ $(document).ready(function() { } }); + var notifications_parent = $('#notifications_wrapper')[0].parentElement.id; + $('#notifications-btn').click(function() { + if($('#notifications_wrapper').hasClass('fs')) + $('#notifications_wrapper').prependTo('#' + notifications_parent); + else + $('#notifications_wrapper').prependTo('section'); + + $('#notifications_wrapper').toggleClass('fs'); + if($('#navbar-collapse-2').hasClass('show')){ + $('#navbar-collapse-2').removeClass('show'); + } + }); + $("input[data-role=cat-tagsinput]").tagsinput({ tagClass: 'badge badge-pill badge-warning text-dark' }); diff --git a/view/theme/redbasic/php/config.php b/view/theme/redbasic/php/config.php index 8dbe1be9c..f98182739 100644 --- a/view/theme/redbasic/php/config.php +++ b/view/theme/redbasic/php/config.php @@ -52,7 +52,6 @@ class RedbasicConfig { $arr['radius'] = get_pconfig(local_channel(),'redbasic', 'radius' ); $arr['shadow'] = get_pconfig(local_channel(),'redbasic', 'photo_shadow' ); $arr['converse_width']=get_pconfig(local_channel(),"redbasic","converse_width"); - $arr['align_left']=get_pconfig(local_channel(),"redbasic","align_left"); $arr['top_photo']=get_pconfig(local_channel(),"redbasic","top_photo"); $arr['reply_photo']=get_pconfig(local_channel(),"redbasic","reply_photo"); return $this->form($arr); @@ -79,7 +78,6 @@ class RedbasicConfig { set_pconfig(local_channel(), 'redbasic', 'radius', $_POST['redbasic_radius']); set_pconfig(local_channel(), 'redbasic', 'photo_shadow', $_POST['redbasic_shadow']); set_pconfig(local_channel(), 'redbasic', 'converse_width', $_POST['redbasic_converse_width']); - set_pconfig(local_channel(), 'redbasic', 'align_left', $_POST['redbasic_align_left']); set_pconfig(local_channel(), 'redbasic', 'top_photo', $_POST['redbasic_top_photo']); set_pconfig(local_channel(), 'redbasic', 'reply_photo', $_POST['redbasic_reply_photo']); } @@ -112,7 +110,6 @@ class RedbasicConfig { '$radius' => array('redbasic_radius', t('Set radius of corners'), $arr['radius'], t('Example: 4px')), '$shadow' => array('redbasic_shadow', t('Set shadow depth of photos'), $arr['shadow']), '$converse_width' => array('redbasic_converse_width',t('Set maximum width of content region in pixel'),$arr['converse_width'], t('Leave empty for default width')), - '$align_left' => array('redbasic_align_left',t('Left align page content'),$arr['align_left'], '', array(t('No'),t('Yes'))), '$top_photo' => array('redbasic_top_photo', t('Set size of conversation author photo'), $arr['top_photo']), '$reply_photo' => array('redbasic_reply_photo', t('Set size of followup author photos'), $arr['reply_photo']), )); diff --git a/view/theme/redbasic/php/style.php b/view/theme/redbasic/php/style.php index e5a6eb0cd..91cc0b85b 100644 --- a/view/theme/redbasic/php/style.php +++ b/view/theme/redbasic/php/style.php @@ -26,7 +26,6 @@ if(! App::$install) { $radius = get_pconfig($uid, 'redbasic', 'radius'); $shadow = get_pconfig($uid,'redbasic','photo_shadow'); $converse_width=get_pconfig($uid,'redbasic','converse_width'); - $align_left=get_pconfig($uid,'redbasic','align_left'); $top_photo=get_pconfig($uid,'redbasic','top_photo'); $reply_photo=get_pconfig($uid,'redbasic','reply_photo'); } @@ -117,10 +116,6 @@ if(file_exists('view/theme/redbasic/css/style.css')) { $x .= file_get_contents('view/theme/redbasic/css/narrow_navbar.css'); } - if($align_left && file_exists('view/theme/redbasic/css/align_left.css')) { - $x .= file_get_contents('view/theme/redbasic/css/align_left.css'); - } - if($schemecss) { $x .= $schemecss; } @@ -128,12 +123,8 @@ if(file_exists('view/theme/redbasic/css/style.css')) { $aside_width = 288; // left aside and right aside are 285px + converse width - if($align_left) { - $main_width = (($aside_width) + intval($converse_width)); - } - else { - $main_width = (($aside_width * 2) + intval($converse_width)); - } + $main_width = (($aside_width * 2) + intval($converse_width)); + // prevent main_width smaller than 768px $main_width = (($main_width < 768) ? 768 : $main_width); diff --git a/view/theme/redbasic/tpl/theme_settings.tpl b/view/theme/redbasic/tpl/theme_settings.tpl index f90e37ac3..7c552b49e 100644 --- a/view/theme/redbasic/tpl/theme_settings.tpl +++ b/view/theme/redbasic/tpl/theme_settings.tpl @@ -1,4 +1,3 @@ -{{include file="field_checkbox.tpl" field=$align_left}} {{include file="field_checkbox.tpl" field=$narrow_navbar}} {{include file="field_input.tpl" field=$converse_width}} {{include file="field_input.tpl" field=$font_size}} diff --git a/view/tpl/abook_edit.tpl b/view/tpl/abook_edit.tpl index 146030494..13b94a560 100755 --- a/view/tpl/abook_edit.tpl +++ b/view/tpl/abook_edit.tpl @@ -52,7 +52,7 @@ {{/foreach}} <div class="section-content-info-wrapper"> <div> - {{$addr_text}} <strong>'{{$addr}}'</strong> + {{$addr_text}} <strong>'{{if $addr}}{{$addr}}{{else}}{{$primeurl}}{{/if}}'</strong> </div> {{if $locstr}} <div> diff --git a/view/tpl/admin_plugins.tpl b/view/tpl/admin_plugins.tpl index fd5ae7d5e..adc0db434 100755 --- a/view/tpl/admin_plugins.tpl +++ b/view/tpl/admin_plugins.tpl @@ -41,8 +41,8 @@ {{$form}} </div> <div class="clear"></div> - <div id="chat-rotator-wrapper" class="center-block"> - <div id="chat-rotator"></div> + <div id="chat-rotator" class="spinner-wrapper"> + <div class="spinner s"></div> </div> <div class="clear"></div> <div class="section-content-wrapper-np"> @@ -75,11 +75,11 @@ $("#generic-modal-ok-{{$newRepoModalID}}").addClass('btn-primary'); var repoURL = $('#id_repoURL').val(); var repoName = $('#id_repoName').val(); - $('#chat-rotator').spin('tiny'); + $('#chat-rotator').show(); $.post( "/admin/plugins/addrepo", {repoURL: repoURL, repoName: repoName}, function(response) { - $('#chat-rotator').spin(false); + $('#chat-rotator').hide(); if (response.success) { var modalBody = $('#generic-modal-body-{{$newRepoModalID}}'); modalBody.html('<div>'+response.repo.readme+'</div>'); @@ -187,4 +187,4 @@ } } -</script>
\ No newline at end of file +</script> diff --git a/view/tpl/admin_site.tpl b/view/tpl/admin_site.tpl index e995f82b2..d6ff34f93 100755 --- a/view/tpl/admin_site.tpl +++ b/view/tpl/admin_site.tpl @@ -82,6 +82,7 @@ <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div> <h3>{{$advanced}}</h3> + {{include file="field_input.tpl" field=$imagick_path}} {{include file="field_input.tpl" field=$proxy}} {{include file="field_input.tpl" field=$proxyuser}} {{include file="field_input.tpl" field=$timeout}} diff --git a/view/tpl/app_nav.tpl b/view/tpl/app_nav.tpl new file mode 100644 index 000000000..046cd7237 --- /dev/null +++ b/view/tpl/app_nav.tpl @@ -0,0 +1 @@ +<a class="navbar-app nav-link{{if $app.active}} active{{/if}}" href="{{$app.url}}" title="{{$app.name}}" >{{if $icon}}<i class="fa fa-fw fa-{{$icon}}"></i>{{else}}<img src="{{$app.photo}}" width="16" height="16" />{{/if}}</a> diff --git a/view/tpl/cards.tpl b/view/tpl/cards.tpl new file mode 100644 index 000000000..60e6163ae --- /dev/null +++ b/view/tpl/cards.tpl @@ -0,0 +1,4 @@ +<div id="live-cards"></div> +{{$editor}} +{{$content}} +{{$pager}} diff --git a/view/tpl/cdav_calendar.tpl b/view/tpl/cdav_calendar.tpl index 5d683d751..b0245e853 100644 --- a/view/tpl/cdav_calendar.tpl +++ b/view/tpl/cdav_calendar.tpl @@ -129,11 +129,11 @@ $(document).ready(function() { }, loading: function(isLoading, view) { - $('#events-spinner').spin('tiny'); - $('#events-spinner > i').css('color', 'transparent'); + $('#events-spinner').show(); + $('#today-btn > i').hide(); if(!isLoading) { - $('#events-spinner').spin(false); - $('#events-spinner > i').css('color', ''); + $('#events-spinner').hide(); + $('#today-btn > i').show(); } } }); @@ -292,7 +292,7 @@ function on_more() { </div> <div class="btn-group"> <button class="btn btn-outline-secondary btn-sm" onclick="changeView('prev', false);" title="{{$prev}}"><i class="fa fa-backward"></i></button> - <button id="events-spinner" class="btn btn-outline-secondary btn-sm" onclick="changeView('today', false);" title="{{$today}}"><i class="fa fa-bullseye"></i></button> + <button id="today-btn" class="btn btn-outline-secondary btn-sm" onclick="changeView('today', false);" title="{{$today}}"><div id="events-spinner" class="spinner s"></div><i class="fa fa-bullseye" style="display: none; width: 1rem;"></i></button> <button class="btn btn-outline-secondary btn-sm" onclick="changeView('next', false);" title="{{$next}}"><i class="fa fa-forward"></i></button> </div> <button id="fullscreen-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button> diff --git a/view/tpl/channel_rename.tpl b/view/tpl/channel_rename.tpl new file mode 100755 index 000000000..9948dc647 --- /dev/null +++ b/view/tpl/channel_rename.tpl @@ -0,0 +1,20 @@ +<div class="generic-content-wrapper"> + <div class="section-title-wrapper"> + <h2>{{$title}}</h2> + </div> + <div class="section-content-danger-wrapper" id="rename-channel-desc"> + <strong>{{$desc.0}}</strong><strong>{{$desc.1}}</strong> + </div> + <div class="section-content-tools-wrapper"> + <form action="{{$basedir}}/changeaddr" autocomplete="off" method="post" > + <input type="hidden" name="verify" value="{{$hash}}" /> + <div class="form-group" id="rename-channel-pass-wrapper"> + <label id="rename-channel-pass-label" for="rename-channel-pass">{{$passwd}}</label> + <input class="form-control" type="password" id="rename-channel-pass" autocomplete="off" name="qxz_password" value=" " /> + </div> + {{include file="field_input.tpl" field=$newname}} + <button type="submit" name="submit" class="btn btn-danger">{{$submit}}</button> + </form> + </div> +</div> + diff --git a/view/tpl/chat.tpl b/view/tpl/chat.tpl index 22f3465bf..c189cbd15 100644 --- a/view/tpl/chat.tpl +++ b/view/tpl/chat.tpl @@ -16,6 +16,9 @@ </div> <div id="chatContainer" class="section-content-wrapper"> <div id="chatTopBar"> + <div id="chat-top-spinner" class="spinner-wrapper"> + <div class="spinner m"></div> + </div> <div id="chatLineHolder"></div> </div> <div class="clear"></div> @@ -25,7 +28,7 @@ <div class="form-group"> <textarea id="chatText" name="chat_text" class="form-control"></textarea> </div> - <div id="chat-submit-wrapper"> + <div id="chat-submit-wrapper" class="clearfix"> <div id="chat-submit" class="dropup pull-right"> <button class="btn btn-outline-secondary btn-sm dropdown-toggle" type="button" data-toggle="dropdown"><i class="fa fa-cog"></i></button> <button class="btn btn-primary btn-sm" type="submit" id="chat-submit" name="submit" value="{{$submit}}">{{$submit}}</button> @@ -42,7 +45,7 @@ {{/if}} </div> </div> - <div id="chat-tools" class="btn-toolbar pull-left"> + <div id="chat-tools" class="btn-toolbar"> <div class="btn-group mr-2"> <button id="main-editor-bold" class="btn btn-outline-secondary btn-sm" title="{{$bold}}" onclick="inserteditortag('b', 'chatText'); return false;"> <i class="fa fa-bold jot-icons"></i> @@ -84,11 +87,12 @@ {{/if}} </div> </div> + <div class="btn-group"> + <div id="chat-rotator" class="mt-2 spinner-wrapper"> + <div class="spinner s"></div> + </div> + </div> </div> - <div id="chat-rotator-wrapper" class="pull-left"> - <div id="chat-rotator"></div> - </div> - <div class="clear"></div> </div> </form> </div> @@ -101,7 +105,7 @@ var last_chat = 0; var chat_timer = null; $(document).ready(function() { - $('#chatTopBar').spin('small'); + $('#chat-top-spinner').show(); chat_timer = setTimeout(load_chats,300); $('#chatroom_bookmarks, #vcard').hide(); $('#chatroom_list, #chatroom_members').show(); @@ -134,7 +138,7 @@ function load_chats() { if(data.success && (! stopped)) { update_inroom(data.inroom); update_chats(data.chats); - $('#chatTopBar').spin(false); + $('#chat-top-spinner').hide(); } }); @@ -293,10 +297,10 @@ function toggleChatNotifications() { function chatJotGetLink() { reply = prompt("{{$linkurl}}"); if(reply && reply.length) { - $('#chat-rotator').spin('tiny'); + $('#chat-rotator').show(); $.get('linkinfo?f=&url=' + reply, function(data) { addmailtext(data); - $('#chat-rotator').spin(false); + $('#chat-rotator').hide(); }); } } diff --git a/view/tpl/cloud_actionspanel.tpl b/view/tpl/cloud_actionspanel.tpl index 0ebecce29..baee48da3 100644 --- a/view/tpl/cloud_actionspanel.tpl +++ b/view/tpl/cloud_actionspanel.tpl @@ -26,6 +26,7 @@ <input type="hidden" name="return_url" value="{{$return_url}}" /> <label for="files-upload">{{$upload_header}}</label> <input class="form-group pull-left" id="files-upload" type="file" name="userfile"> + {{**include file="field_checkbox.tpl" field=$notify**}} <div class="pull-right btn-group"> <div class="btn-group"> {{if $lockstate}} diff --git a/view/tpl/cloud_directory.tpl b/view/tpl/cloud_directory.tpl index adc8584c3..e8ae6a590 100644 --- a/view/tpl/cloud_directory.tpl +++ b/view/tpl/cloud_directory.tpl @@ -25,7 +25,7 @@ <td><a href="{{$item.fullPath}}">{{$item.displayName}}</a></td> {{if $item.is_owner}} <td class="cloud-index-tool">{{$item.attachIcon}}</td> - <td id="file-edit-{{$item.attachId}}" class="cloud-index-tool"></td> + <td class="cloud-index-tool"><div id="file-edit-{{$item.attachId}}" class="spinner-wrapper"><div class="spinner s"></div></div></td> <td class="cloud-index-tool"><i class="fakelink fa fa-pencil" onclick="filestorage(event, '{{$nick}}', {{$item.attachId}});"></i></td> <td class="cloud-index-tool"><a href="#" title="{{$delete}}" onclick="dropItem('{{$item.fileStorageUrl}}/{{$item.attachId}}/delete', '#cloud-index-{{$item.attachId}},#cloud-tools-{{$item.attachId}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a></td> diff --git a/view/tpl/comment_item.tpl b/view/tpl/comment_item.tpl index 02b0c527c..62530c1de 100755 --- a/view/tpl/comment_item.tpl +++ b/view/tpl/comment_item.tpl @@ -18,7 +18,7 @@ {{$anon_extras}} </div> {{/if}} - <textarea id="comment-edit-text-{{$id}}" class="comment-edit-text-empty" name="body" onFocus="commentOpenUI(this,{{$id}});" onBlur="commentCloseUI(this,{{$id}});" ondragenter="linkdropper(event);" ondragleave="linkdropexit(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" >{{$comment}}</textarea> + <textarea id="comment-edit-text-{{$id}}" class="comment-edit-text" placeholder="{{$comment}}" name="body" ondragenter="linkdropper(event);" ondragleave="linkdropexit(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" ></textarea> {{if $qcomment}} <select id="qcomment-select-{{$id}}" name="qcomment-{{$id}}" class="qcomment" onchange="qCommentInsert(this,{{$id}});" > <option value=""></option> @@ -47,6 +47,11 @@ </button> </div> <div class="btn-group mr-2"> + {{if $can_upload}} + <button class="btn btn-outline-secondary btn-sm" title="{{$edatt}}" onclick="insertCommentAttach('{{$comment}}',{{$id}}); return false;"> + <i class="fa fa-paperclip comment-icon"></i> + </button> + {{/if}} <button class="btn btn-outline-secondary btn-sm" title="{{$edurl}}" onclick="insertCommentURL('{{$comment}}',{{$id}}); return false;"> <i class="fa fa-link comment-icon"></i> </button> diff --git a/view/tpl/common_friends.tpl b/view/tpl/common_friends.tpl index 489717e78..b99075210 100755 --- a/view/tpl/common_friends.tpl +++ b/view/tpl/common_friends.tpl @@ -1,15 +1,17 @@ -<div class="profile-match-wrapper"> - <div class="profile-match-photo"> - <a href="{{$url}}"> - <img src="{{$photo}}" alt="{{$name}}" width="80" height="80" title="{{$name}} [{{$url}}]" /> - </a> +<div class="generic-content-wrapper"> + <div class="section-title-wrapper"> + <h2>{{$title}}</h2> </div> - <div class="profile-match-break"></div> - <div class="profile-match-name"> - <a href="{{$url}}" title="{{$name}}[{{$tags}}]">{{$name}}</a> + <div class="section-content-wrapper clearfix"> + {{foreach $items as $item}} + <div class="float-left mr-4"> + <a href="{{$item.url}}"> + <img class="contact-block-img" src="{{$item.photo}}" alt="{{$item.name}}" title="{{$item.name}} [{{$item.url}}]" /> + </a> + <div> + {{$item.name}} + </div> + </div> + {{/foreach}} </div> - {{if $note}} - <div class="profile-match-note">{{$note}}</div> - {{/if}} - <div class="profile-match-end"></div> </div> diff --git a/view/tpl/connections.tpl b/view/tpl/connections.tpl index 13261965a..3b152ef5e 100755 --- a/view/tpl/connections.tpl +++ b/view/tpl/connections.tpl @@ -33,4 +33,6 @@ </div> </div> <script>$(document).ready(function() { loadingPage = false;});</script> -<div id="page-spinner"></div> +<div id="page-spinner" class="spinner-wrapper"> + <div class="spinner m"></div> +</div> diff --git a/view/tpl/conv_frame.tpl b/view/tpl/conv_frame.tpl index aa7b55e9b..8aa865076 100755 --- a/view/tpl/conv_frame.tpl +++ b/view/tpl/conv_frame.tpl @@ -1,5 +1,8 @@ <div id="threads-begin"></div> <div id="threads-end"></div> <div id="conversation-end"></div> -<div id="page-spinner"></div> +<div id="page-spinner" class="spinner-wrapper"> + <div class="spinner m"></div> +</div> + diff --git a/view/tpl/conv_item.tpl b/view/tpl/conv_item.tpl index 36cb4cc83..b0e1cb6fb 100755 --- a/view/tpl/conv_item.tpl +++ b/view/tpl/conv_item.tpl @@ -4,7 +4,7 @@ </div> <div id="collapsed-comments-{{$item.id}}" class="collapsed-comments" style="display: none;"> {{/if}} - <div id="thread-wrapper-{{$item.id}}" class="thread-wrapper{{if $item.toplevel}} {{$item.toplevel}} mb-4 generic-content-wrapper h-entry {{else}} u-comment h-cite {{/if}} item_{{$item.submid}}"> + <div id="thread-wrapper-{{$item.id}}" class="thread-wrapper{{if $item.toplevel}} {{$item.toplevel}} generic-content-wrapper h-entry {{else}} u-comment h-cite {{/if}} item_{{$item.submid}}"> <a name="item_{{$item.id}}" ></a> <div class="wall-item-outside-wrapper{{if $item.is_comment}} comment{{/if}}{{if $item.previewing}} preview{{/if}}" id="wall-item-outside-wrapper-{{$item.id}}" > <div class="clearfix wall-item-content-wrapper{{if $item.is_comment}} comment{{/if}}" id="wall-item-content-wrapper-{{$item.id}}"> @@ -39,6 +39,7 @@ </div> {{/if}} <div class="wall-item-author"> + {{if $item.previewing}}<span class="preview-indicator"><i class="fa fa-eye" title="{{$item.preview_lbl}}"></i></span> {{/if}} <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.sparkle}}" id="wall-item-name-{{$item.id}}" >{{$item.name}}</span></a>{{if $item.owner_url}} {{$item.via}} <a href="{{$item.owner_url}}" title="{{$item.olinktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.osparkle}}" id="wall-item-ownername-{{$item.id}}">{{$item.owner_name}}</span></a>{{/if}} </div> <div class="wall-item-ago" id="wall-item-ago-{{$item.id}}"> @@ -85,6 +86,11 @@ {{/if}} <div class="p-2 clearfix wall-item-tools"> <div class="float-right wall-item-tools-right"> + <div class="btn-group"> + <div id="like-rotator-{{$item.id}}" class="spinner-wrapper"> + <div class="spinner s"></div> + </div> + </div> {{if $item.toplevel && $item.emojis && $item.reactions}} <div class="btn-group"> <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-react-{{$item.id}}"> @@ -150,7 +156,7 @@ </button> <div class="dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="wall-item-menu-{{$item.id}}"> {{if $item.share}} - <a class="dropdown-item" href="#" onclick="jotShare({{$item.id}}); return false"><i class="generic-icons-nav fa fa-fw fa-retweet" title="{{$item.share.0}}"></i>{{$item.share.0}}</a> + <a class="dropdown-item" href="#" onclick="jotShare({{$item.id}},{{$item.item_type}}); return false"><i class="generic-icons-nav fa fa-fw fa-retweet" title="{{$item.share.0}}"></i>{{$item.share.0}}</a> {{/if}} {{if $item.plink}} <a class="dropdown-item" href="{{$item.plink.href}}" title="{{$item.plink.title}}" class="u-url"><i class="generic-icons-nav fa fa-fw fa-external-link"></i>{{$item.plink.title}}</a> @@ -194,7 +200,6 @@ </div> </div> </div> - <div id="like-rotator-{{$item.id}}" class="like-rotator"></div> {{if $item.responses || $item.attachments}} <div class="wall-item-tools-left{{if ($item.responses.count > 1) || ($item.responses.count && $item.attachments)}} btn-group{{/if}}"> diff --git a/view/tpl/conv_list.tpl b/view/tpl/conv_list.tpl index e442dd3cc..97fd50d01 100755 --- a/view/tpl/conv_list.tpl +++ b/view/tpl/conv_list.tpl @@ -4,7 +4,7 @@ </div> <div id="collapsed-comments-{{$item.id}}" class="collapsed-comments" style="display: none;"> {{/if}} - <div id="thread-wrapper-{{$item.id}}" class="thread-wrapper{{if $item.toplevel}} {{$item.toplevel}} mb-4 generic-content-wrapper h-entry {{else}} u-comment h-cite {{/if}} item_{{$item.submid}}"> + <div id="thread-wrapper-{{$item.id}}" class="thread-wrapper{{if $item.toplevel}} {{$item.toplevel}} generic-content-wrapper h-entry {{else}} u-comment h-cite {{/if}} item_{{$item.submid}}"> <a name="item_{{$item.id}}" ></a> <div class="wall-item-outside-wrapper{{if $item.is_comment}} comment{{/if}}{{if $item.previewing}} preview{{/if}}" id="wall-item-outside-wrapper-{{$item.id}}" > <div class="clearfix wall-item-content-wrapper{{if $item.is_comment}} comment{{/if}}" id="wall-item-content-wrapper-{{$item.id}}"> @@ -150,7 +150,7 @@ </button> <div class="dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="wall-item-menu-{{$item.id}}"> {{if $item.share}} - <a class="dropdown-item" href="#" onclick="jotShare({{$item.id}}); return false"><i class="generic-icons-nav fa fa-fw fa-retweet" title="{{$item.share.0}}"></i>{{$item.share.0}}</a> + <a class="dropdown-item" href="#" onclick="jotShare({{$item.id}},{{$item.item_type}}); return false"><i class="generic-icons-nav fa fa-fw fa-retweet" title="{{$item.share.0}}"></i>{{$item.share.0}}</a> {{/if}} {{if $item.plink}} <a class="dropdown-item" href="{{$item.plink.href}}" title="{{$item.plink.title}}" class="u-url"><i class="generic-icons-nav fa fa-fw fa-external-link"></i>{{$item.plink.title}}</a> diff --git a/view/tpl/cover_photo_widget.tpl b/view/tpl/cover_photo_widget.tpl index a9c384d2f..7404a740c 100755 --- a/view/tpl/cover_photo_widget.tpl +++ b/view/tpl/cover_photo_widget.tpl @@ -8,7 +8,8 @@ aside_padding_top = parseInt($('aside').css('padding-top')); section_padding_top = parseInt($('section').css('padding-top')); - $(document).on('click', slideUpCover); + $('#cover-photo').on('click', slideUpCover); + $('#cover-photo').on('keyup', slideUpCover); if($('#cover-photo').length && $(window).width() > 755) { if($(window).scrollTop() < $('#cover-photo').height()) { diff --git a/view/tpl/directory_header.tpl b/view/tpl/directory_header.tpl index 71e991f3a..3ee9ee326 100755 --- a/view/tpl/directory_header.tpl +++ b/view/tpl/directory_header.tpl @@ -19,4 +19,6 @@ <div id="page-end"></div> </div> <script>$(document).ready(function() { loadingPage = false;});</script> -<div id="page-spinner"></div> +<div id="page-spinner" class="spinner-wrapper"> + <div class="spinner m"></div> +</div> diff --git a/view/tpl/event_head.tpl b/view/tpl/event_head.tpl index 3b2cb5041..2f440e826 100755 --- a/view/tpl/event_head.tpl +++ b/view/tpl/event_head.tpl @@ -67,11 +67,11 @@ showEvent(calEvent.id); }, loading: function(isLoading, view) { - $('#events-spinner').spin('tiny'); - $('#events-spinner > i').css('color', 'transparent'); + $('#events-spinner').show(); + $('#today-btn > i').hide(); if(!isLoading) { - $('#events-spinner').spin(false); - $('#events-spinner > i').css('color', ''); + $('#events-spinner').hide(); + $('#today-btn > i').show(); $('td.fc-day').dblclick(function() { openMenu('form'); //window.location.href='/events/new?start='+$(this).data('date'); diff --git a/view/tpl/events-js.tpl b/view/tpl/events-js.tpl index 9d32c76be..d3f3414ff 100755 --- a/view/tpl/events-js.tpl +++ b/view/tpl/events-js.tpl @@ -11,7 +11,7 @@ <button class="btn btn-success btn-sm" onclick="openClose('form');">{{$new_event.1}}</button> <div class="btn-group"> <button class="btn btn-outline-secondary btn-sm" onclick="changeView('prev', false);" title="{{$prev}}"><i class="fa fa-backward"></i></button> - <button id="events-spinner" class="btn btn-outline-secondary btn-sm" onclick="changeView('today', false);" title="{{$today}}"><i class="fa fa-bullseye"></i></button> + <button id="today-btn" class="btn btn-outline-secondary btn-sm" onclick="changeView('today', false);" title="{{$today}}"><div id="events-spinner" class="spinner s"></div><i class="fa fa-bullseye" style="display: none; width: 1rem;"></i></button> <button class="btn btn-outline-secondary btn-sm" onclick="changeView('next', false);" title="{{$next}}"><i class="fa fa-forward"></i></button> </div> <button id="fullscreen-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button> diff --git a/view/tpl/events_cal-js.tpl b/view/tpl/events_cal-js.tpl index ba9e16dd6..2c4d961f9 100755 --- a/view/tpl/events_cal-js.tpl +++ b/view/tpl/events_cal-js.tpl @@ -4,7 +4,7 @@ <div class="pull-right"> <div class="btn-group"> <button class="btn btn-outline-secondary btn-sm" onclick="changeView('prev', false);" title="{{$prev}}"><i class="fa fa-backward"></i></button> - <button id="events-spinner" class="btn btn-outline-secondary btn-sm" onclick="changeView('today', false);" title="{{$today}}"><i class="fa fa-bullseye"></i></button> + <button id="today-btn" class="btn btn-outline-secondary btn-sm" onclick="changeView('today', false);" title="{{$today}}"><div id="events-spinner" class="spinner s"></div><i class="fa fa-bullseye" style="display: none; width: 1rem;"></i></button> <button class="btn btn-outline-secondary btn-sm" onclick="changeView('next', false);" title="{{$next}}"><i class="fa fa-forward"></i></button> </div> <button id="fullscreen-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button> diff --git a/view/tpl/hdr.tpl b/view/tpl/hdr.tpl index cccee2229..29137c740 100644 --- a/view/tpl/hdr.tpl +++ b/view/tpl/hdr.tpl @@ -1,3 +1,3 @@ -<div id="nav-notifications-template" rel="template"> +<div id="navbar-notifications-template" rel="template" style="display:none;"> <a class="dropdown-item clearfix dropdown-notification {5}" href="{0}" title="{2} {3}"><img class="menu-img-3" data-src="{1}"><span class="contactname">{2}</span><span class="dropdown-sub-text">{3}<br>{4}</span></a> -</div> +</div>
\ No newline at end of file diff --git a/view/tpl/help.tpl b/view/tpl/help.tpl index 43b061dcc..d36494123 100644 --- a/view/tpl/help.tpl +++ b/view/tpl/help.tpl @@ -1,5 +1,17 @@ <div id="help-content" class="generic-content-wrapper"> - <div class="section-title-wrapper"> + <div class="clearfix section-title-wrapper"> + <div class="pull-right"> + <div class="btn-group"> + <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-language" style="font-size: 1.4em;"></i> + </button> + <div class="dropdown-menu dropdown-menu-right flex-column lang-selector"> + <a class="dropdown-item lang-choice" href="/help">de</a> + <a class="dropdown-item lang-choice" href="/help">en</a> + <a class="dropdown-item lang-choice" href="/help">es</a> + </div> + </div> + </div> <h2>{{$title}}: {{$heading}}</h2> </div> <div class="section-content-wrapper" id="doco-content"> @@ -13,21 +25,6 @@ {{$content}} </div> </div> - <script> - // Generate the table of contents in the side nav menu (see view/tpl/help.tpl) - $(document).ready(function () { - $('#doco-top-toc').toc({content: "#doco-content", headings: "h3,h4,h5,h6"}); - }); - - function docoTocToggle() { - if($('#doco-top-toc').is(':visible')) { - $('#doco-toc-toggle').removeClass('fa-cog').addClass('fa-caret-right'); - } else { - $('#doco-toc-toggle').removeClass('fa-caret-right').addClass('fa-caret-down'); - } - $('#doco-top-toc').toggle(); - - return false; - } + var help_language = '{{$language}}' </script> diff --git a/view/tpl/jot-header.tpl b/view/tpl/jot-header.tpl index d8f296aa4..2f9dd9f15 100755 --- a/view/tpl/jot-header.tpl +++ b/view/tpl/jot-header.tpl @@ -6,10 +6,10 @@ var pretext = '{{$pretext}}'; function initEditor(cb){ if (editor==false){ - $("#profile-jot-text-loading").spin('small').show(); + $("#profile-jot-text-loading").show(); {{$geotag}} if(plaintext == 'none') { - $("#profile-jot-text-loading").spin(false).hide(); + $("#profile-jot-text-loading").hide(); $("#profile-jot-text").css({ 'height': 200 }); {{if $bbco_autocomplete}} $("#profile-jot-text").bbco_autocomplete('{{$bbco_autocomplete}}'); // autocomplete bbcode @@ -80,7 +80,7 @@ function initEditor(cb){ ed.onInit.add(function(ed) { ed.pasteAsPlainText = true; - $("#profile-jot-text-loading").spin(false).hide(); + $("#profile-jot-text-loading").hide(); $(".jothidden").show(); if (typeof cb!="undefined") cb(); }); @@ -106,6 +106,9 @@ function enableOnUser(){ <script src="library/blueimp_upload/js/jquery.fileupload.js"></script> <script> +var activeCommentID = 0; +var activeCommentText = ''; + $(document).ready(function() { /* enable tinymce on focus and click */ $("#profile-jot-text").focus(enableOnUser); @@ -118,7 +121,7 @@ function enableOnUser(){ dropZone: $('#profile-jot-text'), maxChunkSize: 4 * 1024 * 1024, add: function(e,data) { - $('#profile-rotator').spin('tiny'); + $('#profile-rotator').show(); data.submit(); }, done: function(e,data) { @@ -126,7 +129,8 @@ function enableOnUser(){ $('#jot-media').val($('#jot-media').val() + data.result.message); }, stop: function(e,data) { - $('#profile-rotator').spin(false); + preview_post(); + $('#profile-rotator').hide(); }, }); @@ -138,6 +142,34 @@ function enableOnUser(){ DragDropUploadInit(); } + + $('#invisible-comment-upload').fileupload({ + url: 'wall_attach/{{$nickname}}', + dataType: 'json', + maxChunkSize: 4 * 1024 * 1024, + add: function(e,data) { + + var tmpStr = $("#comment-edit-text-" + activeCommentID).val(); + if(tmpStr == activeCommentText) { + tmpStr = ""; + $("#comment-edit-text-" + activeCommentID).addClass("comment-edit-text-full"); + $("#comment-edit-text-" + activeCommentID).removeClass("comment-edit-text-empty"); + openMenu("comment-tools-" + activeCommentID); + $("#comment-edit-text-" + activeCommentID).val(tmpStr); + } + data.submit(); + }, + + done: function(e,data) { + textarea = document.getElementById("comment-edit-text-" + activeCommentID); + textarea.value = textarea.value + data.result.message; + }, + stop: function(e,data) { + $('body').css('cursor', 'auto'); + preview_comment(activeCommentID); + activeCommentID = 0; + }, + }); }); function deleteCheckedItems() { @@ -172,10 +204,11 @@ function enableOnUser(){ reply = prompt("{{$linkurl}}"); if(reply && reply.length) { reply = bin2hex(reply); - $('#profile-rotator').spin('tiny'); + $('#profile-rotator').show(); $.get('{{$baseurl}}/linkinfo?f=&binurl=' + reply, function(data) { addeditortext(data); - $('#profile-rotator').spin(false); + preview_post(); + $('#profile-rotator').hide(); }); } } @@ -214,18 +247,23 @@ function enableOnUser(){ } - function jotShare(id) { - if ($('#jot-popup').length != 0) $('#jot-popup').show(); + function jotShare(id,post_type) { + if(post_type == 6) { + window.location.href = 'rpost?f=&post_id='+id; + } + else { + if ($('#jot-popup').length != 0) $('#jot-popup').show(); - $('#like-rotator-' + id).spin('tiny'); - $.get('{{$baseurl}}/share/' + id, function(data) { - if (!editor) $("#profile-jot-text").val(""); - initEditor(function(){ - addeditortext(data); - $('#like-rotator-' + id).spin(false); - $(window).scrollTop(0); + $('#like-rotator-' + id).show(); + $.get('{{$baseurl}}/share/' + id, function(data) { + if (!editor) $("#profile-jot-text").val(""); + initEditor(function(){ + addeditortext(data); + $('#like-rotator-' + id).hide(); + $(window).scrollTop(0); + }); }); - }); + } } function linkdropper(event) { @@ -274,17 +312,17 @@ function enableOnUser(){ if(reply && reply.length) { reply = bin2hex(reply); - $('#profile-rotator').spin('tiny'); + $('#profile-rotator').show(); $.get('{{$baseurl}}/linkinfo?f=&binurl=' + reply, function(data) { if(commentwin) { $(editwin).val( $(editwin).val() + data ); - $('#profile-rotator').spin(false); + $('#profile-rotator').hide(); } else { if (!editor) $("#profile-jot-text").val(""); initEditor(function(){ addeditortext(data); - $('#profile-rotator').spin(false); + $('#profile-rotator').hide(); }); } }); @@ -421,6 +459,7 @@ function enableOnUser(){ function(ddata) { if (ddata['status']) { addeditortext(ddata['photolink']); + preview_post(); } else { window.console.log("{{$modalerrorlink}}" + ':' + ddata['errormsg']); } diff --git a/view/tpl/jot.tpl b/view/tpl/jot.tpl index cf99ede42..13e7602be 100755 --- a/view/tpl/jot.tpl +++ b/view/tpl/jot.tpl @@ -1,4 +1,5 @@ <input id="invisible-wall-file-upload" type="file" name="files" style="visibility:hidden;position:absolute;top:-50;left:-50;width:0;height:0;" multiple> +<input id="invisible-comment-upload" type="file" name="files" style="visibility:hidden;position:absolute;top:-50;left:-50;width:0;height:0;" multiple> <form id="profile-jot-form" action="{{$action}}" method="post" class="acl-form" data-form_id="profile-jot-form" data-allow_cid='{{$allow_cid}}' data-allow_gid='{{$allow_gid}}' data-deny_cid='{{$deny_cid}}' data-deny_gid='{{$deny_gid}}'> {{$mimeselect}} {{$layoutselect}} @@ -40,7 +41,7 @@ </div> {{/if}} <div id="jot-text-wrap"> - <textarea class="profile-jot-text" id="profile-jot-text" name="body" tabindex="2" placeholder="{{$share}}" >{{$content}}</textarea> + <textarea class="profile-jot-text" id="profile-jot-text" name="body" tabindex="2" placeholder="{{$placeholdtext}}" >{{$content}}</textarea> </div> {{if $attachment}} <div id="jot-attachment-wrap"> @@ -167,9 +168,11 @@ </div> </div> {{/if}} - </div> - <div id="profile-rotator-wrapper" class="float-left"> - <div id="profile-rotator"></div> + <div class="btn-group"> + <div id="profile-rotator" class="mt-2 spinner-wrapper"> + <div class="spinner s"></div> + </div> + </div> </div> <div id="profile-jot-submit-right" class="btn-group float-right"> {{if $preview}} diff --git a/view/tpl/login.tpl b/view/tpl/login.tpl index 3d3faa41c..492149abb 100755 --- a/view/tpl/login.tpl +++ b/view/tpl/login.tpl @@ -11,6 +11,8 @@ {{if $register}}<a href="{{$register.link}}" title="{{$register.title}}" id="register-link" class="pull-right">{{$register.desc}}</a>{{/if}} <a href="lostpass" title="{{$lostpass}}" id="lost-password-link" >{{$lostlink}}</a> </div> + <hr> + <a href="rmagic" class="btn btn-block btn-outline-success rmagic-button">{{$remote_login}}</a> </div> {{foreach $hiddens as $k=>$v}} <input type="hidden" name="{{$k}}" value="{{$v}}" /> diff --git a/view/tpl/main_slider.tpl b/view/tpl/main_slider.tpl index a4e2e1925..f5c573970 100755 --- a/view/tpl/main_slider.tpl +++ b/view/tpl/main_slider.tpl @@ -1,4 +1,9 @@ -<div id="main-slider" class="slider" ><input id="main-range" type="text" name="cminmax" value="{{$val}}" /></div> +<div id="main-slider" class="slider" > + <input id="main-range" type="text" name="cminmax" value="{{$val}}" /> + <div id="profile-jot-text-loading" class="spinner-wrapper"> + <div class="spinner m"></div> + </div> +</div> <script> $(document).ready(function() { var old_cmin = 0; @@ -19,13 +24,14 @@ $(document).ready(function() { var slideTimer = null; function networkRefresh() { + $("#profile-jot-text-loading").show(); if((document.readyState !== "complete") || (slideTimer !== null)) return; if((bParam_cmin == old_cmin) && (bParam_cmax == old_cmax)) return; - setTimeout(function() { $("#profile-jot-text-loading").spin('small'); }, 1000 ); + slideTimer = setTimeout(networkTimerRefresh,2000); } diff --git a/view/tpl/msg-header.tpl b/view/tpl/msg-header.tpl index 0e8fb0389..d71d432fb 100755 --- a/view/tpl/msg-header.tpl +++ b/view/tpl/msg-header.tpl @@ -12,7 +12,7 @@ dropZone: $('#prvmail-text'), maxChunkSize: 4 * 1024 * 1024, add: function(e,data) { - $('#prvmail-rotator').spin('tiny'); + $('#prvmail-rotator').show(); data.submit(); }, done: function(e,data) { @@ -20,7 +20,8 @@ $('#jot-media').val($('#jot-media').val() + data.result.message); }, stop: function(e,data) { - $('#prvmail-rotator').spin(false); + preview_mail(); + $('#prvmail-rotator').hide(); }, }); @@ -33,10 +34,11 @@ function prvmailJotGetLink() { reply = prompt("{{$linkurl}}"); if(reply && reply.length) { - $('#prvmail-rotator').spin('tiny'); + $('#prvmail-rotator').show(); $.get('linkinfo?f=&url=' + reply, function(data) { addmailtext(data); - $('#prvmail-rotator').spin(false); + preview_mail(); + $('#prvmail-rotator').hide(); }); } } @@ -59,10 +61,11 @@ event.target.textContent = reply; event.preventDefault(); if(reply && reply.length) { - $('#prvmail-rotator').spin('tiny'); + $('#prvmail-rotator').show(); $.get('linkinfo?f=&url=' + reply, function(data) { addmailtext(data); - $('#prvmail-rotator').spin(false); + preview_mail(); + $('#prvmail-rotator').hide(); }); } } diff --git a/view/tpl/nav_login.tpl b/view/tpl/nav_login.tpl index b361b1a14..4a94908f0 100644 --- a/view/tpl/nav_login.tpl +++ b/view/tpl/nav_login.tpl @@ -9,7 +9,6 @@ <div class="modal-body"> <div class="form-group"> {{$nav.login}} - {{$nav.remote_login}} </div> </div> </div> diff --git a/view/tpl/navbar_default.tpl b/view/tpl/navbar_default.tpl new file mode 100755 index 000000000..b330993c8 --- /dev/null +++ b/view/tpl/navbar_default.tpl @@ -0,0 +1,207 @@ +{{if $nav.login && !$userinfo}} +<div class="d-xl-none pt-1 pb-1"> + {{if $nav.loginmenu.1.4}} + <a class="btn btn-primary btn-sm text-white" href="#" title="{{$nav.loginmenu.1.3}}" id="{{$nav.loginmenu.1.4}}_collapse" data-toggle="modal" data-target="#nav-login"> + {{$nav.loginmenu.1.1}} + </a> + {{else}} + <a class="btn btn-primary btn-sm text-white" href="login" title="{{$nav.loginmenu.1.3}}"> + {{$nav.loginmenu.1.1}} + </a> + {{/if}} + {{if $nav.register}} + <a class="btn btn-warning btn-sm text-dark" href="{{$nav.register.0}}" title="{{$nav.register.3}}" id="{{$nav.register.4}}" > + {{$nav.register.1}} + </a> + {{/if}} +</div> +{{/if}} +{{if $userinfo}} +<div class="dropdown usermenu"> + <div class="fakelink" data-toggle="dropdown"> + <img id="avatar" src="{{$userinfo.icon}}" alt="{{$userinfo.name}}"> + <i class="fa fa-caret-down"></i> + </div> + {{if $is_owner}} + <div class="dropdown-menu"> + {{foreach $nav.usermenu as $usermenu}} + <a class="dropdown-item{{if $usermenu.2}} active{{/if}}" href="{{$usermenu.0}}" title="{{$usermenu.3}}" role="menuitem" id="{{$usermenu.4}}">{{$usermenu.1}}</a> + {{/foreach}} + {{if $nav.manage}} + <a class="dropdown-item{{if $sel.name == Manage}} active{{/if}}" href="{{$nav.manage.0}}" title="{{$nav.manage.3}}" role="menuitem" id="{{$nav.manage.4}}">{{$nav.manage.1}}</a> + {{/if}} + {{if $nav.channels}} + {{foreach $nav.channels as $chan}} + <a class="dropdown-item" href="manage/{{$chan.channel_id}}" title="{{$chan.channel_name}}" role="menuitem"><i class="fa fa-circle{{if $localuser == $chan.channel_id}} text-success{{else}} invisible{{/if}}"></i> {{$chan.channel_name}}</a> + {{/foreach}} + {{/if}} + {{if $nav.profiles}} + <a class="dropdown-item" href="{{$nav.profiles.0}}" title="{{$nav.profiles.3}}" role="menuitem" id="{{$nav.profiles.4}}">{{$nav.profiles.1}}</a> + {{/if}} + {{if $nav.settings}} + <div class="dropdown-divider"></div> + <a class="dropdown-item{{if $sel.name == Settings}} active{{/if}}" href="{{$nav.settings.0}}" title="{{$nav.settings.3}}" role="menuitem" id="{{$nav.settings.4}}">{{$nav.settings.1}}</a> + {{/if}} + {{if $nav.admin}} + <div class="dropdown-divider"></div> + <a class="dropdown-item{{if $sel.name == Admin}} active{{/if}}" href="{{$nav.admin.0}}" title="{{$nav.admin.3}}" role="menuitem" id="{{$nav.admin.4}}">{{$nav.admin.1}}</a> + {{/if}} + {{if $nav.logout}} + <div class="dropdown-divider"></div> + <a class="dropdown-item" href="{{$nav.logout.0}}" title="{{$nav.logout.3}}" role="menuitem" id="{{$nav.logout.4}}">{{$nav.logout.1}}</a> + {{/if}} + </div> + {{/if}} + {{if ! $is_owner}} + <div class="dropdown-menu" role="menu" aria-labelledby="avatar"> + <a class="dropdown-item" href="{{$nav.rusermenu.0}}" role="menuitem">{{$nav.rusermenu.1}}</a> + <a class="dropdown-item" href="{{$nav.rusermenu.2}}" role="menuitem">{{$nav.rusermenu.3}}</a> + </div> + {{/if}} +</div> +<div class="navbar-nav mr-auto"> + <div><a id="nav-app-link" href="{{$url}}" class="nav-link">{{$sel.name}}</a></div> +</div> +{{/if}} +<div class="navbar-toggler-right"> + {{if $nav.help.6}} + <button id="context-help-btn" class="navbar-toggler border-0" type="button" onclick="contextualHelp(); return false;"> + <i class="fa fa-question-circle"></i> + </button> + {{/if}} + <button id="expand-aside" type="button" class="d-md-none navbar-toggler border-0" data-toggle="offcanvas" data-target="#region_1"> + <i class="fa fa-arrow-circle-right" id="expand-aside-icon"></i> + </button> + {{if $localuser || $nav.pubs}} + <button id="notifications-btn" type="button" class="navbar-toggler border-0 text-white"> + <i id="notifications-btn-icon" class="fa fa-exclamation-circle"></i> + </button> + {{/if}} + <button id="menu-btn" class="navbar-toggler border-0" type="button" data-toggle="collapse" data-target="#navbar-collapse-2"> + <i class="fa fa-bars"></i> + </button> +</div> +<div class="collapse navbar-collapse" id="navbar-collapse-1"> + <ul class="navbar-nav mr-auto"> + {{if $nav.login && !$userinfo}} + <li class="nav-item d-none d-xl-flex"> + {{if $nav.loginmenu.1.4}} + <a class="nav-link" href="#" title="{{$nav.loginmenu.1.3}}" id="{{$nav.loginmenu.1.4}}" data-toggle="modal" data-target="#nav-login"> + {{$nav.loginmenu.1.1}} + </a> + {{else}} + <a class="nav-link" href="login" title="{{$nav.loginmenu.1.3}}"> + {{$nav.loginmenu.1.1}} + </a> + {{/if}} + </li> + {{/if}} + {{if $nav.register}} + <li class="nav-item {{$nav.register.2}} d-none d-xl-flex"> + <a class="nav-link" href="{{$nav.register.0}}" title="{{$nav.register.3}}" id="{{$nav.register.4}}">{{$nav.register.1}}</a> + </li> + {{/if}} + {{if $nav.alogout}} + <li class="nav-item {{$nav.alogout.2}} d-none d-xl-flex"> + <a class="nav-link" href="{{$nav.alogout.0}}" title="{{$nav.alogout.3}}" id="{{$nav.alogout.4}}">{{$nav.alogout.1}}</a> + </li> + {{/if}} + </ul> + + <div id="banner" class="navbar-text">{{$banner}}</div> + + <ul id="nav-right" class="navbar-nav ml-auto"> + <li class="nav-item collapse clearfix" id="nav-search"> + <form class="form-inline" method="get" action="search" role="search"> + <input class="form-control form-control-sm mt-1 mr-2" id="nav-search-text" type="text" value="" placeholder=" {{$help}}" name="search" title="{{$nav.search.3}}" onclick="this.submit();" onblur="closeMenu('nav-search'); openMenu('nav-search-btn');"/> + </form> + <div id="nav-search-spinner" class="spinner-wrapper"> + <div class="spinner s"></div> + </div> + </li> + <li class="nav-item" id="nav-search-btn"> + <a class="nav-link" href="#nav-search" title="{{$nav.search.3}}" onclick="openMenu('nav-search'); closeMenu('nav-search-btn'); $('#nav-search-text').focus(); return false;"><i class="fa fa-fw fa-search"></i></a> + </li> + {{if $nav.help.6}} + <li class="nav-item dropdown {{$sel.help}}"> + <a class="nav-link {{$nav.help.2}}" target="hubzilla-help" href="{{$nav.help.0}}" title="{{$nav.help.3}}" id="{{$nav.help.4}}" onclick="contextualHelp(); return false;"><i class="fa fa-fw fa-question-circle"></i></a> + </li> + {{/if}} + {{if $channel_menu && $channel_apps.0}} + <li class="nav-item dropdown" id="channel-menu"> + <a class="nav-link" href="#" data-toggle="dropdown"><img src="{{$channel_thumb}}" style="height:14px; width:14px;position:relative; top:-2px;" /></a> + <div id="dropdown-menu" class="dropdown-menu dropdown-menu-right"> + {{foreach $channel_apps as $channel_app}} + {{$channel_app}} + {{/foreach}} + </div> + </li> + {{/if}} + {{if $navbar_apps}} + {{foreach $navbar_apps as $navbar_app}} + <li> + {{$navbar_app}} + </li> + {{/foreach}} + {{/if}} + <li class="nav-item dropdown" id="app-menu"> + <a class="nav-link" href="#" data-toggle="dropdown"><i class="fa fa-fw fa-bars"></i></a> + <div id="dropdown-menu" class="dropdown-menu dropdown-menu-right"> + {{if $channel_apps.0 && ! $channel_menu}} + {{foreach $channel_apps as $channel_app}} + {{$channel_app}} + {{/foreach}} + <div class="dropdown-divider"></div> + <div class="dropdown-header sys-apps-toggle" onclick="$('#dropdown-menu').click(function(e) { e.stopPropagation(); }); openClose('sys_apps');"> + {{$sysapps_toggle}} + </div> + <div id="sys_apps" style="display:none;"> + {{/if}} + {{foreach $nav_apps as $nav_app}} + {{$nav_app}} + {{/foreach}} + {{if $channel_apps.0 && ! $channel_menu}} + </div> + {{/if}} + {{if $is_owner}} + <div class="dropdown-divider"></div> + <a class="dropdown-item" href="/apps"><i class="generic-icons-nav fa fa-fw fa-plus-circle"></i>{{$addapps}}</a> + <a class="dropdown-item" href="/apporder"><i class="generic-icons-nav fa fa-fw fa-sort"></i>{{$orderapps}}</a> + {{/if}} + </div> + </li> + </ul> +</div> +<div class="collapse d-xl-none" id="navbar-collapse-2"> + <div class="navbar-nav mr-auto"> + {{if $channel_apps.0}} + {{foreach $channel_apps as $channel_app}} + {{$channel_app|replace:'dropdown-item':'nav-link'}} + {{/foreach}} + <div class="dropdown-header sys-apps-toggle" onclick="openClose('sys-apps-collapsed');"> + {{$sysapps_toggle}} + </div> + <div id="sys-apps-collapsed" style="display:none;"> + {{/if}} + {{foreach $nav_apps as $nav_app}} + {{$nav_app|replace:'dropdown-item':'nav-link'}} + {{/foreach}} + {{if $channel_apps.0}} + </div> + {{/if}} + {{if $is_owner}} + <div class="dropdown-divider"></div> + <a class="nav-link" href="/apps"><i class="generic-icons-nav fa fa-fw fa-plus-circle"></i>{{$addapps}}</a> + <a class="nav-link" href="/apporder"><i class="generic-icons-nav fa fa-fw fa-sort"></i>{{$orderapps}}</a> + {{/if}} + </div> +</div> +{{if $nav.help.6}} +<div id="contextual-help-content" class="contextual-help-content"> + {{$nav.help.5}} + <div class="float-right"> + <a class="btn btn-primary btn-sm" target="hubzilla-help" href="{{$nav.help.0}}" title="{{$nav.help.3}}"><i class="fa fa-question"></i> {{$fulldocs}}</a> + <a class="contextual-help-tool" href="#" onclick="contextualHelp(); return false;"><i class="fa fa-times"></i></a> + </div> +</div> +{{/if}} diff --git a/view/tpl/nav.tpl b/view/tpl/navbar_tucson.tpl index f480ce994..faf8b5b4a 100755 --- a/view/tpl/nav.tpl +++ b/view/tpl/navbar_tucson.tpl @@ -1,8 +1,14 @@ {{if $nav.login && !$userinfo}} -<div class="d-md-none pt-1 pb-1"> +<div class="d-xl-none pt-1 pb-1"> + {{if $nav.loginmenu.1.4}} <a class="btn btn-primary btn-sm text-white" href="#" title="{{$nav.loginmenu.1.3}}" id="{{$nav.loginmenu.1.4}}_collapse" data-toggle="modal" data-target="#nav-login"> {{$nav.loginmenu.1.1}} </a> + {{else}} + <a class="btn btn-primary btn-sm text-white" href="login" title="{{$nav.loginmenu.1.3}}"> + {{$nav.loginmenu.1.1}} + </a> + {{/if}} {{if $nav.register}} <a class="btn btn-warning btn-sm text-dark" href="{{$nav.register.0}}" title="{{$nav.register.3}}" id="{{$nav.register.4}}" > {{$nav.register.1}} @@ -10,6 +16,9 @@ {{/if}} </div> {{/if}} + + + {{if $userinfo}} <div class="dropdown usermenu"> <div class="fakelink" data-toggle="dropdown"> @@ -36,16 +45,13 @@ <div class="dropdown-divider"></div> <a class="dropdown-item{{if $sel.active == Settings}} active{{/if}}" href="{{$nav.settings.0}}" title="{{$nav.settings.3}}" role="menuitem" id="{{$nav.settings.4}}">{{$nav.settings.1}}</a> {{/if}} - {{if $nav.admin}} - <div class="dropdown-divider"></div> - <a class="dropdown-item{{if $sel.active == Admin}} active{{/if}}" href="{{$nav.admin.0}}" title="{{$nav.admin.3}}" role="menuitem" id="{{$nav.admin.4}}">{{$nav.admin.1}}</a> - {{/if}} {{if $nav.logout}} <div class="dropdown-divider"></div> <a class="dropdown-item" href="{{$nav.logout.0}}" title="{{$nav.logout.3}}" role="menuitem" id="{{$nav.logout.4}}">{{$nav.logout.1}}</a> {{/if}} </div> {{/if}} + {{if ! $is_owner}} <div class="dropdown-menu" role="menu" aria-labelledby="avatar"> <a class="dropdown-item" href="{{$nav.rusermenu.0}}" role="menuitem">{{$nav.rusermenu.1}}</a> @@ -54,33 +60,57 @@ {{/if}} </div> {{/if}} + + + +{{if $navbar_apps}} +<ul class="navbar-nav mr-auto d-none d-xl-flex"> +{{foreach $navbar_apps as $navbar_app}} +<li> +{{$navbar_app}} +</li> +{{/foreach}} +</ul> +{{/if}} + + <div class="navbar-toggler-right"> + {{if $nav.help.6}} <button id="context-help-btn" class="navbar-toggler border-0" type="button" onclick="contextualHelp(); return false;"> <i class="fa fa-question-circle"></i> </button> {{/if}} + <button id="expand-aside" type="button" class="navbar-toggler border-0" data-toggle="offcanvas" data-target="#region_1"> <i class="fa fa-arrow-circle-right" id="expand-aside-icon"></i> </button> - {{if $localuser}} + + {{if $localuser || $nav.pubs}} <button id="notifications-btn" type="button" class="navbar-toggler border-0 text-white" data-toggle="collapse" data-target="#navbar-collapse-1"> - <i class="fa fa-exclamation-circle"></i> + <i id="notifications-btn-icon" class="fa fa-exclamation"></i> </button> {{/if}} + <button id="menu-btn" class="navbar-toggler border-0" type="button" data-toggle="collapse" data-target="#navbar-collapse-2"> <i class="fa fa-bars"></i> </button> </div> + + + + + <div class="collapse navbar-collapse" id="navbar-collapse-1"> + <ul class="navbar-nav mr-auto"> {{if $nav.network}} - <li class="nav-item dropdown net-button" style="display: none;"> - <a class="nav-link" href="#" title="{{$nav.network.3}}" id="{{$nav.network.4}}" data-toggle="dropdown" rel="#nav-network-menu"> + <li class="nav-item dropdown network-button" style="display: none;"> + <a class="nav-link" href="#" title="{{$nav.network.3}}" id="{{$nav.network.4}}" data-toggle="dropdown" rel="#navbar-network-menu"> <i class="fa fa-fw fa-th"></i> - <span class="badge badge-pill badge-secondary net-update"></span> + <span class="badge badge-pill badge-secondary network-update"></span> </a> - <div id="nav-network-menu" class="dropdown-menu" rel="network"> + <div id="navbar-network-menu" class="dropdown-menu" rel="network"> <a class="dropdown-item" id="nav-network-see-all" href="{{$nav.network.all.0}}">{{$nav.network.all.1}}</a> <a class="dropdown-item" id="nav-network-mark-all" href="#" onclick="markRead('network'); return false;">{{$nav.network.mark.1}}</a> {{$emptynotifications}} @@ -89,11 +119,11 @@ {{/if}} {{if $nav.home}} <li class="nav-item dropdown home-button" style="display: none;"> - <a class="nav-link" href="#" title="{{$nav.home.3}}" id="{{$nav.home.4}}" data-toggle="dropdown" rel="#nav-home-menu"> + <a class="nav-link" href="#" title="{{$nav.home.3}}" id="{{$nav.home.4}}" data-toggle="dropdown" rel="#navbar-home-menu"> <i class="fa fa-fw fa-home"></i> <span class="badge badge-pill badge-danger home-update"></span> </a> - <div id="nav-home-menu" class="dropdown-menu" rel="home"> + <div id="navbar-home-menu" class="dropdown-menu" rel="home"> <a class="dropdown-item" id="nav-home-see-all" href="{{$nav.home.all.0}}">{{$nav.home.all.1}}</a> <a class="dropdown-item" id="nav-home-mark-all" href="#" onclick="markRead('home'); return false;">{{$nav.home.mark.1}}</a> {{$emptynotifications}} @@ -102,11 +132,11 @@ {{/if}} {{if $nav.messages}} <li class="nav-item dropdown mail-button" style="display: none;"> - <a class="nav-link" href="#" title="{{$nav.messages.3}}" id="{{$nav.messages.4}}" data-toggle="dropdown" rel="#nav-messages-menu"> + <a class="nav-link" href="#" title="{{$nav.messages.3}}" id="{{$nav.messages.4}}" data-toggle="dropdown" rel="#navbar-mail-menu"> <i class="fa fa-fw fa-envelope"></i> <span class="badge badge-pill badge-danger mail-update"></span> </a> - <div id="nav-messages-menu" class="dropdown-menu" rel="messages"> + <div id="navbar-mail-menu" class="dropdown-menu" rel="messages"> <a class="dropdown-item" id="nav-messages-see-all" href="{{$nav.messages.all.0}}">{{$nav.messages.all.1}}</a> <a class="dropdown-item" id="nav-messages-mark-all" href="#" onclick="markRead('messages'); return false;">{{$nav.messages.mark.1}}</a> {{$emptynotifications}} @@ -115,11 +145,11 @@ {{/if}} {{if $nav.all_events}} <li class="nav-item dropdown all_events-button" style="display: none;"> - <a class="nav-link" href="#" title="{{$nav.all_events.3}}" id="{{$nav.all_events.4}}" data-toggle="dropdown" rel="#nav-all_events-menu"> + <a class="nav-link" href="#" title="{{$nav.all_events.3}}" id="{{$nav.all_events.4}}" data-toggle="dropdown" rel="#navbar-all_events-menu"> <i class="fa fa-fw fa-calendar"></i> <span class="badge badge-pill badge-secondary all_events-update"></span> </a> - <div id="nav-all_events-menu" class="dropdown-menu" rel="all_events"> + <div id="navbar-all_events-menu" class="dropdown-menu" rel="all_events"> <a class="dropdown-item" id="nav-all_events-see-all" href="{{$nav.all_events.all.0}}">{{$nav.all_events.all.1}}</a> <a class="dropdown-item" id="nav-all_events-mark-all" href="#" onclick="markRead('all_events'); return false;">{{$nav.all_events.mark.1}}</a> {{$emptynotifications}} @@ -127,12 +157,12 @@ </li> {{/if}} {{if $nav.intros}} - <li class="nav-item dropdown intro-button" style="display: none;"> - <a class="nav-link" href="{{$nav.intros.0}}" title="{{$nav.intros.3}}" id="{{$nav.intros.4}}" data-toggle="dropdown" rel="#nav-intros-menu"> + <li class="nav-item dropdown intros-button" style="display: none;"> + <a class="nav-link" href="#" title="{{$nav.intros.3}}" id="{{$nav.intros.4}}" data-toggle="dropdown" rel="#navbar-intros-menu"> <i class="fa fa-fw fa-users"></i> - <span class="badge badge-pill badge-danger intro-update"></span> + <span class="badge badge-pill badge-danger intros-update"></span> </a> - <div id="nav-intros-menu" class="dropdown-menu" rel="intros"> + <div id="navbar-intros-menu" class="dropdown-menu" rel="intros"> <a class="dropdown-item" id="nav-intros-see-all" href="{{$nav.intros.all.0}}">{{$nav.intros.all.1}}</a> {{$emptynotifications}} </div> @@ -140,42 +170,58 @@ {{/if}} {{if $nav.notifications}} <li class="nav-item dropdown notify-button" style="display: none;"> - <a class="nav-link" href="{{$nav.notifications.0}}" title="{{$nav.notifications.1}}" id="{{$nav.notifications.4}}" data-toggle="dropdown" rel="#nav-notify-menu"> + <a class="nav-link" href="#" title="{{$nav.notifications.1}}" id="{{$nav.notifications.4}}" data-toggle="dropdown" rel="#navbar-notify-menu"> <i class="fa fa-fw fa-exclamation"></i> <span class="badge badge-pill badge-danger notify-update"></span> </a> - <div id="nav-notify-menu" class="dropdown-menu" rel="notify"> + <div id="navbar-notify-menu" class="dropdown-menu" rel="notify"> <a class="dropdown-item" id="nav-notify-see-all" href="{{$nav.notifications.all.0}}">{{$nav.notifications.all.1}}</a> <a class="dropdown-item" id="nav-notify-mark-all" href="#" onclick="markRead('notify'); return false;">{{$nav.notifications.mark.1}}</a> {{$emptynotifications}} </div> </li> {{/if}} + {{if $nav.login && !$userinfo}} - <li class="nav-item"> - <a class="nav-link" href="#" title="{{$nav.loginmenu.1.3}}" id="{{$nav.loginmenu.1.4}}" data-toggle="modal" data-target="#nav-login">{{$nav.loginmenu.1.1}}</a> + <li class="nav-item d-none d-xl-flex"> + {{if $nav.loginmenu.1.4}} + <a class="nav-link" href="#" title="{{$nav.loginmenu.1.3}}" id="{{$nav.loginmenu.1.4}}" data-toggle="modal" data-target="#nav-login"> + {{$nav.loginmenu.1.1}} + </a> + {{else}} + <a class="nav-link" href="login" title="{{$nav.loginmenu.1.3}}"> + {{$nav.loginmenu.1.1}} + </a> + {{/if}} </li> {{/if}} {{if $nav.register}} - <li class="nav-item {{$nav.register.2}} d-none d-md-flex"> + <li class="nav-item {{$nav.register.2}} d-none d-xl-flex"> <a class="nav-link" href="{{$nav.register.0}}" title="{{$nav.register.3}}" id="{{$nav.register.4}}">{{$nav.register.1}}</a> </li> {{/if}} {{if $nav.alogout}} - <li class="nav-item {{$nav.alogout.2}} d-none d-md-flex"> + <li class="nav-item {{$nav.alogout.2}} d-none d-xl-flex"> <a class="nav-link" href="{{$nav.alogout.0}}" title="{{$nav.alogout.3}}" id="{{$nav.alogout.4}}">{{$nav.alogout.1}}</a> </li> {{/if}} + </ul> - <div id="banner" class="navbar-text d-none d-md-flex">{{$banner}}</div> - <ul id="nav-right" class="navbar-nav ml-auto d-none d-md-flex"> + + + <div id="banner" class="navbar-text d-none d-xl-flex">{{$banner}}</div> + + + <ul id="nav-right" class="navbar-nav ml-auto d-none d-xl-flex"> <li class="nav-item collapse clearfix" id="nav-search"> <form class="form-inline" method="get" action="search" role="search"> <input class="form-control form-control-sm mt-1 mr-2" id="nav-search-text" type="text" value="" placeholder=" {{$help}}" name="search" title="{{$nav.search.3}}" onclick="this.submit();" onblur="closeMenu('nav-search'); openMenu('nav-search-btn');"/> </form> - <div id="nav-search-spinner"></div> + <div id="nav-search-spinner" class="spinner-wrapper"> + <div class="spinner s"></div> + </div> </li> <li class="nav-item" id="nav-search-btn"> <a class="nav-link" href="#nav-search" title="{{$nav.search.3}}" onclick="openMenu('nav-search'); closeMenu('nav-search-btn'); $('#nav-search-text').focus(); return false;"><i class="fa fa-fw fa-search"></i></a> @@ -185,24 +231,22 @@ <a class="nav-link {{$nav.help.2}}" target="hubzilla-help" href="{{$nav.help.0}}" title="{{$nav.help.3}}" id="{{$nav.help.4}}" onclick="contextualHelp(); return false;"><i class="fa fa-fw fa-question-circle"></i></a> </li> {{/if}} - <li class="nav-item dropdown" id="app-menu"> - <a class="nav-link" href="#" data-toggle="dropdown"><i class="fa fa-fw fa-bars"></i></a> + {{if $channel_apps.0}} + <li class="nav-item dropdown" id="channel-menu"> + <a class="nav-link" href="#" data-toggle="dropdown"><img src="{{$channel_thumb}}" style="height:14px; width:14px;position:relative; top:-2px;" /></a> <div id="dropdown-menu" class="dropdown-menu dropdown-menu-right"> - {{if $channel_apps.0}} {{foreach $channel_apps as $channel_app}} {{$channel_app}} {{/foreach}} - <div class="dropdown-header sys-apps-toggle" onclick="$('#dropdown-menu').click(function(e) { e.stopPropagation(); }); openClose('sys_apps');"> - {{$sysapps_toggle}} - </div> - <div id="sys_apps" style="display:none;"> - {{/if}} + </div> + </li> + {{/if}} + <li class="nav-item dropdown" id="app-menu"> + <a class="nav-link" href="#" data-toggle="dropdown"><i class="fa fa-fw fa-bars"></i></a> + <div id="dropdown-menu" class="dropdown-menu dropdown-menu-right"> {{foreach $nav_apps as $nav_app}} {{$nav_app}} {{/foreach}} - {{if $channel_apps.0}} - </div> - {{/if}} {{if $is_owner}} <div class="dropdown-divider"></div> <a class="dropdown-item" href="/apps"><i class="generic-icons-nav fa fa-fw fa-plus-circle"></i>{{$addapps}}</a> @@ -212,7 +256,9 @@ </li> </ul> </div> -<div class="collapse d-md-none" id="navbar-collapse-2"> + + +<div class="collapse d-xl-none" id="navbar-collapse-2"> <div class="navbar-nav mr-auto"> {{if $channel_apps.0}} {{foreach $channel_apps as $channel_app}} diff --git a/view/tpl/new_channel.tpl b/view/tpl/new_channel.tpl index cc1983ac4..c4837064f 100755 --- a/view/tpl/new_channel.tpl +++ b/view/tpl/new_channel.tpl @@ -19,10 +19,10 @@ {{/if}} {{include file="field_input.tpl" field=$name}} - <div id="name-spinner"></div> + <div id="name-spinner" class="spinner-wrapper"><div class="spinner m"></div></div> {{include file="field_input.tpl" field=$nickname}} - <div id="nick-spinner"></div> + <div id="nick-spinner" class="spinner-wrapper"><div class="spinner m"></div></div> <button class="btn btn-primary" type="submit" name="submit" id="newchannel-submit-button" value="{{$submit}}">{{$submit}}</button> <div id="newchannel-submit-end" class="clear"></div> diff --git a/view/tpl/notifications_widget.tpl b/view/tpl/notifications_widget.tpl new file mode 100644 index 000000000..6865879ad --- /dev/null +++ b/view/tpl/notifications_widget.tpl @@ -0,0 +1,62 @@ +<style> + .notification-content { + max-height: 70vh; + overflow: auto; + } + + .notification-content.collapsing { + overflow: hidden; + } + + .fs { + position: fixed; + top: 0px; + left: 0px; + padding: 4.5rem .5rem 1rem .5rem; + background-color: white; + width: 100%; + max-width: 100%; + height: 100%; + z-index: 1029; + overflow: auto; + } + + #notifications { + margin-bottom: 1rem; + } +</style> + +{{if $notifications}} +<div id="notifications_wrapper"> + <div id="notifications" class="navbar-nav" data-children=".nav-item"> + <div id="nav-notifications-template" rel="template"> + <a class="list-group-item clearfix notification {5}" href="{0}" title="{2} {3}"> + <img class="menu-img-3" data-src="{1}"> + <span class="contactname">{2}</span> + <span class="dropdown-sub-text">{3}<br>{4}</span> + </a> + </div> + {{foreach $notifications as $notification}} + <div class="collapse {{$notification.type}}-button"> + <a class="list-group-item" href="#nav-{{$notification.type}}-menu" title="{{$notification.title}}" data-toggle="collapse" data-parent="#notifications" rel="#nav-{{$notification.type}}-menu"> + <i class="fa fa-fw fa-{{$notification.icon}}"></i> {{$notification.label}} + <span class="float-right badge badge-{{$notification.severity}} {{$notification.type}}-update"></span> + </a> + <div id="nav-{{$notification.type}}-menu" class="collapse notification-content" rel="{{$notification.type}}"> + {{if $notification.viewall}} + <a class="list-group-item text-dark" id="nav-{{$notification.type}}-see-all" href="{{$notification.viewall.url}}"> + <i class="fa fa-fw fa-external-link"></i> {{$notification.viewall.label}} + </a> + {{/if}} + {{if $notification.markall}} + <a class="list-group-item text-dark" id="nav-{{$notification.type}}-mark-all" href="{{$notification.markall.url}}" onclick="markRead('{{$notification.type}}'); return false;"> + <i class="fa fa-fw fa-check"></i> {{$notification.markall.label}} + </a> + {{/if}} + {{$loading}} + </div> + </div> + {{/foreach}} + </div> +</div> +{{/if}} diff --git a/view/tpl/notify.tpl b/view/tpl/notify.tpl index ae6e160b1..b5bccc8a4 100755 --- a/view/tpl/notify.tpl +++ b/view/tpl/notify.tpl @@ -1,3 +1,10 @@ -<div class="mb-2 notif-item"> - <a href="{{$item_link}}"><img src="{{$item_image}}" class="menu-img-1">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a> +<div class="mb-4 notif-item"> + {{if ! $item_seen}} + <span class="float-right badge badge-pill badge-success text-uppercase">{{$new}}</span> + {{/if}} + <a href="{{$item_link}}"> + <img src="{{$item_image}}" class="menu-img-3"> + <span class="{{if $item_seen}}text-muted{{/if}}">{{$item_text}}</span><br> + <span class="dropdown-sub-text">{{$item_when}}</span> + </a> </div> diff --git a/view/tpl/pdledit.tpl b/view/tpl/pdledit.tpl index cef93d324..2ea89b6c1 100644 --- a/view/tpl/pdledit.tpl +++ b/view/tpl/pdledit.tpl @@ -5,6 +5,9 @@ <br /> <a href="help/comanche" target="hubzilla-help">{{$help}}</a> +<br> +<br> +<a href="pdledit">{{$another}}</a> <br /> <br /> diff --git a/view/tpl/photo_album.tpl b/view/tpl/photo_album.tpl index 89b169f58..58b843bf0 100755 --- a/view/tpl/photo_album.tpl +++ b/view/tpl/photo_album.tpl @@ -19,7 +19,7 @@ {{$upload_form}} {{$album_edit.1}} <div class="section-content-wrapper-np"> - <div id="photo-album-contents-{{$album_id}}"> + <div id="photo-album-contents-{{$album_id}}" style="display: none"> {{foreach $photos as $photo}} {{include file="photo_top.tpl"}} {{/foreach}} @@ -28,8 +28,12 @@ </div> </div> <div class="photos-end"></div> +<div id="page-spinner" class="spinner-wrapper"> + <div class="spinner m"></div> +</div> <script> +$(document).ready(function() { loadingPage = false; justifyPhotos('photo-album-contents-{{$album_id}}'); +}); </script> -<div id="page-spinner"></div> diff --git a/view/tpl/photo_album_portfolio.tpl b/view/tpl/photo_album_portfolio.tpl index 7aadbc7e0..1635e0ae1 100755 --- a/view/tpl/photo_album_portfolio.tpl +++ b/view/tpl/photo_album_portfolio.tpl @@ -1,3 +1,39 @@ +{{if isset($mode) && $mode == 'orbit'}} +<div class="row"> + <div class="orbit small-12 medium-9 large-9 columns" id="photo-album-contents-{{$album_id}}" role="region" aria-label="portfolioOrbit-{{$album_id}}" data-orbit data-options="animInFromLeft:fade-in; animInFromRight:fade-in; animOutToLeft:fade-out; animOutToRight:fade-out;"> + + <ul class="orbit-container"> + <button class="orbit-previous"><span class="show-for-sr">Previous Slide</span>◀︎</button> + <button class="orbit-next"><span class="show-for-sr">Next Slide</span>▶︎</button> + {{foreach $photos as $photo}} + {{include file="photo_portfolio_orbit.tpl"}} + {{/foreach}} + </ul> + <nav class="orbit-bullets"> + <button class="is-active" data-slide="0"><span class="show-for-sr">First slide details.</span><span class="show-for-sr">Current Slide</span></button> + <button data-slide="1"><span class="show-for-sr">Second slide details.</span></button> + <button data-slide="2"><span class="show-for-sr">Third slide details.</span></button> + <button data-slide="3"><span class="show-for-sr">Fourth slide details.</span></button> + </nav> + <div id="page-end"></div> + </div> +<div class="photos-end"></div> +<script>$(document).ready(function() { loadingPage = false; justifyPhotos('photo-album-contents-{{$album_id}}'); });</script> +<div id="page-spinner"></div> +</div> +{{elseif isset($mode) && $mode =='card'}} +<div class="row"> + <div class="small-12 medium-9 large-9 columns" id="photo-album-contents-{{$album_id}}"> + {{foreach $photos as $photo}} + {{include file="photo_portfolio_card.tpl"}} + {{/foreach}} + <div id="page-end"></div> + </div> +<div class="photos-end"></div> +<script>$(document).ready(function() { loadingPage = false; justifyPhotos('photo-album-contents-{{$album_id}}'); });</script> +<div id="page-spinner"></div> +</div> +{{else}} <div class="row column"> <div id="photo-album-contents-{{$album_id}}"> {{foreach $photos as $photo}} @@ -8,4 +44,6 @@ <div class="photos-end"></div> <script>$(document).ready(function() { loadingPage = false; justifyPhotos('photo-album-contents-{{$album_id}}'); });</script> <div id="page-spinner"></div> -</div>
\ No newline at end of file +</div> +{{/if}} + diff --git a/view/tpl/photo_portfolio_card.tpl b/view/tpl/photo_portfolio_card.tpl new file mode 100644 index 000000000..5fddd3d37 --- /dev/null +++ b/view/tpl/photo_portfolio_card.tpl @@ -0,0 +1,6 @@ +<div class="card" style="width: 300px;box-shadow: 0px 10px 6px -6px rgba(119,119,119,0.6);border-style: solid;border-width: 1px;border=color: rgba(230,230,230,0.6);margin:10px 5px 10px 5px;"> + <img src="{{$photo.src}}" alt="{{if $photo.album.name}}{{$photo.album.name}}{{elseif $photo.desc}}{{$photo.desc}}{{elseif $photo.alt}}{{$photo.alt}}{{else}}{{$photo.unknown}}{{/if}}" title="{{$photo.desc}}" id="photo-top-photo-{{$photo.resource_id}}"> + <div class="card-divider"> + <h4>{{$photo.desc}}</h4> + </div> +</div> diff --git a/view/tpl/photo_portfolio_orbit.tpl b/view/tpl/photo_portfolio_orbit.tpl new file mode 100644 index 000000000..b2883265c --- /dev/null +++ b/view/tpl/photo_portfolio_orbit.tpl @@ -0,0 +1,5 @@ + + <li class="orbit-slide"> + <img class="orbit-image" src="{{$photo.src}}" alt="{{if $photo.album.name}}{{$photo.album.name}}{{elseif $photo.desc}}{{$photo.desc}}{{elseif $photo.alt}}{{$photo.alt}}{{else}}{{$photo.unknown}}{{/if}}" title="{{$photo.desc}}" id="photo-top-photo-{{$photo.resource_id}}o"> + <figcaption class="orbit-caption">{{$photo.desc}}</figcaption> + </li> diff --git a/view/tpl/photos_recent.tpl b/view/tpl/photos_recent.tpl index c6a9067c1..a9574aade 100755 --- a/view/tpl/photos_recent.tpl +++ b/view/tpl/photos_recent.tpl @@ -10,7 +10,7 @@ </div> {{$upload_form}} <div class="section-content-wrapper-np"> - <div id="photo-album-contents-{{$album_id}}"> + <div id="photo-album-contents-{{$album_id}}" style="display: none"> {{foreach $photos as $photo}} {{include file="photo_top.tpl"}} {{/foreach}} @@ -19,8 +19,12 @@ </div> </div> <div class="photos-end"></div> +<div id="page-spinner" class="spinner-wrapper"> + <div class="spinner m"></div> +</div> <script> +$(document).ready(function() { loadingPage = false; justifyPhotos('photo-album-contents-{{$album_id}}'); +}); </script> -<div id="page-spinner"></div> diff --git a/view/tpl/profile_tabs.tpl b/view/tpl/profile_tabs.tpl index 49b74bb8f..72e98ae82 100644 --- a/view/tpl/profile_tabs.tpl +++ b/view/tpl/profile_tabs.tpl @@ -1,5 +1,4 @@ -<div class="dropdown-header"><img src="{{$thumb}}" class="menu-img-1">{{$name}}:</div> +<div class="dropdown-header"><img src="{{$thumb}}" class="menu-img-1">{{$name}}</div> {{foreach $tabs as $tab}} <a class="dropdown-item{{if $tab.sel}} {{$tab.sel}}{{/if}}" href="{{$tab.url}}"{{if $tab.title}} title="{{$tab.title}}"{{/if}}><i class="fa fa-fw fa-{{$tab.icon}} generic-icons-nav"></i>{{$tab.label}}</a> {{/foreach}} -<div class="dropdown-divider"></div> diff --git a/view/tpl/profile_vcard.tpl b/view/tpl/profile_vcard.tpl index f51f0719c..0f30e5816 100755 --- a/view/tpl/profile_vcard.tpl +++ b/view/tpl/profile_vcard.tpl @@ -7,17 +7,15 @@ {{/if}} {{if ! $zcard}} {{if $editmenu.multi}} - <div class="dropdown"> - <a class="profile-edit-side-link dropdown-toggle" data-toggle="dropdown" href="#" ><i class="fa fa-pencil" title="{{$editmenu.edit.1}}"></i></a> - <ul class="dropdown-menu" role="menu"> - {{foreach $editmenu.menu.entries as $e}} - <li> - <a href="profiles/{{$e.id}}"><img class="dropdown-menu-img-xs" src='{{$e.photo}}'>{{$e.profile_name}}</a> - </li> - {{/foreach}} - <li><a href="profile_photo" >{{$editmenu.menu.chg_photo}}</a></li> - {{if $editmenu.menu.cr_new}}<li><a href="profiles/new" id="profile-listing-new-link">{{$editmenu.menu.cr_new}}</a></li>{{/if}} - </ul> + <div class="dropdown float-right"> + <a class="dropdown-toggle" data-toggle="dropdown" href="#" ><i class="fa fa-pencil" title="{{$editmenu.edit.1}}"></i></a> + <div class="dropdown-menu dropdown-menu-right" role="menu"> + {{foreach $editmenu.menu.entries as $e}} + <a href="profiles/{{$e.id}}" class="dropdown-item"><img class="menu-img-1" src='{{$e.photo}}'>{{$e.profile_name}}</a> + {{/foreach}} + <a href="profile_photo" class="dropdown-item">{{$editmenu.menu.chg_photo}}</a> + {{if $editmenu.menu.cr_new}}<a href="profiles/new" id="profile-listing-new-link" class="dropdown-item">{{$editmenu.menu.cr_new}}</a>{{/if}} + </div> </div> {{elseif $editmenu}} <a class="profile-edit-side-link" href="{{$editmenu.edit.0}}" ><i class="fa fa-pencil" title="{{$editmenu.edit.1}}"></i></a> diff --git a/view/tpl/prv_message.tpl b/view/tpl/prv_message.tpl index af6315c7e..59472f7d4 100755 --- a/view/tpl/prv_message.tpl +++ b/view/tpl/prv_message.tpl @@ -5,7 +5,7 @@ </div> <div class="section-content-wrapper"> {{/if}} - <div id="prvmail-wrapper" > + <div id="prvmail-wrapper"> <input id="invisible-wall-file-upload" type="file" name="files" style="visibility:hidden;position:absolute;top:-50;left:-50;width:0;height:0;" multiple> <form id="prvmail-form" action="mail" method="post" > <input type="hidden" id="inp-prvmail-expires" name="expires" value="{{$defexpire}}" /> @@ -31,12 +31,12 @@ <label for="prvmail-text">{{$yourmessage}}</label> <textarea class="form-control" id="prvmail-text" name="body"{{if $new}} style="height: 10em;"{{/if}}>{{$text}}</textarea> </div> - <div id="prvmail-submit-wrapper" class="form-group"> + <div id="prvmail-submit-wrapper" class="form-group clearfix"> <div id="prvmail-submit" class="float-right btn-group"> <button class="btn btn-outline-secondary btn-sm" id="prvmail-preview" title="{{$preview}}" onclick="preview_mail(); return false;"><i class="fa fa-eye"></i></button> <button class="btn btn-primary btn-sm" type="submit" id="prvmail-submit" name="submit" value="{{$submit}}">{{$submit}}</button> </div> - <div id="prvmail-tools" class="btn-toolbar float-left"> + <div id="prvmail-tools" class="btn-toolbar"> <div class="btn-group mr-2"> <button id="main-editor-bold" class="btn btn-outline-secondary btn-sm" title="{{$bold}}" onclick="inserteditortag('b', 'prvmail-text'); return false;"> <i class="fa fa-bold jot-icons"></i> @@ -63,7 +63,7 @@ </button> </div> {{if $feature_expire || $feature_encrypt}} - <div class="btn-group d-none d-lg-flex mr-2"> + <div class="btn-group d-none d-lg-flex"> {{if $feature_expire}} <button id="prvmail-expire-wrapper" class="btn btn-outline-secondary btn-sm" onclick="prvmailGetExpiry();return false;" > <i id="prvmail-expires" class="fa fa-eraser jot-icons" title="{{$expires}}" ></i> @@ -90,11 +90,12 @@ {{/if}} </div> </div> + <div class="btn-group"> + <div id="prvmail-rotator" class="m-2 spinner-wrapper"> + <div class="spinner s"></div> + </div> + </div> </div> - <div id="prvmail-rotator-wrapper" class="float-left"> - <div id="prvmail-rotator"></div> - </div> - <div class="clear"></div> </div> <div id="mail-preview-content" style="display: none;"></div> </form> diff --git a/view/tpl/register.tpl b/view/tpl/register.tpl index c84934626..493dba4c8 100755 --- a/view/tpl/register.tpl +++ b/view/tpl/register.tpl @@ -39,10 +39,10 @@ {{/if}} {{include file="field_input.tpl" field=$name}} - <div id="name-spinner"></div> + <div id="name-spinner" class="spinner-wrapper"><div class="spinner m"></div></div> {{include file="field_input.tpl" field=$nickname}} - <div id="nick-spinner"></div> + <div id="nick-spinner" class="spinner-wrapper"><div class="spinner m"></div></div> {{/if}} {{if $enable_tos}} diff --git a/view/tpl/remote_friends_common.tpl b/view/tpl/remote_friends_common.tpl index d6d2fd211..9e149b574 100755 --- a/view/tpl/remote_friends_common.tpl +++ b/view/tpl/remote_friends_common.tpl @@ -1,21 +1,16 @@ -<div id="remote-friends-in-common" class="bigwidget"> - <div id="rfic-desc">{{$desc}} {{if $linkmore}}<a href="{{$base}}/common/{{$uid}}">{{$more}}</a>{{/if}}</div> +<div class="widget"> + <h3>{{$desc}}</h3> + {{if $linkmore}} + <a class="allcontact-link" href="{{$base}}/common/{{$uid}}">{{$more}}</a> + {{/if}} {{if $items}} - {{foreach $items as $item}} - <div class="profile-match-wrapper"> - <div class="profile-match-photo"> - <a href="{{$base}}/chanview?f=&url={{$item.xchan_url}}"> - <img src="{{$item.xchan_photo_m}}" width="80" height="80" alt="{{$item.xchan_name}}" title="{{$item.xchan_name}}" /> - </a> - </div> - <div class="profile-match-break"></div> - <div class="profile-match-name"> - <a href="{{$base}}/chanview?f=&url={{$item.xchan_url}}" title="{{$item.xchan_name}}">{{$item.xchan_name}}</a> + <div class="contact-block-content"> + {{foreach $items as $item}} + <div class="contact-block-div"> + <a class="contact-block-link mpfriend" href="{{$base}}/chanview?f=&url={{$item.xchan_url}}"><img class="contact-block-img mpfriend" src="{{$item.xchan_photo_s}}"alt="{{$item.xchan_name}}" title="{{$item.xchan_name}} [{{$item.xchan_addr}}]" /></a> </div> - <div class="profile-match-end"></div> + {{/foreach}} </div> - {{/foreach}} {{/if}} - <div id="rfic-end" class="clear"></div> -</div> +<div> diff --git a/view/tpl/search_item.tpl b/view/tpl/search_item.tpl index aaafe9797..0a8f12d4f 100755 --- a/view/tpl/search_item.tpl +++ b/view/tpl/search_item.tpl @@ -1,4 +1,4 @@ -<div id="thread-wrapper-{{$item.id}}" class="thread-wrapper{{if $item.toplevel}} {{$item.toplevel}} mb-4 clearfix generic-content-wrapper{{/if}}"> +<div id="thread-wrapper-{{$item.id}}" class="thread-wrapper{{if $item.toplevel}} {{$item.toplevel}} clearfix generic-content-wrapper{{/if}}"> <a name="{{$item.id}}" ></a> <div class="clearfix wall-item-outside-wrapper {{$item.indent}}{{$item.previewing}}{{if $item.owner_url}} wallwall{{/if}}" id="wall-item-outside-wrapper-{{$item.id}}" > <div class="wall-item-content-wrapper {{$item.indent}}" id="wall-item-content-wrapper-{{$item.id}}"> @@ -32,6 +32,7 @@ </div> {{/if}} <div class="wall-item-author"> + {{if $item.previewing}}<span class="preview-indicator"><i class="fa fa-eye" title="{{$item.preview_lbl}}"></i></span> {{/if}} <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.sparkle}}" id="wall-item-name-{{$item.id}}" >{{$item.name}}</span></a>{{if $item.owner_url}} {{$item.via}} <a href="{{$item.owner_url}}" title="{{$item.olinktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.osparkle}}" id="wall-item-ownername-{{$item.id}}">{{$item.owner_name}}</span></a>{{/if}} </div> <div class="wall-item-ago" id="wall-item-ago-{{$item.id}}"> diff --git a/view/tpl/settings.tpl b/view/tpl/settings.tpl index 6673e5815..704d89bdd 100755 --- a/view/tpl/settings.tpl +++ b/view/tpl/settings.tpl @@ -46,7 +46,6 @@ <div class="section-content-tools-wrapper"> {{include file="field_select_grouped.tpl" field=$role}} <div id="advanced-perm" style="display:{{if $permissions_set}}none{{else}}block{{/if}};"> - <div class="form-group"> <button type="button" class="btn btn-outline-secondary" data-toggle="modal" data-target="#apsModal">{{$lbl_p2macro}}</button> </div> @@ -54,8 +53,8 @@ <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> - <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> <h4 class="modal-title">{{$lbl_p2macro}}</h4> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> </div> <div class="modal-body"> {{foreach $permiss_arr as $permit}} @@ -137,6 +136,10 @@ {{include file="field_intcheckbox.tpl" field=$vnotify8}} {{include file="field_intcheckbox.tpl" field=$vnotify9}} {{include file="field_intcheckbox.tpl" field=$vnotify11}} + {{include file="field_intcheckbox.tpl" field=$vnotify12}} + {{if $vnotify13}} + {{include file="field_intcheckbox.tpl" field=$vnotify13}} + {{/if}} {{include file="field_intcheckbox.tpl" field=$always_show_in_notices}} {{include file="field_input.tpl" field=$evdays}} </div> diff --git a/view/tpl/sharedwithme.tpl b/view/tpl/sharedwithme.tpl index 68bdd6faa..8474ccd52 100644 --- a/view/tpl/sharedwithme.tpl +++ b/view/tpl/sharedwithme.tpl @@ -15,7 +15,7 @@ {{foreach $items as $item}} <tr id="cloud-index-{{$item.id}}"> <td><i class="fa {{$item.objfiletypeclass}}" title="{{$item.objfiletype}}"></i></td> - <td><a href="{{$item.objurl}}">{{$item.objfilename}}</a>{{if $item.unseen}} <span class="label label-success">{{$label_new}}</span>{{/if}}</td> + <td><a href="{{$item.objurl}}">{{$item.objfilename}}</a>{{if $item.unseen}} <span class="badge badge-pill badge-success">{{$label_new}}</span>{{/if}}</td> <td class="cloud-index-tool"><a href="#" title="{{$drop}}" onclick="dropItem('/sharedwithme/{{$item.id}}/drop', '#cloud-index-{{$item.id}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a></td> <td class="d-none d-md-table-cell">{{$item.objfilesize}}</td> <td class="d-none d-md-table-cell">{{$item.objedited}}</td> diff --git a/view/tpl/threaded_conversation.tpl b/view/tpl/threaded_conversation.tpl index ea5c3c281..5bc7d8386 100755 --- a/view/tpl/threaded_conversation.tpl +++ b/view/tpl/threaded_conversation.tpl @@ -1,8 +1,9 @@ +<div id="threads-begin"></div> {{if $photo_item}} {{$photo_item}} {{/if}} {{foreach $threads as $thread_item}} {{include file="{{$thread_item.template}}" item=$thread_item}} {{/foreach}} - +<div id="threads-end"></div> <div id="conversation-end"></div> diff --git a/view/tpl/viewcontact_template.tpl b/view/tpl/viewcontact_template.tpl index 2b7144450..005fe17ce 100755 --- a/view/tpl/viewcontact_template.tpl +++ b/view/tpl/viewcontact_template.tpl @@ -10,4 +10,6 @@ </div> </div> <script>$(document).ready(function() { loadingPage = false;});</script> -<div id="page-spinner"></div> +<div id="page-spinner" class="spinner-wrapper"> + <div class="spinner m"></div> +</div> diff --git a/view/tpl/wiki.tpl b/view/tpl/wiki.tpl index 7cd3708b8..22480be5b 100644 --- a/view/tpl/wiki.tpl +++ b/view/tpl/wiki.tpl @@ -1,6 +1,7 @@ -<div class="generic-content-wrapper" {{if $hideEditor}}style="display: none;"{{/if}}> +<div class="generic-content-wrapper"> <div class="section-title-wrapper"> <div class="pull-right"> + <span class="text-muted wiki-typename">[{{$typename}}] </span> {{if $showPageControls}} <div id="page-tools" class="btn-group" style="display: none;"> <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown"> @@ -52,18 +53,6 @@ <textarea id="editor">{{$content}}</textarea> </div> {{/if}} - {{if $showPageControls}} - <div> - <div id="id_{{$commitMsg.0}}_wrapper" class="field input"> - <div class="input-group"> - <input class="form-control form-control-sm" name="{{$commitMsg.0}}" id="id_{{$commitMsg.0}}" type="text" value="{{$commitMsg.2}}"{{if $commitMsg.5}} {{$commitMsg.5}}{{/if}}> - <div class="input-group-btn"> - <button id="save-page" type="button" class="btn btn-primary disabled">Save</button> - </div> - </div> - </div> - </div> - {{/if}} </div> <div id="preview-pane" class="tab-pane active"> <div id="wiki-preview"> @@ -73,6 +62,16 @@ <div id="page-history-pane" class="tab-pane"> <div id="page-history-list"></div> </div> + {{if $showPageControls}} + <div id="id_{{$commitMsg.0}}_wrapper" class="field input" style="display: none"> + <div class="input-group"> + <input class="form-control form-control-sm" name="{{$commitMsg.0}}" id="id_{{$commitMsg.0}}" type="text" value="{{$commitMsg.2}}"{{if $commitMsg.5}} {{$commitMsg.5}}{{/if}}> + <div class="input-group-btn"> + <button id="save-page" type="button" class="btn btn-primary disabled">Save</button> + </div> + </div> + </div> + {{/if}} </div> </div> </div> @@ -105,6 +104,7 @@ window.wiki_page_name = '{{$page}}'; window.wiki_page_content = '{{$content|escape:'javascript'}}'; window.wiki_page_commit = '{{$commit}}'; + window.saved = true; $("#generic-modal-ok-{{$wikiModalID}}").removeClass('btn-primary'); $("#generic-modal-ok-{{$wikiModalID}}").addClass('btn-danger'); @@ -173,43 +173,54 @@ adjustInlineEditorHeight(); } }, 500); // Return the focus to the editor allowing immediate text entry - $('#page-tools').show(); + $('#page-tools, #id_{{$commitMsg.0}}_wrapper').show(); }); $('#wiki-get-preview').click(function (ev) { + if(window.saved) { + $('#page-tools, #id_{{$commitMsg.0}}_wrapper').hide(); + } + else { + $('#page-tools').hide(); + } $.post("wiki/{{$channel_address}}/preview", { {{if !$mimeType || $mimeType == 'text/markdown'}} content: editor.getValue(), {{else}} content: editor.val(), {{/if}} - resource_id: window.wiki_resource_id + resource_id: window.wiki_resource_id, + mimetype: '{{$mimeType}}' }, function (data) { - if (data.success) { - $('#wiki-preview').html(data.html); - {{if !$mimeType || $mimeType == 'text/markdown'}} - $("#wiki-toc").toc({content: "#wiki-preview", headings: "h1,h2,h3,h4"}); - {{/if}} - $('#page-tools').hide(); - } else { - window.console.log('Error previewing page.'); - } + if (data.success) { + $('#wiki-preview').html(data.html); + {{if !$mimeType || $mimeType == 'text/markdown'}} + $("#wiki-toc").toc({content: "#wiki-preview", headings: "h1,h2,h3,h4"}); + {{/if}} + } else { + window.console.log('Error previewing page.'); + } }, 'json'); ev.preventDefault(); }); $('#wiki-get-history').click(function (ev) { + if(window.saved) { + $('#page-tools, #id_{{$commitMsg.0}}_wrapper').hide(); + } + else { + $('#page-tools').hide(); + } $.post("wiki/{{$channel_address}}/history/page", {name: window.wiki_page_name, resource_id: window.wiki_resource_id}, function (data) { if (data.success) { $('#page-history-list').html(data.historyHTML); - $('#page-tools').hide(); } else { window.console.log('Error getting page history.'); } - }, 'json'); - ev.preventDefault(); - }); + }, 'json'); + ev.preventDefault(); + }); function wiki_refresh_page_list() { if (window.wiki_resource_id === '') { @@ -252,6 +263,7 @@ }, function (data) { if (data.success) { + window.saved = true; window.console.log('Page saved successfully.'); window.wiki_page_content = currentContent; $('#id_commitMsg').val(''); // Clear the commit message box @@ -444,6 +456,7 @@ {{if !$mimeType || $mimeType == 'text/markdown'}} $("#wiki-toc").toc({content: "#wiki-preview", headings: "h1,h2,h3,h4"}); window.editor.on("input", function() { + window.saved = false; if(window.editor.getSession().getUndoManager().isClean()) { $('#save-page').addClass('disabled'); } else { @@ -452,10 +465,13 @@ }); {{else}} window.editor.on("input", function() { + window.saved = false; $('#save-page').removeClass('disabled'); }); + {{if $mimeType == 'text/bbcode'}} window.editor.bbco_autocomplete('bbcode'); {{/if}} + {{/if}} }); $(window).resize(function () { diff --git a/view/tpl/wiki_page_list.tpl b/view/tpl/wiki_page_list.tpl index 6d09fcd5d..d75f22f64 100644 --- a/view/tpl/wiki_page_list.tpl +++ b/view/tpl/wiki_page_list.tpl @@ -7,25 +7,35 @@ {{foreach $pages as $page}} <li class="nav-item nav-item-hack" id="{{$page.link_id}}"> {{if $page.resource_id && $candel}} - <i class="nav-link widget-nav-pills-icons fa fa-trash-o drop-icons" onclick="wiki_delete_page('{{$page.title}}', '{{$page.url}}', '{{$page.resource_id}}', '{{$page.link_id}}')"></i> + <i class="nav-link widget-nav-pills-icons fa fa-trash-o drop-icons" onclick="wiki_delete_page('{{$page.title}}', '{{$page.title}}', '{{$page.resource_id}}', '{{$page.link_id}}')"></i> {{/if}} <a class="nav-link" href="/wiki/{{$channel_address}}/{{$wikiname}}/{{$page.url}}">{{$page.title}}</a> </li> {{/foreach}} {{/if}} {{if $canadd}} - <li class="nav-item"><a class="nav-link" href="#" onclick="wiki_show_new_page_form(); return false;"><i class="fa fa-plus-circle"></i> {{$addnew}}</a></li> + <li class="nav-item"><a class="nav-link" href="#" onclick="wiki_show_new_page_form(); return false;"><i class="fa fa-plus-circle"></i> {{$addnew}}</a></li> + {{/if}} + {{if $canadd}} + <div id="new-page-form-wrapper" class="clearfix sub-menu" style="display:none;"> + <form id="new-page-form" action="wiki/{{$channel_address}}/create/page" method="post" > + <input type="hidden" name="resource_id" value="{{$resource_id}}"> + {{include file="field_input.tpl" field=$pageName}} + {{if $typelock}} + <input id="id_mimetype" type="hidden" name="mimetype" value="{{$lockedtype}}"> + {{else}} + <div id="wiki_page_options" style="display: none"> + {{$mimetype}} + </div> + <div class="float-right fakelink" onClick="openClose('wiki_page_options')"> + {{$options}} + </div> + {{/if}} + <button id="new-page-submit" class="btn btn-primary" type="submit" name="submit" >{{$submit}}</button> + </form> + </div> {{/if}} </ul> - {{if $canadd}} - <div id="new-page-form-wrapper" class="sub-menu" style="display:none;"> - <form id="new-page-form" action="wiki/{{$channel_address}}/create/page" method="post" > - <input type="hidden" name="resource_id" value="{{$resource_id}}"> - {{include file="field_input.tpl" field=$pageName}} - <button id="new-page-submit" class="btn btn-primary" type="submit" name="submit" >Submit</button> - </form> - </div> - {{/if}} {{if ! $refresh}} </div> {{/if}} @@ -33,7 +43,7 @@ {{if $canadd}} <script> $('#new-page-submit').click(function (ev) { - $.post("wiki/{{$channel_address}}/create/page", {pageName: $('#id_pageName').val(), resource_id: window.wiki_resource_id}, + $.post("wiki/{{$channel_address}}/create/page", {pageName: $('#id_pageName').val(), resource_id: window.wiki_resource_id, mimetype: $('#id_mimetype').val() }, function(data) { if(data.success) { window.location = data.url; diff --git a/view/tpl/wikilist.tpl b/view/tpl/wikilist.tpl index 2deec76c0..801cb17fd 100644 --- a/view/tpl/wikilist.tpl +++ b/view/tpl/wikilist.tpl @@ -10,6 +10,7 @@ <form id="new-wiki-form" action="wiki/{{$channel}}/create/wiki" method="post" class="acl-form" data-form_id="new-wiki-form" data-allow_cid='{{$allow_cid}}' data-allow_gid='{{$allow_gid}}' data-deny_cid='{{$deny_cid}}' data-deny_gid='{{$deny_gid}}'> {{include file="field_input.tpl" field=$wikiName}} {{include file="field_select.tpl" field=$mimeType}} + {{include file="field_checkbox.tpl" field=$typelock}} {{include file="field_checkbox.tpl" field=$notify}} <div> <div class="btn-group pull-right"> @@ -20,7 +21,6 @@ </div> </div> </form> - {{$acl}} <div class="clear"></div> </div> {{/if}} @@ -29,8 +29,11 @@ <tr> <th width="96%">{{$name}}</th> <th width="1%">{{$type}}</th> - <th width="1%" class="wikis-index-tool"></th> - <!-- th width="1%" class="wikis-index-tool"></th --> + <th width="1%"></th> + {{if $owner}} + <th width="1%"></th> + {{/if}} + <th width="1%"></th> {{if $owner}} <th width="1%"></th> {{/if}} @@ -38,22 +41,42 @@ {{foreach $wikis as $wiki}} <tr class="wikis-index-row"> <td><a href="/wiki/{{$channel}}/{{$wiki.urlName}}/Home" title="{{$view}}"{{if $wiki.active}} class="active"{{/if}}>{{$wiki.title}}</a></td> - <td>{{$wiki.mimeType}}</td> - <td class="wiki-index-tool dropdown"> - {{if $wiki.lock}} - <i class="fa fa-lock lockview" data-toggle="dropdown" onclick="lockview('item',{{$wiki.id}});"></i></button> + <td>{{if $wiki.typelock}}{{$wiki.mimeType}}{{else}}{{$unlocked}}{{/if}}</td> + {{if $owner}} + <td><i class="fa fa-pencil" onclick="openCloseTR('wikis-index-edit-{{$wiki.id}}')"></i></td> + {{/if}} + <td class="dropdown"> + {{if $wiki.lockstate == 'lock'}} + <i class="fa fa-lock lockview" data-toggle="dropdown" onclick="lockview('item',{{$wiki.id}});"></i> <ul id="panel-{{$wiki.id}}" class="lockview-panel dropdown-menu dropdown-menu-right"></ul> {{/if}} </td> - <!-- td class="wiki-index-tool"><i class="fa fa-download fakelink" onclick="wiki_download_wiki('{{$wiki.resource_id}}'); return false;"></i></td --> + <td><i class="fa fa-download" onclick="wiki_download_wiki('{{$wiki.resource_id}}'); return false;"></i></td> {{if $owner}} <td><i class="fa fa-trash-o drop-icons" onclick="wiki_delete_wiki('{{$wiki.title}}', '{{$wiki.resource_id}}'); return false;"></i></td> {{/if}} </tr> + {{if $owner}} + <tr id="wikis-index-edit-{{$wiki.id}}" style="display:none"> + <td colspan="6"> + <form id="edit-wiki-form-{{$wiki.id}}" method="post" action="wiki/{{$channel}}/update/wiki" class="acl-form" data-form_id="edit-wiki-form-{{$wiki.id}}" data-allow_cid='{{$wiki.json_allow_cid}}' data-allow_gid='{{$wiki.json_allow_gid}}' data-deny_cid='{{$wiki.json_deny_cid}}' data-deny_gid='{{$wiki.json_deny_gid}}'> + <input type="hidden" name="origRawName" value="{{$wiki.title}}"> + {{include file="field_input.tpl" field=['updateRawName', $edit_wiki_name, $wiki.title]}} + <div class="btn-group float-right"> + <button class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" type="button"> + <i class="jot-perms-icon fa fa-{{$wiki.lockstate}}"></i> + </button> + <button class="btn btn-primary btn-sm" type="submit" value="edit">Submit</button> + </div> + </form> + </td> + </tr> + {{/if}} {{/foreach}} </table> </div> </div> +{{$acl}} <script> {{if $owner}} function wiki_delete_wiki(wikiHtmlName, resource_id) { |