diff options
112 files changed, 7215 insertions, 4114 deletions
diff --git a/Zotlabs/Access/PermissionRoles.php b/Zotlabs/Access/PermissionRoles.php index 8b116adc5..94c49c44f 100644 --- a/Zotlabs/Access/PermissionRoles.php +++ b/Zotlabs/Access/PermissionRoles.php @@ -7,6 +7,9 @@ use Zotlabs\Lib as Zlib; class PermissionRoles { + static public function version() { + return 1; + } static function role_perms($role) { @@ -160,6 +163,7 @@ class PermissionRoles { $ret['limits'] = PermissionLimits::Std_Limits(); break; + case 'custom': default: break; } @@ -174,7 +178,48 @@ class PermissionRoles { return $ret; } + static public function new_custom_perms($uid,$perm,$abooks) { + + // set permissionlimits for this permission here, for example: + + // if($perm === 'mynewperm') + // \Zotlabs\Access\PermissionLimits::Set($uid,$perm,1); + + + // set autoperms here if applicable + // choices are to set to 0, 1, or the value of an existing perm + + if(get_pconfig($uid,'system','autoperms')) { + + $c = channelx_by_n($uid); + $value = 0; + // if($perm === 'mynewperm') + // $value = get_abconfig($uid,$c['channel_hash'],'autoperms','someexistingperm')); + + if($c) { + set_abconfig($uid,$c['channel_hash'],'autoperms',$perm,$value); + } + + + } + + // now set something for all existing connections. + + if($abooks) { + foreach($abooks as $ab) { + switch($perm) { + // case 'mynewperm': + // choices are to set to 1, set to 0, or clone an existing perm + // set_abconfig($uid,$ab['abook_xchan'],'my_perms',$perm, + // get_abconfig($uid,$ab['abook_xchan'],'my_perms','someexistingperm')); + + default: + break; + } + } + } + } static public function roles() { diff --git a/Zotlabs/Access/Permissions.php b/Zotlabs/Access/Permissions.php index 61ea51a48..43baa6cf7 100644 --- a/Zotlabs/Access/Permissions.php +++ b/Zotlabs/Access/Permissions.php @@ -10,9 +10,20 @@ class Permissions { /** * Extensible permissions. * To add new permissions, add to the list of $perms below, with a simple description. + * * Also visit PermissionRoles.php and add to the $ret['perms_connect'] property for any role * if this permission should be granted to new connections. * + * Next look at PermissionRoles::new_custom_perms() and provide a handler for updating custom + * permission roles. You will want to set a default PermissionLimit for each channel and also + * provide a sane default for any existing connections. You may or may not wish to provide a + * default auto permission. If in doubt, leave this alone as custom permissions by definition + * are the responsbility of the channel owner to manage. You just don't want to create any + * suprises or break things so you have an opportunity to provide sane settings. + * + * Update the version here and in PermissionRoles + * + * * Permissions with 'view' in the name are considered read permissions. Anything * else requires authentication. Read permission limits are PERMS_PUBLIC and anything else * is given PERMS_SPECIFIC. @@ -23,6 +34,11 @@ class Permissions { * */ + static public function version() { + // This must match the version in PermissionRoles.php before permission updates can run. + return 1; + } + static public function Perms($filter = '') { diff --git a/Zotlabs/Daemon/Notifier.php b/Zotlabs/Daemon/Notifier.php index 36edbc057..63ced4f56 100644 --- a/Zotlabs/Daemon/Notifier.php +++ b/Zotlabs/Daemon/Notifier.php @@ -491,7 +491,7 @@ class Notifier { // Now we have collected recipients (except for external mentions, FIXME) // Let's reduce this to a set of hubs. - $r = q("select * from hubloc where hubloc_hash in (" . implode(',',$recipients) . ") + $r = q("select hubloc.*, site.site_crypto from hubloc left join site on site_url = hubloc_url where hubloc_hash in (" . implode(',',$recipients) . ") and hubloc_error = 0 and hubloc_deleted = 0" ); @@ -603,8 +603,8 @@ class Notifier { $packet = zot_build_packet($channel,$packet_type,(($packet_recips) ? $packet_recips : null)); } elseif($packet_type === 'request') { - $packet = zot_build_packet($channel,$packet_type,$env_recips,$hub['hubloc_sitekey'],$hash, - array('message_id' => $request_message_id) + $packet = zot_build_packet($channel,$packet_type,$env_recips,$hub['hubloc_sitekey'],$hub['site_crypto'], + $hash, array('message_id' => $request_message_id) ); } @@ -618,7 +618,7 @@ class Notifier { )); } else { - $packet = zot_build_packet($channel,'notify',$env_recips,(($private) ? $hub['hubloc_sitekey'] : null),$hash); + $packet = zot_build_packet($channel,'notify',$env_recips,(($private) ? $hub['hubloc_sitekey'] : null), $hub['site_crypto'],$hash); queue_insert(array( 'hash' => $hash, 'account_id' => $target_item['aid'], diff --git a/Zotlabs/Daemon/Ratenotif.php b/Zotlabs/Daemon/Ratenotif.php index 1cba5e26d..a94b89004 100644 --- a/Zotlabs/Daemon/Ratenotif.php +++ b/Zotlabs/Daemon/Ratenotif.php @@ -77,7 +77,7 @@ class Ratenotif { continue; $hash = random_string(); - $n = zot_build_packet($channel,'notify',null,null,$hash); + $n = zot_build_packet($channel,'notify',null,null,'',$hash); queue_insert(array( 'hash' => $hash, diff --git a/Zotlabs/Lib/Enotify.php b/Zotlabs/Lib/Enotify.php index b6f4d3351..c64ff9868 100644 --- a/Zotlabs/Lib/Enotify.php +++ b/Zotlabs/Lib/Enotify.php @@ -102,7 +102,7 @@ class Enotify { $title = $params['item']['title']; $body = $params['item']['body']; } - if($item['created'] < datetime_convert('UTC','UTC','now - 1 month')) { + if($params['item']['created'] < datetime_convert('UTC','UTC','now - 1 month')) { logger('notification invoked for an old item which may have been refetched.',LOGGER_DEBUG,LOG_INFO); return; } diff --git a/Zotlabs/Lib/System.php b/Zotlabs/Lib/System.php index 32aaa82a9..306c90f4a 100644 --- a/Zotlabs/Lib/System.php +++ b/Zotlabs/Lib/System.php @@ -42,6 +42,20 @@ class System { } + static public function get_project_link() { + if(is_array(\App::$config) && is_array(\App::$config['system']) && \App::$config['system']['project_link']) + return \App::$config['system']['project_link']; + return 'https://hubzilla.org'; + } + + static public function get_project_srclink() { + if(is_array(\App::$config) && is_array(\App::$config['system']) && \App::$config['system']['project_srclink']) + return \App::$config['system']['project_srclink']; + return 'https://github.com/redmatrix/hubzilla'; + } + + + static public function get_server_role() { if(is_array(\App::$config) && is_array(\App::$config['system']) && \App::$config['system']['server_role']) return \App::$config['system']['server_role']; @@ -54,5 +68,15 @@ class System { return '0.0.0'; } + static public function compatible_project($p) { + if(get_directory_realm() != DIRECTORY_REALM) + return true; + + foreach(['hubzilla','zap'] as $t) { + if(stristr($p,$t)) + return true; + } + return false; + } } diff --git a/Zotlabs/Module/Admin/Site.php b/Zotlabs/Module/Admin/Site.php index 251533e68..829ca71e4 100644 --- a/Zotlabs/Module/Admin/Site.php +++ b/Zotlabs/Module/Admin/Site.php @@ -22,6 +22,7 @@ class Site { $banner = ((x($_POST,'banner')) ? trim($_POST['banner']) : false); $admininfo = ((x($_POST,'admininfo')) ? trim($_POST['admininfo']) : false); + $siteinfo = ((x($_POST,'siteinfo')) ? trim($_POST['siteinfo']) : ''); $language = ((x($_POST,'language')) ? notags(trim($_POST['language'])) : ''); $theme = ((x($_POST,'theme')) ? notags(trim($_POST['theme'])) : ''); $theme_mobile = ((x($_POST,'theme_mobile')) ? notags(trim($_POST['theme_mobile'])) : ''); @@ -97,6 +98,7 @@ class Site { linkify_tags($a, $admininfo, local_channel()); set_config('system', 'admininfo', $admininfo); } + set_config('system','siteinfo',$siteinfo); set_config('system', 'language', $language); set_config('system', 'theme', $theme); if ( $theme_mobile === '---' ) { @@ -273,6 +275,7 @@ class Site { '$banner' => array('banner', t("Banner/Logo"), $banner, ""), '$admininfo' => array('admininfo', t("Administrator Information"), $admininfo, t("Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here")), + '$siteinfo' => array('siteinfo', t('Site Information'), get_config('system','siteinfo'), t("Publicly visible description of this site. Displayed on siteinfo page. BBCode can be used here")), '$language' => array('language', t("System language"), get_config('system','language'), "", $lang_choices), '$theme' => array('theme', t("System theme"), get_config('system','theme'), t("Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"), $theme_choices), '$theme_mobile' => array('theme_mobile', t("Mobile system theme"), get_config('system','mobile_theme'), t("Theme for mobile devices"), $theme_choices_mobile), diff --git a/Zotlabs/Module/Connedit.php b/Zotlabs/Module/Connedit.php index 5ab6f814b..5968ccde6 100644 --- a/Zotlabs/Module/Connedit.php +++ b/Zotlabs/Module/Connedit.php @@ -41,11 +41,13 @@ class Connedit extends \Zotlabs\Web\Controller { } } + $channel = \App::get_channel(); if($channel) head_set_icon($channel['xchan_photo_s']); } + /* @brief Evaluate posted values and set changes * @@ -396,6 +398,7 @@ class Connedit extends \Zotlabs\Web\Controller { return login(); } + $section = ((array_key_exists('section',$_REQUEST)) ? $_REQUEST['section'] : ''); $channel = \App::get_channel(); $my_perms = get_channel_default_perms(local_channel()); $role = get_pconfig(local_channel(),'system','permissions_role'); @@ -546,9 +549,33 @@ class Connedit extends \Zotlabs\Web\Controller { if(\App::$poi) { + $abook_prev = 0; + $abook_next = 0; + $contact_id = \App::$poi['abook_id']; $contact = \App::$poi; - + + $cn = q("SELECT abook_id, xchan_name from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d and abook_self = 0 order by xchan_name", + intval(local_channel()) + ); + + if($cn) { + $pntotal = count($cn); + + for($x = 0; $x < $pntotal; $x ++) { + if($cn[$x]['abook_id'] == $contact_id) { + if($x === 0) + $abook_prev = 0; + else + $abook_prev = $cn[$x - 1]['abook_id']; + if($x === $pntotal) + $abook_next = 0; + else + $abook_next = $cn[$x +1]['abook_id']; + } + } + } + $tools = array( 'view' => array( @@ -615,8 +642,10 @@ class Connedit extends \Zotlabs\Web\Controller { $self = false; - if(intval($contact['abook_self'])) + if(intval($contact['abook_self'])) { $self = true; + $abook_prev = $abook_next = 0; + } $tpl = get_markup_template("abook_edit.tpl"); @@ -751,6 +780,7 @@ class Connedit extends \Zotlabs\Web\Controller { '$header' => (($self) ? t('Connection Default Permissions') : sprintf( t('Connection: %s'),$contact['xchan_name'])), '$autoperms' => array('autoperms',t('Apply these permissions automatically'), ((get_pconfig(local_channel(),'system','autoperms')) ? 1 : 0), t('Connection requests will be approved without your interaction'), $yes_no), '$addr' => $contact['xchan_addr'], + '$section' => $section, '$addr_text' => t('This connection\'s primary address is'), '$loc_text' => t('Available locations:'), '$locstr' => $locstr, @@ -792,7 +822,8 @@ class Connedit extends \Zotlabs\Web\Controller { '$multiprofs' => $multiprofs, '$contact_id' => $contact['abook_id'], '$name' => $contact['xchan_name'], - + '$abook_prev' => $abook_prev, + '$abook_next' => $abook_next )); $arr = array('contact' => $contact,'output' => $o); diff --git a/Zotlabs/Module/Dirsearch.php b/Zotlabs/Module/Dirsearch.php index 927800bbb..e6cf5449a 100644 --- a/Zotlabs/Module/Dirsearch.php +++ b/Zotlabs/Module/Dirsearch.php @@ -12,7 +12,7 @@ class Dirsearch extends \Zotlabs\Web\Controller { } - function get() { + function get() { $ret = array('success' => false); @@ -410,13 +410,13 @@ class Dirsearch extends \Zotlabs\Web\Controller { $rand = db_getfunc('rand'); $realm = get_directory_realm(); if($realm == DIRECTORY_REALM) { - $r = q("select * from site where site_access != 0 and site_register !=0 and ( site_realm = '%s' or site_realm = '') and site_type = %d order by $rand", + $r = q("select * from site where site_access != 0 and site_register !=0 and ( site_realm = '%s' or site_realm = '') and site_type = %d and site_dead = 0 order by $rand", dbesc($realm), intval(SITE_TYPE_ZOT) ); } else { - $r = q("select * from site where site_access != 0 and site_register !=0 and site_realm = '%s' and site_type = %d order by $rand", + $r = q("select * from site where site_access != 0 and site_register !=0 and site_realm = '%s' and site_type = %d and site_dead = 0 order by $rand", dbesc($realm), intval(SITE_TYPE_ZOT) ); @@ -457,6 +457,6 @@ class Dirsearch extends \Zotlabs\Web\Controller { } } return $ret; - } - + } + } diff --git a/Zotlabs/Module/Help.php b/Zotlabs/Module/Help.php index 570e8e0cf..27d94e405 100644 --- a/Zotlabs/Module/Help.php +++ b/Zotlabs/Module/Help.php @@ -44,8 +44,39 @@ class Help extends \Zotlabs\Web\Controller { return $o; } + + + if(argc() > 2 && argv(argc()-2) === 'assets') { + $path = ''; + for($x = 1; $x < argc(); $x ++) { + if(strlen($path)) + $path .= '/'; + $path .= argv($x); + } + $realpath = 'doc/' . $path; + //Set the content-type header as appropriate + $imageInfo = getimagesize($realpath); + switch ($imageInfo[2]) { + case IMAGETYPE_JPEG: + header("Content-Type: image/jpeg"); + break; + case IMAGETYPE_GIF: + header("Content-Type: image/gif"); + break; + case IMAGETYPE_PNG: + header("Content-Type: image/png"); + break; + default: + break; + } + header("Content-Length: " . filesize($realpath)); - $content = get_help_content(); + // dump the picture and stop the script + readfile($realpath); + killme(); + } + + $content = get_help_content(); return replace_macros(get_markup_template('help.tpl'), array( '$title' => t('$Projectname Documentation'), diff --git a/Zotlabs/Module/Item.php b/Zotlabs/Module/Item.php index 344e839f4..ab008783d 100644 --- a/Zotlabs/Module/Item.php +++ b/Zotlabs/Module/Item.php @@ -553,8 +553,8 @@ class Item extends \Zotlabs\Web\Controller { $body = preg_replace_callback('/\[zrl(.*?)\[\/(zrl)\]/ism','\red_escape_codeblock',$body); - $body = preg_replace_callback("/([^\]\='".'"'."\/]|^|\#\^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,]+)/ism", 'nakedoembed', $body); - $body = preg_replace_callback("/([^\]\='".'"'."\/]|^|\#\^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,]+)/ism", '\red_zrl_callback', $body); + $body = preg_replace_callback("/([^\]\='".'"'."\/]|^|\#\^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,\(\)]+)/ism", 'nakedoembed', $body); + $body = preg_replace_callback("/([^\]\='".'"'."\/]|^|\#\^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,\(\)]+)/ism", '\red_zrl_callback', $body); $body = preg_replace_callback('/\[\$b64zrl(.*?)\[\/(zrl)\]/ism','\red_unescape_codeblock',$body); $body = preg_replace_callback('/\[\$b64url(.*?)\[\/(url)\]/ism','\red_unescape_codeblock',$body); diff --git a/Zotlabs/Module/Pubsites.php b/Zotlabs/Module/Pubsites.php index 1c9cd5121..d87967189 100644 --- a/Zotlabs/Module/Pubsites.php +++ b/Zotlabs/Module/Pubsites.php @@ -36,7 +36,7 @@ class Pubsites extends \Zotlabs\Web\Controller { $o .= '</tr>'; if($j['sites']) { foreach($j['sites'] as $jj) { - if(! $jj['project']) + if(! \Zotlabs\Lib\System::compatible_project($jj['project'])) continue; if(strpos($jj['version'],' ')) { $x = explode(' ', $jj['version']); diff --git a/Zotlabs/Module/Settings/Tokens.php b/Zotlabs/Module/Settings/Tokens.php index e63fed128..d32a00c95 100644 --- a/Zotlabs/Module/Settings/Tokens.php +++ b/Zotlabs/Module/Settings/Tokens.php @@ -115,6 +115,7 @@ class Tokens { $desc2 = t('You may also provide <em>dropbox</em> style access links to friends and associates by adding the Login Password to any specific site URL as shown. Examples:'); $global_perms = \Zotlabs\Access\Permissions::Perms(); + $their_perms = []; $existing = get_all_perms(local_channel(),(($atoken_xchan) ? $atoken_xchan : '')); @@ -123,7 +124,6 @@ class Tokens { intval(local_channel()), dbesc($atoken_xchan) ); - $their_perms = array(); if($theirs) { foreach($theirs as $t) { $their_perms[$t['k']] = $t['v']; diff --git a/Zotlabs/Module/Siteinfo.php b/Zotlabs/Module/Siteinfo.php index a15e2896d..7c3918425 100644 --- a/Zotlabs/Module/Siteinfo.php +++ b/Zotlabs/Module/Siteinfo.php @@ -15,63 +15,33 @@ class Siteinfo extends \Zotlabs\Web\Controller { function get() { - if(! get_config('system','hidden_version_siteinfo')) { - $version = sprintf( t('Version %s'), \Zotlabs\Lib\System::get_project_version()); - if(@is_dir('.git') && function_exists('shell_exec')) { - $commit = @shell_exec('git log -1 --format="%h"'); - $tag = \Zotlabs\Lib\System::get_std_version(); // @shell_exec('git describe --tags --abbrev=0'); - } - if(! isset($commit) || strlen($commit) > 16) - $commit = ''; - } - else { - $version = $commit = ''; - } + $siteinfo = replace_macros(get_markup_template('siteinfo.tpl'), + [ + '$title' => t('About this site'), + '$sitenametxt' => t('Site Name'), + '$sitename' => \Zotlabs\Lib\System::get_site_name(), + '$headline' => t('Site Information'), + '$site_about' => bbcode(get_config('system','siteinfo')), + '$admin_headline' => t('Administrator'), + '$admin_about' => bbcode(get_config('system','admininfo')), + '$terms' => t('Terms of Service'), + '$prj_header' => t('Software and Project information'), + '$prj_name' => t('This site is powered by $Projectname'), + '$prj_transport' => t('Federated and decentralised networking and identity services provided by Zot'), + '$transport_link' => '<a href="https://zotlabs.com">https://zotlabs.com</a>', + '$prj_version' => ((get_config('system','hidden_version_siteinfo')) ? '' : sprintf( t('Version %s'), \Zotlabs\Lib\System::get_project_version())), + '$prj_linktxt' => t('Project homepage'), + '$prj_srctxt' => t('Developer homepage'), + '$prj_link' => \Zotlabs\Lib\System::get_project_link(), + '$prj_src' => \Zotlabs\Lib\System::get_project_srclink(), + ] + ); - $plugins_list = implode(', ',visible_plugin_list()); + call_hooks('about_hook', $siteinfo); + + return $siteinfo; - if($plugins_list) - $plugins_text = t('Installed plugins/addons/apps:'); - else - $plugins_text = t('No installed plugins/addons/apps'); - - $txt = get_config('system','admininfo'); - $admininfo = bbcode($txt); - - if(file_exists('doc/site_donate.html')) - $donate .= file_get_contents('doc/site_donate.html'); - - if(function_exists('sys_getloadavg')) - $loadavg = sys_getloadavg(); - - $o = replace_macros(get_markup_template('siteinfo.tpl'), array( - '$title' => t('$Projectname'), - '$description' => t('This is a hub of $Projectname - a global cooperative network of decentralized privacy enhanced websites.'), - '$version' => $version, - '$tag_txt' => t('Tag: '), - '$tag' => $tag, - '$polled' => t('Last background fetch: '), - '$lastpoll' => get_poller_runtime(), - '$load_average' => t('Current load average: '), - '$loadavg_all' => $loadavg[0] . ', ' . $loadavg[1] . ', ' . $loadavg[2], - '$commit' => $commit, - '$web_location' => t('Running at web location') . ' ' . z_root(), - '$visit' => t('Please visit <a href="http://hubzilla.org">hubzilla.org</a> to learn more about $Projectname.'), - '$bug_text' => t('Bug reports and issues: please visit'), - '$bug_link_url' => 'https://github.com/redmatrix/hubzilla/issues', - '$bug_link_text' => t('$projectname issues'), - '$contact' => t('Suggestions, praise, etc. - please email "redmatrix" at librelist - dot com'), - '$donate' => $donate, - '$adminlabel' => t('Site Administrators'), - '$admininfo' => $admininfo, - '$plugins_text' => $plugins_text, - '$plugins_list' => $plugins_list - )); - - call_hooks('about_hook', $o); - - return $o; - } + } diff --git a/Zotlabs/Module/Wall_attach.php b/Zotlabs/Module/Wall_attach.php index 9268fbb0a..c6fe7518e 100644 --- a/Zotlabs/Module/Wall_attach.php +++ b/Zotlabs/Module/Wall_attach.php @@ -12,7 +12,7 @@ class Wall_attach extends \Zotlabs\Web\Controller { $using_api = false; - if(\App::$data['api_info'] && array_key_exists('media',$_FILES)) { + if($_REQUEST['api_source'] && array_key_exists('media',$_FILES)) { $using_api = true; } diff --git a/Zotlabs/Module/Wiki.php b/Zotlabs/Module/Wiki.php index edcd6ec58..5b3c4c1d8 100644 --- a/Zotlabs/Module/Wiki.php +++ b/Zotlabs/Module/Wiki.php @@ -34,20 +34,16 @@ class Wiki extends \Zotlabs\Web\Controller { notice( t('Not found') . EOL); return; } - - $tab = 'wiki'; - - + require_once('include/wiki.php'); require_once('include/acl_selectors.php'); require_once('include/conversation.php'); + require_once('include/bbcode.php'); // TODO: Combine the interface configuration into a unified object // Something like $interface = array('new_page_button' => false, 'new_wiki_button' => false, ...) $wiki_owner = false; $showNewWikiButton = false; - $showCommitMsg = false; - $hidePageHistory = false; $pageHistory = array(); $local_observer = null; $resource_id = ''; @@ -90,50 +86,81 @@ class Wiki extends \Zotlabs\Web\Controller { // Not the channel owner $owner_acl = $x = array(); } - + + $is_owner = ((local_channel()) && (local_channel() == \App::$profile['profile_uid']) ? true : false); + $o = profile_tabs($a, $is_owner, \App::$profile['channel_address']); + // Download a wiki - if ((argc() > 3) && (argv(2) === 'download') && (argv(3) === 'wiki')) { - $resource_id = argv(4); - $w = wiki_get_wiki($resource_id); - if (!$w['path']) { - notice(t('Error retrieving wiki') . EOL); - } - $zip_folder_name = random_string(10); - $zip_folderpath = '/tmp/' . $zip_folder_name; - if (!mkdir($zip_folderpath, 0770, false)) { - logger('Error creating zip file export folder: ' . $zip_folderpath, LOGGER_NORMAL); - notice(t('Error creating zip file export folder') . EOL); - } - $zip_filename = $w['urlName']; - $zip_filepath = '/tmp/' . $zip_folder_name . '/' . $zip_filename; - // Generate the zip file - \Zotlabs\Lib\ExtendedZip::zipTree($w['path'], $zip_filepath, \ZipArchive::CREATE); - // Output the file for download - header('Content-disposition: attachment; filename="' . $zip_filename . '.zip"'); - header("Content-Type: application/zip"); - $success = readfile($zip_filepath); - if ($success) { - rrmdir($zip_folderpath); // delete temporary files - } else { - rrmdir($zip_folderpath); // delete temporary files - logger('Error downloading wiki: ' . $resource_id); - } + if((argc() > 3) && (argv(2) === 'download') && (argv(3) === 'wiki')) { + + $resource_id = argv(4); + + $w = wiki_get_wiki($resource_id); + if(!$w['path']) { + notice(t('Error retrieving wiki') . EOL); + } + + $zip_folder_name = random_string(10); + $zip_folderpath = '/tmp/' . $zip_folder_name; + if(!mkdir($zip_folderpath, 0770, false)) { + logger('Error creating zip file export folder: ' . $zip_folderpath, LOGGER_NORMAL); + notice(t('Error creating zip file export folder') . EOL); + } + + $zip_filename = $w['urlName']; + $zip_filepath = '/tmp/' . $zip_folder_name . '/' . $zip_filename; + + // Generate the zip file + \Zotlabs\Lib\ExtendedZip::zipTree($w['path'], $zip_filepath, \ZipArchive::CREATE); + + // Output the file for download + + header('Content-disposition: attachment; filename="' . $zip_filename . '.zip"'); + header('Content-Type: application/zip'); + + $success = readfile($zip_filepath); + + if(!$success) { + logger('Error downloading wiki: ' . $resource_id); + notice(t('Error downloading wiki: ' . $resource_id) . EOL); + } + + // delete temporary files + rrmdir($zip_folderpath); + killme(); + } switch (argc()) { case 2: - // Configure page template - $wikiheaderName = t('Wiki'); - $wikiheaderPage = t('Sandbox'); - require_once('library/markdown.php'); - $content = t('"# Wiki Sandbox\n\nContent you **edit** and **preview** here *will not be saved*."'); - $renderedContent = Markdown(json_decode($content)); - $hide_editor = false; - $showPageControls = false; - $showNewWikiButton = $wiki_owner; - $showNewPageButton = false; - $hidePageHistory = true; - $showCommitMsg = false; + $wikis = wiki_list($owner, get_observer_hash()); + if ($wikis) { + $o .= replace_macros(get_markup_template('wikilist.tpl'), array( + '$header' => t('Wikis'), + '$channel' => $owner['channel_address'], + '$wikis' => $wikis['wikis'], + // If the observer is the local channel owner, show the wiki controls + '$owner' => ((local_channel() && local_channel() === intval(\App::$profile['uid'])) ? true : false), + '$edit' => t('Edit'), + '$download' => t('Download'), + '$view' => t('View'), + '$create' => t('Create New'), + '$submit' => t('Submit'), + '$wikiName' => array('wikiName', t('Wiki name')), + '$mimeType' => array('mimeType', t('Content type'), '', '', ['text/markdown' => 'Markdown', 'text/bbcode' => 'BB Code']), + '$name' => t('Name'), + '$lockstate' => $x['lockstate'], + '$acl' => $x['acl'], + '$allow_cid' => $x['allow_cid'], + '$allow_gid' => $x['allow_gid'], + '$deny_cid' => $x['deny_cid'], + '$deny_gid' => $x['deny_gid'], + '$notify' => array('postVisible', t('Create a status post for this wiki'), '', '', array(t('No'), t('Yes'))) + )); + + return $o; + } + break; case 3: // /wiki/channel/wiki -> No page was specified, so redirect to Home.md @@ -144,10 +171,12 @@ class Wiki extends \Zotlabs\Web\Controller { // Fetch the wiki info and determine observer permissions $wikiUrlName = urlencode(argv(2)); $pageUrlName = urlencode(argv(3)); + $w = wiki_exists_by_name($owner['channel_id'], $wikiUrlName); if(!$w['resource_id']) { notice(t('Wiki not found') . EOL); goaway('/'.argv(0).'/'.argv(1)); + return; //not reached } $resource_id = $w['resource_id']; @@ -158,6 +187,7 @@ class Wiki extends \Zotlabs\Web\Controller { if(!$perms['read']) { notice(t('Permission denied.') . EOL); goaway('/'.argv(0).'/'.argv(1)); + return; //not reached } if($perms['write']) { $wiki_editor = true; @@ -169,53 +199,59 @@ class Wiki extends \Zotlabs\Web\Controller { } $wikiheaderName = urldecode($wikiUrlName); $wikiheaderPage = urldecode($pageUrlName); + $renamePage = (($wikiheaderPage === 'Home') ? '' : t('Rename page')); + $p = wiki_get_page_content(array('resource_id' => $resource_id, 'pageUrlName' => $pageUrlName)); if(!$p['success']) { notice(t('Error retrieving page content') . EOL); goaway('/'.argv(0).'/'.argv(1).'/'.$wikiUrlName); + return; //not reached } - $content = ($p['content'] !== '' ? htmlspecialchars_decode($p['content'],ENT_COMPAT) : '"# New page\n"'); + + $mimeType = $p['mimeType']; + + $rawContent = (($p['mimeType'] == 'text/bbcode') ? htmlspecialchars_decode(json_decode($p['content']),ENT_COMPAT) : htmlspecialchars_decode($p['content'],ENT_COMPAT)); + $content = ($p['content'] !== '' ? $rawContent : '"# New page\n"'); // Render the Markdown-formatted page content in HTML - require_once('library/markdown.php'); - $html = wiki_generate_toc(zidify_text(purify_html(Markdown(wiki_bbcode(json_decode($content)))))); - $renderedContent = wiki_convert_links($html,argv(0).'/'.argv(1).'/'.$wikiUrlName); + if($mimeType == 'text/bbcode') { + $renderedContent = bbcode($content); + } + else { + require_once('library/markdown.php'); + $html = wiki_generate_toc(zidify_text(purify_html(Markdown(wiki_bbcode(json_decode($content)))))); + $renderedContent = wiki_convert_links($html,argv(0).'/'.argv(1).'/'.$wikiUrlName); + } $hide_editor = false; $showPageControls = $wiki_editor; $showNewWikiButton = $wiki_owner; $showNewPageButton = $wiki_editor; - $hidePageHistory = false; - $showCommitMsg = true; $pageHistory = wiki_page_history(array('resource_id' => $resource_id, 'pageUrlName' => $pageUrlName)); break; default: // Strip the extraneous URL components - goaway('/'.argv(0).'/'.argv(1).'/'.$wikiUrlName.'/'.$pageUrlName); + goaway('/' . argv(0) . '/' . argv(1) . '/' . $wikiUrlName . '/' . $pageUrlName); + return; //not reached } $wikiModalID = random_string(3); - $wikiModal = replace_macros( - get_markup_template('generic_modal.tpl'), array( - '$id' => $wikiModalID, - '$title' => t('Revision Comparison'), - '$ok' => t('Revert'), - '$cancel' => t('Cancel') - ) - ); - - $is_owner = ((local_channel()) && (local_channel() == \App::$profile['profile_uid']) ? true : false); - - $o .= profile_tabs($a, $is_owner, \App::$profile['channel_address']); - + $wikiModal = replace_macros(get_markup_template('generic_modal.tpl'), array( + '$id' => $wikiModalID, + '$title' => t('Revision Comparison'), + '$ok' => t('Revert'), + '$cancel' => t('Cancel') + )); + $o .= replace_macros(get_markup_template('wiki.tpl'),array( '$wikiheaderName' => $wikiheaderName, '$wikiheaderPage' => $wikiheaderPage, - '$hideEditor' => $hide_editor, + '$renamePage' => $renamePage, + '$hideEditor' => $hide_editor, // True will completely hide the content section and is used for the case of no wiki selected + '$chooseWikiMessage' => t('Choose an available wiki from the list on the left.'), '$showPageControls' => $showPageControls, - '$tools_label' => 'Wiki Tools', + '$editOrSourceLabel' => (($showPageControls) ? t('Edit') : t('Source')), + '$tools_label' => 'Page Tools', '$showNewWikiButton'=> $showNewWikiButton, '$showNewPageButton'=> $showNewPageButton, - '$hidePageHistory' => $hidePageHistory, - '$showCommitMsg' => $showCommitMsg, '$channel' => $owner['channel_address'], '$resource_id' => $resource_id, '$page' => $pageUrlName, @@ -226,12 +262,11 @@ class Wiki extends \Zotlabs\Web\Controller { '$deny_cid' => $x['deny_cid'], '$deny_gid' => $x['deny_gid'], '$bang' => $x['bang'], + '$mimeType' => $mimeType, '$content' => $content, '$renderedContent' => $renderedContent, - '$wikiName' => array('wikiName', t('Enter the name of your new wiki:'), '', ''), - '$pageName' => array('pageName', t('Enter the name of the new page:'), '', ''), - '$pageRename' => array('pageRename', t('Enter the new name:'), '', ''), - '$commitMsg' => array('commitMsg', '', '', '', '', 'placeholder="(optional) Enter a custom message when saving the page..."'), + '$pageRename' => array('pageRename', t('New page name'), '', ''), + '$commitMsg' => array('commitMsg', '', '', '', '', 'placeholder="Short description of your changes (optional)"'), '$pageHistory' => $pageHistory['history'], '$wikiModal' => $wikiModal, '$wikiModalID' => $wikiModalID, @@ -247,12 +282,16 @@ class Wiki extends \Zotlabs\Web\Controller { '$modalerrorlink' => t('Error getting photo link'), '$modalerroralbum' => t('Error getting album'), )); - head_add_js('library/ace/ace.js'); // Ace Code Editor + + if($p['mimeType'] != 'text/bbcode') + head_add_js('library/ace/ace.js'); // Ace Code Editor + return $o; } function post() { require_once('include/wiki.php'); + require_once('include/bbcode.php'); $nick = argv(1); $owner = channelx_by_nick($nick); @@ -268,13 +307,21 @@ class Wiki extends \Zotlabs\Web\Controller { // Render mardown-formatted text in HTML for preview if((argc() > 2) && (argv(2) === 'preview')) { $content = $_POST['content']; - $resource_id = $_POST['resource_id']; - require_once('library/markdown.php'); - $content = wiki_bbcode($content); - $html = wiki_generate_toc(zidify_text(purify_html(Markdown($content)))); + $resource_id = $_POST['resource_id']; $w = wiki_get_wiki($resource_id); $wikiURL = argv(0).'/'.argv(1).'/'.$w['urlName']; - $html = wiki_convert_links($html,$wikiURL); + + $mimeType = $w['mimeType']; + + if($mimeType == 'text/bbcode') { + $html = bbcode($content); + } + else { + require_once('library/markdown.php'); + $content = wiki_bbcode($content); + $html = wiki_generate_toc(zidify_text(purify_html(Markdown($content)))); + $html = wiki_convert_links($html,$wikiURL); + } json_return_and_die(array('html' => $html, 'success' => true)); } @@ -288,17 +335,19 @@ class Wiki extends \Zotlabs\Web\Controller { if (local_channel() !== intval($owner['channel_id'])) { goaway('/' . argv(0) . '/' . $nick . '/'); } - $wiki = array(); // Generate new wiki info from input name $wiki['postVisible'] = ((intval($_POST['postVisible']) === 0) ? 0 : 1); $wiki['rawName'] = $_POST['wikiName']; $wiki['htmlName'] = escape_tags($_POST['wikiName']); $wiki['urlName'] = urlencode($_POST['wikiName']); + $wiki['mimeType'] = $_POST['mimeType']; + if($wiki['urlName'] === '') { notice( t('Error creating wiki. Invalid name.') . EOL); goaway('/wiki'); } + // Get ACL for permissions $acl = new \Zotlabs\Access\AccessList($owner); $acl->set_from_array($_POST); @@ -355,7 +404,18 @@ class Wiki extends \Zotlabs\Web\Controller { } $page = wiki_create_page($name, $resource_id); if ($page['success']) { - json_return_and_die(array('url' => '/'.argv(0).'/'.argv(1).'/'.$page['wiki']['urlName'].'/'.urlencode($page['page']['urlName']), 'success' => true)); + $ob = \App::get_observer(); + $commit = wiki_git_commit(array( + 'commit_msg' => t('New page created'), + 'resource_id' => $resource_id, + 'observer' => $ob, + 'files' => array($page['page']['fileName']) + )); + if($commit['success']) { + json_return_and_die(array('url' => '/'.argv(0).'/'.argv(1).'/'.$page['wiki']['urlName'].'/'.$page['page']['urlName'], 'success' => true)); + } else { + json_return_and_die(array('message' => 'Error making git commit','url' => '/'.argv(0).'/'.argv(1).'/'.$page['wiki']['urlName'].'/'.urlencode($page['page']['urlName']),'success' => false)); + } } else { logger('Error creating page'); json_return_and_die(array('message' => 'Error creating page.', 'success' => false)); @@ -405,7 +465,7 @@ class Wiki extends \Zotlabs\Web\Controller { 'commit_msg' => $commitMsg, 'resource_id' => $resource_id, 'observer' => $ob, - 'files' => array($pageUrlName.'.md') + 'files' => array($saved['fileName']) )); if($commit['success']) { json_return_and_die(array('message' => 'Wiki git repo commit made', 'success' => true)); @@ -544,7 +604,7 @@ class Wiki extends \Zotlabs\Web\Controller { 'commit_msg' => 'Renamed ' . urldecode($pageUrlName) . ' to ' . $renamed['page']['htmlName'], 'resource_id' => $resource_id, 'observer' => $ob, - 'files' => array($pageUrlName . '.md', $renamed['page']['fileName']), + 'files' => array($pageUrlName . substr($renamed['page']['fileName'], -3), $renamed['page']['fileName']), 'all' => true )); if($commit['success']) { diff --git a/Zotlabs/Zot/Auth.php b/Zotlabs/Zot/Auth.php index 0837be21a..d4d3bee1d 100644 --- a/Zotlabs/Zot/Auth.php +++ b/Zotlabs/Zot/Auth.php @@ -149,9 +149,13 @@ class Auth { // The actual channel sending the packet ($c[0]) is not important, but this provides a // generic zot packet with a sender which can be verified + $x = q("select site_crypto from site where site_url = '%s' limit 1", + dbesc($hubloc['hubloc_url']) + ); + $p = zot_build_packet($channel,$type = 'auth_check', array(array('guid' => $hubloc['hubloc_guid'],'guid_sig' => $hubloc['hubloc_guid_sig'])), - $hubloc['hubloc_sitekey'], $this->sec); + $hubloc['hubloc_sitekey'], (($x) ? $x[0]['site_crypto'] : ''), $this->sec); $this->Debug('auth check packet created using sitekey ' . $hubloc['hubloc_sitekey']); $this->Debug('packet contents: ' . $p); @@ -48,10 +48,10 @@ require_once('include/zid.php'); define ( 'PLATFORM_NAME', 'hubzilla' ); -define ( 'STD_VERSION', '1.15.1' ); -define ( 'ZOT_REVISION', '1.1' ); +define ( 'STD_VERSION', '1.15.2' ); +define ( 'ZOT_REVISION', '1.2' ); -define ( 'DB_UPDATE_VERSION', 1184 ); +define ( 'DB_UPDATE_VERSION', 1185 ); /** @@ -63,7 +63,6 @@ define ( 'DB_UPDATE_VERSION', 1184 ); */ define ( 'EOL', '<br>' . "\r\n" ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); -//define ( 'NULL_DATE', '0000-00-00 00:00:00' ); define ( 'TEMPLATE_BUILD_PATH', 'store/[data]/smarty3' ); define ( 'DIRECTORY_MODE_NORMAL', 0x0000); // A directory client @@ -84,8 +83,7 @@ $DIRECTORY_FALLBACK_SERVERS = array( 'https://hubzilla.zottel.net', 'https://hub.pixelbits.de', 'https://my.federated.social', - 'https://hubzilla.nl', - 'https://blablanet.es' + 'https://hubzilla.nl' ); @@ -640,6 +638,10 @@ function sys_boot() { define( 'DEFAULT_NOTIFY_ICON', '/images/hz-white-32.png' ); } + if(! defined('CRYPTO_ALGORITHM')) { + define( 'CRYPTO_ALGORITHM', 'aes256cbc' ); + } + /* * Try to open the database; */ @@ -2450,6 +2452,11 @@ function cert_bad_email() { function check_for_new_perms() { + // Do not execute if we are in the middle of a git update and the relevant versions don't match + + if( \Zotlabs\Access\Permissions::version() != \Zotlabs\Access\PermissionRoles::version()) + return; + $pregistered = get_config('system','perms'); $pcurrent = array_keys(\Zotlabs\Access\Permissions::Perms()); @@ -2479,19 +2486,27 @@ function check_for_new_perms() { // get the permissions role details $rp = \Zotlabs\Access\PermissionRoles::role_perms($r[0]['v']); if($rp) { - // set the channel limits if appropriate or 0 - if(array_key_exists('limits',$rp) && array_key_exists($p,$rp['limits'])) { - \Zotlabs\Access\PermissionLimits::Set($cc['uid'],$p,$rp['limits'][$p]); + + // for custom permission roles we need to customise how we initiate this new permission + if(array_key_exists('role',$rp) && ($rp['role'] === 'custom' || $rp['role'] === '')) { + \Zotlabs\Access\PermissionRoles::new_custom_perms($cc['uid'],$p,$x); } else { - \Zotlabs\Access\PermissionLimits::Set($cc['uid'],$p,0); - } + // set the channel limits if appropriate or 0 + if(array_key_exists('limits',$rp) && array_key_exists($p,$rp['limits'])) { + \Zotlabs\Access\PermissionLimits::Set($cc['uid'],$p,$rp['limits'][$p]); + } + else { + \Zotlabs\Access\PermissionLimits::Set($cc['uid'],$p,0); + } + - $set = ((array_key_exists('perms_connect',$rp) && array_key_exists($p,$rp['perms_connect'])) ? true : false); - // foreach connection set to the perms_connect value - if($x) { - foreach($x as $xx) { - set_abconfig($cc['uid'],$xx['abook_xchan'],'my_perms',$p,intval($set)); + $set = ((array_key_exists('perms_connect',$rp) && array_key_exists($p,$rp['perms_connect'])) ? true : false); + // foreach connection set to the perms_connect value + if($x) { + foreach($x as $xx) { + set_abconfig($cc['uid'],$xx['abook_xchan'],'my_perms',$p,intval($set)); + } } } } diff --git a/doc/about/about_hub.html b/doc/about/about_hub.html new file mode 100644 index 000000000..b6e0dc068 --- /dev/null +++ b/doc/about/about_hub.html @@ -0,0 +1,10 @@ +<h1>Terms of Service</h1> +<ul> + <li><a href="/help/TermsOfService">Terms of Service for this hub</a></li> +</ul> + +<h1>Site Info</h1> +<ul> + <li><a href="/siteinfo">Site Info</a></li> + <li><a href="/siteinfo/json">Site Info (JSON format)</a></li> +</ul>
\ No newline at end of file diff --git a/doc/about/about_hubzilla.html b/doc/about/about_hubzilla.html new file mode 100644 index 000000000..8b0168cbb --- /dev/null +++ b/doc/about/about_hubzilla.html @@ -0,0 +1,197 @@ + + +<h1 id="project">Hubzilla Project</h1> +<p> + Hubzilla is a decentralized communication network, which aims to provide communication that is censorship-resistant, privacy-respecting, and thus free from the oppressive claws of contemporary corporate communication giants. These giants function primarily as spy networks for paying clients of all sorts and types, in addition to monopolizing and centralizing the Internet; a feature that was not part of the original and revolutionary goals that produced the World Wide Web. <br><br>Hubzilla is free and open source. It is designed to scale from a $35 Raspberry Pi, to top of the line AMD and Intel Xeon-powered multi-core enterprise servers. It can be used to support communication between a few individuals, or scale to many thousands and more.<br><br>Hubzilla aims to be skill and resource agnostic. It is easy to use by everyday computer users, as well as by systems administrators and developers. <br><br>How you use it depends on how you want to use it. <br><br>It is written in the PHP scripting language, thus making it trivial to install on any hosting platform in use today. This includes self-hosting at home, at hosting providers such as <a href="http://mediatemple.com/">Media Temple</a> and <a href="http://www.dreamhost.com/">Dreamhost</a>, or on virtual and dedicated servers, offered by the likes of <a href="https://www.linode.com">Linode</a>, <a href="http://greenqloud.com">GreenQloud</a> or <a href="https://aws.amazon.com">Amazon AWS</a>.<br><br>In other words, Hubzilla can run on any computing platform that comes with a web server, a MySQL-compatible database, and the PHP scripting language. <br><br>Along the way, Hubzilla offers a number of unique goodies: <br><br><strong>Single-click user identification:</strong> meaning you can access sites on Hubzilla simply by clicking on links to remote sites. Authentication just happens automagically behind the scenes. Forget about remembering multiple user names with multiple passwords when accessing different sites online.<br><br><strong>Cloning:</strong> of online identities. Your online presence no longer has to be tied to a single server, domain name or IP address. You can clone and import your identity (or channel as we call it) to another server (or, a hub as servers are known in Hubzilla). Now, should your primary hub go down, no worries, your contacts, posts<em>*</em>, and messages<em>*</em> will automagically continue to be available and accessible under your cloned channel. <em>(*: only posts and messages as from the moment you cloned your channel)</em><br><br><strong>Privacy:</strong> Hubzilla identities (Zot IDs) can be deleted, backed up/downloaded, and cloned. The user is in full control of their data. Should you decide to delete all your content and erase your Zot ID, all you have to do is click on a link and it's immediately deleted from the hub. No questions, no fuss. +</p> + +<h2 id="resources-links">Resources and Links</h2> +<ul> + <li><a href="http://hubzilla.org">Hubzilla project website</a></li> + <li><a href="https://github.com/redmatrix/hubzilla">Hubzilla core code repository</a></li> + <li><a href="https://github.com/redmatrix/hubzilla-addons">Hubzilla official addons repository</a></li> +</ul> + +<h2 id="project-governance">Governance</h2> + +<br><br>Governance relates to the management of a project and particularly how this relates to conflict resolution.<br><br><h3>Community Governance</h3><br><br>The project is maintained and decisions made by the 'community'. The governance structure is still evolving. Until the structure is finalised, decisions are made in the following order:<br><br><ul class="listdecimal" style="list-style-type: decimal;"><li> Lazy Consensus<br><br>If a project proposal is made to one of the community governance forums and there are no serious objections in a "reasonable" amount of time from date of proposal (we usually provide 2-3 days for all interested parties to weigh in), no vote needs to be taken and the proposal will be considered approved. Some concerns may be raised at this time, but if these are addressed during discussion and work-arounds provided, it will still be considered approved. <br></li><li> Veto<br><br>Senior developers with a significant history of project commits may veto any decision. The decision may not proceed until the veto is removed or an alternative proposal is presented.<br></li><li> Community Vote<br><br>A decision which does not have a clear mandate or clear consensus, but is not vetoed, can be taken to a community vote. At present this is a simple popular vote in one of the applicable community forums. At this time, popular vote decides the outcome. This may change in the future if the community adopts a 'council' governance model. This document will be updated at that time with the updated governance rules. <br></li></ul><br><br>Community Voting does not always provide a pleasant outcome and can generate polarised factions in the community (hence the reason why other models are under consideration). If the proposal is 'down voted' there are still several things which can be done and the proposal re-submitted with slightly different parameters (convert to an addon, convert to an optional feature which is disabled by default, etc.). If interest in the feature is high and the vote is "close", it can generate lots of bad feelings amongst the losing voters. On such close votes, it is <strong>strongly recommended</strong> that the proposer take steps to address any concerns that were raised and re-submit. + + + +<h2 id="project-privacy-policy">Privacy Policy</h2> + +<h3>Summary</h3> + +<p>Q: Who can see my content?</p> + +<p>A: By default ANYBODY on the internet, UNLESS you restrict it. Hubzilla allows you to choose the privacy level you desire. Restricted content will NOT be visible to "spy networks" and advertisers. It will be protected against eavesdropping by outsiders - to the best of our ability. Hub administrators with sufficient skills and patience MAY be able to eavesdrop on some private communications but they must expend effort to do so. Privacy modes exist within Hubzilla which are even resistant to eavesdropping by skilled and determined hub administrators.</p> + +<p>Q: Can my content be censored?</p> + +<p>A: Hubzilla (the network) CANNOT censor your content. Server and hub administrators are subject to local laws and MAY remove objectionable content from their site/hub. Anybody MAY become a hub administrator, including you; and therefore publish content which might otherwise be censored. You still MAY be subject to local laws.</p> + +<h3>Definitions</h3> + +<p><strong>Hubzilla</strong></p> + +<p>Otherwise referred to as "the network", Hubzilla is a collection of individual computers/servers (aka <strong>hubs</strong>) which connect together to form a larger cooperative network.</p> + +<p><strong>hub</strong></p> + +<p>An individual computer or server connected to Hubzilla. These are provided by a <strong>hub administrator</strong> and may be public or private, paid or free.</p> + +<p><strong>hub administrator</strong></p> + +<p>The system operator of an individual hub.</p> + +<h3>Policies</h3> + +<p><strong>Public Information</strong></p> + +<p>Any information or anything posted by you within Hubzilla MAY be public or visible to anybody on the internet. To the extent possible, Hubzilla allows you to protect content and restrict who can view it.</p> + +<p>Your profile photo, your channel name, and the location (URL or network address) of your channel are visible to anybody on the internet and privacy controls will not affect the display of these items.</p> + +<p>You MAY additionally provide other profile information. Any information which you provide in your "default" or <strong>public profile</strong> MAY be transmitted to other hubs in Hubzilla and additionally MAY be displayed in the channel directory. You can restrict the viewing of this profile information. It may be restricted only to members of your hub, or only connections (friends), or other limited sets of viewers as you desire. If you wish for your profile to be restricted, you must set the appropriate privacy setting, or simply DO NOT provide additional information.</p> + +<p><strong>Content</strong></p> + +<p>Content you provide (status posts, photos, files, etc.) belongs to you. Hubzilla default is to publish content openly and visible to anybody on the internet (PUBLIC). You MAY control this in your channel settings and restrict the default permissions or you MAY restrict the visibility of any single published item separately (PRIVATE). Hubzilla developers will ensure that restricted content is ONLY visible to those in the restriction list - to the best of their ability.</p> + +<p>Content (especially status posts) that you share with other networks or that you have made visible to anybody on the internet (PUBLIC) cannot easily be taken back once it has been published. It MAY be shared with other networks and made available through RSS/Atom feeds. It may also be syndicated on other Hubzilla sites. It MAY appear on other networks and websites and be visible in internet searches. If you do not wish this default behaviour please adjust your channel settings and restrict who can see your content.</p> + +<p><strong>Comments and Forum posts</strong></p> + +<p>Comments to posts that were created by others and posts which are designated as forum posts belong to you as the creator/author, but the distribution of these posts is not under your direct control, and you relinquish SOME rights to these items. These posts/comments MAY be re-distributed to others, and MAY be visible to anybody on the internet. In the case of comments, the creator of the "first message" in the thread (conversation) to which you are replying controls the distribution of all comments and replies to that message. They "own" and therefore have certain rights with regard to the entire conversation (including all comments contained within it). You can still edit or delete the comment, but the conversation owner also has rights to edit, delete, re-distribute, and backup/restore any or all the content from the conversation.</p> + +<p><strong>Private Information</strong></p> + +<p>Hubzilla developers will ensure that any content you provide which is designated as PRIVATE will be protected against eavesdropping - to the best of their ability. Private channel content CAN be seen in the database of every involved hub administrator, but private messages are obscured in the database. The latter means that it is very difficult, but NOT impossible for this content to be seen by a hub administrator. Private channel content and private messages are also stripped from email notifications. End to end encryption is provided as an optional feature and this CANNOT be seen, even by a determined administrator.</p> + +<h3>Identity Privacy</h3> + +<p>Privacy for your identity is another aspect. Because you have a decentralized identity in Hubzilla, your privacy extends beyond your home hub. If you want to have complete control of your privacy and security you should run your own hub on a dedicated server. For many people, this is complicated and may stretch their technical abilities. So let's list a few precautions you can make to assure your privacy as much as possible.</p> + +<p>A decentralized identity has a lot of advantages and gives you al lot of interesting features, but you should be aware of the fact that your identity is known by other hubs in Hubzilla network. One of those advantages is that other channels can serve you customized content and allow you to see private things (such as private photos which others wish to share with you). Because of this those channels need to know who you are. But we understand that sometimes those other channels know more from you than you might desire. For instance the plug-in Visage that can tell a channel owner the last time you visit their profile. You can easily OPT-OUT of this low level and we think, harmless tracking.</p> + +<ul> +<li>You can enable <a href="http://donottrack.us/">Do Not Track (DNT)</a> in your web browser. We respect this new privacy policy proposal. All modern browsers support DNT. You will find it in the privacy settings of your browsers or else you can consult the web browser's manual. This will not affect the functionality of Hubzilla. This setting is probably enough for most people.</li> +</ul> + +<p>*You can <a href="settings">disable publication</a> of your channel in our channel directory. If you want people to find your channel, you should give your channel address directly to them. We think this is a good indication that you prefer extra privacy and automatically enable "Do Not Track" if this is the case.</p> + +<ul> +<li>You can have a blocked hub. That means that all channels and content on that hub is not public, and not visible to the outside world. This is something only your hub administrator can do. We also respect this and automatically enable "Do Not Track" if it is set.</li> +</ul> + +<h3>Censorship</h3> + +<p>Hubzilla is a global network which is inclusive of all religions and cultures. This does not imply that every member of the network feels the same way you do on contentious issues, and some people may be STRONGLY opposed to the content you post. In general, if you wish to post something that you know may nor be universally acceptable, the best approach is to restrict the audience using privacy controls to a small circle of friends.</p> + +<p>Hubzilla as a network provider is unable to censor content. However, hub administrators MAY censor any content which appears on their hub to comply with local laws or even personal judgement. Their decision is final. If you have issues with any hub administrator, you may move your account and postings to another site which is more in line with your expectations. Please check (periodically) the <a href="help/TermsOfService">Terms of Service</a> of your hub to learn about any rules or guidelines. If your content consists of material which is illegal or may cause issues, you are STRONGLY encouraged to host your own (become a hub administrator). You may still find that your content is blocked on some hubs, but Hubzilla as a network cannot block it from being posted.</p> + +<p>Hubzilla RECOMMENDS that hub administrators provide a grace period of 1-2 days between warning an account holder of content that needs to be removed and physically removing or disabling the account. This will give the content owner an opportunity to export their channel meta-data and import it to another site. In rare cases the content may be of such a nature to justify the immediate termination of the account. This is a hub decision, not a Hubzilla decision.</p> + +<p>If you typically and regularly post content of an adult or offensive nature, you are STRONGLY encouraged to mark your account "NSFW" (Not Safe For Work). This will prevent the display of your profile photo in the directory except to viewers that have chosen to disable "safe mode". If your profile photo is found by directory administrators to be adult or offensive, the directory administrator MAY flag your profile photo as NSFW. There is currently no official mechanism to contest or reverse this decision, which is why you SHOULD mark your own account NSFW if it is likely to be inappropriate for general audiences.</p> + + + +<h1 id="features">Features</h1> +<p> + <strong><span style="font-size: 24px;">Hubzilla in a Nutshell</span></strong><br><br>TL;DR <br><br>Hubzilla provides distributed web publishing and social communications with <strong>decentralised permissions</strong>.<br><br>So what exactly are "decentralised permissions"? They give me the ability to share something on my website (photos, media, files, webpages, etc.) with specific people on completely different websites - but not necessarily <em>everybody</em> on those websites; and they do not need a password on my website and do not need to login to my website to view the things I've shared with them. They have one password on their own website and "magic authentication" between affiliated websites in the network. Also, as it is decentralised, there is no third party which has the ability to bypass permissions and see everything in the network.<br><br>Hubzilla combines many features of traditional blogs, social networking and media, content management systems, and personal cloud storage into an easy to use framework. Each node in the grid can operate standalone or link with other nodes to create a super-network; leaving privacy under the control of the original publisher. <br><br>Hubzilla is an open source webserver application written originally in PHP/MySQL and is easily installable by those with basic website administration skills. It is also easily extended via plugins and themes and other third-party tools. <br><br><strong><span style="font-size: 24px;">Hubzilla Features</span></strong><br><br><br>Hubzilla is a general-purpose web publishing and communication network, with several unique features. It is designed to be used by the widest range of people on the web, from non-technical bloggers, to expert PHP programmers and seasoned systems administrators.<br><br>This page lists some of the core features of Hubzilla that are bundled with the official release. As with most free and open source software, there may be many other extensions, additions, plugins, themes and configurations that are limited only by the needs and imagination of the members.<br><br><strong><span style="font-size: 20px;">Built for Privacy and Freedom</span></strong><br><br>One of the design goals of Hubzilla is to enable easy communication on the web, while preserving privacy, if so desired by members. To achieve this goal, Hubzilla includes a number of features allowing arbitrary levels of privacy:<br><br><strong>Affinity Slider</strong><br><br>When adding connnections in Hubzilla, members have the option of assigning "affinity" levels (how close your friendship is) to the new connection. For example, when adding someone who happens to be a person whose blog you follow, you could assign their channel an affinity level of "Acquaintances". <br><br>On the other hand, when adding a friend's channel, they could be placed under the affinity level of "Friends".<br><br>At this point, Hubzilla <em>Affinity Slider</em> tool, which usually appears at the top of your "Matrix" page, adjusts the content on the page to include those within the desired affinity range. Channels outside that range will not be displayed, unless you adjust the slider to include them.<br><br>The Affinity Slider allows instantaneous filtering of large amounts of content, grouped by levels of closeness.<br><br><strong>Connection Filtering</strong><br><br>You have the ability to control precisely what appears in your stream using the optional "Connection Filter". When enabled, the Connection Editor provides inputs for selecting criteria which needs to be matched in order to include or exclude a specific post from a specific channel. Once a post has been allowed, all comments to that post are allowed regardless of whether they match the selection criteria. You may select words that if present block the post or ensure it is included in your stream. Regular expressions may be used for even finer control, as well as hashtags or even the detected language of the post. <br><br><strong>Access Control Lists</strong><br><br>When sharing content, members have the option of restricting who sees the content. By clicking on the padlock underneath the sharing box, one may choose desired recipients of the post, by clicking on their names.<br><br>Once sent, the message will be viewable only by the sender and the selected recipients. In other words, the message will not appear on any public walls.<br><br>Access Control Lists may be applied to content and posts, photos, events, webpages, chatrooms and files. <br><br><strong>Single Sign-on</strong><br><br>Access Control Lists work for all channels in the grid due to our unique single sign-on technology. Most internal links provide an identity token which can be verified on other Hubzilla sites and used to control access to private resources. You login once to your home hub. After that, authentication to all Hubzilla resources is "magic".<br><br><br><strong>WebDAV enabled File Storage</strong><br><br>Files may be uploaded to your personal storage area using your operating system utilities (drag and drop in most cases). You may protect these files with Access Control Lists to any combination of Hubzilla members (including some third party network members) or make them public.<br><br><strong>Photo Albums</strong><br><br>Store photos in albums. All your photos may be protected by Access Control Lists.<br><br><strong>Events Calendar</strong><br><br>Create and manage events and tasks, which may also be protected with Access Control Lists. Events can be imported/exported to other software using the industry standard vcalendar/iCal format and shared in posts with others. Birthday events are automatically added from your friends and converted to your correct timezone so that you will know precisely when the birthday occurs - no matter where you are located in the world in relation to the birthday person. Events are normally created with attendance counters so your friends and connections can RSVP instantly. <br><br><strong>Chatrooms</strong><br><br>You may create any number of personal chatrooms and allow access via Access Control Lists. These are typically more secure than XMPP, IRC, and other Instant Messaging transports, though we also allow using these other services via plugins. <br><br><strong>Webpage Building</strong><br><br>Hubzilla has many "Content Management" creation tools for building webpages, including layout editing, menus, blocks, widgets, and page/content regions. All of these may be access controlled so that the resulting pages are private to their intended audience. <br><br><strong>Apps</strong><br><br>Apps may be built and distributed by members. These are different from traditional "vendor lockin" apps because they are controlled completely by the author - who can provide access control on the destination app pages and charge accordingly for this access. Most apps in Hubzilla are free and can be created easily by those with no programming skills. <br><br><strong>Layout</strong><br><br>Page layout is based on a description language called Comanche. Hubzilla is itself written in Comanche layouts which you can change. This allows a level of customisation you won't typically find in so-called "multi-user environments".<br><br><strong>Bookmarks</strong><br><br>Share and save/manage bookmarks from links provided in conversations. <br> <br> <br><strong>Private Message Encryption and Privacy Concerns</strong><br><br>Private mail is stored in an obscured format. While this is not bullet-proof it typically prevents casual snooping by the site administrator or ISP. <br><br>Each Hubzilla channel has it's own unique set of private and associated public RSA 4096-bit keys, generated when the channels is first created. This is used to protect private messages and posts in transit.<br><br>Additionally, messages may be created utilising "end-to-end encryption" which cannot be read by Hubzilla operators or ISPs or anybody who does not know the passcode. <br><br>Public messages are generally not encrypted in transit or in storage. <br><br>Private messages may be retracted (unsent) although there is no guarantee the recipient hasn't read it yet.<br><br>Posts and messages may be created with an expiration date, at which time they will be deleted/removed on the recipient's site. <br><br><br><strong>Service Federation</strong><br><br>In addition to addon "cross-post connectors" to a variety of alternate networks, there is native support for importation of content from RSS/Atom feeds and using this to create special channels. Also, an experimental but working implementation of the Diaspora protocol allows communication with people on the Friendica and Diaspora decentralised social networks. This is currently marked experimental because these networks do not have the same level of privacy and encryption features and abilities as Hubzilla and may present privacy risks.<br><br>There is also experimental support for OpenID authentication which may be used in Access Control Lists. This is a work in progress. Your Hubzilla hub may be used as an OpenID provider to authenticate you to external services which use this technology. <br><br>Channels may have permissions to become "derivative channels" where two or more existing channels combine to create a new topical channel. <br><br><strong>Privacy Groups</strong><br><br>Our implementation of privacy groups is similar to Google "Circles" and Diaspora "Aspects". This allows you to filter your incoming stream by selected groups, and automatically set the outbound Access Control List to only those in that privacy group when you post. You may over-ride this at any time (prior to sending the post). <br><br><br><strong>Directory Services</strong><br><br>We provide easy access to a directory of members and provide decentralised tools capable of providing friend "suggestions". The directories are normal Hubzilla sites which have chosen to accept the directory server role. This requires more resources than most typical sites so is not the default. Directories are synchronised and mirrored so that they all contain up-to-date information on the entire network (subject to normal propagation delays). <br> <br><br><strong>TLS/SSL</strong><br><br>For Hubzilla hubs that use TLS/SSL, client to server communications are encrypted via TLS/SSL. Given recent disclosures in the media regarding widespread, global surveillance and encryption circumvention by the NSA and GCHQ, it is reasonable to assume that HTTPS-protected communications may be compromised in various ways. Private communications are consequently encrypted at a higher level before sending offsite.<br><br><strong>Channel Settings</strong><br><br>When a channel is created, a role is chosen which applies a number of pre-configured security and privacy settings. These are chosen for best practives to maintain privacy at the requested levels. <br><br>If you choose a "custom" privacy role, each channel allows fine-grained permissions to be set for various aspects of communication. For example, under the "Security and Privacy Settings" heading, each aspect on the left side of the page, has six (6) possible viewing/access options, that can be selected by clicking on the dropdown menu. There are also a number of other privacy settings you may edit. <br><br>The options are:<br><br> - Nobody except yourself.<br> - Only those you specifically allow.<br> - Anybody in your address book.<br> - Anybody on this website.<br> - Anybody in this network.<br> - Anybody authenticated.<br> - Specific people you provide a Guest Access Token to in order to access a specific item.<br> - Anybody on the Internet.<br><br><br><strong>Public and Private Forums</strong><br><br>Forums are typically channels which may be open to participation from multiple authors. There are currently two mechanisms to post to forums: 1) "wall-to-wall" posts and 2) via forum @mention tags. Forums can be created by anybody and used for any purpose. The directory contains an option to search for public forums. Private forums can only be posted to and often only seen by members.<br><br><br><strong>Account Cloning</strong><br><br>Accounts in Hubzilla are referred to as <em>nomadic identities</em>, because a member's identity is not bound to the hub where the identity was originally created. For example, when you create a Facebook or Gmail account, it is tied to those services. They cannot function without Facebook.com or Gmail.com. <br><br>By contrast, say you've created a Hubzilla identity called <strong>tina@Hubzillahub.com</strong>. You can clone it to another Hubzilla hub by choosing the same, or a different name: <strong>liveForever@SomeHubzillaHub.info</strong><br><br>Both channels are now synchronized, which means all your contacts and preferences will be duplicated on your clone. It doesn't matter whether you send a post from your original hub, or the new hub. Posts will be mirrored on both accounts.<br><br>This is a rather revolutionary feature, if we consider some scenarios:<br><br> - What happens if the hub where an identity is based suddenly goes offline? Without cloning, a member will not be able to communicate until that hub comes back online (no doubt many of you have seen and cursed the Twitter "Fail Whale"). With cloning, you just log into your cloned account, and life goes on happily ever after. <br><br> - The administrator of your hub can no longer afford to pay for his free and public Hubzilla hub. He announces that the hub will be shutting down in two weeks. This gives you ample time to clone your identity(ies) and preserve yourHubzilla relationships, friends and content.<br><br> - What if your identity is subject to government censorship? Your hub provider may be compelled to delete your account, along with any identities and associated data. With cloning, Hubzilla offers <strong>censorship resistance</strong>. You can have hundreds of clones, if you wanted to, all named different, and existing on many different hubs, strewn around the internet. <br><br>Hubzilla offers interesting new possibilities for privacy. You can read more at the <<Private Communications Best Practices>> page.<br><br>Some caveats apply. For a full explanation of identity cloning, read the <HOW TO CLONE MY IDENTITY>.<br><br><strong>Multiple Profiles</strong><br><br>Any number of profiles may be created containing different information and these may be made visible to certain of your connections/friends. A "default" profile can be seen by anybody and may contain limited information, with more information available to select groups or people. This means that the profile (and site content) your beer-drinking buddies see may be different than what your co-workers see, and also completely different from what is visible to the general public. <br><br><strong>Account Backup</strong><br><br>Red offers a simple, one-click account backup, where you can download a complete backup of your profile(s). <br><br>Backups can then be used to clone or restore a profile.<br><br><strong>Account Deletion</strong><br><br>Accounts can be immediately deleted by clicking on a link. That's it. All associated content is then deleted from the grid (this includes posts and any other content produced by the deleted profile). Depending on the number of connections you have, the process of deleting remote content could take some time but it is scheduled to happen as quickly as is practical.<br><br><strong><span style="font-size: 20px;">Content Creation</span></strong><br><br><strong>Writing Posts</strong><br><br>Hubzilla supports a number of different ways of adding rich-text content. The default is a custom variant of BBcode, tailored for use in Hubzilla. You may also enable the use of Markdown if you find that easier to work with. A visual editor may also be used. The traditional visual editor for Hubzilla had some serious issues and has since been removed. We are currently looking for a replacement. <br><br>When creating "Websites", content may be entered in HTML, Markdown, BBcode, and/or plain text.<br><br><strong>Deletion of content</strong><br>Any content created in Hubzilla remains under the control of the member (or channel) that originally created it. At any time, a member can delete a message, or a range of messages. The deletion process ensures that the content is deleted, regardless of whether it was posted on a channel's primary (home) hub, or on another hub, where the channel was remotely authenticated via Zot (Hubzilla communication and authentication protocol).<br><br><strong>Media</strong><br>Similar to any other modern blogging system, social network, or a micro-blogging service, Hubzilla supports the uploading of files, embedding of videos, linking web pages.<br><br><strong>Previewing/Editing</strong> <br>Post can be previewed prior to sending and edited after sending.<br><br><strong>Voting/Consensus</strong><br>Posts can be turned into "consensus" items which allows readers to offer feedback, which is collated into "agree", "disagree", and "abstain" counters. This lets you gauge interest for ideas and create informal surveys. <br><br><br><strong>Extending Hubzilla</strong><br><br>Hubzilla can be extended in a number of ways, through site customisation, personal customisation, option setting, themes, and addons/plugins. <br><br><strong>API</strong><br><br>An API is available for use by third-party services. This is based originally on the early Twitter API (for which hundreds of third-party tools exist). It is currently being extended to provide access to facilities and abilities which are specific to Hubzilla. Access may be provided by login/password or OAuth and client registration of OAuth applications is provided. +</p> + +<h1 id="zot">Zot protocol</h1> +<p> + <strong>What is Zot?</strong><br><br>Zot is the protocol that powers Hubzilla, providing three core capabilities: Communications, Identity, and Access Control.<br><br>The functionality it provides can also be described as follows: <br><br> - a relationship online is just a bunch of permissions<br> - the internet is just another folder<br><br><strong><span style="font-size: 20px;">Communications</span></strong><br><br>Zot is a revolutionary protocol which provides <em>decentralised communications</em> and <em>identity management</em> across the grid. The resulting platform can provide web services comparable to those offered by large corporate providers, but without the large corporate provider and their associated privacy issues, insatiable profit drive, and walled-garden mentality.<br><br>Communications and social networking are an integral part of the grid. Any channel (and any services provided by that channel) can make full use of feature-rich social communications on a global scale. These communications may be public or private - and private communications comprise not only fully encrypted transport, but also encrypted storage to help protect against accidental snooping and disclosure by rogue system administrators and internet service providers. <br><br>Zot allows a wide array of background services in the grid, from offering friend suggestions, to directory services. You can also perform other things which would typically only be possibly on a centralized provider - such as "Wall to Wall" posts. Private/multiple profiles can be easily created, and web content can be tailored to the viewer via the <em>Affinity Slider</em>. <br><br>You won't find these features at all on other decentralized communication services. In addition to providing hub (server) decentralization, perhaps the most innovative and interesting Zot feature is its provision of <em>decentralized identity</em> services.<br><br><strong><span style="font-size: 20px;">Identity</span></strong> <br><br>Zot's identity layer is unique. It provides <em>invisible single sign-on</em> across all sites in the grid. <br><br>It also provides <em>nomadic identity</em>, so that your communications with friends, family, and or anyone else you're communicating with won't be affected by the loss of your primary communication node - either temporarily or permanently. <br><br>The important bits of your identity and relationships can be backed up to a thumb drive, or your laptop, and may appear at any node in the grid at any time - with all your friends and preferences intact. <br><br>Crucially, these nomadic instances are kept in sync so any instance can take over if another one is compromised or damaged. This protects you against not only major system failure, but also temporary site overloads and governmental manipulation or censorship. <br><br>Nomadic identity, single sign-on, and Hubzilla's decentralization of hubs, we believe, introduce a high degree of degree of <em>resiliency</em> and <em>persistence</em> in internet communications, that are sorely needed amidst global trends towards corporate centralization, as well as mass and indiscriminate government surveillance and censorship.<br><br>As you browse the grid, viewing channels and their unique content, you are seamlessly authenticated as you go, even across completely different server hubs. No passwords to enter. Nothing to type. You're just greeted by name on every new site you visit. <br><br>How does Zot do that? We call it <em>magic-auth</em>, because Hubzilla hides the details of the complexities that go into single sign-on logins, and nomadic identities, from the experience of browsing on the grid. This is one of the design goals of Hubzilla: to increase privacy, and freedom on the web, while reducing the complexity and tedium brought by the need to enter new passwords and user names for every different sight that someone might visit online.<br><br>You login only once on your home hub (or any nomadic backup hub you have chosen). This allows you to access any authenticated services provided anywhere in the grid - such as shopping, blogs, forums, and access to private information. This is just like the services offered by large corporate providers with huge user databases; however you can be a member of this community, as well as a server on this network using a $35 Rasberry Pi. Your password isn't stored on a thousand different sites, or even worse, only on a few sites like Google and Facebook, beyond your direct control.<br><br>You cannot be silenced. You cannot be removed from the grid, unless you yourself choose to exit it.<br><br><strong><span style="font-size: 20px;">Access Control</span></strong><br><br>Zot's identity layer allows you to provide fine-grained permissions to any content you wish to publish - and these permissions extend across Hubzilla. This is like having one super huge website made up of an army of small individual websites - and where each channel in the grid can completely control their privacy and sharing preferences for any web resources they create. <br><br>Currently, the grid supports communications, photo albums, events, and files. This will be extended in the future to provide content management services (web pages) and cloud storage facilities, such as WebDAV and multi-media libraries. Every object and how it is shared and with whom is completely under your control.<br><br>This type of control is available on large corporate providers such as Facebook and Google, because they own the user database. Within the grid, there is no need for a huge user databaseon your machine - because the grid <em>is</em> your user database. It has what is essentially infinite capacity (limited by the total number of hubs online across the internet), and is spread amongst hundreds, and potentially millions of computers. <br><br>Access can be granted or denied for any resource, to any channel, or any group of channels; anywhere within the grid. Others can access your content if you permit them to do so, and they do not even need to have an account on your hub. Your private photos cannot be viewed, because permission really work; they are not an addon that was added as an afterthought. If you aren't on the list of allowed viewers for a particular photo, you aren't going to look at it. <br><br><strong><span style="font-size: 18px;">Additional Resources and Links</span></strong><br><br>For more detailed, technical information about Zot, check out the following links: <br><br> - <a href="https://github.com/friendica/red/wiki/Zot---A-High-Level-Overview">A high level overview</a><br><br> - <a href="https://github.com/friendica/red/wiki/zot">Zot development specification</a><br><br> - <a href="https://github.com/redmatrix/hubzilla/blob/master/include/zot.php">Zot reference implementation in PHP</a> +</p> + +<h1 id="credits">Credits</h1> +<p> +Thanks to all who have helped and contributed to the project and its predecessors over the years. +It is possible we missed in your name but this is unintentional. We also thank the community and +its members for providing valuable input and without whom this entire effort would be meaningless. +</p> +<p> +It is also worth acknowledging the contributions and solutions to problems which arose from +discussions amongst members and developers of other somewhat related and competing projects; +even if we have had our occasional disagreements. +</p> +<ul> + <li>Mike Macgirvin</li> + <li>Fabio Comuni</li> + <li>Simon L'nu</li> + <li>marijus</li> + <li>Tobias Diekershoff</li> + <li>fabrixxm</li> + <li>tommy tomson</li> + <li>Simon</li> + <li>zottel</li> + <li>Christian Vogeley</li> + <li>Jeroen van Riet Paap (jeroenpraat)</li> + <li>Michael Vogel</li> + <li>erik</li> + <li>Zach Prezkuta</li> + <li>Paolo T</li> + <li>Michael Meer</li> + <li>Michael</li> + <li>Abinoam P. Marques Jr</li> + <li>Tobias Hößl</li> + <li>Alexander Kampmann</li> + <li>Olaf Conradi</li> + <li>Paolo Tacconi</li> + <li>tobiasd</li> + <li>Devlon Duthie</li> + <li>Zvi ben Yaakov (a.k.a rdc)</li> + <li>Alexandre Hannud Abdo</li> + <li>Olivier Migeot</li> + <li>Chris Case</li> + <li>Klaus Weidenbach</li> + <li>Michael Johnston</li> + <li>olivierm</li> + <li>Vasudev Kamath</li> + <li>pixelroot</li> + <li>Max Weller</li> + <li>duthied</li> + <li>Martin Schmitt</li> + <li>Sebastian Egbers</li> + <li>Erkan Yilmaz</li> + <li>sasiflo</li> + <li>Stefan Parviainen</li> + <li>Haakon Meland Eriksen</li> + <li>Oliver Hartmann (23n)</li> + <li>Erik Lundin</li> + <li>habeascodice</li> + <li>sirius</li> + <li>Charles</li> + <li>Tony Baldwin</li> + <li>Hauke Zuehl</li> + <li>Keith Fernie</li> + <li>Anne Walk</li> + <li>toclimb</li> + <li>Daniel Frank</li> + <li>Matthew Exon</li> + <li>Michal Supler</li> + <li>Tobias Luther</li> + <li>U-SOUND\mike</li> + <li>mrjive</li> + <li>nostupidzone</li> + <li>tonnerkiller</li> + <li>Antoine G</li> + <li>Christian Drechsler</li> + <li>Ludovic Grossard</li> + <li>RedmatrixCanada</li> + <li>Stanislav Lechev [0xAF]</li> + <li>aweiher</li> + <li>bufalo1973</li> + <li>dsp1986</li> + <li>felixgilles</li> + <li>ike</li> + <li>maase2</li> + <li>mycocham</li> + <li>ndurchx</li> + <li>pafcu</li> + <li>Simó Albert i Beltran</li> + <li>Manuel Reva</li> + <li>Manuel Jiménez Friaza</li> +</ul>
\ No newline at end of file diff --git a/doc/admin/administrator_guide.html b/doc/admin/administrator_guide.html new file mode 100644 index 000000000..674d2a916 --- /dev/null +++ b/doc/admin/administrator_guide.html @@ -0,0 +1,342 @@ +<h1 id="Overview">Overview</h1> + +<p>Hubzilla is more than a simple web application. It is a +complex communications system which more closely resembles an email server +than a web server. For reliability and performance, messages are delivered in +the background and are queued for later delivery when sites are down. This +kind of functionality requires a bit more of the host system than the typical +blog. Not every PHP/MySQL hosting provider will be able to support +Hubzilla. Many will but please review the requirements and confirm these +with your hosting provider prior to installation.</p> + +<p>We've tried very hard to ensure that Hubzilla will run on commodity +hosting platforms such as those used to host Wordpress blogs and Drupal +websites. It will run on most any Linux VPS system. Windows LAMP platforms +such as XAMPP and WAMP are not officially supported at this time however +we welcome patches if you manage to get it working.</p> + +<h1 id="Where_to_find_more_help">Where to find more help</h1> + +<p>If you encounter problems or have issues not addressed in this documentation, +please let us know via the <a href="https://github.com/redmatrix/hubzilla/issues">Github issue +tracker</a>. Please be as clear as you +can about your operating environment and provide as much detail as possible +about any error messages you may see, so that we can prevent it from happening +in the future. Due to the large variety of operating systems and PHP platforms +in existence we may have only limited ability to debug your PHP installation or +acquire any missing modules * but we will do our best to solve any general code +issues.</p> + +<h1 id="Before_you_begin">Before you begin</h1> + +<h2 id="Choose_a_domain_name_or_subdomain_name_for_your_server">Choose a domain name or subdomain name for your server</h2> + +<p>Hubzilla can only be installed into the root of a domain or sub-domain, and can +not be installed using alternate TCP ports.</p> + +<h2 id="Decide_if_you_will_use_SSL_and_obtain_an_SSL_certificate_before_software_installation">Decide if you will use SSL and obtain an SSL certificate before software installation</h2> + +<p>You SHOULD use SSL. If you use SSL, you MUST use a "browser-valid" certificate.<br><em>You MUST NOT use self-signed certificates!</em></p> + +<p>Please test your certificate prior to installation. A web tool for testing your +certificate is available at "http://www.digicert.com/help/". When visiting your +site for the first time, please use the SSL ("https://") URL if SSL is available. +This will avoid problems later. The installation routine will not allow you to +use a non browser-valid certificate.</p> + +<p>This restriction is incorporated because public posts from you may contain +references to images on your own hub. Other members viewing their stream on +other hubs will get warnings if your certificate is not trusted by their web +browser. This will confuse many people because this is a decentralised network +and they will get the warning about your hub while viewing their own hub and may +think their own hub has an issue. These warnings are very technical and scary to +some folks, many of whom will not know how to proceed except to follow the browser +advice. This is disruptive to the community. That said, we recognise the issues +surrounding the current certificate infrastructure and agree there are many +problems, but that doesn't change the requirement.</p> + +<p>Free "browser-valid" certificates are available from providers such as StartSSL +and LetsEncrypt.</p> + +<p>If you do NOT use SSL, there may be a delay of up to a minute for the initial +install script * while we check the SSL port to see if anything responds there. +When communicating with new sites, Hubzilla always attempts connection on the +SSL port first, before falling back to a less secure connection. If you do not +use SSL, your webserver MUST NOT listen on port 443 at all.</p> + +<p>If you use LetsEncrypt to provide certificates and create a file under +.well-known/acme-challenge so that LetsEncrypt can verify your domain ownership, +please remove or rename the .well-known directory as soon as the certificate is +generated. Hubzilla will provide its own handler for ".well-known" services when +it is installed, and an existing directory in this location may prevent some of +these services from working correctly. This should not be a problem with Apache, +but may be an issue with nginx or other web server platforms.</p> + +<h1 id="Deployment">Deployment</h1> + +<p>There are several ways to deploy a new hub.</p> + +<ul><li>Manual installation on an existing server</li> +<li>Automated installation on an existing server using a shell script</li> +<li>Automated deployment using an OpenShift virtual private server (VPS)</li> +</ul><h1 id="Requirements">Requirements</h1> + +<ul><li><p>Apache with mod-rewrite enabled and "AllowOverride All" so you can use a +local .htaccess file. Some folks have successfully used nginx and lighttpd. +Example config scripts are available for these platforms in doc/install. +Apache and nginx have the most support.</p></li> +<li><p>PHP 5.5 or later.</p> + +<ul><li>Note that on some shared hosting environments, the <em>command line</em> version of +PHP might differ from the <em>webserver</em> version</li> +</ul></li> +<li><p>PHP <em>command line</em> access with register_argc_argv set to true in the +php.ini file * and with no hosting provider restrictions on the use of +exec() and proc_open().</p></li> +<li><p>curl, gd (with at least jpeg and png support), mysqli, mbstring, mcrypt, +and openssl extensions. The imagick extension is not required but desirable.</p></li> +<li><p>xml extension is required if you want webdav to work.</p></li> +<li><p>some form of email server or email gateway such that PHP mail() works.</p></li> +<li><p>Mysql 5.x or MariaDB or postgres database server.</p></li> +<li><p>ability to schedule jobs with cron.</p></li> +<li><p>Installation into a top-level domain or sub-domain (without a +directory/path component in the URL) is REQUIRED.</p></li> +</ul><h1 id="Manual_Installation">Manual Installation</h1> + +<h2 id="Unpack_the_Hubzilla_files_into_the_root_of_your_web_server_document_area">Unpack the Hubzilla files into the root of your web server document area</h2> + +<p>If you copy the directory tree to your webserver, make sure that you include the +hidden files like .htaccess.</p> + +<p>If you are able to do so, we recommend using git to clone the source +repository rather than to use a packaged tar or zip file. This makes the +software much easier to update. The Linux command to clone the repository +into a directory "mywebsite" would be:</p> + +<pre><code>git clone https://github.com/redmatrix/hubzilla.git mywebsite +</code></pre> + +<p>and then you can pick up the latest changes at any time with:</p> + +<pre><code>git pull +</code></pre> + +<p>make sure folders <code class="inline-code">store/[data]/smarty3</code> and <code class="inline-code">store</code> exist and are +writable by the webserver:</p> + +<pre><code>mkdir -p "store/[data]/smarty3" +chmod -R 777 store + +This permission (777) is very dangerous and if you have sufficient +privilege and knowledge you should make these directories writeable +only by the webserver and, if different, the user that will run the +cron job (see below). In many shared hosting environments this may be +difficult without opening a trouble ticket with your provider. The +above permissions will allow the software to work, but are not +optimal. +</code></pre> + +<p>The following directories also need to be writable by the webserver in order for certain +web-based administrative tools to function:</p> + +<ul><li><code class="inline-code">addon</code></li> +<li><code class="inline-code">extend</code></li> +<li><code class="inline-code">view/theme</code></li> +<li><code class="inline-code">widget</code></li> +</ul><h2 id="Official_addons">Official addons</h2> + +<h3 id="Installation">Installation</h3> + +<p>Navigate to your webThen you should clone the addon repository (separately). We'll give this repository a nickname of 'hzaddons'. You can pull in other hubzilla addon repositories by giving them different nicknames::</p> + +<pre><code>cd mywebsite +util/add_addon_repo https://github.com/redmatrix/hubzilla-addons.git hzaddons +</code></pre> + +<h3 id="Updating">Updating</h3> + +<p>For keeping the addon tree updated, you should be on your top level website directory and issue an update command for that repository::</p> + +<pre><code>cd mywebsite +util/update_addon_repo hzaddons +</code></pre> + +<p>Create searchable representations of the online documentation. You may do this + any time that the documentation is updated :</p> + +<pre><code>cd mywebsite +util/importdoc +</code></pre> + +<h1 id="Automated_installation_via_the_homeinstall_shell_script">Automated installation via the .homeinstall shell script</h1> + +<p>There is a shell script in (<code class="inline-code">.homeinstall/hubzilla-setup.sh</code>) that will install Hubzilla and its dependencies on a fresh installation of Debian 8.3 stable (Jessie). It should work on similar Linux systems but your results may vary.</p> + +<h2 id="Requirements">Requirements</h2> + +<p>The installation script was originally designed for a small hardware server behind your home router. However, it has been tested on several systems running Debian 8.3:</p> + +<ul><li><p>Home-PC (Debian-8.3.0-amd64)</p> + +<ul><li>Internet connection and router at home</li> +<li>Mini-pc connected to your router</li> +<li>USB drive for backups</li> +<li>Fresh installation of Debian on your mini-pc</li> +<li>Router with open ports 80 and 443 for your Debian</li> +</ul></li> +<li><p>DigitalOcean droplet (Debian 8.3 x64 / 512 MB Memory / 20 GB Disk / NYC3)</p></li> +</ul><h2 id="Overview_of_installation_steps">Overview of installation steps</h2> + +<ol><li><code class="inline-code">apt-get install git</code></li> +<li><code class="inline-code">mkdir -p /var/www/html</code></li> +<li><code class="inline-code">cd /var/www/html</code></li> +<li><code class="inline-code">git clone https://github.com/redmatrix/hubzilla.git .</code></li> +<li><code class="inline-code">nano .homeinstall/hubzilla-config.txt</code></li> +<li><code class="inline-code">cd .homeinstall/</code></li> +<li><code class="inline-code">./hubzilla-setup.sh</code></li> +<li><code class="inline-code">sed -i "s/^upload_max_filesize =.*/upload_max_filesize = 100M/g" /etc/php5/apache2/php.ini</code></li> +<li><code class="inline-code">sed -i "s/^post_max_size =.*/post_max_size = 100M/g" /etc/php5/apache2/php.ini</code></li> +<li><code class="inline-code">service apache2 reload</code></li> +<li>Open your domain with a browser and step throught the initial configuration of Hubzilla.</li> +</ol><h1 id="Service_Classes">Service Classes</h1> + +<p>Service classes allow you to set limits on system resources by limiting what individual +accounts can do, including file storage and top-level post limits. Define custom service +classes according to your needs in the <code class="inline-code">.htconfig.php</code> file. For example, create +a <em>standard</em> and <em>premium</em> class using the following lines:</p> + +<pre><code>// Service classes + +App::$config['system']['default_service_class']='standard'; // this is the default service class that is attached to every new account + +// configuration for parent service class +App::$config['service_class']['standard'] = +array('photo_upload_limit'=>2097152, // total photo storage limit per channel (here 2MB) +'total_identities' =>1, // number of channels an account can create +'total_items' =>0, // number of top level posts a channel can create. Applies only to top level posts of the channel user, other posts and comments are unaffected +'total_pages' =>100, // number of pages a channel can create +'total_channels' =>100, // number of channels the user can add, other users can still add this channel, even if the limit is reached +'attach_upload_limit' =>2097152, // total attachment storage limit per channel (here 2MB) +'chatters_inroom' =>20); + +// configuration for teacher service class +App::$config['service_class']['premium'] = +array('photo_upload_limit'=>20000000000, // total photo storage limit per channel (here 20GB) +'total_identities' =>20, // number of channels an account can create +'total_items' =>20000, // number of top level posts a channel can create. Applies only to top level posts of the channel user, other posts and comments are unaffected +'total_pages' =>400, // number of pages a channel can create +'total_channels' =>2000, // number of channels the user can add, other users can still add this channel, even if the limit is reached +'attach_upload_limit' =>20000000000, // total attachment storage limit per channel (here 20GB) +'chatters_inroom' =>100); +</code></pre> + +<p>To apply a service class to an existing account, use the command line utility from the +web root:</p> + +<p><code class="inline-code">util/service_class</code> +list service classes</p> + +<p><code class="inline-code">util/config system default_service_class firstclass</code> +set the default service class to 'firstclass'</p> + +<p><code class="inline-code">util/service_class firstclass</code> +list the services that are part of 'firstclass' service class</p> + +<p><code class="inline-code">util/service_class firstclass photo_upload_limit 10000000</code> +set firstclass total photo disk usage to 10 million bytes</p> + +<p><code class="inline-code">util/service_class --account=5 firstclass</code> +set account id 5 to service class 'firstclass' (with confirmation)</p> + +<p><code class="inline-code">util/service_class --channel=blogchan firstclass</code> +set the account that owns channel 'blogchan' to service class 'firstclass' (with confirmation)</p> + +<p><strong>Service class limit options</strong></p> + +<ul><li>photo_upload_limit - maximum total bytes for photos</li> +<li>total_items - maximum total toplevel posts</li> +<li>total_pages - maximum comanche pages</li> +<li>total_identities - maximum number of channels owned by account</li> +<li>total_channels - maximum number of connections</li> +<li>total_feeds - maximum number of rss feed connections</li> +<li>attach_upload_limit - maximum file upload storage (bytes)</li> +<li>minimum_feedcheck_minutes - lowest setting allowed for polling rss feeds</li> +<li>chatrooms - maximum chatrooms</li> +<li>chatters_inroom - maximum chatters per room</li> +<li>access_tokens - maximum number of Guest Access Tokens per channel</li> +</ul><h1 id="Theme_management">Theme management</h1> + +<h2 id="Repo_management_example">Repo management example</h2> + +<ol><li><p>Navigate to your hub web root</p> + +<p><code class="inline-code">root@hub:/root# cd /var/www</code></p></li> +<li><p>Add the theme repo and give it a name</p> + +<p><code class="inline-code">root@hub:/var/www# util/add_theme_repo https://github.com/DeadSuperHero/redmatrix-themes.git DeadSuperHero</code></p></li> +<li><p>Update the repo by using</p> + +<p><code class="inline-code">root@hub:/var/www# util/update_theme_repo DeadSuperHero</code></p></li> +</ol><h1 id="Channel_Directory">Channel Directory</h1> + +<h2 id="Keywords">Keywords</h2> + +<p>There is a "tag cloud" of keywords that can appear on the channel directory page. +If you wish to hide these keywords, which are drawn from the directory server, you +can use the <em>config</em> tool:</p> + +<pre><code>util/config system disable_directory_keywords 1 +</code></pre> + +<p>If your hub is in the standalone mode because you do not wish to connect to the +global grid, you may instead ensure the the <em>directory_server</em> system option is +empty:</p> + +<pre><code>util/config system directory_server "" +</code></pre> + +<h1 id="Upgrading_from_RedMatrix_to_Hubzilla">Upgrading from RedMatrix to Hubzilla</h1> + +<h2 id="How_to_migrate_an_individual_channel_from_RedMatrix_to_Hubzilla">How to migrate an individual channel from RedMatrix to Hubzilla</h2> + +<ol><li>Clone the channel by opening an account on a Hubzilla hub and performing a basic import (not content) from the original RedMatrix hub. Give your new clone time to sync connections and settings.</li> +<li>Export individual channel content from your RedMatrix hub to a set of JSON text files using the red.hub/uexport tool. Do this in monthly increments if necessary.</li> +<li>Import the JSON data files sequentially in chronological order into the Hubzilla clone using the new.hub/import_items tool.</li> +<li>Inform your Friendica and Diaspora contacts that your channel moves. They need to reconnect to your new address. </li> +<li>After successful import (check!) delete your channel on the old RedMatrix Server.</li> +<li>On the Hubzilla server visit new.hub/locs and upgrade to your channel to a primary one. And when the old Redmatrix server is still listed delete them here as well. Press "Sync" to inform all other server in the grid.</li> +</ol><h1 id="Troubleshooting">Troubleshooting</h1> + +<h2 id="Log_files">Log files</h2> + +<p><a href="https://macgirvin.com/display/044c72684b95c46a77ac7560656d1dc38504244dc649626c637193f6dd7c7dc4@macgirvin.com">Allow me to elaborate on logfiles...</a></p> + +<p>There are three different log facilities.</p> + +<p><strong>The first is the database failure log</strong>. This is only used if you create a file called specifically 'dbfail.out' in the root folder of your website and make it write-able by the web server. If we have any database failed queries, they are all reported here. They generally indicate typos in our queries, but also occur if the database server disconnects or tables get corrupted. On rare occasions we'll see race conditions in here where two processes tried to create an xchan or cache entry with the same ID. Any other errors (especially persistent errors) should be investigated.</p> + +<p><strong>The second is the PHP error log</strong>. This is created by the language processor and only reports issues in the language environment. Again these can be syntax errors or programming errors, but these generally are fatal and result in a "white screen of death"; e.g. PHP terminates. You should probably look at this file if something goes wrong that doesn't result in a white screen of death, but it isn't uncommon for this file to be empty for days on end.</p> + +<p>There are some lines at the bottom of the supplied .htconfig.php file; which if uncommented will enable a PHP error log (<em>extremely</em> useful for finding the source of white screen failures). This isn't done by default due to potential issues with logfile ownership and write permissions and the fact that there is no logfile rotation by default.</p> + +<p><strong>The third is the "application log"</strong>. This is used by Hubzilla to report what is going on in the program and usually reports any difficulties or unexpected data we received. It also occasionally reports "heartbeat" status messages to indicate that we reached a certain point in a script. <strong>This</strong> is the most important log file to us, as we create it ourself for the sole purpose of reporting the status of background tasks and anything that seems weird or out of place. It may not be fatal, but maybe just unexpected. If you're performing a task and there's a problem, let us know what is in this file when the problem occurred. (Please don't send me 100M dumps you'll only piss me off). Just a few relevant lines so I can rule out a few hundred thousand lines of code and concentrate on where the problem starts showing up.</p> + +<p>These are your site logs, not mine. We report serious issues at any log level. I highly recommend 'DEBUG' log level for most sites - which provides a bit of additional info and doesn't create huge logfiles. When there's a problem which defies all attempts to track, you might wish to use DATA log level for a short period of time to capture all the detail of what structures we were dealing with at the time. This log level will use a lot of space so is recommended only for brief periods or for developer test sites.</p> + +<p>I recommend configuring logrotate for both the php log and the application log. I usually have a look at dbfail.out every week or two, fix any issues reported and then starting over with a fresh file. Likewise with the PHP logfile. I refer to it once in a while to see if there's something that needs fixing.</p> + +<p>If something goes wrong, and it's not a fatal error, I look at the application logfile. Often I will +<code class="inline-code">tail -f logfile.out</code></p> + +<p>While repeating an operation that has problems. Often I'll insert extra logging statements in the code if there isn't any hint what's going wrong. Even something as simple as "got here" or printing out the value of a variable that might be suspect. You can do this too - in fact I encourage you to do so. Once you've found what you need to find, you can</p> + +<p><code class="inline-code">git checkout file.php</code></p> + +<p>To immediately clear out all the extra logging stuff you added. Use the information from this log and any detail you can provide from your investigation of the problem to file your bug report - unless your analysis points to the source of the problem. In that case, just fix it.</p> + +<h3 id="Rotating_log_files">Rotating log files</h3> + +<ol><li>Enable the <strong>logrot</strong> addon in the official <a href="https://github.com/redmatrix/hubzilla-addons">hubzilla-addons</a> repo</li> +<li>Create a directory in your web root called <code class="inline-code">log</code> with webserver write permissions</li> +<li>Go to the <strong>logrot</strong> admin settings and enter this folder name as well as the max size and number of retained log files.</li> +</ol>
\ No newline at end of file diff --git a/doc/api_functions.bb b/doc/api/api_functions.bb index e6cde3dc6..e6cde3dc6 100644 --- a/doc/api_functions.bb +++ b/doc/api/api_functions.bb diff --git a/doc/api/api_item_update.md b/doc/api/api_item_update.md new file mode 100644 index 000000000..598fd114a --- /dev/null +++ b/doc/api/api_item_update.md @@ -0,0 +1,225 @@ +API item/update +=============== + + +Usage: POST /api/z/1.0/item/update + +Description: item/update posts an item (typically a conversation item or post, but can be any item) using form input. + + +Required: + +- body + + text/bbcode contents by default. + + +Optional: + +- $_FILES['media'] + + uploaded media file to include with post + +- title + + title of post/item + +- contact_allow + + array of xchan.xchan_hash allowed to view this item + +- group_allow + + array of group.hash allowed to view this item + +- contact_deny + + array of xchan.xchan_hash not allowed to view this item + +- group_deny + + array of group.hash not allowed to view this item + +- coord + + geographic coordinates + +- location + + freefrom location + +- expire + + datetime this post will expire or be removed + +- mimetype + + mimetype if not text/bbcode + +- parent + + item.id of parent to this post (makes it a comment) + +- parent_mid + + alternate form of parent using message_id + +- remote_xchan + + xchan.xchan_hash of this message author if not the channel owner + +- consensus + + boolean set to true if this is a consensus or voting item (default false) + +- nocomment + + boolean set to true if comments are to be disabled (default false) + +- origin + + do not use this without reading the code + +- namespace + + persistent identity for a remote network or service + +- remote_id + + message_id of this resource on a remote network or service + +- message_id + + message_id of this item (leave unset to generate one) + +- created + + datetime of message creation + +- post_id + + existing item.id if this is an edit operation + +- app + + application or network name to display with item + +- categories + + comma separated categories for this item + +- webpage + + item.page_type if not 0 + +- pagetitle + + for webpage and design elements, the 'page name' + +- layout_mid + + item.mid of layout for this design element + +- plink + + permalink for this item if different than the default + +- verb + + activitystream verb for this item/activity + +- obj_type + + activitystream object type for this item/activity + + + +Example: + +curl -u mychannel:mypassword https://xyz.macgirvin.com/api/z/1.0/item/update -d body="hello world" + + +Returns: + + + { + + "success": true, + "item_id": "2245", + "item": { + "id": "2245", + "mid": "14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com", + "aid": "1", + "uid": "2", + "parent": "0", + "parent_mid": "14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com", + "thr_parent": "14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com", + "created": "2016-12-03 20:00:12", + "edited": "2016-12-03 20:00:12", + "expires": "0001-01-01 00:00:00", + "commented": "2016-12-03 20:00:12", + "received": "2016-12-03 20:00:12", + "changed": "2016-12-03 20:00:12", + "comments_closed": "0001-01-01 00:00:00", + "owner_xchan": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg", + "author_xchan": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg", + "source_xchan": "", + "mimetype": "text/bbcode", + "title": "", + "body": "hello world", + "html": "", + "app": "", + "lang": "", + "revision": "0", + "verb": "http://activitystrea.ms/schema/1.0/post", + "obj_type": "http://activitystrea.ms/schema/1.0/note", + "obj": "", + "tgt_type": "", + "target": "", + "layout_mid": "", + "postopts": "", + "route": "", + "llink": "https://xyz.macgirvin.com/display/14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com", + "plink": "https://xyz.macgirvin.com/channel/mychannel/?f=&mid=14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com", + "resource_id": "", + "resource_type": "", + "attach": "", + "sig": "sa4TOQNfHtV13HDZ1tuQGWNBpZp-nWhT2GMrZEmelXxa_IvEepD2SEsCTWOBqM8OKPJLfNy8_i-ORXjrOIIgAa_aT8cw5vka7Q0C8L9eEb_LegwQ_BtH0CXO5uT30e_8uowkwzh6kmlVg1ntD8QqrGgD5jTET_fMQOIw4gQUBh40GDG9RB4QnPp_MKsgemGrADnRk2vHO7-bR32yQ0JI-8G-eyeqGaaJmIwkHoi0vXsfjZtU7ijSLuKEBWboNjKEDU89-vQ1c5Kh1r0pmjiDk-a5JzZTYShpuhVA-vQgEcADA7wkf4lJZCYNwu3FRwHTvhSMdF0nmyv3aPFglQDky38-SAXZyQSvd7qlABHGCVVDmYrYaiq7Dh4rRENbAUf-UJFHPCVB7NRg34R8HIqmOKq1Su99bIWaoI2zuAQEVma9wLqMoFsluFhxX58KeVtlCZlro7tZ6z619-dthS_fwt0cL_2dZ3QwjG1P36Q4Y4KrCTpntn9ot5osh-HjVQ01h1I9yNCj6XPgYJ8Im3KT_G4hmMDFM7H9RUrYLl2o9XYyiS2nRrf4aJHa0UweBlAY4zcQG34bw2AMGCY53mwsSArf4Hs3rKu5GrGphuwYX0lHa7XEKMglwBWPWHI49q7-oNWr7aWwn1FnfaMfl4cQppCMtKESMNRKm_nb9Dsh5e0", + "diaspora_meta": "", + "location": "", + "coord": "", + "public_policy": "", + "comment_policy": "contacts", + "allow_cid": "", + "allow_gid": "", + "deny_cid": "", + "deny_gid": "", + "item_restrict": "0", + "item_flags": "0", + "item_private": "0", + "item_origin": "1", + "item_unseen": "0", + "item_starred": "0", + "item_uplink": "0", + "item_consensus": "0", + "item_wall": "1", + "item_thread_top": "1", + "item_notshown": "0", + "item_nsfw": "0", + "item_relay": "0", + "item_mentionsme": "0", + "item_nocomment": "0", + "item_obscured": "0", + "item_verified": "1", + "item_retained": "0", + "item_rss": "0", + "item_deleted": "0", + "item_type": "0", + "item_hidden": "0", + "item_unpublished": "0", + "item_delayed": "0", + "item_pending_remove": "0", + "item_blocked": "0" + } + + }
\ No newline at end of file diff --git a/doc/api_posting.bb b/doc/api/api_posting.bb index c708ad143..c708ad143 100644 --- a/doc/api_posting.bb +++ b/doc/api/api_posting.bb diff --git a/doc/api/api_xchan.md b/doc/api/api_xchan.md new file mode 100644 index 000000000..d2b15e04c --- /dev/null +++ b/doc/api/api_xchan.md @@ -0,0 +1,44 @@ +API xchan +========= + +An xchan is a global location independent channel and is the primary record for a network +identity. It may refer to channels on other websites, networks, or services. + +GET /api/z/1.0/xchan + +Required: one of [ address, hash, guid ] as GET parameters + +Returns a portable xchan structure + +Example: https://xyz.macgirvin.com/api/z/1.0/xchan?f=&address=mike@macgirvin.com + +Returns: + + { + "hash": "jr54M_y2l5NgHX5wBvP0KqWcAHuW23p1ld-6Vn63_pGTZklrI36LF8vUHMSKJMD8xzzkz7s2xxCx4-BOLNPaVA", + "guid": "sebQ-IC4rmFn9d9iu17m4BXO-kHuNutWo2ySjeV2SIW1LzksUkss12xVo3m3fykYxN5HMcc7gUZVYv26asx-Pg", + "guid_sig": "Llenlbl4zHo6-g4sa63MlQmTP5dRCrsPmXHHFmoCHG63BLq5CUZJRLS1vRrrr_MNxr7zob_Ykt_m5xPKe5H0_i4pDj-UdP8dPZqH2fqhhx00kuYL4YUMJ8gRr5eO17vsZQ3XxTcyKewtgeW0j7ytwMp6-hFVUx_Cq08MrXas429ZrjzaEwgTfxGnbgeQYQ0R5EXpHpEmoERnZx77VaEahftmdjAUx9R4YKAp13pGYadJOX5xnLfqofHQD8DyRHWeMJ4G1OfWPSOlXfRayrV_jhnFlZjMU7vOdQwHoCMoR5TFsRsHuzd-qepbvo3pzvQZRWnTNu6oPucgbf94p13QbalYRpBXKOxdTXJrGdESNhGvhtaZnpT9c1QVqC46jdfP0LOX2xrVdbvvG2JMWFv7XJUVjLSk_yjzY6or2VD4V6ztYcjpCi9d_WoNHruoxro_br1YO3KatySxJs-LQ7SOkQI60FpysfbphNyvYMkotwUFI59G08IGKTMu3-GPnV1wp7NOQD1yzJbGGEGSEEysmEP0SO9vnN45kp3MiqbffBGc1r4_YM4e7DPmqOGM94qksOcLOJk1HNESw2dQYWxWQTBXPfOJT6jW9_crGLMEOsZ3Jcss0XS9KzBUA2p_9osvvhUKuKXbNztqH0oZIWlg37FEVsDs_hUwUJpv2Ar09k4", + "pubkey": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA7QCwvuEIwCHjhjbpz3Oc\ntyei/Pz9nDksNbsc44Cm8jxYGMXsTPFXDZYCcCB5rcAhPPdZSlzaPkv4vPVcMIrw\n5cdX0tvbwa3rNTng6uFE7qkt15D3YCTkwF0Y9FVZiZ2Ko+G23QeBt9wqb9dlDN1d\nuPmu9BLYXIT/JXoBwf0vjIPFM9WBi5W/EHGaiuqw7lt0qI7zDGw77yO5yehKE4cu\n7dt3SakrXphL70LGiZh2XGoLg9Gmpz98t+gvPAUEotAJxIUqnoiTA8jlxoiQjeRK\nHlJkwMOGmRNPS33awPos0kcSxAywuBbh2X3aSqUMjcbE4cGJ++/13zoa6RUZRObC\nZnaLYJxqYBh13/N8SfH7d005hecDxWnoYXeYuuMeT3a2hV0J84ztkJX5OoxIwk7S\nWmvBq4+m66usn6LNL+p5IAcs93KbvOxxrjtQrzohBXc6+elfLVSQ1Rr9g5xbgpub\npSc+hvzbB6p0tleDRzwAy9X16NI4DYiTj4nkmVjigNo9v2VPnAle5zSam86eiYLO\nt2u9YRqysMLPKevNdj3CIvst+BaGGQONlQalRdIcq8Lin+BhuX+1TBgqyav4XD9K\nd+JHMb1aBk/rFLI9/f2S3BJ1XqpbjXz7AbYlaCwKiJ836+HS8PmLKxwVOnpLMbfH\nPYM8k83Lip4bEKIyAuf02qkCAwEAAQ==\n-----END PUBLIC KEY-----\n", + "photo_mimetype": "image/jpeg", + "photo_l": "https://xyz.macgirvin.com/photo/350b74555c04429148f2e12775f6c403-4", + "photo_m": "https://xyz.macgirvin.com/photo/350b74555c04429148f2e12775f6c403-5", + "photo_s": "https://xyz.macgirvin.com/photo/350b74555c04429148f2e12775f6c403-6", + "address": "mike@macgirvin.com", + "url": "https://macgirvin.com/channel/mike", + "connurl": "https://macgirvin.com/poco/mike", + "follow": "https://macgirvin.com/follow?f=&url=%s", + "connpage": "https://macgirvin.com/connect/mike", + "name": "Mike Macgirvin", + "network": "zot", + "instance_url": "", + "flags": "0", + "photo_date": "2012-12-06 05:06:11", + "name_date": "2012-12-06 04:59:13", + "hidden": "1", + "orphan": "0", + "censored": "0", + "selfcensored": "0", + "system": "0", + "pubforum": "0", + "deleted": "0" + }
\ No newline at end of file diff --git a/doc/ca/general.bb b/doc/ca/general.bb index dace92775..682b1ff52 100644 --- a/doc/ca/general.bb +++ b/doc/ca/general.bb @@ -2,8 +2,6 @@ [zrl=[baseurl]/help/Privacy]Politica de Privacitat[/zrl] -[zrl=[baseurl]/help/project/history]Història de $Projectname[/zrl] - [h3]Recursos Externs[/h3] [zrl=[baseurl]/help/external-resource-links]Enllaços a Recursos Externs[/zrl] diff --git a/doc/context/en/profiles/help.html b/doc/context/en/profiles/help.html new file mode 100644 index 000000000..41f00fe64 --- /dev/null +++ b/doc/context/en/profiles/help.html @@ -0,0 +1,35 @@ +<dl class="dl-horizontal"> + <dt>General</dt> + <dd> + Once you have registered an <i>account</i> at the matrix you have also created a <i>profile</i> and a <i>channel</i>. + </dd> + <dt>Account</dt> + <dd> + You have <i>one</i> account. This consists of your email account and your password. With your account you access your + profile and your channel.<i>Think of your account as the way you authenticate at one Hubzilla site. It lets you + do things, such as creating profiles and channels with which you can connect to other people.</i> + </dd> + <dt>Profile</dt> + <dd> + You have surely registered with some other internet services, such as forums or online communities. For all of them + you provided some information about yourself, such as date of birth, country, age and the likes. Unlike other + services Hubzilla offers you the advantage of creating + <i>many more profiles</i>. That way you are able to distinguish between profiles targeted specially at everyone + (your public profile), your work mates, your family and your partner.<i>Think of your profile as the basic + information about yourself you tell other people.</i> + </dd> + <dt>Channel</dt> + <dd> + During the registration you created your first <i>channel</i>. Yes, besides several profiles you are able to have + several channels. This might be a bit confusing in the beginning, but let's clear things up. You already have + created one channel. You can use this one for the public, to communicate with people about every day life. But + perhaps you are an avid book reader and many people are bored by that. So you open a <i>second channel</i> just + for the book lovers, where you all can talk about books as much as you like. Obviously this is a new stream of + posts, with a new profile (... or new profile<i>s</i> ...) and completely different contacts. Some connections + might exist in both channels, but there will be some that are exclusive to only one of both. You yourself just + switch between both of them just like you would in real life switch when talking to people you meet on the street + or people you meet specially to talk about books. You can even connect to yourself, or better: to your other + channel. :)<i>Think of a channel as different spaces dedicated to different topics where you meet with different + people.</i> + </dd> +</dl>
\ No newline at end of file diff --git a/doc/context/en/settings/account/help.html b/doc/context/en/settings/account/help.html new file mode 100644 index 000000000..41f00fe64 --- /dev/null +++ b/doc/context/en/settings/account/help.html @@ -0,0 +1,35 @@ +<dl class="dl-horizontal"> + <dt>General</dt> + <dd> + Once you have registered an <i>account</i> at the matrix you have also created a <i>profile</i> and a <i>channel</i>. + </dd> + <dt>Account</dt> + <dd> + You have <i>one</i> account. This consists of your email account and your password. With your account you access your + profile and your channel.<i>Think of your account as the way you authenticate at one Hubzilla site. It lets you + do things, such as creating profiles and channels with which you can connect to other people.</i> + </dd> + <dt>Profile</dt> + <dd> + You have surely registered with some other internet services, such as forums or online communities. For all of them + you provided some information about yourself, such as date of birth, country, age and the likes. Unlike other + services Hubzilla offers you the advantage of creating + <i>many more profiles</i>. That way you are able to distinguish between profiles targeted specially at everyone + (your public profile), your work mates, your family and your partner.<i>Think of your profile as the basic + information about yourself you tell other people.</i> + </dd> + <dt>Channel</dt> + <dd> + During the registration you created your first <i>channel</i>. Yes, besides several profiles you are able to have + several channels. This might be a bit confusing in the beginning, but let's clear things up. You already have + created one channel. You can use this one for the public, to communicate with people about every day life. But + perhaps you are an avid book reader and many people are bored by that. So you open a <i>second channel</i> just + for the book lovers, where you all can talk about books as much as you like. Obviously this is a new stream of + posts, with a new profile (... or new profile<i>s</i> ...) and completely different contacts. Some connections + might exist in both channels, but there will be some that are exclusive to only one of both. You yourself just + switch between both of them just like you would in real life switch when talking to people you meet on the street + or people you meet specially to talk about books. You can even connect to yourself, or better: to your other + channel. :)<i>Think of a channel as different spaces dedicated to different topics where you meet with different + people.</i> + </dd> +</dl>
\ No newline at end of file diff --git a/doc/context/en/settings/channel/help.html b/doc/context/en/settings/channel/help.html new file mode 100644 index 000000000..41f00fe64 --- /dev/null +++ b/doc/context/en/settings/channel/help.html @@ -0,0 +1,35 @@ +<dl class="dl-horizontal"> + <dt>General</dt> + <dd> + Once you have registered an <i>account</i> at the matrix you have also created a <i>profile</i> and a <i>channel</i>. + </dd> + <dt>Account</dt> + <dd> + You have <i>one</i> account. This consists of your email account and your password. With your account you access your + profile and your channel.<i>Think of your account as the way you authenticate at one Hubzilla site. It lets you + do things, such as creating profiles and channels with which you can connect to other people.</i> + </dd> + <dt>Profile</dt> + <dd> + You have surely registered with some other internet services, such as forums or online communities. For all of them + you provided some information about yourself, such as date of birth, country, age and the likes. Unlike other + services Hubzilla offers you the advantage of creating + <i>many more profiles</i>. That way you are able to distinguish between profiles targeted specially at everyone + (your public profile), your work mates, your family and your partner.<i>Think of your profile as the basic + information about yourself you tell other people.</i> + </dd> + <dt>Channel</dt> + <dd> + During the registration you created your first <i>channel</i>. Yes, besides several profiles you are able to have + several channels. This might be a bit confusing in the beginning, but let's clear things up. You already have + created one channel. You can use this one for the public, to communicate with people about every day life. But + perhaps you are an avid book reader and many people are bored by that. So you open a <i>second channel</i> just + for the book lovers, where you all can talk about books as much as you like. Obviously this is a new stream of + posts, with a new profile (... or new profile<i>s</i> ...) and completely different contacts. Some connections + might exist in both channels, but there will be some that are exclusive to only one of both. You yourself just + switch between both of them just like you would in real life switch when talking to people you meet on the street + or people you meet specially to talk about books. You can even connect to yourself, or better: to your other + channel. :)<i>Think of a channel as different spaces dedicated to different topics where you meet with different + people.</i> + </dd> +</dl>
\ No newline at end of file diff --git a/doc/context/en/settings/tokens/help.html b/doc/context/en/settings/tokens/help.html new file mode 100644 index 000000000..d37a0fd2b --- /dev/null +++ b/doc/context/en/settings/tokens/help.html @@ -0,0 +1,23 @@ +<dl class="dl-horizontal"> + <dt>Guest Access Tokens</dt> + <dd> + In order to facilitate sharing of private resources with non-members or members of federation nodes with limited identification discovery, Hubzilla should provide members with a mechanism to create and manage temporary ("throwaway") logins, aka "Zot Access Tokens". These tokens/credentials may be used to authenticate to a hubzilla site for the sole purpose of accessing privileged or access controlled resources (files, photos, posts, webpages, chatrooms, etc.). + </dd> + <dt>Create a token</dt> + <dd> + The form to create/edit accepts three parameters, a human readable name, a password or access token, and an + optional expiration. Once expired, the access token is no longer valid, may no longer be used, and will be + automatically purged from the list of temporary accounts. The password field in the create/edit forms + displays the text of the access token and not an obscured password. + </dd> + <dt>Share a token</dt> + <dd> + We do not specify mechanisms for sharing these tokens with others. Any communication method may be used. Any tokens you have created are added to the Access Control List selector and may be used anywhere that Access Control Lists are provided. + + <b>Example</b>: A visitor arrives at your site. She has an access token you have provided, and attempts to visit one of your photo albums (which is restricted to be viewed only by yourself and one temporary identity). Permission is denied. + + The visitor now selects "Login" from the menu navigation bar. This presents a login page. She enters the name and password you have provided her, and she can now view the restricted photo album. + + Alternatively, you may share a link to a protected file by adding a parameter "&zat=abc123" to the URL, where the string "abc123" is the access token or password for the temporary login. No further negotiation is required, and the file is presented. + </dd> +</dl>
\ No newline at end of file diff --git a/doc/context/en/webpages/help.html b/doc/context/en/webpages/help.html index af57ee88a..a4817e4bf 100644 --- a/doc/context/en/webpages/help.html +++ b/doc/context/en/webpages/help.html @@ -3,6 +3,6 @@ <dd>You can create modular, identity-aware websites composed of shareable elements. </dd> <dt>Pages</dt> <dd>This page lists your "pages", which are assigned URLs where people can visit your site. The structure of pages are typically described by an associated <b>layout</b>, and their content is constructed from a collection of <b>blocks</b>.</dd> - <dt><a href='#' onclick='contextualHelpFocus("#website-import-tools", 1); return false;' title="Click to highlight element...">Website import tool</a></dt> - <dd>The website import tool allows you import multiple webpage elements (pages, layouts, blocks) either from an uploaded zip file or from an existing cloud files folder. <a target="_blank" href="help/webpages">Read more...</a></dd> + <dt><a href='#' onclick='contextualHelpFocus("#website-portation-tools", 1); return false;' title="Click to highlight element...">Website portation tools</a></dt> + <dd>The website portation tools allows you import/export multiple webpage elements (pages, layouts, blocks). You can <b>import</b> either from an uploaded zip file or from an existing cloud files folder. You can <b>export</b> to either a zip file containing a select group of webpage elements in a form compatible with the import tool, or you can export directly to a cloud files folder. <a target="_blank" href="help/webpages">Read more...</a></dd> </dl>
\ No newline at end of file diff --git a/doc/context/en/wiki/help.html b/doc/context/en/wiki/help.html index 314a9d60b..5ac9b22ae 100644 --- a/doc/context/en/wiki/help.html +++ b/doc/context/en/wiki/help.html @@ -1,10 +1,12 @@ <dl class="dl-horizontal"> <dt>General</dt> <dd>Each wiki is a collection of pages, composed as Markdown-formatted text files.</dd> - <dt><a href='#' onclick='contextualHelpFocus("#wiki_list", 1); return false;' title="Click to highlight element...">Wiki List</a></dt> + <dt><a href='#' onclick='contextualHelpFocus("#wikis-index", 1); return false;' title="Click to highlight element...">Wiki List</a></dt> <dd>Wikis owned by the channel <i>that you have permission to view</i> are listed in the side panel.</dd> <dt><a href='#' onclick='contextualHelpFocus("#wiki-get-history", 0); return false;' title="Click to highlight element...">Page History</a></dt> <dd>Every revision of a page is saved to allow quick reversion. Click the <b>History</b> tab to view a history of page revisions, including the date and author of each. The revert button will load the selected revision but will not automatically save the page.</dd> <dt><a href='#' onclick='contextualHelpFocus("#wiki_page_list", 1); return false;' title="Click to highlight element...">Pages</a></dt> <dd>The list of pages in the wiki are listed in the <b>Wiki Pages</b> panel. Prior to saving page edits using the <b>Page</b> control dropdown menu, you may <a href='#' onclick='contextualHelpFocus("#id_commitMsg", 0); return false;' title="Click to highlight element...">enter a custom message</a> to be displayed in the <a href='#' onclick='contextualHelpFocus("#wiki-get-history", 0); return false;' title="Click to highlight element..."><b>Page History</b></a> viewer along with the revision.</dd> + <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Click to highlight element...">Channel Content Tabs</a></dt> + <dd>The channel content tabs are links to other content published by the channel. The <b>About</b> tab links to the channel profile. The <b>Photos</b> tab links to the channel photo galleries. The <b>Files</b> tab links to the general shared files published by the channel.</dd> </dl>
\ No newline at end of file diff --git a/doc/de/general.bb b/doc/de/general.bb index 6660370d7..b9b75f161 100644 --- a/doc/de/general.bb +++ b/doc/de/general.bb @@ -2,8 +2,6 @@ [zrl=[baseurl]/help/Privacy]Informationen zum Datenschutz[/zrl] -[zrl=[baseurl]/help/project/history]Zur Geschichte von $Projectname[/zrl] - [h3]Externe Ressourcen[/h3] [zrl=[baseurl]/help/external-resource-links]Links zu externen Ressourcen[/zrl] diff --git a/doc/developer/developer_guide.html b/doc/developer/developer_guide.html new file mode 100644 index 000000000..77d622221 --- /dev/null +++ b/doc/developer/developer_guide.html @@ -0,0 +1,470 @@ +<h2 id="Who_is_a_Hubzilla_developer_Should_I_read_this_">Who is a Hubzilla developer? Should I read this?</h2> + +<p>Anyone who contributes to making Hubzilla better is a developer. There are many different and important ways you can contribute to this amazing technology, <em>even if you do not know how to write code</em>. The software itself is only a part of the Hubzilla project. You can contribute by</p> + +<ul><li>translating text to your language so that people around the world have the opportunity to use Hubzilla</li> +<li>promoting Hubzilla and spreading awareness of the platform through blog posts, articles, and word-of-mouth</li> +<li>creating artwork and graphics for project assets such as icons and marketing material</li> +<li>supporting project infrastructure like the project website and demo servers</li> +</ul><p><em>Software</em> developers are of course welcomed; there are so many great ideas to implement and not enough people to make them all a reality! The Hubzilla code base is an advanced and mature system, but the platform is still very flexible and responsive to new ideas.</p> + +<p>This document will help you get started learning and contributing to Hubzilla.</p> + +<h2 id="Versioning_system">Versioning system</h2> + +<p>The versioning system is similar to the popular semantic versioning but less stringent. Given x.y.z, x changes yearly. y changes for "stable" monthly builds, and z increments when there are interface changes. We maintain our date and build numbers for medium grain version control (commits within a certain date range) and of course git revs for fine grained control.</p> + +<h2 id="Git_repository_branches">Git repository branches</h2> + +<p>There are two official branches of the Hubzilla git repo.</p> + +<ul><li>The stable version is maintained on the <strong>master</strong> branch. The latest commit in this branch is considered to be suitable for production hubs. </li> +<li>Experimental development occurs on the <strong>dev</strong> branch, which is merged into <strong>master</strong> when it is deemed tested and stable enough.</li> +</ul><h2 id="Developer_tools_and_workflows">Developer tools and workflows</h2> + +<h3 id="Hub_Snapshots">Hub Snapshots</h3> + +<p>The <a href="wiki/hubzilla/Hubzilla+Documentation/Hub%2BSnapshots">Hub Snapshots</a> page provides instructions and scripts for taking complete +snapshots of a hub to support switching between consistent and completely known +states. This is useful to prevent situations where the content or database schema +might be incompatible with the code.</p> + +<h2 id="Translations">Translations</h2> + +<p>Our translations are managed through Transifex. If you wish to help out translating Hubzilla to another language, sign up on transifex.com, visit <a href="https://www.transifex.com/projects/p/red-matrix/">https://www.transifex.com/projects/p/red-matrix/</a> and request to join one of the existing language teams or create a new one. Notify one of the core developers when you have a translation update which requires merging, or ask about merging it yourself if you're comfortable with git and PHP. We have a string file called 'messages.po' which is gettext compliant and a handful of email templates, and from there we automatically generate the application's language files.</p> + +<h3 id="Translation_Process">Translation Process</h3> + +<p>The strings used in the UI of Hubzilla is translated at [Transifex][1] and then +included in the git repository at github. If you want to help with translation +for any language, be it correcting terms or translating Hubzilla to a +currently not supported language, please register an account at transifex.com +and contact the Redmatrix translation team there.</p> + +<p>Translating Hubzilla is simple. Just use the online tool at transifex. If you +don't want to deal with git & co. that is fine, we check the status of the +translations regularly and import them into the source tree at github so that +others can use them.</p> + +<p>We do not include every translation from transifex in the source tree to avoid +a scattered and disturbed overall experience. As an uneducated guess we have a +lower limit of 50% translated strings before we include the language. This +limit is judging only by the amount of translated strings under the assumption +that the most prominent strings for the UI will be translated first by a +translation team. If you feel your translation useable before this limit, +please contact us and we will probably include your teams work in the source +tree.</p> + +<p>If you want to get your work into the source tree yourself, feel free to do so +and contact us with and question that arises. The process is simple and +Hubzilla ships with all the tools necessary.</p> + +<p>The location of the translated files in the source tree is + /view/LNG-CODE/ +where LNG-CODE is the language code used, e.g. de for German or fr for French. +For the email templates (the *.tpl files) just place them into the directory +and you are done. The translated strings come as a "hmessages.po" file from +transifex which needs to be translated into the PHP file Hubzilla uses. To do +so, place the file in the directory mentioned above and use the "po2php" +utility from the util directory of your Hubzilla installation.</p> + +<p>Assuming you want to convert the German localization which is placed in +view/de/hmessages.po you would do the following.</p> + +<ol><li><p>Navigate at the command prompt to the base directory of your +Hubzilla installation</p></li> +<li><p>Execute the po2php script, which will place the translation +in the hstrings.php file that is used by Hubzilla.</p> + +<p>$> php util/po2php.php view/de/hmessages.po</p> + +<p>The output of the script will be placed at view/de/hstrings.php where +froemdoca os expecting it, so you can test your translation mmediately.</p></li> +<li><p>Visit your Hubzilla page to check if it still works in the language you +just translated. If not try to find the error, most likely PHP will give +you a hint in the log/warnings.about the error.</p> + +<p>For debugging you can also try to "run" the file with PHP. This should +not give any output if the file is ok but might give a hint for +searching the bug in the file.</p> + +<p>$> php view/de/hstrings.php</p></li> +<li><p>commit the two files with a meaningful commit message to your git +repository, push it to your fork of the Hubzilla repository at github and +issue a pull request for that commit.</p></li> +</ol><h3 id="Utilities">Utilities</h3> + +<p>Additional to the po2php script there are some more utilities for translation +in the "util" directory of the Hubzilla source tree. If you only want to +translate Hubzilla into another language you wont need any of these tools most +likely but it gives you an idea how the translation process of Hubzilla +works.</p> + +<p>For further information see the utils/README file.</p> + +<h3 id="Known_Problems">Known Problems</h3> + +<ul><li>Hubzilla uses the language setting of the visitors browser to determain the +language for the UI. Most of the time this works, but there are some known +quirks.</li> +<li>the early translations are based on the friendica translations, if you +some rough translations please let us know or fix them at Transifex.</li> +</ul><h2 id="To_be_organized_information">To-be-organized information</h2> + +<p><strong>Here is how you can join us.</strong></p> + +<p>First, get yourself a working git package on the system where you will be +doing development.</p> + +<p>Create your own github account.</p> + +<p>You may fork/clone the Red repository from <a href="https://github.com/redmatrix/hubzilla.git">https://github.com/redmatrix/hubzilla.git</a>.</p> + +<p>Follow the instructions provided here: <a href="http://help.github.com/fork-a-repo/">http://help.github.com/fork-a-repo/</a> +to create and use your own tracking fork on github</p> + +<p>Then go to your github page and create a "Pull request" when you are ready +to notify us to merge your work.</p> + +<p><strong>Important</strong></p> + +<p>Please pull in any changes from the project repository and merge them with your work <strong>before</strong> issuing a pull request. We reserve the right to reject any patch which results in a large number of merge conflicts. This is especially true in the case of language translations - where we may not be able to understand the subtle differences between conflicting versions.</p> + +<p>Also - <strong>test your changes</strong>. Don't assume that a simple fix won't break something else. If possible get an experienced Red developer to review the code.</p> + +<p><strong>Licensing</strong></p> + +<p>All code contributed to the project falls under the MIT license, unless otherwise specified. We will accept third-party code which falls under MIT, BSD and LGPL, but copyleft licensing (GPL, and AGPL) is only permitted in addons. It must be possible to completely remove the GPL (copyleft) code from the main project without breaking anything.</p> + +<p><strong>Coding Style</strong></p> + +<p>In the interests of consistency we adopt the following code styling. We may accept patches using other styles, but where possible please try to provide a consistent code style. We aren't going to argue or debate the merits of this style, and it is irrelevant what project 'xyz' uses. This is not project 'xyz'. This is a baseline to try and keep the code readable now and in the future.</p> + +<ul><li><p>All comments should be in English.</p></li> +<li><p>We use doxygen to generate documentation. This hasn't been consistently applied, but learning it and using it are highly encouraged.</p></li> +<li><p>Indentation is accomplished primarily with tabs using a tab-width of 4.</p></li> +<li><p>String concatenation and operators should be separated by whitespace. e.g. "$foo = $bar . 'abc';" instead of "$foo=$bar.'abc';"</p></li> +<li><p>Generally speaking, we use single quotes for string variables and double quotes for SQL statements. "Here documents" should be avoided. Sometimes using double quoted strings with variable replacement is the most efficient means of creating the string. In most cases, you should be using single quotes.</p></li> +<li><p>Use whitespace liberally to enhance readability. When creating arrays with many elements, we will often set one key/value pair per line, indented from the parent line appropriately. Lining up the assignment operators takes a bit more work, but also increases readability.</p></li> +<li><p>Generally speaking, opening braces go on the same line as the thing which opens the brace. They are the last character on the line. Closing braces are on a line by themselves.</p></li> +</ul><p><strong>File system layout:</strong></p> + +<p>[addon] optional addons/plugins</p> + +<p>[boot.php] Every process uses this to bootstrap the application structure</p> + +<p>[doc] Help Files</p> + +<p>[images] core required images</p> + +<p>[include] The "model" in MVC - (back-end functions), also contains PHP "executables" for background processing</p> + +<p>[index.php] The front-end controller for web access</p> + +<p>[install] Installation and upgrade files and DB schema</p> + +<p>[library] Third party modules (must be license compatible)</p> + +<p>[mod] Controller modules based on URL pathname (e.g. #^[url=http://sitename/foo]http://sitename/foo[/url] loads mod/foo.php)</p> + +<p>[mod/site/] site-specific mod overrides, excluded from git</p> + +<p>[util] translation tools, main English string database and other miscellaneous utilities</p> + +<p>[version.inc] contains current version (auto-updated via cron for the master repository and distributed via git)</p> + +<p>[view] theming and language files</p> + +<p>[view/(css,js,img,php,tpl)] default theme files</p> + +<p>[view/(en,it,es ...)] language strings and resources</p> + +<p>[view/theme/] individual named themes containing (css,js,img,php,tpl) over-rides</p> + +<p><strong>The Database:</strong></p> + +<table><thead><tr><th>Table</th> + <th>Description</th> +</tr></thead><tbody><tr><td>abconfig</td> + <td>contact table, replaces Friendica 'contact'</td> +</tr><tr><td>abook</td> + <td></td> +</tr><tr><td>account</td> + <td>service provider account</td> +</tr><tr><td>addon</td> + <td></td> +</tr><tr><td>addressbookchanges</td> + <td></td> +</tr><tr><td>addressbooks</td> + <td></td> +</tr><tr><td>app</td> + <td></td> +</tr><tr><td>atoken</td> + <td></td> +</tr><tr><td>attach</td> + <td></td> +</tr><tr><td>auth_codes</td> + <td></td> +</tr><tr><td>cache</td> + <td></td> +</tr><tr><td>cal</td> + <td></td> +</tr><tr><td>calendarchanges</td> + <td></td> +</tr><tr><td>calendarinstances</td> + <td></td> +</tr><tr><td>calendarobjects</td> + <td></td> +</tr><tr><td>calendars</td> + <td></td> +</tr><tr><td>calendarsubscriptions</td> + <td></td> +</tr><tr><td>cards</td> + <td></td> +</tr><tr><td>channel</td> + <td></td> +</tr><tr><td>chat</td> + <td></td> +</tr><tr><td>chatpresence</td> + <td></td> +</tr><tr><td>chatroom</td> + <td></td> +</tr><tr><td>clients</td> + <td></td> +</tr><tr><td>config</td> + <td></td> +</tr><tr><td>conv</td> + <td></td> +</tr><tr><td>dreport</td> + <td></td> +</tr><tr><td>event</td> + <td></td> +</tr><tr><td>group_member</td> + <td></td> +</tr><tr><td>groupmembers</td> + <td></td> +</tr><tr><td>groups</td> + <td></td> +</tr><tr><td>hook</td> + <td></td> +</tr><tr><td>hubloc</td> + <td></td> +</tr><tr><td>iconfig</td> + <td></td> +</tr><tr><td>issue</td> + <td></td> +</tr><tr><td>item</td> + <td></td> +</tr><tr><td>item_id</td> + <td></td> +</tr><tr><td>likes</td> + <td></td> +</tr><tr><td>locks</td> + <td></td> +</tr><tr><td>mail</td> + <td></td> +</tr><tr><td>menu</td> + <td></td> +</tr><tr><td>menu_item</td> + <td></td> +</tr><tr><td>notify</td> + <td></td> +</tr><tr><td>obj</td> + <td></td> +</tr><tr><td>outq</td> + <td></td> +</tr><tr><td>pconfig</td> + <td>personal (per channel) configuration storage</td> +</tr><tr><td>photo</td> + <td></td> +</tr><tr><td>poll</td> + <td></td> +</tr><tr><td>poll_elm</td> + <td></td> +</tr><tr><td>principals</td> + <td></td> +</tr><tr><td>profdef</td> + <td></td> +</tr><tr><td>profext</td> + <td></td> +</tr><tr><td>profile</td> + <td></td> +</tr><tr><td>profile_check</td> + <td></td> +</tr><tr><td>propertystorage</td> + <td></td> +</tr><tr><td>register</td> + <td></td> +</tr><tr><td>schedulingobjects</td> + <td></td> +</tr><tr><td>session</td> + <td></td> +</tr><tr><td>shares</td> + <td></td> +</tr><tr><td>sign</td> + <td></td> +</tr><tr><td>site</td> + <td></td> +</tr><tr><td>source</td> + <td></td> +</tr><tr><td>sys_perms</td> + <td></td> +</tr><tr><td>term</td> + <td></td> +</tr><tr><td>tokens</td> + <td></td> +</tr><tr><td>updates</td> + <td></td> +</tr><tr><td>users</td> + <td></td> +</tr><tr><td>verify</td> + <td></td> +</tr><tr><td>vote</td> + <td></td> +</tr><tr><td>xchan</td> + <td></td> +</tr><tr><td>xchat</td> + <td></td> +</tr><tr><td>xconfig</td> + <td></td> +</tr><tr><td>xign</td> + <td></td> +</tr><tr><td>xlink</td> + <td></td> +</tr><tr><td>xperm</td> + <td></td> +</tr><tr><td>xprof</td> + <td></td> +</tr><tr><td>xtag</td> + <td></td> +</tr></tbody></table><pre><code>* abook - contact table, replaces Friendica 'contact' +* account - service provider account +* addon - registered plugins +* app - peronal app data +* attach - file attachments +* auth_codes - OAuth usage +* cache - OEmbed cache +* channel - replaces Friendica 'user' +* chat - chat room content +* chatpresence - channel presence information for chat +* chatroom - data for the actual chat room +* clients - OAuth usage +* config - main configuration storage +* conv - Diaspora private messages +* event - Events +* fcontact - friend suggestion stuff +* ffinder - friend suggestion stuff +* fserver - obsolete +* fsuggest - friend suggestion stuff +* groups - privacy groups +* group_member - privacy groups +* hook - plugin hook registry +* hubloc - Red location storage, ties a location to an xchan +* item - posts +* item_id - other identifiers on other services for posts +* likes - likes of 'things' +* mail - private messages +* menu - channel menu data +* menu_item - items uses by channel menus +* notify - notifications +* notify-threads - need to factor this out and use item thread info on notifications +* obj - object data for things (x has y) +* outq - output queue +* pconfig - personal (per channel) configuration storage +* photo - photo storage +* poll - data for polls +* poll_elm - data for poll elements +* profdef - custom profile field definitions +* profext - custom profile field data +* profile - channel profiles +* profile_check - DFRN remote auth use, may be obsolete +* register - registrations requiring admin approval +* session - web session storage +* shares - shared item information +* sign - Diaspora signatures. To be phased out. +* site - site table to find directory peers +* source - channel sources data +* spam - unfinished +* sys_perms - extensible permissions for the sys channel +* term - item taxonomy (categories, tags, etc.) table +* tokens - OAuth usage +* updates - directory sync updates +* verify - general purpose verification structure +* vote - vote data for polls +* xchan - replaces 'gcontact', list of known channels in the universe +* xchat - bookmarked chat rooms +* xconfig - as pconfig but for channels with no local account +* xlink - "friends of friends" linkages derived from poco +* xprof - if this hub is a directory server, contains basic public profile info of everybody in the network +* xtag - if this hub is a directory server, contains tags or interests of everybody in the network +</code></pre> + +<p><strong>How to theme Hubzilla</strong></p> + +<p>This is a short documentation on what I found while trying to modify Hubzilla's appearance.</p> + +<p>First, you'll need to create a new theme. This is in /view/theme, and I chose to copy 'redbasic' since it's the only available for now. Let's assume I named it .</p> + +<p>Oh, and don't forget to rename the _init function in /php/theme.php to be _init() instead of redbasic_init().</p> + +<p>At that point, if you need to add javascript or css files, add them to /js or /css, and then "register" them in _init() through head_add_js('file.js') and head_add_css('file.css').</p> + +<p>Now you'll probably want to alter a template. These can be found in in /view/tpl OR view//tpl. All you should have to do is copy whatever you want to tweak from the first place to your theme's own tpl directory.</p> + +<p>We're pretty relaxed when it comes to developers. We don't have a lot of rules. Some of us are over-worked and if you want to help we're happy to let you help. That said, attention to a few guidelines will make the process smoother and make it easier to work together. We have developers from across the globe with different abilities and different cultural backgrounds and different levels of patience. Our primary rule is to respect others. Sometimes this is hard and sometimes we have very different opinions of how things should work, but if everybody makes an effort, we'll get along just fine.</p> + +<p><strong>Here is how you can join us.</strong></p> + +<p>First, get yourself a working git package on the system where you will be +doing development.</p> + +<p>Create your own github account.</p> + +<p>You may fork/clone the Red repository from [url=https://github.com/redmatrix/hubzilla.git]https://github.com/redmatrix/hubzilla.git[/url]</p> + +<p>Follow the instructions provided here: [url=http://help.github.com/fork-a-repo/]http://help.github.com/fork-a-repo/[/url] +to create and use your own tracking fork on github</p> + +<p>Then go to your github page and create a "Pull request" when you are ready +to notify us to merge your work.</p> + +<p><strong>Translations</strong></p> + +<p>Our translations are managed through Transifex. If you wish to help out translating the $Projectname to another language, sign up on transifex.com, visit [url=https://www.transifex.com/projects/p/red-matrix/]https://www.transifex.com/projects/p/red-matrix/[/url] and request to join one of the existing language teams or create a new one. Notify one of the core developers when you have a translation update which requires merging, or ask about merging it yourself if you're comfortable with git and PHP. We have a string file called 'messages.po' which is gettext compliant and a handful of email templates, and from there we automatically generate the application's language files.</p> + +<p><strong>Important</strong></p> + +<p>Please pull in any changes from the project repository and merge them with your work <strong>before</strong> issuing a pull request. We reserve the right to reject any patch which results in a large number of merge conflicts. This is especially true in the case of language translations - where we may not be able to understand the subtle differences between conflicting versions.</p> + +<p>Also - <strong>test your changes</strong>. Don't assume that a simple fix won't break something else. If possible get an experienced Red developer to review the code.</p> + +<p>Further documentation can be found at the Github wiki pages at: [url=https://github.com/friendica/red/wiki]https://github.com/friendica/red/wiki[/url]</p> + +<p><strong>Licensing</strong></p> + +<p>All code contributed to the project falls under the MIT license, unless otherwise specified. We will accept third-party code which falls under MIT, BSD and LGPL, but copyleft licensing (GPL, and AGPL) is only permitted in addons. It must be possible to completely remove the GPL (copyleft) code from the main project without breaking anything.</p> + +<p><strong>Concensus Building</strong></p> + +<p>Code changes which fix an obvious bug are pretty straight-forward. For instance if you click "Save" and the thing you're trying to save isn't saved, it's fairly obvious what the intended behaviour should be. Often when developing feature requests, it may affect large numbers of community members and it's possible that other members of the community won't agree with the need for the feature, or with your proposed implementation. They may not see something as a bug or a desirable feature.</p> + +<p>We encourage consensus building within the community when it comes to any feature which might be considered controversial or where there isn't unanimous decision that the proposed feature is the correct way to accomplish the task. The first place to pitch your ideas is to [url=https://zothub.com/channel/one]Channel One[/url]. Others may have some input or be able to point out facets of your concept which might be problematic in our environment. But also, you may encounter opposition to your plan. This doesn't mean you should stop and/or ignore the feature. Listen to the concerns of others and try and work through any implementation issues.</p> + +<p>There are places where opposition cannot be resolved. In these cases, please consider making your feature <strong>optional</strong> or non-default behaviour that must be specifically enabled. This technique can often be used when a feature has significant but less than unanimous support. Those who desire the feature can turn it on and those who don't want it - will leave it turned off.</p> + +<p>If a feature uses other networks or websites and or is only seen as desirable by a small minority of the community, consider making the functionality available via an addon or plugin. Once again, those who don't desire the feature won't need to install it. Plugins are relatively easy to create and "hooks" can be easily added or modified if the current hooks do not do what is needed to allow your plugin to work.</p> + +<p><strong>Coding Style</strong></p> + +<p>In the interests of consistency we adopt the following code styling. We may accept patches using other styles, but where possible please try to provide a consistent code style. We aren't going to argue or debate the merits of this style, and it is irrelevant what project 'xyz' uses. This is not project 'xyz'. This is a baseline to try and keep the code readable now and in the future.</p> + +<ul><li><p>All comments should be in English.</p></li> +<li><p>We use doxygen to generate documentation. This hasn't been consistently applied, but learning it and using it are highly encouraged.</p></li> +<li><p>Indentation is accomplished primarily with tabs using a tab-width of 4.</p></li> +<li><p>String concatenation and operators should be separated by whitespace. e.g. "$foo = $bar . 'abc';" instead of "$foo=$bar.'abc';"</p></li> +<li><p>Generally speaking, we use single quotes for string variables and double quotes for SQL statements. "Here documents" should be avoided. Sometimes using double quoted strings with variable replacement is the most efficient means of creating the string. In most cases, you should be using single quotes.</p></li> +<li><p>Use whitespace liberally to enhance readability. When creating arrays with many elements, we will often set one key/value pair per line, indented from the parent line appropriately. Lining up the assignment operators takes a bit more work, but also increases readability.</p></li> +<li><p>Generally speaking, opening braces go on the same line as the thing which opens the brace. They are the last character on the line. Closing braces are on a line by themselves.</p></li> +<li><p>Some functions take arguments in argc/argv style like main() in C or function args in bash or Perl. Urls are broken up within a module. e.g, given "http://example.com/module/arg1/arg2", then $this->argc will be 3 (integer) and $this->argv will contain: [0] => 'module', [1] => 'arg1', [2] => 'arg2'. There will always be one argument. If provided a naked domain URL, $this->argv[0] is set to "home".</p></li> +</ul> +
\ No newline at end of file diff --git a/doc/general.bb b/doc/general.bb index cc5de5a56..8390aceb3 100644 --- a/doc/general.bb +++ b/doc/general.bb @@ -3,7 +3,7 @@ [zrl=[baseurl]/help/Privacy]Privacy Policy[/zrl] [zrl=[baseurl]/help/project/governance]Project Governance[/zrl] [zrl=[baseurl]/help/contributor/convenant]Project Covenant and Code of Conduct[/zrl] -[zrl=[baseurl]/help/project/history]$Projectname history[/zrl] + [h3]External resources[/h3] [zrl=[baseurl]/help/external-resource-links]List of external resources[/zrl] [url=https://github.com/redmatrix/hubzilla]Main Website[/url] diff --git a/doc/hook/crypto_methods.bb b/doc/hook/crypto_methods.bb new file mode 100644 index 000000000..1b16f567d --- /dev/null +++ b/doc/hook/crypto_methods.bb @@ -0,0 +1,5 @@ +[h2]crypto_mthods[/h2] + +Passed an array of crypto methods in local priority order. + +You may change the order and add new methods or disable existing methods. 'aes256cbc' is always supported as a fallback and currently removing this has no effect.
\ No newline at end of file diff --git a/doc/hook/other_encapsulate.bb b/doc/hook/other_encapsulate.bb new file mode 100644 index 000000000..ea0cdf622 --- /dev/null +++ b/doc/hook/other_encapsulate.bb @@ -0,0 +1,7 @@ +[h2]other_encapsulate[/h2] + +Passed an array of 'data', 'pubkey', 'alg', 'result' when encrypting data with an algorithm (alg) which is unknown to the system. Hooks are expected to identify their algorithm, encrypt data with pubkey and place the result in 'result'. + + + + diff --git a/doc/hook/other_unencapsulate.bb b/doc/hook/other_unencapsulate.bb new file mode 100644 index 000000000..c8b0b617f --- /dev/null +++ b/doc/hook/other_unencapsulate.bb @@ -0,0 +1,5 @@ +[h2]other_unencapsulate[/h2] + +Passed an array of 'data', 'prvkey', 'alg', 'result' when decrypting data with an algorithm (alg) which is unknown to the system. Hooks are expected to identify their algorithm, decrypt data with prvkey and place the result in 'result'. + + diff --git a/doc/hooklist.bb b/doc/hooklist.bb index 5226e7de6..52af9608c 100644 --- a/doc/hooklist.bb +++ b/doc/hooklist.bb @@ -145,6 +145,9 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the [zrl=[baseurl]/help/hook/cron_weekly]cron_weekly[/zrl] Called when weekly scheduled tasks are executed +[zrl=[baseurl]/help/hook/crypto_methods]crypto_methods[/zrl] + Called when generating a list of crypto algorithms in the locally preferred order + [zrl=[baseurl]/help/hook/directory_item]directory_item[/zrl] Called when generating a directory listing for display @@ -386,6 +389,12 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the [zrl=[baseurl]/help/hook/oembed_probe]oembed_probe[/zrl] Called when performing an oembed content lookup +[zrl=[baseurl]/help/hook/other_encapsulate]other_encapsulate[/zrl] + Called when encrypting content for which the algorithm is unknown (see also crypto_methods) + +[zrl=[baseurl]/help/hook/other_unencapsulate]other_unencapsulate[/zrl] + Called when decrypting content for which the algorithm is unknown (see also crypto_methods) + [zrl=[baseurl]/help/hook/page_content_top]page_content_top[/zrl] Called when we generate a webpage (before calling the module content function) diff --git a/doc/member/member_faq.html b/doc/member/member_faq.html new file mode 100644 index 000000000..fa124c1b1 --- /dev/null +++ b/doc/member/member_faq.html @@ -0,0 +1,19 @@ +<p><strong>Frequently Asked Questions</strong></p> + +<ul id="member-faq-toc"> + <li><a href="/help/member/member_faq#I_am_able_to_edit_a_post_s_text_after_I_saved_it_but_is_there_a_way_to_change_the_permissions_">I am able to edit a post's text after I saved it, but is there a way to change the permissions?</a></li> + <li><a href="/help/member/member_faq#I_downloaded_my_channel_and_imported_it_cloned_my_identity_to_another_site_but_there_is_no_content_no_posts_no_photos_What_is_wrong_">I downloaded my channel and imported it (cloned my identity) to another site but there is no content, no posts, no photos. What is wrong???</a></li> + <li><a href="/help/member/member_faq#I_can_t_see_private_resources">I can't see private resources</a></li> + <li><a href="/help/member/member_faq#There_are_a_lot_of_foreign_language_posts_Let_s_auto_translate_them_">There are a lot of foreign language posts. Let's auto-translate them.</a></li> +</ul> + +<hr> + +<h1 id="I_am_able_to_edit_a_post_s_text_after_I_saved_it_but_is_there_a_way_to_change_the_permissions_">I am able to edit a post's text after I saved it, but is there a way to change the permissions?</h1> +<br>Short answer: No, there isn't. There are reasons. You are able to change permissions to your files, photos and the likes, but not to posts after you have saved them. The main reason is: Once you have saved a post it is being distributed either to the public channel and from there to other Hubzilla servers or to those you intended it to go. Just like you cannot reclaim something you gave to another person, you cannot change permissions to Hubzilla posts. We would need to track everywhere your posting goes, keep track of everyone you allowed to see it and then keep track of from whom to delete it. <br>If a posting is public this is even harder, as Hubzilla is a global network and there is no way to follow a post, let alone reclaim it reliably. Other networks that may receive your post have no reliable way to delete or reclaim the post.<br><br> +<h1 id="I_downloaded_my_channel_and_imported_it_cloned_my_identity_to_another_site_but_there_is_no_content_no_posts_no_photos_What_is_wrong_">I downloaded my channel and imported it (cloned my identity) to another site but there is no content, no posts, no photos. What is wrong???</h1> +<br>Posts and photos/files are provided separately from the channel basic information. This is due to memory limitations dealing with years of conversations and photo archives. Posts and conversations can be synced separately from the basic channel information. Photos and file archives can be transferred using a plugin tool such as 'redfiles', which is currently listed as "experimental". When creating this feature we thought that keeping all your contacts was the most important task. Your friends have already seen your old content. Posts/conversations were next in priority and these may now be synced. Files and photos are the last bit to get completely working. Once we find someone willing to finish implementing this, it will be done. :)<br> +<h1 id="I_can_t_see_private_resources">I can't see private resources</h1> +<br>You have probably disabled third party cookies. You need to enable them for remote authentication to work.<br> +<h1 id="There_are_a_lot_of_foreign_language_posts_Let_s_auto_translate_them_">There are a lot of foreign language posts. Let's auto-translate them.</h1> +<br>There are also a lot of <strong>private</strong> foreign language posts and auto-translation services would require us to transmit these private messages to the translation service; and we don't know what they will do with them on their servers. Actually we do know thanks to Edward Snowden. Our best bet is a project called <strong><em>Apertium</em></strong> which is an open source translator we can install locally. It is currently missing German translations - which are the most requested translation in the matrix. Once again, this will be implemented when we find somebody who really wants to make it happen. diff --git a/doc/member/member_guide.html b/doc/member/member_guide.html new file mode 100644 index 000000000..62a4cdabe --- /dev/null +++ b/doc/member/member_guide.html @@ -0,0 +1,460 @@ + +<h1 id="overview">Overview</h1> +<p> While many features and capabilities of +Hubzilla are familiar to people who have used social networking sites and +blogging software, there are also quite a few new concepts and features that +most people have not encountered before. Some of the new ideas are related to +the <strong>decentralized</strong> nature of the grid; others are associated +with the advanced <strong>permissions system</strong> that is necessary to +protect your data privacy. The purpose of this guide is to help you understand +how to create, configure, and use your nomadic identity. </p> + + +<h1 id="Registration">Registration</h1> +Not all Hubzilla sites allow open +registration. If registration is allowed, you will see a "Register" link +immediately below the login prompts on the site home page. Following this link +will take you to the site Registration page. On some sites it may redirect you +to another site which allow registrations. As all Hubzilla sites are linked, it +does not matter where your account resides.<br><br><strong>Your Email +Address</strong><br><br>Please provide a valid email address. Your email address +is never published. This address will be used to activate your account, to +(optionally) send email notifications for incoming messages or items, <em>and to +recover lost passwords</em>.<br><br><strong>Password</strong><br><br>Enter a +password of your choice, and repeat it in the second box to ensure it was typed +correctly. As Hubzilla offers a decentralised identity, your account can log you +in to many other websites.<br><br><strong>Terms Of Service</strong><br><br>Click +the link to read the site's <a class="zrl" +href="[baseurl]/help/TermsOfService">Terms of Service</a>. Once you've read +them, tick the box in the register form to +confirm.<br><br><strong>Register</strong><br><br>Once you have provided the +necessary details, click the 'Register' button. Some sites may require +administrator approval before the registration is processed, and you will be +alerted if this is the case. Please watch your email (including spam folders) +for your registration approval.<br><br><strong>Create a +Channel</strong><br><br>Next, you will be presented with the "Add a channel" +screen. Normally, your first channel will be one that represents you - so using +your own name (or psuedonym) as the channel name is a good idea. The channel +name should be thought of as a title, or brief description of your channel. The +"choose a short nickname" box is similar to a "username" field. We will use +whatever you enter here to create a channel address, which other people will use +to connect to you, and you will use to log in to other sites. This looks like an +email address, and takes the form nickname@siteyouregisteredat.xyz<br><br>When +your channel is created you will be taken straight to your settings page where +you can define permissions, enable features, etc. All these things are covered +in the appropriate section of the helpfiles.<br><br>See Also<br><a class="zrl" +href="[baseurl]/help/accounts_profiles_channels_basics">The Basics about +Identities within Hubzilla</a><br><a class="zrl" +href="[baseurl]/help/accounts">Accounts</a><br><a class="zrl" +href="[baseurl]/help/profiles">Profiles</a><br><a class="zrl" +href="[baseurl]/help/permissions">Permissions</a><br><a class="zrl" +href="[baseurl]/help/remove_account">Remove Account</a> + +<h1 id="Profiles">Profiles</h1> +Hubzilla has unlimited profiles. You may use +different profiles to show different "sides of yourself" to different audiences. +This is different to having different channels. Different channels allow for +completely different sets of information. You may have a channel for yourself, a +channel for your sports team, a channel for your website, or whatever else. A +profile allows for finely graded "sides" of each channel. For example, your +default public profile might say "Hello, I'm Fred, and I like laughing". You may +show your close friends a profile that adds "and I also enjoy dwarf +tossing".<br><br>You always have a profile known as your "default" or "public" +profile. This profile is always available to the general public and cannot be +hidden (there may be rare exceptions on privately run or disconnected sites). +You may, and probably should restrict the information you make available on your +public profile.<br><br>That said, if you want other friends to be able to find +you, it helps to have the following information in your public +profile...<br><br><ul class="listbullet" style="list-style-type: +circle;"><li>Your real name or at least a nickname everybody knows<br></li><li>A +photo of you<br></li><li>Your location on the planet, at least to a country +level.</li></ul><br><br>In addition, if you'd like to meet people that share +some general interests with you, please take a moment and add some "Keywords" to +your profile. Such as "music, linux, photography" or whatever. You can add as +many keywords as you like.<br><br>To create an alternate profile, first go to <a +class="zrl" href="[baseurl]/settings/features">Settings > Additional +Features</a> and enable "Multiple Profiles" there, otherwise you won't have the +ability to use more than just your default profile.<br><br>Then select "Edit +Profiles" from the menu of your Hubzilla site. You may edit an existing profile, +change the profile photo, add things to a profile or create a new profile. You +may also create a "clone" of an existing profile if you only wish to change a +few items but don't wish to enter all the information again. To do that, click +on the profile you want to clone and choose "Clone this profile" +there.<br><br>In the list of your profiles, you can also choose the contacts who +can see a specific profile. Just click on "Edit visibility" next to the profile +in question (only available for the profiles that are not your default profile) +and then click on user images to add them to or remove them from the group of +people who can see this profile.<br><br>Once a profile has been selected, when +the person views your profile, they will see the private profile you have +assigned. If they are not authenticated, they will see your public +profile.<br><br>There is a setting which allows you to publish your profile to a +directory and ensure that it can be found by others. You can change this setting +on the "Settings" page.<br><br>If you do not wish to be found be people unless +you give them your channel address, you may leave your profile +unpublished.<br><br><strong>Keywords and Directory Search</strong><br><br>On the +directory page, you may search for people with published profiles. Currently, +only the name field and the keywords are searched. You may also +include such keywords in your default profile - which may be used to search for +common interests with other members. Keywords are used in the channel suggestion +tool and although they aren't visible in the directory, they are shown if people +visit your profile page.<br><br>On your Connnections page and in the directory +there is a link to "Suggestions" or "Channel Suggestions", respectively. This +will find channels who have matching and/or similar keywords. The more keywords +you provide, the more relevant the search results that are returned. These are +sorted by relevance.<br><br>See Also<br><br><a class="zrl" +href="[baseurl]/help/AdvancedSearch">Advanced Searching</a> + +<h1 id="Channels">Channels</h1> +<h3>What are channels?</h3> Channels are simply +collections of content stored in one place. A channel can represent anything. It +could represent you, a website, a forum, photo albums, anything. For most +people, their first channel with be "Me".<br><br>The most important features for +a channel that represents "me" are:<br><ul class="listbullet" +style="list-style-type: circle;"><br><li>Secure and private "spam free" +communications<br><br></li><li>Identity and "single-signon" across the entire +network<br><br></li><li>Privacy controls and permissions which extend to the +entire network<br><br></li><li>Directory services (like a phone +book)<br></li></ul><br>In short, a channel that represents yourself is "me, on +the internet".<br><br><h3>Creating channels</h3><br><br>You will be required to +create your first channel as part of the sign up process. You can also create +additonal channels from the "Select channel" link.<br><br>You will be asked to +provide a channel name, and a short nick name. For a channel that represents +yourself, it is a good idea to use your real name here to ensure your friends +can find you, and connect to your channel. The short nickname will be used to +generate a "webbie". This is a bit like a username, and will look like an email +address, taking the form nickname@domain. You should put a little thought into +what you want to use here. Imagine somebody asking for your webbie and having to +tell them it is "llamas-are_kewl.123". "llamasarecool" would be a much better +choice.<br><br>Once you have created your channel, you will be taken to the +settings page, where you can configure your channel, and set your default +permissions.<br><br>Once you have done this, your channel is ready to use. At +[observer=1]<a +href="[observer.url]">[observer.url]</a>[/observer][observer=0]example.com/ +channel/username[/observer] you will find your channel "stream". This is where +your recent activity will appear, in reverse chronological order. If you post in +the box marked "share", the entry will appear at the top of your stream. You +will also find links to all the other communication areas for this channel here. +The "About" tab contains your "profile", the photos page contain photo albums, +and the events page contains events share by both yourself and your +contacts.<br><br><h3>The grid, permissions and delegation</h3><br><br>The "Grid" +page contains all recent posts from across Hubzilla network, again in reverse +chronologial order. The exact posts that appear here depend largely on your +permissions. At their most permissive, you will receive posts from complete +strangers. At the other end of the scale, you may see posts from only your +friends - or if you're feeling really anti-social, only your own +posts.<br><br>As mentioned at the start, many other kinds of channel are +possible, however, the creation procedure is the same. The difference between +channels lies primarily in the permissions assigned. For example, a channel for +sharing documents with colleagues at work would probably want more permissive +settings for "Can write to my "public" file storage" than a personal account. +For more information, see the <a class="zrl" +href="[baseurl]/help/roles">permissions section</a>.<br><br>You can also +delegate control of your channels' posts and connections, but not its +configurations, to another channel. That is done by editing a connection and +assigning it the permission to administer your channel's resources. + + + +<h1 id="roles">Account Permission Roles</h1> + +<h2>Social</h2> + +<p><strong>Mostly Public</strong></p> + +<p>The channel is a typical social networking profile. By default posts and published items are public, but one can over-ride this when creating the item and restrict it. You are listed in the directory. Your online presence and connections are visible to others.</p> + +<p><strong>Restricted</strong></p> + +<p>By default all posts and published items are sent to your 'Friends' privacy group and not made public. New friends are added to this privacy group. You can over-ride this and create a public post or published item if you desire. You are listed in the directory. Your online presence (for chat) and your connections (friends) are visible to your profile viewers.</p> + +<p><strong>Private</strong></p> + +<p>By default all posts and published items are sent to your 'Friends' privacy group. New friends are added to this privacy group. You can over-ride this and create a public post or public item if you desire. You are NOT listed in the directory. Only your connections can see your other connections. Your online presence is hidden.</p> + +<h2>Forum</h2> + +<p><strong>Mostly Public</strong></p> + +<p>The channel is a typical forum. By default posts and published items are public. Members may post by @mention+ or wall-to-wall post. Posting photos and other published items is blocked. The channel is visible in the directory. Members are added automatically.</p> + +<p><strong>Restricted</strong></p> + +<p>By default all posts and published items are sent to the channel's 'Friends' privacy group. New friends are added to this privacy group. Members may post by @mention+ or wall-to-wall post, but posts and replies may also be seen by other receipients of the top-level post who are not members. The channel is visible in the directory. Members must be manually added by the forum owner.</p> + +<p><strong>Private</strong></p> + +<p>By default all posts and published items are sent to your 'Friends' privacy group. New friends are added to this privacy group. The owner can over-ride this and create a public post or public item if desired. Members cannot. You are NOT listed in the directory. Only your connections can see your other connections. Your online presence is hidden. Members must be manually added by the forum owner. Posting by @mention+ is disabled. Posts can only be made via wall-to-wall posts, and sent to members of the 'Friends' privacy group. They are not publicly visible.</p> + +<h2>Feed</h2> + +<p><strong>Public</strong></p> + +<p>Similiar to Social - Mostly Public, but tailored for RSS feed sources. Items may be freely republished and sourced. Online presence is meaningless, therefore hidden. New connections are automatically approved.</p> + +<p><strong>Restricted</strong></p> + +<p>Not listed in directory. Online presence is meaningless, therefore hidden. Feed is published only to members of the 'Friends' privacy group. New connections are automatically added to this privacy group. Members must be manually approved by the channel owner.</p> + +<h2>Special</h2> + +<p><strong>Celebrity/Soapbox</strong></p> + +<p>Listed in directory. Communications are by default public. Online presence is hidden. No commenting or feedback of any form is allowed, though connections have the ability to "like" your profile.</p> + +<p><strong>Group Repository</strong></p> + +<p>A public forum which allows members to post files/photos/webpages.</p> + +<h2>Custom/Expert Mode</h2> + +<p>Set all the privacy and permissions manually to suit your specific needs.</p> + + +<h1 id="connecting-to-channels">Connecting To Channels</h1> + +<p>Connections in Hubzilla can take on a great many different meanings. But let's keep it simple, you want to be friends with somebody like you are familiar with from social networking. How do you do it?</p> + +<p>First, you need to find some channels to connect to. There are two primary ways of doing this. Firstly, setting the "Can send me their channel stream and posts" permission to "Anybody in this network" will bring posts from complete strangers to your matrix. This will give you a lot of public content and should hopefully help you find interesting, entertaing people, forums, and channels.</p> + +<p>The next thing you can do is look at the Directory. The directory is available on every Hubzilla website which means searching from your own site will bring in results from the entire network. You can search by name, interest, location and keyword. This is incomplete, so we'll improve this paragraph later.</p> + +<p>To connect with other Hubzilla channels:</p> + +<p>Visit their profile by clicking their photograph in the directory, matrix, or comments, and it will open their channel home page in the channel viewer. At the left hand side of the screen, you will usually see a link called "connect". Click it, and you're done. Depending on the settings of the channel you are connecting to, you may need to wait for them to approve your connection, but no further action is needed on your part. Once you've initiated the connection, you will be taken to the connection editor. This allows you to assign specific permissions for this channel. If you don't allow any permissions, communication will be very limited. There are some quick links which you can use to avoid setting individual permissions. To provide a social network environment, "Full Sharing" is recommended. You may review the settings that are applied with the quick links to ensure they are suitable for the channel you are connecting with and adjust if necessary. Then scroll to the bottom of the page and click "Submit".</p> + +<p>You may also connect with any channel by visiting the "Connections" page of your site or the Directory and typing their "webbie" into the "Add New Connection" field. Use this method if somebody tells you their webbie and you wish to connect with them. A webbie looks like an email address; for example "bob@example.com". The process is the same as connecting via the "Connect" button - you will then be taken to the connection editor to set permissions.</p> + +<h2>Block/Ignore/Archive/Hide channels</h2> + +<p>Channels in your address book can have statuses such as <em>blocked</em>, <em>ignored</em>, <em>archived</em> and <em>hidden</em>. From your connections page you can see tabs that display the channels with those statuses. From your edit connection pages you can change the statuses of a channel.</p> + +<p>Here's their meaning:</p> + +<p><strong>Blocked:</strong> the channel can't read your items regardless of permissions, nor can it write to your channel.</p> + +<p><strong>Ignored:</strong> the channel can read your items if it has permission, but can't write to your channel.</p> + +<p><strong>Hidden:</strong> the channel does not show up in your profile's connections list, noone can see you're connected, but beware they may still show up to your other connections, for example in post replies.</p> + +<p><strong>Archived:</strong> if a channel can't be reached for 30 days, it is automatically marked as archived. This keeps all the data but stops polling the channel for new information and removes it from autocomplete. If later you learn the channel has come back online, you may manually unarchive it.</p> + +<h2>Premium Channels</h2> + +<p>Some channels are designated "Premium Channels" and <strong>may</strong> require some action on your part before a connection can be established. The Connect button will for these channels will take you to a page which lists in detail what terms the channel owner has set. If the terms are accepted, the connection will then proceed normally. In some cases, such as with celebrities and world-reknowned publishers, this <strong>may</strong> involve payment. If you do not agree to the terms, the connection will not proceed, or it may proceed but with reduced permissions allowed on your interactions with that channel.</p> + + +<h1 id="permissions">Permissions and Access Control</h1> + +<br>Permissions in Hubzilla are more complete than you may be used to. This allows us to define more fine graded relationships than the black and white "this person is my friend, so they can do everything" or "this person is not my friend, so they can't do anything" permissions you may find elsewhere.<br><br><strong>Permission Roles</strong><br><br>When you create a channel we allow you to select different 'roles' for that channel. These create an entire family of permissions and privacy settings that are appropriate for that role. Typical roles are "Social - mostly public", "Social - mostly private", "Forum - public" and many others. These bring a level of simplicity to managing permissions. Just choose a role and appropriate permissions are automatically applied. You can also choose 'Custom/Expert mode' and change any individual permission setting in any way you desire. <br><br><br><strong>Default Permission Limits</strong><br><br>There are a large number of individual permissions. These control everything from the ability to view your stream to the ability to chat with you. Every permission has a limit. The scope of these permissions varies from "Only me" to "Everybody on the internet" - though some scopes may not be available for some permissions. The limit applies to any published thing you create which has no privacy or access control. For example if you publish a photo and didn't select a specific audience with permission to view it, we apply the limit. These limits apply to everything within that permission rule, so you cannot apply a limit to one photo. The limit applies to all your photos. If all your photos are visible to everybody on the internet and you reduce the limit only to friends, <strong>all</strong> of your photos will now be visible only to friends.<br><br><strong>Access Control</strong><br> <br>Access Control is the preferred method of managing privacy in <em>most</em> cases, rather than using permission limits. This creates lists of either connections or privacy groups (or both) and uses the access list to decide if a permission is allowed. An access list is attached to everything you publish. Unlike permission limits, if you change the access control list on a single photo, it doesn't affect any of your other photos. You can use privacy groups and a "default access control list" to create and automate the management of access control lists to provide any level of privacy you desire on anything you publish. <br><br>We highly recommend that you use the "typical social network" settings when you create your first channel, as it allows others to communicate with you and help you out if you have difficulty. You will find that these settings allow you as much privacy as you desire - when you desire it; but also allow you to communicate in public if you choose to. You are free to use much more private settings once you have learned your way around.<br><br><br><dl class="bb-dl dl-terms-large"> +<dt> The scopes of permissions are:</dt><dd><br><dl class="bb-dl dl-terms-italic"> +<dt> Nobody Except Yourself </dt><dd> This is self explanatory. Only you will be allowed access.<br> <br></dd> +<dt> Only those you specifically allow </dt><dd> By default, people you are not connected to, and all new contacts will have this permission denied. You will be able to make exceptions for individual channels on their contact edit screen.<br> <br></dd> +<dt> Anybody in your address book </dt><dd> Anybody you do not know will have this permission denied, but anybody you accept as a contact will have this permission approved. This is the way most legacy platforms handle permissions.<br> <br></dd> +<dt> Anybody On This Hub </dt><dd> Anybody with a channel on the same hub/website as you will have permission approved. Anybody who is registered at a different hub will have this permission denied.<br> <br></dd> +<dt> Anybody in this network </dt><dd> Anybody in Hubzilla will have this permission approved. Even complete strangers. However, anybody not logged in/authenticated will have this permission denied.<br> <br></dd> +<dt> Anybody authenticated </dt><dd> This is similar to "anybody in this network" except that it can include anybody who can authenticate by any means - and therefore <em>may</em> include visitors from other networks.<br> <br></dd> +<dt> Anybody on the internet </dt><dd> Completely public. This permission will be approved for anybody at all.<br></dd></dl><br></dd> +<dt> The individual permissions are:</dt><dd><br><dl class="bb-dl dl-terms-italic"> +<dt> Can view my "public" stream and posts. </dt><dd> This permision determines who can view your channel "stream" that is, the non-private posts that appear on the "home" tab when you're logged in.<br><br></dd> +<dt> Can view my "public" channel profile. </dt><dd> This permission determines who can view your channel's profile. This refers to the "about" tab<br><br></dd> +<dt> Can view my "public" photo albums. </dt><dd> This permission determines who can view your photo albums. Individual photographs may still be posted to a more private audience.<br><br></dd> +<dt> Can view my "public" address book. </dt><dd> This permission determines who can view your contacts. These are the connections displayed in the "View connections" section.<br><br></dd> +<dt> Can view my "public" file storage. </dt><dd> This permission determines who can view your public files stored in your cloud.<br><br></dd> +<dt> Can view my "public" pages. </dt><dd> This permission determines who can view your public web pages. <br><br></dd> +<dt> Can send me their channel stream and posts. </dt><dd> This permission determines whose posts you will view. If your channel is a personal channel (ie, you as a person), you would probably want to set this to "anyone in my address book" at a minimum. A personal notes channel would probably want to choose "nobody except myself". Setting this to "Anybody in the network" will show you posts from complete strangers, which is a good form of discovery.<br><br></dd> +<dt> Can post on my channel page ("wall"). </dt><dd> This permission determines who can write to your wall when clicking through to your channel.<br><br></dd> +<dt> Can comment on my posts. </dt><dd> This permission determines who can comment on posts you create. Normally, you would want this to match your "can view my public stream and posts" permission<br><br></dd> +<dt> Can send me private mail messages. </dt><dd> This determines who can send you private messages (zotmail).<br><br></dd> +<dt> Can post photos to my photo albums. </dt><dd> This determines who can post photographs in your albums. This is very useful for forum-like channels where connections may not be connected to each other.<br><br></dd> +<dt> Can forward to all my channel contacts via post tags. </dt><dd> Using @- mentions will reproduce a copy of your post on the profile specified, as though you posted on the channel wall. This determines if people can post to your channel in this way.<br><br></dd> +<dt> Can chat with me (when available). </dt><dd> This determines who can join the public chat rooms created by your channel.<br><br></dd> +<dt> Can write to my "public" file storage. </dt><dd> This determines who can upload files to your public file storage, or 'cloud'.<br><br></dd> +<dt> Can edit my "public" pages. </dt><dd> This determines who can edit your webpages. This is useful for wikis or sites with multiple editors.<br><br></dd> +<dt> Can administer my channel resources. </dt><dd> This determines who can have full control of your channel. This should normally be set to "nobody except myself".<br></dd></dl></dd></dl><br><em>Note:</em><br>Plugins/addons may provide special permission settings, so you may be offered additional permission settings beyond what is described here.<br><br>If you have set any of these permissions to "only those I specifically allow", you may specify indivudal permissions on the connnection edit screen.<br><br><strong>Affinity</strong><br><br>The connection edit screen offers a slider to select a degree of friendship with the connnection (this tool is enabled through the "Extra Features" tab of your Settings page). Think of this as a measure of how much you like or dislike them. 1 is for people you like, whose posts you want to see all the time. 99 is for people you don't care for, and whose posts you might only wish to look at occasionally. Once you've assigned a value here, you can use the affinity tool on the matrix page to filter content based on this number.<br><br>The slider on the matrix page has both a minimum and maximum value. Posts will only be shown from people who fall between this range. Affinity has no relation to permissions, and is only useful in conjunction with the affinity tool feature. + + +<h1 id="cloud-storage">Cloud Storage</h1> + +<br><br>Hubzilla provides an ability to store privately and/or share arbitrary +files with friends.<br><br>You may either upload files from your computer into +your storage area, or copy them directly from the operating system using the +WebDAV protocol.<br><br>On many public servers there may be limits on disk +usage.<br><br><strong>File Attachments</strong><br><br>The quickest and easiest +way to share files is through file attachments. In the row of icons below the +status post editor is a tool to upload attachments. Click the tool, select a +file and submit. After the file is uploaded, you will see an attachment code +placed inside the text region. Do not edit this line or it may break the ability +for your friends to see the attachment. You can use the post permissions +dialogue box or privacy hashtags to restrict the visibility of the file - which +will be set to match the permissions of the post your are sending.<br><br>To +delete attachments or change the permissions on the stored files, visit <a +href="[baseurl]/cloud/">[baseurl]/cloud/</a>[observer.webname]".<br><br><strong>Web +Access</strong><br><br>Your files are visible on the web at the location +"cloud/[observer.webname]" to anybody who is allowed to view them. If the viewer has +sufficient privileges, they may also have the ability to create new files and +folders/directories.<br><br><strong>WebDAV access</strong><br><br>See: <a +class="zrl" href="/help/member/member_guide#cloud-storage-clients">Cloud Desktop +Clients</a><br><br><strong>Permissions</strong><br><br>When using WebDAV, the +file is created with your channel's default file permissions and this cannot be +changed from within the operating system. It also may not be as restrictive as +you would like. What we've found is that the preferred method of making files +private is to first create folders or directories; then visit +"filestorage/[observer.webname]"; select the directory and change the permissions. Do +this before you put anything into the directory. The directory permissions take +precedence so you can then put files or other folders into that container and +they will be protected from unwanted viewers by the directory permissions. It is +common for folks to create a "personal" or "private" folder which is restricted +to themselves. You can use this as a personal cloud to store anything from +anywhere on the web or any computer and it is protected from others. You might +also create folders for "family" and "friends" with permission granted to +appropriate privacy groups. + +<h2 id="cloud-storage-clients">Cloud Desktop Clients</h2> + +<h3>Windows Clients</h3> + +<h4>Windows Internal Client</h4> + +RedDav using +Windows 7 graphical user interface wizard:<br>1. Left-click the Start-button to +open the start menu.<br>2. Right-click the My computer icon to access its +menu.<br>3. Left-click Map network drive... to open the connection dialog +wizard.<br>4. Type <span class="bookmark-identifier">#^</span><a +class="bookmark" +href="https://example.net/dav/your_channel_name">https://example.net/dav/ +your_channel_name</a> in the textbox and click the Complete button where +"example.net" is the URL of your hub.<br>5. Type your Hubzilla account's user +name. IMPORTANT - NO at-sign or domain name.<br>6. Type your Hubzilla +password + + +<h3>Linux Clients</h3> + +<h4>Mounting As A Filesystem</h4> + +To install your cloud directory as a filesystem, you first need davfs2 +installed. 99% of the time, this will be included in your +distributions repositories. In Debian<br><br><code +class="inline-code">apt-get install davfs2</code><br><br>If you want to let +normal users mount the filesystem<br><br><code +class="inline-code">dpkg-reconfigure davfs2</code><br><br>and select "yes" at +the prompt.<br><br>Now you need to add any user you want to be able to mount dav +to the davfs2 group<br><br><code class="inline-code">usermod -aG davfs2 +<DesktopUser></code><br><br><strong>Note:</strong> on some systems the +user group may be different, i.e. - "network" <br>on Arch Linux. If in doubt, +check the davfs documentation for your <br>particular OS.<br><br>Edit +/etc/fstab<br><br><code class="inline-code">nano /etc/fstab</code><br><br> to +include your cloud directory by adding<br><br><code><br><a +href="[baseurl]/dav/">[baseurl]/dav/</a> /mount/point +davfs user,noauto,uid=<DesktopUser>,file_mode=600,dir_mode=700 0 +1<br></code><br><br>Where <a +href="[baseurl]">[baseurl]</a> is the URL of your hub, +/mount/point is the location you want to mount the cloud, and +<DesktopUser> is the user you log in to one your computer. Note +that if you are mounting as a normal user (not root) the mount point must be in +your home directory.<br><br>For example, if I wanted to mount my cloud to a +directory called 'cloud' in my home directory, and my username was bob, my fstab +would be <br><br><code class="inline-code">[baseurl]/dav/ +/home/bob/cloud davfs user,noauto,uid=bob,file_mode=600,dir_mode=700 0 +1</code><br><br>Now, create the mount point.<br><br><code +class="inline-code">mkdir /home/bob/cloud</code><br><br>and also create a +directory file to store your credentials<br><br><code class="inline-code">mkdir +/home/bob/.davfs2</code><br><br>Create a file called 'secrets'<br><br><code +class="inline-code">nano /home/bob/.davfs2/secrets</code><br><br>and add your +cloud login credentials<br><br><code><br><a +href="[baseurl]/dav">[baseurl]/dav</a> +<username> <password><br></code><br><br>Where <username> and +<password> are the username and password <em>for your +hub</em>.<br><br>Don't let this file be writeable by anyone who doesn't need it +with<br><br><code class="inline-code">chmod 600 +/home/bob/.davfs2/secrets</code><br><br>Finally, mount the drive.<br><br><code +class="inline-code">mount <a +href="[baseurl]/dav">[baseurl]/dav</a></code><br><br> +You can now find your cloud at /home/bob/cloud and use it as though it were part +of your local filesystem - even if the applications you are using have no dav +support themselves.<br><br><strong>Troubleshooting</strong><br><br>With some +webservers and certain configurations, you may find davfs2 creating files with 0 +bytes file size where other clients work just fine. This is generally +caused by cache and locks. If you are affected by this issue, you +need to edit your davfs2 configuration.<br><br><code class="inline-code">nano +/etc/davfs2/davfs2.conf</code><br><br>Your distribution will provide a sample +configuration, and this file should already exist, however, most of it will be +commented out with a # at the beginning of the line. <br><br>First +step is to remove locks.<br><br>Edit the use_locks line so it reads <code +class="inline-code">use_locks 0</code>.<br><br>Unmount your file system, remount +your file system, and try copying over a file from the command +line. Note you should copy a new file, and not overwrite an old one +for this test. Leave it a minute or two then do <code +class="inline-code">ls -l -h</code> and check the file size of your new file is +still greater than 0 bytes. If it is, stop there, and do nothing +else.<br><br>If that still doesn't work, disable the cache. Note that +this has a performance impact so should only be done if disabling locks didn't +solve your problem. Edit the cache_size and set it to <code +class="inline-code">cache_size 0</code> and also set file_refresh to <code +class="inline-code">file_refresh 0</code>. Unmount your filesystem, +remount your file system, and test it again.<br><br>If it <em>still</em> doesn't +work, there is one more thing you can try. (This one is caused by a +bug in older versions of dav2fs itself, so updating to a new version may also +help). Enable weak etag dropping by setting <code +class="inline-code">drop_weak_etags 1</code>. Unmount and remount +your filesystem to apply the changes. + + +<h4>Dolphin</h4> +Visit webdavs://example.com/dav where "example.com" is the URL of your hub. + +When prompted for a username and password, enter your channel name (the first part of your webbie - no @ or domain name) and password for your normal account. + +Note, if you are already logged in to the web interface via Konqueror, you will not be prompted for further authentication. + + +<h4>Konqueror</h4> + +Simply visit webdavs://example.com/cloud after logging in to your hub, where "example.com" is the URL of your hub. + +No further authentication is required if you are logged in to your hub in the normal manner. + +Additionally, if one has authenticated at a different hub during their normal browser session, your identity will be passed to the cloud for these hubs too - meaning you can access any private files on any server, as long as you have permissions to see them, as long as you have visited that site earlier in your session. + +This functionality is normally restricted to the web interface, and is not available to any desktop software other than KDE. + +<h4>Nautilus</h4> + +1. Open a File browsing window (that's Nautilus)<br>2. Select File > Connect to server from the menu<br>3. Type davs://<domain_name>/dav/<your_channelname> and click Connect<br>4. You will be prompted for your channel name (same as above) and password<br>5. Your personal DAV directory will be shown in the window + +<h4>Nemo</h4> + +For (file browser) Nemo 1.8.2 under Linux Mint 15, Cinnamon 1.8.8. Nemo ist the standard file browser there.<br><br>1st way<br>type "davs://<domain_name>/dav/<your_channelname>" in the address bar.<br><br>2nd way<br>Menu > file > connect to server<br>Fill the dialog<br>- Server: hubzilla_domain_name<br>- Type: Secure WebDAV (https)<br>- Folder: /dav<br>- Username: yourchannelname<br>- Password: yourpassword<br><br>Once open you can set a bookmark. + + + +<strong>Server Notes</strong><br><br>Note: There have been reported issues with clients that +use "chunked transfer encoding", which includes Apple iOS services, and also the +"AnyClient" and "CyberDuck" tools. These work fine for downloads, but uploads +often end up with files of zero size. This is caused by an incorrect +implemention of chunked encoding in some current FCGI (fast-cgi) +implementations. Apache running with PHP as a module does not have these issues, +but when running under FCGI you may need to use alternative clients or use the +web uploader. At the time of this writing the issue has been open and no updates +provided for at least a year. If you encounter zero size files with other +clients, please check the client notes; as there are occasional configuration +issues which can also produce these symptoms. + + +<h1 id="remove-channel">Remove Channel or Account</h1> + +<br><br><strong>Remove Channel</strong><br><br>Go to the bottom of your channel +settings page or visit the URL:<br><br> <a +href="[baseurl]/removeme">[baseurl]/removeme</a> +<br><br>You will need to confirm your password and the channel you are currently +logged into will be removed. <br><br>This is irreversible.<br><br>If you have +identity clones on other hubs this only removes by default the +channel instance which exists on this hub.<br><br><strong>Remove +Account</strong><br><br>Go to the bottom of your account settings page or visit +the URL:<br><br> <a +href="[baseurl]/removeaccount">[baseurl]/removeaccount +</a><br> <br>You will need to confirm your password and +the account you are currently logged into will be removed. <br><br>This is +irreversible.<br><br>All your channels will be deleted. If you have identity +clones on other hubs this only removes by default the channels instances which +exists on this hub. diff --git a/doc/project/governance.bb b/doc/project/governance.bb index e13f6218c..4c1538b4b 100644 --- a/doc/project/governance.bb +++ b/doc/project/governance.bb @@ -2,25 +2,9 @@ Governance relates to the management of a project and particularly how this relates to conflict resolution. -This project uses a dual-governance model. - -The project as a whole and the repository were created initially by Mike Macgirvin; who controls the project copyright, and the project license, and manages the project as a Self Appointed Benevolent Dictator for Life. He holds veto power over any project proposal or decision and his word is final. - -That said, Mike has no interest in running the day to day activities of the project and influencing its direction, other than to protect his own work from sabotage. - -The internal project structure contains multiple "configurations" known as 'basic', 'standard', and 'pro'. Mike's veto power extends to any proposal or decision which he feels might adversely affect the 'pro' configuration. - -The 'basic and 'standard' configurations are controlled completely by the community. If the proposal or decision is crafted in such a way that its effects are limited to these configurations, Mike will consider relinquishing his power of veto and convert it to a normal community vote. - -Mario Vavti has done an incredible amount of work on the usability and theming of the project and holds veto power over any proposal or decision which might impact usability and "look and feel"; and his decision is also final. - -Mario's veto power is likewise restricted to anything using the standard project 'theme'. If a new theme is created and an otherwise vetoed decision is implemented entirely in this different theme and has no impact on the standard project theme, his veto [b]may[/b] also be turned into a normal community vote. - -This ability to work around a veto is at the discretion of Mike and Mario. They [b]may[/b] choose to relinquish their veto if the scope of the work is limited as described above, and in most circumstances they will leave the decision to the community. They are not obligated to do so. - [h3]Community Governance[/h3] -Beyond those two special cases, the project is maintained and decisions made by the 'community'. The governance structure is still evolving. Until the structure is finalised, decisions are made in the following order: +The project is maintained and decisions made by the 'community'. The governance structure is still evolving. Until the structure is finalised, decisions are made in the following order: [ol] [*] Lazy Consensus @@ -29,7 +13,7 @@ If a project proposal is made to one of the community governance forums and ther [*] Veto -If a proposal is vetoed, it is not necessarily the final word. See above on how to convert a veto into a normal community vote. This can be done by framing the proposal so that it does not impact the 'pro' configuration or the standard theme. +Senior developers with a significant history of project commits may veto any decision. The decision may not proceed until the veto is removed or an alternative proposal is presented. [*] Community Vote diff --git a/doc/project/history.md b/doc/project/history.md deleted file mode 100644 index 99cbfec7a..000000000 --- a/doc/project/history.md +++ /dev/null @@ -1,74 +0,0 @@ -Hubzilla History -================ - -Hubzilla is a community developed open source project based on work introduced in Friendica by the Friendica community and which previously was named Redmatrix. The core design, the project mission, and software base itself were created/written primarily by Mike Macgirvin and represent the culmination of over a decade of software design using variations of this platform and an evolving vision of the role of communication software in our lives. Many others have contributed to this work, both conceptually and in terms of actual code (far too many to list individually). - -##Mike Macgirvin -- Biography - -Mike Macgirvin is an American software engineer now living in Australia. He spent his early adult years designing and repairing semiconductor fabrication equipment for a number of companies as a self-described "machine wizard". In 1985 he became a research engineer at Stanford University for the Gravity Probe-B space mission and soon became a Unix systems administrator writing communication software and utilities; and becoming an expert in emerging internet technologies such as the now ubiquitous "World Wide Web". He authored an email "client" called "ML" which pioneered some advanced concepts in encryption, the ability to filter message streams into different "views", and multi-protocol support; and was an active proponent of and participant in the open source software *movement*. In 1996 he went to Netscape Communications to become tech lead on their Messaging Server and integrate this with Collabra (groupware) into a comprehensive communications server package. He stayed on after Netscape was acquired by America Online and was tech manager of the Groups@AOL project until 2001. - -During a layoff round, Mike was let go from America Online in August 2001 and purchased a music store in Mountain View, California later to be known as "Sonica Music Company". Opening a retail store for non-essential goods at the beginning of a prolonged economic downturn was in retrospect probably not the wisest career move. Sonica eventually folded; in late 2006. Mike returned to working on software and systems support full-time and was employed briefly at Symantec before moving to Australia in early 2007. He currently lives on a farm "out in the middle of nowhere" and is employed as a Computer Systems Officer at the University of Wollongong. - - -##Hubzilla - The Early Years - -The software which went into creating Hubzilla has been through several distinct historical phases. It began in 2003 when Mike Macgirvin was looking for a content management system to power the website for his music store and found the available solutions to be lacking in various respects. The project was born as the "PurpleHaze weblog" under the nom de plume "Nerdware Communications". It was a multi-user PHP/MySQL CMS which provided blogs, forums, photo albums, events and more. Initially it provided the basis for a social community and shopping for customers of the store, but was also linked to Mike's personal weblog running on another domain. The distinguishing characteristic of this software was the ability for so-called "normal users" to re-assemble the components and choose different content feeds - and in essence create their own personal "multi-user CMS" as a view. Their custom view was able to communicate with anybody else that used the system, but could be partitioned so that adult sites and motorcycle enthusiast sites would not be visible to each other and not clash (or in this case Mike's personal website and the music store website). This software was developed primarily from 2003 until 2008. - -In 2006 this software was used as the prototype for Symantec's "safeweb" reputation and community site. It was developed and enhanced until about 2008. A rewrite took place in 2008 named "Reflection" but work stagnated as the community dwindled. The need for content management systems and communications software dropped dramatically during this time as humans flocked to the new social aggregrators - Facebook and Twitter. - - -##Mistpark/Friendica - -In early 2010, Mike left Facebook, concerned at the company's increasing hold and control of personal information. In his words "Companies die. We watched it happen in the dot-com years. When they do, their databases are sold to the highest bidder.". Mike used some remnants of the old CMS project to create a decentralised social communications platform. This was launched in July 2010 as "Mistpark". The name was chosen as a tribute to his new home in the Southern Highlands of Australia. The key innovation in this project was the ability to authenticate remotely and invisibly to other decentralised instances of the software so to allow remote viewing of private photos and provide "wall-to-wall" posting across website instances. The lack of simple remote identity *provenance* was a serious limitation of other decentralised communication protocols. - -In late 2010, the name was changed to "Friendika". The name Friendika had some symbolic issues, since the suffix was common with "swastika" and "Amerika", both having negative connotations, however the dot-com domain was available. Friendica was in fact the first choice but the 'friendica.com' domain name was already registered. It became available a year later and the project was renamed to Friendica in late 2011. - -Soon after version 1 was released in July 2010 - providing basic social communications, the software also took on a new role - cross-service federation; which was first introduced in August and September 2010. Federation allowed the software to "behave as" a StatusNet site and friends and messages could communicate to the other service from their own platforms. It was also hoped to provide federation with Diaspora - a project with similar scope being developed in secret in New York and first released in November of that year. Over the course of the next year, the federation ability was extended to provide integrated communications from RSS feeds, to and from email, StatusNet, Facebook, Twitter, and the emerging Diaspora project. The software provided a single "view" of your entire social space no matter what provider you or your friends used. StatusNet and Diaspora were supported natively so that one account could access any of these services. Facebook and Twitter used "API federation" which required the person to have an account on those services with which to link. - -By July 2012, Twitter and Facebook had both changed their terms of service and essentially outlawed "API federation" in the way Friendica was using it. Diaspora announced they were changing their protocol and would not maintain compatibility nor provide any warning when compatibility would break (or documentation on the proposed changes). The creator of StatusNet was also leaving his project to create something new (pump.io). As the software's primary purpose by this time was "federation of different social services into one interface", this created a bit of a crisis. The federated social web was crumbling. Also of concern was that independent and decentralised social websites shut down frequently, requiring all their members to start over again on another site. Often the effort involved to do this seemed daunting - and many people ran back to the relative safety of the large corporate providers - Facebook, Twitter, and now Google+. - -Mike realised he did not want to be held hostage to the decisions that other projects and companies and independent websites make. Friendica could operate on its own without attaching to these other networks, but its vision and implementation of a federated social world depended on federation with others for its project identity - so this created an identity crisis. - -Mike had been working on this project for some time and there were a number of things which needed re-writing, including the base communication protocol which Friendica used (DFRN or the "Distributed Friends and Relations Network" protocol). These ideas were starting to emerge as a different method of communication he called "zot". Zot began as a way to create a common language for federated websites, but there was no interest in this ability and as mentioned, the federated web was crumbling. The first version was soon scrapped and zot was re-designed and re-ignited as a streamlined communication protocol which was location-independent; e.g. not tied to any website. This would allow people to carry on unaffected if their website operator shut down temporarily or permanently. They wouldn't have to make friends all over again, and permissions of everything on the system wouldn't have to be changed to allow bob@site1 to see something that was private to him, even though he was now bob@site2. This was a serious problem with decentralisation. People moved and their online identities were lost and had to be re-created from scratch and existing relationships destroyed and had to be created all over again. - - -##Redmatrix - -In July 2012, Mike left the Friendica project and began development of "zot" and a new base project called "red" in his somewhat elusive *spare time*. Red is Spanish for "network". It wasn't really a "social network" and especially not a "federated social network". It was just Red (technically "la red"), or "the network". Work began by removing all the "federation" components and going back to basics - communication and remote authentication. It was a major re-write and took roughly six months before even basic communication was re-established. It was also no longer compatible with Friendica - which had been given to the "Friendica community" and by this time (December 2012) was developing separately on its own track. - -It became clear during this time that the single most compelling feature of the project wasn't the social network at all, but the authentication layer and decentralised access control mechanisms. Combined with zot's location independence it created a new model for software which had never existed previously - decentralised identity-aware web publishing and single sign-on to any compatible provider across the web. These weren't *evolutionary*, they were **revolutionary**. One of the biggest flaws of the modern web is the reliance on different passwords for every service you use, or reliance on a single provider if you were to tie them to - say your Facebook login. Facebook can remove your account at any time. Gone. If you rely on their authentication for all your websites, your entire online identity - now gone. This is also what was missing from Friendica - a compelling software feature which could stand on its own, without requiring a social network and especially without requiring a federated social network with all the mentioned external dependencies. - -An early visitor to the project noted that he had some difficulty finding the project on Google because of the choice of name - "red". Yes, this was a poor decision in retrospect. We were buried on page 23,712 of the search results. The concept that was emerging around this identity-aware publishing was that of "a matrix of inter-connected thought streams", since we didn't have a concept of "people" and "friends". All were just connected "channels" with different ways to connect. So "Redmatrix" was chosen to give it a searchable name. It had nothing to do with the Matrix film and red and blue pills, though that is frequently cited (erronously); and in fact isn't a bad analogy. - -The concept of identity-aware content was alien to anything that existed previously on the web, so to make it useful we had to provide the ability to use it for content. It needed content publishing tools. This brought back concepts from the old "Content Management System" on which the software was originally based. To get it up and running quickly we created a markup language for webpages called "Comanche" which let you describe a page in high-level terms based on bbcode tags. We also added WebDAV so you could put decentralised access control on files and drag/drop from your operating system. So now you could have private photos, webpages, files, events, conversations, chatrooms - and they are visible to those you choose - no matter what site they use. All they need is zot. And your viewers could move to another site or just pop up at a different site any time they want and we don't care. And it **also** had a built-in social network; with lots of additional privacy and encryption features which were added even before the Snowden revelations gave them added urgency. - -Over time a few federation components re-emerged. The ability to view RSS feeds was important to many people. Diaspora never really managed to re-write their protocol, so that was re-implemented and allowed Redmatrix to connect with Diaspora and Friendica again (Friendica still had their Diaspora protocol intact, so this was the most common language now remaining on the free web - despite its faults). Diaspora communications aren't able to make use of the advanced identity features, but they work for basic communications. - - -##Hubzilla - -The Redmatrix project reached a point of stagnation in early 2015 as network growth leveled and active interest in the project declined. Mike met with several external high tech developers and innovators in a round of discussions that were called "Zotopia" in early 2015 to perform an independent review of the project and try to identify what had gone wrong and plan a route forward. The basic consensus is that the project suffered from bad marketing decisions which were compounded by mixed messages about the project goals and target audience. A "rival" project (Diaspora) was marketing itself as a Facebook competitor, but after some long discussions it was determined that Redmatrix wasn't a Facebook competitor at all, and too much emphasis was being placed on the "social network" and "anti-Facebook" features. It was a novel decentralisation platform with distributed identity and permissions, and as was pointed out, the "end user" was the wrong target market. These marketing mistakes were now identified with the project name and random sampling of various "customers" showed that none of them really had a clue about the software goals or target market segment. The mixed messages were associated with the brand identity and this was a problem. - -The Redmatrix community held a vote and the project was renamed "Hubzilla", with a renewed identity and focus - to provide software for creating and ultimately linking together unrelated community websites or "hubs" into a global community. This is in fact what we were building all along, but didn't fully recognise it. The target audience for this software as it turns out is not the members or end users, but software integrators and digital community architects and builders. These in turn will be responsible for marketing their own product (their respective online communities) to end-users or members. The software solves a real world need of linking isolated and "walled garden" community sites together into a larger cooperative. The transition from Redmatrix to Hubzilla was complex and has taken several months as we consolidated the marketing and media assets to deliver a consistent message. It is still ongoing at this time, and should be completed in Q4 2015. - -Mike stepped down as active coordinator for the project in early 2015 and turned management over to the community. He remains active as a Hubzilla developer. - -##And Then... - -In 2016, the project was re-architected to support multiple server "roles". These correspond to sub-projects which can be isolated from each other in terms of supported feature sets, but all use and support the same code-base and developers are able to work together on common features and goals. The roles primarily differ in target audience, project [governance](help/project/governance) and decision making structures, and this results in slightly different features and idealogy. They all share a common code repository. - -Those roles are: - -### Basic - -Entry level server. Supported by and governed by the Hubzilla community. Most advanced or complex features have been stripped away to ease federation with external services. It is best suited as a FOSS social network tool. - -### Standard - -The standard Hubzilla server. This provides a wide range of useful features and is supported by and governed by the Hubzilla community. It is best suited as an open source community and cloud server. - -### Pro - -This is a specially crafted server with a unique feature set. It is supported by and governed by Mike Macgirvin dba "Zotlabs". Federation with external services has been stripped away in order to support a wide range of more technically advanced and complex features; and also includes features and modes which may not have the support or backing of the Hubzilla open source community. It is best suited for business and workplace applications. - -#include doc/macros/main_footer.bb; diff --git a/doc/project/toc.html b/doc/project/toc.html index b9489de3d..e264e014d 100644 --- a/doc/project/toc.html +++ b/doc/project/toc.html @@ -1,6 +1,5 @@ <h3>Project Information</h3> <ul> <li><a href="help/project/governance">Project Governance</a></li> -<li><a href="help/project/history">Project History</a></li> <li><a href="help/project/versions">Versions and Versioning</a></li> </ul> diff --git a/doc/sv/main.bb b/doc/sv/main.bb index 27a7a742e..1c6ad3f63 100644 --- a/doc/sv/main.bb +++ b/doc/sv/main.bb @@ -43,7 +43,6 @@ Zot är en fantastisk ny kommunikationsprotokoll uppfunnit speciellt för $Proje [zrl=[baseurl]/help/faq_admins]FAQ For Admins[/zrl]
[h3]Teknisk dokumentation[/h3]
-[zrl=[baseurl]/help/project/history]$Projectname history[/zrl]
[zrl=[baseurl]/help/Zot---A-High-Level-Overview]A high level overview of Zot[/zrl]
[zrl=[baseurl]/help/zot]An introduction to Zot[/zrl]
[zrl=[baseurl]/help/zot_structures]Zot Stuctures[/zrl]
diff --git a/doc/toc.html b/doc/toc.html index ac21959cf..047032437 100644 --- a/doc/toc.html +++ b/doc/toc.html @@ -1,6 +1,427 @@ -<ul> -<li><a href="help/general">Project/Site Information</a></li> -<li><a href="help/members">For Members</a></li> -<li><a href="help/admins">For Administrators</a></li> -<li><a href="help/develop">For Developers</a></li> -</ul> +<style> + #accordion .glyphicon { margin-right:10px; } + .panel-collapse>.list-group .list-group-item:first-child {border-top-right-radius: 0;border-top-left-radius: 0;} + .panel-collapse>.list-group .list-group-item {border-width: 1px 0;} + .panel-collapse>.list-group {margin-bottom: 0;} + .panel-collapse .list-group-item {border-radius:0;} + + .doco-list-group-item { + padding-left: 15px; + } + .doco-list-group-item > a { + font-weight: bold; + font-size: 1.1em; + } + + #doco-content h1 { + border-bottom: #cccccc thin solid; + padding-bottom: 0.3em; + } + + #doco-content > h1, + #doco-content > h2, + #doco-content > h3, + #doco-content > h4 { + padding-top: 60px; + margin-top: -60px; + } + + #region_1 .widget ul ul { + list-style-type: none; + padding-left: 15px; + } + + .toc-content { + background-color: white; + border-left: #cccccc 2px solid; + margin-left: 10px; + } +</style> + +<div class="panel-group" id="accordion"> + <div class="panel"> + <div class="panel-heading"> + <h4 class="panel-title"> + <a data-toggle="collapse" data-parent="#accordion" href="#about"> + About</a> + </h4> + </div> + <div id="about" class="panel-collapse collapse in"> + <ul class="list-group"> + <li class="doco-list-group-item"><a href="/help/about/about_hubzilla">Hubzilla project</a></li> + <li class="doco-list-group-item"><a href="/help/about/about_hub">About this hub</a></li> + </ul> + </div> + </div> + <div class="panel"> + <div class="panel-heading"> + <h4 class="panel-title"> + <a data-toggle="collapse" data-parent="#accordion" href="#members"> + Members</a> + </h4> + </div> + <div id="members" class="panel-collapse collapse in"> + <ul class="list-group"> + <li class="doco-list-group-item"><a href="/help/member/member_guide">Guide</a></li> + <li class="doco-list-group-item"><a href="/help/member/member_faq">FAQ</a></li> + </ul> + </div> + </div> + <div class="panel"> + <div class="panel-heading"> + <h4 class="panel-title"> + <a data-toggle="collapse" data-parent="#accordion" href="#administrators"> + Administrators</a> + </h4> + </div> + <div id="administrators" class="panel-collapse collapse in"> + <ul class="list-group"> + <li class="doco-list-group-item"><a href="/help/admin/administrator_guide">Guide</a></li> + </ul> + </div> + </div> + <div class="panel"> + <div class="panel-heading"> + <h4 class="panel-title"> + <a data-toggle="collapse" data-parent="#accordion" href="#developers"> + Developers</a> + </h4> + </div> + <div id="developers" class="panel-collapse collapse in"> + <ul class="list-group"> + <li class="doco-list-group-item"><a href="/help/developer/developer_guide">Guide</a></li> + </ul> + </div> + </div> + <div class="panel"> + <div class="panel-heading"> + <h4 class="panel-title"> + <a data-toggle="collapse" data-parent="#accordion" href="#tutorials"> + Tutorials</a> + </h4> + </div> + <div id="tutorials" class="panel-collapse collapse in"> + <ul class="list-group"> + <li class="doco-list-group-item"><a href="/help/tutorials/personal_channel">Personal Channel</a></li> + </ul> + </div> + </div> +</div> + +<script> +// Sticky Plugin v1.0.4 for jQuery +// ============= +// Author: Anthony Garand +// Improvements by German M. Bravo (Kronuz) and Ruud Kamphuis (ruudk) +// Improvements by Leonardo C. Daronco (daronco) +// Created: 02/14/2011 +// Date: 07/20/2015 +// Website: http://stickyjs.com/ +// Description: Makes an element on the page stick on the screen as you scroll +// It will only set the 'top' and 'position' of your element, you +// might need to adjust the width in some cases. + +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof module === 'object' && module.exports) { + // Node/CommonJS + module.exports = factory(require('jquery')); + } else { + // Browser globals + factory(jQuery); + } +}(function ($) { + var slice = Array.prototype.slice; // save ref to original slice() + var splice = Array.prototype.splice; // save ref to original slice() + + var defaults = { + topSpacing: 0, + bottomSpacing: 0, + className: 'is-sticky', + wrapperClassName: 'sticky-wrapper', + center: false, + getWidthFrom: '', + widthFromWrapper: true, // works only when .getWidthFrom is empty + responsiveWidth: false, + zIndex: 'auto' + }, + $window = $(window), + $document = $(document), + sticked = [], + windowHeight = $window.height(), + scroller = function() { + var scrollTop = $window.scrollTop(), + documentHeight = $document.height(), + dwh = documentHeight - windowHeight, + extra = (scrollTop > dwh) ? dwh - scrollTop : 0; + + for (var i = 0, l = sticked.length; i < l; i++) { + var s = sticked[i], + elementTop = s.stickyWrapper.offset().top, + etse = elementTop - s.topSpacing - extra; + + //update height in case of dynamic content + s.stickyWrapper.css('height', s.stickyElement.outerHeight()); + + if (scrollTop <= etse) { + if (s.currentTop !== null) { + s.stickyElement + .css({ + 'width': '', + 'position': '', + 'top': '', + 'z-index': '' + }); + s.stickyElement.parent().removeClass(s.className); + s.stickyElement.trigger('sticky-end', [s]); + s.currentTop = null; + } + } + else { + var newTop = documentHeight - s.stickyElement.outerHeight() + - s.topSpacing - s.bottomSpacing - scrollTop - extra; + if (newTop < 0) { + newTop = newTop + s.topSpacing; + } else { + newTop = s.topSpacing; + } + if (s.currentTop !== newTop) { + var newWidth; + if (s.getWidthFrom) { + newWidth = $(s.getWidthFrom).width() || null; + } else if (s.widthFromWrapper) { + newWidth = s.stickyWrapper.width(); + } + if (newWidth == null) { + newWidth = s.stickyElement.width(); + } + s.stickyElement + .css('width', newWidth) + .css('position', 'fixed') + .css('top', newTop) + .css('z-index', s.zIndex); + + s.stickyElement.parent().addClass(s.className); + + if (s.currentTop === null) { + s.stickyElement.trigger('sticky-start', [s]); + } else { + // sticky is started but it have to be repositioned + s.stickyElement.trigger('sticky-update', [s]); + } + + if (s.currentTop === s.topSpacing && s.currentTop > newTop || s.currentTop === null && newTop < s.topSpacing) { + // just reached bottom || just started to stick but bottom is already reached + s.stickyElement.trigger('sticky-bottom-reached', [s]); + } else if(s.currentTop !== null && newTop === s.topSpacing && s.currentTop < newTop) { + // sticky is started && sticked at topSpacing && overflowing from top just finished + s.stickyElement.trigger('sticky-bottom-unreached', [s]); + } + + s.currentTop = newTop; + } + + // Check if sticky has reached end of container and stop sticking + var stickyWrapperContainer = s.stickyWrapper.parent(); + var unstick = (s.stickyElement.offset().top + s.stickyElement.outerHeight() >= stickyWrapperContainer.offset().top + stickyWrapperContainer.outerHeight()) && (s.stickyElement.offset().top <= s.topSpacing); + + if( unstick ) { + s.stickyElement + .css('position', 'absolute') + .css('top', '') + .css('bottom', 0) + .css('z-index', ''); + } else { + s.stickyElement + .css('position', 'fixed') + .css('top', newTop) + .css('bottom', '') + .css('z-index', s.zIndex); + } + } + } + }, + resizer = function() { + windowHeight = $window.height(); + + for (var i = 0, l = sticked.length; i < l; i++) { + var s = sticked[i]; + var newWidth = null; + if (s.getWidthFrom) { + if (s.responsiveWidth) { + newWidth = $(s.getWidthFrom).width(); + } + } else if(s.widthFromWrapper) { + newWidth = s.stickyWrapper.width(); + } + if (newWidth != null) { + s.stickyElement.css('width', newWidth); + } + } + }, + methods = { + init: function(options) { + return this.each(function() { + var o = $.extend({}, defaults, options); + var stickyElement = $(this); + + var stickyId = stickyElement.attr('id'); + var wrapperId = stickyId ? stickyId + '-' + defaults.wrapperClassName : defaults.wrapperClassName; + var wrapper = $('<div></div>') + .attr('id', wrapperId) + .addClass(o.wrapperClassName); + + stickyElement.wrapAll(function() { + if ($(this).parent("#" + wrapperId).length == 0) { + return wrapper; + } +}); + + var stickyWrapper = stickyElement.parent(); + + if (o.center) { + stickyWrapper.css({width:stickyElement.outerWidth(),marginLeft:"auto",marginRight:"auto"}); + } + + if (stickyElement.css("float") === "right") { + stickyElement.css({"float":"none"}).parent().css({"float":"right"}); + } + + o.stickyElement = stickyElement; + o.stickyWrapper = stickyWrapper; + o.currentTop = null; + + sticked.push(o); + + methods.setWrapperHeight(this); + methods.setupChangeListeners(this); + }); + }, + + setWrapperHeight: function(stickyElement) { + var element = $(stickyElement); + var stickyWrapper = element.parent(); + if (stickyWrapper) { + stickyWrapper.css('height', element.outerHeight()); + } + }, + + setupChangeListeners: function(stickyElement) { + if (window.MutationObserver) { + var mutationObserver = new window.MutationObserver(function(mutations) { + if (mutations[0].addedNodes.length || mutations[0].removedNodes.length) { + methods.setWrapperHeight(stickyElement); + } + }); + mutationObserver.observe(stickyElement, {subtree: true, childList: true}); + } else { + if (window.addEventListener) { + stickyElement.addEventListener('DOMNodeInserted', function() { + methods.setWrapperHeight(stickyElement); + }, false); + stickyElement.addEventListener('DOMNodeRemoved', function() { + methods.setWrapperHeight(stickyElement); + }, false); + } else if (window.attachEvent) { + stickyElement.attachEvent('onDOMNodeInserted', function() { + methods.setWrapperHeight(stickyElement); + }); + stickyElement.attachEvent('onDOMNodeRemoved', function() { + methods.setWrapperHeight(stickyElement); + }); + } + } + }, + update: scroller, + unstick: function(options) { + return this.each(function() { + var that = this; + var unstickyElement = $(that); + + var removeIdx = -1; + var i = sticked.length; + while (i-- > 0) { + if (sticked[i].stickyElement.get(0) === that) { + splice.call(sticked,i,1); + removeIdx = i; + } + } + if(removeIdx !== -1) { + unstickyElement.unwrap(); + unstickyElement + .css({ + 'width': '', + 'position': '', + 'top': '', + 'float': '', + 'z-index': '' + }) + ; + } + }); + } + }; + + // should be more efficient than using $window.scroll(scroller) and $window.resize(resizer): + if (window.addEventListener) { + window.addEventListener('scroll', scroller, false); + window.addEventListener('resize', resizer, false); + } else if (window.attachEvent) { + window.attachEvent('onscroll', scroller); + window.attachEvent('onresize', resizer); + } + + $.fn.sticky = function(method) { + if (methods[method]) { + return methods[method].apply(this, slice.call(arguments, 1)); + } else if (typeof method === 'object' || !method ) { + return methods.init.apply( this, arguments ); + } else { + $.error('Method ' + method + ' does not exist on jQuery.sticky'); + } + }; + + $.fn.unstick = function(method) { + if (methods[method]) { + return methods[method].apply(this, slice.call(arguments, 1)); + } else if (typeof method === 'object' || !method ) { + return methods.unstick.apply( this, arguments ); + } else { + $.error('Method ' + method + ' does not exist on jQuery.sticky'); + } + }; + $(function() { + setTimeout(scroller, 0); + }); +})); + +</script> + +<script> + + // Generate the table of contents in the side nav menu (see view/tpl/help.tpl) + $(document).ready(function () { + + $(".panel-collapse.in").find('a').each(function(){ + window.console.log($(this).attr('href')); + var url = document.createElement('a'); + url.href = window.location; + var pageName = url.href.split('/').pop().split('#').shift(); + window.console.log('pageName: ' + pageName); + var linkName = $(this).attr('href').split('/').pop(); + window.console.log('linkName: ' + linkName); + if(pageName === linkName) { + var tocUl = $(this).closest('li').append('<ul>').find('ul'); + tocUl.removeClass(); // Classes are automatically added to <ul> elements by something else + tocUl.toc({content: "#doco-content", headings: "h1,h2"}); + tocUl.addClass('toc-content'); + tocUl.sticky({topSpacing:$('nav').outerHeight(true), zIndex: 1000}); + } + }); + + //$('#accordion').sticky({topSpacing:$('nav').outerHeight(true)}); + }); + +</script> diff --git a/doc/tutorials/assets/0965ace945f0c95ae38aa5bfedd230d2a7233d3915ac15d629f9dd845854.png b/doc/tutorials/assets/0965ace945f0c95ae38aa5bfedd230d2a7233d3915ac15d629f9dd845854.png Binary files differnew file mode 100644 index 000000000..d5cf1093f --- /dev/null +++ b/doc/tutorials/assets/0965ace945f0c95ae38aa5bfedd230d2a7233d3915ac15d629f9dd845854.png diff --git a/doc/tutorials/assets/1ebe02c205962dd25035c441631745d16acdb7a44e50d148256c8ad26a67.png b/doc/tutorials/assets/1ebe02c205962dd25035c441631745d16acdb7a44e50d148256c8ad26a67.png Binary files differnew file mode 100644 index 000000000..d613925aa --- /dev/null +++ b/doc/tutorials/assets/1ebe02c205962dd25035c441631745d16acdb7a44e50d148256c8ad26a67.png diff --git a/doc/tutorials/assets/2243e48ccea25bd907cce3dbd6fc9f7cd832a4c91a4c5dd294b7b219e7d8.png b/doc/tutorials/assets/2243e48ccea25bd907cce3dbd6fc9f7cd832a4c91a4c5dd294b7b219e7d8.png Binary files differnew file mode 100644 index 000000000..c403bf806 --- /dev/null +++ b/doc/tutorials/assets/2243e48ccea25bd907cce3dbd6fc9f7cd832a4c91a4c5dd294b7b219e7d8.png diff --git a/doc/tutorials/assets/25eaad2435200f72a1dd3a00ba17a76ca6db4c246b3c4fa286b390cae7c8.png b/doc/tutorials/assets/25eaad2435200f72a1dd3a00ba17a76ca6db4c246b3c4fa286b390cae7c8.png Binary files differnew file mode 100644 index 000000000..ca8ba6fb9 --- /dev/null +++ b/doc/tutorials/assets/25eaad2435200f72a1dd3a00ba17a76ca6db4c246b3c4fa286b390cae7c8.png diff --git a/doc/tutorials/assets/2b539d5a8474d6ec6dc91155b628d9be5f99ab04a78108ec404f53ec7bb5.png b/doc/tutorials/assets/2b539d5a8474d6ec6dc91155b628d9be5f99ab04a78108ec404f53ec7bb5.png Binary files differnew file mode 100644 index 000000000..0da2d96e2 --- /dev/null +++ b/doc/tutorials/assets/2b539d5a8474d6ec6dc91155b628d9be5f99ab04a78108ec404f53ec7bb5.png diff --git a/doc/tutorials/assets/31f42a02bdbae095e0329db6c3814e2975979aff12f873f43d81724c5e61.png b/doc/tutorials/assets/31f42a02bdbae095e0329db6c3814e2975979aff12f873f43d81724c5e61.png Binary files differnew file mode 100644 index 000000000..2a209b2be --- /dev/null +++ b/doc/tutorials/assets/31f42a02bdbae095e0329db6c3814e2975979aff12f873f43d81724c5e61.png diff --git a/doc/tutorials/assets/324247680b605fd214fd61aecd8f216fa8f5dfa0f16a04c8e968fdbc43d0.png b/doc/tutorials/assets/324247680b605fd214fd61aecd8f216fa8f5dfa0f16a04c8e968fdbc43d0.png Binary files differnew file mode 100644 index 000000000..f992672b0 --- /dev/null +++ b/doc/tutorials/assets/324247680b605fd214fd61aecd8f216fa8f5dfa0f16a04c8e968fdbc43d0.png diff --git a/doc/tutorials/assets/3656a67dce40a1fc2515e9089217f2e136d4fcf8babe77bac00ecaad43ce.png b/doc/tutorials/assets/3656a67dce40a1fc2515e9089217f2e136d4fcf8babe77bac00ecaad43ce.png Binary files differnew file mode 100644 index 000000000..b656192dc --- /dev/null +++ b/doc/tutorials/assets/3656a67dce40a1fc2515e9089217f2e136d4fcf8babe77bac00ecaad43ce.png diff --git a/doc/tutorials/assets/458a842c2ea0fbe3b7869bb14dfffe1e5be098d1cd6e590bbead25b4cc05.png b/doc/tutorials/assets/458a842c2ea0fbe3b7869bb14dfffe1e5be098d1cd6e590bbead25b4cc05.png Binary files differnew file mode 100644 index 000000000..6129195b6 --- /dev/null +++ b/doc/tutorials/assets/458a842c2ea0fbe3b7869bb14dfffe1e5be098d1cd6e590bbead25b4cc05.png diff --git a/doc/tutorials/assets/4aaaf1e124514c8d6999a5fe1d07be5af460cda4ba6cde9106ebc1564bb0.png b/doc/tutorials/assets/4aaaf1e124514c8d6999a5fe1d07be5af460cda4ba6cde9106ebc1564bb0.png Binary files differnew file mode 100644 index 000000000..923403fe9 --- /dev/null +++ b/doc/tutorials/assets/4aaaf1e124514c8d6999a5fe1d07be5af460cda4ba6cde9106ebc1564bb0.png diff --git a/doc/tutorials/assets/4cf326152797a8ecdf5630e921756f825ee00f8ee464d3ef9fed971d2852.png b/doc/tutorials/assets/4cf326152797a8ecdf5630e921756f825ee00f8ee464d3ef9fed971d2852.png Binary files differnew file mode 100644 index 000000000..f158ad5d9 --- /dev/null +++ b/doc/tutorials/assets/4cf326152797a8ecdf5630e921756f825ee00f8ee464d3ef9fed971d2852.png diff --git a/doc/tutorials/assets/75d2927b7ad0d2043d4d3b6ba1364fac8ead173edd39340adaf78be11c9d.png b/doc/tutorials/assets/75d2927b7ad0d2043d4d3b6ba1364fac8ead173edd39340adaf78be11c9d.png Binary files differnew file mode 100644 index 000000000..edc8b01cc --- /dev/null +++ b/doc/tutorials/assets/75d2927b7ad0d2043d4d3b6ba1364fac8ead173edd39340adaf78be11c9d.png diff --git a/doc/tutorials/assets/7c976a06662a1357b3da8ed0680d1a721c85f2ae2bdd5739a8def466010e.png b/doc/tutorials/assets/7c976a06662a1357b3da8ed0680d1a721c85f2ae2bdd5739a8def466010e.png Binary files differnew file mode 100644 index 000000000..5b259058b --- /dev/null +++ b/doc/tutorials/assets/7c976a06662a1357b3da8ed0680d1a721c85f2ae2bdd5739a8def466010e.png diff --git a/doc/tutorials/assets/99a6efda4df631dfb2d2a849412044cc6a0f8aebeac289d28786f2649d24.png b/doc/tutorials/assets/99a6efda4df631dfb2d2a849412044cc6a0f8aebeac289d28786f2649d24.png Binary files differnew file mode 100644 index 000000000..c03ffd18d --- /dev/null +++ b/doc/tutorials/assets/99a6efda4df631dfb2d2a849412044cc6a0f8aebeac289d28786f2649d24.png diff --git a/doc/tutorials/assets/9eae9fad774a4cd29e665961d35affbd053368056f562c58200fb41027b0.png b/doc/tutorials/assets/9eae9fad774a4cd29e665961d35affbd053368056f562c58200fb41027b0.png Binary files differnew file mode 100644 index 000000000..65d4c5f0a --- /dev/null +++ b/doc/tutorials/assets/9eae9fad774a4cd29e665961d35affbd053368056f562c58200fb41027b0.png diff --git a/doc/tutorials/assets/b0bfdf02aef3710a37bb6092c3240b291eca8afa73133b3ac03b86f3302d.png b/doc/tutorials/assets/b0bfdf02aef3710a37bb6092c3240b291eca8afa73133b3ac03b86f3302d.png Binary files differnew file mode 100644 index 000000000..45609a7bb --- /dev/null +++ b/doc/tutorials/assets/b0bfdf02aef3710a37bb6092c3240b291eca8afa73133b3ac03b86f3302d.png diff --git a/doc/tutorials/assets/b334915c03a665493915598c69c17a87c910a39db2cd3b5292e4623ea4c4.png b/doc/tutorials/assets/b334915c03a665493915598c69c17a87c910a39db2cd3b5292e4623ea4c4.png Binary files differnew file mode 100644 index 000000000..d239d6965 --- /dev/null +++ b/doc/tutorials/assets/b334915c03a665493915598c69c17a87c910a39db2cd3b5292e4623ea4c4.png diff --git a/doc/tutorials/assets/b3eece28e8db67f1024af42055f0f24ed5e81ba622aca8cac576ccf5930e.png b/doc/tutorials/assets/b3eece28e8db67f1024af42055f0f24ed5e81ba622aca8cac576ccf5930e.png Binary files differnew file mode 100644 index 000000000..45ed64d00 --- /dev/null +++ b/doc/tutorials/assets/b3eece28e8db67f1024af42055f0f24ed5e81ba622aca8cac576ccf5930e.png diff --git a/doc/tutorials/assets/bdbcf0ffd9004657237f6b7b7863da5a8e39a5bc17d2c67fa160efef2056.png b/doc/tutorials/assets/bdbcf0ffd9004657237f6b7b7863da5a8e39a5bc17d2c67fa160efef2056.png Binary files differnew file mode 100644 index 000000000..fcaed8bef --- /dev/null +++ b/doc/tutorials/assets/bdbcf0ffd9004657237f6b7b7863da5a8e39a5bc17d2c67fa160efef2056.png diff --git a/doc/tutorials/assets/c4cad3e4c356dd2a227df79bd4dc6d47edf1b66ea243f005b6b452ec366b.png b/doc/tutorials/assets/c4cad3e4c356dd2a227df79bd4dc6d47edf1b66ea243f005b6b452ec366b.png Binary files differnew file mode 100644 index 000000000..0ccfc8995 --- /dev/null +++ b/doc/tutorials/assets/c4cad3e4c356dd2a227df79bd4dc6d47edf1b66ea243f005b6b452ec366b.png diff --git a/doc/tutorials/assets/c9a880cc82ffa1f7c2f460397bb083bf7dc2a2b8f065e64da598b45b4a2b.png b/doc/tutorials/assets/c9a880cc82ffa1f7c2f460397bb083bf7dc2a2b8f065e64da598b45b4a2b.png Binary files differnew file mode 100644 index 000000000..1cb4d2d22 --- /dev/null +++ b/doc/tutorials/assets/c9a880cc82ffa1f7c2f460397bb083bf7dc2a2b8f065e64da598b45b4a2b.png diff --git a/doc/tutorials/assets/d080e92d797af5e863fa39b2084c16a8410de1f7a6559633435817444aef.png b/doc/tutorials/assets/d080e92d797af5e863fa39b2084c16a8410de1f7a6559633435817444aef.png Binary files differnew file mode 100644 index 000000000..22e4cb5d5 --- /dev/null +++ b/doc/tutorials/assets/d080e92d797af5e863fa39b2084c16a8410de1f7a6559633435817444aef.png diff --git a/doc/tutorials/assets/e05248fdc5688d6d24bde52432fdc7b39692a094559aa504de99352940b1.png b/doc/tutorials/assets/e05248fdc5688d6d24bde52432fdc7b39692a094559aa504de99352940b1.png Binary files differnew file mode 100644 index 000000000..5674f5207 --- /dev/null +++ b/doc/tutorials/assets/e05248fdc5688d6d24bde52432fdc7b39692a094559aa504de99352940b1.png diff --git a/doc/tutorials/assets/e5d5674a34e848e2cce90a60fc416415271d9c51b81ad2a950fb0157222a.png b/doc/tutorials/assets/e5d5674a34e848e2cce90a60fc416415271d9c51b81ad2a950fb0157222a.png Binary files differnew file mode 100644 index 000000000..e6b4a9974 --- /dev/null +++ b/doc/tutorials/assets/e5d5674a34e848e2cce90a60fc416415271d9c51b81ad2a950fb0157222a.png diff --git a/doc/tutorials/assets/ef78bc6aa3fafebd46f353514c907b3fdfe019918fc5553bb3f31388a36f.png b/doc/tutorials/assets/ef78bc6aa3fafebd46f353514c907b3fdfe019918fc5553bb3f31388a36f.png Binary files differnew file mode 100644 index 000000000..8de042ae4 --- /dev/null +++ b/doc/tutorials/assets/ef78bc6aa3fafebd46f353514c907b3fdfe019918fc5553bb3f31388a36f.png diff --git a/doc/tutorials/assets/facb0bdfdecb4c779de9048cd14b417c0d76de17af476be5f296b78d70e9.png b/doc/tutorials/assets/facb0bdfdecb4c779de9048cd14b417c0d76de17af476be5f296b78d70e9.png Binary files differnew file mode 100644 index 000000000..cec391fb4 --- /dev/null +++ b/doc/tutorials/assets/facb0bdfdecb4c779de9048cd14b417c0d76de17af476be5f296b78d70e9.png diff --git a/doc/tutorials/personal_channel.html b/doc/tutorials/personal_channel.html new file mode 100644 index 000000000..3b1fe40ba --- /dev/null +++ b/doc/tutorials/personal_channel.html @@ -0,0 +1,163 @@ + +<p>This tutorial is intended to be followed in sequence as if you were setting up a +channel for the first time. It introduces some of the tools and features related +to a personal channel in a natural way.</p> + +<h1 id="Create_a_new_channel">Create a new channel</h1> + +<p>When you log in for the first time after registering, you must create a channel. +(Alternatively you can load https://grid.reticu.li/new_channel)</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/c9a880cc82ffa1f7c2f460397bb083bf7dc2a2b8f065e64da598b45b4a2b.png" alt="image"></p> + +<p>Enter your name and a nickname for the channel address, and select a "role". +Typically if this is a personal channel that represents you, select a <strong>Social</strong> role +with a level of default privacy that you are comfortable with. If you are unsure, +select <strong>Social - Restricted</strong>.</p> + +<h1 id="Configure_your_channel_features">Configure your channel features</h1> + +<p>When your new channel is created you are directed to the channel settings page. +Take the time to look around at all the settings pages to familiarize yourself with +your options, even if you don't understand everything you see right now.</p> + +<p>Navigate to the <strong>Additional Features</strong> settings and follow the screenshots below to +enable various features. Remember to press the Submit button when you are done with +your selections.</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/3656a67dce40a1fc2515e9089217f2e136d4fcf8babe77bac00ecaad43ce.png" alt="image"><img class="img-responsive" src="/help/tutorials/assets/4aaaf1e124514c8d6999a5fe1d07be5af460cda4ba6cde9106ebc1564bb0.png" alt="image"><img class="img-responsive" src="/help/tutorials/assets/99a6efda4df631dfb2d2a849412044cc6a0f8aebeac289d28786f2649d24.png" alt="image"><img class="img-responsive" src="/help/tutorials/assets/e5d5674a34e848e2cce90a60fc416415271d9c51b81ad2a950fb0157222a.png" alt="image"></p> + +<h1 id="Add_a_profile_photo">Add a profile photo</h1> + +<p>Navigate to your channel home by clicking the "Home" icon on the left side of the +navbar, and then select the <strong>About</strong> tab to view your profile.</p> + +<p>Press the <strong>Edit</strong> button on the right to edit your profile information.</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/2243e48ccea25bd907cce3dbd6fc9f7cd832a4c91a4c5dd294b7b219e7d8.png" alt="image"></p> + +<p>From the <strong>Profile Tools</strong> dropdown menu, select the <strong>Change profile photo</strong></p> + +<p><img class="img-responsive" src="/help/tutorials/assets/31f42a02bdbae095e0329db6c3814e2975979aff12f873f43d81724c5e61.png" alt="image"></p> + +<p>Upload your photo and size as necessary using the image editor.</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/458a842c2ea0fbe3b7869bb14dfffe1e5be098d1cd6e590bbead25b4cc05.png" alt="image"></p> + +<p>When you press <strong>Submit</strong> you will be redirected back to the profile editor. +(You might need to clear your browser cache if you have trouble seeing the new photo.)</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/d080e92d797af5e863fa39b2084c16a8410de1f7a6559633435817444aef.png" alt="image"></p> + +<p>Returning to your channel home page you will see that a post notifying others of your new +profile pic has been automatically posted.</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/1ebe02c205962dd25035c441631745d16acdb7a44e50d148256c8ad26a67.png" alt="image"></p> + +<h1 id="Compose_a_post">Compose a post</h1> + +<p>Go to your channel home and open the post editor by pressing the <strong>Share</strong> textbox +at the top of the channel "wall". Enter a message, and then drag-and-drop an image +file into the post editor text area (alternatively you can use the <strong>Attach file</strong> +tool at the bottom).</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/b0bfdf02aef3710a37bb6092c3240b291eca8afa73133b3ac03b86f3302d.png" alt="image"></p> + +<p>Your image file will be automatically uploaded and stored in your cloud files, and +a link will appear in the post window. Pressing the post preview button will allow you to preview your post before publishing it.</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/7c976a06662a1357b3da8ed0680d1a721c85f2ae2bdd5739a8def466010e.png" alt="image"></p> + +<p>Pressing the lock button near the Submit button will open the <strong>Access Control List</strong> +so you can specify exactly who can access this post.</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/2b539d5a8474d6ec6dc91155b628d9be5f99ab04a78108ec404f53ec7bb5.png" alt="image"></p> + +<h1 id="Use_an_uploaded_image_as_a_channel_cover_photo">Use an uploaded image as a channel cover photo</h1> + +<p>One way to add some pizzazz your channel is to add a cover photo that visitors will +see when they load your channel page. Hubzilla's integrated cloud file system +allows you to choose an existing photo for this purpose.</p> + +<p>Visit your photos in the <strong>Photos</strong> app</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/0965ace945f0c95ae38aa5bfedd230d2a7233d3915ac15d629f9dd845854.png" alt="image"></p> + +<p>Select the photo you wish to use and select <strong>Use as cover photo</strong> from the <strong>Photo Tools</strong> +dropdown menu.</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/9eae9fad774a4cd29e665961d35affbd053368056f562c58200fb41027b0.png" alt="image"></p> + +<p>Crop the image using the photo editor and save your changes.</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/b3eece28e8db67f1024af42055f0f24ed5e81ba622aca8cac576ccf5930e.png" alt="image"></p> + +<p>When you load your channel home page, you will first see the cover photo, and your +channel page will fade in as you scroll down.</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/4cf326152797a8ecdf5630e921756f825ee00f8ee464d3ef9fed971d2852.png" alt="image"></p> + +<h1 id="Make_a_connection">Make a connection</h1> + +<p>Making connections between channels to share things is what Hubzilla is all about. +Making a connection is simple. If you do not already know how to reach a channel's home +page, you might try a directory search by opening the <strong>Directory</strong> link on the right +side of the top navbar.</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/ef78bc6aa3fafebd46f353514c907b3fdfe019918fc5553bb3f31388a36f.png" alt="image"></p> + +<p>You can connect directly from the directory entry using the <strong>Connect</strong> button there, +or you can open the channel page first and press the <strong>Connect</strong> button below the +profile photo.</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/75d2927b7ad0d2043d4d3b6ba1364fac8ead173edd39340adaf78be11c9d.png" alt="image"></p> + +<p>After you connect you are immediately taken to the connection editor page, where +you make some important decisions about what you plan to share with this channel.</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/b334915c03a665493915598c69c17a87c910a39db2cd3b5292e4623ea4c4.png" alt="image"></p> + +<p>The two important settings are</p> + +<ul><li>The individual permissions for the newly connected channel</li> +<li>The privacy group(s) the connection is a member of</li> +</ul><p>The individual permissions are mostly straightforward, but they can be slightly +unclear at first. For example, <strong>Can view my file storage and photos</strong> does <em>not</em> +mean that the connected channel will be able to view <em>all</em> of your photos and files! +It means that you will have the <em>option</em> to share photos and files with that +channel. It is perfectly possible for you to allow someone to read your posts but +disallow them from seeing photos in that post. This kind of unusual situation is, +as they say, not a bug; it is a feature.</p> + +<p>Privacy groups allow you to conveniently share items with groups of people. You can +create whatever groups fit your needs by opening the <strong>Add privacy group</strong> link.</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/facb0bdfdecb4c779de9048cd14b417c0d76de17af476be5f296b78d70e9.png" alt="image"></p> + +<p>In this editor, you can switch between the existing privacy groups and see at a +glance what channels are and are not members of the group. Selecting the icon of +a channel in either box will move it to the in or out of the group.</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/25eaad2435200f72a1dd3a00ba17a76ca6db4c246b3c4fa286b390cae7c8.png" alt="image"></p> + +<p>When editing an individual channel's settings, you can set their privacy group +membership using the widget on the left:</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/bdbcf0ffd9004657237f6b7b7863da5a8e39a5bc17d2c67fa160efef2056.png" alt="image"></p> + +<p>Connections are a mutual engagement. The channel you connect can <em>choose</em> to approve your +connection. They will receive a notification that you connected</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/324247680b605fd214fd61aecd8f216fa8f5dfa0f16a04c8e968fdbc43d0.png" alt="image"></p> + +<p>which takes them to their <a href="https://grid.reticu.li/connections"><strong>Connections</strong></a> editor page where +they can choose to approve the connection or not.</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/e05248fdc5688d6d24bde52432fdc7b39692a094559aa504de99352940b1.png" alt="image"></p> + +<p>After you approve a connection, it is a good idea to open the individual connection +editor by pressing the edit button beside the <strong>Delete</strong> button.</p> + +<p><img class="img-responsive" src="/help/tutorials/assets/c4cad3e4c356dd2a227df79bd4dc6d47edf1b66ea243f005b6b452ec366b.png" alt="image"></p> + +
\ No newline at end of file diff --git a/include/api_zot.php b/include/api_zot.php index 60cb288af..256339bad 100644 --- a/include/api_zot.php +++ b/include/api_zot.php @@ -28,8 +28,8 @@ api_register_func('api/z/1.0/group','api_group', true); api_register_func('api/red/xchan','api_red_xchan',true); api_register_func('api/z/1.0/xchan','api_red_xchan',true); - api_register_func('api/red/item/new','red_item_new', true); - api_register_func('api/z/1.0/item/new','red_item_new', true); + api_register_func('api/red/item/update','zot_item_update', true); + api_register_func('api/z/1.0/item/update','zot_item_update', true); api_register_func('api/red/item/full','red_item', true); api_register_func('api/z/1.0/item/full','red_item', true); @@ -266,7 +266,7 @@ require_once('include/hubloc.php'); if($_SERVER['REQUEST_METHOD'] === 'POST') { - $r = xchan_store($_REQUEST); + // $r = xchan_store($_REQUEST); } $r = xchan_fetch($_REQUEST); json_return_and_die($r); @@ -341,15 +341,15 @@ } - function red_item_new($type) { + function zot_item_update($type) { if (api_user() === false) { - logger('api_red_item_new: no user'); + logger('api_red_item_store: no user'); return false; } - logger('api_red_item_new: REQUEST ' . print_r($_REQUEST,true)); - logger('api_red_item_new: FILES ' . print_r($_FILES,true)); + logger('api_red_item_store: REQUEST ' . print_r($_REQUEST,true)); + logger('api_red_item_store: FILES ' . print_r($_FILES,true)); // set this so that the item_post() function is quiet and doesn't redirect or emit json @@ -360,11 +360,10 @@ if(x($_FILES,'media')) { $_FILES['userfile'] = $_FILES['media']; // upload the image if we have one - $_REQUEST['silent']='1'; //tell wall_upload function to return img info instead of echo - $mod = new Zotlabs\Module\Wall_upload(); + $mod = new Zotlabs\Module\Wall_attach(); $media = $mod->post(); - if(strlen($media)>0) - $_REQUEST['body'] .= "\n\n".$media; + if($media) + $_REQUEST['body'] .= "\n\n" . $media; } $mod = new Zotlabs\Module\Item(); diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php index da02d6cac..e6c97a750 100644 --- a/include/bb2diaspora.php +++ b/include/bb2diaspora.php @@ -427,6 +427,12 @@ function bb2diaspora($Text,$preserve_nl = false, $fordiaspora = true) { $Text = preg_replace_callback('/\@\!?\[([zu])rl\=(\w+.*?)\](\w+.*?)\[\/([zu])rl\]/i', 'bb2dmention_callback', $Text); + // strip map tags, as the rendering is performed in bbcode() and the resulting output + // is not compatible with Diaspora (at least in the case of openstreetmap and probably + // due to the inclusion of an html iframe) + + $Text = preg_replace("/\[map\=(.*?)\]/ism", '$1', $Text); + $Text = preg_replace("/\[map\](.*?)\[\/map\]/ism", '$1', $Text); // Converting images with size parameters to simple images. Markdown doesn't know it. $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $Text); diff --git a/include/bbcode.php b/include/bbcode.php index 21bc6de77..6794fca96 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -512,10 +512,10 @@ function bb_code($match) { } function bb_highlight($match) { - if(in_array(strtolower($match[1]),['php','css','mysql','sql','abap','diff','html','perl','ruby', + $lang = ((in_array(strtolower($match[1]),['php','css','mysql','sql','abap','diff','html','perl','ruby', 'vbscript','avrc','dtd','java','xml','cpp','python','javascript','js','json','sh'])) - return text_highlight($match[2],strtolower($match[1])); - return $match[0]; + ? strtolower($match[1]) : 'php' ); + return text_highlight($match[2],$lang); } function bb_fixtable_lf($match) { @@ -529,7 +529,49 @@ function bb_fixtable_lf($match) { } +function parseIdentityAwareHTML($Text) { + + // process [observer] tags before we do anything else because we might + // be stripping away stuff that then doesn't need to be worked on anymore + $observer = App::get_observer(); + + if ((strpos($Text,'[/observer]') !== false) || (strpos($Text,'[/rpost]') !== false)) { + if ($observer) { + $Text = preg_replace("/\[observer\=1\](.*?)\[\/observer\]/ism", '$1', $Text); + $Text = preg_replace("/\[observer\=0\].*?\[\/observer\]/ism", '', $Text); + $Text = preg_replace_callback("/\[rpost(=(.*?))?\](.*?)\[\/rpost\]/ism", 'rpost_callback', $Text); + } else { + $Text = preg_replace("/\[observer\=1\].*?\[\/observer\]/ism", '', $Text); + $Text = preg_replace("/\[observer\=0\](.*?)\[\/observer\]/ism", '$1', $Text); + $Text = preg_replace("/\[rpost(=.*?)?\](.*?)\[\/rpost\]/ism", '', $Text); + } + } + // replace [observer.baseurl] + if ($observer) { + $s1 = '<span class="bb_observer" title="' . t('Different viewers will see this text differently') . '">'; + $s2 = '</span>'; + $obsBaseURL = $observer['xchan_connurl']; + $obsBaseURL = preg_replace("/\/poco\/.*$/", '', $obsBaseURL); + $Text = str_replace('[observer.baseurl]', $obsBaseURL, $Text); + $Text = str_replace('[observer.url]',$observer['xchan_url'], $Text); + $Text = str_replace('[observer.name]',$s1 . $observer['xchan_name'] . $s2, $Text); + $Text = str_replace('[observer.address]',$s1 . $observer['xchan_addr'] . $s2, $Text); + $Text = str_replace('[observer.webname]', substr($observer['xchan_addr'],0,strpos($observer['xchan_addr'],'@')), $Text); + $Text = str_replace('[observer.photo]',$s1 . '[zmg]'.$observer['xchan_photo_l'].'[/zmg]' . $s2, $Text); + } else { + $Text = str_replace('[observer.baseurl]', '', $Text); + $Text = str_replace('[observer.url]','', $Text); + $Text = str_replace('[observer.name]','', $Text); + $Text = str_replace('[observer.address]','', $Text); + $Text = str_replace('[observer.webname]','',$Text); + $Text = str_replace('[observer.photo]','', $Text); + } + + $Text = str_replace(array('[baseurl]','[sitename]'),array(z_root(),get_config('system','sitename')),$Text); + + return $Text; +} // BBcode 2 HTML was written by WAY2WEB.net // extended to work with Mistpark/Friendica/Redmatrix/Hubzilla - Mike Macgirvin @@ -661,7 +703,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false) // Perform URL Search - $urlchars = '[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,\@]'; + $urlchars = '[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,\@\(\)]'; if (strpos($Text,'http') !== false) { if($tryoembed) { @@ -745,6 +787,12 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false) if (strpos($Text,'[/color]') !== false) { $Text = preg_replace("(\[color=(.*?)\](.*?)\[\/color\])ism", "<span style=\"color: $1;\">$2</span>", $Text); } + // Check for colored text + if (strpos($Text,'[/hl]') !== false) { + $Text = preg_replace("(\[hl\](.*?)\[\/hl\])ism", "<span style=\"background-color: yellow;\">$1</span>", $Text); + $Text = preg_replace("(\[hl=(.*?)\](.*?)\[\/hl\])ism", "<span style=\"background-color: $1;\">$2</span>", $Text); + } + // Check for sized text // [size=50] --> font-size: 50px (with the unit). if (strpos($Text,'[/size]') !== false) { diff --git a/include/conversation.php b/include/conversation.php index c260eb4a0..0f61eea27 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -363,7 +363,7 @@ function localize_item(&$item){ if(intval($item['item_obscured']) && strlen($item['body']) && (! strpos($item['body'],'data'))) { - $item['body'] = json_encode(crypto_encapsulate($item['body'],get_config('system','pubkey'))); + $item['body'] = z_obscure($item['body']); } } @@ -1752,7 +1752,7 @@ function profile_tabs($a, $is_owner = false, $nickname = null){ if(feature_enabled($uid,'wiki') && (get_account_techlevel($account_id) > 3)) { $tabs[] = array( - 'label' => t('Wiki'), + 'label' => t('Wikis'), 'url' => z_root() . '/wiki/' . $nickname, 'sel' => ((argv(0) == 'wiki') ? 'active' : ''), 'title' => t('Wiki'), diff --git a/include/crypto.php b/include/crypto.php index bc798d919..f75390985 100644 --- a/include/crypto.php +++ b/include/crypto.php @@ -48,27 +48,122 @@ function pkcs5_unpad($text) function AES256CBC_encrypt($data,$key,$iv) { return openssl_encrypt($data,'aes-256-cbc',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0")); - } function AES256CBC_decrypt($data,$key,$iv) { return openssl_decrypt($data,'aes-256-cbc',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0")); +} + +function AES128CBC_encrypt($data,$key,$iv) { + $key = substr($key,0,16); + $iv = substr($iv,0,16); + return openssl_encrypt($data,'aes-128-cbc',str_pad($key,16,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0")); +} + +function AES128CBC_decrypt($data,$key,$iv) { + $key = substr($key,0,16); + $iv = substr($iv,0,16); + return openssl_decrypt($data,'aes-128-cbc',str_pad($key,16,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0")); +} + +function STD_encrypt($data,$key,$iv) { + $key = substr($key,0,32); + $iv = substr($iv,0,16); + return openssl_encrypt($data,'aes-256-cbc',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0")); +} + +function STD_decrypt($data,$key,$iv) { + $key = substr($key,0,32); + $iv = substr($iv,0,16); + return openssl_decrypt($data,'aes-256-cbc',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0")); +} +function CAST5CBC_encrypt($data,$key,$iv) { + $key = substr($key,0,16); + $iv = substr($iv,0,8); + return openssl_encrypt($data,'cast5-cbc',str_pad($key,16,"\0"),OPENSSL_RAW_DATA,str_pad($iv,8,"\0")); +} + +function CAST5CBC_decrypt($data,$key,$iv) { + $key = substr($key,0,16); + $iv = substr($iv,0,8); + return openssl_decrypt($data,'cast5-cbc',str_pad($key,16,"\0"),OPENSSL_RAW_DATA,str_pad($iv,8,"\0")); } function crypto_encapsulate($data,$pubkey,$alg='aes256cbc') { + $fn = strtoupper($alg) . '_encrypt'; + if($alg === 'aes256cbc') return aes_encapsulate($data,$pubkey); + return other_encapsulate($data,$pubkey,$alg); + +} + +function other_encapsulate($data,$pubkey,$alg) { + if(! $pubkey) + logger('no key. data: ' . $data); + + $fn = strtoupper($alg) . '_encrypt'; + if(function_exists($fn)) { + + // A bit hesitant to use openssl_random_pseudo_bytes() as we know + // it has been historically targeted by US agencies for 'weakening'. + // It is still arguably better than trying to come up with an + // alternative cryptographically secure random generator. + // There is little point in using the optional second arg to flag the + // assurance of security since it is meaningless if the source algorithms + // have been compromised. Also none of this matters if RSA has been + // compromised by state actors and evidence is mounting that this has + // already happened. + + $key = openssl_random_pseudo_bytes(256); + $iv = openssl_random_pseudo_bytes(256); + $result['data'] = base64url_encode($fn($data,$key,$iv),true); + // log the offending call so we can track it down + if(! openssl_public_encrypt($key,$k,$pubkey)) { + $x = debug_backtrace(); + logger('RSA failed. ' . print_r($x[0],true)); + } + + $result['alg'] = $alg; + $result['key'] = base64url_encode($k,true); + openssl_public_encrypt($iv,$i,$pubkey); + $result['iv'] = base64url_encode($i,true); + return $result; + } + else { + $x = [ 'data' => $data, 'pubkey' => $pubkey, 'alg' => $alg, 'result' => $data ]; + call_hooks('other_encapsulate', $x); + return $x['result']; + } +} + +function crypto_methods() { + + if(\Zotlabs\Lib\System::get_server_role() !== 'pro') + return [ 'aes256cbc' ]; + + // 'std' is the new project standard which is aes256cbc but transmits/receives 256-byte key and iv. + // aes256cbc is provided for compatibility with earlier zot implementations which assume 32-byte key and 16-byte iv. + // other_encapsulate() now produces these longer keys/ivs by default so that it is difficult to guess a + // particular implementation or choice of underlying implementations based on the key/iv length. + // The actual methods are responsible for deriving the actual key/iv from the provided parameters; + // possibly by truncation or segmentation - though many other methods could be used. + + $r = [ 'std', 'aes256cbc', 'aes128cbc', 'cast5cbc' ]; + call_hooks('crypto_methods',$r); + return $r; + } function aes_encapsulate($data,$pubkey) { if(! $pubkey) logger('aes_encapsulate: no key. data: ' . $data); - $key = random_string(32,RANDOM_STRING_TEXT); - $iv = random_string(16,RANDOM_STRING_TEXT); + $key = openssl_random_pseudo_bytes(32); + $iv = openssl_random_pseudo_bytes(16); $result['data'] = base64url_encode(AES256CBC_encrypt($data,$key,$iv),true); // log the offending call so we can track it down if(! openssl_public_encrypt($key,$k,$pubkey)) { @@ -89,6 +184,22 @@ function crypto_unencapsulate($data,$prvkey) { if($alg === 'aes256cbc') return aes_unencapsulate($data,$prvkey); + return other_unencapsulate($data,$prvkey,$alg); + +} + +function other_unencapsulate($data,$prvkey,$alg) { + $fn = strtoupper($alg) . '_decrypt'; + if(function_exists($fn)) { + openssl_private_decrypt(base64url_decode($data['key']),$k,$prvkey); + openssl_private_decrypt(base64url_decode($data['iv']),$i,$prvkey); + return $fn(base64url_decode($data['data']),$k,$i); + } + else { + $x = [ 'data' => $data, 'prvkey' => $prvkey, 'alg' => $alg, 'result' => $data ]; + call_hooks('other_unencapsulate',$x); + return $x['result']; + } } diff --git a/include/dba/dba_driver.php b/include/dba/dba_driver.php index 0b5f085af..81a3bd590 100755 --- a/include/dba/dba_driver.php +++ b/include/dba/dba_driver.php @@ -98,7 +98,7 @@ class DBA { abstract class dba_driver { // legacy behavior - protected $db; + public $db; protected $pdo = array(); public $debug = 0; diff --git a/include/dba/dba_pdo.php b/include/dba/dba_pdo.php index e235c467b..f76e6cdd7 100755 --- a/include/dba/dba_pdo.php +++ b/include/dba/dba_pdo.php @@ -133,7 +133,7 @@ class dba_pdo extends dba_driver { } function unescapebin($str) { - if($this->driver_dbtype === 'pgsql') { + if($this->driver_dbtype === 'pgsql' && (! is_null($str))) { $x = ''; while(! feof($str)) { $x .= fread($str,8192); diff --git a/include/dir_fns.php b/include/dir_fns.php index 03cc2706a..3922730fc 100644 --- a/include/dir_fns.php +++ b/include/dir_fns.php @@ -192,17 +192,19 @@ function sync_directories($dirmode) { 'site_update' => NULL_DATE, 'site_directory' => DIRECTORY_FALLBACK_MASTER . '/dirsearch', 'site_realm' => DIRECTORY_REALM, - 'site_valid' => 1 + 'site_valid' => 1, + 'site_crypto' => 'aes256cbc' ); - $x = q("insert into site ( site_url, site_flags, site_update, site_directory, site_realm, site_valid ) - values ( '%s', %d, '%s', '%s', '%s', %d ) ", + $x = q("insert into site ( site_url, site_flags, site_update, site_directory, site_realm, site_valid, site_crypto ) + values ( '%s', %d, '%s', '%s', '%s', %d, '%s' ) ", dbesc($r[0]['site_url']), intval($r[0]['site_flags']), dbesc($r[0]['site_update']), dbesc($r[0]['site_directory']), dbesc($r[0]['site_realm']), - intval($r[0]['site_valid']) + intval($r[0]['site_valid']), + dbesc($r[0]['site_crypto']) ); $r = q("select * from site where site_flags in (%d, %d) and site_url != '%s' and site_type = %d ", diff --git a/include/help.php b/include/help.php index f7fffc4d4..6efeeb57e 100644 --- a/include/help.php +++ b/include/help.php @@ -15,7 +15,7 @@ function get_help_content($tocpath = false) { $text = ''; $path = (($tocpath !== false) ? $tocpath : ''); - + if($tocpath === false && argc() > 1) { $path = ''; for($x = 1; $x < argc(); $x ++) { @@ -68,7 +68,7 @@ function get_help_content($tocpath = false) { } if($doctype === 'html') - $content = $text; + $content = parseIdentityAwareHTML($text); if($doctype === 'markdown') { require_once('library/markdown.php'); # escape #include tags diff --git a/include/items.php b/include/items.php index 4ac4d6049..e20c41d29 100755 --- a/include/items.php +++ b/include/items.php @@ -1463,6 +1463,11 @@ function item_store($arr, $allow_exec = false, $deliver = true) { $ret = array('success' => false, 'item_id' => 0); + if(array_key_exists('cancel',$arr) && $arr['cancel']) { + logger('cancelled by plugin'); + return $ret; + } + if(! $arr['uid']) { logger('item_store: no uid'); $ret['message'] = 'No uid.'; @@ -1881,6 +1886,12 @@ function item_store_update($arr,$allow_exec = false, $deliver = true) { $allow_exec = $d['allow_exec']; $ret = array('success' => false, 'item_id' => 0); + + if(array_key_exists('cancel',$arr) && $arr['cancel']) { + logger('cancelled by plugin'); + return $ret; + } + if(! intval($arr['uid'])) { logger('item_store_update: no uid'); $ret['message'] = 'no uid.'; diff --git a/include/nav.php b/include/nav.php index c2a058457..2762e2a14 100644 --- a/include/nav.php +++ b/include/nav.php @@ -108,7 +108,7 @@ EOT; if(feature_enabled($channel['channel_id'],'webpages') && (! $basic)) $nav['usermenu'][] = Array('webpages/' . $channel['channel_address'],t('Webpages'),"",t('Your webpages'),'webpages_nav_btn'); if(feature_enabled($channel['channel_id'],'wiki') && (! $basic)) - $nav['usermenu'][] = Array('wiki/' . $channel['channel_address'],t('Wiki'),"",t('Your wiki'),'wiki_nav_btn'); + $nav['usermenu'][] = Array('wiki/' . $channel['channel_address'],t('Wikis'),"",t('Your wikis'),'wiki_nav_btn'); } else { if(! get_account_id()) { @@ -127,26 +127,24 @@ EOT; ); } - if($observer) { - $nav['lock'] = array('logout','','lock', - sprintf( t('%s - click to logout'), $observer['xchan_addr'])); - } elseif(! $_SESSION['authenticated']) { $nav['loginmenu'][] = Array('rmagic',t('Remote authentication'),'',t('Click to authenticate to your home hub'),'rmagic_nav_btn'); } - /** - * "Home" should also take you home from an authenticated remote profile connection - */ - $homelink = get_my_url(); if(! $homelink) { $observer = App::get_observer(); $homelink = (($observer) ? $observer['xchan_url'] : ''); } - if(! local_channel()) - $nav['home'] = array($homelink, t('Home'), "", t('Home Page'),'home_nav_btn'); + if(! local_channel()) { + $nav['rusermenu'] = array( + $homelink, + t('Get me home'), + 'logout', + t('Log me out of this site') + ); + } if(((get_config('system','register_policy') == REGISTER_OPEN) || (get_config('system','register_policy') == REGISTER_APPROVE)) && (! $_SESSION['authenticated'])) $nav['register'] = array('register',t('Register'), "", t('Create an account'),'register_nav_btn'); diff --git a/include/oembed.php b/include/oembed.php index 52fb04058..eb7b76437 100755 --- a/include/oembed.php +++ b/include/oembed.php @@ -338,7 +338,7 @@ function oembed_iframe($src,$width,$height) { // Make sure any children are sandboxed within their own iframe. - return '<iframe ' . $scroll . 'height="' . $height . '" width="' . $width . '" src="' . $s . '" frameborder="no" >' + return '<iframe ' . $scroll . 'height="' . $height . '" width="' . $width . '" src="' . $s . '" allowfullscreen frameborder="no" >' . t('Embedded content') . '</iframe>'; } diff --git a/include/queue_fn.php b/include/queue_fn.php index 1e3126f77..0950faf85 100644 --- a/include/queue_fn.php +++ b/include/queue_fn.php @@ -93,7 +93,7 @@ function queue_deliver($outq, $immediate = false) { // your site has existed. Since we don't know for sure what these sites are, // call them unknown - q("insert into site (site_url, site_update, site_dead, site_type) values ('%s','%s',0,%d) ", + q("insert into site (site_url, site_update, site_dead, site_type, site_crypto) values ('%s','%s',0,%d,'') ", dbesc($base), dbesc(datetime_convert()), intval(($outq['outq_driver'] === 'post') ? SITE_TYPE_NOTZOT : SITE_TYPE_UNKNOWN) diff --git a/include/taxonomy.php b/include/taxonomy.php index 067bd3246..0b4b2aa9a 100644 --- a/include/taxonomy.php +++ b/include/taxonomy.php @@ -386,7 +386,7 @@ function get_things($profile_hash,$uid) { $things[$k] = null; foreach($r as $rr) { - $l = q("select xchan_name, xchan_photo_s, xchan_url from likes left join xchan on likee = xchan_hash where + $l = q("select xchan_name, xchan_photo_s, xchan_url from likes left join xchan on liker = xchan_hash where target_type = '%s' and target_id = '%s' and channel_id = %d", dbesc(ACTIVITY_OBJ_THING), dbesc($rr['obj_obj']), diff --git a/include/text.php b/include/text.php index 12b37222b..b25eb8e46 100644 --- a/include/text.php +++ b/include/text.php @@ -2049,7 +2049,7 @@ function ids_to_array($arr,$idx = 'id') { $t = array(); if($arr) { foreach($arr as $x) { - if(array_key_exists($idx,$x) && strlen($x[$idx]) && (! in_array($x[$idx],$t))) { + if(array_key_exists($idx,$x) && strlen($x[$idx]) && (! in_array($x[$idx],$t))) { $t[] = $x[$idx]; } } @@ -2060,12 +2060,15 @@ function ids_to_array($arr,$idx = 'id') { -function ids_to_querystr($arr,$idx = 'id') { +function ids_to_querystr($arr,$idx = 'id',$quote = false) { $t = array(); if($arr) { foreach($arr as $x) { if(! in_array($x[$idx],$t)) { - $t[] = $x[$idx]; + if($quote) + $t[] = "'" . dbesc($x[$idx]) . "'"; + else + $t[] = $x[$idx]; } } } diff --git a/include/widgets.php b/include/widgets.php index 3dc555b46..b6d3fb7ae 100644 --- a/include/widgets.php +++ b/include/widgets.php @@ -956,7 +956,7 @@ function widget_wiki_list($arr) { } } if ($wikis) { - return replace_macros(get_markup_template('wikilist.tpl'), array( + return replace_macros(get_markup_template('wikilist_widget.tpl'), array( '$header' => t('Wiki List'), '$channel' => $channel['channel_address'], '$wikis' => $wikis['wikis'], @@ -967,7 +967,7 @@ function widget_wiki_list($arr) { '$view' => t('View'), '$addnew' => t('Create new wiki'), '$create' => t('Create'), - '$wikiName' => array('wikiName', t('Wiki name'), '', ''), + '$wikiName' => array('wikiName', t('Wiki name')), '$lockstate' => $x['lockstate'], '$acl' => $x['acl'], '$allow_cid' => $x['allow_cid'], @@ -975,7 +975,7 @@ function widget_wiki_list($arr) { '$deny_cid' => $x['deny_cid'], '$deny_gid' => $x['deny_gid'], '$bang' => $x['bang'], - '$notify' => t('Send notification') + '$notify' => array('postVisible', t('Send notification'), '', '', array(t('No'), t('Yes'))) )); } return ''; @@ -1017,6 +1017,7 @@ function widget_wiki_pages($arr) { '$pages' => $pages, '$canadd' => $can_create, '$addnew' => t('Add new page'), + '$pageName' => array('pageName', t('Page name')), )); } @@ -1472,14 +1473,23 @@ function widget_forums($arr) { $perms_sql = item_permissions_sql(local_channel()) . item_normal(); - /** - * We used to try and find public forums with custom permissions by checking to see if - * send_stream was false and tag_deliver was true. However with the newer extensible - * permissions infrastructure this makes for a very complicated query. Now we're only - * checking channels that report themselves specifically as pubforums - */ + $xf = false; + + $x1 = q("select xchan from abconfig where chan = %d and cat = 'their_perms' and k = 'send_stream' and v = 0", + intval(local_channel()) + ); + if($x1) { + $xc = ids_to_querystr($x1,'xchan',true); + $x2 = q("select xchan from abconfig where chan = %d and cat = 'their_perms' and k = 'tag_deliver' and v = 1 and xchan in (" . $xc . ") ", + intval(local_channel()) + ); + if($x2) + $xf = ids_to_querystr($x2,'xchan',true); + } + + $sql_extra = (($xf) ? " and ( xchan_hash in (" . $xf . ") or xchan_pubforum = 1 ) " : " and xchan_pubforum = 1 "); - $r1 = q("select abook_id, xchan_hash, xchan_name, xchan_url, xchan_photo_s from abook left join xchan on abook_xchan = xchan_hash where xchan_pubforum = 1 and xchan_deleted = 0 and abook_channel = %d order by xchan_name $limit ", + $r1 = q("select abook_id, xchan_hash, xchan_name, xchan_url, xchan_photo_s from abook left join xchan on abook_xchan = xchan_hash where xchan_deleted = 0 and abook_channel = %d $sql_extra order by xchan_name $limit ", intval(local_channel()) ); if(! $r1) diff --git a/include/wiki.php b/include/wiki.php index bcdf9d7d8..dd5dbbe11 100644 --- a/include/wiki.php +++ b/include/wiki.php @@ -19,6 +19,7 @@ function wiki_list($channel, $observer_hash) { $w['htmlName'] = get_iconfig($w, 'wiki', 'htmlName'); $w['urlName'] = get_iconfig($w, 'wiki', 'urlName'); $w['path'] = get_iconfig($w, 'wiki', 'path'); + $w['path'] = get_iconfig($w, 'wiki', 'mimeType'); } } // TODO: query db for wikis the observer can access. Return with two lists, for read and write access @@ -31,14 +32,30 @@ function wiki_page_list($resource_id) { if (!$w['path']) { return array('pages' => null, 'wiki' => null); } - $pages = array(); + + $pages[] = [ + 'resource_id' => '', + 'title' => 'Home', + 'url' => 'Home', + 'link_id' => 'id_wiki_home_0' + ]; + if (is_dir($w['path']) === true) { $files = array_diff(scandir($w['path']), array('.', '..', '.git')); // TODO: Check that the files are all text files - + $i = 1; foreach($files as $file) { - // strip the .md file extension and unwrap URL encoding to leave HTML encoded name - $pages[] = array('title' => urldecode(substr($file, 0, -3)), 'url' => urlencode(substr($file, 0, -3))); + // strip the file extension and unwrap URL encoding to leave HTML encoded name + $title = substr($file, 0, -3); + if(urldecode($title) !== 'Home') { + $pages[] = [ + 'resource_id' => $resource_id, + 'title' => urldecode($title), + 'url' => $title, + 'link_id' => 'id_' . substr($resource_id, 0, 10) . '_' . $i + ]; + $i++; + } } } @@ -75,7 +92,7 @@ function wiki_create_wiki($channel, $observer_hash, $wiki, $acl) { $resource_id = random_string(); $r = q("SELECT mid FROM item WHERE resource_id = '%s' AND resource_type = '%s' AND uid = %d LIMIT 1", dbesc($resource_id), - dbesc(WIKI_ITEM_RESOURCE_TYPE), + dbesc(WIKI_ITEM_RESOURCE_TYPE), intval($channel['channel_id']) ); if (count($r)) @@ -123,6 +140,9 @@ function wiki_create_wiki($channel, $observer_hash, $wiki, $acl) { if (!set_iconfig($arr, 'wiki', 'urlName', $wiki['urlName'], true)) { return array('item' => null, 'success' => false); } + if (!set_iconfig($arr, 'wiki', 'mimeType', $wiki['mimeType'], true)) { + return array('item' => null, 'success' => false); + } $post = item_store($arr); $item_id = $post['item_id']; @@ -152,8 +172,8 @@ function wiki_delete_wiki($resource_id) { function wiki_get_wiki($resource_id) { $item = q("SELECT * FROM item WHERE resource_type = '%s' AND resource_id = '%s' AND item_deleted = 0 limit 1", - dbesc(WIKI_ITEM_RESOURCE_TYPE), - dbesc($resource_id) + dbesc(WIKI_ITEM_RESOURCE_TYPE), + dbesc($resource_id) ); if (!$item) { return array('wiki' => null, 'path' => null); @@ -163,17 +183,21 @@ function wiki_get_wiki($resource_id) { $rawName = get_iconfig($w, 'wiki', 'rawName'); $htmlName = get_iconfig($w, 'wiki', 'htmlName'); $urlName = get_iconfig($w, 'wiki', 'urlName'); + $mimeType = get_iconfig($w, 'wiki', 'mimeType'); + $path = get_iconfig($w, 'wiki', 'path'); if (!realpath(__DIR__ . '/../' . $path)) { return array('wiki' => null, 'path' => null); } // Path to wiki exists $abs_path = realpath(__DIR__ . '/../' . $path); - return array( 'wiki' => $w, - 'path' => $abs_path, - 'rawName' => $rawName, - 'htmlName' => $htmlName, - 'urlName' => $urlName + return array( + 'wiki' => $w, + 'path' => $abs_path, + 'rawName' => $rawName, + 'htmlName' => $htmlName, + 'urlName' => $urlName, + 'mimeType' => $mimeType ); } } @@ -220,7 +244,8 @@ function wiki_create_page($name, $resource_id) { if (!$w['path']) { return array('page' => null, 'wiki' => null, 'message' => 'Wiki not found.', 'success' => false); } - $page = array('rawName' => $name, 'htmlName' => escape_tags($name), 'urlName' => urlencode(escape_tags($name)), 'fileName' => urlencode(escape_tags($name)).'.md'); + + $page = array('rawName' => $name, 'htmlName' => escape_tags($name), 'urlName' => urlencode(escape_tags($name)), 'fileName' => urlencode(escape_tags($name)) . wiki_get_file_ext($w)); $page_path = $w['path'] . '/' . $page['fileName']; if (is_file($page_path)) { return array('page' => null, 'wiki' => null, 'message' => 'Page already exists.', 'success' => false); @@ -242,11 +267,11 @@ function wiki_rename_page($arr) { if (!$w['path']) { return array('message' => 'Wiki not found.', 'success' => false); } - $page_path_old = $w['path'].'/'.$pageUrlName.'.md'; + $page_path_old = $w['path'] . '/' . $pageUrlName . wiki_get_file_ext($w); if (!is_readable($page_path_old) === true) { return array('message' => 'Cannot read wiki page: ' . $page_path_old, 'success' => false); } - $page = array('rawName' => $pageNewName, 'htmlName' => escape_tags($pageNewName), 'urlName' => urlencode(escape_tags($pageNewName)), 'fileName' => urlencode(escape_tags($pageNewName)).'.md'); + $page = array('rawName' => $pageNewName, 'htmlName' => escape_tags($pageNewName), 'urlName' => urlencode(escape_tags($pageNewName)), 'fileName' => urlencode(escape_tags($pageNewName)) . wiki_get_file_ext($w)); $page_path_new = $w['path'] . '/' . $page['fileName'] ; if (is_file($page_path_new)) { return array('message' => 'Page already exists.', 'success' => false); @@ -267,7 +292,7 @@ function wiki_get_page_content($arr) { if (!$w['path']) { return array('content' => null, 'message' => 'Error reading wiki', 'success' => false); } - $page_path = $w['path'].'/'.$pageUrlName.'.md'; + $page_path = $w['path'] . '/' . $pageUrlName . wiki_get_file_ext($w); if (is_readable($page_path) === true) { if(filesize($page_path) === 0) { $content = ''; @@ -278,7 +303,7 @@ function wiki_get_page_content($arr) { } } // TODO: Check that the files are all text files - return array('content' => json_encode($content), 'message' => '', 'success' => true); + return array('content' => json_encode($content), 'mimeType' => $w['mimeType'], 'message' => '', 'success' => true); } } @@ -289,7 +314,7 @@ function wiki_page_history($arr) { if (!$w['path']) { return array('history' => null, 'message' => 'Error reading wiki', 'success' => false); } - $page_path = $w['path'].'/'.$pageUrlName.'.md'; + $page_path = $w['path'] . '/' . $pageUrlName . wiki_get_file_ext($w); if (!is_readable($page_path) === true) { return array('history' => null, 'message' => 'Cannot read wiki page: ' . $page_path, 'success' => false); } @@ -314,12 +339,14 @@ function wiki_save_page($arr) { if (!$w['path']) { return array('message' => 'Error reading wiki', 'success' => false); } - $page_path = $w['path'].'/'.$pageUrlName.'.md'; + + $fileName = $pageUrlName . wiki_get_file_ext($w); + $page_path = $w['path'] . '/' . $fileName; if (is_writable($page_path) === true) { if(!file_put_contents($page_path, $content)) { return array('message' => 'Error writing to page file', 'success' => false); } - return array('message' => '', 'success' => true); + return array('message' => '', 'filename' => $filename, 'success' => true); } else { return array('message' => 'Page file not writable', 'success' => false); } @@ -332,7 +359,7 @@ function wiki_delete_page($arr) { if (!$w['path']) { return array('message' => 'Error reading wiki', 'success' => false); } - $page_path = $w['path'].'/'.$pageUrlName.'.md'; + $page_path = $w['path'] . '/' . $pageUrlName . wiki_get_file_ext($w); if (is_writable($page_path) === true) { if(!unlink($page_path)) { return array('message' => 'Error deleting page file', 'success' => false); @@ -354,7 +381,7 @@ function wiki_revert_page($arr) { if (!$w['path']) { return array('content' => $content, 'message' => 'Error reading wiki', 'success' => false); } - $page_path = $w['path'].'/'.$pageUrlName.'.md'; + $page_path = $w['path'] . '/' . $pageUrlName . wiki_get_file_ext($w); if (is_writable($page_path) === true) { $reponame = ((array_key_exists('title', $w['wiki'])) ? urlencode($w['wiki']['title']) : 'repo'); @@ -366,7 +393,7 @@ function wiki_revert_page($arr) { try { $git->setIdentity($observer['xchan_name'], $observer['xchan_addr']); foreach ($git->git->tree($commitHash) as $object) { - if ($object['type'] == 'blob' && $object['file'] === $pageUrlName.'.md' ) { + if ($object['type'] == 'blob' && $object['file'] === $pageUrlName . wiki_get_file_ext($w)) { $content = $git->git->cat->blob($object['hash']); } } @@ -391,7 +418,7 @@ function wiki_compare_page($arr) { if (!$w['path']) { return array('message' => 'Error reading wiki', 'success' => false); } - $page_path = $w['path'].'/'.$pageUrlName.'.md'; + $page_path = $w['path'] . '/' . $pageUrlName . wiki_get_file_ext($w); if (is_readable($page_path) === true) { $reponame = ((array_key_exists('title', $w['wiki'])) ? urlencode($w['wiki']['title']) : 'repo'); if($reponame === '') { @@ -401,12 +428,12 @@ function wiki_compare_page($arr) { $compareContent = $currentContent = ''; try { foreach ($git->git->tree($currentCommit) as $object) { - if ($object['type'] == 'blob' && $object['file'] === $pageUrlName.'.md' ) { + if ($object['type'] == 'blob' && $object['file'] === $pageUrlName . wiki_get_file_ext($w)) { $currentContent = $git->git->cat->blob($object['hash']); } } foreach ($git->git->tree($compareCommit) as $object) { - if ($object['type'] == 'blob' && $object['file'] === $pageUrlName.'.md' ) { + if ($object['type'] == 'blob' && $object['file'] === $pageUrlName . wiki_get_file_ext($w)) { $compareContent = $git->git->cat->blob($object['hash']); } } @@ -469,15 +496,6 @@ function wiki_git_commit($arr) { } } -function wiki_generate_page_filename($name) { - $file = urlencode(escape_tags($name)); - if( $file === '') { - return null; - } else { - return $file . '.md'; - } -} - function wiki_convert_links($s, $wikiURL) { if (strpos($s,'[[') !== false) { @@ -505,7 +523,6 @@ function wiki_convert_links($s, $wikiURL) { * @return string */ function wiki_generate_toc($s) { - if (strpos($s,'[toc]') !== false) { //$toc_md = wiki_toc($s); // Generate Markdown-formatted list prior to HTML render $toc_md = '<ul id="wiki-toc"></ul>'; // use the available jQuery plugin http://ndabas.github.io/toc/ @@ -547,6 +564,13 @@ function wiki_bbcode($s) { return $s; } +function wiki_get_file_ext($arr) { + if($arr['mimeType'] == 'text/bbcode') + return '.bb'; + else + return '.md'; +} + // This function is derived from // http://stackoverflow.com/questions/32068537/generate-table-of-contents-from-markdown-in-php function wiki_toc($content) { diff --git a/include/zot.php b/include/zot.php index 5c9fb4e82..635ff34b0 100644 --- a/include/zot.php +++ b/include/zot.php @@ -110,20 +110,21 @@ function zot_get_hublocs($hash) { * @param string $extra * @returns string json encoded zot packet */ -function zot_build_packet($channel, $type = 'notify', $recipients = null, $remote_key = null, $secret = null, $extra = null) { +function zot_build_packet($channel, $type = 'notify', $recipients = null, $remote_key = null, $methods = '', $secret = null, $extra = null) { - $data = array( + $data = [ 'type' => $type, - 'sender' => array( + 'sender' => [ 'guid' => $channel['channel_guid'], 'guid_sig' => base64url_encode(rsa_sign($channel['channel_guid'],$channel['channel_prvkey'])), 'url' => z_root(), 'url_sig' => base64url_encode(rsa_sign(z_root(),$channel['channel_prvkey'])), 'sitekey' => get_config('system','pubkey') - ), + ], 'callback' => '/post', - 'version' => ZOT_REVISION - ); + 'version' => ZOT_REVISION, + 'encryption' => crypto_methods() + ]; if ($recipients) { for ($x = 0; $x < count($recipients); $x ++) @@ -146,122 +147,67 @@ function zot_build_packet($channel, $type = 'notify', $recipients = null, $remot // Hush-hush ultra top-secret mode - if ($remote_key) { - $data = crypto_encapsulate(json_encode($data),$remote_key); + if($remote_key) { + $algorithm = zot_best_algorithm($methods); + $data = crypto_encapsulate(json_encode($data),$remote_key, $algorithm); } return json_encode($data); } /** - * @brief - * - * @see z_post_url() - * - * @param string $url - * @param array $data - * @return array see z_post_url() for returned data format - */ -function zot_zot($url, $data) { - return z_post_url($url, array('data' => $data)); -} - -/** - * @brief Look up information about channel. - * - * @param string $webbie - * does not have to be host qualified e.g. 'foo' is treated as 'foo\@thishub' - * @param array $channel - * (optional), if supplied permissions will be enumerated specifically for $channel - * @param boolean $autofallback - * fallback/failover to http if https connection cannot be established. Default is true. - * - * @return array see z_post_url() and \ref Zotlabs::Zot::Finger "\\Zotlabs\\Zot\\Finger" + * @brief choose best encryption function from those available on both sites + * + * @param string $methods + * comma separated list of encryption methods + * @return string first match from our site method preferences crypto_methods() array + * of a method which is common to both sites; or 'aes256cbc' if no matches are found. */ -function zot_finger($webbie, $channel = null, $autofallback = true) { - - if (strpos($webbie,'@') === false) { - $address = $webbie; - $host = App::get_hostname(); - } else { - $address = substr($webbie,0,strpos($webbie,'@')); - $host = substr($webbie,strpos($webbie,'@')+1); - if(strpos($host,'/')) - $host = substr($host,0,strpos($host,'/')); - } - - $xchan_addr = $address . '@' . $host; - if ((! $address) || (! $xchan_addr)) { - logger('zot_finger: no address :' . $webbie); - return array('success' => false); - } - logger('using xchan_addr: ' . $xchan_addr, LOGGER_DATA, LOG_DEBUG); +function zot_best_algorithm($methods) { - // potential issue here; the xchan_addr points to the primary hub. - // The webbie we were called with may not, so it might not be found - // unless we query for hubloc_addr instead of xchan_addr + if(\Zotlabs\Lib\System::get_server_role() !== 'pro') + return 'aes256cbc'; - $r = q("select xchan.*, hubloc.* from xchan - left join hubloc on xchan_hash = hubloc_hash - where xchan_addr = '%s' and hubloc_primary = 1 limit 1", - dbesc($xchan_addr) - ); - - if ($r) { - $url = $r[0]['hubloc_url']; - - if ($r[0]['hubloc_network'] && $r[0]['hubloc_network'] !== 'zot') { - logger('zot_finger: alternate network: ' . $webbie); - logger('url: '.$url.', net: '.var_export($r[0]['hubloc_network'],true), LOGGER_DATA, LOG_DEBUG); - return array('success' => false); + if($methods) { + $x = explode(',',$methods); + if($x) { + $y = crypto_methods(); + if($y) { + foreach($y as $yv) { + $yv = trim($yv); + if(in_array($yv,$x)) { + return($yv); + } + } + } } - } else { - $url = 'https://' . $host; } - $rhs = '/.well-known/zot-info'; - $https = ((strpos($url,'https://') === 0) ? true : false); - - logger('zot_finger: ' . $address . ' at ' . $url, LOGGER_DEBUG); - - if ($channel) { - $postvars = array( - 'address' => $address, - 'target' => $channel['channel_guid'], - 'target_sig' => $channel['channel_guid_sig'], - 'key' => $channel['channel_pubkey'] - ); - - $result = z_post_url($url . $rhs,$postvars); - - if ((! $result['success']) && ($autofallback)) { - if ($https) { - logger('zot_finger: https failed. falling back to http'); - $result = z_post_url('http://' . $host . $rhs,$postvars); - } - } - } else { - $rhs .= '?f=&address=' . urlencode($address); + return 'aes256cbc'; +} - $result = z_fetch_url($url . $rhs); - if ((! $result['success']) && ($autofallback)) { - if ($https) { - logger('zot_finger: https failed. falling back to http'); - $result = z_fetch_url('http://' . $host . $rhs); - } - } - } - if (! $result['success']) - logger('zot_finger: no results'); - return $result; +/** + * @brief + * + * @see z_post_url() + * + * @param string $url + * @param array $data + * @return array see z_post_url() for returned data format + */ +function zot_zot($url, $data) { + return z_post_url($url, array('data' => $data)); } /** * @brief Refreshes after permission changed or friending, etc. * + * The top half of this function is similar to \Zotlabs\Zot\Finger::run() and could potentially be + * consolidated. + * * zot_refresh is typically invoked when somebody has changed permissions of a channel and they are notified * to fetch new permissions via a finger/discovery operation. This may result in a new connection * (abook entry) being added to a local channel and it may result in auto-permissions being granted. @@ -283,6 +229,7 @@ function zot_finger($webbie, $channel = null, $autofallback = true) { * * @returns boolean true if successful, else false */ + function zot_refresh($them, $channel = null, $force = false) { if (array_key_exists('xchan_network', $them) && ($them['xchan_network'] !== 'zot')) { @@ -298,7 +245,8 @@ function zot_refresh($them, $channel = null, $force = false) { if ($them['hubloc_url']) { $url = $them['hubloc_url']; - } else { + } + else { $r = null; // if they re-installed the server we could end up with the wrong record - pointing to the old install. @@ -334,7 +282,7 @@ function zot_refresh($them, $channel = null, $force = false) { $token = random_string(); - $postvars = array(); + $postvars = []; $postvars['token'] = $token; @@ -395,10 +343,13 @@ function zot_refresh($them, $channel = null, $force = false) { if($channel) { if($j['permissions']['data']) { - $permissions = crypto_unencapsulate(array( + $permissions = crypto_unencapsulate( + [ 'data' => $j['permissions']['data'], 'key' => $j['permissions']['key'], - 'iv' => $j['permissions']['iv']), + 'iv' => $j['permissions']['iv'], + 'alg' => $j['permissions']['alg'] + ], $channel['channel_prvkey']); if($permissions) $permissions = json_decode($permissions,true); @@ -424,6 +375,10 @@ function zot_refresh($them, $channel = null, $force = false) { $next_birthday = NULL_DATE; } + + // Keep original perms to check if we need to notify them + $previous_perms = get_all_perms($channel['channel_id'],$x['hash']); + $r = q("select * from abook where abook_xchan = '%s' and abook_channel = %d and abook_self = 0 limit 1", dbesc($x['hash']), intval($channel['channel_id']) @@ -487,10 +442,6 @@ function zot_refresh($them, $channel = null, $force = false) { } } - // Keep original perms to check if we need to notify them - $previous_perms = get_all_perms($channel['channel_id'],$x['hash']); - - $closeness = get_pconfig($channel['channel_id'],'system','new_abook_closeness'); if($closeness === false) $closeness = 80; @@ -520,12 +471,14 @@ function zot_refresh($them, $channel = null, $force = false) { if($new_connection) { if(! \Zotlabs\Access\Permissions::PermsCompare($new_perms,$previous_perms)) Zotlabs\Daemon\Master::Summon(array('Notifier','permission_create',$new_connection[0]['abook_id'])); - Zotlabs\Lib\Enotify::submit(array( + Zotlabs\Lib\Enotify::submit( + [ 'type' => NOTIFY_INTRO, 'from_xchan' => $x['hash'], 'to_xchan' => $channel['channel_hash'], - 'link' => z_root() . '/connedit/' . $new_connection[0]['abook_id'], - )); + 'link' => z_root() . '/connedit/' . $new_connection[0]['abook_id'] + ] + ); if(intval($permissions['view_stream'])) { if(intval(get_pconfig($channel['channel_id'],'perm_limits','send_stream') & PERMS_PENDING) @@ -535,6 +488,7 @@ function zot_refresh($them, $channel = null, $force = false) { /** If there is a default group for this channel, add this connection to it */ + $default_group = $channel['channel_default_group']; if($default_group) { require_once('include/group.php'); @@ -580,6 +534,7 @@ function zot_refresh($them, $channel = null, $force = false) { * @returns array|null null if site is blacklisted or not found, otherwise an * array with an hubloc record */ + function zot_gethub($arr, $multiple = false) { if($arr['guid'] && $arr['guid_sig'] && $arr['url'] && $arr['url_sig']) { @@ -592,7 +547,7 @@ function zot_gethub($arr, $multiple = false) { $limit = (($multiple) ? '' : ' limit 1 '); $sitekey = ((array_key_exists('sitekey',$arr) && $arr['sitekey']) ? " and hubloc_sitekey = '" . protect_sprintf($arr['sitekey']) . "' " : ''); - $r = q("select * from hubloc + $r = q("select hubloc.*, site.site_crypto from hubloc left join site on hubloc_url = site_url where hubloc_guid = '%s' and hubloc_guid_sig = '%s' and hubloc_url = '%s' and hubloc_url_sig = '%s' $sitekey $limit", @@ -629,9 +584,10 @@ function zot_gethub($arr, $multiple = false) { * * \b success boolean true or false * * \b message (optional) error string only if success is false */ + function zot_register_hub($arr) { - $result = array('success' => false); + $result = [ 'success' => false ]; if($arr['url'] && $arr['url_sig'] && $arr['guid'] && $arr['guid_sig']) { @@ -690,6 +646,7 @@ function zot_register_hub($arr) { * * \e boolean \b success boolean true or false * * \e string \b message (optional) error string only if success is false */ + function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) { call_hooks('import_xchan', $arr); @@ -788,7 +745,8 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) { $what .= 'xchan '; $changed = true; } - } else { + } + else { $import_photos = true; if((($arr['site']['directory_mode'] === 'standalone') @@ -824,7 +782,7 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) { $changed = true; } - if ($import_photos) { + if($import_photos) { require_once('include/photo/photo_driver.php'); @@ -833,9 +791,9 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) { $local = q("select channel_account_id, channel_id from channel where channel_hash = '%s' limit 1", dbesc($xchan_hash) ); - if ($local) { + if($local) { $ph = z_fetch_url($arr['photo'], true); - if ($ph['success']) { + if($ph['success']) { $hash = import_channel_photo($ph['body'], $arr['photo_mimetype'], $local[0]['channel_account_id'], $local[0]['channel_id']); @@ -873,11 +831,12 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) { false ); } - } else { + } + else { $photos = import_xchan_photo($arr['photo'], $xchan_hash); } - if ($photos) { - if ($photos[4]) { + if($photos) { + if($photos[4]) { // importing the photo failed somehow. Leave the photo_date alone so we can try again at a later date. // This often happens when somebody joins the matrix with a bad cert. $r = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s' @@ -888,7 +847,8 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) { dbesc($photos[3]), dbesc($xchan_hash) ); - } else { + } + else { $r = q("update xchan set xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s' where xchan_hash = '%s'", dbescdate(datetime_convert('UTC','UTC',$arr['photo_updated'])), @@ -945,7 +905,8 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) { $what .= 'profile '; $changed = true; } - } else { + } + else { logger('import_xchan: profile not available - hiding'); // they may have made it private $r = q("delete from xprof where xprof_hash = '%s'", @@ -998,16 +959,17 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) { * @param array $arr - output of z_post_url() * @param array $outq - The queue structure attached to this request */ + function zot_process_response($hub, $arr, $outq) { - if (! $arr['success']) { + if(! $arr['success']) { logger('zot_process_response: failed: ' . $hub); return; } $x = json_decode($arr['body'], true); - if (! $x) { + if(! $x) { logger('zot_process_response: No json from ' . $hub); logger('zot_process_response: headers: ' . print_r($arr['header'],true), LOGGER_DATA, LOG_DEBUG); } @@ -1065,6 +1027,7 @@ function zot_process_response($hub, $arr, $outq) { * decrypted and json decoded notify packet from remote site * @return array from zot_import() */ + function zot_fetch($arr) { logger('zot_fetch: ' . print_r($arr,true), LOGGER_DATA, LOG_DEBUG); @@ -1082,16 +1045,18 @@ function zot_fetch($arr) { } foreach($ret_hubs as $ret_hub) { - $data = array( - 'type' => 'pickup', - 'url' => z_root(), - 'callback_sig' => base64url_encode(rsa_sign(z_root() . '/post',get_config('system','prvkey'))), - 'callback' => z_root() . '/post', - 'secret' => $arr['secret'], - 'secret_sig' => base64url_encode(rsa_sign($arr['secret'],get_config('system','prvkey'))) - ); - $datatosend = json_encode(crypto_encapsulate(json_encode($data),$ret_hub['hubloc_sitekey'])); + $data = [ + 'type' => 'pickup', + 'url' => z_root(), + 'callback_sig' => base64url_encode(rsa_sign(z_root() . '/post', get_config('system','prvkey'))), + 'callback' => z_root() . '/post', + 'secret' => $arr['secret'], + 'secret_sig' => base64url_encode(rsa_sign($arr['secret'], get_config('system','prvkey'))) + ]; + + $algorithm = zot_best_algorithm($ret_hub['site_crypto']); + $datatosend = json_encode(crypto_encapsulate(json_encode($data),$ret_hub['hubloc_sitekey'], $algorithm)); $fetch = zot_zot($url,$datatosend); @@ -1142,6 +1107,11 @@ function zot_import($arr, $sender_url) { $data = json_decode(crypto_unencapsulate($data,get_config('system','prvkey')),true); } + if(! is_array($data)) { + logger('decode error'); + return array(); + } + if(! $data['success']) { if($data['message']) logger('remote pickup failed: ' . $data['message']); @@ -1167,6 +1137,12 @@ function zot_import($arr, $sender_url) { logger('zot_import: notify: ' . print_r($i['notify'],true), LOGGER_DATA, LOG_DEBUG); + if(! is_array($i['notify'])) { + logger('decode error'); + continue; + } + + $hub = zot_gethub($i['notify']['sender']); if((! $hub) || ($hub['hubloc_url'] != $sender_url)) { logger('zot_import: potential forgery: wrong site for sender: ' . $sender_url . ' != ' . print_r($i['notify'],true)); @@ -1357,6 +1333,7 @@ function zot_import($arr, $sender_url) { * @param array $msg * @return NULL|array */ + function public_recips($msg) { require_once('include/channel.php'); @@ -1566,6 +1543,7 @@ function allowed_public_recips($msg) { * @param boolean $request (optional) default false * @return array */ + function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $request = false) { $result = array(); @@ -1875,6 +1853,7 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $ * * \e int \b mid * @param int $uid */ + function remove_community_tag($sender, $arr, $uid) { if(! (activity_match($arr['verb'], ACTIVITY_TAG) && ($arr['obj_type'] == ACTIVITY_OBJ_TAGTERM))) @@ -1945,6 +1924,7 @@ function remove_community_tag($sender, $arr, $uid) { * @param array $orig * @param int $uid */ + function update_imported_item($sender, $item, $orig, $uid) { // If this is a comment being updated, remove any privacy information @@ -1985,6 +1965,7 @@ function update_imported_item($sender, $item, $orig, $uid) { * @param boolean $relay * @return boolean|int post_id */ + function delete_imported_item($sender, $item, $uid, $relay) { logger('delete_imported_item invoked', LOGGER_DEBUG); @@ -2002,13 +1983,14 @@ function delete_imported_item($sender, $item, $uid, $relay) { intval($uid) ); - if ($r) { - if ($r[0]['author_xchan'] === $sender['hash'] || $r[0]['owner_xchan'] === $sender['hash'] || $r[0]['source_xchan'] === $sender['hash']) + if($r) { + if($r[0]['author_xchan'] === $sender['hash'] || $r[0]['owner_xchan'] === $sender['hash'] || $r[0]['source_xchan'] === $sender['hash']) $ownership_valid = true; $post_id = $r[0]['id']; $item_found = true; - } else { + } + else { // perhaps the item is still in transit and the delete notification got here before the actual item did. Store it with the deleted flag set. // item_store() won't try to deliver any notifications or start delivery chains if this flag is set. @@ -2017,25 +1999,24 @@ function delete_imported_item($sender, $item, $uid, $relay) { logger('delete received for non-existent item - storing item data.'); - /** @BUG $arr is undefined here, so this is dead code */ - if ($arr['author_xchan'] === $sender['hash'] || $arr['owner_xchan'] === $sender['hash'] || $arr['source_xchan'] === $sender['hash']) { + if($item['author_xchan'] === $sender['hash'] || $item['owner_xchan'] === $sender['hash'] || $item['source_xchan'] === $sender['hash']) { $ownership_valid = true; - $item_result = item_store($arr); + $item_result = item_store($item); $post_id = $item_result['item_id']; } } - if ($ownership_valid === false) { + if($ownership_valid === false) { logger('delete_imported_item: failed: ownership issue'); return false; } require_once('include/items.php'); - if ($item_found) { - if (intval($r[0]['item_deleted'])) { + if($item_found) { + if(intval($r[0]['item_deleted'])) { logger('delete_imported_item: item was already deleted'); - if (! $relay) + if(! $relay) return false; // This is a bit hackish, but may have to suffice until the notification/delivery loop is optimised @@ -2146,6 +2127,7 @@ function process_mail_delivery($sender, $arr, $deliveries) { * * \e string \b hash a xchan_hash * @param array $arr */ + function process_rating_delivery($sender, $arr) { logger('process_rating_delivery: ' . print_r($arr,true)); @@ -2205,6 +2187,7 @@ function process_rating_delivery($sender, $arr) { * @param array $arr * @param array $deliveries (unused) */ + function process_profile_delivery($sender, $arr, $deliveries) { logger('process_profile_delivery', LOGGER_DEBUG); @@ -2301,6 +2284,7 @@ function check_location_move($sender_hash,$locations) { * @param boolean $absolute (optional) default false * @return array */ + function sync_locations($sender, $arr, $absolute = false) { $ret = array(); @@ -2548,7 +2532,7 @@ function zot_encode_locations($channel) { if(intval($channel['channel_removed']) && $hub['hubloc_url'] === z_root()) $hub['hubloc_deleted'] = 1; - $ret[] = array( + $ret[] = [ 'host' => $hub['hubloc_host'], 'address' => $hub['hubloc_addr'], 'primary' => (intval($hub['hubloc_primary']) ? true : false), @@ -2557,7 +2541,7 @@ function zot_encode_locations($channel) { 'callback' => $hub['hubloc_callback'], 'sitekey' => $hub['hubloc_sitekey'], 'deleted' => (intval($hub['hubloc_deleted']) ? true : false) - ); + ]; } } @@ -2574,6 +2558,7 @@ function zot_encode_locations($channel) { * @param number $suppress_update default 0 * @return boolean $updated if something changed */ + function import_directory_profile($hash, $profile, $addr, $ud_flags = UPDATE_FLAGS_UPDATED, $suppress_update = 0) { logger('import_directory_profile', LOGGER_DEBUG); @@ -2708,6 +2693,7 @@ function import_directory_profile($hash, $profile, $addr, $ud_flags = UPDATE_FLA * @param string $hash * @param array $keywords */ + function import_directory_keywords($hash, $keywords) { $existing = array(); @@ -2752,6 +2738,7 @@ function import_directory_keywords($hash, $keywords) { * @param string $addr * @param int $flags (optional) default 0 */ + function update_modtime($hash, $guid, $addr, $flags = 0) { $dirmode = intval(get_config('system', 'directory_mode')); @@ -2784,6 +2771,7 @@ function update_modtime($hash, $guid, $addr, $flags = 0) { * @param string $pubkey * @return boolean true if updated or inserted */ + function import_site($arr, $pubkey) { if( (! is_array($arr)) || (! $arr['url']) || (! $arr['url_sig'])) return false; @@ -2851,6 +2839,7 @@ function import_site($arr, $pubkey) { $site_location = htmlspecialchars($arr['location'],ENT_COMPAT,'UTF-8',false); $site_realm = htmlspecialchars($arr['realm'],ENT_COMPAT,'UTF-8',false); $site_project = htmlspecialchars($arr['project'],ENT_COMPAT,'UTF-8',false); + $site_crypto = ((array_key_exists('encryption',$arr) && is_array($arr['encryption'])) ? htmlspecialchars(implode(',',$arr['encryption']),ENT_COMPAT,'UTF-8',false) : ''); $site_version = ((array_key_exists('version',$arr)) ? htmlspecialchars($arr['version'],ENT_COMPAT,'UTF-8',false) : ''); // You can have one and only one primary directory per realm. @@ -2872,6 +2861,7 @@ function import_site($arr, $pubkey) { || ($siterecord['site_register'] != $register_policy) || ($siterecord['site_project'] != $site_project) || ($siterecord['site_realm'] != $site_realm) + || ($siterecord['site_crypto'] != $site_crypto) || ($siterecord['site_version'] != $site_version) ) { $update = true; @@ -2880,7 +2870,7 @@ function import_site($arr, $pubkey) { // logger('import_site: stored: ' . print_r($siterecord,true)); - $r = q("update site set site_dead = 0, site_location = '%s', site_flags = %d, site_access = %d, site_directory = '%s', site_register = %d, site_update = '%s', site_sellpage = '%s', site_realm = '%s', site_type = %d, site_project = '%s', site_version = '%s' + $r = q("update site set site_dead = 0, site_location = '%s', site_flags = %d, site_access = %d, site_directory = '%s', site_register = %d, site_update = '%s', site_sellpage = '%s', site_realm = '%s', site_type = %d, site_project = '%s', site_version = '%s', site_crypto = '%s' where site_url = '%s'", dbesc($site_location), intval($site_directory), @@ -2893,6 +2883,7 @@ function import_site($arr, $pubkey) { intval(SITE_TYPE_ZOT), dbesc($site_project), dbesc($site_version), + dbesc($site_crypto), dbesc($url) ); if(! $r) { @@ -2910,8 +2901,8 @@ function import_site($arr, $pubkey) { else { $update = true; - $r = q("insert into site ( site_location, site_url, site_access, site_flags, site_update, site_directory, site_register, site_sellpage, site_realm, site_type, site_project, site_version ) - values ( '%s', '%s', %d, %d, '%s', '%s', %d, '%s', '%s', %d, '%s', '%s' )", + $r = q("insert into site ( site_location, site_url, site_access, site_flags, site_update, site_directory, site_register, site_sellpage, site_realm, site_type, site_project, site_version, site_crypto ) + values ( '%s', '%s', %d, %d, '%s', '%s', %d, '%s', '%s', %d, '%s', '%s', '%s' )", dbesc($site_location), dbesc($url), intval($access_policy), @@ -2923,7 +2914,8 @@ function import_site($arr, $pubkey) { dbesc($site_realm), intval(SITE_TYPE_ZOT), dbesc($site_project), - dbesc($site_version) + dbesc($site_version), + dbesc($site_crypto) ); if(! $r) { logger('import_site: record create failed. ' . print_r($arr,true)); @@ -2942,6 +2934,7 @@ function import_site($arr, $pubkey) { * @param array $packet (optional) default null * @param boolean $groups_changed (optional) default false */ + function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) { if(get_config('system','server_role') === 'basic') @@ -2977,7 +2970,7 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) { if(intval($channel['channel_removed'])) return; - $h = q("select * from hubloc where hubloc_hash = '%s' and hubloc_deleted = 0", + $h = q("select hubloc.*, site.site_crypto from hubloc left join site on site_url = hubloc_url where hubloc_hash = '%s' and hubloc_deleted = 0", dbesc($channel['channel_hash']) ); @@ -3064,7 +3057,7 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) { foreach($synchubs as $hub) { $hash = random_string(); - $n = zot_build_packet($channel,'notify',$env_recips,$hub['hubloc_sitekey'],$hash); + $n = zot_build_packet($channel,'notify',$env_recips,$hub['hubloc_sitekey'],$hub['site_crypto'],$hash); queue_insert(array( 'hash' => $hash, 'account_id' => $channel['channel_account_id'], @@ -3090,6 +3083,7 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) { * @param array $deliveries * @return array */ + function process_channel_sync_delivery($sender, $arr, $deliveries) { if(get_config('system','server_role') === 'basic') @@ -3564,6 +3558,7 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) { * * \e string \b xchan_url * @return string */ + function get_rpost_path($observer) { if(! $observer) return ''; @@ -3579,6 +3574,7 @@ function get_rpost_path($observer) { * @param array $x * @return boolean|string return false or a hash */ + function import_author_zot($x) { $hash = make_xchan_hash($x['guid'],$x['guid_sig']); @@ -3618,6 +3614,7 @@ function import_author_zot($x) { * @param array $data * @return array */ + function zot_reply_message_request($data) { $ret = array('success' => false); @@ -3654,7 +3651,7 @@ function zot_reply_message_request($data) { if ($messages) { $env_recips = null; - $r = q("select * from hubloc where hubloc_hash = '%s' and hubloc_error = 0 and hubloc_deleted = 0", + $r = q("select hubloc.*, site.site_crypto from hubloc left join site on hubloc_url = site_url where hubloc_hash = '%s' and hubloc_error = 0 and hubloc_deleted = 0", dbesc($sender_hash) ); if (! $r) { @@ -3676,7 +3673,7 @@ function zot_reply_message_request($data) { * create a notify packet and drop the actual message packet in the queue for pickup */ - $n = zot_build_packet($c[0],'notify',$env_recips,(($private) ? $hub['hubloc_sitekey'] : null),$hash,array('message_id' => $data['message_id'])); + $n = zot_build_packet($c[0],'notify',$env_recips,(($private) ? $hub['hubloc_sitekey'] : null),$hub['site_crypto'],$hash,array('message_id' => $data['message_id'])); queue_insert(array( 'hash' => $hash, @@ -3913,6 +3910,11 @@ function zotinfo($arr) { $permissions['connected'] = true; } + // encrypt this with the default aes256cbc since we cannot be sure at this point which + // algorithms are preferred for communications with the remote site; notably + // because ztarget refers to an xchan and we don't necessarily know the origination + // location. + $ret['permissions'] = (($ztarget && $zkey) ? crypto_encapsulate(json_encode($permissions),$zkey) : $permissions); if($permissions['view_profile']) @@ -3943,6 +3945,8 @@ function zotinfo($arr) { $ret['site']['directory_url'] = z_root() . '/dirsearch'; + $ret['site']['encryption'] = crypto_methods(); + // hide detailed site information if you're off the grid if($dirmode != DIRECTORY_MODE_STANDALONE) { @@ -3980,17 +3984,17 @@ function zotinfo($arr) { $r = q("select * from addon where hidden = 0"); if($r) foreach($r as $rr) - $visible_plugins[] = $rr['name']; + $visible_plugins[] = $rr['aname']; } - $ret['site']['plugins'] = $visible_plugins; - $ret['site']['sitehash'] = get_config('system','location_hash'); - $ret['site']['sitename'] = get_config('system','sitename'); - $ret['site']['sellpage'] = get_config('system','sellpage'); - $ret['site']['location'] = get_config('system','site_location'); - $ret['site']['realm'] = get_directory_realm(); - $ret['site']['project'] = Zotlabs\Lib\System::get_platform_name() . ' ' . Zotlabs\Lib\System::get_server_role(); - $ret['site']['version'] = Zotlabs\Lib\System::get_project_version(); + $ret['site']['plugins'] = $visible_plugins; + $ret['site']['sitehash'] = get_config('system','location_hash'); + $ret['site']['sitename'] = get_config('system','sitename'); + $ret['site']['sellpage'] = get_config('system','sellpage'); + $ret['site']['location'] = get_config('system','site_location'); + $ret['site']['realm'] = get_directory_realm(); + $ret['site']['project'] = Zotlabs\Lib\System::get_platform_name() . ' ' . Zotlabs\Lib\System::get_server_role(); + $ret['site']['version'] = Zotlabs\Lib\System::get_project_version(); } @@ -4317,7 +4321,15 @@ function zot_reply_pickup($data) { } } - $encrypted = crypto_encapsulate(json_encode($ret),$sitekey); + // this is a bit of a hack because we don't have the hubloc_url here, only the callback url. + // worst case is we'll end up using aes256cbc if they've got a different post endpoint + + $x = q("select site_crypto from site where site_url = '%s' limit 1", + dbesc(str_replace('/post','',$data['callback'])) + ); + $algorithm = zot_best_algorithm(($x) ? $x[0]['site_crypto'] : ''); + + $encrypted = crypto_encapsulate(json_encode($ret),$sitekey,$algorithm); json_return_and_die($encrypted); /* pickup: end */ diff --git a/install/INSTALL.txt b/install/INSTALL.txt index a216e630d..7d4ed9534 100644 --- a/install/INSTALL.txt +++ b/install/INSTALL.txt @@ -1,12 +1,12 @@ -Hubzilla Installation +Software Installation -We've tried very hard to ensure that Hubzilla will run on commodity +We've tried very hard to ensure that this software will run on commodity hosting platforms - such as those used to host Wordpress blogs and Drupal websites. It will run on most any Linux VPS system. Windows LAMP platforms such as XAMPP and WAMP are not officially supported at this time - however we welcome patches if you manage to get it working. -Be aware that the Hubzilla is more than a simple web application. It is a +Be aware that this software is more than a simple web application. It is a complex communications system which more closely resembles an email server than a web server. For reliability and performance, messages are delivered in the background and are queued for later delivery when sites are down. This @@ -17,20 +17,24 @@ with your hosting provider prior to installation. (And preferably before entering into a long-term contract.) If you encounter installation issues, please let us know via the Github issue -tracker (https://github.com/redmatrix/hubzilla/issues). Please be as clear as you -can about your operating environment and provide as much detail as possible +tracker where you downloaded the software. Please be as clear as +you can about your operating environment and provide as much detail as possible about any error messages you may see, so that we can prevent it from happening in the future. Due to the large variety of operating systems and PHP platforms -in existence we may have only limited ability to debug your PHP installation or -acquire any missing modules - but we will do our best to solve any general code -issues. +in existence we may have only limited ability to debug your PHP installation +or acquire any missing modules - but we will do our best to solve any general +code issues. -Before you begin: Choose a domain name or subdomain name for your server. +**Before you begin** -Hubzilla can only be installed into the root of a domain or -sub-domain, and can not be installed using alternate TCP ports. +Choose a domain name or subdomain name for your server. + +The software can only be installed into the root of a domain or +sub-domain, and can not be installed using alternate TCP ports. These +restrictions may be relaxed in the future, but will be inconvenient to work +with, so we still STRONGLY recommend you abide by them. Decide if you will use SSL and obtain an SSL certificate before software installation. You SHOULD use SSL. If you use SSL, you MUST use a @@ -46,12 +50,12 @@ This restriction is incorporated because public posts from you may contain references to images on your own hub. Other members viewing their stream on other hubs will get warnings if your certificate is not trusted by their web browser. This will confuse many people because this is a decentralised network -and they will get the warning about your hub while viewing their own hub and may -think their own hub has an issue. These warnings are very technical and scary to -some folks, many of whom will not know how to proceed except to follow the browser -advice. This is disruptive to the community. That said, we recognise the issues -surrounding the current certificate infrastructure and agree there are many -problems, but that doesn't change the requirement. +and they will get the warning about your hub while viewing their own hub and +may think their own hub has an issue. These warnings are very technical and +scary to some folks, many of whom will not know how to proceed except to +follow the browser advice. This is disruptive to the community. That said, we +recognise the issues surrounding the current certificate infrastructure and +agree there are many problems, but that doesn't change the requirement. Free "browser-valid" certificates are available from providers such as StartSSL and LetsEncrypt. @@ -63,13 +67,36 @@ SSL port first, before falling back to a less secure connection. If you do not use SSL, your webserver MUST NOT listen on port 443 at all. If you use LetsEncrypt to provide certificates and create a file under -.well-known/acme-challenge so that LetsEncrypt can verify your domain ownership, -please remove or rename the .well-known directory as soon as the certificate is -generated. Hubzilla will provide its own handler for ".well-known" services when -it is installed, and an existing directory in this location may prevent some of -these services from working correctly. This should not be a problem with Apache, -but may be an issue with nginx or other web server platforms. +.well-known/acme-challenge so that LetsEncrypt can verify your domain +ownership, please remove or rename the .well-known directory as soon as the +certificate is generated. The software will provide its own handler for +".well-known" services when it is installed, and an existing directory in this +location may prevent some of these services from working correctly. This +should not be a problem with Apache, but may be an issue with nginx or other +web server platforms. + +**Server Roles** + +During installation you will be asked to choose a server role. Your choices are +1. Basic +2. Standard +3. Pro + +Basic is highly simplified, with almost all the advanced functionality and +complexity removed or permanently disabled. + +Standard is typically used for federated network use, when you wish to interact +with other networks using other protocols. Not all the built in features and +functionality work correctly when other networks are involved. All advanced +and complex features are available to all members by default. + +Pro is for sites that wish to make full use of the built-in abilities and +features, but **not** to interact with other networks. Advanced features are +enabled according to a per-account 'techlevel' which reduces complexity +initially and allows members to adjust the software complexity to match their +technical abilities. +**Installation** 1. Requirements - Apache with mod-rewrite enabled and "AllowOverride All" so you can use a @@ -96,7 +123,7 @@ but may be an issue with nginx or other web server platforms. - Installation into a top-level domain or sub-domain (without a directory/path component in the URL) is REQUIRED. -2. Unpack the Hubzilla files into the root of your web server document area. +2. Unpack the project files into the root of your web server document area. If you copy the directory tree to your webserver, make sure that you also copy .htaccess - as "dot" files are often hidden and aren't normally diff --git a/install/schema_mysql.sql b/install/schema_mysql.sql index 4cbcfc64d..e143e252a 100644 --- a/install/schema_mysql.sql +++ b/install/schema_mysql.sql @@ -1153,6 +1153,7 @@ CREATE TABLE IF NOT EXISTS `site` ( `site_type` smallint NOT NULL DEFAULT '0', `site_project` char(255) NOT NULL DEFAULT '', `site_version` varchar(32) NOT NULL DEFAULT '', + `site_crypto` text NOT NULL DEFAULT '', PRIMARY KEY (`site_url`), KEY `site_flags` (`site_flags`), KEY `site_update` (`site_update`), diff --git a/install/schema_postgres.sql b/install/schema_postgres.sql index a682aa49d..b1b1c8474 100644 --- a/install/schema_postgres.sql +++ b/install/schema_postgres.sql @@ -1134,6 +1134,7 @@ CREATE TABLE "site" ( "site_type" smallint NOT NULL DEFAULT '0', "site_project" text NOT NULL DEFAULT '', "site_version" text NOT NULL DEFAULT '', + "site_crypto" text NOT NULL DEFAULT '', PRIMARY KEY ("site_url") ); create index "site_flags" on site ("site_flags"); diff --git a/install/update.php b/install/update.php index 7e7104b74..dbf3a08ca 100644 --- a/install/update.php +++ b/install/update.php @@ -1,6 +1,6 @@ <?php -define( 'UPDATE_VERSION' , 1184 ); +define( 'UPDATE_VERSION' , 1185 ); /** * @@ -2463,3 +2463,12 @@ function update_r1183() { return UPDATE_SUCCESS; return UPDATE_FAILED; } + +function update_r1184() { + + $r1 = q("alter table site add site_crypto text not null default '' "); + + if($r1) + return UPDATE_SUCCESS; + return UPDATE_FAILED; +} diff --git a/util/hmessages.po b/util/hmessages.po index 0293d32b7..6961532cb 100644 --- a/util/hmessages.po +++ b/util/hmessages.po @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: 1.15.1\n" +"Project-Id-Version: 1.15.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-11-11 00:05-0800\n" +"POT-Creation-Date: 2016-12-02 00:05-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -17,154 +17,155 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../../Zotlabs/Access/PermissionRoles.php:182 +#: ../../Zotlabs/Access/PermissionRoles.php:227 #: ../../include/permissions.php:945 msgid "Social Networking" msgstr "" -#: ../../Zotlabs/Access/PermissionRoles.php:183 +#: ../../Zotlabs/Access/PermissionRoles.php:228 #: ../../include/permissions.php:945 msgid "Social - Mostly Public" msgstr "" -#: ../../Zotlabs/Access/PermissionRoles.php:184 +#: ../../Zotlabs/Access/PermissionRoles.php:229 #: ../../include/permissions.php:945 msgid "Social - Restricted" msgstr "" -#: ../../Zotlabs/Access/PermissionRoles.php:185 +#: ../../Zotlabs/Access/PermissionRoles.php:230 #: ../../include/permissions.php:945 msgid "Social - Private" msgstr "" -#: ../../Zotlabs/Access/PermissionRoles.php:188 +#: ../../Zotlabs/Access/PermissionRoles.php:233 #: ../../include/permissions.php:946 msgid "Community Forum" msgstr "" -#: ../../Zotlabs/Access/PermissionRoles.php:189 +#: ../../Zotlabs/Access/PermissionRoles.php:234 #: ../../include/permissions.php:946 msgid "Forum - Mostly Public" msgstr "" -#: ../../Zotlabs/Access/PermissionRoles.php:190 +#: ../../Zotlabs/Access/PermissionRoles.php:235 #: ../../include/permissions.php:946 msgid "Forum - Restricted" msgstr "" -#: ../../Zotlabs/Access/PermissionRoles.php:191 +#: ../../Zotlabs/Access/PermissionRoles.php:236 #: ../../include/permissions.php:946 msgid "Forum - Private" msgstr "" -#: ../../Zotlabs/Access/PermissionRoles.php:194 +#: ../../Zotlabs/Access/PermissionRoles.php:239 #: ../../include/permissions.php:947 msgid "Feed Republish" msgstr "" -#: ../../Zotlabs/Access/PermissionRoles.php:195 +#: ../../Zotlabs/Access/PermissionRoles.php:240 #: ../../include/permissions.php:947 msgid "Feed - Mostly Public" msgstr "" -#: ../../Zotlabs/Access/PermissionRoles.php:196 +#: ../../Zotlabs/Access/PermissionRoles.php:241 #: ../../include/permissions.php:947 msgid "Feed - Restricted" msgstr "" -#: ../../Zotlabs/Access/PermissionRoles.php:199 +#: ../../Zotlabs/Access/PermissionRoles.php:244 #: ../../include/permissions.php:948 msgid "Special Purpose" msgstr "" -#: ../../Zotlabs/Access/PermissionRoles.php:200 +#: ../../Zotlabs/Access/PermissionRoles.php:245 #: ../../include/permissions.php:948 msgid "Special - Celebrity/Soapbox" msgstr "" -#: ../../Zotlabs/Access/PermissionRoles.php:201 +#: ../../Zotlabs/Access/PermissionRoles.php:246 #: ../../include/permissions.php:948 msgid "Special - Group Repository" msgstr "" -#: ../../Zotlabs/Access/PermissionRoles.php:204 +#: ../../Zotlabs/Access/PermissionRoles.php:249 #: ../../Zotlabs/Module/Register.php:213 #: ../../Zotlabs/Module/New_channel.php:132 #: ../../Zotlabs/Module/Settings/Channel.php:442 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1144 -#: ../../extend/addon/addon/cdav/cdav.php:270 -#: ../../extend/addon/addon/cdav/cdav.php:277 ../../include/selectors.php:49 -#: ../../include/selectors.php:66 ../../include/selectors.php:104 -#: ../../include/selectors.php:140 ../../include/permissions.php:949 +#: ../../extend/addon/addon/cdav/cdav.php:271 +#: ../../extend/addon/addon/cdav/cdav.php:278 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1148 +#: ../../include/selectors.php:49 ../../include/selectors.php:66 +#: ../../include/selectors.php:104 ../../include/selectors.php:140 +#: ../../include/permissions.php:949 msgid "Other" msgstr "" -#: ../../Zotlabs/Access/PermissionRoles.php:205 +#: ../../Zotlabs/Access/PermissionRoles.php:250 #: ../../include/permissions.php:949 msgid "Custom/Expert Mode" msgstr "" -#: ../../Zotlabs/Access/Permissions.php:30 +#: ../../Zotlabs/Access/Permissions.php:46 msgid "Can view my channel stream and posts" msgstr "" -#: ../../Zotlabs/Access/Permissions.php:31 ../../include/permissions.php:42 +#: ../../Zotlabs/Access/Permissions.php:47 ../../include/permissions.php:42 msgid "Can send me their channel stream and posts" msgstr "" -#: ../../Zotlabs/Access/Permissions.php:32 ../../include/permissions.php:36 +#: ../../Zotlabs/Access/Permissions.php:48 ../../include/permissions.php:36 msgid "Can view my default channel profile" msgstr "" -#: ../../Zotlabs/Access/Permissions.php:33 ../../include/permissions.php:37 +#: ../../Zotlabs/Access/Permissions.php:49 ../../include/permissions.php:37 msgid "Can view my connections" msgstr "" -#: ../../Zotlabs/Access/Permissions.php:34 ../../include/permissions.php:38 +#: ../../Zotlabs/Access/Permissions.php:50 ../../include/permissions.php:38 msgid "Can view my file storage and photos" msgstr "" -#: ../../Zotlabs/Access/Permissions.php:35 +#: ../../Zotlabs/Access/Permissions.php:51 msgid "Can upload/modify my file storage and photos" msgstr "" -#: ../../Zotlabs/Access/Permissions.php:36 +#: ../../Zotlabs/Access/Permissions.php:52 msgid "Can view my channel webpages" msgstr "" -#: ../../Zotlabs/Access/Permissions.php:37 +#: ../../Zotlabs/Access/Permissions.php:53 msgid "Can create/edit my channel webpages" msgstr "" -#: ../../Zotlabs/Access/Permissions.php:38 +#: ../../Zotlabs/Access/Permissions.php:54 msgid "Can post on my channel (wall) page" msgstr "" -#: ../../Zotlabs/Access/Permissions.php:39 ../../include/permissions.php:44 +#: ../../Zotlabs/Access/Permissions.php:55 ../../include/permissions.php:44 msgid "Can comment on or like my posts" msgstr "" -#: ../../Zotlabs/Access/Permissions.php:40 ../../include/permissions.php:45 +#: ../../Zotlabs/Access/Permissions.php:56 ../../include/permissions.php:45 msgid "Can send me private mail messages" msgstr "" -#: ../../Zotlabs/Access/Permissions.php:41 +#: ../../Zotlabs/Access/Permissions.php:57 msgid "Can like/dislike profiles and profile things" msgstr "" -#: ../../Zotlabs/Access/Permissions.php:42 +#: ../../Zotlabs/Access/Permissions.php:58 msgid "Can forward to all my channel connections via @+ mentions in posts" msgstr "" -#: ../../Zotlabs/Access/Permissions.php:43 +#: ../../Zotlabs/Access/Permissions.php:59 msgid "Can chat with me" msgstr "" -#: ../../Zotlabs/Access/Permissions.php:44 ../../include/permissions.php:53 +#: ../../Zotlabs/Access/Permissions.php:60 ../../include/permissions.php:53 msgid "Can source my public posts in derived channels" msgstr "" -#: ../../Zotlabs/Access/Permissions.php:45 +#: ../../Zotlabs/Access/Permissions.php:61 msgid "Can administer my channel" msgstr "" @@ -172,7 +173,7 @@ msgstr "" msgid "parent" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2723 +#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2679 msgid "Collection" msgstr "" @@ -200,16 +201,16 @@ msgstr "" #: ../../Zotlabs/Module/Photos.php:1249 #: ../../Zotlabs/Module/Embedphotos.php:145 ../../Zotlabs/Lib/Apps.php:490 #: ../../Zotlabs/Lib/Apps.php:565 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:744 #: ../../extend/addon/addon/cdav/Mod_Cdav.php:745 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:752 -#: ../../include/widgets.php:1682 ../../include/conversation.php:1047 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753 +#: ../../include/widgets.php:1745 ../../include/conversation.php:1047 msgid "Unknown" msgstr "" #: ../../Zotlabs/Storage/Browser.php:224 ../../Zotlabs/Module/Fbrowser.php:85 #: ../../Zotlabs/Lib/Apps.php:217 ../../include/nav.php:96 -#: ../../include/conversation.php:1700 +#: ../../include/conversation.php:1699 msgid "Files" msgstr "" @@ -227,7 +228,8 @@ msgstr "" #: ../../Zotlabs/Module/Webpages.php:239 #: ../../extend/addon/addon/cdav/include/widgets.php:127 #: ../../extend/addon/addon/cdav/include/widgets.php:164 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1147 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1151 +#: ../../include/widgets.php:969 msgid "Create" msgstr "" @@ -238,17 +240,17 @@ msgstr "" #: ../../Zotlabs/Module/Embedphotos.php:157 #: ../../extend/addon/addon/cdav/include/widgets.php:132 #: ../../extend/addon/addon/cdav/include/widgets.php:168 -#: ../../include/widgets.php:1695 +#: ../../include/widgets.php:1758 msgid "Upload" msgstr "" #: ../../Zotlabs/Storage/Browser.php:233 #: ../../Zotlabs/Module/Admin/Channels.php:159 -#: ../../Zotlabs/Module/Sharedwithme.php:99 +#: ../../Zotlabs/Module/Sharedwithme.php:99 ../../Zotlabs/Module/Wiki.php:151 #: ../../Zotlabs/Module/Settings/Oauth.php:89 #: ../../Zotlabs/Module/Settings/Oauth.php:115 #: ../../Zotlabs/Module/Chat.php:250 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1132 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1136 #: ../../extend/addon/addon/rendezvous/rendezvous.php:132 msgid "Name" msgstr "" @@ -258,7 +260,7 @@ msgid "Type" msgstr "" #: ../../Zotlabs/Storage/Browser.php:235 -#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1397 +#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1390 msgid "Size" msgstr "" @@ -268,14 +270,15 @@ msgid "Last Modified" msgstr "" #: ../../Zotlabs/Storage/Browser.php:238 -#: ../../Zotlabs/Module/Editblock.php:109 #: ../../Zotlabs/Module/Connections.php:290 #: ../../Zotlabs/Module/Connections.php:310 #: ../../Zotlabs/Module/Admin/Profs.php:154 #: ../../Zotlabs/Module/Editlayout.php:114 #: ../../Zotlabs/Module/Editwebpage.php:145 ../../Zotlabs/Module/Menu.php:112 -#: ../../Zotlabs/Module/Editpost.php:84 ../../Zotlabs/Module/Blocks.php:160 -#: ../../Zotlabs/Module/Layouts.php:192 ../../Zotlabs/Module/Webpages.php:240 +#: ../../Zotlabs/Module/Editblock.php:109 ../../Zotlabs/Module/Editpost.php:84 +#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Layouts.php:192 +#: ../../Zotlabs/Module/Webpages.php:240 ../../Zotlabs/Module/Wiki.php:144 +#: ../../Zotlabs/Module/Wiki.php:251 #: ../../Zotlabs/Module/Settings/Oauth.php:149 #: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Lib/Apps.php:341 #: ../../Zotlabs/Lib/ThreadItem.php:106 @@ -283,25 +286,25 @@ msgstr "" #: ../../extend/addon/addon/cdav/include/widgets.php:161 #: ../../include/channel.php:961 ../../include/channel.php:965 #: ../../include/page_widgets.php:9 ../../include/page_widgets.php:39 -#: ../../include/menu.php:113 +#: ../../include/menu.php:113 ../../include/widgets.php:965 msgid "Edit" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:239 -#: ../../Zotlabs/Module/Editblock.php:134 +#: ../../Zotlabs/Storage/Browser.php:239 ../../Zotlabs/Module/Connedit.php:635 #: ../../Zotlabs/Module/Connections.php:263 #: ../../Zotlabs/Module/Admin/Profs.php:155 #: ../../Zotlabs/Module/Admin/Accounts.php:173 #: ../../Zotlabs/Module/Admin/Channels.php:149 #: ../../Zotlabs/Module/Editlayout.php:137 -#: ../../Zotlabs/Module/Editwebpage.php:170 ../../Zotlabs/Module/Group.php:177 +#: ../../Zotlabs/Module/Editwebpage.php:170 +#: ../../Zotlabs/Module/Editblock.php:134 ../../Zotlabs/Module/Group.php:177 #: ../../Zotlabs/Module/Photos.php:1179 ../../Zotlabs/Module/Blocks.php:162 -#: ../../Zotlabs/Module/Connedit.php:608 ../../Zotlabs/Module/Webpages.php:242 +#: ../../Zotlabs/Module/Webpages.php:242 #: ../../Zotlabs/Module/Settings/Oauth.php:150 #: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Lib/Apps.php:342 #: ../../Zotlabs/Lib/ThreadItem.php:126 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:860 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1149 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:864 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1153 #: ../../include/conversation.php:676 msgid "Delete" msgstr "" @@ -332,22 +335,12 @@ msgstr "" msgid "Drop files here to immediately upload" msgstr "" -#: ../../Zotlabs/Web/WebServer.php:127 ../../Zotlabs/Module/Profperm.php:28 -#: ../../Zotlabs/Module/Group.php:72 ../../Zotlabs/Module/Import_items.php:114 -#: ../../Zotlabs/Module/Like.php:283 ../../Zotlabs/Module/Dreport.php:10 -#: ../../Zotlabs/Module/Dreport.php:68 ../../Zotlabs/Module/Subthread.php:62 -#: ../../extend/addon/addon/frphotos/frphotos.php:81 -#: ../../extend/addon/addon/redfiles/redfiles.php:109 -#: ../../extend/addon/addon/redphotos/redphotos.php:119 -#: ../../include/items.php:399 -msgid "Permission denied" -msgstr "" - -#: ../../Zotlabs/Web/WebServer.php:128 ../../Zotlabs/Web/Router.php:67 +#: ../../Zotlabs/Web/Router.php:67 ../../Zotlabs/Web/WebServer.php:128 #: ../../Zotlabs/Module/Achievements.php:34 -#: ../../Zotlabs/Module/Register.php:77 ../../Zotlabs/Module/Authtest.php:16 -#: ../../Zotlabs/Module/Bookmarks.php:61 ../../Zotlabs/Module/Editblock.php:67 -#: ../../Zotlabs/Module/Page.php:35 ../../Zotlabs/Module/Page.php:91 +#: ../../Zotlabs/Module/Register.php:77 ../../Zotlabs/Module/Connedit.php:397 +#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Bookmarks.php:61 +#: ../../Zotlabs/Module/Locs.php:87 ../../Zotlabs/Module/Page.php:35 +#: ../../Zotlabs/Module/Page.php:91 ../../Zotlabs/Module/Manage.php:10 #: ../../Zotlabs/Module/Connections.php:33 #: ../../Zotlabs/Module/Cover_photo.php:277 #: ../../Zotlabs/Module/Cover_photo.php:290 @@ -356,57 +349,58 @@ msgstr "" #: ../../Zotlabs/Module/Editwebpage.php:68 #: ../../Zotlabs/Module/Editwebpage.php:89 #: ../../Zotlabs/Module/Editwebpage.php:104 -#: ../../Zotlabs/Module/Editwebpage.php:126 ../../Zotlabs/Module/Manage.php:10 +#: ../../Zotlabs/Module/Editwebpage.php:126 +#: ../../Zotlabs/Module/Channel.php:107 ../../Zotlabs/Module/Channel.php:237 +#: ../../Zotlabs/Module/Channel.php:277 ../../Zotlabs/Module/Network.php:15 #: ../../Zotlabs/Module/Menu.php:78 ../../Zotlabs/Module/Appman.php:75 -#: ../../Zotlabs/Module/Api.php:24 ../../Zotlabs/Module/Filestorage.php:23 +#: ../../Zotlabs/Module/Filestorage.php:23 #: ../../Zotlabs/Module/Filestorage.php:78 #: ../../Zotlabs/Module/Filestorage.php:93 #: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Item.php:216 #: ../../Zotlabs/Module/Item.php:224 ../../Zotlabs/Module/Item.php:1074 -#: ../../Zotlabs/Module/Profiles.php:197 ../../Zotlabs/Module/Profiles.php:595 -#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Group.php:13 +#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Mail.php:135 #: ../../Zotlabs/Module/Block.php:26 ../../Zotlabs/Module/Block.php:76 -#: ../../Zotlabs/Module/Channel.php:107 ../../Zotlabs/Module/Channel.php:237 -#: ../../Zotlabs/Module/Channel.php:277 ../../Zotlabs/Module/Locs.php:87 -#: ../../Zotlabs/Module/Like.php:181 ../../Zotlabs/Module/Mitem.php:115 -#: ../../Zotlabs/Module/Message.php:18 ../../Zotlabs/Module/Mood.php:116 -#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Photos.php:73 -#: ../../Zotlabs/Module/Setup.php:218 ../../Zotlabs/Module/Network.php:15 +#: ../../Zotlabs/Module/Invite.php:17 ../../Zotlabs/Module/Invite.php:94 +#: ../../Zotlabs/Module/Editblock.php:67 ../../Zotlabs/Module/Group.php:13 +#: ../../Zotlabs/Module/Mitem.php:115 ../../Zotlabs/Module/Message.php:18 +#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Photos.php:73 +#: ../../Zotlabs/Module/Setup.php:218 ../../Zotlabs/Module/Editpost.php:17 #: ../../Zotlabs/Module/New_channel.php:77 -#: ../../Zotlabs/Module/New_channel.php:104 ../../Zotlabs/Module/Mail.php:135 +#: ../../Zotlabs/Module/New_channel.php:104 #: ../../Zotlabs/Module/Notifications.php:11 ../../Zotlabs/Module/Poke.php:137 -#: ../../Zotlabs/Module/Invite.php:17 ../../Zotlabs/Module/Invite.php:94 +#: ../../Zotlabs/Module/Profiles.php:197 ../../Zotlabs/Module/Profiles.php:595 #: ../../Zotlabs/Module/Profile.php:68 ../../Zotlabs/Module/Profile.php:76 #: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80 #: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78 #: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Module/Rate.php:113 +#: ../../Zotlabs/Module/Like.php:181 #: ../../Zotlabs/Module/Profile_photo.php:273 #: ../../Zotlabs/Module/Profile_photo.php:286 -#: ../../Zotlabs/Module/Common.php:39 ../../Zotlabs/Module/Events.php:267 +#: ../../Zotlabs/Module/Common.php:39 ../../Zotlabs/Module/Api.php:24 #: ../../Zotlabs/Module/Regmod.php:21 ../../Zotlabs/Module/Pdledit.php:29 -#: ../../Zotlabs/Module/Connedit.php:395 #: ../../Zotlabs/Module/Service_limits.php:11 #: ../../Zotlabs/Module/Webpages.php:116 -#: ../../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:335 +#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Wiki.php:188 +#: ../../Zotlabs/Module/Wiki.php:301 ../../Zotlabs/Module/Sources.php:74 +#: ../../Zotlabs/Module/Suggest.php:30 ../../Zotlabs/Module/Thing.php:274 +#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335 #: ../../Zotlabs/Module/Viewconnections.php:28 #: ../../Zotlabs/Module/Viewconnections.php:33 #: ../../Zotlabs/Module/Viewsrc.php:18 ../../Zotlabs/Module/Chat.php:100 -#: ../../Zotlabs/Module/Chat.php:105 ../../Zotlabs/Lib/Chatroom.php:137 +#: ../../Zotlabs/Module/Chat.php:105 ../../Zotlabs/Module/Events.php:267 +#: ../../Zotlabs/Lib/Chatroom.php:137 #: ../../extend/addon/addon/friendica/dfrn_confirm.php:55 #: ../../extend/addon/addon/keepout/keepout.php:36 #: ../../extend/addon/addon/pumpio/pumpio.php:40 #: ../../extend/addon/addon/openid/Mod_Id.php:53 #: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:58 -#: ../../include/photos.php:27 ../../include/attach.php:142 +#: ../../include/items.php:3429 ../../include/attach.php:142 #: ../../include/attach.php:189 ../../include/attach.php:253 #: ../../include/attach.php:267 ../../include/attach.php:274 #: ../../include/attach.php:341 ../../include/attach.php:355 #: ../../include/attach.php:362 ../../include/attach.php:439 #: ../../include/attach.php:906 ../../include/attach.php:977 -#: ../../include/attach.php:1135 ../../include/items.php:3490 +#: ../../include/attach.php:1135 ../../include/photos.php:27 msgid "Permission denied." msgstr "" @@ -414,19 +408,31 @@ msgstr "" msgid "Not Found" msgstr "" -#: ../../Zotlabs/Web/Router.php:151 ../../Zotlabs/Module/Display.php:120 -#: ../../Zotlabs/Module/Page.php:94 ../../Zotlabs/Module/Block.php:79 +#: ../../Zotlabs/Web/Router.php:151 ../../Zotlabs/Module/Page.php:94 +#: ../../Zotlabs/Module/Display.php:120 ../../Zotlabs/Module/Block.php:79 #: ../../include/help.php:65 msgid "Page not found." msgstr "" +#: ../../Zotlabs/Web/WebServer.php:127 ../../Zotlabs/Module/Dreport.php:10 +#: ../../Zotlabs/Module/Dreport.php:68 +#: ../../Zotlabs/Module/Import_items.php:114 ../../Zotlabs/Module/Group.php:72 +#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Like.php:283 +#: ../../Zotlabs/Module/Subthread.php:62 +#: ../../extend/addon/addon/frphotos/frphotos.php:81 +#: ../../extend/addon/addon/redfiles/redfiles.php:109 +#: ../../extend/addon/addon/redphotos/redphotos.php:119 +#: ../../include/items.php:327 +msgid "Permission denied" +msgstr "" + #: ../../Zotlabs/Zot/Auth.php:138 msgid "" "Remote authentication blocked. You are logged into this site locally. Please " "logout and retry." msgstr "" -#: ../../Zotlabs/Zot/Auth.php:246 +#: ../../Zotlabs/Zot/Auth.php:250 #: ../../extend/addon/addon/openid/Mod_Openid.php:76 #: ../../extend/addon/addon/openid/Mod_Openid.php:183 #, php-format @@ -434,10 +440,10 @@ msgid "Welcome %s. Remote authentication successful." msgstr "" #: ../../Zotlabs/Module/Achievements.php:15 -#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Editblock.php:31 -#: ../../Zotlabs/Module/Editlayout.php:31 +#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Editlayout.php:31 #: ../../Zotlabs/Module/Editwebpage.php:32 -#: ../../Zotlabs/Module/Filestorage.php:59 ../../Zotlabs/Module/Hcard.php:12 +#: ../../Zotlabs/Module/Filestorage.php:59 +#: ../../Zotlabs/Module/Editblock.php:31 ../../Zotlabs/Module/Hcard.php:12 #: ../../Zotlabs/Module/Profile.php:20 ../../Zotlabs/Module/Blocks.php:33 #: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Webpages.php:33 #: ../../include/channel.php:862 @@ -500,7 +506,7 @@ msgid "" "Please try again tomorrow." msgstr "" -#: ../../Zotlabs/Module/Register.php:221 +#: ../../Zotlabs/Module/Register.php:221 ../../Zotlabs/Module/Siteinfo.php:27 msgid "Terms of Service" msgstr "" @@ -579,7 +585,7 @@ msgid "yes" msgstr "" #: ../../Zotlabs/Module/Register.php:253 -#: ../../Zotlabs/Module/Admin/Site.php:259 +#: ../../Zotlabs/Module/Admin/Site.php:261 msgid "Registration" msgstr "" @@ -587,8 +593,8 @@ msgstr "" msgid "Membership on this site is by invitation only." msgstr "" -#: ../../Zotlabs/Module/Register.php:270 ../../include/nav.php:152 -#: ../../boot.php:1697 +#: ../../Zotlabs/Module/Register.php:270 ../../include/nav.php:150 +#: ../../boot.php:1701 msgid "Register" msgstr "" @@ -603,121 +609,429 @@ msgstr "" msgid "Fetching URL returns error: %1$s" msgstr "" -#: ../../Zotlabs/Module/Display.php:17 ../../Zotlabs/Module/Search.php:17 -#: ../../Zotlabs/Module/Directory.php:64 ../../Zotlabs/Module/Ratings.php:83 -#: ../../Zotlabs/Module/Photos.php:509 -#: ../../Zotlabs/Module/Viewconnections.php:23 -#: ../../extend/addon/addon/friendica/dfrn_request.php:794 -msgid "Public access denied." +#: ../../Zotlabs/Module/Match.php:26 +msgid "Profile Match" msgstr "" -#: ../../Zotlabs/Module/Display.php:40 -#: ../../Zotlabs/Module/Admin/Plugins.php:254 -#: ../../Zotlabs/Module/Admin/Themes.php:69 -#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Admin.php:60 -#: ../../Zotlabs/Module/Thing.php:89 ../../Zotlabs/Module/Viewsrc.php:24 -#: ../../include/items.php:3411 -msgid "Item not found." +#: ../../Zotlabs/Module/Match.php:35 +msgid "No keywords to match. Please add keywords to your default profile." msgstr "" -#: ../../Zotlabs/Module/Import.php:33 -#, php-format -msgid "Your service plan only allows %d channels." +#: ../../Zotlabs/Module/Match.php:67 +msgid "is interested in:" msgstr "" -#: ../../Zotlabs/Module/Import.php:71 ../../Zotlabs/Module/Import_items.php:42 -msgid "Nothing to import." +#: ../../Zotlabs/Module/Match.php:68 ../../Zotlabs/Module/Directory.php:328 +#: ../../Zotlabs/Module/Suggest.php:56 ../../include/channel.php:1036 +#: ../../include/connections.php:78 ../../include/widgets.php:147 +#: ../../include/widgets.php:184 ../../include/conversation.php:971 +msgid "Connect" msgstr "" -#: ../../Zotlabs/Module/Import.php:83 ../../Zotlabs/Module/Import.php:98 -#: ../../Zotlabs/Module/Import_items.php:66 -msgid "Unable to download data from old server" +#: ../../Zotlabs/Module/Match.php:74 +msgid "No matches" msgstr "" -#: ../../Zotlabs/Module/Import.php:105 -#: ../../Zotlabs/Module/Import_items.php:72 -msgid "Imported file is empty." +#: ../../Zotlabs/Module/Connedit.php:82 +msgid "Could not access contact record." msgstr "" -#: ../../Zotlabs/Module/Import.php:127 -#: ../../Zotlabs/Module/Import_items.php:88 +#: ../../Zotlabs/Module/Connedit.php:106 +msgid "Could not locate selected profile." +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:258 +msgid "Connection updated." +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:260 +msgid "Failed to update connection record." +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:310 +msgid "is now connected to" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:411 ../../Zotlabs/Module/Connedit.php:716 +#: ../../Zotlabs/Module/Admin/Site.php:218 ../../Zotlabs/Module/Menu.php:100 +#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Filestorage.php:160 +#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162 +#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240 +#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Photos.php:653 +#: ../../Zotlabs/Module/Profiles.php:641 ../../Zotlabs/Module/Api.php:97 +#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Wiki.php:158 +#: ../../Zotlabs/Module/Settings/Channel.php:289 +#: ../../Zotlabs/Module/Settings/Display.php:103 +#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:464 +#: ../../extend/addon/addon/dwpost/dwpost.php:73 +#: ../../extend/addon/addon/dwpost/dwpost.php:85 +#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120 +#: ../../extend/addon/addon/friendica/dfrn_request.php:865 +#: ../../extend/addon/addon/ijpost/ijpost.php:73 +#: ../../extend/addon/addon/ijpost/ijpost.php:85 +#: ../../extend/addon/addon/jappixmini/jappixmini.php:309 +#: ../../extend/addon/addon/jappixmini/jappixmini.php:313 +#: ../../extend/addon/addon/jappixmini/jappixmini.php:343 +#: ../../extend/addon/addon/jappixmini/jappixmini.php:351 +#: ../../extend/addon/addon/jappixmini/jappixmini.php:355 +#: ../../extend/addon/addon/jappixmini/jappixmini.php:359 +#: ../../extend/addon/addon/libertree/libertree.php:69 +#: ../../extend/addon/addon/libertree/libertree.php:81 +#: ../../extend/addon/addon/ljpost/ljpost.php:70 +#: ../../extend/addon/addon/ljpost/ljpost.php:82 +#: ../../extend/addon/addon/nofed/nofed.php:72 +#: ../../extend/addon/addon/nofed/nofed.php:76 +#: ../../extend/addon/addon/nsabait/nsabait.php:157 +#: ../../extend/addon/addon/nsfw/nsfw.php:84 +#: ../../extend/addon/addon/planets/planets.php:153 +#: ../../extend/addon/addon/pumpio/pumpio.php:219 +#: ../../extend/addon/addon/pumpio/pumpio.php:223 +#: ../../extend/addon/addon/pumpio/pumpio.php:227 +#: ../../extend/addon/addon/pumpio/pumpio.php:231 +#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81 +#: ../../extend/addon/addon/redred/redred.php:95 +#: ../../extend/addon/addon/redred/redred.php:99 +#: ../../extend/addon/addon/rtof/rtof.php:81 +#: ../../extend/addon/addon/rtof/rtof.php:85 +#: ../../extend/addon/addon/smileybutton/smileybutton.php:273 +#: ../../extend/addon/addon/smileybutton/smileybutton.php:277 +#: ../../extend/addon/addon/statusnet/statusnet.php:389 +#: ../../extend/addon/addon/statusnet/statusnet.php:411 +#: ../../extend/addon/addon/statusnet/statusnet.php:415 +#: ../../extend/addon/addon/statusnet/statusnet.php:424 +#: ../../extend/addon/addon/twitter/twitter.php:242 +#: ../../extend/addon/addon/twitter/twitter.php:246 +#: ../../extend/addon/addon/twitter/twitter.php:255 +#: ../../extend/addon/addon/visage/visage.php:166 +#: ../../extend/addon/addon/wppost/wppost.php:82 +#: ../../extend/addon/addon/wppost/wppost.php:105 +#: ../../extend/addon/addon/wppost/wppost.php:109 +#: ../../extend/addon/addon/xmpp/xmpp.php:53 +#: ../../extend/addon/addon/cdav/cdav.php:228 ../../include/dir_fns.php:143 +#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145 +#: ../../include/widgets.php:978 ../../view/theme/redbasic/php/config.php:111 +#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1723 +msgid "No" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:411 +#: ../../Zotlabs/Module/Admin/Site.php:220 ../../Zotlabs/Module/Menu.php:100 +#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Filestorage.php:160 +#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162 +#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240 +#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Photos.php:653 +#: ../../Zotlabs/Module/Profiles.php:641 ../../Zotlabs/Module/Api.php:96 +#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Wiki.php:158 +#: ../../Zotlabs/Module/Settings/Channel.php:289 +#: ../../Zotlabs/Module/Settings/Display.php:103 +#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:464 +#: ../../extend/addon/addon/dwpost/dwpost.php:73 +#: ../../extend/addon/addon/dwpost/dwpost.php:85 +#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120 +#: ../../extend/addon/addon/friendica/dfrn_request.php:865 +#: ../../extend/addon/addon/ijpost/ijpost.php:73 +#: ../../extend/addon/addon/ijpost/ijpost.php:85 +#: ../../extend/addon/addon/jappixmini/jappixmini.php:309 +#: ../../extend/addon/addon/jappixmini/jappixmini.php:313 +#: ../../extend/addon/addon/jappixmini/jappixmini.php:343 +#: ../../extend/addon/addon/jappixmini/jappixmini.php:351 +#: ../../extend/addon/addon/jappixmini/jappixmini.php:355 +#: ../../extend/addon/addon/jappixmini/jappixmini.php:359 +#: ../../extend/addon/addon/libertree/libertree.php:69 +#: ../../extend/addon/addon/libertree/libertree.php:81 +#: ../../extend/addon/addon/ljpost/ljpost.php:70 +#: ../../extend/addon/addon/ljpost/ljpost.php:82 +#: ../../extend/addon/addon/nofed/nofed.php:72 +#: ../../extend/addon/addon/nofed/nofed.php:76 +#: ../../extend/addon/addon/nsabait/nsabait.php:157 +#: ../../extend/addon/addon/nsfw/nsfw.php:84 +#: ../../extend/addon/addon/planets/planets.php:153 +#: ../../extend/addon/addon/pumpio/pumpio.php:219 +#: ../../extend/addon/addon/pumpio/pumpio.php:223 +#: ../../extend/addon/addon/pumpio/pumpio.php:227 +#: ../../extend/addon/addon/pumpio/pumpio.php:231 +#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81 +#: ../../extend/addon/addon/redred/redred.php:95 +#: ../../extend/addon/addon/redred/redred.php:99 +#: ../../extend/addon/addon/rtof/rtof.php:81 +#: ../../extend/addon/addon/rtof/rtof.php:85 +#: ../../extend/addon/addon/smileybutton/smileybutton.php:273 +#: ../../extend/addon/addon/smileybutton/smileybutton.php:277 +#: ../../extend/addon/addon/statusnet/statusnet.php:389 +#: ../../extend/addon/addon/statusnet/statusnet.php:411 +#: ../../extend/addon/addon/statusnet/statusnet.php:415 +#: ../../extend/addon/addon/statusnet/statusnet.php:424 +#: ../../extend/addon/addon/twitter/twitter.php:242 +#: ../../extend/addon/addon/twitter/twitter.php:246 +#: ../../extend/addon/addon/twitter/twitter.php:255 +#: ../../extend/addon/addon/visage/visage.php:166 +#: ../../extend/addon/addon/wppost/wppost.php:82 +#: ../../extend/addon/addon/wppost/wppost.php:105 +#: ../../extend/addon/addon/wppost/wppost.php:109 +#: ../../extend/addon/addon/xmpp/xmpp.php:53 +#: ../../extend/addon/addon/cdav/cdav.php:228 ../../include/dir_fns.php:143 +#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145 +#: ../../include/widgets.php:978 ../../view/theme/redbasic/php/config.php:111 +#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1723 +msgid "Yes" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:443 +msgid "Could not access address book record." +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:463 +msgid "Refresh failed - channel is currently unavailable." +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:478 ../../Zotlabs/Module/Connedit.php:487 +#: ../../Zotlabs/Module/Connedit.php:496 ../../Zotlabs/Module/Connedit.php:505 +#: ../../Zotlabs/Module/Connedit.php:518 +msgid "Unable to set address book parameters." +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:542 +msgid "Connection has been removed." +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:582 ../../Zotlabs/Lib/Apps.php:221 +#: ../../extend/addon/addon/openclipatar/openclipatar.php:56 +#: ../../include/nav.php:89 ../../include/conversation.php:969 +msgid "View Profile" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:585 #, php-format -msgid "Warning: Database versions differ by %1$d updates." +msgid "View %s's profile" msgstr "" -#: ../../Zotlabs/Module/Import.php:157 ../../include/import.php:100 -msgid "Cloned channel not found. Import failed." +#: ../../Zotlabs/Module/Connedit.php:589 +msgid "Refresh Permissions" msgstr "" -#: ../../Zotlabs/Module/Import.php:167 -msgid "No channel. Import failed." +#: ../../Zotlabs/Module/Connedit.php:592 +msgid "Fetch updated permissions" msgstr "" -#: ../../Zotlabs/Module/Import.php:503 -#: ../../include/Import/import_diaspora.php:142 -msgid "Import completed." +#: ../../Zotlabs/Module/Connedit.php:596 +msgid "Recent Activity" msgstr "" -#: ../../Zotlabs/Module/Import.php:525 -msgid "You must be logged in to use this feature." +#: ../../Zotlabs/Module/Connedit.php:599 +msgid "View recent posts and comments" msgstr "" -#: ../../Zotlabs/Module/Import.php:530 -msgid "Import Channel" +#: ../../Zotlabs/Module/Connedit.php:603 +#: ../../Zotlabs/Module/Admin/Accounts.php:175 +msgid "Unblock" msgstr "" -#: ../../Zotlabs/Module/Import.php:531 -msgid "" -"Use this form to import an existing channel from a different server/hub. You " -"may retrieve the channel identity from the old server/hub via the network or " -"provide an export file." +#: ../../Zotlabs/Module/Connedit.php:603 +#: ../../Zotlabs/Module/Admin/Accounts.php:174 +msgid "Block" msgstr "" -#: ../../Zotlabs/Module/Import.php:532 -#: ../../Zotlabs/Module/Import_items.php:121 -msgid "File to Upload" +#: ../../Zotlabs/Module/Connedit.php:606 +msgid "Block (or Unblock) all communications with this connection" msgstr "" -#: ../../Zotlabs/Module/Import.php:533 -msgid "Or provide the old server/hub details" +#: ../../Zotlabs/Module/Connedit.php:607 +msgid "This connection is blocked!" msgstr "" -#: ../../Zotlabs/Module/Import.php:534 -msgid "Your old identity address (xyz@example.com)" +#: ../../Zotlabs/Module/Connedit.php:611 +msgid "Unignore" msgstr "" -#: ../../Zotlabs/Module/Import.php:535 -msgid "Your old login email address" +#: ../../Zotlabs/Module/Connedit.php:611 +#: ../../Zotlabs/Module/Connections.php:277 +msgid "Ignore" msgstr "" -#: ../../Zotlabs/Module/Import.php:536 -msgid "Your old login password" +#: ../../Zotlabs/Module/Connedit.php:614 +msgid "Ignore (or Unignore) all inbound communications from this connection" msgstr "" -#: ../../Zotlabs/Module/Import.php:537 +#: ../../Zotlabs/Module/Connedit.php:615 +msgid "This connection is ignored!" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:619 +msgid "Unarchive" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:619 +msgid "Archive" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:622 msgid "" -"For either option, please choose whether to make this hub your new primary " -"address, or whether your old location should continue this role. You will be " -"able to post from either location, but only one can be marked as the primary " -"location for files, photos, and media." +"Archive (or Unarchive) this connection - mark channel dead but keep content" msgstr "" -#: ../../Zotlabs/Module/Import.php:538 -msgid "Make this hub my primary location" +#: ../../Zotlabs/Module/Connedit.php:623 +msgid "This connection is archived!" msgstr "" -#: ../../Zotlabs/Module/Import.php:539 +#: ../../Zotlabs/Module/Connedit.php:627 +msgid "Unhide" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:627 +msgid "Hide" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:630 +msgid "Hide or Unhide this connection from your other connections" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:631 +msgid "This connection is hidden!" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:638 +msgid "Delete this connection" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:655 ../../include/widgets.php:529 +msgid "Me" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:656 ../../include/widgets.php:530 +msgid "Family" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:657 +#: ../../Zotlabs/Module/Settings/Channel.php:61 +#: ../../Zotlabs/Module/Settings/Channel.php:65 +#: ../../Zotlabs/Module/Settings/Channel.php:66 +#: ../../Zotlabs/Module/Settings/Channel.php:69 +#: ../../Zotlabs/Module/Settings/Channel.php:80 +#: ../../include/selectors.php:123 ../../include/channel.php:402 +#: ../../include/channel.php:403 ../../include/channel.php:410 +#: ../../include/widgets.php:531 +msgid "Friends" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:658 ../../include/widgets.php:532 +msgid "Acquaintances" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:659 +#: ../../Zotlabs/Module/Connections.php:92 +#: ../../Zotlabs/Module/Connections.php:107 ../../include/widgets.php:533 +msgid "All" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:716 +msgid "Approve this connection" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:716 +msgid "Accept connection to allow communication" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:721 +msgid "Set Affinity" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:724 +msgid "Set Profile" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:727 +msgid "Set Affinity & Profile" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:776 +msgid "none" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:780 ../../include/widgets.php:656 +msgid "Connection Default Permissions" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:780 ../../include/items.php:3916 +#, php-format +msgid "Connection: %s" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:781 +msgid "Apply these permissions automatically" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:781 +msgid "Connection requests will be approved without your interaction" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:784 +msgid "This connection's primary address is" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:785 +msgid "Available locations:" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:789 msgid "" -"Import existing posts if possible (experimental - limited by available memory" +"The permissions indicated on this page will be applied to all new " +"connections." msgstr "" -#: ../../Zotlabs/Module/Import.php:540 +#: ../../Zotlabs/Module/Connedit.php:790 +msgid "Connection Tools" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:792 +msgid "Slide to adjust your degree of friendship" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:793 ../../Zotlabs/Module/Rate.php:155 +#: ../../include/js_strings.php:20 +msgid "Rating" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:794 +msgid "Slide to adjust your rating" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:795 ../../Zotlabs/Module/Connedit.php:800 +msgid "Optionally explain your rating" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:797 +msgid "Custom Filter" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:798 +msgid "Only import posts with this text" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:798 ../../Zotlabs/Module/Connedit.php:799 msgid "" -"This process may take several minutes to complete. Please submit the form " -"only once and leave this page open until finished." +"words one per line or #tags or /patterns/ or lang=xx, leave blank to import " +"all posts" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:799 +msgid "Do not import posts with this text" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:801 +msgid "This information is public!" msgstr "" -#: ../../Zotlabs/Module/Import.php:543 ../../Zotlabs/Module/Connect.php:98 +#: ../../Zotlabs/Module/Connedit.php:806 +msgid "Connection Pending Approval" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:809 +#: ../../Zotlabs/Module/Settings/Tokens.php:163 +msgid "inherited" +msgstr "" + +#: ../../Zotlabs/Module/Connedit.php:810 ../../Zotlabs/Module/Locs.php:121 +#: ../../Zotlabs/Module/Connect.php:98 #: ../../Zotlabs/Module/Admin/Features.php:66 #: ../../Zotlabs/Module/Admin/Logs.php:84 #: ../../Zotlabs/Module/Admin/Plugins.php:429 @@ -727,19 +1041,19 @@ msgstr "" #: ../../Zotlabs/Module/Admin/Account_edit.php:74 #: ../../Zotlabs/Module/Admin/Accounts.php:166 #: ../../Zotlabs/Module/Admin/Channels.php:147 -#: ../../Zotlabs/Module/Admin/Site.php:258 ../../Zotlabs/Module/Appman.php:126 -#: ../../Zotlabs/Module/Filestorage.php:165 -#: ../../Zotlabs/Module/Profiles.php:681 ../../Zotlabs/Module/Group.php:85 -#: ../../Zotlabs/Module/Import_items.php:122 ../../Zotlabs/Module/Locs.php:121 +#: ../../Zotlabs/Module/Admin/Site.php:260 ../../Zotlabs/Module/Appman.php:126 +#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Mail.php:384 +#: ../../Zotlabs/Module/Import_items.php:122 +#: ../../Zotlabs/Module/Invite.php:149 ../../Zotlabs/Module/Group.php:85 #: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Mood.php:139 #: ../../Zotlabs/Module/Photos.php:668 ../../Zotlabs/Module/Photos.php:1058 #: ../../Zotlabs/Module/Photos.php:1098 ../../Zotlabs/Module/Photos.php:1216 #: ../../Zotlabs/Module/Setup.php:315 ../../Zotlabs/Module/Setup.php:363 -#: ../../Zotlabs/Module/Mail.php:384 ../../Zotlabs/Module/Poke.php:186 -#: ../../Zotlabs/Module/Invite.php:149 ../../Zotlabs/Module/Pconfig.php:107 -#: ../../Zotlabs/Module/Rate.php:166 ../../Zotlabs/Module/Events.php:484 -#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Connedit.php:780 -#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149 +#: ../../Zotlabs/Module/Poke.php:186 ../../Zotlabs/Module/Profiles.php:681 +#: ../../Zotlabs/Module/Pconfig.php:107 ../../Zotlabs/Module/Rate.php:166 +#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Cal.php:342 +#: ../../Zotlabs/Module/Wiki.php:148 ../../Zotlabs/Module/Sources.php:114 +#: ../../Zotlabs/Module/Sources.php:149 #: ../../Zotlabs/Module/Settings/Features.php:47 #: ../../Zotlabs/Module/Settings/Oauth.php:87 #: ../../Zotlabs/Module/Settings/Tokens.php:167 @@ -747,11 +1061,11 @@ msgstr "" #: ../../Zotlabs/Module/Settings/Channel.php:452 #: ../../Zotlabs/Module/Settings/Display.php:196 #: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370 -#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Chat.php:196 +#: ../../Zotlabs/Module/Import.php:543 ../../Zotlabs/Module/Chat.php:196 #: ../../Zotlabs/Module/Chat.php:241 ../../Zotlabs/Module/Xchan.php:15 -#: ../../Zotlabs/Lib/ThreadItem.php:729 +#: ../../Zotlabs/Module/Events.php:484 ../../Zotlabs/Lib/ThreadItem.php:729 #: ../../extend/addon/addon/chords/Mod_Chords.php:60 -#: ../../extend/addon/addon/diaspora/diaspora.php:703 +#: ../../extend/addon/addon/diaspora/diaspora.php:710 #: ../../extend/addon/addon/dwpost/dwpost.php:89 #: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124 #: ../../extend/addon/addon/friendica/friendica.php:128 @@ -786,13 +1100,13 @@ msgstr "" #: ../../extend/addon/addon/statusnet/statusnet.php:380 #: ../../extend/addon/addon/statusnet/statusnet.php:432 #: ../../extend/addon/addon/statusnet/statusnet.php:899 -#: ../../extend/addon/addon/superblock/superblock.php:67 +#: ../../extend/addon/addon/superblock/superblock.php:64 #: ../../extend/addon/addon/twitter/twitter.php:217 #: ../../extend/addon/addon/twitter/twitter.php:259 #: ../../extend/addon/addon/visage/visage.php:170 #: ../../extend/addon/addon/wppost/wppost.php:113 #: ../../extend/addon/addon/xmpp/xmpp.php:69 -#: ../../extend/addon/addon/cdav/cdav.php:239 +#: ../../extend/addon/addon/cdav/cdav.php:240 #: ../../extend/addon/addon/likebanner/likebanner.php:57 #: ../../extend/addon/addon/mailtest/mailtest.php:100 #: ../../include/js_strings.php:22 ../../include/widgets.php:796 @@ -800,64 +1114,111 @@ msgstr "" msgid "Submit" msgstr "" -#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109 -msgid "Continue" +#: ../../Zotlabs/Module/Connedit.php:811 +#, php-format +msgid "" +"Please choose the profile you would like to display to %s when viewing your " +"profile securely." msgstr "" -#: ../../Zotlabs/Module/Connect.php:90 -msgid "Premium Channel Setup" +#: ../../Zotlabs/Module/Connedit.php:813 +#: ../../Zotlabs/Module/Settings/Tokens.php:160 +msgid "Their Settings" msgstr "" -#: ../../Zotlabs/Module/Connect.php:92 -msgid "Enable premium channel connection restrictions" +#: ../../Zotlabs/Module/Connedit.php:814 +#: ../../Zotlabs/Module/Settings/Tokens.php:161 +msgid "My Settings" msgstr "" -#: ../../Zotlabs/Module/Connect.php:93 -msgid "" -"Please enter your restrictions or conditions, such as paypal receipt, usage " -"guidelines, etc." +#: ../../Zotlabs/Module/Connedit.php:816 +#: ../../Zotlabs/Module/Settings/Tokens.php:165 +msgid "Individual Permissions" msgstr "" -#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115 +#: ../../Zotlabs/Module/Connedit.php:817 +#: ../../Zotlabs/Module/Settings/Tokens.php:166 msgid "" -"This channel may require additional steps or acknowledgement of the " -"following conditions prior to connecting:" +"Some permissions may be inherited from your channel's <a href=\"settings" +"\"><strong>privacy settings</strong></a>, which have higher priority than " +"individual settings. You can <strong>not</strong> change those settings here." msgstr "" -#: ../../Zotlabs/Module/Connect.php:96 +#: ../../Zotlabs/Module/Connedit.php:818 msgid "" -"Potential connections will then see the following text before proceeding:" +"Some permissions may be inherited from your channel's <a href=\"settings" +"\"><strong>privacy settings</strong></a>, which have higher priority than " +"individual settings. You can change those settings here but they wont have " +"any impact unless the inherited setting changes." msgstr "" -#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118 -msgid "" -"By continuing, I certify that I have complied with any instructions provided " -"on this page." +#: ../../Zotlabs/Module/Connedit.php:819 +msgid "Last update:" msgstr "" -#: ../../Zotlabs/Module/Connect.php:106 -msgid "(No specific instructions have been provided by the channel owner.)" +#: ../../Zotlabs/Module/Dreport.php:45 +msgid "Invalid message" msgstr "" -#: ../../Zotlabs/Module/Connect.php:114 -msgid "Restricted or Premium Channel" +#: ../../Zotlabs/Module/Dreport.php:78 +msgid "no results" msgstr "" -#: ../../Zotlabs/Module/Search.php:44 ../../Zotlabs/Module/Connections.php:306 -#: ../../Zotlabs/Lib/Apps.php:230 ../../include/acl_selectors.php:203 -#: ../../include/nav.php:170 ../../include/text.php:993 -#: ../../include/text.php:1005 ../../include/widgets.php:315 -msgid "Search" +#: ../../Zotlabs/Module/Dreport.php:93 +msgid "channel sync processed" msgstr "" -#: ../../Zotlabs/Module/Search.php:223 -#, php-format -msgid "Items tagged with: %s" +#: ../../Zotlabs/Module/Dreport.php:97 +msgid "queued" msgstr "" -#: ../../Zotlabs/Module/Search.php:225 +#: ../../Zotlabs/Module/Dreport.php:101 +msgid "posted" +msgstr "" + +#: ../../Zotlabs/Module/Dreport.php:105 +msgid "accepted for delivery" +msgstr "" + +#: ../../Zotlabs/Module/Dreport.php:109 +msgid "updated" +msgstr "" + +#: ../../Zotlabs/Module/Dreport.php:112 +msgid "update ignored" +msgstr "" + +#: ../../Zotlabs/Module/Dreport.php:115 +msgid "permission denied" +msgstr "" + +#: ../../Zotlabs/Module/Dreport.php:119 +msgid "recipient not found" +msgstr "" + +#: ../../Zotlabs/Module/Dreport.php:122 +msgid "mail recalled" +msgstr "" + +#: ../../Zotlabs/Module/Dreport.php:125 +msgid "duplicate mail received" +msgstr "" + +#: ../../Zotlabs/Module/Dreport.php:128 +msgid "mail delivered" +msgstr "" + +#: ../../Zotlabs/Module/Dreport.php:148 #, php-format -msgid "Search results for: %s" +msgid "Delivery report for %1$s" +msgstr "" + +#: ../../Zotlabs/Module/Dreport.php:151 +msgid "Options" +msgstr "" + +#: ../../Zotlabs/Module/Dreport.php:152 +msgid "Redeliver" msgstr "" #: ../../Zotlabs/Module/Bookmarks.php:53 @@ -872,56 +1233,122 @@ msgstr "" msgid "My Connections Bookmarks" msgstr "" -#: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95 -#: ../../Zotlabs/Module/Editlayout.php:79 -#: ../../Zotlabs/Module/Editwebpage.php:80 -#: ../../Zotlabs/Module/Editpost.php:24 -msgid "Item not found" +#: ../../Zotlabs/Module/Acl.php:313 +msgid "network" msgstr "" -#: ../../Zotlabs/Module/Editblock.php:108 ../../Zotlabs/Module/Blocks.php:97 -#: ../../Zotlabs/Module/Blocks.php:155 -msgid "Block Name" +#: ../../Zotlabs/Module/Acl.php:323 +msgid "RSS" msgstr "" -#: ../../Zotlabs/Module/Editblock.php:111 -#: ../../Zotlabs/Module/Editwebpage.php:146 ../../Zotlabs/Module/Mail.php:258 -#: ../../Zotlabs/Module/Mail.php:383 ../../Zotlabs/Module/Chat.php:207 -#: ../../include/conversation.php:1165 -msgid "Insert web link" +#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54 +msgid "Location not found." msgstr "" -#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1276 -msgid "Title (optional)" +#: ../../Zotlabs/Module/Locs.php:62 +msgid "Location lookup failed." msgstr "" -#: ../../Zotlabs/Module/Editblock.php:133 -msgid "Edit Block" +#: ../../Zotlabs/Module/Locs.php:66 +msgid "" +"Please select another location to become primary before removing the primary " +"location." msgstr "" -#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63 -msgid "Invalid profile identifier." +#: ../../Zotlabs/Module/Locs.php:95 +msgid "Syncing locations" msgstr "" -#: ../../Zotlabs/Module/Profperm.php:115 -msgid "Profile Visibility Editor" +#: ../../Zotlabs/Module/Locs.php:105 +msgid "No locations found." msgstr "" -#: ../../Zotlabs/Module/Profperm.php:117 ../../include/channel.php:1282 -msgid "Profile" +#: ../../Zotlabs/Module/Locs.php:116 +msgid "Manage Channel Locations" msgstr "" -#: ../../Zotlabs/Module/Profperm.php:119 -msgid "Click on a contact to add or remove." +#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Pubsites.php:51 +#: ../../Zotlabs/Module/Profiles.php:471 ../../Zotlabs/Module/Profiles.php:692 +#: ../../Zotlabs/Module/Events.php:468 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:839 +#: ../../include/js_strings.php:25 +msgid "Location" msgstr "" -#: ../../Zotlabs/Module/Profperm.php:128 -msgid "Visible To" +#: ../../Zotlabs/Module/Locs.php:118 +#: ../../Zotlabs/Module/Admin/Channels.php:160 +#: ../../Zotlabs/Module/Profiles.php:464 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1143 +msgid "Address" msgstr "" -#: ../../Zotlabs/Module/Profperm.php:144 -#: ../../Zotlabs/Module/Connections.php:145 -msgid "All Connections" +#: ../../Zotlabs/Module/Locs.php:119 +msgid "Primary" +msgstr "" + +#: ../../Zotlabs/Module/Locs.php:120 ../../Zotlabs/Module/Menu.php:113 +msgid "Drop" +msgstr "" + +#: ../../Zotlabs/Module/Locs.php:122 +msgid "Sync Now" +msgstr "" + +#: ../../Zotlabs/Module/Locs.php:123 +msgid "Please wait several minutes between consecutive operations." +msgstr "" + +#: ../../Zotlabs/Module/Locs.php:124 +msgid "" +"When possible, drop a location by logging into that website/hub and removing " +"your channel." +msgstr "" + +#: ../../Zotlabs/Module/Locs.php:125 +msgid "Use this form to drop the location if the hub is no longer operating." +msgstr "" + +#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109 +msgid "Continue" +msgstr "" + +#: ../../Zotlabs/Module/Connect.php:90 +msgid "Premium Channel Setup" +msgstr "" + +#: ../../Zotlabs/Module/Connect.php:92 +msgid "Enable premium channel connection restrictions" +msgstr "" + +#: ../../Zotlabs/Module/Connect.php:93 +msgid "" +"Please enter your restrictions or conditions, such as paypal receipt, usage " +"guidelines, etc." +msgstr "" + +#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115 +msgid "" +"This channel may require additional steps or acknowledgement of the " +"following conditions prior to connecting:" +msgstr "" + +#: ../../Zotlabs/Module/Connect.php:96 +msgid "" +"Potential connections will then see the following text before proceeding:" +msgstr "" + +#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118 +msgid "" +"By continuing, I certify that I have complied with any instructions provided " +"on this page." +msgstr "" + +#: ../../Zotlabs/Module/Connect.php:106 +msgid "(No specific instructions have been provided by the channel owner.)" +msgstr "" + +#: ../../Zotlabs/Module/Connect.php:114 +msgid "Restricted or Premium Channel" msgstr "" #: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31 @@ -954,17 +1381,59 @@ msgstr "" #: ../../Zotlabs/Module/Filer.php:53 ../../Zotlabs/Module/Admin/Profs.php:74 #: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32 -#: ../../Zotlabs/Module/Rbmark.php:104 ../../include/text.php:994 -#: ../../include/text.php:1006 ../../include/widgets.php:201 +#: ../../Zotlabs/Module/Rbmark.php:104 ../../include/text.php:987 +#: ../../include/text.php:999 ../../include/widgets.php:201 msgid "Save" msgstr "" -#: ../../Zotlabs/Module/Dirsearch.php:25 ../../Zotlabs/Module/Regdir.php:49 -msgid "This site is not a directory server" +#: ../../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/Dirsearch.php:33 -msgid "This directory server requires an access token" +#: ../../Zotlabs/Module/Manage.php:143 +msgid "Create a new channel" +msgstr "" + +#: ../../Zotlabs/Module/Manage.php:143 ../../Zotlabs/Module/Profiles.php:772 +#: ../../Zotlabs/Module/Wiki.php:147 ../../Zotlabs/Module/Chat.php:255 +msgid "Create New" +msgstr "" + +#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:214 +#: ../../include/nav.php:209 +msgid "Channel Manager" +msgstr "" + +#: ../../Zotlabs/Module/Manage.php:165 +msgid "Current Channel" +msgstr "" + +#: ../../Zotlabs/Module/Manage.php:167 +msgid "Switch to one of your channels by selecting it." +msgstr "" + +#: ../../Zotlabs/Module/Manage.php:168 +msgid "Default Channel" +msgstr "" + +#: ../../Zotlabs/Module/Manage.php:169 +msgid "Make Default" +msgstr "" + +#: ../../Zotlabs/Module/Manage.php:172 +#, php-format +msgid "%d new messages" +msgstr "" + +#: ../../Zotlabs/Module/Manage.php:173 +#, php-format +msgid "%d new introductions" +msgstr "" + +#: ../../Zotlabs/Module/Manage.php:175 +msgid "Delegated Channel" msgstr "" #: ../../Zotlabs/Module/Connections.php:56 @@ -997,12 +1466,6 @@ msgstr "" msgid "New" msgstr "" -#: ../../Zotlabs/Module/Connections.php:92 -#: ../../Zotlabs/Module/Connections.php:107 -#: ../../Zotlabs/Module/Connedit.php:630 ../../include/widgets.php:533 -msgid "All" -msgstr "" - #: ../../Zotlabs/Module/Connections.php:138 msgid "New Connections" msgstr "" @@ -1011,6 +1474,11 @@ msgstr "" msgid "Show pending (new) connections" msgstr "" +#: ../../Zotlabs/Module/Connections.php:145 +#: ../../Zotlabs/Module/Profperm.php:144 +msgid "All Connections" +msgstr "" + #: ../../Zotlabs/Module/Connections.php:148 msgid "Show all connections" msgstr "" @@ -1077,20 +1545,22 @@ msgstr "" msgid "Ignore connection" msgstr "" -#: ../../Zotlabs/Module/Connections.php:277 -#: ../../Zotlabs/Module/Connedit.php:584 -msgid "Ignore" -msgstr "" - #: ../../Zotlabs/Module/Connections.php:278 msgid "Recent activity" msgstr "" #: ../../Zotlabs/Module/Connections.php:302 ../../Zotlabs/Lib/Apps.php:209 -#: ../../include/nav.php:191 ../../include/text.php:923 +#: ../../include/nav.php:189 ../../include/text.php:916 msgid "Connections" msgstr "" +#: ../../Zotlabs/Module/Connections.php:306 ../../Zotlabs/Module/Search.php:44 +#: ../../Zotlabs/Lib/Apps.php:230 ../../include/nav.php:168 +#: ../../include/text.php:986 ../../include/text.php:998 +#: ../../include/widgets.php:315 ../../include/acl_selectors.php:203 +msgid "Search" +msgstr "" + #: ../../Zotlabs/Module/Connections.php:307 msgid "Search your connections" msgstr "" @@ -1135,30 +1605,30 @@ msgstr "" msgid "Unable to process image." msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4325 +#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4264 msgid "female" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4326 +#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4265 #, php-format msgid "%1$s updated her %2$s" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4327 +#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4266 msgid "male" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4328 +#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4267 #, php-format msgid "%1$s updated his %2$s" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4330 +#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4269 #, php-format msgid "%1$s updated their %2$s" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1731 +#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1677 msgid "cover photo" msgstr "" @@ -1247,12 +1717,12 @@ msgstr "" #: ../../Zotlabs/Module/Admin/Themes.php:154 #: ../../Zotlabs/Module/Admin/Accounts.php:164 #: ../../Zotlabs/Module/Admin/Channels.php:145 -#: ../../Zotlabs/Module/Admin/Site.php:256 ../../Zotlabs/Module/Admin.php:137 +#: ../../Zotlabs/Module/Admin/Site.php:258 ../../Zotlabs/Module/Admin.php:137 msgid "Administration" msgstr "" -#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../include/widgets.php:1586 -#: ../../include/widgets.php:1596 +#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../include/widgets.php:1649 +#: ../../include/widgets.php:1659 msgid "Logs" msgstr "" @@ -1278,6 +1748,14 @@ msgstr "" msgid "Log level" msgstr "" +#: ../../Zotlabs/Module/Admin/Plugins.php:254 +#: ../../Zotlabs/Module/Admin/Themes.php:69 +#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Display.php:40 +#: ../../Zotlabs/Module/Admin.php:60 ../../Zotlabs/Module/Thing.php:89 +#: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:3350 +msgid "Item not found." +msgstr "" + #: ../../Zotlabs/Module/Admin/Plugins.php:284 #, php-format msgid "Plugin %s disabled." @@ -1299,7 +1777,7 @@ msgid "Enable" msgstr "" #: ../../Zotlabs/Module/Admin/Plugins.php:337 -#: ../../Zotlabs/Module/Admin/Plugins.php:428 ../../include/widgets.php:1564 +#: ../../Zotlabs/Module/Admin/Plugins.php:428 ../../include/widgets.php:1627 msgid "Plugins" msgstr "" @@ -1310,7 +1788,7 @@ msgstr "" #: ../../Zotlabs/Module/Admin/Plugins.php:339 #: ../../Zotlabs/Module/Admin/Themes.php:123 ../../Zotlabs/Lib/Apps.php:216 -#: ../../include/nav.php:213 ../../include/widgets.php:680 +#: ../../include/nav.php:211 ../../include/widgets.php:680 msgid "Settings" msgstr "" @@ -1379,14 +1857,14 @@ msgstr "" #: ../../Zotlabs/Module/Admin/Plugins.php:414 #: ../../Zotlabs/Module/Fbrowser.php:66 ../../Zotlabs/Module/Fbrowser.php:88 -#: ../../Zotlabs/Module/Wiki.php:200 ../../Zotlabs/Module/Wiki.php:240 +#: ../../Zotlabs/Module/Wiki.php:241 ../../Zotlabs/Module/Wiki.php:276 #: ../../Zotlabs/Module/Settings/Oauth.php:88 #: ../../Zotlabs/Module/Settings/Oauth.php:114 #: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138 #: ../../extend/addon/addon/friendica/dfrn_request.php:879 #: ../../extend/addon/addon/js_upload/js_upload.php:46 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:862 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1150 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:866 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1154 #: ../../include/conversation.php:1264 ../../include/conversation.php:1313 msgid "Cancel" msgstr "" @@ -1406,7 +1884,7 @@ msgstr "" #: ../../Zotlabs/Module/Admin/Plugins.php:443 #: ../../Zotlabs/Module/Settings/Oauth.php:42 #: ../../Zotlabs/Module/Settings/Oauth.php:113 ../../Zotlabs/Lib/Apps.php:334 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1148 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1152 msgid "Update" msgstr "" @@ -1466,7 +1944,7 @@ msgstr "" msgid "Edit Profile Field" msgstr "" -#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../include/widgets.php:1567 +#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../include/widgets.php:1630 msgid "Profile Fields" msgstr "" @@ -1546,7 +2024,7 @@ msgid "" "embedded content from that site is explicitly blocked." msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:87 ../../include/widgets.php:1562 +#: ../../Zotlabs/Module/Admin/Security.php:87 ../../include/widgets.php:1625 msgid "Security" msgstr "" @@ -1646,7 +2124,7 @@ msgid "Screenshot" msgstr "" #: ../../Zotlabs/Module/Admin/Themes.php:121 -#: ../../Zotlabs/Module/Admin/Themes.php:155 ../../include/widgets.php:1565 +#: ../../Zotlabs/Module/Admin/Themes.php:155 ../../include/widgets.php:1628 msgid "Themes" msgstr "" @@ -1729,7 +2207,7 @@ msgid "Account '%s' unblocked" msgstr "" #: ../../Zotlabs/Module/Admin/Accounts.php:165 -#: ../../Zotlabs/Module/Admin/Accounts.php:178 ../../include/widgets.php:1560 +#: ../../Zotlabs/Module/Admin/Accounts.php:178 ../../include/widgets.php:1623 msgid "Accounts" msgstr "" @@ -1750,7 +2228,7 @@ msgstr "" #: ../../Zotlabs/Module/Admin/Accounts.php:181 #: ../../extend/addon/addon/redred/redred.php:107 #: ../../extend/addon/addon/rtof/rtof.php:93 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1136 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1140 #: ../../extend/addon/addon/openid/MysqlProvider.php:56 #: ../../extend/addon/addon/openid/MysqlProvider.php:57 #: ../../include/network.php:2237 @@ -1765,16 +2243,6 @@ msgstr "" msgid "Deny" msgstr "" -#: ../../Zotlabs/Module/Admin/Accounts.php:174 -#: ../../Zotlabs/Module/Connedit.php:576 -msgid "Block" -msgstr "" - -#: ../../Zotlabs/Module/Admin/Accounts.php:175 -#: ../../Zotlabs/Module/Connedit.php:576 -msgid "Unblock" -msgstr "" - #: ../../Zotlabs/Module/Admin/Accounts.php:180 msgid "ID" msgstr "" @@ -1861,7 +2329,7 @@ msgstr "" msgid "Channel '%s' code disallowed" msgstr "" -#: ../../Zotlabs/Module/Admin/Channels.php:146 ../../include/widgets.php:1561 +#: ../../Zotlabs/Module/Admin/Channels.php:146 ../../include/widgets.php:1624 msgid "Channels" msgstr "" @@ -1882,7 +2350,7 @@ msgid "Disallow Code" msgstr "" #: ../../Zotlabs/Module/Admin/Channels.php:154 -#: ../../include/conversation.php:1672 +#: ../../include/conversation.php:1671 msgid "Channel" msgstr "" @@ -1890,12 +2358,6 @@ msgstr "" msgid "UID" msgstr "" -#: ../../Zotlabs/Module/Admin/Channels.php:160 -#: ../../Zotlabs/Module/Profiles.php:464 ../../Zotlabs/Module/Locs.php:118 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1139 -msgid "Address" -msgstr "" - #: ../../Zotlabs/Module/Admin/Channels.php:162 msgid "" "Selected channels will be deleted!\\n\\nEverything that was posted in these " @@ -1948,496 +2410,430 @@ msgstr "" msgid "Attempt to execute this update step automatically" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:131 +#: ../../Zotlabs/Module/Admin/Site.php:133 msgid "Site settings updated." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:157 ../../include/text.php:2959 +#: ../../Zotlabs/Module/Admin/Site.php:159 ../../include/text.php:2915 msgid "Default" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:167 +#: ../../Zotlabs/Module/Admin/Site.php:169 #: ../../Zotlabs/Module/Settings/Display.php:143 msgid "mobile" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:169 +#: ../../Zotlabs/Module/Admin/Site.php:171 msgid "experimental" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:171 +#: ../../Zotlabs/Module/Admin/Site.php:173 msgid "unsupported" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:216 ../../Zotlabs/Module/Menu.php:100 -#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Api.php:97 -#: ../../Zotlabs/Module/Filestorage.php:160 -#: ../../Zotlabs/Module/Filestorage.php:168 -#: ../../Zotlabs/Module/Profiles.php:641 ../../Zotlabs/Module/Mitem.php:162 -#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240 -#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Photos.php:653 -#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:464 -#: ../../Zotlabs/Module/Connedit.php:408 ../../Zotlabs/Module/Connedit.php:687 -#: ../../Zotlabs/Module/Removeme.php:63 -#: ../../Zotlabs/Module/Settings/Channel.php:289 -#: ../../Zotlabs/Module/Settings/Display.php:103 -#: ../../extend/addon/addon/dwpost/dwpost.php:73 -#: ../../extend/addon/addon/dwpost/dwpost.php:85 -#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120 -#: ../../extend/addon/addon/friendica/dfrn_request.php:865 -#: ../../extend/addon/addon/ijpost/ijpost.php:73 -#: ../../extend/addon/addon/ijpost/ijpost.php:85 -#: ../../extend/addon/addon/jappixmini/jappixmini.php:309 -#: ../../extend/addon/addon/jappixmini/jappixmini.php:313 -#: ../../extend/addon/addon/jappixmini/jappixmini.php:343 -#: ../../extend/addon/addon/jappixmini/jappixmini.php:351 -#: ../../extend/addon/addon/jappixmini/jappixmini.php:355 -#: ../../extend/addon/addon/jappixmini/jappixmini.php:359 -#: ../../extend/addon/addon/libertree/libertree.php:69 -#: ../../extend/addon/addon/libertree/libertree.php:81 -#: ../../extend/addon/addon/ljpost/ljpost.php:70 -#: ../../extend/addon/addon/ljpost/ljpost.php:82 -#: ../../extend/addon/addon/nofed/nofed.php:72 -#: ../../extend/addon/addon/nofed/nofed.php:76 -#: ../../extend/addon/addon/nsabait/nsabait.php:157 -#: ../../extend/addon/addon/nsfw/nsfw.php:84 -#: ../../extend/addon/addon/planets/planets.php:153 -#: ../../extend/addon/addon/pumpio/pumpio.php:219 -#: ../../extend/addon/addon/pumpio/pumpio.php:223 -#: ../../extend/addon/addon/pumpio/pumpio.php:227 -#: ../../extend/addon/addon/pumpio/pumpio.php:231 -#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81 -#: ../../extend/addon/addon/redred/redred.php:95 -#: ../../extend/addon/addon/redred/redred.php:99 -#: ../../extend/addon/addon/rtof/rtof.php:81 -#: ../../extend/addon/addon/rtof/rtof.php:85 -#: ../../extend/addon/addon/smileybutton/smileybutton.php:273 -#: ../../extend/addon/addon/smileybutton/smileybutton.php:277 -#: ../../extend/addon/addon/statusnet/statusnet.php:389 -#: ../../extend/addon/addon/statusnet/statusnet.php:411 -#: ../../extend/addon/addon/statusnet/statusnet.php:415 -#: ../../extend/addon/addon/statusnet/statusnet.php:424 -#: ../../extend/addon/addon/twitter/twitter.php:242 -#: ../../extend/addon/addon/twitter/twitter.php:246 -#: ../../extend/addon/addon/twitter/twitter.php:255 -#: ../../extend/addon/addon/visage/visage.php:166 -#: ../../extend/addon/addon/wppost/wppost.php:82 -#: ../../extend/addon/addon/wppost/wppost.php:105 -#: ../../extend/addon/addon/wppost/wppost.php:109 -#: ../../extend/addon/addon/xmpp/xmpp.php:53 -#: ../../extend/addon/addon/cdav/cdav.php:227 ../../include/dir_fns.php:143 -#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145 -#: ../../view/theme/redbasic/php/config.php:111 -#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1719 -msgid "No" -msgstr "" - -#: ../../Zotlabs/Module/Admin/Site.php:217 +#: ../../Zotlabs/Module/Admin/Site.php:219 msgid "Yes - with approval" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:218 ../../Zotlabs/Module/Menu.php:100 -#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Api.php:96 -#: ../../Zotlabs/Module/Filestorage.php:160 -#: ../../Zotlabs/Module/Filestorage.php:168 -#: ../../Zotlabs/Module/Profiles.php:641 ../../Zotlabs/Module/Mitem.php:162 -#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240 -#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Photos.php:653 -#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:464 -#: ../../Zotlabs/Module/Connedit.php:408 ../../Zotlabs/Module/Removeme.php:63 -#: ../../Zotlabs/Module/Settings/Channel.php:289 -#: ../../Zotlabs/Module/Settings/Display.php:103 -#: ../../extend/addon/addon/dwpost/dwpost.php:73 -#: ../../extend/addon/addon/dwpost/dwpost.php:85 -#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120 -#: ../../extend/addon/addon/friendica/dfrn_request.php:865 -#: ../../extend/addon/addon/ijpost/ijpost.php:73 -#: ../../extend/addon/addon/ijpost/ijpost.php:85 -#: ../../extend/addon/addon/jappixmini/jappixmini.php:309 -#: ../../extend/addon/addon/jappixmini/jappixmini.php:313 -#: ../../extend/addon/addon/jappixmini/jappixmini.php:343 -#: ../../extend/addon/addon/jappixmini/jappixmini.php:351 -#: ../../extend/addon/addon/jappixmini/jappixmini.php:355 -#: ../../extend/addon/addon/jappixmini/jappixmini.php:359 -#: ../../extend/addon/addon/libertree/libertree.php:69 -#: ../../extend/addon/addon/libertree/libertree.php:81 -#: ../../extend/addon/addon/ljpost/ljpost.php:70 -#: ../../extend/addon/addon/ljpost/ljpost.php:82 -#: ../../extend/addon/addon/nofed/nofed.php:72 -#: ../../extend/addon/addon/nofed/nofed.php:76 -#: ../../extend/addon/addon/nsabait/nsabait.php:157 -#: ../../extend/addon/addon/nsfw/nsfw.php:84 -#: ../../extend/addon/addon/planets/planets.php:153 -#: ../../extend/addon/addon/pumpio/pumpio.php:219 -#: ../../extend/addon/addon/pumpio/pumpio.php:223 -#: ../../extend/addon/addon/pumpio/pumpio.php:227 -#: ../../extend/addon/addon/pumpio/pumpio.php:231 -#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81 -#: ../../extend/addon/addon/redred/redred.php:95 -#: ../../extend/addon/addon/redred/redred.php:99 -#: ../../extend/addon/addon/rtof/rtof.php:81 -#: ../../extend/addon/addon/rtof/rtof.php:85 -#: ../../extend/addon/addon/smileybutton/smileybutton.php:273 -#: ../../extend/addon/addon/smileybutton/smileybutton.php:277 -#: ../../extend/addon/addon/statusnet/statusnet.php:389 -#: ../../extend/addon/addon/statusnet/statusnet.php:411 -#: ../../extend/addon/addon/statusnet/statusnet.php:415 -#: ../../extend/addon/addon/statusnet/statusnet.php:424 -#: ../../extend/addon/addon/twitter/twitter.php:242 -#: ../../extend/addon/addon/twitter/twitter.php:246 -#: ../../extend/addon/addon/twitter/twitter.php:255 -#: ../../extend/addon/addon/visage/visage.php:166 -#: ../../extend/addon/addon/wppost/wppost.php:82 -#: ../../extend/addon/addon/wppost/wppost.php:105 -#: ../../extend/addon/addon/wppost/wppost.php:109 -#: ../../extend/addon/addon/xmpp/xmpp.php:53 -#: ../../extend/addon/addon/cdav/cdav.php:227 ../../include/dir_fns.php:143 -#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145 -#: ../../view/theme/redbasic/php/config.php:111 -#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1719 -msgid "Yes" -msgstr "" - -#: ../../Zotlabs/Module/Admin/Site.php:223 +#: ../../Zotlabs/Module/Admin/Site.php:225 msgid "My site is not a public server" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:224 +#: ../../Zotlabs/Module/Admin/Site.php:226 msgid "My site has paid access only" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:225 +#: ../../Zotlabs/Module/Admin/Site.php:227 msgid "My site has free access only" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:226 +#: ../../Zotlabs/Module/Admin/Site.php:228 msgid "My site offers free accounts with optional paid upgrades" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:237 ../../Zotlabs/Module/Setup.php:334 +#: ../../Zotlabs/Module/Admin/Site.php:239 ../../Zotlabs/Module/Setup.php:334 msgid "Basic/Minimal Social Networking" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:238 ../../Zotlabs/Module/Setup.php:335 +#: ../../Zotlabs/Module/Admin/Site.php:240 ../../Zotlabs/Module/Setup.php:335 msgid "Standard Configuration (default)" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:239 ../../Zotlabs/Module/Setup.php:336 +#: ../../Zotlabs/Module/Admin/Site.php:241 ../../Zotlabs/Module/Setup.php:336 msgid "Professional" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:243 ../../Zotlabs/Lib/Techlevels.php:10 +#: ../../Zotlabs/Module/Admin/Site.php:245 ../../Zotlabs/Lib/Techlevels.php:10 msgid "Beginner/Basic" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:244 ../../Zotlabs/Lib/Techlevels.php:11 +#: ../../Zotlabs/Module/Admin/Site.php:246 ../../Zotlabs/Lib/Techlevels.php:11 msgid "Novice - not skilled but willing to learn" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:245 ../../Zotlabs/Lib/Techlevels.php:12 +#: ../../Zotlabs/Module/Admin/Site.php:247 ../../Zotlabs/Lib/Techlevels.php:12 msgid "Intermediate - somewhat comfortable" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:246 ../../Zotlabs/Lib/Techlevels.php:13 +#: ../../Zotlabs/Module/Admin/Site.php:248 ../../Zotlabs/Lib/Techlevels.php:13 msgid "Advanced - very comfortable" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:247 ../../Zotlabs/Lib/Techlevels.php:14 +#: ../../Zotlabs/Module/Admin/Site.php:249 ../../Zotlabs/Lib/Techlevels.php:14 msgid "Expert - I can write computer code" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:248 ../../Zotlabs/Lib/Techlevels.php:15 +#: ../../Zotlabs/Module/Admin/Site.php:250 ../../Zotlabs/Lib/Techlevels.php:15 msgid "Wizard - I probably know more than you do" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:257 ../../include/widgets.php:1559 +#: ../../Zotlabs/Module/Admin/Site.php:259 ../../include/widgets.php:1622 msgid "Site" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:260 +#: ../../Zotlabs/Module/Admin/Site.php:262 msgid "File upload" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:261 +#: ../../Zotlabs/Module/Admin/Site.php:263 msgid "Policies" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:262 +#: ../../Zotlabs/Module/Admin/Site.php:264 #: ../../include/contact_widgets.php:16 msgid "Advanced" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:266 +#: ../../Zotlabs/Module/Admin/Site.php:268 #: ../../extend/addon/addon/statusnet/statusnet.php:890 msgid "Site name" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:268 ../../Zotlabs/Module/Setup.php:357 +#: ../../Zotlabs/Module/Admin/Site.php:270 ../../Zotlabs/Module/Setup.php:357 msgid "Server Configuration/Role" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:270 +#: ../../Zotlabs/Module/Admin/Site.php:272 msgid "Site default technical skill level" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:270 +#: ../../Zotlabs/Module/Admin/Site.php:272 msgid "Used to provide a member experience matched to technical comfort level" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:272 +#: ../../Zotlabs/Module/Admin/Site.php:274 msgid "Lock the technical skill level setting" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:272 +#: ../../Zotlabs/Module/Admin/Site.php:274 msgid "Members can set their own technical comfort level by default" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:274 +#: ../../Zotlabs/Module/Admin/Site.php:276 msgid "Banner/Logo" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:275 +#: ../../Zotlabs/Module/Admin/Site.php:277 msgid "Administrator Information" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:275 +#: ../../Zotlabs/Module/Admin/Site.php:277 msgid "" "Contact information for site administrators. Displayed on siteinfo page. " "BBCode can be used here" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:276 +#: ../../Zotlabs/Module/Admin/Site.php:278 +#: ../../Zotlabs/Module/Siteinfo.php:23 +msgid "Site Information" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Site.php:278 +msgid "" +"Publicly visible description of this site. Displayed on siteinfo page. " +"BBCode can be used here" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Site.php:279 msgid "System language" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:277 +#: ../../Zotlabs/Module/Admin/Site.php:280 msgid "System theme" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:277 +#: ../../Zotlabs/Module/Admin/Site.php:280 msgid "" "Default system theme - may be over-ridden by user profiles - <a href='#' " "id='cnftheme'>change theme settings</a>" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:278 +#: ../../Zotlabs/Module/Admin/Site.php:281 msgid "Mobile system theme" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:278 +#: ../../Zotlabs/Module/Admin/Site.php:281 msgid "Theme for mobile devices" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:280 +#: ../../Zotlabs/Module/Admin/Site.php:283 msgid "Allow Feeds as Connections" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:280 +#: ../../Zotlabs/Module/Admin/Site.php:283 msgid "(Heavy system resource usage)" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:281 +#: ../../Zotlabs/Module/Admin/Site.php:284 msgid "Maximum image size" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:281 +#: ../../Zotlabs/Module/Admin/Site.php:284 msgid "" "Maximum size in bytes of uploaded images. Default is 0, which means no " "limits." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:282 +#: ../../Zotlabs/Module/Admin/Site.php:285 msgid "Does this site allow new member registration?" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:283 +#: ../../Zotlabs/Module/Admin/Site.php:286 msgid "Invitation only" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:283 +#: ../../Zotlabs/Module/Admin/Site.php:286 msgid "" "Only allow new member registrations with an invitation code. Above register " "policy must be set to Yes." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:284 +#: ../../Zotlabs/Module/Admin/Site.php:287 msgid "Which best describes the types of account offered by this hub?" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:285 +#: ../../Zotlabs/Module/Admin/Site.php:288 msgid "Register text" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:285 +#: ../../Zotlabs/Module/Admin/Site.php:288 msgid "Will be displayed prominently on the registration page." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:286 +#: ../../Zotlabs/Module/Admin/Site.php:289 msgid "Site homepage to show visitors (default: login box)" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:286 +#: ../../Zotlabs/Module/Admin/Site.php:289 msgid "" "example: 'public' to show public stream, 'page/sys/home' to show a system " "webpage called 'home' or 'include:home.html' to include a file." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:287 +#: ../../Zotlabs/Module/Admin/Site.php:290 msgid "Preserve site homepage URL" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:287 +#: ../../Zotlabs/Module/Admin/Site.php:290 msgid "" "Present the site homepage in a frame at the original location instead of " "redirecting" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:288 +#: ../../Zotlabs/Module/Admin/Site.php:291 msgid "Accounts abandoned after x days" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:288 +#: ../../Zotlabs/Module/Admin/Site.php:291 msgid "" "Will not waste system resources polling external sites for abandonded " "accounts. Enter 0 for no time limit." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:289 +#: ../../Zotlabs/Module/Admin/Site.php:292 msgid "Allowed friend domains" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:289 +#: ../../Zotlabs/Module/Admin/Site.php:292 msgid "" "Comma separated list of domains which are allowed to establish friendships " "with this site. Wildcards are accepted. Empty to allow any domains" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:290 +#: ../../Zotlabs/Module/Admin/Site.php:293 msgid "Verify Email Addresses" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:290 +#: ../../Zotlabs/Module/Admin/Site.php:293 msgid "" "Check to verify email addresses used in account registration (recommended)." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:291 +#: ../../Zotlabs/Module/Admin/Site.php:294 msgid "Force publish" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:291 +#: ../../Zotlabs/Module/Admin/Site.php:294 msgid "" "Check to force all profiles on this site to be listed in the site directory." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:292 +#: ../../Zotlabs/Module/Admin/Site.php:295 msgid "Import Public Streams" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:292 +#: ../../Zotlabs/Module/Admin/Site.php:295 msgid "" "Import and allow access to public content pulled from other sites. Warning: " "this content is unmoderated." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:293 +#: ../../Zotlabs/Module/Admin/Site.php:296 msgid "Login on Homepage" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:293 +#: ../../Zotlabs/Module/Admin/Site.php:296 msgid "" "Present a login box to visitors on the home page if no other content has " "been configured." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:294 +#: ../../Zotlabs/Module/Admin/Site.php:297 msgid "Enable context help" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:294 +#: ../../Zotlabs/Module/Admin/Site.php:297 msgid "" "Display contextual help for the current page when the help button is pressed." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:296 +#: ../../Zotlabs/Module/Admin/Site.php:299 msgid "Directory Server URL" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:296 +#: ../../Zotlabs/Module/Admin/Site.php:299 msgid "Default directory server" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:298 +#: ../../Zotlabs/Module/Admin/Site.php:301 msgid "Proxy user" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:299 +#: ../../Zotlabs/Module/Admin/Site.php:302 msgid "Proxy URL" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:300 +#: ../../Zotlabs/Module/Admin/Site.php:303 msgid "Network timeout" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:300 +#: ../../Zotlabs/Module/Admin/Site.php:303 msgid "Value is in seconds. Set to 0 for unlimited (not recommended)." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:301 +#: ../../Zotlabs/Module/Admin/Site.php:304 msgid "Delivery interval" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:301 +#: ../../Zotlabs/Module/Admin/Site.php:304 msgid "" "Delay background delivery processes by this many seconds to reduce system " "load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 " "for large dedicated servers." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:302 +#: ../../Zotlabs/Module/Admin/Site.php:305 msgid "Deliveries per process" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:302 +#: ../../Zotlabs/Module/Admin/Site.php:305 msgid "" "Number of deliveries to attempt in a single operating system process. Adjust " "if necessary to tune system performance. Recommend: 1-5." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:303 +#: ../../Zotlabs/Module/Admin/Site.php:306 msgid "Poll interval" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:303 +#: ../../Zotlabs/Module/Admin/Site.php:306 msgid "" "Delay background polling processes by this many seconds to reduce system " "load. If 0, use delivery interval." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:304 +#: ../../Zotlabs/Module/Admin/Site.php:307 msgid "Maximum Load Average" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:304 +#: ../../Zotlabs/Module/Admin/Site.php:307 msgid "" "Maximum system load before delivery and poll processes are deferred - " "default 50." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:305 +#: ../../Zotlabs/Module/Admin/Site.php:308 msgid "Expiration period in days for imported (grid/network) content" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:305 +#: ../../Zotlabs/Module/Admin/Site.php:308 msgid "0 for no expiration of imported content" msgstr "" -#: ../../Zotlabs/Module/Lockview.php:75 -msgid "Remote privacy information not available." +#: ../../Zotlabs/Module/Pubsites.php:24 ../../include/widgets.php:1454 +msgid "Public Hubs" msgstr "" -#: ../../Zotlabs/Module/Lockview.php:96 -msgid "Visible to:" +#: ../../Zotlabs/Module/Pubsites.php:27 +msgid "" +"The listed hubs allow public registration for the $Projectname network. All " +"hubs in the network are interlinked so membership on any of them conveys " +"membership in the network as a whole. Some hubs may require subscription or " +"provide tiered service plans. The hub itself <strong>may</strong> provide " +"additional details." +msgstr "" + +#: ../../Zotlabs/Module/Pubsites.php:33 +msgid "Hub URL" +msgstr "" + +#: ../../Zotlabs/Module/Pubsites.php:33 +msgid "Access Type" +msgstr "" + +#: ../../Zotlabs/Module/Pubsites.php:33 +msgid "Registration Policy" +msgstr "" + +#: ../../Zotlabs/Module/Pubsites.php:33 +msgid "Stats" +msgstr "" + +#: ../../Zotlabs/Module/Pubsites.php:33 +msgid "Software" +msgstr "" + +#: ../../Zotlabs/Module/Pubsites.php:35 ../../Zotlabs/Module/Ratings.php:97 +#: ../../include/conversation.php:974 +msgid "Ratings" +msgstr "" + +#: ../../Zotlabs/Module/Pubsites.php:48 +msgid "Rate" +msgstr "" + +#: ../../Zotlabs/Module/Pubsites.php:59 ../../Zotlabs/Module/Blocks.php:166 +#: ../../Zotlabs/Module/Layouts.php:197 ../../Zotlabs/Module/Webpages.php:246 +#: ../../Zotlabs/Module/Wiki.php:146 ../../Zotlabs/Module/Events.php:685 +#: ../../include/page_widgets.php:42 ../../include/widgets.php:967 +msgid "View" +msgstr "" + +#: ../../Zotlabs/Module/Editlayout.php:79 +#: ../../Zotlabs/Module/Editwebpage.php:80 +#: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95 +#: ../../Zotlabs/Module/Editpost.php:24 +msgid "Item not found" msgstr "" #: ../../Zotlabs/Module/Editlayout.php:127 @@ -2458,62 +2854,65 @@ msgstr "" msgid "Page link" msgstr "" +#: ../../Zotlabs/Module/Editwebpage.php:146 ../../Zotlabs/Module/Mail.php:258 +#: ../../Zotlabs/Module/Mail.php:383 ../../Zotlabs/Module/Editblock.php:111 +#: ../../Zotlabs/Module/Chat.php:207 ../../include/conversation.php:1165 +msgid "Insert web link" +msgstr "" + #: ../../Zotlabs/Module/Editwebpage.php:169 msgid "Edit Webpage" msgstr "" -#: ../../Zotlabs/Module/Follow.php:31 -msgid "Channel added." +#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:222 +#: ../../include/nav.php:95 ../../include/conversation.php:1692 +msgid "Photos" msgstr "" -#: ../../Zotlabs/Module/Manage.php:136 -#: ../../Zotlabs/Module/New_channel.php:121 -#, php-format -msgid "You have created %1$.0f of %2$.0f allowed channels." +#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Wiki.php:20 +#: ../../Zotlabs/Module/Chat.php:25 +#: ../../extend/addon/addon/chess/chess.php:400 +msgid "You must be logged in to see this page." msgstr "" -#: ../../Zotlabs/Module/Manage.php:143 -msgid "Create a new channel" +#: ../../Zotlabs/Module/Channel.php:44 +msgid "Posts and comments" msgstr "" -#: ../../Zotlabs/Module/Manage.php:143 ../../Zotlabs/Module/Profiles.php:772 -#: ../../Zotlabs/Module/Chat.php:255 -msgid "Create New" +#: ../../Zotlabs/Module/Channel.php:45 +msgid "Only posts" msgstr "" -#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:214 -#: ../../include/nav.php:211 -msgid "Channel Manager" +#: ../../Zotlabs/Module/Channel.php:104 +msgid "Insufficient permissions. Request redirected to profile page." msgstr "" -#: ../../Zotlabs/Module/Manage.php:165 -msgid "Current Channel" +#: ../../Zotlabs/Module/Network.php:96 +msgid "No such group" msgstr "" -#: ../../Zotlabs/Module/Manage.php:167 -msgid "Switch to one of your channels by selecting it." +#: ../../Zotlabs/Module/Network.php:136 +msgid "No such channel" msgstr "" -#: ../../Zotlabs/Module/Manage.php:168 -msgid "Default Channel" +#: ../../Zotlabs/Module/Network.php:141 +msgid "forum" msgstr "" -#: ../../Zotlabs/Module/Manage.php:169 -msgid "Make Default" +#: ../../Zotlabs/Module/Network.php:153 +msgid "Search Results For:" msgstr "" -#: ../../Zotlabs/Module/Manage.php:172 -#, php-format -msgid "%d new messages" +#: ../../Zotlabs/Module/Network.php:221 +msgid "Privacy group is empty" msgstr "" -#: ../../Zotlabs/Module/Manage.php:173 -#, php-format -msgid "%d new introductions" +#: ../../Zotlabs/Module/Network.php:230 +msgid "Privacy group: " msgstr "" -#: ../../Zotlabs/Module/Manage.php:175 -msgid "Delegated Channel" +#: ../../Zotlabs/Module/Network.php:256 +msgid "Invalid connection." msgstr "" #: ../../Zotlabs/Module/Menu.php:49 @@ -2552,14 +2951,10 @@ msgstr "" msgid "Submit and proceed" msgstr "" -#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2312 +#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2268 msgid "Menus" msgstr "" -#: ../../Zotlabs/Module/Menu.php:113 ../../Zotlabs/Module/Locs.php:120 -msgid "Drop" -msgstr "" - #: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Blocks.php:157 #: ../../Zotlabs/Module/Layouts.php:190 ../../Zotlabs/Module/Webpages.php:251 #: ../../include/page_widgets.php:47 @@ -2664,9 +3059,9 @@ msgstr "" msgid "Location (URL) of app" msgstr "" -#: ../../Zotlabs/Module/Appman.php:117 ../../Zotlabs/Module/Events.php:466 -#: ../../Zotlabs/Module/Rbmark.php:101 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:834 +#: ../../Zotlabs/Module/Appman.php:117 ../../Zotlabs/Module/Rbmark.php:101 +#: ../../Zotlabs/Module/Events.php:466 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:838 #: ../../extend/addon/addon/rendezvous/rendezvous.php:133 msgid "Description" msgstr "" @@ -2699,29 +3094,11 @@ msgstr "" msgid "Edit post" msgstr "" -#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93 -msgid "Authorize application connection" -msgstr "" - -#: ../../Zotlabs/Module/Api.php:73 -msgid "Return to your app and insert this Security Code:" -msgstr "" - -#: ../../Zotlabs/Module/Api.php:83 -msgid "Please login to continue." -msgstr "" - -#: ../../Zotlabs/Module/Api.php:95 -msgid "" -"Do you want to authorize this application to access your posts and contacts, " -"and/or create new posts for you?" -msgstr "" - #: ../../Zotlabs/Module/Help.php:23 msgid "Documentation Search" msgstr "" -#: ../../Zotlabs/Module/Help.php:51 +#: ../../Zotlabs/Module/Help.php:82 msgid "$Projectname Documentation" msgstr "" @@ -2733,13 +3110,12 @@ msgstr "" msgid "Activate the Firefox $Projectname provider" msgstr "" -#: ../../Zotlabs/Module/Apps.php:46 ../../include/nav.php:168 +#: ../../Zotlabs/Module/Apps.php:46 ../../include/nav.php:166 #: ../../include/widgets.php:102 msgid "Apps" msgstr "" #: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82 -#: ../../Zotlabs/Module/Siteinfo.php:48 msgid "$Projectname" msgstr "" @@ -2799,338 +3175,12 @@ msgstr "" msgid "Notify your contacts about this file" msgstr "" -#: ../../Zotlabs/Module/Item.php:182 -msgid "Unable to locate original post." -msgstr "" - -#: ../../Zotlabs/Module/Item.php:435 -msgid "Empty post discarded." -msgstr "" - -#: ../../Zotlabs/Module/Item.php:475 -msgid "Executable content type not permitted to this channel." -msgstr "" - -#: ../../Zotlabs/Module/Item.php:855 -msgid "Duplicate post suppressed." -msgstr "" - -#: ../../Zotlabs/Module/Item.php:992 -msgid "System error. Post not saved." -msgstr "" - -#: ../../Zotlabs/Module/Item.php:1113 -msgid "Unable to obtain post information from database." -msgstr "" - -#: ../../Zotlabs/Module/Item.php:1120 -#, php-format -msgid "You have reached your limit of %1$.0f top level posts." -msgstr "" - -#: ../../Zotlabs/Module/Item.php:1127 -#, php-format -msgid "You have reached your limit of %1$.0f webpages." -msgstr "" - -#: ../../Zotlabs/Module/Chanview.php:134 -msgid "toggle full screen mode" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:183 -#: ../../Zotlabs/Module/Profiles.php:240 ../../Zotlabs/Module/Profiles.php:619 -#: ../../extend/addon/addon/friendica/dfrn_confirm.php:62 -msgid "Profile not found." -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:44 -msgid "Profile deleted." -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:68 ../../Zotlabs/Module/Profiles.php:104 -msgid "Profile-" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:89 ../../Zotlabs/Module/Profiles.php:126 -msgid "New profile created." -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:110 -msgid "Profile unavailable to clone." -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:145 -msgid "Profile unavailable to export." -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:250 -msgid "Profile Name is required." -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:421 -msgid "Marital Status" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:425 -msgid "Romantic Partner" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:429 ../../Zotlabs/Module/Profiles.php:730 -msgid "Likes" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:433 ../../Zotlabs/Module/Profiles.php:731 -msgid "Dislikes" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:437 ../../Zotlabs/Module/Profiles.php:738 -msgid "Work/Employment" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:440 -msgid "Religion" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:444 -msgid "Political Views" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:448 -#: ../../extend/addon/addon/openid/MysqlProvider.php:74 -msgid "Gender" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:452 -msgid "Sexual Preference" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:456 -msgid "Homepage" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:460 -msgid "Interests" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:471 ../../Zotlabs/Module/Profiles.php:692 -#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Events.php:468 -#: ../../Zotlabs/Module/Pubsites.php:51 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:835 -#: ../../include/js_strings.php:25 -msgid "Location" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:554 -msgid "Profile updated." -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:638 -msgid "Hide your connections list from viewers of this profile" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:680 -msgid "Edit Profile Details" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:682 -msgid "View this profile" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:683 ../../Zotlabs/Module/Profiles.php:765 -#: ../../include/channel.php:983 -msgid "Edit visibility" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:684 -msgid "Profile Tools" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:685 -msgid "Change cover photo" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:686 ../../include/channel.php:954 -msgid "Change profile photo" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:687 -msgid "Create a new profile using these settings" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:688 -msgid "Clone this profile" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:689 -msgid "Delete this profile" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:690 -msgid "Add profile things" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:691 ../../include/widgets.php:105 -#: ../../include/conversation.php:1585 -msgid "Personal" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:693 -msgid "Relation" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:694 ../../include/datetime.php:55 -msgid "Miscellaneous" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:696 -msgid "Import profile from file" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:697 -msgid "Export profile to file" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:698 -msgid "Your gender" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:699 -msgid "Marital status" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:700 -msgid "Sexual preference" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:703 -msgid "Profile name" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:705 -msgid "This is your default profile." -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:707 -msgid "Your full name" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:708 -msgid "Title/Description" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:711 -msgid "Street address" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:712 -msgid "Locality/City" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:713 -msgid "Region/State" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:714 -msgid "Postal/Zip code" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:715 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1157 -msgid "Country" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:720 -msgid "Who (if applicable)" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:720 -msgid "Examples: cathy123, Cathy Williams, cathy@example.com" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:721 -msgid "Since (date)" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:724 -msgid "Tell us about yourself" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:725 -#: ../../extend/addon/addon/openid/MysqlProvider.php:68 -msgid "Homepage URL" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:726 -msgid "Hometown" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:727 -msgid "Political views" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:728 -msgid "Religious views" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:729 -msgid "Keywords used in directory listings" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:729 -msgid "Example: fishing photography software" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:732 -msgid "Musical interests" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:733 -msgid "Books, literature" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:734 -msgid "Television" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:735 -msgid "Film/Dance/Culture/Entertainment" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:736 -msgid "Hobbies/Interests" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:737 -msgid "Love/Romance" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:739 -msgid "School/Education" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:740 -msgid "Contact information and social networks" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:741 -msgid "My other channels" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:761 ../../include/channel.php:979 -msgid "Profile Image" -msgstr "" - -#: ../../Zotlabs/Module/Profiles.php:771 ../../include/channel.php:961 -#: ../../include/nav.php:91 -msgid "Edit Profiles" -msgstr "" - -#: ../../Zotlabs/Module/Acl.php:313 -msgid "network" -msgstr "" - -#: ../../Zotlabs/Module/Acl.php:323 -msgid "RSS" +#: ../../Zotlabs/Module/Directory.php:64 ../../Zotlabs/Module/Display.php:17 +#: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Photos.php:509 +#: ../../Zotlabs/Module/Search.php:17 +#: ../../Zotlabs/Module/Viewconnections.php:23 +#: ../../extend/addon/addon/friendica/dfrn_request.php:794 +msgid "Public access denied." msgstr "" #: ../../Zotlabs/Module/Directory.php:245 @@ -3158,7 +3208,7 @@ msgstr "" #: ../../Zotlabs/Module/Directory.php:314 ../../include/channel.php:1051 #: ../../include/event.php:52 ../../include/event.php:84 -#: ../../include/bb2diaspora.php:512 +#: ../../include/bb2diaspora.php:518 msgid "Location:" msgstr "" @@ -3174,13 +3224,6 @@ msgstr "" msgid "About:" msgstr "" -#: ../../Zotlabs/Module/Directory.php:328 ../../Zotlabs/Module/Suggest.php:56 -#: ../../Zotlabs/Module/Match.php:68 ../../include/channel.php:1036 -#: ../../include/connections.php:78 ../../include/widgets.php:147 -#: ../../include/widgets.php:184 ../../include/conversation.php:971 -msgid "Connect" -msgstr "" - #: ../../Zotlabs/Module/Directory.php:329 msgid "Public Forum:" msgstr "" @@ -3246,334 +3289,372 @@ msgstr "" msgid "No entries (some entries may be hidden)." msgstr "" -#: ../../Zotlabs/Module/Group.php:24 -msgid "Privacy group created." +#: ../../Zotlabs/Module/Item.php:182 +msgid "Unable to locate original post." msgstr "" -#: ../../Zotlabs/Module/Group.php:30 -msgid "Could not create privacy group." +#: ../../Zotlabs/Module/Item.php:435 +msgid "Empty post discarded." msgstr "" -#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141 -#: ../../include/items.php:3944 -msgid "Privacy group not found." +#: ../../Zotlabs/Module/Item.php:475 +msgid "Executable content type not permitted to this channel." msgstr "" -#: ../../Zotlabs/Module/Group.php:58 -msgid "Privacy group updated." +#: ../../Zotlabs/Module/Item.php:855 +msgid "Duplicate post suppressed." msgstr "" -#: ../../Zotlabs/Module/Group.php:90 -msgid "Create a group of channels." +#: ../../Zotlabs/Module/Item.php:992 +msgid "System error. Post not saved." msgstr "" -#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184 -msgid "Privacy group name: " +#: ../../Zotlabs/Module/Item.php:1113 +msgid "Unable to obtain post information from database." msgstr "" -#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187 -msgid "Members are visible to other channels" +#: ../../Zotlabs/Module/Item.php:1120 +#, php-format +msgid "You have reached your limit of %1$.0f top level posts." msgstr "" -#: ../../Zotlabs/Module/Group.php:111 -msgid "Privacy group removed." +#: ../../Zotlabs/Module/Item.php:1127 +#, php-format +msgid "You have reached your limit of %1$.0f webpages." msgstr "" -#: ../../Zotlabs/Module/Group.php:113 -msgid "Unable to remove privacy group." +#: ../../Zotlabs/Module/Chanview.php:134 +msgid "toggle full screen mode" msgstr "" -#: ../../Zotlabs/Module/Group.php:183 -msgid "Privacy group editor" +#: ../../Zotlabs/Module/Follow.php:31 +msgid "Channel added." msgstr "" -#: ../../Zotlabs/Module/Group.php:197 -msgid "Members" +#: ../../Zotlabs/Module/Mail.php:38 +msgid "Unable to lookup recipient." msgstr "" -#: ../../Zotlabs/Module/Group.php:199 -msgid "All Connected Channels" +#: ../../Zotlabs/Module/Mail.php:45 +msgid "Unable to communicate with requested channel." msgstr "" -#: ../../Zotlabs/Module/Group.php:231 -msgid "Click on a channel to add or remove." +#: ../../Zotlabs/Module/Mail.php:52 +msgid "Cannot verify requested channel." msgstr "" -#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203 -msgid "webpage" +#: ../../Zotlabs/Module/Mail.php:70 +msgid "Selected channel has private message restrictions. Send failed." msgstr "" -#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209 -msgid "block" +#: ../../Zotlabs/Module/Mail.php:149 +msgid "Messages" msgstr "" -#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206 -msgid "layout" +#: ../../Zotlabs/Module/Mail.php:184 +msgid "Message recalled." msgstr "" -#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212 -msgid "menu" +#: ../../Zotlabs/Module/Mail.php:197 +msgid "Conversation removed." msgstr "" -#: ../../Zotlabs/Module/Impel.php:191 -#, php-format -msgid "%s element installed" +#: ../../Zotlabs/Module/Mail.php:211 ../../Zotlabs/Module/Mail.php:320 +#: ../../Zotlabs/Module/Chat.php:205 ../../include/conversation.php:1200 +msgid "Please enter a link URL:" msgstr "" -#: ../../Zotlabs/Module/Impel.php:194 -#, php-format -msgid "%s element installation failed" +#: ../../Zotlabs/Module/Mail.php:212 ../../Zotlabs/Module/Mail.php:321 +msgid "Expires YYYY-MM-DD HH:MM" msgstr "" -#: ../../Zotlabs/Module/Import_items.php:104 -msgid "Import completed" +#: ../../Zotlabs/Module/Mail.php:240 +msgid "Requested channel is not in this network" msgstr "" -#: ../../Zotlabs/Module/Import_items.php:119 -msgid "Import Items" +#: ../../Zotlabs/Module/Mail.php:248 +msgid "Send Private Message" msgstr "" -#: ../../Zotlabs/Module/Import_items.php:120 -msgid "Use this form to import existing posts and content from an export file." +#: ../../Zotlabs/Module/Mail.php:249 ../../Zotlabs/Module/Mail.php:374 +msgid "To:" msgstr "" -#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Wiki.php:20 -#: ../../Zotlabs/Module/Chat.php:25 -#: ../../extend/addon/addon/chess/chess.php:400 -msgid "You must be logged in to see this page." +#: ../../Zotlabs/Module/Mail.php:252 ../../Zotlabs/Module/Mail.php:376 +msgid "Subject:" msgstr "" -#: ../../Zotlabs/Module/Channel.php:44 -msgid "Posts and comments" +#: ../../Zotlabs/Module/Mail.php:255 ../../Zotlabs/Module/Invite.php:138 +msgid "Your message:" msgstr "" -#: ../../Zotlabs/Module/Channel.php:45 -msgid "Only posts" +#: ../../Zotlabs/Module/Mail.php:257 ../../Zotlabs/Module/Mail.php:382 +#: ../../include/conversation.php:1260 +msgid "Attach file" msgstr "" -#: ../../Zotlabs/Module/Channel.php:104 -msgid "Insufficient permissions. Request redirected to profile page." +#: ../../Zotlabs/Module/Mail.php:259 +msgid "Send" msgstr "" -#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54 -msgid "Location not found." +#: ../../Zotlabs/Module/Mail.php:262 ../../Zotlabs/Module/Mail.php:387 +#: ../../include/conversation.php:1305 +msgid "Set expiration date" msgstr "" -#: ../../Zotlabs/Module/Locs.php:62 -msgid "Location lookup failed." +#: ../../Zotlabs/Module/Mail.php:264 ../../Zotlabs/Module/Mail.php:389 +#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Lib/ThreadItem.php:741 +#: ../../include/conversation.php:1310 +msgid "Encrypt text" msgstr "" -#: ../../Zotlabs/Module/Locs.php:66 +#: ../../Zotlabs/Module/Mail.php:346 +msgid "Delete message" +msgstr "" + +#: ../../Zotlabs/Module/Mail.php:347 +msgid "Delivery report" +msgstr "" + +#: ../../Zotlabs/Module/Mail.php:348 +msgid "Recall message" +msgstr "" + +#: ../../Zotlabs/Module/Mail.php:350 +msgid "Message has been recalled." +msgstr "" + +#: ../../Zotlabs/Module/Mail.php:367 +msgid "Delete Conversation" +msgstr "" + +#: ../../Zotlabs/Module/Mail.php:369 msgid "" -"Please select another location to become primary before removing the primary " -"location." +"No secure communications available. You <strong>may</strong> be able to " +"respond from the sender's profile page." msgstr "" -#: ../../Zotlabs/Module/Locs.php:95 -msgid "Syncing locations" +#: ../../Zotlabs/Module/Mail.php:373 +msgid "Send Reply" msgstr "" -#: ../../Zotlabs/Module/Locs.php:105 -msgid "No locations found." +#: ../../Zotlabs/Module/Mail.php:378 +#, php-format +msgid "Your message for %s (%s):" msgstr "" -#: ../../Zotlabs/Module/Locs.php:116 -msgid "Manage Channel Locations" +#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203 +msgid "webpage" msgstr "" -#: ../../Zotlabs/Module/Locs.php:119 -msgid "Primary" +#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209 +msgid "block" msgstr "" -#: ../../Zotlabs/Module/Locs.php:122 -msgid "Sync Now" +#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206 +msgid "layout" msgstr "" -#: ../../Zotlabs/Module/Locs.php:123 -msgid "Please wait several minutes between consecutive operations." +#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212 +msgid "menu" msgstr "" -#: ../../Zotlabs/Module/Locs.php:124 -msgid "" -"When possible, drop a location by logging into that website/hub and removing " -"your channel." +#: ../../Zotlabs/Module/Impel.php:191 +#, php-format +msgid "%s element installed" msgstr "" -#: ../../Zotlabs/Module/Locs.php:125 -msgid "Use this form to drop the location if the hub is no longer operating." +#: ../../Zotlabs/Module/Impel.php:194 +#, php-format +msgid "%s element installation failed" msgstr "" -#: ../../Zotlabs/Module/Admin.php:94 -msgid "# Accounts" +#: ../../Zotlabs/Module/Import_items.php:42 ../../Zotlabs/Module/Import.php:71 +msgid "Nothing to import." msgstr "" -#: ../../Zotlabs/Module/Admin.php:95 -msgid "# blocked accounts" +#: ../../Zotlabs/Module/Import_items.php:66 ../../Zotlabs/Module/Import.php:83 +#: ../../Zotlabs/Module/Import.php:98 +msgid "Unable to download data from old server" msgstr "" -#: ../../Zotlabs/Module/Admin.php:96 -msgid "# expired accounts" +#: ../../Zotlabs/Module/Import_items.php:72 +#: ../../Zotlabs/Module/Import.php:105 +msgid "Imported file is empty." msgstr "" -#: ../../Zotlabs/Module/Admin.php:97 -msgid "# expiring accounts" +#: ../../Zotlabs/Module/Import_items.php:88 +#: ../../Zotlabs/Module/Import.php:127 +#, php-format +msgid "Warning: Database versions differ by %1$d updates." msgstr "" -#: ../../Zotlabs/Module/Admin.php:108 -msgid "# Channels" +#: ../../Zotlabs/Module/Import_items.php:104 +msgid "Import completed" msgstr "" -#: ../../Zotlabs/Module/Admin.php:109 -msgid "# primary" +#: ../../Zotlabs/Module/Import_items.php:119 +msgid "Import Items" msgstr "" -#: ../../Zotlabs/Module/Admin.php:110 -msgid "# clones" +#: ../../Zotlabs/Module/Import_items.php:120 +msgid "Use this form to import existing posts and content from an export file." msgstr "" -#: ../../Zotlabs/Module/Admin.php:116 -msgid "Message queues" +#: ../../Zotlabs/Module/Import_items.php:121 +#: ../../Zotlabs/Module/Import.php:532 +msgid "File to Upload" msgstr "" -#: ../../Zotlabs/Module/Admin.php:133 -msgid "Your software should be updated" +#: ../../Zotlabs/Module/Invite.php:29 +msgid "Total invitation limit exceeded." msgstr "" -#: ../../Zotlabs/Module/Admin.php:138 -msgid "Summary" +#: ../../Zotlabs/Module/Invite.php:53 +#, php-format +msgid "%s : Not a valid email address." msgstr "" -#: ../../Zotlabs/Module/Admin.php:141 -msgid "Registered accounts" +#: ../../Zotlabs/Module/Invite.php:67 +msgid "Please join us on $Projectname" msgstr "" -#: ../../Zotlabs/Module/Admin.php:142 -msgid "Pending registrations" +#: ../../Zotlabs/Module/Invite.php:77 +msgid "Invitation limit exceeded. Please contact your site administrator." msgstr "" -#: ../../Zotlabs/Module/Admin.php:143 -msgid "Registered channels" +#: ../../Zotlabs/Module/Invite.php:82 +#, php-format +msgid "%s : Message delivery failed." msgstr "" -#: ../../Zotlabs/Module/Admin.php:144 -msgid "Active plugins" +#: ../../Zotlabs/Module/Invite.php:86 +#, php-format +msgid "%d message sent." +msgid_plural "%d messages sent." +msgstr[0] "" +msgstr[1] "" + +#: ../../Zotlabs/Module/Invite.php:105 +msgid "You have no more invitations available" msgstr "" -#: ../../Zotlabs/Module/Admin.php:145 -msgid "Version" +#: ../../Zotlabs/Module/Invite.php:136 +msgid "Send invitations" msgstr "" -#: ../../Zotlabs/Module/Admin.php:146 -msgid "Repository version (master)" +#: ../../Zotlabs/Module/Invite.php:137 +msgid "Enter email addresses, one per line:" msgstr "" -#: ../../Zotlabs/Module/Admin.php:147 -msgid "Repository version (dev)" +#: ../../Zotlabs/Module/Invite.php:139 +msgid "Please join my community on $Projectname." msgstr "" -#: ../../Zotlabs/Module/Like.php:19 -msgid "Like/Dislike" +#: ../../Zotlabs/Module/Invite.php:141 +msgid "You will need to supply this invitation code:" msgstr "" -#: ../../Zotlabs/Module/Like.php:24 -msgid "This action is restricted to members." +#: ../../Zotlabs/Module/Invite.php:142 +msgid "1. Register at any $Projectname location (they are all inter-connected)" msgstr "" -#: ../../Zotlabs/Module/Like.php:25 -msgid "" -"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a href=" -"\"register\">register as a new $Projectname member</a> to continue." +#: ../../Zotlabs/Module/Invite.php:144 +msgid "2. Enter my $Projectname network address into the site searchbar." msgstr "" -#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131 -#: ../../Zotlabs/Module/Like.php:169 -msgid "Invalid request." +#: ../../Zotlabs/Module/Invite.php:145 +msgid "or visit" msgstr "" -#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:126 -msgid "channel" +#: ../../Zotlabs/Module/Invite.php:147 +msgid "3. Click [Connect]" msgstr "" -#: ../../Zotlabs/Module/Like.php:146 -msgid "thing" +#: ../../Zotlabs/Module/Editblock.php:108 ../../Zotlabs/Module/Blocks.php:97 +#: ../../Zotlabs/Module/Blocks.php:155 +msgid "Block Name" msgstr "" -#: ../../Zotlabs/Module/Like.php:192 -msgid "Channel unavailable." +#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1276 +msgid "Title (optional)" msgstr "" -#: ../../Zotlabs/Module/Like.php:240 -msgid "Previous action reversed." +#: ../../Zotlabs/Module/Editblock.php:133 +msgid "Edit Block" msgstr "" -#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87 -#: ../../Zotlabs/Module/Tagger.php:47 -#: ../../extend/addon/addon/diaspora/inbound.php:1792 -#: ../../extend/addon/addon/redphotos/redphotohelper.php:74 -#: ../../include/text.php:1984 ../../include/conversation.php:120 -msgid "photo" +#: ../../Zotlabs/Module/Group.php:24 +msgid "Privacy group created." msgstr "" -#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87 -#: ../../extend/addon/addon/diaspora/inbound.php:1792 -#: ../../include/text.php:1990 ../../include/conversation.php:148 -msgid "status" +#: ../../Zotlabs/Module/Group.php:30 +msgid "Could not create privacy group." msgstr "" -#: ../../Zotlabs/Module/Like.php:372 ../../Zotlabs/Module/Events.php:256 -#: ../../Zotlabs/Module/Tagger.php:51 ../../include/event.php:961 -#: ../../include/text.php:1987 ../../include/conversation.php:123 -msgid "event" +#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141 +#: ../../include/items.php:3883 +msgid "Privacy group not found." msgstr "" -#: ../../Zotlabs/Module/Like.php:419 -#: ../../extend/addon/addon/diaspora/inbound.php:1821 -#: ../../include/conversation.php:164 -#, php-format -msgid "%1$s likes %2$s's %3$s" +#: ../../Zotlabs/Module/Group.php:58 +msgid "Privacy group updated." msgstr "" -#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:167 -#, php-format -msgid "%1$s doesn't like %2$s's %3$s" +#: ../../Zotlabs/Module/Group.php:90 +msgid "Create a group of channels." msgstr "" -#: ../../Zotlabs/Module/Like.php:423 -#, php-format -msgid "%1$s agrees with %2$s's %3$s" +#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184 +msgid "Privacy group name: " msgstr "" -#: ../../Zotlabs/Module/Like.php:425 -#, php-format -msgid "%1$s doesn't agree with %2$s's %3$s" +#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187 +msgid "Members are visible to other channels" msgstr "" -#: ../../Zotlabs/Module/Like.php:427 -#, php-format -msgid "%1$s abstains from a decision on %2$s's %3$s" +#: ../../Zotlabs/Module/Group.php:111 +msgid "Privacy group removed." msgstr "" -#: ../../Zotlabs/Module/Like.php:429 -#, php-format -msgid "%1$s is attending %2$s's %3$s" +#: ../../Zotlabs/Module/Group.php:113 +msgid "Unable to remove privacy group." msgstr "" -#: ../../Zotlabs/Module/Like.php:431 -#, php-format -msgid "%1$s is not attending %2$s's %3$s" +#: ../../Zotlabs/Module/Group.php:183 +msgid "Privacy group editor" msgstr "" -#: ../../Zotlabs/Module/Like.php:433 -#, php-format -msgid "%1$s may attend %2$s's %3$s" +#: ../../Zotlabs/Module/Group.php:197 +msgid "Members" msgstr "" -#: ../../Zotlabs/Module/Like.php:538 -msgid "Action completed." +#: ../../Zotlabs/Module/Group.php:199 +msgid "All Connected Channels" msgstr "" -#: ../../Zotlabs/Module/Like.php:539 -msgid "Thank you." +#: ../../Zotlabs/Module/Group.php:231 +msgid "Click on a channel to add or remove." +msgstr "" + +#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63 +msgid "Invalid profile identifier." +msgstr "" + +#: ../../Zotlabs/Module/Profperm.php:115 +msgid "Profile Visibility Editor" +msgstr "" + +#: ../../Zotlabs/Module/Profperm.php:117 ../../include/channel.php:1282 +msgid "Profile" +msgstr "" + +#: ../../Zotlabs/Module/Profperm.php:119 +msgid "Click on a contact to add or remove." +msgstr "" + +#: ../../Zotlabs/Module/Profperm.php:128 +msgid "Visible To" msgstr "" #: ../../Zotlabs/Module/Magic.php:71 @@ -3701,11 +3782,6 @@ msgstr "" msgid "No ratings" msgstr "" -#: ../../Zotlabs/Module/Ratings.php:97 ../../Zotlabs/Module/Pubsites.php:35 -#: ../../include/conversation.php:974 -msgid "Ratings" -msgstr "" - #: ../../Zotlabs/Module/Ratings.php:98 msgid "Rating: " msgstr "" @@ -3736,71 +3812,6 @@ msgstr "" msgid "Set your current mood and tell your friends" msgstr "" -#: ../../Zotlabs/Module/Dreport.php:45 -msgid "Invalid message" -msgstr "" - -#: ../../Zotlabs/Module/Dreport.php:78 -msgid "no results" -msgstr "" - -#: ../../Zotlabs/Module/Dreport.php:93 -msgid "channel sync processed" -msgstr "" - -#: ../../Zotlabs/Module/Dreport.php:97 -msgid "queued" -msgstr "" - -#: ../../Zotlabs/Module/Dreport.php:101 -msgid "posted" -msgstr "" - -#: ../../Zotlabs/Module/Dreport.php:105 -msgid "accepted for delivery" -msgstr "" - -#: ../../Zotlabs/Module/Dreport.php:109 -msgid "updated" -msgstr "" - -#: ../../Zotlabs/Module/Dreport.php:112 -msgid "update ignored" -msgstr "" - -#: ../../Zotlabs/Module/Dreport.php:115 -msgid "permission denied" -msgstr "" - -#: ../../Zotlabs/Module/Dreport.php:119 -msgid "recipient not found" -msgstr "" - -#: ../../Zotlabs/Module/Dreport.php:122 -msgid "mail recalled" -msgstr "" - -#: ../../Zotlabs/Module/Dreport.php:125 -msgid "duplicate mail received" -msgstr "" - -#: ../../Zotlabs/Module/Dreport.php:128 -msgid "mail delivered" -msgstr "" - -#: ../../Zotlabs/Module/Dreport.php:148 -#, php-format -msgid "Delivery report for %1$s" -msgstr "" - -#: ../../Zotlabs/Module/Dreport.php:151 -msgid "Options" -msgstr "" - -#: ../../Zotlabs/Module/Dreport.php:152 -msgid "Redeliver" -msgstr "" - #: ../../Zotlabs/Module/Notify.php:57 #: ../../Zotlabs/Module/Notifications.php:35 msgid "No more system notifications." @@ -3811,10 +3822,6 @@ msgstr "" msgid "System Notifications" msgstr "" -#: ../../Zotlabs/Module/Editpost.php:35 -msgid "Item is not editable" -msgstr "" - #: ../../Zotlabs/Module/Photos.php:82 msgid "Page owner information could not be retrieved." msgstr "" @@ -3905,12 +3912,12 @@ msgid "Show Oldest First" msgstr "" #: ../../Zotlabs/Module/Photos.php:783 ../../Zotlabs/Module/Photos.php:1337 -#: ../../Zotlabs/Module/Embedphotos.php:139 ../../include/widgets.php:1676 +#: ../../Zotlabs/Module/Embedphotos.php:139 ../../include/widgets.php:1739 msgid "View Photo" msgstr "" #: ../../Zotlabs/Module/Photos.php:814 -#: ../../Zotlabs/Module/Embedphotos.php:155 ../../include/widgets.php:1693 +#: ../../Zotlabs/Module/Embedphotos.php:155 ../../include/widgets.php:1756 msgid "Edit Album" msgstr "" @@ -3934,10 +3941,10 @@ msgstr "" msgid "Private Photo" msgstr "" -#: ../../Zotlabs/Module/Photos.php:940 ../../Zotlabs/Module/Events.php:680 -#: ../../Zotlabs/Module/Events.php:689 ../../Zotlabs/Module/Cal.php:332 -#: ../../Zotlabs/Module/Cal.php:339 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:842 +#: ../../Zotlabs/Module/Photos.php:940 ../../Zotlabs/Module/Cal.php:336 +#: ../../Zotlabs/Module/Cal.php:343 ../../Zotlabs/Module/Events.php:680 +#: ../../Zotlabs/Module/Events.php:689 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:846 msgid "Previous" msgstr "" @@ -3946,9 +3953,9 @@ msgid "View Full Size" msgstr "" #: ../../Zotlabs/Module/Photos.php:949 ../../Zotlabs/Module/Setup.php:270 +#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Cal.php:344 #: ../../Zotlabs/Module/Events.php:681 ../../Zotlabs/Module/Events.php:690 -#: ../../Zotlabs/Module/Cal.php:333 ../../Zotlabs/Module/Cal.php:340 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:843 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:847 msgid "Next" msgstr "" @@ -4022,8 +4029,8 @@ msgstr "" msgid "Comment" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1099 ../../Zotlabs/Module/Events.php:471 -#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/ThreadItem.php:738 +#: ../../Zotlabs/Module/Photos.php:1099 ../../Zotlabs/Module/Webpages.php:247 +#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Lib/ThreadItem.php:738 #: ../../include/page_widgets.php:43 ../../include/conversation.php:1217 msgid "Preview" msgstr "" @@ -4070,13 +4077,13 @@ msgstr "" #: ../../Zotlabs/Module/Photos.php:1132 ../../Zotlabs/Module/Photos.php:1144 #: ../../Zotlabs/Lib/ThreadItem.php:186 ../../Zotlabs/Lib/ThreadItem.php:198 -#: ../../include/conversation.php:1784 +#: ../../include/conversation.php:1783 msgid "View all" msgstr "" #: ../../Zotlabs/Module/Photos.php:1136 ../../Zotlabs/Lib/ThreadItem.php:190 #: ../../include/channel.php:1190 ../../include/taxonomy.php:403 -#: ../../include/conversation.php:1808 +#: ../../include/conversation.php:1807 msgctxt "noun" msgid "Like" msgid_plural "Likes" @@ -4084,7 +4091,7 @@ msgstr[0] "" msgstr[1] "" #: ../../Zotlabs/Module/Photos.php:1141 ../../Zotlabs/Lib/ThreadItem.php:195 -#: ../../include/conversation.php:1811 +#: ../../include/conversation.php:1810 msgctxt "noun" msgid "Dislike" msgid_plural "Dislikes" @@ -4530,7 +4537,7 @@ msgid "" msgstr "" #: ../../Zotlabs/Module/Setup.php:697 -#: ../../extend/addon/addon/cdav/cdav.php:40 +#: ../../extend/addon/addon/cdav/cdav.php:41 #: ../../extend/addon/addon/rendezvous/rendezvous.php:352 msgid "Errors encountered creating database tables." msgstr "" @@ -4544,32 +4551,12 @@ msgid "" "IMPORTANT: You will need to [manually] setup a scheduled task for the poller." msgstr "" -#: ../../Zotlabs/Module/Network.php:96 -msgid "No such group" -msgstr "" - -#: ../../Zotlabs/Module/Network.php:136 -msgid "No such channel" -msgstr "" - -#: ../../Zotlabs/Module/Network.php:141 -msgid "forum" -msgstr "" - -#: ../../Zotlabs/Module/Network.php:153 -msgid "Search Results For:" -msgstr "" - -#: ../../Zotlabs/Module/Network.php:221 -msgid "Privacy group is empty" -msgstr "" - -#: ../../Zotlabs/Module/Network.php:230 -msgid "Privacy group: " +#: ../../Zotlabs/Module/Editpost.php:35 +msgid "Item is not editable" msgstr "" -#: ../../Zotlabs/Module/Network.php:256 -msgid "Invalid connection." +#: ../../Zotlabs/Module/Regdir.php:49 ../../Zotlabs/Module/Dirsearch.php:25 +msgid "This site is not a directory server" msgstr "" #: ../../Zotlabs/Module/New_channel.php:140 @@ -4588,298 +4575,343 @@ msgid "" "or <a href=\"import\">import an existing channel</a> from another location." msgstr "" -#: ../../Zotlabs/Module/Mail.php:38 -msgid "Unable to lookup recipient." +#: ../../Zotlabs/Module/Notifications.php:40 ../../include/nav.php:194 +msgid "Mark all system notifications seen" msgstr "" -#: ../../Zotlabs/Module/Mail.php:45 -msgid "Unable to communicate with requested channel." +#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:228 +#: ../../include/conversation.php:975 +msgid "Poke" msgstr "" -#: ../../Zotlabs/Module/Mail.php:52 -msgid "Cannot verify requested channel." +#: ../../Zotlabs/Module/Poke.php:169 +msgid "Poke somebody" msgstr "" -#: ../../Zotlabs/Module/Mail.php:70 -msgid "Selected channel has private message restrictions. Send failed." +#: ../../Zotlabs/Module/Poke.php:172 +msgid "Poke/Prod" msgstr "" -#: ../../Zotlabs/Module/Mail.php:149 -msgid "Messages" +#: ../../Zotlabs/Module/Poke.php:173 +msgid "Poke, prod or do other things to somebody" msgstr "" -#: ../../Zotlabs/Module/Mail.php:184 -msgid "Message recalled." +#: ../../Zotlabs/Module/Poke.php:180 +msgid "Recipient" msgstr "" -#: ../../Zotlabs/Module/Mail.php:197 -msgid "Conversation removed." +#: ../../Zotlabs/Module/Poke.php:181 +msgid "Choose what you wish to do to recipient" msgstr "" -#: ../../Zotlabs/Module/Mail.php:211 ../../Zotlabs/Module/Mail.php:320 -#: ../../Zotlabs/Module/Chat.php:205 ../../include/conversation.php:1200 -msgid "Please enter a link URL:" +#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185 +msgid "Make this post private" msgstr "" -#: ../../Zotlabs/Module/Mail.php:212 ../../Zotlabs/Module/Mail.php:321 -msgid "Expires YYYY-MM-DD HH:MM" +#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:183 +#: ../../Zotlabs/Module/Profiles.php:240 ../../Zotlabs/Module/Profiles.php:619 +#: ../../extend/addon/addon/friendica/dfrn_confirm.php:62 +msgid "Profile not found." msgstr "" -#: ../../Zotlabs/Module/Mail.php:240 -msgid "Requested channel is not in this network" +#: ../../Zotlabs/Module/Profiles.php:44 +msgid "Profile deleted." msgstr "" -#: ../../Zotlabs/Module/Mail.php:248 -msgid "Send Private Message" +#: ../../Zotlabs/Module/Profiles.php:68 ../../Zotlabs/Module/Profiles.php:104 +msgid "Profile-" msgstr "" -#: ../../Zotlabs/Module/Mail.php:249 ../../Zotlabs/Module/Mail.php:374 -msgid "To:" +#: ../../Zotlabs/Module/Profiles.php:89 ../../Zotlabs/Module/Profiles.php:126 +msgid "New profile created." msgstr "" -#: ../../Zotlabs/Module/Mail.php:252 ../../Zotlabs/Module/Mail.php:376 -msgid "Subject:" +#: ../../Zotlabs/Module/Profiles.php:110 +msgid "Profile unavailable to clone." msgstr "" -#: ../../Zotlabs/Module/Mail.php:255 ../../Zotlabs/Module/Invite.php:138 -msgid "Your message:" +#: ../../Zotlabs/Module/Profiles.php:145 +msgid "Profile unavailable to export." msgstr "" -#: ../../Zotlabs/Module/Mail.php:257 ../../Zotlabs/Module/Mail.php:382 -#: ../../include/conversation.php:1260 -msgid "Attach file" +#: ../../Zotlabs/Module/Profiles.php:250 +msgid "Profile Name is required." msgstr "" -#: ../../Zotlabs/Module/Mail.php:259 -msgid "Send" +#: ../../Zotlabs/Module/Profiles.php:421 +msgid "Marital Status" msgstr "" -#: ../../Zotlabs/Module/Mail.php:262 ../../Zotlabs/Module/Mail.php:387 -#: ../../include/conversation.php:1305 -msgid "Set expiration date" +#: ../../Zotlabs/Module/Profiles.php:425 +msgid "Romantic Partner" msgstr "" -#: ../../Zotlabs/Module/Mail.php:264 ../../Zotlabs/Module/Mail.php:389 -#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Lib/ThreadItem.php:741 -#: ../../include/conversation.php:1310 -msgid "Encrypt text" +#: ../../Zotlabs/Module/Profiles.php:429 ../../Zotlabs/Module/Profiles.php:730 +msgid "Likes" msgstr "" -#: ../../Zotlabs/Module/Mail.php:346 -msgid "Delete message" +#: ../../Zotlabs/Module/Profiles.php:433 ../../Zotlabs/Module/Profiles.php:731 +msgid "Dislikes" msgstr "" -#: ../../Zotlabs/Module/Mail.php:347 -msgid "Delivery report" +#: ../../Zotlabs/Module/Profiles.php:437 ../../Zotlabs/Module/Profiles.php:738 +msgid "Work/Employment" msgstr "" -#: ../../Zotlabs/Module/Mail.php:348 -msgid "Recall message" +#: ../../Zotlabs/Module/Profiles.php:440 +msgid "Religion" msgstr "" -#: ../../Zotlabs/Module/Mail.php:350 -msgid "Message has been recalled." +#: ../../Zotlabs/Module/Profiles.php:444 +msgid "Political Views" msgstr "" -#: ../../Zotlabs/Module/Mail.php:367 -msgid "Delete Conversation" +#: ../../Zotlabs/Module/Profiles.php:448 +#: ../../extend/addon/addon/openid/MysqlProvider.php:74 +msgid "Gender" msgstr "" -#: ../../Zotlabs/Module/Mail.php:369 -msgid "" -"No secure communications available. You <strong>may</strong> be able to " -"respond from the sender's profile page." +#: ../../Zotlabs/Module/Profiles.php:452 +msgid "Sexual Preference" msgstr "" -#: ../../Zotlabs/Module/Mail.php:373 -msgid "Send Reply" +#: ../../Zotlabs/Module/Profiles.php:456 +msgid "Homepage" msgstr "" -#: ../../Zotlabs/Module/Mail.php:378 -#, php-format -msgid "Your message for %s (%s):" +#: ../../Zotlabs/Module/Profiles.php:460 +msgid "Interests" msgstr "" -#: ../../Zotlabs/Module/Notifications.php:40 ../../include/nav.php:196 -msgid "Mark all system notifications seen" +#: ../../Zotlabs/Module/Profiles.php:554 +msgid "Profile updated." msgstr "" -#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:228 -#: ../../include/conversation.php:975 -msgid "Poke" +#: ../../Zotlabs/Module/Profiles.php:638 +msgid "Hide your connections list from viewers of this profile" msgstr "" -#: ../../Zotlabs/Module/Poke.php:169 -msgid "Poke somebody" +#: ../../Zotlabs/Module/Profiles.php:680 +msgid "Edit Profile Details" msgstr "" -#: ../../Zotlabs/Module/Poke.php:172 -msgid "Poke/Prod" +#: ../../Zotlabs/Module/Profiles.php:682 +msgid "View this profile" msgstr "" -#: ../../Zotlabs/Module/Poke.php:173 -msgid "Poke, prod or do other things to somebody" +#: ../../Zotlabs/Module/Profiles.php:683 ../../Zotlabs/Module/Profiles.php:765 +#: ../../include/channel.php:983 +msgid "Edit visibility" msgstr "" -#: ../../Zotlabs/Module/Poke.php:180 -msgid "Recipient" +#: ../../Zotlabs/Module/Profiles.php:684 +msgid "Profile Tools" msgstr "" -#: ../../Zotlabs/Module/Poke.php:181 -msgid "Choose what you wish to do to recipient" +#: ../../Zotlabs/Module/Profiles.php:685 +msgid "Change cover photo" msgstr "" -#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185 -msgid "Make this post private" +#: ../../Zotlabs/Module/Profiles.php:686 ../../include/channel.php:954 +msgid "Change profile photo" msgstr "" -#: ../../Zotlabs/Module/Invite.php:29 -msgid "Total invitation limit exceeded." +#: ../../Zotlabs/Module/Profiles.php:687 +msgid "Create a new profile using these settings" msgstr "" -#: ../../Zotlabs/Module/Invite.php:53 -#, php-format -msgid "%s : Not a valid email address." +#: ../../Zotlabs/Module/Profiles.php:688 +msgid "Clone this profile" msgstr "" -#: ../../Zotlabs/Module/Invite.php:67 -msgid "Please join us on $Projectname" +#: ../../Zotlabs/Module/Profiles.php:689 +msgid "Delete this profile" msgstr "" -#: ../../Zotlabs/Module/Invite.php:77 -msgid "Invitation limit exceeded. Please contact your site administrator." +#: ../../Zotlabs/Module/Profiles.php:690 +msgid "Add profile things" msgstr "" -#: ../../Zotlabs/Module/Invite.php:82 -#, php-format -msgid "%s : Message delivery failed." +#: ../../Zotlabs/Module/Profiles.php:691 ../../include/widgets.php:105 +#: ../../include/conversation.php:1585 +msgid "Personal" msgstr "" -#: ../../Zotlabs/Module/Invite.php:86 -#, php-format -msgid "%d message sent." -msgid_plural "%d messages sent." -msgstr[0] "" -msgstr[1] "" +#: ../../Zotlabs/Module/Profiles.php:693 +msgid "Relation" +msgstr "" -#: ../../Zotlabs/Module/Invite.php:105 -msgid "You have no more invitations available" +#: ../../Zotlabs/Module/Profiles.php:694 ../../include/datetime.php:55 +msgid "Miscellaneous" msgstr "" -#: ../../Zotlabs/Module/Invite.php:136 -msgid "Send invitations" +#: ../../Zotlabs/Module/Profiles.php:696 +msgid "Import profile from file" msgstr "" -#: ../../Zotlabs/Module/Invite.php:137 -msgid "Enter email addresses, one per line:" +#: ../../Zotlabs/Module/Profiles.php:697 +msgid "Export profile to file" msgstr "" -#: ../../Zotlabs/Module/Invite.php:139 -msgid "Please join my community on $Projectname." +#: ../../Zotlabs/Module/Profiles.php:698 +msgid "Your gender" msgstr "" -#: ../../Zotlabs/Module/Invite.php:141 -msgid "You will need to supply this invitation code:" +#: ../../Zotlabs/Module/Profiles.php:699 +msgid "Marital status" msgstr "" -#: ../../Zotlabs/Module/Invite.php:142 -msgid "1. Register at any $Projectname location (they are all inter-connected)" +#: ../../Zotlabs/Module/Profiles.php:700 +msgid "Sexual preference" msgstr "" -#: ../../Zotlabs/Module/Invite.php:144 -msgid "2. Enter my $Projectname network address into the site searchbar." +#: ../../Zotlabs/Module/Profiles.php:703 +msgid "Profile name" msgstr "" -#: ../../Zotlabs/Module/Invite.php:145 -msgid "or visit" +#: ../../Zotlabs/Module/Profiles.php:705 +msgid "This is your default profile." msgstr "" -#: ../../Zotlabs/Module/Invite.php:147 -msgid "3. Click [Connect]" +#: ../../Zotlabs/Module/Profiles.php:707 +msgid "Your full name" msgstr "" -#: ../../Zotlabs/Module/Oexchange.php:27 -msgid "Unable to find your hub." +#: ../../Zotlabs/Module/Profiles.php:708 +msgid "Title/Description" msgstr "" -#: ../../Zotlabs/Module/Oexchange.php:41 -msgid "Post successful." +#: ../../Zotlabs/Module/Profiles.php:711 +msgid "Street address" msgstr "" -#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59 -msgid "This setting requires special processing and editing has been blocked." +#: ../../Zotlabs/Module/Profiles.php:712 +msgid "Locality/City" msgstr "" -#: ../../Zotlabs/Module/Pconfig.php:48 -msgid "Configuration Editor" +#: ../../Zotlabs/Module/Profiles.php:713 +msgid "Region/State" msgstr "" -#: ../../Zotlabs/Module/Pconfig.php:49 -msgid "" -"Warning: Changing some settings could render your channel inoperable. Please " -"leave this page unless you are comfortable with and knowledgeable about how " -"to correctly use this feature." +#: ../../Zotlabs/Module/Profiles.php:714 +msgid "Postal/Zip code" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:19 -#, php-format -msgid "Version %s" +#: ../../Zotlabs/Module/Profiles.php:715 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1161 +msgid "Country" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:34 -msgid "Installed plugins/addons/apps:" +#: ../../Zotlabs/Module/Profiles.php:720 +msgid "Who (if applicable)" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:36 -msgid "No installed plugins/addons/apps" +#: ../../Zotlabs/Module/Profiles.php:720 +msgid "Examples: cathy123, Cathy Williams, cathy@example.com" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:49 -msgid "" -"This is a hub of $Projectname - a global cooperative network of " -"decentralized privacy enhanced websites." +#: ../../Zotlabs/Module/Profiles.php:721 +msgid "Since (date)" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:51 -msgid "Tag: " +#: ../../Zotlabs/Module/Profiles.php:724 +msgid "Tell us about yourself" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:53 -msgid "Last background fetch: " +#: ../../Zotlabs/Module/Profiles.php:725 +#: ../../extend/addon/addon/openid/MysqlProvider.php:68 +msgid "Homepage URL" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:55 -msgid "Current load average: " +#: ../../Zotlabs/Module/Profiles.php:726 +msgid "Hometown" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:58 -msgid "Running at web location" +#: ../../Zotlabs/Module/Profiles.php:727 +msgid "Political views" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:59 -msgid "" -"Please visit <a href=\"http://hubzilla.org\">hubzilla.org</a> to learn more " -"about $Projectname." +#: ../../Zotlabs/Module/Profiles.php:728 +msgid "Religious views" +msgstr "" + +#: ../../Zotlabs/Module/Profiles.php:729 +msgid "Keywords used in directory listings" +msgstr "" + +#: ../../Zotlabs/Module/Profiles.php:729 +msgid "Example: fishing photography software" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:60 -msgid "Bug reports and issues: please visit" +#: ../../Zotlabs/Module/Profiles.php:732 +msgid "Musical interests" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:62 -msgid "$projectname issues" +#: ../../Zotlabs/Module/Profiles.php:733 +msgid "Books, literature" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:63 -msgid "" -"Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot com" +#: ../../Zotlabs/Module/Profiles.php:734 +msgid "Television" +msgstr "" + +#: ../../Zotlabs/Module/Profiles.php:735 +msgid "Film/Dance/Culture/Entertainment" +msgstr "" + +#: ../../Zotlabs/Module/Profiles.php:736 +msgid "Hobbies/Interests" +msgstr "" + +#: ../../Zotlabs/Module/Profiles.php:737 +msgid "Love/Romance" +msgstr "" + +#: ../../Zotlabs/Module/Profiles.php:739 +msgid "School/Education" +msgstr "" + +#: ../../Zotlabs/Module/Profiles.php:740 +msgid "Contact information and social networks" +msgstr "" + +#: ../../Zotlabs/Module/Profiles.php:741 +msgid "My other channels" +msgstr "" + +#: ../../Zotlabs/Module/Profiles.php:761 ../../include/channel.php:979 +msgid "Profile Image" +msgstr "" + +#: ../../Zotlabs/Module/Profiles.php:771 ../../include/channel.php:961 +#: ../../include/nav.php:91 +msgid "Edit Profiles" +msgstr "" + +#: ../../Zotlabs/Module/Oexchange.php:27 +msgid "Unable to find your hub." +msgstr "" + +#: ../../Zotlabs/Module/Oexchange.php:41 +msgid "Post successful." +msgstr "" + +#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59 +msgid "This setting requires special processing and editing has been blocked." msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:65 -msgid "Site Administrators" +#: ../../Zotlabs/Module/Pconfig.php:48 +msgid "Configuration Editor" +msgstr "" + +#: ../../Zotlabs/Module/Pconfig.php:49 +msgid "" +"Warning: Changing some settings could render your channel inoperable. Please " +"leave this page unless you are comfortable with and knowledgeable about how " +"to correctly use this feature." msgstr "" -#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2311 +#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2267 msgid "Blocks" msgstr "" @@ -4887,19 +4919,13 @@ msgstr "" msgid "Block Title" msgstr "" -#: ../../Zotlabs/Module/Blocks.php:166 ../../Zotlabs/Module/Layouts.php:197 -#: ../../Zotlabs/Module/Events.php:685 ../../Zotlabs/Module/Pubsites.php:59 -#: ../../Zotlabs/Module/Webpages.php:246 ../../include/page_widgets.php:42 -msgid "View" -msgstr "" - -#: ../../Zotlabs/Module/Layouts.php:183 ../../include/text.php:2313 +#: ../../Zotlabs/Module/Layouts.php:183 ../../include/text.php:2269 msgid "Layouts" msgstr "" #: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Lib/Apps.php:225 -#: ../../include/help.php:53 ../../include/help.php:58 -#: ../../include/nav.php:164 +#: ../../include/nav.php:162 ../../include/help.php:53 +#: ../../include/help.php:58 msgid "Help" msgstr "" @@ -4915,11 +4941,6 @@ msgstr "" msgid "Download PDL file" msgstr "" -#: ../../Zotlabs/Module/Rate.php:155 ../../Zotlabs/Module/Connedit.php:763 -#: ../../include/js_strings.php:20 -msgid "Rating" -msgstr "" - #: ../../Zotlabs/Module/Rate.php:156 msgid "Website:" msgstr "" @@ -4937,216 +4958,228 @@ msgstr "" msgid "Optionally explain your rating (this information is public)" msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:186 -#: ../../extend/addon/addon/openclipatar/openclipatar.php:293 -msgid "" -"Shift-reload the page or clear browser cache if the new photo does not " -"display immediately." -msgstr "" - -#: ../../Zotlabs/Module/Profile_photo.php:409 -msgid "Use Photo for Profile" +#: ../../Zotlabs/Module/Like.php:19 +msgid "Like/Dislike" msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:409 -msgid "Upload Profile Photo" +#: ../../Zotlabs/Module/Like.php:24 +msgid "This action is restricted to members." msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:410 -#: ../../extend/addon/addon/openclipatar/openclipatar.php:181 -#: ../../extend/addon/addon/openclipatar/openclipatar.php:193 -msgid "Use" +#: ../../Zotlabs/Module/Like.php:25 +msgid "" +"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a href=" +"\"register\">register as a new $Projectname member</a> to continue." msgstr "" -#: ../../Zotlabs/Module/Common.php:14 -msgid "No channel." +#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131 +#: ../../Zotlabs/Module/Like.php:169 +msgid "Invalid request." msgstr "" -#: ../../Zotlabs/Module/Common.php:43 -msgid "Common connections" +#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:126 +msgid "channel" msgstr "" -#: ../../Zotlabs/Module/Common.php:48 -msgid "No connections in common." +#: ../../Zotlabs/Module/Like.php:146 +msgid "thing" msgstr "" -#: ../../Zotlabs/Module/Events.php:25 -msgid "Calendar entries imported." +#: ../../Zotlabs/Module/Like.php:192 +msgid "Channel unavailable." msgstr "" -#: ../../Zotlabs/Module/Events.php:27 -msgid "No calendar entries found." +#: ../../Zotlabs/Module/Like.php:240 +msgid "Previous action reversed." msgstr "" -#: ../../Zotlabs/Module/Events.php:106 -msgid "Event can not end before it has started." +#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87 +#: ../../Zotlabs/Module/Tagger.php:47 +#: ../../extend/addon/addon/diaspora/inbound.php:1792 +#: ../../extend/addon/addon/redphotos/redphotohelper.php:74 +#: ../../include/text.php:1940 ../../include/conversation.php:120 +msgid "photo" msgstr "" -#: ../../Zotlabs/Module/Events.php:108 ../../Zotlabs/Module/Events.php:117 -#: ../../Zotlabs/Module/Events.php:139 -msgid "Unable to generate preview." +#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87 +#: ../../extend/addon/addon/diaspora/inbound.php:1792 +#: ../../include/text.php:1946 ../../include/conversation.php:148 +msgid "status" msgstr "" -#: ../../Zotlabs/Module/Events.php:115 -msgid "Event title and start time are required." +#: ../../Zotlabs/Module/Like.php:372 ../../Zotlabs/Module/Tagger.php:51 +#: ../../Zotlabs/Module/Events.php:256 ../../include/text.php:1943 +#: ../../include/event.php:961 ../../include/conversation.php:123 +msgid "event" msgstr "" -#: ../../Zotlabs/Module/Events.php:137 ../../Zotlabs/Module/Events.php:261 -msgid "Event not found." +#: ../../Zotlabs/Module/Like.php:419 +#: ../../extend/addon/addon/diaspora/inbound.php:1821 +#: ../../include/conversation.php:164 +#, php-format +msgid "%1$s likes %2$s's %3$s" msgstr "" -#: ../../Zotlabs/Module/Events.php:453 -msgid "Edit event title" +#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:167 +#, php-format +msgid "%1$s doesn't like %2$s's %3$s" msgstr "" -#: ../../Zotlabs/Module/Events.php:453 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:831 -msgid "Event title" +#: ../../Zotlabs/Module/Like.php:423 +#, php-format +msgid "%1$s agrees with %2$s's %3$s" msgstr "" -#: ../../Zotlabs/Module/Events.php:455 -msgid "Categories (comma-separated list)" +#: ../../Zotlabs/Module/Like.php:425 +#, php-format +msgid "%1$s doesn't agree with %2$s's %3$s" msgstr "" -#: ../../Zotlabs/Module/Events.php:456 -msgid "Edit Category" +#: ../../Zotlabs/Module/Like.php:427 +#, php-format +msgid "%1$s abstains from a decision on %2$s's %3$s" msgstr "" -#: ../../Zotlabs/Module/Events.php:456 -msgid "Category" +#: ../../Zotlabs/Module/Like.php:429 +#, php-format +msgid "%1$s is attending %2$s's %3$s" msgstr "" -#: ../../Zotlabs/Module/Events.php:459 -msgid "Edit start date and time" +#: ../../Zotlabs/Module/Like.php:431 +#, php-format +msgid "%1$s is not attending %2$s's %3$s" msgstr "" -#: ../../Zotlabs/Module/Events.php:459 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:832 -msgid "Start date and time" +#: ../../Zotlabs/Module/Like.php:433 +#, php-format +msgid "%1$s may attend %2$s's %3$s" msgstr "" -#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:463 -msgid "Finish date and time are not known or not relevant" +#: ../../Zotlabs/Module/Like.php:538 +msgid "Action completed." msgstr "" -#: ../../Zotlabs/Module/Events.php:462 -msgid "Edit finish date and time" +#: ../../Zotlabs/Module/Like.php:539 +msgid "Thank you." msgstr "" -#: ../../Zotlabs/Module/Events.php:462 -msgid "Finish date and time" +#: ../../Zotlabs/Module/Profile_photo.php:186 +#: ../../extend/addon/addon/openclipatar/openclipatar.php:293 +msgid "" +"Shift-reload the page or clear browser cache if the new photo does not " +"display immediately." msgstr "" -#: ../../Zotlabs/Module/Events.php:464 ../../Zotlabs/Module/Events.php:465 -msgid "Adjust for viewer timezone" +#: ../../Zotlabs/Module/Profile_photo.php:409 +msgid "Use Photo for Profile" msgstr "" -#: ../../Zotlabs/Module/Events.php:464 -msgid "" -"Important for events that happen in a particular place. Not practical for " -"global holidays." +#: ../../Zotlabs/Module/Profile_photo.php:409 +msgid "Upload Profile Photo" msgstr "" -#: ../../Zotlabs/Module/Events.php:466 -msgid "Edit Description" +#: ../../Zotlabs/Module/Profile_photo.php:410 +#: ../../extend/addon/addon/openclipatar/openclipatar.php:181 +#: ../../extend/addon/addon/openclipatar/openclipatar.php:193 +msgid "Use" msgstr "" -#: ../../Zotlabs/Module/Events.php:468 -msgid "Edit Location" +#: ../../Zotlabs/Module/Search.php:223 +#, php-format +msgid "Items tagged with: %s" msgstr "" -#: ../../Zotlabs/Module/Events.php:472 ../../include/conversation.php:1280 -msgid "Permission settings" +#: ../../Zotlabs/Module/Search.php:225 +#, php-format +msgid "Search results for: %s" msgstr "" -#: ../../Zotlabs/Module/Events.php:485 -msgid "Advanced Options" +#: ../../Zotlabs/Module/Common.php:14 +msgid "No channel." msgstr "" -#: ../../Zotlabs/Module/Events.php:596 ../../Zotlabs/Module/Cal.php:259 -msgid "l, F j" +#: ../../Zotlabs/Module/Common.php:43 +msgid "Common connections" msgstr "" -#: ../../Zotlabs/Module/Events.php:624 -msgid "Edit event" +#: ../../Zotlabs/Module/Common.php:48 +msgid "No connections in common." msgstr "" -#: ../../Zotlabs/Module/Events.php:626 -msgid "Delete event" +#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93 +msgid "Authorize application connection" msgstr "" -#: ../../Zotlabs/Module/Events.php:651 ../../Zotlabs/Module/Cal.php:308 -#: ../../include/text.php:1792 -msgid "Link to Source" +#: ../../Zotlabs/Module/Api.php:73 +msgid "Return to your app and insert this Security Code:" msgstr "" -#: ../../Zotlabs/Module/Events.php:660 -msgid "calendar" +#: ../../Zotlabs/Module/Api.php:83 +msgid "Please login to continue." msgstr "" -#: ../../Zotlabs/Module/Events.php:679 ../../Zotlabs/Module/Cal.php:331 -msgid "Edit Event" +#: ../../Zotlabs/Module/Api.php:95 +msgid "" +"Do you want to authorize this application to access your posts and contacts, " +"and/or create new posts for you?" msgstr "" -#: ../../Zotlabs/Module/Events.php:679 ../../Zotlabs/Module/Cal.php:331 -msgid "Create Event" +#: ../../Zotlabs/Module/Ping.php:254 +msgid "sent you a private message" msgstr "" -#: ../../Zotlabs/Module/Events.php:682 ../../Zotlabs/Module/Cal.php:334 -msgid "Export" +#: ../../Zotlabs/Module/Ping.php:302 +msgid "added your channel" msgstr "" -#: ../../Zotlabs/Module/Events.php:686 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:845 -msgid "Month" +#: ../../Zotlabs/Module/Ping.php:312 +msgid "g A l F d" msgstr "" -#: ../../Zotlabs/Module/Events.php:687 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:846 -msgid "Week" +#: ../../Zotlabs/Module/Ping.php:330 +msgid "[today]" msgstr "" -#: ../../Zotlabs/Module/Events.php:688 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:847 -msgid "Day" +#: ../../Zotlabs/Module/Ping.php:339 +msgid "posted an event" msgstr "" -#: ../../Zotlabs/Module/Events.php:691 ../../Zotlabs/Module/Cal.php:341 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:844 -msgid "Today" +#: ../../Zotlabs/Module/Siteinfo.php:20 +msgid "About this site" msgstr "" -#: ../../Zotlabs/Module/Events.php:722 -msgid "Event removed" +#: ../../Zotlabs/Module/Siteinfo.php:21 +msgid "Site Name" msgstr "" -#: ../../Zotlabs/Module/Events.php:725 -msgid "Failed to remove event" +#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:1962 +msgid "Administrator" msgstr "" -#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:222 -#: ../../include/nav.php:95 ../../include/conversation.php:1693 -msgid "Photos" +#: ../../Zotlabs/Module/Siteinfo.php:28 +msgid "Software and Project information" msgstr "" -#: ../../Zotlabs/Module/Ping.php:254 -msgid "sent you a private message" +#: ../../Zotlabs/Module/Siteinfo.php:29 +msgid "This site is powered by $Projectname" msgstr "" -#: ../../Zotlabs/Module/Ping.php:302 -msgid "added your channel" +#: ../../Zotlabs/Module/Siteinfo.php:30 +msgid "" +"Federated and decentralised networking and identity services provided by Zot" msgstr "" -#: ../../Zotlabs/Module/Ping.php:312 -msgid "g A l F d" +#: ../../Zotlabs/Module/Siteinfo.php:32 +#, php-format +msgid "Version %s" msgstr "" -#: ../../Zotlabs/Module/Ping.php:330 -msgid "[today]" +#: ../../Zotlabs/Module/Siteinfo.php:33 +msgid "Project homepage" msgstr "" -#: ../../Zotlabs/Module/Ping.php:339 -msgid "posted an event" +#: ../../Zotlabs/Module/Siteinfo.php:34 +msgid "Developer homepage" msgstr "" #: ../../Zotlabs/Module/Lostpass.php:19 @@ -5173,7 +5206,7 @@ msgid "" "Password reset failed." msgstr "" -#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1723 +#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1727 msgid "Password Reset" msgstr "" @@ -5238,6 +5271,10 @@ msgstr "" msgid "Or enter new bookmark folder name" msgstr "" +#: ../../Zotlabs/Module/Dirsearch.php:33 +msgid "This directory server requires an access token" +msgstr "" + #: ../../Zotlabs/Module/Rmagic.php:35 msgid "Authentication failed." msgstr "" @@ -5388,330 +5425,114 @@ msgid "" "or restore these in date order (oldest first)." msgstr "" -#: ../../Zotlabs/Module/Pubsites.php:24 ../../include/widgets.php:1391 -msgid "Public Hubs" -msgstr "" - -#: ../../Zotlabs/Module/Pubsites.php:27 -msgid "" -"The listed hubs allow public registration for the $Projectname network. All " -"hubs in the network are interlinked so membership on any of them conveys " -"membership in the network as a whole. Some hubs may require subscription or " -"provide tiered service plans. The hub itself <strong>may</strong> provide " -"additional details." -msgstr "" - -#: ../../Zotlabs/Module/Pubsites.php:33 -msgid "Hub URL" -msgstr "" - -#: ../../Zotlabs/Module/Pubsites.php:33 -msgid "Access Type" -msgstr "" - -#: ../../Zotlabs/Module/Pubsites.php:33 -msgid "Registration Policy" -msgstr "" - -#: ../../Zotlabs/Module/Pubsites.php:33 -msgid "Stats" -msgstr "" - -#: ../../Zotlabs/Module/Pubsites.php:33 -msgid "Software" -msgstr "" - -#: ../../Zotlabs/Module/Pubsites.php:48 -msgid "Rate" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:80 -msgid "Could not access contact record." -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:104 -msgid "Could not locate selected profile." -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:256 -msgid "Connection updated." -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:258 -msgid "Failed to update connection record." -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:308 -msgid "is now connected to" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:440 -msgid "Could not access address book record." -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:460 -msgid "Refresh failed - channel is currently unavailable." -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:475 ../../Zotlabs/Module/Connedit.php:484 -#: ../../Zotlabs/Module/Connedit.php:493 ../../Zotlabs/Module/Connedit.php:502 -#: ../../Zotlabs/Module/Connedit.php:515 -msgid "Unable to set address book parameters." -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:539 -msgid "Connection has been removed." -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:555 ../../Zotlabs/Lib/Apps.php:221 -#: ../../extend/addon/addon/openclipatar/openclipatar.php:56 -#: ../../include/nav.php:89 ../../include/conversation.php:969 -msgid "View Profile" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:558 -#, php-format -msgid "View %s's profile" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:562 -msgid "Refresh Permissions" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:565 -msgid "Fetch updated permissions" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:569 -msgid "Recent Activity" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:572 -msgid "View recent posts and comments" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:579 -msgid "Block (or Unblock) all communications with this connection" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:580 -msgid "This connection is blocked!" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:584 -msgid "Unignore" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:587 -msgid "Ignore (or Unignore) all inbound communications from this connection" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:588 -msgid "This connection is ignored!" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:592 -msgid "Unarchive" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:592 -msgid "Archive" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:595 -msgid "" -"Archive (or Unarchive) this connection - mark channel dead but keep content" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:596 -msgid "This connection is archived!" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:600 -msgid "Unhide" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:600 -msgid "Hide" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:603 -msgid "Hide or Unhide this connection from your other connections" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:604 -msgid "This connection is hidden!" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:611 -msgid "Delete this connection" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:626 ../../include/widgets.php:529 -msgid "Me" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:627 ../../include/widgets.php:530 -msgid "Family" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:628 -#: ../../Zotlabs/Module/Settings/Channel.php:61 -#: ../../Zotlabs/Module/Settings/Channel.php:65 -#: ../../Zotlabs/Module/Settings/Channel.php:66 -#: ../../Zotlabs/Module/Settings/Channel.php:69 -#: ../../Zotlabs/Module/Settings/Channel.php:80 ../../include/channel.php:402 -#: ../../include/channel.php:403 ../../include/channel.php:410 -#: ../../include/selectors.php:123 ../../include/widgets.php:531 -msgid "Friends" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:629 ../../include/widgets.php:532 -msgid "Acquaintances" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:687 -msgid "Approve this connection" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:687 -msgid "Accept connection to allow communication" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:692 -msgid "Set Affinity" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:695 -msgid "Set Profile" -msgstr "" - -#: ../../Zotlabs/Module/Connedit.php:698 -msgid "Set Affinity & Profile" +#: ../../Zotlabs/Module/Cal.php:69 +msgid "Permissions denied." msgstr "" -#: ../../Zotlabs/Module/Connedit.php:747 -msgid "none" +#: ../../Zotlabs/Module/Cal.php:263 ../../Zotlabs/Module/Events.php:596 +msgid "l, F j" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:751 ../../include/widgets.php:656 -msgid "Connection Default Permissions" +#: ../../Zotlabs/Module/Cal.php:312 ../../Zotlabs/Module/Events.php:651 +#: ../../include/text.php:1748 +msgid "Link to Source" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:751 ../../include/items.php:3977 -#, php-format -msgid "Connection: %s" +#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:679 +msgid "Edit Event" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:752 -msgid "Apply these permissions automatically" +#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:679 +msgid "Create Event" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:752 -msgid "Connection requests will be approved without your interaction" +#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Events.php:682 +msgid "Export" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:754 -msgid "This connection's primary address is" +#: ../../Zotlabs/Module/Cal.php:341 ../../include/text.php:2291 +msgid "Import" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:755 -msgid "Available locations:" +#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Events.php:691 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:848 +msgid "Today" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:759 -msgid "" -"The permissions indicated on this page will be applied to all new " -"connections." +#: ../../Zotlabs/Module/Admin.php:94 +msgid "# Accounts" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:760 -msgid "Connection Tools" +#: ../../Zotlabs/Module/Admin.php:95 +msgid "# blocked accounts" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:762 -msgid "Slide to adjust your degree of friendship" +#: ../../Zotlabs/Module/Admin.php:96 +msgid "# expired accounts" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:764 -msgid "Slide to adjust your rating" +#: ../../Zotlabs/Module/Admin.php:97 +msgid "# expiring accounts" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:765 ../../Zotlabs/Module/Connedit.php:770 -msgid "Optionally explain your rating" +#: ../../Zotlabs/Module/Admin.php:108 +msgid "# Channels" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:767 -msgid "Custom Filter" +#: ../../Zotlabs/Module/Admin.php:109 +msgid "# primary" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:768 -msgid "Only import posts with this text" +#: ../../Zotlabs/Module/Admin.php:110 +msgid "# clones" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:768 ../../Zotlabs/Module/Connedit.php:769 -msgid "" -"words one per line or #tags or /patterns/ or lang=xx, leave blank to import " -"all posts" +#: ../../Zotlabs/Module/Admin.php:116 +msgid "Message queues" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:769 -msgid "Do not import posts with this text" +#: ../../Zotlabs/Module/Admin.php:133 +msgid "Your software should be updated" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:771 -msgid "This information is public!" +#: ../../Zotlabs/Module/Admin.php:138 +msgid "Summary" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:776 -msgid "Connection Pending Approval" +#: ../../Zotlabs/Module/Admin.php:141 +msgid "Registered accounts" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:779 -#: ../../Zotlabs/Module/Settings/Tokens.php:163 -msgid "inherited" +#: ../../Zotlabs/Module/Admin.php:142 +msgid "Pending registrations" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:781 -#, php-format -msgid "" -"Please choose the profile you would like to display to %s when viewing your " -"profile securely." +#: ../../Zotlabs/Module/Admin.php:143 +msgid "Registered channels" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:783 -#: ../../Zotlabs/Module/Settings/Tokens.php:160 -msgid "Their Settings" +#: ../../Zotlabs/Module/Admin.php:144 +msgid "Active plugins" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:784 -#: ../../Zotlabs/Module/Settings/Tokens.php:161 -msgid "My Settings" +#: ../../Zotlabs/Module/Admin.php:145 +msgid "Version" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:786 -#: ../../Zotlabs/Module/Settings/Tokens.php:165 -msgid "Individual Permissions" +#: ../../Zotlabs/Module/Admin.php:146 +msgid "Repository version (master)" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:787 -#: ../../Zotlabs/Module/Settings/Tokens.php:166 -msgid "" -"Some permissions may be inherited from your channel's <a href=\"settings" -"\"><strong>privacy settings</strong></a>, which have higher priority than " -"individual settings. You can <strong>not</strong> change those settings here." +#: ../../Zotlabs/Module/Admin.php:147 +msgid "Repository version (dev)" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:788 -msgid "" -"Some permissions may be inherited from your channel's <a href=\"settings" -"\"><strong>privacy settings</strong></a>, which have higher priority than " -"individual settings. You can change those settings here but they wont have " -"any impact unless the inherited setting changes." +#: ../../Zotlabs/Module/Lockview.php:75 +msgid "Remote privacy information not available." msgstr "" -#: ../../Zotlabs/Module/Connedit.php:789 -msgid "Last update:" +#: ../../Zotlabs/Module/Lockview.php:96 +msgid "Visible to:" msgstr "" #: ../../Zotlabs/Module/Service_limits.php:23 @@ -5735,7 +5556,7 @@ msgid "Export selected" msgstr "" #: ../../Zotlabs/Module/Webpages.php:237 ../../Zotlabs/Lib/Apps.php:218 -#: ../../include/nav.php:109 ../../include/conversation.php:1746 +#: ../../include/nav.php:109 ../../include/conversation.php:1745 msgid "Webpages" msgstr "" @@ -5820,79 +5641,128 @@ msgstr "" msgid "Not found" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:126 ../../Zotlabs/Lib/Apps.php:219 -#: ../../include/features.php:99 ../../include/nav.php:111 -#: ../../include/conversation.php:1756 ../../include/conversation.php:1759 -msgid "Wiki" +#: ../../Zotlabs/Module/Wiki.php:55 +msgid "Invalid channel" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:127 -msgid "Sandbox" +#: ../../Zotlabs/Module/Wiki.php:100 +msgid "Error retrieving wiki" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:129 -msgid "" -"\"# Wiki Sandbox\\n\\nContent you **edit** and **preview** here *will not be " -"saved*.\"" +#: ../../Zotlabs/Module/Wiki.php:107 +msgid "Error creating zip file export folder" +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:125 +msgid "Error downloading wiki: " +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:139 ../../include/nav.php:111 +#: ../../include/conversation.php:1755 +msgid "Wikis" +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:145 ../../include/widgets.php:966 +msgid "Download" +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:149 ../../include/widgets.php:970 +msgid "Wiki name" +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:150 +msgid "Content type" +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:158 +msgid "Create a status post for this wiki" +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:177 +msgid "Wiki not found" +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:202 +msgid "Rename page" +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:206 +msgid "Error retrieving page content" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:198 +#: ../../Zotlabs/Module/Wiki.php:239 msgid "Revision Comparison" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:199 +#: ../../Zotlabs/Module/Wiki.php:240 msgid "Revert" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:230 -msgid "Enter the name of your new wiki:" +#: ../../Zotlabs/Module/Wiki.php:249 +msgid "Choose an available wiki from the list on the left." msgstr "" -#: ../../Zotlabs/Module/Wiki.php:231 -msgid "Enter the name of the new page:" +#: ../../Zotlabs/Module/Wiki.php:251 +msgid "Source" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:232 -msgid "Enter the new name:" +#: ../../Zotlabs/Module/Wiki.php:268 +msgid "New page name" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:238 ../../include/conversation.php:1169 +#: ../../Zotlabs/Module/Wiki.php:274 ../../include/conversation.php:1169 msgid "Embed image from photo albums" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:239 ../../include/conversation.php:1263 +#: ../../Zotlabs/Module/Wiki.php:275 ../../include/conversation.php:1263 msgid "Embed an image from your albums" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:241 ../../include/conversation.php:1265 +#: ../../Zotlabs/Module/Wiki.php:277 ../../include/conversation.php:1265 #: ../../include/conversation.php:1312 msgid "OK" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:242 ../../include/conversation.php:1205 +#: ../../Zotlabs/Module/Wiki.php:278 ../../include/conversation.php:1205 msgid "Choose images to embed" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:243 ../../include/conversation.php:1206 +#: ../../Zotlabs/Module/Wiki.php:279 ../../include/conversation.php:1206 msgid "Choose an album" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:244 ../../include/conversation.php:1207 +#: ../../Zotlabs/Module/Wiki.php:280 ../../include/conversation.php:1207 msgid "Choose a different album..." msgstr "" -#: ../../Zotlabs/Module/Wiki.php:245 ../../include/conversation.php:1208 +#: ../../Zotlabs/Module/Wiki.php:281 ../../include/conversation.php:1208 msgid "Error getting album list" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:246 ../../include/conversation.php:1209 +#: ../../Zotlabs/Module/Wiki.php:282 ../../include/conversation.php:1209 msgid "Error getting photo link" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:247 ../../include/conversation.php:1210 +#: ../../Zotlabs/Module/Wiki.php:283 ../../include/conversation.php:1210 msgid "Error getting album" msgstr "" +#: ../../Zotlabs/Module/Wiki.php:347 +msgid "Error creating wiki. Invalid name." +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:358 +msgid "Wiki created, but error creating Home page." +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:363 +msgid "Error creating wiki" +msgstr "" + +#: ../../Zotlabs/Module/Wiki.php:409 +msgid "New page created" +msgstr "" + #: ../../Zotlabs/Module/Sources.php:37 msgid "Failed to create source. No channel selected." msgstr "" @@ -5995,7 +5865,7 @@ msgstr "" msgid "post" msgstr "" -#: ../../Zotlabs/Module/Tagger.php:57 ../../include/text.php:1992 +#: ../../Zotlabs/Module/Tagger.php:57 ../../include/text.php:1948 #: ../../include/conversation.php:150 msgid "comment" msgstr "" @@ -6562,14 +6432,6 @@ msgstr "" msgid "Start calendar week on monday" msgstr "" -#: ../../Zotlabs/Module/Settings/Featured.php:24 -msgid "No feature settings configured" -msgstr "" - -#: ../../Zotlabs/Module/Settings/Featured.php:31 -msgid "Feature/Addon Settings" -msgstr "" - #: ../../Zotlabs/Module/Settings/Display.php:137 msgid "No special theme for mobile devices" msgstr "" @@ -6683,6 +6545,14 @@ msgstr "" msgid "Grid page max height of content (in pixels)" msgstr "" +#: ../../Zotlabs/Module/Settings/Featured.php:24 +msgid "No feature settings configured" +msgstr "" + +#: ../../Zotlabs/Module/Settings/Featured.php:31 +msgid "Feature/Addon Settings" +msgstr "" + #: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98 msgid "Tag removed" msgstr "" @@ -6752,12 +6622,76 @@ msgstr "" msgid "Add Thing to your Profile" msgstr "" -#: ../../Zotlabs/Module/Cal.php:69 -msgid "Permissions denied." +#: ../../Zotlabs/Module/Import.php:33 +#, php-format +msgid "Your service plan only allows %d channels." msgstr "" -#: ../../Zotlabs/Module/Cal.php:337 ../../include/text.php:2335 -msgid "Import" +#: ../../Zotlabs/Module/Import.php:157 ../../include/import.php:100 +msgid "Cloned channel not found. Import failed." +msgstr "" + +#: ../../Zotlabs/Module/Import.php:167 +msgid "No channel. Import failed." +msgstr "" + +#: ../../Zotlabs/Module/Import.php:503 +#: ../../include/Import/import_diaspora.php:142 +msgid "Import completed." +msgstr "" + +#: ../../Zotlabs/Module/Import.php:525 +msgid "You must be logged in to use this feature." +msgstr "" + +#: ../../Zotlabs/Module/Import.php:530 +msgid "Import Channel" +msgstr "" + +#: ../../Zotlabs/Module/Import.php:531 +msgid "" +"Use this form to import an existing channel from a different server/hub. You " +"may retrieve the channel identity from the old server/hub via the network or " +"provide an export file." +msgstr "" + +#: ../../Zotlabs/Module/Import.php:533 +msgid "Or provide the old server/hub details" +msgstr "" + +#: ../../Zotlabs/Module/Import.php:534 +msgid "Your old identity address (xyz@example.com)" +msgstr "" + +#: ../../Zotlabs/Module/Import.php:535 +msgid "Your old login email address" +msgstr "" + +#: ../../Zotlabs/Module/Import.php:536 +msgid "Your old login password" +msgstr "" + +#: ../../Zotlabs/Module/Import.php:537 +msgid "" +"For either option, please choose whether to make this hub your new primary " +"address, or whether your old location should continue this role. You will be " +"able to post from either location, but only one can be marked as the primary " +"location for files, photos, and media." +msgstr "" + +#: ../../Zotlabs/Module/Import.php:538 +msgid "Make this hub my primary location" +msgstr "" + +#: ../../Zotlabs/Module/Import.php:539 +msgid "" +"Import existing posts if possible (experimental - limited by available memory" +msgstr "" + +#: ../../Zotlabs/Module/Import.php:540 +msgid "" +"This process may take several minutes to complete. Please submit the form " +"only once and leave this page open until finished." msgstr "" #: ../../Zotlabs/Module/Viewconnections.php:65 @@ -6838,20 +6772,132 @@ msgstr "" msgid "Lookup xchan beginning with (or webbie): " msgstr "" -#: ../../Zotlabs/Module/Match.php:26 -msgid "Profile Match" +#: ../../Zotlabs/Module/Events.php:25 +msgid "Calendar entries imported." msgstr "" -#: ../../Zotlabs/Module/Match.php:35 -msgid "No keywords to match. Please add keywords to your default profile." +#: ../../Zotlabs/Module/Events.php:27 +msgid "No calendar entries found." msgstr "" -#: ../../Zotlabs/Module/Match.php:67 -msgid "is interested in:" +#: ../../Zotlabs/Module/Events.php:106 +msgid "Event can not end before it has started." msgstr "" -#: ../../Zotlabs/Module/Match.php:74 -msgid "No matches" +#: ../../Zotlabs/Module/Events.php:108 ../../Zotlabs/Module/Events.php:117 +#: ../../Zotlabs/Module/Events.php:139 +msgid "Unable to generate preview." +msgstr "" + +#: ../../Zotlabs/Module/Events.php:115 +msgid "Event title and start time are required." +msgstr "" + +#: ../../Zotlabs/Module/Events.php:137 ../../Zotlabs/Module/Events.php:261 +msgid "Event not found." +msgstr "" + +#: ../../Zotlabs/Module/Events.php:453 +msgid "Edit event title" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:453 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:835 +msgid "Event title" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:455 +msgid "Categories (comma-separated list)" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:456 +msgid "Edit Category" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:456 +msgid "Category" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:459 +msgid "Edit start date and time" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:459 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836 +msgid "Start date and time" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:463 +msgid "Finish date and time are not known or not relevant" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:462 +msgid "Edit finish date and time" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:462 +msgid "Finish date and time" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:464 ../../Zotlabs/Module/Events.php:465 +msgid "Adjust for viewer timezone" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:464 +msgid "" +"Important for events that happen in a particular place. Not practical for " +"global holidays." +msgstr "" + +#: ../../Zotlabs/Module/Events.php:466 +msgid "Edit Description" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:468 +msgid "Edit Location" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:472 ../../include/conversation.php:1280 +msgid "Permission settings" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:485 +msgid "Advanced Options" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:624 +msgid "Edit event" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:626 +msgid "Delete event" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:660 +msgid "calendar" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:686 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:849 +msgid "Month" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:687 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:850 +msgid "Week" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:688 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:851 +msgid "Day" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:722 +msgid "Event removed" +msgstr "" + +#: ../../Zotlabs/Module/Events.php:725 +msgid "Failed to remove event" msgstr "" #: ../../Zotlabs/Lib/Chatroom.php:27 @@ -6879,7 +6925,8 @@ msgid "Site Admin" msgstr "" #: ../../Zotlabs/Lib/Apps.php:206 -msgid "Bug Report" +#: ../../extend/addon/addon/buglink/buglink.php:16 +msgid "Report Bug" msgstr "" #: ../../Zotlabs/Lib/Apps.php:207 @@ -6903,28 +6950,33 @@ msgid "Suggest Channels" msgstr "" #: ../../Zotlabs/Lib/Apps.php:213 ../../include/nav.php:115 -#: ../../boot.php:1715 +#: ../../boot.php:1719 msgid "Login" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:215 ../../include/nav.php:184 +#: ../../Zotlabs/Lib/Apps.php:215 ../../include/nav.php:182 msgid "Grid" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:220 ../../include/nav.php:187 +#: ../../Zotlabs/Lib/Apps.php:219 ../../include/features.php:99 +#: ../../include/conversation.php:1758 +msgid "Wiki" +msgstr "" + +#: ../../Zotlabs/Lib/Apps.php:220 ../../include/nav.php:185 msgid "Channel Home" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:223 ../../include/nav.php:206 -#: ../../include/conversation.php:1710 ../../include/conversation.php:1713 +#: ../../Zotlabs/Lib/Apps.php:223 ../../include/nav.php:204 +#: ../../include/conversation.php:1709 ../../include/conversation.php:1712 msgid "Events" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:224 ../../include/nav.php:172 +#: ../../Zotlabs/Lib/Apps.php:224 ../../include/nav.php:170 msgid "Directory" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:226 ../../include/nav.php:198 +#: ../../Zotlabs/Lib/Apps.php:226 ../../include/nav.php:196 msgid "Mail" msgstr "" @@ -6948,7 +7000,7 @@ msgstr "" msgid "Invite" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:235 ../../include/widgets.php:1563 +#: ../../Zotlabs/Lib/Apps.php:235 ../../include/widgets.php:1626 msgid "Features" msgstr "" @@ -6972,6 +7024,69 @@ msgstr "" msgid "Purchase" msgstr "" +#: ../../Zotlabs/Lib/PermissionDescription.php:34 +#: ../../include/acl_selectors.php:128 +msgid "Visible to your default audience" +msgstr "" + +#: ../../Zotlabs/Lib/PermissionDescription.php:107 +#: ../../include/acl_selectors.php:191 +msgid "Only me" +msgstr "" + +#: ../../Zotlabs/Lib/PermissionDescription.php:108 +msgid "Public" +msgstr "" + +#: ../../Zotlabs/Lib/PermissionDescription.php:109 +msgid "Anybody in the $Projectname network" +msgstr "" + +#: ../../Zotlabs/Lib/PermissionDescription.php:110 +#, php-format +msgid "Any account on %s" +msgstr "" + +#: ../../Zotlabs/Lib/PermissionDescription.php:111 +msgid "Any of my connections" +msgstr "" + +#: ../../Zotlabs/Lib/PermissionDescription.php:112 +msgid "Only connections I specifically allow" +msgstr "" + +#: ../../Zotlabs/Lib/PermissionDescription.php:113 +msgid "Anybody authenticated (could include visitors from other networks)" +msgstr "" + +#: ../../Zotlabs/Lib/PermissionDescription.php:114 +msgid "Any connections including those who haven't yet been approved" +msgstr "" + +#: ../../Zotlabs/Lib/PermissionDescription.php:150 +msgid "" +"This is your default setting for the audience of your normal stream, and " +"posts." +msgstr "" + +#: ../../Zotlabs/Lib/PermissionDescription.php:151 +msgid "" +"This is your default setting for who can view your default channel profile" +msgstr "" + +#: ../../Zotlabs/Lib/PermissionDescription.php:152 +msgid "This is your default setting for who can view your connections" +msgstr "" + +#: ../../Zotlabs/Lib/PermissionDescription.php:153 +msgid "" +"This is your default setting for who can view your file storage and photos" +msgstr "" + +#: ../../Zotlabs/Lib/PermissionDescription.php:154 +msgid "This is your default setting for the audience of your webpages" +msgstr "" + #: ../../Zotlabs/Lib/ThreadItem.php:95 ../../include/conversation.php:683 msgid "Private Message" msgstr "" @@ -7185,256 +7300,193 @@ msgstr "" msgid "%s Administrator" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:112 +#: ../../Zotlabs/Lib/Enotify.php:116 #, php-format msgid "%s <!item_type!>" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:116 +#: ../../Zotlabs/Lib/Enotify.php:120 #, php-format msgid "[$Projectname:Notify] New mail received at %s" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:118 +#: ../../Zotlabs/Lib/Enotify.php:122 #, php-format msgid "%1$s, %2$s sent you a new private message at %3$s." msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:119 +#: ../../Zotlabs/Lib/Enotify.php:123 #, php-format msgid "%1$s sent you %2$s." msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:119 +#: ../../Zotlabs/Lib/Enotify.php:123 msgid "a private message" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:120 +#: ../../Zotlabs/Lib/Enotify.php:124 #, php-format msgid "Please visit %s to view and/or reply to your private messages." msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:179 +#: ../../Zotlabs/Lib/Enotify.php:183 #, php-format msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:187 +#: ../../Zotlabs/Lib/Enotify.php:191 #, php-format msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:196 +#: ../../Zotlabs/Lib/Enotify.php:200 #, php-format msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:207 +#: ../../Zotlabs/Lib/Enotify.php:211 #, php-format msgid "[$Projectname:Notify] Comment to conversation #%1$d by %2$s" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:208 +#: ../../Zotlabs/Lib/Enotify.php:212 #, php-format msgid "%1$s, %2$s commented on an item/conversation you have been following." msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:211 ../../Zotlabs/Lib/Enotify.php:226 -#: ../../Zotlabs/Lib/Enotify.php:252 ../../Zotlabs/Lib/Enotify.php:270 -#: ../../Zotlabs/Lib/Enotify.php:284 +#: ../../Zotlabs/Lib/Enotify.php:215 ../../Zotlabs/Lib/Enotify.php:230 +#: ../../Zotlabs/Lib/Enotify.php:256 ../../Zotlabs/Lib/Enotify.php:274 +#: ../../Zotlabs/Lib/Enotify.php:288 #, php-format msgid "Please visit %s to view and/or reply to the conversation." msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:217 +#: ../../Zotlabs/Lib/Enotify.php:221 #, php-format msgid "[$Projectname:Notify] %s posted to your profile wall" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:219 +#: ../../Zotlabs/Lib/Enotify.php:223 #, php-format msgid "%1$s, %2$s posted to your profile wall at %3$s" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:221 +#: ../../Zotlabs/Lib/Enotify.php:225 #, php-format msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:245 +#: ../../Zotlabs/Lib/Enotify.php:249 #, php-format msgid "[$Projectname:Notify] %s tagged you" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:246 +#: ../../Zotlabs/Lib/Enotify.php:250 #, php-format msgid "%1$s, %2$s tagged you at %3$s" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:247 +#: ../../Zotlabs/Lib/Enotify.php:251 #, php-format msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]." msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:259 +#: ../../Zotlabs/Lib/Enotify.php:263 #, php-format msgid "[$Projectname:Notify] %1$s poked you" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:260 +#: ../../Zotlabs/Lib/Enotify.php:264 #, php-format msgid "%1$s, %2$s poked you at %3$s" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:261 +#: ../../Zotlabs/Lib/Enotify.php:265 #, php-format msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]." msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:277 +#: ../../Zotlabs/Lib/Enotify.php:281 #, php-format msgid "[$Projectname:Notify] %s tagged your post" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:278 +#: ../../Zotlabs/Lib/Enotify.php:282 #, php-format msgid "%1$s, %2$s tagged your post at %3$s" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:279 +#: ../../Zotlabs/Lib/Enotify.php:283 #, php-format msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:291 +#: ../../Zotlabs/Lib/Enotify.php:295 msgid "[$Projectname:Notify] Introduction received" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:292 +#: ../../Zotlabs/Lib/Enotify.php:296 #, php-format msgid "%1$s, you've received an new connection request from '%2$s' at %3$s" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:293 +#: ../../Zotlabs/Lib/Enotify.php:297 #, php-format msgid "" "%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s." msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:297 ../../Zotlabs/Lib/Enotify.php:316 +#: ../../Zotlabs/Lib/Enotify.php:301 ../../Zotlabs/Lib/Enotify.php:320 #, php-format msgid "You may visit their profile at %s" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:299 +#: ../../Zotlabs/Lib/Enotify.php:303 #, php-format msgid "Please visit %s to approve or reject the connection request." msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:306 +#: ../../Zotlabs/Lib/Enotify.php:310 msgid "[$Projectname:Notify] Friend suggestion received" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:307 +#: ../../Zotlabs/Lib/Enotify.php:311 #, php-format msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:308 +#: ../../Zotlabs/Lib/Enotify.php:312 #, php-format msgid "" "%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from %4$s." msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:314 +#: ../../Zotlabs/Lib/Enotify.php:318 msgid "Name:" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:315 +#: ../../Zotlabs/Lib/Enotify.php:319 msgid "Photo:" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:318 +#: ../../Zotlabs/Lib/Enotify.php:322 #, php-format msgid "Please visit %s to approve or reject the suggestion." msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:536 +#: ../../Zotlabs/Lib/Enotify.php:540 msgid "[$Projectname:Notify]" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:696 +#: ../../Zotlabs/Lib/Enotify.php:700 msgid "created a new post" msgstr "" -#: ../../Zotlabs/Lib/Enotify.php:697 +#: ../../Zotlabs/Lib/Enotify.php:701 #, php-format msgid "commented on %s's post" msgstr "" -#: ../../Zotlabs/Lib/PermissionDescription.php:34 -#: ../../include/acl_selectors.php:128 -msgid "Visible to your default audience" -msgstr "" - -#: ../../Zotlabs/Lib/PermissionDescription.php:107 -#: ../../include/acl_selectors.php:191 -msgid "Only me" -msgstr "" - -#: ../../Zotlabs/Lib/PermissionDescription.php:108 -msgid "Public" -msgstr "" - -#: ../../Zotlabs/Lib/PermissionDescription.php:109 -msgid "Anybody in the $Projectname network" -msgstr "" - -#: ../../Zotlabs/Lib/PermissionDescription.php:110 -#, php-format -msgid "Any account on %s" -msgstr "" - -#: ../../Zotlabs/Lib/PermissionDescription.php:111 -msgid "Any of my connections" -msgstr "" - -#: ../../Zotlabs/Lib/PermissionDescription.php:112 -msgid "Only connections I specifically allow" -msgstr "" - -#: ../../Zotlabs/Lib/PermissionDescription.php:113 -msgid "Anybody authenticated (could include visitors from other networks)" -msgstr "" - -#: ../../Zotlabs/Lib/PermissionDescription.php:114 -msgid "Any connections including those who haven't yet been approved" -msgstr "" - -#: ../../Zotlabs/Lib/PermissionDescription.php:150 -msgid "" -"This is your default setting for the audience of your normal stream, and " -"posts." -msgstr "" - -#: ../../Zotlabs/Lib/PermissionDescription.php:151 -msgid "" -"This is your default setting for who can view your default channel profile" -msgstr "" - -#: ../../Zotlabs/Lib/PermissionDescription.php:152 -msgid "This is your default setting for who can view your connections" -msgstr "" - -#: ../../Zotlabs/Lib/PermissionDescription.php:153 -msgid "" -"This is your default setting for who can view your file storage and photos" -msgstr "" - -#: ../../Zotlabs/Lib/PermissionDescription.php:154 -msgid "This is your default setting for the audience of your webpages" -msgstr "" - #: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:24 msgid "Flag Adult Photos" msgstr "" @@ -7445,10 +7497,6 @@ msgid "" "view" msgstr "" -#: ../../extend/addon/addon/buglink/buglink.php:16 -msgid "Report Bug" -msgstr "" - #: ../../extend/addon/addon/chords/Mod_Chords.php:44 msgid "" "This is a fairly comprehensive and complete guitar chord dictionary which " @@ -7495,27 +7543,27 @@ msgstr "" msgid "Quick Reference" msgstr "" -#: ../../extend/addon/addon/diaspora/diaspora.php:667 +#: ../../extend/addon/addon/diaspora/diaspora.php:671 msgid "Diaspora Protocol Settings updated." msgstr "" -#: ../../extend/addon/addon/diaspora/diaspora.php:685 +#: ../../extend/addon/addon/diaspora/diaspora.php:692 msgid "Enable the Diaspora protocol for this channel" msgstr "" -#: ../../extend/addon/addon/diaspora/diaspora.php:689 +#: ../../extend/addon/addon/diaspora/diaspora.php:696 msgid "Allow any Diaspora member to comment on your public posts" msgstr "" -#: ../../extend/addon/addon/diaspora/diaspora.php:693 +#: ../../extend/addon/addon/diaspora/diaspora.php:700 msgid "Prevent your hashtags from being redirected to other sites" msgstr "" -#: ../../extend/addon/addon/diaspora/diaspora.php:698 +#: ../../extend/addon/addon/diaspora/diaspora.php:705 msgid "Followed hashtags (comma separated, do not include the #)" msgstr "" -#: ../../extend/addon/addon/diaspora/diaspora.php:703 +#: ../../extend/addon/addon/diaspora/diaspora.php:710 msgid "Diaspora Protocol Settings" msgstr "" @@ -8215,7 +8263,7 @@ msgid "Configuration Help" msgstr "" #: ../../extend/addon/addon/jappixmini/jappixmini.php:368 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1145 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1149 msgid "Add Contact" msgstr "" @@ -9313,23 +9361,23 @@ msgstr "" msgid "Application name" msgstr "" -#: ../../extend/addon/addon/superblock/superblock.php:63 +#: ../../extend/addon/addon/superblock/superblock.php:60 msgid "Comma separated profile URLS to block" msgstr "" -#: ../../extend/addon/addon/superblock/superblock.php:67 +#: ../../extend/addon/addon/superblock/superblock.php:64 msgid "\"Superblock\" Settings" msgstr "" -#: ../../extend/addon/addon/superblock/superblock.php:82 +#: ../../extend/addon/addon/superblock/superblock.php:79 msgid "SUPERBLOCK Settings saved." msgstr "" -#: ../../extend/addon/addon/superblock/superblock.php:248 +#: ../../extend/addon/addon/superblock/superblock.php:283 msgid "Block Completely" msgstr "" -#: ../../extend/addon/addon/superblock/superblock.php:270 +#: ../../extend/addon/addon/superblock/superblock.php:305 msgid "superblock settings updated" msgstr "" @@ -9831,197 +9879,196 @@ msgstr "" msgid "Select an addressbook to import to" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:743 -msgid "INVALID EVENT DISMISSED!" +#: ../../extend/addon/addon/cdav/cdav.php:36 +msgid "Errors encountered creating database table: " +msgstr "" + +#: ../../extend/addon/addon/cdav/cdav.php:194 +msgid "Default Calendar" +msgstr "" + +#: ../../extend/addon/addon/cdav/cdav.php:203 +msgid "Default Addressbook" +msgstr "" + +#: ../../extend/addon/addon/cdav/cdav.php:212 +msgid "CalDAV/CardDAV Settings saved." +msgstr "" + +#: ../../extend/addon/addon/cdav/cdav.php:228 +msgid "Enable CalDAV/CardDAV Server for this channel" +msgstr "" + +#: ../../extend/addon/addon/cdav/cdav.php:231 +#, php-format +msgid "Your CalDAV resources are located at %s " +msgstr "" + +#: ../../extend/addon/addon/cdav/cdav.php:234 +#, php-format +msgid "Your CardDAV resources are located at %s " +msgstr "" + +#: ../../extend/addon/addon/cdav/cdav.php:240 +msgid "CalDAV/CardDAV Settings" +msgstr "" + +#: ../../extend/addon/addon/cdav/cdav.php:264 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1145 +msgid "Mobile" +msgstr "" + +#: ../../extend/addon/addon/cdav/cdav.php:265 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1146 ../../include/nav.php:88 +msgid "Home" +msgstr "" + +#: ../../extend/addon/addon/cdav/cdav.php:266 +msgid "Home, Voice" +msgstr "" + +#: ../../extend/addon/addon/cdav/cdav.php:267 +msgid "Home, Fax" +msgstr "" + +#: ../../extend/addon/addon/cdav/cdav.php:268 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1147 +msgid "Work" +msgstr "" + +#: ../../extend/addon/addon/cdav/cdav.php:269 +msgid "Work, Voice" +msgstr "" + +#: ../../extend/addon/addon/cdav/cdav.php:270 +msgid "Work, Fax" msgstr "" #: ../../extend/addon/addon/cdav/Mod_Cdav.php:744 -msgid "Summary: " +msgid "INVALID EVENT DISMISSED!" msgstr "" #: ../../extend/addon/addon/cdav/Mod_Cdav.php:745 -msgid "Date: " +msgid "Summary: " msgstr "" #: ../../extend/addon/addon/cdav/Mod_Cdav.php:746 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753 +msgid "Date: " +msgstr "" + +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:747 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:754 msgid "Reason: " msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:751 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:752 msgid "INVALID CARD DISMISSED!" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:752 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753 msgid "Name: " msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:769 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:770 msgid "" "You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV " "Settings before you can use it." msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:832 -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:833 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:837 msgid "Example: YYYY-MM-DD HH:mm" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:833 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:837 msgid "End date and time" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:848 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:852 msgid "List month" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:849 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:853 msgid "List week" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:850 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:854 msgid "List day" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:857 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:861 msgid "More" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:858 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:862 msgid "Less" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:859 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:863 msgid "Select calendar" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:861 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:865 msgid "Delete all" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:863 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:867 msgid "Sorry! Editing of recurrent events is not yet implemented." msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1133 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1137 msgid "Organisation" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1134 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1138 #: ../../include/page_widgets.php:46 msgid "Title" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1135 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1139 msgid "Phone" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1137 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1141 msgid "Instant messenger" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1138 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1142 msgid "Website" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1140 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1144 msgid "Note" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1141 -#: ../../extend/addon/addon/cdav/cdav.php:263 -msgid "Mobile" -msgstr "" - -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1142 -#: ../../extend/addon/addon/cdav/cdav.php:264 ../../include/nav.php:88 -#: ../../include/nav.php:149 -msgid "Home" -msgstr "" - -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1143 -#: ../../extend/addon/addon/cdav/cdav.php:267 -msgid "Work" -msgstr "" - -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1146 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1150 msgid "Add Field" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1151 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1155 msgid "P.O. Box" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1152 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1156 msgid "Additional" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1153 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1157 msgid "Street" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1154 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1158 msgid "Locality" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1155 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1159 msgid "Region" msgstr "" -#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1156 +#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1160 msgid "ZIP Code" msgstr "" -#: ../../extend/addon/addon/cdav/cdav.php:35 -msgid "Errors encountered creating database table: " -msgstr "" - -#: ../../extend/addon/addon/cdav/cdav.php:193 -msgid "Default Calendar" -msgstr "" - -#: ../../extend/addon/addon/cdav/cdav.php:202 -msgid "Default Addressbook" -msgstr "" - -#: ../../extend/addon/addon/cdav/cdav.php:211 -msgid "CalDAV/CardDAV Settings saved." -msgstr "" - -#: ../../extend/addon/addon/cdav/cdav.php:227 -msgid "Enable CalDAV/CardDAV Server for this channel" -msgstr "" - -#: ../../extend/addon/addon/cdav/cdav.php:230 -#, php-format -msgid "Your CalDAV resources are located at %s " -msgstr "" - -#: ../../extend/addon/addon/cdav/cdav.php:233 -#, php-format -msgid "Your CardDAV resources are located at %s " -msgstr "" - -#: ../../extend/addon/addon/cdav/cdav.php:239 -msgid "CalDAV/CardDAV Settings" -msgstr "" - -#: ../../extend/addon/addon/cdav/cdav.php:265 -msgid "Home, Voice" -msgstr "" - -#: ../../extend/addon/addon/cdav/cdav.php:266 -msgid "Home, Fax" -msgstr "" - -#: ../../extend/addon/addon/cdav/cdav.php:268 -msgid "Work, Voice" -msgstr "" - -#: ../../extend/addon/addon/cdav/cdav.php:269 -msgid "Work, Fax" -msgstr "" - #: ../../extend/addon/addon/chess/chess.php:276 #: ../../extend/addon/addon/chess/chess.php:430 msgid "Invalid game." @@ -10169,6 +10216,25 @@ msgstr "" msgid "The error message was:" msgstr "" +#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:44 +#, php-format +msgid "Reconnecting %d connections" +msgstr "" + +#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:63 +msgid "Diaspora Reconnect" +msgstr "" + +#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:65 +msgid "" +"Use this form to re-establish Diaspora connections which were initially made " +"from a different hub." +msgstr "" + +#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:70 +msgid "Reconnect" +msgstr "" + #: ../../extend/addon/addon/mailtest/mailtest.php:19 msgid "Send test email" msgstr "" @@ -10281,25 +10347,6 @@ msgid "" "share their own locations with the group." msgstr "" -#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:44 -#, php-format -msgid "Reconnecting %d connections" -msgstr "" - -#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:63 -msgid "Diaspora Reconnect" -msgstr "" - -#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:65 -msgid "" -"Use this form to re-establish Diaspora connections which were initially made " -"from a different hub." -msgstr "" - -#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:70 -msgid "Reconnect" -msgstr "" - #: ../../include/Import/import_diaspora.php:16 msgid "No username found in import file." msgstr "" @@ -10313,150 +10360,173 @@ msgstr "" msgid "Cannot locate DNS info for database server '%s'" msgstr "" -#: ../../include/channel.php:33 -msgid "Unable to obtain identity information from database" -msgstr "" - -#: ../../include/channel.php:67 -msgid "Empty name" +#: ../../include/datetime.php:147 +msgid "Birthday" msgstr "" -#: ../../include/channel.php:70 -msgid "Name too long" +#: ../../include/datetime.php:149 +msgid "Age: " msgstr "" -#: ../../include/channel.php:181 -msgid "No account identifier" +#: ../../include/datetime.php:151 +msgid "YYYY-MM-DD or MM-DD" msgstr "" -#: ../../include/channel.php:193 -msgid "Nickname is required." +#: ../../include/datetime.php:286 ../../boot.php:2563 +msgid "never" msgstr "" -#: ../../include/channel.php:207 -msgid "Reserved nickname. Please choose another." +#: ../../include/datetime.php:292 +msgid "less than a second ago" msgstr "" -#: ../../include/channel.php:212 -msgid "" -"Nickname has unsupported characters or is already being used on this site." +#: ../../include/datetime.php:310 +#, php-format +msgctxt "e.g. 22 hours ago, 1 minute ago" +msgid "%1$d %2$s ago" msgstr "" -#: ../../include/channel.php:272 -msgid "Unable to retrieve created identity" -msgstr "" +#: ../../include/datetime.php:321 +msgctxt "relative_date" +msgid "year" +msgid_plural "years" +msgstr[0] "" +msgstr[1] "" -#: ../../include/channel.php:341 -msgid "Default Profile" -msgstr "" +#: ../../include/datetime.php:324 +msgctxt "relative_date" +msgid "month" +msgid_plural "months" +msgstr[0] "" +msgstr[1] "" -#: ../../include/channel.php:962 -msgid "Create New Profile" -msgstr "" +#: ../../include/datetime.php:327 +msgctxt "relative_date" +msgid "week" +msgid_plural "weeks" +msgstr[0] "" +msgstr[1] "" -#: ../../include/channel.php:982 -msgid "Visible to everybody" -msgstr "" +#: ../../include/datetime.php:330 +msgctxt "relative_date" +msgid "day" +msgid_plural "days" +msgstr[0] "" +msgstr[1] "" -#: ../../include/channel.php:1055 ../../include/channel.php:1174 -msgid "Gender:" -msgstr "" +#: ../../include/datetime.php:333 +msgctxt "relative_date" +msgid "hour" +msgid_plural "hours" +msgstr[0] "" +msgstr[1] "" -#: ../../include/channel.php:1057 ../../include/channel.php:1229 -msgid "Homepage:" -msgstr "" +#: ../../include/datetime.php:336 +msgctxt "relative_date" +msgid "minute" +msgid_plural "minutes" +msgstr[0] "" +msgstr[1] "" -#: ../../include/channel.php:1058 -msgid "Online Now" -msgstr "" +#: ../../include/datetime.php:339 +msgctxt "relative_date" +msgid "second" +msgid_plural "seconds" +msgstr[0] "" +msgstr[1] "" -#: ../../include/channel.php:1179 -msgid "Like this channel" +#: ../../include/datetime.php:576 +#, php-format +msgid "%1$s's birthday" msgstr "" -#: ../../include/channel.php:1203 -msgid "j F, Y" +#: ../../include/datetime.php:577 +#, php-format +msgid "Happy Birthday %1$s" msgstr "" -#: ../../include/channel.php:1204 -msgid "j F" +#: ../../include/account.php:35 +msgid "Not a valid email address" msgstr "" -#: ../../include/channel.php:1211 -msgid "Birthday:" +#: ../../include/account.php:37 +msgid "Your email domain is not among those allowed on this site" msgstr "" -#: ../../include/channel.php:1224 -#, php-format -msgid "for %1$d %2$s" +#: ../../include/account.php:43 +msgid "Your email address is already registered at this site." msgstr "" -#: ../../include/channel.php:1227 -msgid "Sexual Preference:" +#: ../../include/account.php:75 +msgid "An invitation is required." msgstr "" -#: ../../include/channel.php:1233 -msgid "Tags:" +#: ../../include/account.php:79 +msgid "Invitation could not be verified." msgstr "" -#: ../../include/channel.php:1235 -msgid "Political Views:" +#: ../../include/account.php:130 +msgid "Please enter the required information." msgstr "" -#: ../../include/channel.php:1237 -msgid "Religion:" +#: ../../include/account.php:198 +msgid "Failed to store account information." msgstr "" -#: ../../include/channel.php:1241 -msgid "Hobbies/Interests:" +#: ../../include/account.php:263 +#, php-format +msgid "Registration confirmation for %s" msgstr "" -#: ../../include/channel.php:1243 -msgid "Likes:" +#: ../../include/account.php:330 +#, php-format +msgid "Registration request at %s" msgstr "" -#: ../../include/channel.php:1245 -msgid "Dislikes:" +#: ../../include/account.php:352 +msgid "your registration password" msgstr "" -#: ../../include/channel.php:1247 -msgid "Contact information and Social Networks:" +#: ../../include/account.php:358 ../../include/account.php:420 +#, php-format +msgid "Registration details for %s" msgstr "" -#: ../../include/channel.php:1249 -msgid "My other channels:" +#: ../../include/account.php:431 +msgid "Account approved." msgstr "" -#: ../../include/channel.php:1251 -msgid "Musical interests:" +#: ../../include/account.php:471 +#, php-format +msgid "Registration revoked for %s" msgstr "" -#: ../../include/channel.php:1253 -msgid "Books, literature:" +#: ../../include/account.php:756 ../../include/account.php:758 +msgid "Click here to upgrade." msgstr "" -#: ../../include/channel.php:1255 -msgid "Television:" +#: ../../include/account.php:764 +msgid "This action exceeds the limits set by your subscription plan." msgstr "" -#: ../../include/channel.php:1257 -msgid "Film/dance/culture/entertainment:" +#: ../../include/account.php:769 +msgid "This action is not available under your subscription plan." msgstr "" -#: ../../include/channel.php:1259 -msgid "Love/Romance:" +#: ../../include/message.php:20 +msgid "No recipient provided." msgstr "" -#: ../../include/channel.php:1261 -msgid "Work/employment:" +#: ../../include/message.php:25 +msgid "[no subject]" msgstr "" -#: ../../include/channel.php:1263 -msgid "School/education:" +#: ../../include/message.php:45 +msgid "Unable to determine sender." msgstr "" -#: ../../include/channel.php:1284 -msgid "Like this thing" +#: ../../include/message.php:223 +msgid "Stored post could not be verified." msgstr "" #: ../../include/selectors.php:30 @@ -10699,167 +10769,363 @@ msgstr "" msgid "Ask me" msgstr "" -#: ../../include/acl_selectors.php:198 -msgid "Who can see this?" +#: ../../include/channel.php:33 +msgid "Unable to obtain identity information from database" msgstr "" -#: ../../include/acl_selectors.php:199 -msgid "Custom selection" +#: ../../include/channel.php:67 +msgid "Empty name" msgstr "" -#: ../../include/acl_selectors.php:200 +#: ../../include/channel.php:70 +msgid "Name too long" +msgstr "" + +#: ../../include/channel.php:181 +msgid "No account identifier" +msgstr "" + +#: ../../include/channel.php:193 +msgid "Nickname is required." +msgstr "" + +#: ../../include/channel.php:207 +msgid "Reserved nickname. Please choose another." +msgstr "" + +#: ../../include/channel.php:212 msgid "" -"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit " -"the scope of \"Show\"." +"Nickname has unsupported characters or is already being used on this site." msgstr "" -#: ../../include/acl_selectors.php:201 -msgid "Show" +#: ../../include/channel.php:272 +msgid "Unable to retrieve created identity" msgstr "" -#: ../../include/acl_selectors.php:202 -msgid "Don't show" +#: ../../include/channel.php:341 +msgid "Default Profile" msgstr "" -#: ../../include/acl_selectors.php:235 +#: ../../include/channel.php:962 +msgid "Create New Profile" +msgstr "" + +#: ../../include/channel.php:982 +msgid "Visible to everybody" +msgstr "" + +#: ../../include/channel.php:1055 ../../include/channel.php:1174 +msgid "Gender:" +msgstr "" + +#: ../../include/channel.php:1057 ../../include/channel.php:1229 +msgid "Homepage:" +msgstr "" + +#: ../../include/channel.php:1058 +msgid "Online Now" +msgstr "" + +#: ../../include/channel.php:1179 +msgid "Like this channel" +msgstr "" + +#: ../../include/channel.php:1203 +msgid "j F, Y" +msgstr "" + +#: ../../include/channel.php:1204 +msgid "j F" +msgstr "" + +#: ../../include/channel.php:1211 +msgid "Birthday:" +msgstr "" + +#: ../../include/channel.php:1224 #, php-format -msgid "" -"Post permissions %s cannot be changed %s after a post is shared.</br />These " -"permissions set who is allowed to view the post." +msgid "for %1$d %2$s" msgstr "" -#: ../../include/event.php:22 ../../include/event.php:69 -#: ../../include/bb2diaspora.php:490 -msgid "l F d, Y \\@ g:i A" +#: ../../include/channel.php:1227 +msgid "Sexual Preference:" msgstr "" -#: ../../include/event.php:30 ../../include/event.php:73 -#: ../../include/bb2diaspora.php:496 -msgid "Starts:" +#: ../../include/channel.php:1233 +msgid "Tags:" msgstr "" -#: ../../include/event.php:40 ../../include/event.php:77 -#: ../../include/bb2diaspora.php:504 -msgid "Finishes:" +#: ../../include/channel.php:1235 +msgid "Political Views:" msgstr "" -#: ../../include/event.php:824 -msgid "This event has been added to your calendar." +#: ../../include/channel.php:1237 +msgid "Religion:" msgstr "" -#: ../../include/event.php:1024 -msgid "Not specified" +#: ../../include/channel.php:1241 +msgid "Hobbies/Interests:" msgstr "" -#: ../../include/event.php:1025 -msgid "Needs Action" +#: ../../include/channel.php:1243 +msgid "Likes:" msgstr "" -#: ../../include/event.php:1026 -msgid "Completed" +#: ../../include/channel.php:1245 +msgid "Dislikes:" msgstr "" -#: ../../include/event.php:1027 -msgid "In Process" +#: ../../include/channel.php:1247 +msgid "Contact information and Social Networks:" msgstr "" -#: ../../include/event.php:1028 -msgid "Cancelled" +#: ../../include/channel.php:1249 +msgid "My other channels:" msgstr "" -#: ../../include/help.php:31 -msgid "Help:" +#: ../../include/channel.php:1251 +msgid "Musical interests:" msgstr "" -#: ../../include/message.php:20 -msgid "No recipient provided." +#: ../../include/channel.php:1253 +msgid "Books, literature:" msgstr "" -#: ../../include/message.php:25 -msgid "[no subject]" +#: ../../include/channel.php:1255 +msgid "Television:" msgstr "" -#: ../../include/message.php:45 -msgid "Unable to determine sender." +#: ../../include/channel.php:1257 +msgid "Film/dance/culture/entertainment:" msgstr "" -#: ../../include/message.php:223 -msgid "Stored post could not be verified." +#: ../../include/channel.php:1259 +msgid "Love/Romance:" msgstr "" -#: ../../include/photos.php:115 -#, php-format -msgid "Image exceeds website size limit of %lu bytes" +#: ../../include/channel.php:1261 +msgid "Work/employment:" msgstr "" -#: ../../include/photos.php:122 -msgid "Image file is empty." +#: ../../include/channel.php:1263 +msgid "School/education:" msgstr "" -#: ../../include/photos.php:260 -msgid "Photo storage failed." +#: ../../include/channel.php:1284 +msgid "Like this thing" msgstr "" -#: ../../include/photos.php:300 -msgid "a new photo" +#: ../../include/connections.php:95 +msgid "New window" msgstr "" -#: ../../include/photos.php:304 +#: ../../include/connections.php:96 +msgid "Open the selected location in a different window or browser tab" +msgstr "" + +#: ../../include/connections.php:214 #, php-format -msgctxt "photo_upload" -msgid "%1$s posted %2$s to %3$s" +msgid "User '%s' deleted" msgstr "" -#: ../../include/photos.php:507 ../../include/conversation.php:1696 -msgid "Photo Albums" +#: ../../include/dir_fns.php:141 +msgid "Directory Options" msgstr "" -#: ../../include/photos.php:511 -msgid "Upload New Photos" +#: ../../include/dir_fns.php:143 +msgid "Safe Mode" msgstr "" -#: ../../include/network.php:729 -msgid "view full size" +#: ../../include/dir_fns.php:144 +msgid "Public Forums Only" msgstr "" -#: ../../include/network.php:1962 -msgid "Administrator" +#: ../../include/dir_fns.php:145 +msgid "This Website Only" msgstr "" -#: ../../include/network.php:1978 -msgid "No Subject" +#: ../../include/nav.php:85 ../../include/nav.php:118 ../../boot.php:1718 +msgid "Logout" msgstr "" -#: ../../include/network.php:2234 -msgid "OStatus" +#: ../../include/nav.php:85 ../../include/nav.php:118 +msgid "End this session" msgstr "" -#: ../../include/network.php:2235 -msgid "GNU-Social" +#: ../../include/nav.php:88 +msgid "Your posts and conversations" msgstr "" -#: ../../include/network.php:2236 -msgid "RSS/Atom" +#: ../../include/nav.php:89 +msgid "Your profile page" msgstr "" -#: ../../include/network.php:2239 -msgid "Facebook" +#: ../../include/nav.php:91 +msgid "Manage/Edit profiles" msgstr "" -#: ../../include/network.php:2240 -msgid "Zot" +#: ../../include/nav.php:93 +msgid "Edit your profile" msgstr "" -#: ../../include/network.php:2241 -msgid "LinkedIn" +#: ../../include/nav.php:95 +msgid "Your photos" msgstr "" -#: ../../include/network.php:2242 -msgid "XMPP/IM" +#: ../../include/nav.php:96 +msgid "Your files" msgstr "" -#: ../../include/network.php:2243 -msgid "MySpace" +#: ../../include/nav.php:99 +msgid "Your chatrooms" +msgstr "" + +#: ../../include/nav.php:105 ../../include/conversation.php:1735 +msgid "Bookmarks" +msgstr "" + +#: ../../include/nav.php:105 +msgid "Your bookmarks" +msgstr "" + +#: ../../include/nav.php:109 +msgid "Your webpages" +msgstr "" + +#: ../../include/nav.php:111 +msgid "Your wikis" +msgstr "" + +#: ../../include/nav.php:115 +msgid "Sign in" +msgstr "" + +#: ../../include/nav.php:131 +msgid "Remote authentication" +msgstr "" + +#: ../../include/nav.php:131 +msgid "Click to authenticate to your home hub" +msgstr "" + +#: ../../include/nav.php:143 +msgid "Get me home" +msgstr "" + +#: ../../include/nav.php:145 +msgid "Log me out of this site" +msgstr "" + +#: ../../include/nav.php:150 +msgid "Create an account" +msgstr "" + +#: ../../include/nav.php:162 +msgid "Help and documentation" +msgstr "" + +#: ../../include/nav.php:166 +msgid "Applications, utilities, links, games" +msgstr "" + +#: ../../include/nav.php:168 +msgid "Search site @name, #tag, ?docs, content" +msgstr "" + +#: ../../include/nav.php:170 +msgid "Channel Directory" +msgstr "" + +#: ../../include/nav.php:182 +msgid "Your grid" +msgstr "" + +#: ../../include/nav.php:183 +msgid "Mark all grid notifications seen" +msgstr "" + +#: ../../include/nav.php:185 +msgid "Channel home" +msgstr "" + +#: ../../include/nav.php:186 +msgid "Mark all channel notifications seen" +msgstr "" + +#: ../../include/nav.php:192 +msgid "Notices" +msgstr "" + +#: ../../include/nav.php:192 +msgid "Notifications" +msgstr "" + +#: ../../include/nav.php:193 +msgid "See all notifications" +msgstr "" + +#: ../../include/nav.php:196 +msgid "Private mail" +msgstr "" + +#: ../../include/nav.php:197 +msgid "See all private messages" +msgstr "" + +#: ../../include/nav.php:198 +msgid "Mark all private messages seen" +msgstr "" + +#: ../../include/nav.php:199 ../../include/widgets.php:700 +msgid "Inbox" +msgstr "" + +#: ../../include/nav.php:200 ../../include/widgets.php:705 +msgid "Outbox" +msgstr "" + +#: ../../include/nav.php:201 ../../include/widgets.php:710 +msgid "New Message" +msgstr "" + +#: ../../include/nav.php:204 +msgid "Event Calendar" +msgstr "" + +#: ../../include/nav.php:205 +msgid "See all events" +msgstr "" + +#: ../../include/nav.php:206 +msgid "Mark all events seen" +msgstr "" + +#: ../../include/nav.php:209 +msgid "Manage Your Channels" +msgstr "" + +#: ../../include/nav.php:211 +msgid "Account/Channel Settings" +msgstr "" + +#: ../../include/nav.php:219 ../../include/widgets.php:1656 +msgid "Admin" +msgstr "" + +#: ../../include/nav.php:219 +msgid "Site Setup and Configuration" +msgstr "" + +#: ../../include/nav.php:250 ../../include/conversation.php:869 +msgid "Loading..." +msgstr "" + +#: ../../include/nav.php:255 +msgid "@name, #tag, ?doc, content" +msgstr "" + +#: ../../include/nav.php:256 +msgid "Please wait..." msgstr "" #: ../../include/features.php:58 @@ -11164,204 +11430,370 @@ msgid "" "channel" msgstr "" -#: ../../include/bookmarks.php:35 +#: ../../include/text.php:460 +msgid "prev" +msgstr "" + +#: ../../include/text.php:462 +msgid "first" +msgstr "" + +#: ../../include/text.php:491 +msgid "last" +msgstr "" + +#: ../../include/text.php:494 +msgid "next" +msgstr "" + +#: ../../include/text.php:505 +msgid "older" +msgstr "" + +#: ../../include/text.php:507 +msgid "newer" +msgstr "" + +#: ../../include/text.php:904 +msgid "No connections" +msgstr "" + +#: ../../include/text.php:929 #, php-format -msgid "%1$s's bookmarks" +msgid "View all %s connections" msgstr "" -#: ../../include/nav.php:85 ../../include/nav.php:118 ../../boot.php:1714 -msgid "Logout" +#: ../../include/text.php:1074 ../../include/text.php:1079 +msgid "poke" msgstr "" -#: ../../include/nav.php:85 ../../include/nav.php:118 -msgid "End this session" +#: ../../include/text.php:1074 ../../include/text.php:1079 +#: ../../include/conversation.php:243 +msgid "poked" msgstr "" -#: ../../include/nav.php:88 -msgid "Your posts and conversations" +#: ../../include/text.php:1080 +msgid "ping" msgstr "" -#: ../../include/nav.php:89 -msgid "Your profile page" +#: ../../include/text.php:1080 +msgid "pinged" msgstr "" -#: ../../include/nav.php:91 -msgid "Manage/Edit profiles" +#: ../../include/text.php:1081 +msgid "prod" msgstr "" -#: ../../include/nav.php:93 -msgid "Edit your profile" +#: ../../include/text.php:1081 +msgid "prodded" msgstr "" -#: ../../include/nav.php:95 -msgid "Your photos" +#: ../../include/text.php:1082 +msgid "slap" msgstr "" -#: ../../include/nav.php:96 -msgid "Your files" +#: ../../include/text.php:1082 +msgid "slapped" msgstr "" -#: ../../include/nav.php:99 -msgid "Your chatrooms" +#: ../../include/text.php:1083 +msgid "finger" msgstr "" -#: ../../include/nav.php:105 ../../include/conversation.php:1736 -msgid "Bookmarks" +#: ../../include/text.php:1083 +msgid "fingered" msgstr "" -#: ../../include/nav.php:105 -msgid "Your bookmarks" +#: ../../include/text.php:1084 +msgid "rebuff" msgstr "" -#: ../../include/nav.php:109 -msgid "Your webpages" +#: ../../include/text.php:1084 +msgid "rebuffed" msgstr "" -#: ../../include/nav.php:111 -msgid "Your wiki" +#: ../../include/text.php:1096 +msgid "happy" msgstr "" -#: ../../include/nav.php:115 -msgid "Sign in" +#: ../../include/text.php:1097 +msgid "sad" msgstr "" -#: ../../include/nav.php:132 -#, php-format -msgid "%s - click to logout" +#: ../../include/text.php:1098 +msgid "mellow" msgstr "" -#: ../../include/nav.php:135 -msgid "Remote authentication" +#: ../../include/text.php:1099 +msgid "tired" msgstr "" -#: ../../include/nav.php:135 -msgid "Click to authenticate to your home hub" +#: ../../include/text.php:1100 +msgid "perky" msgstr "" -#: ../../include/nav.php:149 -msgid "Home Page" +#: ../../include/text.php:1101 +msgid "angry" msgstr "" -#: ../../include/nav.php:152 -msgid "Create an account" +#: ../../include/text.php:1102 +msgid "stupefied" msgstr "" -#: ../../include/nav.php:164 -msgid "Help and documentation" +#: ../../include/text.php:1103 +msgid "puzzled" msgstr "" -#: ../../include/nav.php:168 -msgid "Applications, utilities, links, games" +#: ../../include/text.php:1104 +msgid "interested" msgstr "" -#: ../../include/nav.php:170 -msgid "Search site @name, #tag, ?docs, content" +#: ../../include/text.php:1105 +msgid "bitter" msgstr "" -#: ../../include/nav.php:172 -msgid "Channel Directory" +#: ../../include/text.php:1106 +msgid "cheerful" msgstr "" -#: ../../include/nav.php:184 -msgid "Your grid" +#: ../../include/text.php:1107 +msgid "alive" msgstr "" -#: ../../include/nav.php:185 -msgid "Mark all grid notifications seen" +#: ../../include/text.php:1108 +msgid "annoyed" msgstr "" -#: ../../include/nav.php:187 -msgid "Channel home" +#: ../../include/text.php:1109 +msgid "anxious" msgstr "" -#: ../../include/nav.php:188 -msgid "Mark all channel notifications seen" +#: ../../include/text.php:1110 +msgid "cranky" msgstr "" -#: ../../include/nav.php:194 -msgid "Notices" +#: ../../include/text.php:1111 +msgid "disturbed" msgstr "" -#: ../../include/nav.php:194 -msgid "Notifications" +#: ../../include/text.php:1112 +msgid "frustrated" msgstr "" -#: ../../include/nav.php:195 -msgid "See all notifications" +#: ../../include/text.php:1113 +msgid "depressed" msgstr "" -#: ../../include/nav.php:198 -msgid "Private mail" +#: ../../include/text.php:1114 +msgid "motivated" msgstr "" -#: ../../include/nav.php:199 -msgid "See all private messages" +#: ../../include/text.php:1115 +msgid "relaxed" msgstr "" -#: ../../include/nav.php:200 -msgid "Mark all private messages seen" +#: ../../include/text.php:1116 +msgid "surprised" msgstr "" -#: ../../include/nav.php:201 ../../include/widgets.php:700 -msgid "Inbox" +#: ../../include/text.php:1303 ../../include/js_strings.php:70 +msgid "Monday" msgstr "" -#: ../../include/nav.php:202 ../../include/widgets.php:705 -msgid "Outbox" +#: ../../include/text.php:1303 ../../include/js_strings.php:71 +msgid "Tuesday" msgstr "" -#: ../../include/nav.php:203 ../../include/widgets.php:710 -msgid "New Message" +#: ../../include/text.php:1303 ../../include/js_strings.php:72 +msgid "Wednesday" msgstr "" -#: ../../include/nav.php:206 -msgid "Event Calendar" +#: ../../include/text.php:1303 ../../include/js_strings.php:73 +msgid "Thursday" msgstr "" -#: ../../include/nav.php:207 -msgid "See all events" +#: ../../include/text.php:1303 ../../include/js_strings.php:74 +msgid "Friday" msgstr "" -#: ../../include/nav.php:208 -msgid "Mark all events seen" +#: ../../include/text.php:1303 ../../include/js_strings.php:75 +msgid "Saturday" msgstr "" -#: ../../include/nav.php:211 -msgid "Manage Your Channels" +#: ../../include/text.php:1303 ../../include/js_strings.php:69 +msgid "Sunday" msgstr "" -#: ../../include/nav.php:213 -msgid "Account/Channel Settings" +#: ../../include/text.php:1307 ../../include/js_strings.php:45 +msgid "January" msgstr "" -#: ../../include/nav.php:221 ../../include/widgets.php:1593 -msgid "Admin" +#: ../../include/text.php:1307 ../../include/js_strings.php:46 +msgid "February" msgstr "" -#: ../../include/nav.php:221 -msgid "Site Setup and Configuration" +#: ../../include/text.php:1307 ../../include/js_strings.php:47 +msgid "March" msgstr "" -#: ../../include/nav.php:252 ../../include/conversation.php:869 -msgid "Loading..." +#: ../../include/text.php:1307 ../../include/js_strings.php:48 +msgid "April" msgstr "" -#: ../../include/nav.php:257 -msgid "@name, #tag, ?doc, content" +#: ../../include/text.php:1307 +msgid "May" msgstr "" -#: ../../include/nav.php:258 -msgid "Please wait..." +#: ../../include/text.php:1307 ../../include/js_strings.php:50 +msgid "June" msgstr "" -#: ../../include/page_widgets.php:7 -msgid "New Page" +#: ../../include/text.php:1307 ../../include/js_strings.php:51 +msgid "July" msgstr "" -#: ../../include/wiki.php:525 ../../include/bbcode.php:632 +#: ../../include/text.php:1307 ../../include/js_strings.php:52 +msgid "August" +msgstr "" + +#: ../../include/text.php:1307 ../../include/js_strings.php:53 +msgid "September" +msgstr "" + +#: ../../include/text.php:1307 ../../include/js_strings.php:54 +msgid "October" +msgstr "" + +#: ../../include/text.php:1307 ../../include/js_strings.php:55 +msgid "November" +msgstr "" + +#: ../../include/text.php:1307 ../../include/js_strings.php:56 +msgid "December" +msgstr "" + +#: ../../include/text.php:1384 ../../include/text.php:1388 +msgid "Unknown Attachment" +msgstr "" + +#: ../../include/text.php:1390 +msgid "unknown" +msgstr "" + +#: ../../include/text.php:1426 +msgid "remove category" +msgstr "" + +#: ../../include/text.php:1503 +msgid "remove from file" +msgstr "" + +#: ../../include/text.php:1770 ../../include/language.php:367 +msgid "default" +msgstr "" + +#: ../../include/text.php:1778 +msgid "Page layout" +msgstr "" + +#: ../../include/text.php:1778 +msgid "You can create your own with the layouts tool" +msgstr "" + +#: ../../include/text.php:1820 +msgid "Page content type" +msgstr "" + +#: ../../include/text.php:1953 +msgid "activity" +msgstr "" + +#: ../../include/text.php:2264 +msgid "Design Tools" +msgstr "" + +#: ../../include/text.php:2270 +msgid "Pages" +msgstr "" + +#: ../../include/text.php:2292 +msgid "Import website..." +msgstr "" + +#: ../../include/text.php:2293 +msgid "Select folder to import" +msgstr "" + +#: ../../include/text.php:2294 +msgid "Import from a zipped folder:" +msgstr "" + +#: ../../include/text.php:2295 +msgid "Import from cloud files:" +msgstr "" + +#: ../../include/text.php:2296 +msgid "/cloud/channel/path/to/folder" +msgstr "" + +#: ../../include/text.php:2297 +msgid "Enter path to website files" +msgstr "" + +#: ../../include/text.php:2298 +msgid "Select folder" +msgstr "" + +#: ../../include/text.php:2299 +msgid "Export website..." +msgstr "" + +#: ../../include/text.php:2300 +msgid "Export to a zip file" +msgstr "" + +#: ../../include/text.php:2301 +msgid "website.zip" +msgstr "" + +#: ../../include/text.php:2302 +msgid "Enter a name for the zip file." +msgstr "" + +#: ../../include/text.php:2303 +msgid "Export to cloud files" +msgstr "" + +#: ../../include/text.php:2304 +msgid "/path/to/export/folder" +msgstr "" + +#: ../../include/text.php:2305 +msgid "Enter a path to a cloud files destination." +msgstr "" + +#: ../../include/text.php:2306 +msgid "Specify folder" +msgstr "" + +#: ../../include/bookmarks.php:35 +#, php-format +msgid "%1$s's bookmarks" +msgstr "" + +#: ../../include/wiki.php:545 ../../include/bbcode.php:552 +#: ../../include/bbcode.php:683 msgid "Different viewers will see this text differently" msgstr "" +#: ../../include/help.php:31 +msgid "Help:" +msgstr "" + +#: ../../include/page_widgets.php:7 +msgid "New Page" +msgstr "" + #: ../../include/contact_widgets.php:11 #, php-format msgid "%d invitation available" @@ -11419,19 +11851,6 @@ msgstr[1] "" msgid "show more" msgstr "" -#: ../../include/connections.php:95 -msgid "New window" -msgstr "" - -#: ../../include/connections.php:96 -msgid "Open the selected location in a different window or browser tab" -msgstr "" - -#: ../../include/connections.php:214 -#, php-format -msgid "User '%s' deleted" -msgstr "" - #: ../../include/js_strings.php:5 msgid "Delete this item?" msgstr "" @@ -11572,55 +11991,11 @@ msgstr "" msgid "timeago.numbers" msgstr "" -#: ../../include/js_strings.php:45 ../../include/text.php:1314 -msgid "January" -msgstr "" - -#: ../../include/js_strings.php:46 ../../include/text.php:1314 -msgid "February" -msgstr "" - -#: ../../include/js_strings.php:47 ../../include/text.php:1314 -msgid "March" -msgstr "" - -#: ../../include/js_strings.php:48 ../../include/text.php:1314 -msgid "April" -msgstr "" - #: ../../include/js_strings.php:49 msgctxt "long" msgid "May" msgstr "" -#: ../../include/js_strings.php:50 ../../include/text.php:1314 -msgid "June" -msgstr "" - -#: ../../include/js_strings.php:51 ../../include/text.php:1314 -msgid "July" -msgstr "" - -#: ../../include/js_strings.php:52 ../../include/text.php:1314 -msgid "August" -msgstr "" - -#: ../../include/js_strings.php:53 ../../include/text.php:1314 -msgid "September" -msgstr "" - -#: ../../include/js_strings.php:54 ../../include/text.php:1314 -msgid "October" -msgstr "" - -#: ../../include/js_strings.php:55 ../../include/text.php:1314 -msgid "November" -msgstr "" - -#: ../../include/js_strings.php:56 ../../include/text.php:1314 -msgid "December" -msgstr "" - #: ../../include/js_strings.php:57 msgid "Jan" msgstr "" @@ -11670,34 +12045,6 @@ msgstr "" msgid "Dec" msgstr "" -#: ../../include/js_strings.php:69 ../../include/text.php:1310 -msgid "Sunday" -msgstr "" - -#: ../../include/js_strings.php:70 ../../include/text.php:1310 -msgid "Monday" -msgstr "" - -#: ../../include/js_strings.php:71 ../../include/text.php:1310 -msgid "Tuesday" -msgstr "" - -#: ../../include/js_strings.php:72 ../../include/text.php:1310 -msgid "Wednesday" -msgstr "" - -#: ../../include/js_strings.php:73 ../../include/text.php:1310 -msgid "Thursday" -msgstr "" - -#: ../../include/js_strings.php:74 ../../include/text.php:1310 -msgid "Friday" -msgstr "" - -#: ../../include/js_strings.php:75 ../../include/text.php:1310 -msgid "Saturday" -msgstr "" - #: ../../include/js_strings.php:76 msgid "Sun" msgstr "" @@ -11751,198 +12098,187 @@ msgctxt "calendar" msgid "All day" msgstr "" -#: ../../include/follow.php:27 -msgid "Channel is blocked on this site." +#: ../../include/network.php:729 +msgid "view full size" msgstr "" -#: ../../include/follow.php:32 -msgid "Channel location missing." +#: ../../include/network.php:1978 +msgid "No Subject" msgstr "" -#: ../../include/follow.php:80 -msgid "Response from remote channel was incomplete." +#: ../../include/network.php:2234 +msgid "OStatus" msgstr "" -#: ../../include/follow.php:97 -msgid "Channel was deleted and no longer exists." +#: ../../include/network.php:2235 +msgid "GNU-Social" msgstr "" -#: ../../include/follow.php:147 ../../include/follow.php:183 -msgid "Protocol disabled." +#: ../../include/network.php:2236 +msgid "RSS/Atom" msgstr "" -#: ../../include/follow.php:171 -msgid "Channel discovery failed." +#: ../../include/network.php:2239 +msgid "Facebook" msgstr "" -#: ../../include/follow.php:210 -msgid "Cannot connect to yourself." +#: ../../include/network.php:2240 +msgid "Zot" msgstr "" -#: ../../include/dir_fns.php:141 -msgid "Directory Options" +#: ../../include/network.php:2241 +msgid "LinkedIn" msgstr "" -#: ../../include/dir_fns.php:143 -msgid "Safe Mode" +#: ../../include/network.php:2242 +msgid "XMPP/IM" msgstr "" -#: ../../include/dir_fns.php:144 -msgid "Public Forums Only" +#: ../../include/network.php:2243 +msgid "MySpace" msgstr "" -#: ../../include/dir_fns.php:145 -msgid "This Website Only" +#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249 +msgid "Tags" msgstr "" -#: ../../include/attach.php:248 ../../include/attach.php:336 -msgid "Item was not found." +#: ../../include/taxonomy.php:293 +msgid "Keywords" msgstr "" -#: ../../include/attach.php:497 -msgid "No source file." +#: ../../include/taxonomy.php:314 +msgid "have" msgstr "" -#: ../../include/attach.php:519 -msgid "Cannot locate file to replace" +#: ../../include/taxonomy.php:314 +msgid "has" msgstr "" -#: ../../include/attach.php:537 -msgid "Cannot locate file to revise/update" +#: ../../include/taxonomy.php:315 +msgid "want" msgstr "" -#: ../../include/attach.php:668 -#, php-format -msgid "File exceeds size limit of %d" +#: ../../include/taxonomy.php:315 +msgid "wants" msgstr "" -#: ../../include/attach.php:682 -#, php-format -msgid "You have reached your limit of %1$.0f Mbytes attachment storage." +#: ../../include/taxonomy.php:316 +msgid "likes" msgstr "" -#: ../../include/attach.php:852 -msgid "File upload failed. Possible system limit or action terminated." +#: ../../include/taxonomy.php:317 +msgid "dislikes" msgstr "" -#: ../../include/attach.php:865 -msgid "Stored file could not be verified. Upload failed." +#: ../../include/import.php:30 +msgid "" +"Cannot create a duplicate channel identifier on this system. Import failed." msgstr "" -#: ../../include/attach.php:920 ../../include/attach.php:936 -msgid "Path not available." +#: ../../include/import.php:90 +msgid "Channel clone failed. Import failed." msgstr "" -#: ../../include/attach.php:982 ../../include/attach.php:1140 -msgid "Empty pathname" +#: ../../include/import.php:1354 +msgid "Unable to import element \"" msgstr "" -#: ../../include/attach.php:1008 -msgid "duplicate filename or path" +#: ../../include/security.php:117 +msgid "guest:" msgstr "" -#: ../../include/attach.php:1030 -msgid "Path not found." +#: ../../include/security.php:535 +msgid "" +"The form security token was not correct. This probably happened because the " +"form has been opened for too long (>3 hours) before submitting it." msgstr "" -#: ../../include/attach.php:1094 -msgid "mkdir failed." +#: ../../include/zot.php:662 +msgid "Invalid data packet" msgstr "" -#: ../../include/attach.php:1098 -msgid "database storage failed." +#: ../../include/zot.php:678 +msgid "Unable to verify channel signature" msgstr "" -#: ../../include/attach.php:1146 -msgid "Empty path" +#: ../../include/zot.php:2320 +#, php-format +msgid "Unable to verify site signature for %s" msgstr "" -#: ../../include/items.php:909 ../../include/items.php:954 +#: ../../include/zot.php:3718 +msgid "invalid target signature" +msgstr "" + +#: ../../include/items.php:837 ../../include/items.php:882 msgid "(Unknown)" msgstr "" -#: ../../include/items.php:1152 +#: ../../include/items.php:1080 msgid "Visible to anybody on the internet." msgstr "" -#: ../../include/items.php:1154 +#: ../../include/items.php:1082 msgid "Visible to you only." msgstr "" -#: ../../include/items.php:1156 +#: ../../include/items.php:1084 msgid "Visible to anybody in this network." msgstr "" -#: ../../include/items.php:1158 +#: ../../include/items.php:1086 msgid "Visible to anybody authenticated." msgstr "" -#: ../../include/items.php:1160 +#: ../../include/items.php:1088 #, php-format msgid "Visible to anybody on %s." msgstr "" -#: ../../include/items.php:1162 +#: ../../include/items.php:1090 msgid "Visible to all connections." msgstr "" -#: ../../include/items.php:1164 +#: ../../include/items.php:1092 msgid "Visible to approved connections." msgstr "" -#: ../../include/items.php:1166 +#: ../../include/items.php:1094 msgid "Visible to specific connections." msgstr "" -#: ../../include/items.php:3960 +#: ../../include/items.php:3899 msgid "Privacy group is empty." msgstr "" -#: ../../include/items.php:3967 +#: ../../include/items.php:3906 #, php-format msgid "Privacy group: %s" msgstr "" -#: ../../include/items.php:3979 +#: ../../include/items.php:3918 msgid "Connection not found." msgstr "" -#: ../../include/items.php:4332 +#: ../../include/items.php:4271 msgid "profile photo" msgstr "" -#: ../../include/items.php:4528 +#: ../../include/items.php:4467 #, php-format msgid "[Edited %s]" msgstr "" -#: ../../include/items.php:4528 +#: ../../include/items.php:4467 msgctxt "edit_activity" msgid "Post" msgstr "" -#: ../../include/items.php:4528 +#: ../../include/items.php:4467 msgctxt "edit_activity" msgid "Comment" msgstr "" -#: ../../include/zot.php:705 -msgid "Invalid data packet" -msgstr "" - -#: ../../include/zot.php:721 -msgid "Unable to verify channel signature" -msgstr "" - -#: ../../include/zot.php:2336 -#, php-format -msgid "Unable to verify site signature for %s" -msgstr "" - -#: ../../include/zot.php:3721 -msgid "invalid target signature" -msgstr "" - #: ../../include/auth.php:148 msgid "Logged out." msgstr "" @@ -11974,286 +12310,133 @@ msgstr "" msgid "%1$s has an updated %2$s, changing %3$s." msgstr "" -#: ../../include/text.php:459 -msgid "prev" -msgstr "" - -#: ../../include/text.php:461 -msgid "first" -msgstr "" - -#: ../../include/text.php:490 -msgid "last" -msgstr "" - -#: ../../include/text.php:493 -msgid "next" +#: ../../include/attach.php:248 ../../include/attach.php:336 +msgid "Item was not found." msgstr "" -#: ../../include/text.php:504 -msgid "older" +#: ../../include/attach.php:497 +msgid "No source file." msgstr "" -#: ../../include/text.php:506 -msgid "newer" +#: ../../include/attach.php:519 +msgid "Cannot locate file to replace" msgstr "" -#: ../../include/text.php:911 -msgid "No connections" +#: ../../include/attach.php:537 +msgid "Cannot locate file to revise/update" msgstr "" -#: ../../include/text.php:936 +#: ../../include/attach.php:668 #, php-format -msgid "View all %s connections" -msgstr "" - -#: ../../include/text.php:1081 ../../include/text.php:1086 -msgid "poke" -msgstr "" - -#: ../../include/text.php:1081 ../../include/text.php:1086 -#: ../../include/conversation.php:243 -msgid "poked" -msgstr "" - -#: ../../include/text.php:1087 -msgid "ping" -msgstr "" - -#: ../../include/text.php:1087 -msgid "pinged" -msgstr "" - -#: ../../include/text.php:1088 -msgid "prod" -msgstr "" - -#: ../../include/text.php:1088 -msgid "prodded" -msgstr "" - -#: ../../include/text.php:1089 -msgid "slap" -msgstr "" - -#: ../../include/text.php:1089 -msgid "slapped" -msgstr "" - -#: ../../include/text.php:1090 -msgid "finger" -msgstr "" - -#: ../../include/text.php:1090 -msgid "fingered" -msgstr "" - -#: ../../include/text.php:1091 -msgid "rebuff" -msgstr "" - -#: ../../include/text.php:1091 -msgid "rebuffed" -msgstr "" - -#: ../../include/text.php:1103 -msgid "happy" -msgstr "" - -#: ../../include/text.php:1104 -msgid "sad" -msgstr "" - -#: ../../include/text.php:1105 -msgid "mellow" -msgstr "" - -#: ../../include/text.php:1106 -msgid "tired" -msgstr "" - -#: ../../include/text.php:1107 -msgid "perky" -msgstr "" - -#: ../../include/text.php:1108 -msgid "angry" -msgstr "" - -#: ../../include/text.php:1109 -msgid "stupefied" -msgstr "" - -#: ../../include/text.php:1110 -msgid "puzzled" -msgstr "" - -#: ../../include/text.php:1111 -msgid "interested" -msgstr "" - -#: ../../include/text.php:1112 -msgid "bitter" -msgstr "" - -#: ../../include/text.php:1113 -msgid "cheerful" -msgstr "" - -#: ../../include/text.php:1114 -msgid "alive" -msgstr "" - -#: ../../include/text.php:1115 -msgid "annoyed" -msgstr "" - -#: ../../include/text.php:1116 -msgid "anxious" -msgstr "" - -#: ../../include/text.php:1117 -msgid "cranky" -msgstr "" - -#: ../../include/text.php:1118 -msgid "disturbed" -msgstr "" - -#: ../../include/text.php:1119 -msgid "frustrated" -msgstr "" - -#: ../../include/text.php:1120 -msgid "depressed" -msgstr "" - -#: ../../include/text.php:1121 -msgid "motivated" -msgstr "" - -#: ../../include/text.php:1122 -msgid "relaxed" -msgstr "" - -#: ../../include/text.php:1123 -msgid "surprised" -msgstr "" - -#: ../../include/text.php:1314 -msgid "May" -msgstr "" - -#: ../../include/text.php:1391 ../../include/text.php:1395 -msgid "Unknown Attachment" -msgstr "" - -#: ../../include/text.php:1397 -msgid "unknown" +msgid "File exceeds size limit of %d" msgstr "" -#: ../../include/text.php:1433 -msgid "remove category" +#: ../../include/attach.php:682 +#, php-format +msgid "You have reached your limit of %1$.0f Mbytes attachment storage." msgstr "" -#: ../../include/text.php:1510 -msgid "remove from file" +#: ../../include/attach.php:852 +msgid "File upload failed. Possible system limit or action terminated." msgstr "" -#: ../../include/text.php:1814 ../../include/language.php:367 -msgid "default" +#: ../../include/attach.php:865 +msgid "Stored file could not be verified. Upload failed." msgstr "" -#: ../../include/text.php:1822 -msgid "Page layout" +#: ../../include/attach.php:920 ../../include/attach.php:936 +msgid "Path not available." msgstr "" -#: ../../include/text.php:1822 -msgid "You can create your own with the layouts tool" +#: ../../include/attach.php:982 ../../include/attach.php:1140 +msgid "Empty pathname" msgstr "" -#: ../../include/text.php:1864 -msgid "Page content type" +#: ../../include/attach.php:1008 +msgid "duplicate filename or path" msgstr "" -#: ../../include/text.php:1997 -msgid "activity" +#: ../../include/attach.php:1030 +msgid "Path not found." msgstr "" -#: ../../include/text.php:2308 -msgid "Design Tools" +#: ../../include/attach.php:1094 +msgid "mkdir failed." msgstr "" -#: ../../include/text.php:2314 -msgid "Pages" +#: ../../include/attach.php:1098 +msgid "database storage failed." msgstr "" -#: ../../include/text.php:2336 -msgid "Import website..." +#: ../../include/attach.php:1146 +msgid "Empty path" msgstr "" -#: ../../include/text.php:2337 -msgid "Select folder to import" +#: ../../include/event.php:22 ../../include/event.php:69 +#: ../../include/bb2diaspora.php:496 +msgid "l F d, Y \\@ g:i A" msgstr "" -#: ../../include/text.php:2338 -msgid "Import from a zipped folder:" +#: ../../include/event.php:30 ../../include/event.php:73 +#: ../../include/bb2diaspora.php:502 +msgid "Starts:" msgstr "" -#: ../../include/text.php:2339 -msgid "Import from cloud files:" +#: ../../include/event.php:40 ../../include/event.php:77 +#: ../../include/bb2diaspora.php:510 +msgid "Finishes:" msgstr "" -#: ../../include/text.php:2340 -msgid "/cloud/channel/path/to/folder" +#: ../../include/event.php:824 +msgid "This event has been added to your calendar." msgstr "" -#: ../../include/text.php:2341 -msgid "Enter path to website files" +#: ../../include/event.php:1024 +msgid "Not specified" msgstr "" -#: ../../include/text.php:2342 -msgid "Select folder" +#: ../../include/event.php:1025 +msgid "Needs Action" msgstr "" -#: ../../include/text.php:2343 -msgid "Export website..." +#: ../../include/event.php:1026 +msgid "Completed" msgstr "" -#: ../../include/text.php:2344 -msgid "Export to a zip file" +#: ../../include/event.php:1027 +msgid "In Process" msgstr "" -#: ../../include/text.php:2345 -msgid "website.zip" +#: ../../include/event.php:1028 +msgid "Cancelled" msgstr "" -#: ../../include/text.php:2346 -msgid "Enter a name for the zip file." +#: ../../include/follow.php:27 +msgid "Channel is blocked on this site." msgstr "" -#: ../../include/text.php:2347 -msgid "Export to cloud files" +#: ../../include/follow.php:32 +msgid "Channel location missing." msgstr "" -#: ../../include/text.php:2348 -msgid "/path/to/export/folder" +#: ../../include/follow.php:80 +msgid "Response from remote channel was incomplete." msgstr "" -#: ../../include/text.php:2349 -msgid "Enter a path to a cloud files destination." +#: ../../include/follow.php:97 +msgid "Channel was deleted and no longer exists." msgstr "" -#: ../../include/text.php:2350 -msgid "Specify folder" +#: ../../include/follow.php:147 ../../include/follow.php:183 +msgid "Protocol disabled." msgstr "" -#: ../../include/bb2diaspora.php:401 -msgid "Attachments:" +#: ../../include/follow.php:171 +msgid "Channel discovery failed." msgstr "" -#: ../../include/bb2diaspora.php:492 -msgid "$Projectname event notification:" +#: ../../include/follow.php:210 +msgid "Cannot connect to yourself." msgstr "" #: ../../include/group.php:26 @@ -12287,62 +12470,39 @@ msgstr "" msgid "add" msgstr "" -#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249 -msgid "Tags" -msgstr "" - -#: ../../include/taxonomy.php:293 -msgid "Keywords" -msgstr "" - -#: ../../include/taxonomy.php:314 -msgid "have" -msgstr "" - -#: ../../include/taxonomy.php:314 -msgid "has" -msgstr "" - -#: ../../include/taxonomy.php:315 -msgid "want" -msgstr "" - -#: ../../include/taxonomy.php:315 -msgid "wants" -msgstr "" - -#: ../../include/taxonomy.php:316 -msgid "likes" +#: ../../include/language.php:380 +msgid "Select an alternate language" msgstr "" -#: ../../include/taxonomy.php:317 -msgid "dislikes" +#: ../../include/photos.php:115 +#, php-format +msgid "Image exceeds website size limit of %lu bytes" msgstr "" -#: ../../include/oembed.php:312 -msgid " by " +#: ../../include/photos.php:122 +msgid "Image file is empty." msgstr "" -#: ../../include/oembed.php:313 -msgid " on " +#: ../../include/photos.php:260 +msgid "Photo storage failed." msgstr "" -#: ../../include/oembed.php:342 -msgid "Embedded content" +#: ../../include/photos.php:300 +msgid "a new photo" msgstr "" -#: ../../include/oembed.php:351 -msgid "Embedding disabled" +#: ../../include/photos.php:304 +#, php-format +msgctxt "photo_upload" +msgid "%1$s posted %2$s to %3$s" msgstr "" -#: ../../include/security.php:117 -msgid "guest:" +#: ../../include/photos.php:507 ../../include/conversation.php:1695 +msgid "Photo Albums" msgstr "" -#: ../../include/security.php:535 -msgid "" -"The form security token was not correct. This probably happened because the " -"form has been opened for too long (>3 hours) before submitting it." +#: ../../include/photos.php:511 +msgid "Upload New Photos" msgstr "" #: ../../include/widgets.php:103 @@ -12470,8 +12630,8 @@ msgstr "" msgid "Import Calendar" msgstr "" -#: ../../include/widgets.php:883 ../../include/conversation.php:1723 -#: ../../include/conversation.php:1726 +#: ../../include/widgets.php:883 ../../include/conversation.php:1722 +#: ../../include/conversation.php:1725 msgid "Chatrooms" msgstr "" @@ -12483,70 +12643,191 @@ msgstr "" msgid "Chat Members" msgstr "" -#: ../../include/widgets.php:916 +#: ../../include/widgets.php:960 msgid "Wiki List" msgstr "" -#: ../../include/widgets.php:954 +#: ../../include/widgets.php:968 +msgid "Create new wiki" +msgstr "" + +#: ../../include/widgets.php:978 +msgid "Send notification" +msgstr "" + +#: ../../include/widgets.php:1014 msgid "Wiki Pages" msgstr "" -#: ../../include/widgets.php:989 -msgid "Bookmarked Chatrooms" +#: ../../include/widgets.php:1019 +msgid "Add new page" msgstr "" #: ../../include/widgets.php:1020 +msgid "Page name" +msgstr "" + +#: ../../include/widgets.php:1052 +msgid "Bookmarked Chatrooms" +msgstr "" + +#: ../../include/widgets.php:1083 msgid "Suggested Chatrooms" msgstr "" -#: ../../include/widgets.php:1165 ../../include/widgets.php:1277 +#: ../../include/widgets.php:1228 ../../include/widgets.php:1340 msgid "photo/image" msgstr "" -#: ../../include/widgets.php:1220 +#: ../../include/widgets.php:1283 msgid "Click to show more" msgstr "" -#: ../../include/widgets.php:1371 +#: ../../include/widgets.php:1434 msgid "Rating Tools" msgstr "" -#: ../../include/widgets.php:1375 ../../include/widgets.php:1377 +#: ../../include/widgets.php:1438 ../../include/widgets.php:1440 msgid "Rate Me" msgstr "" -#: ../../include/widgets.php:1380 +#: ../../include/widgets.php:1443 msgid "View Ratings" msgstr "" -#: ../../include/widgets.php:1464 +#: ../../include/widgets.php:1527 msgid "Forums" msgstr "" -#: ../../include/widgets.php:1493 +#: ../../include/widgets.php:1556 msgid "Tasks" msgstr "" -#: ../../include/widgets.php:1504 +#: ../../include/widgets.php:1567 msgid "Documentation" msgstr "" -#: ../../include/widgets.php:1560 ../../include/widgets.php:1598 +#: ../../include/widgets.php:1623 ../../include/widgets.php:1661 msgid "Member registrations waiting for confirmation" msgstr "" -#: ../../include/widgets.php:1566 +#: ../../include/widgets.php:1629 msgid "Inspect queue" msgstr "" -#: ../../include/widgets.php:1568 +#: ../../include/widgets.php:1631 msgid "DB updates" msgstr "" -#: ../../include/widgets.php:1594 +#: ../../include/widgets.php:1657 msgid "Plugin Features" msgstr "" +#: ../../include/acl_selectors.php:198 +msgid "Who can see this?" +msgstr "" + +#: ../../include/acl_selectors.php:199 +msgid "Custom selection" +msgstr "" + +#: ../../include/acl_selectors.php:200 +msgid "" +"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit " +"the scope of \"Show\"." +msgstr "" + +#: ../../include/acl_selectors.php:201 +msgid "Show" +msgstr "" + +#: ../../include/acl_selectors.php:202 +msgid "Don't show" +msgstr "" + +#: ../../include/acl_selectors.php:235 +#, php-format +msgid "" +"Post permissions %s cannot be changed %s after a post is shared.</br />These " +"permissions set who is allowed to view the post." +msgstr "" + +#: ../../include/oembed.php:312 +msgid " by " +msgstr "" + +#: ../../include/oembed.php:313 +msgid " on " +msgstr "" + +#: ../../include/oembed.php:342 +msgid "Embedded content" +msgstr "" + +#: ../../include/oembed.php:351 +msgid "Embedding disabled" +msgstr "" + +#: ../../include/bb2diaspora.php:401 +msgid "Attachments:" +msgstr "" + +#: ../../include/bb2diaspora.php:498 +msgid "$Projectname event notification:" +msgstr "" + +#: ../../include/permissions.php:35 +msgid "Can view my normal stream and posts" +msgstr "" + +#: ../../include/permissions.php:39 +msgid "Can view my webpages" +msgstr "" + +#: ../../include/permissions.php:43 +msgid "Can post on my channel page (\"wall\")" +msgstr "" + +#: ../../include/permissions.php:46 +msgid "Can like/dislike stuff" +msgstr "" + +#: ../../include/permissions.php:46 +msgid "Profiles and things other than posts/comments" +msgstr "" + +#: ../../include/permissions.php:48 +msgid "Can forward to all my channel contacts via post @mentions" +msgstr "" + +#: ../../include/permissions.php:48 +msgid "Advanced - useful for creating group forum channels" +msgstr "" + +#: ../../include/permissions.php:49 +msgid "Can chat with me (when available)" +msgstr "" + +#: ../../include/permissions.php:50 +msgid "Can write to my file storage and photos" +msgstr "" + +#: ../../include/permissions.php:51 +msgid "Can edit my webpages" +msgstr "" + +#: ../../include/permissions.php:53 +msgid "Somewhat advanced - very useful in open communities" +msgstr "" + +#: ../../include/permissions.php:55 +msgid "Can administer my channel resources" +msgstr "" + +#: ../../include/permissions.php:55 +msgid "Extremely advanced. Leave this alone unless you know what you are doing" +msgstr "" + #: ../../include/conversation.php:204 #, php-format msgid "%1$s is now connected with %2$s" @@ -12755,305 +13036,83 @@ msgstr "" msgid "Posts flagged as SPAM" msgstr "" -#: ../../include/conversation.php:1675 +#: ../../include/conversation.php:1674 msgid "Status Messages and Posts" msgstr "" -#: ../../include/conversation.php:1684 +#: ../../include/conversation.php:1683 msgid "About" msgstr "" -#: ../../include/conversation.php:1687 +#: ../../include/conversation.php:1686 msgid "Profile Details" msgstr "" -#: ../../include/conversation.php:1703 +#: ../../include/conversation.php:1702 msgid "Files and Storage" msgstr "" -#: ../../include/conversation.php:1739 +#: ../../include/conversation.php:1738 msgid "Saved Bookmarks" msgstr "" -#: ../../include/conversation.php:1749 +#: ../../include/conversation.php:1748 msgid "Manage Webpages" msgstr "" -#: ../../include/conversation.php:1814 +#: ../../include/conversation.php:1813 msgctxt "noun" msgid "Attending" msgid_plural "Attending" msgstr[0] "" msgstr[1] "" -#: ../../include/conversation.php:1817 +#: ../../include/conversation.php:1816 msgctxt "noun" msgid "Not Attending" msgid_plural "Not Attending" msgstr[0] "" msgstr[1] "" -#: ../../include/conversation.php:1820 +#: ../../include/conversation.php:1819 msgctxt "noun" msgid "Undecided" msgid_plural "Undecided" msgstr[0] "" msgstr[1] "" -#: ../../include/conversation.php:1823 +#: ../../include/conversation.php:1822 msgctxt "noun" msgid "Agree" msgid_plural "Agrees" msgstr[0] "" msgstr[1] "" -#: ../../include/conversation.php:1826 +#: ../../include/conversation.php:1825 msgctxt "noun" msgid "Disagree" msgid_plural "Disagrees" msgstr[0] "" msgstr[1] "" -#: ../../include/conversation.php:1829 +#: ../../include/conversation.php:1828 msgctxt "noun" msgid "Abstain" msgid_plural "Abstains" msgstr[0] "" msgstr[1] "" -#: ../../include/permissions.php:35 -msgid "Can view my normal stream and posts" -msgstr "" - -#: ../../include/permissions.php:39 -msgid "Can view my webpages" -msgstr "" - -#: ../../include/permissions.php:43 -msgid "Can post on my channel page (\"wall\")" -msgstr "" - -#: ../../include/permissions.php:46 -msgid "Can like/dislike stuff" -msgstr "" - -#: ../../include/permissions.php:46 -msgid "Profiles and things other than posts/comments" -msgstr "" - -#: ../../include/permissions.php:48 -msgid "Can forward to all my channel contacts via post @mentions" -msgstr "" - -#: ../../include/permissions.php:48 -msgid "Advanced - useful for creating group forum channels" -msgstr "" - -#: ../../include/permissions.php:49 -msgid "Can chat with me (when available)" -msgstr "" - -#: ../../include/permissions.php:50 -msgid "Can write to my file storage and photos" -msgstr "" - -#: ../../include/permissions.php:51 -msgid "Can edit my webpages" -msgstr "" - -#: ../../include/permissions.php:53 -msgid "Somewhat advanced - very useful in open communities" -msgstr "" - -#: ../../include/permissions.php:55 -msgid "Can administer my channel resources" -msgstr "" - -#: ../../include/permissions.php:55 -msgid "Extremely advanced. Leave this alone unless you know what you are doing" -msgstr "" - -#: ../../include/account.php:35 -msgid "Not a valid email address" -msgstr "" - -#: ../../include/account.php:37 -msgid "Your email domain is not among those allowed on this site" -msgstr "" - -#: ../../include/account.php:43 -msgid "Your email address is already registered at this site." -msgstr "" - -#: ../../include/account.php:75 -msgid "An invitation is required." -msgstr "" - -#: ../../include/account.php:79 -msgid "Invitation could not be verified." -msgstr "" - -#: ../../include/account.php:130 -msgid "Please enter the required information." -msgstr "" - -#: ../../include/account.php:198 -msgid "Failed to store account information." -msgstr "" - -#: ../../include/account.php:263 -#, php-format -msgid "Registration confirmation for %s" -msgstr "" - -#: ../../include/account.php:330 -#, php-format -msgid "Registration request at %s" -msgstr "" - -#: ../../include/account.php:352 -msgid "your registration password" -msgstr "" - -#: ../../include/account.php:358 ../../include/account.php:420 -#, php-format -msgid "Registration details for %s" -msgstr "" - -#: ../../include/account.php:431 -msgid "Account approved." -msgstr "" - -#: ../../include/account.php:471 -#, php-format -msgid "Registration revoked for %s" -msgstr "" - -#: ../../include/account.php:756 ../../include/account.php:758 -msgid "Click here to upgrade." -msgstr "" - -#: ../../include/account.php:764 -msgid "This action exceeds the limits set by your subscription plan." -msgstr "" - -#: ../../include/account.php:769 -msgid "This action is not available under your subscription plan." -msgstr "" - -#: ../../include/datetime.php:147 -msgid "Birthday" -msgstr "" - -#: ../../include/datetime.php:149 -msgid "Age: " -msgstr "" - -#: ../../include/datetime.php:151 -msgid "YYYY-MM-DD or MM-DD" -msgstr "" - -#: ../../include/datetime.php:286 ../../boot.php:2554 -msgid "never" -msgstr "" - -#: ../../include/datetime.php:292 -msgid "less than a second ago" -msgstr "" - -#: ../../include/datetime.php:310 -#, php-format -msgctxt "e.g. 22 hours ago, 1 minute ago" -msgid "%1$d %2$s ago" -msgstr "" - -#: ../../include/datetime.php:321 -msgctxt "relative_date" -msgid "year" -msgid_plural "years" -msgstr[0] "" -msgstr[1] "" - -#: ../../include/datetime.php:324 -msgctxt "relative_date" -msgid "month" -msgid_plural "months" -msgstr[0] "" -msgstr[1] "" - -#: ../../include/datetime.php:327 -msgctxt "relative_date" -msgid "week" -msgid_plural "weeks" -msgstr[0] "" -msgstr[1] "" - -#: ../../include/datetime.php:330 -msgctxt "relative_date" -msgid "day" -msgid_plural "days" -msgstr[0] "" -msgstr[1] "" - -#: ../../include/datetime.php:333 -msgctxt "relative_date" -msgid "hour" -msgid_plural "hours" -msgstr[0] "" -msgstr[1] "" - -#: ../../include/datetime.php:336 -msgctxt "relative_date" -msgid "minute" -msgid_plural "minutes" -msgstr[0] "" -msgstr[1] "" - -#: ../../include/datetime.php:339 -msgctxt "relative_date" -msgid "second" -msgid_plural "seconds" -msgstr[0] "" -msgstr[1] "" - -#: ../../include/datetime.php:576 -#, php-format -msgid "%1$s's birthday" -msgstr "" - -#: ../../include/datetime.php:577 -#, php-format -msgid "Happy Birthday %1$s" -msgstr "" - -#: ../../include/language.php:380 -msgid "Select an alternate language" -msgstr "" - -#: ../../include/import.php:30 -msgid "" -"Cannot create a duplicate channel identifier on this system. Import failed." -msgstr "" - -#: ../../include/import.php:90 -msgid "Channel clone failed. Import failed." -msgstr "" - -#: ../../include/import.php:1354 -msgid "Unable to import element \"" -msgstr "" - -#: ../../include/bbcode.php:134 ../../include/bbcode.php:901 -#: ../../include/bbcode.php:904 ../../include/bbcode.php:909 -#: ../../include/bbcode.php:912 ../../include/bbcode.php:915 -#: ../../include/bbcode.php:918 ../../include/bbcode.php:923 -#: ../../include/bbcode.php:926 ../../include/bbcode.php:931 -#: ../../include/bbcode.php:934 ../../include/bbcode.php:937 -#: ../../include/bbcode.php:940 +#: ../../include/bbcode.php:134 ../../include/bbcode.php:960 +#: ../../include/bbcode.php:963 ../../include/bbcode.php:968 +#: ../../include/bbcode.php:971 ../../include/bbcode.php:974 +#: ../../include/bbcode.php:977 ../../include/bbcode.php:982 +#: ../../include/bbcode.php:985 ../../include/bbcode.php:990 +#: ../../include/bbcode.php:993 ../../include/bbcode.php:996 +#: ../../include/bbcode.php:999 msgid "Image/photo" msgstr "" -#: ../../include/bbcode.php:173 ../../include/bbcode.php:951 +#: ../../include/bbcode.php:173 ../../include/bbcode.php:1010 msgid "Encrypted content" msgstr "" @@ -13082,7 +13141,7 @@ msgstr "" msgid "spoiler" msgstr "" -#: ../../include/bbcode.php:889 +#: ../../include/bbcode.php:948 msgid "$1 wrote:" msgstr "" @@ -13218,66 +13277,66 @@ msgstr "" msgid "Set size of followup author photos" msgstr "" -#: ../../boot.php:1171 +#: ../../boot.php:1175 #, php-format msgctxt "opensearch" msgid "Search %1$s (%2$s)" msgstr "" -#: ../../boot.php:1171 +#: ../../boot.php:1175 msgctxt "opensearch" msgid "$Projectname" msgstr "" -#: ../../boot.php:1489 +#: ../../boot.php:1493 #, php-format msgid "Update %s failed. See error logs." msgstr "" -#: ../../boot.php:1492 +#: ../../boot.php:1496 #, php-format msgid "Update Error at %s" msgstr "" -#: ../../boot.php:1696 +#: ../../boot.php:1700 msgid "" "Create an account to access services and applications within the Hubzilla" msgstr "" -#: ../../boot.php:1717 +#: ../../boot.php:1721 msgid "Login/Email" msgstr "" -#: ../../boot.php:1718 +#: ../../boot.php:1722 msgid "Password" msgstr "" -#: ../../boot.php:1719 +#: ../../boot.php:1723 msgid "Remember me" msgstr "" -#: ../../boot.php:1722 +#: ../../boot.php:1726 msgid "Forgot your password?" msgstr "" -#: ../../boot.php:2291 +#: ../../boot.php:2287 msgid "toggle mobile" msgstr "" -#: ../../boot.php:2446 +#: ../../boot.php:2442 msgid "Website SSL certificate is not valid. Please correct." msgstr "" -#: ../../boot.php:2449 +#: ../../boot.php:2445 #, php-format msgid "[hubzilla] Website SSL error for %s" msgstr "" -#: ../../boot.php:2553 +#: ../../boot.php:2562 msgid "Cron/Scheduled tasks not running." msgstr "" -#: ../../boot.php:2557 +#: ../../boot.php:2566 #, php-format msgid "[hubzilla] Cron tasks not running on %s" msgstr "" diff --git a/view/css/mod_wiki.css b/view/css/mod_wiki.css new file mode 100644 index 000000000..b29957090 --- /dev/null +++ b/view/css/mod_wiki.css @@ -0,0 +1,45 @@ +#ace-editor { + position: relative; + width: 100%; + height: 500px; +} + +#editor { + width: 100%; + height: 500px; +} + +.fade.in { + -webkit-transition: opacity 0.5s 0.5s ease; + -moz-transition: opacity 0.5s 0.5s ease; + -o-transition: opacity 0.5s 0.5s ease; + transition: opacity 0.5s 0.5s ease; +} + +#new-wiki-form-wrapper { + display: none; +} + +#wikis-index { + width: 100%; +} + +#wikis-index th:nth-child(1), +#wikis-index td:nth-child(1){ + padding: 7px 3px 7px 10px; +} + +#wikis-index th:nth-child(2), +#wikis-index td:nth-child(2){ + padding: 7px 10px 7px 7px; +} + +#wikis-index th:nth-child(3), +#wikis-index td:nth-child(3){ + padding: 7px 10px 7px 7px; +} + +.wikis-index-tool { + padding: 7px 10px; +} + diff --git a/view/css/widgets.css b/view/css/widgets.css index 10c66c213..402c3f473 100644 --- a/view/css/widgets.css +++ b/view/css/widgets.css @@ -18,6 +18,41 @@ word-wrap: break-word; } +.widget-nav-pills-icons { + opacity: 0; + padding: 6px 10px; + float: right; + position: relative; + z-index:1; +} + + +.widget-nav-pills-checkbox { + padding: 6px 10px; + float: right; + position: relative; + z-index:1; + cursor: pointer; +} + +i.widget-nav-pills-icons, +i.widget-nav-pills-checkbox { + margin-top: 2px; +} + +.widget-nav-pills-icons:hover + a { + background-color: #eee; +} + +.widget-nav-pills-checkbox:hover + a { + background-color: #eee; +} + +li:hover .widget-nav-pills-icons { + opacity: 1; +} + + /* suggest */ .suggest-widget-more { diff --git a/view/js/autocomplete.js b/view/js/autocomplete.js index aa47a6e19..62fc37420 100644 --- a/view/js/autocomplete.js +++ b/view/js/autocomplete.js @@ -164,6 +164,7 @@ function string2bb(element) { else if(element == 'strike') return 's'; else if(element == 'superscript') return 'sup'; else if(element == 'subscript') return 'sub'; + else if(element == 'highlight') return 'hl'; else return element; } @@ -269,7 +270,7 @@ function string2bb(element) { $.fn.bbco_autocomplete = function(type) { if(type=='bbcode') { - var open_close_elements = ['bold', 'italic', 'underline', 'overline', 'strike', 'superscript', 'subscript', 'quote', 'code', 'open', 'spoiler', 'map', 'nobb', 'list', 'checklist', 'ul', 'ol', 'dl', 'li', 'table', 'tr', 'th', 'td', 'center', 'color', 'font', 'size', 'zrl', 'zmg', 'rpost', 'qr', 'observer', 'embed']; + var open_close_elements = ['bold', 'italic', 'underline', 'overline', 'strike', 'superscript', 'subscript', 'quote', 'code', 'open', 'spoiler', 'map', 'nobb', 'list', 'checklist', 'ul', 'ol', 'dl', 'li', 'table', 'tr', 'th', 'td', 'center', 'color', 'font', 'size', 'zrl', 'zmg', 'rpost', 'qr', 'observer', 'embed', 'highlight']; var open_elements = ['observer.baseurl', 'observer.address', 'observer.photo', 'observer.name', 'observer.webname', 'observer.url', '*', 'hr', ]; var elements = open_close_elements.concat(open_elements); diff --git a/view/js/main.js b/view/js/main.js index 96adf0be3..e78725931 100644 --- a/view/js/main.js +++ b/view/js/main.js @@ -444,16 +444,18 @@ function contextualHelp() { } function contextualHelpFocus(target, openSidePanel) { - if (openSidePanel) { - $("main").addClass('region_1-on'); // Open the side panel to highlight element - } - else { - $("main").removeClass('region_1-on'); - } - $('html,body').animate({ scrollTop: $(target).offset().top - $('nav').outerHeight(true) - $('#contextual-help-content').outerHeight(true)}, 'slow'); - for (i = 0; i < 3; i++) { - $(target).fadeTo('slow', 0.1).fadeTo('slow', 1.0); - } + if($(target).length) { + if (openSidePanel) { + $("main").addClass('region_1-on'); // Open the side panel to highlight element + } + else { + $("main").removeClass('region_1-on'); + } + $('html,body').animate({ scrollTop: $(target).offset().top - $('nav').outerHeight(true) - $('#contextual-help-content').outerHeight(true)}, 'slow'); + for (i = 0; i < 3; i++) { + $(target).fadeTo('slow', 0.1).fadeTo('slow', 1.0); + } + } } function updatePageItems(mode, data) { diff --git a/view/pdl/mod_wiki.pdl b/view/pdl/mod_wiki.pdl index 76ed1c70c..052ae61a1 100644 --- a/view/pdl/mod_wiki.pdl +++ b/view/pdl/mod_wiki.pdl @@ -1,4 +1,4 @@ [region=aside] -[widget=wiki_list][/widget] +[widget=vcard][/widget] [widget=wiki_pages][/widget] [/region] diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css index f71fe8ea8..2f3da7542 100644 --- a/view/theme/redbasic/css/style.css +++ b/view/theme/redbasic/css/style.css @@ -1649,6 +1649,7 @@ main.fullscreen .section-content-wrapper-np { .atoken-index-row:hover td, .chatroom-index-row:hover td, +.wikis-index-row:hover td, .locs-index-row:hover td, [id^="cloud-index-"]:hover td, .cloud-index-active { @@ -2037,5 +2038,16 @@ dl.bb-dl > dd > li { .sub-menu { margin-top: 10px; padding-left: 15px; - border-left: 3px solid #ccc; + border-left: 3px solid #eee; +} + +.nav-pills-stacked-icons { + padding: 6px 10px; + float: right; + position: relative; + z-index:1; +} + +.nav-pills-stacked-icons:hover + a { + background-color: #eee; } diff --git a/view/tpl/abook_edit.tpl b/view/tpl/abook_edit.tpl index 835948096..2e02de33b 100755 --- a/view/tpl/abook_edit.tpl +++ b/view/tpl/abook_edit.tpl @@ -1,21 +1,33 @@ <div class="generic-content-wrapper"> <div class="section-title-wrapper"> {{if $notself}} - <div class="dropdown pull-right"> - <button id="connection-dropdown" class="btn btn-default btn-xs" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> - <i class="fa fa-caret-down"></i> {{$tools_label}} - </button> - <ul class="dropdown-menu" aria-labelledby="dLabel"> - <li><a href="{{$tools.view.url}}" title="{{$tools.view.title}}">{{$tools.view.label}}</a></li> - <li><a href="{{$tools.recent.url}}" title="{{$tools.recent.title}}">{{$tools.recent.label}}</a></li> - <li class="divider"></li> - <li><a href="#" title="{{$tools.refresh.title}}" onclick="window.location.href='{{$tools.refresh.url}}'; return false;">{{$tools.refresh.label}}</a></li> - <li><a href="#" title="{{$tools.block.title}}" onclick="window.location.href='{{$tools.block.url}}'; return false;">{{$tools.block.label}}</a></li> - <li><a href="#" title="{{$tools.ignore.title}}" onclick="window.location.href='{{$tools.ignore.url}}'; return false;">{{$tools.ignore.label}}</a></li> - <li><a href="#" title="{{$tools.archive.title}}" onclick="window.location.href='{{$tools.archive.url}}'; return false;">{{$tools.archive.label}}</a></li> - <li><a href="#" title="{{$tools.hide.title}}" onclick="window.location.href='{{$tools.hide.url}}'; return false;">{{$tools.hide.label}}</a></li> - <li><a href="#" title="{{$tools.delete.title}}" onclick="window.location.href='{{$tools.delete.url}}'; return false;">{{$tools.delete.label}}</a></li> - </ul> + <div class="pull-right"> + <div class="btn-group"> + <button id="connection-dropdown" class="btn btn-default btn-xs dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + <i class="fa fa-caret-down"></i> {{$tools_label}} + </button> + <ul class="dropdown-menu dropdown-menu-right" aria-labelledby="dLabel"> + <li><a href="{{$tools.view.url}}" title="{{$tools.view.title}}">{{$tools.view.label}}</a></li> + <li><a href="{{$tools.recent.url}}" title="{{$tools.recent.title}}">{{$tools.recent.label}}</a></li> + <li class="divider"></li> + <li><a href="#" title="{{$tools.refresh.title}}" onclick="window.location.href='{{$tools.refresh.url}}'; return false;">{{$tools.refresh.label}}</a></li> + <li><a href="#" title="{{$tools.block.title}}" onclick="window.location.href='{{$tools.block.url}}'; return false;">{{$tools.block.label}}</a></li> + <li><a href="#" title="{{$tools.ignore.title}}" onclick="window.location.href='{{$tools.ignore.url}}'; return false;">{{$tools.ignore.label}}</a></li> + <li><a href="#" title="{{$tools.archive.title}}" onclick="window.location.href='{{$tools.archive.url}}'; return false;">{{$tools.archive.label}}</a></li> + <li><a href="#" title="{{$tools.hide.title}}" onclick="window.location.href='{{$tools.hide.url}}'; return false;">{{$tools.hide.label}}</a></li> + <li><a href="#" title="{{$tools.delete.title}}" onclick="window.location.href='{{$tools.delete.url}}'; return false;">{{$tools.delete.label}}</a></li> + </ul> + </div> + {{if $abook_prev || $abook_next}} + <div class="btn-group"> + {{if $abook_prev}} + <a href="connedit/{{$abook_prev}}{{if $section}}?f=§ion={{$section}}{{/if}}" class="btn btn-default btn-xs" ><i class="fa fa-backward"></i></a> + {{/if}} + {{if $abook_next}} + <a href="connedit/{{$abook_next}}{{if $section}}?f=§ion={{$section}}{{/if}}" class="btn btn-default btn-xs" ><i class="fa fa-forward"></i></a> + {{/if}} + </div> + {{/if}} </div> {{/if}} <h2>{{$header}}</h2> @@ -51,6 +63,7 @@ <form id="abook-edit-form" action="connedit/{{$contact_id}}" method="post" > <input type="hidden" name="contact_id" value="{{$contact_id}}"> + <input type="hidden" name="section" value="{{$section}}"> <div class="panel-group" id="contact-edit-tools" role="tablist" aria-multiselectable="true"> {{if $notself}} @@ -84,7 +97,7 @@ </a> </h3> </div> - <div id="affinity-tool-collapse" class="panel-collapse collapse{{if !$is_pending}} in{{/if}}" role="tabpanel" aria-labelledby="affinity-tool"> + <div id="affinity-tool-collapse" class="panel-collapse collapse{{if !$is_pending || $section == 'affinity'}} in{{/if}}" role="tabpanel" aria-labelledby="affinity-tool"> <div class="section-content-tools-wrapper"> {{if $slide}} <div class="form-group"><strong>{{$lbl_slider}}</strong></div> @@ -115,7 +128,7 @@ </a> </h3> </div> - <div id="fitert-tool-collapse" class="panel-collapse collapse{{if !$is_pending && !($slide || $multiprofs)}} in{{/if}}" role="tabpanel" aria-labelledby="fitert-tool"> + <div id="fitert-tool-collapse" class="panel-collapse collapse{{if ( !$is_pending && !($slide || $multiprofs)) || $section == 'filter' }} in{{/if}}" role="tabpanel" aria-labelledby="fitert-tool"> <div class="section-content-tools-wrapper"> {{include file="field_textarea.tpl" field=$incl}} {{include file="field_textarea.tpl" field=$excl}} @@ -169,7 +182,7 @@ </h3> </div> {{/if}} - <div id="perms-tool-collapse" class="panel-collapse collapse{{if $self}} in{{/if}}" role="tabpanel" aria-labelledby="perms-tool"> + <div id="perms-tool-collapse" class="panel-collapse collapse{{if $self || $section === 'perms'}} in{{/if}}" role="tabpanel" aria-labelledby="perms-tool"> <div class="section-content-tools-wrapper"> <div class="section-content-warning-wrapper"> {{if $notself}}{{$permnote}}{{/if}} diff --git a/view/tpl/admin_site.tpl b/view/tpl/admin_site.tpl index a5b32f08f..0bb3ceb15 100755 --- a/view/tpl/admin_site.tpl +++ b/view/tpl/admin_site.tpl @@ -49,6 +49,7 @@ {{/if}} {{include file="field_textarea.tpl" field=$banner}} + {{include file="field_textarea.tpl" field=$siteinfo}} {{include file="field_textarea.tpl" field=$admininfo}} {{include file="field_select.tpl" field=$language}} {{include file="field_select.tpl" field=$theme}} diff --git a/view/tpl/group_side.tpl b/view/tpl/group_side.tpl index e58cf060d..35f79a07e 100755 --- a/view/tpl/group_side.tpl +++ b/view/tpl/group_side.tpl @@ -5,12 +5,10 @@ {{foreach $groups as $group}} <li> {{if $group.cid}} - <a class="pull-right group-edit-tool fakelink" onclick="contactgroupChangeMember('{{$group.id}}','{{$group.enc_cid}}'); return true;"/> - <i id="group-{{$group.id}}" class="fa {{if $group.ismember}}fa-check-square-o{{else}}fa-square-o{{/if}}"></i> - </a> + <i id="group-{{$group.id}}" class="widget-nav-pills-checkbox fa {{if $group.ismember}}fa-check-square-o{{else}}fa-square-o{{/if}}" onclick="contactgroupChangeMember('{{$group.id}}','{{$group.enc_cid}}'); return true;"></i> {{/if}} {{if $group.edit}} - <a class="pull-right group-edit-tool" href="{{$group.edit.href}}" title="{{$edittext}}"><i class="group-edit-icon fa fa-pencil"></i></a> + <a href="{{$group.edit.href}}" class="widget-nav-pills-icons" title="{{$edittext}}"><i class="fa fa-pencil"></i></a> {{/if}} <a{{if $group.selected}} class="group-selected"{{/if}} href="{{$group.href}}">{{$group.text}}</a> </li> diff --git a/view/tpl/help.tpl b/view/tpl/help.tpl index 22180bda6..96d52e0e9 100644 --- a/view/tpl/help.tpl +++ b/view/tpl/help.tpl @@ -1,8 +1,8 @@ <div id="help-content" class="generic-content-wrapper"> - <div class="section-title-wrapper"> + <div class="section-title-wrapper" style="display: none;"> <h2>{{$title}}</h2> </div> - <div class="section-content-wrapper"> + <div class="section-content-wrapper" id="doco-content"> {{$content}} </div> </div> diff --git a/view/tpl/nav.tpl b/view/tpl/nav.tpl index a279789a1..bc1e64416 100755 --- a/view/tpl/nav.tpl +++ b/view/tpl/nav.tpl @@ -45,9 +45,10 @@ {{/if}} </ul> {{else}} - {{if $nav.lock}} + {{if $nav.rusermenu}} <ul class="dropdown-menu" role="menu" aria-labelledby="avatar"> - <li role="presentation"><a href="{{$nav.lock.0}}" title="{{$nav.lock.3}}" role="menuitem">{{$nav.lock.3}}</a></li> + <li role="presentation"><a href="{{$nav.rusermenu.0}}" role="menuitem">{{$nav.rusermenu.1}}</a></li> + <li role="presentation"><a href="{{$nav.rusermenu.2}}" role="menuitem">{{$nav.rusermenu.3}}</a></li> </ul> {{/if}} {{/if}} diff --git a/view/tpl/siteinfo.tpl b/view/tpl/siteinfo.tpl index e50284b9c..a5b99fd83 100755 --- a/view/tpl/siteinfo.tpl +++ b/view/tpl/siteinfo.tpl @@ -1,26 +1,41 @@ <div class="generic-content-wrapper-styled"> -<h3>{{$title}}</h3> -<p></p> -<p>{{$description}}</p> -{{if $version}} -<p>{{$version}}{{if $commit}}+{{$commit}}{{/if}}</p> +<h2>{{$title}}</h2> + +<h3>{{$sitenametxt}}</h3> + +<div>{{$sitename}}</div> + +<h3>{{$headline}}</h3> + +<div>{{if $site_about}}{{$site_about}}{{else}}--{{/if}}</div> + +<h3>{{$admin_headline}}</h3> + +<div>{{if $admin_about}}{{$admin_about}}{{else}}--{{/if}}</div> + +<br><br> +<div><a href="help/TermsOfService">{{$terms}}</a></div> + +<hr> + +<h2>{{$prj_header}}</h2> + +<div>{{$prj_name}} ({{$z_server_role}})</div> + +{{if $prj_version}} +<div>{{$prj_version}}</div> {{/if}} -{{if $tag}} -<p>{{$tag_txt}} {{$tag}}</p> -{{/if}} -{{if $polled}} -<p>{{$polled}} {{$lastpoll}}</p> -{{/if}} -<p>{{$load_average}} {{$loadavg_all}}</p> -<p>{{$web_location}}</p> -<p>{{$visit}}</p> -<p>{{$bug_text}} <a href="{{$bug_link_url}}">{{$bug_link_text}}</a></p> -<p>{{$adminlabel}}</p> -<p>{{$admininfo}}</p> -<p>{{$contact}}</p> -<p>{{$plugins_text}}</p> -{{if $plugins_list}} - <div style="margin-left: 25px; margin-right: 25px;">{{$plugins_list}}</div> -{{/if}} -<p>{{$donate}}</p> + + +<h3>{{$prj_linktxt}}</h3> + +<div>{{$prj_link}}</div> + +<h3>{{$prj_srctxt}}</h3> + +<div>{{$prj_src}}</div> + +<br><br> +<div>{{$prj_transport}} ({{$transport_link}})</div> + </div> diff --git a/view/tpl/wiki.tpl b/view/tpl/wiki.tpl index 4eefb3189..cf4144357 100644 --- a/view/tpl/wiki.tpl +++ b/view/tpl/wiki.tpl @@ -1,119 +1,86 @@ -<style type="text/css" media="screen"> - #ace-editor { - position: relative; - width: 100%; - height: 500px; - } - .fade.in { - -webkit-transition: opacity 0.5s 0.5s ease; - -moz-transition: opacity 0.5s 0.5s ease; - -o-transition: opacity 0.5s 0.5s ease; - transition: opacity 0.5s 0.5s ease; - } -</style> -<div class="generic-content-wrapper"> - <div class="section-title-wrapper"> - - <div class="pull-right"> - {{if $showPageControls}} - <div class="btn-group"> +<div class="generic-content-wrapper" {{if $hideEditor}}style="display: none;"{{/if}}> + <div class="section-title-wrapper"> + <div class="pull-right"> + {{if $showPageControls}} + <div id="page-tools" class="btn-group" style="display: none;"> <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown"> <i class="fa fa-caret-down"></i> {{$tools_label}} </button> - <ul class="dropdown-menu"> - - <li class="nav-item"> - <a id="rename-page" class="nav-link" href="#"><i class="fa fa-edit"></i> Rename Page</a> - </li> + <ul class="dropdown-menu dropdown-menu-right"> + {{if $renamePage}} <li class="nav-item"> - <a id="delete-page" class="nav-link" href="#"><i class="fa fa-trash-o"></i> Delete Page</a> + <a class="nav-link rename-page" href="#"><i class="fa fa-edit"></i> {{$renamePage}}</a> </li> + {{/if}} <li class="nav-item"> <a id="embed-image" class="nav-link" href="#"><i class="fa fa-picture-o"></i> Embed Image</a> </li> - </ul> </div> - - {{/if}} - - <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button> - <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button> - </div> - <h2><span id="wiki-header-name">{{$wikiheaderName}}</span>: <span id="wiki-header-page">{{$wikiheaderPage}}</span></h2> - <div class="clear"></div> - </div> - - - <div id="new-page-form-wrapper" class="section-content-tools-wrapper" style="display:none;"> - <form id="new-page-form" action="wiki/create/page" method="post" > - <div class="clear"></div> - {{include file="field_input.tpl" field=$pageName}} - <div class="btn-group pull-right"> - <button id="new-page-submit" class="btn btn-success" type="submit" name="submit" >Create Page</button> - </div> - </form> <div class="clear"></div> - <hr> - </div> - - <div id="rename-page-form-wrapper" class="section-content-tools-wrapper" style="display:none;"> - <form id="rename-page-form" action="wiki/rename/page" method="post" > - <div class="clear"></div> - {{include file="field_input.tpl" field=$pageRename}} - <div class="btn-group pull-right"> - <button id="rename-page-submit" class="btn btn-warning" type="submit" name="submit" >Rename Page</button> - </div> - </form> <div class="clear"></div> - <hr> - </div> - - <div id="wiki-content-container" class="section-content-wrapper" {{if $hideEditor}}style="display: none;"{{/if}}> - <ul class="nav nav-tabs" id="wiki-nav-tabs"> - <li id="edit-pane-tab"><a data-toggle="tab" href="#edit-pane">Edit</a></li> - <li class="active"><a data-toggle="tab" href="#preview-pane" id="wiki-get-preview">Preview</a></li> - <li {{if $hidePageHistory}}style="display: none;"{{/if}}><a data-toggle="tab" href="#page-history-pane" id="wiki-get-history">History</a></li> - - </ul> - - <div class="tab-content" id="wiki-page-tabs"> - - <div id="edit-pane" class="tab-pane fade"> - <div id="ace-editor"></div> - </div> - <div id="preview-pane" class="tab-pane fade in active"> - <div id="wiki-preview" class="section-content-wrapper"> - {{$renderedContent}} - </div> - </div> - <div id="page-history-pane" class="tab-pane fade" {{if $hidePageHistory}}style="display: none;"{{/if}}> - <div id="page-history-list" class="section-content-wrapper"> - </div> - </div> - - - </div> - </div> - {{if $showCommitMsg}} - {{if $showPageControls}} - <div class="section-content-wrapper"> - <div id="id_{{$commitMsg.0}}_wrapper" class='form-group field input'> - <label for='id_{{$commitMsg.0}}' id='label_{{$commitMsg.0}}'>{{$commitMsg.1}}{{if $commitMsg.4}}<span class="required"> {{$commitMsg.4}}</span>{{/if}}</label> - <span> - <input class="" style="width: 80%;" name='{{$commitMsg.0}}' id='id_{{$commitMsg.0}}' type="text" value="{{$commitMsg.2}}"{{if $commitMsg.5}} {{$commitMsg.5}}{{/if}}> - <a id="save-page" href="#" class="btn btn-primary btn-md">Save</a> - </span> - <span id='help_{{$commitMsg.0}}' class='help-block'>{{$commitMsg.3}}</span> - + {{/if}} + <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button> + <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button> + </div> + <h2> + <span id="wiki-header-name">{{$wikiheaderName}}</span>: + <span id="wiki-header-page">{{$wikiheaderPage}}</span> + </h2> <div class="clear"></div> </div> - </div> - {{/if}} - {{/if}} + <div id="rename-page-form-wrapper" class="section-content-tools-wrapper" style="display:none;"> + <form id="rename-page-form" action="wiki/rename/page" method="post" > + {{include file="field_input.tpl" field=$pageRename}} + <div class="form-group"> + <div class="pull-right"> + <button id="rename-page-submit" class="btn btn-primary" type="submit" name="submit">Submit</button> + </div> + <div> + <button class="btn btn-default rename-page" type="button">Cancel</button> + </div> + <div class="clear"></div> + </div> + </form> + </div> + <div id="wiki-content-container" class="section-content-wrapper" {{if $hideEditor}}style="display: none;"{{/if}}> + <ul class="nav nav-tabs" id="wiki-nav-tabs"> + <li id="edit-pane-tab"><a data-toggle="tab" href="#edit-pane">{{$editOrSourceLabel}}</a></li> + <li class="active"><a data-toggle="tab" href="#preview-pane" id="wiki-get-preview">View</a></li> + <li><a data-toggle="tab" href="#page-history-pane" id="wiki-get-history">History</a></li> + </ul> + <div class="tab-content" id="wiki-page-tabs"> + <div id="edit-pane" class="tab-pane fade"> + {{if !$mimeType || $mimeType == 'text/markdown'}} + <div id="ace-editor"></div> + {{else}} + <textarea id="editor">{{$content}}</textarea> + {{/if}} + {{if $showPageControls}} + <div> + <div id="id_{{$commitMsg.0}}_wrapper" class="form-group field input"> + <div class="input-group"> + <input class="widget-input" name="{{$commitMsg.0}}" id="id_{{$commitMsg.0}}" type="text" value="{{$commitMsg.2}}"{{if $commitMsg.5}} {{$commitMsg.5}}{{/if}}> + <div class="input-group-btn"> + <button id="save-page" type="button" class="btn btn-primary btn-sm{{if !$mimeType || $mimeType == 'text/markdown'}} disabled{{/if}}">Save</button> + </div> + </div> + </div> + </div> + {{/if}} + </div> + <div id="preview-pane" class="tab-pane fade in active"> + <div id="wiki-preview"> + {{$renderedContent}} + </div> + </div> + <div id="page-history-pane" class="tab-pane fade"> + <div id="page-history-list"></div> + </div> + </div> + </div> </div> {{$wikiModal}} - <div class="modal" id="embedPhotoModal" tabindex="-1" role="dialog" aria-labelledby="embedPhotoLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> @@ -138,32 +105,27 @@ <script> - window.wiki_resource_id = '{{$resource_id}}'; - window.wiki_page_name = '{{$page}}'; - window.wiki_page_content = {{$content}}; - window.wiki_page_commit = '{{$commit}}'; - - if (window.wiki_page_name === 'Home') { - $('#delete-page').hide(); - $('#rename-page').hide(); - } - - $("#generic-modal-ok-{{$wikiModalID}}").removeClass('btn-primary'); - $("#generic-modal-ok-{{$wikiModalID}}").addClass('btn-danger'); - - $('#rename-page').click(function (ev) { - $('#rename-page-form-wrapper').show(); - ev.preventDefault(); - }); - - $( "#rename-page-form" ).submit(function( event ) { - $.post("wiki/{{$channel}}/rename/page", - { - oldName: window.wiki_page_name, - newName: $('#id_pageRename').val(), - resource_id: window.wiki_resource_id - }, - function (data) { + window.wiki_resource_id = '{{$resource_id}}'; + window.wiki_page_name = '{{$page}}'; + window.wiki_page_content = {{if !$mimeType || $mimeType == 'text/markdown'}}{{$content}}{{else}}`{{$content}}`{{/if}}; + window.wiki_page_commit = '{{$commit}}'; + + $("#generic-modal-ok-{{$wikiModalID}}").removeClass('btn-primary'); + $("#generic-modal-ok-{{$wikiModalID}}").addClass('btn-danger'); + + $('.rename-page').click(function (ev) { + $('#rename-page-form-wrapper').toggle(); + ev.preventDefault(); + }); + + $( "#rename-page-form" ).submit(function( event ) { + $.post("wiki/{{$channel}}/rename/page", + { + oldName: window.wiki_page_name, + newName: $('#id_pageRename').val(), + resource_id: window.wiki_resource_id + }, + function (data) { if (data.success) { $('#rename-page-form-wrapper').hide(); window.console.log('data: ' + JSON.stringify(data)); @@ -173,46 +135,69 @@ } else { window.console.log('Error renaming page.'); } - }, 'json'); - event.preventDefault(); - }); - - var editor = ace.edit("ace-editor"); - editor.setOptions({ - theme: "ace/theme/github", - mode: "ace/mode/markdown", - - wrap: true, - - minLines: 30, - maxLines: Infinity, - - printMargin: false - }); - - editor.getSession().setValue(window.wiki_page_content); - window.editor = editor; // Store the editor in the window object so the anonymous function can use it. - - $('#edit-pane-tab').click(function (ev) { - setTimeout(function() {window.editor.focus();}, 500); // Return the focus to the editor allowing immediate text entry - }); - - $('#wiki-get-preview').click(function (ev) { - $.post("wiki/{{$channel}}/preview", {content: editor.getValue(), resource_id: window.wiki_resource_id}, function (data) { - if (data.success) { - $('#wiki-preview').html(data.html); - $("#wiki-toc").toc({content: "#wiki-preview", headings: "h1,h2,h3,h4"}); - } else { - window.console.log('Error previewing page.'); - } - }, 'json'); - ev.preventDefault(); - }); + }, 'json'); + event.preventDefault(); + }); + + {{if !$mimeType || $mimeType == 'text/markdown'}} + var editor = ace.edit("ace-editor"); + editor.setOptions({ + theme: "ace/theme/github", + mode: "ace/mode/markdown", + + wrap: true, + + minLines: 30, + maxLines: Infinity, + + printMargin: false + }); + + editor.getSession().setValue(window.wiki_page_content); + window.editor = editor; // Store the editor in the window object so the anonymous function can use it. + {{else}} + window.editor = editor = $('#editor'); + {{/if}} + + {{if !$showPageControls}} + {{if !$mimeType || $mimeType == 'text/markdown'}} + editor.setReadOnly(true); // Disable editing if the viewer lacks edit permission + {{else}} + editor.prop('readonly', true); + {{/if}} + {{/if}} + + $('#edit-pane-tab').click(function (ev) { + setTimeout(function() {window.editor.focus();}, 500); // Return the focus to the editor allowing immediate text entry + $('#page-tools').show(); + }); + + $('#wiki-get-preview').click(function (ev) { + $.post("wiki/{{$channel}}/preview", { + {{if !$mimeType || $mimeType == 'text/markdown'}} + content: editor.getValue(), + {{else}} + content: editor.val(), + {{/if}} + resource_id: window.wiki_resource_id + }, + function (data) { + if (data.success) { + $('#wiki-preview').html(data.html); + $("#wiki-toc").toc({content: "#wiki-preview", headings: "h1,h2,h3,h4"}); + $('#page-tools').hide(); + } else { + window.console.log('Error previewing page.'); + } + }, 'json'); + ev.preventDefault(); + }); - $('#wiki-get-history').click(function (ev) { - $.post("wiki/{{$channel}}/history/page", {name: window.wiki_page_name, resource_id: window.wiki_resource_id}, function (data) { + $('#wiki-get-history').click(function (ev) { + $.post("wiki/{{$channel}}/history/page", {name: window.wiki_page_name, resource_id: window.wiki_resource_id}, function (data) { if (data.success) { $('#page-history-list').html(data.historyHTML); + $('#page-tools').hide(); } else { window.console.log('Error getting page history.'); } @@ -220,162 +205,108 @@ ev.preventDefault(); }); - function wiki_delete_wiki(wikiHtmlName, resource_id) { - if(!confirm('Are you sure you want to delete the entire wiki: ' + JSON.stringify(wikiHtmlName))) { - return; + function wiki_refresh_page_list() { + if (window.wiki_resource_id === '') { + return false; } - $.post("wiki/{{$channel}}/delete/wiki", {resource_id: resource_id}, function (data) { + $.post("wiki/{{$channel}}/get/page/list/", {resource_id: window.wiki_resource_id}, function (data) { if (data.success) { - window.console.log('Wiki deleted'); - // Refresh list and redirect page as necessary - window.location = 'wiki/{{$channel}}'; + $('#wiki_page_list_container').html(data.pages); + $('#wiki_page_list_container').show(); + {{if $showNewPageButton}} + $('#new-page-button').show(); + {{else}} + $('#new-page-button').hide(); + {{/if}} } else { - alert('Error deleting wiki!'); - window.console.log('Error deleting wiki.'); + alert('Error fetching page list!'); + window.console.log('Error fetching page list!'); } - }, 'json'); - } - + }, 'json'); + return false; + } - function wiki_download_wiki(resource_id) { - window.location = "wiki/{{$channel}}/download/wiki/" + resource_id; - } - - $('#new-page-submit').click(function (ev) { - if (window.wiki_resource_id === '') { - window.console.log('You must have a wiki open in order to create pages.'); - ev.preventDefault(); - return false; - } - $.post("wiki/{{$channel}}/create/page", {name: $('#id_pageName').val(), resource_id: window.wiki_resource_id}, - function (data) { - if (data.success) { - window.location = data.url; - } else { - window.console.log('Error creating page.'); - } - }, 'json'); + $('#save-page').click(function (ev) { + if (window.wiki_resource_id === '' || window.wiki_page_name === '') { + window.console.log('You must have a wiki page open in order to edit pages.'); ev.preventDefault(); - }); - - function wiki_refresh_page_list() { - if (window.wiki_resource_id === '') { - return false; - } - $.post("wiki/{{$channel}}/get/page/list/", {resource_id: window.wiki_resource_id}, function (data) { - if (data.success) { - $('#wiki_page_list_container').html(data.pages); - $('#wiki_page_list_container').show(); - {{if $showNewPageButton}} - $('#new-page-button').show(); - {{else}} - $('#new-page-button').hide(); - {{/if}} - } else { - alert('Error fetching page list!'); - window.console.log('Error fetching page list!'); - } - }, 'json'); return false; } + {{if !$mimeType || $mimeType == 'text/markdown'}} + var currentContent = editor.getValue(); + {{else}} + var currentContent = editor.val(); + {{/if}} - $('#save-page').click(function (ev) { - if (window.wiki_resource_id === '' || window.wiki_page_name === '') { - window.console.log('You must have a wiki page open in order to edit pages.'); - ev.preventDefault(); - return false; - } - var currentContent = editor.getValue(); - if (window.wiki_page_content === currentContent) { + if (window.wiki_page_content === currentContent) { window.console.log('No edits to save.'); ev.preventDefault(); return false; - } - $.post("wiki/{{$channel}}/save/page", - { content: currentContent, - commitMsg: $('#id_commitMsg').val(), - name: window.wiki_page_name, - resource_id: window.wiki_resource_id - }, - function (data) { - if (data.success) { + } + $.post("wiki/{{$channel}}/save/page", { + content: currentContent, + commitMsg: $('#id_commitMsg').val(), + name: window.wiki_page_name, + resource_id: window.wiki_resource_id + }, + function (data) { + if (data.success) { window.console.log('Page saved successfully.'); window.wiki_page_content = currentContent; $('#id_commitMsg').val(''); // Clear the commit message box - $('#wiki-get-history').click(); - } else { + + {{if !$mimeType || $mimeType == 'text/markdown'}} + $('#save-page').addClass('disabled'); // Disable the save button + window.editor.getSession().getUndoManager().markClean(); // Reset the undo history for the editor + {{/if}} + + window.editor.focus(); // Return focus to the editor for continued editing + // $('#wiki-get-history').click(); + } else { alert('Error saving page.'); // TODO: Replace alerts with auto-timeout popups window.console.log('Error saving page.'); - } - }, 'json'); - ev.preventDefault(); - }); - - $('#delete-page').click(function (ev) { - if (window.wiki_resource_id === '' || window.wiki_page_name === '' || window.wiki_page_name === 'Home') { - window.console.log('You must have a wiki page open in order to delete pages.'); - ev.preventDefault(); - return false; } - if(!confirm('Are you sure you want to delete the page: ' + window.wiki_page_name)) { - ev.preventDefault(); - return; - } - $.post("wiki/{{$channel}}/delete/page", {name: window.wiki_page_name, resource_id: window.wiki_resource_id}, - function (data) { - if (data.success) { - window.console.log('Page deleted successfully.'); - var url = window.location.href; - if (url.substr(-1) == '/') url = url.substr(0, url.length - 2); - url = url.split('/'); - url.pop(); - window.location = url.join('/'); - } else { - alert('Error deleting page.'); // TODO: Replace alerts with auto-timeout popups - window.console.log('Error deleting page.'); - } - }, 'json'); - ev.preventDefault(); - }); + }, 'json'); + ev.preventDefault(); + }); - function wiki_revert_page(commitHash) { - if (window.wiki_resource_id === '' || window.wiki_page_name === '') { + function wiki_revert_page(commitHash) { + if (window.wiki_resource_id === '' || window.wiki_page_name === '') { window.console.log('You must have a wiki page open in order to revert pages.'); return false; - } - $.post("wiki/{{$channel}}/revert/page", {commitHash: commitHash, name: window.wiki_page_name, resource_id: window.wiki_resource_id}, - function (data) { - if (data.success) { - $('button[id^=revert-]').removeClass('btn-success'); - $('button[id^=revert-]').addClass('btn-danger'); - $('button[id^=revert-]').html('Revert'); - $('#revert-'+commitHash).removeClass('btn-danger'); - $('#revert-'+commitHash).addClass('btn-success'); - $('#revert-'+commitHash).html('Page reverted<br>but not saved'); - window.wiki_page_commit = commitHash; - // put contents in editor - editor.getSession().setValue(data.content); - } else { - window.console.log('Error reverting page.'); - } - }, 'json'); } + $.post("wiki/{{$channel}}/revert/page", {commitHash: commitHash, name: window.wiki_page_name, resource_id: window.wiki_resource_id}, + function (data) { + if (data.success) { + $('button[id^=revert-]').removeClass('btn-success'); + $('button[id^=revert-]').addClass('btn-danger'); + $('button[id^=revert-]').html('Revert'); + $('#revert-'+commitHash).removeClass('btn-danger'); + $('#revert-'+commitHash).addClass('btn-success'); + $('#revert-'+commitHash).html('Page reverted<br>but not saved'); + window.wiki_page_commit = commitHash; + // put contents in editor + editor.getSession().setValue(data.content); + } else { + window.console.log('Error reverting page.'); + } + }, 'json'); + } - function wiki_compare_page(compareCommit) { - if (window.wiki_resource_id === '' || window.wiki_page_name === '' || window.wiki_page_commit === '') { + function wiki_compare_page(compareCommit) { + if (window.wiki_resource_id === '' || window.wiki_page_name === '' || window.wiki_page_commit === '') { window.console.log('You must have a wiki page open in order to revert pages.'); return false; - } - $.post("wiki/{{$channel}}/compare/page", - { - compareCommit: compareCommit, - currentCommit: window.wiki_page_commit, - name: window.wiki_page_name, - resource_id: window.wiki_resource_id - }, - function (data) { - console.log(data); - if (data.success) { + } + $.post("wiki/{{$channel}}/compare/page", { + compareCommit: compareCommit, + currentCommit: window.wiki_page_commit, + name: window.wiki_page_name, + resource_id: window.wiki_resource_id + }, + function (data) { + console.log(data); + if (data.success) { var modalBody = $('#generic-modal-body-{{$wikiModalID}}'); modalBody.html('<div class="descriptive-text">'+data.diff+'</div>'); $('.modal-dialog').addClass('modal-lg'); @@ -385,134 +316,124 @@ $('#generic-modal-{{$wikiModalID}}').modal('hide'); }); $('#generic-modal-{{$wikiModalID}}').modal(); - } else { + } else { window.console.log('Error comparing page.'); - } - }, 'json'); - } - - $('#embed-image').click(function (ev) { - initializeEmbedPhotoDialog(); - ev.preventDefault(); - }); - + } + }, 'json'); + } - var initializeEmbedPhotoDialog = function () { - $('.embed-photo-selected-photo').each(function (index) { - $(this).removeClass('embed-photo-selected-photo'); - }); - getPhotoAlbumList(); - $('#embedPhotoModalBodyAlbumDialog').off('click'); - $('#embedPhotoModal').modal(); - }; + $('#embed-image').click(function (ev) { + initializeEmbedPhotoDialog(); + ev.preventDefault(); + }); - var choosePhotoFromAlbum = function (album) { - $.post("embedphotos/album", {name: album}, - function(data) { - if (data['status']) { - $('#embedPhotoModalLabel').html('{{$modalchooseimages}}'); - $('#embedPhotoModalBodyAlbumDialog').html('\ - <div><ul class="nav">\n\ - <li><a href="#" onclick="initializeEmbedPhotoDialog();return false;">\n\ - <i class="fa fa-chevron-left"></i> \n\ - {{$modaldiffalbum}}\n\ - </a>\n\ - </li>\n\ - </ul><br></div>') - $('#embedPhotoModalBodyAlbumDialog').append(data['content']); - $('#embedPhotoModalBodyAlbumDialog').click(function (evt) { - evt.preventDefault(); - var image = document.getElementById(evt.target.id); - if (typeof($(image).parent()[0]) !== 'undefined') { - var imageparent = document.getElementById($(image).parent()[0].id); - $(imageparent).toggleClass('embed-photo-selected-photo'); - } - }); - $('#embedPhotoModalBodyAlbumListDialog').addClass('hide'); - $('#embedPhotoModalBodyAlbumDialog').removeClass('hide'); - $('#embed-photo-OKButton').click(function () { - $('.embed-photo-selected-photo').each(function (index) { - var href = $(this).attr('href'); - $.post("embedphotos/photolink", {href: href}, - function(ddata) { - if (ddata['status']) { - var imgURL = ddata['photolink'].replace( /\[.*\]\[.*\](.*)\[.*\]\[.*\]/, '\n![image]($1)' ) - editor.getSession().insert(editor.getCursorPosition(), imgURL) - } else { - window.console.log('{{$modalerrorlink}}' + ':' + ddata['errormsg']); - } - return false; - }, - 'json'); - }); - $('#embedPhotoModalBodyAlbumDialog').html(''); - $('#embedPhotoModalBodyAlbumDialog').off('click'); - $('#embedPhotoModal').modal('hide'); - }); - } else { - window.console.log('{{$modalerroralbum}} ' + JSON.stringify(album) + ':' + data['errormsg']); - } - return false; - }, - 'json'); - }; - - var getPhotoAlbumList = function () { - $.post("embedphotos/albumlist", {}, - function(data) { - if (data['status']) { - var albums = data['albumlist']; //JSON.parse(data['albumlist']); - $('#embedPhotoModalLabel').html('{{$modalchoosealbum}}'); - $('#embedPhotoModalBodyAlbumList').html('<ul class="nav"></ul>'); - for(var i=0; i<albums.length; i++) { - var albumName = albums[i].text; - var albumLink = '<li>'; - albumLink += '<a href="#" onclick="choosePhotoFromAlbum(\'' + albumName + '\');return false;">' + albumName + '</a>'; - albumLink += '</li>'; - $('#embedPhotoModalBodyAlbumList').find('ul').append(albumLink); + var initializeEmbedPhotoDialog = function () { + $('.embed-photo-selected-photo').each(function (index) { + $(this).removeClass('embed-photo-selected-photo'); + }); + getPhotoAlbumList(); + $('#embedPhotoModalBodyAlbumDialog').off('click'); + $('#embedPhotoModal').modal(); + }; + + var choosePhotoFromAlbum = function (album) { + $.post("embedphotos/album", {name: album}, + function(data) { + if (data['status']) { + $('#embedPhotoModalLabel').html('{{$modalchooseimages}}'); + $('#embedPhotoModalBodyAlbumDialog').html('\ + <div><ul class="nav">\n\ + <li><a href="#" onclick="initializeEmbedPhotoDialog();return false;">\n\ + <i class="fa fa-chevron-left"></i> \n\ + {{$modaldiffalbum}}\n\ + </a>\n\ + </li>\n\ + </ul><br></div>') + $('#embedPhotoModalBodyAlbumDialog').append(data['content']); + $('#embedPhotoModalBodyAlbumDialog').click(function (evt) { + evt.preventDefault(); + var image = document.getElementById(evt.target.id); + if (typeof($(image).parent()[0]) !== 'undefined') { + var imageparent = document.getElementById($(image).parent()[0].id); + $(imageparent).toggleClass('embed-photo-selected-photo'); } - $('#embedPhotoModalBodyAlbumDialog').addClass('hide'); - $('#embedPhotoModalBodyAlbumListDialog').removeClass('hide'); - } else { - window.console.log('{{$modalerrorlist}}' + ':' + data['errormsg']); + }); + $('#embedPhotoModalBodyAlbumListDialog').addClass('hide'); + $('#embedPhotoModalBodyAlbumDialog').removeClass('hide'); + $('#embed-photo-OKButton').click(function () { + $('.embed-photo-selected-photo').each(function (index) { + var href = $(this).attr('href'); + $.post("embedphotos/photolink", {href: href}, + function(ddata) { + if (ddata['status']) { + {{if !$mimeType || $mimeType == 'text/markdown'}} + var imgURL = ddata['photolink'].replace( /\[.*\]\[.*\](.*)\[.*\]\[.*\]/, '\n![image]($1)' ) + editor.getSession().insert(editor.getCursorPosition(), imgURL) + {{else}} + var currentContent = $('#editor').val(); + $('#editor').val(currentContent + ddata['photolink']); + {{/if}} + } else { + window.console.log('{{$modalerrorlink}}' + ':' + ddata['errormsg']); + } + return false; + }, + 'json'); + }); + $('#embedPhotoModalBodyAlbumDialog').html(''); + $('#embedPhotoModalBodyAlbumDialog').off('click'); + $('#embedPhotoModal').modal('hide'); + }); + } else { + window.console.log('{{$modalerroralbum}} ' + JSON.stringify(album) + ':' + data['errormsg']); + } + return false; + }, + 'json'); + }; + + var getPhotoAlbumList = function () { + $.post("embedphotos/albumlist", {}, + function(data) { + if (data['status']) { + var albums = data['albumlist']; //JSON.parse(data['albumlist']); + $('#embedPhotoModalLabel').html('{{$modalchoosealbum}}'); + $('#embedPhotoModalBodyAlbumList').html('<ul class="nav"></ul>'); + for(var i=0; i<albums.length; i++) { + var albumName = albums[i].text; + var albumLink = '<li>'; + albumLink += '<a href="#" onclick="choosePhotoFromAlbum(\'' + albumName + '\');return false;">' + albumName + '</a>'; + albumLink += '</li>'; + $('#embedPhotoModalBodyAlbumList').find('ul').append(albumLink); } - return false; - }, - 'json'); - }; - - function wiki_show_new_wiki_form() { - $('#new-page-form-wrapper').hide(); - $('#edit-wiki-form-wrapper').hide(); - $('#new-wiki-form-wrapper').toggle(); - return false; - } - - function wiki_show_new_page_form() { - $('#edit-wiki-form-wrapper').hide(); - $('#new-wiki-form-wrapper').hide(); - $('#new-page-form-wrapper').toggle(); - return false; - } - - function wiki_show_edit_wiki_form(wiki_title, wiki_resource_id) { - window.wiki_resource_id = wiki_resource_id; - window.wiki_title = wiki_title; - $('#new-page-form-wrapper').hide(); - $('#new-wiki-form-wrapper').hide(); - $('#edit-wiki-form-wrapper').toggle(); - return false; - } - - $(document).ready(function () { - wiki_refresh_page_list(); - $("#wiki-toc").toc({content: "#wiki-preview", headings: "h1,h2,h3,h4"}); - // Show Edit tab first. Otherwise the Ace editor does not load. - $("#wiki-nav-tabs li:eq(1) a").tab('show'); - {{if $showNewWikiButton}} - $('#new-wiki-button').show(); - {{else}} - $('#new-wiki-button').hide(); - {{/if}} + $('#embedPhotoModalBodyAlbumDialog').addClass('hide'); + $('#embedPhotoModalBodyAlbumListDialog').removeClass('hide'); + } else { + window.console.log('{{$modalerrorlist}}' + ':' + data['errormsg']); + } + return false; + }, + 'json'); + }; + + $(document).ready(function () { + wiki_refresh_page_list(); + $("#wiki-toc").toc({content: "#wiki-preview", headings: "h1,h2,h3,h4"}); + + // This seems obsolete + // Show Edit tab first. Otherwise the Ace editor does not load. + //$("#wiki-nav-tabs li:eq(1) a").tab('show'); + + {{if !$mimeType || $mimeType == 'text/markdown'}} + window.editor.on("input", function() { + if(window.editor.getSession().getUndoManager().isClean()) { + $('#save-page').addClass('disabled'); + } else { + $('#save-page').removeClass('disabled'); + } }); + {{else}} + window.editor.bbco_autocomplete('bbcode'); + {{/if}} + }); </script> diff --git a/view/tpl/wiki_page_list.tpl b/view/tpl/wiki_page_list.tpl index c020f2520..ef2b41490 100644 --- a/view/tpl/wiki_page_list.tpl +++ b/view/tpl/wiki_page_list.tpl @@ -1,14 +1,75 @@ {{if $not_refresh}}<div id="wiki_page_list_container" {{if $hide}} style="display: none;" {{/if}}>{{/if}} <div id="wiki_page_list" class="widget" > <h3>{{$header}}</h3> - <ul class="nav nav-pills nav-stacked"> {{if $pages}} {{foreach $pages as $page}} - <li><a href="/wiki/{{$channel}}/{{$wikiname}}/{{$page.url}}">{{$page.title}}</a></li> + <li id="{{$page.link_id}}"> + {{if $page.resource_id && $canadd}} + <i class="widget-nav-pills-icons fa fa-trash-o drop-icons" onclick="wiki_delete_page('{{$page.title}}', '{{$page.url}}', '{{$page.resource_id}}', '{{$page.link_id}}')"></i> + {{/if}} + <a href="/wiki/{{$channel}}/{{$wikiname}}/{{$page.url}}">{{$page.title}}</a> + </li> {{/foreach}} {{/if}} - {{if $canadd}}<li><a href="#" onclick="wiki_show_new_page_form(); return false;"><i class="fa fa-plus-circle"></i> {{$addnew}}</a></li>{{/if}} + {{if $canadd}} + <li><a href="#" onclick="wiki_show_new_page_form(); return false;"><i class="fa fa-plus-circle"></i> {{$addnew}}</a></li> + {{/if}} </ul> + {{if $canadd}} + <div id="new-page-form-wrapper" class="sub-menu" style="display:none;"> + <form id="new-page-form" action="wiki/{{$channel}}/create/page" method="post" > + {{include file="field_input.tpl" field=$pageName}} + <button id="new-page-submit" class="btn btn-primary" type="submit" name="submit" >Submit</button> + </form> + </div> + {{/if}} </div> {{if $not_refresh}}</div>{{/if}} + +<script> + $('#new-page-submit').click(function (ev) { + $.post("wiki/{{$channel}}/create/page", {name: $('#id_pageName').val(), resource_id: window.wiki_resource_id}, + function(data) { + if(data.success) { + window.location = data.url; + } else { + window.console.log('Error creating page.'); + } + }, 'json'); + ev.preventDefault(); + }); + + function wiki_delete_page(wiki_page_name, wiki_page_url, wiki_resource_id, wiki_link_id) { + if(!confirm('Are you sure you want to delete the page: ' + wiki_page_name)) { + return; + } + $.post("wiki/{{$channel}}/delete/page", {name: wiki_page_url, resource_id: wiki_resource_id}, + function (data) { + if (data.success) { + window.console.log('Page deleted successfully.'); + if(wiki_page_url == window.wiki_page_name) { + var url = window.location.href; + if(url.substr(-1) == '/') + url = url.substr(0, url.length - 2); + url = url.split('/'); + url.pop(); + window.location = url.join('/'); + } + else { + $('#' + wiki_link_id).remove(); + } + } else { + alert('Error deleting page.'); // TODO: Replace alerts with auto-timeout popups + window.console.log('Error deleting page.'); + } + }, 'json'); + return false; + } + + function wiki_show_new_page_form() { + $('#new-page-form-wrapper').toggle(); + $('#id_pageName').focus(); + return false; + } +</script> diff --git a/view/tpl/wikilist.tpl b/view/tpl/wikilist.tpl index d3c6b867f..68aa41e7c 100644 --- a/view/tpl/wikilist.tpl +++ b/view/tpl/wikilist.tpl @@ -1,49 +1,69 @@ -<div id="wiki_list" class="widget"> - <h3>{{$header}}</h3> - <ul class="nav nav-pills nav-stacked"> - {{if $wikis}} - {{foreach $wikis as $wiki}} - <li>{{if $owner}}<a href="#" onclick="$('div[id^=\'edit-wiki-form-wrapper\']').hide(); $('div[id^=\'new-wiki-form-wrapper\']').hide(); openClose('edit-wiki-form-wrapper-{{$wiki.resource_id}}'); return false;" class="pull-right wikilist" title="{{$edit}}"><i class="fa fa-pencil"></i></a>{{/if}} - <a href="#" onclick="wiki_download_wiki('{{$wiki.resource_id}}'); return false;" title="{{$download}}" class="pull-right wikilist"><i class="fa fa-download"></i></a> - <a href="/wiki/{{$channel}}/{{$wiki.urlName}}/Home" title="{{$view}}"{{if $wiki.active}} class="active"{{/if}}>{{$wiki.title}}</a> - {{if $owner}} - <div id="edit-wiki-form-wrapper-{{$wiki.resource_id}}" class="section-content-tools-wrapper" style="display:none;"> - <form id="edit-wiki-form" action="wiki/edit/wiki" method="post" > - <div class="clear"></div> - <div class="btn-group pull-right"> - <button class="btn btn-xs btn-danger" onclick="wiki_delete_wiki('{{$wiki.title}}', '{{$wiki.resource_id}}'); return false;"><i class="fa fa-trash-o"></i> Delete Wiki</button> - </div> - </form> - <div class="clear"></div> - </div> - {{/if}} - </li> - {{/foreach}} - {{/if}} +<div class="generic-content-wrapper"> + <div class="section-title-wrapper"> {{if $owner}} - <li><a href="#" class="fakelink" onclick="$('div[id^=\'edit-wiki-form-wrapper\']').hide(); openClose('new-wiki-form-wrapper'); return false;"><i id="new-wiki-button" class="fa fa-plus-circle"></i> {{$addnew}}</a></li> + <button type="button" class="btn btn-success btn-xs pull-right acl-form-trigger" onclick="openClose('new-wiki-form-wrapper');" data-form_id="new-wiki-form"><i class="fa fa-plus-circle"></i> {{$create}}</button> {{/if}} - </ul> + <h2>{{$header}}</h2> + </div> {{if $owner}} - <div id="new-wiki-form-wrapper" class="sub-menu" style="display:none;"> + <div id="new-wiki-form-wrapper" class="section-content-tools-wrapper"> <form id="new-wiki-form" action="wiki/{{$channel}}/create/wiki" method="post" class="acl-form" data-form_id="new-wiki-form" data-allow_cid='{{$allow_cid}}' data-allow_gid='{{$allow_gid}}' data-deny_cid='{{$deny_cid}}' data-deny_gid='{{$deny_gid}}'> {{include file="field_input.tpl" field=$wikiName}} - <div id="post-visible-container" class="checkbox"> - <label> - <input name="postVisible" id="postVisible" value="0" type="checkbox">{{$notify}} - </label> - </div> + {{include file="field_select.tpl" field=$mimeType}} + {{include file="field_checkbox.tpl" field=$notify}} <div> - <div id="profile-jot-submit-right" class="btn-group"> + <div class="btn-group pull-right"> <button id="dbtn-acl" class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" title="Permission settings" onclick="return false;"> - <i id="jot-perms-icon" class="fa fa-{{$lockstate}} jot-icons"></i>{{$bang}} + <i id="jot-perms-icon" class="fa fa-{{$lockstate}} jot-icons"></i> </button> - <button id="new-wiki-submit" class="btn btn-primary btn-sm" type="submit" name="submit" >{{$create}}</button> + <button id="new-wiki-submit" class="btn btn-primary btn-sm" type="submit" name="submit" >{{$submit}}</button> </div> </div> </form> + {{$acl}} <div class="clear"></div> </div> {{/if}} + <div class="section-content-wrapper-np"> + <table id="wikis-index"> + <tr> + <th width="98%">{{$name}}</th> + <th width="1%" class="wikis-index-tool"></th> + {{if $owner}} + <th width="1%"></th> + {{/if}} + </tr> + {{foreach $wikis as $wiki}} + <tr class="wikis-index-row"> + <td><a href="/wiki/{{$channel}}/{{$wiki.urlName}}/Home" title="{{$view}}"{{if $wiki.active}} class="active"{{/if}}>{{$wiki.title}}</a></td> + <td class="wiki-index-tool"><i class="fa fa-download fakelink" onclick="wiki_download_wiki('{{$wiki.resource_id}}'); return false;"></i></td> + {{if $owner}} + <td><i class="fa fa-trash-o drop-icons" onclick="wiki_delete_wiki('{{$wiki.title}}', '{{$wiki.resource_id}}'); return false;"></i></td> + {{/if}} + </tr> + {{/foreach}} + </table> + </div> </div> -{{$acl}} +<script> + {{if $owner}} + function wiki_delete_wiki(wikiHtmlName, resource_id) { + if(!confirm('Are you sure you want to delete the entire wiki: ' + JSON.stringify(wikiHtmlName))) { + return; + } + $.post("wiki/{{$channel}}/delete/wiki", {resource_id: resource_id}, function (data) { + if (data.success) { + window.console.log('Wiki deleted'); + // Refresh list and redirect page as necessary + window.location = 'wiki/{{$channel}}'; + } else { + alert('Error deleting wiki!'); + window.console.log('Error deleting wiki.'); + } + }, 'json'); + } + {{/if}} + function wiki_download_wiki(resource_id) { + window.location = "wiki/{{$channel}}/download/wiki/" + resource_id; + } +</script> diff --git a/view/tpl/wikilist_widget.tpl b/view/tpl/wikilist_widget.tpl new file mode 100644 index 000000000..51eccad90 --- /dev/null +++ b/view/tpl/wikilist_widget.tpl @@ -0,0 +1,45 @@ +<div id="wiki_list" class="widget"> + <h3>{{$header}}</h3> + <ul class="nav nav-pills nav-stacked"> + {{if $wikis}} + {{foreach $wikis as $wiki}} + <li>{{if $owner}}<a href="#" onclick="$('div[id^=\'edit-wiki-form-wrapper\']').hide(); $('div[id^=\'new-wiki-form-wrapper\']').hide(); openClose('edit-wiki-form-wrapper-{{$wiki.resource_id}}'); return false;" class="pull-right wikilist" title="{{$edit}}"><i class="fa fa-pencil"></i></a>{{/if}} + <a href="#" onclick="wiki_download_wiki('{{$wiki.resource_id}}'); return false;" title="{{$download}}" class="pull-right wikilist"><i class="fa fa-download"></i></a> + <a href="/wiki/{{$channel}}/{{$wiki.urlName}}/Home" title="{{$view}}"{{if $wiki.active}} class="active"{{/if}}>{{$wiki.title}}</a> + {{if $owner}} + <div id="edit-wiki-form-wrapper-{{$wiki.resource_id}}" class="section-content-tools-wrapper" style="display:none;"> + <form id="edit-wiki-form" action="wiki/edit/wiki" method="post" > + <div class="clear"></div> + <div class="btn-group pull-right"> + <button class="btn btn-xs btn-danger" onclick="wiki_delete_wiki('{{$wiki.title}}', '{{$wiki.resource_id}}'); return false;"><i class="fa fa-trash-o"></i> Delete Wiki</button> + </div> + </form> + <div class="clear"></div> + </div> + {{/if}} + </li> + {{/foreach}} + {{/if}} + {{if $owner}} + <li><a href="#" class="fakelink" onclick="wiki_show_new_wiki_form(); return false;"><i id="new-wiki-button" class="fa fa-plus-circle"></i> {{$addnew}}</a></li> + {{/if}} + </ul> + {{if $owner}} + <div id="new-wiki-form-wrapper" class="sub-menu" style="display:none;"> + <form id="new-wiki-form" action="wiki/{{$channel}}/create/wiki" method="post" class="acl-form" data-form_id="new-wiki-form" data-allow_cid='{{$allow_cid}}' data-allow_gid='{{$allow_gid}}' data-deny_cid='{{$deny_cid}}' data-deny_gid='{{$deny_gid}}'> + {{include file="field_input.tpl" field=$wikiName}} + {{include file="field_checkbox.tpl" field=$notify}} + <div> + <div id="profile-jot-submit-right" class="btn-group"> + <button id="dbtn-acl" class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" title="Permission settings" onclick="return false;"> + <i id="jot-perms-icon" class="fa fa-{{$lockstate}} jot-icons"></i>{{$bang}} + </button> + <button id="new-wiki-submit" class="btn btn-primary btn-sm" type="submit" name="submit" >{{$create}}</button> + </div> + </div> + </form> + <div class="clear"></div> + </div> + {{/if}} +</div> +{{$acl}} |