From fae78b947ffd31aa6592bc2108272531fdbc293d Mon Sep 17 00:00:00 2001 From: redmatrix Date: Wed, 11 May 2016 20:16:57 -0700 Subject: [PATCH 01/29] push point release --- CHANGELOG | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ boot.php | 2 +- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index d708278b6..cf8386317 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,52 @@ +Hubzilla 1.6 + Cleanup and standardise the interfaces to the "jot" editor + Router re-written to support calling class object methods as controllers + All existing modules (160+) re-written as object classes + Plugin hook interface adapted to call static class methods + Context help improved dramatically with content for the most accessed pages. + Reverted a compatibility change to support GNU-social events. We copied their feed format and their feed format is wrong (XML namespace collisions). + Provide a querystring attribute to CSS/JS resources to avoid caching issues when our code changes (which is often). + Fix javascript detection and allow either positive or negative detection. + Refactor the plugin hook registration procedure, provide 'unregister all' ability. + Fix RSD (Real Simple Discovery) which has been broken for some time. + Update smarty library to 3.1.29 + Update jquery.textcomplete to 1.3.4 + Update font-awesome to 4.6.1 + Update SabreDAV to 3.0 (PHP version requirements prevent us from pushing it further at this time) + Help text added to cmdline utilities config and pconfig + Reworking of the database logging facility to avoid the rare but troublesome recursion when the log facility needed to query the DB internally to obtain config parameters. + Implement singleton delivery (emulate nomadic identity to singleton networks and services) + Fix empty album name in photo activities when photo is stored in top level folder. + Allow engineering units to be used in service class data size restrictions (400M, 1G, etc.) + Lots of work on bbcode auto-completion + Admin interface provided to manage external resource repositories + Oembed security reworked. Now all sources are filtered by default unless blocked. + Remove the date-string version and use only STD_VERSION + Add categories and categorisation filtering and the ability to edit all apps (including system apps) for a given channel + Ensure the ability to translate names of all system apps (except those provided in addons) + Provide ability to add categories to content from channel sources + Lots of work on the presentation of the ACL widget to enhance usability and intuitiveness + Allow somebody to follow a channel from a pasted redress containing a Unicode lookalike of the @ sign. + Add conditional syntax to Comanche (if/then/else) + Convert Comanche to an object class + Removed IE6 compatibility code + Explicitly close DB on shutdown/exit instead of allowing it to close naturally + Allowed delayed publish of webpages + Show current repository versions of master and dev on admin page and warn if your installation has fallen behind master + Provide some extra security checks to import data and files to prevent mischief + Block CalDAV/CardDAV namespace reserved words from being used as a channel nickname/redress since Sabre is somewhat inflexible in this regard + Plugins: + Diaspora + markdown translator work needed to eradicate the Diaspora Comment Virus. + upgrade all inbound paths with the most recent protocol changes (several of these) + convert 'diaspora_meta' (Diaspora Comment Virus) to iconfig and eradicate from sites with Diaspora disabled + implement social relay and allow following tags + upgrade statistics.json to NodeInfo. Currently hubzilla sites are tagged as 'redmatrix' because the NodeInfo schema lacks extensibility and project names are used to designate protocol compatibility rather than protocol names. + Std-embeds + New addon to allow a handful of corporate providers to run unfiltered embed code (youtube, vimeo, soundcloud) + Various: + upgrade font-awesome icons and adapt a few addons to Objects and the new hook interface and new controller interface + Hubzilla 1.4 [This list may appear brief, but encompasses a huge amount of re-writing and re-factoring of the internal code structure to gain long-term performance and stability and provide a standard diff --git a/boot.php b/boot.php index 36fd1f68a..b76e95c4f 100755 --- a/boot.php +++ b/boot.php @@ -46,7 +46,7 @@ require_once('include/account.php'); define ( 'PLATFORM_NAME', 'hubzilla' ); -define ( 'STD_VERSION', '1.4.4' ); +define ( 'STD_VERSION', '1.6' ); define ( 'ZOT_REVISION', 1 ); define ( 'DB_UPDATE_VERSION', 1168 ); From 70d413ab0412506755bab4878995ab6e99d8e029 Mon Sep 17 00:00:00 2001 From: Andrew Manning Date: Thu, 12 May 2016 06:49:24 -0400 Subject: [PATCH 02/29] Create store/git/sys/extend/addon directory and link if it does not exist in all plugin repo GUI POST actions --- Zotlabs/Module/Admin.php | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/Zotlabs/Module/Admin.php b/Zotlabs/Module/Admin.php index e77cf0fc7..9b54a4081 100644 --- a/Zotlabs/Module/Admin.php +++ b/Zotlabs/Module/Admin.php @@ -1733,6 +1733,19 @@ class Admin extends \Zotlabs\Web\Controller { } else { json_return_and_die(array('message' => 'No repo name provided.', 'success' => false)); } + $extendDir = __DIR__ . '/../../store/git/sys/extend'; + $addonDir = $extendDir . '/addon'; + if (!file_exists($extendDir)) { + if (!mkdir($extendDir, 0770, true)) { + logger('Error creating extend folder: ' . $extendDir); + json_return_and_die(array('message' => 'Error creating extend folder: ' . $extendDir, 'success' => false)); + } else { + if (!symlink(__DIR__ . '/../../extend/addon', $addonDir)) { + logger('Error creating symlink to addon folder: ' . $addonDir); + json_return_and_die(array('message' => 'Error creating symlink to addon folder: ' . $addonDir, 'success' => false)); + } + } + } $repoDir = __DIR__ . '/../../store/git/sys/extend/addon/' . $repoName; if (!is_dir($repoDir)) { logger('Repo directory does not exist: ' . $repoDir); @@ -1758,6 +1771,19 @@ class Admin extends \Zotlabs\Web\Controller { } else { json_return_and_die(array('message' => 'No repo name provided.', 'success' => false)); } + $extendDir = __DIR__ . '/../../store/git/sys/extend'; + $addonDir = $extendDir . '/addon'; + if (!file_exists($extendDir)) { + if (!mkdir($extendDir, 0770, true)) { + logger('Error creating extend folder: ' . $extendDir); + json_return_and_die(array('message' => 'Error creating extend folder: ' . $extendDir, 'success' => false)); + } else { + if (!symlink(__DIR__ . '/../../extend/addon', $addonDir)) { + logger('Error creating symlink to addon folder: ' . $addonDir); + json_return_and_die(array('message' => 'Error creating symlink to addon folder: ' . $addonDir, 'success' => false)); + } + } + } $repoDir = __DIR__ . '/../../store/git/sys/extend/addon/' . $repoName; if (!is_dir($repoDir)) { logger('Repo directory does not exist: ' . $repoDir); From bc9f88f3f92b797965d265dc2233ea01d6b506f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Jim=C3=A9nez=20Friaza?= Date: Thu, 12 May 2016 19:56:05 +0200 Subject: [PATCH 03/29] Updated contextual help in Spanish --- doc/context/es/admin/logs/help.html | 7 ---- doc/context/es/admin/queue/help.html | 7 ---- doc/context/es/admin/security/help.html | 7 ---- doc/context/es/channel/help.html | 7 ---- doc/context/es/chat/help.html | 7 ---- doc/context/es/cloud/help.html | 7 ---- doc/context/es/connections/help.html | 33 ++++++++++++++----- .../es/connections/ifpending/help.html | 7 ---- doc/context/es/events/help.html | 7 ---- doc/context/es/mail/help.html | 7 ---- doc/context/es/network/help.html | 7 ---- doc/context/es/photos/help.html | 7 ---- doc/context/es/profile/help.html | 7 ---- 13 files changed, 25 insertions(+), 92 deletions(-) diff --git a/doc/context/es/admin/logs/help.html b/doc/context/es/admin/logs/help.html index 2324492bf..4a7452d90 100644 --- a/doc/context/es/admin/logs/help.html +++ b/doc/context/es/admin/logs/help.html @@ -1,8 +1,3 @@ - - - - -
General
Esta página le @@ -32,5 +27,3 @@ especialmente en los hubs con más que unos pocos miembros.
- - diff --git a/doc/context/es/admin/queue/help.html b/doc/context/es/admin/queue/help.html index a4085c5c6..6543ddc08 100644 --- a/doc/context/es/admin/queue/help.html +++ b/doc/context/es/admin/queue/help.html @@ -1,8 +1,3 @@ - - - - -
General
Las estadísticas @@ -13,5 +8,3 @@ que la entrega se ha intentado, sin éxito.
- - diff --git a/doc/context/es/admin/security/help.html b/doc/context/es/admin/security/help.html index 8817636ed..e2a7ee9e7 100644 --- a/doc/context/es/admin/security/help.html +++ b/doc/context/es/admin/security/help.html @@ -1,8 +1,3 @@ - - - - -
General
Esta página contiene @@ -13,5 +8,3 @@ class="">realice en estos ajustes, debe pulsar el botón Enviar.
- - diff --git a/doc/context/es/channel/help.html b/doc/context/es/channel/help.html index 3d925241d..dad69d9de 100644 --- a/doc/context/es/channel/help.html +++ b/doc/context/es/channel/help.html @@ -1,8 +1,3 @@ - - - - -
General
Esta es @@ -31,5 +26,3 @@ enlaza con los ficheros de cualquier tipo compartidos por el canal.
- - diff --git a/doc/context/es/chat/help.html b/doc/context/es/chat/help.html index 805f7b87a..a88fbede4 100644 --- a/doc/context/es/chat/help.html +++ b/doc/context/es/chat/help.html @@ -1,8 +1,3 @@ - - - - -
General
Creación y uso de @@ -26,5 +21,3 @@ el panel lateral, en "Miembros del chat".
- - diff --git a/doc/context/es/cloud/help.html b/doc/context/es/cloud/help.html index 474918e81..f05c33f47 100644 --- a/doc/context/es/cloud/help.html +++ b/doc/context/es/cloud/help.html @@ -1,8 +1,3 @@ - - - - -
General
Esta página muestra @@ -26,5 +21,3 @@ enlaza con las galerías de fotos. La pestaña "Ficheros" enlaza con los ficheros de cualquier tipo compartidos por el canal.
- - diff --git a/doc/context/es/connections/help.html b/doc/context/es/connections/help.html index 0f95fde63..d49f6f8fd 100644 --- a/doc/context/es/connections/help.html +++ b/doc/context/es/connections/help.html @@ -1,8 +1,25 @@ -
-
General
-
This page displays a list of all this channel's connections. The list can be sorted and filtered using the menu button beside the search button.
-
Connection Details
-
Each list entry shows the details of a specific connection. A translucent avatar image indicates an archived connection.
-
Connection Status
-
A connection can be in different states:
  • Archived
  • Ignored
  • Blocked
  • Hidden
-
\ No newline at end of file +
+
General
+
Esta página muestra + una lista de todas las conexiones + de este canal. La + lista se puede ordenar y filtrar usando + el botón de menú al lado del botón de búsqueda.
+
Detalles de la conexión
+
Cada entrada + de la lista muestra los detalles de una + conexión específica. Una + imagen de avatar translúcida indica + una conexión archivada.
+
Estado de la conexión
+
Una conexión puede estar en diferentes estados: +
    +
  • Archivada
  • +
  • Ignorada
  • +
  • Bloqueada
  • +
  • Oculta
  • +
+
+
diff --git a/doc/context/es/connections/ifpending/help.html b/doc/context/es/connections/ifpending/help.html index 5fb0f3a0a..61146f1b0 100644 --- a/doc/context/es/connections/ifpending/help.html +++ b/doc/context/es/connections/ifpending/help.html @@ -1,8 +1,3 @@ - - - - -
General
Esta página muestra @@ -27,5 +22,3 @@
- - diff --git a/doc/context/es/events/help.html b/doc/context/es/events/help.html index 681f72e89..fb753e456 100644 --- a/doc/context/es/events/help.html +++ b/doc/context/es/events/help.html @@ -1,8 +1,3 @@ - - - - -
General
Esta página muestra @@ -19,5 +14,3 @@
Exportar o importar eventos del calendario usando el formato estándar de los ficheros de iCalendar (.ics).
- - diff --git a/doc/context/es/mail/help.html b/doc/context/es/mail/help.html index e51f7225c..4d7bf3365 100644 --- a/doc/context/es/mail/help.html +++ b/doc/context/es/mail/help.html @@ -1,8 +1,3 @@ - - - - -
General
Los mensajes que @@ -34,5 +29,3 @@ style="font-style: italic;"> aún no lo ha leído.
- - diff --git a/doc/context/es/network/help.html b/doc/context/es/network/help.html index 00b25428c..38b3fb003 100644 --- a/doc/context/es/network/help.html +++ b/doc/context/es/network/help.html @@ -1,8 +1,3 @@ - - - - -
General
La página @@ -67,5 +62,3 @@ "no se mostrará" a esa única persona.
- - diff --git a/doc/context/es/photos/help.html b/doc/context/es/photos/help.html index 44d0bed15..e07f96ea4 100644 --- a/doc/context/es/photos/help.html +++ b/doc/context/es/photos/help.html @@ -1,8 +1,3 @@ - - - - -
General
Esta página muestra @@ -23,5 +18,3 @@ enlaza con las galerías de fotos. La pestaña "Ficheros" enlaza con los ficheros de cualquier tipo compartidos por el canal.
- - diff --git a/doc/context/es/profile/help.html b/doc/context/es/profile/help.html index 314552f9b..9d8ca23ee 100644 --- a/doc/context/es/profile/help.html +++ b/doc/context/es/profile/help.html @@ -1,8 +1,3 @@ - - - - -
General
Esta es @@ -28,5 +23,3 @@ enlaza con las galerías de fotos. La pestaña "Ficheros" enlaza con los ficheros de cualquier tipo compartidos por el canal.
- - From 4d00c480263e857eb52dcf8d0a6f08370881c8ee Mon Sep 17 00:00:00 2001 From: redmatrix Date: Thu, 12 May 2016 16:11:38 -0700 Subject: [PATCH 04/29] back merge --- boot.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boot.php b/boot.php index b76e95c4f..9dbd4ead4 100755 --- a/boot.php +++ b/boot.php @@ -46,7 +46,7 @@ require_once('include/account.php'); define ( 'PLATFORM_NAME', 'hubzilla' ); -define ( 'STD_VERSION', '1.6' ); +define ( 'STD_VERSION', '1.7' ); define ( 'ZOT_REVISION', 1 ); define ( 'DB_UPDATE_VERSION', 1168 ); From 781716277ba382e0415e9188c252c1b79093ed6b Mon Sep 17 00:00:00 2001 From: redmatrix Date: Thu, 12 May 2016 16:45:49 -0700 Subject: [PATCH 05/29] SECURITY: a comment to a private post that has been edited (the comment has been edited) loses its privacy settings. This comment isn't visible in the stream but may be visible in feeds. --- include/zot.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/include/zot.php b/include/zot.php index 157354afa..8adc74ffa 100644 --- a/include/zot.php +++ b/include/zot.php @@ -1953,6 +1953,16 @@ function remove_community_tag($sender, $arr, $uid) { */ function update_imported_item($sender, $item, $orig, $uid) { + // If this is a comment being updated, remove any privacy information + // so that item_store_update will set it from the original. + + if($item['mid'] !== $item['parent_mid']) { + unset($item['allow_cid']); + unset($item['allow_gid']); + unset($item['deny_cid']); + unset($item['deny_gid']); + unset($item['item_private']); + } $x = item_store_update($item); From f2fc7d25c5f940135a7d9068f1813c22862b3f19 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Thu, 12 May 2016 20:02:16 -0700 Subject: [PATCH 06/29] remove the rarely if ever used filter_insecure() function. We will provide this functionality in other ways. --- include/items.php | 41 ----------------------------------------- 1 file changed, 41 deletions(-) diff --git a/include/items.php b/include/items.php index bef04237b..10a5b4ab9 100755 --- a/include/items.php +++ b/include/items.php @@ -33,7 +33,6 @@ function collect_recipients($item, &$private_envelope) { $allow_people = expand_acl($item['allow_cid']); $allow_groups = expand_groups(expand_acl($item['allow_gid'])); - $allow_groups = filter_insecure($item['uid'],$allow_groups); $recipients = array_unique(array_merge($allow_people,$allow_groups)); @@ -140,46 +139,6 @@ function collect_recipients($item, &$private_envelope) { return $recipients; } -/** - * If channel is configured to filter insecure members of privacy groups - * (those whose networks leak privacy via email notifications or other criteria) - * remove them from any privacy groups (collections) that were included in a post. - * They can still be addressed individually. - * Networks may need to be added or removed from this list as circumstances change. - * - * Update: this may need to be the default, which will force people to opt-in to - * sending stuff privately to insecure platforms. - * - * @param int $channel_id - * @param array $arr - * @return array containing the sane xchan_hashes - */ -function filter_insecure($channel_id, $arr) { - $insecure_nets = " and not xchan_network in ('diaspora', 'friendica-over-diaspora') "; - - $ret = array(); - - if((! intval(get_pconfig($channel_id, 'system', 'filter_insecure_privacy_groups'))) || (! $arr)) - return $arr; - - $str = ''; - foreach($arr as $rr) { - if(strlen($str)) - $str .= ','; - - $str .= "'" . dbesc($rr) . "'"; - } - $r = q("select xchan_hash from xchan where xchan_hash in ($str) $insecure_nets"); - if($r) { - foreach($r as $rr) { - $ret[] = $rr['xchan_hash']; - } - } - - return $ret; -} - - function comments_are_now_closed($item) { if($item['comments_closed'] !== NULL_DATE) { $d = datetime_convert(); From 522fec5763f35fc8c49ffd5343991b5f365c4d6f Mon Sep 17 00:00:00 2001 From: redmatrix Date: Thu, 12 May 2016 20:21:04 -0700 Subject: [PATCH 07/29] split off feed handling stuff from include/items --- include/feedutils.php | 1316 +++++++++++++++++++++++++++++++++++++++++ include/items.php | 1315 +--------------------------------------- 2 files changed, 1319 insertions(+), 1312 deletions(-) create mode 100644 include/feedutils.php diff --git a/include/feedutils.php b/include/feedutils.php new file mode 100644 index 000000000..2ba5efe22 --- /dev/null +++ b/include/feedutils.php @@ -0,0 +1,1316 @@ + '1', + 'datequery' => $params['end'], + 'datequery2' => $params['begin'], + 'start' => $params['start'], // FIXME + 'records' => $params['records'], // FIXME + 'direction' => $params['direction'], // FIXME + 'pages' => $params['pages'], + 'order' => 'post', + 'top' => $params['top'], + 'cat' => $params['cat'] + ), $channel, $observer_hash, CLIENT_MODE_NORMAL, App::$module); + + + $feed_template = get_markup_template('atom_feed.tpl'); + + $atom = ''; + + $atom .= replace_macros($feed_template, array( + '$version' => xmlify(Zotlabs\Project\System::get_project_version()), + '$red' => xmlify(Zotlabs\Project\System::get_platform_name()), + '$feed_id' => xmlify($channel['xchan_url']), + '$feed_title' => xmlify($channel['channel_name']), + '$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', 'now' , ATOM_TIME)) , + '$hub' => '', // feed_hublinks(), + '$salmon' => '', // feed_salmonlinks($channel['channel_address']), + '$name' => xmlify($channel['channel_name']), + '$profile_page' => xmlify($channel['xchan_url']), + '$mimephoto' => xmlify($channel['xchan_photo_mimetype']), + '$photo' => xmlify($channel['xchan_photo_l']), + '$thumb' => xmlify($channel['xchan_photo_m']), + '$picdate' => '', + '$uridate' => '', + '$namdate' => '', + '$birthday' => '', + '$community' => '', + )); + + + call_hooks('atom_feed', $atom); + + if($items) { + $type = 'html'; + foreach($items as $item) { + if($item['item_private']) + continue; + + /** @BUG $owner is undefined in this call */ + $atom .= atom_entry($item, $type, null, $owner, true); + } + } + + call_hooks('atom_feed_end', $atom); + + $atom .= '' . "\r\n"; + + return $atom; +} + +/** + * @brief + * + * @param array $item an associative array with + * * \b string \b verb + * @return string item's verb if set, default ACTIVITY_POST see boot.php + */ +function construct_verb($item) { + if ($item['verb']) + return $item['verb']; + + return ACTIVITY_POST; +} + +function construct_activity_object($item) { + + if($item['object']) { + $o = '' . "\r\n"; + $r = json_decode($item['object'],false); + + if(! $r) + return ''; + if($r->type) + $o .= '' . xmlify($r->type) . '' . "\r\n"; + if($r->id) + $o .= '' . xmlify($r->id) . '' . "\r\n"; + if($r->title) + $o .= '' . xmlify($r->title) . '' . "\r\n"; + if($r->links) { + /** @FIXME!! */ + if(substr($r->link,0,1) === '<') { + $r->link = preg_replace('/\/','',$r->link); + $o .= $r->link; + } + else + $o .= '' . "\r\n"; + } + if($r->content) + $o .= '' . xmlify(bbcode($r->content)) . '' . "\r\n"; + $o .= '' . "\r\n"; + return $o; + } + + return ''; +} + +function construct_activity_target($item) { + + if($item['target']) { + $o = '' . "\r\n"; + $r = json_decode($item['target'],false); + if(! $r) + return ''; + if($r->type) + $o .= '' . xmlify($r->type) . '' . "\r\n"; + if($r->id) + $o .= '' . xmlify($r->id) . '' . "\r\n"; + if($r->title) + $o .= '' . xmlify($r->title) . '' . "\r\n"; + if($r->links) { + /** @FIXME !!! */ + if(substr($r->link,0,1) === '<') { + if(strstr($r->link,'&') && (! strstr($r->link,'&'))) + $r->link = str_replace('&','&', $r->link); + $r->link = preg_replace('/\/','',$r->link); + $o .= $r->link; + } + else + $o .= '' . "\r\n"; + } + if($r->content) + $o .= '' . xmlify(bbcode($r->content)) . '' . "\r\n"; + + $o .= '' . "\r\n"; + + return $o; + } + + return ''; +} + +/** + * @param object $feed + * @param array $item + * @param[out] array $author + * @return multitype:multitype: string NULL number Ambigous Ambigous Ambigous , multitype:multitype:string unknown > multitype:NULL unknown + */ +function get_atom_elements($feed, $item, &$author) { + + //$best_photo = array(); + + $res = array(); + + $found_author = $item->get_author(); + if($found_author) { + $author['author_name'] = unxmlify($found_author->get_name()); + $author['author_link'] = unxmlify($found_author->get_link()); + $author['author_is_feed'] = false; + } + else { + $author['author_name'] = unxmlify($feed->get_title()); + $author['author_link'] = unxmlify($feed->get_permalink()); + $author['author_is_feed'] = true; + } + + if(substr($author['author_link'],-1,1) == '/') + $author['author_link'] = substr($author['author_link'],0,-1); + + $res['mid'] = base64url_encode(unxmlify($item->get_id())); + $res['title'] = unxmlify($item->get_title()); + $res['body'] = unxmlify($item->get_content()); + $res['plink'] = unxmlify($item->get_link(0)); + $res['item_rss'] = 1; + + + // removing the content of the title if its identically to the body + // This helps with auto generated titles e.g. from tumblr + + if (title_is_body($res["title"], $res["body"])) + $res['title'] = ""; + + if($res['plink']) + $base_url = implode('/', array_slice(explode('/',$res['plink']),0,3)); + else + $base_url = ''; + + // look for a photo. We should check media size and find the best one, + // but for now let's just find any author photo + + $rawauthor = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'author'); + + if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) { + $base = $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']; + foreach($base as $link) { + if(!x($author, 'author_photo') || ! $author['author_photo']) { + if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar') + $author['author_photo'] = unxmlify($link['attribs']['']['href']); + } + } + } + + $rawactor = $item->get_item_tags(NAMESPACE_ACTIVITY, 'actor'); + + if($rawactor && activity_match($rawactor[0]['child'][NAMESPACE_ACTIVITY]['obj_type'][0]['data'],ACTIVITY_OBJ_PERSON)) { + $base = $rawactor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']; + if($base && count($base)) { + foreach($base as $link) { + if($link['attribs']['']['rel'] === 'alternate' && (! $res['author_link'])) + $author['author_link'] = unxmlify($link['attribs']['']['href']); + if(!x($author, 'author_photo') || ! $author['author_photo']) { + if($link['attribs']['']['rel'] === 'avatar' || $link['attribs']['']['rel'] === 'photo') + $author['author_photo'] = unxmlify($link['attribs']['']['href']); + } + } + } + } + + // check for a yahoo media element (github etc.) + + if(! $author['author_photo']) { + $rawmedia = $item->get_item_tags(NAMESPACE_YMEDIA,'thumbnail'); + if($rawmedia && $rawmedia[0]['attribs']['']['url']) { + $author['author_photo'] = strip_tags(unxmlify($rawmedia[0]['attribs']['']['url'])); + } + } + + + // No photo/profile-link on the item - look at the feed level + + if((! (x($author,'author_link'))) || (! (x($author,'author_photo')))) { + $rawauthor = $feed->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'author'); + if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) { + $base = $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']; + foreach($base as $link) { + if($link['attribs']['']['rel'] === 'alternate' && (! $author['author_link'])) { + $author['author_link'] = unxmlify($link['attribs']['']['href']); + $author['author_is_feed'] = true; + } + if(! $author['author_photo']) { + if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar') + $author['author_photo'] = unxmlify($link['attribs']['']['href']); + } + } + } + + $rawactor = $feed->get_feed_tags(NAMESPACE_ACTIVITY, 'subject'); + + if($rawactor && activity_match($rawactor[0]['child'][NAMESPACE_ACTIVITY]['obj_type'][0]['data'],ACTIVITY_OBJ_PERSON)) { + $base = $rawactor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']; + + if($base && count($base)) { + foreach($base as $link) { + if($link['attribs']['']['rel'] === 'alternate' && (! $res['author_link'])) + $author['author_link'] = unxmlify($link['attribs']['']['href']); + if(! (x($author,'author_photo'))) { + if($link['attribs']['']['rel'] === 'avatar' || $link['attribs']['']['rel'] === 'photo') + $author['author_photo'] = unxmlify($link['attribs']['']['href']); + } + } + } + } + } + + $apps = $item->get_item_tags(NAMESPACE_STATUSNET,'notice_info'); + if($apps && $apps[0]['attribs']['']['source']) { + $res['app'] = strip_tags(unxmlify($apps[0]['attribs']['']['source'])); + } + + /* + * If there's a copy of the body content which is guaranteed to have survived mangling in transit, use it. + */ + + $have_real_body = false; + + $rawenv = $item->get_item_tags(NAMESPACE_DFRN, 'env'); + if($rawenv) { + $have_real_body = true; + $res['body'] = $rawenv[0]['data']; + $res['body'] = str_replace(array(' ',"\t","\r","\n"), array('','','',''),$res['body']); + // make sure nobody is trying to sneak some html tags by us + $res['body'] = notags(base64url_decode($res['body'])); + + // We could probably turn these old Friendica bbcode bookmarks into bookmark tags but we'd have to + // create a term table item for them. For now just make sure they stay as links. + + $res['body'] = preg_replace('/\[bookmark(.*?)\](.*?)\[\/bookmark\]/','[url$1]$2[/url]',$res['body']); + } + + $res['body'] = limit_body_size($res['body']); + + // It isn't certain at this point whether our content is plaintext or html and we'd be foolish to trust + // the content type. Our own network only emits text normally, though it might have been converted to + // html if we used a pubsubhubbub transport. But if we see even one html tag in our text, we will + // have to assume it is all html and needs to be purified. + + // It doesn't matter all that much security wise - because before this content is used anywhere, we are + // going to escape any tags we find regardless, but this lets us import a limited subset of html from + // the wild, by sanitising it and converting supported tags to bbcode before we rip out any remaining + // html. + + if((strpos($res['body'],'<') !== false) && (strpos($res['body'],'>') !== false)) { + + $res['body'] = reltoabs($res['body'],$base_url); + + $res['body'] = html2bb_video($res['body']); + + $res['body'] = oembed_html2bbcode($res['body']); + + $res['body'] = purify_html($res['body']); + + $res['body'] = @html2bbcode($res['body']); + } + elseif(! $have_real_body) { + + // it's not one of our messages and it has no tags + // so it's probably just text. We'll escape it just to be safe. + + $res['body'] = escape_tags($res['body']); + } + + if($res['plink'] && $res['title']) { + $res['body'] = '#^[url=' . $res['plink'] . ']' . $res['title'] . '[/url]' . "\n\n" . $res['body']; + $terms = array(); + $terms[] = array( + 'otype' => TERM_OBJ_POST, + 'type' => TERM_BOOKMARK, + 'url' => $res['plink'], + 'term' => $res['title'], + ); + } + elseif($res['plink']) { + $res['body'] = '#^[url]' . $res['plink'] . '[/url]' . "\n\n" . $res['body']; + $terms = array(); + $terms[] = array( + 'otype' => TERM_OBJ_POST, + 'type' => TERM_BOOKMARK, + 'url' => $res['plink'], + 'term' => $res['plink'], + ); + } + + $private = $item->get_item_tags(NAMESPACE_DFRN,'private'); + if($private && intval($private[0]['data']) > 0) + $res['item_private'] = ((intval($private[0]['data'])) ? 1 : 0); + else + $res['item_private'] = 0; + + $rawlocation = $item->get_item_tags(NAMESPACE_DFRN, 'location'); + if($rawlocation) + $res['location'] = unxmlify($rawlocation[0]['data']); + + $rawcreated = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'published'); + if($rawcreated) + $res['created'] = unxmlify($rawcreated[0]['data']); + + $rawedited = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'updated'); + if($rawedited) + $res['edited'] = unxmlify($rawedited[0]['data']); + + if((x($res,'edited')) && (! (x($res,'created')))) + $res['created'] = $res['edited']; + + if(! $res['created']) + $res['created'] = $item->get_date('c'); + + if(! $res['edited']) + $res['edited'] = $item->get_date('c'); + + + // Disallow time travelling posts + + $d1 = strtotime($res['created']); + $d2 = strtotime($res['edited']); + $d3 = strtotime('now'); + + if($d1 > $d3) + $res['created'] = datetime_convert(); + if($d2 > $d3) + $res['edited'] = datetime_convert(); + + $res['created'] = datetime_convert('UTC','UTC',$res['created']); + $res['edited'] = datetime_convert('UTC','UTC',$res['edited']); + + $rawowner = $item->get_item_tags(NAMESPACE_DFRN, 'owner'); + if(! $rawowner) + $rawowner = $item->get_item_tags(NAMESPACE_ZOT,'owner'); + + if($rawowner[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']) + $author['owner_name'] = unxmlify($rawowner[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']); + elseif($rawowner[0]['child'][NAMESPACE_DFRN]['name'][0]['data']) + $author['owner_name'] = unxmlify($rawowner[0]['child'][NAMESPACE_DFRN]['name'][0]['data']); + if($rawowner[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']) + $author['owner_link'] = unxmlify($rawowner[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']); + elseif($rawowner[0]['child'][NAMESPACE_DFRN]['uri'][0]['data']) + $author['owner_link'] = unxmlify($rawowner[0]['child'][NAMESPACE_DFRN]['uri'][0]['data']); + + if($rawowner[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) { + $base = $rawowner[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']; + + foreach($base as $link) { + if(!x($author, 'owner_photo') || ! $author['owner_photo']) { + if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar') + $author['owner_photo'] = unxmlify($link['attribs']['']['href']); + } + } + } + + $rawgeo = $item->get_item_tags(NAMESPACE_GEORSS,'point'); + if($rawgeo) + $res['coord'] = unxmlify($rawgeo[0]['data']); + + + $rawverb = $item->get_item_tags(NAMESPACE_ACTIVITY, 'verb'); + + // select between supported verbs + + if($rawverb) { + $res['verb'] = unxmlify($rawverb[0]['data']); + } + + // translate OStatus unfollow to activity streams if it happened to get selected + + if((x($res,'verb')) && ($res['verb'] === 'http://ostatus.org/schema/1.0/unfollow')) + $res['verb'] = ACTIVITY_UNFOLLOW; + + $cats = $item->get_categories(); + if($cats) { + if(is_null($terms)) + $terms = array(); + foreach($cats as $cat) { + $term = $cat->get_term(); + if(! $term) + $term = $cat->get_label(); + $scheme = $cat->get_scheme(); + $termurl = ''; + if($scheme && $term && stristr($scheme,'X-DFRN:')) { + $termtype = ((substr($scheme,7,1) === '#') ? TERM_HASHTAG : TERM_MENTION); + $termurl = unxmlify(substr($scheme,9)); + } + else { + $termtype = TERM_CATEGORY; + } + $termterm = notags(trim(unxmlify($term))); + + if($termterm) { + $terms[] = array( + 'otype' => TERM_OBJ_POST, + 'type' => $termtype, + 'url' => $termurl, + 'term' => $termterm, + ); + } + } + } + + if(! is_null($terms)) + $res['term'] = $terms; + + $attach = $item->get_enclosures(); + if($attach) { + $res['attach'] = array(); + foreach($attach as $att) { + $len = intval($att->get_length()); + $link = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att->get_link())))); + $title = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att->get_title())))); + $type = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att->get_type())))); + if(strpos($type,';')) + $type = substr($type,0,strpos($type,';')); + if((! $link) || (strpos($link,'http') !== 0)) + continue; + + if(! $title) + $title = ' '; + if(! $type) + $type = 'application/octet-stream'; + + $res['attach'][] = array('href' => $link, 'length' => $len, 'type' => $type, 'title' => $title ); + } + } + + $rawobj = $item->get_item_tags(NAMESPACE_ACTIVITY, 'object'); + + if($rawobj) { + $obj = array(); + + $child = $rawobj[0]['child']; + if($child[NAMESPACE_ACTIVITY]['obj_type'][0]['data']) { + $res['obj_type'] = $child[NAMESPACE_ACTIVITY]['obj_type'][0]['data']; + $obj['type'] = $child[NAMESPACE_ACTIVITY]['obj_type'][0]['data']; + } + if($child[NAMESPACE_ACTIVITY]['object-type'][0]['data']) { + $res['obj_type'] = $child[NAMESPACE_ACTIVITY]['object-type'][0]['data']; + $obj['type'] = $child[NAMESPACE_ACTIVITY]['object-type'][0]['data']; + } + if(x($child[SIMPLEPIE_NAMESPACE_ATOM_10], 'id') && $child[SIMPLEPIE_NAMESPACE_ATOM_10]['id'][0]['data']) + $obj['id'] = $child[SIMPLEPIE_NAMESPACE_ATOM_10]['id'][0]['data']; + if(x($child[SIMPLEPIE_NAMESPACE_ATOM_10], 'link') && $child[SIMPLEPIE_NAMESPACE_ATOM_10]['link']) + $obj['link'] = encode_rel_links($child[SIMPLEPIE_NAMESPACE_ATOM_10]['link']); + if(x($child[SIMPLEPIE_NAMESPACE_ATOM_10], 'title') && $child[SIMPLEPIE_NAMESPACE_ATOM_10]['title'][0]['data']) + $obj['title'] = $child[SIMPLEPIE_NAMESPACE_ATOM_10]['title'][0]['data']; + if(x($child[SIMPLEPIE_NAMESPACE_ATOM_10], 'content') && $child[SIMPLEPIE_NAMESPACE_ATOM_10]['content'][0]['data']) { + $body = $child[SIMPLEPIE_NAMESPACE_ATOM_10]['content'][0]['data']; + if(! $body) + $body = $child[SIMPLEPIE_NAMESPACE_ATOM_10]['summary'][0]['data']; + // preserve a copy of the original body content in case we later need to parse out any microformat information, e.g. events + $obj['orig'] = xmlify($body); + if((strpos($body,'<') !== false) || (strpos($body,'>') !== false)) { + $body = purify_html($body); + $body = html2bbcode($body); + } + + $obj['content'] = $body; + } + + $res['object'] = $obj; + } + + $rawobj = $item->get_item_tags(NAMESPACE_ACTIVITY, 'target'); + + if($rawobj) { + $obj = array(); + + $child = $rawobj[0]['child']; + if($child[NAMESPACE_ACTIVITY]['obj_type'][0]['data']) { + $res['tgt_type'] = $child[NAMESPACE_ACTIVITY]['obj_type'][0]['data']; + $obj['type'] = $child[NAMESPACE_ACTIVITY]['obj_type'][0]['data']; + } + if($child[NAMESPACE_ACTIVITY]['object-type'][0]['data']) { + $res['tgt_type'] = $child[NAMESPACE_ACTIVITY]['object-type'][0]['data']; + $obj['type'] = $child[NAMESPACE_ACTIVITY]['object-type'][0]['data']; + } + if(x($child[SIMPLEPIE_NAMESPACE_ATOM_10], 'id') && $child[SIMPLEPIE_NAMESPACE_ATOM_10]['id'][0]['data']) + $obj['id'] = $child[SIMPLEPIE_NAMESPACE_ATOM_10]['id'][0]['data']; + if(x($child[SIMPLEPIE_NAMESPACE_ATOM_10], 'link') && $child[SIMPLEPIE_NAMESPACE_ATOM_10]['link']) + $obj['link'] = encode_rel_links($child[SIMPLEPIE_NAMESPACE_ATOM_10]['link']); + if(x($child[SIMPLEPIE_NAMESPACE_ATOM_10], 'title') && $child[SIMPLEPIE_NAMESPACE_ATOM_10]['title'][0]['data']) + $obj['title'] = $child[SIMPLEPIE_NAMESPACE_ATOM_10]['title'][0]['data']; + if(x($child[SIMPLEPIE_NAMESPACE_ATOM_10], 'content') && $child[SIMPLEPIE_NAMESPACE_ATOM_10]['content'][0]['data']) { + $body = $child[SIMPLEPIE_NAMESPACE_ATOM_10]['content'][0]['data']; + if(! $body) + $body = $child[SIMPLEPIE_NAMESPACE_ATOM_10]['summary'][0]['data']; + + // preserve a copy of the original body content in case we later need to parse out any microformat information, e.g. events + $obj['orig'] = xmlify($body); + if((strpos($body,'<') !== false) || (strpos($body,'>') !== false)) { + $body = purify_html($body); + $body = html2bbcode($body); + } + + $obj['content'] = $body; + } + + $res['target'] = $obj; + } + + $arr = array('feed' => $feed, 'item' => $item, 'result' => $res); + + call_hooks('parse_atom', $arr); + logger('get_atom_elements: author: ' . print_r($author,true),LOGGER_DATA); + + logger('get_atom_elements: ' . print_r($res,true),LOGGER_DATA); + + return $res; +} + +function encode_rel_links($links) { + $o = array(); + if(! ((is_array($links)) && (count($links)))) + return $o; + + foreach($links as $link) { + $l = array(); + if($link['attribs']['']['rel']) + $l['rel'] = $link['attribs']['']['rel']; + if($link['attribs']['']['type']) + $l['type'] = $link['attribs']['']['type']; + if($link['attribs']['']['href']) + $l['href'] = $link['attribs']['']['href']; + if( (x($link['attribs'],NAMESPACE_MEDIA)) && $link['attribs'][NAMESPACE_MEDIA]['width']) + $l['width'] = $link['attribs'][NAMESPACE_MEDIA]['width']; + if( (x($link['attribs'],NAMESPACE_MEDIA)) && $link['attribs'][NAMESPACE_MEDIA]['height']) + $l['height'] = $link['attribs'][NAMESPACE_MEDIA]['height']; + + if($l) + $o[] = $l; + } + return $o; +} + +/** + * @brief Process atom feed and update anything/everything we might need to update. + * + * @param array $xml + * The (atom) feed to consume - RSS isn't as fully supported but may work for simple feeds. + * @param $importer + * The contact_record (joined to user_record) of the local user who owns this + * relationship. It is this person's stuff that is going to be updated. + * @param $contact + * The person who is sending us stuff. If not set, we MAY be processing a "follow" activity + * from an external network and MAY create an appropriate contact record. Otherwise, we MUST + * have a contact record. + * @param int $pass by default ($pass = 0) we cannot guarantee that a parent item has been + * imported prior to its children being seen in the stream unless we are certain + * of how the feed is arranged/ordered. + * * With $pass = 1, we only pull parent items out of the stream. + * * With $pass = 2, we only pull children (comments/likes). + * + * So running this twice, first with pass 1 and then with pass 2 will do the right + * thing regardless of feed ordering. This won't be adequate in a fully-threaded + * model where comments can have sub-threads. That would require some massive sorting + * to get all the feed items into a mostly linear ordering, and might still require + * recursion. + */ +function consume_feed($xml, $importer, &$contact, $pass = 0) { + + require_once('library/simplepie/simplepie.inc'); + + if(! strlen($xml)) { + logger('consume_feed: empty input'); + return; + } + + $sys_expire = intval(get_config('system','default_expire_days')); + $chn_expire = intval($importer['channel_expire_days']); + + $expire_days = $sys_expire; + + if(($chn_expire != 0) && ($chn_expire < $sys_expire)) + $expire_days = $chn_expire; + + // logger('expire_days: ' . $expire_days); + + $feed = new SimplePie(); + $feed->set_raw_data($xml); + $feed->init(); + + if($feed->error()) + logger('consume_feed: Error parsing XML: ' . $feed->error()); + + $permalink = $feed->get_permalink(); + + // Check at the feed level for updated contact name and/or photo + + // process any deleted entries + + $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 = $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'); + } + + if($deleted && is_array($contact)) { + $r = q("SELECT * from item where mid = '%s' and author_xchan = '%s' and uid = %d limit 1", + dbesc(base64url_encode($mid)), + dbesc($contact['xchan_hash']), + intval($importer['channel_id']) + ); + + if($r) { + $item = $r[0]; + + if(! intval($item['item_deleted'])) { + logger('consume_feed: deleting item ' . $item['id'] . ' mid=' . base64url_decode($item['mid']), LOGGER_DEBUG); + drop_item($item['id'],false); + } + } + } + } + } + + // Now process the feed + + if($feed->get_item_quantity()) { + + logger('consume_feed: feed item count = ' . $feed->get_item_quantity(), LOGGER_DEBUG); + + $items = $feed->get_items(); + + foreach($items as $item) { + + $is_reply = false; + $item_id = base64url_encode($item->get_id()); + + logger('consume_feed: processing ' . $item_id, LOGGER_DEBUG); + + $rawthread = $item->get_item_tags( NAMESPACE_THREAD,'in-reply-to'); + if(isset($rawthread[0]['attribs']['']['ref'])) { + $is_reply = true; + $parent_mid = base64url_encode($rawthread[0]['attribs']['']['ref']); + } + + if($is_reply) { + + if($pass == 1) + continue; + + // Have we seen it? If not, import it. + + $item_id = base64url_encode($item->get_id()); + $author = array(); + $datarray = get_atom_elements($feed,$item,$author); + + if($contact['xchan_network'] === 'rss') { + $datarray['public_policy'] = 'specific'; + $datarray['comment_policy'] = 'none'; + } + + if((! x($author,'author_name')) || ($author['author_is_feed'])) + $author['author_name'] = $contact['xchan_name']; + if((! x($author,'author_link')) || ($author['author_is_feed'])) + $author['author_link'] = $contact['xchan_url']; + if((! x($author,'author_photo'))|| ($author['author_is_feed'])) + $author['author_photo'] = $contact['xchan_photo_m']; + + $datarray['author_xchan'] = ''; + + if($author['author_link'] != $contact['xchan_url']) { + $x = import_author_unknown(array('name' => $author['author_name'],'url' => $author['author_link'],'photo' => array('src' => $author['author_photo']))); + if($x) + $datarray['author_xchan'] = $x; + } + if(! $datarray['author_xchan']) + $datarray['author_xchan'] = $contact['xchan_hash']; + + $datarray['owner_xchan'] = $contact['xchan_hash']; + + $r = q("SELECT edited FROM item WHERE mid = '%s' AND uid = %d LIMIT 1", + dbesc($item_id), + intval($importer['channel_id']) + ); + + + // Update content if 'updated' changes + + if($r) { + if((x($datarray,'edited') !== false) + && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) { + + // do not accept (ignore) an earlier edit than one we currently have. + if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited']) + continue; + + update_feed_item($importer['channel_id'],$datarray); + } + continue; + } + + $datarray['parent_mid'] = $parent_mid; + $datarray['aid'] = $importer['channel_account_id']; + $datarray['uid'] = $importer['channel_id']; + + logger('consume_feed: ' . print_r($datarray,true),LOGGER_DATA); + + $xx = item_store($datarray); + $r = $xx['item_id']; + continue; + } + else { + + // Head post of a conversation. Have we seen it? If not, import it. + + $item_id = base64url_encode($item->get_id()); + $author = array(); + $datarray = get_atom_elements($feed,$item,$author); + + if($contact['xchan_network'] === 'rss') { + $datarray['public_policy'] = 'specific'; + $datarray['comment_policy'] = 'none'; + } + + + if(is_array($contact)) { + if((! x($author,'author_name')) || ($author['author_is_feed'])) + $author['author_name'] = $contact['xchan_name']; + if((! x($author,'author_link')) || ($author['author_is_feed'])) + $author['author_link'] = $contact['xchan_url']; + if((! x($author,'author_photo'))|| ($author['author_is_feed'])) + $author['author_photo'] = $contact['xchan_photo_m']; + } + + if((! x($author,'author_name')) || (! x($author,'author_link'))) { + logger('consume_feed: no author information! ' . print_r($author,true)); + continue; + } + + $datarray['author_xchan'] = ''; + + if(activity_match($datarray['verb'],ACTIVITY_FOLLOW) && $datarray['obj_type'] === ACTIVITY_OBJ_PERSON) { + $cb = array('item' => $datarray,'channel' => $importer, 'xchan' => null, 'author' => $author, 'caught' => false); + call_hooks('follow_from_feed',$cb); + if($cb['caught']) { + if($cb['return_code']) + http_status_exit($cb['return_code']); + continue; + } + } + + if($author['author_link'] != $contact['xchan_url']) { + $x = import_author_unknown(array('name' => $author['author_name'],'url' => $author['author_link'],'photo' => array('src' => $author['author_photo']))); + if($x) + $datarray['author_xchan'] = $x; + } + if(! $datarray['author_xchan']) + $datarray['author_xchan'] = $contact['xchan_hash']; + + $datarray['owner_xchan'] = $contact['xchan_hash']; + + if(array_key_exists('created',$datarray) && $datarray['created'] != NULL_DATE && $expire_days) { + $t1 = $datarray['created']; + $t2 = datetime_convert('UTC','UTC','now - ' . $expire_days . 'days'); + if($t1 < $t2) { + logger('feed content older than expiration. Ignoring.', LOGGER_DEBUG, LOG_INFO); + continue; + } + } + + + + $r = q("SELECT edited FROM item WHERE mid = '%s' AND uid = %d LIMIT 1", + dbesc($item_id), + intval($importer['channel_id']) + ); + + // Update content if 'updated' changes + + if($r) { + if((x($datarray,'edited') !== false) + && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) { + + // do not accept (ignore) an earlier edit than one we currently have. + if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited']) + continue; + + update_feed_item($importer['channel_id'],$datarray); + } + + continue; + } + + $datarray['parent_mid'] = $item_id; + $datarray['uid'] = $importer['channel_id']; + $datarray['aid'] = $importer['channel_account_id']; + + if(! link_compare($author['owner_link'],$contact['xchan_url'])) { + logger('consume_feed: Correcting item owner.', LOGGER_DEBUG); + $author['owner_name'] = $contact['name']; + $author['owner_link'] = $contact['url']; + $author['owner_avatar'] = $contact['thumb']; + } + + if(! post_is_importable($datarray,$contact)) + continue; + + logger('consume_feed: author ' . print_r($author,true),LOGGER_DEBUG); + + logger('consume_feed: ' . print_r($datarray,true),LOGGER_DATA); + + $xx = item_store($datarray); + $r = $xx['item_id']; + continue; + } + } + } +} + + +/** + * @brief Process atom feed and return the first post and structure + * + * @param array $xml + * The (atom) feed to consume - RSS isn't as fully supported but may work for simple feeds. + * @param $importer + * The contact_record (joined to user_record) of the local user who owns this + * relationship. It is this person's stuff that is going to be updated. + */ + +function process_salmon_feed($xml, $importer) { + + $ret = array(); + + require_once('library/simplepie/simplepie.inc'); + + if(! strlen($xml)) { + logger('process_feed: empty input'); + return; + } + + $feed = new SimplePie(); + $feed->set_raw_data($xml); + $feed->init(); + + if($feed->error()) + logger('Error parsing XML: ' . $feed->error()); + + $permalink = $feed->get_permalink(); + + if($feed->get_item_quantity()) { + + // this should be exactly one + + logger('feed item count = ' . $feed->get_item_quantity(), LOGGER_DEBUG); + + $items = $feed->get_items(); + + foreach($items as $item) { + + $item_id = base64url_encode($item->get_id()); + + logger('processing ' . $item_id, LOGGER_DEBUG); + + $rawthread = $item->get_item_tags( NAMESPACE_THREAD,'in-reply-to'); + if(isset($rawthread[0]['attribs']['']['ref'])) { + $is_reply = true; + $parent_mid = base64url_encode($rawthread[0]['attribs']['']['ref']); + } + + if($is_reply) + $ret['parent_mid'] = $parent_mid; + + $ret['author'] = array(); + + $datarray = get_atom_elements($feed,$item,$ret['author']); + + // reset policies which are restricted by default for RSS connections + // This item is likely coming from GNU-social via salmon and allows public interaction + $datarray['public_policy'] = ''; + $datarray['comment_policy'] = ''; + + $ret['item'] = $datarray; + } + } + + return $ret; +} + +/* + * Given an xml (atom) feed, find author and hub links + */ + + +function feed_meta($xml) { + require_once('library/simplepie/simplepie.inc'); + + $ret = array(); + + if(! strlen($xml)) { + logger('empty input'); + return $ret; + } + + $feed = new SimplePie(); + $feed->set_raw_data($xml); + $feed->init(); + + if($feed->error()) { + logger('Error parsing XML: ' . $feed->error()); + return $ret; + } + + $ret['hubs'] = $feed->get_links('hub'); + +// logger('consume_feed: hubs: ' . print_r($hubs,true), LOGGER_DATA); + + $author = array(); + + $found_author = $feed->get_author(); + if($found_author) { + $author['author_name'] = unxmlify($found_author->get_name()); + $author['author_link'] = unxmlify($found_author->get_link()); + + $rawauthor = $feed->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'author'); + logger('rawauthor: ' . print_r($rawauthor,true)); + + if($rawauthor) { + if($rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) { + $base = $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']; + foreach($base as $link) { + if(!x($author, 'author_photo') || ! $author['author_photo']) { + if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar') { + $author['author_photo'] = unxmlify($link['attribs']['']['href']); + break; + } + } + } + } + if($rawauthor[0]['child'][NAMESPACE_POCO]['displayName'][0]['data']) + $author['full_name'] = unxmlify($rawauthor[0]['child'][NAMESPACE_POCO]['displayName'][0]['data']); + if($rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']) + $author['author_uri'] = unxmlify($rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']); + + } + } + + if(substr($author['author_link'],-1,1) == '/') + $author['author_link'] = substr($author['author_link'],0,-1); + + $ret['author'] = $author; + + return $ret; +} + + + +function update_feed_item($uid,$datarray) { + logger('update_feed_item: not implemented! ' . $uid . ' ' . print_r($datarray,true), LOGGER_DATA); +} + + +function handle_feed($uid,$abook_id,$url) { + + require_once('include/Contact.php'); + $channel = channelx_by_n($uid); + if(! $channel) + return; + + $x = q("select * from abook left join xchan on abook_xchan = xchan_hash where abook_id = %d and abook_channel = %d limit 1", + dbesc($abook_id), + intval($uid) + ); + + $recurse = 0; + $z = z_fetch_url($url,false,$recurse,array('novalidate' => true)); + +//logger('handle_feed:' . print_r($z,true)); + + if($z['success']) { + consume_feed($z['body'],$channel,$x[0],1); + consume_feed($z['body'],$channel,$x[0],2); + } +} + + +function atom_author($tag,$name,$uri,$h,$w,$type,$photo) { + $o = ''; + if(! $tag) + return $o; + + $name = xmlify($name); + $uri = xmlify($uri); + $h = intval($h); + $w = intval($w); + $photo = xmlify($photo); + + $o .= "<$tag>\r\n"; + $o .= "$name\r\n"; + $o .= "$uri\r\n"; + $o .= '' . "\r\n"; + $o .= '' . "\r\n"; + + call_hooks('atom_author', $o); + + $o .= "\r\n"; + + return $o; +} + +function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) { + + if(! $item['parent']) + return; + + if($item['deleted']) + return '' . "\r\n"; + + + create_export_photo_body($item); + + if($item['allow_cid'] || $item['allow_gid'] || $item['deny_cid'] || $item['deny_gid']) + $body = fix_private_photos($item['body'],$owner['uid'],$item,$cid); + else + $body = $item['body']; + + $o = "\r\n\r\n\r\n"; + + if(is_array($author)) + $o .= atom_author('author',$author['xchan_name'],$author['xchan_url'],80,80,$author['xchan_photo_mimetype'],$author['xchan_photo_m']); + else + $o .= atom_author('author',$item['author']['xchan_name'],$item['author']['xchan_url'],80,80,$item['author']['xchan_photo_mimetype'], $item['author']['xchan_photo_m']); + + $o .= atom_author('zot:owner',$item['owner']['xchan_name'],$item['owner']['xchan_url'],80,80,$item['owner']['xchan_photo_mimetype'],$item['owner']['xchan_photo_m']); + + if(($item['parent'] != $item['id']) || ($item['parent_mid'] !== $item['mid']) || (($item['thr_parent'] !== '') && ($item['thr_parent'] !== $item['mid']))) { + $parent_item = (($item['thr_parent']) ? $item['thr_parent'] : $item['parent_mid']); + $o .= '' . "\r\n"; + } + + if(activity_match($item['obj_type'],ACTIVITY_OBJ_EVENT) && activity_match($item['verb'],ACTIVITY_POST)) { + $obj = ((is_array($item['obj'])) ? $item['object'] : json_decode($item['object'],true)); + + $o .= '' . xmlify($item['title']) . '' . "\r\n"; + $o .= '' . xmlify(bbcode($obj['title'])) . '' . "\r\n"; + $o .= '' . datetime_convert('UTC','UTC', $obj['start'],'Ymd\\THis' . (($obj['adjust']) ? '\\Z' : '')) . '' . "\r\n"; + $o .= '' . datetime_convert('UTC','UTC', $obj['finish'],'Ymd\\THis' . (($obj['adjust']) ? '\\Z' : '')) . '' . "\r\n"; + $o .= '' . xmlify(bbcode($obj['location'])) . '' . "\r\n"; + $o .= '' . xmlify(bbcode($obj['description'])) . '' . "\r\n"; + } + else { + $o .= '' . xmlify($item['title']) . '' . "\r\n"; + $o .= '' . xmlify(prepare_text($body,$item['mimetype'])) . '' . "\r\n"; + } + + $o .= '' . z_root() . '/display/' . xmlify($item['mid']) . '' . "\r\n"; + $o .= '' . xmlify(datetime_convert('UTC','UTC',$item['created'] . '+00:00',ATOM_TIME)) . '' . "\r\n"; + $o .= '' . xmlify(datetime_convert('UTC','UTC',$item['edited'] . '+00:00',ATOM_TIME)) . '' . "\r\n"; + + $o .= '' . "\r\n"; + + if($item['location']) { + $o .= '' . xmlify($item['location']) . '' . "\r\n"; + $o .= '' . xmlify($item['location']) . '' . "\r\n"; + } + + if($item['coord']) + $o .= '' . xmlify($item['coord']) . '' . "\r\n"; + + if(($item['item_private']) || strlen($item['allow_cid']) || strlen($item['allow_gid']) || strlen($item['deny_cid']) || strlen($item['deny_gid'])) + $o .= '' . (($item['item_private']) ? $item['item_private'] : 1) . '' . "\r\n"; + + if($item['app']) + $o .= '' . "\r\n"; + + $verb = construct_verb($item); + $o .= '' . xmlify($verb) . '' . "\r\n"; + $actobj = construct_activity_object($item); + if(strlen($actobj)) + $o .= $actobj; + $actarg = construct_activity_target($item); + if(strlen($actarg)) + $o .= $actarg; + + // FIXME +// $tags = item_getfeedtags($item); +// if(count($tags)) { +// foreach($tags as $t) { +// $o .= '' . "\r\n"; +// } +// } + +// FIXME +// $o .= item_getfeedattach($item); + +// $mentioned = get_mentions($item,$tags); +// if($mentioned) +// $o .= $mentioned; + + call_hooks('atom_entry', $o); + + $o .= '' . "\r\n"; + + return $o; +} + + +function gen_asld($items) { + $ret = array(); + if(! $items) + return $ret; + foreach($items as $item) { + $ret[] = i2asld($item); + } + return $ret; +} + + +function i2asld($i) { + + if(! $i) + return array(); + + $ret = array(); + + $ret['@context'] = array( 'http://www.w3.org/ns/activitystreams', 'zot' => 'http://purl.org/zot/protocol'); + + if($i['verb']) { + if(strpos(dirname($i['verb'],'activitystrea.ms/schema/1.0'))) { + $ret['@type'] = ucfirst(basename($i['verb'])); + } + elseif(strpos(dirname($i['verb'],'purl.org/zot'))) { + $ret['@type'] = 'zot:' . ucfirst(basename($i['verb'])); + } + } + $ret['@id'] = $i['plink']; + + $ret['published'] = datetime_convert('UTC','UTC',$i['created'],ATOM_TIME); + + // we need to pass the parent into this +// if($i['id'] != $i['parent'] && $i['obj_type'] === ACTIVITY_OBJ_NOTE) { +// $ret['inReplyTo'] = asencode_note +// } + + if($i['obj_type'] === ACTIVITY_OBJ_NOTE) + $ret['object'] = asencode_note($i); + + + $ret['actor'] = asencode_person($i['author']); + + + return $ret; + +} + +function asencode_note($i) { + + $ret = array(); + + $ret['@type'] = 'Note'; + $ret['@id'] = $i['plink']; + if($i['title']) + $ret['title'] = bbcode($i['title']); + $ret['content'] = bbcode($i['body']); + $ret['zot:owner'] = asencode_person($i['owner']); + $ret['published'] = datetime_convert('UTC','UTC',$i['created'],ATOM_TIME); + if($i['created'] !== $i['edited']) + $ret['updated'] = datetime_convert('UTC','UTC',$i['edited'],ATOM_TIME); + + return $ret; +} + + +function asencode_person($p) { + $ret = array(); + $ret['@type'] = 'Person'; + $ret['@id'] = 'acct:' . $p['xchan_addr']; + $ret['displayName'] = $p['xchan_name']; + $ret['icon'] = array( + '@type' => 'Link', + 'mediaType' => $p['xchan_photo_mimetype'], + 'href' => $p['xchan_photo_m'] + ); + $ret['url'] = array( + '@type' => 'Link', + 'mediaType' => 'text/html', + 'href' => $p['xchan_url'] + ); + + return $ret; +} diff --git a/include/items.php b/include/items.php index 10a5b4ab9..adc06898d 100755 --- a/include/items.php +++ b/include/items.php @@ -3,12 +3,13 @@ * @file include/items.php */ -/** @todo deprecated in newer SabreDAV releases Sabre\HTTP\URLUtil */ -use Sabre\DAV\URLUtil; +// uncertain if this line is needed and why +use Sabre\HTTP\URLUtil; require_once('include/bbcode.php'); require_once('include/oembed.php'); require_once('include/crypto.php'); +require_once('include/feedutils.php'); require_once('include/photo/photo_driver.php'); require_once('include/permissions.php'); @@ -482,214 +483,6 @@ function validate_item_elements($message,$arr) { -/** - * @brief Generate an Atom feed. - * - * @param array $channel - * @param array $params - */ -function get_public_feed($channel, $params) { - - $type = 'xml'; - $begin = NULL_DATE; - $end = ''; - $start = 0; - $records = 40; - $direction = 'desc'; - $pages = 0; - - if(! $params) - $params = array(); - - $params['type'] = ((x($params,'type')) ? $params['type'] : 'xml'); - $params['begin'] = ((x($params,'begin')) ? $params['begin'] : NULL_DATE); - $params['end'] = ((x($params,'end')) ? $params['end'] : datetime_convert('UTC','UTC','now')); - $params['start'] = ((x($params,'start')) ? $params['start'] : 0); - $params['records'] = ((x($params,'records')) ? $params['records'] : 40); - $params['direction'] = ((x($params,'direction')) ? $params['direction'] : 'desc'); - $params['pages'] = ((x($params,'pages')) ? intval($params['pages']) : 0); - $params['top'] = ((x($params,'top')) ? intval($params['top']) : 0); - $params['cat'] = ((x($params,'cat')) ? $params['cat'] : ''); - - - // put a sane lower limit on feed requests if not specified - -// if($params['begin'] === NULL_DATE) -// $params['begin'] = datetime_convert('UTC','UTC','now - 1 month'); - - switch($params['type']) { - case 'json': - header("Content-type: application/atom+json"); - break; - case 'xml': - default: - header("Content-type: application/atom+xml"); - break; - } - - return get_feed_for($channel, get_observer_hash(), $params); -} - -/** - * @brief - * - * @param array $channel - * @param string $observer_hash - * @param array $params - * @return string - */ -function get_feed_for($channel, $observer_hash, $params) { - - if(! channel) - http_status_exit(401); - - if($params['pages']) { - if(! perm_is_allowed($channel['channel_id'],$observer_hash,'view_pages')) - http_status_exit(403); - } else { - if(! perm_is_allowed($channel['channel_id'],$observer_hash,'view_stream')) - http_status_exit(403); - } - $items = items_fetch(array( - 'wall' => '1', - 'datequery' => $params['end'], - 'datequery2' => $params['begin'], - 'start' => $params['start'], // FIXME - 'records' => $params['records'], // FIXME - 'direction' => $params['direction'], // FIXME - 'pages' => $params['pages'], - 'order' => 'post', - 'top' => $params['top'], - 'cat' => $params['cat'] - ), $channel, $observer_hash, CLIENT_MODE_NORMAL, App::$module); - - - $feed_template = get_markup_template('atom_feed.tpl'); - - $atom = ''; - - $atom .= replace_macros($feed_template, array( - '$version' => xmlify(Zotlabs\Project\System::get_project_version()), - '$red' => xmlify(Zotlabs\Project\System::get_platform_name()), - '$feed_id' => xmlify($channel['xchan_url']), - '$feed_title' => xmlify($channel['channel_name']), - '$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', 'now' , ATOM_TIME)) , - '$hub' => '', // feed_hublinks(), - '$salmon' => '', // feed_salmonlinks($channel['channel_address']), - '$name' => xmlify($channel['channel_name']), - '$profile_page' => xmlify($channel['xchan_url']), - '$mimephoto' => xmlify($channel['xchan_photo_mimetype']), - '$photo' => xmlify($channel['xchan_photo_l']), - '$thumb' => xmlify($channel['xchan_photo_m']), - '$picdate' => '', - '$uridate' => '', - '$namdate' => '', - '$birthday' => '', - '$community' => '', - )); - - - call_hooks('atom_feed', $atom); - - if($items) { - $type = 'html'; - foreach($items as $item) { - if($item['item_private']) - continue; - - /** @BUG $owner is undefined in this call */ - $atom .= atom_entry($item, $type, null, $owner, true); - } - } - - call_hooks('atom_feed_end', $atom); - - $atom .= '' . "\r\n"; - - return $atom; -} - -/** - * @brief - * - * @param array $item an associative array with - * * \b string \b verb - * @return string item's verb if set, default ACTIVITY_POST see boot.php - */ -function construct_verb($item) { - if ($item['verb']) - return $item['verb']; - - return ACTIVITY_POST; -} - -function construct_activity_object($item) { - - if($item['object']) { - $o = '' . "\r\n"; - $r = json_decode($item['object'],false); - - if(! $r) - return ''; - if($r->type) - $o .= '' . xmlify($r->type) . '' . "\r\n"; - if($r->id) - $o .= '' . xmlify($r->id) . '' . "\r\n"; - if($r->title) - $o .= '' . xmlify($r->title) . '' . "\r\n"; - if($r->links) { - /** @FIXME!! */ - if(substr($r->link,0,1) === '<') { - $r->link = preg_replace('/\/','',$r->link); - $o .= $r->link; - } - else - $o .= '' . "\r\n"; - } - if($r->content) - $o .= '' . xmlify(bbcode($r->content)) . '' . "\r\n"; - $o .= '' . "\r\n"; - return $o; - } - - return ''; -} - -function construct_activity_target($item) { - - if($item['target']) { - $o = '' . "\r\n"; - $r = json_decode($item['target'],false); - if(! $r) - return ''; - if($r->type) - $o .= '' . xmlify($r->type) . '' . "\r\n"; - if($r->id) - $o .= '' . xmlify($r->id) . '' . "\r\n"; - if($r->title) - $o .= '' . xmlify($r->title) . '' . "\r\n"; - if($r->links) { - /** @FIXME !!! */ - if(substr($r->link,0,1) === '<') { - if(strstr($r->link,'&') && (! strstr($r->link,'&'))) - $r->link = str_replace('&','&', $r->link); - $r->link = preg_replace('/\/','',$r->link); - $o .= $r->link; - } - else - $o .= '' . "\r\n"; - } - if($r->content) - $o .= '' . xmlify(bbcode($r->content)) . '' . "\r\n"; - - $o .= '' . "\r\n"; - - return $o; - } - - return ''; -} - /** * @brief Limit lenght on imported system messages. * @@ -1701,453 +1494,6 @@ function get_profile_elements($x) { return $arr; } -/** - * @param object $feed - * @param array $item - * @param[out] array $author - * @return multitype:multitype: string NULL number Ambigous Ambigous Ambigous , multitype:multitype:string unknown > multitype:NULL unknown - */ -function get_atom_elements($feed, $item, &$author) { - - //$best_photo = array(); - - $res = array(); - - $found_author = $item->get_author(); - if($found_author) { - $author['author_name'] = unxmlify($found_author->get_name()); - $author['author_link'] = unxmlify($found_author->get_link()); - $author['author_is_feed'] = false; - } - else { - $author['author_name'] = unxmlify($feed->get_title()); - $author['author_link'] = unxmlify($feed->get_permalink()); - $author['author_is_feed'] = true; - } - - if(substr($author['author_link'],-1,1) == '/') - $author['author_link'] = substr($author['author_link'],0,-1); - - $res['mid'] = base64url_encode(unxmlify($item->get_id())); - $res['title'] = unxmlify($item->get_title()); - $res['body'] = unxmlify($item->get_content()); - $res['plink'] = unxmlify($item->get_link(0)); - $res['item_rss'] = 1; - - - // removing the content of the title if its identically to the body - // This helps with auto generated titles e.g. from tumblr - - if (title_is_body($res["title"], $res["body"])) - $res['title'] = ""; - - if($res['plink']) - $base_url = implode('/', array_slice(explode('/',$res['plink']),0,3)); - else - $base_url = ''; - - // look for a photo. We should check media size and find the best one, - // but for now let's just find any author photo - - $rawauthor = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'author'); - - if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) { - $base = $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']; - foreach($base as $link) { - if(!x($author, 'author_photo') || ! $author['author_photo']) { - if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar') - $author['author_photo'] = unxmlify($link['attribs']['']['href']); - } - } - } - - $rawactor = $item->get_item_tags(NAMESPACE_ACTIVITY, 'actor'); - - if($rawactor && activity_match($rawactor[0]['child'][NAMESPACE_ACTIVITY]['obj_type'][0]['data'],ACTIVITY_OBJ_PERSON)) { - $base = $rawactor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']; - if($base && count($base)) { - foreach($base as $link) { - if($link['attribs']['']['rel'] === 'alternate' && (! $res['author_link'])) - $author['author_link'] = unxmlify($link['attribs']['']['href']); - if(!x($author, 'author_photo') || ! $author['author_photo']) { - if($link['attribs']['']['rel'] === 'avatar' || $link['attribs']['']['rel'] === 'photo') - $author['author_photo'] = unxmlify($link['attribs']['']['href']); - } - } - } - } - - // check for a yahoo media element (github etc.) - - if(! $author['author_photo']) { - $rawmedia = $item->get_item_tags(NAMESPACE_YMEDIA,'thumbnail'); - if($rawmedia && $rawmedia[0]['attribs']['']['url']) { - $author['author_photo'] = strip_tags(unxmlify($rawmedia[0]['attribs']['']['url'])); - } - } - - - // No photo/profile-link on the item - look at the feed level - - if((! (x($author,'author_link'))) || (! (x($author,'author_photo')))) { - $rawauthor = $feed->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'author'); - if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) { - $base = $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']; - foreach($base as $link) { - if($link['attribs']['']['rel'] === 'alternate' && (! $author['author_link'])) { - $author['author_link'] = unxmlify($link['attribs']['']['href']); - $author['author_is_feed'] = true; - } - if(! $author['author_photo']) { - if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar') - $author['author_photo'] = unxmlify($link['attribs']['']['href']); - } - } - } - - $rawactor = $feed->get_feed_tags(NAMESPACE_ACTIVITY, 'subject'); - - if($rawactor && activity_match($rawactor[0]['child'][NAMESPACE_ACTIVITY]['obj_type'][0]['data'],ACTIVITY_OBJ_PERSON)) { - $base = $rawactor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']; - - if($base && count($base)) { - foreach($base as $link) { - if($link['attribs']['']['rel'] === 'alternate' && (! $res['author_link'])) - $author['author_link'] = unxmlify($link['attribs']['']['href']); - if(! (x($author,'author_photo'))) { - if($link['attribs']['']['rel'] === 'avatar' || $link['attribs']['']['rel'] === 'photo') - $author['author_photo'] = unxmlify($link['attribs']['']['href']); - } - } - } - } - } - - $apps = $item->get_item_tags(NAMESPACE_STATUSNET,'notice_info'); - if($apps && $apps[0]['attribs']['']['source']) { - $res['app'] = strip_tags(unxmlify($apps[0]['attribs']['']['source'])); - } - - /* - * If there's a copy of the body content which is guaranteed to have survived mangling in transit, use it. - */ - - $have_real_body = false; - - $rawenv = $item->get_item_tags(NAMESPACE_DFRN, 'env'); - if($rawenv) { - $have_real_body = true; - $res['body'] = $rawenv[0]['data']; - $res['body'] = str_replace(array(' ',"\t","\r","\n"), array('','','',''),$res['body']); - // make sure nobody is trying to sneak some html tags by us - $res['body'] = notags(base64url_decode($res['body'])); - - // We could probably turn these old Friendica bbcode bookmarks into bookmark tags but we'd have to - // create a term table item for them. For now just make sure they stay as links. - - $res['body'] = preg_replace('/\[bookmark(.*?)\](.*?)\[\/bookmark\]/','[url$1]$2[/url]',$res['body']); - } - - $res['body'] = limit_body_size($res['body']); - - // It isn't certain at this point whether our content is plaintext or html and we'd be foolish to trust - // the content type. Our own network only emits text normally, though it might have been converted to - // html if we used a pubsubhubbub transport. But if we see even one html tag in our text, we will - // have to assume it is all html and needs to be purified. - - // It doesn't matter all that much security wise - because before this content is used anywhere, we are - // going to escape any tags we find regardless, but this lets us import a limited subset of html from - // the wild, by sanitising it and converting supported tags to bbcode before we rip out any remaining - // html. - - if((strpos($res['body'],'<') !== false) && (strpos($res['body'],'>') !== false)) { - - $res['body'] = reltoabs($res['body'],$base_url); - - $res['body'] = html2bb_video($res['body']); - - $res['body'] = oembed_html2bbcode($res['body']); - - $res['body'] = purify_html($res['body']); - - $res['body'] = @html2bbcode($res['body']); - } - elseif(! $have_real_body) { - - // it's not one of our messages and it has no tags - // so it's probably just text. We'll escape it just to be safe. - - $res['body'] = escape_tags($res['body']); - } - - if($res['plink'] && $res['title']) { - $res['body'] = '#^[url=' . $res['plink'] . ']' . $res['title'] . '[/url]' . "\n\n" . $res['body']; - $terms = array(); - $terms[] = array( - 'otype' => TERM_OBJ_POST, - 'type' => TERM_BOOKMARK, - 'url' => $res['plink'], - 'term' => $res['title'], - ); - } - elseif($res['plink']) { - $res['body'] = '#^[url]' . $res['plink'] . '[/url]' . "\n\n" . $res['body']; - $terms = array(); - $terms[] = array( - 'otype' => TERM_OBJ_POST, - 'type' => TERM_BOOKMARK, - 'url' => $res['plink'], - 'term' => $res['plink'], - ); - } - - $private = $item->get_item_tags(NAMESPACE_DFRN,'private'); - if($private && intval($private[0]['data']) > 0) - $res['item_private'] = ((intval($private[0]['data'])) ? 1 : 0); - else - $res['item_private'] = 0; - - $rawlocation = $item->get_item_tags(NAMESPACE_DFRN, 'location'); - if($rawlocation) - $res['location'] = unxmlify($rawlocation[0]['data']); - - $rawcreated = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'published'); - if($rawcreated) - $res['created'] = unxmlify($rawcreated[0]['data']); - - $rawedited = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'updated'); - if($rawedited) - $res['edited'] = unxmlify($rawedited[0]['data']); - - if((x($res,'edited')) && (! (x($res,'created')))) - $res['created'] = $res['edited']; - - if(! $res['created']) - $res['created'] = $item->get_date('c'); - - if(! $res['edited']) - $res['edited'] = $item->get_date('c'); - - - // Disallow time travelling posts - - $d1 = strtotime($res['created']); - $d2 = strtotime($res['edited']); - $d3 = strtotime('now'); - - if($d1 > $d3) - $res['created'] = datetime_convert(); - if($d2 > $d3) - $res['edited'] = datetime_convert(); - - $res['created'] = datetime_convert('UTC','UTC',$res['created']); - $res['edited'] = datetime_convert('UTC','UTC',$res['edited']); - - $rawowner = $item->get_item_tags(NAMESPACE_DFRN, 'owner'); - if(! $rawowner) - $rawowner = $item->get_item_tags(NAMESPACE_ZOT,'owner'); - - if($rawowner[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']) - $author['owner_name'] = unxmlify($rawowner[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']); - elseif($rawowner[0]['child'][NAMESPACE_DFRN]['name'][0]['data']) - $author['owner_name'] = unxmlify($rawowner[0]['child'][NAMESPACE_DFRN]['name'][0]['data']); - if($rawowner[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']) - $author['owner_link'] = unxmlify($rawowner[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']); - elseif($rawowner[0]['child'][NAMESPACE_DFRN]['uri'][0]['data']) - $author['owner_link'] = unxmlify($rawowner[0]['child'][NAMESPACE_DFRN]['uri'][0]['data']); - - if($rawowner[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) { - $base = $rawowner[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']; - - foreach($base as $link) { - if(!x($author, 'owner_photo') || ! $author['owner_photo']) { - if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar') - $author['owner_photo'] = unxmlify($link['attribs']['']['href']); - } - } - } - - $rawgeo = $item->get_item_tags(NAMESPACE_GEORSS,'point'); - if($rawgeo) - $res['coord'] = unxmlify($rawgeo[0]['data']); - - - $rawverb = $item->get_item_tags(NAMESPACE_ACTIVITY, 'verb'); - - // select between supported verbs - - if($rawverb) { - $res['verb'] = unxmlify($rawverb[0]['data']); - } - - // translate OStatus unfollow to activity streams if it happened to get selected - - if((x($res,'verb')) && ($res['verb'] === 'http://ostatus.org/schema/1.0/unfollow')) - $res['verb'] = ACTIVITY_UNFOLLOW; - - $cats = $item->get_categories(); - if($cats) { - if(is_null($terms)) - $terms = array(); - foreach($cats as $cat) { - $term = $cat->get_term(); - if(! $term) - $term = $cat->get_label(); - $scheme = $cat->get_scheme(); - $termurl = ''; - if($scheme && $term && stristr($scheme,'X-DFRN:')) { - $termtype = ((substr($scheme,7,1) === '#') ? TERM_HASHTAG : TERM_MENTION); - $termurl = unxmlify(substr($scheme,9)); - } - else { - $termtype = TERM_CATEGORY; - } - $termterm = notags(trim(unxmlify($term))); - - if($termterm) { - $terms[] = array( - 'otype' => TERM_OBJ_POST, - 'type' => $termtype, - 'url' => $termurl, - 'term' => $termterm, - ); - } - } - } - - if(! is_null($terms)) - $res['term'] = $terms; - - $attach = $item->get_enclosures(); - if($attach) { - $res['attach'] = array(); - foreach($attach as $att) { - $len = intval($att->get_length()); - $link = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att->get_link())))); - $title = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att->get_title())))); - $type = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att->get_type())))); - if(strpos($type,';')) - $type = substr($type,0,strpos($type,';')); - if((! $link) || (strpos($link,'http') !== 0)) - continue; - - if(! $title) - $title = ' '; - if(! $type) - $type = 'application/octet-stream'; - - $res['attach'][] = array('href' => $link, 'length' => $len, 'type' => $type, 'title' => $title ); - } - } - - $rawobj = $item->get_item_tags(NAMESPACE_ACTIVITY, 'object'); - - if($rawobj) { - $obj = array(); - - $child = $rawobj[0]['child']; - if($child[NAMESPACE_ACTIVITY]['obj_type'][0]['data']) { - $res['obj_type'] = $child[NAMESPACE_ACTIVITY]['obj_type'][0]['data']; - $obj['type'] = $child[NAMESPACE_ACTIVITY]['obj_type'][0]['data']; - } - if($child[NAMESPACE_ACTIVITY]['object-type'][0]['data']) { - $res['obj_type'] = $child[NAMESPACE_ACTIVITY]['object-type'][0]['data']; - $obj['type'] = $child[NAMESPACE_ACTIVITY]['object-type'][0]['data']; - } - if(x($child[SIMPLEPIE_NAMESPACE_ATOM_10], 'id') && $child[SIMPLEPIE_NAMESPACE_ATOM_10]['id'][0]['data']) - $obj['id'] = $child[SIMPLEPIE_NAMESPACE_ATOM_10]['id'][0]['data']; - if(x($child[SIMPLEPIE_NAMESPACE_ATOM_10], 'link') && $child[SIMPLEPIE_NAMESPACE_ATOM_10]['link']) - $obj['link'] = encode_rel_links($child[SIMPLEPIE_NAMESPACE_ATOM_10]['link']); - if(x($child[SIMPLEPIE_NAMESPACE_ATOM_10], 'title') && $child[SIMPLEPIE_NAMESPACE_ATOM_10]['title'][0]['data']) - $obj['title'] = $child[SIMPLEPIE_NAMESPACE_ATOM_10]['title'][0]['data']; - if(x($child[SIMPLEPIE_NAMESPACE_ATOM_10], 'content') && $child[SIMPLEPIE_NAMESPACE_ATOM_10]['content'][0]['data']) { - $body = $child[SIMPLEPIE_NAMESPACE_ATOM_10]['content'][0]['data']; - if(! $body) - $body = $child[SIMPLEPIE_NAMESPACE_ATOM_10]['summary'][0]['data']; - // preserve a copy of the original body content in case we later need to parse out any microformat information, e.g. events - $obj['orig'] = xmlify($body); - if((strpos($body,'<') !== false) || (strpos($body,'>') !== false)) { - $body = purify_html($body); - $body = html2bbcode($body); - } - - $obj['content'] = $body; - } - - $res['object'] = $obj; - } - - $rawobj = $item->get_item_tags(NAMESPACE_ACTIVITY, 'target'); - - if($rawobj) { - $obj = array(); - - $child = $rawobj[0]['child']; - if($child[NAMESPACE_ACTIVITY]['obj_type'][0]['data']) { - $res['tgt_type'] = $child[NAMESPACE_ACTIVITY]['obj_type'][0]['data']; - $obj['type'] = $child[NAMESPACE_ACTIVITY]['obj_type'][0]['data']; - } - if($child[NAMESPACE_ACTIVITY]['object-type'][0]['data']) { - $res['tgt_type'] = $child[NAMESPACE_ACTIVITY]['object-type'][0]['data']; - $obj['type'] = $child[NAMESPACE_ACTIVITY]['object-type'][0]['data']; - } - if(x($child[SIMPLEPIE_NAMESPACE_ATOM_10], 'id') && $child[SIMPLEPIE_NAMESPACE_ATOM_10]['id'][0]['data']) - $obj['id'] = $child[SIMPLEPIE_NAMESPACE_ATOM_10]['id'][0]['data']; - if(x($child[SIMPLEPIE_NAMESPACE_ATOM_10], 'link') && $child[SIMPLEPIE_NAMESPACE_ATOM_10]['link']) - $obj['link'] = encode_rel_links($child[SIMPLEPIE_NAMESPACE_ATOM_10]['link']); - if(x($child[SIMPLEPIE_NAMESPACE_ATOM_10], 'title') && $child[SIMPLEPIE_NAMESPACE_ATOM_10]['title'][0]['data']) - $obj['title'] = $child[SIMPLEPIE_NAMESPACE_ATOM_10]['title'][0]['data']; - if(x($child[SIMPLEPIE_NAMESPACE_ATOM_10], 'content') && $child[SIMPLEPIE_NAMESPACE_ATOM_10]['content'][0]['data']) { - $body = $child[SIMPLEPIE_NAMESPACE_ATOM_10]['content'][0]['data']; - if(! $body) - $body = $child[SIMPLEPIE_NAMESPACE_ATOM_10]['summary'][0]['data']; - - // preserve a copy of the original body content in case we later need to parse out any microformat information, e.g. events - $obj['orig'] = xmlify($body); - if((strpos($body,'<') !== false) || (strpos($body,'>') !== false)) { - $body = purify_html($body); - $body = html2bbcode($body); - } - - $obj['content'] = $body; - } - - $res['target'] = $obj; - } - - $arr = array('feed' => $feed, 'item' => $item, 'result' => $res); - - call_hooks('parse_atom', $arr); - logger('get_atom_elements: author: ' . print_r($author,true),LOGGER_DATA); - - logger('get_atom_elements: ' . print_r($res,true),LOGGER_DATA); - - return $res; -} - -function encode_rel_links($links) { - $o = array(); - if(! ((is_array($links)) && (count($links)))) - return $o; - - foreach($links as $link) { - $l = array(); - if($link['attribs']['']['rel']) - $l['rel'] = $link['attribs']['']['rel']; - if($link['attribs']['']['type']) - $l['type'] = $link['attribs']['']['type']; - if($link['attribs']['']['href']) - $l['href'] = $link['attribs']['']['href']; - if( (x($link['attribs'],NAMESPACE_MEDIA)) && $link['attribs'][NAMESPACE_MEDIA]['width']) - $l['width'] = $link['attribs'][NAMESPACE_MEDIA]['width']; - if( (x($link['attribs'],NAMESPACE_MEDIA)) && $link['attribs'][NAMESPACE_MEDIA]['height']) - $l['height'] = $link['attribs'][NAMESPACE_MEDIA]['height']; - - if($l) - $o[] = $l; - } - return $o; -} /** * @brief @@ -3718,577 +3064,6 @@ function mail_store($arr) { return $current_post; } -/** - * @brief Process atom feed and update anything/everything we might need to update. - * - * @param array $xml - * The (atom) feed to consume - RSS isn't as fully supported but may work for simple feeds. - * @param $importer - * The contact_record (joined to user_record) of the local user who owns this - * relationship. It is this person's stuff that is going to be updated. - * @param $contact - * The person who is sending us stuff. If not set, we MAY be processing a "follow" activity - * from an external network and MAY create an appropriate contact record. Otherwise, we MUST - * have a contact record. - * @param int $pass by default ($pass = 0) we cannot guarantee that a parent item has been - * imported prior to its children being seen in the stream unless we are certain - * of how the feed is arranged/ordered. - * * With $pass = 1, we only pull parent items out of the stream. - * * With $pass = 2, we only pull children (comments/likes). - * - * So running this twice, first with pass 1 and then with pass 2 will do the right - * thing regardless of feed ordering. This won't be adequate in a fully-threaded - * model where comments can have sub-threads. That would require some massive sorting - * to get all the feed items into a mostly linear ordering, and might still require - * recursion. - */ -function consume_feed($xml, $importer, &$contact, $pass = 0) { - - require_once('library/simplepie/simplepie.inc'); - - if(! strlen($xml)) { - logger('consume_feed: empty input'); - return; - } - - $sys_expire = intval(get_config('system','default_expire_days')); - $chn_expire = intval($importer['channel_expire_days']); - - $expire_days = $sys_expire; - - if(($chn_expire != 0) && ($chn_expire < $sys_expire)) - $expire_days = $chn_expire; - - // logger('expire_days: ' . $expire_days); - - $feed = new SimplePie(); - $feed->set_raw_data($xml); - $feed->init(); - - if($feed->error()) - logger('consume_feed: Error parsing XML: ' . $feed->error()); - - $permalink = $feed->get_permalink(); - - // Check at the feed level for updated contact name and/or photo - - // process any deleted entries - - $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 = $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'); - } - - if($deleted && is_array($contact)) { - $r = q("SELECT * from item where mid = '%s' and author_xchan = '%s' and uid = %d limit 1", - dbesc(base64url_encode($mid)), - dbesc($contact['xchan_hash']), - intval($importer['channel_id']) - ); - - if($r) { - $item = $r[0]; - - if(! intval($item['item_deleted'])) { - logger('consume_feed: deleting item ' . $item['id'] . ' mid=' . base64url_decode($item['mid']), LOGGER_DEBUG); - drop_item($item['id'],false); - } - } - } - } - } - - // Now process the feed - - if($feed->get_item_quantity()) { - - logger('consume_feed: feed item count = ' . $feed->get_item_quantity(), LOGGER_DEBUG); - - $items = $feed->get_items(); - - foreach($items as $item) { - - $is_reply = false; - $item_id = base64url_encode($item->get_id()); - - logger('consume_feed: processing ' . $item_id, LOGGER_DEBUG); - - $rawthread = $item->get_item_tags( NAMESPACE_THREAD,'in-reply-to'); - if(isset($rawthread[0]['attribs']['']['ref'])) { - $is_reply = true; - $parent_mid = base64url_encode($rawthread[0]['attribs']['']['ref']); - } - - if($is_reply) { - - if($pass == 1) - continue; - - // Have we seen it? If not, import it. - - $item_id = base64url_encode($item->get_id()); - $author = array(); - $datarray = get_atom_elements($feed,$item,$author); - - if($contact['xchan_network'] === 'rss') { - $datarray['public_policy'] = 'specific'; - $datarray['comment_policy'] = 'none'; - } - - if((! x($author,'author_name')) || ($author['author_is_feed'])) - $author['author_name'] = $contact['xchan_name']; - if((! x($author,'author_link')) || ($author['author_is_feed'])) - $author['author_link'] = $contact['xchan_url']; - if((! x($author,'author_photo'))|| ($author['author_is_feed'])) - $author['author_photo'] = $contact['xchan_photo_m']; - - $datarray['author_xchan'] = ''; - - if($author['author_link'] != $contact['xchan_url']) { - $x = import_author_unknown(array('name' => $author['author_name'],'url' => $author['author_link'],'photo' => array('src' => $author['author_photo']))); - if($x) - $datarray['author_xchan'] = $x; - } - if(! $datarray['author_xchan']) - $datarray['author_xchan'] = $contact['xchan_hash']; - - $datarray['owner_xchan'] = $contact['xchan_hash']; - - $r = q("SELECT edited FROM item WHERE mid = '%s' AND uid = %d LIMIT 1", - dbesc($item_id), - intval($importer['channel_id']) - ); - - - // Update content if 'updated' changes - - if($r) { - if((x($datarray,'edited') !== false) - && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) { - - // do not accept (ignore) an earlier edit than one we currently have. - if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited']) - continue; - - update_feed_item($importer['channel_id'],$datarray); - } - continue; - } - - $datarray['parent_mid'] = $parent_mid; - $datarray['aid'] = $importer['channel_account_id']; - $datarray['uid'] = $importer['channel_id']; - - logger('consume_feed: ' . print_r($datarray,true),LOGGER_DATA); - - $xx = item_store($datarray); - $r = $xx['item_id']; - continue; - } - else { - - // Head post of a conversation. Have we seen it? If not, import it. - - $item_id = base64url_encode($item->get_id()); - $author = array(); - $datarray = get_atom_elements($feed,$item,$author); - - if($contact['xchan_network'] === 'rss') { - $datarray['public_policy'] = 'specific'; - $datarray['comment_policy'] = 'none'; - } - - - if(is_array($contact)) { - if((! x($author,'author_name')) || ($author['author_is_feed'])) - $author['author_name'] = $contact['xchan_name']; - if((! x($author,'author_link')) || ($author['author_is_feed'])) - $author['author_link'] = $contact['xchan_url']; - if((! x($author,'author_photo'))|| ($author['author_is_feed'])) - $author['author_photo'] = $contact['xchan_photo_m']; - } - - if((! x($author,'author_name')) || (! x($author,'author_link'))) { - logger('consume_feed: no author information! ' . print_r($author,true)); - continue; - } - - $datarray['author_xchan'] = ''; - - if(activity_match($datarray['verb'],ACTIVITY_FOLLOW) && $datarray['obj_type'] === ACTIVITY_OBJ_PERSON) { - $cb = array('item' => $datarray,'channel' => $importer, 'xchan' => null, 'author' => $author, 'caught' => false); - call_hooks('follow_from_feed',$cb); - if($cb['caught']) { - if($cb['return_code']) - http_status_exit($cb['return_code']); - continue; - } - } - - if($author['author_link'] != $contact['xchan_url']) { - $x = import_author_unknown(array('name' => $author['author_name'],'url' => $author['author_link'],'photo' => array('src' => $author['author_photo']))); - if($x) - $datarray['author_xchan'] = $x; - } - if(! $datarray['author_xchan']) - $datarray['author_xchan'] = $contact['xchan_hash']; - - $datarray['owner_xchan'] = $contact['xchan_hash']; - - if(array_key_exists('created',$datarray) && $datarray['created'] != NULL_DATE && $expire_days) { - $t1 = $datarray['created']; - $t2 = datetime_convert('UTC','UTC','now - ' . $expire_days . 'days'); - if($t1 < $t2) { - logger('feed content older than expiration. Ignoring.', LOGGER_DEBUG, LOG_INFO); - continue; - } - } - - - - $r = q("SELECT edited FROM item WHERE mid = '%s' AND uid = %d LIMIT 1", - dbesc($item_id), - intval($importer['channel_id']) - ); - - // Update content if 'updated' changes - - if($r) { - if((x($datarray,'edited') !== false) - && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) { - - // do not accept (ignore) an earlier edit than one we currently have. - if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited']) - continue; - - update_feed_item($importer['channel_id'],$datarray); - } - - continue; - } - - $datarray['parent_mid'] = $item_id; - $datarray['uid'] = $importer['channel_id']; - $datarray['aid'] = $importer['channel_account_id']; - - if(! link_compare($author['owner_link'],$contact['xchan_url'])) { - logger('consume_feed: Correcting item owner.', LOGGER_DEBUG); - $author['owner_name'] = $contact['name']; - $author['owner_link'] = $contact['url']; - $author['owner_avatar'] = $contact['thumb']; - } - - if(! post_is_importable($datarray,$contact)) - continue; - - logger('consume_feed: author ' . print_r($author,true),LOGGER_DEBUG); - - logger('consume_feed: ' . print_r($datarray,true),LOGGER_DATA); - - $xx = item_store($datarray); - $r = $xx['item_id']; - continue; - } - } - } -} - - -/** - * @brief Process atom feed and return the first post and structure - * - * @param array $xml - * The (atom) feed to consume - RSS isn't as fully supported but may work for simple feeds. - * @param $importer - * The contact_record (joined to user_record) of the local user who owns this - * relationship. It is this person's stuff that is going to be updated. - */ - -function process_salmon_feed($xml, $importer) { - - $ret = array(); - - require_once('library/simplepie/simplepie.inc'); - - if(! strlen($xml)) { - logger('process_feed: empty input'); - return; - } - - $feed = new SimplePie(); - $feed->set_raw_data($xml); - $feed->init(); - - if($feed->error()) - logger('Error parsing XML: ' . $feed->error()); - - $permalink = $feed->get_permalink(); - - if($feed->get_item_quantity()) { - - // this should be exactly one - - logger('feed item count = ' . $feed->get_item_quantity(), LOGGER_DEBUG); - - $items = $feed->get_items(); - - foreach($items as $item) { - - $item_id = base64url_encode($item->get_id()); - - logger('processing ' . $item_id, LOGGER_DEBUG); - - $rawthread = $item->get_item_tags( NAMESPACE_THREAD,'in-reply-to'); - if(isset($rawthread[0]['attribs']['']['ref'])) { - $is_reply = true; - $parent_mid = base64url_encode($rawthread[0]['attribs']['']['ref']); - } - - if($is_reply) - $ret['parent_mid'] = $parent_mid; - - $ret['author'] = array(); - - $datarray = get_atom_elements($feed,$item,$ret['author']); - - // reset policies which are restricted by default for RSS connections - // This item is likely coming from GNU-social via salmon and allows public interaction - $datarray['public_policy'] = ''; - $datarray['comment_policy'] = ''; - - $ret['item'] = $datarray; - } - } - - return $ret; -} - -/* - * Given an xml (atom) feed, find author and hub links - */ - - -function feed_meta($xml) { - require_once('library/simplepie/simplepie.inc'); - - $ret = array(); - - if(! strlen($xml)) { - logger('empty input'); - return $ret; - } - - $feed = new SimplePie(); - $feed->set_raw_data($xml); - $feed->init(); - - if($feed->error()) { - logger('Error parsing XML: ' . $feed->error()); - return $ret; - } - - $ret['hubs'] = $feed->get_links('hub'); - -// logger('consume_feed: hubs: ' . print_r($hubs,true), LOGGER_DATA); - - $author = array(); - - $found_author = $feed->get_author(); - if($found_author) { - $author['author_name'] = unxmlify($found_author->get_name()); - $author['author_link'] = unxmlify($found_author->get_link()); - - $rawauthor = $feed->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'author'); - logger('rawauthor: ' . print_r($rawauthor,true)); - - if($rawauthor) { - if($rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) { - $base = $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']; - foreach($base as $link) { - if(!x($author, 'author_photo') || ! $author['author_photo']) { - if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar') { - $author['author_photo'] = unxmlify($link['attribs']['']['href']); - break; - } - } - } - } - if($rawauthor[0]['child'][NAMESPACE_POCO]['displayName'][0]['data']) - $author['full_name'] = unxmlify($rawauthor[0]['child'][NAMESPACE_POCO]['displayName'][0]['data']); - if($rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']) - $author['author_uri'] = unxmlify($rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']); - - } - } - - if(substr($author['author_link'],-1,1) == '/') - $author['author_link'] = substr($author['author_link'],0,-1); - - $ret['author'] = $author; - - return $ret; -} - - - -function update_feed_item($uid,$datarray) { - logger('update_feed_item: not implemented! ' . $uid . ' ' . print_r($datarray,true), LOGGER_DATA); -} - - -function handle_feed($uid,$abook_id,$url) { - - require_once('include/Contact.php'); - $channel = channelx_by_n($uid); - if(! $channel) - return; - - $x = q("select * from abook left join xchan on abook_xchan = xchan_hash where abook_id = %d and abook_channel = %d limit 1", - dbesc($abook_id), - intval($uid) - ); - - $recurse = 0; - $z = z_fetch_url($url,false,$recurse,array('novalidate' => true)); - -//logger('handle_feed:' . print_r($z,true)); - - if($z['success']) { - consume_feed($z['body'],$channel,$x[0],1); - consume_feed($z['body'],$channel,$x[0],2); - } -} - - -function atom_author($tag,$name,$uri,$h,$w,$type,$photo) { - $o = ''; - if(! $tag) - return $o; - - $name = xmlify($name); - $uri = xmlify($uri); - $h = intval($h); - $w = intval($w); - $photo = xmlify($photo); - - $o .= "<$tag>\r\n"; - $o .= "$name\r\n"; - $o .= "$uri\r\n"; - $o .= '' . "\r\n"; - $o .= '' . "\r\n"; - - call_hooks('atom_author', $o); - - $o .= "\r\n"; - - return $o; -} - -function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) { - - if(! $item['parent']) - return; - - if($item['deleted']) - return '' . "\r\n"; - - - create_export_photo_body($item); - - if($item['allow_cid'] || $item['allow_gid'] || $item['deny_cid'] || $item['deny_gid']) - $body = fix_private_photos($item['body'],$owner['uid'],$item,$cid); - else - $body = $item['body']; - - $o = "\r\n\r\n\r\n"; - - if(is_array($author)) - $o .= atom_author('author',$author['xchan_name'],$author['xchan_url'],80,80,$author['xchan_photo_mimetype'],$author['xchan_photo_m']); - else - $o .= atom_author('author',$item['author']['xchan_name'],$item['author']['xchan_url'],80,80,$item['author']['xchan_photo_mimetype'], $item['author']['xchan_photo_m']); - - $o .= atom_author('zot:owner',$item['owner']['xchan_name'],$item['owner']['xchan_url'],80,80,$item['owner']['xchan_photo_mimetype'],$item['owner']['xchan_photo_m']); - - if(($item['parent'] != $item['id']) || ($item['parent_mid'] !== $item['mid']) || (($item['thr_parent'] !== '') && ($item['thr_parent'] !== $item['mid']))) { - $parent_item = (($item['thr_parent']) ? $item['thr_parent'] : $item['parent_mid']); - $o .= '' . "\r\n"; - } - - if(activity_match($item['obj_type'],ACTIVITY_OBJ_EVENT) && activity_match($item['verb'],ACTIVITY_POST)) { - $obj = ((is_array($item['obj'])) ? $item['object'] : json_decode($item['object'],true)); - - $o .= '' . xmlify($item['title']) . '' . "\r\n"; - $o .= '' . xmlify(bbcode($obj['title'])) . '' . "\r\n"; - $o .= '' . datetime_convert('UTC','UTC', $obj['start'],'Ymd\\THis' . (($obj['adjust']) ? '\\Z' : '')) . '' . "\r\n"; - $o .= '' . datetime_convert('UTC','UTC', $obj['finish'],'Ymd\\THis' . (($obj['adjust']) ? '\\Z' : '')) . '' . "\r\n"; - $o .= '' . xmlify(bbcode($obj['location'])) . '' . "\r\n"; - $o .= '' . xmlify(bbcode($obj['description'])) . '' . "\r\n"; - } - else { - $o .= '' . xmlify($item['title']) . '' . "\r\n"; - $o .= '' . xmlify(prepare_text($body,$item['mimetype'])) . '' . "\r\n"; - } - - $o .= '' . z_root() . '/display/' . xmlify($item['mid']) . '' . "\r\n"; - $o .= '' . xmlify(datetime_convert('UTC','UTC',$item['created'] . '+00:00',ATOM_TIME)) . '' . "\r\n"; - $o .= '' . xmlify(datetime_convert('UTC','UTC',$item['edited'] . '+00:00',ATOM_TIME)) . '' . "\r\n"; - - $o .= '' . "\r\n"; - - if($item['location']) { - $o .= '' . xmlify($item['location']) . '' . "\r\n"; - $o .= '' . xmlify($item['location']) . '' . "\r\n"; - } - - if($item['coord']) - $o .= '' . xmlify($item['coord']) . '' . "\r\n"; - - if(($item['item_private']) || strlen($item['allow_cid']) || strlen($item['allow_gid']) || strlen($item['deny_cid']) || strlen($item['deny_gid'])) - $o .= '' . (($item['item_private']) ? $item['item_private'] : 1) . '' . "\r\n"; - - if($item['app']) - $o .= '' . "\r\n"; - - $verb = construct_verb($item); - $o .= '' . xmlify($verb) . '' . "\r\n"; - $actobj = construct_activity_object($item); - if(strlen($actobj)) - $o .= $actobj; - $actarg = construct_activity_target($item); - if(strlen($actarg)) - $o .= $actarg; - - // FIXME -// $tags = item_getfeedtags($item); -// if(count($tags)) { -// foreach($tags as $t) { -// $o .= '' . "\r\n"; -// } -// } - -// FIXME -// $o .= item_getfeedattach($item); - -// $mentioned = get_mentions($item,$tags); -// if($mentioned) -// $o .= $mentioned; - - call_hooks('atom_entry', $o); - - $o .= '' . "\r\n"; - - return $o; -} function fix_private_photos($s, $uid, $item = null, $cid = 0) { @@ -5471,90 +4246,6 @@ function comment_local_origin($item) { } -function gen_asld($items) { - $ret = array(); - if(! $items) - return $ret; - foreach($items as $item) { - $ret[] = i2asld($item); - } - return $ret; -} - - -function i2asld($i) { - - if(! $i) - return array(); - - $ret = array(); - - $ret['@context'] = array( 'http://www.w3.org/ns/activitystreams', 'zot' => 'http://purl.org/zot/protocol'); - - if($i['verb']) { - if(strpos(dirname($i['verb'],'activitystrea.ms/schema/1.0'))) { - $ret['@type'] = ucfirst(basename($i['verb'])); - } - elseif(strpos(dirname($i['verb'],'purl.org/zot'))) { - $ret['@type'] = 'zot:' . ucfirst(basename($i['verb'])); - } - } - $ret['@id'] = $i['plink']; - - $ret['published'] = datetime_convert('UTC','UTC',$i['created'],ATOM_TIME); - - // we need to pass the parent into this -// if($i['id'] != $i['parent'] && $i['obj_type'] === ACTIVITY_OBJ_NOTE) { -// $ret['inReplyTo'] = asencode_note -// } - - if($i['obj_type'] === ACTIVITY_OBJ_NOTE) - $ret['object'] = asencode_note($i); - - - $ret['actor'] = asencode_person($i['author']); - - - return $ret; - -} - -function asencode_note($i) { - - $ret = array(); - - $ret['@type'] = 'Note'; - $ret['@id'] = $i['plink']; - if($i['title']) - $ret['title'] = bbcode($i['title']); - $ret['content'] = bbcode($i['body']); - $ret['zot:owner'] = asencode_person($i['owner']); - $ret['published'] = datetime_convert('UTC','UTC',$i['created'],ATOM_TIME); - if($i['created'] !== $i['edited']) - $ret['updated'] = datetime_convert('UTC','UTC',$i['edited'],ATOM_TIME); - - return $ret; -} - - -function asencode_person($p) { - $ret = array(); - $ret['@type'] = 'Person'; - $ret['@id'] = 'acct:' . $p['xchan_addr']; - $ret['displayName'] = $p['xchan_name']; - $ret['icon'] = array( - '@type' => 'Link', - 'mediaType' => $p['xchan_photo_mimetype'], - 'href' => $p['xchan_photo_m'] - ); - $ret['url'] = array( - '@type' => 'Link', - 'mediaType' => 'text/html', - 'href' => $p['xchan_url'] - ); - - return $ret; -} function send_profile_photo_activity($channel,$photo,$profile) { From 2f222546da869b904f076ec17e785470b06af770 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Thu, 12 May 2016 21:18:34 -0700 Subject: [PATCH 08/29] Comanche: provide a variable '$region' which can be used within a layout to make content aware of where it is on the page. For instance this can be passed as a variable to a widget and trigger either a vertical or horizontal layout depending on which region it is assigned to. --- Zotlabs/Render/Comanche.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Zotlabs/Render/Comanche.php b/Zotlabs/Render/Comanche.php index 776874e35..1017ec6aa 100644 --- a/Zotlabs/Render/Comanche.php +++ b/Zotlabs/Render/Comanche.php @@ -8,7 +8,6 @@ require_once('include/widgets.php'); - class Comanche { @@ -95,7 +94,7 @@ class Comanche { $cnt = preg_match_all("/\[region=(.*?)\](.*?)\[\/region\]/ism", $s, $matches, PREG_SET_ORDER); if($cnt) { foreach($matches as $mtch) { - \App::$layout['region_' . $mtch[1]] = $this->region($mtch[2]); + \App::$layout['region_' . $mtch[1]] = $this->region($mtch[2],$mtch[1]); } } } @@ -320,7 +319,9 @@ class Comanche { } - function region($s) { + function region($s,$region_name) { + + $s = str_replace('$region',$region_name,$s); $matches = array(); From 269055e71c3959bd769133f23b033bcbefee27ce Mon Sep 17 00:00:00 2001 From: redmatrix Date: Fri, 13 May 2016 00:27:38 -0700 Subject: [PATCH 09/29] strings update --- util/hmessages.po | 3700 +++++++++++++++++++++++---------------------- 1 file changed, 1881 insertions(+), 1819 deletions(-) diff --git a/util/hmessages.po b/util/hmessages.po index 8b3d88f07..3dd812ae3 100644 --- a/util/hmessages.po +++ b/util/hmessages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-06 00:01-0700\n" +"POT-Creation-Date: 2016-05-13 00:02-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -21,7 +21,7 @@ msgstr "" msgid "parent" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:131 ../../include/text.php:2635 +#: ../../Zotlabs/Storage/Browser.php:131 ../../include/text.php:2632 msgid "Collection" msgstr "" @@ -45,16 +45,16 @@ msgstr "" msgid "Schedule Outbox" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:164 ../../Zotlabs/Module/Photos.php:797 -#: ../../Zotlabs/Module/Photos.php:1242 ../../include/apps.php:441 -#: ../../include/apps.php:516 ../../include/widgets.php:1506 -#: ../../include/conversation.php:1037 +#: ../../Zotlabs/Storage/Browser.php:164 ../../Zotlabs/Module/Photos.php:798 +#: ../../Zotlabs/Module/Photos.php:1243 ../../include/widgets.php:1506 +#: ../../include/conversation.php:1037 ../../include/apps.php:441 +#: ../../include/apps.php:516 msgid "Unknown" msgstr "" #: ../../Zotlabs/Storage/Browser.php:226 ../../Zotlabs/Module/Fbrowser.php:85 -#: ../../include/apps.php:167 ../../include/conversation.php:1649 -#: ../../include/nav.php:93 +#: ../../include/nav.php:93 ../../include/conversation.php:1645 +#: ../../include/apps.php:167 msgid "Files" msgstr "" @@ -67,22 +67,22 @@ msgid "Shared" msgstr "" #: ../../Zotlabs/Storage/Browser.php:230 ../../Zotlabs/Storage/Browser.php:303 -#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Layouts.php:182 +#: ../../Zotlabs/Module/Blocks.php:156 ../../Zotlabs/Module/Layouts.php:182 #: ../../Zotlabs/Module/Menu.php:118 ../../Zotlabs/Module/New_channel.php:142 -#: ../../Zotlabs/Module/Webpages.php:188 +#: ../../Zotlabs/Module/Webpages.php:186 msgid "Create" msgstr "" #: ../../Zotlabs/Storage/Browser.php:231 ../../Zotlabs/Storage/Browser.php:305 #: ../../Zotlabs/Module/Cover_photo.php:357 -#: ../../Zotlabs/Module/Photos.php:824 ../../Zotlabs/Module/Photos.php:1366 +#: ../../Zotlabs/Module/Photos.php:825 ../../Zotlabs/Module/Photos.php:1367 #: ../../Zotlabs/Module/Profile_photo.php:368 ../../include/widgets.php:1519 msgid "Upload" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:235 ../../Zotlabs/Module/Admin.php:1180 -#: ../../Zotlabs/Module/Chat.php:245 ../../Zotlabs/Module/Settings.php:590 -#: ../../Zotlabs/Module/Settings.php:616 +#: ../../Zotlabs/Storage/Browser.php:235 ../../Zotlabs/Module/Admin.php:1208 +#: ../../Zotlabs/Module/Chat.php:245 ../../Zotlabs/Module/Settings.php:592 +#: ../../Zotlabs/Module/Settings.php:618 #: ../../Zotlabs/Module/Sharedwithme.php:99 msgid "Name" msgstr "" @@ -101,35 +101,35 @@ msgstr "" msgid "Last Modified" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:240 ../../Zotlabs/Module/Admin.php:1796 -#: ../../Zotlabs/Module/Blocks.php:159 +#: ../../Zotlabs/Storage/Browser.php:240 ../../Zotlabs/Module/Admin.php:2075 +#: ../../Zotlabs/Module/Blocks.php:157 #: ../../Zotlabs/Module/Connections.php:290 #: ../../Zotlabs/Module/Connections.php:310 -#: ../../Zotlabs/Module/Editblock.php:136 +#: ../../Zotlabs/Module/Editblock.php:109 #: ../../Zotlabs/Module/Editlayout.php:113 #: ../../Zotlabs/Module/Editpost.php:84 -#: ../../Zotlabs/Module/Editwebpage.php:181 +#: ../../Zotlabs/Module/Editwebpage.php:146 #: ../../Zotlabs/Module/Layouts.php:190 ../../Zotlabs/Module/Menu.php:112 -#: ../../Zotlabs/Module/Settings.php:650 ../../Zotlabs/Module/Thing.php:260 -#: ../../Zotlabs/Module/Webpages.php:189 ../../include/identity.php:937 -#: ../../include/identity.php:941 ../../include/apps.php:291 -#: ../../include/ItemObject.php:100 ../../include/menu.php:108 -#: ../../include/page_widgets.php:8 ../../include/page_widgets.php:36 +#: ../../Zotlabs/Module/Settings.php:652 ../../Zotlabs/Module/Thing.php:260 +#: ../../Zotlabs/Module/Webpages.php:187 ../../include/identity.php:937 +#: ../../include/identity.php:941 ../../include/ItemObject.php:100 +#: ../../include/menu.php:108 ../../include/page_widgets.php:8 +#: ../../include/page_widgets.php:36 ../../include/apps.php:291 msgid "Edit" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:241 ../../Zotlabs/Module/Admin.php:1015 -#: ../../Zotlabs/Module/Admin.php:1174 ../../Zotlabs/Module/Admin.php:1797 -#: ../../Zotlabs/Module/Blocks.php:161 +#: ../../Zotlabs/Storage/Browser.php:241 ../../Zotlabs/Module/Admin.php:1043 +#: ../../Zotlabs/Module/Admin.php:1202 ../../Zotlabs/Module/Admin.php:2076 +#: ../../Zotlabs/Module/Blocks.php:159 #: ../../Zotlabs/Module/Connections.php:263 #: ../../Zotlabs/Module/Connedit.php:573 -#: ../../Zotlabs/Module/Editblock.php:176 +#: ../../Zotlabs/Module/Editblock.php:134 #: ../../Zotlabs/Module/Editlayout.php:136 -#: ../../Zotlabs/Module/Editwebpage.php:221 ../../Zotlabs/Module/Group.php:177 -#: ../../Zotlabs/Module/Photos.php:1172 ../../Zotlabs/Module/Settings.php:651 -#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Module/Webpages.php:191 -#: ../../include/apps.php:292 ../../include/ItemObject.php:120 -#: ../../include/conversation.php:657 +#: ../../Zotlabs/Module/Editwebpage.php:170 ../../Zotlabs/Module/Group.php:177 +#: ../../Zotlabs/Module/Photos.php:1173 ../../Zotlabs/Module/Settings.php:653 +#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Module/Webpages.php:189 +#: ../../include/ItemObject.php:120 ../../include/conversation.php:657 +#: ../../include/apps.php:292 msgid "Delete" msgstr "" @@ -160,24 +160,24 @@ msgstr "" #: ../../Zotlabs/Module/Appman.php:74 ../../Zotlabs/Module/Authtest.php:16 #: ../../Zotlabs/Module/Block.php:26 ../../Zotlabs/Module/Block.php:76 #: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80 -#: ../../Zotlabs/Module/Bookmarks.php:61 ../../Zotlabs/Module/Channel.php:104 -#: ../../Zotlabs/Module/Channel.php:224 ../../Zotlabs/Module/Channel.php:264 +#: ../../Zotlabs/Module/Bookmarks.php:61 ../../Zotlabs/Module/Channel.php:105 +#: ../../Zotlabs/Module/Channel.php:225 ../../Zotlabs/Module/Channel.php:265 #: ../../Zotlabs/Module/Chat.php:98 ../../Zotlabs/Module/Chat.php:103 #: ../../Zotlabs/Module/Common.php:39 ../../Zotlabs/Module/Connections.php:33 #: ../../Zotlabs/Module/Connedit.php:366 #: ../../Zotlabs/Module/Cover_photo.php:277 #: ../../Zotlabs/Module/Cover_photo.php:290 -#: ../../Zotlabs/Module/Editblock.php:66 +#: ../../Zotlabs/Module/Editblock.php:67 #: ../../Zotlabs/Module/Editlayout.php:67 #: ../../Zotlabs/Module/Editlayout.php:90 ../../Zotlabs/Module/Editpost.php:17 -#: ../../Zotlabs/Module/Editwebpage.php:68 +#: ../../Zotlabs/Module/Editwebpage.php:69 #: ../../Zotlabs/Module/Editwebpage.php:90 #: ../../Zotlabs/Module/Editwebpage.php:105 -#: ../../Zotlabs/Module/Editwebpage.php:129 -#: ../../Zotlabs/Module/Events.php:264 ../../Zotlabs/Module/Filestorage.php:22 -#: ../../Zotlabs/Module/Filestorage.php:77 -#: ../../Zotlabs/Module/Filestorage.php:92 -#: ../../Zotlabs/Module/Filestorage.php:119 +#: ../../Zotlabs/Module/Editwebpage.php:127 +#: ../../Zotlabs/Module/Events.php:265 ../../Zotlabs/Module/Filestorage.php:24 +#: ../../Zotlabs/Module/Filestorage.php:79 +#: ../../Zotlabs/Module/Filestorage.php:94 +#: ../../Zotlabs/Module/Filestorage.php:121 #: ../../Zotlabs/Module/Fsuggest.php:82 ../../Zotlabs/Module/Group.php:13 #: ../../Zotlabs/Module/Id.php:76 ../../Zotlabs/Module/Invite.php:17 #: ../../Zotlabs/Module/Invite.php:91 ../../Zotlabs/Module/Item.php:210 @@ -187,12 +187,12 @@ msgstr "" #: ../../Zotlabs/Module/Locs.php:87 ../../Zotlabs/Module/Mail.php:130 #: ../../Zotlabs/Module/Manage.php:10 ../../Zotlabs/Module/Menu.php:78 #: ../../Zotlabs/Module/Message.php:20 ../../Zotlabs/Module/Mitem.php:115 -#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Network.php:16 +#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Network.php:17 #: ../../Zotlabs/Module/New_channel.php:77 #: ../../Zotlabs/Module/New_channel.php:104 #: ../../Zotlabs/Module/Notifications.php:70 ../../Zotlabs/Module/Page.php:35 #: ../../Zotlabs/Module/Page.php:90 ../../Zotlabs/Module/Pdledit.php:26 -#: ../../Zotlabs/Module/Photos.php:74 ../../Zotlabs/Module/Poke.php:137 +#: ../../Zotlabs/Module/Photos.php:75 ../../Zotlabs/Module/Poke.php:137 #: ../../Zotlabs/Module/Profile.php:68 ../../Zotlabs/Module/Profile.php:76 #: ../../Zotlabs/Module/Profile_photo.php:256 #: ../../Zotlabs/Module/Profile_photo.php:269 @@ -200,16 +200,16 @@ msgstr "" #: ../../Zotlabs/Module/Rate.php:115 ../../Zotlabs/Module/Register.php:77 #: ../../Zotlabs/Module/Regmod.php:21 #: ../../Zotlabs/Module/Service_limits.php:11 -#: ../../Zotlabs/Module/Settings.php:570 ../../Zotlabs/Module/Setup.php:238 +#: ../../Zotlabs/Module/Settings.php:572 ../../Zotlabs/Module/Setup.php:238 #: ../../Zotlabs/Module/Sharedwithme.php:11 #: ../../Zotlabs/Module/Sources.php:74 ../../Zotlabs/Module/Suggest.php:30 #: ../../Zotlabs/Module/Thing.php:274 ../../Zotlabs/Module/Thing.php:294 #: ../../Zotlabs/Module/Thing.php:331 #: ../../Zotlabs/Module/Viewconnections.php:26 #: ../../Zotlabs/Module/Viewconnections.php:31 -#: ../../Zotlabs/Module/Viewsrc.php:18 ../../Zotlabs/Module/Webpages.php:73 +#: ../../Zotlabs/Module/Viewsrc.php:18 ../../Zotlabs/Module/Webpages.php:74 #: ../../include/photos.php:29 ../../include/chat.php:133 -#: ../../include/items.php:4705 ../../include/attach.php:141 +#: ../../include/items.php:3439 ../../include/attach.php:141 #: ../../include/attach.php:189 ../../include/attach.php:252 #: ../../include/attach.php:266 ../../include/attach.php:273 #: ../../include/attach.php:338 ../../include/attach.php:352 @@ -242,12 +242,12 @@ msgid "Welcome %s. Remote authentication successful." msgstr "" #: ../../Zotlabs/Module/Achievements.php:15 ../../Zotlabs/Module/Blocks.php:33 -#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Editblock.php:30 +#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Editblock.php:31 #: ../../Zotlabs/Module/Editlayout.php:31 -#: ../../Zotlabs/Module/Editwebpage.php:32 -#: ../../Zotlabs/Module/Filestorage.php:58 ../../Zotlabs/Module/Hcard.php:12 +#: ../../Zotlabs/Module/Editwebpage.php:33 +#: ../../Zotlabs/Module/Filestorage.php:60 ../../Zotlabs/Module/Hcard.php:12 #: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Profile.php:20 -#: ../../Zotlabs/Module/Webpages.php:33 ../../include/identity.php:837 +#: ../../Zotlabs/Module/Webpages.php:34 ../../include/identity.php:837 msgid "Requested profile is not available." msgstr "" @@ -263,183 +263,195 @@ msgstr "" msgid "RSS" msgstr "" -#: ../../Zotlabs/Module/Admin.php:58 +#: ../../Zotlabs/Module/Admin.php:77 msgid "Theme settings updated." msgstr "" -#: ../../Zotlabs/Module/Admin.php:145 ../../Zotlabs/Module/Admin.php:1211 -#: ../../Zotlabs/Module/Admin.php:1463 ../../Zotlabs/Module/Display.php:44 -#: ../../Zotlabs/Module/Filestorage.php:31 ../../Zotlabs/Module/Thing.php:89 -#: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:4626 +#: ../../Zotlabs/Module/Admin.php:164 ../../Zotlabs/Module/Admin.php:1239 +#: ../../Zotlabs/Module/Admin.php:1541 ../../Zotlabs/Module/Display.php:44 +#: ../../Zotlabs/Module/Filestorage.php:33 ../../Zotlabs/Module/Thing.php:89 +#: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:3360 msgid "Item not found." msgstr "" -#: ../../Zotlabs/Module/Admin.php:178 +#: ../../Zotlabs/Module/Admin.php:197 msgid "# Accounts" msgstr "" -#: ../../Zotlabs/Module/Admin.php:179 +#: ../../Zotlabs/Module/Admin.php:198 msgid "# blocked accounts" msgstr "" -#: ../../Zotlabs/Module/Admin.php:180 +#: ../../Zotlabs/Module/Admin.php:199 msgid "# expired accounts" msgstr "" -#: ../../Zotlabs/Module/Admin.php:181 +#: ../../Zotlabs/Module/Admin.php:200 msgid "# expiring accounts" msgstr "" -#: ../../Zotlabs/Module/Admin.php:192 +#: ../../Zotlabs/Module/Admin.php:211 msgid "# Channels" msgstr "" -#: ../../Zotlabs/Module/Admin.php:193 +#: ../../Zotlabs/Module/Admin.php:212 msgid "# primary" msgstr "" -#: ../../Zotlabs/Module/Admin.php:194 +#: ../../Zotlabs/Module/Admin.php:213 msgid "# clones" msgstr "" -#: ../../Zotlabs/Module/Admin.php:200 +#: ../../Zotlabs/Module/Admin.php:219 msgid "Message queues" msgstr "" -#: ../../Zotlabs/Module/Admin.php:216 ../../Zotlabs/Module/Admin.php:462 -#: ../../Zotlabs/Module/Admin.php:683 ../../Zotlabs/Module/Admin.php:727 -#: ../../Zotlabs/Module/Admin.php:1006 ../../Zotlabs/Module/Admin.php:1170 -#: ../../Zotlabs/Module/Admin.php:1285 ../../Zotlabs/Module/Admin.php:1348 -#: ../../Zotlabs/Module/Admin.php:1514 ../../Zotlabs/Module/Admin.php:1548 -#: ../../Zotlabs/Module/Admin.php:1633 +#: ../../Zotlabs/Module/Admin.php:236 +msgid "Your software should be updated" +msgstr "" + +#: ../../Zotlabs/Module/Admin.php:241 ../../Zotlabs/Module/Admin.php:490 +#: ../../Zotlabs/Module/Admin.php:711 ../../Zotlabs/Module/Admin.php:755 +#: ../../Zotlabs/Module/Admin.php:1034 ../../Zotlabs/Module/Admin.php:1198 +#: ../../Zotlabs/Module/Admin.php:1313 ../../Zotlabs/Module/Admin.php:1403 +#: ../../Zotlabs/Module/Admin.php:1592 ../../Zotlabs/Module/Admin.php:1626 +#: ../../Zotlabs/Module/Admin.php:1711 msgid "Administration" msgstr "" -#: ../../Zotlabs/Module/Admin.php:217 +#: ../../Zotlabs/Module/Admin.php:242 msgid "Summary" msgstr "" -#: ../../Zotlabs/Module/Admin.php:220 +#: ../../Zotlabs/Module/Admin.php:245 msgid "Registered accounts" msgstr "" -#: ../../Zotlabs/Module/Admin.php:221 ../../Zotlabs/Module/Admin.php:687 +#: ../../Zotlabs/Module/Admin.php:246 ../../Zotlabs/Module/Admin.php:715 msgid "Pending registrations" msgstr "" -#: ../../Zotlabs/Module/Admin.php:222 +#: ../../Zotlabs/Module/Admin.php:247 msgid "Registered channels" msgstr "" -#: ../../Zotlabs/Module/Admin.php:223 ../../Zotlabs/Module/Admin.php:688 +#: ../../Zotlabs/Module/Admin.php:248 ../../Zotlabs/Module/Admin.php:716 msgid "Active plugins" msgstr "" -#: ../../Zotlabs/Module/Admin.php:224 +#: ../../Zotlabs/Module/Admin.php:249 msgid "Version" msgstr "" -#: ../../Zotlabs/Module/Admin.php:345 +#: ../../Zotlabs/Module/Admin.php:250 +msgid "Repository version (master)" +msgstr "" + +#: ../../Zotlabs/Module/Admin.php:251 +msgid "Repository version (dev)" +msgstr "" + +#: ../../Zotlabs/Module/Admin.php:373 msgid "Site settings updated." msgstr "" -#: ../../Zotlabs/Module/Admin.php:372 ../../include/text.php:2856 +#: ../../Zotlabs/Module/Admin.php:400 ../../include/text.php:2853 msgid "Default" msgstr "" -#: ../../Zotlabs/Module/Admin.php:382 ../../Zotlabs/Module/Settings.php:796 +#: ../../Zotlabs/Module/Admin.php:410 ../../Zotlabs/Module/Settings.php:798 msgid "mobile" msgstr "" -#: ../../Zotlabs/Module/Admin.php:384 +#: ../../Zotlabs/Module/Admin.php:412 msgid "experimental" msgstr "" -#: ../../Zotlabs/Module/Admin.php:386 +#: ../../Zotlabs/Module/Admin.php:414 msgid "unsupported" msgstr "" -#: ../../Zotlabs/Module/Admin.php:431 ../../Zotlabs/Module/Api.php:89 +#: ../../Zotlabs/Module/Admin.php:459 ../../Zotlabs/Module/Api.php:89 #: ../../Zotlabs/Module/Connedit.php:379 ../../Zotlabs/Module/Connedit.php:657 -#: ../../Zotlabs/Module/Events.php:458 ../../Zotlabs/Module/Events.php:459 -#: ../../Zotlabs/Module/Events.php:468 -#: ../../Zotlabs/Module/Filestorage.php:155 -#: ../../Zotlabs/Module/Filestorage.php:163 ../../Zotlabs/Module/Menu.php:100 +#: ../../Zotlabs/Module/Events.php:459 ../../Zotlabs/Module/Events.php:460 +#: ../../Zotlabs/Module/Events.php:469 +#: ../../Zotlabs/Module/Filestorage.php:157 +#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Menu.php:100 #: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Mitem.php:158 #: ../../Zotlabs/Module/Mitem.php:159 ../../Zotlabs/Module/Mitem.php:232 -#: ../../Zotlabs/Module/Mitem.php:233 ../../Zotlabs/Module/Photos.php:665 +#: ../../Zotlabs/Module/Mitem.php:233 ../../Zotlabs/Module/Photos.php:666 #: ../../Zotlabs/Module/Profiles.php:651 ../../Zotlabs/Module/Removeme.php:64 -#: ../../Zotlabs/Module/Settings.php:579 ../../include/dir_fns.php:141 +#: ../../Zotlabs/Module/Settings.php:581 ../../include/dir_fns.php:141 #: ../../include/dir_fns.php:142 ../../include/dir_fns.php:143 #: ../../view/theme/redbasic/php/config.php:105 #: ../../view/theme/redbasic/php/config.php:130 ../../boot.php:1619 msgid "No" msgstr "" -#: ../../Zotlabs/Module/Admin.php:432 +#: ../../Zotlabs/Module/Admin.php:460 msgid "Yes - with approval" msgstr "" -#: ../../Zotlabs/Module/Admin.php:433 ../../Zotlabs/Module/Api.php:88 -#: ../../Zotlabs/Module/Connedit.php:379 ../../Zotlabs/Module/Events.php:458 -#: ../../Zotlabs/Module/Events.php:459 ../../Zotlabs/Module/Events.php:468 -#: ../../Zotlabs/Module/Filestorage.php:155 -#: ../../Zotlabs/Module/Filestorage.php:163 ../../Zotlabs/Module/Menu.php:100 +#: ../../Zotlabs/Module/Admin.php:461 ../../Zotlabs/Module/Api.php:88 +#: ../../Zotlabs/Module/Connedit.php:379 ../../Zotlabs/Module/Events.php:459 +#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:469 +#: ../../Zotlabs/Module/Filestorage.php:157 +#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Menu.php:100 #: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Mitem.php:158 #: ../../Zotlabs/Module/Mitem.php:159 ../../Zotlabs/Module/Mitem.php:232 -#: ../../Zotlabs/Module/Mitem.php:233 ../../Zotlabs/Module/Photos.php:665 +#: ../../Zotlabs/Module/Mitem.php:233 ../../Zotlabs/Module/Photos.php:666 #: ../../Zotlabs/Module/Profiles.php:651 ../../Zotlabs/Module/Removeme.php:64 -#: ../../Zotlabs/Module/Settings.php:579 ../../include/dir_fns.php:141 +#: ../../Zotlabs/Module/Settings.php:581 ../../include/dir_fns.php:141 #: ../../include/dir_fns.php:142 ../../include/dir_fns.php:143 #: ../../view/theme/redbasic/php/config.php:105 #: ../../view/theme/redbasic/php/config.php:130 ../../boot.php:1619 msgid "Yes" msgstr "" -#: ../../Zotlabs/Module/Admin.php:438 +#: ../../Zotlabs/Module/Admin.php:466 msgid "My site is not a public server" msgstr "" -#: ../../Zotlabs/Module/Admin.php:439 +#: ../../Zotlabs/Module/Admin.php:467 msgid "My site has paid access only" msgstr "" -#: ../../Zotlabs/Module/Admin.php:440 +#: ../../Zotlabs/Module/Admin.php:468 msgid "My site has free access only" msgstr "" -#: ../../Zotlabs/Module/Admin.php:441 +#: ../../Zotlabs/Module/Admin.php:469 msgid "My site offers free accounts with optional paid upgrades" msgstr "" -#: ../../Zotlabs/Module/Admin.php:463 ../../include/widgets.php:1383 +#: ../../Zotlabs/Module/Admin.php:491 ../../include/widgets.php:1383 msgid "Site" msgstr "" -#: ../../Zotlabs/Module/Admin.php:464 ../../Zotlabs/Module/Admin.php:660 -#: ../../Zotlabs/Module/Admin.php:743 ../../Zotlabs/Module/Admin.php:1008 -#: ../../Zotlabs/Module/Admin.php:1172 ../../Zotlabs/Module/Admin.php:1350 -#: ../../Zotlabs/Module/Admin.php:1550 ../../Zotlabs/Module/Admin.php:1635 -#: ../../Zotlabs/Module/Admin.php:1799 ../../Zotlabs/Module/Appman.php:125 +#: ../../Zotlabs/Module/Admin.php:492 ../../Zotlabs/Module/Admin.php:688 +#: ../../Zotlabs/Module/Admin.php:771 ../../Zotlabs/Module/Admin.php:1036 +#: ../../Zotlabs/Module/Admin.php:1200 ../../Zotlabs/Module/Admin.php:1405 +#: ../../Zotlabs/Module/Admin.php:1628 ../../Zotlabs/Module/Admin.php:1713 +#: ../../Zotlabs/Module/Admin.php:2078 ../../Zotlabs/Module/Appman.php:125 #: ../../Zotlabs/Module/Cal.php:341 ../../Zotlabs/Module/Chat.php:194 #: ../../Zotlabs/Module/Chat.php:236 ../../Zotlabs/Module/Connect.php:97 -#: ../../Zotlabs/Module/Connedit.php:734 ../../Zotlabs/Module/Events.php:472 -#: ../../Zotlabs/Module/Events.php:669 -#: ../../Zotlabs/Module/Filestorage.php:160 +#: ../../Zotlabs/Module/Connedit.php:734 ../../Zotlabs/Module/Events.php:475 +#: ../../Zotlabs/Module/Events.php:672 +#: ../../Zotlabs/Module/Filestorage.php:162 #: ../../Zotlabs/Module/Fsuggest.php:112 ../../Zotlabs/Module/Group.php:85 #: ../../Zotlabs/Module/Import.php:546 #: ../../Zotlabs/Module/Import_items.php:120 #: ../../Zotlabs/Module/Invite.php:146 ../../Zotlabs/Module/Locs.php:121 #: ../../Zotlabs/Module/Mail.php:384 ../../Zotlabs/Module/Mitem.php:235 #: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Pconfig.php:107 -#: ../../Zotlabs/Module/Pdledit.php:66 ../../Zotlabs/Module/Photos.php:676 -#: ../../Zotlabs/Module/Photos.php:1051 ../../Zotlabs/Module/Photos.php:1091 -#: ../../Zotlabs/Module/Photos.php:1209 ../../Zotlabs/Module/Poke.php:186 +#: ../../Zotlabs/Module/Pdledit.php:66 ../../Zotlabs/Module/Photos.php:677 +#: ../../Zotlabs/Module/Photos.php:1052 ../../Zotlabs/Module/Photos.php:1092 +#: ../../Zotlabs/Module/Photos.php:1210 ../../Zotlabs/Module/Poke.php:186 #: ../../Zotlabs/Module/Profiles.php:691 ../../Zotlabs/Module/Rate.php:172 -#: ../../Zotlabs/Module/Settings.php:588 ../../Zotlabs/Module/Settings.php:701 -#: ../../Zotlabs/Module/Settings.php:729 ../../Zotlabs/Module/Settings.php:752 -#: ../../Zotlabs/Module/Settings.php:840 -#: ../../Zotlabs/Module/Settings.php:1032 ../../Zotlabs/Module/Setup.php:335 +#: ../../Zotlabs/Module/Settings.php:590 ../../Zotlabs/Module/Settings.php:703 +#: ../../Zotlabs/Module/Settings.php:731 ../../Zotlabs/Module/Settings.php:754 +#: ../../Zotlabs/Module/Settings.php:842 +#: ../../Zotlabs/Module/Settings.php:1034 ../../Zotlabs/Module/Setup.php:335 #: ../../Zotlabs/Module/Setup.php:376 ../../Zotlabs/Module/Sources.php:114 #: ../../Zotlabs/Module/Sources.php:149 ../../Zotlabs/Module/Thing.php:316 #: ../../Zotlabs/Module/Thing.php:362 ../../Zotlabs/Module/Xchan.php:15 @@ -449,875 +461,928 @@ msgstr "" msgid "Submit" msgstr "" -#: ../../Zotlabs/Module/Admin.php:465 ../../Zotlabs/Module/Register.php:245 +#: ../../Zotlabs/Module/Admin.php:493 ../../Zotlabs/Module/Register.php:245 msgid "Registration" msgstr "" -#: ../../Zotlabs/Module/Admin.php:466 +#: ../../Zotlabs/Module/Admin.php:494 msgid "File upload" msgstr "" -#: ../../Zotlabs/Module/Admin.php:467 +#: ../../Zotlabs/Module/Admin.php:495 msgid "Policies" msgstr "" -#: ../../Zotlabs/Module/Admin.php:468 ../../include/contact_widgets.php:19 +#: ../../Zotlabs/Module/Admin.php:496 ../../include/contact_widgets.php:19 msgid "Advanced" msgstr "" -#: ../../Zotlabs/Module/Admin.php:472 +#: ../../Zotlabs/Module/Admin.php:500 msgid "Site name" msgstr "" -#: ../../Zotlabs/Module/Admin.php:473 +#: ../../Zotlabs/Module/Admin.php:501 msgid "Banner/Logo" msgstr "" -#: ../../Zotlabs/Module/Admin.php:474 +#: ../../Zotlabs/Module/Admin.php:502 msgid "Administrator Information" msgstr "" -#: ../../Zotlabs/Module/Admin.php:474 +#: ../../Zotlabs/Module/Admin.php:502 msgid "" "Contact information for site administrators. Displayed on siteinfo page. " "BBCode can be used here" msgstr "" -#: ../../Zotlabs/Module/Admin.php:475 +#: ../../Zotlabs/Module/Admin.php:503 msgid "System language" msgstr "" -#: ../../Zotlabs/Module/Admin.php:476 +#: ../../Zotlabs/Module/Admin.php:504 msgid "System theme" msgstr "" -#: ../../Zotlabs/Module/Admin.php:476 +#: ../../Zotlabs/Module/Admin.php:504 msgid "" "Default system theme - may be over-ridden by user profiles - change theme settings" msgstr "" -#: ../../Zotlabs/Module/Admin.php:477 +#: ../../Zotlabs/Module/Admin.php:505 msgid "Mobile system theme" msgstr "" -#: ../../Zotlabs/Module/Admin.php:477 +#: ../../Zotlabs/Module/Admin.php:505 msgid "Theme for mobile devices" msgstr "" -#: ../../Zotlabs/Module/Admin.php:479 +#: ../../Zotlabs/Module/Admin.php:507 msgid "Allow Feeds as Connections" msgstr "" -#: ../../Zotlabs/Module/Admin.php:479 +#: ../../Zotlabs/Module/Admin.php:507 msgid "(Heavy system resource usage)" msgstr "" -#: ../../Zotlabs/Module/Admin.php:480 +#: ../../Zotlabs/Module/Admin.php:508 msgid "Maximum image size" msgstr "" -#: ../../Zotlabs/Module/Admin.php:480 +#: ../../Zotlabs/Module/Admin.php:508 msgid "" "Maximum size in bytes of uploaded images. Default is 0, which means no " "limits." msgstr "" -#: ../../Zotlabs/Module/Admin.php:481 +#: ../../Zotlabs/Module/Admin.php:509 msgid "Does this site allow new member registration?" msgstr "" -#: ../../Zotlabs/Module/Admin.php:482 +#: ../../Zotlabs/Module/Admin.php:510 msgid "Invitation only" msgstr "" -#: ../../Zotlabs/Module/Admin.php:482 +#: ../../Zotlabs/Module/Admin.php:510 msgid "" "Only allow new member registrations with an invitation code. Above register " "policy must be set to Yes." msgstr "" -#: ../../Zotlabs/Module/Admin.php:483 +#: ../../Zotlabs/Module/Admin.php:511 msgid "Which best describes the types of account offered by this hub?" msgstr "" -#: ../../Zotlabs/Module/Admin.php:484 +#: ../../Zotlabs/Module/Admin.php:512 msgid "Register text" msgstr "" -#: ../../Zotlabs/Module/Admin.php:484 +#: ../../Zotlabs/Module/Admin.php:512 msgid "Will be displayed prominently on the registration page." msgstr "" -#: ../../Zotlabs/Module/Admin.php:485 +#: ../../Zotlabs/Module/Admin.php:513 msgid "Site homepage to show visitors (default: login box)" msgstr "" -#: ../../Zotlabs/Module/Admin.php:485 +#: ../../Zotlabs/Module/Admin.php:513 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.php:486 +#: ../../Zotlabs/Module/Admin.php:514 msgid "Preserve site homepage URL" msgstr "" -#: ../../Zotlabs/Module/Admin.php:486 +#: ../../Zotlabs/Module/Admin.php:514 msgid "" "Present the site homepage in a frame at the original location instead of " "redirecting" msgstr "" -#: ../../Zotlabs/Module/Admin.php:487 +#: ../../Zotlabs/Module/Admin.php:515 msgid "Accounts abandoned after x days" msgstr "" -#: ../../Zotlabs/Module/Admin.php:487 +#: ../../Zotlabs/Module/Admin.php:515 msgid "" "Will not waste system resources polling external sites for abandonded " "accounts. Enter 0 for no time limit." msgstr "" -#: ../../Zotlabs/Module/Admin.php:488 +#: ../../Zotlabs/Module/Admin.php:516 msgid "Allowed friend domains" msgstr "" -#: ../../Zotlabs/Module/Admin.php:488 +#: ../../Zotlabs/Module/Admin.php:516 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.php:489 +#: ../../Zotlabs/Module/Admin.php:517 msgid "Allowed email domains" msgstr "" -#: ../../Zotlabs/Module/Admin.php:489 +#: ../../Zotlabs/Module/Admin.php:517 msgid "" "Comma separated list of domains which are allowed in email addresses for " "registrations to this site. Wildcards are accepted. Empty to allow any " "domains" msgstr "" -#: ../../Zotlabs/Module/Admin.php:490 +#: ../../Zotlabs/Module/Admin.php:518 msgid "Not allowed email domains" msgstr "" -#: ../../Zotlabs/Module/Admin.php:490 +#: ../../Zotlabs/Module/Admin.php:518 msgid "" "Comma separated list of domains which are not allowed in email addresses for " "registrations to this site. Wildcards are accepted. Empty to allow any " "domains, unless allowed domains have been defined." msgstr "" -#: ../../Zotlabs/Module/Admin.php:491 +#: ../../Zotlabs/Module/Admin.php:519 msgid "Verify Email Addresses" msgstr "" -#: ../../Zotlabs/Module/Admin.php:491 +#: ../../Zotlabs/Module/Admin.php:519 msgid "" "Check to verify email addresses used in account registration (recommended)." msgstr "" -#: ../../Zotlabs/Module/Admin.php:492 +#: ../../Zotlabs/Module/Admin.php:520 msgid "Force publish" msgstr "" -#: ../../Zotlabs/Module/Admin.php:492 +#: ../../Zotlabs/Module/Admin.php:520 msgid "" "Check to force all profiles on this site to be listed in the site directory." msgstr "" -#: ../../Zotlabs/Module/Admin.php:493 +#: ../../Zotlabs/Module/Admin.php:521 msgid "Import Public Streams" msgstr "" -#: ../../Zotlabs/Module/Admin.php:493 +#: ../../Zotlabs/Module/Admin.php:521 msgid "" "Import and allow access to public content pulled from other sites. Warning: " "this content is unmoderated." msgstr "" -#: ../../Zotlabs/Module/Admin.php:494 +#: ../../Zotlabs/Module/Admin.php:522 msgid "Login on Homepage" msgstr "" -#: ../../Zotlabs/Module/Admin.php:494 +#: ../../Zotlabs/Module/Admin.php:522 msgid "" "Present a login box to visitors on the home page if no other content has " "been configured." msgstr "" -#: ../../Zotlabs/Module/Admin.php:495 +#: ../../Zotlabs/Module/Admin.php:523 msgid "Enable context help" msgstr "" -#: ../../Zotlabs/Module/Admin.php:495 +#: ../../Zotlabs/Module/Admin.php:523 msgid "" "Display contextual help for the current page when the help button is pressed." msgstr "" -#: ../../Zotlabs/Module/Admin.php:497 +#: ../../Zotlabs/Module/Admin.php:525 msgid "Directory Server URL" msgstr "" -#: ../../Zotlabs/Module/Admin.php:497 +#: ../../Zotlabs/Module/Admin.php:525 msgid "Default directory server" msgstr "" -#: ../../Zotlabs/Module/Admin.php:499 +#: ../../Zotlabs/Module/Admin.php:527 msgid "Proxy user" msgstr "" -#: ../../Zotlabs/Module/Admin.php:500 +#: ../../Zotlabs/Module/Admin.php:528 msgid "Proxy URL" msgstr "" -#: ../../Zotlabs/Module/Admin.php:501 +#: ../../Zotlabs/Module/Admin.php:529 msgid "Network timeout" msgstr "" -#: ../../Zotlabs/Module/Admin.php:501 +#: ../../Zotlabs/Module/Admin.php:529 msgid "Value is in seconds. Set to 0 for unlimited (not recommended)." msgstr "" -#: ../../Zotlabs/Module/Admin.php:502 +#: ../../Zotlabs/Module/Admin.php:530 msgid "Delivery interval" msgstr "" -#: ../../Zotlabs/Module/Admin.php:502 +#: ../../Zotlabs/Module/Admin.php:530 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.php:503 +#: ../../Zotlabs/Module/Admin.php:531 msgid "Deliveries per process" msgstr "" -#: ../../Zotlabs/Module/Admin.php:503 +#: ../../Zotlabs/Module/Admin.php:531 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.php:504 +#: ../../Zotlabs/Module/Admin.php:532 msgid "Poll interval" msgstr "" -#: ../../Zotlabs/Module/Admin.php:504 +#: ../../Zotlabs/Module/Admin.php:532 msgid "" "Delay background polling processes by this many seconds to reduce system " "load. If 0, use delivery interval." msgstr "" -#: ../../Zotlabs/Module/Admin.php:505 +#: ../../Zotlabs/Module/Admin.php:533 msgid "Maximum Load Average" msgstr "" -#: ../../Zotlabs/Module/Admin.php:505 +#: ../../Zotlabs/Module/Admin.php:533 msgid "" "Maximum system load before delivery and poll processes are deferred - " "default 50." msgstr "" -#: ../../Zotlabs/Module/Admin.php:506 +#: ../../Zotlabs/Module/Admin.php:534 msgid "Expiration period in days for imported (grid/network) content" msgstr "" -#: ../../Zotlabs/Module/Admin.php:506 +#: ../../Zotlabs/Module/Admin.php:534 msgid "0 for no expiration of imported content" msgstr "" -#: ../../Zotlabs/Module/Admin.php:649 ../../Zotlabs/Module/Admin.php:650 -#: ../../Zotlabs/Module/Settings.php:720 +#: ../../Zotlabs/Module/Admin.php:677 ../../Zotlabs/Module/Admin.php:678 +#: ../../Zotlabs/Module/Settings.php:722 msgid "Off" msgstr "" -#: ../../Zotlabs/Module/Admin.php:649 ../../Zotlabs/Module/Admin.php:650 -#: ../../Zotlabs/Module/Settings.php:720 +#: ../../Zotlabs/Module/Admin.php:677 ../../Zotlabs/Module/Admin.php:678 +#: ../../Zotlabs/Module/Settings.php:722 msgid "On" msgstr "" -#: ../../Zotlabs/Module/Admin.php:650 +#: ../../Zotlabs/Module/Admin.php:678 #, php-format msgid "Lock feature %s" msgstr "" -#: ../../Zotlabs/Module/Admin.php:658 +#: ../../Zotlabs/Module/Admin.php:686 msgid "Manage Additional Features" msgstr "" -#: ../../Zotlabs/Module/Admin.php:675 +#: ../../Zotlabs/Module/Admin.php:703 msgid "No server found" msgstr "" -#: ../../Zotlabs/Module/Admin.php:682 ../../Zotlabs/Module/Admin.php:1020 +#: ../../Zotlabs/Module/Admin.php:710 ../../Zotlabs/Module/Admin.php:1048 msgid "ID" msgstr "" -#: ../../Zotlabs/Module/Admin.php:682 +#: ../../Zotlabs/Module/Admin.php:710 msgid "for channel" msgstr "" -#: ../../Zotlabs/Module/Admin.php:682 +#: ../../Zotlabs/Module/Admin.php:710 msgid "on server" msgstr "" -#: ../../Zotlabs/Module/Admin.php:682 ../../Zotlabs/Module/Connections.php:270 +#: ../../Zotlabs/Module/Admin.php:710 ../../Zotlabs/Module/Connections.php:270 msgid "Status" msgstr "" -#: ../../Zotlabs/Module/Admin.php:684 +#: ../../Zotlabs/Module/Admin.php:712 msgid "Server" msgstr "" -#: ../../Zotlabs/Module/Admin.php:718 +#: ../../Zotlabs/Module/Admin.php:746 msgid "" "By default, unfiltered HTML is allowed in embedded media. This is inherently " "insecure." msgstr "" -#: ../../Zotlabs/Module/Admin.php:721 +#: ../../Zotlabs/Module/Admin.php:749 msgid "" "The recommended setting is to only allow unfiltered HTML from the following " "sites:" msgstr "" -#: ../../Zotlabs/Module/Admin.php:722 +#: ../../Zotlabs/Module/Admin.php:750 msgid "" "https://youtube.com/
https://www.youtube.com/
https://youtu.be/" "
https://vimeo.com/
https://soundcloud.com/
" msgstr "" -#: ../../Zotlabs/Module/Admin.php:723 +#: ../../Zotlabs/Module/Admin.php:751 msgid "" "All other embedded content will be filtered, unless " "embedded content from that site is explicitly blocked." msgstr "" -#: ../../Zotlabs/Module/Admin.php:728 ../../include/widgets.php:1386 +#: ../../Zotlabs/Module/Admin.php:756 ../../include/widgets.php:1386 msgid "Security" msgstr "" -#: ../../Zotlabs/Module/Admin.php:730 +#: ../../Zotlabs/Module/Admin.php:758 msgid "Block public" msgstr "" -#: ../../Zotlabs/Module/Admin.php:730 +#: ../../Zotlabs/Module/Admin.php:758 msgid "" "Check to block public access to all otherwise public personal pages on this " "site unless you are currently authenticated." msgstr "" -#: ../../Zotlabs/Module/Admin.php:731 +#: ../../Zotlabs/Module/Admin.php:759 msgid "Set \"Transport Security\" HTTP header" msgstr "" -#: ../../Zotlabs/Module/Admin.php:732 +#: ../../Zotlabs/Module/Admin.php:760 msgid "Set \"Content Security Policy\" HTTP header" msgstr "" -#: ../../Zotlabs/Module/Admin.php:733 +#: ../../Zotlabs/Module/Admin.php:761 msgid "Allow communications only from these sites" msgstr "" -#: ../../Zotlabs/Module/Admin.php:733 +#: ../../Zotlabs/Module/Admin.php:761 msgid "" "One site per line. Leave empty to allow communication from anywhere by " "default" msgstr "" -#: ../../Zotlabs/Module/Admin.php:734 +#: ../../Zotlabs/Module/Admin.php:762 msgid "Block communications from these sites" msgstr "" -#: ../../Zotlabs/Module/Admin.php:735 +#: ../../Zotlabs/Module/Admin.php:763 msgid "Allow communications only from these channels" msgstr "" -#: ../../Zotlabs/Module/Admin.php:735 +#: ../../Zotlabs/Module/Admin.php:763 msgid "" "One channel (hash) per line. Leave empty to allow from any channel by default" msgstr "" -#: ../../Zotlabs/Module/Admin.php:736 +#: ../../Zotlabs/Module/Admin.php:764 msgid "Block communications from these channels" msgstr "" -#: ../../Zotlabs/Module/Admin.php:737 +#: ../../Zotlabs/Module/Admin.php:765 msgid "Only allow embeds from secure (SSL) websites and links." msgstr "" -#: ../../Zotlabs/Module/Admin.php:738 +#: ../../Zotlabs/Module/Admin.php:766 msgid "Allow unfiltered embedded HTML content only from these domains" msgstr "" -#: ../../Zotlabs/Module/Admin.php:738 +#: ../../Zotlabs/Module/Admin.php:766 msgid "One site per line. By default embedded content is filtered." msgstr "" -#: ../../Zotlabs/Module/Admin.php:739 +#: ../../Zotlabs/Module/Admin.php:767 msgid "Block embedded HTML from these domains" msgstr "" -#: ../../Zotlabs/Module/Admin.php:757 +#: ../../Zotlabs/Module/Admin.php:785 msgid "Update has been marked successful" msgstr "" -#: ../../Zotlabs/Module/Admin.php:767 +#: ../../Zotlabs/Module/Admin.php:795 #, php-format msgid "Executing %s failed. Check system logs." msgstr "" -#: ../../Zotlabs/Module/Admin.php:770 +#: ../../Zotlabs/Module/Admin.php:798 #, php-format msgid "Update %s was successfully applied." msgstr "" -#: ../../Zotlabs/Module/Admin.php:774 +#: ../../Zotlabs/Module/Admin.php:802 #, php-format msgid "Update %s did not return a status. Unknown if it succeeded." msgstr "" -#: ../../Zotlabs/Module/Admin.php:777 +#: ../../Zotlabs/Module/Admin.php:805 #, php-format msgid "Update function %s could not be found." msgstr "" -#: ../../Zotlabs/Module/Admin.php:793 +#: ../../Zotlabs/Module/Admin.php:821 msgid "No failed updates." msgstr "" -#: ../../Zotlabs/Module/Admin.php:797 +#: ../../Zotlabs/Module/Admin.php:825 msgid "Failed Updates" msgstr "" -#: ../../Zotlabs/Module/Admin.php:799 +#: ../../Zotlabs/Module/Admin.php:827 msgid "Mark success (if update was manually applied)" msgstr "" -#: ../../Zotlabs/Module/Admin.php:800 +#: ../../Zotlabs/Module/Admin.php:828 msgid "Attempt to execute this update step automatically" msgstr "" -#: ../../Zotlabs/Module/Admin.php:831 +#: ../../Zotlabs/Module/Admin.php:859 msgid "Queue Statistics" msgstr "" -#: ../../Zotlabs/Module/Admin.php:832 +#: ../../Zotlabs/Module/Admin.php:860 msgid "Total Entries" msgstr "" -#: ../../Zotlabs/Module/Admin.php:833 +#: ../../Zotlabs/Module/Admin.php:861 msgid "Priority" msgstr "" -#: ../../Zotlabs/Module/Admin.php:834 +#: ../../Zotlabs/Module/Admin.php:862 msgid "Destination URL" msgstr "" -#: ../../Zotlabs/Module/Admin.php:835 +#: ../../Zotlabs/Module/Admin.php:863 msgid "Mark hub permanently offline" msgstr "" -#: ../../Zotlabs/Module/Admin.php:836 +#: ../../Zotlabs/Module/Admin.php:864 msgid "Empty queue for this hub" msgstr "" -#: ../../Zotlabs/Module/Admin.php:837 +#: ../../Zotlabs/Module/Admin.php:865 msgid "Last known contact" msgstr "" -#: ../../Zotlabs/Module/Admin.php:873 +#: ../../Zotlabs/Module/Admin.php:901 #, php-format msgid "%s account blocked/unblocked" msgid_plural "%s account blocked/unblocked" msgstr[0] "" msgstr[1] "" -#: ../../Zotlabs/Module/Admin.php:881 +#: ../../Zotlabs/Module/Admin.php:909 #, php-format msgid "%s account deleted" msgid_plural "%s accounts deleted" msgstr[0] "" msgstr[1] "" -#: ../../Zotlabs/Module/Admin.php:917 +#: ../../Zotlabs/Module/Admin.php:945 msgid "Account not found" msgstr "" -#: ../../Zotlabs/Module/Admin.php:929 +#: ../../Zotlabs/Module/Admin.php:957 #, php-format msgid "Account '%s' deleted" msgstr "" -#: ../../Zotlabs/Module/Admin.php:937 +#: ../../Zotlabs/Module/Admin.php:965 #, php-format msgid "Account '%s' blocked" msgstr "" -#: ../../Zotlabs/Module/Admin.php:945 +#: ../../Zotlabs/Module/Admin.php:973 #, php-format msgid "Account '%s' unblocked" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1007 ../../Zotlabs/Module/Admin.php:1019 +#: ../../Zotlabs/Module/Admin.php:1035 ../../Zotlabs/Module/Admin.php:1047 msgid "Users" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1009 ../../Zotlabs/Module/Admin.php:1173 +#: ../../Zotlabs/Module/Admin.php:1037 ../../Zotlabs/Module/Admin.php:1201 msgid "select all" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1010 +#: ../../Zotlabs/Module/Admin.php:1038 msgid "User registrations waiting for confirm" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1011 +#: ../../Zotlabs/Module/Admin.php:1039 msgid "Request date" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1011 ../../Zotlabs/Module/Admin.php:1020 +#: ../../Zotlabs/Module/Admin.php:1039 ../../Zotlabs/Module/Admin.php:1048 #: ../../Zotlabs/Module/Id.php:17 ../../Zotlabs/Module/Id.php:18 #: ../../include/contact_selectors.php:81 ../../boot.php:1617 msgid "Email" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1012 +#: ../../Zotlabs/Module/Admin.php:1040 msgid "No registrations." msgstr "" -#: ../../Zotlabs/Module/Admin.php:1013 +#: ../../Zotlabs/Module/Admin.php:1041 #: ../../Zotlabs/Module/Connections.php:275 msgid "Approve" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1014 +#: ../../Zotlabs/Module/Admin.php:1042 msgid "Deny" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1016 ../../Zotlabs/Module/Connedit.php:541 +#: ../../Zotlabs/Module/Admin.php:1044 ../../Zotlabs/Module/Connedit.php:541 msgid "Block" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1017 ../../Zotlabs/Module/Connedit.php:541 +#: ../../Zotlabs/Module/Admin.php:1045 ../../Zotlabs/Module/Connedit.php:541 msgid "Unblock" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1020 ../../include/group.php:267 +#: ../../Zotlabs/Module/Admin.php:1048 ../../include/group.php:267 msgid "All Channels" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1020 +#: ../../Zotlabs/Module/Admin.php:1048 msgid "Register date" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1020 +#: ../../Zotlabs/Module/Admin.php:1048 msgid "Last login" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1020 +#: ../../Zotlabs/Module/Admin.php:1048 msgid "Expires" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1020 +#: ../../Zotlabs/Module/Admin.php:1048 msgid "Service Class" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1022 +#: ../../Zotlabs/Module/Admin.php:1050 msgid "" "Selected accounts will be deleted!\\n\\nEverything these accounts had posted " "on this site will be permanently deleted!\\n\\nAre you sure?" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1023 +#: ../../Zotlabs/Module/Admin.php:1051 msgid "" "The account {0} will be deleted!\\n\\nEverything this account has posted on " "this site will be permanently deleted!\\n\\nAre you sure?" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1059 +#: ../../Zotlabs/Module/Admin.php:1087 #, php-format msgid "%s channel censored/uncensored" msgid_plural "%s channels censored/uncensored" msgstr[0] "" msgstr[1] "" -#: ../../Zotlabs/Module/Admin.php:1068 +#: ../../Zotlabs/Module/Admin.php:1096 #, php-format msgid "%s channel code allowed/disallowed" msgid_plural "%s channels code allowed/disallowed" msgstr[0] "" msgstr[1] "" -#: ../../Zotlabs/Module/Admin.php:1075 +#: ../../Zotlabs/Module/Admin.php:1103 #, php-format msgid "%s channel deleted" msgid_plural "%s channels deleted" msgstr[0] "" msgstr[1] "" -#: ../../Zotlabs/Module/Admin.php:1095 +#: ../../Zotlabs/Module/Admin.php:1123 msgid "Channel not found" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1106 +#: ../../Zotlabs/Module/Admin.php:1134 #, php-format msgid "Channel '%s' deleted" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1118 +#: ../../Zotlabs/Module/Admin.php:1146 #, php-format msgid "Channel '%s' censored" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1118 +#: ../../Zotlabs/Module/Admin.php:1146 #, php-format msgid "Channel '%s' uncensored" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1129 +#: ../../Zotlabs/Module/Admin.php:1157 #, php-format msgid "Channel '%s' code allowed" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1129 +#: ../../Zotlabs/Module/Admin.php:1157 #, php-format msgid "Channel '%s' code disallowed" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1171 ../../include/widgets.php:1385 +#: ../../Zotlabs/Module/Admin.php:1199 ../../include/widgets.php:1385 msgid "Channels" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1175 +#: ../../Zotlabs/Module/Admin.php:1203 msgid "Censor" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1176 +#: ../../Zotlabs/Module/Admin.php:1204 msgid "Uncensor" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1177 +#: ../../Zotlabs/Module/Admin.php:1205 msgid "Allow Code" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1178 +#: ../../Zotlabs/Module/Admin.php:1206 msgid "Disallow Code" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1179 ../../include/conversation.php:1621 +#: ../../Zotlabs/Module/Admin.php:1207 ../../include/conversation.php:1617 msgid "Channel" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1180 +#: ../../Zotlabs/Module/Admin.php:1208 msgid "UID" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1180 ../../Zotlabs/Module/Locs.php:118 +#: ../../Zotlabs/Module/Admin.php:1208 ../../Zotlabs/Module/Locs.php:118 #: ../../Zotlabs/Module/Profiles.php:469 msgid "Address" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1182 +#: ../../Zotlabs/Module/Admin.php:1210 msgid "" "Selected channels will be deleted!\\n\\nEverything that was posted in these " "channels on this site will be permanently deleted!\\n\\nAre you sure?" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1183 +#: ../../Zotlabs/Module/Admin.php:1211 msgid "" "The channel {0} will be deleted!\\n\\nEverything that was posted in this " "channel on this site will be permanently deleted!\\n\\nAre you sure?" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1240 +#: ../../Zotlabs/Module/Admin.php:1268 #, php-format msgid "Plugin %s disabled." msgstr "" -#: ../../Zotlabs/Module/Admin.php:1244 +#: ../../Zotlabs/Module/Admin.php:1272 #, php-format msgid "Plugin %s enabled." msgstr "" -#: ../../Zotlabs/Module/Admin.php:1254 ../../Zotlabs/Module/Admin.php:1487 +#: ../../Zotlabs/Module/Admin.php:1282 ../../Zotlabs/Module/Admin.php:1565 msgid "Disable" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1257 ../../Zotlabs/Module/Admin.php:1489 +#: ../../Zotlabs/Module/Admin.php:1285 ../../Zotlabs/Module/Admin.php:1567 msgid "Enable" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1286 ../../Zotlabs/Module/Admin.php:1349 +#: ../../Zotlabs/Module/Admin.php:1314 ../../Zotlabs/Module/Admin.php:1404 #: ../../include/widgets.php:1388 msgid "Plugins" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1287 ../../Zotlabs/Module/Admin.php:1516 +#: ../../Zotlabs/Module/Admin.php:1315 ../../Zotlabs/Module/Admin.php:1594 msgid "Toggle" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1288 ../../Zotlabs/Module/Admin.php:1517 -#: ../../include/apps.php:166 ../../include/widgets.php:638 -#: ../../include/nav.php:208 +#: ../../Zotlabs/Module/Admin.php:1316 ../../Zotlabs/Module/Admin.php:1595 +#: ../../include/widgets.php:638 ../../include/nav.php:208 +#: ../../include/apps.php:166 msgid "Settings" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1295 ../../Zotlabs/Module/Admin.php:1526 +#: ../../Zotlabs/Module/Admin.php:1323 ../../Zotlabs/Module/Admin.php:1604 msgid "Author: " msgstr "" -#: ../../Zotlabs/Module/Admin.php:1296 ../../Zotlabs/Module/Admin.php:1527 +#: ../../Zotlabs/Module/Admin.php:1324 ../../Zotlabs/Module/Admin.php:1605 msgid "Maintainer: " msgstr "" -#: ../../Zotlabs/Module/Admin.php:1297 +#: ../../Zotlabs/Module/Admin.php:1325 msgid "Minimum project version: " msgstr "" -#: ../../Zotlabs/Module/Admin.php:1298 +#: ../../Zotlabs/Module/Admin.php:1326 msgid "Maximum project version: " msgstr "" -#: ../../Zotlabs/Module/Admin.php:1299 +#: ../../Zotlabs/Module/Admin.php:1327 msgid "Minimum PHP version: " msgstr "" -#: ../../Zotlabs/Module/Admin.php:1300 +#: ../../Zotlabs/Module/Admin.php:1328 msgid "Requires: " msgstr "" -#: ../../Zotlabs/Module/Admin.php:1301 ../../Zotlabs/Module/Admin.php:1354 +#: ../../Zotlabs/Module/Admin.php:1329 ../../Zotlabs/Module/Admin.php:1409 msgid "Disabled - version incompatibility" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1452 +#: ../../Zotlabs/Module/Admin.php:1378 +msgid "Enter the public git repository URL of the plugin repo." +msgstr "" + +#: ../../Zotlabs/Module/Admin.php:1379 +msgid "Plugin repo git URL" +msgstr "" + +#: ../../Zotlabs/Module/Admin.php:1380 +msgid "Custom repo name" +msgstr "" + +#: ../../Zotlabs/Module/Admin.php:1380 +msgid "(optional)" +msgstr "" + +#: ../../Zotlabs/Module/Admin.php:1381 +msgid "Download Plugin Repo" +msgstr "" + +#: ../../Zotlabs/Module/Admin.php:1388 +msgid "Install new repo" +msgstr "" + +#: ../../Zotlabs/Module/Admin.php:1389 ../../include/apps.php:284 +msgid "Install" +msgstr "" + +#: ../../Zotlabs/Module/Admin.php:1390 ../../Zotlabs/Module/Fbrowser.php:66 +#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Settings.php:591 +#: ../../Zotlabs/Module/Settings.php:617 ../../Zotlabs/Module/Tagrm.php:15 +#: ../../Zotlabs/Module/Tagrm.php:138 ../../include/conversation.php:1265 +msgid "Cancel" +msgstr "" + +#: ../../Zotlabs/Module/Admin.php:1411 +msgid "Add Plugin Repo" +msgstr "" + +#: ../../Zotlabs/Module/Admin.php:1417 ../../Zotlabs/Module/Settings.php:77 +#: ../../Zotlabs/Module/Settings.php:616 ../../include/apps.php:284 +msgid "Update" +msgstr "" + +#: ../../Zotlabs/Module/Admin.php:1418 +msgid "Switch branch" +msgstr "" + +#: ../../Zotlabs/Module/Admin.php:1419 ../../Zotlabs/Module/Photos.php:998 +#: ../../Zotlabs/Module/Tagrm.php:137 +msgid "Remove" +msgstr "" + +#: ../../Zotlabs/Module/Admin.php:1530 msgid "No themes found." msgstr "" -#: ../../Zotlabs/Module/Admin.php:1508 +#: ../../Zotlabs/Module/Admin.php:1586 msgid "Screenshot" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1515 ../../Zotlabs/Module/Admin.php:1549 +#: ../../Zotlabs/Module/Admin.php:1593 ../../Zotlabs/Module/Admin.php:1627 #: ../../include/widgets.php:1389 msgid "Themes" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1554 +#: ../../Zotlabs/Module/Admin.php:1632 msgid "[Experimental]" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1555 +#: ../../Zotlabs/Module/Admin.php:1633 msgid "[Unsupported]" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1579 +#: ../../Zotlabs/Module/Admin.php:1657 msgid "Log settings updated." msgstr "" -#: ../../Zotlabs/Module/Admin.php:1634 ../../include/widgets.php:1410 +#: ../../Zotlabs/Module/Admin.php:1712 ../../include/widgets.php:1410 #: ../../include/widgets.php:1420 msgid "Logs" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1636 +#: ../../Zotlabs/Module/Admin.php:1714 msgid "Clear" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1642 +#: ../../Zotlabs/Module/Admin.php:1720 msgid "Debugging" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1643 +#: ../../Zotlabs/Module/Admin.php:1721 msgid "Log file" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1643 +#: ../../Zotlabs/Module/Admin.php:1721 msgid "" "Must be writable by web server. Relative to your Red top-level directory." msgstr "" -#: ../../Zotlabs/Module/Admin.php:1644 +#: ../../Zotlabs/Module/Admin.php:1722 msgid "Log level" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1711 +#: ../../Zotlabs/Module/Admin.php:1990 msgid "New Profile Field" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1712 ../../Zotlabs/Module/Admin.php:1732 +#: ../../Zotlabs/Module/Admin.php:1991 ../../Zotlabs/Module/Admin.php:2011 msgid "Field nickname" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1712 ../../Zotlabs/Module/Admin.php:1732 +#: ../../Zotlabs/Module/Admin.php:1991 ../../Zotlabs/Module/Admin.php:2011 msgid "System name of field" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1713 ../../Zotlabs/Module/Admin.php:1733 +#: ../../Zotlabs/Module/Admin.php:1992 ../../Zotlabs/Module/Admin.php:2012 msgid "Input type" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1714 ../../Zotlabs/Module/Admin.php:1734 +#: ../../Zotlabs/Module/Admin.php:1993 ../../Zotlabs/Module/Admin.php:2013 msgid "Field Name" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1714 ../../Zotlabs/Module/Admin.php:1734 +#: ../../Zotlabs/Module/Admin.php:1993 ../../Zotlabs/Module/Admin.php:2013 msgid "Label on profile pages" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1715 ../../Zotlabs/Module/Admin.php:1735 +#: ../../Zotlabs/Module/Admin.php:1994 ../../Zotlabs/Module/Admin.php:2014 msgid "Help text" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1715 ../../Zotlabs/Module/Admin.php:1735 +#: ../../Zotlabs/Module/Admin.php:1994 ../../Zotlabs/Module/Admin.php:2014 msgid "Additional info (optional)" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1716 ../../Zotlabs/Module/Admin.php:1736 +#: ../../Zotlabs/Module/Admin.php:1995 ../../Zotlabs/Module/Admin.php:2015 #: ../../Zotlabs/Module/Filer.php:53 ../../Zotlabs/Module/Rbmark.php:32 #: ../../Zotlabs/Module/Rbmark.php:104 ../../include/widgets.php:201 #: ../../include/text.php:934 ../../include/text.php:946 msgid "Save" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1725 +#: ../../Zotlabs/Module/Admin.php:2004 msgid "Field definition not found" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1731 +#: ../../Zotlabs/Module/Admin.php:2010 msgid "Edit Profile Field" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1789 ../../include/widgets.php:1391 +#: ../../Zotlabs/Module/Admin.php:2068 ../../include/widgets.php:1391 msgid "Profile Fields" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1790 +#: ../../Zotlabs/Module/Admin.php:2069 msgid "Basic Profile Fields" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1791 +#: ../../Zotlabs/Module/Admin.php:2070 msgid "Advanced Profile Fields" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1791 +#: ../../Zotlabs/Module/Admin.php:2070 msgid "(In addition to basic fields)" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1793 +#: ../../Zotlabs/Module/Admin.php:2072 msgid "All available fields" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1794 +#: ../../Zotlabs/Module/Admin.php:2073 msgid "Custom Fields" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1798 +#: ../../Zotlabs/Module/Admin.php:2077 msgid "Create Custom Field" msgstr "" @@ -1364,7 +1429,7 @@ msgid "Name of app" msgstr "" #: ../../Zotlabs/Module/Appman.php:114 ../../Zotlabs/Module/Appman.php:115 -#: ../../Zotlabs/Module/Events.php:448 ../../Zotlabs/Module/Events.php:453 +#: ../../Zotlabs/Module/Events.php:449 ../../Zotlabs/Module/Events.php:454 #: ../../Zotlabs/Module/Profiles.php:713 ../../Zotlabs/Module/Profiles.php:717 #: ../../include/datetime.php:246 msgid "Required" @@ -1374,7 +1439,7 @@ msgstr "" msgid "Location (URL) of app" msgstr "" -#: ../../Zotlabs/Module/Appman.php:116 ../../Zotlabs/Module/Events.php:461 +#: ../../Zotlabs/Module/Appman.php:116 ../../Zotlabs/Module/Events.php:462 #: ../../Zotlabs/Module/Rbmark.php:101 msgid "Description" msgstr "" @@ -1421,38 +1486,39 @@ msgstr "" msgid "Channel not found." msgstr "" -#: ../../Zotlabs/Module/Blocks.php:99 ../../Zotlabs/Module/Blocks.php:154 +#: ../../Zotlabs/Module/Blocks.php:97 ../../Zotlabs/Module/Blocks.php:152 +#: ../../Zotlabs/Module/Editblock.php:108 msgid "Block Name" msgstr "" -#: ../../Zotlabs/Module/Blocks.php:153 ../../include/text.php:2280 +#: ../../Zotlabs/Module/Blocks.php:151 ../../include/text.php:2277 msgid "Blocks" msgstr "" -#: ../../Zotlabs/Module/Blocks.php:155 +#: ../../Zotlabs/Module/Blocks.php:153 msgid "Block Title" msgstr "" -#: ../../Zotlabs/Module/Blocks.php:156 ../../Zotlabs/Module/Layouts.php:188 -#: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Webpages.php:200 +#: ../../Zotlabs/Module/Blocks.php:154 ../../Zotlabs/Module/Layouts.php:188 +#: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Webpages.php:198 #: ../../include/page_widgets.php:44 msgid "Created" msgstr "" -#: ../../Zotlabs/Module/Blocks.php:157 ../../Zotlabs/Module/Layouts.php:189 -#: ../../Zotlabs/Module/Menu.php:115 ../../Zotlabs/Module/Webpages.php:201 +#: ../../Zotlabs/Module/Blocks.php:155 ../../Zotlabs/Module/Layouts.php:189 +#: ../../Zotlabs/Module/Menu.php:115 ../../Zotlabs/Module/Webpages.php:199 #: ../../include/page_widgets.php:45 msgid "Edited" msgstr "" -#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Layouts.php:191 -#: ../../Zotlabs/Module/Photos.php:1071 ../../Zotlabs/Module/Webpages.php:190 -#: ../../include/conversation.php:1218 +#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Layouts.php:191 +#: ../../Zotlabs/Module/Photos.php:1072 ../../Zotlabs/Module/Webpages.php:188 +#: ../../include/conversation.php:1214 msgid "Share" msgstr "" -#: ../../Zotlabs/Module/Blocks.php:165 ../../Zotlabs/Module/Layouts.php:195 -#: ../../Zotlabs/Module/Pubsites.php:46 ../../Zotlabs/Module/Webpages.php:195 +#: ../../Zotlabs/Module/Blocks.php:163 ../../Zotlabs/Module/Layouts.php:195 +#: ../../Zotlabs/Module/Pubsites.php:46 ../../Zotlabs/Module/Webpages.php:193 #: ../../include/page_widgets.php:39 msgid "View" msgstr "" @@ -1473,70 +1539,65 @@ msgstr "" msgid "Permissions denied." msgstr "" -#: ../../Zotlabs/Module/Cal.php:262 ../../Zotlabs/Module/Events.php:585 +#: ../../Zotlabs/Module/Cal.php:262 ../../Zotlabs/Module/Events.php:588 msgid "l, F j" msgstr "" -#: ../../Zotlabs/Module/Cal.php:311 ../../Zotlabs/Module/Events.php:634 +#: ../../Zotlabs/Module/Cal.php:311 ../../Zotlabs/Module/Events.php:637 #: ../../include/text.php:1743 msgid "Link to Source" msgstr "" -#: ../../Zotlabs/Module/Cal.php:334 ../../Zotlabs/Module/Events.php:662 +#: ../../Zotlabs/Module/Cal.php:334 ../../Zotlabs/Module/Events.php:665 msgid "Edit Event" msgstr "" -#: ../../Zotlabs/Module/Cal.php:334 ../../Zotlabs/Module/Events.php:662 +#: ../../Zotlabs/Module/Cal.php:334 ../../Zotlabs/Module/Events.php:665 msgid "Create Event" msgstr "" #: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Cal.php:342 -#: ../../Zotlabs/Module/Events.php:663 ../../Zotlabs/Module/Events.php:670 -#: ../../Zotlabs/Module/Photos.php:948 +#: ../../Zotlabs/Module/Events.php:666 ../../Zotlabs/Module/Events.php:673 +#: ../../Zotlabs/Module/Photos.php:949 msgid "Previous" msgstr "" #: ../../Zotlabs/Module/Cal.php:336 ../../Zotlabs/Module/Cal.php:343 -#: ../../Zotlabs/Module/Events.php:664 ../../Zotlabs/Module/Events.php:671 -#: ../../Zotlabs/Module/Photos.php:957 ../../Zotlabs/Module/Setup.php:290 +#: ../../Zotlabs/Module/Events.php:667 ../../Zotlabs/Module/Events.php:674 +#: ../../Zotlabs/Module/Photos.php:958 ../../Zotlabs/Module/Setup.php:290 msgid "Next" msgstr "" -#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Events.php:665 +#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Events.php:668 #: ../../include/widgets.php:755 msgid "Export" msgstr "" -#: ../../Zotlabs/Module/Cal.php:340 ../../Zotlabs/Module/Events.php:668 +#: ../../Zotlabs/Module/Cal.php:340 ../../Zotlabs/Module/Events.php:671 #: ../../include/widgets.php:756 msgid "Import" msgstr "" -#: ../../Zotlabs/Module/Cal.php:344 ../../Zotlabs/Module/Events.php:672 +#: ../../Zotlabs/Module/Cal.php:344 ../../Zotlabs/Module/Events.php:675 msgid "Today" msgstr "" -#: ../../Zotlabs/Module/Channel.php:28 ../../Zotlabs/Module/Chat.php:23 +#: ../../Zotlabs/Module/Channel.php:29 ../../Zotlabs/Module/Chat.php:23 msgid "You must be logged in to see this page." msgstr "" -#: ../../Zotlabs/Module/Channel.php:40 +#: ../../Zotlabs/Module/Channel.php:41 msgid "Posts and comments" msgstr "" -#: ../../Zotlabs/Module/Channel.php:41 +#: ../../Zotlabs/Module/Channel.php:42 msgid "Only posts" msgstr "" -#: ../../Zotlabs/Module/Channel.php:101 +#: ../../Zotlabs/Module/Channel.php:102 msgid "Insufficient permissions. Request redirected to profile page." msgstr "" -#: ../../Zotlabs/Module/Channel.php:135 ../../Zotlabs/Module/Network.php:173 -#: ../../Zotlabs/Module/Rpost.php:118 -msgid "Public" -msgstr "" - #: ../../Zotlabs/Module/Chat.php:179 msgid "Room not found" msgstr "" @@ -1562,19 +1623,19 @@ msgid "Bookmark this room" msgstr "" #: ../../Zotlabs/Module/Chat.php:203 ../../Zotlabs/Module/Mail.php:206 -#: ../../Zotlabs/Module/Mail.php:320 ../../include/conversation.php:1186 +#: ../../Zotlabs/Module/Mail.php:320 ../../include/conversation.php:1182 msgid "Please enter a link URL:" msgstr "" #: ../../Zotlabs/Module/Chat.php:204 ../../Zotlabs/Module/Mail.php:259 #: ../../Zotlabs/Module/Mail.php:389 ../../include/ItemObject.php:715 -#: ../../include/conversation.php:1266 +#: ../../include/conversation.php:1262 msgid "Encrypt text" msgstr "" -#: ../../Zotlabs/Module/Chat.php:205 ../../Zotlabs/Module/Editblock.php:144 -#: ../../Zotlabs/Module/Editwebpage.php:188 ../../Zotlabs/Module/Mail.php:253 -#: ../../Zotlabs/Module/Mail.php:383 ../../include/conversation.php:1141 +#: ../../Zotlabs/Module/Chat.php:205 ../../Zotlabs/Module/Editblock.php:111 +#: ../../Zotlabs/Module/Editwebpage.php:147 ../../Zotlabs/Module/Mail.php:253 +#: ../../Zotlabs/Module/Mail.php:383 ../../include/conversation.php:1149 msgid "Insert web link" msgstr "" @@ -1594,10 +1655,10 @@ msgstr "" msgid "Expiration of chats (minutes)" msgstr "" -#: ../../Zotlabs/Module/Chat.php:233 ../../Zotlabs/Module/Filestorage.php:151 -#: ../../Zotlabs/Module/Photos.php:670 ../../Zotlabs/Module/Photos.php:1044 +#: ../../Zotlabs/Module/Chat.php:233 ../../Zotlabs/Module/Filestorage.php:153 +#: ../../Zotlabs/Module/Photos.php:671 ../../Zotlabs/Module/Photos.php:1045 #: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:359 -#: ../../include/acl_selectors.php:266 +#: ../../include/acl_selectors.php:285 msgid "Permissions" msgstr "" @@ -1610,7 +1671,7 @@ msgstr "" msgid "No chatrooms available" msgstr "" -#: ../../Zotlabs/Module/Chat.php:250 ../../Zotlabs/Module/Manage.php:141 +#: ../../Zotlabs/Module/Chat.php:250 ../../Zotlabs/Module/Manage.php:143 #: ../../Zotlabs/Module/Profiles.php:782 msgid "Create New" msgstr "" @@ -1712,7 +1773,7 @@ msgstr "" #: ../../Zotlabs/Module/Connections.php:76 #: ../../Zotlabs/Module/Connections.php:86 ../../Zotlabs/Module/Menu.php:116 -#: ../../include/conversation.php:1545 +#: ../../include/conversation.php:1541 msgid "New" msgstr "" @@ -1802,15 +1863,15 @@ msgstr "" msgid "Recent activity" msgstr "" -#: ../../Zotlabs/Module/Connections.php:302 ../../include/apps.php:159 -#: ../../include/text.php:863 ../../include/nav.php:186 +#: ../../Zotlabs/Module/Connections.php:302 ../../include/nav.php:186 +#: ../../include/text.php:863 ../../include/apps.php:159 msgid "Connections" msgstr "" #: ../../Zotlabs/Module/Connections.php:306 ../../Zotlabs/Module/Search.php:44 -#: ../../include/acl_selectors.php:259 ../../include/apps.php:179 +#: ../../include/acl_selectors.php:278 ../../include/nav.php:165 #: ../../include/text.php:933 ../../include/text.php:945 -#: ../../include/nav.php:165 +#: ../../include/apps.php:179 msgid "Search" msgstr "" @@ -1866,8 +1927,8 @@ msgstr "" msgid "Connection has been removed." msgstr "" -#: ../../Zotlabs/Module/Connedit.php:520 ../../include/apps.php:170 -#: ../../include/conversation.php:959 ../../include/nav.php:86 +#: ../../Zotlabs/Module/Connedit.php:520 ../../include/nav.php:86 +#: ../../include/conversation.php:959 ../../include/apps.php:170 msgid "View Profile" msgstr "" @@ -1957,9 +2018,9 @@ msgstr "" msgid "Family" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:595 ../../Zotlabs/Module/Settings.php:340 -#: ../../Zotlabs/Module/Settings.php:344 ../../Zotlabs/Module/Settings.php:345 -#: ../../Zotlabs/Module/Settings.php:348 ../../Zotlabs/Module/Settings.php:359 +#: ../../Zotlabs/Module/Connedit.php:595 ../../Zotlabs/Module/Settings.php:342 +#: ../../Zotlabs/Module/Settings.php:346 ../../Zotlabs/Module/Settings.php:347 +#: ../../Zotlabs/Module/Settings.php:350 ../../Zotlabs/Module/Settings.php:361 #: ../../include/identity.php:389 ../../include/identity.php:390 #: ../../include/identity.php:397 ../../include/profile_selectors.php:80 #: ../../include/widgets.php:495 @@ -1998,7 +2059,7 @@ msgstr "" msgid "Connection Default Permissions" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:705 ../../include/items.php:5193 +#: ../../Zotlabs/Module/Connedit.php:705 ../../include/items.php:3927 #, php-format msgid "Connection: %s" msgstr "" @@ -2144,25 +2205,25 @@ msgstr "" msgid "Unable to process image." msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:5621 +#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4271 msgid "female" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:5622 +#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4272 #, php-format msgid "%1$s updated her %2$s" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:5623 +#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4273 msgid "male" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:5624 +#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4274 #, php-format msgid "%1$s updated his %2$s" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:5626 +#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4276 #, php-format msgid "%1$s updated their %2$s" msgstr "" @@ -2194,7 +2255,7 @@ msgstr "" #: ../../Zotlabs/Module/Cover_photo.php:361 #: ../../Zotlabs/Module/Profile_photo.php:374 -#: ../../Zotlabs/Module/Settings.php:983 +#: ../../Zotlabs/Module/Settings.php:985 msgid "or" msgstr "" @@ -2223,12 +2284,8 @@ msgstr "" msgid "Done Editing" msgstr "" -#: ../../Zotlabs/Module/Dav.php:127 -msgid "$Projectname channel" -msgstr "" - #: ../../Zotlabs/Module/Directory.php:63 ../../Zotlabs/Module/Display.php:21 -#: ../../Zotlabs/Module/Photos.php:521 ../../Zotlabs/Module/Ratings.php:86 +#: ../../Zotlabs/Module/Photos.php:522 ../../Zotlabs/Module/Ratings.php:86 #: ../../Zotlabs/Module/Search.php:17 #: ../../Zotlabs/Module/Viewconnections.php:21 msgid "Public access denied." @@ -2258,8 +2315,8 @@ msgid "Age:" msgstr "" #: ../../Zotlabs/Module/Directory.php:311 ../../include/identity.php:1029 -#: ../../include/bb2diaspora.php:509 ../../include/event.php:52 -#: ../../include/text.php:1481 +#: ../../include/event.php:52 ../../include/text.php:1481 +#: ../../include/bb2diaspora.php:509 msgid "Location:" msgstr "" @@ -2358,7 +2415,7 @@ msgstr "" #: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:49 #: ../../Zotlabs/Module/Group.php:72 ../../Zotlabs/Module/Import_items.php:112 #: ../../Zotlabs/Module/Like.php:284 ../../Zotlabs/Module/Profperm.php:28 -#: ../../Zotlabs/Module/Subthread.php:62 ../../include/items.php:423 +#: ../../Zotlabs/Module/Subthread.php:62 ../../include/items.php:383 #: ../../index.php:173 msgid "Permission denied" msgstr "" @@ -2420,89 +2477,17 @@ msgstr "" msgid "mail delivered" msgstr "" -#: ../../Zotlabs/Module/Editblock.php:78 ../../Zotlabs/Module/Editblock.php:94 +#: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95 #: ../../Zotlabs/Module/Editlayout.php:79 ../../Zotlabs/Module/Editpost.php:24 #: ../../Zotlabs/Module/Editwebpage.php:81 msgid "Item not found" msgstr "" -#: ../../Zotlabs/Module/Editblock.php:118 -msgid "Delete block?" -msgstr "" - -#: ../../Zotlabs/Module/Editblock.php:137 -#: ../../Zotlabs/Module/Editwebpage.php:182 ../../include/ItemObject.php:704 -#: ../../include/conversation.php:1225 -msgid "Bold" -msgstr "" - -#: ../../Zotlabs/Module/Editblock.php:138 -#: ../../Zotlabs/Module/Editwebpage.php:183 ../../include/ItemObject.php:705 -#: ../../include/conversation.php:1226 -msgid "Italic" -msgstr "" - -#: ../../Zotlabs/Module/Editblock.php:139 -#: ../../Zotlabs/Module/Editwebpage.php:184 ../../include/ItemObject.php:706 -#: ../../include/conversation.php:1227 -msgid "Underline" -msgstr "" - -#: ../../Zotlabs/Module/Editblock.php:140 -#: ../../Zotlabs/Module/Editwebpage.php:185 ../../include/ItemObject.php:707 -#: ../../include/conversation.php:1228 -msgid "Quote" -msgstr "" - -#: ../../Zotlabs/Module/Editblock.php:141 -#: ../../Zotlabs/Module/Editwebpage.php:186 ../../include/ItemObject.php:708 -#: ../../include/conversation.php:1229 -msgid "Code" -msgstr "" - -#: ../../Zotlabs/Module/Editblock.php:143 -#: ../../Zotlabs/Module/Editwebpage.php:187 ../../Zotlabs/Module/Mail.php:252 -#: ../../Zotlabs/Module/Mail.php:382 ../../include/conversation.php:1230 -msgid "Attach file" -msgstr "" - -#: ../../Zotlabs/Module/Editblock.php:147 -#: ../../Zotlabs/Module/Editwebpage.php:191 -#: ../../Zotlabs/Module/Events.php:470 ../../include/conversation.php:1242 -msgid "Permission settings" -msgstr "" - -#: ../../Zotlabs/Module/Editblock.php:155 -#: ../../Zotlabs/Module/Editwebpage.php:200 -msgid "Public post" -msgstr "" - -#: ../../Zotlabs/Module/Editblock.php:158 -#: ../../Zotlabs/Module/Editwebpage.php:205 -#: ../../include/conversation.php:1238 +#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1234 msgid "Title (optional)" msgstr "" -#: ../../Zotlabs/Module/Editblock.php:161 -#: ../../Zotlabs/Module/Editwebpage.php:207 -#: ../../include/conversation.php:1241 -msgid "Categories (optional, comma-separated list)" -msgstr "" - -#: ../../Zotlabs/Module/Editblock.php:162 -#: ../../Zotlabs/Module/Editwebpage.php:208 -msgid "Example: bob@example.com, mary@example.com" -msgstr "" - -#: ../../Zotlabs/Module/Editblock.php:167 -#: ../../Zotlabs/Module/Editwebpage.php:212 -#: ../../Zotlabs/Module/Events.php:469 ../../Zotlabs/Module/Photos.php:1092 -#: ../../Zotlabs/Module/Webpages.php:196 ../../include/ItemObject.php:712 -#: ../../include/conversation.php:1197 ../../include/page_widgets.php:40 -msgid "Preview" -msgstr "" - -#: ../../Zotlabs/Module/Editblock.php:175 +#: ../../Zotlabs/Module/Editblock.php:133 msgid "Edit Block" msgstr "" @@ -2524,157 +2509,156 @@ msgstr "" msgid "Item is not editable" msgstr "" -#: ../../Zotlabs/Module/Editpost.php:105 ../../Zotlabs/Module/Rpost.php:134 +#: ../../Zotlabs/Module/Editpost.php:106 ../../Zotlabs/Module/Rpost.php:135 msgid "Edit post" msgstr "" -#: ../../Zotlabs/Module/Editwebpage.php:157 -msgid "Delete webpage?" +#: ../../Zotlabs/Module/Editwebpage.php:143 +msgid "Page link" msgstr "" -#: ../../Zotlabs/Module/Editwebpage.php:177 -msgid "Page link title" -msgstr "" - -#: ../../Zotlabs/Module/Editwebpage.php:220 +#: ../../Zotlabs/Module/Editwebpage.php:169 msgid "Edit Webpage" msgstr "" -#: ../../Zotlabs/Module/Events.php:25 +#: ../../Zotlabs/Module/Events.php:26 msgid "Calendar entries imported." msgstr "" -#: ../../Zotlabs/Module/Events.php:27 +#: ../../Zotlabs/Module/Events.php:28 msgid "No calendar entries found." msgstr "" -#: ../../Zotlabs/Module/Events.php:104 +#: ../../Zotlabs/Module/Events.php:105 msgid "Event can not end before it has started." msgstr "" -#: ../../Zotlabs/Module/Events.php:106 ../../Zotlabs/Module/Events.php:115 -#: ../../Zotlabs/Module/Events.php:135 +#: ../../Zotlabs/Module/Events.php:107 ../../Zotlabs/Module/Events.php:116 +#: ../../Zotlabs/Module/Events.php:136 msgid "Unable to generate preview." msgstr "" -#: ../../Zotlabs/Module/Events.php:113 +#: ../../Zotlabs/Module/Events.php:114 msgid "Event title and start time are required." msgstr "" -#: ../../Zotlabs/Module/Events.php:133 ../../Zotlabs/Module/Events.php:258 +#: ../../Zotlabs/Module/Events.php:134 ../../Zotlabs/Module/Events.php:259 msgid "Event not found." msgstr "" -#: ../../Zotlabs/Module/Events.php:253 ../../Zotlabs/Module/Like.php:373 -#: ../../Zotlabs/Module/Tagger.php:51 ../../include/event.php:915 -#: ../../include/text.php:1972 ../../include/conversation.php:123 +#: ../../Zotlabs/Module/Events.php:254 ../../Zotlabs/Module/Like.php:373 +#: ../../Zotlabs/Module/Tagger.php:51 ../../include/event.php:905 +#: ../../include/conversation.php:123 ../../include/text.php:1955 msgid "event" msgstr "" -#: ../../Zotlabs/Module/Events.php:448 +#: ../../Zotlabs/Module/Events.php:449 msgid "Edit event title" msgstr "" -#: ../../Zotlabs/Module/Events.php:448 +#: ../../Zotlabs/Module/Events.php:449 msgid "Event title" msgstr "" -#: ../../Zotlabs/Module/Events.php:450 +#: ../../Zotlabs/Module/Events.php:451 msgid "Categories (comma-separated list)" msgstr "" -#: ../../Zotlabs/Module/Events.php:451 +#: ../../Zotlabs/Module/Events.php:452 msgid "Edit Category" msgstr "" -#: ../../Zotlabs/Module/Events.php:451 +#: ../../Zotlabs/Module/Events.php:452 msgid "Category" msgstr "" -#: ../../Zotlabs/Module/Events.php:454 +#: ../../Zotlabs/Module/Events.php:455 msgid "Edit start date and time" msgstr "" -#: ../../Zotlabs/Module/Events.php:454 +#: ../../Zotlabs/Module/Events.php:455 msgid "Start date and time" msgstr "" -#: ../../Zotlabs/Module/Events.php:455 ../../Zotlabs/Module/Events.php:458 +#: ../../Zotlabs/Module/Events.php:456 ../../Zotlabs/Module/Events.php:459 msgid "Finish date and time are not known or not relevant" msgstr "" -#: ../../Zotlabs/Module/Events.php:457 +#: ../../Zotlabs/Module/Events.php:458 msgid "Edit finish date and time" msgstr "" -#: ../../Zotlabs/Module/Events.php:457 +#: ../../Zotlabs/Module/Events.php:458 msgid "Finish date and time" msgstr "" -#: ../../Zotlabs/Module/Events.php:459 ../../Zotlabs/Module/Events.php:460 +#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:461 msgid "Adjust for viewer timezone" msgstr "" -#: ../../Zotlabs/Module/Events.php:459 +#: ../../Zotlabs/Module/Events.php:460 msgid "" "Important for events that happen in a particular place. Not practical for " "global holidays." msgstr "" -#: ../../Zotlabs/Module/Events.php:461 +#: ../../Zotlabs/Module/Events.php:462 msgid "Edit Description" msgstr "" -#: ../../Zotlabs/Module/Events.php:463 +#: ../../Zotlabs/Module/Events.php:464 msgid "Edit Location" msgstr "" -#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Locs.php:117 +#: ../../Zotlabs/Module/Events.php:464 ../../Zotlabs/Module/Locs.php:117 #: ../../Zotlabs/Module/Profiles.php:476 ../../Zotlabs/Module/Profiles.php:702 #: ../../Zotlabs/Module/Pubsites.php:40 ../../include/js_strings.php:25 msgid "Location" msgstr "" -#: ../../Zotlabs/Module/Events.php:466 ../../Zotlabs/Module/Events.php:468 +#: ../../Zotlabs/Module/Events.php:467 ../../Zotlabs/Module/Events.php:469 msgid "Share this event" msgstr "" -#: ../../Zotlabs/Module/Events.php:473 +#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Photos.php:1093 +#: ../../Zotlabs/Module/Webpages.php:194 ../../include/ItemObject.php:712 +#: ../../include/conversation.php:1193 ../../include/page_widgets.php:40 +msgid "Preview" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:471 ../../include/conversation.php:1238 +msgid "Permission settings" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:476 msgid "Advanced Options" msgstr "" -#: ../../Zotlabs/Module/Events.php:607 +#: ../../Zotlabs/Module/Events.php:610 msgid "Edit event" msgstr "" -#: ../../Zotlabs/Module/Events.php:609 +#: ../../Zotlabs/Module/Events.php:612 msgid "Delete event" msgstr "" -#: ../../Zotlabs/Module/Events.php:643 +#: ../../Zotlabs/Module/Events.php:646 msgid "calendar" msgstr "" -#: ../../Zotlabs/Module/Events.php:703 +#: ../../Zotlabs/Module/Events.php:706 msgid "Event removed" msgstr "" -#: ../../Zotlabs/Module/Events.php:706 +#: ../../Zotlabs/Module/Events.php:709 msgid "Failed to remove event" msgstr "" -#: ../../Zotlabs/Module/Fbrowser.php:29 ../../include/apps.php:171 -#: ../../include/conversation.php:1642 ../../include/nav.php:92 +#: ../../Zotlabs/Module/Fbrowser.php:29 ../../include/nav.php:92 +#: ../../include/conversation.php:1638 ../../include/apps.php:171 msgid "Photos" msgstr "" -#: ../../Zotlabs/Module/Fbrowser.php:66 ../../Zotlabs/Module/Fbrowser.php:88 -#: ../../Zotlabs/Module/Settings.php:589 ../../Zotlabs/Module/Settings.php:615 -#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138 -#: ../../include/conversation.php:1269 -msgid "Cancel" -msgstr "" - #: ../../Zotlabs/Module/Ffsapi.php:12 msgid "Share content from Firefox to $Projectname" msgstr "" @@ -2691,47 +2675,47 @@ msgstr "" msgid "- select -" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:86 +#: ../../Zotlabs/Module/Filestorage.php:88 msgid "Permission Denied." msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:102 +#: ../../Zotlabs/Module/Filestorage.php:104 msgid "File not found." msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:145 +#: ../../Zotlabs/Module/Filestorage.php:147 msgid "Edit file permissions" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:154 +#: ../../Zotlabs/Module/Filestorage.php:156 msgid "Set/edit permissions" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:155 +#: ../../Zotlabs/Module/Filestorage.php:157 msgid "Include all files and sub folders" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:156 +#: ../../Zotlabs/Module/Filestorage.php:158 msgid "Return to file list" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:158 +#: ../../Zotlabs/Module/Filestorage.php:160 msgid "Copy/paste this code to attach file to a post" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:159 +#: ../../Zotlabs/Module/Filestorage.php:161 msgid "Copy/paste this URL to link file from a web page" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:161 +#: ../../Zotlabs/Module/Filestorage.php:163 msgid "Share this file" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:162 +#: ../../Zotlabs/Module/Filestorage.php:164 msgid "Show URL to this file" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:163 +#: ../../Zotlabs/Module/Filestorage.php:165 msgid "Notify your contacts about this file" msgstr "" @@ -2765,7 +2749,7 @@ msgid "Could not create privacy group." msgstr "" #: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141 -#: ../../include/items.php:5160 +#: ../../include/items.php:3894 msgid "Privacy group not found." msgstr "" @@ -2819,8 +2803,8 @@ msgid "Help:" msgstr "" #: ../../Zotlabs/Module/Help.php:85 ../../Zotlabs/Module/Help.php:90 -#: ../../Zotlabs/Module/Layouts.php:183 ../../include/apps.php:174 -#: ../../include/nav.php:159 +#: ../../Zotlabs/Module/Layouts.php:183 ../../include/nav.php:159 +#: ../../include/apps.php:174 msgid "Help" msgstr "" @@ -2975,7 +2959,7 @@ msgstr "" msgid "Warning: Database versions differ by %1$d updates." msgstr "" -#: ../../Zotlabs/Module/Import.php:150 ../../include/import.php:80 +#: ../../Zotlabs/Module/Import.php:150 ../../include/import.php:84 msgid "Cloned channel not found. Import failed." msgstr "" @@ -3162,7 +3146,7 @@ msgstr "" msgid "You have reached your limit of %1$.0f webpages." msgstr "" -#: ../../Zotlabs/Module/Layouts.php:181 ../../include/text.php:2282 +#: ../../Zotlabs/Module/Layouts.php:181 ../../include/text.php:2279 msgid "Layouts" msgstr "" @@ -3214,13 +3198,13 @@ msgid "Previous action reversed." msgstr "" #: ../../Zotlabs/Module/Like.php:371 ../../Zotlabs/Module/Subthread.php:87 -#: ../../Zotlabs/Module/Tagger.php:47 ../../include/text.php:1969 -#: ../../include/conversation.php:120 +#: ../../Zotlabs/Module/Tagger.php:47 ../../include/conversation.php:120 +#: ../../include/text.php:1952 msgid "photo" msgstr "" #: ../../Zotlabs/Module/Like.php:371 ../../Zotlabs/Module/Subthread.php:87 -#: ../../include/text.php:1975 ../../include/conversation.php:148 +#: ../../include/conversation.php:148 ../../include/text.php:1958 msgid "status" msgstr "" @@ -3457,12 +3441,17 @@ msgstr "" msgid "Subject:" msgstr "" +#: ../../Zotlabs/Module/Mail.php:252 ../../Zotlabs/Module/Mail.php:382 +#: ../../include/conversation.php:1226 +msgid "Attach file" +msgstr "" + #: ../../Zotlabs/Module/Mail.php:254 msgid "Send" msgstr "" #: ../../Zotlabs/Module/Mail.php:257 ../../Zotlabs/Module/Mail.php:387 -#: ../../include/conversation.php:1261 +#: ../../include/conversation.php:1257 msgid "Set expiration date" msgstr "" @@ -3501,48 +3490,48 @@ msgstr "" msgid "Your message for %s (%s):" msgstr "" -#: ../../Zotlabs/Module/Manage.php:134 +#: ../../Zotlabs/Module/Manage.php:136 #: ../../Zotlabs/Module/New_channel.php:121 #, php-format msgid "You have created %1$.0f of %2$.0f allowed channels." msgstr "" -#: ../../Zotlabs/Module/Manage.php:141 +#: ../../Zotlabs/Module/Manage.php:143 msgid "Create a new channel" msgstr "" -#: ../../Zotlabs/Module/Manage.php:162 ../../include/apps.php:164 -#: ../../include/nav.php:206 +#: ../../Zotlabs/Module/Manage.php:164 ../../include/nav.php:206 +#: ../../include/apps.php:164 msgid "Channel Manager" msgstr "" -#: ../../Zotlabs/Module/Manage.php:163 +#: ../../Zotlabs/Module/Manage.php:165 msgid "Current Channel" msgstr "" -#: ../../Zotlabs/Module/Manage.php:165 +#: ../../Zotlabs/Module/Manage.php:167 msgid "Switch to one of your channels by selecting it." msgstr "" -#: ../../Zotlabs/Module/Manage.php:166 +#: ../../Zotlabs/Module/Manage.php:168 msgid "Default Channel" msgstr "" -#: ../../Zotlabs/Module/Manage.php:167 +#: ../../Zotlabs/Module/Manage.php:169 msgid "Make Default" msgstr "" -#: ../../Zotlabs/Module/Manage.php:170 +#: ../../Zotlabs/Module/Manage.php:172 #, php-format msgid "%d new messages" msgstr "" -#: ../../Zotlabs/Module/Manage.php:171 +#: ../../Zotlabs/Module/Manage.php:173 #, php-format msgid "%d new introductions" msgstr "" -#: ../../Zotlabs/Module/Manage.php:173 +#: ../../Zotlabs/Module/Manage.php:175 msgid "Delegated Channel" msgstr "" @@ -3598,7 +3587,7 @@ msgstr "" msgid "Submit and proceed" msgstr "" -#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2281 +#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2278 msgid "Menus" msgstr "" @@ -3676,7 +3665,7 @@ msgid "Menu Item Permissions" msgstr "" #: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:227 -#: ../../Zotlabs/Module/Settings.php:1066 +#: ../../Zotlabs/Module/Settings.php:1068 msgid "(click to open/close)" msgstr "" @@ -3790,31 +3779,31 @@ msgstr "" msgid "Set your current mood and tell your friends" msgstr "" -#: ../../Zotlabs/Module/Network.php:95 +#: ../../Zotlabs/Module/Network.php:96 msgid "No such group" msgstr "" -#: ../../Zotlabs/Module/Network.php:135 +#: ../../Zotlabs/Module/Network.php:136 msgid "No such channel" msgstr "" -#: ../../Zotlabs/Module/Network.php:140 +#: ../../Zotlabs/Module/Network.php:141 msgid "forum" msgstr "" -#: ../../Zotlabs/Module/Network.php:152 +#: ../../Zotlabs/Module/Network.php:153 msgid "Search Results For:" msgstr "" -#: ../../Zotlabs/Module/Network.php:216 +#: ../../Zotlabs/Module/Network.php:217 msgid "Privacy group is empty" msgstr "" -#: ../../Zotlabs/Module/Network.php:225 +#: ../../Zotlabs/Module/Network.php:226 msgid "Privacy group: " msgstr "" -#: ../../Zotlabs/Module/Network.php:251 +#: ../../Zotlabs/Module/Network.php:252 msgid "Invalid connection." msgstr "" @@ -3957,11 +3946,11 @@ msgstr "" msgid "Layout Help" msgstr "" -#: ../../Zotlabs/Module/Photos.php:83 +#: ../../Zotlabs/Module/Photos.php:84 msgid "Page owner information could not be retrieved." msgstr "" -#: ../../Zotlabs/Module/Photos.php:98 ../../Zotlabs/Module/Photos.php:742 +#: ../../Zotlabs/Module/Photos.php:99 ../../Zotlabs/Module/Photos.php:743 #: ../../Zotlabs/Module/Profile_photo.php:114 #: ../../Zotlabs/Module/Profile_photo.php:206 #: ../../Zotlabs/Module/Profile_photo.php:294 @@ -3969,228 +3958,224 @@ msgstr "" msgid "Profile Photos" msgstr "" -#: ../../Zotlabs/Module/Photos.php:104 ../../Zotlabs/Module/Photos.php:148 +#: ../../Zotlabs/Module/Photos.php:105 ../../Zotlabs/Module/Photos.php:149 msgid "Album not found." msgstr "" -#: ../../Zotlabs/Module/Photos.php:131 +#: ../../Zotlabs/Module/Photos.php:132 msgid "Delete Album" msgstr "" -#: ../../Zotlabs/Module/Photos.php:152 +#: ../../Zotlabs/Module/Photos.php:153 msgid "" "Multiple storage folders exist with this album name, but within different " "directories. Please remove the desired folder or folders using the Files " "manager" msgstr "" -#: ../../Zotlabs/Module/Photos.php:209 ../../Zotlabs/Module/Photos.php:1052 +#: ../../Zotlabs/Module/Photos.php:210 ../../Zotlabs/Module/Photos.php:1053 msgid "Delete Photo" msgstr "" -#: ../../Zotlabs/Module/Photos.php:532 +#: ../../Zotlabs/Module/Photos.php:533 msgid "No photos selected" msgstr "" -#: ../../Zotlabs/Module/Photos.php:581 +#: ../../Zotlabs/Module/Photos.php:582 msgid "Access to this item is restricted." msgstr "" -#: ../../Zotlabs/Module/Photos.php:620 +#: ../../Zotlabs/Module/Photos.php:621 #, php-format msgid "%1$.2f MB of %2$.2f MB photo storage used." msgstr "" -#: ../../Zotlabs/Module/Photos.php:623 +#: ../../Zotlabs/Module/Photos.php:624 #, php-format msgid "%1$.2f MB photo storage used." msgstr "" -#: ../../Zotlabs/Module/Photos.php:659 +#: ../../Zotlabs/Module/Photos.php:660 msgid "Upload Photos" msgstr "" -#: ../../Zotlabs/Module/Photos.php:663 +#: ../../Zotlabs/Module/Photos.php:664 msgid "Enter an album name" msgstr "" -#: ../../Zotlabs/Module/Photos.php:664 +#: ../../Zotlabs/Module/Photos.php:665 msgid "or select an existing album (doubleclick)" msgstr "" -#: ../../Zotlabs/Module/Photos.php:665 +#: ../../Zotlabs/Module/Photos.php:666 msgid "Create a status post for this upload" msgstr "" -#: ../../Zotlabs/Module/Photos.php:666 +#: ../../Zotlabs/Module/Photos.php:667 msgid "Caption (optional):" msgstr "" -#: ../../Zotlabs/Module/Photos.php:667 +#: ../../Zotlabs/Module/Photos.php:668 msgid "Description (optional):" msgstr "" -#: ../../Zotlabs/Module/Photos.php:694 +#: ../../Zotlabs/Module/Photos.php:695 msgid "Album name could not be decoded" msgstr "" -#: ../../Zotlabs/Module/Photos.php:742 ../../Zotlabs/Module/Photos.php:1283 -#: ../../Zotlabs/Module/Photos.php:1300 +#: ../../Zotlabs/Module/Photos.php:743 ../../Zotlabs/Module/Photos.php:1284 +#: ../../Zotlabs/Module/Photos.php:1301 msgid "Contact Photos" msgstr "" -#: ../../Zotlabs/Module/Photos.php:765 +#: ../../Zotlabs/Module/Photos.php:766 msgid "Show Newest First" msgstr "" -#: ../../Zotlabs/Module/Photos.php:767 +#: ../../Zotlabs/Module/Photos.php:768 msgid "Show Oldest First" msgstr "" -#: ../../Zotlabs/Module/Photos.php:791 ../../Zotlabs/Module/Photos.php:1333 +#: ../../Zotlabs/Module/Photos.php:792 ../../Zotlabs/Module/Photos.php:1334 #: ../../include/widgets.php:1500 msgid "View Photo" msgstr "" -#: ../../Zotlabs/Module/Photos.php:822 ../../include/widgets.php:1517 +#: ../../Zotlabs/Module/Photos.php:823 ../../include/widgets.php:1517 msgid "Edit Album" msgstr "" -#: ../../Zotlabs/Module/Photos.php:869 +#: ../../Zotlabs/Module/Photos.php:870 msgid "Permission denied. Access to this item may be restricted." msgstr "" -#: ../../Zotlabs/Module/Photos.php:871 +#: ../../Zotlabs/Module/Photos.php:872 msgid "Photo not available" msgstr "" -#: ../../Zotlabs/Module/Photos.php:929 +#: ../../Zotlabs/Module/Photos.php:930 msgid "Use as profile photo" msgstr "" -#: ../../Zotlabs/Module/Photos.php:930 +#: ../../Zotlabs/Module/Photos.php:931 msgid "Use as cover photo" msgstr "" -#: ../../Zotlabs/Module/Photos.php:937 +#: ../../Zotlabs/Module/Photos.php:938 msgid "Private Photo" msgstr "" -#: ../../Zotlabs/Module/Photos.php:952 +#: ../../Zotlabs/Module/Photos.php:953 msgid "View Full Size" msgstr "" -#: ../../Zotlabs/Module/Photos.php:997 ../../Zotlabs/Module/Tagrm.php:137 -msgid "Remove" -msgstr "" - -#: ../../Zotlabs/Module/Photos.php:1031 +#: ../../Zotlabs/Module/Photos.php:1032 msgid "Edit photo" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1033 +#: ../../Zotlabs/Module/Photos.php:1034 msgid "Rotate CW (right)" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1034 +#: ../../Zotlabs/Module/Photos.php:1035 msgid "Rotate CCW (left)" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1037 +#: ../../Zotlabs/Module/Photos.php:1038 msgid "Enter a new album name" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1038 +#: ../../Zotlabs/Module/Photos.php:1039 msgid "or select an existing one (doubleclick)" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1041 +#: ../../Zotlabs/Module/Photos.php:1042 msgid "Caption" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1043 +#: ../../Zotlabs/Module/Photos.php:1044 msgid "Add a Tag" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1047 +#: ../../Zotlabs/Module/Photos.php:1048 msgid "Example: @bob, @Barbara_Jensen, @jim@example.com" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1050 +#: ../../Zotlabs/Module/Photos.php:1051 msgid "Flag as adult in album view" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1069 ../../include/ItemObject.php:254 +#: ../../Zotlabs/Module/Photos.php:1070 ../../include/ItemObject.php:254 msgid "I like this (toggle)" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1070 ../../include/ItemObject.php:255 +#: ../../Zotlabs/Module/Photos.php:1071 ../../include/ItemObject.php:255 msgid "I don't like this (toggle)" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1072 ../../include/ItemObject.php:389 +#: ../../Zotlabs/Module/Photos.php:1073 ../../include/ItemObject.php:389 #: ../../include/conversation.php:740 msgid "Please wait" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1088 ../../Zotlabs/Module/Photos.php:1206 +#: ../../Zotlabs/Module/Photos.php:1089 ../../Zotlabs/Module/Photos.php:1207 #: ../../include/ItemObject.php:700 msgid "This is you" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1090 ../../Zotlabs/Module/Photos.php:1208 +#: ../../Zotlabs/Module/Photos.php:1091 ../../Zotlabs/Module/Photos.php:1209 #: ../../include/ItemObject.php:702 ../../include/js_strings.php:6 msgid "Comment" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1106 ../../include/conversation.php:574 +#: ../../Zotlabs/Module/Photos.php:1107 ../../include/conversation.php:574 msgctxt "title" msgid "Likes" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1106 ../../include/conversation.php:574 +#: ../../Zotlabs/Module/Photos.php:1107 ../../include/conversation.php:574 msgctxt "title" msgid "Dislikes" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1107 ../../include/conversation.php:575 +#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:575 msgctxt "title" msgid "Agree" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1107 ../../include/conversation.php:575 +#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:575 msgctxt "title" msgid "Disagree" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1107 ../../include/conversation.php:575 +#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:575 msgctxt "title" msgid "Abstain" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:576 +#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:576 msgctxt "title" msgid "Attending" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:576 +#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:576 msgctxt "title" msgid "Not attending" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:576 +#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:576 msgctxt "title" msgid "Might attend" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1125 ../../Zotlabs/Module/Photos.php:1137 +#: ../../Zotlabs/Module/Photos.php:1126 ../../Zotlabs/Module/Photos.php:1138 #: ../../include/ItemObject.php:175 ../../include/ItemObject.php:187 -#: ../../include/conversation.php:1728 +#: ../../include/conversation.php:1724 msgid "View all" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1129 ../../include/identity.php:1304 -#: ../../include/ItemObject.php:179 ../../include/conversation.php:1752 +#: ../../Zotlabs/Module/Photos.php:1130 ../../include/identity.php:1304 +#: ../../include/ItemObject.php:179 ../../include/conversation.php:1748 #: ../../include/taxonomy.php:403 msgctxt "noun" msgid "Like" @@ -4198,47 +4183,47 @@ msgid_plural "Likes" msgstr[0] "" msgstr[1] "" -#: ../../Zotlabs/Module/Photos.php:1134 ../../include/ItemObject.php:184 -#: ../../include/conversation.php:1755 +#: ../../Zotlabs/Module/Photos.php:1135 ../../include/ItemObject.php:184 +#: ../../include/conversation.php:1751 msgctxt "noun" msgid "Dislike" msgid_plural "Dislikes" msgstr[0] "" msgstr[1] "" -#: ../../Zotlabs/Module/Photos.php:1234 +#: ../../Zotlabs/Module/Photos.php:1235 msgid "Photo Tools" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1243 +#: ../../Zotlabs/Module/Photos.php:1244 msgid "In This Photo:" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1248 +#: ../../Zotlabs/Module/Photos.php:1249 msgid "Map" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1256 ../../include/ItemObject.php:378 +#: ../../Zotlabs/Module/Photos.php:1257 ../../include/ItemObject.php:378 msgctxt "noun" msgid "Likes" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1257 ../../include/ItemObject.php:379 +#: ../../Zotlabs/Module/Photos.php:1258 ../../include/ItemObject.php:379 msgctxt "noun" msgid "Dislikes" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1262 ../../include/acl_selectors.php:268 +#: ../../Zotlabs/Module/Photos.php:1263 ../../include/acl_selectors.php:287 #: ../../include/ItemObject.php:384 msgid "Close" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1339 +#: ../../Zotlabs/Module/Photos.php:1340 msgid "View Album" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1350 ../../Zotlabs/Module/Photos.php:1363 -#: ../../Zotlabs/Module/Photos.php:1364 +#: ../../Zotlabs/Module/Photos.php:1351 ../../Zotlabs/Module/Photos.php:1364 +#: ../../Zotlabs/Module/Photos.php:1365 msgid "Recent Photos" msgstr "" @@ -4264,8 +4249,8 @@ msgstr "" msgid "posted an event" msgstr "" -#: ../../Zotlabs/Module/Poke.php:168 ../../include/apps.php:177 -#: ../../include/conversation.php:965 +#: ../../Zotlabs/Module/Poke.php:168 ../../include/conversation.php:965 +#: ../../include/apps.php:177 msgid "Poke" msgstr "" @@ -4427,7 +4412,7 @@ msgid "Add profile things" msgstr "" #: ../../Zotlabs/Module/Profiles.php:701 ../../include/widgets.php:105 -#: ../../include/conversation.php:1536 +#: ../../include/conversation.php:1532 msgid "Personal" msgstr "" @@ -4822,7 +4807,7 @@ msgid "" msgstr "" #: ../../Zotlabs/Module/Removeaccount.php:65 -#: ../../Zotlabs/Module/Settings.php:703 +#: ../../Zotlabs/Module/Settings.php:705 msgid "Remove Account" msgstr "" @@ -4850,7 +4835,7 @@ msgid "" "removed from the network" msgstr "" -#: ../../Zotlabs/Module/Removeme.php:65 ../../Zotlabs/Module/Settings.php:1122 +#: ../../Zotlabs/Module/Removeme.php:65 ../../Zotlabs/Module/Settings.php:1124 msgid "Remove Channel" msgstr "" @@ -4894,597 +4879,596 @@ msgstr "" msgid "No service class restrictions found." msgstr "" -#: ../../Zotlabs/Module/Settings.php:67 +#: ../../Zotlabs/Module/Settings.php:69 msgid "Name is required" msgstr "" -#: ../../Zotlabs/Module/Settings.php:71 +#: ../../Zotlabs/Module/Settings.php:73 msgid "Key and Secret are required" msgstr "" -#: ../../Zotlabs/Module/Settings.php:75 ../../Zotlabs/Module/Settings.php:614 -#: ../../include/apps.php:284 -msgid "Update" -msgstr "" - -#: ../../Zotlabs/Module/Settings.php:223 +#: ../../Zotlabs/Module/Settings.php:225 msgid "Not valid email." msgstr "" -#: ../../Zotlabs/Module/Settings.php:226 +#: ../../Zotlabs/Module/Settings.php:228 msgid "Protected email address. Cannot change to that email." msgstr "" -#: ../../Zotlabs/Module/Settings.php:235 +#: ../../Zotlabs/Module/Settings.php:237 msgid "System failure storing new email. Please try again." msgstr "" -#: ../../Zotlabs/Module/Settings.php:252 +#: ../../Zotlabs/Module/Settings.php:254 msgid "Password verification failed." msgstr "" -#: ../../Zotlabs/Module/Settings.php:259 +#: ../../Zotlabs/Module/Settings.php:261 msgid "Passwords do not match. Password unchanged." msgstr "" -#: ../../Zotlabs/Module/Settings.php:263 +#: ../../Zotlabs/Module/Settings.php:265 msgid "Empty passwords are not allowed. Password unchanged." msgstr "" -#: ../../Zotlabs/Module/Settings.php:277 +#: ../../Zotlabs/Module/Settings.php:279 msgid "Password changed." msgstr "" -#: ../../Zotlabs/Module/Settings.php:279 +#: ../../Zotlabs/Module/Settings.php:281 msgid "Password update failed. Please try again." msgstr "" -#: ../../Zotlabs/Module/Settings.php:523 +#: ../../Zotlabs/Module/Settings.php:525 msgid "Settings updated." msgstr "" -#: ../../Zotlabs/Module/Settings.php:587 ../../Zotlabs/Module/Settings.php:613 -#: ../../Zotlabs/Module/Settings.php:649 +#: ../../Zotlabs/Module/Settings.php:589 ../../Zotlabs/Module/Settings.php:615 +#: ../../Zotlabs/Module/Settings.php:651 msgid "Add application" msgstr "" -#: ../../Zotlabs/Module/Settings.php:590 +#: ../../Zotlabs/Module/Settings.php:592 msgid "Name of application" msgstr "" -#: ../../Zotlabs/Module/Settings.php:591 ../../Zotlabs/Module/Settings.php:617 +#: ../../Zotlabs/Module/Settings.php:593 ../../Zotlabs/Module/Settings.php:619 msgid "Consumer Key" msgstr "" -#: ../../Zotlabs/Module/Settings.php:591 ../../Zotlabs/Module/Settings.php:592 +#: ../../Zotlabs/Module/Settings.php:593 ../../Zotlabs/Module/Settings.php:594 msgid "Automatically generated - change if desired. Max length 20" msgstr "" -#: ../../Zotlabs/Module/Settings.php:592 ../../Zotlabs/Module/Settings.php:618 +#: ../../Zotlabs/Module/Settings.php:594 ../../Zotlabs/Module/Settings.php:620 msgid "Consumer Secret" msgstr "" -#: ../../Zotlabs/Module/Settings.php:593 ../../Zotlabs/Module/Settings.php:619 +#: ../../Zotlabs/Module/Settings.php:595 ../../Zotlabs/Module/Settings.php:621 msgid "Redirect" msgstr "" -#: ../../Zotlabs/Module/Settings.php:593 +#: ../../Zotlabs/Module/Settings.php:595 msgid "" "Redirect URI - leave blank unless your application specifically requires this" msgstr "" -#: ../../Zotlabs/Module/Settings.php:594 ../../Zotlabs/Module/Settings.php:620 +#: ../../Zotlabs/Module/Settings.php:596 ../../Zotlabs/Module/Settings.php:622 msgid "Icon url" msgstr "" -#: ../../Zotlabs/Module/Settings.php:594 ../../Zotlabs/Module/Sources.php:112 +#: ../../Zotlabs/Module/Settings.php:596 ../../Zotlabs/Module/Sources.php:112 #: ../../Zotlabs/Module/Sources.php:147 msgid "Optional" msgstr "" -#: ../../Zotlabs/Module/Settings.php:605 +#: ../../Zotlabs/Module/Settings.php:607 msgid "Application not found." msgstr "" -#: ../../Zotlabs/Module/Settings.php:648 +#: ../../Zotlabs/Module/Settings.php:650 msgid "Connected Apps" msgstr "" -#: ../../Zotlabs/Module/Settings.php:652 +#: ../../Zotlabs/Module/Settings.php:654 msgid "Client key starts with" msgstr "" -#: ../../Zotlabs/Module/Settings.php:653 +#: ../../Zotlabs/Module/Settings.php:655 msgid "No name" msgstr "" -#: ../../Zotlabs/Module/Settings.php:654 +#: ../../Zotlabs/Module/Settings.php:656 msgid "Remove authorization" msgstr "" -#: ../../Zotlabs/Module/Settings.php:667 +#: ../../Zotlabs/Module/Settings.php:669 msgid "No feature settings configured" msgstr "" -#: ../../Zotlabs/Module/Settings.php:674 +#: ../../Zotlabs/Module/Settings.php:676 msgid "Feature/Addon Settings" msgstr "" -#: ../../Zotlabs/Module/Settings.php:697 +#: ../../Zotlabs/Module/Settings.php:699 msgid "Account Settings" msgstr "" -#: ../../Zotlabs/Module/Settings.php:698 +#: ../../Zotlabs/Module/Settings.php:700 msgid "Current Password" msgstr "" -#: ../../Zotlabs/Module/Settings.php:699 +#: ../../Zotlabs/Module/Settings.php:701 msgid "Enter New Password" msgstr "" -#: ../../Zotlabs/Module/Settings.php:700 +#: ../../Zotlabs/Module/Settings.php:702 msgid "Confirm New Password" msgstr "" -#: ../../Zotlabs/Module/Settings.php:700 +#: ../../Zotlabs/Module/Settings.php:702 msgid "Leave password fields blank unless changing" msgstr "" -#: ../../Zotlabs/Module/Settings.php:702 -#: ../../Zotlabs/Module/Settings.php:1039 +#: ../../Zotlabs/Module/Settings.php:704 +#: ../../Zotlabs/Module/Settings.php:1041 msgid "Email Address:" msgstr "" -#: ../../Zotlabs/Module/Settings.php:704 +#: ../../Zotlabs/Module/Settings.php:706 msgid "Remove this account including all its channels" msgstr "" -#: ../../Zotlabs/Module/Settings.php:727 +#: ../../Zotlabs/Module/Settings.php:729 msgid "Additional Features" msgstr "" -#: ../../Zotlabs/Module/Settings.php:751 +#: ../../Zotlabs/Module/Settings.php:753 msgid "Connector Settings" msgstr "" -#: ../../Zotlabs/Module/Settings.php:790 +#: ../../Zotlabs/Module/Settings.php:792 msgid "No special theme for mobile devices" msgstr "" -#: ../../Zotlabs/Module/Settings.php:793 +#: ../../Zotlabs/Module/Settings.php:795 #, php-format msgid "%s - (Experimental)" msgstr "" -#: ../../Zotlabs/Module/Settings.php:835 +#: ../../Zotlabs/Module/Settings.php:837 msgid "Display Settings" msgstr "" -#: ../../Zotlabs/Module/Settings.php:836 +#: ../../Zotlabs/Module/Settings.php:838 msgid "Theme Settings" msgstr "" -#: ../../Zotlabs/Module/Settings.php:837 +#: ../../Zotlabs/Module/Settings.php:839 msgid "Custom Theme Settings" msgstr "" -#: ../../Zotlabs/Module/Settings.php:838 +#: ../../Zotlabs/Module/Settings.php:840 msgid "Content Settings" msgstr "" -#: ../../Zotlabs/Module/Settings.php:844 +#: ../../Zotlabs/Module/Settings.php:846 msgid "Display Theme:" msgstr "" -#: ../../Zotlabs/Module/Settings.php:845 +#: ../../Zotlabs/Module/Settings.php:847 msgid "Mobile Theme:" msgstr "" -#: ../../Zotlabs/Module/Settings.php:846 +#: ../../Zotlabs/Module/Settings.php:848 msgid "Preload images before rendering the page" msgstr "" -#: ../../Zotlabs/Module/Settings.php:846 +#: ../../Zotlabs/Module/Settings.php:848 msgid "" "The subjective page load time will be longer but the page will be ready when " "displayed" msgstr "" -#: ../../Zotlabs/Module/Settings.php:847 +#: ../../Zotlabs/Module/Settings.php:849 msgid "Enable user zoom on mobile devices" msgstr "" -#: ../../Zotlabs/Module/Settings.php:848 +#: ../../Zotlabs/Module/Settings.php:850 msgid "Update browser every xx seconds" msgstr "" -#: ../../Zotlabs/Module/Settings.php:848 +#: ../../Zotlabs/Module/Settings.php:850 msgid "Minimum of 10 seconds, no maximum" msgstr "" -#: ../../Zotlabs/Module/Settings.php:849 +#: ../../Zotlabs/Module/Settings.php:851 msgid "Maximum number of conversations to load at any time:" msgstr "" -#: ../../Zotlabs/Module/Settings.php:849 +#: ../../Zotlabs/Module/Settings.php:851 msgid "Maximum of 100 items" msgstr "" -#: ../../Zotlabs/Module/Settings.php:850 +#: ../../Zotlabs/Module/Settings.php:852 msgid "Show emoticons (smilies) as images" msgstr "" -#: ../../Zotlabs/Module/Settings.php:851 +#: ../../Zotlabs/Module/Settings.php:853 msgid "Link post titles to source" msgstr "" -#: ../../Zotlabs/Module/Settings.php:852 +#: ../../Zotlabs/Module/Settings.php:854 msgid "System Page Layout Editor - (advanced)" msgstr "" -#: ../../Zotlabs/Module/Settings.php:855 +#: ../../Zotlabs/Module/Settings.php:857 msgid "Use blog/list mode on channel page" msgstr "" -#: ../../Zotlabs/Module/Settings.php:855 ../../Zotlabs/Module/Settings.php:856 +#: ../../Zotlabs/Module/Settings.php:857 ../../Zotlabs/Module/Settings.php:858 msgid "(comments displayed separately)" msgstr "" -#: ../../Zotlabs/Module/Settings.php:856 +#: ../../Zotlabs/Module/Settings.php:858 msgid "Use blog/list mode on grid page" msgstr "" -#: ../../Zotlabs/Module/Settings.php:857 +#: ../../Zotlabs/Module/Settings.php:859 msgid "Channel page max height of content (in pixels)" msgstr "" -#: ../../Zotlabs/Module/Settings.php:857 ../../Zotlabs/Module/Settings.php:858 +#: ../../Zotlabs/Module/Settings.php:859 ../../Zotlabs/Module/Settings.php:860 msgid "click to expand content exceeding this height" msgstr "" -#: ../../Zotlabs/Module/Settings.php:858 +#: ../../Zotlabs/Module/Settings.php:860 msgid "Grid page max height of content (in pixels)" msgstr "" -#: ../../Zotlabs/Module/Settings.php:892 +#: ../../Zotlabs/Module/Settings.php:894 msgid "Nobody except yourself" msgstr "" -#: ../../Zotlabs/Module/Settings.php:893 +#: ../../Zotlabs/Module/Settings.php:895 msgid "Only those you specifically allow" msgstr "" -#: ../../Zotlabs/Module/Settings.php:894 +#: ../../Zotlabs/Module/Settings.php:896 msgid "Approved connections" msgstr "" -#: ../../Zotlabs/Module/Settings.php:895 +#: ../../Zotlabs/Module/Settings.php:897 msgid "Any connections" msgstr "" -#: ../../Zotlabs/Module/Settings.php:896 +#: ../../Zotlabs/Module/Settings.php:898 msgid "Anybody on this website" msgstr "" -#: ../../Zotlabs/Module/Settings.php:897 +#: ../../Zotlabs/Module/Settings.php:899 msgid "Anybody in this network" msgstr "" -#: ../../Zotlabs/Module/Settings.php:898 +#: ../../Zotlabs/Module/Settings.php:900 msgid "Anybody authenticated" msgstr "" -#: ../../Zotlabs/Module/Settings.php:899 +#: ../../Zotlabs/Module/Settings.php:901 msgid "Anybody on the internet" msgstr "" -#: ../../Zotlabs/Module/Settings.php:974 +#: ../../Zotlabs/Module/Settings.php:976 msgid "Publish your default profile in the network directory" msgstr "" -#: ../../Zotlabs/Module/Settings.php:979 +#: ../../Zotlabs/Module/Settings.php:981 msgid "Allow us to suggest you as a potential friend to new members?" msgstr "" -#: ../../Zotlabs/Module/Settings.php:988 +#: ../../Zotlabs/Module/Settings.php:990 msgid "Your channel address is" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1030 +#: ../../Zotlabs/Module/Settings.php:1032 msgid "Channel Settings" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1037 +#: ../../Zotlabs/Module/Settings.php:1039 msgid "Basic Settings" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1038 ../../include/identity.php:1286 +#: ../../Zotlabs/Module/Settings.php:1040 ../../include/identity.php:1286 msgid "Full Name:" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1040 +#: ../../Zotlabs/Module/Settings.php:1042 msgid "Your Timezone:" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1041 +#: ../../Zotlabs/Module/Settings.php:1043 msgid "Default Post Location:" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1041 +#: ../../Zotlabs/Module/Settings.php:1043 msgid "Geographical location to display on your posts" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1042 +#: ../../Zotlabs/Module/Settings.php:1044 msgid "Use Browser Location:" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1044 +#: ../../Zotlabs/Module/Settings.php:1046 msgid "Adult Content" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1044 +#: ../../Zotlabs/Module/Settings.php:1046 msgid "" "This channel frequently or regularly publishes adult content. (Please tag " "any adult material and/or nudity with #NSFW)" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1046 +#: ../../Zotlabs/Module/Settings.php:1048 msgid "Security and Privacy Settings" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1049 +#: ../../Zotlabs/Module/Settings.php:1051 msgid "Your permissions are already configured. Click to view/adjust" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1051 +#: ../../Zotlabs/Module/Settings.php:1053 msgid "Hide my online presence" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1051 +#: ../../Zotlabs/Module/Settings.php:1053 msgid "Prevents displaying in your profile that you are online" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1053 +#: ../../Zotlabs/Module/Settings.php:1055 msgid "Simple Privacy Settings:" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1054 +#: ../../Zotlabs/Module/Settings.php:1056 msgid "" "Very Public - extremely permissive (should be used with caution)" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1055 +#: ../../Zotlabs/Module/Settings.php:1057 msgid "" "Typical - default public, privacy when desired (similar to social " "network permissions but with improved privacy)" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1056 +#: ../../Zotlabs/Module/Settings.php:1058 msgid "Private - default private, never open or public" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1057 +#: ../../Zotlabs/Module/Settings.php:1059 msgid "Blocked - default blocked to/from everybody" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1059 +#: ../../Zotlabs/Module/Settings.php:1061 msgid "Allow others to tag your posts" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1059 +#: ../../Zotlabs/Module/Settings.php:1061 msgid "" "Often used by the community to retro-actively flag inappropriate content" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1061 +#: ../../Zotlabs/Module/Settings.php:1063 msgid "Advanced Privacy Settings" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1063 +#: ../../Zotlabs/Module/Settings.php:1065 msgid "Expire other channel content after this many days" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1063 +#: ../../Zotlabs/Module/Settings.php:1065 #, php-format msgid "0 or blank to use the website limit. The website expires after %d days." msgstr "" -#: ../../Zotlabs/Module/Settings.php:1064 +#: ../../Zotlabs/Module/Settings.php:1066 msgid "Maximum Friend Requests/Day:" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1064 +#: ../../Zotlabs/Module/Settings.php:1066 msgid "May reduce spam activity" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1065 +#: ../../Zotlabs/Module/Settings.php:1067 msgid "Default Post Permissions" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1070 +#: ../../Zotlabs/Module/Settings.php:1069 +msgid "Use my default audience setting for the type of post" +msgstr "" + +#: ../../Zotlabs/Module/Settings.php:1072 msgid "Channel permissions category:" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1076 +#: ../../Zotlabs/Module/Settings.php:1078 msgid "Maximum private messages per day from unknown people:" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1076 +#: ../../Zotlabs/Module/Settings.php:1078 msgid "Useful to reduce spamming" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1079 +#: ../../Zotlabs/Module/Settings.php:1081 msgid "Notification Settings" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1080 +#: ../../Zotlabs/Module/Settings.php:1082 msgid "By default post a status message when:" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1081 +#: ../../Zotlabs/Module/Settings.php:1083 msgid "accepting a friend request" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1082 +#: ../../Zotlabs/Module/Settings.php:1084 msgid "joining a forum/community" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1083 +#: ../../Zotlabs/Module/Settings.php:1085 msgid "making an interesting profile change" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1084 +#: ../../Zotlabs/Module/Settings.php:1086 msgid "Send a notification email when:" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1085 +#: ../../Zotlabs/Module/Settings.php:1087 msgid "You receive a connection request" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1086 +#: ../../Zotlabs/Module/Settings.php:1088 msgid "Your connections are confirmed" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1087 +#: ../../Zotlabs/Module/Settings.php:1089 msgid "Someone writes on your profile wall" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1088 +#: ../../Zotlabs/Module/Settings.php:1090 msgid "Someone writes a followup comment" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1089 +#: ../../Zotlabs/Module/Settings.php:1091 msgid "You receive a private message" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1090 +#: ../../Zotlabs/Module/Settings.php:1092 msgid "You receive a friend suggestion" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1091 +#: ../../Zotlabs/Module/Settings.php:1093 msgid "You are tagged in a post" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1092 +#: ../../Zotlabs/Module/Settings.php:1094 msgid "You are poked/prodded/etc. in a post" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1095 +#: ../../Zotlabs/Module/Settings.php:1097 msgid "Show visual notifications including:" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1097 +#: ../../Zotlabs/Module/Settings.php:1099 msgid "Unseen grid activity" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1098 +#: ../../Zotlabs/Module/Settings.php:1100 msgid "Unseen channel activity" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1099 +#: ../../Zotlabs/Module/Settings.php:1101 msgid "Unseen private messages" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1099 -#: ../../Zotlabs/Module/Settings.php:1104 -#: ../../Zotlabs/Module/Settings.php:1105 +#: ../../Zotlabs/Module/Settings.php:1101 #: ../../Zotlabs/Module/Settings.php:1106 +#: ../../Zotlabs/Module/Settings.php:1107 +#: ../../Zotlabs/Module/Settings.php:1108 msgid "Recommended" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1100 +#: ../../Zotlabs/Module/Settings.php:1102 msgid "Upcoming events" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1101 +#: ../../Zotlabs/Module/Settings.php:1103 msgid "Events today" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1102 +#: ../../Zotlabs/Module/Settings.php:1104 msgid "Upcoming birthdays" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1102 +#: ../../Zotlabs/Module/Settings.php:1104 msgid "Not available in all themes" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1103 +#: ../../Zotlabs/Module/Settings.php:1105 msgid "System (personal) notifications" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1104 +#: ../../Zotlabs/Module/Settings.php:1106 msgid "System info messages" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1105 +#: ../../Zotlabs/Module/Settings.php:1107 msgid "System critical alerts" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1106 +#: ../../Zotlabs/Module/Settings.php:1108 msgid "New connections" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1107 +#: ../../Zotlabs/Module/Settings.php:1109 msgid "System Registrations" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1108 +#: ../../Zotlabs/Module/Settings.php:1110 msgid "" "Also show new wall posts, private messages and connections under Notices" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1110 +#: ../../Zotlabs/Module/Settings.php:1112 msgid "Notify me of events this many days in advance" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1110 +#: ../../Zotlabs/Module/Settings.php:1112 msgid "Must be greater than 0" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1112 +#: ../../Zotlabs/Module/Settings.php:1114 msgid "Advanced Account/Page Type Settings" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1113 +#: ../../Zotlabs/Module/Settings.php:1115 msgid "Change the behaviour of this account for special situations" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1116 +#: ../../Zotlabs/Module/Settings.php:1118 msgid "" "Please enable expert mode (in Settings > " "Additional features) to adjust!" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1117 +#: ../../Zotlabs/Module/Settings.php:1119 msgid "Miscellaneous Settings" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1118 +#: ../../Zotlabs/Module/Settings.php:1120 msgid "Default photo upload folder" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1118 -#: ../../Zotlabs/Module/Settings.php:1119 +#: ../../Zotlabs/Module/Settings.php:1120 +#: ../../Zotlabs/Module/Settings.php:1121 msgid "%Y - current year, %m - current month" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1119 +#: ../../Zotlabs/Module/Settings.php:1121 msgid "Default file upload folder" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1121 +#: ../../Zotlabs/Module/Settings.php:1123 msgid "Personal menu to display in your channel pages" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1123 +#: ../../Zotlabs/Module/Settings.php:1125 msgid "Remove this channel." msgstr "" -#: ../../Zotlabs/Module/Settings.php:1124 +#: ../../Zotlabs/Module/Settings.php:1126 msgid "Firefox Share $Projectname provider" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1125 +#: ../../Zotlabs/Module/Settings.php:1127 msgid "Start calendar week on monday" msgstr "" @@ -6084,8 +6068,8 @@ msgstr "" msgid "post" msgstr "" -#: ../../Zotlabs/Module/Tagger.php:57 ../../include/text.php:1977 -#: ../../include/conversation.php:150 +#: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:150 +#: ../../include/text.php:1960 msgid "comment" msgstr "" @@ -6238,20 +6222,20 @@ msgstr "" msgid "Source of Item" msgstr "" -#: ../../Zotlabs/Module/Webpages.php:186 ../../include/apps.php:168 -#: ../../include/conversation.php:1696 ../../include/nav.php:106 +#: ../../Zotlabs/Module/Webpages.php:184 ../../include/nav.php:106 +#: ../../include/conversation.php:1692 ../../include/apps.php:168 msgid "Webpages" msgstr "" -#: ../../Zotlabs/Module/Webpages.php:197 ../../include/page_widgets.php:41 +#: ../../Zotlabs/Module/Webpages.php:195 ../../include/page_widgets.php:41 msgid "Actions" msgstr "" -#: ../../Zotlabs/Module/Webpages.php:198 ../../include/page_widgets.php:42 +#: ../../Zotlabs/Module/Webpages.php:196 ../../include/page_widgets.php:42 msgid "Page Link" msgstr "" -#: ../../Zotlabs/Module/Webpages.php:199 +#: ../../Zotlabs/Module/Webpages.php:197 msgid "Page Title" msgstr "" @@ -6267,11 +6251,11 @@ msgstr "" msgid "No username found in import file." msgstr "" -#: ../../include/Import/import_diaspora.php:42 ../../include/import.php:44 +#: ../../include/Import/import_diaspora.php:42 ../../include/import.php:48 msgid "Unable to create a unique channel address. Import failed." msgstr "" -#: ../../include/dba/dba_driver.php:141 +#: ../../include/dba/dba_driver.php:142 #, php-format msgid "Cannot locate DNS info for database server '%s'" msgstr "" @@ -6467,33 +6451,42 @@ msgstr "" msgid "commented on %s's post" msgstr "" -#: ../../include/acl_selectors.php:230 +#: ../../include/oembed.php:324 +msgid "Embedded content" +msgstr "" + +#: ../../include/oembed.php:333 +msgid "Embedding disabled" +msgstr "" + +#: ../../include/acl_selectors.php:236 +#: ../../include/PermissionDescription.php:31 msgid "Visible to your default audience" msgstr "" -#: ../../include/acl_selectors.php:255 +#: ../../include/acl_selectors.php:274 msgid "Limit access:" msgstr "" -#: ../../include/acl_selectors.php:256 +#: ../../include/acl_selectors.php:275 msgid "" "Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit " "the scope of \"Show\"." msgstr "" -#: ../../include/acl_selectors.php:257 +#: ../../include/acl_selectors.php:276 msgid "Show" msgstr "" -#: ../../include/acl_selectors.php:258 +#: ../../include/acl_selectors.php:277 msgid "Don't show" msgstr "" -#: ../../include/acl_selectors.php:264 +#: ../../include/acl_selectors.php:283 msgid "Other networks and post services" msgstr "" -#: ../../include/acl_selectors.php:294 +#: ../../include/acl_selectors.php:313 #, php-format msgid "" "Post permissions %s cannot be changed %s after a post is shared.
These " @@ -6756,93 +6749,105 @@ msgstr "" msgid "%1$s has an updated %2$s, changing %3$s." msgstr "" -#: ../../include/apps.php:155 -msgid "Site Admin" +#: ../../include/contact_widgets.php:14 +#, php-format +msgid "%d invitation available" +msgid_plural "%d invitations available" +msgstr[0] "" +msgstr[1] "" + +#: ../../include/contact_widgets.php:22 +msgid "Find Channels" msgstr "" -#: ../../include/apps.php:156 -msgid "Bug Report" +#: ../../include/contact_widgets.php:23 +msgid "Enter name or interest" msgstr "" -#: ../../include/apps.php:157 -msgid "View Bookmarks" +#: ../../include/contact_widgets.php:24 +msgid "Connect/Follow" msgstr "" -#: ../../include/apps.php:158 -msgid "My Chatrooms" +#: ../../include/contact_widgets.php:25 +msgid "Examples: Robert Morgenstein, Fishing" msgstr "" -#: ../../include/apps.php:160 -msgid "Firefox Share" +#: ../../include/contact_widgets.php:29 +msgid "Random Profile" msgstr "" -#: ../../include/apps.php:161 -msgid "Remote Diagnostics" +#: ../../include/contact_widgets.php:30 +msgid "Invite Friends" msgstr "" -#: ../../include/apps.php:162 ../../include/features.php:89 -msgid "Suggest Channels" +#: ../../include/contact_widgets.php:32 +msgid "Advanced example: name=fred and country=iceland" msgstr "" -#: ../../include/apps.php:163 ../../include/nav.php:110 ../../boot.php:1615 -msgid "Login" +#: ../../include/contact_widgets.php:57 ../../include/widgets.php:310 +#: ../../include/features.php:97 +msgid "Saved Folders" msgstr "" -#: ../../include/apps.php:165 ../../include/nav.php:179 -msgid "Grid" +#: ../../include/contact_widgets.php:60 ../../include/contact_widgets.php:100 +#: ../../include/widgets.php:313 ../../include/widgets.php:432 +msgid "Everything" msgstr "" -#: ../../include/apps.php:169 ../../include/nav.php:182 -msgid "Channel Home" +#: ../../include/contact_widgets.php:97 ../../include/widgets.php:46 +#: ../../include/widgets.php:429 ../../include/taxonomy.php:188 +#: ../../include/taxonomy.php:270 +msgid "Categories" msgstr "" -#: ../../include/apps.php:172 ../../include/conversation.php:1659 -#: ../../include/conversation.php:1662 ../../include/nav.php:201 -msgid "Events" +#: ../../include/contact_widgets.php:130 +#, php-format +msgid "%d connection in common" +msgid_plural "%d connections in common" +msgstr[0] "" +msgstr[1] "" + +#: ../../include/contact_widgets.php:135 +msgid "show more" msgstr "" -#: ../../include/apps.php:173 ../../include/nav.php:167 -msgid "Directory" +#: ../../include/event.php:22 ../../include/text.php:1466 +#: ../../include/bb2diaspora.php:487 +msgid "l F d, Y \\@ g:i A" msgstr "" -#: ../../include/apps.php:175 ../../include/nav.php:193 -msgid "Mail" +#: ../../include/event.php:30 ../../include/text.php:1470 +#: ../../include/bb2diaspora.php:493 +msgid "Starts:" msgstr "" -#: ../../include/apps.php:178 ../../include/nav.php:96 -msgid "Chat" +#: ../../include/event.php:40 ../../include/text.php:1474 +#: ../../include/bb2diaspora.php:501 +msgid "Finishes:" msgstr "" -#: ../../include/apps.php:180 -msgid "Probe" +#: ../../include/event.php:769 +msgid "This event has been added to your calendar." msgstr "" -#: ../../include/apps.php:181 -msgid "Suggest" +#: ../../include/event.php:968 +msgid "Not specified" msgstr "" -#: ../../include/apps.php:182 -msgid "Random Channel" +#: ../../include/event.php:969 +msgid "Needs Action" msgstr "" -#: ../../include/apps.php:183 -msgid "Invite" +#: ../../include/event.php:970 +msgid "Completed" msgstr "" -#: ../../include/apps.php:184 ../../include/widgets.php:1387 -msgid "Features" +#: ../../include/event.php:971 +msgid "In Process" msgstr "" -#: ../../include/apps.php:186 -msgid "Post" -msgstr "" - -#: ../../include/apps.php:284 -msgid "Install" -msgstr "" - -#: ../../include/apps.php:289 -msgid "Purchase" +#: ../../include/event.php:972 +msgid "Cancelled" msgstr "" #: ../../include/photos.php:112 @@ -6868,7 +6873,7 @@ msgctxt "photo_upload" msgid "%1$s posted %2$s to %3$s" msgstr "" -#: ../../include/photos.php:506 ../../include/conversation.php:1645 +#: ../../include/photos.php:506 ../../include/conversation.php:1641 msgid "Photo Albums" msgstr "" @@ -6876,57 +6881,30 @@ msgstr "" msgid "Upload New Photos" msgstr "" -#: ../../include/bb2diaspora.php:398 -msgid "Attachments:" +#: ../../include/import.php:27 +msgid "" +"Cannot create a duplicate channel identifier on this system. Import failed." msgstr "" -#: ../../include/bb2diaspora.php:487 ../../include/event.php:22 -#: ../../include/text.php:1466 -msgid "l F d, Y \\@ g:i A" +#: ../../include/import.php:74 +msgid "Channel clone failed. Import failed." msgstr "" -#: ../../include/bb2diaspora.php:489 -msgid "$Projectname event notification:" +#: ../../include/zot.php:680 +msgid "Invalid data packet" msgstr "" -#: ../../include/bb2diaspora.php:493 ../../include/event.php:30 -#: ../../include/text.php:1470 -msgid "Starts:" +#: ../../include/zot.php:696 +msgid "Unable to verify channel signature" msgstr "" -#: ../../include/bb2diaspora.php:501 ../../include/event.php:40 -#: ../../include/text.php:1474 -msgid "Finishes:" +#: ../../include/zot.php:2342 +#, php-format +msgid "Unable to verify site signature for %s" msgstr "" -#: ../../include/event.php:779 -msgid "This event has been added to your calendar." -msgstr "" - -#: ../../include/event.php:978 -msgid "Not specified" -msgstr "" - -#: ../../include/event.php:979 -msgid "Needs Action" -msgstr "" - -#: ../../include/event.php:980 -msgid "Completed" -msgstr "" - -#: ../../include/event.php:981 -msgid "In Process" -msgstr "" - -#: ../../include/event.php:982 -msgid "Cancelled" -msgstr "" - -#: ../../include/widgets.php:46 ../../include/widgets.php:429 -#: ../../include/contact_widgets.php:97 ../../include/taxonomy.php:188 -#: ../../include/taxonomy.php:270 -msgid "Categories" +#: ../../include/zot.php:3680 +msgid "invalid target signature" msgstr "" #: ../../include/widgets.php:103 @@ -6978,16 +6956,6 @@ msgstr "" msgid "add" msgstr "" -#: ../../include/widgets.php:310 ../../include/contact_widgets.php:57 -#: ../../include/features.php:97 -msgid "Saved Folders" -msgstr "" - -#: ../../include/widgets.php:313 ../../include/widgets.php:432 -#: ../../include/contact_widgets.php:60 ../../include/contact_widgets.php:100 -msgid "Everything" -msgstr "" - #: ../../include/widgets.php:354 msgid "Archives" msgstr "" @@ -7100,8 +7068,8 @@ msgstr "" msgid "Import Calendar" msgstr "" -#: ../../include/widgets.php:843 ../../include/conversation.php:1673 -#: ../../include/conversation.php:1676 +#: ../../include/widgets.php:843 ../../include/conversation.php:1669 +#: ../../include/conversation.php:1672 msgid "Chatrooms" msgstr "" @@ -7177,6 +7145,10 @@ msgstr "" msgid "Member registrations waiting for confirmation" msgstr "" +#: ../../include/widgets.php:1387 ../../include/apps.php:184 +msgid "Features" +msgstr "" + #: ../../include/widgets.php:1390 msgid "Inspect queue" msgstr "" @@ -7245,69 +7217,288 @@ msgid "" "form has been opened for too long (>3 hours) before submitting it." msgstr "" -#: ../../include/import.php:23 -msgid "" -"Cannot create a duplicate channel identifier on this system. Import failed." -msgstr "" - -#: ../../include/import.php:70 -msgid "Channel clone failed. Import failed." -msgstr "" - -#: ../../include/items.php:1138 ../../include/items.php:1183 +#: ../../include/items.php:890 ../../include/items.php:935 msgid "(Unknown)" msgstr "" -#: ../../include/items.php:1382 +#: ../../include/items.php:1134 msgid "Visible to anybody on the internet." msgstr "" -#: ../../include/items.php:1384 +#: ../../include/items.php:1136 msgid "Visible to you only." msgstr "" -#: ../../include/items.php:1386 +#: ../../include/items.php:1138 msgid "Visible to anybody in this network." msgstr "" -#: ../../include/items.php:1388 +#: ../../include/items.php:1140 msgid "Visible to anybody authenticated." msgstr "" -#: ../../include/items.php:1390 +#: ../../include/items.php:1142 #, php-format msgid "Visible to anybody on %s." msgstr "" -#: ../../include/items.php:1392 +#: ../../include/items.php:1144 msgid "Visible to all connections." msgstr "" -#: ../../include/items.php:1394 +#: ../../include/items.php:1146 msgid "Visible to approved connections." msgstr "" -#: ../../include/items.php:1396 +#: ../../include/items.php:1148 msgid "Visible to specific connections." msgstr "" -#: ../../include/items.php:5176 +#: ../../include/items.php:3910 msgid "Privacy group is empty." msgstr "" -#: ../../include/items.php:5183 +#: ../../include/items.php:3917 #, php-format msgid "Privacy group: %s" msgstr "" -#: ../../include/items.php:5195 +#: ../../include/items.php:3929 msgid "Connection not found." msgstr "" -#: ../../include/items.php:5628 +#: ../../include/items.php:4278 msgid "profile photo" msgstr "" +#: ../../include/nav.php:82 ../../include/nav.php:113 ../../boot.php:1614 +msgid "Logout" +msgstr "" + +#: ../../include/nav.php:82 ../../include/nav.php:113 +msgid "End this session" +msgstr "" + +#: ../../include/nav.php:85 ../../include/nav.php:144 +msgid "Home" +msgstr "" + +#: ../../include/nav.php:85 +msgid "Your posts and conversations" +msgstr "" + +#: ../../include/nav.php:86 +msgid "Your profile page" +msgstr "" + +#: ../../include/nav.php:88 +msgid "Manage/Edit profiles" +msgstr "" + +#: ../../include/nav.php:90 +msgid "Edit your profile" +msgstr "" + +#: ../../include/nav.php:92 +msgid "Your photos" +msgstr "" + +#: ../../include/nav.php:93 +msgid "Your files" +msgstr "" + +#: ../../include/nav.php:96 ../../include/apps.php:178 +msgid "Chat" +msgstr "" + +#: ../../include/nav.php:96 +msgid "Your chatrooms" +msgstr "" + +#: ../../include/nav.php:102 ../../include/conversation.php:1682 +msgid "Bookmarks" +msgstr "" + +#: ../../include/nav.php:102 +msgid "Your bookmarks" +msgstr "" + +#: ../../include/nav.php:106 +msgid "Your webpages" +msgstr "" + +#: ../../include/nav.php:110 ../../include/apps.php:163 ../../boot.php:1615 +msgid "Login" +msgstr "" + +#: ../../include/nav.php:110 +msgid "Sign in" +msgstr "" + +#: ../../include/nav.php:127 +#, php-format +msgid "%s - click to logout" +msgstr "" + +#: ../../include/nav.php:130 +msgid "Remote authentication" +msgstr "" + +#: ../../include/nav.php:130 +msgid "Click to authenticate to your home hub" +msgstr "" + +#: ../../include/nav.php:144 +msgid "Home Page" +msgstr "" + +#: ../../include/nav.php:147 +msgid "Create an account" +msgstr "" + +#: ../../include/nav.php:159 +msgid "Help and documentation" +msgstr "" + +#: ../../include/nav.php:163 +msgid "Applications, utilities, links, games" +msgstr "" + +#: ../../include/nav.php:165 +msgid "Search site @name, #tag, ?docs, content" +msgstr "" + +#: ../../include/nav.php:167 ../../include/apps.php:173 +msgid "Directory" +msgstr "" + +#: ../../include/nav.php:167 +msgid "Channel Directory" +msgstr "" + +#: ../../include/nav.php:179 ../../include/apps.php:165 +msgid "Grid" +msgstr "" + +#: ../../include/nav.php:179 +msgid "Your grid" +msgstr "" + +#: ../../include/nav.php:180 +msgid "Mark all grid notifications seen" +msgstr "" + +#: ../../include/nav.php:182 ../../include/apps.php:169 +msgid "Channel Home" +msgstr "" + +#: ../../include/nav.php:182 +msgid "Channel home" +msgstr "" + +#: ../../include/nav.php:183 +msgid "Mark all channel notifications seen" +msgstr "" + +#: ../../include/nav.php:189 +msgid "Notices" +msgstr "" + +#: ../../include/nav.php:189 +msgid "Notifications" +msgstr "" + +#: ../../include/nav.php:190 +msgid "See all notifications" +msgstr "" + +#: ../../include/nav.php:193 ../../include/apps.php:175 +msgid "Mail" +msgstr "" + +#: ../../include/nav.php:193 +msgid "Private mail" +msgstr "" + +#: ../../include/nav.php:194 +msgid "See all private messages" +msgstr "" + +#: ../../include/nav.php:195 +msgid "Mark all private messages seen" +msgstr "" + +#: ../../include/nav.php:201 ../../include/conversation.php:1655 +#: ../../include/conversation.php:1658 ../../include/apps.php:172 +msgid "Events" +msgstr "" + +#: ../../include/nav.php:201 +msgid "Event Calendar" +msgstr "" + +#: ../../include/nav.php:202 +msgid "See all events" +msgstr "" + +#: ../../include/nav.php:203 +msgid "Mark all events seen" +msgstr "" + +#: ../../include/nav.php:206 +msgid "Manage Your Channels" +msgstr "" + +#: ../../include/nav.php:208 +msgid "Account/Channel Settings" +msgstr "" + +#: ../../include/nav.php:216 +msgid "Site Setup and Configuration" +msgstr "" + +#: ../../include/nav.php:247 ../../include/conversation.php:854 +msgid "Loading..." +msgstr "" + +#: ../../include/nav.php:252 +msgid "@name, #tag, ?doc, content" +msgstr "" + +#: ../../include/nav.php:253 +msgid "Please wait..." +msgstr "" + +#: ../../include/network.php:659 +msgid "view full size" +msgstr "" + +#: ../../include/network.php:1827 ../../include/enotify.php:57 +msgid "$Projectname Notification" +msgstr "" + +#: ../../include/network.php:1828 ../../include/enotify.php:58 +msgid "$projectname" +msgstr "" + +#: ../../include/network.php:1830 ../../include/enotify.php:60 +msgid "Thank You," +msgstr "" + +#: ../../include/network.php:1832 ../../include/enotify.php:62 +#, php-format +msgid "%s Administrator" +msgstr "" + +#: ../../include/network.php:1875 ../../include/account.php:317 +#: ../../include/account.php:344 ../../include/account.php:404 +msgid "Administrator" +msgstr "" + +#: ../../include/network.php:1889 +msgid "No Subject" +msgstr "" + #: ../../include/contact_selectors.php:56 msgid "Frequently" msgstr "" @@ -7373,52 +7564,6 @@ msgstr "" msgid "MySpace" msgstr "" -#: ../../include/contact_widgets.php:14 -#, php-format -msgid "%d invitation available" -msgid_plural "%d invitations available" -msgstr[0] "" -msgstr[1] "" - -#: ../../include/contact_widgets.php:22 -msgid "Find Channels" -msgstr "" - -#: ../../include/contact_widgets.php:23 -msgid "Enter name or interest" -msgstr "" - -#: ../../include/contact_widgets.php:24 -msgid "Connect/Follow" -msgstr "" - -#: ../../include/contact_widgets.php:25 -msgid "Examples: Robert Morgenstein, Fishing" -msgstr "" - -#: ../../include/contact_widgets.php:29 -msgid "Random Profile" -msgstr "" - -#: ../../include/contact_widgets.php:30 -msgid "Invite Friends" -msgstr "" - -#: ../../include/contact_widgets.php:32 -msgid "Advanced example: name=fred and country=iceland" -msgstr "" - -#: ../../include/contact_widgets.php:130 -#, php-format -msgid "%d connection in common" -msgid_plural "%d connections in common" -msgstr[0] "" -msgstr[1] "" - -#: ../../include/contact_widgets.php:135 -msgid "show more" -msgstr "" - #: ../../include/attach.php:247 ../../include/attach.php:333 msgid "Item was not found." msgstr "" @@ -7493,7 +7638,7 @@ msgstr "" msgid "YYYY-MM-DD or MM-DD" msgstr "" -#: ../../include/datetime.php:273 ../../boot.php:2448 +#: ../../include/datetime.php:273 ../../boot.php:2463 msgid "never" msgstr "" @@ -7582,23 +7727,6 @@ msgstr "" msgid "This Website Only" msgstr "" -#: ../../include/enotify.php:57 ../../include/network.php:1827 -msgid "$Projectname Notification" -msgstr "" - -#: ../../include/enotify.php:58 ../../include/network.php:1828 -msgid "$projectname" -msgstr "" - -#: ../../include/enotify.php:60 ../../include/network.php:1830 -msgid "Thank You," -msgstr "" - -#: ../../include/enotify.php:62 ../../include/network.php:1832 -#, php-format -msgid "%s Administrator" -msgstr "" - #: ../../include/enotify.php:96 #, php-format msgid "%s " @@ -7904,7 +8032,7 @@ msgstr "" msgid "Expires: %s" msgstr "" -#: ../../include/ItemObject.php:362 ../../bookmarker/bookmarker.php:45 +#: ../../include/ItemObject.php:362 msgid "Save Bookmarks" msgstr "" @@ -7920,6 +8048,26 @@ msgstr "" msgid "[+] show all" msgstr "" +#: ../../include/ItemObject.php:704 ../../include/conversation.php:1221 +msgid "Bold" +msgstr "" + +#: ../../include/ItemObject.php:705 ../../include/conversation.php:1222 +msgid "Italic" +msgstr "" + +#: ../../include/ItemObject.php:706 ../../include/conversation.php:1223 +msgid "Underline" +msgstr "" + +#: ../../include/ItemObject.php:707 ../../include/conversation.php:1224 +msgid "Quote" +msgstr "" + +#: ../../include/ItemObject.php:708 ../../include/conversation.php:1225 +msgid "Code" +msgstr "" + #: ../../include/ItemObject.php:709 msgid "Image" msgstr "" @@ -7932,6 +8080,650 @@ msgstr "" msgid "Video" msgstr "" +#: ../../include/features.php:48 +msgid "General Features" +msgstr "" + +#: ../../include/features.php:50 +msgid "Content Expiration" +msgstr "" + +#: ../../include/features.php:50 +msgid "Remove posts/comments and/or private messages at a future time" +msgstr "" + +#: ../../include/features.php:51 +msgid "Multiple Profiles" +msgstr "" + +#: ../../include/features.php:51 +msgid "Ability to create multiple profiles" +msgstr "" + +#: ../../include/features.php:52 +msgid "Advanced Profiles" +msgstr "" + +#: ../../include/features.php:52 +msgid "Additional profile sections and selections" +msgstr "" + +#: ../../include/features.php:53 +msgid "Profile Import/Export" +msgstr "" + +#: ../../include/features.php:53 +msgid "Save and load profile details across sites/channels" +msgstr "" + +#: ../../include/features.php:54 +msgid "Web Pages" +msgstr "" + +#: ../../include/features.php:54 +msgid "Provide managed web pages on your channel" +msgstr "" + +#: ../../include/features.php:55 +msgid "Hide Rating" +msgstr "" + +#: ../../include/features.php:55 +msgid "" +"Hide the rating buttons on your channel and profile pages. Note: People can " +"still rate you somewhere else." +msgstr "" + +#: ../../include/features.php:56 +msgid "Private Notes" +msgstr "" + +#: ../../include/features.php:56 +msgid "Enables a tool to store notes and reminders (note: not encrypted)" +msgstr "" + +#: ../../include/features.php:57 +msgid "Navigation Channel Select" +msgstr "" + +#: ../../include/features.php:57 +msgid "Change channels directly from within the navigation dropdown menu" +msgstr "" + +#: ../../include/features.php:58 +msgid "Photo Location" +msgstr "" + +#: ../../include/features.php:58 +msgid "If location data is available on uploaded photos, link this to a map." +msgstr "" + +#: ../../include/features.php:59 +msgid "Access Controlled Chatrooms" +msgstr "" + +#: ../../include/features.php:59 +msgid "Provide chatrooms and chat services with access control." +msgstr "" + +#: ../../include/features.php:60 +msgid "Smart Birthdays" +msgstr "" + +#: ../../include/features.php:60 +msgid "" +"Make birthday events timezone aware in case your friends are scattered " +"across the planet." +msgstr "" + +#: ../../include/features.php:61 +msgid "Expert Mode" +msgstr "" + +#: ../../include/features.php:61 +msgid "Enable Expert Mode to provide advanced configuration options" +msgstr "" + +#: ../../include/features.php:62 +msgid "Premium Channel" +msgstr "" + +#: ../../include/features.php:62 +msgid "" +"Allows you to set restrictions and terms on those that connect with your " +"channel" +msgstr "" + +#: ../../include/features.php:67 +msgid "Post Composition Features" +msgstr "" + +#: ../../include/features.php:70 +msgid "Large Photos" +msgstr "" + +#: ../../include/features.php:70 +msgid "" +"Include large (1024px) photo thumbnails in posts. If not enabled, use small " +"(640px) photo thumbnails" +msgstr "" + +#: ../../include/features.php:71 +msgid "Automatically import channel content from other channels or feeds" +msgstr "" + +#: ../../include/features.php:72 +msgid "Even More Encryption" +msgstr "" + +#: ../../include/features.php:72 +msgid "" +"Allow optional encryption of content end-to-end with a shared secret key" +msgstr "" + +#: ../../include/features.php:73 +msgid "Enable Voting Tools" +msgstr "" + +#: ../../include/features.php:73 +msgid "Provide a class of post which others can vote on" +msgstr "" + +#: ../../include/features.php:74 +msgid "Delayed Posting" +msgstr "" + +#: ../../include/features.php:74 +msgid "Allow posts to be published at a later date" +msgstr "" + +#: ../../include/features.php:75 +msgid "Suppress Duplicate Posts/Comments" +msgstr "" + +#: ../../include/features.php:75 +msgid "" +"Prevent posts with identical content to be published with less than two " +"minutes in between submissions." +msgstr "" + +#: ../../include/features.php:81 +msgid "Network and Stream Filtering" +msgstr "" + +#: ../../include/features.php:82 +msgid "Search by Date" +msgstr "" + +#: ../../include/features.php:82 +msgid "Ability to select posts by date ranges" +msgstr "" + +#: ../../include/features.php:83 ../../include/group.php:311 +msgid "Privacy Groups" +msgstr "" + +#: ../../include/features.php:83 +msgid "Enable management and selection of privacy groups" +msgstr "" + +#: ../../include/features.php:84 +msgid "Save search terms for re-use" +msgstr "" + +#: ../../include/features.php:85 +msgid "Network Personal Tab" +msgstr "" + +#: ../../include/features.php:85 +msgid "Enable tab to display only Network posts that you've interacted on" +msgstr "" + +#: ../../include/features.php:86 +msgid "Network New Tab" +msgstr "" + +#: ../../include/features.php:86 +msgid "Enable tab to display all new Network activity" +msgstr "" + +#: ../../include/features.php:87 +msgid "Affinity Tool" +msgstr "" + +#: ../../include/features.php:87 +msgid "Filter stream activity by depth of relationships" +msgstr "" + +#: ../../include/features.php:88 +msgid "Connection Filtering" +msgstr "" + +#: ../../include/features.php:88 +msgid "Filter incoming posts from connections based on keywords/content" +msgstr "" + +#: ../../include/features.php:89 ../../include/apps.php:162 +msgid "Suggest Channels" +msgstr "" + +#: ../../include/features.php:89 +msgid "Show channel suggestions" +msgstr "" + +#: ../../include/features.php:94 +msgid "Post/Comment Tools" +msgstr "" + +#: ../../include/features.php:95 +msgid "Community Tagging" +msgstr "" + +#: ../../include/features.php:95 +msgid "Ability to tag existing posts" +msgstr "" + +#: ../../include/features.php:96 +msgid "Post Categories" +msgstr "" + +#: ../../include/features.php:96 +msgid "Add categories to your posts" +msgstr "" + +#: ../../include/features.php:97 +msgid "Ability to file posts under folders" +msgstr "" + +#: ../../include/features.php:98 +msgid "Dislike Posts" +msgstr "" + +#: ../../include/features.php:98 +msgid "Ability to dislike posts/comments" +msgstr "" + +#: ../../include/features.php:99 +msgid "Star Posts" +msgstr "" + +#: ../../include/features.php:99 +msgid "Ability to mark special posts with a star indicator" +msgstr "" + +#: ../../include/features.php:100 +msgid "Tag Cloud" +msgstr "" + +#: ../../include/features.php:100 +msgid "Provide a personal tag cloud on your channel page" +msgstr "" + +#: ../../include/follow.php:28 +msgid "Channel is blocked on this site." +msgstr "" + +#: ../../include/follow.php:33 +msgid "Channel location missing." +msgstr "" + +#: ../../include/follow.php:82 +msgid "Response from remote channel was incomplete." +msgstr "" + +#: ../../include/follow.php:99 +msgid "Channel was deleted and no longer exists." +msgstr "" + +#: ../../include/follow.php:155 ../../include/follow.php:191 +msgid "Protocol disabled." +msgstr "" + +#: ../../include/follow.php:179 +msgid "Channel discovery failed." +msgstr "" + +#: ../../include/follow.php:217 +msgid "Cannot connect to yourself." +msgstr "" + +#: ../../include/group.php:26 +msgid "" +"A deleted group with this name was revived. Existing item permissions " +"may apply to this group and any future members. If this is " +"not what you intended, please create another group with a different name." +msgstr "" + +#: ../../include/group.php:248 +msgid "Add new connections to this privacy group" +msgstr "" + +#: ../../include/group.php:289 +msgid "edit" +msgstr "" + +#: ../../include/group.php:312 +msgid "Edit group" +msgstr "" + +#: ../../include/group.php:313 +msgid "Add privacy group" +msgstr "" + +#: ../../include/group.php:314 +msgid "Channels not in any privacy group" +msgstr "" + +#: ../../include/bbcode.php:123 ../../include/bbcode.php:848 +#: ../../include/bbcode.php:851 ../../include/bbcode.php:856 +#: ../../include/bbcode.php:859 ../../include/bbcode.php:862 +#: ../../include/bbcode.php:865 ../../include/bbcode.php:870 +#: ../../include/bbcode.php:873 ../../include/bbcode.php:878 +#: ../../include/bbcode.php:881 ../../include/bbcode.php:884 +#: ../../include/bbcode.php:887 +msgid "Image/photo" +msgstr "" + +#: ../../include/bbcode.php:162 ../../include/bbcode.php:898 +msgid "Encrypted content" +msgstr "" + +#: ../../include/bbcode.php:179 +#, php-format +msgid "Install %s element: " +msgstr "" + +#: ../../include/bbcode.php:183 +#, php-format +msgid "" +"This post contains an installable %s element, however you lack permissions " +"to install it on this site." +msgstr "" + +#: ../../include/bbcode.php:255 +#, php-format +msgid "%1$s wrote the following %2$s %3$s" +msgstr "" + +#: ../../include/bbcode.php:333 ../../include/bbcode.php:341 +msgid "Click to open/close" +msgstr "" + +#: ../../include/bbcode.php:341 +msgid "spoiler" +msgstr "" + +#: ../../include/bbcode.php:586 +msgid "Different viewers will see this text differently" +msgstr "" + +#: ../../include/bbcode.php:836 +msgid "$1 wrote:" +msgstr "" + +#: ../../include/conversation.php:204 +#, php-format +msgid "%1$s is now connected with %2$s" +msgstr "" + +#: ../../include/conversation.php:239 +#, php-format +msgid "%1$s poked %2$s" +msgstr "" + +#: ../../include/conversation.php:243 ../../include/text.php:1021 +#: ../../include/text.php:1026 +msgid "poked" +msgstr "" + +#: ../../include/conversation.php:691 +#, php-format +msgid "View %s's profile @ %s" +msgstr "" + +#: ../../include/conversation.php:710 +msgid "Categories:" +msgstr "" + +#: ../../include/conversation.php:711 +msgid "Filed under:" +msgstr "" + +#: ../../include/conversation.php:738 +msgid "View in context" +msgstr "" + +#: ../../include/conversation.php:850 +msgid "remove" +msgstr "" + +#: ../../include/conversation.php:855 +msgid "Delete Selected Items" +msgstr "" + +#: ../../include/conversation.php:953 +msgid "View Source" +msgstr "" + +#: ../../include/conversation.php:954 +msgid "Follow Thread" +msgstr "" + +#: ../../include/conversation.php:955 +msgid "Unfollow Thread" +msgstr "" + +#: ../../include/conversation.php:960 +msgid "Activity/Posts" +msgstr "" + +#: ../../include/conversation.php:962 +msgid "Edit Connection" +msgstr "" + +#: ../../include/conversation.php:963 +msgid "Message" +msgstr "" + +#: ../../include/conversation.php:1080 +#, php-format +msgid "%s likes this." +msgstr "" + +#: ../../include/conversation.php:1080 +#, php-format +msgid "%s doesn't like this." +msgstr "" + +#: ../../include/conversation.php:1084 +#, php-format +msgid "%2$d people like this." +msgid_plural "%2$d people like this." +msgstr[0] "" +msgstr[1] "" + +#: ../../include/conversation.php:1086 +#, php-format +msgid "%2$d people don't like this." +msgid_plural "%2$d people don't like this." +msgstr[0] "" +msgstr[1] "" + +#: ../../include/conversation.php:1092 +msgid "and" +msgstr "" + +#: ../../include/conversation.php:1095 +#, php-format +msgid ", and %d other people" +msgid_plural ", and %d other people" +msgstr[0] "" +msgstr[1] "" + +#: ../../include/conversation.php:1096 +#, php-format +msgid "%s like this." +msgstr "" + +#: ../../include/conversation.php:1096 +#, php-format +msgid "%s don't like this." +msgstr "" + +#: ../../include/conversation.php:1136 +msgid "Set your location" +msgstr "" + +#: ../../include/conversation.php:1137 +msgid "Clear browser location" +msgstr "" + +#: ../../include/conversation.php:1183 +msgid "Tag term:" +msgstr "" + +#: ../../include/conversation.php:1184 +msgid "Where are you right now?" +msgstr "" + +#: ../../include/conversation.php:1216 +msgid "Page link name" +msgstr "" + +#: ../../include/conversation.php:1219 +msgid "Post as" +msgstr "" + +#: ../../include/conversation.php:1229 +msgid "Toggle voting" +msgstr "" + +#: ../../include/conversation.php:1237 +msgid "Categories (optional, comma-separated list)" +msgstr "" + +#: ../../include/conversation.php:1260 +msgid "Set publish date" +msgstr "" + +#: ../../include/conversation.php:1264 +msgid "OK" +msgstr "" + +#: ../../include/conversation.php:1509 +msgid "Discover" +msgstr "" + +#: ../../include/conversation.php:1512 +msgid "Imported public streams" +msgstr "" + +#: ../../include/conversation.php:1517 +msgid "Commented Order" +msgstr "" + +#: ../../include/conversation.php:1520 +msgid "Sort by Comment Date" +msgstr "" + +#: ../../include/conversation.php:1524 +msgid "Posted Order" +msgstr "" + +#: ../../include/conversation.php:1527 +msgid "Sort by Post Date" +msgstr "" + +#: ../../include/conversation.php:1535 +msgid "Posts that mention or involve you" +msgstr "" + +#: ../../include/conversation.php:1544 +msgid "Activity Stream - by date" +msgstr "" + +#: ../../include/conversation.php:1550 +msgid "Starred" +msgstr "" + +#: ../../include/conversation.php:1553 +msgid "Favourite Posts" +msgstr "" + +#: ../../include/conversation.php:1560 +msgid "Spam" +msgstr "" + +#: ../../include/conversation.php:1563 +msgid "Posts flagged as SPAM" +msgstr "" + +#: ../../include/conversation.php:1620 +msgid "Status Messages and Posts" +msgstr "" + +#: ../../include/conversation.php:1629 +msgid "About" +msgstr "" + +#: ../../include/conversation.php:1632 +msgid "Profile Details" +msgstr "" + +#: ../../include/conversation.php:1648 +msgid "Files and Storage" +msgstr "" + +#: ../../include/conversation.php:1685 +msgid "Saved Bookmarks" +msgstr "" + +#: ../../include/conversation.php:1695 +msgid "Manage Webpages" +msgstr "" + +#: ../../include/conversation.php:1754 +msgctxt "noun" +msgid "Attending" +msgid_plural "Attending" +msgstr[0] "" +msgstr[1] "" + +#: ../../include/conversation.php:1757 +msgctxt "noun" +msgid "Not Attending" +msgid_plural "Not Attending" +msgstr[0] "" +msgstr[1] "" + +#: ../../include/conversation.php:1760 +msgctxt "noun" +msgid "Undecided" +msgid_plural "Undecided" +msgstr[0] "" +msgstr[1] "" + +#: ../../include/conversation.php:1763 +msgctxt "noun" +msgid "Agree" +msgid_plural "Agrees" +msgstr[0] "" +msgstr[1] "" + +#: ../../include/conversation.php:1766 +msgctxt "noun" +msgid "Disagree" +msgid_plural "Disagrees" +msgstr[0] "" +msgstr[1] "" + +#: ../../include/conversation.php:1769 +msgctxt "noun" +msgid "Abstain" +msgid_plural "Abstains" +msgstr[0] "" +msgstr[1] "" + #: ../../include/text.php:423 msgid "prev" msgstr "" @@ -7969,11 +8761,6 @@ msgstr "" msgid "poke" msgstr "" -#: ../../include/text.php:1021 ../../include/text.php:1026 -#: ../../include/conversation.php:243 -msgid "poked" -msgstr "" - #: ../../include/text.php:1027 msgid "ping" msgstr "" @@ -8210,361 +8997,18 @@ msgstr "" msgid "Select an alternate language" msgstr "" -#: ../../include/text.php:1982 +#: ../../include/text.php:1965 msgid "activity" msgstr "" -#: ../../include/text.php:2277 +#: ../../include/text.php:2274 msgid "Design Tools" msgstr "" -#: ../../include/text.php:2283 +#: ../../include/text.php:2280 msgid "Pages" msgstr "" -#: ../../include/features.php:48 -msgid "General Features" -msgstr "" - -#: ../../include/features.php:50 -msgid "Content Expiration" -msgstr "" - -#: ../../include/features.php:50 -msgid "Remove posts/comments and/or private messages at a future time" -msgstr "" - -#: ../../include/features.php:51 -msgid "Multiple Profiles" -msgstr "" - -#: ../../include/features.php:51 -msgid "Ability to create multiple profiles" -msgstr "" - -#: ../../include/features.php:52 -msgid "Advanced Profiles" -msgstr "" - -#: ../../include/features.php:52 -msgid "Additional profile sections and selections" -msgstr "" - -#: ../../include/features.php:53 -msgid "Profile Import/Export" -msgstr "" - -#: ../../include/features.php:53 -msgid "Save and load profile details across sites/channels" -msgstr "" - -#: ../../include/features.php:54 -msgid "Web Pages" -msgstr "" - -#: ../../include/features.php:54 -msgid "Provide managed web pages on your channel" -msgstr "" - -#: ../../include/features.php:55 -msgid "Hide Rating" -msgstr "" - -#: ../../include/features.php:55 -msgid "" -"Hide the rating buttons on your channel and profile pages. Note: People can " -"still rate you somewhere else." -msgstr "" - -#: ../../include/features.php:56 -msgid "Private Notes" -msgstr "" - -#: ../../include/features.php:56 -msgid "Enables a tool to store notes and reminders (note: not encrypted)" -msgstr "" - -#: ../../include/features.php:57 -msgid "Navigation Channel Select" -msgstr "" - -#: ../../include/features.php:57 -msgid "Change channels directly from within the navigation dropdown menu" -msgstr "" - -#: ../../include/features.php:58 -msgid "Photo Location" -msgstr "" - -#: ../../include/features.php:58 -msgid "If location data is available on uploaded photos, link this to a map." -msgstr "" - -#: ../../include/features.php:59 -msgid "Access Controlled Chatrooms" -msgstr "" - -#: ../../include/features.php:59 -msgid "Provide chatrooms and chat services with access control." -msgstr "" - -#: ../../include/features.php:60 -msgid "Smart Birthdays" -msgstr "" - -#: ../../include/features.php:60 -msgid "" -"Make birthday events timezone aware in case your friends are scattered " -"across the planet." -msgstr "" - -#: ../../include/features.php:61 -msgid "Expert Mode" -msgstr "" - -#: ../../include/features.php:61 -msgid "Enable Expert Mode to provide advanced configuration options" -msgstr "" - -#: ../../include/features.php:62 -msgid "Premium Channel" -msgstr "" - -#: ../../include/features.php:62 -msgid "" -"Allows you to set restrictions and terms on those that connect with your " -"channel" -msgstr "" - -#: ../../include/features.php:67 -msgid "Post Composition Features" -msgstr "" - -#: ../../include/features.php:70 -msgid "Large Photos" -msgstr "" - -#: ../../include/features.php:70 -msgid "" -"Include large (1024px) photo thumbnails in posts. If not enabled, use small " -"(640px) photo thumbnails" -msgstr "" - -#: ../../include/features.php:71 -msgid "Automatically import channel content from other channels or feeds" -msgstr "" - -#: ../../include/features.php:72 -msgid "Even More Encryption" -msgstr "" - -#: ../../include/features.php:72 -msgid "" -"Allow optional encryption of content end-to-end with a shared secret key" -msgstr "" - -#: ../../include/features.php:73 -msgid "Enable Voting Tools" -msgstr "" - -#: ../../include/features.php:73 -msgid "Provide a class of post which others can vote on" -msgstr "" - -#: ../../include/features.php:74 -msgid "Delayed Posting" -msgstr "" - -#: ../../include/features.php:74 -msgid "Allow posts to be published at a later date" -msgstr "" - -#: ../../include/features.php:75 -msgid "Suppress Duplicate Posts/Comments" -msgstr "" - -#: ../../include/features.php:75 -msgid "" -"Prevent posts with identical content to be published with less than two " -"minutes in between submissions." -msgstr "" - -#: ../../include/features.php:81 -msgid "Network and Stream Filtering" -msgstr "" - -#: ../../include/features.php:82 -msgid "Search by Date" -msgstr "" - -#: ../../include/features.php:82 -msgid "Ability to select posts by date ranges" -msgstr "" - -#: ../../include/features.php:83 ../../include/group.php:311 -msgid "Privacy Groups" -msgstr "" - -#: ../../include/features.php:83 -msgid "Enable management and selection of privacy groups" -msgstr "" - -#: ../../include/features.php:84 -msgid "Save search terms for re-use" -msgstr "" - -#: ../../include/features.php:85 -msgid "Network Personal Tab" -msgstr "" - -#: ../../include/features.php:85 -msgid "Enable tab to display only Network posts that you've interacted on" -msgstr "" - -#: ../../include/features.php:86 -msgid "Network New Tab" -msgstr "" - -#: ../../include/features.php:86 -msgid "Enable tab to display all new Network activity" -msgstr "" - -#: ../../include/features.php:87 -msgid "Affinity Tool" -msgstr "" - -#: ../../include/features.php:87 -msgid "Filter stream activity by depth of relationships" -msgstr "" - -#: ../../include/features.php:88 -msgid "Connection Filtering" -msgstr "" - -#: ../../include/features.php:88 -msgid "Filter incoming posts from connections based on keywords/content" -msgstr "" - -#: ../../include/features.php:89 -msgid "Show channel suggestions" -msgstr "" - -#: ../../include/features.php:94 -msgid "Post/Comment Tools" -msgstr "" - -#: ../../include/features.php:95 -msgid "Community Tagging" -msgstr "" - -#: ../../include/features.php:95 -msgid "Ability to tag existing posts" -msgstr "" - -#: ../../include/features.php:96 -msgid "Post Categories" -msgstr "" - -#: ../../include/features.php:96 -msgid "Add categories to your posts" -msgstr "" - -#: ../../include/features.php:97 -msgid "Ability to file posts under folders" -msgstr "" - -#: ../../include/features.php:98 -msgid "Dislike Posts" -msgstr "" - -#: ../../include/features.php:98 -msgid "Ability to dislike posts/comments" -msgstr "" - -#: ../../include/features.php:99 -msgid "Star Posts" -msgstr "" - -#: ../../include/features.php:99 -msgid "Ability to mark special posts with a star indicator" -msgstr "" - -#: ../../include/features.php:100 -msgid "Tag Cloud" -msgstr "" - -#: ../../include/features.php:100 -msgid "Provide a personal tag cloud on your channel page" -msgstr "" - -#: ../../include/follow.php:28 -msgid "Channel is blocked on this site." -msgstr "" - -#: ../../include/follow.php:33 -msgid "Channel location missing." -msgstr "" - -#: ../../include/follow.php:82 -msgid "Response from remote channel was incomplete." -msgstr "" - -#: ../../include/follow.php:99 -msgid "Channel was deleted and no longer exists." -msgstr "" - -#: ../../include/follow.php:155 ../../include/follow.php:191 -msgid "Protocol disabled." -msgstr "" - -#: ../../include/follow.php:179 -msgid "Channel discovery failed." -msgstr "" - -#: ../../include/follow.php:217 -msgid "Cannot connect to yourself." -msgstr "" - -#: ../../include/group.php:26 -msgid "" -"A deleted group with this name was revived. Existing item permissions " -"may apply to this group and any future members. If this is " -"not what you intended, please create another group with a different name." -msgstr "" - -#: ../../include/group.php:248 -msgid "Add new connections to this privacy group" -msgstr "" - -#: ../../include/group.php:289 -msgid "edit" -msgstr "" - -#: ../../include/group.php:312 -msgid "Edit group" -msgstr "" - -#: ../../include/group.php:313 -msgid "Add privacy group" -msgstr "" - -#: ../../include/group.php:314 -msgid "Channels not in any privacy group" -msgstr "" - -#: ../../include/network.php:659 -msgid "view full size" -msgstr "" - -#: ../../include/network.php:1875 ../../include/account.php:317 -#: ../../include/account.php:344 ../../include/account.php:404 -msgid "Administrator" -msgstr "" - -#: ../../include/network.php:1889 -msgid "No Subject" -msgstr "" - #: ../../include/account.php:28 msgid "Not a valid email address" msgstr "" @@ -8637,315 +9081,6 @@ msgstr "" msgid "This action is not available under your subscription plan." msgstr "" -#: ../../include/bbcode.php:123 ../../include/bbcode.php:863 -#: ../../include/bbcode.php:866 ../../include/bbcode.php:871 -#: ../../include/bbcode.php:874 ../../include/bbcode.php:877 -#: ../../include/bbcode.php:880 ../../include/bbcode.php:885 -#: ../../include/bbcode.php:888 ../../include/bbcode.php:893 -#: ../../include/bbcode.php:896 ../../include/bbcode.php:899 -#: ../../include/bbcode.php:902 -msgid "Image/photo" -msgstr "" - -#: ../../include/bbcode.php:162 ../../include/bbcode.php:913 -msgid "Encrypted content" -msgstr "" - -#: ../../include/bbcode.php:179 -#, php-format -msgid "Install %s element: " -msgstr "" - -#: ../../include/bbcode.php:183 -#, php-format -msgid "" -"This post contains an installable %s element, however you lack permissions " -"to install it on this site." -msgstr "" - -#: ../../include/bbcode.php:255 -#, php-format -msgid "%1$s wrote the following %2$s %3$s" -msgstr "" - -#: ../../include/bbcode.php:333 ../../include/bbcode.php:341 -msgid "Click to open/close" -msgstr "" - -#: ../../include/bbcode.php:341 -msgid "spoiler" -msgstr "" - -#: ../../include/bbcode.php:598 -msgid "Different viewers will see this text differently" -msgstr "" - -#: ../../include/bbcode.php:851 -msgid "$1 wrote:" -msgstr "" - -#: ../../include/conversation.php:204 -#, php-format -msgid "%1$s is now connected with %2$s" -msgstr "" - -#: ../../include/conversation.php:239 -#, php-format -msgid "%1$s poked %2$s" -msgstr "" - -#: ../../include/conversation.php:691 -#, php-format -msgid "View %s's profile @ %s" -msgstr "" - -#: ../../include/conversation.php:710 -msgid "Categories:" -msgstr "" - -#: ../../include/conversation.php:711 -msgid "Filed under:" -msgstr "" - -#: ../../include/conversation.php:738 -msgid "View in context" -msgstr "" - -#: ../../include/conversation.php:850 -msgid "remove" -msgstr "" - -#: ../../include/conversation.php:854 ../../include/nav.php:247 -msgid "Loading..." -msgstr "" - -#: ../../include/conversation.php:855 -msgid "Delete Selected Items" -msgstr "" - -#: ../../include/conversation.php:953 -msgid "View Source" -msgstr "" - -#: ../../include/conversation.php:954 -msgid "Follow Thread" -msgstr "" - -#: ../../include/conversation.php:955 -msgid "Unfollow Thread" -msgstr "" - -#: ../../include/conversation.php:960 -msgid "Activity/Posts" -msgstr "" - -#: ../../include/conversation.php:962 -msgid "Edit Connection" -msgstr "" - -#: ../../include/conversation.php:963 -msgid "Message" -msgstr "" - -#: ../../include/conversation.php:1080 -#, php-format -msgid "%s likes this." -msgstr "" - -#: ../../include/conversation.php:1080 -#, php-format -msgid "%s doesn't like this." -msgstr "" - -#: ../../include/conversation.php:1084 -#, php-format -msgid "%2$d people like this." -msgid_plural "%2$d people like this." -msgstr[0] "" -msgstr[1] "" - -#: ../../include/conversation.php:1086 -#, php-format -msgid "%2$d people don't like this." -msgid_plural "%2$d people don't like this." -msgstr[0] "" -msgstr[1] "" - -#: ../../include/conversation.php:1092 -msgid "and" -msgstr "" - -#: ../../include/conversation.php:1095 -#, php-format -msgid ", and %d other people" -msgid_plural ", and %d other people" -msgstr[0] "" -msgstr[1] "" - -#: ../../include/conversation.php:1096 -#, php-format -msgid "%s like this." -msgstr "" - -#: ../../include/conversation.php:1096 -#, php-format -msgid "%s don't like this." -msgstr "" - -#: ../../include/conversation.php:1136 -msgid "Set your location" -msgstr "" - -#: ../../include/conversation.php:1137 -msgid "Clear browser location" -msgstr "" - -#: ../../include/conversation.php:1187 -msgid "Tag term:" -msgstr "" - -#: ../../include/conversation.php:1188 -msgid "Where are you right now?" -msgstr "" - -#: ../../include/conversation.php:1220 -msgid "Page link name" -msgstr "" - -#: ../../include/conversation.php:1223 -msgid "Post as" -msgstr "" - -#: ../../include/conversation.php:1233 -msgid "Toggle voting" -msgstr "" - -#: ../../include/conversation.php:1264 -msgid "Set publish date" -msgstr "" - -#: ../../include/conversation.php:1268 -msgid "OK" -msgstr "" - -#: ../../include/conversation.php:1513 -msgid "Discover" -msgstr "" - -#: ../../include/conversation.php:1516 -msgid "Imported public streams" -msgstr "" - -#: ../../include/conversation.php:1521 -msgid "Commented Order" -msgstr "" - -#: ../../include/conversation.php:1524 -msgid "Sort by Comment Date" -msgstr "" - -#: ../../include/conversation.php:1528 -msgid "Posted Order" -msgstr "" - -#: ../../include/conversation.php:1531 -msgid "Sort by Post Date" -msgstr "" - -#: ../../include/conversation.php:1539 -msgid "Posts that mention or involve you" -msgstr "" - -#: ../../include/conversation.php:1548 -msgid "Activity Stream - by date" -msgstr "" - -#: ../../include/conversation.php:1554 -msgid "Starred" -msgstr "" - -#: ../../include/conversation.php:1557 -msgid "Favourite Posts" -msgstr "" - -#: ../../include/conversation.php:1564 -msgid "Spam" -msgstr "" - -#: ../../include/conversation.php:1567 -msgid "Posts flagged as SPAM" -msgstr "" - -#: ../../include/conversation.php:1624 -msgid "Status Messages and Posts" -msgstr "" - -#: ../../include/conversation.php:1633 -msgid "About" -msgstr "" - -#: ../../include/conversation.php:1636 -msgid "Profile Details" -msgstr "" - -#: ../../include/conversation.php:1652 -msgid "Files and Storage" -msgstr "" - -#: ../../include/conversation.php:1686 ../../include/nav.php:102 -msgid "Bookmarks" -msgstr "" - -#: ../../include/conversation.php:1689 -msgid "Saved Bookmarks" -msgstr "" - -#: ../../include/conversation.php:1699 -msgid "Manage Webpages" -msgstr "" - -#: ../../include/conversation.php:1758 -msgctxt "noun" -msgid "Attending" -msgid_plural "Attending" -msgstr[0] "" -msgstr[1] "" - -#: ../../include/conversation.php:1761 -msgctxt "noun" -msgid "Not Attending" -msgid_plural "Not Attending" -msgstr[0] "" -msgstr[1] "" - -#: ../../include/conversation.php:1764 -msgctxt "noun" -msgid "Undecided" -msgid_plural "Undecided" -msgstr[0] "" -msgstr[1] "" - -#: ../../include/conversation.php:1767 -msgctxt "noun" -msgid "Agree" -msgid_plural "Agrees" -msgstr[0] "" -msgstr[1] "" - -#: ../../include/conversation.php:1770 -msgctxt "noun" -msgid "Disagree" -msgid_plural "Disagrees" -msgstr[0] "" -msgstr[1] "" - -#: ../../include/conversation.php:1773 -msgctxt "noun" -msgid "Abstain" -msgid_plural "Abstains" -msgstr[0] "" -msgstr[1] "" - #: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249 msgid "Tags" msgstr "" @@ -8978,6 +9113,63 @@ msgstr "" msgid "dislikes" msgstr "" +#: ../../include/PermissionDescription.php:115 +msgid "Only me" +msgstr "" + +#: ../../include/PermissionDescription.php:116 +msgid "Public" +msgstr "" + +#: ../../include/PermissionDescription.php:117 +msgid "Anybody in the $Projectname network" +msgstr "" + +#: ../../include/PermissionDescription.php:118 +#, php-format +msgid "Any account on %s" +msgstr "" + +#: ../../include/PermissionDescription.php:119 +msgid "Any of my connections" +msgstr "" + +#: ../../include/PermissionDescription.php:124 +msgid "Only me (only specified contacts and me)" +msgstr "" + +#: ../../include/PermissionDescription.php:125 +msgid "Anybody authenticated (could include visitors from other networks)" +msgstr "" + +#: ../../include/PermissionDescription.php:126 +msgid "Any connections including those who haven't yet been approved" +msgstr "" + +#: ../../include/PermissionDescription.php:169 +msgid "" +"This is your default setting for the audience of your normal stream, and " +"posts." +msgstr "" + +#: ../../include/PermissionDescription.php:170 +msgid "" +"This is your default setting for who can view your default channel profile" +msgstr "" + +#: ../../include/PermissionDescription.php:171 +msgid "This is your default setting for who can view your connections" +msgstr "" + +#: ../../include/PermissionDescription.php:172 +msgid "" +"This is your default setting for who can view your file storage and photos" +msgstr "" + +#: ../../include/PermissionDescription.php:173 +msgid "This is your default setting for the audience of your webpages" +msgstr "" + #: ../../include/js_strings.php:5 msgid "Delete this item?" msgstr "" @@ -9238,173 +9430,8 @@ msgstr "" msgid "Stored post could not be verified." msgstr "" -#: ../../include/nav.php:82 ../../include/nav.php:113 ../../boot.php:1614 -msgid "Logout" -msgstr "" - -#: ../../include/nav.php:82 ../../include/nav.php:113 -msgid "End this session" -msgstr "" - -#: ../../include/nav.php:85 ../../include/nav.php:144 -msgid "Home" -msgstr "" - -#: ../../include/nav.php:85 -msgid "Your posts and conversations" -msgstr "" - -#: ../../include/nav.php:86 -msgid "Your profile page" -msgstr "" - -#: ../../include/nav.php:88 -msgid "Manage/Edit profiles" -msgstr "" - -#: ../../include/nav.php:90 -msgid "Edit your profile" -msgstr "" - -#: ../../include/nav.php:92 -msgid "Your photos" -msgstr "" - -#: ../../include/nav.php:93 -msgid "Your files" -msgstr "" - -#: ../../include/nav.php:96 -msgid "Your chatrooms" -msgstr "" - -#: ../../include/nav.php:102 -msgid "Your bookmarks" -msgstr "" - -#: ../../include/nav.php:106 -msgid "Your webpages" -msgstr "" - -#: ../../include/nav.php:110 -msgid "Sign in" -msgstr "" - -#: ../../include/nav.php:127 -#, php-format -msgid "%s - click to logout" -msgstr "" - -#: ../../include/nav.php:130 -msgid "Remote authentication" -msgstr "" - -#: ../../include/nav.php:130 -msgid "Click to authenticate to your home hub" -msgstr "" - -#: ../../include/nav.php:144 -msgid "Home Page" -msgstr "" - -#: ../../include/nav.php:147 -msgid "Create an account" -msgstr "" - -#: ../../include/nav.php:159 -msgid "Help and documentation" -msgstr "" - -#: ../../include/nav.php:163 -msgid "Applications, utilities, links, games" -msgstr "" - -#: ../../include/nav.php:165 -msgid "Search site @name, #tag, ?docs, content" -msgstr "" - -#: ../../include/nav.php:167 -msgid "Channel Directory" -msgstr "" - -#: ../../include/nav.php:179 -msgid "Your grid" -msgstr "" - -#: ../../include/nav.php:180 -msgid "Mark all grid notifications seen" -msgstr "" - -#: ../../include/nav.php:182 -msgid "Channel home" -msgstr "" - -#: ../../include/nav.php:183 -msgid "Mark all channel notifications seen" -msgstr "" - -#: ../../include/nav.php:189 -msgid "Notices" -msgstr "" - -#: ../../include/nav.php:189 -msgid "Notifications" -msgstr "" - -#: ../../include/nav.php:190 -msgid "See all notifications" -msgstr "" - -#: ../../include/nav.php:193 -msgid "Private mail" -msgstr "" - -#: ../../include/nav.php:194 -msgid "See all private messages" -msgstr "" - -#: ../../include/nav.php:195 -msgid "Mark all private messages seen" -msgstr "" - -#: ../../include/nav.php:201 -msgid "Event Calendar" -msgstr "" - -#: ../../include/nav.php:202 -msgid "See all events" -msgstr "" - -#: ../../include/nav.php:203 -msgid "Mark all events seen" -msgstr "" - -#: ../../include/nav.php:206 -msgid "Manage Your Channels" -msgstr "" - -#: ../../include/nav.php:208 -msgid "Account/Channel Settings" -msgstr "" - -#: ../../include/nav.php:216 -msgid "Site Setup and Configuration" -msgstr "" - -#: ../../include/nav.php:252 -msgid "@name, #tag, ?doc, content" -msgstr "" - -#: ../../include/nav.php:253 -msgid "Please wait..." -msgstr "" - -#: ../../include/oembed.php:324 -msgid "Embedded content" -msgstr "" - -#: ../../include/oembed.php:333 -msgid "Embedding disabled" +#: ../../include/api.php:1338 +msgid "Public Timeline" msgstr "" #: ../../include/page_widgets.php:6 @@ -9555,25 +9582,60 @@ msgstr "" msgid "Custom/Expert Mode" msgstr "" -#: ../../include/zot.php:680 -msgid "Invalid data packet" +#: ../../include/apps.php:155 +msgid "Site Admin" msgstr "" -#: ../../include/zot.php:696 -msgid "Unable to verify channel signature" +#: ../../include/apps.php:156 +msgid "Bug Report" msgstr "" -#: ../../include/zot.php:2332 -#, php-format -msgid "Unable to verify site signature for %s" +#: ../../include/apps.php:157 +msgid "View Bookmarks" msgstr "" -#: ../../include/zot.php:3670 -msgid "invalid target signature" +#: ../../include/apps.php:158 +msgid "My Chatrooms" msgstr "" -#: ../../include/api.php:1338 -msgid "Public Timeline" +#: ../../include/apps.php:160 +msgid "Firefox Share" +msgstr "" + +#: ../../include/apps.php:161 +msgid "Remote Diagnostics" +msgstr "" + +#: ../../include/apps.php:180 +msgid "Probe" +msgstr "" + +#: ../../include/apps.php:181 +msgid "Suggest" +msgstr "" + +#: ../../include/apps.php:182 +msgid "Random Channel" +msgstr "" + +#: ../../include/apps.php:183 +msgid "Invite" +msgstr "" + +#: ../../include/apps.php:186 +msgid "Post" +msgstr "" + +#: ../../include/apps.php:289 +msgid "Purchase" +msgstr "" + +#: ../../include/bb2diaspora.php:398 +msgid "Attachments:" +msgstr "" + +#: ../../include/bb2diaspora.php:489 +msgid "$Projectname event notification:" msgstr "" #: ../../view/theme/redbasic/php/config.php:82 @@ -9750,24 +9812,24 @@ msgstr "" msgid "Forgot your password?" msgstr "" -#: ../../boot.php:2254 +#: ../../boot.php:2269 msgid "toggle mobile" msgstr "" -#: ../../boot.php:2407 +#: ../../boot.php:2422 msgid "Website SSL certificate is not valid. Please correct." msgstr "" -#: ../../boot.php:2410 +#: ../../boot.php:2425 #, php-format msgid "[hubzilla] Website SSL error for %s" msgstr "" -#: ../../boot.php:2447 +#: ../../boot.php:2462 msgid "Cron/Scheduled tasks not running." msgstr "" -#: ../../boot.php:2451 +#: ../../boot.php:2466 #, php-format msgid "[hubzilla] Cron tasks not running on %s" msgstr "" From 573dea42d0b71a360d8630ab20783dba13768a49 Mon Sep 17 00:00:00 2001 From: Mario Vavti Date: Fri, 13 May 2016 16:22:43 +0200 Subject: [PATCH 10/29] instead of radio buttons use select to choose between public and restricted acl. if restricted is selected acl is set to default. if there is no default acl will be set to self. if public is selected acl-list will be hidden and acl-info is visible. --- include/acl_selectors.php | 2 +- view/js/acl.js | 95 ++++++++++++++++++++++----------------- view/tpl/acl_selector.tpl | 31 ++++++------- 3 files changed, 69 insertions(+), 59 deletions(-) diff --git a/include/acl_selectors.php b/include/acl_selectors.php index ce0a32798..6196be786 100644 --- a/include/acl_selectors.php +++ b/include/acl_selectors.php @@ -271,7 +271,7 @@ function populate_acl($defaults = null,$show_jotnets = true, $emptyACL_descripti '$showall' => $showall_caption, '$showallOrigin' => $showall_origin, '$showallIcon' => $showall_icon, - '$showlimited' => t("Limit access:"), + '$showlimited' => t("Restricted"), '$showlimitedDesc' => t('Select "Show" to allow viewing. "Don\'t show" lets you override and limit the scope of "Show".'), '$show' => t("Show"), '$hide' => t("Don't show"), diff --git a/view/js/acl.js b/view/js/acl.js index 162ada764..a04cf9d86 100644 --- a/view/js/acl.js +++ b/view/js/acl.js @@ -11,30 +11,44 @@ function ACL(backend_url, preset) { that.deny_cid = (preset[2] || []); that.deny_gid = (preset[3] || []); that.group_uids = []; - that.nw = 4; //items per row. should be calulated from #acl-list.width + that.info = $("#acl-info"); + that.list = $("#acl-list"); that.list_content = $("#acl-list-content"); that.item_tpl = unescape($(".acl-list-item[rel=acl-template]").html()); that.showall = $("#acl-showall"); that.showlimited = $("#acl-showlimited"); + that.acl_select = $("#acl-select"); + + that.preset = preset; + that.self = []; // set the initial ACL lists in case the enclosing form gets submitted before the ajax loader completes. that.on_submit(); - if (preset.length === 0) that.showall.removeClass("btn-default").addClass("btn-warning"); - /*events*/ $(document).ready(function() { - that.showall.click(that.on_showall); - that.showlimited.click(that.on_showlimited); - $(document).on('click','.acl-button-show',that.on_button_show); - $(document).on('click','.acl-button-hide',that.on_button_hide); - $("#acl-search").keypress(that.on_search); - /* startup! */ - that.get(0,15000); - that.on_submit(); + that.acl_select.change(function(event) { + var option = that.acl_select.val(); + + if(option == 'option1') { // public + that.on_showall(event); + } + + if(option == 'option2') { // restricted + that.on_showlimited(event); + } + }); + + $(document).on('click','.acl-button-show',that.on_button_show); + $(document).on('click','.acl-button-hide',that.on_button_hide); + $("#acl-search").keypress(that.on_search); + + /* startup! */ + that.get(0,15000); + that.on_submit(); }); } @@ -73,15 +87,9 @@ ACL.prototype.on_search = function(event) { }; ACL.prototype.on_showall = function(event) { - // preventDefault() isn't called here as we want state changes from update_view() to be applied to the radiobutton event.stopPropagation(); - if (that.showall.hasClass("btn-warning")) { - return false; - } - that.showall.removeClass("btn-default").addClass("btn-warning"); - that.allow_cid = []; that.allow_gid = []; that.deny_cid = []; @@ -94,11 +102,22 @@ ACL.prototype.on_showall = function(event) { }; ACL.prototype.on_showlimited = function(event) { - // Prevent the radiobutton from being selected, as the showlimited radiobutton - // option is selected only by selecting show or hide options on channels or groups. - event.preventDefault(); + // preventDefault() isn't called here as we want state changes from update_view() to be applied to the radiobutton event.stopPropagation(); - return false; + + if(that.preset[0].length === 0 && that.preset[1].length === 0 && that.preset[2].length === 0 && that.preset[3].length === 0) { + that.preset[0] = [that.self[0]]; + } + + that.allow_cid = (that.preset[0] || []); + that.allow_gid = (that.preset[1] || []); + that.deny_cid = (that.preset[2] || []); + that.deny_gid = (that.preset[3] || []); + + that.update_view(); + that.on_submit(); + + return true; // return true so that state changes from update_view() will be applied } ACL.prototype.on_selectall = function(event) { @@ -199,29 +218,26 @@ ACL.prototype.set_deny = function(itemid) { that.update_view(); }; -ACL.prototype.update_radiobuttons = function(isPublic) { - - that.showall.prop('checked', isPublic); - that.showlimited.prop('checked', !isPublic); - that.showlimited.prop('disabled', isPublic); +ACL.prototype.update_select = function(isPublic) { + that.showall.prop('selected', isPublic); + that.showlimited.prop('selected', !isPublic); }; ACL.prototype.update_view = function() { - if (that.allow_gid.length === 0 && that.allow_cid.length === 0 && - that.deny_gid.length === 0 && that.deny_cid.length === 0) { - // btn-warning indicates that the permissions are public, it was chosen because - // that.showall used to be a normal button, which btn-warning is a bootstrap style for. - that.showall.removeClass("btn-default").addClass("btn-warning"); - that.update_radiobuttons(true); + if (that.allow_gid.length === 0 && that.allow_cid.length === 0 && that.deny_gid.length === 0 && that.deny_cid.length === 0) { + that.list.hide(); //hide acl-list + that.info.show(); //show acl-info + that.update_select(true); - /* jot acl */ - $('#jot-perms-icon, #dialog-perms-icon').removeClass('fa-lock').addClass('fa-unlock'); - $('#jot-public').show(); - $('.profile-jot-net input').attr('disabled', false); + /* jot acl */ + $('#jot-perms-icon, #dialog-perms-icon').removeClass('fa-lock').addClass('fa-unlock'); + $('#jot-public').show(); + $('.profile-jot-net input').attr('disabled', false); } else { - that.showall.removeClass("btn-warning").addClass("btn-default"); - that.update_radiobuttons(false); + that.list.show(); //show acl-list + that.info.hide(); //hide acl-info + that.update_select(false); /* jot acl */ $('#jot-perms-icon, #dialog-perms-icon').removeClass('fa-unlock').addClass('fa-lock'); @@ -300,12 +316,11 @@ ACL.prototype.get = function(start, count, search) { }; ACL.prototype.populate = function(data) { - var height = Math.ceil(data.items.length / that.nw) * 42; - that.list_content.height(height); $(data.items).each(function(){ html = "
"+that.item_tpl+"
"; html = html.format(this.photo, this.name, this.type, this.xid, '', this.self, this.link, this.taggable); if (this.uids !== undefined) that.group_uids[this.xid] = this.uids; + if (this.self === 'abook-self') that.self[0] = this.xid; //console.log(html); that.list_content.append(html); }); diff --git a/view/tpl/acl_selector.tpl b/view/tpl/acl_selector.tpl index 0e9562157..a6c753cf0 100755 --- a/view/tpl/acl_selector.tpl +++ b/view/tpl/acl_selector.tpl @@ -12,6 +12,18 @@ {{if $aclModalDesc}} {{/if}} + + + + {{if $showallOrigin}} +
+  {{$showallOrigin}} +
+ {{/if}} + {{if $jotnets}} {{/if}} +
-
- - {{if $showallOrigin}} -   - {{/if}} -
-
- -
From 1e00fa79b323c6d340b79789bf9be072a9aa629b Mon Sep 17 00:00:00 2001 From: Mario Vavti Date: Fri, 13 May 2016 17:38:50 +0200 Subject: [PATCH 11/29] change wording restricted -> custom selection and add a label to the select --- include/acl_selectors.php | 3 ++- view/tpl/acl_selector.tpl | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/include/acl_selectors.php b/include/acl_selectors.php index 6196be786..136f8aa50 100644 --- a/include/acl_selectors.php +++ b/include/acl_selectors.php @@ -271,7 +271,8 @@ function populate_acl($defaults = null,$show_jotnets = true, $emptyACL_descripti '$showall' => $showall_caption, '$showallOrigin' => $showall_origin, '$showallIcon' => $showall_icon, - '$showlimited' => t("Restricted"), + '$select_label' => t('Who can see this'), + '$showlimited' => t('Custom selection'), '$showlimitedDesc' => t('Select "Show" to allow viewing. "Don\'t show" lets you override and limit the scope of "Show".'), '$show' => t("Show"), '$hide' => t("Don't show"), diff --git a/view/tpl/acl_selector.tpl b/view/tpl/acl_selector.tpl index a6c753cf0..b30669f9a 100755 --- a/view/tpl/acl_selector.tpl +++ b/view/tpl/acl_selector.tpl @@ -12,7 +12,7 @@ {{if $aclModalDesc}} {{/if}} - +