From 02ff6b77bc66867bee2563848c901178d0d1c2a3 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Wed, 6 Sep 2017 21:01:46 +0200 Subject: [PATCH 01/49] php xml package is required and sometimes not installed by default --- INSTALL.txt | 2 +- doc/Install.md | 2 +- doc/de/Install.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/INSTALL.txt b/INSTALL.txt index 592d3f5557..4a88ac8417 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -37,7 +37,7 @@ local .htaccess file - PHP *command line* access with register_argc_argv set to true in the php.ini file [or see 'poormancron' in section 8] - - curl, gd (with at least jpeg support), mysql, mbstring and openssl extensions + - curl, gd (with at least jpeg support), mysql, mbstring, xml and openssl extensions - some form of email server or email gateway such that PHP mail() works diff --git a/doc/Install.md b/doc/Install.md index 06ae77352b..cda58fa6f7 100644 --- a/doc/Install.md +++ b/doc/Install.md @@ -28,7 +28,7 @@ Requirements * Apache with mod-rewrite enabled and "Options All" so you can use a local .htaccess file * PHP 5.4+. * PHP *command line* access with register_argc_argv set to true in the php.ini file -* Curl, GD, PDO, MySQLi, hash and OpenSSL extensions +* Curl, GD, PDO, MySQLi, hash, xml and OpenSSL extensions * some form of email server or email gateway such that PHP mail() works * Mysql 5.5.3+ or an equivalant alternative for MySQL (MariaDB, Percona Server etc.) * the ability to schedule jobs with cron (Linux/Mac) or Scheduled Tasks (Windows) (Note: other options are presented in Section 7 of this document.) diff --git a/doc/de/Install.md b/doc/de/Install.md index 344117c56a..538641f1bd 100644 --- a/doc/de/Install.md +++ b/doc/de/Install.md @@ -24,7 +24,7 @@ Wir planen, diese Einschränkung in einer zukünftigen Version zu beheben. - Apache mit einer aktiverten mod-rewrite-Funktion und dem Eintrag "Options All", so dass du die lokale .htaccess-Datei nutzen kannst - PHP 5.2+. Je neuer, desto besser. Du benötigst 5.3 für die Authentifizierung untereinander. In einer Windows-Umgebung arbeitet die Version 5.2+ möglicherweise nicht, da die Funktion dns_get_record() erst ab Version 5.3 verfügbar ist. - PHP *Kommandozeilen*-Zugang mit register_argc_argv auf "true" gesetzt in der php.ini-Datei - - Curl, GD, PDO, MySQLi und OpenSSL-Erweiterung + - Curl, GD, PDO, MySQLi, xml und OpenSSL-Erweiterung - etwas in der Art eines Email-Servers oder eines Gateways wie PHP mail() - Mysql 5.x - die Möglichkeit, wiederkehrende Aufgaben mit cron (Linux/Mac) oder "Scheduled Tasks" einzustellen (Windows) [Beachte: andere Optionen sind in Abschnitt 7 dieser Dokumentation zu finden] From 66968efb9a71193ad2ace99387ac059d882775ec Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 6 Sep 2017 21:13:06 +0000 Subject: [PATCH 02/49] Logger date format is now ISO8601 compatible --- include/text.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/text.php b/include/text.php index 9b7b47a773..c2c6dcdfc9 100644 --- a/include/text.php +++ b/include/text.php @@ -748,7 +748,7 @@ function logger($msg, $level = 0) { $callers = debug_backtrace(); $logline = sprintf("%s@%s\t[%s]:%s:%s:%s\t%s\n", - datetime_convert(), + datetime_convert('UTC', 'UTC', 'now', 'Y-m-d\TH:i:s\Z'), $process_id, $LOGGER_LEVELS[$level], basename($callers[0]['file']), From 6e670df80f353ed31ed55f5f077c5d363963f2e9 Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 7 Sep 2017 15:34:50 +0000 Subject: [PATCH 03/49] OStatus: Better attachment handling for pictures --- include/ostatus.php | 45 +++++++++++++++++++++++++-------------------- include/text.php | 11 ++--------- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/include/ostatus.php b/include/ostatus.php index 809a48cd02..5fcf2003c3 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -351,17 +351,11 @@ class ostatus { continue; } - $item["body"] = add_page_info_to_body(html2bbcode($xpath->query('atom:content/text()', $entry)->item(0)->nodeValue)); + $item["body"] = html2bbcode($xpath->query('atom:content/text()', $entry)->item(0)->nodeValue); + //$item["body"] = add_page_info_to_body(html2bbcode($xpath->query('atom:content/text()', $entry)->item(0)->nodeValue)); $item["object-type"] = $xpath->query('activity:object-type/text()', $entry)->item(0)->nodeValue; $item["verb"] = $xpath->query('activity:verb/text()', $entry)->item(0)->nodeValue; - // Mastodon Content Warning - if (($item["verb"] == ACTIVITY_POST) && $xpath->evaluate('boolean(atom:summary)', $entry)) { - $clear_text = $xpath->query('atom:summary/text()', $entry)->item(0)->nodeValue; - - $item["body"] = html2bbcode($clear_text) . '[spoiler]' . $item["body"] . '[/spoiler]'; - } - if (($item["object-type"] == ACTIVITY_OBJ_BOOKMARK) || ($item["object-type"] == ACTIVITY_OBJ_EVENT)) { $item["title"] = $xpath->query('atom:title/text()', $entry)->item(0)->nodeValue; $item["body"] = $xpath->query('atom:summary/text()', $entry)->item(0)->nodeValue; @@ -464,7 +458,6 @@ class ostatus { } $self = ""; - $enclosure = ""; $links = $xpath->query('atom:link', $entry); if ($links) { @@ -488,14 +481,18 @@ class ostatus { } break; case "enclosure": - $enclosure = $attribute['href']; - if (strlen($item["attach"])) { - $item["attach"] .= ','; + $filetype = strtolower(substr($attribute['type'], 0, strpos($attribute['type'],'/'))); + if ($filetype == 'image') { + $item['body'] .= "\n[img]".$attribute['href'].'[/img]'; + } else { + if (strlen($item["attach"])) { + $item["attach"] .= ','; + } + if (!isset($attribute['length'])) { + $attribute['length'] = "0"; + } + $item["attach"] .= '[attach]href="'.$attribute['href'].'" length="'.$attribute['length'].'" type="'.$attribute['type'].'" title="'.$attribute['title'].'"[/attach]'; } - if (!isset($attribute['length'])) { - $attribute['length'] = "0"; - } - $item["attach"] .= '[attach]href="'.$attribute['href'].'" length="'.$attribute['length'].'" type="'.$attribute['type'].'" title="'.$attribute['title'].'"[/attach]'; break; case "related": if ($item["object-type"] != ACTIVITY_OBJ_BOOKMARK) { @@ -523,6 +520,18 @@ class ostatus { } } + // Only add additional data when there is no picture in the post + if (!strstr($item["body"],'[/img]')) { + $item["body"] = add_page_info_to_body($item["body"]); + } + + // Mastodon Content Warning + if (($item["verb"] == ACTIVITY_POST) && $xpath->evaluate('boolean(atom:summary)', $entry)) { + $clear_text = $xpath->query('atom:summary/text()', $entry)->item(0)->nodeValue; + + $item["body"] = html2bbcode($clear_text) . '[spoiler]' . $item["body"] . '[/spoiler]'; + } + $local_id = ""; $repeat_of = ""; @@ -601,7 +610,6 @@ class ostatus { foreach ($enclosures AS $link) { $attribute = self::read_attributes($link); if ($href != "") { - $enclosure = $attribute['href']; if (strlen($item["attach"])) { $item["attach"] .= ','; } @@ -615,9 +623,6 @@ class ostatus { } } - //if ($enclosure != "") - // $item["body"] .= add_page_info($enclosure); - if (isset($item["parent-uri"])) { $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s'", intval($importer["uid"]), dbesc($item["parent-uri"])); diff --git a/include/text.php b/include/text.php index c2c6dcdfc9..66d4f17ea6 100644 --- a/include/text.php +++ b/include/text.php @@ -1424,15 +1424,8 @@ function prepare_body(&$item, $attach = false, $preview = false) { $title = ((strlen(trim($mtch[4]))) ? escape_tags(trim($mtch[4])) : escape_tags($mtch[1])); $title .= ' ' . $mtch[2] . ' ' . t('bytes'); - if (($filetype == 'image') AND ($item['network'] == NETWORK_OSTATUS)) { - /// @todo Respect the spoiler for mastodon - $icon = ''; - $s .= '
' . $icon . ''; - } else { - $icon = '
'; - $as .= '' . $icon . ''; - } - + $icon = '
'; + $as .= '' . $icon . ''; } } } From c3eaf336dc3d0923438b127c404099091c6084ed Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 7 Sep 2017 15:48:25 +0000 Subject: [PATCH 04/49] Removed code --- include/ostatus.php | 1 - 1 file changed, 1 deletion(-) diff --git a/include/ostatus.php b/include/ostatus.php index 5fcf2003c3..7fd920d635 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -352,7 +352,6 @@ class ostatus { } $item["body"] = html2bbcode($xpath->query('atom:content/text()', $entry)->item(0)->nodeValue); - //$item["body"] = add_page_info_to_body(html2bbcode($xpath->query('atom:content/text()', $entry)->item(0)->nodeValue)); $item["object-type"] = $xpath->query('activity:object-type/text()', $entry)->item(0)->nodeValue; $item["verb"] = $xpath->query('activity:verb/text()', $entry)->item(0)->nodeValue; From 6e196a6afd34cef7635c2d4c06d4147a2930c8a2 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 8 Sep 2017 05:36:00 +0000 Subject: [PATCH 05/49] Diaspora will introduce "like on comment" so we doing it as well --- include/diaspora.php | 12 ++++++++++-- object/Item.php | 17 +++++------------ 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/include/diaspora.php b/include/diaspora.php index 1907c0d5ad..8bfba6eff4 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -1182,7 +1182,7 @@ class Diaspora { * @return array the item record */ private static function parent_item($uid, $guid, $author, $contact) { - $r = q("SELECT `id`, `body`, `wall`, `uri`, `private`, `origin`, + $r = q("SELECT `id`, `parent`, `body`, `wall`, `uri`, `private`, `origin`, `author-name`, `author-link`, `author-avatar`, `owner-name`, `owner-link`, `owner-avatar` FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1", @@ -1776,8 +1776,16 @@ class Diaspora { logger("Stored like ".$datarray["guid"]." with message id ".$message_id, LOGGER_DEBUG); } + // like on comments have the comment as parent. So we need to fetch the toplevel parent + if ($parent_item["id"] != $parent_item["parent"]) { + $toplevel = dba::select('item', array('origin'), array('id' => $parent_item["parent"]), array('limit' => 1)); + $origin = $toplevel["origin"]; + } else { + $origin = $parent_item["origin"]; + } + // If we are the origin of the parent we store the original data and notify our followers - if ($message_id && $parent_item["origin"]) { + if ($message_id && $origin) { // Formerly we stored the signed text, the signature and the author in different fields. // We now store the raw data so that we are more flexible. diff --git a/object/Item.php b/object/Item.php index f81b8ea4e8..816406e4eb 100644 --- a/object/Item.php +++ b/object/Item.php @@ -68,6 +68,11 @@ class Item extends BaseObject { continue; } + // You can always comment on Diaspora items + if (($item['network'] == NETWORK_DIASPORA) && (local_user() == $item['uid'])) { + $item['writable'] = true; + } + $item['pagedrop'] = $data['pagedrop']; $child = new Item($item); $this->add_child($child); @@ -319,18 +324,6 @@ class Item extends BaseObject { unset($buttons["like"]); } - // Diaspora isn't able to do likes on comments - but Hubzilla does - /// @todo When Diaspora will pass this information we will remove these lines - if (($item["item_network"] == NETWORK_DIASPORA) && ($indent == 'comment') && - !Diaspora::is_redmatrix($item["owner-link"]) && isset($buttons["like"])) { - unset($buttons["like"]); - } - - // Facebook can like comments - but it isn't programmed in the connector yet. - if (($item["item_network"] == NETWORK_FACEBOOK) && ($indent == 'comment') && isset($buttons["like"])) { - unset($buttons["like"]); - } - $tmp_item = array( 'template' => $this->get_template(), 'type' => implode("",array_slice(explode("/",$item['verb']),-1)), From 3c6d83acd92e9058f54d61e991369de5e0ed3801 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 8 Sep 2017 07:00:38 +0000 Subject: [PATCH 06/49] Remote self should now finally trigger all addons --- include/items.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/items.php b/include/items.php index eb9f44c3eb..df13202710 100644 --- a/include/items.php +++ b/include/items.php @@ -1598,6 +1598,10 @@ function item_is_remote_self($contact, &$datarray) { // Trigger automatic reactions for addons $datarray['api_source'] = true; + // We have to tell the hooks who we are - this really should be improved + $_SESSION["authenticated"] = true; + $_SESSION["uid"] = $contact['uid']; + unset($datarray['created']); unset($datarray['edited']); } From a5a4f5328761962e3e537f61da36cdcb49983bc3 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 8 Sep 2017 07:08:06 +0000 Subject: [PATCH 07/49] This is a better place --- include/items.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/include/items.php b/include/items.php index df13202710..ec4c986a18 100644 --- a/include/items.php +++ b/include/items.php @@ -1595,13 +1595,6 @@ function item_is_remote_self($contact, &$datarray) { $datarray['author-link'] = $datarray['owner-link']; $datarray['author-avatar'] = $datarray['owner-avatar']; - // Trigger automatic reactions for addons - $datarray['api_source'] = true; - - // We have to tell the hooks who we are - this really should be improved - $_SESSION["authenticated"] = true; - $_SESSION["uid"] = $contact['uid']; - unset($datarray['created']); unset($datarray['edited']); } @@ -1627,6 +1620,13 @@ function item_is_remote_self($contact, &$datarray) { $datarray["app"] = "Feed"; } + // Trigger automatic reactions for addons + $datarray['api_source'] = true; + + // We have to tell the hooks who we are - this really should be improved + $_SESSION["authenticated"] = true; + $_SESSION["uid"] = $contact['uid']; + return true; } From c44448dd57683b29c3200d87d6274bf5dbe326e7 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 8 Sep 2017 08:50:08 +0000 Subject: [PATCH 08/49] We should reset the session variable --- include/poller.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/poller.php b/include/poller.php index 9758ab9464..d43257fc9f 100644 --- a/include/poller.php +++ b/include/poller.php @@ -303,6 +303,9 @@ function poller_exec_function($queue, $funcname, $argv) { $up_duration = number_format(microtime(true) - $poller_up_start, 3); + // Reset global data to avoid interferences + unset($_SESSION); + $funcname($argv, $argc); $a->process_id = $old_process_id; From 637eb0bfb495399502f3a8faf500572c143cdfc3 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 8 Sep 2017 15:14:33 +0000 Subject: [PATCH 09/49] Bugfix: Mails weren't sent --- boot.php | 2 ++ include/dbstructure.php | 2 +- include/enotify.php | 18 ++++++++++-------- include/user.php | 4 ++-- mod/admin.php | 2 +- mod/lostpass.php | 4 ++-- 6 files changed, 18 insertions(+), 14 deletions(-) diff --git a/boot.php b/boot.php index c3ad39cd57..b8be70229c 100644 --- a/boot.php +++ b/boot.php @@ -320,6 +320,8 @@ define ( 'NOTIFY_TAGSHARE', 0x0100 ); define ( 'NOTIFY_POKE', 0x0200 ); define ( 'NOTIFY_SHARE', 0x0400 ); +define ( 'SYSTEM_EMAIL', 0x4000 ); + define ( 'NOTIFY_SYSTEM', 0x8000 ); /* @}*/ diff --git a/include/dbstructure.php b/include/dbstructure.php index a2599fc392..d87f3948d2 100644 --- a/include/dbstructure.php +++ b/include/dbstructure.php @@ -74,7 +74,7 @@ function update_fail($update_id, $error_message) { $body = sprintf($body, $error_message); notification(array( - 'type' => "SYSTEM_EMAIL", + 'type' => SYSTEM_EMAIL, 'to_email' => $admin['email'], 'preamble' => $preamble, 'body' => $body, diff --git a/include/enotify.php b/include/enotify.php index 62328c01fd..10723fb418 100644 --- a/include/enotify.php +++ b/include/enotify.php @@ -46,12 +46,14 @@ function notification($params) { if (empty($sender_email)) $sender_email = t('noreply').'@'.$hostname; - $user = dba::select('user', array('nickname', 'page-flags'), + if ($params['type'] != SYSTEM_EMAIL) { + $user = dba::select('user', array('nickname', 'page-flags'), array('uid' => $params['uid']), array('limit' => 1)); - // There is no need to create notifications for forum accounts - if (!dbm::is_result($user) || in_array($user["page-flags"], array(PAGE_COMMUNITY, PAGE_PRVGROUP))) { - return; + // There is no need to create notifications for forum accounts + if (!dbm::is_result($user) || in_array($user["page-flags"], array(PAGE_COMMUNITY, PAGE_PRVGROUP))) { + return; + } } $nickname = $user["nickname"]; @@ -366,7 +368,7 @@ function notification($params) { } } - if ($params['type'] == "SYSTEM_EMAIL") { + if ($params['type'] == SYSTEM_EMAIL) { // not part of the notifications. // it just send a mail to the user. // It will be used by the system to send emails to users (like @@ -517,7 +519,7 @@ function notification($params) { // send email notification if notification preferences permit if ((intval($params['notify_flags']) & intval($params['type'])) || $params['type'] == NOTIFY_SYSTEM - || $params['type'] == "SYSTEM_EMAIL") { + || $params['type'] == SYSTEM_EMAIL) { logger('sending notification email'); @@ -586,8 +588,8 @@ function notification($params) { call_hooks('enotify_mail', $datarray); // check whether sending post content in email notifications is allowed - // always true for "SYSTEM_EMAIL" - $content_allowed = ((!get_config('system', 'enotify_no_content')) || ($params['type'] == "SYSTEM_EMAIL")); + // always true for SYSTEM_EMAIL + $content_allowed = ((!get_config('system', 'enotify_no_content')) || ($params['type'] == SYSTEM_EMAIL)); // load the template for private message notifications $tpl = get_markup_template('email_notify_html.tpl'); diff --git a/include/user.php b/include/user.php index 4ed5e57f3d..a05bd831a8 100644 --- a/include/user.php +++ b/include/user.php @@ -404,7 +404,7 @@ function send_register_pending_eml($email, $sitename, $username) { $body = sprintf($body, $username, $sitename); return notification(array( - 'type' => "SYSTEM_EMAIL", + 'type' => SYSTEM_EMAIL, 'to_email' => $email, 'subject'=> sprintf( t('Registration at %s'), $sitename), 'body' => $body)); @@ -450,7 +450,7 @@ function send_register_open_eml($email, $sitename, $siteurl, $username, $passwor $body = sprintf($body, $email, $sitename, $siteurl, $username, $password); return notification(array( - 'type' => "SYSTEM_EMAIL", + 'type' => SYSTEM_EMAIL, 'to_email' => $email, 'subject'=> sprintf( t('Registration details for %s'), $sitename), 'preamble'=> $preamble, diff --git a/mod/admin.php b/mod/admin.php index c5043f2252..6d1adc7012 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -1395,7 +1395,7 @@ function admin_page_users_post(App $a) { $body = sprintf($body, System::baseUrl(), $nu['email'], $result['password'], $a->config['sitename']); notification(array( - 'type' => "SYSTEM_EMAIL", + 'type' => SYSTEM_EMAIL, 'to_email' => $nu['email'], 'subject'=> sprintf(t('Registration details for %s'), $a->config['sitename']), 'preamble'=> $preamble, diff --git a/mod/lostpass.php b/mod/lostpass.php index a2e69ffb09..e7e1a33bd0 100644 --- a/mod/lostpass.php +++ b/mod/lostpass.php @@ -69,7 +69,7 @@ function lostpass_post(App $a) { $body = sprintf($body, $resetlink, System::baseUrl(), $email); notification(array( - 'type' => "SYSTEM_EMAIL", + 'type' => SYSTEM_EMAIL, 'to_email' => $email, 'subject'=> sprintf( t('Password reset requested at %s'),$sitename), 'preamble'=> $preamble, @@ -145,7 +145,7 @@ function lostpass_content(App $a) { $body = sprintf($body, System::baseUrl(), $email, $new_password); notification(array( - 'type' => "SYSTEM_EMAIL", + 'type' => SYSTEM_EMAIL, 'to_email' => $email, 'subject'=> sprintf( t('Your password has been changed at %s'),$sitename), 'preamble'=> $preamble, From 52b12fccc94a7ed1f0304e24e746436971f08a4f Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 9 Sep 2017 07:43:50 +0000 Subject: [PATCH 10/49] OStatus: Attached pictures now show up in repeated posts as well. --- include/ostatus.php | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/include/ostatus.php b/include/ostatus.php index 7fd920d635..1f81d96157 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -458,6 +458,8 @@ class ostatus { $self = ""; + $add_body = ""; + $links = $xpath->query('atom:link', $entry); if ($links) { foreach ($links AS $link) { @@ -482,7 +484,7 @@ class ostatus { case "enclosure": $filetype = strtolower(substr($attribute['type'], 0, strpos($attribute['type'],'/'))); if ($filetype == 'image') { - $item['body'] .= "\n[img]".$attribute['href'].'[/img]'; + $add_body .= "\n[img]".$attribute['href'].'[/img]'; } else { if (strlen($item["attach"])) { $item["attach"] .= ','; @@ -519,18 +521,6 @@ class ostatus { } } - // Only add additional data when there is no picture in the post - if (!strstr($item["body"],'[/img]')) { - $item["body"] = add_page_info_to_body($item["body"]); - } - - // Mastodon Content Warning - if (($item["verb"] == ACTIVITY_POST) && $xpath->evaluate('boolean(atom:summary)', $entry)) { - $clear_text = $xpath->query('atom:summary/text()', $entry)->item(0)->nodeValue; - - $item["body"] = html2bbcode($clear_text) . '[spoiler]' . $item["body"] . '[/spoiler]'; - } - $local_id = ""; $repeat_of = ""; @@ -587,7 +577,7 @@ class ostatus { $item["author-link"] = $orig_author["author-link"]; $item["author-avatar"] = $orig_author["author-avatar"]; - $item["body"] = add_page_info_to_body(html2bbcode($orig_body)); + $item["body"] = html2bbcode($orig_body); $item["created"] = $orig_created; $item["edited"] = $orig_edited; @@ -622,6 +612,20 @@ class ostatus { } } + $item["body"] .= $add_body; + + // Only add additional data when there is no picture in the post + if (!strstr($item["body"],'[/img]')) { + $item["body"] = add_page_info_to_body($item["body"]); + } + + // Mastodon Content Warning + if (($item["verb"] == ACTIVITY_POST) && $xpath->evaluate('boolean(atom:summary)', $entry)) { + $clear_text = $xpath->query('atom:summary/text()', $entry)->item(0)->nodeValue; + + $item["body"] = html2bbcode($clear_text) . '[spoiler]' . $item["body"] . '[/spoiler]'; + } + if (isset($item["parent-uri"])) { $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s'", intval($importer["uid"]), dbesc($item["parent-uri"])); From 4b403e4fe2e38b4387dbf275dd069a5c415cab5b Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 10 Sep 2017 07:21:23 +0000 Subject: [PATCH 11/49] OStatus: Reworked import --- include/cron.php | 6 - include/cronjobs.php | 14 - include/dfrn.php | 30 +- include/ostatus.php | 1623 +++++++++++++----------------------------- mod/display.php | 2 +- 5 files changed, 532 insertions(+), 1143 deletions(-) diff --git a/include/cron.php b/include/cron.php index ccac49b637..8b0fab77ab 100644 --- a/include/cron.php +++ b/include/cron.php @@ -42,12 +42,6 @@ function cron_run(&$argv, &$argc){ // Expire and remove user entries proc_run(PRIORITY_MEDIUM, "include/cronjobs.php", "expire_and_remove_users"); - // Check OStatus conversations - proc_run(PRIORITY_MEDIUM, "include/cronjobs.php", "ostatus_mentions"); - - // Check every conversation - proc_run(PRIORITY_MEDIUM, "include/cronjobs.php", "ostatus_conversations"); - // Call possible post update functions proc_run(PRIORITY_LOW, "include/cronjobs.php", "post_update"); diff --git a/include/cronjobs.php b/include/cronjobs.php index 53316e464f..437fedd53c 100644 --- a/include/cronjobs.php +++ b/include/cronjobs.php @@ -8,7 +8,6 @@ function cronjobs_run(&$argv, &$argc){ global $a; require_once 'include/datetime.php'; - require_once 'include/ostatus.php'; require_once 'include/post_update.php'; require_once 'mod/nodeinfo.php'; require_once 'include/photos.php'; @@ -22,19 +21,6 @@ function cronjobs_run(&$argv, &$argc){ logger("Starting cronjob ".$argv[1], LOGGER_DEBUG); - // Check OStatus conversations - // Check only conversations with mentions (for a longer time) - if ($argv[1] == 'ostatus_mentions') { - ostatus::check_conversations(true); - return; - } - - // Check every conversation - if ($argv[1] == 'ostatus_conversations') { - ostatus::check_conversations(false); - return; - } - // Call possible post update functions // see include/post_update.php for more details if ($argv[1] == 'post_update') { diff --git a/include/dfrn.php b/include/dfrn.php index 4c8f828af6..0b12f4d615 100644 --- a/include/dfrn.php +++ b/include/dfrn.php @@ -303,7 +303,7 @@ class dfrn { AND (NOT `contact`.`blocked` OR `contact`.`pending`) LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id` WHERE `item`.`id` = %d AND `item`.`visible` AND NOT `item`.`moderated` AND `item`.`parent` != 0 - AND `item`.`wall` AND NOT `item`.`private`", + AND NOT `item`.`private`", intval($item_id) ); @@ -330,12 +330,9 @@ class dfrn { $alternatelink = $owner['url']; - $root = self::add_header($doc, $owner, 'dfrn:owner', $alternatelink, true); - $type = 'html'; - $entry = self::entry($doc, $type, $item, $owner, true); - $root->appendChild($entry); + $root = self::entry($doc, $type, $item, $owner, true, 0, true); $atom = trim($doc->saveXML()); return $atom; @@ -827,7 +824,7 @@ class dfrn { * @return object XML entry object * @todo Add type-hints */ - private static function entry($doc, $type, $item, $owner, $comment = false, $cid = 0) { + private static function entry($doc, $type, $item, $owner, $comment = false, $cid = 0, $single = false) { $mentioned = array(); @@ -840,7 +837,22 @@ class dfrn { return xml::create_element($doc, "at:deleted-entry", "", $attributes); } - $entry = $doc->createElement("entry"); + if (!$single) { + $entry = $doc->createElement("entry"); + } else { + $entry = $doc->createElementNS(NAMESPACE_ATOM1, 'entry'); + $doc->appendChild($entry); + + $entry->setAttribute("xmlns:thr", NAMESPACE_THREAD); + $entry->setAttribute("xmlns:at", NAMESPACE_TOMB); + $entry->setAttribute("xmlns:media", NAMESPACE_MEDIA); + $entry->setAttribute("xmlns:dfrn", NAMESPACE_DFRN); + $entry->setAttribute("xmlns:activity", NAMESPACE_ACTIVITY); + $entry->setAttribute("xmlns:georss", NAMESPACE_GEORSS); + $entry->setAttribute("xmlns:poco", NAMESPACE_POCO); + $entry->setAttribute("xmlns:ostatus", NAMESPACE_OSTATUS); + $entry->setAttribute("xmlns:statusnet", NAMESPACE_STATUSNET); + } if ($item['allow_cid'] || $item['allow_gid'] || $item['deny_cid'] || $item['deny_gid']) { $body = fix_private_photos($item['body'],$owner['uid'],$item,$cid); @@ -868,10 +880,10 @@ class dfrn { $entry->appendChild($dfrnowner); if (($item['parent'] != $item['id']) || ($item['parent-uri'] !== $item['uri']) || (($item['thr-parent'] !== '') && ($item['thr-parent'] !== $item['uri']))) { - $parent = q("SELECT `guid` FROM `item` WHERE `id` = %d", intval($item["parent"])); $parent_item = (($item['thr-parent']) ? $item['thr-parent'] : $item['parent-uri']); + $parent = q("SELECT `guid`,`plink` FROM `item` WHERE `uri` = '%s' AND `uid` = %d", dbesc($parent_item), intval($item['uid'])); $attributes = array("ref" => $parent_item, "type" => "text/html", - "href" => System::baseUrl().'/display/'.$parent[0]['guid'], + "href" => $parent[0]['plink'], "dfrn:diaspora_guid" => $parent[0]['guid']); xml::add_element($doc, $entry, "thr:in-reply-to", "", $attributes); } diff --git a/include/ostatus.php b/include/ostatus.php index 1f81d96157..124f421bf1 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -33,6 +33,516 @@ class ostatus { const OSTATUS_DEFAULT_POLL_TIMEFRAME = 1440; // given in minutes const OSTATUS_DEFAULT_POLL_TIMEFRAME_MENTIONS = 14400; // given in minutes + private static $itemlist; + + /** + * @brief Imports an XML string containing OStatus elements + * + * @param string $xml The XML + * @param array $importer user record of the importing user + * @param $contact + * @param array $hub Called by reference, returns the fetched hub data + */ + public static function import($xml, $importer, &$contact, &$hub) { + self::process($xml, $importer, $contact, $hub); + } + + /** + * @brief Imports an XML string containing OStatus elements + * + * @param string $xml The XML + * @param array $importer user record of the importing user + * @param $contact + * @param array $hub Called by reference, returns the fetched hub data + */ + private static function process($xml, $importer, &$contact, &$hub, $stored = false, $initialize = true) { + if ($initialize) { + self::$itemlist = array(); + } + + logger("Import OStatus message", LOGGER_DEBUG); + + if ($xml == "") { + return false; + } + $doc = new DOMDocument(); + @$doc->loadXML($xml); + + $xpath = new DomXPath($doc); + $xpath->registerNamespace('atom', NAMESPACE_ATOM1); + $xpath->registerNamespace('thr', NAMESPACE_THREAD); + $xpath->registerNamespace('georss', NAMESPACE_GEORSS); + $xpath->registerNamespace('activity', NAMESPACE_ACTIVITY); + $xpath->registerNamespace('media', NAMESPACE_MEDIA); + $xpath->registerNamespace('poco', NAMESPACE_POCO); + $xpath->registerNamespace('ostatus', NAMESPACE_OSTATUS); + $xpath->registerNamespace('statusnet', NAMESPACE_STATUSNET); + + $hub = ""; + $hub_attributes = $xpath->query("/atom:feed/atom:link[@rel='hub']")->item(0)->attributes; + if (is_object($hub_attributes)) { + foreach ($hub_attributes AS $hub_attribute) { + if ($hub_attribute->name == "href") { + $hub = $hub_attribute->textContent; + logger("Found hub ".$hub, LOGGER_DEBUG); + } + } + } + + $header = array(); + $header["uid"] = $importer["uid"]; + $header["network"] = NETWORK_OSTATUS; + $header["type"] = "remote"; + $header["wall"] = 0; + $header["origin"] = 0; + $header["gravity"] = GRAVITY_PARENT; + + $first_child = $doc->firstChild->tagName; + + if ($first_child == "feed") { + $entries = $xpath->query('/atom:feed/atom:entry'); + $header["protocol"] = PROTOCOL_OSTATUS_FEED; + } else { + $entries = $xpath->query('/atom:entry'); + $header["protocol"] = PROTOCOL_OSTATUS_SALMON; + } + + // Fetch the first author + $authordata = $xpath->query('//author')->item(0); + $author = self::fetchauthor($xpath, $authordata, $importer, $contact, $stored); + + $entry = $xpath->query('/atom:entry'); + $header["protocol"] = PROTOCOL_OSTATUS_SALMON; + + // Reverse the order of the entries + $entrylist = array(); + + foreach ($entries AS $entry) { + $entrylist[] = $entry; + } + + if (!$initialize && (count($entrylist) > 1)) { + return false; + } + + foreach (array_reverse($entrylist) AS $entry) { + // fetch the author + $authorelement = $xpath->query('/atom:entry/atom:author', $entry); + if ($authorelement->length > 0) { + $author = self::fetchauthor($xpath, $entry, $importer, $contact, $stored); + } + + $value = $xpath->evaluate('atom:author/poco:preferredUsername/text()', $entry)->item(0)->nodeValue; + if ($value != "") { + $nickname = $value; + } else { + $nickname = $author["author-name"]; + } + + $item = array_merge($header, $author); + + $item["verb"] = $xpath->query('activity:verb/text()', $entry)->item(0)->nodeValue; + + /// Delete a message + if ($item["verb"] == "qvitter-delete-notice" || $item["verb"] == ACTIVITY_DELETE) { + // ignore "Delete" messages (by now) + logger("Ignore delete message ".print_r($item, true)); + continue; + } + + if ($item["verb"] == ACTIVITY_JOIN) { + // ignore "Join" messages + logger("Ignore join message ".print_r($item, true)); + continue; + } + + if ($item["verb"] == ACTIVITY_FOLLOW) { + new_follower($importer, $contact, $item, $nickname); + continue; + } + + if ($item["verb"] == NAMESPACE_OSTATUS."/unfollow") { + lose_follower($importer, $contact, $item, $dummy); + continue; + } + + if ($item["verb"] == NAMESPACE_OSTATUS."/unfavorite") { + // Ignore "Unfavorite" message + logger("Ignore unfavorite message ".print_r($item, true)); + continue; + } + + if ($item["verb"] == ACTIVITY_FAVORITE) { + $orig_uri = $xpath->query("activity:object/atom:id", $entry)->item(0)->nodeValue; + logger("Favorite ".$orig_uri." ".print_r($item, true)); + + $item["verb"] = ACTIVITY_LIKE; + $item["parent-uri"] = $orig_uri; + $item["gravity"] = GRAVITY_LIKE; + } + + // http://activitystrea.ms/schema/1.0/rsvp-yes + if (!in_array($item["verb"], array(ACTIVITY_POST, ACTIVITY_LIKE, ACTIVITY_SHARE))) { + logger("Unhandled verb ".$item["verb"]." ".print_r($item, true)); + } + + $doc2 = new DOMDocument(); + $doc2->loadXML($xml); + $doc2->preserveWhiteSpace = false; + $doc2->formatOutput = true; + $xml2 = $doc2->saveXML(); + + $item["source"] = $xml2; + + self::processPost($xpath, $entry, $item, $importer); + + if ($initialize && (count(self::$itemlist) > 0)) { + // We will import it everytime, when it is started by our contacts + $valid = !empty(self::$itemlist[0]['contact-id']); + if (!$valid) { + // If not, then it depends on this setting + $valid = !Config::get('system','ostatus_full_threads'); + } + + if ($valid) { + // But we will only import complete threads + $valid = self::$itemlist[0]['uri'] == self::$itemlist[0]['parent-uri']; + } + + if ($valid) { + // Never post a thread when the only interaction by our contact was a like + $valid = false; + $verbs = array(ACTIVITY_POST, ACTIVITY_SHARE); + foreach (self::$itemlist AS $item) { + if (!empty($item['contact-id']) && in_array($item['verb'], $verbs)) { + $valid = true; + } + } + } + + if ($valid) { + $default_contact = 0; + $key = count(self::$itemlist); + for ($key = count(self::$itemlist) - 1; $key >= 0; $key--) { + if (empty(self::$itemlist[$key]['contact-id'])) { + self::$itemlist[$key]['contact-id'] = $default_contact; + } else { + $default_contact = $item['contact-id']; + } + } + foreach (self::$itemlist AS $item) { + $found = dba::exists('item', array('uid' => $importer["uid"], 'uri' => $item["uri"])); + if ($found) { + logger("Item with uri ".$item["uri"]." for user ".$importer["uid"]." already exists.", LOGGER_DEBUG); + } else { + $ret = item_store($item); + logger('Item was stored with return value '.$ret); + } + } + } + self::$itemlist = array(); + } + } + return true; + } + + private static function processPost($xpath, $entry, &$item, $importer) { + $item["uri"] = $xpath->query('atom:id/text()', $entry)->item(0)->nodeValue; + $item["body"] = html2bbcode($xpath->query('atom:content/text()', $entry)->item(0)->nodeValue); + $item["object-type"] = $xpath->query('activity:object-type/text()', $entry)->item(0)->nodeValue; + if (($item["object-type"] == ACTIVITY_OBJ_BOOKMARK) || ($item["object-type"] == ACTIVITY_OBJ_EVENT)) { + $item["title"] = $xpath->query('atom:title/text()', $entry)->item(0)->nodeValue; + $item["body"] = $xpath->query('atom:summary/text()', $entry)->item(0)->nodeValue; + } elseif ($item["object-type"] == ACTIVITY_OBJ_QUESTION) { + $item["title"] = $xpath->query('atom:title/text()', $entry)->item(0)->nodeValue; + } + + $item["created"] = $xpath->query('atom:published/text()', $entry)->item(0)->nodeValue; + $item["edited"] = $xpath->query('atom:updated/text()', $entry)->item(0)->nodeValue; + $conversation = $xpath->query('ostatus:conversation/text()', $entry)->item(0)->nodeValue; + $item['conversation-uri'] = $conversation; + + $conv = $xpath->query('ostatus:conversation', $entry); + if (is_object($conv->item(0))) { + foreach ($conv->item(0)->attributes AS $attributes) { + if ($attributes->name == "ref") { + $item['conversation-uri'] = $attributes->textContent; + } + if ($attributes->name == "href") { + $item['conversation-href'] = $attributes->textContent; + } + } + } + + if (empty($item['conversation-href']) && !empty($item['conversation-uri'])) { + $item['conversation-href'] = $item['conversation-uri']; + } + + $related = ""; + + $inreplyto = $xpath->query('thr:in-reply-to', $entry); + if (is_object($inreplyto->item(0))) { + foreach ($inreplyto->item(0)->attributes AS $attributes) { + if ($attributes->name == "ref") { + $item["parent-uri"] = $attributes->textContent; + } + if ($attributes->name == "href") { + $related = $attributes->textContent; + } + } + } + + $georsspoint = $xpath->query('georss:point', $entry); + if (!empty($georsspoint) && ($georsspoint->length > 0)) { + $item["coord"] = $georsspoint->item(0)->nodeValue; + } + + $categories = $xpath->query('atom:category', $entry); + if ($categories) { + foreach ($categories AS $category) { + foreach ($category->attributes AS $attributes) { + if ($attributes->name == "term") { + $term = $attributes->textContent; + if (strlen($item["tag"])) { + $item["tag"] .= ','; + } + $item["tag"] .= "#[url=".System::baseUrl()."/search?tag=".$term."]".$term."[/url]"; + } + } + } + } + + $self = ''; + $add_body = ''; + + $links = $xpath->query('atom:link', $entry); + if ($links) { + $link_data = self::processLinks($links, $item); + $self = $link_data['self']; + $add_body = $link_data['add_body']; + } + + $repeat_of = ""; + + $notice_info = $xpath->query('statusnet:notice_info', $entry); + if ($notice_info && ($notice_info->length > 0)) { + foreach ($notice_info->item(0)->attributes AS $attributes) { + if ($attributes->name == "source") { + $item["app"] = strip_tags($attributes->textContent); + } + if ($attributes->name == "repeat_of") { + $repeat_of = $attributes->textContent; + } + } + } + // Is it a repeated post? + if (($repeat_of != "") || ($item["verb"] == ACTIVITY_SHARE)) { + $link_data = self::processRepeatedItem($xpath, $entry, $item, $importer); + if (!empty($link_data['add_body'])) { + $add_body .= $link_data['add_body']; + } + } + + $item["body"] .= $add_body; + + // Only add additional data when there is no picture in the post + if (!strstr($item["body"],'[/img]')) { + $item["body"] = add_page_info_to_body($item["body"]); + } + + // Mastodon Content Warning + if (($item["verb"] == ACTIVITY_POST) && $xpath->evaluate('boolean(atom:summary)', $entry)) { + $clear_text = $xpath->query('atom:summary/text()', $entry)->item(0)->nodeValue; + + $item["body"] = html2bbcode($clear_text) . '[spoiler]' . $item["body"] . '[/spoiler]'; + } + + if (isset($item["parent-uri"]) && ($related != '')) { + self::FetchRelated($related, $item["parent-uri"], $importer); + $item["type"] = 'remote-comment'; + $item["gravity"] = GRAVITY_COMMENT; + } else { + $item["parent-uri"] = $item["uri"]; + } + + if ($item['author-link'] != '') { + $item = store_conversation($item); + } + + self::$itemlist[] = $item; + } + + private static function fetchRelated($related, $related_uri, $importer) { + $condition = array('`item-uri` = ? AND `protocol` IN (?, ?)', $related_uri, PROTOCOL_DFRN, PROTOCOL_OSTATUS_SALMON); + $conversation = dba::select('conversation', array('source', 'protocol'), $condition, array('limit' => 1)); + if (dbm::is_result($conversation)) { + $stored = true; + $xml = $conversation['source']; + if (self::process($xml, $importer, $contact, $hub, $stored, false)) { + return; + } + if ($conversation['protocol'] == PROTOCOL_OSTATUS_SALMON) { + dba::delete('conversation', array('item-uri' => $related_uri)); + } + } + + $stored = false; + $related_data = z_fetch_url($related); + + if (!$related_data['success']) { + return; + } + + $xml = ''; + + if (stristr($related_data['header'], 'Content-Type: application/atom+xml')) { + $xml = $related_data['body']; + } + + if ($xml == '') { + $doc = new DOMDocument(); + if (!@$doc->loadHTML($related_data['body'])) { + return; + } + $xpath = new DomXPath($doc); + + $links = $xpath->query('//link'); + if ($links) { + foreach ($links AS $link) { + $attribute = self::read_attributes($link); + if (($attribute['rel'] == 'alternate') && ($attribute['type'] == 'application/atom+xml')) { + $related_atom = z_fetch_url($attribute['href']); + + if ($related_atom['success']) { + $xml = $related_atom['body']; + } + } + } + } + } + + // Workaround for older GNU Social servers + if (($xml == '') && strstr($related, '/notice/')) { + $related_atom = z_fetch_url(str_replace('/notice/', '/api/statuses/show/', $related).',atom'); + + if ($related_atom['success']) { + $xml = $related_atom['body']; + } + } + + if ($xml != '') { + self::process($xml, $importer, $contact, $hub, $stored, false); + } + return; + } + + private static function processRepeatedItem($xpath, $entry, &$item, $importer) { + $activityobjects = $xpath->query('activity:object', $entry)->item(0); + + if (!is_object($activityobjects)) { + return array(); + } + + $link_data = array(); + + $orig_uri = $xpath->query('atom:id/text()', $activityobjects)->item(0)->nodeValue; + + $links = $xpath->query("atom:link", $activityobjects); + if ($links) { + $link_data = self::processLinks($links, $item); + } + + $orig_body = $xpath->query('atom:content/text()', $activityobjects)->item(0)->nodeValue; + $orig_created = $xpath->query('atom:published/text()', $activityobjects)->item(0)->nodeValue; + $orig_edited = $xpath->query('atom:updated/text()', $activityobjects)->item(0)->nodeValue; + + $orig_contact = $contact; + $orig_author = self::fetchauthor($xpath, $activityobjects, $importer, $orig_contact, false); + + $item["author-name"] = $orig_author["author-name"]; + $item["author-link"] = $orig_author["author-link"]; + $item["author-avatar"] = $orig_author["author-avatar"]; + + $item["body"] = html2bbcode($orig_body); + $item["created"] = $orig_created; + $item["edited"] = $orig_edited; + + $item["uri"] = $orig_uri; + + $item["verb"] = $xpath->query('activity:verb/text()', $activityobjects)->item(0)->nodeValue; + + $item["object-type"] = $xpath->query('activity:object-type/text()', $activityobjects)->item(0)->nodeValue; + + $inreplyto = $xpath->query('thr:in-reply-to', $activityobjects); + if (is_object($inreplyto->item(0))) { + foreach ($inreplyto->item(0)->attributes AS $attributes) { + if ($attributes->name == "ref") { + $item["parent-uri"] = $attributes->textContent; + } + } + } + + return $link_data; + } + + private static function processLinks($links, &$item) { + $link_data = array('add_body' => '', 'self' => ''); + + foreach ($links AS $link) { + $attribute = self::read_attributes($link); + + if (($attribute['rel'] != "") && ($attribute['href'] != "")) { + switch ($attribute['rel']) { + case "alternate": + $item["plink"] = $attribute['href']; + if (($item["object-type"] == ACTIVITY_OBJ_QUESTION) || + ($item["object-type"] == ACTIVITY_OBJ_EVENT)) { + $item["body"] .= add_page_info($attribute['href']); + } + break; + case "ostatus:conversation": + $link_data['conversation'] = $attribute['href']; + $item['conversation-href'] = $link_data['conversation']; + if (!isset($item['conversation-uri'])) { + $item['conversation-uri'] = $item['conversation-href']; + } + break; + case "enclosure": + $filetype = strtolower(substr($attribute['type'], 0, strpos($attribute['type'],'/'))); + if ($filetype == 'image') { + $link_data['add_body'] .= "\n[img]".$attribute['href'].'[/img]'; + } else { + if (strlen($item["attach"])) { + $item["attach"] .= ','; + } + if (!isset($attribute['length'])) { + $attribute['length'] = "0"; + } + $item["attach"] .= '[attach]href="'.$attribute['href'].'" length="'.$attribute['length'].'" type="'.$attribute['type'].'" title="'.$attribute['title'].'"[/attach]'; + } + break; + case "related": + if ($item["object-type"] != ACTIVITY_OBJ_BOOKMARK) { + if (!isset($item["parent-uri"])) { + $item["parent-uri"] = $attribute['href']; + } + $link_data['related'] = $attribute['href']; + } else { + $item["body"] .= add_page_info($attribute['href']); + } + break; + case "self": + if ($item["plink"] == '') { + $item["plink"] = $attribute['href']; + } + $link_data['self'] = $attribute['href']; + break; + } + } + } + return $link_data; + } + /** * @brief Fetches author data * @@ -252,1119 +762,6 @@ class ostatus { return $attribute; } - /** - * @brief Imports an XML string containing OStatus elements - * - * @param string $xml The XML - * @param array $importer user record of the importing user - * @param $contact - * @param array $hub Called by reference, returns the fetched hub data - */ - public static function import($xml,$importer,&$contact, &$hub) { - /// @todo this function is too long. It has to be split in many parts - - logger("Import OStatus message", LOGGER_DEBUG); - - if ($xml == "") { - return; - } - //$tempfile = tempnam(get_temppath(), "import"); - //file_put_contents($tempfile, $xml); - - $doc = new DOMDocument(); - @$doc->loadXML($xml); - - $xpath = new DomXPath($doc); - $xpath->registerNamespace('atom', NAMESPACE_ATOM1); - $xpath->registerNamespace('thr', NAMESPACE_THREAD); - $xpath->registerNamespace('georss', NAMESPACE_GEORSS); - $xpath->registerNamespace('activity', NAMESPACE_ACTIVITY); - $xpath->registerNamespace('media', NAMESPACE_MEDIA); - $xpath->registerNamespace('poco', NAMESPACE_POCO); - $xpath->registerNamespace('ostatus', NAMESPACE_OSTATUS); - $xpath->registerNamespace('statusnet', NAMESPACE_STATUSNET); - - $gub = ""; - $hub_attributes = $xpath->query("/atom:feed/atom:link[@rel='hub']")->item(0)->attributes; - if (is_object($hub_attributes)) { - foreach ($hub_attributes AS $hub_attribute) { - if ($hub_attribute->name == "href") { - $hub = $hub_attribute->textContent; - logger("Found hub ".$hub, LOGGER_DEBUG); - } - } - } - $header = array(); - $header["uid"] = $importer["uid"]; - $header["network"] = NETWORK_OSTATUS; - $header["type"] = "remote"; - $header["wall"] = 0; - $header["origin"] = 0; - $header["gravity"] = GRAVITY_PARENT; - - // it could either be a received post or a post we fetched by ourselves - // depending on that, the first node is different - $first_child = $doc->firstChild->tagName; - - if ($first_child == "feed") { - $entries = $xpath->query('/atom:feed/atom:entry'); - $header["protocol"] = PROTOCOL_OSTATUS_FEED; - } else { - $entries = $xpath->query('/atom:entry'); - $header["protocol"] = PROTOCOL_OSTATUS_SALMON; - } - $conversation = ""; - $conversationlist = array(); - $item_id = 0; - - // Reverse the order of the entries - $entrylist = array(); - - foreach ($entries AS $entry) { - $entrylist[] = $entry; - } - foreach (array_reverse($entrylist) AS $entry) { - - $mention = false; - - // fetch the author - if ($first_child == "feed") { - $author = self::fetchauthor($xpath, $doc->firstChild, $importer, $contact, false); - } else { - $author = self::fetchauthor($xpath, $entry, $importer, $contact, false); - } - $value = $xpath->evaluate('atom:author/poco:preferredUsername/text()', $context)->item(0)->nodeValue; - if ($value != "") { - $nickname = $value; - } else { - $nickname = $author["author-name"]; - } - $item = array_merge($header, $author); - - // Now get the item - $item["uri"] = $xpath->query('atom:id/text()', $entry)->item(0)->nodeValue; - - $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s'", - intval($importer["uid"]), dbesc($item["uri"])); - if (dbm::is_result($r)) { - logger("Item with uri ".$item["uri"]." for user ".$importer["uid"]." already existed under id ".$r[0]["id"], LOGGER_DEBUG); - continue; - } - - $item["body"] = html2bbcode($xpath->query('atom:content/text()', $entry)->item(0)->nodeValue); - $item["object-type"] = $xpath->query('activity:object-type/text()', $entry)->item(0)->nodeValue; - $item["verb"] = $xpath->query('activity:verb/text()', $entry)->item(0)->nodeValue; - - if (($item["object-type"] == ACTIVITY_OBJ_BOOKMARK) || ($item["object-type"] == ACTIVITY_OBJ_EVENT)) { - $item["title"] = $xpath->query('atom:title/text()', $entry)->item(0)->nodeValue; - $item["body"] = $xpath->query('atom:summary/text()', $entry)->item(0)->nodeValue; - } elseif ($item["object-type"] == ACTIVITY_OBJ_QUESTION) { - $item["title"] = $xpath->query('atom:title/text()', $entry)->item(0)->nodeValue; - } - $item["source"] = $xml; - - /// @TODO - /// Delete a message - if ($item["verb"] == "qvitter-delete-notice" || $item["verb"] == ACTIVITY_DELETE) { - // ignore "Delete" messages (by now) - logger("Ignore delete message ".print_r($item, true)); - continue; - } - - if ($item["verb"] == ACTIVITY_JOIN) { - // ignore "Join" messages - logger("Ignore join message ".print_r($item, true)); - continue; - } - - if ($item["verb"] == ACTIVITY_FOLLOW) { - new_follower($importer, $contact, $item, $nickname); - continue; - } - - if ($item["verb"] == NAMESPACE_OSTATUS."/unfollow") { - lose_follower($importer, $contact, $item, $dummy); - continue; - } - - if ($item["verb"] == ACTIVITY_FAVORITE) { - $orig_uri = $xpath->query("activity:object/atom:id", $entry)->item(0)->nodeValue; - logger("Favorite ".$orig_uri." ".print_r($item, true)); - - $item["verb"] = ACTIVITY_LIKE; - $item["parent-uri"] = $orig_uri; - $item["gravity"] = GRAVITY_LIKE; - } - - if ($item["verb"] == NAMESPACE_OSTATUS."/unfavorite") { - // Ignore "Unfavorite" message - logger("Ignore unfavorite message ".print_r($item, true)); - continue; - } - - // http://activitystrea.ms/schema/1.0/rsvp-yes - if (!in_array($item["verb"], array(ACTIVITY_POST, ACTIVITY_LIKE, ACTIVITY_SHARE))) { - logger("Unhandled verb ".$item["verb"]." ".print_r($item, true)); - } - $item["created"] = $xpath->query('atom:published/text()', $entry)->item(0)->nodeValue; - $item["edited"] = $xpath->query('atom:updated/text()', $entry)->item(0)->nodeValue; - $conversation = $xpath->query('ostatus:conversation/text()', $entry)->item(0)->nodeValue; - $item['conversation-uri'] = $conversation; - - $conv = $xpath->query('ostatus:conversation', $entry); - if (is_object($conv->item(0))) { - foreach ($conv->item(0)->attributes AS $attributes) { - if ($attributes->name == "ref") { - $item['conversation-uri'] = $attributes->textContent; - } - if ($attributes->name == "href") { - $item['conversation-href'] = $attributes->textContent; - } - } - } - - $related = ""; - - $inreplyto = $xpath->query('thr:in-reply-to', $entry); - if (is_object($inreplyto->item(0))) { - foreach ($inreplyto->item(0)->attributes AS $attributes) { - if ($attributes->name == "ref") { - $item["parent-uri"] = $attributes->textContent; - } - if ($attributes->name == "href") { - $related = $attributes->textContent; - } - } - } - - $georsspoint = $xpath->query('georss:point', $entry); - if ($georsspoint) { - $item["coord"] = $georsspoint->item(0)->nodeValue; - } - $categories = $xpath->query('atom:category', $entry); - if ($categories) { - foreach ($categories AS $category) { - foreach ($category->attributes AS $attributes) { - if ($attributes->name == "term") { - $term = $attributes->textContent; - if (strlen($item["tag"])) { - $item["tag"] .= ','; - } - $item["tag"] .= "#[url=".System::baseUrl()."/search?tag=".$term."]".$term."[/url]"; - } - } - } - } - - $self = ""; - - $add_body = ""; - - $links = $xpath->query('atom:link', $entry); - if ($links) { - foreach ($links AS $link) { - $attribute = self::read_attributes($link); - - if (($attribute['rel'] != "") && ($attribute['href'] != "")) { - switch ($attribute['rel']) { - case "alternate": - $item["plink"] = $attribute['href']; - if (($item["object-type"] == ACTIVITY_OBJ_QUESTION) || - ($item["object-type"] == ACTIVITY_OBJ_EVENT)) { - $item["body"] .= add_page_info($attribute['href']); - } - break; - case "ostatus:conversation": - $conversation = $attribute['href']; - $item['conversation-href'] = $conversation; - if (!isset($item['conversation-uri'])) { - $item['conversation-uri'] = $item['conversation-href']; - } - break; - case "enclosure": - $filetype = strtolower(substr($attribute['type'], 0, strpos($attribute['type'],'/'))); - if ($filetype == 'image') { - $add_body .= "\n[img]".$attribute['href'].'[/img]'; - } else { - if (strlen($item["attach"])) { - $item["attach"] .= ','; - } - if (!isset($attribute['length'])) { - $attribute['length'] = "0"; - } - $item["attach"] .= '[attach]href="'.$attribute['href'].'" length="'.$attribute['length'].'" type="'.$attribute['type'].'" title="'.$attribute['title'].'"[/attach]'; - } - break; - case "related": - if ($item["object-type"] != ACTIVITY_OBJ_BOOKMARK) { - if (!isset($item["parent-uri"])) { - $item["parent-uri"] = $attribute['href']; - } - if ($related == "") { - $related = $attribute['href']; - } - } else { - $item["body"] .= add_page_info($attribute['href']); - } - break; - case "self": - $self = $attribute['href']; - break; - case "mentioned": - // Notification check - if ($importer["nurl"] == normalise_link($attribute['href'])) { - $mention = true; - } - break; - } - } - } - } - - $local_id = ""; - $repeat_of = ""; - - $notice_info = $xpath->query('statusnet:notice_info', $entry); - if ($notice_info && ($notice_info->length > 0)) { - foreach ($notice_info->item(0)->attributes AS $attributes) { - if ($attributes->name == "source") { - $item["app"] = strip_tags($attributes->textContent); - } - if ($attributes->name == "local_id") { - $local_id = $attributes->textContent; - } - if ($attributes->name == "repeat_of") { - $repeat_of = $attributes->textContent; - } - } - } - - // Is it a repeated post? - if (($repeat_of != "") || ($item["verb"] == ACTIVITY_SHARE)) { - $activityobjects = $xpath->query('activity:object', $entry)->item(0); - - if (is_object($activityobjects)) { - - $orig_uri = $xpath->query("activity:object/atom:id", $activityobjects)->item(0)->nodeValue; - if (!isset($orig_uri)) { - $orig_uri = $xpath->query('atom:id/text()', $activityobjects)->item(0)->nodeValue; - } - $orig_links = $xpath->query("activity:object/atom:link[@rel='alternate']", $activityobjects); - if ($orig_links && ($orig_links->length > 0)) { - foreach ($orig_links->item(0)->attributes AS $attributes) { - if ($attributes->name == "href") { - $orig_link = $attributes->textContent; - } - } - } - if (!isset($orig_link)) { - $orig_link = $xpath->query("atom:link[@rel='alternate']", $activityobjects)->item(0)->nodeValue; - } - if (!isset($orig_link)) { - $orig_link = self::convert_href($orig_uri); - } - $orig_body = $xpath->query('activity:object/atom:content/text()', $activityobjects)->item(0)->nodeValue; - if (!isset($orig_body)) { - $orig_body = $xpath->query('atom:content/text()', $activityobjects)->item(0)->nodeValue; - } - $orig_created = $xpath->query('atom:published/text()', $activityobjects)->item(0)->nodeValue; - $orig_edited = $xpath->query('atom:updated/text()', $activityobjects)->item(0)->nodeValue; - - $orig_contact = $contact; - $orig_author = self::fetchauthor($xpath, $activityobjects, $importer, $orig_contact, false); - - $item["author-name"] = $orig_author["author-name"]; - $item["author-link"] = $orig_author["author-link"]; - $item["author-avatar"] = $orig_author["author-avatar"]; - - $item["body"] = html2bbcode($orig_body); - $item["created"] = $orig_created; - $item["edited"] = $orig_edited; - - $item["uri"] = $orig_uri; - - if (!isset($item["plink"])) { - $item["plink"] = $orig_link; - } - - $item["verb"] = $xpath->query('activity:verb/text()', $activityobjects)->item(0)->nodeValue; - - $item["object-type"] = $xpath->query('activity:object/activity:object-type/text()', $activityobjects)->item(0)->nodeValue; - if (!isset($item["object-type"])) { - $item["object-type"] = $xpath->query('activity:object-type/text()', $activityobjects)->item(0)->nodeValue; - } - - $enclosures = $xpath->query("atom:link[@rel='alternate']", $activityobjects); - if ($enclosures) { - foreach ($enclosures AS $link) { - $attribute = self::read_attributes($link); - if ($href != "") { - if (strlen($item["attach"])) { - $item["attach"] .= ','; - } - if (!isset($attribute['length'])) { - $attribute['length'] = "0"; - } - $item["attach"] .= '[attach]href="'.$attribute['href'].'" length="'.$attribute['length'].'" type="'.$attribute['type'].'" title="'.$attribute['title'].'"[/attach]'; - } - } - } - } - } - - $item["body"] .= $add_body; - - // Only add additional data when there is no picture in the post - if (!strstr($item["body"],'[/img]')) { - $item["body"] = add_page_info_to_body($item["body"]); - } - - // Mastodon Content Warning - if (($item["verb"] == ACTIVITY_POST) && $xpath->evaluate('boolean(atom:summary)', $entry)) { - $clear_text = $xpath->query('atom:summary/text()', $entry)->item(0)->nodeValue; - - $item["body"] = html2bbcode($clear_text) . '[spoiler]' . $item["body"] . '[/spoiler]'; - } - - if (isset($item["parent-uri"])) { - $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s'", - intval($importer["uid"]), dbesc($item["parent-uri"])); - - // Only fetch missing stuff if it is a comment or reshare. - if (in_array($item["verb"], array(ACTIVITY_POST, ACTIVITY_SHARE)) && - !dbm::is_result($r) && ($related != "")) { - $reply_path = str_replace("/notice/", "/api/statuses/show/", $related).".atom"; - - if ($reply_path != $related) { - logger("Fetching related items for user ".$importer["uid"]." from ".$reply_path, LOGGER_DEBUG); - $reply_xml = fetch_url($reply_path); - - $reply_contact = $contact; - self::import($reply_xml,$importer,$reply_contact, $reply_hub); - - // After the import try to fetch the parent item again - $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s'", - intval($importer["uid"]), dbesc($item["parent-uri"])); - } - } - if (dbm::is_result($r)) { - $item["type"] = 'remote-comment'; - $item["gravity"] = GRAVITY_COMMENT; - } - } else { - $item["parent-uri"] = $item["uri"]; - } - $item_id = self::completion($conversation, $importer["uid"], $item, $self); - - if (!$item_id) { - // Store the conversation data. This is normally done in "item_store" - // but since something went wrong, we want to be sure to save the data. - store_conversation($item); - logger("Error storing item", LOGGER_DEBUG); - continue; - } - - logger("Item was stored with id ".$item_id, LOGGER_DEBUG); - } - } - - /** - * @brief Create an url out of an uri - * - * @param string $href URI in the format "parameter1:parameter1:..." - * - * @return string URL in the format http(s)://.... - */ - public static function convert_href($href) { - $elements = explode(":",$href); - - if ((count($elements) <= 2) || ($elements[0] != "tag")) - return $href; - - $server = explode(",", $elements[1]); - $conversation = explode("=", $elements[2]); - - if ((count($elements) == 4) && ($elements[2] == "post")) - return "http://".$server[0]."/notice/".$elements[3]; - - if ((count($conversation) != 2) || ($conversation[1] =="")) { - return $href; - } - if ($elements[3] == "objectType=thread") { - return "http://".$server[0]."/conversation/".$conversation[1]; - } else { - return "http://".$server[0]."/notice/".$conversation[1]; - } - return $href; - } - - /** - * @brief Checks if there are entries in conversations that aren't present on our side - * - * @param bool $mentions Fetch conversations where we are mentioned - * @param bool $override Override the interval setting - */ - public static function check_conversations($mentions = false, $override = false) { - $last = get_config('system','ostatus_last_poll'); - - $poll_interval = intval(get_config('system','ostatus_poll_interval')); - if (!$poll_interval) { - $poll_interval = self::OSTATUS_DEFAULT_POLL_INTERVAL; - } - - // Don't poll if the interval is set negative - if (($poll_interval < 0) && !$override) { - return; - } - - if (!$mentions) { - $poll_timeframe = intval(get_config('system','ostatus_poll_timeframe')); - if (!$poll_timeframe) { - $poll_timeframe = self::OSTATUS_DEFAULT_POLL_TIMEFRAME; - } - } else { - $poll_timeframe = intval(get_config('system','ostatus_poll_timeframe')); - if (!$poll_timeframe) { - $poll_timeframe = self::OSTATUS_DEFAULT_POLL_TIMEFRAME_MENTIONS; - } - } - - - if ($last && !$override) { - $next = $last + ($poll_interval * 60); - if ($next > time()) { - logger('poll interval not reached'); - return; - } - } - - logger('cron_start'); - - $start = date("Y-m-d H:i:s", time() - ($poll_timeframe * 60)); - - if ($mentions) { - $conversations = q("SELECT `term`.`oid`, `term`.`url`, `term`.`uid` FROM `term` - STRAIGHT_JOIN `thread` ON `thread`.`iid` = `term`.`oid` AND `thread`.`uid` = `term`.`uid` - WHERE `term`.`type` = 7 AND `term`.`term` > '%s' AND `thread`.`mention` - GROUP BY `term`.`url`, `term`.`uid`, `term`.`oid`, `term`.`term` ORDER BY `term`.`term` DESC", dbesc($start)); - } else { - $conversations = q("SELECT `oid`, `url`, `uid` FROM `term` - WHERE `type` = 7 AND `term` > '%s' - GROUP BY `url`, `uid`, `oid`, `term` ORDER BY `term` DESC", dbesc($start)); - } - - foreach ($conversations AS $conversation) { - self::completion($conversation['url'], $conversation['uid']); - } - - logger('cron_end'); - - set_config('system','ostatus_last_poll', time()); - } - - /** - * @brief Updates the gcontact table with actor data from the conversation - * - * @param object $actor The actor object that contains the contact data - */ - private static function conv_fetch_actor($actor) { - - // We set the generation to "3" since the data here is not as reliable as the data we get on other occasions - $contact = array("network" => NETWORK_OSTATUS, "generation" => 3); - - if (isset($actor->url)) - $contact["url"] = $actor->url; - - if (isset($actor->displayName)) - $contact["name"] = $actor->displayName; - - if (isset($actor->portablecontacts_net->displayName)) - $contact["name"] = $actor->portablecontacts_net->displayName; - - if (isset($actor->portablecontacts_net->preferredUsername)) - $contact["nick"] = $actor->portablecontacts_net->preferredUsername; - - if (isset($actor->id)) - $contact["alias"] = $actor->id; - - if (isset($actor->summary)) - $contact["about"] = $actor->summary; - - if (isset($actor->portablecontacts_net->note)) - $contact["about"] = $actor->portablecontacts_net->note; - - if (isset($actor->portablecontacts_net->addresses->formatted)) - $contact["location"] = $actor->portablecontacts_net->addresses->formatted; - - - if (isset($actor->image->url)) - $contact["photo"] = $actor->image->url; - - if (isset($actor->image->width)) - $avatarwidth = $actor->image->width; - - if (is_array($actor->status_net->avatarLinks)) - foreach ($actor->status_net->avatarLinks AS $avatar) { - if ($avatarsize < $avatar->width) { - $contact["photo"] = $avatar->url; - $avatarsize = $avatar->width; - } - } - - $contact["hide"] = false; // OStatus contacts are never hidden - update_gcontact($contact); - } - - /** - * @brief Fetches the conversation url for a given item link or conversation id - * - * @param string $self The link to the posting - * @param string $conversation_id The conversation id - * - * @return string The conversation url - */ - private static function fetch_conversation($self, $conversation_id = "") { - - if ($conversation_id != "") { - $elements = explode(":", $conversation_id); - - if ((count($elements) <= 2) || ($elements[0] != "tag")) - return $conversation_id; - } - - if ($self == "") - return ""; - - $json = str_replace(".atom", ".json", $self); - - $raw = fetch_url($json); - if ($raw == "") - return ""; - - $data = json_decode($raw); - if (!is_object($data)) - return ""; - - $conversation_id = $data->statusnet_conversation_id; - - $pos = strpos($self, "/api/statuses/show/"); - $base_url = substr($self, 0, $pos); - - return $base_url."/conversation/".$conversation_id; - } - - /** - * @brief Fetches a shared object from a given conversation object - * - * Sometimes GNU Social seems to fail when returning shared objects. - * Then they don't contains all needed data. - * We then try to find this object in the conversation - * - * @param string $id Message id - * @param object $conversation Conversation object - * - * @return object The shared object - */ - private static function shared_object($id, $conversation) { - if (!is_array($conversation->items)) { - return false; - } - foreach ($conversation->items AS $single_conv) { - if ($single_conv->id == $id) { - return $single_conv; - } - } - return false; - } - - /** - * @brief Fetches actor details of a given actor and user id - * - * @param string $actor The actor url - * @param int $uid The user id - * @param int $contact_id The default contact-id - * - * @return array Array with actor details - */ - private static function get_actor_details($actor, $uid, $contact_id) { - - $details = array(); - - $contact = q("SELECT `id`, `rel`, `network` FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' AND `network` != '%s'", - $uid, normalise_link($actor), NETWORK_STATUSNET); - - if (!$contact) - $contact = q("SELECT `id`, `rel`, `network` FROM `contact` WHERE `uid` = %d AND `alias` IN ('%s', '%s') AND `network` != '%s'", - $uid, $actor, normalise_link($actor), NETWORK_STATUSNET); - - if ($contact) { - logger("Found contact for url ".$actor, LOGGER_DEBUG); - $details["contact_id"] = $contact[0]["id"]; - $details["network"] = $contact[0]["network"]; - - $details["not_following"] = !in_array($contact[0]["rel"], array(CONTACT_IS_SHARING, CONTACT_IS_FRIEND)); - } else { - logger("No contact found for user ".$uid." and url ".$actor, LOGGER_DEBUG); - - // Adding a global contact - /// @TODO Use this data for the post - $details["global_contact_id"] = get_contact($actor, 0); - - logger("Global contact ".$global_contact_id." found for url ".$actor, LOGGER_DEBUG); - - $details["contact_id"] = $contact_id; - $details["network"] = NETWORK_OSTATUS; - - $details["not_following"] = true; - } - - return $details; - } - - /** - * @brief Stores an item and completes the thread - * - * @param string $conversation_url The URI of the conversation - * @param integer $uid The user id - * @param array $item Data of the item that is to be posted - * - * @return integer The item id of the posted item array - */ - private static function completion($conversation_url, $uid, $item = array(), $self = "") { - - /// @todo This function is totally ugly and has to be rewritten totally - - // Import all threads or only threads that were started by our followers? - $all_threads = !get_config('system','ostatus_full_threads'); - - $item_stored = -1; - - $conversation_url = self::fetch_conversation($self, $conversation_url); - - // If the thread shouldn't be completed then store the item and go away - // Don't do a completion on liked content - if (((intval(get_config('system','ostatus_poll_interval')) == -2) && (count($item) > 0)) || - ($item["verb"] == ACTIVITY_LIKE) || ($conversation_url == "")) { - $item_stored = item_store($item, $all_threads); - return $item_stored; - } - - // Get the parent - $parents = q("SELECT `item`.`id`, `item`.`parent`, `item`.`uri`, `item`.`contact-id`, `item`.`type`, - `item`.`verb`, `item`.`visible` FROM `term` - STRAIGHT_JOIN `item` AS `thritem` ON `thritem`.`parent` = `term`.`oid` - STRAIGHT_JOIN `item` ON `item`.`parent` = `thritem`.`parent` - WHERE `term`.`uid` = %d AND `term`.`otype` = %d AND `term`.`type` = %d AND `term`.`url` = '%s'", - intval($uid), intval(TERM_OBJ_POST), intval(TERM_CONVERSATION), dbesc($conversation_url)); - if ($parents) { - $parent = $parents[0]; - } elseif (count($item) > 0) { - $parent = $item; - $parent["type"] = "remote"; - $parent["verb"] = ACTIVITY_POST; - $parent["visible"] = 1; - } else { - // Preset the parent - $r = q("SELECT `id` FROM `contact` WHERE `self` AND `uid`=%d", $uid); - if (!dbm::is_result($r)) { - return -2; - } - $parent = array(); - $parent["id"] = 0; - $parent["parent"] = 0; - $parent["uri"] = ""; - $parent["contact-id"] = $r[0]["id"]; - $parent["type"] = "remote"; - $parent["verb"] = ACTIVITY_POST; - $parent["visible"] = 1; - } - - $conv = str_replace("/conversation/", "/api/statusnet/conversation/", $conversation_url).".as"; - $pageno = 1; - $items = array(); - - logger('fetching conversation url '.$conv.' (Self: '.$self.') for user '.$uid); - - do { - $conv_arr = z_fetch_url($conv."?page=".$pageno); - - // If it is a non-ssl site and there is an error, then try ssl or vice versa - if (!$conv_arr["success"] && (substr($conv, 0, 7) == "http://")) { - $conv = str_replace("http://", "https://", $conv); - $conv_as = fetch_url($conv."?page=".$pageno); - } elseif (!$conv_arr["success"] && (substr($conv, 0, 8) == "https://")) { - $conv = str_replace("https://", "http://", $conv); - $conv_as = fetch_url($conv."?page=".$pageno); - } else { - $conv_as = $conv_arr["body"]; - } - $conv_as = str_replace(',"statusnet:notice_info":', ',"statusnet_notice_info":', $conv_as); - $conv_as = json_decode($conv_as); - - $no_of_items = sizeof($items); - - if (@is_array($conv_as->items)) - foreach ($conv_as->items AS $single_item) - $items[$single_item->id] = $single_item; - - if ($no_of_items == sizeof($items)) - break; - - $pageno++; - - } while (true); - - logger('fetching conversation done. Found '.count($items).' items'); - - if (!sizeof($items)) { - if (count($item) > 0) { - $item_stored = item_store($item, $all_threads); - - if ($item_stored) { - logger("Conversation ".$conversation_url." couldn't be fetched. Item uri ".$item["uri"]." stored: ".$item_stored, LOGGER_DEBUG); - self::store_conversation($item_id, $conversation_url); - } - - return $item_stored; - } else { - return -3; - } - } - - $items = array_reverse($items); - - $r = q("SELECT `nurl` FROM `contact` WHERE `uid` = %d AND `self`", intval($uid)); - $importer = $r[0]; - - $new_parent = true; - - foreach ($items as $single_conv) { - - // Update the gcontact table - self::conv_fetch_actor($single_conv->actor); - - // Test - remove before flight - //$tempfile = tempnam(get_temppath(), "conversation"); - //file_put_contents($tempfile, json_encode($single_conv)); - - $mention = false; - - if (isset($single_conv->object->id)) - $single_conv->id = $single_conv->object->id; - - $plink = self::convert_href($single_conv->id); - if (isset($single_conv->object->url)) - $plink = self::convert_href($single_conv->object->url); - - if (@!$single_conv->id) - continue; - - logger("Got id ".$single_conv->id, LOGGER_DEBUG); - - if ($first_id == "") { - $first_id = $single_conv->id; - - // The first post of the conversation isn't our first post. There are three options: - // 1. Our conversation hasn't the "real" thread starter - // 2. This first post is a post inside our thread - // 3. This first post is a post inside another thread - if (($first_id != $parent["uri"]) && ($parent["uri"] != "")) { - - $new_parent = true; - - $new_parents = q("SELECT `id`, `parent`, `uri`, `contact-id`, `type`, `verb`, `visible` FROM `item` WHERE `id` IN - (SELECT `parent` FROM `item` - WHERE `uid` = %d AND `uri` = '%s' AND `network` IN ('%s','%s')) LIMIT 1", - intval($uid), dbesc($first_id), dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DFRN)); - if ($new_parents) { - if ($new_parents[0]["parent"] == $parent["parent"]) { - // Option 2: This post is already present inside our thread - but not as thread starter - logger("Option 2: uri present in our thread: ".$first_id, LOGGER_DEBUG); - $first_id = $parent["uri"]; - } else { - // Option 3: Not so good. We have mixed parents. We have to see how to clean this up. - // For now just take the new parent. - $parent = $new_parents[0]; - $first_id = $parent["uri"]; - logger("Option 3: mixed parents for uri ".$first_id, LOGGER_DEBUG); - } - } else { - // Option 1: We hadn't got the real thread starter - // We have to clean up our existing messages. - $parent["id"] = 0; - $parent["uri"] = $first_id; - logger("Option 1: we have a new parent: ".$first_id, LOGGER_DEBUG); - } - } elseif ($parent["uri"] == "") { - $parent["id"] = 0; - $parent["uri"] = $first_id; - } - } - - $parent_uri = $parent["uri"]; - - // "context" only seems to exist on older servers - if (isset($single_conv->context->inReplyTo->id)) { - $parent_exists = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `network` IN ('%s','%s') LIMIT 1", - intval($uid), dbesc($single_conv->context->inReplyTo->id), dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DFRN)); - if ($parent_exists) - $parent_uri = $single_conv->context->inReplyTo->id; - } - - // This is the current way - if (isset($single_conv->object->inReplyTo->id)) { - $parent_exists = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `network` IN ('%s','%s') LIMIT 1", - intval($uid), dbesc($single_conv->object->inReplyTo->id), dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DFRN)); - if ($parent_exists) - $parent_uri = $single_conv->object->inReplyTo->id; - } - - $message_exists = q("SELECT `id`, `parent`, `uri` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `network` IN ('%s','%s') LIMIT 1", - intval($uid), dbesc($single_conv->id), - dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DFRN)); - if ($message_exists) { - logger("Message ".$single_conv->id." already existed on the system", LOGGER_DEBUG); - - if ($parent["id"] != 0) { - $existing_message = $message_exists[0]; - - // We improved the way we fetch OStatus messages, this shouldn't happen very often now - /// @TODO We have to change the shadow copies as well. This way here is really ugly. - if ($existing_message["parent"] != $parent["id"]) { - logger('updating id '.$existing_message["id"].' with parent '.$existing_message["parent"].' to parent '.$parent["id"].' uri '.$parent["uri"].' thread '.$parent_uri, LOGGER_DEBUG); - - // Update the parent id of the selected item - $r = q("UPDATE `item` SET `parent` = %d, `parent-uri` = '%s' WHERE `id` = %d", - intval($parent["id"]), dbesc($parent["uri"]), intval($existing_message["id"])); - - // Update the parent uri in the thread - but only if it points to itself - $r = q("UPDATE `item` SET `thr-parent` = '%s' WHERE `id` = %d AND `uri` = `thr-parent`", - dbesc($parent_uri), intval($existing_message["id"])); - - // try to change all items of the same parent - $r = q("UPDATE `item` SET `parent` = %d, `parent-uri` = '%s' WHERE `parent` = %d", - intval($parent["id"]), dbesc($parent["uri"]), intval($existing_message["parent"])); - - // Update the parent uri in the thread - but only if it points to itself - $r = q("UPDATE `item` SET `thr-parent` = '%s' WHERE (`parent` = %d) AND (`uri` = `thr-parent`)", - dbesc($parent["uri"]), intval($existing_message["parent"])); - - // Now delete the thread - delete_thread($existing_message["parent"]); - } - } - - // The item we are having on the system is the one that we wanted to store via the item array - if (isset($item["uri"]) && ($item["uri"] == $existing_message["uri"])) { - $item = array(); - $item_stored = 0; - } - - continue; - } - - if (is_array($single_conv->to)) - foreach ($single_conv->to AS $to) - if ($importer["nurl"] == normalise_link($to->id)) - $mention = true; - - $actor = $single_conv->actor->id; - if (isset($single_conv->actor->url)) - $actor = $single_conv->actor->url; - - $details = self::get_actor_details($actor, $uid, $parent["contact-id"]); - - // Do we only want to import threads that were started by our contacts? - if ($details["not_following"] && $new_parent && get_config('system','ostatus_full_threads')) { - logger("Don't import uri ".$first_id." because user ".$uid." doesn't follow the person ".$actor, LOGGER_DEBUG); - continue; - } - - /// @TODO One statment is okay (until if () ) - $arr = array(); - $arr["network"] = $details["network"]; - $arr["uri"] = $single_conv->id; - $arr["plink"] = $plink; - $arr["uid"] = $uid; - $arr["contact-id"] = $details["contact_id"]; - $arr["parent-uri"] = $parent_uri; - $arr["created"] = $single_conv->published; - $arr["edited"] = $single_conv->published; - $arr["owner-name"] = $single_conv->actor->displayName; - if ($arr["owner-name"] == '') - $arr["owner-name"] = $single_conv->actor->contact->displayName; - if ($arr["owner-name"] == '') - $arr["owner-name"] = $single_conv->actor->portablecontacts_net->displayName; - - $arr["owner-link"] = $actor; - $arr["owner-avatar"] = Probe::fixAvatar($single_conv->actor->image->url, $arr["owner-link"]); - - $arr["author-name"] = $arr["owner-name"]; - $arr["author-link"] = $arr["owner-link"]; - $arr["author-avatar"] = $arr["owner-avatar"]; - $arr["body"] = add_page_info_to_body(html2bbcode($single_conv->content)); - - if (isset($single_conv->status_net->conversation)) { - $arr['conversation-uri'] = $single_conv->status_net->conversation; - } - - if (isset($single_conv->status_net->notice_info->source)) { - $arr["app"] = strip_tags($single_conv->status_net->notice_info->source); - } elseif (isset($single_conv->statusnet->notice_info->source)) { - $arr["app"] = strip_tags($single_conv->statusnet->notice_info->source); - } elseif (isset($single_conv->statusnet_notice_info->source)) { - $arr["app"] = strip_tags($single_conv->statusnet_notice_info->source); - } elseif (isset($single_conv->provider->displayName)) { - $arr["app"] = $single_conv->provider->displayName; - } else { - $arr["app"] = "OStatus"; - } - - $arr["source"] = json_encode($single_conv); - $arr["protocol"] = PROTOCOL_GS_CONVERSATION; - - $arr["verb"] = $parent["verb"]; - $arr["visible"] = $parent["visible"]; - $arr["location"] = $single_conv->location->displayName; - $arr["coord"] = trim($single_conv->location->lat." ".$single_conv->location->lon); - - // Is it a reshared item? - if (isset($single_conv->verb) && ($single_conv->verb == "share") && isset($single_conv->object)) { - if (is_array($single_conv->object)) - $single_conv->object = $single_conv->object[0]; - - // Sometimes GNU Social doesn't returns a complete object - if (!isset($single_conv->object->actor->url)) { - $object = self::shared_object($single_conv->object->id, $conversation); - if (is_object($object)) { - $single_conv->object = $object; - } - } - - if (isset($single_conv->object->actor->url)) { - logger("Found reshared item ".$single_conv->object->id); - - // $single_conv->object->context->conversation; - - if (isset($single_conv->object->object->id)) { - $arr["uri"] = $single_conv->object->object->id; - } else { - $arr["uri"] = $single_conv->object->id; - } - if (isset($single_conv->object->object->url)) { - $plink = self::convert_href($single_conv->object->object->url); - } else { - $plink = self::convert_href($single_conv->object->url); - } - if (isset($single_conv->object->object->content)) { - $arr["body"] = add_page_info_to_body(html2bbcode($single_conv->object->object->content)); - } else { - $arr["body"] = add_page_info_to_body(html2bbcode($single_conv->object->content)); - } - $arr["plink"] = $plink; - - $arr["created"] = $single_conv->object->published; - $arr["edited"] = $single_conv->object->published; - - $arr["author-name"] = $single_conv->object->actor->displayName; - if ($arr["owner-name"] == '') { - $arr["author-name"] = $single_conv->object->actor->contact->displayName; - } - $arr["author-link"] = $single_conv->object->actor->url; - $arr["author-avatar"] = Probe::fixAvatar($single_conv->object->actor->image->url, $arr["author-link"]); - - $arr["app"] = $single_conv->object->provider->displayName."#"; - //$arr["verb"] = $single_conv->object->verb; - - $arr["location"] = $single_conv->object->location->displayName; - $arr["coord"] = trim($single_conv->object->location->lat." ".$single_conv->object->location->lon); - } - } - - if ($arr["location"] == "") - unset($arr["location"]); - - if ($arr["coord"] == "") - unset($arr["coord"]); - - // Copy fields from given item array - if (isset($item["uri"]) && (($item["uri"] == $arr["uri"]) || ($item["uri"] == $single_conv->id))) { - logger('Use stored item array for item with URI '.$item["uri"], LOGGER_DEBUG); - $newitem = item_store($item); - $item = array(); - $item_stored = $newitem; - } else { - $newitem = item_store($arr); - } - - if (!$newitem) { - logger("Item wasn't stored ".print_r($arr, true), LOGGER_DEBUG); - continue; - } - - logger('Stored new item '.$plink.' for parent '.$arr["parent-uri"].' under id '.$newitem, LOGGER_DEBUG); - - // Add the conversation entry (but don't fetch the whole conversation) - self::store_conversation($newitem, $conversation_url); - - // If the newly created item is the top item then change the parent settings of the thread - // This shouldn't happen anymore. This is supposed to be absolote. - if ($arr["uri"] == $first_id) { - logger('setting new parent to id '.$newitem); - $new_parents = q("SELECT `id`, `uri`, `contact-id`, `type`, `verb`, `visible` FROM `item` WHERE `uid` = %d AND `id` = %d LIMIT 1", - intval($uid), intval($newitem)); - if ($new_parents) - $parent = $new_parents[0]; - } - } - - if (($item_stored < 0) && (count($item) > 0)) { - - if (get_config('system','ostatus_full_threads')) { - $details = self::get_actor_details($item["owner-link"], $uid, $item["contact-id"]); - if ($details["not_following"]) { - logger("Don't import uri ".$item["uri"]." because user ".$uid." doesn't follow the person ".$item["owner-link"], LOGGER_DEBUG); - return false; - } - } - - $item_stored = item_store($item, $all_threads); - if ($item_stored) { - logger("Uri ".$item["uri"]." wasn't found in conversation ".$conversation_url, LOGGER_DEBUG); - self::store_conversation($item_stored, $conversation_url); - } - } - - return $item_stored; - } - - /** - * @brief Stores conversation data into the database - * - * @param integer $itemid The id of the item - * @param string $conversation_url The uri of the conversation - */ - private static function store_conversation($itemid, $conversation_url) { - - $conversation_url = self::convert_href($conversation_url); - - $messages = q("SELECT `uid`, `parent`, `created`, `received`, `guid` FROM `item` WHERE `id` = %d LIMIT 1", intval($itemid)); - if (!$messages) - return; - $message = $messages[0]; - - // Store conversation url if not done before - $conversation = q("SELECT `url` FROM `term` WHERE `uid` = %d AND `oid` = %d AND `otype` = %d AND `type` = %d", - intval($message["uid"]), intval($itemid), intval(TERM_OBJ_POST), intval(TERM_CONVERSATION)); - - if (!$conversation) { - $r = q("INSERT INTO `term` (`uid`, `oid`, `otype`, `type`, `term`, `url`, `created`, `received`, `guid`) VALUES (%d, %d, %d, %d, '%s', '%s', '%s', '%s', '%s')", - intval($message["uid"]), intval($itemid), intval(TERM_OBJ_POST), intval(TERM_CONVERSATION), - dbesc($message["created"]), dbesc($conversation_url), dbesc($message["created"]), dbesc($message["received"]), dbesc($message["guid"])); - logger('Storing conversation url '.$conversation_url.' for id '.$itemid); - } - } - /** * @brief Checks if the current post is a reshare * diff --git a/mod/display.php b/mod/display.php index 56f7aa6442..d8cdf658a6 100644 --- a/mod/display.php +++ b/mod/display.php @@ -293,7 +293,7 @@ function display_content(App $a, $update = 0) { } // We are displaying an "alternate" link if that post was public. See issue 2864 - $is_public = dba::exists('item', array('id' => $item_id, 'private' => false, 'wall' => true)); + $is_public = dba::exists('item', array('id' => $item_id, 'private' => false)); if ($is_public) { $alternate = System::baseUrl().'/display/'.$nick.'/'.$item_id.'.atom'; } else { From c98c157efe3b281b308e5076e49515b1ea2a90b5 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 10 Sep 2017 07:23:14 +0000 Subject: [PATCH 12/49] Only some tabs --- include/ostatus.php | 56 ++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/include/ostatus.php b/include/ostatus.php index 124f421bf1..78175562e2 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -33,28 +33,28 @@ class ostatus { const OSTATUS_DEFAULT_POLL_TIMEFRAME = 1440; // given in minutes const OSTATUS_DEFAULT_POLL_TIMEFRAME_MENTIONS = 14400; // given in minutes - private static $itemlist; + private static $itemlist; - /** - * @brief Imports an XML string containing OStatus elements - * - * @param string $xml The XML - * @param array $importer user record of the importing user - * @param $contact - * @param array $hub Called by reference, returns the fetched hub data - */ + /** + * @brief Imports an XML string containing OStatus elements + * + * @param string $xml The XML + * @param array $importer user record of the importing user + * @param $contact + * @param array $hub Called by reference, returns the fetched hub data + */ public static function import($xml, $importer, &$contact, &$hub) { self::process($xml, $importer, $contact, $hub); } - /** - * @brief Imports an XML string containing OStatus elements - * - * @param string $xml The XML - * @param array $importer user record of the importing user - * @param $contact - * @param array $hub Called by reference, returns the fetched hub data - */ + /** + * @brief Imports an XML string containing OStatus elements + * + * @param string $xml The XML + * @param array $importer user record of the importing user + * @param $contact + * @param array $hub Called by reference, returns the fetched hub data + */ private static function process($xml, $importer, &$contact, &$hub, $stored = false, $initialize = true) { if ($initialize) { self::$itemlist = array(); @@ -78,16 +78,16 @@ class ostatus { $xpath->registerNamespace('ostatus', NAMESPACE_OSTATUS); $xpath->registerNamespace('statusnet', NAMESPACE_STATUSNET); - $hub = ""; - $hub_attributes = $xpath->query("/atom:feed/atom:link[@rel='hub']")->item(0)->attributes; - if (is_object($hub_attributes)) { - foreach ($hub_attributes AS $hub_attribute) { - if ($hub_attribute->name == "href") { - $hub = $hub_attribute->textContent; - logger("Found hub ".$hub, LOGGER_DEBUG); - } - } - } + $hub = ""; + $hub_attributes = $xpath->query("/atom:feed/atom:link[@rel='hub']")->item(0)->attributes; + if (is_object($hub_attributes)) { + foreach ($hub_attributes AS $hub_attribute) { + if ($hub_attribute->name == "href") { + $hub = $hub_attribute->textContent; + logger("Found hub ".$hub, LOGGER_DEBUG); + } + } + } $header = array(); $header["uid"] = $importer["uid"]; @@ -233,7 +233,7 @@ class ostatus { foreach (self::$itemlist AS $item) { $found = dba::exists('item', array('uid' => $importer["uid"], 'uri' => $item["uri"])); if ($found) { - logger("Item with uri ".$item["uri"]." for user ".$importer["uid"]." already exists.", LOGGER_DEBUG); + logger("Item with uri ".$item["uri"]." for user ".$importer["uid"]." already exists.", LOGGER_DEBUG); } else { $ret = item_store($item); logger('Item was stored with return value '.$ret); From 746169eabfa119c2db7e715c90f59df7ef10ca8a Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 10 Sep 2017 07:29:24 +0000 Subject: [PATCH 13/49] Improve comparabilty --- include/ostatus.php | 438 ++++++++++++++++++++++---------------------- 1 file changed, 219 insertions(+), 219 deletions(-) diff --git a/include/ostatus.php b/include/ostatus.php index 78175562e2..d05e575f0d 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -35,6 +35,225 @@ class ostatus { private static $itemlist; + /** + * @brief Fetches author data + * + * @param object $xpath The xpath object + * @param object $context The xml context of the author detals + * @param array $importer user record of the importing user + * @param array $contact Called by reference, will contain the fetched contact + * @param bool $onlyfetch Only fetch the header without updating the contact entries + * + * @return array Array of author related entries for the item + */ + private static function fetchauthor($xpath, $context, $importer, &$contact, $onlyfetch) { + + $author = array(); + $author["author-link"] = $xpath->evaluate('atom:author/atom:uri/text()', $context)->item(0)->nodeValue; + $author["author-name"] = $xpath->evaluate('atom:author/atom:name/text()', $context)->item(0)->nodeValue; + $addr = $xpath->evaluate('atom:author/atom:email/text()', $context)->item(0)->nodeValue; + + $aliaslink = $author["author-link"]; + + $alternate = $xpath->query("atom:author/atom:link[@rel='alternate']", $context)->item(0)->attributes; + if (is_object($alternate)) { + foreach ($alternate AS $attributes) { + if (($attributes->name == "href") && ($attributes->textContent != "")) { + $author["author-link"] = $attributes->textContent; + } + } + } + + $author["contact-id"] = $contact["id"]; + + if ($author["author-link"] != "") { + if ($aliaslink == "") { + $aliaslink = $author["author-link"]; + } + + $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `nurl` IN ('%s', '%s') AND `network` != '%s'", + intval($importer["uid"]), dbesc(normalise_link($author["author-link"])), + dbesc(normalise_link($aliaslink)), dbesc(NETWORK_STATUSNET)); + + if (dbm::is_result($r)) { + $contact = $r[0]; + $author["contact-id"] = $r[0]["id"]; + $author["author-link"] = $r[0]["url"]; + } + } elseif ($addr != "") { + // Should not happen + $contact = dba::fetch_first("SELECT * FROM `contact` WHERE `uid` = ? AND `addr` = ? AND `network` != ?", + $importer["uid"], $addr, NETWORK_STATUSNET); + + if (dbm::is_result($contact)) { + $author["contact-id"] = $contact["id"]; + $author["author-link"] = $contact["url"]; + } + } + + $avatarlist = array(); + $avatars = $xpath->query("atom:author/atom:link[@rel='avatar']", $context); + foreach ($avatars AS $avatar) { + $href = ""; + $width = 0; + foreach ($avatar->attributes AS $attributes) { + if ($attributes->name == "href") { + $href = $attributes->textContent; + } + if ($attributes->name == "width") { + $width = $attributes->textContent; + } + } + if ($href != "") { + $avatarlist[$width] = $href; + } + } + if (count($avatarlist) > 0) { + krsort($avatarlist); + $author["author-avatar"] = Probe::fixAvatar(current($avatarlist), $author["author-link"]); + } + + $displayname = $xpath->evaluate('atom:author/poco:displayName/text()', $context)->item(0)->nodeValue; + if ($displayname != "") { + $author["author-name"] = $displayname; + } + + $author["owner-name"] = $author["author-name"]; + $author["owner-link"] = $author["author-link"]; + $author["owner-avatar"] = $author["author-avatar"]; + + // Only update the contacts if it is an OStatus contact + if ($r && !$onlyfetch && ($contact["network"] == NETWORK_OSTATUS)) { + + // Update contact data + + // This query doesn't seem to work + // $value = $xpath->query("atom:link[@rel='salmon']", $context)->item(0)->nodeValue; + // if ($value != "") + // $contact["notify"] = $value; + + // This query doesn't seem to work as well - I hate these queries + // $value = $xpath->query("atom:link[@rel='self' and @type='application/atom+xml']", $context)->item(0)->nodeValue; + // if ($value != "") + // $contact["poll"] = $value; + + $value = $xpath->evaluate('atom:author/atom:uri/text()', $context)->item(0)->nodeValue; + if ($value != "") + $contact["alias"] = $value; + + $value = $xpath->evaluate('atom:author/poco:displayName/text()', $context)->item(0)->nodeValue; + if ($value != "") + $contact["name"] = $value; + + $value = $xpath->evaluate('atom:author/poco:preferredUsername/text()', $context)->item(0)->nodeValue; + if ($value != "") + $contact["nick"] = $value; + + $value = $xpath->evaluate('atom:author/poco:note/text()', $context)->item(0)->nodeValue; + if ($value != "") + $contact["about"] = html2bbcode($value); + + $value = $xpath->evaluate('atom:author/poco:address/poco:formatted/text()', $context)->item(0)->nodeValue; + if ($value != "") + $contact["location"] = $value; + + if (($contact["name"] != $r[0]["name"]) || ($contact["nick"] != $r[0]["nick"]) || ($contact["about"] != $r[0]["about"]) || + ($contact["alias"] != $r[0]["alias"]) || ($contact["location"] != $r[0]["location"])) { + + logger("Update contact data for contact ".$contact["id"], LOGGER_DEBUG); + + q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `alias` = '%s', `about` = '%s', `location` = '%s', `name-date` = '%s' WHERE `id` = %d", + dbesc($contact["name"]), dbesc($contact["nick"]), dbesc($contact["alias"]), + dbesc($contact["about"]), dbesc($contact["location"]), + dbesc(datetime_convert()), intval($contact["id"])); + } + + if (isset($author["author-avatar"]) && ($author["author-avatar"] != $r[0]['avatar'])) { + logger("Update profile picture for contact ".$contact["id"], LOGGER_DEBUG); + + update_contact_avatar($author["author-avatar"], $importer["uid"], $contact["id"]); + } + + // Ensure that we are having this contact (with uid=0) + $cid = get_contact($author["author-link"], 0); + + if ($cid) { + // Update it with the current values + q("UPDATE `contact` SET `url` = '%s', `name` = '%s', `nick` = '%s', `alias` = '%s', + `about` = '%s', `location` = '%s', + `success_update` = '%s', `last-update` = '%s' + WHERE `id` = %d", + dbesc($author["author-link"]), dbesc($contact["name"]), dbesc($contact["nick"]), + dbesc($contact["alias"]), dbesc($contact["about"]), dbesc($contact["location"]), + dbesc(datetime_convert()), dbesc(datetime_convert()), intval($cid)); + + // Update the avatar + update_contact_avatar($author["author-avatar"], 0, $cid); + } + + $contact["generation"] = 2; + $contact["hide"] = false; // OStatus contacts are never hidden + $contact["photo"] = $author["author-avatar"]; + $gcid = update_gcontact($contact); + + link_gcontact($gcid, $contact["uid"], $contact["id"]); + } + + return $author; + } + + /** + * @brief Fetches author data from a given XML string + * + * @param string $xml The XML + * @param array $importer user record of the importing user + * + * @return array Array of author related entries for the item + */ + public static function salmon_author($xml, $importer) { + + if ($xml == "") + return; + + $doc = new DOMDocument(); + @$doc->loadXML($xml); + + $xpath = new DomXPath($doc); + $xpath->registerNamespace('atom', NAMESPACE_ATOM1); + $xpath->registerNamespace('thr', NAMESPACE_THREAD); + $xpath->registerNamespace('georss', NAMESPACE_GEORSS); + $xpath->registerNamespace('activity', NAMESPACE_ACTIVITY); + $xpath->registerNamespace('media', NAMESPACE_MEDIA); + $xpath->registerNamespace('poco', NAMESPACE_POCO); + $xpath->registerNamespace('ostatus', NAMESPACE_OSTATUS); + $xpath->registerNamespace('statusnet', NAMESPACE_STATUSNET); + + $entries = $xpath->query('/atom:entry'); + + foreach ($entries AS $entry) { + // fetch the author + $author = self::fetchauthor($xpath, $entry, $importer, $contact, true); + return $author; + } + } + + /** + * @brief Read attributes from element + * + * @param object $element Element object + * + * @return array attributes + */ + private static function read_attributes($element) { + $attribute = array(); + + foreach ($element->attributes AS $attributes) { + $attribute[$attributes->name] = $attributes->textContent; + } + + return $attribute; + } + /** * @brief Imports an XML string containing OStatus elements * @@ -543,225 +762,6 @@ class ostatus { return $link_data; } - /** - * @brief Fetches author data - * - * @param object $xpath The xpath object - * @param object $context The xml context of the author detals - * @param array $importer user record of the importing user - * @param array $contact Called by reference, will contain the fetched contact - * @param bool $onlyfetch Only fetch the header without updating the contact entries - * - * @return array Array of author related entries for the item - */ - private static function fetchauthor($xpath, $context, $importer, &$contact, $onlyfetch) { - - $author = array(); - $author["author-link"] = $xpath->evaluate('atom:author/atom:uri/text()', $context)->item(0)->nodeValue; - $author["author-name"] = $xpath->evaluate('atom:author/atom:name/text()', $context)->item(0)->nodeValue; - $addr = $xpath->evaluate('atom:author/atom:email/text()', $context)->item(0)->nodeValue; - - $aliaslink = $author["author-link"]; - - $alternate = $xpath->query("atom:author/atom:link[@rel='alternate']", $context)->item(0)->attributes; - if (is_object($alternate)) { - foreach ($alternate AS $attributes) { - if (($attributes->name == "href") && ($attributes->textContent != "")) { - $author["author-link"] = $attributes->textContent; - } - } - } - - $author["contact-id"] = $contact["id"]; - - if ($author["author-link"] != "") { - if ($aliaslink == "") { - $aliaslink = $author["author-link"]; - } - - $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `nurl` IN ('%s', '%s') AND `network` != '%s'", - intval($importer["uid"]), dbesc(normalise_link($author["author-link"])), - dbesc(normalise_link($aliaslink)), dbesc(NETWORK_STATUSNET)); - - if (dbm::is_result($r)) { - $contact = $r[0]; - $author["contact-id"] = $r[0]["id"]; - $author["author-link"] = $r[0]["url"]; - } - } elseif ($addr != "") { - // Should not happen - $contact = dba::fetch_first("SELECT * FROM `contact` WHERE `uid` = ? AND `addr` = ? AND `network` != ?", - $importer["uid"], $addr, NETWORK_STATUSNET); - - if (dbm::is_result($contact)) { - $author["contact-id"] = $contact["id"]; - $author["author-link"] = $contact["url"]; - } - } - - $avatarlist = array(); - $avatars = $xpath->query("atom:author/atom:link[@rel='avatar']", $context); - foreach ($avatars AS $avatar) { - $href = ""; - $width = 0; - foreach ($avatar->attributes AS $attributes) { - if ($attributes->name == "href") { - $href = $attributes->textContent; - } - if ($attributes->name == "width") { - $width = $attributes->textContent; - } - } - if ($href != "") { - $avatarlist[$width] = $href; - } - } - if (count($avatarlist) > 0) { - krsort($avatarlist); - $author["author-avatar"] = Probe::fixAvatar(current($avatarlist), $author["author-link"]); - } - - $displayname = $xpath->evaluate('atom:author/poco:displayName/text()', $context)->item(0)->nodeValue; - if ($displayname != "") { - $author["author-name"] = $displayname; - } - - $author["owner-name"] = $author["author-name"]; - $author["owner-link"] = $author["author-link"]; - $author["owner-avatar"] = $author["author-avatar"]; - - // Only update the contacts if it is an OStatus contact - if ($r && !$onlyfetch && ($contact["network"] == NETWORK_OSTATUS)) { - - // Update contact data - - // This query doesn't seem to work - // $value = $xpath->query("atom:link[@rel='salmon']", $context)->item(0)->nodeValue; - // if ($value != "") - // $contact["notify"] = $value; - - // This query doesn't seem to work as well - I hate these queries - // $value = $xpath->query("atom:link[@rel='self' and @type='application/atom+xml']", $context)->item(0)->nodeValue; - // if ($value != "") - // $contact["poll"] = $value; - - $value = $xpath->evaluate('atom:author/atom:uri/text()', $context)->item(0)->nodeValue; - if ($value != "") - $contact["alias"] = $value; - - $value = $xpath->evaluate('atom:author/poco:displayName/text()', $context)->item(0)->nodeValue; - if ($value != "") - $contact["name"] = $value; - - $value = $xpath->evaluate('atom:author/poco:preferredUsername/text()', $context)->item(0)->nodeValue; - if ($value != "") - $contact["nick"] = $value; - - $value = $xpath->evaluate('atom:author/poco:note/text()', $context)->item(0)->nodeValue; - if ($value != "") - $contact["about"] = html2bbcode($value); - - $value = $xpath->evaluate('atom:author/poco:address/poco:formatted/text()', $context)->item(0)->nodeValue; - if ($value != "") - $contact["location"] = $value; - - if (($contact["name"] != $r[0]["name"]) || ($contact["nick"] != $r[0]["nick"]) || ($contact["about"] != $r[0]["about"]) || - ($contact["alias"] != $r[0]["alias"]) || ($contact["location"] != $r[0]["location"])) { - - logger("Update contact data for contact ".$contact["id"], LOGGER_DEBUG); - - q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `alias` = '%s', `about` = '%s', `location` = '%s', `name-date` = '%s' WHERE `id` = %d", - dbesc($contact["name"]), dbesc($contact["nick"]), dbesc($contact["alias"]), - dbesc($contact["about"]), dbesc($contact["location"]), - dbesc(datetime_convert()), intval($contact["id"])); - } - - if (isset($author["author-avatar"]) && ($author["author-avatar"] != $r[0]['avatar'])) { - logger("Update profile picture for contact ".$contact["id"], LOGGER_DEBUG); - - update_contact_avatar($author["author-avatar"], $importer["uid"], $contact["id"]); - } - - // Ensure that we are having this contact (with uid=0) - $cid = get_contact($author["author-link"], 0); - - if ($cid) { - // Update it with the current values - q("UPDATE `contact` SET `url` = '%s', `name` = '%s', `nick` = '%s', `alias` = '%s', - `about` = '%s', `location` = '%s', - `success_update` = '%s', `last-update` = '%s' - WHERE `id` = %d", - dbesc($author["author-link"]), dbesc($contact["name"]), dbesc($contact["nick"]), - dbesc($contact["alias"]), dbesc($contact["about"]), dbesc($contact["location"]), - dbesc(datetime_convert()), dbesc(datetime_convert()), intval($cid)); - - // Update the avatar - update_contact_avatar($author["author-avatar"], 0, $cid); - } - - $contact["generation"] = 2; - $contact["hide"] = false; // OStatus contacts are never hidden - $contact["photo"] = $author["author-avatar"]; - $gcid = update_gcontact($contact); - - link_gcontact($gcid, $contact["uid"], $contact["id"]); - } - - return $author; - } - - /** - * @brief Fetches author data from a given XML string - * - * @param string $xml The XML - * @param array $importer user record of the importing user - * - * @return array Array of author related entries for the item - */ - public static function salmon_author($xml, $importer) { - - if ($xml == "") - return; - - $doc = new DOMDocument(); - @$doc->loadXML($xml); - - $xpath = new DomXPath($doc); - $xpath->registerNamespace('atom', NAMESPACE_ATOM1); - $xpath->registerNamespace('thr', NAMESPACE_THREAD); - $xpath->registerNamespace('georss', NAMESPACE_GEORSS); - $xpath->registerNamespace('activity', NAMESPACE_ACTIVITY); - $xpath->registerNamespace('media', NAMESPACE_MEDIA); - $xpath->registerNamespace('poco', NAMESPACE_POCO); - $xpath->registerNamespace('ostatus', NAMESPACE_OSTATUS); - $xpath->registerNamespace('statusnet', NAMESPACE_STATUSNET); - - $entries = $xpath->query('/atom:entry'); - - foreach ($entries AS $entry) { - // fetch the author - $author = self::fetchauthor($xpath, $entry, $importer, $contact, true); - return $author; - } - } - - /** - * @brief Read attributes from element - * - * @param object $element Element object - * - * @return array attributes - */ - private static function read_attributes($element) { - $attribute = array(); - - foreach ($element->attributes AS $attributes) { - $attribute[$attributes->name] = $attributes->textContent; - } - - return $attribute; - } - /** * @brief Checks if the current post is a reshare * From 21a630ebae9e1cfdac8c5148318f719ec89fbd73 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 10 Sep 2017 07:52:07 +0000 Subject: [PATCH 14/49] Added documentation --- include/ostatus.php | 52 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/include/ostatus.php b/include/ostatus.php index d05e575f0d..c13a466ed4 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -29,9 +29,6 @@ require_once 'include/cache.php'; * */ class ostatus { - const OSTATUS_DEFAULT_POLL_INTERVAL = 30; // given in minutes - const OSTATUS_DEFAULT_POLL_TIMEFRAME = 1440; // given in minutes - const OSTATUS_DEFAULT_POLL_TIMEFRAME_MENTIONS = 14400; // given in minutes private static $itemlist; @@ -39,7 +36,7 @@ class ostatus { * @brief Fetches author data * * @param object $xpath The xpath object - * @param object $context The xml context of the author detals + * @param object $context The xml context of the author details * @param array $importer user record of the importing user * @param array $contact Called by reference, will contain the fetched contact * @param bool $onlyfetch Only fetch the header without updating the contact entries @@ -259,20 +256,24 @@ class ostatus { * * @param string $xml The XML * @param array $importer user record of the importing user - * @param $contact - * @param array $hub Called by reference, returns the fetched hub data + * @param array $contact + * @param string $hub Called by reference, returns the fetched hub data */ public static function import($xml, $importer, &$contact, &$hub) { self::process($xml, $importer, $contact, $hub); } /** - * @brief Imports an XML string containing OStatus elements + * @brief Internal feed processing * * @param string $xml The XML * @param array $importer user record of the importing user - * @param $contact - * @param array $hub Called by reference, returns the fetched hub data + * @param array $contact + * @param string $hub Called by reference, returns the fetched hub data + * @param boolean $stored Is the post fresh imported or from the database? + * @param boolean $initialize Is it the leading post so that data has to be initialized? + * + * @return boolean Could the XML be processed? */ private static function process($xml, $importer, &$contact, &$hub, $stored = false, $initialize = true) { if ($initialize) { @@ -465,6 +466,14 @@ class ostatus { return true; } + /** + * @brief Processes the XML for a post + * + * @param object $xpath The xpath object + * @param object $entry The xml entry that is processed + * @param array $item The item array + * @param array $importer user record of the importing user + */ private static function processPost($xpath, $entry, &$item, $importer) { $item["uri"] = $xpath->query('atom:id/text()', $entry)->item(0)->nodeValue; $item["body"] = html2bbcode($xpath->query('atom:content/text()', $entry)->item(0)->nodeValue); @@ -591,6 +600,13 @@ class ostatus { self::$itemlist[] = $item; } + /** + * @brief Fetch related posts and processes them + * + * @param string $related The link to the related item + * @param string $related_uri The related item in "uri" format + * @param array $importer user record of the importing user + */ private static function fetchRelated($related, $related_uri, $importer) { $condition = array('`item-uri` = ? AND `protocol` IN (?, ?)', $related_uri, PROTOCOL_DFRN, PROTOCOL_OSTATUS_SALMON); $conversation = dba::select('conversation', array('source', 'protocol'), $condition, array('limit' => 1)); @@ -655,6 +671,16 @@ class ostatus { return; } + /** + * @brief Processes the XML for a repeated post + * + * @param object $xpath The xpath object + * @param object $entry The xml entry that is processed + * @param array $item The item array + * @param array $importer user record of the importing user + * + * @return array with data from links + */ private static function processRepeatedItem($xpath, $entry, &$item, $importer) { $activityobjects = $xpath->query('activity:object', $entry)->item(0); @@ -704,6 +730,14 @@ class ostatus { return $link_data; } + /** + * @brief Processes links in the XML + * + * @param object $links The xml data that contain links + * @param array $item The item array + * + * @return array with data from the links + */ private static function processLinks($links, &$item) { $link_data = array('add_body' => '', 'self' => ''); From bdf490e2fad7415c70df8dd2d57473cee3055a48 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 10 Sep 2017 07:58:14 +0000 Subject: [PATCH 15/49] Added missing function --- include/items.php | 1 + include/ostatus.php | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/include/items.php b/include/items.php index ec4c986a18..f2ee2311b7 100644 --- a/include/items.php +++ b/include/items.php @@ -534,6 +534,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f } // Converting the plink + /// @todo Check if this is really still needed if ($arr['network'] == NETWORK_OSTATUS) { if (isset($arr['plink'])) { $arr['plink'] = ostatus::convert_href($arr['plink']); diff --git a/include/ostatus.php b/include/ostatus.php index c13a466ed4..02bd2f4475 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -796,6 +796,36 @@ class ostatus { return $link_data; } +/** + * @brief Create an url out of an uri + * + * @param string $href URI in the format "parameter1:parameter1:..." + * + * @return string URL in the format http(s)://.... + */ + public static function convert_href($href) { + $elements = explode(":",$href); + + if ((count($elements) <= 2) || ($elements[0] != "tag")) + return $href; + + $server = explode(",", $elements[1]); + $conversation = explode("=", $elements[2]); + + if ((count($elements) == 4) && ($elements[2] == "post")) + return "http://".$server[0]."/notice/".$elements[3]; + + if ((count($conversation) != 2) || ($conversation[1] =="")) { + return $href; + } + if ($elements[3] == "objectType=thread") { + return "http://".$server[0]."/conversation/".$conversation[1]; + } else { + return "http://".$server[0]."/notice/".$conversation[1]; + } + return $href; + } + /** * @brief Checks if the current post is a reshare * From b847f63e2ac8005f2d2696251860fe50e3e61bc2 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 10 Sep 2017 08:27:24 +0000 Subject: [PATCH 16/49] Added logging --- include/ostatus.php | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/include/ostatus.php b/include/ostatus.php index 02bd2f4475..6fb42c8f0a 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -614,9 +614,11 @@ class ostatus { $stored = true; $xml = $conversation['source']; if (self::process($xml, $importer, $contact, $hub, $stored, false)) { + logger('Got valid cached XML for URI '.$related_uri, LOGGER_DEBUG); return; } if ($conversation['protocol'] == PROTOCOL_OSTATUS_SALMON) { + logger('Delete invalid cached XML for URI '.$related_uri, LOGGER_DEBUG); dba::delete('conversation', array('item-uri' => $related_uri)); } } @@ -631,6 +633,7 @@ class ostatus { $xml = ''; if (stristr($related_data['header'], 'Content-Type: application/atom+xml')) { + logger('Directly fetched XML for URI '.$related_uri, LOGGER_DEBUG); $xml = $related_data['body']; } @@ -641,16 +644,22 @@ class ostatus { } $xpath = new DomXPath($doc); + $atom_file = ''; + $links = $xpath->query('//link'); if ($links) { foreach ($links AS $link) { $attribute = self::read_attributes($link); if (($attribute['rel'] == 'alternate') && ($attribute['type'] == 'application/atom+xml')) { - $related_atom = z_fetch_url($attribute['href']); + $atom_file = $attribute['href']; + } + } + if ($atom_file != '') { + $related_atom = z_fetch_url($atom_file); - if ($related_atom['success']) { - $xml = $related_atom['body']; - } + if ($related_atom['success']) { + logger('Fetched XML for URI '.$related_uri, LOGGER_DEBUG); + $xml = $related_atom['body']; } } } @@ -658,15 +667,29 @@ class ostatus { // Workaround for older GNU Social servers if (($xml == '') && strstr($related, '/notice/')) { - $related_atom = z_fetch_url(str_replace('/notice/', '/api/statuses/show/', $related).',atom'); + $related_atom = z_fetch_url(str_replace('/notice/', '/api/statuses/show/', $related).'.atom'); if ($related_atom['success']) { + logger('GNU Social workaround to fetch XML for URI '.$related_uri, LOGGER_DEBUG); + $xml = $related_atom['body']; + } + } + + // Even more worse workaround for GNU Social ;-) + if ($xml == '') { + $related_guess = ostatus::convert_href($related_uri); + $related_atom = z_fetch_url(str_replace('/notice/', '/api/statuses/show/', $related_guess).'.atom'); + + if ($related_atom['success']) { + logger('GNU Social workaround 2 to fetch XML for URI '.$related_uri, LOGGER_DEBUG); $xml = $related_atom['body']; } } if ($xml != '') { self::process($xml, $importer, $contact, $hub, $stored, false); + } else { + logger("XML couldn't be fetched for URI: ".$related_uri." - href: ".$related, LOGGER_DEBUG); } return; } From 8e17be7225cd0032949724451e792f4f9f65dfb3 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 10 Sep 2017 21:56:05 +0000 Subject: [PATCH 17/49] Store conversation data --- boot.php | 5 +- include/ostatus.php | 173 ++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 161 insertions(+), 17 deletions(-) diff --git a/boot.php b/boot.php index b8be70229c..417502b960 100644 --- a/boot.php +++ b/boot.php @@ -229,8 +229,9 @@ define('PROTOCOL_UNKNOWN', 0); define('PROTOCOL_DFRN', 1); define('PROTOCOL_DIASPORA', 2); define('PROTOCOL_OSTATUS_SALMON', 3); -define('PROTOCOL_OSTATUS_FEED', 4); -define('PROTOCOL_GS_CONVERSATION', 5); +define('PROTOCOL_OSTATUS_FEED', 4); // Deprecated +define('PROTOCOL_GS_CONVERSATION', 5); // Deprecated +define('PROTOCOL_SPLITTED_CONV', 6); /** @}*/ /** diff --git a/include/ostatus.php b/include/ostatus.php index 6fb42c8f0a..d33073a1a7 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -31,6 +31,7 @@ require_once 'include/cache.php'; class ostatus { private static $itemlist; + private static $conv_list = array(); /** * @brief Fetches author data @@ -278,6 +279,7 @@ class ostatus { private static function process($xml, $importer, &$contact, &$hub, $stored = false, $initialize = true) { if ($initialize) { self::$itemlist = array(); + self::$conv_list = array(); } logger("Import OStatus message", LOGGER_DEBUG); @@ -321,10 +323,19 @@ class ostatus { if ($first_child == "feed") { $entries = $xpath->query('/atom:feed/atom:entry'); - $header["protocol"] = PROTOCOL_OSTATUS_FEED; } else { $entries = $xpath->query('/atom:entry'); + } + + if ($entries->length == 1) { + $doc2 = new DOMDocument(); + $doc2->loadXML($xml); + $doc2->preserveWhiteSpace = false; + $doc2->formatOutput = true; + $xml2 = $doc2->saveXML(); + $header["protocol"] = PROTOCOL_OSTATUS_SALMON; + $header["source"] = $xml2; } // Fetch the first author @@ -332,7 +343,6 @@ class ostatus { $author = self::fetchauthor($xpath, $authordata, $importer, $contact, $stored); $entry = $xpath->query('/atom:entry'); - $header["protocol"] = PROTOCOL_OSTATUS_SALMON; // Reverse the order of the entries $entrylist = array(); @@ -406,14 +416,6 @@ class ostatus { logger("Unhandled verb ".$item["verb"]." ".print_r($item, true)); } - $doc2 = new DOMDocument(); - $doc2->loadXML($xml); - $doc2->preserveWhiteSpace = false; - $doc2->formatOutput = true; - $xml2 = $doc2->saveXML(); - - $item["source"] = $xml2; - self::processPost($xpath, $entry, $item, $importer); if ($initialize && (count(self::$itemlist) > 0)) { @@ -502,10 +504,6 @@ class ostatus { } } - if (empty($item['conversation-href']) && !empty($item['conversation-uri'])) { - $item['conversation-href'] = $item['conversation-uri']; - } - $related = ""; $inreplyto = $xpath->query('thr:in-reply-to', $entry); @@ -585,6 +583,10 @@ class ostatus { $item["body"] = html2bbcode($clear_text) . '[spoiler]' . $item["body"] . '[/spoiler]'; } + if (!empty($item["conversation-href"])) { + self::fetchConversation($item['conversation-href'], $item['conversation-uri']); + } + if (isset($item["parent-uri"]) && ($related != '')) { self::FetchRelated($related, $item["parent-uri"], $importer); $item["type"] = 'remote-comment'; @@ -593,13 +595,143 @@ class ostatus { $item["parent-uri"] = $item["uri"]; } - if ($item['author-link'] != '') { + if (($item['author-link'] != '') && !empty($header["protocol"])) { $item = store_conversation($item); } self::$itemlist[] = $item; } + /** + * @brief Fetch the conversation for posts + * + * @param string $conversation The link to the conversation + * @param string $conversation_uri The conversation in "uri" format + */ + private static function fetchConversation($conversation, $conversation_uri) { + + // Ensure that we only store a conversation once in a process + if (isset(self::$conv_list[$conversation])) { + return; + } + + self::$conv_list[$conversation] = true; + + $conversation_data = z_fetch_url($conversation); + + if (!$conversation_data['success']) { + return; + } + + $xml = ''; + + if (stristr($conversation_data['header'], 'Content-Type: application/atom+xml')) { + $xml = $conversation_data['body']; + } + + if ($xml == '') { + $doc = new DOMDocument(); + if (!@$doc->loadHTML($conversation_data['body'])) { + return; + } + $xpath = new DomXPath($doc); + + $links = $xpath->query('//link'); + if ($links) { + foreach ($links AS $link) { + $attribute = ostatus::read_attributes($link); + if (($attribute['rel'] == 'alternate') && ($attribute['type'] == 'application/atom+xml')) { + $file = $attribute['href']; + } + } + if ($file != '') { + $conversation_atom = z_fetch_url($attribute['href']); + + if ($conversation_atom['success']) { + $xml = $conversation_atom['body']; + } + } + } + } + + if ($xml == '') { + return; + } + + self::storeConversation($xml, $conversation, $conversation_uri); + } + + /** + * @brief Store a feed in several conversation entries + * + * @param string $xml The feed + */ + private static function storeConversation($xml, $conversation = '', $conversation_uri = '') { + $doc = new DOMDocument(); + @$doc->loadXML($xml); + + $xpath = new DomXPath($doc); + $xpath->registerNamespace('atom', NAMESPACE_ATOM1); + $xpath->registerNamespace('thr', NAMESPACE_THREAD); + $xpath->registerNamespace('ostatus', NAMESPACE_OSTATUS); + + $entries = $xpath->query('/atom:feed/atom:entry'); + + // Now store the entries + foreach ($entries AS $entry) { + $doc2 = new DOMDocument(); + $doc2->preserveWhiteSpace = false; + $doc2->formatOutput = true; + + $conv_data = array(); + + $conv_data['protocol'] = PROTOCOL_SPLITTED_CONV; + $conv_data['network'] = NETWORK_OSTATUS; + $conv_data['uri'] = $xpath->query('atom:id/text()', $entry)->item(0)->nodeValue; + + $inreplyto = $xpath->query('thr:in-reply-to', $entry); + if (is_object($inreplyto->item(0))) { + foreach ($inreplyto->item(0)->attributes AS $attributes) { + if ($attributes->name == "ref") { + $conv_data['reply-to-uri'] = $attributes->textContent; + } + } + } + + $conv = $xpath->query('ostatus:conversation/text()', $entry)->item(0)->nodeValue; + $conv_data['conversation-uri'] = $conv; + + $conv = $xpath->query('ostatus:conversation', $entry); + if (is_object($conv->item(0))) { + foreach ($conv->item(0)->attributes AS $attributes) { + if ($attributes->name == "ref") { + $conv_data['conversation-uri'] = $attributes->textContent; + } + if ($attributes->name == "href") { + $conv_data['conversation-href'] = $attributes->textContent; + } + } + } + + if ($conversation != '') { + $conv_data['conversation-uri'] = $conversation; + } + + if ($conversation_uri != '') { + $conv_data['conversation-uri'] = $conversation_uri; + } + + $entry = $doc2->importNode($entry, true); + + $doc2->appendChild($entry); + + $conv_data['source'] = $doc2->saveXML(); + + logger('Store conversation data for uri '.$conv_data['uri'], LOGGER_DEBUG); + store_conversation($conv_data); + } + } + /** * @brief Fetch related posts and processes them * @@ -686,6 +818,17 @@ class ostatus { } } + // Finally we take the data that we fetched from "ostatus:conversation" + if ($xml == '') { + $condition = array('item-uri' => $related_uri, 'protocol' => PROTOCOL_SPLITTED_CONV); + $conversation = dba::select('conversation', array('source'), $condition, array('limit' => 1)); + if (dbm::is_result($conversation)) { + $stored = true; + logger('Got cached XML from conversation for URI '.$related_uri, LOGGER_DEBUG); + $xml = $conversation['source']; + } + } + if ($xml != '') { self::process($xml, $importer, $contact, $hub, $stored, false); } else { From ec929d8207e519837c73601f7193c334e0337902 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 11 Sep 2017 12:44:37 +0000 Subject: [PATCH 18/49] Fetch the own single post if we are processing a feed of multiple entries --- include/ostatus.php | 57 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/include/ostatus.php b/include/ostatus.php index d33073a1a7..0c99905fa4 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -328,6 +328,7 @@ class ostatus { } if ($entries->length == 1) { + // We reformat the XML to make it better readable $doc2 = new DOMDocument(); $doc2->loadXML($xml); $doc2->preserveWhiteSpace = false; @@ -336,6 +337,8 @@ class ostatus { $header["protocol"] = PROTOCOL_OSTATUS_SALMON; $header["source"] = $xml2; + } elseif (!$initialize) { + return false; } // Fetch the first author @@ -351,10 +354,6 @@ class ostatus { $entrylist[] = $entry; } - if (!$initialize && (count($entrylist) > 1)) { - return false; - } - foreach (array_reverse($entrylist) AS $entry) { // fetch the author $authorelement = $xpath->query('/atom:entry/atom:author', $entry); @@ -583,19 +582,23 @@ class ostatus { $item["body"] = html2bbcode($clear_text) . '[spoiler]' . $item["body"] . '[/spoiler]'; } + if (($self != '') && empty($item['protocol'])) { + self::fetchSelf($self, $item); + } + if (!empty($item["conversation-href"])) { self::fetchConversation($item['conversation-href'], $item['conversation-uri']); } if (isset($item["parent-uri"]) && ($related != '')) { - self::FetchRelated($related, $item["parent-uri"], $importer); + self::fetchRelated($related, $item["parent-uri"], $importer); $item["type"] = 'remote-comment'; $item["gravity"] = GRAVITY_COMMENT; } else { $item["parent-uri"] = $item["uri"]; } - if (($item['author-link'] != '') && !empty($header["protocol"])) { + if (($item['author-link'] != '') && !empty($item['protocol'])) { $item = store_conversation($item); } @@ -727,11 +730,53 @@ class ostatus { $conv_data['source'] = $doc2->saveXML(); + $condition = array('item-uri' => $conv_data['uri'],'protocol' => PROTOCOL_OSTATUS_FEED); + if (dba::exists('conversation', $condition)) { + logger('Delete deprecated entry for URI '.$conv_data['uri'], LOGGER_DEBUG); + dba::delete('conversation', array('item-uri' => $conv_data['uri'])); + } + logger('Store conversation data for uri '.$conv_data['uri'], LOGGER_DEBUG); store_conversation($conv_data); } } + /** + * @brief Fetch the own post so that it can be stored later + * @param array $item The item array + * + * We want to store the original data for later processing. + * This function is meant for cases where we process a feed with multiple entries. + * In that case we need to fetch the single posts here. + * + * @param string $self The link to the self item + */ + private static function fetchSelf($self, &$item) { + $condition = array('`item-uri` = ? AND `protocol` IN (?, ?)', $self, PROTOCOL_DFRN, PROTOCOL_OSTATUS_SALMON); + if (dba::exists('conversation', $condition)) { + logger('Conversation '.$item['uri'].' is already stored.'); + return; + } + + $self_data = z_fetch_url($self); + + if (!$self_data['success']) { + return; + } + + // We reformat the XML to make it better readable + $doc = new DOMDocument(); + $doc->loadXML($self_data['body']); + $doc->preserveWhiteSpace = false; + $doc->formatOutput = true; + $xml = $doc->saveXML(); + + $item["protocol"] = PROTOCOL_OSTATUS_SALMON; + $item["source"] = $xml; + + logger('Conversation '.$item['uri'].' is now fetched.'); + } + /** * @brief Fetch related posts and processes them * From 519a8807f1bac539b9efa433550e3a6c1d0d6a97 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 11 Sep 2017 22:15:16 +0000 Subject: [PATCH 19/49] Added documentation --- include/dfrn.php | 1 + 1 file changed, 1 insertion(+) diff --git a/include/dfrn.php b/include/dfrn.php index 0b12f4d615..c8e89fe40f 100644 --- a/include/dfrn.php +++ b/include/dfrn.php @@ -820,6 +820,7 @@ class dfrn { * @param array $owner Owner record * @param bool $comment Trigger the sending of the "comment" element * @param int $cid Contact ID of the recipient + * @param bool $single If set, the entry is created as an XML document with a single "entry" element * * @return object XML entry object * @todo Add type-hints From c636b0a6b268bb3fb984264c97160563af20c504 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 12 Sep 2017 06:08:24 +0000 Subject: [PATCH 20/49] We can now unfollow a contact without deleting it --- mod/contacts.php | 14 +++-- mod/dfrn_confirm.php | 23 ++++--- mod/unfollow.php | 146 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 167 insertions(+), 16 deletions(-) create mode 100644 mod/unfollow.php diff --git a/mod/contacts.php b/mod/contacts.php index bbbd088cd1..2539360552 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -574,9 +574,15 @@ function contacts_content(App $a) { if ($contact['network'] == NETWORK_DFRN) $profile_select = contact_profile_assign($contact['profile-id'],(($contact['network'] !== NETWORK_DFRN) ? true : false)); - if (in_array($contact['network'], array(NETWORK_DIASPORA, NETWORK_OSTATUS)) && - ($contact['rel'] == CONTACT_IS_FOLLOWER)) - $follow = System::baseUrl(true)."/follow?url=".urlencode($contact["url"]); + if (in_array($contact['network'], array(NETWORK_DIASPORA, NETWORK_OSTATUS))) { + if ($contact['rel'] == CONTACT_IS_FOLLOWER) { + $follow = System::baseUrl(true)."/follow?url=".urlencode($contact["url"]); + $follow_text = t("Connect/Follow"); + } elseif ($contact['rel'] == CONTACT_IS_FRIEND) { + $follow = System::baseUrl(true)."/unfollow?url=".urlencode($contact["url"]); + $follow_text = t("Disconnect/Unfollow"); + } + } // Load contactact related actions like hide, suggest, delete and others $contact_actions = contact_actions($contact); @@ -613,7 +619,7 @@ function contacts_content(App $a) { '$last_update' => $last_update, '$udnow' => t('Update now'), '$follow' => $follow, - '$follow_text' => t("Connect/Follow"), + '$follow_text' => $follow_text, '$profile_select' => $profile_select, '$contact_id' => $contact['id'], '$block_text' => (($contact['blocked']) ? t('Unblock') : t('Block') ), diff --git a/mod/dfrn_confirm.php b/mod/dfrn_confirm.php index 9c64c8c883..0e99b26c32 100644 --- a/mod/dfrn_confirm.php +++ b/mod/dfrn_confirm.php @@ -352,8 +352,7 @@ function dfrn_confirm_post(App $a, $handsfree = null) { dbesc(NETWORK_DFRN), intval($contact_id) ); - } - else { + } else { // $network !== NETWORK_DFRN @@ -361,17 +360,15 @@ function dfrn_confirm_post(App $a, $handsfree = null) { $notify = (($contact['notify']) ? $contact['notify'] : ''); $poll = (($contact['poll']) ? $contact['poll'] : ''); - if((! $contact['notify']) || (! $contact['poll'])) { - $arr = Probe::lrdd($contact['url']); - if(count($arr)) { - foreach($arr as $link) { - if($link['@attributes']['rel'] === 'salmon') - $notify = $link['@attributes']['href']; - if($link['@attributes']['rel'] === NAMESPACE_FEED) - $poll = $link['@attributes']['href']; - } - } + $arr = Probe::uri($contact['url']); + if (empty($contact['notify'])) { + $notify = $arr['notify']; } + if (empty($contact['poll'])) { + $poll = $arr['poll']; + } + + $addr = $arr['addr']; $new_relation = $contact['rel']; $writable = $contact['writable']; @@ -394,6 +391,7 @@ function dfrn_confirm_post(App $a, $handsfree = null) { $r = q("UPDATE `contact` SET `name-date` = '%s', `uri-date` = '%s', + `addr` = '%s', `notify` = '%s', `poll` = '%s', `blocked` = 0, @@ -406,6 +404,7 @@ function dfrn_confirm_post(App $a, $handsfree = null) { ", dbesc(datetime_convert()), dbesc(datetime_convert()), + dbesc($addr), dbesc($notify), dbesc($poll), dbesc($network), diff --git a/mod/unfollow.php b/mod/unfollow.php new file mode 100644 index 0000000000..9e2f388779 --- /dev/null +++ b/mod/unfollow.php @@ -0,0 +1,146 @@ + 1)); + + if (!dbm::is_result($contact)) { + notice(t("You aren't a friend of this contact.").EOL); + $submit = ""; + // NOTREACHED + } + + if (!in_array($contact['network'], array(NETWORK_DIASPORA, NETWORK_OSTATUS))) { + notice(t("Unfollowing is currently not supported by your network.").EOL); + $submit = ""; + // NOTREACHED + } + + $request = System::baseUrl()."/unfollow"; + $tpl = get_markup_template('auto_request.tpl'); + + $r = q("SELECT `url` FROM `contact` WHERE `uid` = %d AND `self` LIMIT 1", intval($uid)); + + if (!$r) { + notice(t('Permission denied.') . EOL); + goaway($_SESSION['return_url']); + // NOTREACHED + } + + $myaddr = $r[0]["url"]; + + // Makes the connection request for friendica contacts easier + $_SESSION["fastlane"] = $contact["url"]; + + $header = $contact["name"]; + + if ($contact["addr"] != "") { + $header .= " <".$contact["addr"].">"; + } + + $header = t("Disconnect/Unfollow"); + + $o = replace_macros($tpl,array( + '$header' => htmlentities($header), + '$desc' => "", + '$pls_answer' => "", + '$does_know_you' => "", + '$add_note' => "", + '$page_desc' => "", + '$friendica' => "", + '$statusnet' => "", + '$diaspora' => "", + '$diasnote' => "", + '$your_address' => t('Your Identity Address:'), + '$invite_desc' => "", + '$emailnet' => "", + '$submit' => $submit, + '$cancel' => t('Cancel'), + '$nickname' => "", + '$name' => $contact["name"], + '$url' => $contact["url"], + '$zrl' => zrl($contact["url"]), + '$url_label' => t("Profile URL"), + '$myaddr' => $myaddr, + '$request' => $request, + '$keywords' => "", + '$keywords_label' => "" + )); + + $a->page['aside'] = ""; + profile_load($a, "", 0, get_contact_details_by_url($contact["url"])); + + $o .= replace_macros(get_markup_template('section_title.tpl'), + array('$title' => t('Status Messages and Posts') + )); + + // Show last public posts + $o .= posts_from_contact_url($a, $contact["url"]); + + return $o; +} + +function unfollow_post(App $a) { + + if (!local_user()) { + notice(t('Permission denied.') . EOL); + goaway($_SESSION['return_url']); + // NOTREACHED + } + + if ($_REQUEST['cancel']) { + goaway($_SESSION['return_url']); + } + + $uid = local_user(); + $url = notags(trim($_REQUEST['url'])); + $return_url = $_SESSION['return_url']; + + $condition = array("`uid` = ? AND `rel` = ? AND (`nurl` = ? OR `alias` = ? OR `alias` = ?) AND `network` != ?", + $uid, CONTACT_IS_FRIEND, normalise_link($url), + normalise_link($url), $url, NETWORK_STATUSNET); + $contact = dba::select('contact', array(), $condition, array('limit' => 1)); + + if (!dbm::is_result($contact)) { + notice(t("Contact wasn't found or can't be unfollowed.")); + } else { + if (in_array($contact['network'], array(NETWORK_OSTATUS))) { + $r = q("SELECT `contact`.*, `user`.* FROM `contact` INNER JOIN `user` ON `contact`.`uid` = `user`.`uid` + WHERE `user`.`uid` = %d AND `contact`.`self` LIMIT 1", + intval($uid) + ); + if (dbm::is_result($r)) { + $self = ""; // Unused parameter + terminate_friendship($r[0], $self, $contact); + } + } + dba::update('contact', array('rel' => CONTACT_IS_FOLLOWER), array('id' => $contact['id'])); + + info(t('Contact unfollowed').EOL); + goaway(System::baseUrl().'/contacts/'.$contact['id']); + } + goaway($return_url); + // NOTREACHED +} From 3dcd281de46dc0bd1852772aa341b6819bde3418 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 12 Sep 2017 11:04:59 +0000 Subject: [PATCH 21/49] Rearranged code --- mod/follow.php | 89 +++++++++++++++++++++------------------------- mod/unfollow.php | 92 ++++++++++++++++++++++-------------------------- 2 files changed, 84 insertions(+), 97 deletions(-) diff --git a/mod/follow.php b/mod/follow.php index 4f2b45e3bf..a76a0f188f 100644 --- a/mod/follow.php +++ b/mod/follow.php @@ -8,6 +8,47 @@ require_once 'include/follow.php'; require_once 'include/Contact.php'; require_once 'include/contact_selectors.php'; +function follow_post(App $a) { + + if (! local_user()) { + notice( t('Permission denied.') . EOL); + goaway($_SESSION['return_url']); + // NOTREACHED + } + + if ($_REQUEST['cancel']) { + goaway($_SESSION['return_url']); + } + + $uid = local_user(); + $url = notags(trim($_REQUEST['url'])); + $return_url = $_SESSION['return_url']; + + // Makes the connection request for friendica contacts easier + // This is just a precaution if maybe this page is called somewhere directly via POST + $_SESSION["fastlane"] = $url; + + $result = new_contact($uid,$url,true); + + if ($result['success'] == false) { + if ($result['message']) { + notice($result['message']); + } + goaway($return_url); + } elseif ($result['cid']) { + goaway(System::baseUrl().'/contacts/'.$result['cid']); + } + + info( t('Contact added').EOL); + + if (strstr($return_url,'contacts')) { + goaway(System::baseUrl().'/contacts/'.$contact_id); + } + + goaway($return_url); + // NOTREACHED +} + function follow_content(App $a) { if (! local_user()) { @@ -99,13 +140,6 @@ function follow_content(App $a) { $r[0]["about"] = ""; } - $header = $ret["name"]; - - if ($ret["addr"] != "") { - $header .= " <".$ret["addr"].">"; - } - - //$header .= " (".network_to_name($ret['network'], $ret['url']).")"; $header = t("Connect/Follow"); $o = replace_macros($tpl,array( @@ -154,44 +188,3 @@ function follow_content(App $a) { return $o; } - -function follow_post(App $a) { - - if (! local_user()) { - notice( t('Permission denied.') . EOL); - goaway($_SESSION['return_url']); - // NOTREACHED - } - - if ($_REQUEST['cancel']) { - goaway($_SESSION['return_url']); - } - - $uid = local_user(); - $url = notags(trim($_REQUEST['url'])); - $return_url = $_SESSION['return_url']; - - // Makes the connection request for friendica contacts easier - // This is just a precaution if maybe this page is called somewhere directly via POST - $_SESSION["fastlane"] = $url; - - $result = new_contact($uid,$url,true); - - if ($result['success'] == false) { - if ($result['message']) { - notice($result['message']); - } - goaway($return_url); - } elseif ($result['cid']) { - goaway(System::baseUrl().'/contacts/'.$result['cid']); - } - - info( t('Contact added').EOL); - - if (strstr($return_url,'contacts')) { - goaway(System::baseUrl().'/contacts/'.$contact_id); - } - - goaway($return_url); - // NOTREACHED -} diff --git a/mod/unfollow.php b/mod/unfollow.php index 9e2f388779..d0baf87c44 100644 --- a/mod/unfollow.php +++ b/mod/unfollow.php @@ -8,6 +8,49 @@ require_once 'include/follow.php'; require_once 'include/Contact.php'; require_once 'include/contact_selectors.php'; +function unfollow_post(App $a) { + + if (!local_user()) { + notice(t('Permission denied.') . EOL); + goaway($_SESSION['return_url']); + // NOTREACHED + } + + if ($_REQUEST['cancel']) { + goaway($_SESSION['return_url']); + } + + $uid = local_user(); + $url = notags(trim($_REQUEST['url'])); + $return_url = $_SESSION['return_url']; + + $condition = array("`uid` = ? AND `rel` = ? AND (`nurl` = ? OR `alias` = ? OR `alias` = ?) AND `network` != ?", + $uid, CONTACT_IS_FRIEND, normalise_link($url), + normalise_link($url), $url, NETWORK_STATUSNET); + $contact = dba::select('contact', array(), $condition, array('limit' => 1)); + + if (!dbm::is_result($contact)) { + notice(t("Contact wasn't found or can't be unfollowed.")); + } else { + if (in_array($contact['network'], array(NETWORK_OSTATUS))) { + $r = q("SELECT `contact`.*, `user`.* FROM `contact` INNER JOIN `user` ON `contact`.`uid` = `user`.`uid` + WHERE `user`.`uid` = %d AND `contact`.`self` LIMIT 1", + intval($uid) + ); + if (dbm::is_result($r)) { + $self = ""; // Unused parameter + terminate_friendship($r[0], $self, $contact); + } + } + dba::update('contact', array('rel' => CONTACT_IS_FOLLOWER), array('id' => $contact['id'])); + + info(t('Contact unfollowed').EOL); + goaway(System::baseUrl().'/contacts/'.$contact['id']); + } + goaway($return_url); + // NOTREACHED +} + function unfollow_content(App $a) { if (! local_user()) { @@ -54,12 +97,6 @@ function unfollow_content(App $a) { // Makes the connection request for friendica contacts easier $_SESSION["fastlane"] = $contact["url"]; - $header = $contact["name"]; - - if ($contact["addr"] != "") { - $header .= " <".$contact["addr"].">"; - } - $header = t("Disconnect/Unfollow"); $o = replace_macros($tpl,array( @@ -101,46 +138,3 @@ function unfollow_content(App $a) { return $o; } - -function unfollow_post(App $a) { - - if (!local_user()) { - notice(t('Permission denied.') . EOL); - goaway($_SESSION['return_url']); - // NOTREACHED - } - - if ($_REQUEST['cancel']) { - goaway($_SESSION['return_url']); - } - - $uid = local_user(); - $url = notags(trim($_REQUEST['url'])); - $return_url = $_SESSION['return_url']; - - $condition = array("`uid` = ? AND `rel` = ? AND (`nurl` = ? OR `alias` = ? OR `alias` = ?) AND `network` != ?", - $uid, CONTACT_IS_FRIEND, normalise_link($url), - normalise_link($url), $url, NETWORK_STATUSNET); - $contact = dba::select('contact', array(), $condition, array('limit' => 1)); - - if (!dbm::is_result($contact)) { - notice(t("Contact wasn't found or can't be unfollowed.")); - } else { - if (in_array($contact['network'], array(NETWORK_OSTATUS))) { - $r = q("SELECT `contact`.*, `user`.* FROM `contact` INNER JOIN `user` ON `contact`.`uid` = `user`.`uid` - WHERE `user`.`uid` = %d AND `contact`.`self` LIMIT 1", - intval($uid) - ); - if (dbm::is_result($r)) { - $self = ""; // Unused parameter - terminate_friendship($r[0], $self, $contact); - } - } - dba::update('contact', array('rel' => CONTACT_IS_FOLLOWER), array('id' => $contact['id'])); - - info(t('Contact unfollowed').EOL); - goaway(System::baseUrl().'/contacts/'.$contact['id']); - } - goaway($return_url); - // NOTREACHED -} From a5cf2c69c89ac5d0930d5f998c9a856f91700332 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 13 Sep 2017 06:43:43 +0000 Subject: [PATCH 22/49] Reworked network page --- mod/network.php | 820 +++++++++--------- view/templates/saved_searches_aside.tpl | 2 +- .../frio/templates/saved_searches_aside.tpl | 2 +- .../templates/saved_searches_aside.tpl | 2 +- 4 files changed, 424 insertions(+), 402 deletions(-) diff --git a/mod/network.php b/mod/network.php index 796d35b866..9d68b33146 100644 --- a/mod/network.php +++ b/mod/network.php @@ -2,13 +2,38 @@ use Friendica\App; use Friendica\Core\System; +use Friendica\Core\Config; +use Friendica\Core\PConfig; + +require_once 'include/conversation.php'; +require_once 'include/group.php'; +require_once 'include/contact_widgets.php'; +require_once 'include/items.php'; +require_once 'include/ForumManager.php'; +require_once 'include/acl_selectors.php'; function network_init(App $a) { - if (! local_user()) { - notice( t('Permission denied.') . EOL); + if (!local_user()) { + notice(t('Permission denied.') . EOL); return; } + $search = (x($_GET, 'search') ? escape_tags($_GET['search']) : ''); + + if (($search != '') && !empty($_GET['submit'])) { + goaway('search?search='.urlencode($search)); + } + + if (x($_GET, 'save')) { + $exists = dba::exists('search', array('uid' => local_user(), 'term' => $search)); + if (!$exists) { + dba::insert('search', array('uid' => local_user(), 'term' => $search)); + } + } + if (x($_GET, 'remove')) { + dba::delete('search', array('uid' => local_user(), 'term' => $search)); + } + $is_a_date_query = false; if (x($_GET, 'cid') && intval($_GET['cid']) != 0) { $cid = $_GET['cid']; @@ -30,13 +55,13 @@ function network_init(App $a) { array_shift($query_array); // fetch last used network view and redirect if needed - if (! $is_a_date_query) { + if (!$is_a_date_query) { $sel_tabs = network_query_get_sel_tab($a); $sel_nets = network_query_get_sel_net(); $sel_groups = network_query_get_sel_group($a); - $last_sel_tabs = get_pconfig(local_user(), 'network.view','tab.selected'); - $last_sel_nets = get_pconfig(local_user(), 'network.view', 'net.selected'); - $last_sel_groups = get_pconfig(local_user(), 'network.view', 'group.selected'); + $last_sel_tabs = PConfig::get(local_user(), 'network.view','tab.selected'); + $last_sel_nets = PConfig::get(local_user(), 'network.view', 'net.selected'); + $last_sel_groups = PConfig::get(local_user(), 'network.view', 'group.selected'); $remember_tab = ($sel_tabs[0] === 'active' && is_array($last_sel_tabs) && $last_sel_tabs[0] !== 'active'); $remember_net = ($sel_nets === false && $last_sel_nets && $last_sel_nets !== 'all'); @@ -47,7 +72,7 @@ function network_init(App $a) { if ($remember_group) { $net_baseurl .= '/' . $last_sel_groups; // Note that the group number must come before the "/new" tab selection - } elseif($sel_groups !== false) { + } elseif ($sel_groups !== false) { $net_baseurl .= '/' . $sel_groups; } @@ -95,12 +120,11 @@ function network_init(App $a) { if ($remember_net) { $net_args['nets'] = $last_sel_nets; - } - else if($sel_nets!==false) { + } elseif ($sel_nets!==false) { $net_args['nets'] = $sel_nets; } - if($remember_tab || $remember_net || $remember_group) { + if ($remember_tab || $remember_net || $remember_group) { $net_args = array_merge($query_array, $net_args); $net_queries = build_querystring($net_args); @@ -117,57 +141,23 @@ function network_init(App $a) { $group_id = (($a->argc > 1 && is_numeric($a->argv[1])) ? intval($a->argv[1]) : 0); - set_pconfig(local_user(), 'network.view', 'group.selected', $group_id); + PConfig::set(local_user(), 'network.view', 'group.selected', $group_id); - require_once 'include/group.php'; - require_once 'include/contact_widgets.php'; - require_once 'include/items.php'; - require_once 'include/ForumManager.php'; - - if (! x($a->page, 'aside')) { + if (!x($a->page, 'aside')) { $a->page['aside'] = ''; } - $search = ((x($_GET, 'search')) ? escape_tags($_GET['search']) : ''); - - if (x($_GET, 'save')) { - $r = q("SELECT * FROM `search` WHERE `uid` = %d AND `term` = '%s' LIMIT 1", - intval(local_user()), - dbesc($search) - ); - if (! dbm::is_result($r)) { - q("INSERT INTO `search` ( `uid`,`term` ) VALUES ( %d, '%s') ", - intval(local_user()), - dbesc($search) - ); - } - } - if (x($_GET, 'remove')) { - q("DELETE FROM `search` WHERE `uid` = %d AND `term` = '%s'", - intval(local_user()), - dbesc($search) - ); - } - - // search terms header - if (x($_GET, 'search')) { - $a->page['content'] .= replace_macros(get_markup_template("section_title.tpl"),array( - '$title' => sprintf( t('Results for: %s'), $search) - )); - } - $a->page['aside'] .= (feature_enabled(local_user(),'groups') ? group_side('network/0','network','standard',$group_id) : ''); $a->page['aside'] .= (feature_enabled(local_user(),'forumlist_widget') ? ForumManager::widget(local_user(),$cid) : ''); $a->page['aside'] .= posted_date_widget('network',local_user(),false); $a->page['aside'] .= networks_widget('network',(x($_GET, 'nets') ? $_GET['nets'] : '')); $a->page['aside'] .= saved_searches($search); $a->page['aside'] .= fileas_widget('network',(x($_GET, 'file') ? $_GET['file'] : '')); - } function saved_searches($search) { - if (! feature_enabled(local_user(),'savedsearch')) { + if (!feature_enabled(local_user(),'savedsearch')) { return ''; } @@ -186,25 +176,19 @@ function saved_searches($search) { $o = ''; - $r = q("SELECT `id`,`term` FROM `search` WHERE `uid` = %d", - intval(local_user()) - ); - + $terms = dba::select('search', array('id', 'term'), array('uid' => local_user())); $saved = array(); - if (dbm::is_result($r)) { - foreach ($r as $rr) { - $saved[] = array( - 'id' => $rr['id'], - 'term' => $rr['term'], - 'encodedterm' => urlencode($rr['term']), - 'delete' => t('Remove term'), - 'selected' => ($search==$rr['term']), - ); - } + while ($rr = dba::fetch($terms)) { + $saved[] = array( + 'id' => $rr['id'], + 'term' => $rr['term'], + 'encodedterm' => urlencode($rr['term']), + 'delete' => t('Remove term'), + 'selected' => ($search==$rr['term']), + ); } - $tpl = get_markup_template("saved_searches_aside.tpl"); $o = replace_macros($tpl, array( '$title' => t('Saved Searches'), @@ -214,7 +198,6 @@ function saved_searches($search) { )); return $o; - } /** @@ -230,7 +213,7 @@ function saved_searches($search) { * '/network?f=&bmark=1', => $bookmarked_active = 'active' * '/network?f=&spam=1', => $spam_active = 'active' * - * @return Array ( $no_active, $comment_active, $postord_active, $conv_active, $new_active, $starred_active, $bookmarked_active, $spam_active ); + * @return Array ($no_active, $comment_active, $postord_active, $conv_active, $new_active, $starred_active, $bookmarked_active, $spam_active); */ function network_query_get_sel_tab(App $a) { $no_active=''; @@ -238,33 +221,28 @@ function network_query_get_sel_tab(App $a) { $new_active = ''; $bookmarked_active = ''; $all_active = ''; - $search_active = ''; $conv_active = ''; $spam_active = ''; $postord_active = ''; - if(($a->argc > 1 && $a->argv[1] === 'new') + if (($a->argc > 1 && $a->argv[1] === 'new') || ($a->argc > 2 && $a->argv[2] === 'new')) { $new_active = 'active'; } - if(x($_GET,'search')) { - $search_active = 'active'; - } - - if(x($_GET,'star')) { + if (x($_GET,'star')) { $starred_active = 'active'; } - if(x($_GET,'bmark')) { + if (x($_GET,'bmark')) { $bookmarked_active = 'active'; } - if(x($_GET,'conv')) { + if (x($_GET,'conv')) { $conv_active = 'active'; } - if(x($_GET,'spam')) { + if (x($_GET,'spam')) { $spam_active = 'active'; } @@ -274,7 +252,6 @@ function network_query_get_sel_tab(App $a) { && ($starred_active == '') && ($bookmarked_active == '') && ($conv_active == '') - && ($search_active == '') && ($spam_active == '')) { $no_active = 'active'; } @@ -296,7 +273,7 @@ function network_query_get_sel_tab(App $a) { function network_query_get_sel_net() { $network = false; - if(x($_GET,'nets')) { + if (x($_GET,'nets')) { $network = $_GET['nets']; } @@ -306,23 +283,193 @@ function network_query_get_sel_net() { function network_query_get_sel_group(App $a) { $group = false; - if($a->argc >= 2 && is_numeric($a->argv[1])) { + if ($a->argc >= 2 && is_numeric($a->argv[1])) { $group = $a->argv[1]; } return $group; } +function networkSetPager($a, $update) { + if ($update) { + // only setup pagination on initial page view + return ' LIMIT 100'; + + } + + // check if we serve a mobile device and get the user settings + // accordingly + if ($a->is_mobile) { + $itemspage_network = PConfig::get(local_user(),'system','itemspage_mobile_network'); + $itemspage_network = ((intval($itemspage_network)) ? $itemspage_network : 20); + } else { + $itemspage_network = PConfig::get(local_user(),'system','itemspage_network'); + $itemspage_network = ((intval($itemspage_network)) ? $itemspage_network : 40); + } + + // now that we have the user settings, see if the theme forces + // a maximum item number which is lower then the user choice + if (($a->force_max_items > 0) && ($a->force_max_items < $itemspage_network)) { + $itemspage_network = $a->force_max_items; + } + + $a->set_pager_itemspage($itemspage_network); + + return sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage'])); +} + +function networkSetSeen($condition) { + if (empty($condition)) { + return; + } + + $unseen = dba::exists('item', $condition); + + if ($unseen) { + $r = dba::update('item', array('unseen' => false), $condition); + } +} + +function networkConversation($a, $items, $mode, $update) { + // Set this so that the conversation function can find out contact info for our wall-wall items + $a->page_contact = $a->contact; + + $o .= conversation($a, $items, $mode, $update); + + if (!$update) { + if (PConfig::get(local_user(), 'system', 'infinite_scroll')) { + $o .= scroll_loader(); + } else { + $o .= alt_pager($a, count($items)); + } + } + + return $o; +} function network_content(App $a, $update = 0) { - - require_once('include/conversation.php'); - - if (! local_user()) { + if (!local_user()) { $_SESSION['return_url'] = $a->query_string; return login(false); } + /// @TODO Is this really necessary? $a is already available to hooks + $arr = array('query' => $a->query_string); + call_hooks('network_content_init', $arr); + + $nouveau = false; + + if ($a->argc > 1) { + for ($x = 1; $x < $a->argc; $x ++) { + if ($a->argv[$x] === 'new') { + $nouveau = true; + } + } + } + + if (x($_GET,'file')) { + $nouveau = true; + } + + if ($nouveau) { + $o = networkFlatView($a, $update); + } else { + $o = networkThreadedView($a, $update); + } + + return $o; +} + +/** + * @brief Get the network content in flat view + * + * @param App $a The global App + * @param integer $update Used for the automatic reloading + * @return string HTML of the network content in flat view + */ +function networkFlatView(App $a, $update = 0) { + + // Rawmode is used for fetching new content at the end of the page + $rawmode = (isset($_GET["mode"]) AND ($_GET["mode"] == "raw")); + + if (isset($_GET["last_id"])) { + $last_id = intval($_GET["last_id"]); + } else { + $last_id = 0; + } + + $o = ''; + + $file = ((x($_GET,'file')) ? $_GET['file'] : ''); + + PConfig::set(local_user(), 'network.view', 'net.selected', 'all'); + + if (!$update && !$rawmode) { + $tabs = network_tabs($a); + $o .= $tabs; + + nav_set_selected('network'); + + $x = array( + 'is_owner' => true, + 'allow_location' => $a->user['allow_location'], + 'default_location' => $a->user['default-location'], + 'nickname' => $a->user['nickname'], + 'lockstate'=> (((is_array($a->user) && + ((strlen($a->user['allow_cid'])) || (strlen($a->user['allow_gid'])) || + (strlen($a->user['deny_cid'])) || (strlen($a->user['deny_gid']))))) ? 'lock' : 'unlock'), + 'default_perms' => get_acl_permissions($a->user), + 'acl' => populate_acl($a->user, true), + 'bang' => '', + 'visitor' => 'block', + 'profile_uid' => local_user(), + 'acl_data' => construct_acl_data($a, $a->user), // For non-Javascript ACL selector + 'content' => '', + ); + + $o .= status_editor($a,$x); + + if (!Config::get('theme','hide_eventlist')) { + $o .= get_birthdays(); + $o .= get_events(); + } + } + + if (strlen($file)) { + $sql_post_table .= sprintf("INNER JOIN (SELECT `oid` FROM `term` WHERE `term` = '%s' AND `otype` = %d AND `type` = %d AND `uid` = %d ORDER BY `tid` DESC) AS `term` ON `item`.`id` = `term`.`oid` ", + dbesc(protect_sprintf($file)), intval(TERM_OBJ_POST), intval(TERM_FILE), intval(local_user())); + } else { + $sql_post_table = " INNER JOIN `thread` ON `thread`.`iid` = `item`.`parent`"; + } + + $pager_sql = networkSetPager($a, $update); + + // show all items unthreaded in reverse created date order + $items = q("SELECT %s FROM `item` $sql_post_table %s + WHERE %s AND `item`.`uid` = %d + ORDER BY `item`.`id` DESC $pager_sql ", + item_fieldlists(), item_joins(), item_condition(), + intval($_SESSION['uid']) + ); + + $condition = array('unseen' => true, 'uid' => local_user()); + networkSetSeen($condition); + + $mode = 'network-new'; + $o .= networkConversation($a, $items, $mode, $update); + + return $o; +} + +/** + * @brief Get the network content in threaded view + * + * @param App $a The global App + * @param integer $update Used for the automatic reloading + * @return string HTML of the network content in flat view + */ +function networkThreadedView(App $a, $update = 0) { + // Rawmode is used for fetching new content at the end of the page $rawmode = (isset($_GET["mode"]) AND ($_GET["mode"] == "raw")); @@ -338,31 +485,20 @@ function network_content(App $a, $update = 0) { $last_id = 0; } - /// @TODO Is this really necessary? $a is already available to hooks - $arr = array('query' => $a->query_string); - call_hooks('network_content_init', $arr); - - $datequery = $datequery2 = ''; $group = 0; - $nouveau = false; - - if($a->argc > 1) { - for($x = 1; $x < $a->argc; $x ++) { - if(is_a_date_arg($a->argv[$x])) { - if($datequery) + if ($a->argc > 1) { + for ($x = 1; $x < $a->argc; $x ++) { + if (is_a_date_arg($a->argv[$x])) { + if ($datequery) { $datequery2 = escape_tags($a->argv[$x]); - else { + } else { $datequery = escape_tags($a->argv[$x]); $_GET['order'] = 'post'; } - } - elseif($a->argv[$x] === 'new') { - $nouveau = true; - } - elseif(intval($a->argv[$x])) { + } elseif (intval($a->argv[$x])) { $group = intval($a->argv[$x]); $def_acl = array('allow_gid' => '<' . $group . '>'); } @@ -371,52 +507,36 @@ function network_content(App $a, $update = 0) { $o = ''; - - - $contact_id = $a->cid; - - require_once('include/acl_selectors.php'); - $cid = ((x($_GET,'cid')) ? intval($_GET['cid']) : 0); $star = ((x($_GET,'star')) ? intval($_GET['star']) : 0); $bmark = ((x($_GET,'bmark')) ? intval($_GET['bmark']) : 0); $order = ((x($_GET,'order')) ? notags($_GET['order']) : 'comment'); - $liked = ((x($_GET,'liked')) ? intval($_GET['liked']) : 0); $conv = ((x($_GET,'conv')) ? intval($_GET['conv']) : 0); - $spam = ((x($_GET,'spam')) ? intval($_GET['spam']) : 0); $nets = ((x($_GET,'nets')) ? $_GET['nets'] : ''); - $cmin = ((x($_GET,'cmin')) ? intval($_GET['cmin']) : 0); - $cmax = ((x($_GET,'cmax')) ? intval($_GET['cmax']) : 99); - $file = ((x($_GET,'file')) ? $_GET['file'] : ''); - - - if(x($_GET,'search') || x($_GET,'file')) - $nouveau = true; - if($cid) + if ($cid) { $def_acl = array('allow_cid' => '<' . intval($cid) . '>'); + } - if($nets) { - $r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND network = '%s' AND `self` = 0", - intval(local_user()), - dbesc($nets) - ); + if ($nets) { + $r = dba::select('contact', array('id'), array('uid' => local_user(), 'network' => $nets), array('self' => false)); $str = ''; - if (dbm::is_result($r)) - foreach($r as $rr) - $str .= '<' . $rr['id'] . '>'; - if(strlen($str)) + while ($rr = dba::fetch($r)) { + $str .= '<' . $rr['id'] . '>'; + } + if (strlen($str)) { $def_acl = array('allow_cid' => $str); + } } - set_pconfig(local_user(), 'network.view', 'net.selected', ($nets ? $nets : 'all')); + PConfig::set(local_user(), 'network.view', 'net.selected', ($nets ? $nets : 'all')); - if(!$update && !$rawmode) { + if (!$update && !$rawmode) { $tabs = network_tabs($a); $o .= $tabs; - if($group) { - if(($t = group_public_members($group)) && (! get_pconfig(local_user(),'system','nowarn_insecure'))) { + if ($group) { + if (($t = group_public_members($group)) && !PConfig::get(local_user(),'system','nowarn_insecure')) { notice(sprintf(tt("Warning: This group contains %s member from a network that doesn't allow non public messages.", "Warning: This group contains %s members from a network that doesn't allow non public messages.", $t), $t).EOL); @@ -430,12 +550,15 @@ function network_content(App $a, $update = 0) { if ($cid) { // If $cid belongs to a communitity forum or a privat goup,.add a mention to the status editor - $contact = q("SELECT `nick` FROM `contact` WHERE `id` = %d AND `uid` = %d AND (`forum` OR `prv`) ", - intval($cid), - intval(local_user()) - ); - if ($contact) - $content = "@".$contact[0]["nick"]."+".$cid; + $condition = array("`id` = ? AND (`forum` OR `prv`)", $cid); + $contact = dba::select('contact', array('addr', 'nick'), $condition, array('limit' => 1)); + if (dbm::is_result($contact)) { + if ($contact["addr"] != '') { + $content = "@".$contact["addr"]; + } else { + $content = "@".$contact["nick"]."+".$cid; + } + } } $x = array( @@ -472,7 +595,7 @@ function network_content(App $a, $update = 0) { $sql_table = "`thread`"; $sql_parent = "`iid`"; - if ($nouveau || strlen($file) || $update) { + if ($update) { $sql_table = "`item`"; $sql_parent = "`parent`"; $sql_post_table = " INNER JOIN `thread` ON `thread`.`iid` = `item`.`parent`"; @@ -480,34 +603,25 @@ function network_content(App $a, $update = 0) { $sql_nets = (($nets) ? sprintf(" and $sql_table.`network` = '%s' ", dbesc($nets)) : ''); - if($group) { - $r = q("SELECT `name`, `id` FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1", - intval($group), - intval($_SESSION['uid']) - ); - if (! dbm::is_result($r)) { - if($update) + if ($group) { + $r = dba::select('group', array('name'), array('id' => $group, 'uid' => $_SESSION['uid']), array('limit' => 1)); + if (!dbm::is_result($r)) { + if ($update) killme(); - notice( t('No such group') . EOL ); + notice(t('No such group') . EOL); goaway('network/0'); // NOTREACHED } $contacts = expand_groups(array($group)); - $gcontacts = expand_groups(array($group), false, true); - if((is_array($contacts)) && count($contacts)) { + if ((is_array($contacts)) && count($contacts)) { $contact_str_self = ""; - $gcontact_str_self = ""; $contact_str = implode(',',$contacts); - $gcontact_str = implode(',',$gcontacts); - $self = q("SELECT `contact`.`id`, `gcontact`.`id` AS `gid` FROM `contact` - INNER JOIN `gcontact` ON `gcontact`.`nurl` = `contact`.`nurl` - WHERE `uid` = %d AND `self`", intval($_SESSION['uid'])); - if (count($self)) { - $contact_str_self = $self[0]["id"]; - $gcontact_str_self = $self[0]["gid"]; + $self = dba::select('contact', array('id'), array('uid' => $_SESSION['uid'], 'self' => true), array('limit' => 1)); + if (dbm::is_result($self)) { + $contact_str_self = $self["id"]; } $sql_post_table .= " INNER JOIN `item` AS `temp1` ON `temp1`.`id` = ".$sql_table.".".$sql_parent; @@ -515,94 +629,63 @@ function network_content(App $a, $update = 0) { $sql_extra3 .= " OR (`thread`.`contact-id` = '$contact_str_self' AND `temp1`.`allow_gid` LIKE '".protect_sprintf('%<'.intval($group).'>%')."' AND `temp1`.`private`))"; } else { $sql_extra3 .= " AND false "; - info( t('Group is empty')); + info(t('Group is empty')); } $o = replace_macros(get_markup_template("section_title.tpl"),array( - '$title' => sprintf( t('Group: %s'), $r[0]['name']) + '$title' => sprintf(t('Group: %s'), $r['name']) )) . $o; - } - elseif($cid) { - - $r = q("SELECT `id`,`name`,`network`,`writable`,`nurl`, `forum`, `prv`, `contact-type`, `addr`, `thumb`, `location` FROM `contact` WHERE `id` = %d - AND (NOT `blocked` OR `pending`) LIMIT 1", - intval($cid) - ); + } elseif ($cid) { + $fields = array('id', 'name', 'network', 'writable', 'nurl', + 'forum', 'prv', 'contact-type', 'addr', 'thumb', 'location'); + $condition = array("`id` = ? AND (NOT `blocked` OR `pending`)", $cid); + $r = dba::select('contact', $fields, $condition, array('limit' => 1)); if (dbm::is_result($r)) { $sql_extra = " AND ".$sql_table.".`contact-id` = ".intval($cid); $entries[0] = array( 'id' => 'network', - 'name' => htmlentities($r[0]['name']), - 'itemurl' => (($r[0]['addr']) ? ($r[0]['addr']) : ($r[0]['nurl'])), - 'thumb' => proxy_url($r[0]['thumb'], false, PROXY_SIZE_THUMB), - 'details' => $r[0]['location'], + 'name' => htmlentities($r['name']), + 'itemurl' => (($r['addr']) ? ($r['addr']) : ($r['nurl'])), + 'thumb' => proxy_url($r['thumb'], false, PROXY_SIZE_THUMB), + 'details' => $r['location'], ); - $entries[0]["account_type"] = account_type($r[0]); + $entries[0]["account_type"] = account_type($r); $o = replace_macros(get_markup_template("viewcontact_template.tpl"),array( 'contacts' => $entries, 'id' => 'network', )) . $o; - if($r[0]['network'] === NETWORK_OSTATUS && $r[0]['writable'] && (! get_pconfig(local_user(),'system','nowarn_insecure'))) { - notice( t('Private messages to this person are at risk of public disclosure.') . EOL); + if ($r['network'] === NETWORK_OSTATUS && $r['writable'] && !PConfig::get(local_user(),'system','nowarn_insecure')) { + notice(t('Private messages to this person are at risk of public disclosure.') . EOL); } - } - else { - notice( t('Invalid contact.') . EOL); + } else { + notice(t('Invalid contact.') . EOL); goaway('network'); // NOTREACHED } } - if((! $group) && (! $cid) && (! $update) && (! get_config('theme','hide_eventlist'))) { + if (!$group && !$cid && !$update && !Config::get('theme','hide_eventlist')) { $o .= get_birthdays(); $o .= get_events(); } - if($datequery) { + if ($datequery) { $sql_extra3 .= protect_sprintf(sprintf(" AND $sql_table.created <= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery)))); } - if($datequery2) { + if ($datequery2) { $sql_extra3 .= protect_sprintf(sprintf(" AND $sql_table.created >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery2)))); } - //$sql_extra2 = (($nouveau) ? '' : " AND `item`.`parent` = `item`.`id` "); - $sql_extra2 = (($nouveau) ? '' : $sql_extra2); - $sql_extra3 = (($nouveau) ? '' : $sql_extra3); $sql_order = ""; $order_mode = "received"; - $tag = false; - if(x($_GET,'search')) { - $search = escape_tags($_GET['search']); - - if(strpos($search,'#') === 0) { - $tag = true; - $search = substr($search,1); - } - - if (get_config('system','only_tag_search')) - $tag = true; - - if($tag) { - $sql_extra = ""; - - $sql_post_table .= sprintf("INNER JOIN (SELECT `oid` FROM `term` WHERE `term` = '%s' AND `otype` = %d AND `type` = %d AND `uid` = %d ORDER BY `tid` DESC) AS `term` ON `item`.`id` = `term`.`oid` ", - dbesc(protect_sprintf($search)), intval(TERM_OBJ_POST), intval(TERM_HASHTAG), intval(local_user())); - $sql_order = "`item`.`id`"; - $order_mode = "id"; - } else { - $sql_extra = sprintf(" AND `item`.`body` REGEXP '%s' ", dbesc(protect_sprintf(preg_quote($search)))); - $sql_order = "`item`.`id`"; - $order_mode = "id"; - } - } - if(strlen($file)) { + if (strlen($file)) { $sql_post_table .= sprintf("INNER JOIN (SELECT `oid` FROM `term` WHERE `term` = '%s' AND `otype` = %d AND `type` = %d AND `uid` = %d ORDER BY `tid` DESC) AS `term` ON `item`.`id` = `term`.`oid` ", dbesc(protect_sprintf($file)), intval(TERM_OBJ_POST), intval(TERM_FILE), intval(local_user())); $sql_order = "`item`.`id`"; @@ -612,215 +695,154 @@ function network_content(App $a, $update = 0) { if ($conv) { $sql_extra3 .= " AND $sql_table.`mention`"; } - if ($update) { - // only setup pagination on initial page view - $pager_sql = ''; - } else { - // check if we serve a mobile device and get the user settings - // accordingly - if ($a->is_mobile) { - $itemspage_network = get_pconfig(local_user(),'system','itemspage_mobile_network'); - $itemspage_network = ((intval($itemspage_network)) ? $itemspage_network : 20); - } else { - $itemspage_network = get_pconfig(local_user(),'system','itemspage_network'); - $itemspage_network = ((intval($itemspage_network)) ? $itemspage_network : 40); + + $pager_sql = networkSetPager($a, $update); + + // Normal conversation view + if ($order === 'post') { + $ordering = "`created`"; + if ($sql_order == "") { + $order_mode = "created"; + } + } else { + $ordering = "`commented`"; + if ($sql_order == "") { + $order_mode = "commented"; } - - // now that we have the user settings, see if the theme forces - // a maximum item number which is lower then the user choice - if(($a->force_max_items > 0) && ($a->force_max_items < $itemspage_network)) - $itemspage_network = $a->force_max_items; - - $a->set_pager_itemspage($itemspage_network); - $pager_sql = sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage'])); } - if ($nouveau) { - $simple_update = (($update) ? " AND `item`.`unseen` " : ''); + if ($sql_order == "") { + $sql_order = "$sql_table.$ordering"; + } - if ($sql_order == "") - $sql_order = "`item`.`id`"; + if (($_GET["offset"] != "")) { + $sql_extra3 .= sprintf(" AND $sql_order <= '%s'", dbesc($_GET["offset"])); + } - // "New Item View" - show all items unthreaded in reverse created date order - $items = q("SELECT %s FROM $sql_table $sql_post_table %s - WHERE %s AND `item`.`uid` = %d - $simple_update - $sql_extra $sql_nets - ORDER BY $sql_order DESC $pager_sql ", - item_fieldlists(), item_joins(), item_condition(), - intval($_SESSION['uid']) - ); - - $update_unseen = ' WHERE uid = ' . intval($_SESSION['uid']) . " AND unseen = 1 $sql_extra $sql_nets"; - } else { - - // Normal conversation view - if($order === 'post') { - $ordering = "`created`"; - if ($sql_order == "") - $order_mode = "created"; - } else { - $ordering = "`commented`"; - if ($sql_order == "") - $order_mode = "commented"; - } - - if ($sql_order == "") - $sql_order = "$sql_table.$ordering"; - - if (($_GET["offset"] != "")) - $sql_extra3 .= sprintf(" AND $sql_order <= '%s'", dbesc($_GET["offset"])); - - switch ($order_mode) { - case 'received': - if ($last_received != '') { - $sql_extra3 .= sprintf(" AND $sql_table.`received` < '%s'", dbesc($last_received)); - $a->set_pager_page(1); - $pager_sql = sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage'])); - } - break; - case 'commented': - if ($last_commented != '') { - $sql_extra3 .= sprintf(" AND $sql_table.`commented` < '%s'", dbesc($last_commented)); - $a->set_pager_page(1); - $pager_sql = sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage'])); - } - break; - case 'created': - if ($last_created != '') { - $sql_extra3 .= sprintf(" AND $sql_table.`created` < '%s'", dbesc($last_created)); - $a->set_pager_page(1); - $pager_sql = sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage'])); - } - break; - case 'id': - if (($last_id > 0) && ($sql_table == "`thread`")) { - $sql_extra3 .= sprintf(" AND $sql_table.`iid` < '%s'", dbesc($last_id)); - $a->set_pager_page(1); - $pager_sql = sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage'])); - } - break; - } - - // Fetch a page full of parent items for this page - if ($update) { - if (get_config("system", "like_no_comment")) - $sql_extra4 = " AND `item`.`verb` = '".ACTIVITY_POST."'"; - else - $sql_extra4 = ""; - - $r = q("SELECT `item`.`parent` AS `item_id`, `item`.`network` AS `item_network`, `contact`.`uid` AS `contact_uid` - FROM $sql_table $sql_post_table INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id` - AND (NOT `contact`.`blocked` OR `contact`.`pending`) - WHERE `item`.`uid` = %d AND `item`.`visible` AND NOT `item`.`deleted` $sql_extra4 - AND NOT `item`.`moderated` AND `item`.`unseen` - $sql_extra3 $sql_extra $sql_nets - ORDER BY `item_id` DESC LIMIT 100", - intval(local_user()) - ); - } else { - $r = q("SELECT `thread`.`iid` AS `item_id`, `thread`.`network` AS `item_network`, `contact`.`uid` AS `contact_uid` - FROM $sql_table $sql_post_table STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id` - AND (NOT `contact`.`blocked` OR `contact`.`pending`) - WHERE `thread`.`uid` = %d AND `thread`.`visible` AND NOT `thread`.`deleted` - AND NOT `thread`.`moderated` - $sql_extra2 $sql_extra3 $sql_extra $sql_nets - ORDER BY $sql_order DESC $pager_sql ", - intval(local_user()) - ); - } - - // Then fetch all the children of the parents that are on this page - - $parents_arr = array(); - $parents_str = ''; - $date_offset = ""; - - if (dbm::is_result($r)) { - foreach($r as $rr) - if(! in_array($rr['item_id'],$parents_arr)) - $parents_arr[] = $rr['item_id']; - - $parents_str = implode(", ", $parents_arr); - - // splitted into separate queries to avoid the problem with very long threads - // so always the last X comments are loaded - // This problem can occur expecially with imported facebook posts - $max_comments = get_config("system", "max_comments"); - if ($max_comments == 0) - $max_comments = 100; - - $items = array(); - - foreach ($parents_arr AS $parents) { - $thread_items = dba::p(item_query()." AND `item`.`uid` = ? - AND `item`.`parent` = ? - ORDER BY `item`.`commented` DESC LIMIT ".intval($max_comments + 1), - local_user(), - $parents - ); - - if (dbm::is_result($thread_items)) - $items = array_merge($items, dba::inArray($thread_items)); + switch ($order_mode) { + case 'received': + if ($last_received != '') { + $sql_extra3 .= sprintf(" AND $sql_table.`received` < '%s'", dbesc($last_received)); + $a->set_pager_page(1); + $pager_sql = sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage'])); } - $items = conv_sort($items,$ordering); + break; + case 'commented': + if ($last_commented != '') { + $sql_extra3 .= sprintf(" AND $sql_table.`commented` < '%s'", dbesc($last_commented)); + $a->set_pager_page(1); + $pager_sql = sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage'])); + } + break; + case 'created': + if ($last_created != '') { + $sql_extra3 .= sprintf(" AND $sql_table.`created` < '%s'", dbesc($last_created)); + $a->set_pager_page(1); + $pager_sql = sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage'])); + } + break; + case 'id': + if (($last_id > 0) && ($sql_table == "`thread`")) { + $sql_extra3 .= sprintf(" AND $sql_table.`iid` < '%s'", dbesc($last_id)); + $a->set_pager_page(1); + $pager_sql = sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage'])); + } + break; + } + + // Fetch a page full of parent items for this page + if ($update) { + if (Config::get("system", "like_no_comment")) { + $sql_extra4 = " AND `item`.`verb` = '".ACTIVITY_POST."'"; } else { - $items = array(); + $sql_extra4 = ""; } - if ($_GET["offset"] == "") - $date_offset = $items[0][$order_mode]; - else - $date_offset = $_GET["offset"]; - - $a->page_offset = $date_offset; - - if($parents_str) - $update_unseen = ' WHERE uid = ' . intval(local_user()) . ' AND unseen = 1 AND parent IN ( ' . dbesc($parents_str) . ' )'; + $r = q("SELECT `item`.`parent` AS `item_id`, `item`.`network` AS `item_network`, `contact`.`uid` AS `contact_uid` + FROM $sql_table $sql_post_table INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id` + AND (NOT `contact`.`blocked` OR `contact`.`pending`) + WHERE `item`.`uid` = %d AND `item`.`visible` AND NOT `item`.`deleted` $sql_extra4 + AND NOT `item`.`moderated` AND `item`.`unseen` + $sql_extra3 $sql_extra $sql_nets + ORDER BY `item_id` DESC LIMIT 100", + intval(local_user()) + ); + } else { + $r = q("SELECT `thread`.`iid` AS `item_id`, `thread`.`network` AS `item_network`, `contact`.`uid` AS `contact_uid` + FROM $sql_table $sql_post_table STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id` + AND (NOT `contact`.`blocked` OR `contact`.`pending`) + WHERE `thread`.`uid` = %d AND `thread`.`visible` AND NOT `thread`.`deleted` + AND NOT `thread`.`moderated` + $sql_extra2 $sql_extra3 $sql_extra $sql_nets + ORDER BY $sql_order DESC $pager_sql", + intval(local_user()) + ); } + // Then fetch all the children of the parents that are on this page + + $parents_arr = array(); + $parents_str = ''; + $date_offset = ""; + + if (dbm::is_result($r)) { + foreach ($r as $rr) { + if (!in_array($rr['item_id'],$parents_arr)) { + $parents_arr[] = $rr['item_id']; + } + } + + $parents_str = implode(", ", $parents_arr); + + // splitted into separate queries to avoid the problem with very long threads + // so always the last X comments are loaded + // This problem can occur expecially with imported facebook posts + $max_comments = Config::get("system", "max_comments"); + if ($max_comments == 0) { + $max_comments = 100; + } + + $items = array(); + + foreach ($parents_arr AS $parents) { + $thread_items = dba::p(item_query()." AND `item`.`uid` = ? + AND `item`.`parent` = ? + ORDER BY `item`.`commented` DESC LIMIT ".intval($max_comments + 1), + local_user(), + $parents + ); + + if (dbm::is_result($thread_items)) { + $items = array_merge($items, dba::inArray($thread_items)); + } + } + $items = conv_sort($items,$ordering); + } else { + $items = array(); + } + + if ($_GET["offset"] == "") { + $date_offset = $items[0][$order_mode]; + } else { + $date_offset = $_GET["offset"]; + } + + $a->page_offset = $date_offset; + // We aren't going to try and figure out at the item, group, and page // level which items you've seen and which you haven't. If you're looking // at the top level network page just mark everything seen. - -// The $update_unseen is a bit unreliable if you have stuff coming into your stream from a new contact - -// and other feeds that bring in stuff from the past. One can't find it all. -// I'm reviving this block to mark everything seen on page 1 of the network as a temporary measure. -// The correct solution is to implement a network notifications box just like the system notifications popup -// with the ability in the popup to "mark all seen". -// Several people are complaining because there are unseen messages they can't find and as time goes -// on they just get buried deeper. It has happened to me a couple of times also. - - if (!$group && !$cid && !$star) { - $unseen = dba::exists('item', array('unseen' => true, 'uid' => local_user())); - - if ($unseen) { - $r = dba::update('item', array('unseen' => false), array('uid' => local_user(), 'unseen' => true)); - } - } elseif ($update_unseen) { - $unseen = q("SELECT `id` FROM `item` ".$update_unseen. " LIMIT 1"); - - if (dbm::is_result($unseen)) { - $r = q("UPDATE `item` SET `unseen` = 0 $update_unseen"); - } + $condition = array('unseen' => true, 'uid' => local_user()); + } elseif ($parents_str) { + $condition = array("`uid` = ? AND `unseen` AND `parent` IN (" . dbesc($parents_str) . ")", local_user()); } - // Set this so that the conversation function can find out contact info for our wall-wall items - $a->page_contact = $a->contact; + networkSetSeen($condition); - $mode = (($nouveau) ? 'network-new' : 'network'); - - $o .= conversation($a, $items, $mode, $update); - - if (!$update) { - if (get_pconfig(local_user(), 'system', 'infinite_scroll')) { - $o .= scroll_loader(); - } else { - $o .= alt_pager($a, count($items)); - } - } + $mode = 'network'; + $o .= networkConversation($a, $items, $mode, $update); return $o; } @@ -863,7 +885,7 @@ function network_tabs(App $a) { ), ); - if(feature_enabled(local_user(),'personal_tab')) { + if (feature_enabled(local_user(),'personal_tab')) { $tabs[] = array( 'label' => t('Personal'), 'url' => str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&conv=1', @@ -885,7 +907,7 @@ function network_tabs(App $a) { ); } - if(feature_enabled(local_user(),'link_tab')) { + if (feature_enabled(local_user(),'link_tab')) { $tabs[] = array( 'label' => t('Shared Links'), 'url' => str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&bmark=1', @@ -896,7 +918,7 @@ function network_tabs(App $a) { ); } - if(feature_enabled(local_user(),'star_posts')) { + if (feature_enabled(local_user(),'star_posts')) { $tabs[] = array( 'label' => t('Starred'), 'url' => str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&star=1', @@ -907,9 +929,9 @@ function network_tabs(App $a) { ); } - // save selected tab, but only if not in search or file mode - if(!x($_GET,'search') && !x($_GET,'file')) { - set_pconfig( local_user(), 'network.view','tab.selected',array($all_active, $postord_active, $conv_active, $new_active, $starred_active, $bookmarked_active, $spam_active) ); + // save selected tab, but only if not in file mode + if (!x($_GET,'file')) { + PConfig::set(local_user(), 'network.view','tab.selected',array($all_active, $postord_active, $conv_active, $new_active, $starred_active, $bookmarked_active, $spam_active)); } $arr = array('tabs' => $tabs); diff --git a/view/templates/saved_searches_aside.tpl b/view/templates/saved_searches_aside.tpl index e4aba94aa3..28a7ed58aa 100644 --- a/view/templates/saved_searches_aside.tpl +++ b/view/templates/saved_searches_aside.tpl @@ -7,7 +7,7 @@ {{foreach $saved as $search}} {{/foreach}} diff --git a/view/theme/frio/templates/saved_searches_aside.tpl b/view/theme/frio/templates/saved_searches_aside.tpl index da4cd1541a..fea9794ad5 100644 --- a/view/theme/frio/templates/saved_searches_aside.tpl +++ b/view/theme/frio/templates/saved_searches_aside.tpl @@ -7,7 +7,7 @@ {{foreach $saved as $search}} {{/foreach}} diff --git a/view/theme/quattro/templates/saved_searches_aside.tpl b/view/theme/quattro/templates/saved_searches_aside.tpl index 007d1d956e..c310d98ca7 100644 --- a/view/theme/quattro/templates/saved_searches_aside.tpl +++ b/view/theme/quattro/templates/saved_searches_aside.tpl @@ -4,7 +4,7 @@
    {{foreach $saved as $search}}
  • - {{$search.term}} + {{$search.term}}
  • {{/foreach}} From 92537d69269b464eae6f693d2dd288bc879709b0 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 13 Sep 2017 09:20:08 +0000 Subject: [PATCH 23/49] Rearranged code --- mod/network.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mod/network.php b/mod/network.php index 9d68b33146..e4a33fe1b5 100644 --- a/mod/network.php +++ b/mod/network.php @@ -290,7 +290,7 @@ function network_query_get_sel_group(App $a) { return $group; } -function networkSetPager($a, $update) { +function networkPager($a, $update) { if ($update) { // only setup pagination on initial page view return ' LIMIT 100'; @@ -442,7 +442,7 @@ function networkFlatView(App $a, $update = 0) { $sql_post_table = " INNER JOIN `thread` ON `thread`.`iid` = `item`.`parent`"; } - $pager_sql = networkSetPager($a, $update); + $pager_sql = networkPager($a, $update); // show all items unthreaded in reverse created date order $items = q("SELECT %s FROM `item` $sql_post_table %s @@ -696,8 +696,6 @@ function networkThreadedView(App $a, $update = 0) { $sql_extra3 .= " AND $sql_table.`mention`"; } - $pager_sql = networkSetPager($a, $update); - // Normal conversation view if ($order === 'post') { $ordering = "`created`"; @@ -719,6 +717,8 @@ function networkThreadedView(App $a, $update = 0) { $sql_extra3 .= sprintf(" AND $sql_order <= '%s'", dbesc($_GET["offset"])); } + $pager_sql = networkPager($a, $update); + switch ($order_mode) { case 'received': if ($last_received != '') { From e18a037fb254cdb462838463e020ae32a6110011 Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 14 Sep 2017 05:16:23 +0000 Subject: [PATCH 24/49] API: Improvements for clients with bad HTML support --- include/api.php | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/include/api.php b/include/api.php index e7c320e62d..3c84f46f76 100644 --- a/include/api.php +++ b/include/api.php @@ -2233,7 +2233,7 @@ $called_api = null; //don't send title to regular StatusNET requests to avoid confusing these apps if (x($_GET, 'getText')) { - $ret['title'] = $item['title'] ; + $ret['title'] = $item['title']; if ($_GET['getText'] == 'html') { $ret['text'] = bbcode($item['body'], false, false); } elseif ($_GET['getText'] == 'plain') { @@ -2280,14 +2280,31 @@ $called_api = null; "

    ", "

    ", "

    ", "

    ", "

    ", "

    ", "

    ", "

    ", "
    ", "
    ", "
    ", "
    "); - $replace = array("
    \n", "\n
    ", "
    \n", - "\n

    ", "

    \n", "\n

    ", "

    \n", - "\n

    ", "

    \n", "\n

    ", "

    \n", - "\n
    ", "
    \n", "\n
    ", "
    \n"); +// $replace = array(" \n
    ", " \n
    ", "
    \n ", +// " \n

    ", "

    \n ", " \n

    ", "

    \n ", +// " \n

    ", "

    \n ", " \n

    ", "

    \n ", +// " \n
    ", "
    \n ", " \n
    ", "
    \n "); + $replace = array("
    ", "
    ", "

    ", + "

    ", "


    ", "

    ", "


    ", + "

    ", "


    ", "

    ", "


    ", + "
    ", "

    ", "
    ", "

    "); $statushtml = str_replace($search, $replace, $statushtml); if ($item['title'] != "") { - $statushtml = "

    " . bbcode($item['title']) . "

    \n" . $statushtml; + $statushtml = "

    " . bbcode($item['title']) . "


    " . $statushtml; + } + + do { + $oldtext = $statushtml; + $statushtml = str_replace("

    ", "
    ", $statushtml); + } while ($oldtext != $statushtml); + + if (substr($statushtml, 0, 4) == '
    ') { + $statushtml = substr($statushtml, 4); + } + + if (substr($statushtml, 0, -4) == '
    ') { + $statushtml = substr($statushtml, -4); } // feeds without body should contain the link From c6ceae52250877c966a3ede6c6e9d2c49bb8ca8a Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 14 Sep 2017 05:19:05 +0000 Subject: [PATCH 25/49] The old database function is now replaced with a wrapper --- include/dba.php | 233 ++++++++++------------------------------ include/dbstructure.php | 18 ++-- mod/directory.php | 6 +- 3 files changed, 66 insertions(+), 191 deletions(-) diff --git a/include/dba.php b/include/dba.php index c945228297..53ee3e9655 100644 --- a/include/dba.php +++ b/include/dba.php @@ -214,171 +214,22 @@ class dba { } } - public function q($sql, $onlyquery = false) { - $a = get_app(); + public function q($sql) { + $ret = self::p($sql); - if (!$this->db || !$this->connected) { - return false; + if (is_bool($ret)) { + return $ret; } - $this->error = ''; + $columns = self::columnCount($ret); - $connstr = ($this->connected() ? "Connected" : "Disonnected"); + $data = self::inArray($ret); - $stamp1 = microtime(true); - - $orig_sql = $sql; - - if (x($a->config,'system') && x($a->config['system'], 'db_callstack')) { - $sql = "/*".System::callstack()." */ ".$sql; - } - - $columns = 0; - - switch ($this->driver) { - case 'pdo': - $result = @$this->db->query($sql); - // Is used to separate between queries that returning data - or not - if (!is_bool($result)) { - $columns = $result->columnCount(); - } - break; - case 'mysqli': - $result = @$this->db->query($sql); - break; - case 'mysql': - $result = @mysql_query($sql,$this->db); - break; - } - $stamp2 = microtime(true); - $duration = (float)($stamp2 - $stamp1); - - $a->save_timestamp($stamp1, "database"); - - if (strtolower(substr($orig_sql, 0, 6)) != "select") { - $a->save_timestamp($stamp1, "database_write"); - } - if (x($a->config,'system') && x($a->config['system'],'db_log')) { - if (($duration > $a->config["system"]["db_loglimit"])) { - $duration = round($duration, 3); - $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - @file_put_contents($a->config["system"]["db_log"], datetime_convert()."\t".$duration."\t". - basename($backtrace[1]["file"])."\t". - $backtrace[1]["line"]."\t".$backtrace[2]["function"]."\t". - substr($sql, 0, 2000)."\n", FILE_APPEND); - } - } - - switch ($this->driver) { - case 'pdo': - $errorInfo = $this->db->errorInfo(); - if ($errorInfo) { - $this->error = $errorInfo[2]; - $this->errorno = $errorInfo[1]; - } - break; - case 'mysqli': - if ($this->db->errno) { - $this->error = $this->db->error; - $this->errorno = $this->db->errno; - } - break; - case 'mysql': - if (mysql_errno($this->db)) { - $this->error = mysql_error($this->db); - $this->errorno = mysql_errno($this->db); - } - break; - } - if (strlen($this->error)) { - logger('DB Error ('.$connstr.') '.$this->errorno.': '.$this->error); - } - - if ($this->debug) { - - $mesg = ''; - - if ($result === false) { - $mesg = 'false'; - } elseif ($result === true) { - $mesg = 'true'; - } else { - switch ($this->driver) { - case 'pdo': - $mesg = $result->rowCount().' results'.EOL; - break; - case 'mysqli': - $mesg = $result->num_rows.' results'.EOL; - break; - case 'mysql': - $mesg = mysql_num_rows($result).' results'.EOL; - break; - } - } - - $str = 'SQL = ' . printable($sql) . EOL . 'SQL returned ' . $mesg - . (($this->error) ? ' error: ' . $this->error : '') - . EOL; - - logger('dba: ' . $str ); - } - - /** - * If dbfail.out exists, we will write any failed calls directly to it, - * regardless of any logging that may or may nor be in effect. - * These usually indicate SQL syntax errors that need to be resolved. - */ - - if ($result === false) { - logger('dba: ' . printable($sql) . ' returned false.' . "\n" . $this->error); - if (file_exists('dbfail.out')) { - file_put_contents('dbfail.out', datetime_convert() . "\n" . printable($sql) . ' returned false' . "\n" . $this->error . "\n", FILE_APPEND); - } - } - - if (is_bool($result)) { - return $result; - } - if ($onlyquery) { - $this->result = $result; + if ((count($data) == 0) && ($columns == 0)) { return true; } - $r = array(); - switch ($this->driver) { - case 'pdo': - while ($x = $result->fetch(PDO::FETCH_ASSOC)) { - $r[] = $x; - } - $result->closeCursor(); - break; - case 'mysqli': - while ($x = $result->fetch_array(MYSQLI_ASSOC)) { - $r[] = $x; - } - $result->free_result(); - break; - case 'mysql': - while ($x = mysql_fetch_array($result, MYSQL_ASSOC)) { - $r[] = $x; - } - mysql_free_result($result); - break; - } - - // PDO doesn't return "true" on successful operations - like mysqli does - // Emulate this behaviour by checking if the query returned data and had columns - // This should be reliable enough - if (($this->driver == 'pdo') && (count($r) == 0) && ($columns == 0)) { - return true; - } - - //$a->save_timestamp($stamp1, "database"); - - if ($this->debug) { - logger('dba: ' . printable(print_r($r, true))); - } - return($r); + return $data; } public function dbg($dbg) { @@ -820,6 +671,26 @@ class dba { return self::$dbo->affected_rows; } + /** + * @brief Returns the number of columns of a statement + * + * @param object Statement object + * @return int Number of columns + */ + public static function columnCount($stmt) { + if (!is_object($stmt)) { + return 0; + } + switch (self::$dbo->driver) { + case 'pdo': + return $stmt->columnCount(); + case 'mysqli': + return $stmt->field_count; + case 'mysql': + return mysql_affected_rows($stmt); + } + return 0; + } /** * @brief Returns the number of rows of a statement * @@ -1415,38 +1286,44 @@ function dbesc($str) { // 'user', 1); function q($sql) { global $db; + $args = func_get_args(); unset($args[0]); - if ($db && $db->connected) { - $sql = $db->clean_query($sql); - $sql = $db->any_value_fallback($sql); - $stmt = @vsprintf($sql,$args); // Disabled warnings - //logger("dba: q: $stmt", LOGGER_ALL); - if ($stmt === false) - logger('dba: vsprintf error: ' . print_r(debug_backtrace(),true), LOGGER_DEBUG); - - $db->log_index($stmt); - - return $db->q($stmt); + if (!$db || !$db->connected) { + return false; } - /** - * - * This will happen occasionally trying to store the - * session data after abnormal program termination - * - */ - logger('dba: no database: ' . print_r($args,true)); - return false; + $sql = $db->clean_query($sql); + $sql = $db->any_value_fallback($sql); + + $stmt = @vsprintf($sql, $args); + + $ret = dba::p($stmt); + + if (is_bool($ret)) { + return $ret; + } + + $columns = dba::columnCount($ret); + + $data = dba::inArray($ret); + + if ((count($data) == 0) && ($columns == 0)) { + return true; + } + + return $data; } /** - * @brief Performs a query with "dirty reads" + * @brief Performs a query with "dirty reads" - deprecated * * By doing dirty reads (reading uncommitted data) no locks are performed * This function can be used to fetch data that doesn't need to be reliable. * + * Hadn't worked like expected and does now the same like the other function. + * * @param $args Query parameters (1 to N parameters of different types) * @return array Query array */ @@ -1465,9 +1342,7 @@ function qu($sql) { $db->log_index($stmt); - $db->q("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;"); $retval = $db->q($stmt); - $db->q("SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;"); return $retval; } diff --git a/include/dbstructure.php b/include/dbstructure.php index d87f3948d2..4d615a2f14 100644 --- a/include/dbstructure.php +++ b/include/dbstructure.php @@ -31,7 +31,7 @@ function convert_to_innodb() { $sql = sprintf("ALTER TABLE `%s` engine=InnoDB;", dbesc($table['TABLE_NAME'])); echo $sql."\n"; - $result = $db->q($sql); + $result = dba::e($sql); if (!dbm::is_result($result)) { print_update_error($db, $sql); } @@ -442,9 +442,9 @@ function update_structure($verbose, $action, $tables=null, $definition=null) { // Ensure index conversion to unique removes duplicates if ($is_unique) { if ($ignore != "") { - $db->q("SET session old_alter_table=1;"); + dba::e("SET session old_alter_table=1;"); } else { - $r = $db->q("CREATE TABLE `".$temp_name."` LIKE `".$name."`;"); + $r = dba::e("CREATE TABLE `".$temp_name."` LIKE `".$name."`;"); if (!dbm::is_result($r)) { $errors .= print_update_error($db, $sql3); return $errors; @@ -452,25 +452,25 @@ function update_structure($verbose, $action, $tables=null, $definition=null) { } } - $r = @$db->q($sql3); + $r = @dba::e($sql3); if (!dbm::is_result($r)) { $errors .= print_update_error($db, $sql3); } if ($is_unique) { if ($ignore != "") { - $db->q("SET session old_alter_table=0;"); + dba::e("SET session old_alter_table=0;"); } else { - $r = $db->q("INSERT INTO `".$temp_name."` SELECT ".$field_list." FROM `".$name."`".$group_by.";"); + $r = dba::e("INSERT INTO `".$temp_name."` SELECT ".$field_list." FROM `".$name."`".$group_by.";"); if (!dbm::is_result($r)) { $errors .= print_update_error($db, $sql3); return $errors; } - $r = $db->q("DROP TABLE `".$name."`;"); + $r = dba::e("DROP TABLE `".$name."`;"); if (!dbm::is_result($r)) { $errors .= print_update_error($db, $sql3); return $errors; } - $r = $db->q("RENAME TABLE `".$temp_name."` TO `".$name."`;"); + $r = dba::e("RENAME TABLE `".$temp_name."` TO `".$name."`;"); if (!dbm::is_result($r)) { $errors .= print_update_error($db, $sql3); return $errors; @@ -551,7 +551,7 @@ function db_create_table($name, $fields, $verbose, $action, $indexes=null) { echo $sql.";\n"; if ($action) - $r = @$db->q($sql); + $r = @dba::e($sql); return $r; } diff --git a/mod/directory.php b/mod/directory.php index cb0b1f4cd1..9e004ab5d8 100644 --- a/mod/directory.php +++ b/mod/directory.php @@ -71,7 +71,7 @@ function directory_content(App $a) { $publish = ((get_config('system','publish_all')) ? '' : " AND `publish` = 1 " ); - $r = $db->q("SELECT COUNT(*) AS `total` FROM `profile` + $r = q("SELECT COUNT(*) AS `total` FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra "); if (dbm::is_result($r)) @@ -81,11 +81,11 @@ function directory_content(App $a) { $limit = intval($a->pager['start']).",".intval($a->pager['itemspage']); - $r = $db->q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`, `user`.`timezone` , `user`.`page-flags`, + $r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`, `user`.`timezone` , `user`.`page-flags`, `contact`.`addr`, `contact`.`url` AS profile_url FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` LEFT JOIN `contact` ON `contact`.`uid` = `user`.`uid` - WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 AND `contact`.`self` $sql_extra $order LIMIT ".$limit); + WHERE `is-default` $publish AND `user`.`blocked` = 0 AND `contact`.`self` $sql_extra $order LIMIT ".$limit); if (dbm::is_result($r)) { if (in_array('small', $a->argv)) { From 7a3bb02f1189aafa5a6d95331e52ec438c86b03f Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 14 Sep 2017 05:40:23 +0000 Subject: [PATCH 26/49] Issue 3700: Security and Privacy related Headers --- doc/htconfig.md | 1 + include/session.php | 6 ++++++ index.php | 13 +++++++++++++ 3 files changed, 20 insertions(+) diff --git a/doc/htconfig.md b/doc/htconfig.md index aeb0c92022..dd7ab8047c 100644 --- a/doc/htconfig.md +++ b/doc/htconfig.md @@ -44,6 +44,7 @@ Example: To set the directory value please add this line to your .htconfig.php: * **dlogfile - location of the developer log file * **event_input_format** - Default value is "ymd". * **frontend_worker_timeout** - Value in minutes after we think that a frontend task was killed by the webserver. Default value is 10. +* **hsts** (Boolean) - Enables the sending of HTTP Strict Transport Security headers * **ignore_cache** (Boolean) - For development only. Disables the item cache. * **like_no_comment** (Boolean) - Don't update the "commented" value of an item when it is liked. * **local_block** (Boolean) - Used in conjunction with "block_public". diff --git a/include/session.php b/include/session.php index 5194e7ef0e..af871b28a1 100644 --- a/include/session.php +++ b/include/session.php @@ -2,6 +2,8 @@ // Session management functions. These provide database storage of PHP // session info. +use Friendica\Core\Config; + require_once('include/cache.php'); $session_exists = 0; @@ -114,6 +116,10 @@ ini_set('session.gc_probability', $gc_probability); ini_set('session.use_only_cookies', 1); ini_set('session.cookie_httponly', 1); +if (Config::get('system', 'ssl_policy') == SSL_POLICY_FULL) { + ini_set('session.cookie_secure', 1); +} + if (!get_config('system', 'disable_database_session')) { session_set_save_handler('ref_session_open', 'ref_session_close', 'ref_session_read', 'ref_session_write', diff --git a/index.php b/index.php index 5b4cea756b..d3d2e42ae6 100644 --- a/index.php +++ b/index.php @@ -489,6 +489,19 @@ $profile = $a->profile; header("X-Friendica-Version: " . FRIENDICA_VERSION); header("Content-type: text/html; charset=utf-8"); +if (Config::get('system', 'hsts') && (Config::get('system', 'ssl_policy') == SSL_POLICY_FULL)) { + header("Strict-Transport-Security: max-age=31536000"); +} + +// Some security stuff +header('X-Content-Type-Options: nosniff'); +header('X-XSS-Protection: 1; mode=block'); +header('X-Permitted-Cross-Domain-Policies: none'); +header('X-Frame-Options: sameorigin'); + +// Things like embedded OSM maps don't work, when this is enabled +// header("Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; connect-src 'self'; style-src 'self' 'unsafe-inline'; font-src 'self'; img-src 'self' https: data:; media-src 'self' https:; child-src 'self' https:; object-src 'none'"); + /* * We use $_GET["mode"] for special page templates. So we will check if we have * to load another page template than the default one. From 4b99d122dd7734c8f1c6aad3b6ab4316f3c5738d Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 14 Sep 2017 05:48:43 +0000 Subject: [PATCH 27/49] Added explanation --- include/api.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/include/api.php b/include/api.php index 3c84f46f76..45c9ed2554 100644 --- a/include/api.php +++ b/include/api.php @@ -2276,14 +2276,11 @@ $called_api = null; $statushtml = trim(bbcode($body, false, false)); + // Workaround for clients with limited HTML parser functionality $search = array("
    ", "
    ", "
    ", "

    ", "

    ", "

    ", "

    ", "

    ", "

    ", "

    ", "

    ", "
    ", "
    ", "
    ", "
    "); -// $replace = array(" \n
    ", " \n
    ", "
    \n ", -// " \n

    ", "

    \n ", " \n

    ", "

    \n ", -// " \n

    ", "

    \n ", " \n

    ", "

    \n ", -// " \n
    ", "
    \n ", " \n
    ", "
    \n "); $replace = array("
    ", "
    ", "

    ", "

    ", "


    ", "

    ", "


    ", "

    ", "


    ", "

    ", "


    ", From c3589dc043a74d4e88bad0b07ef082662ed1ffaf Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 14 Sep 2017 06:10:33 +0000 Subject: [PATCH 28/49] Added documentation --- mod/network.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/mod/network.php b/mod/network.php index e4a33fe1b5..a78500174e 100644 --- a/mod/network.php +++ b/mod/network.php @@ -290,6 +290,13 @@ function network_query_get_sel_group(App $a) { return $group; } +/** + * @brief Sets the pager data and returns SQL + * + * @param App $a The global App + * @param integer $update Used for the automatic reloading + * @return string SQL with the appropriate LIMIT clause + */ function networkPager($a, $update) { if ($update) { // only setup pagination on initial page view @@ -318,6 +325,11 @@ function networkPager($a, $update) { return sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage'])); } +/** + * @brief Sets items as seen + * + * @param array $condition The array with the SQL condition + */ function networkSetSeen($condition) { if (empty($condition)) { return; @@ -330,6 +342,15 @@ function networkSetSeen($condition) { } } +/** + * @brief Create the conversation HTML + * + * @param App $a The global App + * @param array $items Items of the conversation + * @param string $mode Display mode for the conversation + * @param integer $update Used for the automatic reloading + * @return string HTML of the conversation + */ function networkConversation($a, $items, $mode, $update) { // Set this so that the conversation function can find out contact info for our wall-wall items $a->page_contact = $a->contact; From 9468b7427d82d4ee5da7fc8f36d37f49c37c2bc0 Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 14 Sep 2017 10:00:45 +0000 Subject: [PATCH 29/49] Allow replies as well --- include/ostatus.php | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/include/ostatus.php b/include/ostatus.php index 0c99905fa4..099c0516e8 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -418,27 +418,26 @@ class ostatus { self::processPost($xpath, $entry, $item, $importer); if ($initialize && (count(self::$itemlist) > 0)) { - // We will import it everytime, when it is started by our contacts - $valid = !empty(self::$itemlist[0]['contact-id']); - if (!$valid) { - // If not, then it depends on this setting - $valid = !Config::get('system','ostatus_full_threads'); - } - - if ($valid) { - // But we will only import complete threads - $valid = self::$itemlist[0]['uri'] == self::$itemlist[0]['parent-uri']; - } - - if ($valid) { - // Never post a thread when the only interaction by our contact was a like - $valid = false; - $verbs = array(ACTIVITY_POST, ACTIVITY_SHARE); - foreach (self::$itemlist AS $item) { - if (!empty($item['contact-id']) && in_array($item['verb'], $verbs)) { - $valid = true; + if (self::$itemlist[0]['uri'] == self::$itemlist[0]['parent-uri']) { + // We will import it everytime, when it is started by our contacts + $valid = !empty(self::$itemlist[0]['contact-id']); + if (!$valid) { + // If not, then it depends on this setting + $valid = !Config::get('system','ostatus_full_threads'); + } + if ($valid) { + // Never post a thread when the only interaction by our contact was a like + $valid = false; + $verbs = array(ACTIVITY_POST, ACTIVITY_SHARE); + foreach (self::$itemlist AS $item) { + if (!empty($item['contact-id']) && in_array($item['verb'], $verbs)) { + $valid = true; + } } } + } else { + // But we will only import complete threads + $valid = dba::exists('item', array('uid' => $importer["uid"], 'uri' => self::$itemlist[0]['parent-uri'])); } if ($valid) { From 9dfb9c1c456458b6db3bcf471a4f7dda1dca9bfa Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 14 Sep 2017 19:23:14 +0000 Subject: [PATCH 30/49] Only fetch items that don't exist in the system --- include/ostatus.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/include/ostatus.php b/include/ostatus.php index 099c0516e8..7169359553 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -476,6 +476,12 @@ class ostatus { */ private static function processPost($xpath, $entry, &$item, $importer) { $item["uri"] = $xpath->query('atom:id/text()', $entry)->item(0)->nodeValue; + + if (dba::exists('item', array('uid' => $importer["uid"], 'uri' => $item["uri"]))) { + logger('Post with URI '.$item["uri"].' already existed for user '.$importer["uid"].'.'); + return; + } + $item["body"] = html2bbcode($xpath->query('atom:content/text()', $entry)->item(0)->nodeValue); $item["object-type"] = $xpath->query('activity:object-type/text()', $entry)->item(0)->nodeValue; if (($item["object-type"] == ACTIVITY_OBJ_BOOKMARK) || ($item["object-type"] == ACTIVITY_OBJ_EVENT)) { @@ -590,7 +596,12 @@ class ostatus { } if (isset($item["parent-uri"]) && ($related != '')) { - self::fetchRelated($related, $item["parent-uri"], $importer); + if (!dba::exists('item', array('uid' => $importer["uid"], 'uri' => $item['parent-uri']))) { + self::fetchRelated($related, $item["parent-uri"], $importer); + } else { + logger('Reply with URI '.$item["uri"].' already existed for user '.$importer["uid"].'.'); + } + $item["type"] = 'remote-comment'; $item["gravity"] = GRAVITY_COMMENT; } else { From 87fffde80ec986d135c28816ad59f3afb102b085 Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 14 Sep 2017 20:40:05 +0000 Subject: [PATCH 31/49] Documented some unknown verbs --- include/ostatus.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/ostatus.php b/include/ostatus.php index 7169359553..45ac8061c9 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -373,7 +373,7 @@ class ostatus { $item["verb"] = $xpath->query('activity:verb/text()', $entry)->item(0)->nodeValue; /// Delete a message - if ($item["verb"] == "qvitter-delete-notice" || $item["verb"] == ACTIVITY_DELETE) { + if (in_array($item["verb"], array('qvitter-delete-notice', ACTIVITY_DELETE, 'delete'))) { // ignore "Delete" messages (by now) logger("Ignore delete message ".print_r($item, true)); continue; @@ -411,6 +411,8 @@ class ostatus { } // http://activitystrea.ms/schema/1.0/rsvp-yes + // http://activitystrea.ms/schema/1.0/unfavorite + // http://mastodon.social/schema/1.0/block if (!in_array($item["verb"], array(ACTIVITY_POST, ACTIVITY_LIKE, ACTIVITY_SHARE))) { logger("Unhandled verb ".$item["verb"]." ".print_r($item, true)); } From d10eaefaa967c3f024acb4b66f40e6bce86700d7 Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 14 Sep 2017 22:04:37 +0000 Subject: [PATCH 32/49] Improved regular expression for the Diaspora link detection --- include/bbcode.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/bbcode.php b/include/bbcode.php index be4667a298..a14e3ee8e9 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -987,7 +987,8 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa // Server independent link to posts and comments // See issue: https://github.com/diaspora/diaspora_federation/issues/75 - $Text = preg_replace("=diaspora://(.*?)/([^\s\]]*)=ism", System::baseUrl()."/display/$2", $Text); + $expression = "=diaspora://.*?/post/([0-9A-Za-z\-_@.:]{15,254}[0-9A-Za-z])=ism"; + $Text = preg_replace($expression, System::baseUrl()."/display/$1", $Text); // if the HTML is used to generate plain text, then don't do this search, but replace all URL of that kind to text // if ($simplehtml != 7) { From f29e21eb5c8d35a30bd470d739ef1049ce5f3e5d Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 15 Sep 2017 03:00:38 +0000 Subject: [PATCH 33/49] We now avoid prepared statements without an argument --- include/dba.php | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/include/dba.php b/include/dba.php index 53ee3e9655..48f1955428 100644 --- a/include/dba.php +++ b/include/dba.php @@ -423,6 +423,19 @@ class dba { switch (self::$dbo->driver) { case 'pdo': + // If there are no arguments we use "query" + if (count($args) == 0) { + if (!$retval = self::$dbo->db->query($sql)) { + $errorInfo = self::$dbo->db->errorInfo(); + self::$dbo->error = $errorInfo[2]; + self::$dbo->errorno = $errorInfo[1]; + $retval = false; + break; + } + self::$dbo->affected_rows = $retval->rowCount(); + break; + } + if (!$stmt = self::$dbo->db->prepare($sql)) { $errorInfo = self::$dbo->db->errorInfo(); self::$dbo->error = $errorInfo[2]; @@ -451,8 +464,8 @@ class dba { $command = strtolower($parts[0]); $can_be_prepared = in_array($command, array('select', 'update', 'insert', 'delete')); - // The fallback routine currently only works with statements that doesn't return values - if (!$can_be_prepared && $called_from_e) { + // The fallback routine is called as well when there are no arguments + if (!$can_be_prepared || (count($args) == 0)) { $retval = self::$dbo->db->query(self::replace_parameters($sql, $args)); if (self::$dbo->db->errno) { self::$dbo->error = self::$dbo->db->error; @@ -727,6 +740,10 @@ class dba { case 'pdo': return $stmt->fetch(PDO::FETCH_ASSOC); case 'mysqli': + if (get_class($stmt) == 'mysqli_result') { + return $stmt->fetch_assoc(); + } + // This code works, but is slow // Bind the result to a result array @@ -890,13 +907,13 @@ class dba { $definition = db_definition(); foreach ($definition AS $table => $structure) { - foreach ($structure['fields'] AS $field => $field_struct) { - if (isset($field_struct['relation'])) { - foreach ($field_struct['relation'] AS $rel_table => $rel_field) { - self::$relation[$rel_table][$rel_field][$table][] = $field; - } - } - } + foreach ($structure['fields'] AS $field => $field_struct) { + if (isset($field_struct['relation'])) { + foreach ($field_struct['relation'] AS $rel_table => $rel_field) { + self::$relation[$rel_table][$rel_field][$table][] = $field; + } + } + } } } From cd16155c96f7ea4ead1a0ec87198913d3414dc84 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 15 Sep 2017 03:10:04 +0000 Subject: [PATCH 34/49] Only warn when there are arguments at all --- include/dba.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/dba.php b/include/dba.php index 48f1955428..16261efd2e 100644 --- a/include/dba.php +++ b/include/dba.php @@ -391,7 +391,7 @@ class dba { return false; } - if (substr_count($sql, '?') != count($args)) { + if ((substr_count($sql, '?') != count($args)) && (count($args) > 0)) { // Question: Should we continue or stop the query here? logger('Parameter mismatch. Query "'.$sql.'" - Parameters '.print_r($args, true), LOGGER_DEBUG); } From 88ada982452ece7d355b207dd64056761e2df223 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 15 Sep 2017 06:07:34 +0000 Subject: [PATCH 35/49] Added documentation --- include/dba.php | 43 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/include/dba.php b/include/dba.php index 16261efd2e..d6a1727d6b 100644 --- a/include/dba.php +++ b/include/dba.php @@ -214,6 +214,16 @@ class dba { } } + /** + * @brief execute SQL query - deprecated + * + * Please use the dba:: functions instead: + * dba::select, dba::exists, dba::insert + * dba::delete, dba::update, dba::p, dba::e + * + * @param string $sql SQL query + * @return array Query array + */ public function q($sql) { $ret = self::p($sql); @@ -366,6 +376,10 @@ class dba { /** * @brief Executes a prepared statement that returns data * @usage Example: $r = p("SELECT * FROM `item` WHERE `guid` = ?", $guid); + * + * Please only use it with complicated queries. + * For all regular queries please use dba::select or dba::exists + * * @param string $sql SQL statement * @return object statement object */ @@ -574,6 +588,8 @@ class dba { /** * @brief Executes a prepared statement like UPDATE or INSERT that doesn't return data * + * Please use dba::delete, dba::insert, dba::update, ... instead + * * @param string $sql SQL statement * @return boolean Was the query successfull? False is returned only if an error occurred */ @@ -656,6 +672,8 @@ class dba { /** * @brief Fetches the first row * + * Please use dba::select or dba::select whenever this is possible. + * * @param string $sql SQL statement * @return array first row of query */ @@ -1159,7 +1177,11 @@ class dba { * Example: * $table = "item"; * $fields = array("id", "uri", "uid", "network"); + * * $condition = array("uid" => 1, "network" => 'dspr'); + * or: + * $condition = array("`uid` = ? AND `network` IN (?, ?)", 1, 'dfrn', 'dspr'); + * * $params = array("order" => array("id", "received" => true), "limit" => 1); * * $data = dba::select($table, $fields, $condition, $params); @@ -1297,10 +1319,16 @@ function dbesc($str) { } } -// Function: q($sql,$args); -// Description: execute SQL query with printf style args. -// Example: $r = q("SELECT * FROM `%s` WHERE `uid` = %d", -// 'user', 1); +/** + * @brief execute SQL query with printf style args - deprecated + * + * Please use the dba:: functions instead: + * dba::select, dba::exists, dba::insert + * dba::delete, dba::update, dba::p, dba::e + * + * @param $args Query parameters (1 to N parameters of different types) + * @return array Query array + */ function q($sql) { global $db; @@ -1336,10 +1364,9 @@ function q($sql) { /** * @brief Performs a query with "dirty reads" - deprecated * - * By doing dirty reads (reading uncommitted data) no locks are performed - * This function can be used to fetch data that doesn't need to be reliable. - * - * Hadn't worked like expected and does now the same like the other function. + * Please use the dba:: functions instead: + * dba::select, dba::exists, dba::insert + * dba::delete, dba::update, dba::p, dba::e * * @param $args Query parameters (1 to N parameters of different types) * @return array Query array From f8d34e35e7b720dae2bd7acf9b1d9499564c8814 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 15 Sep 2017 06:15:25 +0000 Subject: [PATCH 36/49] "exists", "select" whre is the difference? --- include/dba.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/dba.php b/include/dba.php index d6a1727d6b..9bf7a67d46 100644 --- a/include/dba.php +++ b/include/dba.php @@ -672,7 +672,7 @@ class dba { /** * @brief Fetches the first row * - * Please use dba::select or dba::select whenever this is possible. + * Please use dba::select or dba::exists whenever this is possible. * * @param string $sql SQL statement * @return array first row of query From 30bc6ab08805c692fa805f70b692e304f71a75b8 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 15 Sep 2017 10:08:26 +0200 Subject: [PATCH 37/49] regenerated master messages.po file --- util/messages.po | 11087 +++++++++++++++++++++++---------------------- 1 file changed, 5555 insertions(+), 5532 deletions(-) diff --git a/util/messages.po b/util/messages.po index 2eedd7c1bb..675918eb2f 100644 --- a/util/messages.po +++ b/util/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-08-26 09:47+0200\n" +"POT-Creation-Date: 2017-09-15 10:07+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -105,7 +105,7 @@ msgstr "" msgid "Enable widget to display Network posts only from selected network" msgstr "" -#: include/features.php:86 mod/search.php:37 mod/network.php:209 +#: include/features.php:86 mod/search.php:37 mod/network.php:194 msgid "Saved Searches" msgstr "" @@ -177,7 +177,7 @@ msgstr "" msgid "Add categories to your posts" msgstr "" -#: include/features.php:104 include/contact_widgets.php:166 +#: include/features.php:104 include/contact_widgets.php:167 msgid "Saved Folders" msgstr "" @@ -217,15 +217,15 @@ msgstr "" msgid "Show visitors public community forums at the Advanced Profile Page" msgstr "" -#: include/datetime.php:66 include/datetime.php:68 mod/profiles.php:701 +#: include/datetime.php:66 include/datetime.php:68 mod/profiles.php:702 msgid "Miscellaneous" msgstr "" -#: include/datetime.php:196 include/identity.php:653 +#: include/datetime.php:196 include/identity.php:654 msgid "Birthday:" msgstr "" -#: include/datetime.php:198 mod/profiles.php:724 +#: include/datetime.php:198 mod/profiles.php:725 msgid "Age: " msgstr "" @@ -249,8 +249,8 @@ msgstr "" msgid "years" msgstr "" -#: include/datetime.php:380 include/event.php:453 mod/cal.php:281 -#: mod/events.php:387 +#: include/datetime.php:380 include/event.php:454 mod/cal.php:282 +#: mod/events.php:388 msgid "month" msgstr "" @@ -258,8 +258,8 @@ msgstr "" msgid "months" msgstr "" -#: include/datetime.php:381 include/event.php:454 mod/cal.php:282 -#: mod/events.php:388 +#: include/datetime.php:381 include/event.php:455 mod/cal.php:283 +#: mod/events.php:389 msgid "week" msgstr "" @@ -267,8 +267,8 @@ msgstr "" msgid "weeks" msgstr "" -#: include/datetime.php:382 include/event.php:455 mod/cal.php:283 -#: mod/events.php:389 +#: include/datetime.php:382 include/event.php:456 mod/cal.php:284 +#: mod/events.php:390 msgid "day" msgstr "" @@ -310,215 +310,11 @@ msgstr "" msgid "%s's birthday" msgstr "" -#: include/datetime.php:621 include/dfrn.php:1318 +#: include/datetime.php:621 include/dfrn.php:1332 #, php-format msgid "Happy Birthday %s" msgstr "" -#: include/like.php:30 include/conversation.php:154 include/diaspora.php:1653 -#, php-format -msgid "%1$s likes %2$s's %3$s" -msgstr "" - -#: include/like.php:34 include/like.php:39 include/conversation.php:157 -#, php-format -msgid "%1$s doesn't like %2$s's %3$s" -msgstr "" - -#: include/like.php:44 -#, php-format -msgid "%1$s is attending %2$s's %3$s" -msgstr "" - -#: include/like.php:49 -#, php-format -msgid "%1$s is not attending %2$s's %3$s" -msgstr "" - -#: include/like.php:54 -#, php-format -msgid "%1$s may attend %2$s's %3$s" -msgstr "" - -#: include/like.php:181 include/conversation.php:142 -#: include/conversation.php:294 include/text.php:1893 mod/subthread.php:89 -#: mod/tagger.php:63 -msgid "photo" -msgstr "" - -#: include/like.php:181 include/conversation.php:137 -#: include/conversation.php:147 include/conversation.php:289 -#: include/conversation.php:298 include/diaspora.php:1657 mod/subthread.php:89 -#: mod/tagger.php:63 -msgid "status" -msgstr "" - -#: include/like.php:183 include/conversation.php:134 -#: include/conversation.php:286 include/text.php:1891 -msgid "event" -msgstr "" - -#: include/user.php:39 mod/settings.php:377 -msgid "Passwords do not match. Password unchanged." -msgstr "" - -#: include/user.php:48 -msgid "An invitation is required." -msgstr "" - -#: include/user.php:53 -msgid "Invitation could not be verified." -msgstr "" - -#: include/user.php:61 -msgid "Invalid OpenID url" -msgstr "" - -#: include/user.php:75 include/auth.php:139 -msgid "" -"We encountered a problem while logging in with the OpenID you provided. " -"Please check the correct spelling of the ID." -msgstr "" - -#: include/user.php:75 include/auth.php:139 -msgid "The error message was:" -msgstr "" - -#: include/user.php:82 -msgid "Please enter the required information." -msgstr "" - -#: include/user.php:96 -msgid "Please use a shorter name." -msgstr "" - -#: include/user.php:98 -msgid "Name too short." -msgstr "" - -#: include/user.php:106 -msgid "That doesn't appear to be your full (First Last) name." -msgstr "" - -#: include/user.php:111 -msgid "Your email domain is not among those allowed on this site." -msgstr "" - -#: include/user.php:114 -msgid "Not a valid email address." -msgstr "" - -#: include/user.php:127 -msgid "Cannot use that email." -msgstr "" - -#: include/user.php:133 -msgid "Your \"nickname\" can only contain \"a-z\", \"0-9\" and \"_\"." -msgstr "" - -#: include/user.php:140 include/user.php:228 -msgid "Nickname is already registered. Please choose another." -msgstr "" - -#: include/user.php:150 -msgid "" -"Nickname was once registered here and may not be re-used. Please choose " -"another." -msgstr "" - -#: include/user.php:166 -msgid "SERIOUS ERROR: Generation of security keys failed." -msgstr "" - -#: include/user.php:214 -msgid "An error occurred during registration. Please try again." -msgstr "" - -#: include/user.php:237 view/theme/duepuntozero/config.php:46 -msgid "default" -msgstr "" - -#: include/user.php:247 -msgid "An error occurred creating your default profile. Please try again." -msgstr "" - -#: include/user.php:260 include/user.php:264 include/profile_selectors.php:42 -msgid "Friends" -msgstr "" - -#: include/user.php:306 include/user.php:314 include/user.php:322 -#: include/api.php:3702 mod/photos.php:73 mod/photos.php:189 mod/photos.php:776 -#: mod/photos.php:1258 mod/photos.php:1279 mod/photos.php:1865 -#: mod/profile_photo.php:74 mod/profile_photo.php:82 mod/profile_photo.php:90 -#: mod/profile_photo.php:214 mod/profile_photo.php:309 -#: mod/profile_photo.php:319 -msgid "Profile Photos" -msgstr "" - -#: include/user.php:397 -#, php-format -msgid "" -"\n" -"\t\tDear %1$s,\n" -"\t\t\tThank you for registering at %2$s. Your account is pending for " -"approval by the administrator.\n" -"\t" -msgstr "" - -#: include/user.php:407 -#, php-format -msgid "Registration at %s" -msgstr "" - -#: include/user.php:417 -#, php-format -msgid "" -"\n" -"\t\tDear %1$s,\n" -"\t\t\tThank you for registering at %2$s. Your account has been created.\n" -"\t" -msgstr "" - -#: include/user.php:421 -#, php-format -msgid "" -"\n" -"\t\tThe login details are as follows:\n" -"\t\t\tSite Location:\t%3$s\n" -"\t\t\tLogin Name:\t%1$s\n" -"\t\t\tPassword:\t%5$s\n" -"\n" -"\t\tYou may change your password from your account \"Settings\" page after " -"logging\n" -"\t\tin.\n" -"\n" -"\t\tPlease take a few moments to review the other account settings on that " -"page.\n" -"\n" -"\t\tYou may also wish to add some basic information to your default profile\n" -"\t\t(on the \"Profiles\" page) so that other people can easily find you.\n" -"\n" -"\t\tWe recommend setting your full name, adding a profile photo,\n" -"\t\tadding some profile \"keywords\" (very useful in making new friends) - " -"and\n" -"\t\tperhaps what country you live in; if you do not wish to be more " -"specific\n" -"\t\tthan that.\n" -"\n" -"\t\tWe fully respect your right to privacy, and none of these items are " -"necessary.\n" -"\t\tIf you are new and do not know anybody here, they may help\n" -"\t\tyou to make some new and interesting friends.\n" -"\n" -"\n" -"\t\tThank you and welcome to %2$s." -msgstr "" - -#: include/user.php:453 mod/admin.php:1398 -#, php-format -msgid "Registration details for %s" -msgstr "" - #: include/profile_selectors.php:6 msgid "Male" msgstr "" @@ -571,7 +367,7 @@ msgstr "" msgid "Other" msgstr "" -#: include/profile_selectors.php:6 include/conversation.php:1555 +#: include/profile_selectors.php:6 include/conversation.php:1556 msgid "Undecided" msgid_plural "Undecided" msgstr[0] "" @@ -665,6 +461,10 @@ msgstr "" msgid "Sex Addict" msgstr "" +#: include/profile_selectors.php:42 include/user.php:262 include/user.php:266 +msgid "Friends" +msgstr "" + #: include/profile_selectors.php:42 msgid "Friends/Benefits" msgstr "" @@ -749,674 +549,15 @@ msgstr "" msgid "Ask me" msgstr "" -#: include/NotificationsManager.php:155 -msgid "System" -msgstr "" - -#: include/NotificationsManager.php:162 include/nav.php:160 mod/admin.php:587 -#: view/theme/frio/theme.php:259 -msgid "Network" -msgstr "" - -#: include/NotificationsManager.php:169 mod/profiles.php:699 -#: mod/network.php:867 -msgid "Personal" -msgstr "" - -#: include/NotificationsManager.php:176 include/nav.php:107 include/nav.php:163 -msgid "Home" -msgstr "" - -#: include/NotificationsManager.php:183 include/nav.php:168 -msgid "Introductions" -msgstr "" - -#: include/NotificationsManager.php:241 include/NotificationsManager.php:253 -#, php-format -msgid "%s commented on %s's post" -msgstr "" - -#: include/NotificationsManager.php:252 -#, php-format -msgid "%s created a new post" -msgstr "" - -#: include/NotificationsManager.php:267 -#, php-format -msgid "%s liked %s's post" -msgstr "" - -#: include/NotificationsManager.php:280 -#, php-format -msgid "%s disliked %s's post" -msgstr "" - -#: include/NotificationsManager.php:293 -#, php-format -msgid "%s is attending %s's event" -msgstr "" - -#: include/NotificationsManager.php:306 -#, php-format -msgid "%s is not attending %s's event" -msgstr "" - -#: include/NotificationsManager.php:319 -#, php-format -msgid "%s may attend %s's event" -msgstr "" - -#: include/NotificationsManager.php:336 -#, php-format -msgid "%s is now friends with %s" -msgstr "" - -#: include/NotificationsManager.php:774 -msgid "Friend Suggestion" -msgstr "" - -#: include/NotificationsManager.php:803 -msgid "Friend/Connect Request" -msgstr "" - -#: include/NotificationsManager.php:803 -msgid "New Follower" -msgstr "" - -#: include/Photo.php:1075 include/Photo.php:1091 include/Photo.php:1099 -#: include/Photo.php:1124 include/message.php:145 mod/wall_upload.php:249 -#: mod/item.php:468 -msgid "Wall Photos" -msgstr "" - -#: include/api.php:1102 -#, php-format -msgid "Daily posting limit of %d posts reached. The post was rejected." -msgstr "" - -#: include/api.php:1123 -#, php-format -msgid "Weekly posting limit of %d posts reached. The post was rejected." -msgstr "" - -#: include/api.php:1144 -#, php-format -msgid "Monthly posting limit of %d posts reached. The post was rejected." -msgstr "" - -#: include/auth.php:52 -msgid "Logged out." -msgstr "" - -#: include/auth.php:123 include/auth.php:185 mod/openid.php:110 -msgid "Login failed." -msgstr "" - -#: include/dba_pdo.php:75 include/dba.php:59 +#: include/dba_pdo.php:75 include/dba.php:61 #, php-format msgid "Cannot locate DNS info for database server '%s'" msgstr "" -#: include/delivery.php:428 -msgid "(no subject)" -msgstr "" - -#: include/delivery.php:440 include/enotify.php:46 -msgid "noreply" -msgstr "" - -#: include/event.php:19 include/bb2diaspora.php:233 mod/localtime.php:13 -msgid "l F d, Y \\@ g:i A" -msgstr "" - -#: include/event.php:36 include/event.php:56 include/event.php:459 -#: include/bb2diaspora.php:239 -msgid "Starts:" -msgstr "" - -#: include/event.php:39 include/event.php:62 include/event.php:460 -#: include/bb2diaspora.php:247 -msgid "Finishes:" -msgstr "" - -#: include/event.php:43 include/event.php:69 include/event.php:461 -#: include/bb2diaspora.php:256 include/identity.php:338 mod/directory.php:135 -#: mod/notifications.php:246 mod/events.php:496 mod/contacts.php:641 -msgid "Location:" -msgstr "" - -#: include/event.php:408 -msgid "all-day" -msgstr "" - -#: include/event.php:410 -msgid "Sun" -msgstr "" - -#: include/event.php:411 -msgid "Mon" -msgstr "" - -#: include/event.php:412 -msgid "Tue" -msgstr "" - -#: include/event.php:413 -msgid "Wed" -msgstr "" - -#: include/event.php:414 -msgid "Thu" -msgstr "" - -#: include/event.php:415 -msgid "Fri" -msgstr "" - -#: include/event.php:416 -msgid "Sat" -msgstr "" - -#: include/event.php:418 include/text.php:1206 mod/settings.php:982 -msgid "Sunday" -msgstr "" - -#: include/event.php:419 include/text.php:1206 mod/settings.php:982 -msgid "Monday" -msgstr "" - -#: include/event.php:420 include/text.php:1206 -msgid "Tuesday" -msgstr "" - -#: include/event.php:421 include/text.php:1206 -msgid "Wednesday" -msgstr "" - -#: include/event.php:422 include/text.php:1206 -msgid "Thursday" -msgstr "" - -#: include/event.php:423 include/text.php:1206 -msgid "Friday" -msgstr "" - -#: include/event.php:424 include/text.php:1206 -msgid "Saturday" -msgstr "" - -#: include/event.php:426 -msgid "Jan" -msgstr "" - -#: include/event.php:427 -msgid "Feb" -msgstr "" - -#: include/event.php:428 -msgid "Mar" -msgstr "" - -#: include/event.php:429 -msgid "Apr" -msgstr "" - -#: include/event.php:430 include/event.php:443 include/text.php:1210 -msgid "May" -msgstr "" - -#: include/event.php:431 -msgid "Jun" -msgstr "" - -#: include/event.php:432 -msgid "Jul" -msgstr "" - -#: include/event.php:433 -msgid "Aug" -msgstr "" - -#: include/event.php:434 -msgid "Sept" -msgstr "" - -#: include/event.php:435 -msgid "Oct" -msgstr "" - -#: include/event.php:436 -msgid "Nov" -msgstr "" - -#: include/event.php:437 -msgid "Dec" -msgstr "" - -#: include/event.php:439 include/text.php:1210 -msgid "January" -msgstr "" - -#: include/event.php:440 include/text.php:1210 -msgid "February" -msgstr "" - -#: include/event.php:441 include/text.php:1210 -msgid "March" -msgstr "" - -#: include/event.php:442 include/text.php:1210 -msgid "April" -msgstr "" - -#: include/event.php:444 include/text.php:1210 -msgid "June" -msgstr "" - -#: include/event.php:445 include/text.php:1210 -msgid "July" -msgstr "" - -#: include/event.php:446 include/text.php:1210 -msgid "August" -msgstr "" - -#: include/event.php:447 include/text.php:1210 -msgid "September" -msgstr "" - -#: include/event.php:448 include/text.php:1210 -msgid "October" -msgstr "" - -#: include/event.php:449 include/text.php:1210 -msgid "November" -msgstr "" - -#: include/event.php:450 include/text.php:1210 -msgid "December" -msgstr "" - -#: include/event.php:452 mod/cal.php:280 mod/events.php:386 -msgid "today" -msgstr "" - -#: include/event.php:457 -msgid "No events to display" -msgstr "" - -#: include/event.php:570 -msgid "l, F j" -msgstr "" - -#: include/event.php:592 -msgid "Edit event" -msgstr "" - -#: include/event.php:593 -msgid "Delete event" -msgstr "" - -#: include/event.php:619 include/text.php:1615 include/text.php:1622 -msgid "link to source" -msgstr "" - -#: include/event.php:877 -msgid "Export" -msgstr "" - -#: include/event.php:878 -msgid "Export calendar as ical" -msgstr "" - -#: include/event.php:879 -msgid "Export calendar as csv" -msgstr "" - -#: include/follow.php:84 mod/dfrn_request.php:514 -msgid "Disallowed profile URL." -msgstr "" - -#: include/follow.php:89 mod/friendica.php:115 mod/dfrn_request.php:520 -#: mod/admin.php:288 mod/admin.php:306 -msgid "Blocked domain" -msgstr "" - -#: include/follow.php:94 -msgid "Connect URL missing." -msgstr "" - -#: include/follow.php:122 -msgid "" -"This site is not configured to allow communications with other networks." -msgstr "" - -#: include/follow.php:123 include/follow.php:137 -msgid "No compatible communication protocols or feeds were discovered." -msgstr "" - -#: include/follow.php:135 -msgid "The profile address specified does not provide adequate information." -msgstr "" - -#: include/follow.php:140 -msgid "An author or name was not found." -msgstr "" - -#: include/follow.php:143 -msgid "No browser URL could be matched to this address." -msgstr "" - -#: include/follow.php:146 -msgid "" -"Unable to match @-style Identity Address with a known protocol or email " -"contact." -msgstr "" - -#: include/follow.php:147 -msgid "Use mailto: in front of address to force email check." -msgstr "" - -#: include/follow.php:153 -msgid "" -"The profile address specified belongs to a network which has been disabled " -"on this site." -msgstr "" - -#: include/follow.php:158 -msgid "" -"Limited profile. This person will be unable to receive direct/personal " -"notifications from you." -msgstr "" - -#: include/follow.php:259 -msgid "Unable to retrieve contact information." -msgstr "" - -#: include/message.php:14 include/message.php:168 -msgid "[no subject]" -msgstr "" - -#: include/nav.php:37 mod/navigation.php:21 -msgid "Nothing new here" -msgstr "" - -#: include/nav.php:41 mod/navigation.php:25 -msgid "Clear notifications" -msgstr "" - -#: include/nav.php:42 include/text.php:1093 -msgid "@name, !forum, #tags, content" -msgstr "" - -#: include/nav.php:80 view/theme/frio/theme.php:249 boot.php:871 -msgid "Logout" -msgstr "" - -#: include/nav.php:80 view/theme/frio/theme.php:249 -msgid "End this session" -msgstr "" - -#: include/nav.php:83 include/identity.php:783 mod/contacts.php:650 -#: mod/contacts.php:846 view/theme/frio/theme.php:252 -msgid "Status" -msgstr "" - -#: include/nav.php:83 include/nav.php:163 view/theme/frio/theme.php:252 -msgid "Your posts and conversations" -msgstr "" - -#: include/nav.php:84 include/identity.php:629 include/identity.php:758 -#: include/identity.php:791 mod/newmember.php:20 mod/profperm.php:107 -#: mod/contacts.php:652 mod/contacts.php:854 view/theme/frio/theme.php:253 -msgid "Profile" -msgstr "" - -#: include/nav.php:84 view/theme/frio/theme.php:253 -msgid "Your profile page" -msgstr "" - -#: include/nav.php:85 include/identity.php:799 mod/fbrowser.php:33 -#: view/theme/frio/theme.php:254 -msgid "Photos" -msgstr "" - -#: include/nav.php:85 view/theme/frio/theme.php:254 -msgid "Your photos" -msgstr "" - -#: include/nav.php:86 include/identity.php:807 include/identity.php:810 -#: view/theme/frio/theme.php:255 -msgid "Videos" -msgstr "" - -#: include/nav.php:86 view/theme/frio/theme.php:255 -msgid "Your videos" -msgstr "" - -#: include/nav.php:87 include/nav.php:151 include/identity.php:819 -#: include/identity.php:830 mod/cal.php:272 mod/events.php:377 -#: view/theme/frio/theme.php:256 view/theme/frio/theme.php:260 -msgid "Events" -msgstr "" - -#: include/nav.php:87 view/theme/frio/theme.php:256 -msgid "Your events" -msgstr "" - -#: include/nav.php:88 -msgid "Personal notes" -msgstr "" - -#: include/nav.php:88 -msgid "Your personal notes" -msgstr "" - -#: include/nav.php:97 mod/bookmarklet.php:14 boot.php:872 -msgid "Login" -msgstr "" - -#: include/nav.php:97 -msgid "Sign in" -msgstr "" - -#: include/nav.php:107 -msgid "Home Page" -msgstr "" - -#: include/nav.php:111 mod/register.php:292 boot.php:848 -msgid "Register" -msgstr "" - -#: include/nav.php:111 -msgid "Create an account" -msgstr "" - -#: include/nav.php:117 mod/help.php:50 view/theme/vier/theme.php:291 -msgid "Help" -msgstr "" - -#: include/nav.php:117 -msgid "Help and documentation" -msgstr "" - -#: include/nav.php:121 -msgid "Apps" -msgstr "" - -#: include/nav.php:121 -msgid "Addon applications, utilities, games" -msgstr "" - -#: include/nav.php:125 include/text.php:1090 mod/search.php:152 -msgid "Search" -msgstr "" - -#: include/nav.php:125 -msgid "Search site content" -msgstr "" - -#: include/nav.php:128 include/text.php:1098 -msgid "Full Text" -msgstr "" - -#: include/nav.php:129 include/text.php:1099 -msgid "Tags" -msgstr "" - -#: include/nav.php:130 include/nav.php:194 include/identity.php:852 -#: include/identity.php:855 include/text.php:1100 mod/viewcontacts.php:124 -#: mod/contacts.php:805 mod/contacts.php:866 view/theme/frio/theme.php:263 -msgid "Contacts" -msgstr "" - -#: include/nav.php:133 include/ForumManager.php:118 include/text.php:1103 -#: view/theme/vier/theme.php:248 -msgid "Forums" -msgstr "" - -#: include/nav.php:145 include/nav.php:147 mod/community.php:31 -msgid "Community" -msgstr "" - -#: include/nav.php:145 -msgid "Conversations on this site" -msgstr "" - -#: include/nav.php:147 -msgid "Conversations on the network" -msgstr "" - -#: include/nav.php:151 include/identity.php:822 include/identity.php:833 -#: view/theme/frio/theme.php:260 -msgid "Events and Calendar" -msgstr "" - -#: include/nav.php:154 -msgid "Directory" -msgstr "" - -#: include/nav.php:154 -msgid "People directory" -msgstr "" - -#: include/nav.php:156 -msgid "Information" -msgstr "" - -#: include/nav.php:156 -msgid "Information about this friendica instance" -msgstr "" - -#: include/nav.php:160 view/theme/frio/theme.php:259 -msgid "Conversations from your friends" -msgstr "" - -#: include/nav.php:161 -msgid "Network Reset" -msgstr "" - -#: include/nav.php:161 -msgid "Load Network page with no filters" -msgstr "" - -#: include/nav.php:168 -msgid "Friend Requests" -msgstr "" - -#: include/nav.php:171 mod/notifications.php:98 -msgid "Notifications" -msgstr "" - -#: include/nav.php:172 -msgid "See all notifications" -msgstr "" - -#: include/nav.php:173 mod/settings.php:907 -msgid "Mark as seen" -msgstr "" - -#: include/nav.php:173 -msgid "Mark all system notifications seen" -msgstr "" - -#: include/nav.php:177 mod/message.php:181 view/theme/frio/theme.php:261 -msgid "Messages" -msgstr "" - -#: include/nav.php:177 view/theme/frio/theme.php:261 -msgid "Private mail" -msgstr "" - -#: include/nav.php:178 -msgid "Inbox" -msgstr "" - -#: include/nav.php:179 -msgid "Outbox" -msgstr "" - -#: include/nav.php:180 mod/message.php:18 -msgid "New Message" -msgstr "" - -#: include/nav.php:183 -msgid "Manage" -msgstr "" - -#: include/nav.php:183 -msgid "Manage other pages" -msgstr "" - -#: include/nav.php:186 mod/settings.php:83 -msgid "Delegations" -msgstr "" - -#: include/nav.php:186 mod/delegate.php:132 -msgid "Delegate Page Management" -msgstr "" - -#: include/nav.php:188 mod/newmember.php:15 mod/settings.php:113 -#: mod/admin.php:1708 mod/admin.php:1984 view/theme/frio/theme.php:262 -msgid "Settings" -msgstr "" - -#: include/nav.php:188 view/theme/frio/theme.php:262 -msgid "Account settings" -msgstr "" - -#: include/nav.php:191 include/identity.php:292 -msgid "Profiles" -msgstr "" - -#: include/nav.php:191 -msgid "Manage/Edit Profiles" -msgstr "" - -#: include/nav.php:194 view/theme/frio/theme.php:263 -msgid "Manage/edit friends and contacts" -msgstr "" - -#: include/nav.php:199 mod/admin.php:202 -msgid "Admin" -msgstr "" - -#: include/nav.php:199 -msgid "Site setup and configuration" -msgstr "" - -#: include/nav.php:202 -msgid "Navigation" -msgstr "" - -#: include/nav.php:202 -msgid "Site map" -msgstr "" - -#: include/photos.php:57 include/photos.php:66 mod/fbrowser.php:42 -#: mod/fbrowser.php:63 mod/photos.php:189 mod/photos.php:1125 -#: mod/photos.php:1258 mod/photos.php:1279 mod/photos.php:1841 -#: mod/photos.php:1855 +#: include/photos.php:57 include/photos.php:66 mod/fbrowser.php:43 +#: mod/fbrowser.php:64 mod/photos.php:190 mod/photos.php:1126 +#: mod/photos.php:1259 mod/photos.php:1280 mod/photos.php:1842 +#: mod/photos.php:1856 msgid "Contact Photos" msgstr "" @@ -1429,7 +570,7 @@ msgstr "" msgid "Connectors disabled, since \"%s\" is enabled." msgstr "" -#: include/acl_selectors.php:361 mod/settings.php:1189 +#: include/acl_selectors.php:361 mod/settings.php:1190 msgid "Hide your profile details from unknown viewers?" msgstr "" @@ -1437,24 +578,24 @@ msgstr "" msgid "Visible to everybody" msgstr "" -#: include/acl_selectors.php:368 view/theme/vier/config.php:109 +#: include/acl_selectors.php:368 view/theme/vier/config.php:110 msgid "show" msgstr "" -#: include/acl_selectors.php:369 view/theme/vier/config.php:109 +#: include/acl_selectors.php:369 view/theme/vier/config.php:110 msgid "don't show" msgstr "" -#: include/acl_selectors.php:375 mod/editpost.php:125 +#: include/acl_selectors.php:375 mod/editpost.php:126 msgid "CC: email addresses" msgstr "" -#: include/acl_selectors.php:376 mod/editpost.php:132 +#: include/acl_selectors.php:376 mod/editpost.php:133 msgid "Example: bob@example.com, mary@example.com" msgstr "" -#: include/acl_selectors.php:378 mod/photos.php:1198 mod/photos.php:1595 -#: mod/events.php:511 +#: include/acl_selectors.php:378 mod/events.php:512 mod/photos.php:1199 +#: mod/photos.php:1596 msgid "Permissions" msgstr "" @@ -1486,19 +627,19 @@ msgstr "" msgid "Reputable, has my trust" msgstr "" -#: include/contact_selectors.php:56 mod/admin.php:1070 +#: include/contact_selectors.php:56 mod/admin.php:1072 msgid "Frequently" msgstr "" -#: include/contact_selectors.php:57 mod/admin.php:1071 +#: include/contact_selectors.php:57 mod/admin.php:1073 msgid "Hourly" msgstr "" -#: include/contact_selectors.php:58 mod/admin.php:1072 +#: include/contact_selectors.php:58 mod/admin.php:1074 msgid "Twice daily" msgstr "" -#: include/contact_selectors.php:59 mod/admin.php:1073 +#: include/contact_selectors.php:59 mod/admin.php:1075 msgid "Daily" msgstr "" @@ -1510,7 +651,7 @@ msgstr "" msgid "Monthly" msgstr "" -#: include/contact_selectors.php:76 mod/dfrn_request.php:886 +#: include/contact_selectors.php:76 mod/dfrn_request.php:887 msgid "Friendica" msgstr "" @@ -1523,12 +664,12 @@ msgid "RSS/Atom" msgstr "" #: include/contact_selectors.php:79 include/contact_selectors.php:86 -#: mod/admin.php:1580 mod/admin.php:1593 mod/admin.php:1606 mod/admin.php:1624 +#: mod/admin.php:1582 mod/admin.php:1595 mod/admin.php:1608 mod/admin.php:1626 msgid "Email" msgstr "" -#: include/contact_selectors.php:80 mod/dfrn_request.php:888 -#: mod/settings.php:849 +#: include/contact_selectors.php:80 mod/dfrn_request.php:889 +#: mod/settings.php:850 msgid "Diaspora" msgstr "" @@ -1580,298 +721,6 @@ msgstr "" msgid "App.net" msgstr "" -#: include/enotify.php:27 -msgid "Friendica Notification" -msgstr "" - -#: include/enotify.php:30 -msgid "Thank You," -msgstr "" - -#: include/enotify.php:33 -#, php-format -msgid "%s Administrator" -msgstr "" - -#: include/enotify.php:35 -#, php-format -msgid "%1$s, %2$s Administrator" -msgstr "" - -#: include/enotify.php:78 -#, php-format -msgid "%s " -msgstr "" - -#: include/enotify.php:91 -#, php-format -msgid "[Friendica:Notify] New mail received at %s" -msgstr "" - -#: include/enotify.php:93 -#, php-format -msgid "%1$s sent you a new private message at %2$s." -msgstr "" - -#: include/enotify.php:94 -#, php-format -msgid "%1$s sent you %2$s." -msgstr "" - -#: include/enotify.php:94 -msgid "a private message" -msgstr "" - -#: include/enotify.php:96 -#, php-format -msgid "Please visit %s to view and/or reply to your private messages." -msgstr "" - -#: include/enotify.php:142 -#, php-format -msgid "%1$s commented on [url=%2$s]a %3$s[/url]" -msgstr "" - -#: include/enotify.php:149 -#, php-format -msgid "%1$s commented on [url=%2$s]%3$s's %4$s[/url]" -msgstr "" - -#: include/enotify.php:157 -#, php-format -msgid "%1$s commented on [url=%2$s]your %3$s[/url]" -msgstr "" - -#: include/enotify.php:167 -#, php-format -msgid "[Friendica:Notify] Comment to conversation #%1$d by %2$s" -msgstr "" - -#: include/enotify.php:169 -#, php-format -msgid "%s commented on an item/conversation you have been following." -msgstr "" - -#: include/enotify.php:172 include/enotify.php:186 include/enotify.php:200 -#: include/enotify.php:214 include/enotify.php:232 include/enotify.php:246 -#, php-format -msgid "Please visit %s to view and/or reply to the conversation." -msgstr "" - -#: include/enotify.php:179 -#, php-format -msgid "[Friendica:Notify] %s posted to your profile wall" -msgstr "" - -#: include/enotify.php:181 -#, php-format -msgid "%1$s posted to your profile wall at %2$s" -msgstr "" - -#: include/enotify.php:182 -#, php-format -msgid "%1$s posted to [url=%2$s]your wall[/url]" -msgstr "" - -#: include/enotify.php:193 -#, php-format -msgid "[Friendica:Notify] %s tagged you" -msgstr "" - -#: include/enotify.php:195 -#, php-format -msgid "%1$s tagged you at %2$s" -msgstr "" - -#: include/enotify.php:196 -#, php-format -msgid "%1$s [url=%2$s]tagged you[/url]." -msgstr "" - -#: include/enotify.php:207 -#, php-format -msgid "[Friendica:Notify] %s shared a new post" -msgstr "" - -#: include/enotify.php:209 -#, php-format -msgid "%1$s shared a new post at %2$s" -msgstr "" - -#: include/enotify.php:210 -#, php-format -msgid "%1$s [url=%2$s]shared a post[/url]." -msgstr "" - -#: include/enotify.php:221 -#, php-format -msgid "[Friendica:Notify] %1$s poked you" -msgstr "" - -#: include/enotify.php:223 -#, php-format -msgid "%1$s poked you at %2$s" -msgstr "" - -#: include/enotify.php:224 -#, php-format -msgid "%1$s [url=%2$s]poked you[/url]." -msgstr "" - -#: include/enotify.php:239 -#, php-format -msgid "[Friendica:Notify] %s tagged your post" -msgstr "" - -#: include/enotify.php:241 -#, php-format -msgid "%1$s tagged your post at %2$s" -msgstr "" - -#: include/enotify.php:242 -#, php-format -msgid "%1$s tagged [url=%2$s]your post[/url]" -msgstr "" - -#: include/enotify.php:253 -msgid "[Friendica:Notify] Introduction received" -msgstr "" - -#: include/enotify.php:255 -#, php-format -msgid "You've received an introduction from '%1$s' at %2$s" -msgstr "" - -#: include/enotify.php:256 -#, php-format -msgid "You've received [url=%1$s]an introduction[/url] from %2$s." -msgstr "" - -#: include/enotify.php:260 include/enotify.php:303 -#, php-format -msgid "You may visit their profile at %s" -msgstr "" - -#: include/enotify.php:262 -#, php-format -msgid "Please visit %s to approve or reject the introduction." -msgstr "" - -#: include/enotify.php:270 -msgid "[Friendica:Notify] A new person is sharing with you" -msgstr "" - -#: include/enotify.php:272 include/enotify.php:273 -#, php-format -msgid "%1$s is sharing with you at %2$s" -msgstr "" - -#: include/enotify.php:279 -msgid "[Friendica:Notify] You have a new follower" -msgstr "" - -#: include/enotify.php:281 include/enotify.php:282 -#, php-format -msgid "You have a new follower at %2$s : %1$s" -msgstr "" - -#: include/enotify.php:293 -msgid "[Friendica:Notify] Friend suggestion received" -msgstr "" - -#: include/enotify.php:295 -#, php-format -msgid "You've received a friend suggestion from '%1$s' at %2$s" -msgstr "" - -#: include/enotify.php:296 -#, php-format -msgid "You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s." -msgstr "" - -#: include/enotify.php:301 -msgid "Name:" -msgstr "" - -#: include/enotify.php:302 -msgid "Photo:" -msgstr "" - -#: include/enotify.php:305 -#, php-format -msgid "Please visit %s to approve or reject the suggestion." -msgstr "" - -#: include/enotify.php:313 include/enotify.php:327 -msgid "[Friendica:Notify] Connection accepted" -msgstr "" - -#: include/enotify.php:315 include/enotify.php:329 -#, php-format -msgid "'%1$s' has accepted your connection request at %2$s" -msgstr "" - -#: include/enotify.php:316 include/enotify.php:330 -#, php-format -msgid "%2$s has accepted your [url=%1$s]connection request[/url]." -msgstr "" - -#: include/enotify.php:320 -msgid "" -"You are now mutual friends and may exchange status updates, photos, and " -"email without restriction." -msgstr "" - -#: include/enotify.php:322 -#, php-format -msgid "Please visit %s if you wish to make any changes to this relationship." -msgstr "" - -#: include/enotify.php:334 -#, php-format -msgid "" -"'%1$s' has chosen to accept you a \"fan\", which restricts some forms of " -"communication - such as private messaging and some profile interactions. If " -"this is a celebrity or community page, these settings were applied " -"automatically." -msgstr "" - -#: include/enotify.php:336 -#, php-format -msgid "" -"'%1$s' may choose to extend this into a two-way or more permissive " -"relationship in the future." -msgstr "" - -#: include/enotify.php:338 -#, php-format -msgid "Please visit %s if you wish to make any changes to this relationship." -msgstr "" - -#: include/enotify.php:348 -msgid "[Friendica System:Notify] registration request" -msgstr "" - -#: include/enotify.php:350 -#, php-format -msgid "You've received a registration request from '%1$s' at %2$s" -msgstr "" - -#: include/enotify.php:351 -#, php-format -msgid "You've received a [url=%1$s]registration request[/url] from %2$s." -msgstr "" - -#: include/enotify.php:355 -#, php-format -msgid "Full Name:\t%1$s\\nSite Location:\t%2$s\\nLogin Name:\t%3$s (%4$s)" -msgstr "" - -#: include/enotify.php:358 -#, php-format -msgid "Please visit %s to approve or reject the request." -msgstr "" - #: include/group.php:25 msgid "" "A deleted group with this name was revived. Existing item permissions " @@ -1907,7 +756,7 @@ msgstr "" msgid "Create a new group" msgstr "" -#: include/group.php:284 mod/group.php:100 mod/group.php:197 +#: include/group.php:284 mod/group.php:101 mod/group.php:198 msgid "Group Name: " msgstr "" @@ -1915,577 +764,743 @@ msgstr "" msgid "Contacts not in any group" msgstr "" -#: include/group.php:288 mod/network.php:210 +#: include/group.php:288 mod/network.php:195 msgid "add" msgstr "" -#: include/oembed.php:253 -msgid "Embedded content" -msgstr "" - -#: include/oembed.php:261 -msgid "Embedding disabled" -msgstr "" - -#: include/Contact.php:380 include/Contact.php:393 include/Contact.php:438 -#: include/conversation.php:1012 include/conversation.php:1028 -#: mod/allfriends.php:70 mod/directory.php:153 mod/match.php:76 -#: mod/suggest.php:84 mod/dirfind.php:211 +#: include/Contact.php:381 include/Contact.php:394 include/Contact.php:439 +#: include/conversation.php:1013 include/conversation.php:1029 +#: mod/allfriends.php:71 mod/directory.php:153 mod/dirfind.php:212 +#: mod/match.php:77 mod/suggest.php:85 msgid "View Profile" msgstr "" -#: include/Contact.php:394 include/contact_widgets.php:38 -#: include/conversation.php:1025 mod/allfriends.php:71 mod/match.php:77 -#: mod/suggest.php:85 mod/dirfind.php:212 mod/follow.php:108 -#: mod/contacts.php:615 +#: include/Contact.php:395 include/contact_widgets.php:39 +#: include/conversation.php:1026 mod/allfriends.php:72 mod/contacts.php:580 +#: mod/dirfind.php:213 mod/follow.php:143 mod/match.php:78 mod/suggest.php:86 msgid "Connect/Follow" msgstr "" -#: include/Contact.php:437 include/conversation.php:1011 +#: include/Contact.php:438 include/conversation.php:1012 msgid "View Status" msgstr "" -#: include/Contact.php:439 include/conversation.php:1013 +#: include/Contact.php:440 include/conversation.php:1014 msgid "View Photos" msgstr "" -#: include/Contact.php:440 include/conversation.php:1014 +#: include/Contact.php:441 include/conversation.php:1015 msgid "Network Posts" msgstr "" -#: include/Contact.php:441 include/conversation.php:1015 +#: include/Contact.php:442 include/conversation.php:1016 msgid "View Contact" msgstr "" -#: include/Contact.php:442 +#: include/Contact.php:443 msgid "Drop Contact" msgstr "" -#: include/Contact.php:443 include/conversation.php:1016 +#: include/Contact.php:444 include/conversation.php:1017 msgid "Send PM" msgstr "" -#: include/Contact.php:444 include/conversation.php:1020 +#: include/Contact.php:445 include/conversation.php:1021 msgid "Poke" msgstr "" -#: include/Contact.php:813 +#: include/Contact.php:814 msgid "Organisation" msgstr "" -#: include/Contact.php:816 +#: include/Contact.php:817 msgid "News" msgstr "" -#: include/Contact.php:819 +#: include/Contact.php:820 msgid "Forum" msgstr "" -#: include/ForumManager.php:120 view/theme/vier/theme.php:250 +#: include/ForumManager.php:119 include/nav.php:134 include/text.php:1104 +#: view/theme/vier/theme.php:249 +msgid "Forums" +msgstr "" + +#: include/ForumManager.php:121 view/theme/vier/theme.php:251 msgid "External link to forum" msgstr "" -#: include/ForumManager.php:123 include/contact_widgets.php:271 -#: include/items.php:2385 mod/content.php:625 object/Item.php:419 -#: view/theme/vier/theme.php:253 src/App.php:528 +#: include/ForumManager.php:124 include/contact_widgets.php:272 +#: include/items.php:2398 mod/content.php:626 object/Item.php:412 +#: view/theme/vier/theme.php:254 src/App.php:524 msgid "show more" msgstr "" -#: include/bbcode.php:428 include/bbcode.php:1186 include/bbcode.php:1187 +#: include/NotificationsManager.php:157 +msgid "System" +msgstr "" + +#: include/NotificationsManager.php:164 include/nav.php:161 mod/admin.php:589 +#: view/theme/frio/theme.php:260 +msgid "Network" +msgstr "" + +#: include/NotificationsManager.php:171 mod/network.php:911 +#: mod/profiles.php:700 +msgid "Personal" +msgstr "" + +#: include/NotificationsManager.php:178 include/nav.php:108 include/nav.php:164 +msgid "Home" +msgstr "" + +#: include/NotificationsManager.php:185 include/nav.php:169 +msgid "Introductions" +msgstr "" + +#: include/NotificationsManager.php:243 include/NotificationsManager.php:255 +#, php-format +msgid "%s commented on %s's post" +msgstr "" + +#: include/NotificationsManager.php:254 +#, php-format +msgid "%s created a new post" +msgstr "" + +#: include/NotificationsManager.php:269 +#, php-format +msgid "%s liked %s's post" +msgstr "" + +#: include/NotificationsManager.php:282 +#, php-format +msgid "%s disliked %s's post" +msgstr "" + +#: include/NotificationsManager.php:295 +#, php-format +msgid "%s is attending %s's event" +msgstr "" + +#: include/NotificationsManager.php:308 +#, php-format +msgid "%s is not attending %s's event" +msgstr "" + +#: include/NotificationsManager.php:321 +#, php-format +msgid "%s may attend %s's event" +msgstr "" + +#: include/NotificationsManager.php:338 +#, php-format +msgid "%s is now friends with %s" +msgstr "" + +#: include/NotificationsManager.php:776 +msgid "Friend Suggestion" +msgstr "" + +#: include/NotificationsManager.php:805 +msgid "Friend/Connect Request" +msgstr "" + +#: include/NotificationsManager.php:805 +msgid "New Follower" +msgstr "" + +#: include/Photo.php:1076 include/Photo.php:1092 include/Photo.php:1100 +#: include/Photo.php:1125 include/message.php:146 mod/item.php:469 +#: mod/wall_upload.php:250 +msgid "Wall Photos" +msgstr "" + +#: include/api.php:1103 +#, php-format +msgid "Daily posting limit of %d posts reached. The post was rejected." +msgstr "" + +#: include/api.php:1124 +#, php-format +msgid "Weekly posting limit of %d posts reached. The post was rejected." +msgstr "" + +#: include/api.php:1145 +#, php-format +msgid "Monthly posting limit of %d posts reached. The post was rejected." +msgstr "" + +#: include/api.php:3717 include/user.php:308 include/user.php:316 +#: include/user.php:324 mod/photos.php:74 mod/photos.php:190 mod/photos.php:777 +#: mod/photos.php:1259 mod/photos.php:1280 mod/photos.php:1866 +#: mod/profile_photo.php:75 mod/profile_photo.php:83 mod/profile_photo.php:91 +#: mod/profile_photo.php:215 mod/profile_photo.php:310 +#: mod/profile_photo.php:320 +msgid "Profile Photos" +msgstr "" + +#: include/auth.php:53 +msgid "Logged out." +msgstr "" + +#: include/auth.php:124 include/auth.php:186 mod/openid.php:111 +msgid "Login failed." +msgstr "" + +#: include/auth.php:140 include/user.php:77 +msgid "" +"We encountered a problem while logging in with the OpenID you provided. " +"Please check the correct spelling of the ID." +msgstr "" + +#: include/auth.php:140 include/user.php:77 +msgid "The error message was:" +msgstr "" + +#: include/bb2diaspora.php:234 include/event.php:20 mod/localtime.php:14 +msgid "l F d, Y \\@ g:i A" +msgstr "" + +#: include/bb2diaspora.php:240 include/event.php:37 include/event.php:57 +#: include/event.php:460 +msgid "Starts:" +msgstr "" + +#: include/bb2diaspora.php:248 include/event.php:40 include/event.php:63 +#: include/event.php:461 +msgid "Finishes:" +msgstr "" + +#: include/bb2diaspora.php:257 include/event.php:44 include/event.php:70 +#: include/event.php:462 include/identity.php:339 mod/contacts.php:648 +#: mod/directory.php:135 mod/events.php:497 mod/notifications.php:247 +msgid "Location:" +msgstr "" + +#: include/bbcode.php:429 include/bbcode.php:1192 include/bbcode.php:1193 msgid "Image/photo" msgstr "" -#: include/bbcode.php:544 +#: include/bbcode.php:545 #, php-format msgid "%2$s %3$s" msgstr "" -#: include/bbcode.php:1143 include/bbcode.php:1165 +#: include/bbcode.php:1149 include/bbcode.php:1171 msgid "$1 wrote:" msgstr "" -#: include/bbcode.php:1195 include/bbcode.php:1196 +#: include/bbcode.php:1201 include/bbcode.php:1202 msgid "Encrypted content" msgstr "" -#: include/bbcode.php:1315 +#: include/bbcode.php:1321 msgid "Invalid source protocol" msgstr "" -#: include/bbcode.php:1326 +#: include/bbcode.php:1332 msgid "Invalid link protocol" msgstr "" -#: include/contact_widgets.php:11 +#: include/contact_widgets.php:12 msgid "Add New Contact" msgstr "" -#: include/contact_widgets.php:12 +#: include/contact_widgets.php:13 msgid "Enter address or web location" msgstr "" -#: include/contact_widgets.php:13 +#: include/contact_widgets.php:14 msgid "Example: bob@example.com, http://example.com/barbara" msgstr "" -#: include/contact_widgets.php:15 include/identity.php:228 -#: mod/allfriends.php:87 mod/match.php:92 mod/suggest.php:103 -#: mod/dirfind.php:209 +#: include/contact_widgets.php:16 include/identity.php:229 +#: mod/allfriends.php:88 mod/dirfind.php:210 mod/match.php:93 +#: mod/suggest.php:104 msgid "Connect" msgstr "" -#: include/contact_widgets.php:30 +#: include/contact_widgets.php:31 #, php-format msgid "%d invitation available" msgid_plural "%d invitations available" msgstr[0] "" msgstr[1] "" -#: include/contact_widgets.php:36 +#: include/contact_widgets.php:37 msgid "Find People" msgstr "" -#: include/contact_widgets.php:37 +#: include/contact_widgets.php:38 msgid "Enter name or interest" msgstr "" -#: include/contact_widgets.php:39 +#: include/contact_widgets.php:40 msgid "Examples: Robert Morgenstein, Fishing" msgstr "" -#: include/contact_widgets.php:40 mod/directory.php:202 mod/contacts.php:811 +#: include/contact_widgets.php:41 mod/contacts.php:818 mod/directory.php:202 msgid "Find" msgstr "" -#: include/contact_widgets.php:41 mod/suggest.php:116 -#: view/theme/vier/theme.php:195 +#: include/contact_widgets.php:42 mod/suggest.php:117 +#: view/theme/vier/theme.php:196 msgid "Friend Suggestions" msgstr "" -#: include/contact_widgets.php:42 view/theme/vier/theme.php:194 +#: include/contact_widgets.php:43 view/theme/vier/theme.php:195 msgid "Similar Interests" msgstr "" -#: include/contact_widgets.php:43 +#: include/contact_widgets.php:44 msgid "Random Profile" msgstr "" -#: include/contact_widgets.php:44 view/theme/vier/theme.php:196 +#: include/contact_widgets.php:45 view/theme/vier/theme.php:197 msgid "Invite Friends" msgstr "" -#: include/contact_widgets.php:45 +#: include/contact_widgets.php:46 msgid "View Global Directory" msgstr "" -#: include/contact_widgets.php:131 +#: include/contact_widgets.php:132 msgid "Networks" msgstr "" -#: include/contact_widgets.php:134 +#: include/contact_widgets.php:135 msgid "All Networks" msgstr "" -#: include/contact_widgets.php:169 include/contact_widgets.php:204 +#: include/contact_widgets.php:170 include/contact_widgets.php:205 msgid "Everything" msgstr "" -#: include/contact_widgets.php:201 +#: include/contact_widgets.php:202 msgid "Categories" msgstr "" -#: include/contact_widgets.php:266 +#: include/contact_widgets.php:267 #, php-format msgid "%d contact in common" msgid_plural "%d contacts in common" msgstr[0] "" msgstr[1] "" -#: include/conversation.php:160 +#: include/conversation.php:135 include/conversation.php:287 +#: include/like.php:184 include/text.php:1885 +msgid "event" +msgstr "" + +#: include/conversation.php:138 include/conversation.php:148 +#: include/conversation.php:290 include/conversation.php:299 +#: include/diaspora.php:1663 include/like.php:182 mod/subthread.php:90 +#: mod/tagger.php:64 +msgid "status" +msgstr "" + +#: include/conversation.php:143 include/conversation.php:295 +#: include/like.php:182 include/text.php:1887 mod/subthread.php:90 +#: mod/tagger.php:64 +msgid "photo" +msgstr "" + +#: include/conversation.php:155 include/diaspora.php:1659 include/like.php:31 +#, php-format +msgid "%1$s likes %2$s's %3$s" +msgstr "" + +#: include/conversation.php:158 include/like.php:35 include/like.php:40 +#, php-format +msgid "%1$s doesn't like %2$s's %3$s" +msgstr "" + +#: include/conversation.php:161 #, php-format msgid "%1$s attends %2$s's %3$s" msgstr "" -#: include/conversation.php:163 +#: include/conversation.php:164 #, php-format msgid "%1$s doesn't attend %2$s's %3$s" msgstr "" -#: include/conversation.php:166 +#: include/conversation.php:167 #, php-format msgid "%1$s attends maybe %2$s's %3$s" msgstr "" -#: include/conversation.php:199 mod/dfrn_confirm.php:480 +#: include/conversation.php:200 mod/dfrn_confirm.php:480 #, php-format msgid "%1$s is now friends with %2$s" msgstr "" -#: include/conversation.php:240 +#: include/conversation.php:241 #, php-format msgid "%1$s poked %2$s" msgstr "" -#: include/conversation.php:261 mod/mood.php:64 +#: include/conversation.php:262 mod/mood.php:65 #, php-format msgid "%1$s is currently %2$s" msgstr "" -#: include/conversation.php:308 mod/tagger.php:96 +#: include/conversation.php:309 mod/tagger.php:97 #, php-format msgid "%1$s tagged %2$s's %3$s with %4$s" msgstr "" -#: include/conversation.php:335 +#: include/conversation.php:336 msgid "post/item" msgstr "" -#: include/conversation.php:336 +#: include/conversation.php:337 #, php-format msgid "%1$s marked %2$s's %3$s as favorite" msgstr "" -#: include/conversation.php:614 mod/content.php:373 mod/photos.php:1664 -#: mod/profiles.php:344 +#: include/conversation.php:615 mod/content.php:374 mod/photos.php:1665 +#: mod/profiles.php:345 msgid "Likes" msgstr "" -#: include/conversation.php:614 mod/content.php:373 mod/photos.php:1664 -#: mod/profiles.php:348 +#: include/conversation.php:615 mod/content.php:374 mod/photos.php:1665 +#: mod/profiles.php:349 msgid "Dislikes" msgstr "" -#: include/conversation.php:615 include/conversation.php:1549 -#: mod/content.php:374 mod/photos.php:1665 +#: include/conversation.php:616 include/conversation.php:1550 +#: mod/content.php:375 mod/photos.php:1666 msgid "Attending" msgid_plural "Attending" msgstr[0] "" msgstr[1] "" -#: include/conversation.php:615 mod/content.php:374 mod/photos.php:1665 +#: include/conversation.php:616 mod/content.php:375 mod/photos.php:1666 msgid "Not attending" msgstr "" -#: include/conversation.php:615 mod/content.php:374 mod/photos.php:1665 +#: include/conversation.php:616 mod/content.php:375 mod/photos.php:1666 msgid "Might attend" msgstr "" -#: include/conversation.php:752 mod/content.php:454 mod/content.php:760 -#: mod/photos.php:1730 object/Item.php:137 +#: include/conversation.php:753 mod/content.php:455 mod/content.php:761 +#: mod/photos.php:1731 object/Item.php:142 msgid "Select" msgstr "" -#: include/conversation.php:753 mod/content.php:455 mod/content.php:761 -#: mod/photos.php:1731 mod/contacts.php:821 mod/contacts.php:1020 -#: mod/settings.php:745 mod/admin.php:1598 object/Item.php:138 +#: include/conversation.php:754 mod/admin.php:1600 mod/contacts.php:828 +#: mod/contacts.php:1027 mod/content.php:456 mod/content.php:762 +#: mod/photos.php:1732 mod/settings.php:746 object/Item.php:143 msgid "Delete" msgstr "" -#: include/conversation.php:796 mod/content.php:488 mod/content.php:916 -#: mod/content.php:917 object/Item.php:352 object/Item.php:353 +#: include/conversation.php:797 mod/content.php:489 mod/content.php:917 +#: mod/content.php:918 object/Item.php:345 object/Item.php:346 #, php-format msgid "View %s's profile @ %s" msgstr "" -#: include/conversation.php:808 object/Item.php:340 +#: include/conversation.php:809 object/Item.php:333 msgid "Categories:" msgstr "" -#: include/conversation.php:809 object/Item.php:341 +#: include/conversation.php:810 object/Item.php:334 msgid "Filed under:" msgstr "" -#: include/conversation.php:816 mod/content.php:498 mod/content.php:929 -#: object/Item.php:366 +#: include/conversation.php:817 mod/content.php:499 mod/content.php:930 +#: object/Item.php:359 #, php-format msgid "%s from %s" msgstr "" -#: include/conversation.php:832 mod/content.php:514 +#: include/conversation.php:833 mod/content.php:515 msgid "View in context" msgstr "" -#: include/conversation.php:834 include/conversation.php:1306 -#: mod/content.php:516 mod/content.php:954 mod/editpost.php:116 -#: mod/message.php:339 mod/message.php:524 mod/photos.php:1629 -#: mod/wallmessage.php:142 object/Item.php:391 +#: include/conversation.php:835 include/conversation.php:1307 +#: mod/content.php:517 mod/content.php:955 mod/editpost.php:117 +#: mod/message.php:337 mod/message.php:522 mod/photos.php:1630 +#: mod/wallmessage.php:143 object/Item.php:384 msgid "Please wait" msgstr "" -#: include/conversation.php:911 +#: include/conversation.php:912 msgid "remove" msgstr "" -#: include/conversation.php:915 +#: include/conversation.php:916 msgid "Delete Selected Items" msgstr "" -#: include/conversation.php:1010 view/theme/frio/theme.php:346 +#: include/conversation.php:1011 view/theme/frio/theme.php:347 msgid "Follow Thread" msgstr "" -#: include/conversation.php:1147 +#: include/conversation.php:1148 #, php-format msgid "%s likes this." msgstr "" -#: include/conversation.php:1150 +#: include/conversation.php:1151 #, php-format msgid "%s doesn't like this." msgstr "" -#: include/conversation.php:1153 +#: include/conversation.php:1154 #, php-format msgid "%s attends." msgstr "" -#: include/conversation.php:1156 +#: include/conversation.php:1157 #, php-format msgid "%s doesn't attend." msgstr "" -#: include/conversation.php:1159 +#: include/conversation.php:1160 #, php-format msgid "%s attends maybe." msgstr "" -#: include/conversation.php:1170 +#: include/conversation.php:1171 msgid "and" msgstr "" -#: include/conversation.php:1176 +#: include/conversation.php:1177 #, php-format msgid ", and %d other people" msgstr "" -#: include/conversation.php:1185 +#: include/conversation.php:1186 #, php-format msgid "%2$d people like this" msgstr "" -#: include/conversation.php:1186 +#: include/conversation.php:1187 #, php-format msgid "%s like this." msgstr "" -#: include/conversation.php:1189 +#: include/conversation.php:1190 #, php-format msgid "%2$d people don't like this" msgstr "" -#: include/conversation.php:1190 +#: include/conversation.php:1191 #, php-format msgid "%s don't like this." msgstr "" -#: include/conversation.php:1193 +#: include/conversation.php:1194 #, php-format msgid "%2$d people attend" msgstr "" -#: include/conversation.php:1194 +#: include/conversation.php:1195 #, php-format msgid "%s attend." msgstr "" -#: include/conversation.php:1197 +#: include/conversation.php:1198 #, php-format msgid "%2$d people don't attend" msgstr "" -#: include/conversation.php:1198 +#: include/conversation.php:1199 #, php-format msgid "%s don't attend." msgstr "" -#: include/conversation.php:1201 +#: include/conversation.php:1202 #, php-format msgid "%2$d people attend maybe" msgstr "" -#: include/conversation.php:1202 +#: include/conversation.php:1203 #, php-format msgid "%s anttend maybe." msgstr "" -#: include/conversation.php:1231 include/conversation.php:1247 +#: include/conversation.php:1232 include/conversation.php:1248 msgid "Visible to everybody" msgstr "" -#: include/conversation.php:1232 include/conversation.php:1248 -#: mod/message.php:273 mod/message.php:280 mod/message.php:420 -#: mod/message.php:427 mod/wallmessage.php:116 mod/wallmessage.php:123 +#: include/conversation.php:1233 include/conversation.php:1249 +#: mod/message.php:271 mod/message.php:278 mod/message.php:418 +#: mod/message.php:425 mod/wallmessage.php:117 mod/wallmessage.php:124 msgid "Please enter a link URL:" msgstr "" -#: include/conversation.php:1233 include/conversation.php:1249 +#: include/conversation.php:1234 include/conversation.php:1250 msgid "Please enter a video link/URL:" msgstr "" -#: include/conversation.php:1234 include/conversation.php:1250 +#: include/conversation.php:1235 include/conversation.php:1251 msgid "Please enter an audio link/URL:" msgstr "" -#: include/conversation.php:1235 include/conversation.php:1251 +#: include/conversation.php:1236 include/conversation.php:1252 msgid "Tag term:" msgstr "" -#: include/conversation.php:1236 include/conversation.php:1252 mod/filer.php:31 +#: include/conversation.php:1237 include/conversation.php:1253 mod/filer.php:31 msgid "Save to Folder:" msgstr "" -#: include/conversation.php:1237 include/conversation.php:1253 +#: include/conversation.php:1238 include/conversation.php:1254 msgid "Where are you right now?" msgstr "" -#: include/conversation.php:1238 +#: include/conversation.php:1239 msgid "Delete item(s)?" msgstr "" -#: include/conversation.php:1287 +#: include/conversation.php:1288 msgid "Share" msgstr "" -#: include/conversation.php:1288 mod/editpost.php:102 mod/message.php:337 -#: mod/message.php:521 mod/wallmessage.php:140 +#: include/conversation.php:1289 mod/editpost.php:103 mod/message.php:335 +#: mod/message.php:519 mod/wallmessage.php:141 msgid "Upload photo" msgstr "" -#: include/conversation.php:1289 mod/editpost.php:103 +#: include/conversation.php:1290 mod/editpost.php:104 msgid "upload photo" msgstr "" -#: include/conversation.php:1290 mod/editpost.php:104 +#: include/conversation.php:1291 mod/editpost.php:105 msgid "Attach file" msgstr "" -#: include/conversation.php:1291 mod/editpost.php:105 +#: include/conversation.php:1292 mod/editpost.php:106 msgid "attach file" msgstr "" -#: include/conversation.php:1292 mod/editpost.php:106 mod/message.php:338 -#: mod/message.php:522 mod/wallmessage.php:141 +#: include/conversation.php:1293 mod/editpost.php:107 mod/message.php:336 +#: mod/message.php:520 mod/wallmessage.php:142 msgid "Insert web link" msgstr "" -#: include/conversation.php:1293 mod/editpost.php:107 +#: include/conversation.php:1294 mod/editpost.php:108 msgid "web link" msgstr "" -#: include/conversation.php:1294 mod/editpost.php:108 +#: include/conversation.php:1295 mod/editpost.php:109 msgid "Insert video link" msgstr "" -#: include/conversation.php:1295 mod/editpost.php:109 +#: include/conversation.php:1296 mod/editpost.php:110 msgid "video link" msgstr "" -#: include/conversation.php:1296 mod/editpost.php:110 +#: include/conversation.php:1297 mod/editpost.php:111 msgid "Insert audio link" msgstr "" -#: include/conversation.php:1297 mod/editpost.php:111 +#: include/conversation.php:1298 mod/editpost.php:112 msgid "audio link" msgstr "" -#: include/conversation.php:1298 mod/editpost.php:112 +#: include/conversation.php:1299 mod/editpost.php:113 msgid "Set your location" msgstr "" -#: include/conversation.php:1299 mod/editpost.php:113 +#: include/conversation.php:1300 mod/editpost.php:114 msgid "set location" msgstr "" -#: include/conversation.php:1300 mod/editpost.php:114 +#: include/conversation.php:1301 mod/editpost.php:115 msgid "Clear browser location" msgstr "" -#: include/conversation.php:1301 mod/editpost.php:115 +#: include/conversation.php:1302 mod/editpost.php:116 msgid "clear location" msgstr "" -#: include/conversation.php:1303 mod/editpost.php:129 +#: include/conversation.php:1304 mod/editpost.php:130 msgid "Set title" msgstr "" -#: include/conversation.php:1305 mod/editpost.php:131 +#: include/conversation.php:1306 mod/editpost.php:132 msgid "Categories (comma-separated list)" msgstr "" -#: include/conversation.php:1307 mod/editpost.php:117 +#: include/conversation.php:1308 mod/editpost.php:118 msgid "Permission settings" msgstr "" -#: include/conversation.php:1308 mod/editpost.php:146 +#: include/conversation.php:1309 mod/editpost.php:147 msgid "permissions" msgstr "" -#: include/conversation.php:1316 mod/editpost.php:126 +#: include/conversation.php:1317 mod/editpost.php:127 msgid "Public post" msgstr "" -#: include/conversation.php:1321 mod/content.php:738 mod/editpost.php:137 -#: mod/photos.php:1649 mod/photos.php:1691 mod/photos.php:1771 -#: mod/events.php:506 object/Item.php:713 +#: include/conversation.php:1322 mod/content.php:739 mod/editpost.php:138 +#: mod/events.php:507 mod/photos.php:1650 mod/photos.php:1692 +#: mod/photos.php:1772 object/Item.php:706 msgid "Preview" msgstr "" -#: include/conversation.php:1325 include/items.php:2126 mod/editpost.php:140 -#: mod/fbrowser.php:102 mod/fbrowser.php:137 mod/message.php:211 -#: mod/photos.php:247 mod/photos.php:339 mod/suggest.php:34 mod/tagrm.php:13 -#: mod/tagrm.php:98 mod/videos.php:134 mod/dfrn_request.php:894 -#: mod/follow.php:126 mod/contacts.php:458 mod/settings.php:683 -#: mod/settings.php:709 +#: include/conversation.php:1326 include/items.php:2139 mod/contacts.php:459 +#: mod/dfrn_request.php:895 mod/editpost.php:141 mod/fbrowser.php:103 +#: mod/fbrowser.php:138 mod/follow.php:161 mod/message.php:210 +#: mod/photos.php:248 mod/photos.php:340 mod/settings.php:684 +#: mod/settings.php:710 mod/suggest.php:35 mod/tagrm.php:14 mod/tagrm.php:99 +#: mod/unfollow.php:117 mod/videos.php:135 msgid "Cancel" msgstr "" -#: include/conversation.php:1331 +#: include/conversation.php:1332 msgid "Post to Groups" msgstr "" -#: include/conversation.php:1332 +#: include/conversation.php:1333 msgid "Post to Contacts" msgstr "" -#: include/conversation.php:1333 +#: include/conversation.php:1334 msgid "Private post" msgstr "" -#: include/conversation.php:1338 include/identity.php:266 mod/editpost.php:144 +#: include/conversation.php:1339 include/identity.php:267 mod/editpost.php:145 msgid "Message" msgstr "" -#: include/conversation.php:1339 mod/editpost.php:145 +#: include/conversation.php:1340 mod/editpost.php:146 msgid "Browser" msgstr "" -#: include/conversation.php:1521 +#: include/conversation.php:1522 msgid "View all" msgstr "" -#: include/conversation.php:1543 +#: include/conversation.php:1544 msgid "Like" msgid_plural "Likes" msgstr[0] "" msgstr[1] "" -#: include/conversation.php:1546 +#: include/conversation.php:1547 msgid "Dislike" msgid_plural "Dislikes" msgstr[0] "" msgstr[1] "" -#: include/conversation.php:1552 +#: include/conversation.php:1553 msgid "Not Attending" msgid_plural "Not Attending" msgstr[0] "" msgstr[1] "" -#: include/dbstructure.php:25 +#: include/dbstructure.php:26 msgid "There are no tables on MyISAM." msgstr "" -#: include/dbstructure.php:66 +#: include/dbstructure.php:67 #, php-format msgid "" "\n" @@ -2496,14 +1511,14 @@ msgid "" "might be invalid." msgstr "" -#: include/dbstructure.php:71 +#: include/dbstructure.php:72 #, php-format msgid "" "The error message is\n" "[pre]%s[/pre]" msgstr "" -#: include/dbstructure.php:196 +#: include/dbstructure.php:197 #, php-format msgid "" "\n" @@ -2511,531 +1526,1380 @@ msgid "" "%s\n" msgstr "" -#: include/dbstructure.php:199 +#: include/dbstructure.php:200 msgid "Errors encountered performing database changes: " msgstr "" -#: include/dbstructure.php:207 +#: include/dbstructure.php:208 msgid ": Database update" msgstr "" -#: include/dbstructure.php:439 +#: include/dbstructure.php:440 #, php-format msgid "%s: updating %s table." msgstr "" -#: include/dfrn.php:1317 +#: include/delivery.php:429 +msgid "(no subject)" +msgstr "" + +#: include/delivery.php:441 include/enotify.php:47 +msgid "noreply" +msgstr "" + +#: include/dfrn.php:1331 #, php-format msgid "%s\\'s birthday" msgstr "" -#: include/diaspora.php:2212 +#: include/diaspora.php:2226 msgid "Sharing notification from Diaspora network" msgstr "" -#: include/diaspora.php:3169 +#: include/diaspora.php:3183 msgid "Attachments:" msgstr "" -#: include/identity.php:45 +#: include/enotify.php:28 +msgid "Friendica Notification" +msgstr "" + +#: include/enotify.php:31 +msgid "Thank You," +msgstr "" + +#: include/enotify.php:34 +#, php-format +msgid "%s Administrator" +msgstr "" + +#: include/enotify.php:36 +#, php-format +msgid "%1$s, %2$s Administrator" +msgstr "" + +#: include/enotify.php:81 +#, php-format +msgid "%s " +msgstr "" + +#: include/enotify.php:94 +#, php-format +msgid "[Friendica:Notify] New mail received at %s" +msgstr "" + +#: include/enotify.php:96 +#, php-format +msgid "%1$s sent you a new private message at %2$s." +msgstr "" + +#: include/enotify.php:97 +#, php-format +msgid "%1$s sent you %2$s." +msgstr "" + +#: include/enotify.php:97 +msgid "a private message" +msgstr "" + +#: include/enotify.php:99 +#, php-format +msgid "Please visit %s to view and/or reply to your private messages." +msgstr "" + +#: include/enotify.php:145 +#, php-format +msgid "%1$s commented on [url=%2$s]a %3$s[/url]" +msgstr "" + +#: include/enotify.php:152 +#, php-format +msgid "%1$s commented on [url=%2$s]%3$s's %4$s[/url]" +msgstr "" + +#: include/enotify.php:160 +#, php-format +msgid "%1$s commented on [url=%2$s]your %3$s[/url]" +msgstr "" + +#: include/enotify.php:170 +#, php-format +msgid "[Friendica:Notify] Comment to conversation #%1$d by %2$s" +msgstr "" + +#: include/enotify.php:172 +#, php-format +msgid "%s commented on an item/conversation you have been following." +msgstr "" + +#: include/enotify.php:175 include/enotify.php:189 include/enotify.php:203 +#: include/enotify.php:217 include/enotify.php:235 include/enotify.php:249 +#, php-format +msgid "Please visit %s to view and/or reply to the conversation." +msgstr "" + +#: include/enotify.php:182 +#, php-format +msgid "[Friendica:Notify] %s posted to your profile wall" +msgstr "" + +#: include/enotify.php:184 +#, php-format +msgid "%1$s posted to your profile wall at %2$s" +msgstr "" + +#: include/enotify.php:185 +#, php-format +msgid "%1$s posted to [url=%2$s]your wall[/url]" +msgstr "" + +#: include/enotify.php:196 +#, php-format +msgid "[Friendica:Notify] %s tagged you" +msgstr "" + +#: include/enotify.php:198 +#, php-format +msgid "%1$s tagged you at %2$s" +msgstr "" + +#: include/enotify.php:199 +#, php-format +msgid "%1$s [url=%2$s]tagged you[/url]." +msgstr "" + +#: include/enotify.php:210 +#, php-format +msgid "[Friendica:Notify] %s shared a new post" +msgstr "" + +#: include/enotify.php:212 +#, php-format +msgid "%1$s shared a new post at %2$s" +msgstr "" + +#: include/enotify.php:213 +#, php-format +msgid "%1$s [url=%2$s]shared a post[/url]." +msgstr "" + +#: include/enotify.php:224 +#, php-format +msgid "[Friendica:Notify] %1$s poked you" +msgstr "" + +#: include/enotify.php:226 +#, php-format +msgid "%1$s poked you at %2$s" +msgstr "" + +#: include/enotify.php:227 +#, php-format +msgid "%1$s [url=%2$s]poked you[/url]." +msgstr "" + +#: include/enotify.php:242 +#, php-format +msgid "[Friendica:Notify] %s tagged your post" +msgstr "" + +#: include/enotify.php:244 +#, php-format +msgid "%1$s tagged your post at %2$s" +msgstr "" + +#: include/enotify.php:245 +#, php-format +msgid "%1$s tagged [url=%2$s]your post[/url]" +msgstr "" + +#: include/enotify.php:256 +msgid "[Friendica:Notify] Introduction received" +msgstr "" + +#: include/enotify.php:258 +#, php-format +msgid "You've received an introduction from '%1$s' at %2$s" +msgstr "" + +#: include/enotify.php:259 +#, php-format +msgid "You've received [url=%1$s]an introduction[/url] from %2$s." +msgstr "" + +#: include/enotify.php:263 include/enotify.php:306 +#, php-format +msgid "You may visit their profile at %s" +msgstr "" + +#: include/enotify.php:265 +#, php-format +msgid "Please visit %s to approve or reject the introduction." +msgstr "" + +#: include/enotify.php:273 +msgid "[Friendica:Notify] A new person is sharing with you" +msgstr "" + +#: include/enotify.php:275 include/enotify.php:276 +#, php-format +msgid "%1$s is sharing with you at %2$s" +msgstr "" + +#: include/enotify.php:282 +msgid "[Friendica:Notify] You have a new follower" +msgstr "" + +#: include/enotify.php:284 include/enotify.php:285 +#, php-format +msgid "You have a new follower at %2$s : %1$s" +msgstr "" + +#: include/enotify.php:296 +msgid "[Friendica:Notify] Friend suggestion received" +msgstr "" + +#: include/enotify.php:298 +#, php-format +msgid "You've received a friend suggestion from '%1$s' at %2$s" +msgstr "" + +#: include/enotify.php:299 +#, php-format +msgid "You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s." +msgstr "" + +#: include/enotify.php:304 +msgid "Name:" +msgstr "" + +#: include/enotify.php:305 +msgid "Photo:" +msgstr "" + +#: include/enotify.php:308 +#, php-format +msgid "Please visit %s to approve or reject the suggestion." +msgstr "" + +#: include/enotify.php:316 include/enotify.php:330 +msgid "[Friendica:Notify] Connection accepted" +msgstr "" + +#: include/enotify.php:318 include/enotify.php:332 +#, php-format +msgid "'%1$s' has accepted your connection request at %2$s" +msgstr "" + +#: include/enotify.php:319 include/enotify.php:333 +#, php-format +msgid "%2$s has accepted your [url=%1$s]connection request[/url]." +msgstr "" + +#: include/enotify.php:323 +msgid "" +"You are now mutual friends and may exchange status updates, photos, and " +"email without restriction." +msgstr "" + +#: include/enotify.php:325 +#, php-format +msgid "Please visit %s if you wish to make any changes to this relationship." +msgstr "" + +#: include/enotify.php:337 +#, php-format +msgid "" +"'%1$s' has chosen to accept you a \"fan\", which restricts some forms of " +"communication - such as private messaging and some profile interactions. If " +"this is a celebrity or community page, these settings were applied " +"automatically." +msgstr "" + +#: include/enotify.php:339 +#, php-format +msgid "" +"'%1$s' may choose to extend this into a two-way or more permissive " +"relationship in the future." +msgstr "" + +#: include/enotify.php:341 +#, php-format +msgid "Please visit %s if you wish to make any changes to this relationship." +msgstr "" + +#: include/enotify.php:351 +msgid "[Friendica System:Notify] registration request" +msgstr "" + +#: include/enotify.php:353 +#, php-format +msgid "You've received a registration request from '%1$s' at %2$s" +msgstr "" + +#: include/enotify.php:354 +#, php-format +msgid "You've received a [url=%1$s]registration request[/url] from %2$s." +msgstr "" + +#: include/enotify.php:358 +#, php-format +msgid "Full Name:\t%1$s\\nSite Location:\t%2$s\\nLogin Name:\t%3$s (%4$s)" +msgstr "" + +#: include/enotify.php:361 +#, php-format +msgid "Please visit %s to approve or reject the request." +msgstr "" + +#: include/event.php:409 +msgid "all-day" +msgstr "" + +#: include/event.php:411 +msgid "Sun" +msgstr "" + +#: include/event.php:412 +msgid "Mon" +msgstr "" + +#: include/event.php:413 +msgid "Tue" +msgstr "" + +#: include/event.php:414 +msgid "Wed" +msgstr "" + +#: include/event.php:415 +msgid "Thu" +msgstr "" + +#: include/event.php:416 +msgid "Fri" +msgstr "" + +#: include/event.php:417 +msgid "Sat" +msgstr "" + +#: include/event.php:419 include/text.php:1207 mod/settings.php:983 +msgid "Sunday" +msgstr "" + +#: include/event.php:420 include/text.php:1207 mod/settings.php:983 +msgid "Monday" +msgstr "" + +#: include/event.php:421 include/text.php:1207 +msgid "Tuesday" +msgstr "" + +#: include/event.php:422 include/text.php:1207 +msgid "Wednesday" +msgstr "" + +#: include/event.php:423 include/text.php:1207 +msgid "Thursday" +msgstr "" + +#: include/event.php:424 include/text.php:1207 +msgid "Friday" +msgstr "" + +#: include/event.php:425 include/text.php:1207 +msgid "Saturday" +msgstr "" + +#: include/event.php:427 +msgid "Jan" +msgstr "" + +#: include/event.php:428 +msgid "Feb" +msgstr "" + +#: include/event.php:429 +msgid "Mar" +msgstr "" + +#: include/event.php:430 +msgid "Apr" +msgstr "" + +#: include/event.php:431 include/event.php:444 include/text.php:1211 +msgid "May" +msgstr "" + +#: include/event.php:432 +msgid "Jun" +msgstr "" + +#: include/event.php:433 +msgid "Jul" +msgstr "" + +#: include/event.php:434 +msgid "Aug" +msgstr "" + +#: include/event.php:435 +msgid "Sept" +msgstr "" + +#: include/event.php:436 +msgid "Oct" +msgstr "" + +#: include/event.php:437 +msgid "Nov" +msgstr "" + +#: include/event.php:438 +msgid "Dec" +msgstr "" + +#: include/event.php:440 include/text.php:1211 +msgid "January" +msgstr "" + +#: include/event.php:441 include/text.php:1211 +msgid "February" +msgstr "" + +#: include/event.php:442 include/text.php:1211 +msgid "March" +msgstr "" + +#: include/event.php:443 include/text.php:1211 +msgid "April" +msgstr "" + +#: include/event.php:445 include/text.php:1211 +msgid "June" +msgstr "" + +#: include/event.php:446 include/text.php:1211 +msgid "July" +msgstr "" + +#: include/event.php:447 include/text.php:1211 +msgid "August" +msgstr "" + +#: include/event.php:448 include/text.php:1211 +msgid "September" +msgstr "" + +#: include/event.php:449 include/text.php:1211 +msgid "October" +msgstr "" + +#: include/event.php:450 include/text.php:1211 +msgid "November" +msgstr "" + +#: include/event.php:451 include/text.php:1211 +msgid "December" +msgstr "" + +#: include/event.php:453 mod/cal.php:281 mod/events.php:387 +msgid "today" +msgstr "" + +#: include/event.php:458 +msgid "No events to display" +msgstr "" + +#: include/event.php:571 +msgid "l, F j" +msgstr "" + +#: include/event.php:593 +msgid "Edit event" +msgstr "" + +#: include/event.php:594 +msgid "Delete event" +msgstr "" + +#: include/event.php:620 include/text.php:1609 include/text.php:1616 +msgid "link to source" +msgstr "" + +#: include/event.php:878 +msgid "Export" +msgstr "" + +#: include/event.php:879 +msgid "Export calendar as ical" +msgstr "" + +#: include/event.php:880 +msgid "Export calendar as csv" +msgstr "" + +#: include/follow.php:85 mod/dfrn_request.php:515 +msgid "Disallowed profile URL." +msgstr "" + +#: include/follow.php:90 mod/admin.php:289 mod/admin.php:307 +#: mod/dfrn_request.php:521 mod/friendica.php:116 +msgid "Blocked domain" +msgstr "" + +#: include/follow.php:95 +msgid "Connect URL missing." +msgstr "" + +#: include/follow.php:123 +msgid "" +"This site is not configured to allow communications with other networks." +msgstr "" + +#: include/follow.php:124 include/follow.php:138 +msgid "No compatible communication protocols or feeds were discovered." +msgstr "" + +#: include/follow.php:136 +msgid "The profile address specified does not provide adequate information." +msgstr "" + +#: include/follow.php:141 +msgid "An author or name was not found." +msgstr "" + +#: include/follow.php:144 +msgid "No browser URL could be matched to this address." +msgstr "" + +#: include/follow.php:147 +msgid "" +"Unable to match @-style Identity Address with a known protocol or email " +"contact." +msgstr "" + +#: include/follow.php:148 +msgid "Use mailto: in front of address to force email check." +msgstr "" + +#: include/follow.php:154 +msgid "" +"The profile address specified belongs to a network which has been disabled " +"on this site." +msgstr "" + +#: include/follow.php:159 +msgid "" +"Limited profile. This person will be unable to receive direct/personal " +"notifications from you." +msgstr "" + +#: include/follow.php:260 +msgid "Unable to retrieve contact information." +msgstr "" + +#: include/identity.php:46 msgid "Requested account is not available." msgstr "" -#: include/identity.php:54 mod/profile.php:22 +#: include/identity.php:55 mod/profile.php:23 msgid "Requested profile is not available." msgstr "" -#: include/identity.php:98 include/identity.php:321 include/identity.php:754 +#: include/identity.php:99 include/identity.php:322 include/identity.php:755 msgid "Edit profile" msgstr "" -#: include/identity.php:261 +#: include/identity.php:262 msgid "Atom feed" msgstr "" -#: include/identity.php:292 +#: include/identity.php:293 include/nav.php:192 +msgid "Profiles" +msgstr "" + +#: include/identity.php:293 msgid "Manage/edit profiles" msgstr "" -#: include/identity.php:297 include/identity.php:323 mod/profiles.php:790 +#: include/identity.php:298 include/identity.php:324 mod/profiles.php:791 msgid "Change profile photo" msgstr "" -#: include/identity.php:298 mod/profiles.php:791 +#: include/identity.php:299 mod/profiles.php:792 msgid "Create New Profile" msgstr "" -#: include/identity.php:308 mod/profiles.php:780 +#: include/identity.php:309 mod/profiles.php:781 msgid "Profile Image" msgstr "" -#: include/identity.php:311 mod/profiles.php:782 +#: include/identity.php:312 mod/profiles.php:783 msgid "visible to everybody" msgstr "" -#: include/identity.php:312 mod/profiles.php:687 mod/profiles.php:783 +#: include/identity.php:313 mod/profiles.php:688 mod/profiles.php:784 msgid "Edit visibility" msgstr "" -#: include/identity.php:340 include/identity.php:641 mod/directory.php:137 -#: mod/notifications.php:252 +#: include/identity.php:341 include/identity.php:642 mod/directory.php:137 +#: mod/notifications.php:253 msgid "Gender:" msgstr "" -#: include/identity.php:343 include/identity.php:664 mod/directory.php:139 +#: include/identity.php:344 include/identity.php:665 mod/directory.php:139 msgid "Status:" msgstr "" -#: include/identity.php:345 include/identity.php:681 mod/directory.php:141 +#: include/identity.php:346 include/identity.php:682 mod/directory.php:141 msgid "Homepage:" msgstr "" -#: include/identity.php:347 include/identity.php:701 mod/directory.php:143 -#: mod/notifications.php:248 mod/contacts.php:645 +#: include/identity.php:348 include/identity.php:702 mod/contacts.php:652 +#: mod/directory.php:143 mod/notifications.php:249 msgid "About:" msgstr "" -#: include/identity.php:349 mod/contacts.php:643 +#: include/identity.php:350 mod/contacts.php:650 msgid "XMPP:" msgstr "" -#: include/identity.php:435 mod/notifications.php:260 mod/contacts.php:58 +#: include/identity.php:436 mod/contacts.php:59 mod/notifications.php:261 msgid "Network:" msgstr "" -#: include/identity.php:464 include/identity.php:555 +#: include/identity.php:465 include/identity.php:556 msgid "g A l F d" msgstr "" -#: include/identity.php:465 include/identity.php:556 +#: include/identity.php:466 include/identity.php:557 msgid "F d" msgstr "" -#: include/identity.php:517 include/identity.php:603 +#: include/identity.php:518 include/identity.php:604 msgid "[today]" msgstr "" -#: include/identity.php:529 +#: include/identity.php:530 msgid "Birthday Reminders" msgstr "" -#: include/identity.php:530 +#: include/identity.php:531 msgid "Birthdays this week:" msgstr "" -#: include/identity.php:590 +#: include/identity.php:591 msgid "[No description]" msgstr "" -#: include/identity.php:617 +#: include/identity.php:618 msgid "Event Reminders" msgstr "" -#: include/identity.php:618 +#: include/identity.php:619 msgid "Events this week:" msgstr "" -#: include/identity.php:638 mod/settings.php:1287 +#: include/identity.php:630 include/identity.php:759 include/identity.php:792 +#: include/nav.php:85 mod/newmember.php:20 mod/profperm.php:107 +#: mod/contacts.php:659 mod/contacts.php:861 view/theme/frio/theme.php:254 +msgid "Profile" +msgstr "" + +#: include/identity.php:639 mod/settings.php:1288 msgid "Full Name:" msgstr "" -#: include/identity.php:645 +#: include/identity.php:646 msgid "j F, Y" msgstr "" -#: include/identity.php:646 +#: include/identity.php:647 msgid "j F" msgstr "" -#: include/identity.php:660 +#: include/identity.php:661 msgid "Age:" msgstr "" -#: include/identity.php:673 +#: include/identity.php:674 #, php-format msgid "for %1$d %2$s" msgstr "" -#: include/identity.php:677 mod/profiles.php:706 +#: include/identity.php:678 mod/profiles.php:707 msgid "Sexual Preference:" msgstr "" -#: include/identity.php:685 mod/profiles.php:733 +#: include/identity.php:686 mod/profiles.php:734 msgid "Hometown:" msgstr "" -#: include/identity.php:689 mod/notifications.php:250 mod/follow.php:139 -#: mod/contacts.php:647 +#: include/identity.php:690 mod/contacts.php:654 mod/follow.php:174 +#: mod/notifications.php:251 msgid "Tags:" msgstr "" -#: include/identity.php:693 mod/profiles.php:734 +#: include/identity.php:694 mod/profiles.php:735 msgid "Political Views:" msgstr "" -#: include/identity.php:697 +#: include/identity.php:698 msgid "Religion:" msgstr "" -#: include/identity.php:705 +#: include/identity.php:706 msgid "Hobbies/Interests:" msgstr "" -#: include/identity.php:709 mod/profiles.php:738 +#: include/identity.php:710 mod/profiles.php:739 msgid "Likes:" msgstr "" -#: include/identity.php:713 mod/profiles.php:739 +#: include/identity.php:714 mod/profiles.php:740 msgid "Dislikes:" msgstr "" -#: include/identity.php:717 +#: include/identity.php:718 msgid "Contact information and Social Networks:" msgstr "" -#: include/identity.php:721 +#: include/identity.php:722 msgid "Musical interests:" msgstr "" -#: include/identity.php:725 +#: include/identity.php:726 msgid "Books, literature:" msgstr "" -#: include/identity.php:729 +#: include/identity.php:730 msgid "Television:" msgstr "" -#: include/identity.php:733 +#: include/identity.php:734 msgid "Film/dance/culture/entertainment:" msgstr "" -#: include/identity.php:737 +#: include/identity.php:738 msgid "Love/Romance:" msgstr "" -#: include/identity.php:741 +#: include/identity.php:742 msgid "Work/employment:" msgstr "" -#: include/identity.php:745 +#: include/identity.php:746 msgid "School/education:" msgstr "" -#: include/identity.php:750 +#: include/identity.php:751 msgid "Forums:" msgstr "" -#: include/identity.php:759 mod/events.php:509 +#: include/identity.php:760 mod/events.php:510 msgid "Basic" msgstr "" -#: include/identity.php:760 mod/events.php:510 mod/contacts.php:883 -#: mod/admin.php:1149 +#: include/identity.php:761 mod/admin.php:1151 mod/contacts.php:890 +#: mod/events.php:511 msgid "Advanced" msgstr "" -#: include/identity.php:786 mod/follow.php:147 mod/contacts.php:849 +#: include/identity.php:784 include/nav.php:84 mod/contacts.php:657 +#: mod/contacts.php:853 view/theme/frio/theme.php:253 +msgid "Status" +msgstr "" + +#: include/identity.php:787 mod/contacts.php:856 mod/follow.php:182 +#: mod/unfollow.php:133 msgid "Status Messages and Posts" msgstr "" -#: include/identity.php:794 mod/contacts.php:857 +#: include/identity.php:795 mod/contacts.php:864 msgid "Profile Details" msgstr "" -#: include/identity.php:802 mod/photos.php:95 +#: include/identity.php:800 include/nav.php:86 mod/fbrowser.php:34 +#: view/theme/frio/theme.php:255 +msgid "Photos" +msgstr "" + +#: include/identity.php:803 mod/photos.php:96 msgid "Photo Albums" msgstr "" -#: include/identity.php:841 mod/notes.php:49 +#: include/identity.php:808 include/identity.php:811 include/nav.php:87 +#: view/theme/frio/theme.php:256 +msgid "Videos" +msgstr "" + +#: include/identity.php:820 include/identity.php:831 include/nav.php:88 +#: include/nav.php:152 mod/cal.php:273 mod/events.php:378 +#: view/theme/frio/theme.php:257 view/theme/frio/theme.php:261 +msgid "Events" +msgstr "" + +#: include/identity.php:823 include/identity.php:834 include/nav.php:152 +#: view/theme/frio/theme.php:261 +msgid "Events and Calendar" +msgstr "" + +#: include/identity.php:842 mod/notes.php:49 msgid "Personal Notes" msgstr "" -#: include/identity.php:844 +#: include/identity.php:845 msgid "Only You Can See This" msgstr "" -#: include/items.php:1702 mod/dfrn_confirm.php:738 mod/dfrn_request.php:759 +#: include/identity.php:853 include/identity.php:856 include/nav.php:131 +#: include/nav.php:195 include/text.php:1101 mod/viewcontacts.php:124 +#: mod/contacts.php:812 mod/contacts.php:873 view/theme/frio/theme.php:264 +msgid "Contacts" +msgstr "" + +#: include/items.php:1715 mod/dfrn_confirm.php:738 mod/dfrn_request.php:760 msgid "[Name Withheld]" msgstr "" -#: include/items.php:2078 mod/notice.php:17 mod/viewsrc.php:16 -#: mod/admin.php:256 mod/admin.php:1655 mod/admin.php:1906 mod/display.php:121 -#: mod/display.php:290 mod/display.php:498 +#: include/items.php:2091 mod/viewsrc.php:16 mod/admin.php:257 +#: mod/admin.php:1657 mod/admin.php:1908 mod/display.php:122 +#: mod/display.php:291 mod/display.php:496 mod/notice.php:18 msgid "Item not found." msgstr "" -#: include/items.php:2121 +#: include/items.php:2134 msgid "Do you really want to delete this item?" msgstr "" -#: include/items.php:2123 mod/api.php:107 mod/message.php:208 -#: mod/suggest.php:31 mod/dfrn_request.php:880 mod/follow.php:115 -#: mod/profiles.php:643 mod/profiles.php:646 mod/profiles.php:673 -#: mod/register.php:248 mod/contacts.php:455 mod/settings.php:1172 -#: mod/settings.php:1178 mod/settings.php:1185 mod/settings.php:1189 -#: mod/settings.php:1194 mod/settings.php:1199 mod/settings.php:1204 -#: mod/settings.php:1209 mod/settings.php:1235 mod/settings.php:1236 -#: mod/settings.php:1237 mod/settings.php:1238 mod/settings.php:1239 +#: include/items.php:2136 mod/api.php:107 mod/contacts.php:456 +#: mod/dfrn_request.php:881 mod/follow.php:150 mod/message.php:207 +#: mod/profiles.php:644 mod/profiles.php:647 mod/profiles.php:674 +#: mod/register.php:249 mod/settings.php:1173 mod/settings.php:1179 +#: mod/settings.php:1186 mod/settings.php:1190 mod/settings.php:1195 +#: mod/settings.php:1200 mod/settings.php:1205 mod/settings.php:1210 +#: mod/settings.php:1236 mod/settings.php:1237 mod/settings.php:1238 +#: mod/settings.php:1239 mod/settings.php:1240 mod/suggest.php:32 msgid "Yes" msgstr "" -#: include/items.php:2262 mod/allfriends.php:14 mod/api.php:28 mod/api.php:33 -#: mod/attach.php:35 mod/cal.php:301 mod/common.php:20 mod/crepair.php:105 -#: mod/delegate.php:14 mod/dfrn_confirm.php:63 mod/editpost.php:12 -#: mod/fsuggest.php:80 mod/group.php:20 mod/manage.php:103 mod/message.php:48 -#: mod/message.php:173 mod/mood.php:116 mod/nogroup.php:29 mod/notes.php:25 -#: mod/notifications.php:73 mod/ostatus_subscribe.php:11 mod/photos.php:168 -#: mod/photos.php:1111 mod/poke.php:155 mod/repair_ostatus.php:11 -#: mod/suggest.php:60 mod/viewcontacts.php:49 mod/wall_attach.php:69 -#: mod/wall_attach.php:72 mod/wall_upload.php:101 mod/wall_upload.php:104 -#: mod/wallmessage.php:11 mod/wallmessage.php:35 mod/wallmessage.php:75 -#: mod/wallmessage.php:99 mod/regmod.php:106 mod/uimport.php:26 -#: mod/dirfind.php:15 mod/events.php:188 mod/follow.php:13 mod/follow.php:76 -#: mod/follow.php:160 mod/profile_photo.php:19 mod/profile_photo.php:179 -#: mod/profile_photo.php:190 mod/profile_photo.php:203 mod/profiles.php:172 -#: mod/profiles.php:610 mod/register.php:45 mod/contacts.php:363 -#: mod/invite.php:17 mod/invite.php:105 mod/settings.php:24 -#: mod/settings.php:132 mod/settings.php:669 mod/display.php:495 -#: mod/item.php:197 mod/item.php:209 mod/network.php:7 index.php:410 +#: include/items.php:2275 mod/api.php:28 mod/api.php:33 mod/attach.php:35 +#: mod/common.php:20 mod/crepair.php:105 mod/fsuggest.php:80 mod/nogroup.php:29 +#: mod/notes.php:25 mod/viewcontacts.php:49 mod/wall_attach.php:69 +#: mod/wall_attach.php:72 mod/uimport.php:26 mod/allfriends.php:15 +#: mod/cal.php:302 mod/contacts.php:364 mod/delegate.php:15 +#: mod/dfrn_confirm.php:64 mod/dirfind.php:16 mod/display.php:493 +#: mod/editpost.php:13 mod/events.php:189 mod/follow.php:14 mod/follow.php:55 +#: mod/follow.php:118 mod/group.php:21 mod/invite.php:18 mod/invite.php:106 +#: mod/item.php:198 mod/item.php:210 mod/manage.php:104 mod/message.php:49 +#: mod/message.php:172 mod/mood.php:117 mod/network.php:17 +#: mod/notifications.php:74 mod/ostatus_subscribe.php:12 mod/photos.php:169 +#: mod/photos.php:1112 mod/poke.php:156 mod/profile_photo.php:20 +#: mod/profile_photo.php:180 mod/profile_photo.php:191 +#: mod/profile_photo.php:204 mod/profiles.php:173 mod/profiles.php:611 +#: mod/register.php:46 mod/regmod.php:107 mod/repair_ostatus.php:12 +#: mod/settings.php:25 mod/settings.php:133 mod/settings.php:670 +#: mod/suggest.php:61 mod/unfollow.php:14 mod/unfollow.php:57 +#: mod/unfollow.php:90 mod/wall_upload.php:102 mod/wall_upload.php:105 +#: mod/wallmessage.php:12 mod/wallmessage.php:36 mod/wallmessage.php:76 +#: mod/wallmessage.php:100 index.php:411 msgid "Permission denied." msgstr "" -#: include/items.php:2379 +#: include/items.php:2392 msgid "Archives" msgstr "" -#: include/network.php:700 +#: include/like.php:45 +#, php-format +msgid "%1$s is attending %2$s's %3$s" +msgstr "" + +#: include/like.php:50 +#, php-format +msgid "%1$s is not attending %2$s's %3$s" +msgstr "" + +#: include/like.php:55 +#, php-format +msgid "%1$s may attend %2$s's %3$s" +msgstr "" + +#: include/message.php:15 include/message.php:169 +msgid "[no subject]" +msgstr "" + +#: include/nav.php:38 mod/navigation.php:22 +msgid "Nothing new here" +msgstr "" + +#: include/nav.php:42 mod/navigation.php:26 +msgid "Clear notifications" +msgstr "" + +#: include/nav.php:43 include/text.php:1094 +msgid "@name, !forum, #tags, content" +msgstr "" + +#: include/nav.php:81 view/theme/frio/theme.php:250 boot.php:860 +msgid "Logout" +msgstr "" + +#: include/nav.php:81 view/theme/frio/theme.php:250 +msgid "End this session" +msgstr "" + +#: include/nav.php:84 include/nav.php:164 view/theme/frio/theme.php:253 +msgid "Your posts and conversations" +msgstr "" + +#: include/nav.php:85 view/theme/frio/theme.php:254 +msgid "Your profile page" +msgstr "" + +#: include/nav.php:86 view/theme/frio/theme.php:255 +msgid "Your photos" +msgstr "" + +#: include/nav.php:87 view/theme/frio/theme.php:256 +msgid "Your videos" +msgstr "" + +#: include/nav.php:88 view/theme/frio/theme.php:257 +msgid "Your events" +msgstr "" + +#: include/nav.php:89 +msgid "Personal notes" +msgstr "" + +#: include/nav.php:89 +msgid "Your personal notes" +msgstr "" + +#: include/nav.php:98 mod/bookmarklet.php:15 boot.php:861 +msgid "Login" +msgstr "" + +#: include/nav.php:98 +msgid "Sign in" +msgstr "" + +#: include/nav.php:108 +msgid "Home Page" +msgstr "" + +#: include/nav.php:112 mod/register.php:293 boot.php:837 +msgid "Register" +msgstr "" + +#: include/nav.php:112 +msgid "Create an account" +msgstr "" + +#: include/nav.php:118 mod/help.php:51 view/theme/vier/theme.php:292 +msgid "Help" +msgstr "" + +#: include/nav.php:118 +msgid "Help and documentation" +msgstr "" + +#: include/nav.php:122 +msgid "Apps" +msgstr "" + +#: include/nav.php:122 +msgid "Addon applications, utilities, games" +msgstr "" + +#: include/nav.php:126 include/text.php:1091 mod/search.php:152 +msgid "Search" +msgstr "" + +#: include/nav.php:126 +msgid "Search site content" +msgstr "" + +#: include/nav.php:129 include/text.php:1099 +msgid "Full Text" +msgstr "" + +#: include/nav.php:130 include/text.php:1100 +msgid "Tags" +msgstr "" + +#: include/nav.php:146 include/nav.php:148 mod/community.php:31 +msgid "Community" +msgstr "" + +#: include/nav.php:146 +msgid "Conversations on this site" +msgstr "" + +#: include/nav.php:148 +msgid "Conversations on the network" +msgstr "" + +#: include/nav.php:155 +msgid "Directory" +msgstr "" + +#: include/nav.php:155 +msgid "People directory" +msgstr "" + +#: include/nav.php:157 +msgid "Information" +msgstr "" + +#: include/nav.php:157 +msgid "Information about this friendica instance" +msgstr "" + +#: include/nav.php:161 view/theme/frio/theme.php:260 +msgid "Conversations from your friends" +msgstr "" + +#: include/nav.php:162 +msgid "Network Reset" +msgstr "" + +#: include/nav.php:162 +msgid "Load Network page with no filters" +msgstr "" + +#: include/nav.php:169 +msgid "Friend Requests" +msgstr "" + +#: include/nav.php:172 mod/notifications.php:99 +msgid "Notifications" +msgstr "" + +#: include/nav.php:173 +msgid "See all notifications" +msgstr "" + +#: include/nav.php:174 mod/settings.php:908 +msgid "Mark as seen" +msgstr "" + +#: include/nav.php:174 +msgid "Mark all system notifications seen" +msgstr "" + +#: include/nav.php:178 mod/message.php:180 view/theme/frio/theme.php:262 +msgid "Messages" +msgstr "" + +#: include/nav.php:178 view/theme/frio/theme.php:262 +msgid "Private mail" +msgstr "" + +#: include/nav.php:179 +msgid "Inbox" +msgstr "" + +#: include/nav.php:180 +msgid "Outbox" +msgstr "" + +#: include/nav.php:181 mod/message.php:19 +msgid "New Message" +msgstr "" + +#: include/nav.php:184 +msgid "Manage" +msgstr "" + +#: include/nav.php:184 +msgid "Manage other pages" +msgstr "" + +#: include/nav.php:187 mod/settings.php:84 +msgid "Delegations" +msgstr "" + +#: include/nav.php:187 mod/delegate.php:133 +msgid "Delegate Page Management" +msgstr "" + +#: include/nav.php:189 mod/newmember.php:15 mod/admin.php:1710 +#: mod/admin.php:1986 mod/settings.php:114 view/theme/frio/theme.php:263 +msgid "Settings" +msgstr "" + +#: include/nav.php:189 view/theme/frio/theme.php:263 +msgid "Account settings" +msgstr "" + +#: include/nav.php:192 +msgid "Manage/Edit Profiles" +msgstr "" + +#: include/nav.php:195 view/theme/frio/theme.php:264 +msgid "Manage/edit friends and contacts" +msgstr "" + +#: include/nav.php:200 mod/admin.php:203 +msgid "Admin" +msgstr "" + +#: include/nav.php:200 +msgid "Site setup and configuration" +msgstr "" + +#: include/nav.php:203 +msgid "Navigation" +msgstr "" + +#: include/nav.php:203 +msgid "Site map" +msgstr "" + +#: include/network.php:701 msgid "view full size" msgstr "" -#: include/ostatus.php:1950 +#: include/oembed.php:254 +msgid "Embedded content" +msgstr "" + +#: include/oembed.php:262 +msgid "Embedding disabled" +msgstr "" + +#: include/ostatus.php:1643 #, php-format msgid "%s is now following %s." msgstr "" -#: include/ostatus.php:1951 +#: include/ostatus.php:1644 msgid "following" msgstr "" -#: include/ostatus.php:1954 +#: include/ostatus.php:1647 #, php-format msgid "%s stopped following %s." msgstr "" -#: include/ostatus.php:1955 +#: include/ostatus.php:1648 msgid "stopped following" msgstr "" -#: include/plugin.php:518 include/plugin.php:520 +#: include/plugin.php:519 include/plugin.php:521 msgid "Click here to upgrade." msgstr "" -#: include/plugin.php:527 +#: include/plugin.php:528 msgid "This action exceeds the limits set by your subscription plan." msgstr "" -#: include/plugin.php:532 +#: include/plugin.php:533 msgid "This action is not available under your subscription plan." msgstr "" -#: include/security.php:63 +#: include/security.php:64 msgid "Welcome " msgstr "" -#: include/security.php:64 +#: include/security.php:65 msgid "Please upload a profile photo." msgstr "" -#: include/security.php:66 +#: include/security.php:67 msgid "Welcome back " msgstr "" -#: include/security.php:423 +#: include/security.php:424 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/text.php:314 +#: include/text.php:315 msgid "newer" msgstr "" -#: include/text.php:315 +#: include/text.php:316 msgid "older" msgstr "" -#: include/text.php:320 +#: include/text.php:321 msgid "first" msgstr "" -#: include/text.php:321 +#: include/text.php:322 msgid "prev" msgstr "" -#: include/text.php:355 +#: include/text.php:356 msgid "next" msgstr "" -#: include/text.php:356 +#: include/text.php:357 msgid "last" msgstr "" -#: include/text.php:410 +#: include/text.php:411 msgid "Loading more entries..." msgstr "" -#: include/text.php:411 +#: include/text.php:412 msgid "The end" msgstr "" -#: include/text.php:964 +#: include/text.php:965 msgid "No contacts" msgstr "" -#: include/text.php:988 +#: include/text.php:989 #, php-format msgid "%d Contact" msgid_plural "%d Contacts" msgstr[0] "" msgstr[1] "" -#: include/text.php:1001 +#: include/text.php:1002 msgid "View Contacts" msgstr "" -#: include/text.php:1091 mod/editpost.php:101 mod/filer.php:32 mod/notes.php:64 +#: include/text.php:1092 mod/filer.php:32 mod/notes.php:64 mod/editpost.php:102 msgid "Save" msgstr "" -#: include/text.php:1152 +#: include/text.php:1153 msgid "poke" msgstr "" -#: include/text.php:1152 +#: include/text.php:1153 msgid "poked" msgstr "" -#: include/text.php:1153 +#: include/text.php:1154 msgid "ping" msgstr "" -#: include/text.php:1153 +#: include/text.php:1154 msgid "pinged" msgstr "" -#: include/text.php:1154 +#: include/text.php:1155 msgid "prod" msgstr "" -#: include/text.php:1154 +#: include/text.php:1155 msgid "prodded" msgstr "" -#: include/text.php:1155 +#: include/text.php:1156 msgid "slap" msgstr "" -#: include/text.php:1155 +#: include/text.php:1156 msgid "slapped" msgstr "" -#: include/text.php:1156 +#: include/text.php:1157 msgid "finger" msgstr "" -#: include/text.php:1156 +#: include/text.php:1157 msgid "fingered" msgstr "" -#: include/text.php:1157 +#: include/text.php:1158 msgid "rebuff" msgstr "" -#: include/text.php:1157 +#: include/text.php:1158 msgid "rebuffed" msgstr "" -#: include/text.php:1171 +#: include/text.php:1172 msgid "happy" msgstr "" -#: include/text.php:1172 +#: include/text.php:1173 msgid "sad" msgstr "" -#: include/text.php:1173 +#: include/text.php:1174 msgid "mellow" msgstr "" -#: include/text.php:1174 +#: include/text.php:1175 msgid "tired" msgstr "" -#: include/text.php:1175 +#: include/text.php:1176 msgid "perky" msgstr "" -#: include/text.php:1176 +#: include/text.php:1177 msgid "angry" msgstr "" -#: include/text.php:1177 +#: include/text.php:1178 msgid "stupified" msgstr "" -#: include/text.php:1178 +#: include/text.php:1179 msgid "puzzled" msgstr "" -#: include/text.php:1179 +#: include/text.php:1180 msgid "interested" msgstr "" -#: include/text.php:1180 +#: include/text.php:1181 msgid "bitter" msgstr "" -#: include/text.php:1181 +#: include/text.php:1182 msgid "cheerful" msgstr "" -#: include/text.php:1182 +#: include/text.php:1183 msgid "alive" msgstr "" -#: include/text.php:1183 +#: include/text.php:1184 msgid "annoyed" msgstr "" -#: include/text.php:1184 +#: include/text.php:1185 msgid "anxious" msgstr "" -#: include/text.php:1185 +#: include/text.php:1186 msgid "cranky" msgstr "" -#: include/text.php:1186 +#: include/text.php:1187 msgid "disturbed" msgstr "" -#: include/text.php:1187 +#: include/text.php:1188 msgid "frustrated" msgstr "" -#: include/text.php:1188 +#: include/text.php:1189 msgid "motivated" msgstr "" -#: include/text.php:1189 +#: include/text.php:1190 msgid "relaxed" msgstr "" -#: include/text.php:1190 +#: include/text.php:1191 msgid "surprised" msgstr "" -#: include/text.php:1408 mod/videos.php:388 +#: include/text.php:1408 mod/videos.php:389 msgid "View Video" msgstr "" @@ -3043,75 +2907,209 @@ msgstr "" msgid "bytes" msgstr "" -#: include/text.php:1466 include/text.php:1477 +#: include/text.php:1460 include/text.php:1471 msgid "Click to open/close" msgstr "" -#: include/text.php:1609 +#: include/text.php:1603 msgid "View on separate page" msgstr "" -#: include/text.php:1610 +#: include/text.php:1604 msgid "view on separate page" msgstr "" -#: include/text.php:1895 +#: include/text.php:1889 msgid "activity" msgstr "" -#: include/text.php:1897 mod/content.php:624 object/Item.php:418 -#: object/Item.php:430 +#: include/text.php:1891 mod/content.php:625 object/Item.php:411 +#: object/Item.php:423 msgid "comment" msgid_plural "comments" msgstr[0] "" msgstr[1] "" -#: include/text.php:1900 +#: include/text.php:1894 msgid "post" msgstr "" -#: include/text.php:2066 +#: include/text.php:2060 msgid "Item filed" msgstr "" -#: include/uimport.php:83 +#: include/uimport.php:84 msgid "Error decoding account file" msgstr "" -#: include/uimport.php:89 +#: include/uimport.php:90 msgid "Error! No version data in file! This is not a Friendica account file?" msgstr "" -#: include/uimport.php:106 include/uimport.php:117 +#: include/uimport.php:107 include/uimport.php:118 msgid "Error! Cannot check nickname" msgstr "" -#: include/uimport.php:110 include/uimport.php:121 +#: include/uimport.php:111 include/uimport.php:122 #, php-format msgid "User '%s' already exists on this server!" msgstr "" -#: include/uimport.php:143 +#: include/uimport.php:144 msgid "User creation error" msgstr "" -#: include/uimport.php:164 +#: include/uimport.php:165 msgid "User profile creation error" msgstr "" -#: include/uimport.php:213 +#: include/uimport.php:214 #, php-format msgid "%d contact not imported" msgid_plural "%d contacts not imported" msgstr[0] "" msgstr[1] "" -#: include/uimport.php:279 +#: include/uimport.php:280 msgid "Done. You can now login with your username and password" msgstr "" -#: mod/allfriends.php:48 -msgid "No friends to display." +#: include/user.php:41 mod/settings.php:378 +msgid "Passwords do not match. Password unchanged." +msgstr "" + +#: include/user.php:50 +msgid "An invitation is required." +msgstr "" + +#: include/user.php:55 +msgid "Invitation could not be verified." +msgstr "" + +#: include/user.php:63 +msgid "Invalid OpenID url" +msgstr "" + +#: include/user.php:84 +msgid "Please enter the required information." +msgstr "" + +#: include/user.php:98 +msgid "Please use a shorter name." +msgstr "" + +#: include/user.php:100 +msgid "Name too short." +msgstr "" + +#: include/user.php:108 +msgid "That doesn't appear to be your full (First Last) name." +msgstr "" + +#: include/user.php:113 +msgid "Your email domain is not among those allowed on this site." +msgstr "" + +#: include/user.php:116 +msgid "Not a valid email address." +msgstr "" + +#: include/user.php:129 +msgid "Cannot use that email." +msgstr "" + +#: include/user.php:135 +msgid "Your \"nickname\" can only contain \"a-z\", \"0-9\" and \"_\"." +msgstr "" + +#: include/user.php:142 include/user.php:230 +msgid "Nickname is already registered. Please choose another." +msgstr "" + +#: include/user.php:152 +msgid "" +"Nickname was once registered here and may not be re-used. Please choose " +"another." +msgstr "" + +#: include/user.php:168 +msgid "SERIOUS ERROR: Generation of security keys failed." +msgstr "" + +#: include/user.php:216 +msgid "An error occurred during registration. Please try again." +msgstr "" + +#: include/user.php:239 view/theme/duepuntozero/config.php:47 +msgid "default" +msgstr "" + +#: include/user.php:249 +msgid "An error occurred creating your default profile. Please try again." +msgstr "" + +#: include/user.php:399 +#, php-format +msgid "" +"\n" +"\t\tDear %1$s,\n" +"\t\t\tThank you for registering at %2$s. Your account is pending for " +"approval by the administrator.\n" +"\t" +msgstr "" + +#: include/user.php:409 +#, php-format +msgid "Registration at %s" +msgstr "" + +#: include/user.php:419 +#, php-format +msgid "" +"\n" +"\t\tDear %1$s,\n" +"\t\t\tThank you for registering at %2$s. Your account has been created.\n" +"\t" +msgstr "" + +#: include/user.php:423 +#, php-format +msgid "" +"\n" +"\t\tThe login details are as follows:\n" +"\t\t\tSite Location:\t%3$s\n" +"\t\t\tLogin Name:\t%1$s\n" +"\t\t\tPassword:\t%5$s\n" +"\n" +"\t\tYou may change your password from your account \"Settings\" page after " +"logging\n" +"\t\tin.\n" +"\n" +"\t\tPlease take a few moments to review the other account settings on that " +"page.\n" +"\n" +"\t\tYou may also wish to add some basic information to your default profile\n" +"\t\t(on the \"Profiles\" page) so that other people can easily find you.\n" +"\n" +"\t\tWe recommend setting your full name, adding a profile photo,\n" +"\t\tadding some profile \"keywords\" (very useful in making new friends) - " +"and\n" +"\t\tperhaps what country you live in; if you do not wish to be more " +"specific\n" +"\t\tthan that.\n" +"\n" +"\t\tWe fully respect your right to privacy, and none of these items are " +"necessary.\n" +"\t\tIf you are new and do not know anybody here, they may help\n" +"\t\tyou to make some new and interesting friends.\n" +"\n" +"\n" +"\t\tThank you and welcome to %2$s." +msgstr "" + +#: include/user.php:455 mod/admin.php:1400 +#, php-format +msgid "Registration details for %s" msgstr "" #: mod/api.php:78 mod/api.php:104 @@ -3132,17 +3130,17 @@ msgid "" "and/or create new posts for you?" msgstr "" -#: mod/api.php:108 mod/dfrn_request.php:880 mod/follow.php:115 -#: mod/profiles.php:643 mod/profiles.php:647 mod/profiles.php:673 -#: mod/register.php:249 mod/settings.php:1172 mod/settings.php:1178 -#: mod/settings.php:1185 mod/settings.php:1189 mod/settings.php:1194 -#: mod/settings.php:1199 mod/settings.php:1204 mod/settings.php:1209 -#: mod/settings.php:1235 mod/settings.php:1236 mod/settings.php:1237 -#: mod/settings.php:1238 mod/settings.php:1239 +#: mod/api.php:108 mod/dfrn_request.php:881 mod/follow.php:150 +#: mod/profiles.php:644 mod/profiles.php:648 mod/profiles.php:674 +#: mod/register.php:250 mod/settings.php:1173 mod/settings.php:1179 +#: mod/settings.php:1186 mod/settings.php:1190 mod/settings.php:1195 +#: mod/settings.php:1200 mod/settings.php:1205 mod/settings.php:1210 +#: mod/settings.php:1236 mod/settings.php:1237 mod/settings.php:1238 +#: mod/settings.php:1239 mod/settings.php:1240 msgid "No" msgstr "" -#: mod/apps.php:9 index.php:257 +#: mod/apps.php:9 index.php:258 msgid "You must be logged in to use addons. " msgstr "" @@ -3210,230 +3208,14 @@ msgstr "" msgid "diaspora2bb: " msgstr "" -#: mod/bookmarklet.php:43 -msgid "The post was created" -msgstr "" - -#: mod/cal.php:145 mod/display.php:347 mod/profile.php:156 -msgid "Access to this profile has been restricted." -msgstr "" - -#: mod/cal.php:273 mod/events.php:378 -msgid "View" -msgstr "" - -#: mod/cal.php:274 mod/events.php:380 -msgid "Previous" -msgstr "" - -#: mod/cal.php:275 mod/install.php:203 mod/events.php:381 -msgid "Next" -msgstr "" - -#: mod/cal.php:284 mod/events.php:390 -msgid "list" -msgstr "" - -#: mod/cal.php:294 -msgid "User not found" -msgstr "" - -#: mod/cal.php:310 -msgid "This calendar format is not supported" -msgstr "" - -#: mod/cal.php:312 -msgid "No exportable data found" -msgstr "" - -#: mod/cal.php:327 -msgid "calendar" -msgstr "" - #: mod/common.php:93 msgid "No contacts in common." msgstr "" -#: mod/common.php:143 mod/contacts.php:876 +#: mod/common.php:143 mod/contacts.php:883 msgid "Common Friends" msgstr "" -#: mod/content.php:120 mod/network.php:490 -msgid "No such group" -msgstr "" - -#: mod/content.php:131 mod/group.php:214 mod/network.php:517 -msgid "Group is empty" -msgstr "" - -#: mod/content.php:136 mod/network.php:521 -#, php-format -msgid "Group: %s" -msgstr "" - -#: mod/content.php:326 object/Item.php:96 -msgid "This entry was edited" -msgstr "" - -#: mod/content.php:622 object/Item.php:416 -#, php-format -msgid "%d comment" -msgid_plural "%d comments" -msgstr[0] "" -msgstr[1] "" - -#: mod/content.php:639 mod/photos.php:1431 object/Item.php:117 -msgid "Private Message" -msgstr "" - -#: mod/content.php:703 mod/photos.php:1627 object/Item.php:270 -msgid "I like this (toggle)" -msgstr "" - -#: mod/content.php:703 object/Item.php:270 -msgid "like" -msgstr "" - -#: mod/content.php:704 mod/photos.php:1628 object/Item.php:271 -msgid "I don't like this (toggle)" -msgstr "" - -#: mod/content.php:704 object/Item.php:271 -msgid "dislike" -msgstr "" - -#: mod/content.php:706 object/Item.php:274 -msgid "Share this" -msgstr "" - -#: mod/content.php:706 object/Item.php:274 -msgid "share" -msgstr "" - -#: mod/content.php:726 mod/photos.php:1645 mod/photos.php:1687 -#: mod/photos.php:1767 object/Item.php:701 -msgid "This is you" -msgstr "" - -#: mod/content.php:728 mod/content.php:951 mod/photos.php:1647 -#: mod/photos.php:1689 mod/photos.php:1769 object/Item.php:388 -#: object/Item.php:703 -msgid "Comment" -msgstr "" - -#: mod/content.php:729 mod/crepair.php:159 mod/fsuggest.php:109 -#: mod/install.php:244 mod/install.php:284 mod/localtime.php:46 -#: mod/manage.php:156 mod/message.php:340 mod/message.php:523 mod/mood.php:139 -#: mod/photos.php:1143 mod/photos.php:1273 mod/photos.php:1599 -#: mod/photos.php:1648 mod/photos.php:1690 mod/photos.php:1770 mod/poke.php:204 -#: mod/events.php:508 mod/profiles.php:684 mod/contacts.php:588 -#: mod/invite.php:149 object/Item.php:704 view/theme/duepuntozero/config.php:64 -#: view/theme/frio/config.php:67 view/theme/quattro/config.php:70 -#: view/theme/vier/config.php:113 -msgid "Submit" -msgstr "" - -#: mod/content.php:730 object/Item.php:705 -msgid "Bold" -msgstr "" - -#: mod/content.php:731 object/Item.php:706 -msgid "Italic" -msgstr "" - -#: mod/content.php:732 object/Item.php:707 -msgid "Underline" -msgstr "" - -#: mod/content.php:733 object/Item.php:708 -msgid "Quote" -msgstr "" - -#: mod/content.php:734 object/Item.php:709 -msgid "Code" -msgstr "" - -#: mod/content.php:735 object/Item.php:710 -msgid "Image" -msgstr "" - -#: mod/content.php:736 object/Item.php:711 -msgid "Link" -msgstr "" - -#: mod/content.php:737 object/Item.php:712 -msgid "Video" -msgstr "" - -#: mod/content.php:747 mod/settings.php:744 object/Item.php:122 -#: object/Item.php:124 -msgid "Edit" -msgstr "" - -#: mod/content.php:773 object/Item.php:237 -msgid "add star" -msgstr "" - -#: mod/content.php:774 object/Item.php:238 -msgid "remove star" -msgstr "" - -#: mod/content.php:775 object/Item.php:239 -msgid "toggle star status" -msgstr "" - -#: mod/content.php:778 object/Item.php:242 -msgid "starred" -msgstr "" - -#: mod/content.php:779 mod/content.php:801 object/Item.php:259 -msgid "add tag" -msgstr "" - -#: mod/content.php:790 object/Item.php:247 -msgid "ignore thread" -msgstr "" - -#: mod/content.php:791 object/Item.php:248 -msgid "unignore thread" -msgstr "" - -#: mod/content.php:792 object/Item.php:249 -msgid "toggle ignore status" -msgstr "" - -#: mod/content.php:795 mod/ostatus_subscribe.php:75 object/Item.php:252 -msgid "ignored" -msgstr "" - -#: mod/content.php:806 object/Item.php:141 -msgid "save to folder" -msgstr "" - -#: mod/content.php:854 object/Item.php:211 -msgid "I will attend" -msgstr "" - -#: mod/content.php:854 object/Item.php:211 -msgid "I will not attend" -msgstr "" - -#: mod/content.php:854 object/Item.php:211 -msgid "I might attend" -msgstr "" - -#: mod/content.php:918 object/Item.php:354 -msgid "to" -msgstr "" - -#: mod/content.php:919 object/Item.php:356 -msgid "Wall-to-Wall" -msgstr "" - -#: mod/content.php:920 object/Item.php:357 -msgid "via Wall-To-Wall:" -msgstr "" - #: mod/credits.php:19 msgid "Credits" msgstr "" @@ -3453,8 +3235,8 @@ msgstr "" msgid "Contact update failed." msgstr "" -#: mod/crepair.php:119 mod/dfrn_confirm.php:128 mod/fsuggest.php:22 -#: mod/fsuggest.php:94 +#: mod/crepair.php:119 mod/fsuggest.php:22 mod/fsuggest.php:94 +#: mod/dfrn_confirm.php:129 msgid "Contact not found." msgstr "" @@ -3490,6 +3272,18 @@ msgstr "" msgid "Refetch contact data" msgstr "" +#: mod/crepair.php:159 mod/fsuggest.php:109 mod/contacts.php:595 +#: mod/content.php:730 mod/events.php:509 mod/install.php:245 +#: mod/install.php:285 mod/invite.php:150 mod/localtime.php:47 +#: mod/manage.php:157 mod/message.php:338 mod/message.php:521 mod/mood.php:140 +#: mod/photos.php:1144 mod/photos.php:1274 mod/photos.php:1600 +#: mod/photos.php:1649 mod/photos.php:1691 mod/photos.php:1771 mod/poke.php:205 +#: mod/profiles.php:685 object/Item.php:697 +#: view/theme/duepuntozero/config.php:65 view/theme/frio/config.php:68 +#: view/theme/quattro/config.php:71 view/theme/vier/config.php:114 +msgid "Submit" +msgstr "" + #: mod/crepair.php:161 msgid "Remote Self" msgstr "" @@ -3504,8 +3298,8 @@ msgid "" "entries from this contact." msgstr "" -#: mod/crepair.php:170 mod/settings.php:684 mod/settings.php:710 -#: mod/admin.php:1580 mod/admin.php:1593 mod/admin.php:1606 mod/admin.php:1622 +#: mod/crepair.php:170 mod/admin.php:1582 mod/admin.php:1595 mod/admin.php:1608 +#: mod/admin.php:1624 mod/settings.php:685 mod/settings.php:711 msgid "Name" msgstr "" @@ -3541,208 +3335,10 @@ msgstr "" msgid "New photo from this URL" msgstr "" -#: mod/delegate.php:103 -msgid "No potential page delegates located." -msgstr "" - -#: mod/delegate.php:134 -msgid "" -"Delegates are able to manage all aspects of this account/page except for " -"basic account settings. Please do not delegate your personal account to " -"anybody that you do not trust completely." -msgstr "" - -#: mod/delegate.php:135 -msgid "Existing Page Managers" -msgstr "" - -#: mod/delegate.php:137 -msgid "Existing Page Delegates" -msgstr "" - -#: mod/delegate.php:139 -msgid "Potential Delegates" -msgstr "" - -#: mod/delegate.php:141 mod/tagrm.php:97 -msgid "Remove" -msgstr "" - -#: mod/delegate.php:142 -msgid "Add" -msgstr "" - -#: mod/delegate.php:143 -msgid "No entries." -msgstr "" - -#: mod/dfrn_confirm.php:72 mod/profiles.php:23 mod/profiles.php:139 -#: mod/profiles.php:186 mod/profiles.php:622 -msgid "Profile not found." -msgstr "" - -#: mod/dfrn_confirm.php:129 -msgid "" -"This may occasionally happen if contact was requested by both persons and it " -"has already been approved." -msgstr "" - -#: mod/dfrn_confirm.php:246 -msgid "Response from remote site was not understood." -msgstr "" - -#: mod/dfrn_confirm.php:255 mod/dfrn_confirm.php:260 -msgid "Unexpected response from remote site: " -msgstr "" - -#: mod/dfrn_confirm.php:269 -msgid "Confirmation completed successfully." -msgstr "" - -#: mod/dfrn_confirm.php:271 mod/dfrn_confirm.php:285 mod/dfrn_confirm.php:292 -msgid "Remote site reported: " -msgstr "" - -#: mod/dfrn_confirm.php:283 -msgid "Temporary failure. Please wait and try again." -msgstr "" - -#: mod/dfrn_confirm.php:290 -msgid "Introduction failed or was revoked." -msgstr "" - -#: mod/dfrn_confirm.php:420 -msgid "Unable to set contact photo." -msgstr "" - -#: mod/dfrn_confirm.php:561 -#, php-format -msgid "No user record found for '%s' " -msgstr "" - -#: mod/dfrn_confirm.php:571 -msgid "Our site encryption key is apparently messed up." -msgstr "" - -#: mod/dfrn_confirm.php:582 -msgid "Empty site URL was provided or URL could not be decrypted by us." -msgstr "" - -#: mod/dfrn_confirm.php:604 -msgid "Contact record was not found for you on our site." -msgstr "" - -#: mod/dfrn_confirm.php:618 -#, php-format -msgid "Site public key not available in contact record for URL %s." -msgstr "" - -#: mod/dfrn_confirm.php:638 -msgid "" -"The ID provided by your system is a duplicate on our system. It should work " -"if you try again." -msgstr "" - -#: mod/dfrn_confirm.php:649 -msgid "Unable to set your contact credentials on our system." -msgstr "" - -#: mod/dfrn_confirm.php:711 -msgid "Unable to update your contact profile details on our system" -msgstr "" - -#: mod/dfrn_confirm.php:783 -#, php-format -msgid "%1$s has joined %2$s" -msgstr "" - -#: mod/directory.php:33 mod/photos.php:981 mod/videos.php:200 -#: mod/viewcontacts.php:39 mod/webfinger.php:10 mod/dfrn_request.php:804 -#: mod/probe.php:9 mod/search.php:96 mod/search.php:102 mod/community.php:17 -#: mod/display.php:217 -msgid "Public access denied." -msgstr "" - -#: mod/directory.php:195 view/theme/vier/theme.php:193 -msgid "Global Directory" -msgstr "" - -#: mod/directory.php:197 -msgid "Find on this site" -msgstr "" - -#: mod/directory.php:199 -msgid "Results for:" -msgstr "" - -#: mod/directory.php:201 -msgid "Site Directory" -msgstr "" - -#: mod/directory.php:208 -msgid "No entries (some entries may be hidden)." -msgstr "" - -#: mod/editpost.php:19 mod/editpost.php:29 -msgid "Item not found" -msgstr "" - -#: mod/editpost.php:34 -msgid "Edit post" -msgstr "" - -#: mod/fbrowser.php:134 -msgid "Files" -msgstr "" - #: mod/filer.php:31 msgid "- select -" msgstr "" -#: mod/friendica.php:69 -msgid "This is Friendica, version" -msgstr "" - -#: mod/friendica.php:70 -msgid "running at web location" -msgstr "" - -#: mod/friendica.php:74 -msgid "" -"Please visit Friendica.com to learn " -"more about the Friendica project." -msgstr "" - -#: mod/friendica.php:78 -msgid "Bug reports and issues: please visit" -msgstr "" - -#: mod/friendica.php:78 -msgid "the bugtracker at github" -msgstr "" - -#: mod/friendica.php:81 -msgid "" -"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - " -"dot com" -msgstr "" - -#: mod/friendica.php:95 -msgid "Installed plugins/addons/apps:" -msgstr "" - -#: mod/friendica.php:109 -msgid "No installed plugins/addons/apps" -msgstr "" - -#: mod/friendica.php:114 -msgid "On this server the following remote servers are blocked." -msgstr "" - -#: mod/friendica.php:115 mod/admin.php:289 mod/admin.php:307 -msgid "Reason for the block" -msgstr "" - #: mod/fsuggest.php:65 msgid "Friend suggestion sent." msgstr "" @@ -3756,452 +3352,6 @@ msgstr "" msgid "Suggest a friend for %s" msgstr "" -#: mod/group.php:30 -msgid "Group created." -msgstr "" - -#: mod/group.php:36 -msgid "Could not create group." -msgstr "" - -#: mod/group.php:50 mod/group.php:155 -msgid "Group not found." -msgstr "" - -#: mod/group.php:64 -msgid "Group name changed." -msgstr "" - -#: mod/group.php:77 mod/profperm.php:22 index.php:409 -msgid "Permission denied" -msgstr "" - -#: mod/group.php:94 -msgid "Save Group" -msgstr "" - -#: mod/group.php:99 -msgid "Create a group of contacts/friends." -msgstr "" - -#: mod/group.php:124 -msgid "Group removed." -msgstr "" - -#: mod/group.php:126 -msgid "Unable to remove group." -msgstr "" - -#: mod/group.php:190 -msgid "Delete Group" -msgstr "" - -#: mod/group.php:196 -msgid "Group Editor" -msgstr "" - -#: mod/group.php:201 -msgid "Edit Group Name" -msgstr "" - -#: mod/group.php:211 -msgid "Members" -msgstr "" - -#: mod/group.php:213 mod/contacts.php:705 -msgid "All Contacts" -msgstr "" - -#: mod/group.php:227 -msgid "Remove Contact" -msgstr "" - -#: mod/group.php:251 -msgid "Add Contact" -msgstr "" - -#: mod/group.php:263 mod/profperm.php:109 -msgid "Click on a contact to add or remove." -msgstr "" - -#: mod/hcard.php:13 -msgid "No profile" -msgstr "" - -#: mod/home.php:41 -#, php-format -msgid "Welcome to %s" -msgstr "" - -#: mod/install.php:108 -msgid "Friendica Communications Server - Setup" -msgstr "" - -#: mod/install.php:114 -msgid "Could not connect to database." -msgstr "" - -#: mod/install.php:118 -msgid "Could not create table." -msgstr "" - -#: mod/install.php:124 -msgid "Your Friendica site database has been installed." -msgstr "" - -#: mod/install.php:129 -msgid "" -"You may need to import the file \"database.sql\" manually using phpmyadmin " -"or mysql." -msgstr "" - -#: mod/install.php:130 mod/install.php:202 mod/install.php:549 -msgid "Please see the file \"INSTALL.txt\"." -msgstr "" - -#: mod/install.php:142 -msgid "Database already in use." -msgstr "" - -#: mod/install.php:199 -msgid "System check" -msgstr "" - -#: mod/install.php:204 -msgid "Check again" -msgstr "" - -#: mod/install.php:223 -msgid "Database connection" -msgstr "" - -#: mod/install.php:224 -msgid "" -"In order to install Friendica we need to know how to connect to your " -"database." -msgstr "" - -#: mod/install.php:225 -msgid "" -"Please contact your hosting provider or site administrator if you have " -"questions about these settings." -msgstr "" - -#: mod/install.php:226 -msgid "" -"The database you specify below should already exist. If it does not, please " -"create it before continuing." -msgstr "" - -#: mod/install.php:230 -msgid "Database Server Name" -msgstr "" - -#: mod/install.php:231 -msgid "Database Login Name" -msgstr "" - -#: mod/install.php:232 -msgid "Database Login Password" -msgstr "" - -#: mod/install.php:232 -msgid "For security reasons the password must not be empty" -msgstr "" - -#: mod/install.php:233 -msgid "Database Name" -msgstr "" - -#: mod/install.php:234 mod/install.php:275 -msgid "Site administrator email address" -msgstr "" - -#: mod/install.php:234 mod/install.php:275 -msgid "" -"Your account email address must match this in order to use the web admin " -"panel." -msgstr "" - -#: mod/install.php:238 mod/install.php:278 -msgid "Please select a default timezone for your website" -msgstr "" - -#: mod/install.php:265 -msgid "Site settings" -msgstr "" - -#: mod/install.php:279 -msgid "System Language:" -msgstr "" - -#: mod/install.php:279 -msgid "" -"Set the default language for your Friendica installation interface and to " -"send emails." -msgstr "" - -#: mod/install.php:319 -msgid "Could not find a command line version of PHP in the web server PATH." -msgstr "" - -#: mod/install.php:320 -msgid "" -"If you don't have a command line version of PHP installed on server, you " -"will not be able to run the background processing. See 'Setup the poller'" -msgstr "" - -#: mod/install.php:324 -msgid "PHP executable path" -msgstr "" - -#: mod/install.php:324 -msgid "" -"Enter full path to php executable. You can leave this blank to continue the " -"installation." -msgstr "" - -#: mod/install.php:329 -msgid "Command line PHP" -msgstr "" - -#: mod/install.php:338 -msgid "PHP executable is not the php cli binary (could be cgi-fgci version)" -msgstr "" - -#: mod/install.php:339 -msgid "Found PHP version: " -msgstr "" - -#: mod/install.php:341 -msgid "PHP cli binary" -msgstr "" - -#: mod/install.php:352 -msgid "" -"The command line version of PHP on your system does not have " -"\"register_argc_argv\" enabled." -msgstr "" - -#: mod/install.php:353 -msgid "This is required for message delivery to work." -msgstr "" - -#: mod/install.php:355 -msgid "PHP register_argc_argv" -msgstr "" - -#: mod/install.php:378 -msgid "" -"Error: the \"openssl_pkey_new\" function on this system is not able to " -"generate encryption keys" -msgstr "" - -#: mod/install.php:379 -msgid "" -"If running under Windows, please see \"http://www.php.net/manual/en/openssl." -"installation.php\"." -msgstr "" - -#: mod/install.php:381 -msgid "Generate encryption keys" -msgstr "" - -#: mod/install.php:388 -msgid "libCurl PHP module" -msgstr "" - -#: mod/install.php:389 -msgid "GD graphics PHP module" -msgstr "" - -#: mod/install.php:390 -msgid "OpenSSL PHP module" -msgstr "" - -#: mod/install.php:391 -msgid "PDO or MySQLi PHP module" -msgstr "" - -#: mod/install.php:392 -msgid "mb_string PHP module" -msgstr "" - -#: mod/install.php:393 -msgid "XML PHP module" -msgstr "" - -#: mod/install.php:394 -msgid "iconv module" -msgstr "" - -#: mod/install.php:398 mod/install.php:400 -msgid "Apache mod_rewrite module" -msgstr "" - -#: mod/install.php:398 -msgid "" -"Error: Apache webserver mod-rewrite module is required but not installed." -msgstr "" - -#: mod/install.php:406 -msgid "Error: libCURL PHP module required but not installed." -msgstr "" - -#: mod/install.php:410 -msgid "" -"Error: GD graphics PHP module with JPEG support required but not installed." -msgstr "" - -#: mod/install.php:414 -msgid "Error: openssl PHP module required but not installed." -msgstr "" - -#: mod/install.php:418 -msgid "Error: PDO or MySQLi PHP module required but not installed." -msgstr "" - -#: mod/install.php:422 -msgid "Error: The MySQL driver for PDO is not installed." -msgstr "" - -#: mod/install.php:426 -msgid "Error: mb_string PHP module required but not installed." -msgstr "" - -#: mod/install.php:430 -msgid "Error: iconv PHP module required but not installed." -msgstr "" - -#: mod/install.php:440 -msgid "Error, XML PHP module required but not installed." -msgstr "" - -#: mod/install.php:452 -msgid "" -"The web installer needs to be able to create a file called \".htconfig.php\" " -"in the top folder of your web server and it is unable to do so." -msgstr "" - -#: mod/install.php:453 -msgid "" -"This is most often a permission setting, as the web server may not be able " -"to write files in your folder - even if you can." -msgstr "" - -#: mod/install.php:454 -msgid "" -"At the end of this procedure, we will give you a text to save in a file " -"named .htconfig.php in your Friendica top folder." -msgstr "" - -#: mod/install.php:455 -msgid "" -"You can alternatively skip this procedure and perform a manual installation. " -"Please see the file \"INSTALL.txt\" for instructions." -msgstr "" - -#: mod/install.php:458 -msgid ".htconfig.php is writable" -msgstr "" - -#: mod/install.php:468 -msgid "" -"Friendica uses the Smarty3 template engine to render its web views. Smarty3 " -"compiles templates to PHP to speed up rendering." -msgstr "" - -#: mod/install.php:469 -msgid "" -"In order to store these compiled templates, the web server needs to have " -"write access to the directory view/smarty3/ under the Friendica top level " -"folder." -msgstr "" - -#: mod/install.php:470 -msgid "" -"Please ensure that the user that your web server runs as (e.g. www-data) has " -"write access to this folder." -msgstr "" - -#: mod/install.php:471 -msgid "" -"Note: as a security measure, you should give the web server write access to " -"view/smarty3/ only--not the template files (.tpl) that it contains." -msgstr "" - -#: mod/install.php:474 -msgid "view/smarty3 is writable" -msgstr "" - -#: mod/install.php:490 -msgid "" -"Url rewrite in .htaccess is not working. Check your server configuration." -msgstr "" - -#: mod/install.php:492 -msgid "Url rewrite is working" -msgstr "" - -#: mod/install.php:511 -msgid "ImageMagick PHP extension is not installed" -msgstr "" - -#: mod/install.php:513 -msgid "ImageMagick PHP extension is installed" -msgstr "" - -#: mod/install.php:515 -msgid "ImageMagick supports GIF" -msgstr "" - -#: mod/install.php:522 -msgid "" -"The database configuration file \".htconfig.php\" could not be written. " -"Please use the enclosed text to create a configuration file in your web " -"server root." -msgstr "" - -#: mod/install.php:547 -msgid "

    What next

    " -msgstr "" - -#: mod/install.php:548 -msgid "" -"IMPORTANT: You will need to [manually] setup a scheduled task for the poller." -msgstr "" - -#: mod/localtime.php:25 -msgid "Time Conversion" -msgstr "" - -#: mod/localtime.php:27 -msgid "" -"Friendica provides this service for sharing events with other networks and " -"friends in unknown timezones." -msgstr "" - -#: mod/localtime.php:31 -#, php-format -msgid "UTC time: %s" -msgstr "" - -#: mod/localtime.php:34 -#, php-format -msgid "Current timezone: %s" -msgstr "" - -#: mod/localtime.php:37 -#, php-format -msgid "Converted localtime: %s" -msgstr "" - -#: mod/localtime.php:42 -msgid "Please select your timezone:" -msgstr "" - #: mod/lockview.php:33 mod/lockview.php:41 msgid "Remote privacy information not available." msgstr "" @@ -4210,279 +3360,10 @@ msgstr "" msgid "Visible to:" msgstr "" -#: mod/lostpass.php:21 -msgid "No valid account found." -msgstr "" - -#: mod/lostpass.php:37 -msgid "Password reset request issued. Check your email." -msgstr "" - -#: mod/lostpass.php:43 -#, php-format -msgid "" -"\n" -"\t\tDear %1$s,\n" -"\t\t\tA request was recently received at \"%2$s\" to reset your account\n" -"\t\tpassword. In order to confirm this request, please select the " -"verification link\n" -"\t\tbelow or paste it into your web browser address bar.\n" -"\n" -"\t\tIf you did NOT request this change, please DO NOT follow the link\n" -"\t\tprovided and ignore and/or delete this email.\n" -"\n" -"\t\tYour password will not be changed unless we can verify that you\n" -"\t\tissued this request." -msgstr "" - -#: mod/lostpass.php:54 -#, php-format -msgid "" -"\n" -"\t\tFollow this link to verify your identity:\n" -"\n" -"\t\t%1$s\n" -"\n" -"\t\tYou will then receive a follow-up message containing the new password.\n" -"\t\tYou may change that password from your account settings page after " -"logging in.\n" -"\n" -"\t\tThe login details are as follows:\n" -"\n" -"\t\tSite Location:\t%2$s\n" -"\t\tLogin Name:\t%3$s" -msgstr "" - -#: mod/lostpass.php:73 -#, php-format -msgid "Password reset requested at %s" -msgstr "" - -#: mod/lostpass.php:93 -msgid "" -"Request could not be verified. (You may have previously submitted it.) " -"Password reset failed." -msgstr "" - -#: mod/lostpass.php:112 boot.php:886 -msgid "Password Reset" -msgstr "" - -#: mod/lostpass.php:113 -msgid "Your password has been reset as requested." -msgstr "" - -#: mod/lostpass.php:114 -msgid "Your new password is" -msgstr "" - -#: mod/lostpass.php:115 -msgid "Save or copy your new password - and then" -msgstr "" - -#: mod/lostpass.php:116 -msgid "click here to login" -msgstr "" - -#: mod/lostpass.php:117 -msgid "" -"Your password may be changed from the Settings page after " -"successful login." -msgstr "" - -#: mod/lostpass.php:127 -#, php-format -msgid "" -"\n" -"\t\t\t\tDear %1$s,\n" -"\t\t\t\t\tYour password has been changed as requested. Please retain this\n" -"\t\t\t\tinformation for your records (or change your password immediately " -"to\n" -"\t\t\t\tsomething that you will remember).\n" -"\t\t\t" -msgstr "" - -#: mod/lostpass.php:133 -#, php-format -msgid "" -"\n" -"\t\t\t\tYour login details are as follows:\n" -"\n" -"\t\t\t\tSite Location:\t%1$s\n" -"\t\t\t\tLogin Name:\t%2$s\n" -"\t\t\t\tPassword:\t%3$s\n" -"\n" -"\t\t\t\tYou may change that password from your account settings page after " -"logging in.\n" -"\t\t\t" -msgstr "" - -#: mod/lostpass.php:149 -#, php-format -msgid "Your password has been changed at %s" -msgstr "" - -#: mod/lostpass.php:161 -msgid "Forgot your Password?" -msgstr "" - -#: mod/lostpass.php:162 -msgid "" -"Enter your email address and submit to have your password reset. Then check " -"your email for further instructions." -msgstr "" - -#: mod/lostpass.php:163 boot.php:874 -msgid "Nickname or Email: " -msgstr "" - -#: mod/lostpass.php:164 -msgid "Reset" -msgstr "" - #: mod/maintenance.php:21 msgid "System down for maintenance" msgstr "" -#: mod/manage.php:152 -msgid "Manage Identities and/or Pages" -msgstr "" - -#: mod/manage.php:153 -msgid "" -"Toggle between different identities or community/group pages which share " -"your account details or which you have been granted \"manage\" permissions" -msgstr "" - -#: mod/manage.php:154 -msgid "Select an identity to manage: " -msgstr "" - -#: mod/match.php:38 -msgid "No keywords to match. Please add keywords to your default profile." -msgstr "" - -#: mod/match.php:91 -msgid "is interested in:" -msgstr "" - -#: mod/match.php:105 -msgid "Profile Match" -msgstr "" - -#: mod/match.php:112 mod/dirfind.php:247 -msgid "No matches" -msgstr "" - -#: mod/message.php:62 mod/wallmessage.php:52 -msgid "No recipient selected." -msgstr "" - -#: mod/message.php:66 -msgid "Unable to locate contact information." -msgstr "" - -#: mod/message.php:69 mod/wallmessage.php:58 -msgid "Message could not be sent." -msgstr "" - -#: mod/message.php:72 mod/wallmessage.php:61 -msgid "Message collection failure." -msgstr "" - -#: mod/message.php:75 mod/wallmessage.php:64 -msgid "Message sent." -msgstr "" - -#: mod/message.php:206 -msgid "Do you really want to delete this message?" -msgstr "" - -#: mod/message.php:226 -msgid "Message deleted." -msgstr "" - -#: mod/message.php:257 -msgid "Conversation removed." -msgstr "" - -#: mod/message.php:324 mod/wallmessage.php:128 -msgid "Send Private Message" -msgstr "" - -#: mod/message.php:325 mod/message.php:512 mod/wallmessage.php:130 -msgid "To:" -msgstr "" - -#: mod/message.php:330 mod/message.php:514 mod/wallmessage.php:131 -msgid "Subject:" -msgstr "" - -#: mod/message.php:334 mod/message.php:517 mod/wallmessage.php:137 -#: mod/invite.php:143 -msgid "Your message:" -msgstr "" - -#: mod/message.php:366 -msgid "No messages." -msgstr "" - -#: mod/message.php:405 -msgid "Message not available." -msgstr "" - -#: mod/message.php:479 -msgid "Delete message" -msgstr "" - -#: mod/message.php:505 mod/message.php:593 -msgid "Delete conversation" -msgstr "" - -#: mod/message.php:507 -msgid "" -"No secure communications available. You may be able to " -"respond from the sender's profile page." -msgstr "" - -#: mod/message.php:511 -msgid "Send Reply" -msgstr "" - -#: mod/message.php:563 -#, php-format -msgid "Unknown sender - %s" -msgstr "" - -#: mod/message.php:565 -#, php-format -msgid "You and %s" -msgstr "" - -#: mod/message.php:567 -#, php-format -msgid "%s and You" -msgstr "" - -#: mod/message.php:596 -msgid "D, d M Y - g:i A" -msgstr "" - -#: mod/message.php:599 -#, php-format -msgid "%d message" -msgid_plural "%d messages" -msgstr[0] "" -msgstr[1] "" - -#: mod/mood.php:135 -msgid "Mood" -msgstr "" - -#: mod/mood.php:136 -msgid "Set your current mood and tell your friends" -msgstr "" - #: mod/newmember.php:7 msgid "Welcome to Friendica" msgstr "" @@ -4533,7 +3414,7 @@ msgid "" "potential friends know exactly how to find you." msgstr "" -#: mod/newmember.php:22 mod/profile_photo.php:255 mod/profiles.php:703 +#: mod/newmember.php:22 mod/profile_photo.php:256 mod/profiles.php:704 msgid "Upload Profile Photo" msgstr "" @@ -4652,13 +3533,13 @@ msgid "" "features and resources." msgstr "" -#: mod/nogroup.php:45 mod/viewcontacts.php:105 mod/contacts.php:599 -#: mod/contacts.php:943 +#: mod/nogroup.php:45 mod/viewcontacts.php:105 mod/contacts.php:606 +#: mod/contacts.php:950 #, php-format msgid "Visit %s's profile [%s]" msgstr "" -#: mod/nogroup.php:46 mod/contacts.php:944 +#: mod/nogroup.php:46 mod/contacts.php:951 msgid "Edit contact" msgstr "" @@ -4666,413 +3547,8 @@ msgstr "" msgid "Contacts who are not members of a group" msgstr "" -#: mod/notifications.php:37 -msgid "Invalid request identifier." -msgstr "" - -#: mod/notifications.php:46 mod/notifications.php:182 mod/notifications.php:229 -msgid "Discard" -msgstr "" - -#: mod/notifications.php:62 mod/notifications.php:181 mod/notifications.php:265 -#: mod/contacts.php:619 mod/contacts.php:819 mod/contacts.php:1004 -msgid "Ignore" -msgstr "" - -#: mod/notifications.php:107 -msgid "Network Notifications" -msgstr "" - -#: mod/notifications.php:113 mod/notify.php:72 -msgid "System Notifications" -msgstr "" - -#: mod/notifications.php:119 -msgid "Personal Notifications" -msgstr "" - -#: mod/notifications.php:125 -msgid "Home Notifications" -msgstr "" - -#: mod/notifications.php:154 -msgid "Show Ignored Requests" -msgstr "" - -#: mod/notifications.php:154 -msgid "Hide Ignored Requests" -msgstr "" - -#: mod/notifications.php:166 mod/notifications.php:236 -msgid "Notification type: " -msgstr "" - -#: mod/notifications.php:169 -#, php-format -msgid "suggested by %s" -msgstr "" - -#: mod/notifications.php:174 mod/notifications.php:253 mod/contacts.php:626 -msgid "Hide this contact from others" -msgstr "" - -#: mod/notifications.php:175 mod/notifications.php:254 -msgid "Post a new friend activity" -msgstr "" - -#: mod/notifications.php:175 mod/notifications.php:254 -msgid "if applicable" -msgstr "" - -#: mod/notifications.php:178 mod/notifications.php:263 mod/admin.php:1596 -msgid "Approve" -msgstr "" - -#: mod/notifications.php:197 -msgid "Claims to be known to you: " -msgstr "" - -#: mod/notifications.php:198 -msgid "yes" -msgstr "" - -#: mod/notifications.php:198 -msgid "no" -msgstr "" - -#: mod/notifications.php:199 mod/notifications.php:204 -msgid "Shall your connection be bidirectional or not?" -msgstr "" - -#: mod/notifications.php:200 mod/notifications.php:205 -#, php-format -msgid "" -"Accepting %s as a friend allows %s to subscribe to your posts, and you will " -"also receive updates from them in your news feed." -msgstr "" - -#: mod/notifications.php:201 -#, php-format -msgid "" -"Accepting %s as a subscriber allows them to subscribe to your posts, but you " -"will not receive updates from them in your news feed." -msgstr "" - -#: mod/notifications.php:206 -#, php-format -msgid "" -"Accepting %s as a sharer allows them to subscribe to your posts, but you " -"will not receive updates from them in your news feed." -msgstr "" - -#: mod/notifications.php:217 -msgid "Friend" -msgstr "" - -#: mod/notifications.php:218 -msgid "Sharer" -msgstr "" - -#: mod/notifications.php:218 -msgid "Subscriber" -msgstr "" - -#: mod/notifications.php:257 mod/follow.php:131 mod/contacts.php:637 -msgid "Profile URL" -msgstr "" - -#: mod/notifications.php:274 -msgid "No introductions." -msgstr "" - -#: mod/notifications.php:315 -msgid "Show unread" -msgstr "" - -#: mod/notifications.php:315 -msgid "Show all" -msgstr "" - -#: mod/notifications.php:321 -#, php-format -msgid "No more %s notifications." -msgstr "" - -#: mod/notify.php:68 -msgid "No more system notifications." -msgstr "" - -#: mod/oexchange.php:24 -msgid "Post successful." -msgstr "" - -#: mod/openid.php:24 -msgid "OpenID protocol error. No ID returned." -msgstr "" - -#: mod/openid.php:60 -msgid "" -"Account not found and OpenID registration is not permitted on this site." -msgstr "" - -#: mod/ostatus_subscribe.php:16 -msgid "Subscribing to OStatus contacts" -msgstr "" - -#: mod/ostatus_subscribe.php:27 -msgid "No contact provided." -msgstr "" - -#: mod/ostatus_subscribe.php:33 -msgid "Couldn't fetch information for contact." -msgstr "" - -#: mod/ostatus_subscribe.php:42 -msgid "Couldn't fetch friends for contact." -msgstr "" - -#: mod/ostatus_subscribe.php:56 mod/repair_ostatus.php:46 -msgid "Done" -msgstr "" - -#: mod/ostatus_subscribe.php:70 -msgid "success" -msgstr "" - -#: mod/ostatus_subscribe.php:72 -msgid "failed" -msgstr "" - -#: mod/ostatus_subscribe.php:80 mod/repair_ostatus.php:52 -msgid "Keep this window open until done." -msgstr "" - -#: mod/p.php:12 -msgid "Not Extended" -msgstr "" - -#: mod/p.php:19 mod/p.php:46 mod/p.php:55 mod/fetch.php:15 mod/fetch.php:42 -#: mod/fetch.php:51 mod/help.php:56 index.php:301 -msgid "Not Found" -msgstr "" - -#: mod/photos.php:96 mod/photos.php:1902 -msgid "Recent Photos" -msgstr "" - -#: mod/photos.php:99 mod/photos.php:1330 mod/photos.php:1904 -msgid "Upload New Photos" -msgstr "" - -#: mod/photos.php:114 mod/settings.php:38 -msgid "everybody" -msgstr "" - -#: mod/photos.php:178 -msgid "Contact information unavailable" -msgstr "" - -#: mod/photos.php:199 -msgid "Album not found." -msgstr "" - -#: mod/photos.php:232 mod/photos.php:244 mod/photos.php:1274 -msgid "Delete Album" -msgstr "" - -#: mod/photos.php:242 -msgid "Do you really want to delete this photo album and all its photos?" -msgstr "" - -#: mod/photos.php:325 mod/photos.php:336 mod/photos.php:1600 -msgid "Delete Photo" -msgstr "" - -#: mod/photos.php:334 -msgid "Do you really want to delete this photo?" -msgstr "" - -#: mod/photos.php:715 -#, php-format -msgid "%1$s was tagged in %2$s by %3$s" -msgstr "" - -#: mod/photos.php:715 -msgid "a photo" -msgstr "" - -#: mod/photos.php:815 mod/wall_upload.php:181 mod/profile_photo.php:155 -#, php-format -msgid "Image exceeds size limit of %s" -msgstr "" - -#: mod/photos.php:823 -msgid "Image file is empty." -msgstr "" - -#: mod/photos.php:856 mod/wall_upload.php:218 mod/profile_photo.php:164 -msgid "Unable to process image." -msgstr "" - -#: mod/photos.php:885 mod/wall_upload.php:257 mod/profile_photo.php:314 -msgid "Image upload failed." -msgstr "" - -#: mod/photos.php:990 -msgid "No photos selected" -msgstr "" - -#: mod/photos.php:1093 mod/videos.php:311 -msgid "Access to this item is restricted." -msgstr "" - -#: mod/photos.php:1153 -#, php-format -msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage." -msgstr "" - -#: mod/photos.php:1190 -msgid "Upload Photos" -msgstr "" - -#: mod/photos.php:1194 mod/photos.php:1269 -msgid "New album name: " -msgstr "" - -#: mod/photos.php:1195 -msgid "or existing album name: " -msgstr "" - -#: mod/photos.php:1196 -msgid "Do not show a status post for this upload" -msgstr "" - -#: mod/photos.php:1207 mod/photos.php:1604 mod/settings.php:1308 -msgid "Show to Groups" -msgstr "" - -#: mod/photos.php:1208 mod/photos.php:1605 mod/settings.php:1309 -msgid "Show to Contacts" -msgstr "" - -#: mod/photos.php:1209 -msgid "Private Photo" -msgstr "" - -#: mod/photos.php:1210 -msgid "Public Photo" -msgstr "" - -#: mod/photos.php:1280 -msgid "Edit Album" -msgstr "" - -#: mod/photos.php:1285 -msgid "Show Newest First" -msgstr "" - -#: mod/photos.php:1287 -msgid "Show Oldest First" -msgstr "" - -#: mod/photos.php:1316 mod/photos.php:1887 -msgid "View Photo" -msgstr "" - -#: mod/photos.php:1361 -msgid "Permission denied. Access to this item may be restricted." -msgstr "" - -#: mod/photos.php:1363 -msgid "Photo not available" -msgstr "" - -#: mod/photos.php:1424 -msgid "View photo" -msgstr "" - -#: mod/photos.php:1424 -msgid "Edit photo" -msgstr "" - -#: mod/photos.php:1425 -msgid "Use as profile photo" -msgstr "" - -#: mod/photos.php:1450 -msgid "View Full Size" -msgstr "" - -#: mod/photos.php:1540 -msgid "Tags: " -msgstr "" - -#: mod/photos.php:1543 -msgid "[Remove any tag]" -msgstr "" - -#: mod/photos.php:1586 -msgid "New album name" -msgstr "" - -#: mod/photos.php:1587 -msgid "Caption" -msgstr "" - -#: mod/photos.php:1588 -msgid "Add a Tag" -msgstr "" - -#: mod/photos.php:1588 -msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping" -msgstr "" - -#: mod/photos.php:1589 -msgid "Do not rotate" -msgstr "" - -#: mod/photos.php:1590 -msgid "Rotate CW (right)" -msgstr "" - -#: mod/photos.php:1591 -msgid "Rotate CCW (left)" -msgstr "" - -#: mod/photos.php:1606 -msgid "Private photo" -msgstr "" - -#: mod/photos.php:1607 -msgid "Public photo" -msgstr "" - -#: mod/photos.php:1816 -msgid "Map" -msgstr "" - -#: mod/photos.php:1893 mod/videos.php:395 -msgid "View Album" -msgstr "" - -#: mod/poke.php:197 -msgid "Poke/Prod" -msgstr "" - -#: mod/poke.php:198 -msgid "poke, prod or do other things to somebody" -msgstr "" - -#: mod/poke.php:199 -msgid "Recipient" -msgstr "" - -#: mod/poke.php:200 -msgid "Choose what you wish to do to recipient" -msgstr "" - -#: mod/poke.php:203 -msgid "Make this post private" +#: mod/profperm.php:22 mod/group.php:78 index.php:410 +msgid "Permission denied" msgstr "" #: mod/profperm.php:28 mod/profperm.php:59 @@ -5083,6 +3559,10 @@ msgstr "" msgid "Profile Visibility Editor" msgstr "" +#: mod/profperm.php:109 mod/group.php:264 +msgid "Click on a contact to add or remove." +msgstr "" + #: mod/profperm.php:118 msgid "Visible To" msgstr "" @@ -5091,107 +3571,16 @@ msgstr "" msgid "All Contacts (with secure profile access)" msgstr "" -#: mod/removeme.php:54 mod/removeme.php:57 -msgid "Remove My Account" -msgstr "" - -#: mod/removeme.php:55 -msgid "" -"This will completely remove your account. Once this has been done it is not " -"recoverable." -msgstr "" - -#: mod/removeme.php:56 -msgid "Please enter your password for verification:" -msgstr "" - -#: mod/repair_ostatus.php:16 -msgid "Resubscribing to OStatus contacts" -msgstr "" - -#: mod/repair_ostatus.php:32 -msgid "Error" -msgstr "" - -#: mod/subthread.php:105 -#, php-format -msgid "%1$s is following %2$s's %3$s" -msgstr "" - -#: mod/suggest.php:29 -msgid "Do you really want to delete this suggestion?" -msgstr "" - -#: mod/suggest.php:73 -msgid "" -"No suggestions available. If this is a new site, please try again in 24 " -"hours." -msgstr "" - -#: mod/suggest.php:86 mod/suggest.php:106 -msgid "Ignore/Hide" -msgstr "" - -#: mod/tagrm.php:45 -msgid "Tag removed" -msgstr "" - -#: mod/tagrm.php:84 -msgid "Remove Item Tag" -msgstr "" - -#: mod/tagrm.php:86 -msgid "Select a tag to remove: " -msgstr "" - -#: mod/uexport.php:38 -msgid "Export account" -msgstr "" - -#: mod/uexport.php:38 -msgid "" -"Export your account info and contacts. Use this to make a backup of your " -"account and/or to move it to another server." -msgstr "" - -#: mod/uexport.php:39 -msgid "Export all" -msgstr "" - -#: mod/uexport.php:39 -msgid "" -"Export your accout info, contacts and all your items as json. Could be a " -"very big file, and could take a lot of time. Use this to make a full backup " -"of your account (photos are not exported)" -msgstr "" - -#: mod/uexport.php:46 mod/settings.php:97 -msgid "Export personal data" -msgstr "" - #: mod/update_community.php:21 mod/update_display.php:25 #: mod/update_notes.php:38 mod/update_profile.php:37 mod/update_network.php:29 msgid "[Embedded content - reload page to view]" msgstr "" -#: mod/videos.php:126 -msgid "Do you really want to delete this video?" -msgstr "" - -#: mod/videos.php:131 -msgid "Delete Video" -msgstr "" - -#: mod/videos.php:210 -msgid "No videos selected" -msgstr "" - -#: mod/videos.php:404 -msgid "Recent Videos" -msgstr "" - -#: mod/videos.php:406 -msgid "Upload New Videos" +#: mod/viewcontacts.php:39 mod/webfinger.php:10 mod/probe.php:9 +#: mod/search.php:96 mod/search.php:102 mod/community.php:17 +#: mod/dfrn_request.php:805 mod/directory.php:33 mod/display.php:218 +#: mod/photos.php:982 mod/videos.php:201 +msgid "Public access denied." msgstr "" #: mod/viewcontacts.php:78 @@ -5203,8 +3592,8 @@ msgid "Access denied." msgstr "" #: mod/wall_attach.php:19 mod/wall_attach.php:27 mod/wall_attach.php:78 -#: mod/wall_upload.php:36 mod/wall_upload.php:52 mod/wall_upload.php:110 -#: mod/wall_upload.php:150 mod/wall_upload.php:153 +#: mod/wall_upload.php:37 mod/wall_upload.php:53 mod/wall_upload.php:111 +#: mod/wall_upload.php:151 mod/wall_upload.php:154 msgid "Invalid request." msgstr "" @@ -5225,50 +3614,17 @@ msgstr "" msgid "File upload failed." msgstr "" -#: mod/wallmessage.php:44 mod/wallmessage.php:108 -#, php-format -msgid "Number of daily wall messages for %s exceeded. Message failed." -msgstr "" - -#: mod/wallmessage.php:55 -msgid "Unable to check your home location." -msgstr "" - -#: mod/wallmessage.php:82 mod/wallmessage.php:91 -msgid "No recipient." -msgstr "" - -#: mod/wallmessage.php:129 -#, php-format -msgid "" -"If you wish for %s to respond, please check that the privacy settings on " -"your site allow private mail from unknown senders." -msgstr "" - #: mod/webfinger.php:11 mod/probe.php:10 msgid "Only logged in users are permitted to perform a probing." msgstr "" -#: mod/regmod.php:60 -msgid "Account approved." -msgstr "" - -#: mod/regmod.php:88 -#, php-format -msgid "Registration revoked for %s" -msgstr "" - -#: mod/regmod.php:100 -msgid "Please login." -msgstr "" - -#: mod/uimport.php:53 mod/register.php:201 +#: mod/uimport.php:53 mod/register.php:202 msgid "" "This site has exceeded the number of allowed daily account registrations. " "Please try again tomorrow." msgstr "" -#: mod/uimport.php:68 mod/register.php:298 +#: mod/uimport.php:68 mod/register.php:299 msgid "Import" msgstr "" @@ -5303,737 +3659,7 @@ msgid "" "select \"Export account\"" msgstr "" -#: mod/dfrn_request.php:103 -msgid "This introduction has already been accepted." -msgstr "" - -#: mod/dfrn_request.php:126 mod/dfrn_request.php:528 -msgid "Profile location is not valid or does not contain profile information." -msgstr "" - -#: mod/dfrn_request.php:131 mod/dfrn_request.php:533 -msgid "Warning: profile location has no identifiable owner name." -msgstr "" - -#: mod/dfrn_request.php:134 mod/dfrn_request.php:536 -msgid "Warning: profile location has no profile photo." -msgstr "" - -#: mod/dfrn_request.php:138 mod/dfrn_request.php:540 -#, php-format -msgid "%d required parameter was not found at the given location" -msgid_plural "%d required parameters were not found at the given location" -msgstr[0] "" -msgstr[1] "" - -#: mod/dfrn_request.php:182 -msgid "Introduction complete." -msgstr "" - -#: mod/dfrn_request.php:227 -msgid "Unrecoverable protocol error." -msgstr "" - -#: mod/dfrn_request.php:255 -msgid "Profile unavailable." -msgstr "" - -#: mod/dfrn_request.php:282 -#, php-format -msgid "%s has received too many connection requests today." -msgstr "" - -#: mod/dfrn_request.php:283 -msgid "Spam protection measures have been invoked." -msgstr "" - -#: mod/dfrn_request.php:284 -msgid "Friends are advised to please try again in 24 hours." -msgstr "" - -#: mod/dfrn_request.php:346 -msgid "Invalid locator" -msgstr "" - -#: mod/dfrn_request.php:355 -msgid "Invalid email address." -msgstr "" - -#: mod/dfrn_request.php:380 -msgid "This account has not been configured for email. Request failed." -msgstr "" - -#: mod/dfrn_request.php:483 -msgid "You have already introduced yourself here." -msgstr "" - -#: mod/dfrn_request.php:487 -#, php-format -msgid "Apparently you are already friends with %s." -msgstr "" - -#: mod/dfrn_request.php:508 -msgid "Invalid profile URL." -msgstr "" - -#: mod/dfrn_request.php:593 mod/contacts.php:221 -msgid "Failed to update contact record." -msgstr "" - -#: mod/dfrn_request.php:614 -msgid "Your introduction has been sent." -msgstr "" - -#: mod/dfrn_request.php:656 -msgid "" -"Remote subscription can't be done for your network. Please subscribe " -"directly on your system." -msgstr "" - -#: mod/dfrn_request.php:677 -msgid "Please login to confirm introduction." -msgstr "" - -#: mod/dfrn_request.php:687 -msgid "" -"Incorrect identity currently logged in. Please login to this profile." -msgstr "" - -#: mod/dfrn_request.php:701 mod/dfrn_request.php:718 -msgid "Confirm" -msgstr "" - -#: mod/dfrn_request.php:713 -msgid "Hide this contact" -msgstr "" - -#: mod/dfrn_request.php:716 -#, php-format -msgid "Welcome home %s." -msgstr "" - -#: mod/dfrn_request.php:717 -#, php-format -msgid "Please confirm your introduction/connection request to %s." -msgstr "" - -#: mod/dfrn_request.php:848 -msgid "" -"Please enter your 'Identity Address' from one of the following supported " -"communications networks:" -msgstr "" - -#: mod/dfrn_request.php:872 -#, php-format -msgid "" -"If you are not yet a member of the free social web, follow this link to find a public Friendica site and join us today." -msgstr "" - -#: mod/dfrn_request.php:877 -msgid "Friend/Connection Request" -msgstr "" - -#: mod/dfrn_request.php:878 -msgid "" -"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, " -"testuser@identi.ca" -msgstr "" - -#: mod/dfrn_request.php:879 mod/follow.php:114 -msgid "Please answer the following:" -msgstr "" - -#: mod/dfrn_request.php:880 mod/follow.php:115 -#, php-format -msgid "Does %s know you?" -msgstr "" - -#: mod/dfrn_request.php:884 mod/follow.php:116 -msgid "Add a personal note:" -msgstr "" - -#: mod/dfrn_request.php:887 -msgid "StatusNet/Federated Social Web" -msgstr "" - -#: mod/dfrn_request.php:889 -#, php-format -msgid "" -" - please do not use this form. Instead, enter %s into your Diaspora search " -"bar." -msgstr "" - -#: mod/dfrn_request.php:890 mod/follow.php:122 -msgid "Your Identity Address:" -msgstr "" - -#: mod/dfrn_request.php:893 mod/follow.php:21 -msgid "Submit Request" -msgstr "" - -#: mod/dirfind.php:39 -#, php-format -msgid "People Search - %s" -msgstr "" - -#: mod/dirfind.php:50 -#, php-format -msgid "Forum Search - %s" -msgstr "" - -#: mod/events.php:96 mod/events.php:98 -msgid "Event can not end before it has started." -msgstr "" - -#: mod/events.php:105 mod/events.php:107 -msgid "Event title and start time are required." -msgstr "" - -#: mod/events.php:379 -msgid "Create New Event" -msgstr "" - -#: mod/events.php:484 -msgid "Event details" -msgstr "" - -#: mod/events.php:485 -msgid "Starting date and Title are required." -msgstr "" - -#: mod/events.php:486 mod/events.php:487 -msgid "Event Starts:" -msgstr "" - -#: mod/events.php:486 mod/events.php:498 mod/profiles.php:712 -msgid "Required" -msgstr "" - -#: mod/events.php:488 mod/events.php:504 -msgid "Finish date/time is not known or not relevant" -msgstr "" - -#: mod/events.php:490 mod/events.php:491 -msgid "Event Finishes:" -msgstr "" - -#: mod/events.php:492 mod/events.php:505 -msgid "Adjust for viewer timezone" -msgstr "" - -#: mod/events.php:494 -msgid "Description:" -msgstr "" - -#: mod/events.php:498 mod/events.php:500 -msgid "Title:" -msgstr "" - -#: mod/events.php:501 mod/events.php:502 -msgid "Share this event" -msgstr "" - -#: mod/events.php:531 -msgid "Failed to remove event" -msgstr "" - -#: mod/events.php:533 -msgid "Event removed" -msgstr "" - -#: mod/follow.php:32 -msgid "You already added this contact." -msgstr "" - -#: mod/follow.php:41 -msgid "Diaspora support isn't enabled. Contact can't be added." -msgstr "" - -#: mod/follow.php:48 -msgid "OStatus support is disabled. Contact can't be added." -msgstr "" - -#: mod/follow.php:55 -msgid "The network type couldn't be detected. Contact can't be added." -msgstr "" - -#: mod/follow.php:188 -msgid "Contact added" -msgstr "" - -#: mod/ping.php:274 -msgid "{0} wants to be your friend" -msgstr "" - -#: mod/ping.php:289 -msgid "{0} sent you a message" -msgstr "" - -#: mod/ping.php:304 -msgid "{0} requested registration" -msgstr "" - -#: mod/profile_photo.php:44 -msgid "Image uploaded but image cropping failed." -msgstr "" - -#: mod/profile_photo.php:77 mod/profile_photo.php:85 mod/profile_photo.php:93 -#: mod/profile_photo.php:322 -#, php-format -msgid "Image size reduction [%s] failed." -msgstr "" - -#: mod/profile_photo.php:127 -msgid "" -"Shift-reload the page or clear browser cache if the new photo does not " -"display immediately." -msgstr "" - -#: mod/profile_photo.php:136 -msgid "Unable to process image" -msgstr "" - -#: mod/profile_photo.php:253 -msgid "Upload File:" -msgstr "" - -#: mod/profile_photo.php:254 -msgid "Select a profile:" -msgstr "" - -#: mod/profile_photo.php:256 -msgid "Upload" -msgstr "" - -#: mod/profile_photo.php:259 -msgid "or" -msgstr "" - -#: mod/profile_photo.php:259 -msgid "skip this step" -msgstr "" - -#: mod/profile_photo.php:259 -msgid "select a photo from your photo albums" -msgstr "" - -#: mod/profile_photo.php:273 -msgid "Crop Image" -msgstr "" - -#: mod/profile_photo.php:274 -msgid "Please adjust the image cropping for optimum viewing." -msgstr "" - -#: mod/profile_photo.php:276 -msgid "Done Editing" -msgstr "" - -#: mod/profile_photo.php:312 -msgid "Image uploaded successfully." -msgstr "" - -#: mod/profiles.php:42 -msgid "Profile deleted." -msgstr "" - -#: mod/profiles.php:58 mod/profiles.php:94 -msgid "Profile-" -msgstr "" - -#: mod/profiles.php:77 mod/profiles.php:122 -msgid "New profile created." -msgstr "" - -#: mod/profiles.php:100 -msgid "Profile unavailable to clone." -msgstr "" - -#: mod/profiles.php:196 -msgid "Profile Name is required." -msgstr "" - -#: mod/profiles.php:336 -msgid "Marital Status" -msgstr "" - -#: mod/profiles.php:340 -msgid "Romantic Partner" -msgstr "" - -#: mod/profiles.php:352 -msgid "Work/Employment" -msgstr "" - -#: mod/profiles.php:355 -msgid "Religion" -msgstr "" - -#: mod/profiles.php:359 -msgid "Political Views" -msgstr "" - -#: mod/profiles.php:363 -msgid "Gender" -msgstr "" - -#: mod/profiles.php:367 -msgid "Sexual Preference" -msgstr "" - -#: mod/profiles.php:371 -msgid "XMPP" -msgstr "" - -#: mod/profiles.php:375 -msgid "Homepage" -msgstr "" - -#: mod/profiles.php:379 mod/profiles.php:698 -msgid "Interests" -msgstr "" - -#: mod/profiles.php:383 -msgid "Address" -msgstr "" - -#: mod/profiles.php:390 mod/profiles.php:694 -msgid "Location" -msgstr "" - -#: mod/profiles.php:475 -msgid "Profile updated." -msgstr "" - -#: mod/profiles.php:567 -msgid " and " -msgstr "" - -#: mod/profiles.php:576 -msgid "public profile" -msgstr "" - -#: mod/profiles.php:579 -#, php-format -msgid "%1$s changed %2$s to “%3$s”" -msgstr "" - -#: mod/profiles.php:580 -#, php-format -msgid " - Visit %1$s's %2$s" -msgstr "" - -#: mod/profiles.php:582 -#, php-format -msgid "%1$s has an updated %2$s, changing %3$s." -msgstr "" - -#: mod/profiles.php:640 -msgid "Hide contacts and friends:" -msgstr "" - -#: mod/profiles.php:645 -msgid "Hide your contact/friend list from viewers of this profile?" -msgstr "" - -#: mod/profiles.php:670 -msgid "Show more profile fields:" -msgstr "" - -#: mod/profiles.php:682 -msgid "Profile Actions" -msgstr "" - -#: mod/profiles.php:683 -msgid "Edit Profile Details" -msgstr "" - -#: mod/profiles.php:685 -msgid "Change Profile Photo" -msgstr "" - -#: mod/profiles.php:686 -msgid "View this profile" -msgstr "" - -#: mod/profiles.php:688 -msgid "Create a new profile using these settings" -msgstr "" - -#: mod/profiles.php:689 -msgid "Clone this profile" -msgstr "" - -#: mod/profiles.php:690 -msgid "Delete this profile" -msgstr "" - -#: mod/profiles.php:692 -msgid "Basic information" -msgstr "" - -#: mod/profiles.php:693 -msgid "Profile picture" -msgstr "" - -#: mod/profiles.php:695 -msgid "Preferences" -msgstr "" - -#: mod/profiles.php:696 -msgid "Status information" -msgstr "" - -#: mod/profiles.php:697 -msgid "Additional information" -msgstr "" - -#: mod/profiles.php:700 -msgid "Relation" -msgstr "" - -#: mod/profiles.php:704 -msgid "Your Gender:" -msgstr "" - -#: mod/profiles.php:705 -msgid " Marital Status:" -msgstr "" - -#: mod/profiles.php:707 -msgid "Example: fishing photography software" -msgstr "" - -#: mod/profiles.php:712 -msgid "Profile Name:" -msgstr "" - -#: mod/profiles.php:714 -msgid "" -"This is your public profile.
    It may " -"be visible to anybody using the internet." -msgstr "" - -#: mod/profiles.php:715 -msgid "Your Full Name:" -msgstr "" - -#: mod/profiles.php:716 -msgid "Title/Description:" -msgstr "" - -#: mod/profiles.php:719 -msgid "Street Address:" -msgstr "" - -#: mod/profiles.php:720 -msgid "Locality/City:" -msgstr "" - -#: mod/profiles.php:721 -msgid "Region/State:" -msgstr "" - -#: mod/profiles.php:722 -msgid "Postal/Zip Code:" -msgstr "" - -#: mod/profiles.php:723 -msgid "Country:" -msgstr "" - -#: mod/profiles.php:727 -msgid "Who: (if applicable)" -msgstr "" - -#: mod/profiles.php:727 -msgid "Examples: cathy123, Cathy Williams, cathy@example.com" -msgstr "" - -#: mod/profiles.php:728 -msgid "Since [date]:" -msgstr "" - -#: mod/profiles.php:730 -msgid "Tell us about yourself..." -msgstr "" - -#: mod/profiles.php:731 -msgid "XMPP (Jabber) address:" -msgstr "" - -#: mod/profiles.php:731 -msgid "" -"The XMPP address will be propagated to your contacts so that they can follow " -"you." -msgstr "" - -#: mod/profiles.php:732 -msgid "Homepage URL:" -msgstr "" - -#: mod/profiles.php:735 -msgid "Religious Views:" -msgstr "" - -#: mod/profiles.php:736 -msgid "Public Keywords:" -msgstr "" - -#: mod/profiles.php:736 -msgid "(Used for suggesting potential friends, can be seen by others)" -msgstr "" - -#: mod/profiles.php:737 -msgid "Private Keywords:" -msgstr "" - -#: mod/profiles.php:737 -msgid "(Used for searching profiles, never shown to others)" -msgstr "" - -#: mod/profiles.php:740 -msgid "Musical interests" -msgstr "" - -#: mod/profiles.php:741 -msgid "Books, literature" -msgstr "" - -#: mod/profiles.php:742 -msgid "Television" -msgstr "" - -#: mod/profiles.php:743 -msgid "Film/dance/culture/entertainment" -msgstr "" - -#: mod/profiles.php:744 -msgid "Hobbies/Interests" -msgstr "" - -#: mod/profiles.php:745 -msgid "Love/romance" -msgstr "" - -#: mod/profiles.php:746 -msgid "Work/employment" -msgstr "" - -#: mod/profiles.php:747 -msgid "School/education" -msgstr "" - -#: mod/profiles.php:748 -msgid "Contact information and Social Networks" -msgstr "" - -#: mod/profiles.php:789 -msgid "Edit/Manage Profiles" -msgstr "" - -#: mod/register.php:96 -msgid "" -"Registration successful. Please check your email for further instructions." -msgstr "" - -#: mod/register.php:101 -#, php-format -msgid "" -"Failed to send email message. Here your accout details:
    login: %s
    " -"password: %s

    You can change your password after login." -msgstr "" - -#: mod/register.php:108 -msgid "Registration successful." -msgstr "" - -#: mod/register.php:114 -msgid "Your registration can not be processed." -msgstr "" - -#: mod/register.php:163 -msgid "Your registration is pending approval by the site owner." -msgstr "" - -#: mod/register.php:229 -msgid "" -"You may (optionally) fill in this form via OpenID by supplying your OpenID " -"and clicking 'Register'." -msgstr "" - -#: mod/register.php:230 -msgid "" -"If you are not familiar with OpenID, please leave that field blank and fill " -"in the rest of the items." -msgstr "" - -#: mod/register.php:231 -msgid "Your OpenID (optional): " -msgstr "" - -#: mod/register.php:245 -msgid "Include your profile in member directory?" -msgstr "" - -#: mod/register.php:270 -msgid "Note for the admin" -msgstr "" - -#: mod/register.php:270 -msgid "Leave a message for the admin, why you want to join this node" -msgstr "" - -#: mod/register.php:271 -msgid "Membership on this site is by invitation only." -msgstr "" - -#: mod/register.php:272 -msgid "Your invitation ID: " -msgstr "" - -#: mod/register.php:275 mod/admin.php:1146 -msgid "Registration" -msgstr "" - -#: mod/register.php:283 -msgid "Your Full Name (e.g. Joe Smith, real or real-looking): " -msgstr "" - -#: mod/register.php:284 -msgid "Your Email Address: " -msgstr "" - -#: mod/register.php:286 mod/settings.php:1279 -msgid "New Password:" -msgstr "" - -#: mod/register.php:286 -msgid "Leave empty for an auto generated password." -msgstr "" - -#: mod/register.php:287 mod/settings.php:1280 -msgid "Confirm:" -msgstr "" - -#: mod/register.php:288 -msgid "" -"Choose a profile nickname. This must begin with a text character. Your " -"profile address on this site will then be 'nickname@$sitename'." -msgstr "" - -#: mod/register.php:289 -msgid "Choose a nickname: " -msgstr "" - -#: mod/register.php:299 -msgid "Import your profile to this friendica instance" -msgstr "" - -#: mod/search.php:28 mod/network.php:200 +#: mod/search.php:28 mod/network.php:187 msgid "Remove term" msgstr "" @@ -6058,1448 +3684,253 @@ msgstr "" msgid "Items tagged with: %s" msgstr "" -#: mod/search.php:230 mod/contacts.php:810 mod/network.php:154 +#: mod/search.php:230 mod/contacts.php:817 #, php-format msgid "Results for: %s" msgstr "" -#: mod/contacts.php:137 -#, php-format -msgid "%d contact edited." -msgid_plural "%d contacts edited." -msgstr[0] "" -msgstr[1] "" - -#: mod/contacts.php:172 mod/contacts.php:381 -msgid "Could not access contact record." -msgstr "" - -#: mod/contacts.php:186 -msgid "Could not locate selected profile." -msgstr "" - -#: mod/contacts.php:219 -msgid "Contact updated." -msgstr "" - -#: mod/contacts.php:402 -msgid "Contact has been blocked" -msgstr "" - -#: mod/contacts.php:402 -msgid "Contact has been unblocked" -msgstr "" - -#: mod/contacts.php:413 -msgid "Contact has been ignored" -msgstr "" - -#: mod/contacts.php:413 -msgid "Contact has been unignored" -msgstr "" - -#: mod/contacts.php:425 -msgid "Contact has been archived" -msgstr "" - -#: mod/contacts.php:425 -msgid "Contact has been unarchived" -msgstr "" - -#: mod/contacts.php:450 -msgid "Drop contact" -msgstr "" - -#: mod/contacts.php:453 mod/contacts.php:814 -msgid "Do you really want to delete this contact?" -msgstr "" - -#: mod/contacts.php:472 -msgid "Contact has been removed." -msgstr "" - -#: mod/contacts.php:509 -#, php-format -msgid "You are mutual friends with %s" -msgstr "" - -#: mod/contacts.php:513 -#, php-format -msgid "You are sharing with %s" -msgstr "" - -#: mod/contacts.php:518 -#, php-format -msgid "%s is sharing with you" -msgstr "" - -#: mod/contacts.php:538 -msgid "Private communications are not available for this contact." -msgstr "" - -#: mod/contacts.php:541 mod/admin.php:1068 -msgid "Never" -msgstr "" - -#: mod/contacts.php:545 -msgid "(Update was successful)" -msgstr "" - -#: mod/contacts.php:545 -msgid "(Update was not successful)" -msgstr "" - -#: mod/contacts.php:547 mod/contacts.php:977 -msgid "Suggest friends" -msgstr "" - -#: mod/contacts.php:551 -#, php-format -msgid "Network type: %s" -msgstr "" - -#: mod/contacts.php:564 -msgid "Communications lost with this contact!" -msgstr "" - -#: mod/contacts.php:567 -msgid "Fetch further information for feeds" -msgstr "" - -#: mod/contacts.php:568 mod/admin.php:1077 -msgid "Disabled" -msgstr "" - -#: mod/contacts.php:568 -msgid "Fetch information" -msgstr "" - -#: mod/contacts.php:568 -msgid "Fetch information and keywords" -msgstr "" - -#: mod/contacts.php:586 -msgid "Contact" -msgstr "" - -#: mod/contacts.php:589 -msgid "Profile Visibility" -msgstr "" - -#: mod/contacts.php:590 -#, php-format -msgid "" -"Please choose the profile you would like to display to %s when viewing your " -"profile securely." -msgstr "" - -#: mod/contacts.php:591 -msgid "Contact Information / Notes" -msgstr "" - -#: mod/contacts.php:592 -msgid "Their personal note" -msgstr "" - -#: mod/contacts.php:594 -msgid "Edit contact notes" -msgstr "" - -#: mod/contacts.php:600 -msgid "Block/Unblock contact" -msgstr "" - -#: mod/contacts.php:601 -msgid "Ignore contact" -msgstr "" - -#: mod/contacts.php:602 -msgid "Repair URL settings" -msgstr "" - -#: mod/contacts.php:603 -msgid "View conversations" -msgstr "" - -#: mod/contacts.php:609 -msgid "Last update:" -msgstr "" - -#: mod/contacts.php:611 -msgid "Update public posts" -msgstr "" - -#: mod/contacts.php:613 mod/contacts.php:987 -msgid "Update now" -msgstr "" - -#: mod/contacts.php:618 mod/contacts.php:818 mod/contacts.php:996 -#: mod/admin.php:1600 -msgid "Unblock" -msgstr "" - -#: mod/contacts.php:618 mod/contacts.php:818 mod/contacts.php:996 -#: mod/admin.php:1599 -msgid "Block" -msgstr "" - -#: mod/contacts.php:619 mod/contacts.php:819 mod/contacts.php:1004 -msgid "Unignore" -msgstr "" - -#: mod/contacts.php:623 -msgid "Currently blocked" -msgstr "" - -#: mod/contacts.php:624 -msgid "Currently ignored" -msgstr "" - -#: mod/contacts.php:625 -msgid "Currently archived" -msgstr "" - -#: mod/contacts.php:626 -msgid "" -"Replies/likes to your public posts may still be visible" -msgstr "" - -#: mod/contacts.php:627 -msgid "Notification for new posts" -msgstr "" - -#: mod/contacts.php:627 -msgid "Send a notification of every new post of this contact" -msgstr "" - -#: mod/contacts.php:630 -msgid "Blacklisted keywords" -msgstr "" - -#: mod/contacts.php:630 -msgid "" -"Comma separated list of keywords that should not be converted to hashtags, " -"when \"Fetch information and keywords\" is selected" -msgstr "" - -#: mod/contacts.php:648 -msgid "Actions" -msgstr "" - -#: mod/contacts.php:651 -msgid "Contact Settings" -msgstr "" - -#: mod/contacts.php:697 -msgid "Suggestions" -msgstr "" - -#: mod/contacts.php:700 -msgid "Suggest potential friends" -msgstr "" - -#: mod/contacts.php:708 -msgid "Show all contacts" -msgstr "" - -#: mod/contacts.php:713 -msgid "Unblocked" -msgstr "" - -#: mod/contacts.php:716 -msgid "Only show unblocked contacts" -msgstr "" - -#: mod/contacts.php:722 -msgid "Blocked" -msgstr "" - -#: mod/contacts.php:725 -msgid "Only show blocked contacts" -msgstr "" - -#: mod/contacts.php:731 -msgid "Ignored" -msgstr "" - -#: mod/contacts.php:734 -msgid "Only show ignored contacts" -msgstr "" - -#: mod/contacts.php:740 -msgid "Archived" -msgstr "" - -#: mod/contacts.php:743 -msgid "Only show archived contacts" -msgstr "" - -#: mod/contacts.php:749 -msgid "Hidden" -msgstr "" - -#: mod/contacts.php:752 -msgid "Only show hidden contacts" -msgstr "" - -#: mod/contacts.php:809 -msgid "Search your contacts" -msgstr "" - -#: mod/contacts.php:817 mod/settings.php:162 mod/settings.php:708 -msgid "Update" -msgstr "" - -#: mod/contacts.php:820 mod/contacts.php:1012 -msgid "Archive" -msgstr "" - -#: mod/contacts.php:820 mod/contacts.php:1012 -msgid "Unarchive" -msgstr "" - -#: mod/contacts.php:823 -msgid "Batch Actions" -msgstr "" - -#: mod/contacts.php:869 -msgid "View all contacts" -msgstr "" - -#: mod/contacts.php:879 -msgid "View all common friends" -msgstr "" - -#: mod/contacts.php:886 -msgid "Advanced Contact Settings" -msgstr "" - -#: mod/contacts.php:920 -msgid "Mutual Friendship" -msgstr "" - -#: mod/contacts.php:924 -msgid "is a fan of yours" -msgstr "" - -#: mod/contacts.php:928 -msgid "you are a fan of" -msgstr "" - -#: mod/contacts.php:998 -msgid "Toggle Blocked status" -msgstr "" - -#: mod/contacts.php:1006 -msgid "Toggle Ignored status" -msgstr "" - -#: mod/contacts.php:1014 -msgid "Toggle Archive status" -msgstr "" - -#: mod/contacts.php:1022 -msgid "Delete contact" -msgstr "" - -#: mod/help.php:44 -msgid "Help:" -msgstr "" - -#: mod/help.php:59 index.php:304 -msgid "Page not found." -msgstr "" - -#: mod/invite.php:30 -msgid "Total invitation limit exceeded." -msgstr "" - -#: mod/invite.php:53 -#, php-format -msgid "%s : Not a valid email address." -msgstr "" - -#: mod/invite.php:78 -msgid "Please join us on Friendica" -msgstr "" - -#: mod/invite.php:89 -msgid "Invitation limit exceeded. Please contact your site administrator." -msgstr "" - -#: mod/invite.php:93 -#, php-format -msgid "%s : Message delivery failed." -msgstr "" - -#: mod/invite.php:97 -#, php-format -msgid "%d message sent." -msgid_plural "%d messages sent." -msgstr[0] "" -msgstr[1] "" - -#: mod/invite.php:116 -msgid "You have no more invitations available" -msgstr "" - -#: mod/invite.php:124 -#, php-format -msgid "" -"Visit %s for a list of public sites that you can join. Friendica members on " -"other sites can all connect with each other, as well as with members of many " -"other social networks." -msgstr "" - -#: mod/invite.php:126 -#, php-format -msgid "" -"To accept this invitation, please visit and register at %s or any other " -"public Friendica website." -msgstr "" - -#: mod/invite.php:127 -#, php-format -msgid "" -"Friendica sites all inter-connect to create a huge privacy-enhanced social " -"web that is owned and controlled by its members. They can also connect with " -"many traditional social networks. See %s for a list of alternate Friendica " -"sites you can join." -msgstr "" - -#: mod/invite.php:131 -msgid "" -"Our apologies. This system is not currently configured to connect with other " -"public sites or invite members." -msgstr "" - -#: mod/invite.php:134 -#, php-format -msgid "To accept this invitation, please visit and register at %s." -msgstr "" - -#: mod/invite.php:135 -msgid "" -"Friendica sites all inter-connect to create a huge privacy-enhanced social " -"web that is owned and controlled by its members. They can also connect with " -"many traditional social networks." -msgstr "" - -#: mod/invite.php:141 -msgid "Send invitations" -msgstr "" - -#: mod/invite.php:142 -msgid "Enter email addresses, one per line:" -msgstr "" - -#: mod/invite.php:144 -msgid "" -"You are cordially invited to join me and other close friends on Friendica - " -"and help us to create a better social web." -msgstr "" - -#: mod/invite.php:146 -msgid "You will need to supply this invitation code: $invite_code" -msgstr "" - -#: mod/invite.php:146 -msgid "" -"Once you have registered, please connect with me via my profile page at:" -msgstr "" - -#: mod/invite.php:148 -msgid "" -"For more information about the Friendica project and why we feel it is " -"important, please visit http://friendi.ca" -msgstr "" - -#: mod/settings.php:45 mod/admin.php:1580 -msgid "Account" -msgstr "" - -#: mod/settings.php:54 mod/admin.php:174 -msgid "Additional features" -msgstr "" - -#: mod/settings.php:62 -msgid "Display" -msgstr "" - -#: mod/settings.php:69 mod/settings.php:891 -msgid "Social Networks" -msgstr "" - -#: mod/settings.php:76 mod/admin.php:172 mod/admin.php:1706 mod/admin.php:1769 -msgid "Plugins" -msgstr "" - -#: mod/settings.php:90 -msgid "Connected apps" -msgstr "" - -#: mod/settings.php:104 -msgid "Remove account" -msgstr "" - -#: mod/settings.php:159 -msgid "Missing some important data!" -msgstr "" - -#: mod/settings.php:273 -msgid "Failed to connect with email account using the settings provided." -msgstr "" - -#: mod/settings.php:278 -msgid "Email settings updated." -msgstr "" - -#: mod/settings.php:293 -msgid "Features updated" -msgstr "" - -#: mod/settings.php:363 -msgid "Relocate message has been send to your contacts" -msgstr "" - -#: mod/settings.php:382 -msgid "Empty passwords are not allowed. Password unchanged." -msgstr "" - -#: mod/settings.php:390 -msgid "Wrong password." -msgstr "" - -#: mod/settings.php:401 -msgid "Password changed." -msgstr "" - -#: mod/settings.php:403 -msgid "Password update failed. Please try again." -msgstr "" - -#: mod/settings.php:483 -msgid " Please use a shorter name." -msgstr "" - -#: mod/settings.php:485 -msgid " Name too short." -msgstr "" - -#: mod/settings.php:494 -msgid "Wrong Password" -msgstr "" - -#: mod/settings.php:499 -msgid " Not valid email." -msgstr "" - -#: mod/settings.php:505 -msgid " Cannot change to that email." -msgstr "" - -#: mod/settings.php:561 -msgid "Private forum has no privacy permissions. Using default privacy group." -msgstr "" - -#: mod/settings.php:565 -msgid "Private forum has no privacy permissions and no default privacy group." -msgstr "" - -#: mod/settings.php:605 -msgid "Settings updated." -msgstr "" - -#: mod/settings.php:681 mod/settings.php:707 mod/settings.php:743 -msgid "Add application" -msgstr "" - -#: mod/settings.php:682 mod/settings.php:793 mod/settings.php:842 -#: mod/settings.php:909 mod/settings.php:1006 mod/settings.php:1272 -#: mod/admin.php:1145 mod/admin.php:1770 mod/admin.php:2033 mod/admin.php:2107 -#: mod/admin.php:2260 -msgid "Save Settings" -msgstr "" - -#: mod/settings.php:685 mod/settings.php:711 -msgid "Consumer Key" -msgstr "" - -#: mod/settings.php:686 mod/settings.php:712 -msgid "Consumer Secret" -msgstr "" - -#: mod/settings.php:687 mod/settings.php:713 -msgid "Redirect" -msgstr "" - -#: mod/settings.php:688 mod/settings.php:714 -msgid "Icon url" -msgstr "" - -#: mod/settings.php:699 -msgid "You can't edit this application." -msgstr "" - -#: mod/settings.php:742 -msgid "Connected Apps" -msgstr "" - -#: mod/settings.php:746 -msgid "Client key starts with" -msgstr "" - -#: mod/settings.php:747 -msgid "No name" -msgstr "" - -#: mod/settings.php:748 -msgid "Remove authorization" -msgstr "" - -#: mod/settings.php:760 -msgid "No Plugin settings configured" -msgstr "" - -#: mod/settings.php:769 -msgid "Plugin Settings" -msgstr "" - -#: mod/settings.php:783 mod/admin.php:2249 mod/admin.php:2250 -msgid "Off" -msgstr "" - -#: mod/settings.php:783 mod/admin.php:2249 mod/admin.php:2250 -msgid "On" -msgstr "" - -#: mod/settings.php:791 -msgid "Additional Features" -msgstr "" - -#: mod/settings.php:801 mod/settings.php:805 -msgid "General Social Media Settings" -msgstr "" - -#: mod/settings.php:811 -msgid "Disable intelligent shortening" -msgstr "" - -#: mod/settings.php:813 -msgid "" -"Normally the system tries to find the best link to add to shortened posts. " -"If this option is enabled then every shortened post will always point to the " -"original friendica post." -msgstr "" - -#: mod/settings.php:819 -msgid "Automatically follow any GNU Social (OStatus) followers/mentioners" -msgstr "" - -#: mod/settings.php:821 -msgid "" -"If you receive a message from an unknown OStatus user, this option decides " -"what to do. If it is checked, a new contact will be created for every " -"unknown user." -msgstr "" - -#: mod/settings.php:827 -msgid "Default group for OStatus contacts" -msgstr "" - -#: mod/settings.php:835 -msgid "Your legacy GNU Social account" -msgstr "" - -#: mod/settings.php:837 -msgid "" -"If you enter your old GNU Social/Statusnet account name here (in the format " -"user@domain.tld), your contacts will be added automatically. The field will " -"be emptied when done." -msgstr "" - -#: mod/settings.php:840 -msgid "Repair OStatus subscriptions" -msgstr "" - -#: mod/settings.php:849 mod/settings.php:850 -#, php-format -msgid "Built-in support for %s connectivity is %s" -msgstr "" - -#: mod/settings.php:849 mod/settings.php:850 -msgid "enabled" -msgstr "" - -#: mod/settings.php:849 mod/settings.php:850 -msgid "disabled" -msgstr "" - -#: mod/settings.php:850 -msgid "GNU Social (OStatus)" -msgstr "" - -#: mod/settings.php:884 -msgid "Email access is disabled on this site." -msgstr "" - -#: mod/settings.php:896 -msgid "Email/Mailbox Setup" -msgstr "" - -#: mod/settings.php:897 -msgid "" -"If you wish to communicate with email contacts using this service " -"(optional), please specify how to connect to your mailbox." -msgstr "" - -#: mod/settings.php:898 -msgid "Last successful email check:" -msgstr "" - -#: mod/settings.php:900 -msgid "IMAP server name:" -msgstr "" - -#: mod/settings.php:901 -msgid "IMAP port:" -msgstr "" - -#: mod/settings.php:902 -msgid "Security:" -msgstr "" - -#: mod/settings.php:902 mod/settings.php:907 -msgid "None" -msgstr "" - -#: mod/settings.php:903 -msgid "Email login name:" -msgstr "" - -#: mod/settings.php:904 -msgid "Email password:" -msgstr "" - -#: mod/settings.php:905 -msgid "Reply-to address:" -msgstr "" - -#: mod/settings.php:906 -msgid "Send public posts to all email contacts:" -msgstr "" - -#: mod/settings.php:907 -msgid "Action after import:" -msgstr "" - -#: mod/settings.php:907 -msgid "Move to folder" -msgstr "" - -#: mod/settings.php:908 -msgid "Move to folder:" -msgstr "" - -#: mod/settings.php:944 mod/admin.php:1032 -msgid "No special theme for mobile devices" -msgstr "" - -#: mod/settings.php:1004 -msgid "Display Settings" -msgstr "" - -#: mod/settings.php:1010 mod/settings.php:1033 -msgid "Display Theme:" -msgstr "" - -#: mod/settings.php:1011 -msgid "Mobile Theme:" -msgstr "" - -#: mod/settings.php:1012 -msgid "Suppress warning of insecure networks" -msgstr "" - -#: mod/settings.php:1012 -msgid "" -"Should the system suppress the warning that the current group contains " -"members of networks that can't receive non public postings." -msgstr "" - -#: mod/settings.php:1013 -msgid "Update browser every xx seconds" -msgstr "" - -#: mod/settings.php:1013 -msgid "Minimum of 10 seconds. Enter -1 to disable it." -msgstr "" - -#: mod/settings.php:1014 -msgid "Number of items to display per page:" -msgstr "" - -#: mod/settings.php:1014 mod/settings.php:1015 -msgid "Maximum of 100 items" -msgstr "" - -#: mod/settings.php:1015 -msgid "Number of items to display per page when viewed from mobile device:" -msgstr "" - -#: mod/settings.php:1016 -msgid "Don't show emoticons" -msgstr "" - -#: mod/settings.php:1017 -msgid "Calendar" -msgstr "" - -#: mod/settings.php:1018 -msgid "Beginning of week:" -msgstr "" - -#: mod/settings.php:1019 -msgid "Don't show notices" -msgstr "" - -#: mod/settings.php:1020 -msgid "Infinite scroll" -msgstr "" - -#: mod/settings.php:1021 -msgid "Automatic updates only at the top of the network page" -msgstr "" - -#: mod/settings.php:1021 -msgid "" -"When disabled, the network page is updated all the time, which could be " -"confusing while reading." -msgstr "" - -#: mod/settings.php:1022 -msgid "Bandwith Saver Mode" -msgstr "" - -#: mod/settings.php:1022 -msgid "" -"When enabled, embedded content is not displayed on automatic updates, they " -"only show on page reload." -msgstr "" - -#: mod/settings.php:1024 -msgid "General Theme Settings" -msgstr "" - -#: mod/settings.php:1025 -msgid "Custom Theme Settings" -msgstr "" - -#: mod/settings.php:1026 -msgid "Content Settings" -msgstr "" - -#: mod/settings.php:1027 view/theme/duepuntozero/config.php:66 -#: view/theme/frio/config.php:69 view/theme/quattro/config.php:72 -#: view/theme/vier/config.php:115 -msgid "Theme settings" -msgstr "" - -#: mod/settings.php:1111 -msgid "Account Types" -msgstr "" - -#: mod/settings.php:1112 -msgid "Personal Page Subtypes" -msgstr "" - -#: mod/settings.php:1113 -msgid "Community Forum Subtypes" -msgstr "" - -#: mod/settings.php:1120 -msgid "Personal Page" -msgstr "" - -#: mod/settings.php:1121 -msgid "Account for a personal profile." -msgstr "" - -#: mod/settings.php:1124 -msgid "Organisation Page" -msgstr "" - -#: mod/settings.php:1125 -msgid "" -"Account for an organisation that automatically approves contact requests as " -"\"Followers\"." -msgstr "" - -#: mod/settings.php:1128 -msgid "News Page" -msgstr "" - -#: mod/settings.php:1129 -msgid "" -"Account for a news reflector that automatically approves contact requests as " -"\"Followers\"." -msgstr "" - -#: mod/settings.php:1132 -msgid "Community Forum" -msgstr "" - -#: mod/settings.php:1133 -msgid "Account for community discussions." -msgstr "" - -#: mod/settings.php:1136 -msgid "Normal Account Page" -msgstr "" - -#: mod/settings.php:1137 -msgid "" -"Account for a regular personal profile that requires manual approval of " -"\"Friends\" and \"Followers\"." -msgstr "" - -#: mod/settings.php:1140 -msgid "Soapbox Page" -msgstr "" - -#: mod/settings.php:1141 -msgid "" -"Account for a public profile that automatically approves contact requests as " -"\"Followers\"." -msgstr "" - -#: mod/settings.php:1144 -msgid "Public Forum" -msgstr "" - -#: mod/settings.php:1145 -msgid "Automatically approves all contact requests." -msgstr "" - -#: mod/settings.php:1148 -msgid "Automatic Friend Page" -msgstr "" - -#: mod/settings.php:1149 -msgid "" -"Account for a popular profile that automatically approves contact requests " -"as \"Friends\"." -msgstr "" - -#: mod/settings.php:1152 -msgid "Private Forum [Experimental]" -msgstr "" - -#: mod/settings.php:1153 -msgid "Requires manual approval of contact requests." -msgstr "" - -#: mod/settings.php:1164 -msgid "OpenID:" -msgstr "" - -#: mod/settings.php:1164 -msgid "(Optional) Allow this OpenID to login to this account." -msgstr "" - -#: mod/settings.php:1172 -msgid "Publish your default profile in your local site directory?" -msgstr "" - -#: mod/settings.php:1172 -msgid "Your profile may be visible in public." -msgstr "" - -#: mod/settings.php:1178 -msgid "Publish your default profile in the global social directory?" -msgstr "" - -#: mod/settings.php:1185 -msgid "Hide your contact/friend list from viewers of your default profile?" -msgstr "" - -#: mod/settings.php:1189 -msgid "" -"If enabled, posting public messages to Diaspora and other networks isn't " -"possible." -msgstr "" - -#: mod/settings.php:1194 -msgid "Allow friends to post to your profile page?" -msgstr "" - -#: mod/settings.php:1199 -msgid "Allow friends to tag your posts?" -msgstr "" - -#: mod/settings.php:1204 -msgid "Allow us to suggest you as a potential friend to new members?" -msgstr "" - -#: mod/settings.php:1209 -msgid "Permit unknown people to send you private mail?" -msgstr "" - -#: mod/settings.php:1217 -msgid "Profile is not published." -msgstr "" - -#: mod/settings.php:1225 -#, php-format -msgid "Your Identity Address is '%s' or '%s'." -msgstr "" - -#: mod/settings.php:1232 -msgid "Automatically expire posts after this many days:" -msgstr "" - -#: mod/settings.php:1232 -msgid "If empty, posts will not expire. Expired posts will be deleted" -msgstr "" - -#: mod/settings.php:1233 -msgid "Advanced expiration settings" -msgstr "" - -#: mod/settings.php:1234 -msgid "Advanced Expiration" -msgstr "" - -#: mod/settings.php:1235 -msgid "Expire posts:" -msgstr "" - -#: mod/settings.php:1236 -msgid "Expire personal notes:" -msgstr "" - -#: mod/settings.php:1237 -msgid "Expire starred posts:" -msgstr "" - -#: mod/settings.php:1238 -msgid "Expire photos:" -msgstr "" - -#: mod/settings.php:1239 -msgid "Only expire posts by others:" -msgstr "" - -#: mod/settings.php:1270 -msgid "Account Settings" -msgstr "" - -#: mod/settings.php:1278 -msgid "Password Settings" -msgstr "" - -#: mod/settings.php:1280 -msgid "Leave password fields blank unless changing" -msgstr "" - -#: mod/settings.php:1281 -msgid "Current Password:" -msgstr "" - -#: mod/settings.php:1281 mod/settings.php:1282 -msgid "Your current password to confirm the changes" -msgstr "" - -#: mod/settings.php:1282 -msgid "Password:" -msgstr "" - -#: mod/settings.php:1286 -msgid "Basic Settings" -msgstr "" - -#: mod/settings.php:1288 -msgid "Email Address:" -msgstr "" - -#: mod/settings.php:1289 -msgid "Your Timezone:" -msgstr "" - -#: mod/settings.php:1290 -msgid "Your Language:" -msgstr "" - -#: mod/settings.php:1290 -msgid "" -"Set the language we use to show you friendica interface and to send you " -"emails" -msgstr "" - -#: mod/settings.php:1291 -msgid "Default Post Location:" -msgstr "" - -#: mod/settings.php:1292 -msgid "Use Browser Location:" -msgstr "" - -#: mod/settings.php:1295 -msgid "Security and Privacy Settings" -msgstr "" - -#: mod/settings.php:1297 -msgid "Maximum Friend Requests/Day:" -msgstr "" - -#: mod/settings.php:1297 mod/settings.php:1327 -msgid "(to prevent spam abuse)" -msgstr "" - -#: mod/settings.php:1298 -msgid "Default Post Permissions" -msgstr "" - -#: mod/settings.php:1299 -msgid "(click to open/close)" -msgstr "" - -#: mod/settings.php:1310 -msgid "Default Private Post" -msgstr "" - -#: mod/settings.php:1311 -msgid "Default Public Post" -msgstr "" - -#: mod/settings.php:1315 -msgid "Default Permissions for New Posts" -msgstr "" - -#: mod/settings.php:1327 -msgid "Maximum private messages per day from unknown people:" -msgstr "" - -#: mod/settings.php:1330 -msgid "Notification Settings" -msgstr "" - -#: mod/settings.php:1331 -msgid "By default post a status message when:" -msgstr "" - -#: mod/settings.php:1332 -msgid "accepting a friend request" -msgstr "" - -#: mod/settings.php:1333 -msgid "joining a forum/community" -msgstr "" - -#: mod/settings.php:1334 -msgid "making an interesting profile change" -msgstr "" - -#: mod/settings.php:1335 -msgid "Send a notification email when:" -msgstr "" - -#: mod/settings.php:1336 -msgid "You receive an introduction" -msgstr "" - -#: mod/settings.php:1337 -msgid "Your introductions are confirmed" -msgstr "" - -#: mod/settings.php:1338 -msgid "Someone writes on your profile wall" -msgstr "" - -#: mod/settings.php:1339 -msgid "Someone writes a followup comment" -msgstr "" - -#: mod/settings.php:1340 -msgid "You receive a private message" -msgstr "" - -#: mod/settings.php:1341 -msgid "You receive a friend suggestion" -msgstr "" - -#: mod/settings.php:1342 -msgid "You are tagged in a post" -msgstr "" - -#: mod/settings.php:1343 -msgid "You are poked/prodded/etc. in a post" -msgstr "" - -#: mod/settings.php:1345 -msgid "Activate desktop notifications" -msgstr "" - -#: mod/settings.php:1345 -msgid "Show desktop popup on new notifications" -msgstr "" - -#: mod/settings.php:1347 -msgid "Text-only notification emails" -msgstr "" - -#: mod/settings.php:1349 -msgid "Send text only notification emails, without the html part" -msgstr "" - -#: mod/settings.php:1351 -msgid "Advanced Account/Page Type Settings" -msgstr "" - -#: mod/settings.php:1352 -msgid "Change the behaviour of this account for special situations" -msgstr "" - -#: mod/settings.php:1355 -msgid "Relocate" -msgstr "" - -#: mod/settings.php:1356 -msgid "" -"If you have moved this profile from another server, and some of your " -"contacts don't receive your updates, try pushing this button." -msgstr "" - -#: mod/settings.php:1357 -msgid "Resend relocate message to contacts" +#: mod/community.php:22 +msgid "Not available." msgstr "" -#: mod/admin.php:98 +#: mod/admin.php:99 msgid "Theme settings updated." msgstr "" -#: mod/admin.php:170 mod/admin.php:1144 +#: mod/admin.php:171 mod/admin.php:1146 msgid "Site" msgstr "" -#: mod/admin.php:171 mod/admin.php:1078 mod/admin.php:1588 mod/admin.php:1604 +#: mod/admin.php:172 mod/admin.php:1080 mod/admin.php:1590 mod/admin.php:1606 msgid "Users" msgstr "" -#: mod/admin.php:173 mod/admin.php:1982 mod/admin.php:2032 +#: mod/admin.php:173 mod/admin.php:1708 mod/admin.php:1771 mod/settings.php:77 +msgid "Plugins" +msgstr "" + +#: mod/admin.php:174 mod/admin.php:1984 mod/admin.php:2034 msgid "Themes" msgstr "" -#: mod/admin.php:175 +#: mod/admin.php:175 mod/settings.php:55 +msgid "Additional features" +msgstr "" + +#: mod/admin.php:176 msgid "DB updates" msgstr "" -#: mod/admin.php:176 mod/admin.php:582 +#: mod/admin.php:177 mod/admin.php:584 msgid "Inspect Queue" msgstr "" -#: mod/admin.php:177 mod/admin.php:297 +#: mod/admin.php:178 mod/admin.php:298 msgid "Server Blocklist" msgstr "" -#: mod/admin.php:178 mod/admin.php:548 +#: mod/admin.php:179 mod/admin.php:550 msgid "Federation Statistics" msgstr "" -#: mod/admin.php:179 mod/admin.php:374 +#: mod/admin.php:180 mod/admin.php:375 msgid "Delete Item" msgstr "" -#: mod/admin.php:193 mod/admin.php:204 mod/admin.php:2106 +#: mod/admin.php:194 mod/admin.php:205 mod/admin.php:2108 msgid "Logs" msgstr "" -#: mod/admin.php:194 mod/admin.php:2174 +#: mod/admin.php:195 mod/admin.php:2176 msgid "View Logs" msgstr "" -#: mod/admin.php:195 +#: mod/admin.php:196 msgid "probe address" msgstr "" -#: mod/admin.php:196 +#: mod/admin.php:197 msgid "check webfinger" msgstr "" -#: mod/admin.php:203 +#: mod/admin.php:204 msgid "Plugin Features" msgstr "" -#: mod/admin.php:205 +#: mod/admin.php:206 msgid "diagnostics" msgstr "" -#: mod/admin.php:206 +#: mod/admin.php:207 msgid "User registrations waiting for confirmation" msgstr "" -#: mod/admin.php:288 +#: mod/admin.php:289 msgid "The blocked domain" msgstr "" -#: mod/admin.php:289 mod/admin.php:302 +#: mod/admin.php:290 mod/admin.php:308 mod/friendica.php:116 +msgid "Reason for the block" +msgstr "" + +#: mod/admin.php:290 mod/admin.php:303 msgid "The reason why you blocked this domain." msgstr "" -#: mod/admin.php:290 +#: mod/admin.php:291 msgid "Delete domain" msgstr "" -#: mod/admin.php:290 +#: mod/admin.php:291 msgid "Check to delete this entry from the blocklist" msgstr "" -#: mod/admin.php:296 mod/admin.php:373 mod/admin.php:547 mod/admin.php:581 -#: mod/admin.php:661 mod/admin.php:1143 mod/admin.php:1587 mod/admin.php:1705 -#: mod/admin.php:1768 mod/admin.php:1981 mod/admin.php:2031 mod/admin.php:2105 -#: mod/admin.php:2173 +#: mod/admin.php:297 mod/admin.php:374 mod/admin.php:549 mod/admin.php:583 +#: mod/admin.php:663 mod/admin.php:1145 mod/admin.php:1589 mod/admin.php:1707 +#: mod/admin.php:1770 mod/admin.php:1983 mod/admin.php:2033 mod/admin.php:2107 +#: mod/admin.php:2175 msgid "Administration" msgstr "" -#: mod/admin.php:298 +#: mod/admin.php:299 msgid "" "This page can be used to define a black list of servers from the federated " "network that are not allowed to interact with your node. For all entered " "domains you should also give a reason why you have blocked the remote server." msgstr "" -#: mod/admin.php:299 +#: mod/admin.php:300 msgid "" "The list of blocked servers will be made publically available on the /" "friendica page so that your users and people investigating communication " "problems can find the reason easily." msgstr "" -#: mod/admin.php:300 +#: mod/admin.php:301 msgid "Add new entry to block list" msgstr "" -#: mod/admin.php:301 +#: mod/admin.php:302 msgid "Server Domain" msgstr "" -#: mod/admin.php:301 +#: mod/admin.php:302 msgid "" "The domain of the new server to add to the block list. Do not include the " "protocol." msgstr "" -#: mod/admin.php:302 +#: mod/admin.php:303 msgid "Block reason" msgstr "" -#: mod/admin.php:303 +#: mod/admin.php:304 msgid "Add Entry" msgstr "" -#: mod/admin.php:304 +#: mod/admin.php:305 msgid "Save changes to the blocklist" msgstr "" -#: mod/admin.php:305 +#: mod/admin.php:306 msgid "Current Entries in the Blocklist" msgstr "" -#: mod/admin.php:308 +#: mod/admin.php:309 msgid "Delete entry from blocklist" msgstr "" -#: mod/admin.php:311 +#: mod/admin.php:312 msgid "Delete entry from blocklist?" msgstr "" -#: mod/admin.php:336 +#: mod/admin.php:337 msgid "Server added to blocklist." msgstr "" -#: mod/admin.php:352 +#: mod/admin.php:353 msgid "Site blocklist updated." msgstr "" -#: mod/admin.php:375 +#: mod/admin.php:376 msgid "Delete this Item" msgstr "" -#: mod/admin.php:376 +#: mod/admin.php:377 msgid "" "On this page you can delete an item from your node. If the item is a top " "level posting, the entire thread will be deleted." msgstr "" -#: mod/admin.php:377 +#: mod/admin.php:378 msgid "" "You need to know the GUID of the item. You can find it e.g. by looking at " "the display URL. The last part of http://example.com/display/123456 is the " "GUID, here 123456." msgstr "" -#: mod/admin.php:378 +#: mod/admin.php:379 msgid "GUID" msgstr "" -#: mod/admin.php:378 +#: mod/admin.php:379 msgid "The GUID of the item you want to delete." msgstr "" -#: mod/admin.php:415 +#: mod/admin.php:416 msgid "Item marked for deletion." msgstr "" -#: mod/admin.php:478 +#: mod/admin.php:480 msgid "unknown" msgstr "" -#: mod/admin.php:541 +#: mod/admin.php:543 msgid "" "This page offers you some numbers to the known part of the federated social " "network your Friendica node is part of. These numbers are not complete but " "only reflect the part of the network your node is aware of." msgstr "" -#: mod/admin.php:542 +#: mod/admin.php:544 msgid "" "The Auto Discovered Contact Directory feature is not enabled, it " "will improve the data displayed here." msgstr "" -#: mod/admin.php:554 +#: mod/admin.php:556 #, php-format msgid "Currently this node is aware of %d nodes from the following platforms:" msgstr "" -#: mod/admin.php:584 +#: mod/admin.php:586 msgid "ID" msgstr "" -#: mod/admin.php:585 +#: mod/admin.php:587 msgid "Recipient Name" msgstr "" -#: mod/admin.php:586 +#: mod/admin.php:588 msgid "Recipient Profile" msgstr "" -#: mod/admin.php:588 +#: mod/admin.php:590 msgid "Created" msgstr "" -#: mod/admin.php:589 +#: mod/admin.php:591 msgid "Last Tried" msgstr "" -#: mod/admin.php:590 +#: mod/admin.php:592 msgid "" "This page lists the content of the queue for outgoing postings. These are " "postings the initial delivery failed for. They will be resend later and " "eventually deleted if the delivery fails permanently." msgstr "" -#: mod/admin.php:615 +#: mod/admin.php:617 #, php-format msgid "" "Your DB still runs with MyISAM tables. You should change the engine type to " @@ -7510,643 +3941,666 @@ msgid "" "automatic conversion.
    " msgstr "" -#: mod/admin.php:624 +#: mod/admin.php:626 msgid "" "The database update failed. Please run \"php include/dbstructure.php update" "\" from the command line and have a look at the errors that might appear." msgstr "" -#: mod/admin.php:629 mod/admin.php:1537 +#: mod/admin.php:631 mod/admin.php:1539 msgid "Normal Account" msgstr "" -#: mod/admin.php:630 mod/admin.php:1538 +#: mod/admin.php:632 mod/admin.php:1540 msgid "Automatic Follower Account" msgstr "" -#: mod/admin.php:631 mod/admin.php:1539 +#: mod/admin.php:633 mod/admin.php:1541 msgid "Public Forum Account" msgstr "" -#: mod/admin.php:632 mod/admin.php:1540 +#: mod/admin.php:634 mod/admin.php:1542 msgid "Automatic Friend Account" msgstr "" -#: mod/admin.php:633 +#: mod/admin.php:635 msgid "Blog Account" msgstr "" -#: mod/admin.php:634 +#: mod/admin.php:636 msgid "Private Forum Account" msgstr "" -#: mod/admin.php:656 +#: mod/admin.php:658 msgid "Message queues" msgstr "" -#: mod/admin.php:662 +#: mod/admin.php:664 msgid "Summary" msgstr "" -#: mod/admin.php:664 +#: mod/admin.php:666 msgid "Registered users" msgstr "" -#: mod/admin.php:666 +#: mod/admin.php:668 msgid "Pending registrations" msgstr "" -#: mod/admin.php:667 +#: mod/admin.php:669 msgid "Version" msgstr "" -#: mod/admin.php:672 +#: mod/admin.php:674 msgid "Active plugins" msgstr "" -#: mod/admin.php:697 +#: mod/admin.php:699 msgid "Can not parse base url. Must have at least ://" msgstr "" -#: mod/admin.php:1004 +#: mod/admin.php:1006 msgid "Site settings updated." msgstr "" -#: mod/admin.php:1061 -msgid "No community page" -msgstr "" - -#: mod/admin.php:1062 -msgid "Public postings from users of this site" +#: mod/admin.php:1034 mod/settings.php:945 +msgid "No special theme for mobile devices" msgstr "" #: mod/admin.php:1063 +msgid "No community page" +msgstr "" + +#: mod/admin.php:1064 +msgid "Public postings from users of this site" +msgstr "" + +#: mod/admin.php:1065 msgid "Global community page" msgstr "" -#: mod/admin.php:1069 +#: mod/admin.php:1070 mod/contacts.php:542 +msgid "Never" +msgstr "" + +#: mod/admin.php:1071 msgid "At post arrival" msgstr "" -#: mod/admin.php:1079 +#: mod/admin.php:1079 mod/contacts.php:569 +msgid "Disabled" +msgstr "" + +#: mod/admin.php:1081 msgid "Users, Global Contacts" msgstr "" -#: mod/admin.php:1080 +#: mod/admin.php:1082 msgid "Users, Global Contacts/fallback" msgstr "" -#: mod/admin.php:1084 +#: mod/admin.php:1086 msgid "One month" msgstr "" -#: mod/admin.php:1085 +#: mod/admin.php:1087 msgid "Three months" msgstr "" -#: mod/admin.php:1086 +#: mod/admin.php:1088 msgid "Half a year" msgstr "" -#: mod/admin.php:1087 +#: mod/admin.php:1089 msgid "One year" msgstr "" -#: mod/admin.php:1092 +#: mod/admin.php:1094 msgid "Multi user instance" msgstr "" -#: mod/admin.php:1115 +#: mod/admin.php:1117 msgid "Closed" msgstr "" -#: mod/admin.php:1116 +#: mod/admin.php:1118 msgid "Requires approval" msgstr "" -#: mod/admin.php:1117 +#: mod/admin.php:1119 msgid "Open" msgstr "" -#: mod/admin.php:1121 +#: mod/admin.php:1123 msgid "No SSL policy, links will track page SSL state" msgstr "" -#: mod/admin.php:1122 +#: mod/admin.php:1124 msgid "Force all links to use SSL" msgstr "" -#: mod/admin.php:1123 +#: mod/admin.php:1125 msgid "Self-signed certificate, use SSL for local links only (discouraged)" msgstr "" -#: mod/admin.php:1147 +#: mod/admin.php:1147 mod/admin.php:1772 mod/admin.php:2035 mod/admin.php:2109 +#: mod/admin.php:2262 mod/settings.php:683 mod/settings.php:794 +#: mod/settings.php:843 mod/settings.php:910 mod/settings.php:1007 +#: mod/settings.php:1273 +msgid "Save Settings" +msgstr "" + +#: mod/admin.php:1148 mod/register.php:276 +msgid "Registration" +msgstr "" + +#: mod/admin.php:1149 msgid "File upload" msgstr "" -#: mod/admin.php:1148 +#: mod/admin.php:1150 msgid "Policies" msgstr "" -#: mod/admin.php:1150 +#: mod/admin.php:1152 msgid "Auto Discovered Contact Directory" msgstr "" -#: mod/admin.php:1151 +#: mod/admin.php:1153 msgid "Performance" msgstr "" -#: mod/admin.php:1152 +#: mod/admin.php:1154 msgid "Worker" msgstr "" -#: mod/admin.php:1153 +#: mod/admin.php:1155 msgid "" "Relocate - WARNING: advanced function. Could make this server unreachable." msgstr "" -#: mod/admin.php:1156 +#: mod/admin.php:1158 msgid "Site name" msgstr "" -#: mod/admin.php:1157 +#: mod/admin.php:1159 msgid "Host name" msgstr "" -#: mod/admin.php:1158 +#: mod/admin.php:1160 msgid "Sender Email" msgstr "" -#: mod/admin.php:1158 +#: mod/admin.php:1160 msgid "" "The email address your server shall use to send notification emails from." msgstr "" -#: mod/admin.php:1159 +#: mod/admin.php:1161 msgid "Banner/Logo" msgstr "" -#: mod/admin.php:1160 +#: mod/admin.php:1162 msgid "Shortcut icon" msgstr "" -#: mod/admin.php:1160 +#: mod/admin.php:1162 msgid "Link to an icon that will be used for browsers." msgstr "" -#: mod/admin.php:1161 +#: mod/admin.php:1163 msgid "Touch icon" msgstr "" -#: mod/admin.php:1161 +#: mod/admin.php:1163 msgid "Link to an icon that will be used for tablets and mobiles." msgstr "" -#: mod/admin.php:1162 +#: mod/admin.php:1164 msgid "Additional Info" msgstr "" -#: mod/admin.php:1162 +#: mod/admin.php:1164 #, php-format msgid "" "For public servers: you can add additional information here that will be " "listed at %s/siteinfo." msgstr "" -#: mod/admin.php:1163 +#: mod/admin.php:1165 msgid "System language" msgstr "" -#: mod/admin.php:1164 +#: mod/admin.php:1166 msgid "System theme" msgstr "" -#: mod/admin.php:1164 +#: mod/admin.php:1166 msgid "" "Default system theme - may be over-ridden by user profiles - change theme settings" msgstr "" -#: mod/admin.php:1165 +#: mod/admin.php:1167 msgid "Mobile system theme" msgstr "" -#: mod/admin.php:1165 +#: mod/admin.php:1167 msgid "Theme for mobile devices" msgstr "" -#: mod/admin.php:1166 +#: mod/admin.php:1168 msgid "SSL link policy" msgstr "" -#: mod/admin.php:1166 +#: mod/admin.php:1168 msgid "Determines whether generated links should be forced to use SSL" msgstr "" -#: mod/admin.php:1167 +#: mod/admin.php:1169 msgid "Force SSL" msgstr "" -#: mod/admin.php:1167 +#: mod/admin.php:1169 msgid "" "Force all Non-SSL requests to SSL - Attention: on some systems it could lead " "to endless loops." msgstr "" -#: mod/admin.php:1168 +#: mod/admin.php:1170 msgid "Hide help entry from navigation menu" msgstr "" -#: mod/admin.php:1168 +#: mod/admin.php:1170 msgid "" "Hides the menu entry for the Help pages from the navigation menu. You can " "still access it calling /help directly." msgstr "" -#: mod/admin.php:1169 +#: mod/admin.php:1171 msgid "Single user instance" msgstr "" -#: mod/admin.php:1169 +#: mod/admin.php:1171 msgid "Make this instance multi-user or single-user for the named user" msgstr "" -#: mod/admin.php:1170 +#: mod/admin.php:1172 msgid "Maximum image size" msgstr "" -#: mod/admin.php:1170 +#: mod/admin.php:1172 msgid "" "Maximum size in bytes of uploaded images. Default is 0, which means no " "limits." msgstr "" -#: mod/admin.php:1171 +#: mod/admin.php:1173 msgid "Maximum image length" msgstr "" -#: mod/admin.php:1171 +#: mod/admin.php:1173 msgid "" "Maximum length in pixels of the longest side of uploaded images. Default is " "-1, which means no limits." msgstr "" -#: mod/admin.php:1172 +#: mod/admin.php:1174 msgid "JPEG image quality" msgstr "" -#: mod/admin.php:1172 +#: mod/admin.php:1174 msgid "" "Uploaded JPEGS will be saved at this quality setting [0-100]. Default is " "100, which is full quality." msgstr "" -#: mod/admin.php:1174 +#: mod/admin.php:1176 msgid "Register policy" msgstr "" -#: mod/admin.php:1175 +#: mod/admin.php:1177 msgid "Maximum Daily Registrations" msgstr "" -#: mod/admin.php:1175 +#: mod/admin.php:1177 msgid "" "If registration is permitted above, this sets the maximum number of new user " "registrations to accept per day. If register is set to closed, this setting " "has no effect." msgstr "" -#: mod/admin.php:1176 +#: mod/admin.php:1178 msgid "Register text" msgstr "" -#: mod/admin.php:1176 +#: mod/admin.php:1178 msgid "Will be displayed prominently on the registration page." msgstr "" -#: mod/admin.php:1177 +#: mod/admin.php:1179 msgid "Accounts abandoned after x days" msgstr "" -#: mod/admin.php:1177 +#: mod/admin.php:1179 msgid "" "Will not waste system resources polling external sites for abandonded " "accounts. Enter 0 for no time limit." msgstr "" -#: mod/admin.php:1178 +#: mod/admin.php:1180 msgid "Allowed friend domains" msgstr "" -#: mod/admin.php:1178 +#: mod/admin.php:1180 msgid "" "Comma separated list of domains which are allowed to establish friendships " "with this site. Wildcards are accepted. Empty to allow any domains" msgstr "" -#: mod/admin.php:1179 +#: mod/admin.php:1181 msgid "Allowed email domains" msgstr "" -#: mod/admin.php:1179 +#: mod/admin.php:1181 msgid "" "Comma separated list of domains which are allowed in email addresses for " "registrations to this site. Wildcards are accepted. Empty to allow any " "domains" msgstr "" -#: mod/admin.php:1180 +#: mod/admin.php:1182 msgid "Block public" msgstr "" -#: mod/admin.php:1180 +#: mod/admin.php:1182 msgid "" "Check to block public access to all otherwise public personal pages on this " "site unless you are currently logged in." msgstr "" -#: mod/admin.php:1181 +#: mod/admin.php:1183 msgid "Force publish" msgstr "" -#: mod/admin.php:1181 +#: mod/admin.php:1183 msgid "" "Check to force all profiles on this site to be listed in the site directory." msgstr "" -#: mod/admin.php:1182 +#: mod/admin.php:1184 msgid "Global directory URL" msgstr "" -#: mod/admin.php:1182 +#: mod/admin.php:1184 msgid "" "URL to the global directory. If this is not set, the global directory is " "completely unavailable to the application." msgstr "" -#: mod/admin.php:1183 +#: mod/admin.php:1185 msgid "Allow threaded items" msgstr "" -#: mod/admin.php:1183 +#: mod/admin.php:1185 msgid "Allow infinite level threading for items on this site." msgstr "" -#: mod/admin.php:1184 +#: mod/admin.php:1186 msgid "Private posts by default for new users" msgstr "" -#: mod/admin.php:1184 +#: mod/admin.php:1186 msgid "" "Set default post permissions for all new members to the default privacy " "group rather than public." msgstr "" -#: mod/admin.php:1185 +#: mod/admin.php:1187 msgid "Don't include post content in email notifications" msgstr "" -#: mod/admin.php:1185 +#: mod/admin.php:1187 msgid "" "Don't include the content of a post/comment/private message/etc. in the " "email notifications that are sent out from this site, as a privacy measure." msgstr "" -#: mod/admin.php:1186 +#: mod/admin.php:1188 msgid "Disallow public access to addons listed in the apps menu." msgstr "" -#: mod/admin.php:1186 +#: mod/admin.php:1188 msgid "" "Checking this box will restrict addons listed in the apps menu to members " "only." msgstr "" -#: mod/admin.php:1187 +#: mod/admin.php:1189 msgid "Don't embed private images in posts" msgstr "" -#: mod/admin.php:1187 +#: mod/admin.php:1189 msgid "" "Don't replace locally-hosted private photos in posts with an embedded copy " "of the image. This means that contacts who receive posts containing private " "photos will have to authenticate and load each image, which may take a while." msgstr "" -#: mod/admin.php:1188 +#: mod/admin.php:1190 msgid "Allow Users to set remote_self" msgstr "" -#: mod/admin.php:1188 +#: mod/admin.php:1190 msgid "" "With checking this, every user is allowed to mark every contact as a " "remote_self in the repair contact dialog. Setting this flag on a contact " "causes mirroring every posting of that contact in the users stream." msgstr "" -#: mod/admin.php:1189 +#: mod/admin.php:1191 msgid "Block multiple registrations" msgstr "" -#: mod/admin.php:1189 +#: mod/admin.php:1191 msgid "Disallow users to register additional accounts for use as pages." msgstr "" -#: mod/admin.php:1190 +#: mod/admin.php:1192 msgid "OpenID support" msgstr "" -#: mod/admin.php:1190 +#: mod/admin.php:1192 msgid "OpenID support for registration and logins." msgstr "" -#: mod/admin.php:1191 +#: mod/admin.php:1193 msgid "Fullname check" msgstr "" -#: mod/admin.php:1191 +#: mod/admin.php:1193 msgid "" "Force users to register with a space between firstname and lastname in Full " "name, as an antispam measure" msgstr "" -#: mod/admin.php:1192 +#: mod/admin.php:1194 msgid "Community Page Style" msgstr "" -#: mod/admin.php:1192 +#: mod/admin.php:1194 msgid "" "Type of community page to show. 'Global community' shows every public " "posting from an open distributed network that arrived on this server." msgstr "" -#: mod/admin.php:1193 +#: mod/admin.php:1195 msgid "Posts per user on community page" msgstr "" -#: mod/admin.php:1193 +#: mod/admin.php:1195 msgid "" "The maximum number of posts per user on the community page. (Not valid for " "'Global Community')" msgstr "" -#: mod/admin.php:1194 +#: mod/admin.php:1196 msgid "Enable OStatus support" msgstr "" -#: mod/admin.php:1194 +#: mod/admin.php:1196 msgid "" "Provide built-in OStatus (StatusNet, GNU Social etc.) compatibility. All " "communications in OStatus are public, so privacy warnings will be " "occasionally displayed." msgstr "" -#: mod/admin.php:1195 +#: mod/admin.php:1197 msgid "OStatus conversation completion interval" msgstr "" -#: mod/admin.php:1195 +#: mod/admin.php:1197 msgid "" "How often shall the poller check for new entries in OStatus conversations? " "This can be a very ressource task." msgstr "" -#: mod/admin.php:1196 +#: mod/admin.php:1198 msgid "Only import OStatus threads from our contacts" msgstr "" -#: mod/admin.php:1196 +#: mod/admin.php:1198 msgid "" "Normally we import every content from our OStatus contacts. With this option " "we only store threads that are started by a contact that is known on our " "system." msgstr "" -#: mod/admin.php:1197 +#: mod/admin.php:1199 msgid "OStatus support can only be enabled if threading is enabled." msgstr "" -#: mod/admin.php:1199 +#: mod/admin.php:1201 msgid "" "Diaspora support can't be enabled because Friendica was installed into a sub " "directory." msgstr "" -#: mod/admin.php:1200 +#: mod/admin.php:1202 msgid "Enable Diaspora support" msgstr "" -#: mod/admin.php:1200 +#: mod/admin.php:1202 msgid "Provide built-in Diaspora network compatibility." msgstr "" -#: mod/admin.php:1201 +#: mod/admin.php:1203 msgid "Only allow Friendica contacts" msgstr "" -#: mod/admin.php:1201 +#: mod/admin.php:1203 msgid "" "All contacts must use Friendica protocols. All other built-in communication " "protocols disabled." msgstr "" -#: mod/admin.php:1202 +#: mod/admin.php:1204 msgid "Verify SSL" msgstr "" -#: mod/admin.php:1202 +#: mod/admin.php:1204 msgid "" "If you wish, you can turn on strict certificate checking. This will mean you " "cannot connect (at all) to self-signed SSL sites." msgstr "" -#: mod/admin.php:1203 +#: mod/admin.php:1205 msgid "Proxy user" msgstr "" -#: mod/admin.php:1204 +#: mod/admin.php:1206 msgid "Proxy URL" msgstr "" -#: mod/admin.php:1205 +#: mod/admin.php:1207 msgid "Network timeout" msgstr "" -#: mod/admin.php:1205 +#: mod/admin.php:1207 msgid "Value is in seconds. Set to 0 for unlimited (not recommended)." msgstr "" -#: mod/admin.php:1206 +#: mod/admin.php:1208 msgid "Maximum Load Average" msgstr "" -#: mod/admin.php:1206 +#: mod/admin.php:1208 msgid "" "Maximum system load before delivery and poll processes are deferred - " "default 50." msgstr "" -#: mod/admin.php:1207 +#: mod/admin.php:1209 msgid "Maximum Load Average (Frontend)" msgstr "" -#: mod/admin.php:1207 +#: mod/admin.php:1209 msgid "Maximum system load before the frontend quits service - default 50." msgstr "" -#: mod/admin.php:1208 +#: mod/admin.php:1210 msgid "Minimal Memory" msgstr "" -#: mod/admin.php:1208 +#: mod/admin.php:1210 msgid "" "Minimal free memory in MB for the poller. Needs access to /proc/meminfo - " "default 0 (deactivated)." msgstr "" -#: mod/admin.php:1209 +#: mod/admin.php:1211 msgid "Maximum table size for optimization" msgstr "" -#: mod/admin.php:1209 +#: mod/admin.php:1211 msgid "" "Maximum table size (in MB) for the automatic optimization - default 100 MB. " "Enter -1 to disable it." msgstr "" -#: mod/admin.php:1210 +#: mod/admin.php:1212 msgid "Minimum level of fragmentation" msgstr "" -#: mod/admin.php:1210 +#: mod/admin.php:1212 msgid "" "Minimum fragmenation level to start the automatic optimization - default " "value is 30%." msgstr "" -#: mod/admin.php:1212 +#: mod/admin.php:1214 msgid "Periodical check of global contacts" msgstr "" -#: mod/admin.php:1212 +#: mod/admin.php:1214 msgid "" "If enabled, the global contacts are checked periodically for missing or " "outdated data and the vitality of the contacts and servers." msgstr "" -#: mod/admin.php:1213 +#: mod/admin.php:1215 msgid "Days between requery" msgstr "" -#: mod/admin.php:1213 +#: mod/admin.php:1215 msgid "Number of days after which a server is requeried for his contacts." msgstr "" -#: mod/admin.php:1214 +#: mod/admin.php:1216 msgid "Discover contacts from other servers" msgstr "" -#: mod/admin.php:1214 +#: mod/admin.php:1216 msgid "" "Periodically query other servers for contacts. You can choose between " "'users': the users on the remote system, 'Global Contacts': active contacts " @@ -8156,32 +4610,32 @@ msgid "" "Global Contacts'." msgstr "" -#: mod/admin.php:1215 +#: mod/admin.php:1217 msgid "Timeframe for fetching global contacts" msgstr "" -#: mod/admin.php:1215 +#: mod/admin.php:1217 msgid "" "When the discovery is activated, this value defines the timeframe for the " "activity of the global contacts that are fetched from other servers." msgstr "" -#: mod/admin.php:1216 +#: mod/admin.php:1218 msgid "Search the local directory" msgstr "" -#: mod/admin.php:1216 +#: mod/admin.php:1218 msgid "" "Search the local directory instead of the global directory. When searching " "locally, every search will be executed on the global directory in the " "background. This improves the search results when the search is repeated." msgstr "" -#: mod/admin.php:1218 +#: mod/admin.php:1220 msgid "Publish server information" msgstr "" -#: mod/admin.php:1218 +#: mod/admin.php:1220 msgid "" "If enabled, general server and usage data will be published. The data " "contains the name and version of the server, number of users with public " @@ -8189,133 +4643,133 @@ msgid "" "href='http://the-federation.info/'>the-federation.info for details." msgstr "" -#: mod/admin.php:1220 +#: mod/admin.php:1222 msgid "Suppress Tags" msgstr "" -#: mod/admin.php:1220 +#: mod/admin.php:1222 msgid "Suppress showing a list of hashtags at the end of the posting." msgstr "" -#: mod/admin.php:1221 +#: mod/admin.php:1223 msgid "Path to item cache" msgstr "" -#: mod/admin.php:1221 +#: mod/admin.php:1223 msgid "The item caches buffers generated bbcode and external images." msgstr "" -#: mod/admin.php:1222 +#: mod/admin.php:1224 msgid "Cache duration in seconds" msgstr "" -#: mod/admin.php:1222 +#: mod/admin.php:1224 msgid "" "How long should the cache files be hold? Default value is 86400 seconds (One " "day). To disable the item cache, set the value to -1." msgstr "" -#: mod/admin.php:1223 +#: mod/admin.php:1225 msgid "Maximum numbers of comments per post" msgstr "" -#: mod/admin.php:1223 +#: mod/admin.php:1225 msgid "How much comments should be shown for each post? Default value is 100." msgstr "" -#: mod/admin.php:1224 +#: mod/admin.php:1226 msgid "Temp path" msgstr "" -#: mod/admin.php:1224 +#: mod/admin.php:1226 msgid "" "If you have a restricted system where the webserver can't access the system " "temp path, enter another path here." msgstr "" -#: mod/admin.php:1225 +#: mod/admin.php:1227 msgid "Base path to installation" msgstr "" -#: mod/admin.php:1225 +#: mod/admin.php:1227 msgid "" "If the system cannot detect the correct path to your installation, enter the " "correct path here. This setting should only be set if you are using a " "restricted system and symbolic links to your webroot." msgstr "" -#: mod/admin.php:1226 +#: mod/admin.php:1228 msgid "Disable picture proxy" msgstr "" -#: mod/admin.php:1226 +#: mod/admin.php:1228 msgid "" "The picture proxy increases performance and privacy. It shouldn't be used on " "systems with very low bandwith." msgstr "" -#: mod/admin.php:1227 +#: mod/admin.php:1229 msgid "Only search in tags" msgstr "" -#: mod/admin.php:1227 +#: mod/admin.php:1229 msgid "On large systems the text search can slow down the system extremely." msgstr "" -#: mod/admin.php:1229 +#: mod/admin.php:1231 msgid "New base url" msgstr "" -#: mod/admin.php:1229 +#: mod/admin.php:1231 msgid "" "Change base url for this server. Sends relocate message to all DFRN contacts " "of all users." msgstr "" -#: mod/admin.php:1231 +#: mod/admin.php:1233 msgid "RINO Encryption" msgstr "" -#: mod/admin.php:1231 +#: mod/admin.php:1233 msgid "Encryption layer between nodes." msgstr "" -#: mod/admin.php:1233 +#: mod/admin.php:1235 msgid "Maximum number of parallel workers" msgstr "" -#: mod/admin.php:1233 +#: mod/admin.php:1235 msgid "" "On shared hosters set this to 2. On larger systems, values of 10 are great. " "Default value is 4." msgstr "" -#: mod/admin.php:1234 +#: mod/admin.php:1236 msgid "Don't use 'proc_open' with the worker" msgstr "" -#: mod/admin.php:1234 +#: mod/admin.php:1236 msgid "" "Enable this if your system doesn't allow the use of 'proc_open'. This can " "happen on shared hosters. If this is enabled you should increase the " "frequency of poller calls in your crontab." msgstr "" -#: mod/admin.php:1235 +#: mod/admin.php:1237 msgid "Enable fastlane" msgstr "" -#: mod/admin.php:1235 +#: mod/admin.php:1237 msgid "" "When enabed, the fastlane mechanism starts an additional worker if processes " "with higher priority are blocked by processes of lower priority." msgstr "" -#: mod/admin.php:1236 +#: mod/admin.php:1238 msgid "Enable frontend worker" msgstr "" -#: mod/admin.php:1236 +#: mod/admin.php:1238 #, php-format msgid "" "When enabled the Worker process is triggered when backend access is " @@ -8325,66 +4779,66 @@ msgid "" "server." msgstr "" -#: mod/admin.php:1266 +#: mod/admin.php:1268 msgid "Update has been marked successful" msgstr "" -#: mod/admin.php:1274 +#: mod/admin.php:1276 #, php-format msgid "Database structure update %s was successfully applied." msgstr "" -#: mod/admin.php:1277 +#: mod/admin.php:1279 #, php-format msgid "Executing of database structure update %s failed with error: %s" msgstr "" -#: mod/admin.php:1291 +#: mod/admin.php:1293 #, php-format msgid "Executing %s failed with error: %s" msgstr "" -#: mod/admin.php:1294 +#: mod/admin.php:1296 #, php-format msgid "Update %s was successfully applied." msgstr "" -#: mod/admin.php:1297 +#: mod/admin.php:1299 #, php-format msgid "Update %s did not return a status. Unknown if it succeeded." msgstr "" -#: mod/admin.php:1300 +#: mod/admin.php:1302 #, php-format msgid "There was no additional update function %s that needed to be called." msgstr "" -#: mod/admin.php:1320 +#: mod/admin.php:1322 msgid "No failed updates." msgstr "" -#: mod/admin.php:1321 +#: mod/admin.php:1323 msgid "Check database structure" msgstr "" -#: mod/admin.php:1326 +#: mod/admin.php:1328 msgid "Failed Updates" msgstr "" -#: mod/admin.php:1327 +#: mod/admin.php:1329 msgid "" "This does not include updates prior to 1139, which did not return a status." msgstr "" -#: mod/admin.php:1328 +#: mod/admin.php:1330 msgid "Mark success (if update was manually applied)" msgstr "" -#: mod/admin.php:1329 +#: mod/admin.php:1331 msgid "Attempt to execute this update step automatically" msgstr "" -#: mod/admin.php:1363 +#: mod/admin.php:1365 #, php-format msgid "" "\n" @@ -8392,7 +4846,7 @@ msgid "" "\t\t\t\tthe administrator of %2$s has set up an account for you." msgstr "" -#: mod/admin.php:1366 +#: mod/admin.php:1368 #, php-format msgid "" "\n" @@ -8428,158 +4882,176 @@ msgid "" "\t\t\tThank you and welcome to %4$s." msgstr "" -#: mod/admin.php:1410 +#: mod/admin.php:1412 #, php-format msgid "%s user blocked/unblocked" msgid_plural "%s users blocked/unblocked" msgstr[0] "" msgstr[1] "" -#: mod/admin.php:1417 +#: mod/admin.php:1419 #, php-format msgid "%s user deleted" msgid_plural "%s users deleted" msgstr[0] "" msgstr[1] "" -#: mod/admin.php:1464 +#: mod/admin.php:1466 #, php-format msgid "User '%s' deleted" msgstr "" -#: mod/admin.php:1472 +#: mod/admin.php:1474 #, php-format msgid "User '%s' unblocked" msgstr "" -#: mod/admin.php:1472 +#: mod/admin.php:1474 #, php-format msgid "User '%s' blocked" msgstr "" -#: mod/admin.php:1580 mod/admin.php:1606 +#: mod/admin.php:1582 mod/admin.php:1608 msgid "Register date" msgstr "" -#: mod/admin.php:1580 mod/admin.php:1606 +#: mod/admin.php:1582 mod/admin.php:1608 msgid "Last login" msgstr "" -#: mod/admin.php:1580 mod/admin.php:1606 +#: mod/admin.php:1582 mod/admin.php:1608 msgid "Last item" msgstr "" -#: mod/admin.php:1589 -msgid "Add User" -msgstr "" - -#: mod/admin.php:1590 -msgid "select all" +#: mod/admin.php:1582 mod/settings.php:46 +msgid "Account" msgstr "" #: mod/admin.php:1591 -msgid "User registrations waiting for confirm" +msgid "Add User" msgstr "" #: mod/admin.php:1592 -msgid "User waiting for permanent deletion" +msgid "select all" msgstr "" #: mod/admin.php:1593 -msgid "Request date" +msgid "User registrations waiting for confirm" msgstr "" #: mod/admin.php:1594 -msgid "No registrations." +msgid "User waiting for permanent deletion" msgstr "" #: mod/admin.php:1595 -msgid "Note from the user" +msgid "Request date" +msgstr "" + +#: mod/admin.php:1596 +msgid "No registrations." msgstr "" #: mod/admin.php:1597 +msgid "Note from the user" +msgstr "" + +#: mod/admin.php:1598 mod/notifications.php:179 mod/notifications.php:264 +msgid "Approve" +msgstr "" + +#: mod/admin.php:1599 msgid "Deny" msgstr "" -#: mod/admin.php:1601 +#: mod/admin.php:1601 mod/contacts.php:625 mod/contacts.php:825 +#: mod/contacts.php:1003 +msgid "Block" +msgstr "" + +#: mod/admin.php:1602 mod/contacts.php:625 mod/contacts.php:825 +#: mod/contacts.php:1003 +msgid "Unblock" +msgstr "" + +#: mod/admin.php:1603 msgid "Site admin" msgstr "" -#: mod/admin.php:1602 +#: mod/admin.php:1604 msgid "Account expired" msgstr "" -#: mod/admin.php:1605 +#: mod/admin.php:1607 msgid "New User" msgstr "" -#: mod/admin.php:1606 +#: mod/admin.php:1608 msgid "Deleted since" msgstr "" -#: mod/admin.php:1611 +#: mod/admin.php:1613 msgid "" "Selected users will be deleted!\\n\\nEverything these users had posted on " "this site will be permanently deleted!\\n\\nAre you sure?" msgstr "" -#: mod/admin.php:1612 +#: mod/admin.php:1614 msgid "" "The user {0} will be deleted!\\n\\nEverything this user has posted on this " "site will be permanently deleted!\\n\\nAre you sure?" msgstr "" -#: mod/admin.php:1622 +#: mod/admin.php:1624 msgid "Name of the new user." msgstr "" -#: mod/admin.php:1623 +#: mod/admin.php:1625 msgid "Nickname" msgstr "" -#: mod/admin.php:1623 +#: mod/admin.php:1625 msgid "Nickname of the new user." msgstr "" -#: mod/admin.php:1624 +#: mod/admin.php:1626 msgid "Email address of the new user." msgstr "" -#: mod/admin.php:1667 +#: mod/admin.php:1669 #, php-format msgid "Plugin %s disabled." msgstr "" -#: mod/admin.php:1671 +#: mod/admin.php:1673 #, php-format msgid "Plugin %s enabled." msgstr "" -#: mod/admin.php:1682 mod/admin.php:1934 +#: mod/admin.php:1684 mod/admin.php:1936 msgid "Disable" msgstr "" -#: mod/admin.php:1684 mod/admin.php:1936 +#: mod/admin.php:1686 mod/admin.php:1938 msgid "Enable" msgstr "" -#: mod/admin.php:1707 mod/admin.php:1983 +#: mod/admin.php:1709 mod/admin.php:1985 msgid "Toggle" msgstr "" -#: mod/admin.php:1715 mod/admin.php:1992 +#: mod/admin.php:1717 mod/admin.php:1994 msgid "Author: " msgstr "" -#: mod/admin.php:1716 mod/admin.php:1993 +#: mod/admin.php:1718 mod/admin.php:1995 msgid "Maintainer: " msgstr "" -#: mod/admin.php:1771 +#: mod/admin.php:1773 msgid "Reload active plugins" msgstr "" -#: mod/admin.php:1776 +#: mod/admin.php:1778 #, php-format msgid "" "There are currently no plugins available on your node. You can find the " @@ -8587,70 +5059,70 @@ msgid "" "in the open plugin registry at %2$s" msgstr "" -#: mod/admin.php:1895 +#: mod/admin.php:1897 msgid "No themes found." msgstr "" -#: mod/admin.php:1974 +#: mod/admin.php:1976 msgid "Screenshot" msgstr "" -#: mod/admin.php:2034 +#: mod/admin.php:2036 msgid "Reload active themes" msgstr "" -#: mod/admin.php:2039 +#: mod/admin.php:2041 #, php-format msgid "No themes found on the system. They should be paced in %1$s" msgstr "" -#: mod/admin.php:2040 +#: mod/admin.php:2042 msgid "[Experimental]" msgstr "" -#: mod/admin.php:2041 +#: mod/admin.php:2043 msgid "[Unsupported]" msgstr "" -#: mod/admin.php:2065 +#: mod/admin.php:2067 msgid "Log settings updated." msgstr "" -#: mod/admin.php:2097 +#: mod/admin.php:2099 msgid "PHP log currently enabled." msgstr "" -#: mod/admin.php:2099 +#: mod/admin.php:2101 msgid "PHP log currently disabled." msgstr "" -#: mod/admin.php:2108 +#: mod/admin.php:2110 msgid "Clear" msgstr "" -#: mod/admin.php:2113 +#: mod/admin.php:2115 msgid "Enable Debugging" msgstr "" -#: mod/admin.php:2114 +#: mod/admin.php:2116 msgid "Log file" msgstr "" -#: mod/admin.php:2114 +#: mod/admin.php:2116 msgid "" "Must be writable by web server. Relative to your Friendica top-level " "directory." msgstr "" -#: mod/admin.php:2115 +#: mod/admin.php:2117 msgid "Log level" msgstr "" -#: mod/admin.php:2118 +#: mod/admin.php:2120 msgid "PHP logging" msgstr "" -#: mod/admin.php:2119 +#: mod/admin.php:2121 msgid "" "To enable logging of PHP errors and warnings you can add the following to " "the .htconfig.php file of your installation. The filename set in the " @@ -8659,63 +5131,1885 @@ msgid "" "'display_errors' is to enable these options, set to '0' to disable them." msgstr "" -#: mod/admin.php:2250 +#: mod/admin.php:2251 mod/admin.php:2252 mod/settings.php:784 +msgid "Off" +msgstr "" + +#: mod/admin.php:2251 mod/admin.php:2252 mod/settings.php:784 +msgid "On" +msgstr "" + +#: mod/admin.php:2252 #, php-format msgid "Lock feature %s" msgstr "" -#: mod/admin.php:2258 +#: mod/admin.php:2260 msgid "Manage Additional Features" msgstr "" -#: mod/community.php:22 -msgid "Not available." +#: mod/allfriends.php:49 +msgid "No friends to display." msgstr "" -#: mod/dfrn_poll.php:113 mod/dfrn_poll.php:549 +#: mod/bookmarklet.php:44 +msgid "The post was created" +msgstr "" + +#: mod/cal.php:146 mod/display.php:348 mod/profile.php:157 +msgid "Access to this profile has been restricted." +msgstr "" + +#: mod/cal.php:274 mod/events.php:379 +msgid "View" +msgstr "" + +#: mod/cal.php:275 mod/events.php:381 +msgid "Previous" +msgstr "" + +#: mod/cal.php:276 mod/events.php:382 mod/install.php:204 +msgid "Next" +msgstr "" + +#: mod/cal.php:285 mod/events.php:391 +msgid "list" +msgstr "" + +#: mod/cal.php:295 +msgid "User not found" +msgstr "" + +#: mod/cal.php:311 +msgid "This calendar format is not supported" +msgstr "" + +#: mod/cal.php:313 +msgid "No exportable data found" +msgstr "" + +#: mod/cal.php:328 +msgid "calendar" +msgstr "" + +#: mod/contacts.php:138 +#, php-format +msgid "%d contact edited." +msgid_plural "%d contacts edited." +msgstr[0] "" +msgstr[1] "" + +#: mod/contacts.php:173 mod/contacts.php:382 +msgid "Could not access contact record." +msgstr "" + +#: mod/contacts.php:187 +msgid "Could not locate selected profile." +msgstr "" + +#: mod/contacts.php:220 +msgid "Contact updated." +msgstr "" + +#: mod/contacts.php:222 mod/dfrn_request.php:594 +msgid "Failed to update contact record." +msgstr "" + +#: mod/contacts.php:403 +msgid "Contact has been blocked" +msgstr "" + +#: mod/contacts.php:403 +msgid "Contact has been unblocked" +msgstr "" + +#: mod/contacts.php:414 +msgid "Contact has been ignored" +msgstr "" + +#: mod/contacts.php:414 +msgid "Contact has been unignored" +msgstr "" + +#: mod/contacts.php:426 +msgid "Contact has been archived" +msgstr "" + +#: mod/contacts.php:426 +msgid "Contact has been unarchived" +msgstr "" + +#: mod/contacts.php:451 +msgid "Drop contact" +msgstr "" + +#: mod/contacts.php:454 mod/contacts.php:821 +msgid "Do you really want to delete this contact?" +msgstr "" + +#: mod/contacts.php:473 +msgid "Contact has been removed." +msgstr "" + +#: mod/contacts.php:510 +#, php-format +msgid "You are mutual friends with %s" +msgstr "" + +#: mod/contacts.php:514 +#, php-format +msgid "You are sharing with %s" +msgstr "" + +#: mod/contacts.php:519 +#, php-format +msgid "%s is sharing with you" +msgstr "" + +#: mod/contacts.php:539 +msgid "Private communications are not available for this contact." +msgstr "" + +#: mod/contacts.php:546 +msgid "(Update was successful)" +msgstr "" + +#: mod/contacts.php:546 +msgid "(Update was not successful)" +msgstr "" + +#: mod/contacts.php:548 mod/contacts.php:984 +msgid "Suggest friends" +msgstr "" + +#: mod/contacts.php:552 +#, php-format +msgid "Network type: %s" +msgstr "" + +#: mod/contacts.php:565 +msgid "Communications lost with this contact!" +msgstr "" + +#: mod/contacts.php:568 +msgid "Fetch further information for feeds" +msgstr "" + +#: mod/contacts.php:569 +msgid "Fetch information" +msgstr "" + +#: mod/contacts.php:569 +msgid "Fetch information and keywords" +msgstr "" + +#: mod/contacts.php:583 mod/unfollow.php:100 +msgid "Disconnect/Unfollow" +msgstr "" + +#: mod/contacts.php:593 +msgid "Contact" +msgstr "" + +#: mod/contacts.php:596 +msgid "Profile Visibility" +msgstr "" + +#: mod/contacts.php:597 +#, php-format +msgid "" +"Please choose the profile you would like to display to %s when viewing your " +"profile securely." +msgstr "" + +#: mod/contacts.php:598 +msgid "Contact Information / Notes" +msgstr "" + +#: mod/contacts.php:599 +msgid "Their personal note" +msgstr "" + +#: mod/contacts.php:601 +msgid "Edit contact notes" +msgstr "" + +#: mod/contacts.php:607 +msgid "Block/Unblock contact" +msgstr "" + +#: mod/contacts.php:608 +msgid "Ignore contact" +msgstr "" + +#: mod/contacts.php:609 +msgid "Repair URL settings" +msgstr "" + +#: mod/contacts.php:610 +msgid "View conversations" +msgstr "" + +#: mod/contacts.php:616 +msgid "Last update:" +msgstr "" + +#: mod/contacts.php:618 +msgid "Update public posts" +msgstr "" + +#: mod/contacts.php:620 mod/contacts.php:994 +msgid "Update now" +msgstr "" + +#: mod/contacts.php:626 mod/contacts.php:826 mod/contacts.php:1011 +msgid "Unignore" +msgstr "" + +#: mod/contacts.php:626 mod/contacts.php:826 mod/contacts.php:1011 +#: mod/notifications.php:63 mod/notifications.php:182 mod/notifications.php:266 +msgid "Ignore" +msgstr "" + +#: mod/contacts.php:630 +msgid "Currently blocked" +msgstr "" + +#: mod/contacts.php:631 +msgid "Currently ignored" +msgstr "" + +#: mod/contacts.php:632 +msgid "Currently archived" +msgstr "" + +#: mod/contacts.php:633 mod/notifications.php:175 mod/notifications.php:254 +msgid "Hide this contact from others" +msgstr "" + +#: mod/contacts.php:633 +msgid "" +"Replies/likes to your public posts may still be visible" +msgstr "" + +#: mod/contacts.php:634 +msgid "Notification for new posts" +msgstr "" + +#: mod/contacts.php:634 +msgid "Send a notification of every new post of this contact" +msgstr "" + +#: mod/contacts.php:637 +msgid "Blacklisted keywords" +msgstr "" + +#: mod/contacts.php:637 +msgid "" +"Comma separated list of keywords that should not be converted to hashtags, " +"when \"Fetch information and keywords\" is selected" +msgstr "" + +#: mod/contacts.php:644 mod/follow.php:166 mod/notifications.php:258 +#: mod/unfollow.php:122 +msgid "Profile URL" +msgstr "" + +#: mod/contacts.php:655 +msgid "Actions" +msgstr "" + +#: mod/contacts.php:658 +msgid "Contact Settings" +msgstr "" + +#: mod/contacts.php:704 +msgid "Suggestions" +msgstr "" + +#: mod/contacts.php:707 +msgid "Suggest potential friends" +msgstr "" + +#: mod/contacts.php:712 mod/group.php:214 +msgid "All Contacts" +msgstr "" + +#: mod/contacts.php:715 +msgid "Show all contacts" +msgstr "" + +#: mod/contacts.php:720 +msgid "Unblocked" +msgstr "" + +#: mod/contacts.php:723 +msgid "Only show unblocked contacts" +msgstr "" + +#: mod/contacts.php:729 +msgid "Blocked" +msgstr "" + +#: mod/contacts.php:732 +msgid "Only show blocked contacts" +msgstr "" + +#: mod/contacts.php:738 +msgid "Ignored" +msgstr "" + +#: mod/contacts.php:741 +msgid "Only show ignored contacts" +msgstr "" + +#: mod/contacts.php:747 +msgid "Archived" +msgstr "" + +#: mod/contacts.php:750 +msgid "Only show archived contacts" +msgstr "" + +#: mod/contacts.php:756 +msgid "Hidden" +msgstr "" + +#: mod/contacts.php:759 +msgid "Only show hidden contacts" +msgstr "" + +#: mod/contacts.php:816 +msgid "Search your contacts" +msgstr "" + +#: mod/contacts.php:824 mod/settings.php:163 mod/settings.php:709 +msgid "Update" +msgstr "" + +#: mod/contacts.php:827 mod/contacts.php:1019 +msgid "Archive" +msgstr "" + +#: mod/contacts.php:827 mod/contacts.php:1019 +msgid "Unarchive" +msgstr "" + +#: mod/contacts.php:830 +msgid "Batch Actions" +msgstr "" + +#: mod/contacts.php:876 +msgid "View all contacts" +msgstr "" + +#: mod/contacts.php:886 +msgid "View all common friends" +msgstr "" + +#: mod/contacts.php:893 +msgid "Advanced Contact Settings" +msgstr "" + +#: mod/contacts.php:927 +msgid "Mutual Friendship" +msgstr "" + +#: mod/contacts.php:931 +msgid "is a fan of yours" +msgstr "" + +#: mod/contacts.php:935 +msgid "you are a fan of" +msgstr "" + +#: mod/contacts.php:1005 +msgid "Toggle Blocked status" +msgstr "" + +#: mod/contacts.php:1013 +msgid "Toggle Ignored status" +msgstr "" + +#: mod/contacts.php:1021 +msgid "Toggle Archive status" +msgstr "" + +#: mod/contacts.php:1029 +msgid "Delete contact" +msgstr "" + +#: mod/content.php:121 mod/network.php:632 +msgid "No such group" +msgstr "" + +#: mod/content.php:132 mod/group.php:215 mod/network.php:653 +msgid "Group is empty" +msgstr "" + +#: mod/content.php:137 mod/network.php:657 +#, php-format +msgid "Group: %s" +msgstr "" + +#: mod/content.php:327 object/Item.php:101 +msgid "This entry was edited" +msgstr "" + +#: mod/content.php:623 object/Item.php:409 +#, php-format +msgid "%d comment" +msgid_plural "%d comments" +msgstr[0] "" +msgstr[1] "" + +#: mod/content.php:640 mod/photos.php:1432 object/Item.php:122 +msgid "Private Message" +msgstr "" + +#: mod/content.php:704 mod/photos.php:1628 object/Item.php:275 +msgid "I like this (toggle)" +msgstr "" + +#: mod/content.php:704 object/Item.php:275 +msgid "like" +msgstr "" + +#: mod/content.php:705 mod/photos.php:1629 object/Item.php:276 +msgid "I don't like this (toggle)" +msgstr "" + +#: mod/content.php:705 object/Item.php:276 +msgid "dislike" +msgstr "" + +#: mod/content.php:707 object/Item.php:279 +msgid "Share this" +msgstr "" + +#: mod/content.php:707 object/Item.php:279 +msgid "share" +msgstr "" + +#: mod/content.php:727 mod/photos.php:1646 mod/photos.php:1688 +#: mod/photos.php:1768 object/Item.php:694 +msgid "This is you" +msgstr "" + +#: mod/content.php:729 mod/content.php:952 mod/photos.php:1648 +#: mod/photos.php:1690 mod/photos.php:1770 object/Item.php:381 +#: object/Item.php:696 +msgid "Comment" +msgstr "" + +#: mod/content.php:731 object/Item.php:698 +msgid "Bold" +msgstr "" + +#: mod/content.php:732 object/Item.php:699 +msgid "Italic" +msgstr "" + +#: mod/content.php:733 object/Item.php:700 +msgid "Underline" +msgstr "" + +#: mod/content.php:734 object/Item.php:701 +msgid "Quote" +msgstr "" + +#: mod/content.php:735 object/Item.php:702 +msgid "Code" +msgstr "" + +#: mod/content.php:736 object/Item.php:703 +msgid "Image" +msgstr "" + +#: mod/content.php:737 object/Item.php:704 +msgid "Link" +msgstr "" + +#: mod/content.php:738 object/Item.php:705 +msgid "Video" +msgstr "" + +#: mod/content.php:748 mod/settings.php:745 object/Item.php:127 +#: object/Item.php:129 +msgid "Edit" +msgstr "" + +#: mod/content.php:774 object/Item.php:242 +msgid "add star" +msgstr "" + +#: mod/content.php:775 object/Item.php:243 +msgid "remove star" +msgstr "" + +#: mod/content.php:776 object/Item.php:244 +msgid "toggle star status" +msgstr "" + +#: mod/content.php:779 object/Item.php:247 +msgid "starred" +msgstr "" + +#: mod/content.php:780 mod/content.php:802 object/Item.php:264 +msgid "add tag" +msgstr "" + +#: mod/content.php:791 object/Item.php:252 +msgid "ignore thread" +msgstr "" + +#: mod/content.php:792 object/Item.php:253 +msgid "unignore thread" +msgstr "" + +#: mod/content.php:793 object/Item.php:254 +msgid "toggle ignore status" +msgstr "" + +#: mod/content.php:796 mod/ostatus_subscribe.php:76 object/Item.php:257 +msgid "ignored" +msgstr "" + +#: mod/content.php:807 object/Item.php:146 +msgid "save to folder" +msgstr "" + +#: mod/content.php:855 object/Item.php:216 +msgid "I will attend" +msgstr "" + +#: mod/content.php:855 object/Item.php:216 +msgid "I will not attend" +msgstr "" + +#: mod/content.php:855 object/Item.php:216 +msgid "I might attend" +msgstr "" + +#: mod/content.php:919 object/Item.php:347 +msgid "to" +msgstr "" + +#: mod/content.php:920 object/Item.php:349 +msgid "Wall-to-Wall" +msgstr "" + +#: mod/content.php:921 object/Item.php:350 +msgid "via Wall-To-Wall:" +msgstr "" + +#: mod/delegate.php:104 +msgid "No potential page delegates located." +msgstr "" + +#: mod/delegate.php:135 +msgid "" +"Delegates are able to manage all aspects of this account/page except for " +"basic account settings. Please do not delegate your personal account to " +"anybody that you do not trust completely." +msgstr "" + +#: mod/delegate.php:136 +msgid "Existing Page Managers" +msgstr "" + +#: mod/delegate.php:138 +msgid "Existing Page Delegates" +msgstr "" + +#: mod/delegate.php:140 +msgid "Potential Delegates" +msgstr "" + +#: mod/delegate.php:142 mod/tagrm.php:98 +msgid "Remove" +msgstr "" + +#: mod/delegate.php:143 +msgid "Add" +msgstr "" + +#: mod/delegate.php:144 +msgid "No entries." +msgstr "" + +#: mod/dfrn_confirm.php:73 mod/profiles.php:24 mod/profiles.php:140 +#: mod/profiles.php:187 mod/profiles.php:623 +msgid "Profile not found." +msgstr "" + +#: mod/dfrn_confirm.php:130 +msgid "" +"This may occasionally happen if contact was requested by both persons and it " +"has already been approved." +msgstr "" + +#: mod/dfrn_confirm.php:247 +msgid "Response from remote site was not understood." +msgstr "" + +#: mod/dfrn_confirm.php:256 mod/dfrn_confirm.php:261 +msgid "Unexpected response from remote site: " +msgstr "" + +#: mod/dfrn_confirm.php:270 +msgid "Confirmation completed successfully." +msgstr "" + +#: mod/dfrn_confirm.php:272 mod/dfrn_confirm.php:286 mod/dfrn_confirm.php:293 +msgid "Remote site reported: " +msgstr "" + +#: mod/dfrn_confirm.php:284 +msgid "Temporary failure. Please wait and try again." +msgstr "" + +#: mod/dfrn_confirm.php:291 +msgid "Introduction failed or was revoked." +msgstr "" + +#: mod/dfrn_confirm.php:420 +msgid "Unable to set contact photo." +msgstr "" + +#: mod/dfrn_confirm.php:561 +#, php-format +msgid "No user record found for '%s' " +msgstr "" + +#: mod/dfrn_confirm.php:571 +msgid "Our site encryption key is apparently messed up." +msgstr "" + +#: mod/dfrn_confirm.php:582 +msgid "Empty site URL was provided or URL could not be decrypted by us." +msgstr "" + +#: mod/dfrn_confirm.php:604 +msgid "Contact record was not found for you on our site." +msgstr "" + +#: mod/dfrn_confirm.php:618 +#, php-format +msgid "Site public key not available in contact record for URL %s." +msgstr "" + +#: mod/dfrn_confirm.php:638 +msgid "" +"The ID provided by your system is a duplicate on our system. It should work " +"if you try again." +msgstr "" + +#: mod/dfrn_confirm.php:649 +msgid "Unable to set your contact credentials on our system." +msgstr "" + +#: mod/dfrn_confirm.php:711 +msgid "Unable to update your contact profile details on our system" +msgstr "" + +#: mod/dfrn_confirm.php:783 +#, php-format +msgid "%1$s has joined %2$s" +msgstr "" + +#: mod/dfrn_poll.php:114 mod/dfrn_poll.php:550 #, php-format msgid "%1$s welcomes %2$s" msgstr "" -#: mod/display.php:493 +#: mod/dfrn_request.php:104 +msgid "This introduction has already been accepted." +msgstr "" + +#: mod/dfrn_request.php:127 mod/dfrn_request.php:529 +msgid "Profile location is not valid or does not contain profile information." +msgstr "" + +#: mod/dfrn_request.php:132 mod/dfrn_request.php:534 +msgid "Warning: profile location has no identifiable owner name." +msgstr "" + +#: mod/dfrn_request.php:135 mod/dfrn_request.php:537 +msgid "Warning: profile location has no profile photo." +msgstr "" + +#: mod/dfrn_request.php:139 mod/dfrn_request.php:541 +#, php-format +msgid "%d required parameter was not found at the given location" +msgid_plural "%d required parameters were not found at the given location" +msgstr[0] "" +msgstr[1] "" + +#: mod/dfrn_request.php:183 +msgid "Introduction complete." +msgstr "" + +#: mod/dfrn_request.php:228 +msgid "Unrecoverable protocol error." +msgstr "" + +#: mod/dfrn_request.php:256 +msgid "Profile unavailable." +msgstr "" + +#: mod/dfrn_request.php:283 +#, php-format +msgid "%s has received too many connection requests today." +msgstr "" + +#: mod/dfrn_request.php:284 +msgid "Spam protection measures have been invoked." +msgstr "" + +#: mod/dfrn_request.php:285 +msgid "Friends are advised to please try again in 24 hours." +msgstr "" + +#: mod/dfrn_request.php:347 +msgid "Invalid locator" +msgstr "" + +#: mod/dfrn_request.php:356 +msgid "Invalid email address." +msgstr "" + +#: mod/dfrn_request.php:381 +msgid "This account has not been configured for email. Request failed." +msgstr "" + +#: mod/dfrn_request.php:484 +msgid "You have already introduced yourself here." +msgstr "" + +#: mod/dfrn_request.php:488 +#, php-format +msgid "Apparently you are already friends with %s." +msgstr "" + +#: mod/dfrn_request.php:509 +msgid "Invalid profile URL." +msgstr "" + +#: mod/dfrn_request.php:615 +msgid "Your introduction has been sent." +msgstr "" + +#: mod/dfrn_request.php:657 +msgid "" +"Remote subscription can't be done for your network. Please subscribe " +"directly on your system." +msgstr "" + +#: mod/dfrn_request.php:678 +msgid "Please login to confirm introduction." +msgstr "" + +#: mod/dfrn_request.php:688 +msgid "" +"Incorrect identity currently logged in. Please login to this profile." +msgstr "" + +#: mod/dfrn_request.php:702 mod/dfrn_request.php:719 +msgid "Confirm" +msgstr "" + +#: mod/dfrn_request.php:714 +msgid "Hide this contact" +msgstr "" + +#: mod/dfrn_request.php:717 +#, php-format +msgid "Welcome home %s." +msgstr "" + +#: mod/dfrn_request.php:718 +#, php-format +msgid "Please confirm your introduction/connection request to %s." +msgstr "" + +#: mod/dfrn_request.php:849 +msgid "" +"Please enter your 'Identity Address' from one of the following supported " +"communications networks:" +msgstr "" + +#: mod/dfrn_request.php:873 +#, php-format +msgid "" +"If you are not yet a member of the free social web, follow this link to find a public Friendica site and join us today." +msgstr "" + +#: mod/dfrn_request.php:878 +msgid "Friend/Connection Request" +msgstr "" + +#: mod/dfrn_request.php:879 +msgid "" +"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, " +"testuser@identi.ca" +msgstr "" + +#: mod/dfrn_request.php:880 mod/follow.php:149 +msgid "Please answer the following:" +msgstr "" + +#: mod/dfrn_request.php:881 mod/follow.php:150 +#, php-format +msgid "Does %s know you?" +msgstr "" + +#: mod/dfrn_request.php:885 mod/follow.php:151 +msgid "Add a personal note:" +msgstr "" + +#: mod/dfrn_request.php:888 +msgid "StatusNet/Federated Social Web" +msgstr "" + +#: mod/dfrn_request.php:890 +#, php-format +msgid "" +" - please do not use this form. Instead, enter %s into your Diaspora search " +"bar." +msgstr "" + +#: mod/dfrn_request.php:891 mod/follow.php:157 mod/unfollow.php:113 +msgid "Your Identity Address:" +msgstr "" + +#: mod/dfrn_request.php:894 mod/follow.php:63 mod/unfollow.php:65 +msgid "Submit Request" +msgstr "" + +#: mod/directory.php:195 view/theme/vier/theme.php:194 +msgid "Global Directory" +msgstr "" + +#: mod/directory.php:197 +msgid "Find on this site" +msgstr "" + +#: mod/directory.php:199 +msgid "Results for:" +msgstr "" + +#: mod/directory.php:201 +msgid "Site Directory" +msgstr "" + +#: mod/directory.php:208 +msgid "No entries (some entries may be hidden)." +msgstr "" + +#: mod/dirfind.php:40 +#, php-format +msgid "People Search - %s" +msgstr "" + +#: mod/dirfind.php:51 +#, php-format +msgid "Forum Search - %s" +msgstr "" + +#: mod/dirfind.php:248 mod/match.php:113 +msgid "No matches" +msgstr "" + +#: mod/display.php:491 msgid "Item has been removed." msgstr "" -#: mod/item.php:118 +#: mod/editpost.php:20 mod/editpost.php:30 +msgid "Item not found" +msgstr "" + +#: mod/editpost.php:35 +msgid "Edit post" +msgstr "" + +#: mod/events.php:97 mod/events.php:99 +msgid "Event can not end before it has started." +msgstr "" + +#: mod/events.php:106 mod/events.php:108 +msgid "Event title and start time are required." +msgstr "" + +#: mod/events.php:380 +msgid "Create New Event" +msgstr "" + +#: mod/events.php:485 +msgid "Event details" +msgstr "" + +#: mod/events.php:486 +msgid "Starting date and Title are required." +msgstr "" + +#: mod/events.php:487 mod/events.php:488 +msgid "Event Starts:" +msgstr "" + +#: mod/events.php:487 mod/events.php:499 mod/profiles.php:713 +msgid "Required" +msgstr "" + +#: mod/events.php:489 mod/events.php:505 +msgid "Finish date/time is not known or not relevant" +msgstr "" + +#: mod/events.php:491 mod/events.php:492 +msgid "Event Finishes:" +msgstr "" + +#: mod/events.php:493 mod/events.php:506 +msgid "Adjust for viewer timezone" +msgstr "" + +#: mod/events.php:495 +msgid "Description:" +msgstr "" + +#: mod/events.php:499 mod/events.php:501 +msgid "Title:" +msgstr "" + +#: mod/events.php:502 mod/events.php:503 +msgid "Share this event" +msgstr "" + +#: mod/events.php:532 +msgid "Failed to remove event" +msgstr "" + +#: mod/events.php:534 +msgid "Event removed" +msgstr "" + +#: mod/fbrowser.php:135 +msgid "Files" +msgstr "" + +#: mod/fetch.php:16 mod/fetch.php:43 mod/fetch.php:52 mod/help.php:57 +#: mod/p.php:20 mod/p.php:47 mod/p.php:56 index.php:302 +msgid "Not Found" +msgstr "" + +#: mod/follow.php:42 +msgid "Contact added" +msgstr "" + +#: mod/follow.php:74 +msgid "You already added this contact." +msgstr "" + +#: mod/follow.php:83 +msgid "Diaspora support isn't enabled. Contact can't be added." +msgstr "" + +#: mod/follow.php:90 +msgid "OStatus support is disabled. Contact can't be added." +msgstr "" + +#: mod/follow.php:97 +msgid "The network type couldn't be detected. Contact can't be added." +msgstr "" + +#: mod/friendica.php:70 +msgid "This is Friendica, version" +msgstr "" + +#: mod/friendica.php:71 +msgid "running at web location" +msgstr "" + +#: mod/friendica.php:75 +msgid "" +"Please visit Friendica.com to learn " +"more about the Friendica project." +msgstr "" + +#: mod/friendica.php:79 +msgid "Bug reports and issues: please visit" +msgstr "" + +#: mod/friendica.php:79 +msgid "the bugtracker at github" +msgstr "" + +#: mod/friendica.php:82 +msgid "" +"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - " +"dot com" +msgstr "" + +#: mod/friendica.php:96 +msgid "Installed plugins/addons/apps:" +msgstr "" + +#: mod/friendica.php:110 +msgid "No installed plugins/addons/apps" +msgstr "" + +#: mod/friendica.php:115 +msgid "On this server the following remote servers are blocked." +msgstr "" + +#: mod/group.php:31 +msgid "Group created." +msgstr "" + +#: mod/group.php:37 +msgid "Could not create group." +msgstr "" + +#: mod/group.php:51 mod/group.php:156 +msgid "Group not found." +msgstr "" + +#: mod/group.php:65 +msgid "Group name changed." +msgstr "" + +#: mod/group.php:95 +msgid "Save Group" +msgstr "" + +#: mod/group.php:100 +msgid "Create a group of contacts/friends." +msgstr "" + +#: mod/group.php:125 +msgid "Group removed." +msgstr "" + +#: mod/group.php:127 +msgid "Unable to remove group." +msgstr "" + +#: mod/group.php:191 +msgid "Delete Group" +msgstr "" + +#: mod/group.php:197 +msgid "Group Editor" +msgstr "" + +#: mod/group.php:202 +msgid "Edit Group Name" +msgstr "" + +#: mod/group.php:212 +msgid "Members" +msgstr "" + +#: mod/group.php:228 +msgid "Remove Contact" +msgstr "" + +#: mod/group.php:252 +msgid "Add Contact" +msgstr "" + +#: mod/hcard.php:14 +msgid "No profile" +msgstr "" + +#: mod/help.php:45 +msgid "Help:" +msgstr "" + +#: mod/help.php:60 index.php:305 +msgid "Page not found." +msgstr "" + +#: mod/home.php:42 +#, php-format +msgid "Welcome to %s" +msgstr "" + +#: mod/install.php:109 +msgid "Friendica Communications Server - Setup" +msgstr "" + +#: mod/install.php:115 +msgid "Could not connect to database." +msgstr "" + +#: mod/install.php:119 +msgid "Could not create table." +msgstr "" + +#: mod/install.php:125 +msgid "Your Friendica site database has been installed." +msgstr "" + +#: mod/install.php:130 +msgid "" +"You may need to import the file \"database.sql\" manually using phpmyadmin " +"or mysql." +msgstr "" + +#: mod/install.php:131 mod/install.php:203 mod/install.php:550 +msgid "Please see the file \"INSTALL.txt\"." +msgstr "" + +#: mod/install.php:143 +msgid "Database already in use." +msgstr "" + +#: mod/install.php:200 +msgid "System check" +msgstr "" + +#: mod/install.php:205 +msgid "Check again" +msgstr "" + +#: mod/install.php:224 +msgid "Database connection" +msgstr "" + +#: mod/install.php:225 +msgid "" +"In order to install Friendica we need to know how to connect to your " +"database." +msgstr "" + +#: mod/install.php:226 +msgid "" +"Please contact your hosting provider or site administrator if you have " +"questions about these settings." +msgstr "" + +#: mod/install.php:227 +msgid "" +"The database you specify below should already exist. If it does not, please " +"create it before continuing." +msgstr "" + +#: mod/install.php:231 +msgid "Database Server Name" +msgstr "" + +#: mod/install.php:232 +msgid "Database Login Name" +msgstr "" + +#: mod/install.php:233 +msgid "Database Login Password" +msgstr "" + +#: mod/install.php:233 +msgid "For security reasons the password must not be empty" +msgstr "" + +#: mod/install.php:234 +msgid "Database Name" +msgstr "" + +#: mod/install.php:235 mod/install.php:276 +msgid "Site administrator email address" +msgstr "" + +#: mod/install.php:235 mod/install.php:276 +msgid "" +"Your account email address must match this in order to use the web admin " +"panel." +msgstr "" + +#: mod/install.php:239 mod/install.php:279 +msgid "Please select a default timezone for your website" +msgstr "" + +#: mod/install.php:266 +msgid "Site settings" +msgstr "" + +#: mod/install.php:280 +msgid "System Language:" +msgstr "" + +#: mod/install.php:280 +msgid "" +"Set the default language for your Friendica installation interface and to " +"send emails." +msgstr "" + +#: mod/install.php:320 +msgid "Could not find a command line version of PHP in the web server PATH." +msgstr "" + +#: mod/install.php:321 +msgid "" +"If you don't have a command line version of PHP installed on server, you " +"will not be able to run the background processing. See 'Setup the poller'" +msgstr "" + +#: mod/install.php:325 +msgid "PHP executable path" +msgstr "" + +#: mod/install.php:325 +msgid "" +"Enter full path to php executable. You can leave this blank to continue the " +"installation." +msgstr "" + +#: mod/install.php:330 +msgid "Command line PHP" +msgstr "" + +#: mod/install.php:339 +msgid "PHP executable is not the php cli binary (could be cgi-fgci version)" +msgstr "" + +#: mod/install.php:340 +msgid "Found PHP version: " +msgstr "" + +#: mod/install.php:342 +msgid "PHP cli binary" +msgstr "" + +#: mod/install.php:353 +msgid "" +"The command line version of PHP on your system does not have " +"\"register_argc_argv\" enabled." +msgstr "" + +#: mod/install.php:354 +msgid "This is required for message delivery to work." +msgstr "" + +#: mod/install.php:356 +msgid "PHP register_argc_argv" +msgstr "" + +#: mod/install.php:379 +msgid "" +"Error: the \"openssl_pkey_new\" function on this system is not able to " +"generate encryption keys" +msgstr "" + +#: mod/install.php:380 +msgid "" +"If running under Windows, please see \"http://www.php.net/manual/en/openssl." +"installation.php\"." +msgstr "" + +#: mod/install.php:382 +msgid "Generate encryption keys" +msgstr "" + +#: mod/install.php:389 +msgid "libCurl PHP module" +msgstr "" + +#: mod/install.php:390 +msgid "GD graphics PHP module" +msgstr "" + +#: mod/install.php:391 +msgid "OpenSSL PHP module" +msgstr "" + +#: mod/install.php:392 +msgid "PDO or MySQLi PHP module" +msgstr "" + +#: mod/install.php:393 +msgid "mb_string PHP module" +msgstr "" + +#: mod/install.php:394 +msgid "XML PHP module" +msgstr "" + +#: mod/install.php:395 +msgid "iconv module" +msgstr "" + +#: mod/install.php:399 mod/install.php:401 +msgid "Apache mod_rewrite module" +msgstr "" + +#: mod/install.php:399 +msgid "" +"Error: Apache webserver mod-rewrite module is required but not installed." +msgstr "" + +#: mod/install.php:407 +msgid "Error: libCURL PHP module required but not installed." +msgstr "" + +#: mod/install.php:411 +msgid "" +"Error: GD graphics PHP module with JPEG support required but not installed." +msgstr "" + +#: mod/install.php:415 +msgid "Error: openssl PHP module required but not installed." +msgstr "" + +#: mod/install.php:419 +msgid "Error: PDO or MySQLi PHP module required but not installed." +msgstr "" + +#: mod/install.php:423 +msgid "Error: The MySQL driver for PDO is not installed." +msgstr "" + +#: mod/install.php:427 +msgid "Error: mb_string PHP module required but not installed." +msgstr "" + +#: mod/install.php:431 +msgid "Error: iconv PHP module required but not installed." +msgstr "" + +#: mod/install.php:441 +msgid "Error, XML PHP module required but not installed." +msgstr "" + +#: mod/install.php:453 +msgid "" +"The web installer needs to be able to create a file called \".htconfig.php\" " +"in the top folder of your web server and it is unable to do so." +msgstr "" + +#: mod/install.php:454 +msgid "" +"This is most often a permission setting, as the web server may not be able " +"to write files in your folder - even if you can." +msgstr "" + +#: mod/install.php:455 +msgid "" +"At the end of this procedure, we will give you a text to save in a file " +"named .htconfig.php in your Friendica top folder." +msgstr "" + +#: mod/install.php:456 +msgid "" +"You can alternatively skip this procedure and perform a manual installation. " +"Please see the file \"INSTALL.txt\" for instructions." +msgstr "" + +#: mod/install.php:459 +msgid ".htconfig.php is writable" +msgstr "" + +#: mod/install.php:469 +msgid "" +"Friendica uses the Smarty3 template engine to render its web views. Smarty3 " +"compiles templates to PHP to speed up rendering." +msgstr "" + +#: mod/install.php:470 +msgid "" +"In order to store these compiled templates, the web server needs to have " +"write access to the directory view/smarty3/ under the Friendica top level " +"folder." +msgstr "" + +#: mod/install.php:471 +msgid "" +"Please ensure that the user that your web server runs as (e.g. www-data) has " +"write access to this folder." +msgstr "" + +#: mod/install.php:472 +msgid "" +"Note: as a security measure, you should give the web server write access to " +"view/smarty3/ only--not the template files (.tpl) that it contains." +msgstr "" + +#: mod/install.php:475 +msgid "view/smarty3 is writable" +msgstr "" + +#: mod/install.php:491 +msgid "" +"Url rewrite in .htaccess is not working. Check your server configuration." +msgstr "" + +#: mod/install.php:493 +msgid "Url rewrite is working" +msgstr "" + +#: mod/install.php:512 +msgid "ImageMagick PHP extension is not installed" +msgstr "" + +#: mod/install.php:514 +msgid "ImageMagick PHP extension is installed" +msgstr "" + +#: mod/install.php:516 +msgid "ImageMagick supports GIF" +msgstr "" + +#: mod/install.php:523 +msgid "" +"The database configuration file \".htconfig.php\" could not be written. " +"Please use the enclosed text to create a configuration file in your web " +"server root." +msgstr "" + +#: mod/install.php:548 +msgid "

    What next

    " +msgstr "" + +#: mod/install.php:549 +msgid "" +"IMPORTANT: You will need to [manually] setup a scheduled task for the poller." +msgstr "" + +#: mod/invite.php:31 +msgid "Total invitation limit exceeded." +msgstr "" + +#: mod/invite.php:54 +#, php-format +msgid "%s : Not a valid email address." +msgstr "" + +#: mod/invite.php:79 +msgid "Please join us on Friendica" +msgstr "" + +#: mod/invite.php:90 +msgid "Invitation limit exceeded. Please contact your site administrator." +msgstr "" + +#: mod/invite.php:94 +#, php-format +msgid "%s : Message delivery failed." +msgstr "" + +#: mod/invite.php:98 +#, php-format +msgid "%d message sent." +msgid_plural "%d messages sent." +msgstr[0] "" +msgstr[1] "" + +#: mod/invite.php:117 +msgid "You have no more invitations available" +msgstr "" + +#: mod/invite.php:125 +#, php-format +msgid "" +"Visit %s for a list of public sites that you can join. Friendica members on " +"other sites can all connect with each other, as well as with members of many " +"other social networks." +msgstr "" + +#: mod/invite.php:127 +#, php-format +msgid "" +"To accept this invitation, please visit and register at %s or any other " +"public Friendica website." +msgstr "" + +#: mod/invite.php:128 +#, php-format +msgid "" +"Friendica sites all inter-connect to create a huge privacy-enhanced social " +"web that is owned and controlled by its members. They can also connect with " +"many traditional social networks. See %s for a list of alternate Friendica " +"sites you can join." +msgstr "" + +#: mod/invite.php:132 +msgid "" +"Our apologies. This system is not currently configured to connect with other " +"public sites or invite members." +msgstr "" + +#: mod/invite.php:135 +#, php-format +msgid "To accept this invitation, please visit and register at %s." +msgstr "" + +#: mod/invite.php:136 +msgid "" +"Friendica sites all inter-connect to create a huge privacy-enhanced social " +"web that is owned and controlled by its members. They can also connect with " +"many traditional social networks." +msgstr "" + +#: mod/invite.php:142 +msgid "Send invitations" +msgstr "" + +#: mod/invite.php:143 +msgid "Enter email addresses, one per line:" +msgstr "" + +#: mod/invite.php:144 mod/message.php:332 mod/message.php:515 +#: mod/wallmessage.php:138 +msgid "Your message:" +msgstr "" + +#: mod/invite.php:145 +msgid "" +"You are cordially invited to join me and other close friends on Friendica - " +"and help us to create a better social web." +msgstr "" + +#: mod/invite.php:147 +msgid "You will need to supply this invitation code: $invite_code" +msgstr "" + +#: mod/invite.php:147 +msgid "" +"Once you have registered, please connect with me via my profile page at:" +msgstr "" + +#: mod/invite.php:149 +msgid "" +"For more information about the Friendica project and why we feel it is " +"important, please visit http://friendi.ca" +msgstr "" + +#: mod/item.php:119 msgid "Unable to locate original post." msgstr "" -#: mod/item.php:345 +#: mod/item.php:346 msgid "Empty post discarded." msgstr "" -#: mod/item.php:899 +#: mod/item.php:903 msgid "System error. Post not saved." msgstr "" -#: mod/item.php:990 +#: mod/item.php:994 #, php-format msgid "" "This message was sent to you by %s, a member of the Friendica social network." msgstr "" -#: mod/item.php:992 +#: mod/item.php:996 #, php-format msgid "You may visit them online at %s" msgstr "" -#: mod/item.php:993 +#: mod/item.php:997 msgid "" "Please contact the sender by replying to this post if you do not wish to " "receive these messages." msgstr "" -#: mod/item.php:997 +#: mod/item.php:1001 #, php-format msgid "%s posted an update." msgstr "" -#: mod/network.php:419 +#: mod/localtime.php:26 +msgid "Time Conversion" +msgstr "" + +#: mod/localtime.php:28 +msgid "" +"Friendica provides this service for sharing events with other networks and " +"friends in unknown timezones." +msgstr "" + +#: mod/localtime.php:32 +#, php-format +msgid "UTC time: %s" +msgstr "" + +#: mod/localtime.php:35 +#, php-format +msgid "Current timezone: %s" +msgstr "" + +#: mod/localtime.php:38 +#, php-format +msgid "Converted localtime: %s" +msgstr "" + +#: mod/localtime.php:43 +msgid "Please select your timezone:" +msgstr "" + +#: mod/lostpass.php:22 +msgid "No valid account found." +msgstr "" + +#: mod/lostpass.php:38 +msgid "Password reset request issued. Check your email." +msgstr "" + +#: mod/lostpass.php:44 +#, php-format +msgid "" +"\n" +"\t\tDear %1$s,\n" +"\t\t\tA request was recently received at \"%2$s\" to reset your account\n" +"\t\tpassword. In order to confirm this request, please select the " +"verification link\n" +"\t\tbelow or paste it into your web browser address bar.\n" +"\n" +"\t\tIf you did NOT request this change, please DO NOT follow the link\n" +"\t\tprovided and ignore and/or delete this email.\n" +"\n" +"\t\tYour password will not be changed unless we can verify that you\n" +"\t\tissued this request." +msgstr "" + +#: mod/lostpass.php:55 +#, php-format +msgid "" +"\n" +"\t\tFollow this link to verify your identity:\n" +"\n" +"\t\t%1$s\n" +"\n" +"\t\tYou will then receive a follow-up message containing the new password.\n" +"\t\tYou may change that password from your account settings page after " +"logging in.\n" +"\n" +"\t\tThe login details are as follows:\n" +"\n" +"\t\tSite Location:\t%2$s\n" +"\t\tLogin Name:\t%3$s" +msgstr "" + +#: mod/lostpass.php:74 +#, php-format +msgid "Password reset requested at %s" +msgstr "" + +#: mod/lostpass.php:94 +msgid "" +"Request could not be verified. (You may have previously submitted it.) " +"Password reset failed." +msgstr "" + +#: mod/lostpass.php:113 boot.php:875 +msgid "Password Reset" +msgstr "" + +#: mod/lostpass.php:114 +msgid "Your password has been reset as requested." +msgstr "" + +#: mod/lostpass.php:115 +msgid "Your new password is" +msgstr "" + +#: mod/lostpass.php:116 +msgid "Save or copy your new password - and then" +msgstr "" + +#: mod/lostpass.php:117 +msgid "click here to login" +msgstr "" + +#: mod/lostpass.php:118 +msgid "" +"Your password may be changed from the Settings page after " +"successful login." +msgstr "" + +#: mod/lostpass.php:128 +#, php-format +msgid "" +"\n" +"\t\t\t\tDear %1$s,\n" +"\t\t\t\t\tYour password has been changed as requested. Please retain this\n" +"\t\t\t\tinformation for your records (or change your password immediately " +"to\n" +"\t\t\t\tsomething that you will remember).\n" +"\t\t\t" +msgstr "" + +#: mod/lostpass.php:134 +#, php-format +msgid "" +"\n" +"\t\t\t\tYour login details are as follows:\n" +"\n" +"\t\t\t\tSite Location:\t%1$s\n" +"\t\t\t\tLogin Name:\t%2$s\n" +"\t\t\t\tPassword:\t%3$s\n" +"\n" +"\t\t\t\tYou may change that password from your account settings page after " +"logging in.\n" +"\t\t\t" +msgstr "" + +#: mod/lostpass.php:150 +#, php-format +msgid "Your password has been changed at %s" +msgstr "" + +#: mod/lostpass.php:162 +msgid "Forgot your Password?" +msgstr "" + +#: mod/lostpass.php:163 +msgid "" +"Enter your email address and submit to have your password reset. Then check " +"your email for further instructions." +msgstr "" + +#: mod/lostpass.php:164 boot.php:863 +msgid "Nickname or Email: " +msgstr "" + +#: mod/lostpass.php:165 +msgid "Reset" +msgstr "" + +#: mod/manage.php:153 +msgid "Manage Identities and/or Pages" +msgstr "" + +#: mod/manage.php:154 +msgid "" +"Toggle between different identities or community/group pages which share " +"your account details or which you have been granted \"manage\" permissions" +msgstr "" + +#: mod/manage.php:155 +msgid "Select an identity to manage: " +msgstr "" + +#: mod/match.php:39 +msgid "No keywords to match. Please add keywords to your default profile." +msgstr "" + +#: mod/match.php:92 +msgid "is interested in:" +msgstr "" + +#: mod/match.php:106 +msgid "Profile Match" +msgstr "" + +#: mod/message.php:63 mod/wallmessage.php:53 +msgid "No recipient selected." +msgstr "" + +#: mod/message.php:67 +msgid "Unable to locate contact information." +msgstr "" + +#: mod/message.php:70 mod/wallmessage.php:59 +msgid "Message could not be sent." +msgstr "" + +#: mod/message.php:73 mod/wallmessage.php:62 +msgid "Message collection failure." +msgstr "" + +#: mod/message.php:76 mod/wallmessage.php:65 +msgid "Message sent." +msgstr "" + +#: mod/message.php:205 +msgid "Do you really want to delete this message?" +msgstr "" + +#: mod/message.php:225 +msgid "Message deleted." +msgstr "" + +#: mod/message.php:255 +msgid "Conversation removed." +msgstr "" + +#: mod/message.php:322 mod/wallmessage.php:129 +msgid "Send Private Message" +msgstr "" + +#: mod/message.php:323 mod/message.php:510 mod/wallmessage.php:131 +msgid "To:" +msgstr "" + +#: mod/message.php:328 mod/message.php:512 mod/wallmessage.php:132 +msgid "Subject:" +msgstr "" + +#: mod/message.php:364 +msgid "No messages." +msgstr "" + +#: mod/message.php:403 +msgid "Message not available." +msgstr "" + +#: mod/message.php:478 +msgid "Delete message" +msgstr "" + +#: mod/message.php:503 mod/message.php:591 +msgid "Delete conversation" +msgstr "" + +#: mod/message.php:505 +msgid "" +"No secure communications available. You may be able to " +"respond from the sender's profile page." +msgstr "" + +#: mod/message.php:509 +msgid "Send Reply" +msgstr "" + +#: mod/message.php:561 +#, php-format +msgid "Unknown sender - %s" +msgstr "" + +#: mod/message.php:563 +#, php-format +msgid "You and %s" +msgstr "" + +#: mod/message.php:565 +#, php-format +msgid "%s and You" +msgstr "" + +#: mod/message.php:594 +msgid "D, d M Y - g:i A" +msgstr "" + +#: mod/message.php:597 +#, php-format +msgid "%d message" +msgid_plural "%d messages" +msgstr[0] "" +msgstr[1] "" + +#: mod/mood.php:136 +msgid "Mood" +msgstr "" + +#: mod/mood.php:137 +msgid "Set your current mood and tell your friends" +msgstr "" + +#: mod/network.php:561 #, php-format msgid "" "Warning: This group contains %s member from a network that doesn't allow non " @@ -8726,95 +7020,1824 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: mod/network.php:422 +#: mod/network.php:564 msgid "Messages in this group won't be send to these receivers." msgstr "" -#: mod/network.php:550 +#: mod/network.php:684 msgid "Private messages to this person are at risk of public disclosure." msgstr "" -#: mod/network.php:555 +#: mod/network.php:688 msgid "Invalid contact." msgstr "" -#: mod/network.php:848 +#: mod/network.php:892 msgid "Commented Order" msgstr "" -#: mod/network.php:851 +#: mod/network.php:895 msgid "Sort by Comment Date" msgstr "" -#: mod/network.php:856 +#: mod/network.php:900 msgid "Posted Order" msgstr "" -#: mod/network.php:859 +#: mod/network.php:903 msgid "Sort by Post Date" msgstr "" -#: mod/network.php:870 +#: mod/network.php:914 msgid "Posts that mention or involve you" msgstr "" -#: mod/network.php:878 +#: mod/network.php:922 msgid "New" msgstr "" -#: mod/network.php:881 +#: mod/network.php:925 msgid "Activity Stream - by date" msgstr "" -#: mod/network.php:889 +#: mod/network.php:933 msgid "Shared Links" msgstr "" -#: mod/network.php:892 +#: mod/network.php:936 msgid "Interesting Links" msgstr "" -#: mod/network.php:900 +#: mod/network.php:944 msgid "Starred" msgstr "" -#: mod/network.php:903 +#: mod/network.php:947 msgid "Favourite Posts" msgstr "" -#: mod/profile.php:176 +#: mod/notifications.php:38 +msgid "Invalid request identifier." +msgstr "" + +#: mod/notifications.php:47 mod/notifications.php:183 mod/notifications.php:230 +msgid "Discard" +msgstr "" + +#: mod/notifications.php:108 +msgid "Network Notifications" +msgstr "" + +#: mod/notifications.php:114 mod/notify.php:73 +msgid "System Notifications" +msgstr "" + +#: mod/notifications.php:120 +msgid "Personal Notifications" +msgstr "" + +#: mod/notifications.php:126 +msgid "Home Notifications" +msgstr "" + +#: mod/notifications.php:155 +msgid "Show Ignored Requests" +msgstr "" + +#: mod/notifications.php:155 +msgid "Hide Ignored Requests" +msgstr "" + +#: mod/notifications.php:167 mod/notifications.php:237 +msgid "Notification type: " +msgstr "" + +#: mod/notifications.php:170 +#, php-format +msgid "suggested by %s" +msgstr "" + +#: mod/notifications.php:176 mod/notifications.php:255 +msgid "Post a new friend activity" +msgstr "" + +#: mod/notifications.php:176 mod/notifications.php:255 +msgid "if applicable" +msgstr "" + +#: mod/notifications.php:198 +msgid "Claims to be known to you: " +msgstr "" + +#: mod/notifications.php:199 +msgid "yes" +msgstr "" + +#: mod/notifications.php:199 +msgid "no" +msgstr "" + +#: mod/notifications.php:200 mod/notifications.php:205 +msgid "Shall your connection be bidirectional or not?" +msgstr "" + +#: mod/notifications.php:201 mod/notifications.php:206 +#, php-format +msgid "" +"Accepting %s as a friend allows %s to subscribe to your posts, and you will " +"also receive updates from them in your news feed." +msgstr "" + +#: mod/notifications.php:202 +#, php-format +msgid "" +"Accepting %s as a subscriber allows them to subscribe to your posts, but you " +"will not receive updates from them in your news feed." +msgstr "" + +#: mod/notifications.php:207 +#, php-format +msgid "" +"Accepting %s as a sharer allows them to subscribe to your posts, but you " +"will not receive updates from them in your news feed." +msgstr "" + +#: mod/notifications.php:218 +msgid "Friend" +msgstr "" + +#: mod/notifications.php:219 +msgid "Sharer" +msgstr "" + +#: mod/notifications.php:219 +msgid "Subscriber" +msgstr "" + +#: mod/notifications.php:275 +msgid "No introductions." +msgstr "" + +#: mod/notifications.php:316 +msgid "Show unread" +msgstr "" + +#: mod/notifications.php:316 +msgid "Show all" +msgstr "" + +#: mod/notifications.php:322 +#, php-format +msgid "No more %s notifications." +msgstr "" + +#: mod/notify.php:69 +msgid "No more system notifications." +msgstr "" + +#: mod/oexchange.php:25 +msgid "Post successful." +msgstr "" + +#: mod/openid.php:25 +msgid "OpenID protocol error. No ID returned." +msgstr "" + +#: mod/openid.php:61 +msgid "" +"Account not found and OpenID registration is not permitted on this site." +msgstr "" + +#: mod/ostatus_subscribe.php:17 +msgid "Subscribing to OStatus contacts" +msgstr "" + +#: mod/ostatus_subscribe.php:28 +msgid "No contact provided." +msgstr "" + +#: mod/ostatus_subscribe.php:34 +msgid "Couldn't fetch information for contact." +msgstr "" + +#: mod/ostatus_subscribe.php:43 +msgid "Couldn't fetch friends for contact." +msgstr "" + +#: mod/ostatus_subscribe.php:57 mod/repair_ostatus.php:47 +msgid "Done" +msgstr "" + +#: mod/ostatus_subscribe.php:71 +msgid "success" +msgstr "" + +#: mod/ostatus_subscribe.php:73 +msgid "failed" +msgstr "" + +#: mod/ostatus_subscribe.php:81 mod/repair_ostatus.php:53 +msgid "Keep this window open until done." +msgstr "" + +#: mod/p.php:13 +msgid "Not Extended" +msgstr "" + +#: mod/photos.php:97 mod/photos.php:1903 +msgid "Recent Photos" +msgstr "" + +#: mod/photos.php:100 mod/photos.php:1331 mod/photos.php:1905 +msgid "Upload New Photos" +msgstr "" + +#: mod/photos.php:115 mod/settings.php:39 +msgid "everybody" +msgstr "" + +#: mod/photos.php:179 +msgid "Contact information unavailable" +msgstr "" + +#: mod/photos.php:200 +msgid "Album not found." +msgstr "" + +#: mod/photos.php:233 mod/photos.php:245 mod/photos.php:1275 +msgid "Delete Album" +msgstr "" + +#: mod/photos.php:243 +msgid "Do you really want to delete this photo album and all its photos?" +msgstr "" + +#: mod/photos.php:326 mod/photos.php:337 mod/photos.php:1601 +msgid "Delete Photo" +msgstr "" + +#: mod/photos.php:335 +msgid "Do you really want to delete this photo?" +msgstr "" + +#: mod/photos.php:716 +#, php-format +msgid "%1$s was tagged in %2$s by %3$s" +msgstr "" + +#: mod/photos.php:716 +msgid "a photo" +msgstr "" + +#: mod/photos.php:816 mod/profile_photo.php:156 mod/wall_upload.php:182 +#, php-format +msgid "Image exceeds size limit of %s" +msgstr "" + +#: mod/photos.php:824 +msgid "Image file is empty." +msgstr "" + +#: mod/photos.php:857 mod/profile_photo.php:165 mod/wall_upload.php:219 +msgid "Unable to process image." +msgstr "" + +#: mod/photos.php:886 mod/profile_photo.php:315 mod/wall_upload.php:258 +msgid "Image upload failed." +msgstr "" + +#: mod/photos.php:991 +msgid "No photos selected" +msgstr "" + +#: mod/photos.php:1094 mod/videos.php:312 +msgid "Access to this item is restricted." +msgstr "" + +#: mod/photos.php:1154 +#, php-format +msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage." +msgstr "" + +#: mod/photos.php:1191 +msgid "Upload Photos" +msgstr "" + +#: mod/photos.php:1195 mod/photos.php:1270 +msgid "New album name: " +msgstr "" + +#: mod/photos.php:1196 +msgid "or existing album name: " +msgstr "" + +#: mod/photos.php:1197 +msgid "Do not show a status post for this upload" +msgstr "" + +#: mod/photos.php:1208 mod/photos.php:1605 mod/settings.php:1309 +msgid "Show to Groups" +msgstr "" + +#: mod/photos.php:1209 mod/photos.php:1606 mod/settings.php:1310 +msgid "Show to Contacts" +msgstr "" + +#: mod/photos.php:1210 +msgid "Private Photo" +msgstr "" + +#: mod/photos.php:1211 +msgid "Public Photo" +msgstr "" + +#: mod/photos.php:1281 +msgid "Edit Album" +msgstr "" + +#: mod/photos.php:1286 +msgid "Show Newest First" +msgstr "" + +#: mod/photos.php:1288 +msgid "Show Oldest First" +msgstr "" + +#: mod/photos.php:1317 mod/photos.php:1888 +msgid "View Photo" +msgstr "" + +#: mod/photos.php:1362 +msgid "Permission denied. Access to this item may be restricted." +msgstr "" + +#: mod/photos.php:1364 +msgid "Photo not available" +msgstr "" + +#: mod/photos.php:1425 +msgid "View photo" +msgstr "" + +#: mod/photos.php:1425 +msgid "Edit photo" +msgstr "" + +#: mod/photos.php:1426 +msgid "Use as profile photo" +msgstr "" + +#: mod/photos.php:1451 +msgid "View Full Size" +msgstr "" + +#: mod/photos.php:1541 +msgid "Tags: " +msgstr "" + +#: mod/photos.php:1544 +msgid "[Remove any tag]" +msgstr "" + +#: mod/photos.php:1587 +msgid "New album name" +msgstr "" + +#: mod/photos.php:1588 +msgid "Caption" +msgstr "" + +#: mod/photos.php:1589 +msgid "Add a Tag" +msgstr "" + +#: mod/photos.php:1589 +msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping" +msgstr "" + +#: mod/photos.php:1590 +msgid "Do not rotate" +msgstr "" + +#: mod/photos.php:1591 +msgid "Rotate CW (right)" +msgstr "" + +#: mod/photos.php:1592 +msgid "Rotate CCW (left)" +msgstr "" + +#: mod/photos.php:1607 +msgid "Private photo" +msgstr "" + +#: mod/photos.php:1608 +msgid "Public photo" +msgstr "" + +#: mod/photos.php:1817 +msgid "Map" +msgstr "" + +#: mod/photos.php:1894 mod/videos.php:396 +msgid "View Album" +msgstr "" + +#: mod/ping.php:275 +msgid "{0} wants to be your friend" +msgstr "" + +#: mod/ping.php:290 +msgid "{0} sent you a message" +msgstr "" + +#: mod/ping.php:305 +msgid "{0} requested registration" +msgstr "" + +#: mod/poke.php:198 +msgid "Poke/Prod" +msgstr "" + +#: mod/poke.php:199 +msgid "poke, prod or do other things to somebody" +msgstr "" + +#: mod/poke.php:200 +msgid "Recipient" +msgstr "" + +#: mod/poke.php:201 +msgid "Choose what you wish to do to recipient" +msgstr "" + +#: mod/poke.php:204 +msgid "Make this post private" +msgstr "" + +#: mod/profile.php:177 msgid "Tips for New Members" msgstr "" -#: object/Item.php:355 +#: mod/profile_photo.php:45 +msgid "Image uploaded but image cropping failed." +msgstr "" + +#: mod/profile_photo.php:78 mod/profile_photo.php:86 mod/profile_photo.php:94 +#: mod/profile_photo.php:323 +#, php-format +msgid "Image size reduction [%s] failed." +msgstr "" + +#: mod/profile_photo.php:128 +msgid "" +"Shift-reload the page or clear browser cache if the new photo does not " +"display immediately." +msgstr "" + +#: mod/profile_photo.php:137 +msgid "Unable to process image" +msgstr "" + +#: mod/profile_photo.php:254 +msgid "Upload File:" +msgstr "" + +#: mod/profile_photo.php:255 +msgid "Select a profile:" +msgstr "" + +#: mod/profile_photo.php:257 +msgid "Upload" +msgstr "" + +#: mod/profile_photo.php:260 +msgid "or" +msgstr "" + +#: mod/profile_photo.php:260 +msgid "skip this step" +msgstr "" + +#: mod/profile_photo.php:260 +msgid "select a photo from your photo albums" +msgstr "" + +#: mod/profile_photo.php:274 +msgid "Crop Image" +msgstr "" + +#: mod/profile_photo.php:275 +msgid "Please adjust the image cropping for optimum viewing." +msgstr "" + +#: mod/profile_photo.php:277 +msgid "Done Editing" +msgstr "" + +#: mod/profile_photo.php:313 +msgid "Image uploaded successfully." +msgstr "" + +#: mod/profiles.php:43 +msgid "Profile deleted." +msgstr "" + +#: mod/profiles.php:59 mod/profiles.php:95 +msgid "Profile-" +msgstr "" + +#: mod/profiles.php:78 mod/profiles.php:123 +msgid "New profile created." +msgstr "" + +#: mod/profiles.php:101 +msgid "Profile unavailable to clone." +msgstr "" + +#: mod/profiles.php:197 +msgid "Profile Name is required." +msgstr "" + +#: mod/profiles.php:337 +msgid "Marital Status" +msgstr "" + +#: mod/profiles.php:341 +msgid "Romantic Partner" +msgstr "" + +#: mod/profiles.php:353 +msgid "Work/Employment" +msgstr "" + +#: mod/profiles.php:356 +msgid "Religion" +msgstr "" + +#: mod/profiles.php:360 +msgid "Political Views" +msgstr "" + +#: mod/profiles.php:364 +msgid "Gender" +msgstr "" + +#: mod/profiles.php:368 +msgid "Sexual Preference" +msgstr "" + +#: mod/profiles.php:372 +msgid "XMPP" +msgstr "" + +#: mod/profiles.php:376 +msgid "Homepage" +msgstr "" + +#: mod/profiles.php:380 mod/profiles.php:699 +msgid "Interests" +msgstr "" + +#: mod/profiles.php:384 +msgid "Address" +msgstr "" + +#: mod/profiles.php:391 mod/profiles.php:695 +msgid "Location" +msgstr "" + +#: mod/profiles.php:476 +msgid "Profile updated." +msgstr "" + +#: mod/profiles.php:568 +msgid " and " +msgstr "" + +#: mod/profiles.php:577 +msgid "public profile" +msgstr "" + +#: mod/profiles.php:580 +#, php-format +msgid "%1$s changed %2$s to “%3$s”" +msgstr "" + +#: mod/profiles.php:581 +#, php-format +msgid " - Visit %1$s's %2$s" +msgstr "" + +#: mod/profiles.php:583 +#, php-format +msgid "%1$s has an updated %2$s, changing %3$s." +msgstr "" + +#: mod/profiles.php:641 +msgid "Hide contacts and friends:" +msgstr "" + +#: mod/profiles.php:646 +msgid "Hide your contact/friend list from viewers of this profile?" +msgstr "" + +#: mod/profiles.php:671 +msgid "Show more profile fields:" +msgstr "" + +#: mod/profiles.php:683 +msgid "Profile Actions" +msgstr "" + +#: mod/profiles.php:684 +msgid "Edit Profile Details" +msgstr "" + +#: mod/profiles.php:686 +msgid "Change Profile Photo" +msgstr "" + +#: mod/profiles.php:687 +msgid "View this profile" +msgstr "" + +#: mod/profiles.php:689 +msgid "Create a new profile using these settings" +msgstr "" + +#: mod/profiles.php:690 +msgid "Clone this profile" +msgstr "" + +#: mod/profiles.php:691 +msgid "Delete this profile" +msgstr "" + +#: mod/profiles.php:693 +msgid "Basic information" +msgstr "" + +#: mod/profiles.php:694 +msgid "Profile picture" +msgstr "" + +#: mod/profiles.php:696 +msgid "Preferences" +msgstr "" + +#: mod/profiles.php:697 +msgid "Status information" +msgstr "" + +#: mod/profiles.php:698 +msgid "Additional information" +msgstr "" + +#: mod/profiles.php:701 +msgid "Relation" +msgstr "" + +#: mod/profiles.php:705 +msgid "Your Gender:" +msgstr "" + +#: mod/profiles.php:706 +msgid " Marital Status:" +msgstr "" + +#: mod/profiles.php:708 +msgid "Example: fishing photography software" +msgstr "" + +#: mod/profiles.php:713 +msgid "Profile Name:" +msgstr "" + +#: mod/profiles.php:715 +msgid "" +"This is your public profile.
    It may " +"be visible to anybody using the internet." +msgstr "" + +#: mod/profiles.php:716 +msgid "Your Full Name:" +msgstr "" + +#: mod/profiles.php:717 +msgid "Title/Description:" +msgstr "" + +#: mod/profiles.php:720 +msgid "Street Address:" +msgstr "" + +#: mod/profiles.php:721 +msgid "Locality/City:" +msgstr "" + +#: mod/profiles.php:722 +msgid "Region/State:" +msgstr "" + +#: mod/profiles.php:723 +msgid "Postal/Zip Code:" +msgstr "" + +#: mod/profiles.php:724 +msgid "Country:" +msgstr "" + +#: mod/profiles.php:728 +msgid "Who: (if applicable)" +msgstr "" + +#: mod/profiles.php:728 +msgid "Examples: cathy123, Cathy Williams, cathy@example.com" +msgstr "" + +#: mod/profiles.php:729 +msgid "Since [date]:" +msgstr "" + +#: mod/profiles.php:731 +msgid "Tell us about yourself..." +msgstr "" + +#: mod/profiles.php:732 +msgid "XMPP (Jabber) address:" +msgstr "" + +#: mod/profiles.php:732 +msgid "" +"The XMPP address will be propagated to your contacts so that they can follow " +"you." +msgstr "" + +#: mod/profiles.php:733 +msgid "Homepage URL:" +msgstr "" + +#: mod/profiles.php:736 +msgid "Religious Views:" +msgstr "" + +#: mod/profiles.php:737 +msgid "Public Keywords:" +msgstr "" + +#: mod/profiles.php:737 +msgid "(Used for suggesting potential friends, can be seen by others)" +msgstr "" + +#: mod/profiles.php:738 +msgid "Private Keywords:" +msgstr "" + +#: mod/profiles.php:738 +msgid "(Used for searching profiles, never shown to others)" +msgstr "" + +#: mod/profiles.php:741 +msgid "Musical interests" +msgstr "" + +#: mod/profiles.php:742 +msgid "Books, literature" +msgstr "" + +#: mod/profiles.php:743 +msgid "Television" +msgstr "" + +#: mod/profiles.php:744 +msgid "Film/dance/culture/entertainment" +msgstr "" + +#: mod/profiles.php:745 +msgid "Hobbies/Interests" +msgstr "" + +#: mod/profiles.php:746 +msgid "Love/romance" +msgstr "" + +#: mod/profiles.php:747 +msgid "Work/employment" +msgstr "" + +#: mod/profiles.php:748 +msgid "School/education" +msgstr "" + +#: mod/profiles.php:749 +msgid "Contact information and Social Networks" +msgstr "" + +#: mod/profiles.php:790 +msgid "Edit/Manage Profiles" +msgstr "" + +#: mod/register.php:97 +msgid "" +"Registration successful. Please check your email for further instructions." +msgstr "" + +#: mod/register.php:102 +#, php-format +msgid "" +"Failed to send email message. Here your accout details:
    login: %s
    " +"password: %s

    You can change your password after login." +msgstr "" + +#: mod/register.php:109 +msgid "Registration successful." +msgstr "" + +#: mod/register.php:115 +msgid "Your registration can not be processed." +msgstr "" + +#: mod/register.php:164 +msgid "Your registration is pending approval by the site owner." +msgstr "" + +#: mod/register.php:230 +msgid "" +"You may (optionally) fill in this form via OpenID by supplying your OpenID " +"and clicking 'Register'." +msgstr "" + +#: mod/register.php:231 +msgid "" +"If you are not familiar with OpenID, please leave that field blank and fill " +"in the rest of the items." +msgstr "" + +#: mod/register.php:232 +msgid "Your OpenID (optional): " +msgstr "" + +#: mod/register.php:246 +msgid "Include your profile in member directory?" +msgstr "" + +#: mod/register.php:271 +msgid "Note for the admin" +msgstr "" + +#: mod/register.php:271 +msgid "Leave a message for the admin, why you want to join this node" +msgstr "" + +#: mod/register.php:272 +msgid "Membership on this site is by invitation only." +msgstr "" + +#: mod/register.php:273 +msgid "Your invitation ID: " +msgstr "" + +#: mod/register.php:284 +msgid "Your Full Name (e.g. Joe Smith, real or real-looking): " +msgstr "" + +#: mod/register.php:285 +msgid "Your Email Address: " +msgstr "" + +#: mod/register.php:287 mod/settings.php:1280 +msgid "New Password:" +msgstr "" + +#: mod/register.php:287 +msgid "Leave empty for an auto generated password." +msgstr "" + +#: mod/register.php:288 mod/settings.php:1281 +msgid "Confirm:" +msgstr "" + +#: mod/register.php:289 +msgid "" +"Choose a profile nickname. This must begin with a text character. Your " +"profile address on this site will then be 'nickname@$sitename'." +msgstr "" + +#: mod/register.php:290 +msgid "Choose a nickname: " +msgstr "" + +#: mod/register.php:300 +msgid "Import your profile to this friendica instance" +msgstr "" + +#: mod/regmod.php:61 +msgid "Account approved." +msgstr "" + +#: mod/regmod.php:89 +#, php-format +msgid "Registration revoked for %s" +msgstr "" + +#: mod/regmod.php:101 +msgid "Please login." +msgstr "" + +#: mod/removeme.php:55 mod/removeme.php:58 +msgid "Remove My Account" +msgstr "" + +#: mod/removeme.php:56 +msgid "" +"This will completely remove your account. Once this has been done it is not " +"recoverable." +msgstr "" + +#: mod/removeme.php:57 +msgid "Please enter your password for verification:" +msgstr "" + +#: mod/repair_ostatus.php:17 +msgid "Resubscribing to OStatus contacts" +msgstr "" + +#: mod/repair_ostatus.php:33 +msgid "Error" +msgstr "" + +#: mod/settings.php:63 +msgid "Display" +msgstr "" + +#: mod/settings.php:70 mod/settings.php:892 +msgid "Social Networks" +msgstr "" + +#: mod/settings.php:91 +msgid "Connected apps" +msgstr "" + +#: mod/settings.php:98 mod/uexport.php:47 +msgid "Export personal data" +msgstr "" + +#: mod/settings.php:105 +msgid "Remove account" +msgstr "" + +#: mod/settings.php:160 +msgid "Missing some important data!" +msgstr "" + +#: mod/settings.php:274 +msgid "Failed to connect with email account using the settings provided." +msgstr "" + +#: mod/settings.php:279 +msgid "Email settings updated." +msgstr "" + +#: mod/settings.php:294 +msgid "Features updated" +msgstr "" + +#: mod/settings.php:364 +msgid "Relocate message has been send to your contacts" +msgstr "" + +#: mod/settings.php:383 +msgid "Empty passwords are not allowed. Password unchanged." +msgstr "" + +#: mod/settings.php:391 +msgid "Wrong password." +msgstr "" + +#: mod/settings.php:402 +msgid "Password changed." +msgstr "" + +#: mod/settings.php:404 +msgid "Password update failed. Please try again." +msgstr "" + +#: mod/settings.php:484 +msgid " Please use a shorter name." +msgstr "" + +#: mod/settings.php:486 +msgid " Name too short." +msgstr "" + +#: mod/settings.php:495 +msgid "Wrong Password" +msgstr "" + +#: mod/settings.php:500 +msgid " Not valid email." +msgstr "" + +#: mod/settings.php:506 +msgid " Cannot change to that email." +msgstr "" + +#: mod/settings.php:562 +msgid "Private forum has no privacy permissions. Using default privacy group." +msgstr "" + +#: mod/settings.php:566 +msgid "Private forum has no privacy permissions and no default privacy group." +msgstr "" + +#: mod/settings.php:606 +msgid "Settings updated." +msgstr "" + +#: mod/settings.php:682 mod/settings.php:708 mod/settings.php:744 +msgid "Add application" +msgstr "" + +#: mod/settings.php:686 mod/settings.php:712 +msgid "Consumer Key" +msgstr "" + +#: mod/settings.php:687 mod/settings.php:713 +msgid "Consumer Secret" +msgstr "" + +#: mod/settings.php:688 mod/settings.php:714 +msgid "Redirect" +msgstr "" + +#: mod/settings.php:689 mod/settings.php:715 +msgid "Icon url" +msgstr "" + +#: mod/settings.php:700 +msgid "You can't edit this application." +msgstr "" + +#: mod/settings.php:743 +msgid "Connected Apps" +msgstr "" + +#: mod/settings.php:747 +msgid "Client key starts with" +msgstr "" + +#: mod/settings.php:748 +msgid "No name" +msgstr "" + +#: mod/settings.php:749 +msgid "Remove authorization" +msgstr "" + +#: mod/settings.php:761 +msgid "No Plugin settings configured" +msgstr "" + +#: mod/settings.php:770 +msgid "Plugin Settings" +msgstr "" + +#: mod/settings.php:792 +msgid "Additional Features" +msgstr "" + +#: mod/settings.php:802 mod/settings.php:806 +msgid "General Social Media Settings" +msgstr "" + +#: mod/settings.php:812 +msgid "Disable intelligent shortening" +msgstr "" + +#: mod/settings.php:814 +msgid "" +"Normally the system tries to find the best link to add to shortened posts. " +"If this option is enabled then every shortened post will always point to the " +"original friendica post." +msgstr "" + +#: mod/settings.php:820 +msgid "Automatically follow any GNU Social (OStatus) followers/mentioners" +msgstr "" + +#: mod/settings.php:822 +msgid "" +"If you receive a message from an unknown OStatus user, this option decides " +"what to do. If it is checked, a new contact will be created for every " +"unknown user." +msgstr "" + +#: mod/settings.php:828 +msgid "Default group for OStatus contacts" +msgstr "" + +#: mod/settings.php:836 +msgid "Your legacy GNU Social account" +msgstr "" + +#: mod/settings.php:838 +msgid "" +"If you enter your old GNU Social/Statusnet account name here (in the format " +"user@domain.tld), your contacts will be added automatically. The field will " +"be emptied when done." +msgstr "" + +#: mod/settings.php:841 +msgid "Repair OStatus subscriptions" +msgstr "" + +#: mod/settings.php:850 mod/settings.php:851 +#, php-format +msgid "Built-in support for %s connectivity is %s" +msgstr "" + +#: mod/settings.php:850 mod/settings.php:851 +msgid "enabled" +msgstr "" + +#: mod/settings.php:850 mod/settings.php:851 +msgid "disabled" +msgstr "" + +#: mod/settings.php:851 +msgid "GNU Social (OStatus)" +msgstr "" + +#: mod/settings.php:885 +msgid "Email access is disabled on this site." +msgstr "" + +#: mod/settings.php:897 +msgid "Email/Mailbox Setup" +msgstr "" + +#: mod/settings.php:898 +msgid "" +"If you wish to communicate with email contacts using this service " +"(optional), please specify how to connect to your mailbox." +msgstr "" + +#: mod/settings.php:899 +msgid "Last successful email check:" +msgstr "" + +#: mod/settings.php:901 +msgid "IMAP server name:" +msgstr "" + +#: mod/settings.php:902 +msgid "IMAP port:" +msgstr "" + +#: mod/settings.php:903 +msgid "Security:" +msgstr "" + +#: mod/settings.php:903 mod/settings.php:908 +msgid "None" +msgstr "" + +#: mod/settings.php:904 +msgid "Email login name:" +msgstr "" + +#: mod/settings.php:905 +msgid "Email password:" +msgstr "" + +#: mod/settings.php:906 +msgid "Reply-to address:" +msgstr "" + +#: mod/settings.php:907 +msgid "Send public posts to all email contacts:" +msgstr "" + +#: mod/settings.php:908 +msgid "Action after import:" +msgstr "" + +#: mod/settings.php:908 +msgid "Move to folder" +msgstr "" + +#: mod/settings.php:909 +msgid "Move to folder:" +msgstr "" + +#: mod/settings.php:1005 +msgid "Display Settings" +msgstr "" + +#: mod/settings.php:1011 mod/settings.php:1034 +msgid "Display Theme:" +msgstr "" + +#: mod/settings.php:1012 +msgid "Mobile Theme:" +msgstr "" + +#: mod/settings.php:1013 +msgid "Suppress warning of insecure networks" +msgstr "" + +#: mod/settings.php:1013 +msgid "" +"Should the system suppress the warning that the current group contains " +"members of networks that can't receive non public postings." +msgstr "" + +#: mod/settings.php:1014 +msgid "Update browser every xx seconds" +msgstr "" + +#: mod/settings.php:1014 +msgid "Minimum of 10 seconds. Enter -1 to disable it." +msgstr "" + +#: mod/settings.php:1015 +msgid "Number of items to display per page:" +msgstr "" + +#: mod/settings.php:1015 mod/settings.php:1016 +msgid "Maximum of 100 items" +msgstr "" + +#: mod/settings.php:1016 +msgid "Number of items to display per page when viewed from mobile device:" +msgstr "" + +#: mod/settings.php:1017 +msgid "Don't show emoticons" +msgstr "" + +#: mod/settings.php:1018 +msgid "Calendar" +msgstr "" + +#: mod/settings.php:1019 +msgid "Beginning of week:" +msgstr "" + +#: mod/settings.php:1020 +msgid "Don't show notices" +msgstr "" + +#: mod/settings.php:1021 +msgid "Infinite scroll" +msgstr "" + +#: mod/settings.php:1022 +msgid "Automatic updates only at the top of the network page" +msgstr "" + +#: mod/settings.php:1022 +msgid "" +"When disabled, the network page is updated all the time, which could be " +"confusing while reading." +msgstr "" + +#: mod/settings.php:1023 +msgid "Bandwith Saver Mode" +msgstr "" + +#: mod/settings.php:1023 +msgid "" +"When enabled, embedded content is not displayed on automatic updates, they " +"only show on page reload." +msgstr "" + +#: mod/settings.php:1025 +msgid "General Theme Settings" +msgstr "" + +#: mod/settings.php:1026 +msgid "Custom Theme Settings" +msgstr "" + +#: mod/settings.php:1027 +msgid "Content Settings" +msgstr "" + +#: mod/settings.php:1028 view/theme/duepuntozero/config.php:67 +#: view/theme/frio/config.php:70 view/theme/quattro/config.php:73 +#: view/theme/vier/config.php:116 +msgid "Theme settings" +msgstr "" + +#: mod/settings.php:1112 +msgid "Account Types" +msgstr "" + +#: mod/settings.php:1113 +msgid "Personal Page Subtypes" +msgstr "" + +#: mod/settings.php:1114 +msgid "Community Forum Subtypes" +msgstr "" + +#: mod/settings.php:1121 +msgid "Personal Page" +msgstr "" + +#: mod/settings.php:1122 +msgid "Account for a personal profile." +msgstr "" + +#: mod/settings.php:1125 +msgid "Organisation Page" +msgstr "" + +#: mod/settings.php:1126 +msgid "" +"Account for an organisation that automatically approves contact requests as " +"\"Followers\"." +msgstr "" + +#: mod/settings.php:1129 +msgid "News Page" +msgstr "" + +#: mod/settings.php:1130 +msgid "" +"Account for a news reflector that automatically approves contact requests as " +"\"Followers\"." +msgstr "" + +#: mod/settings.php:1133 +msgid "Community Forum" +msgstr "" + +#: mod/settings.php:1134 +msgid "Account for community discussions." +msgstr "" + +#: mod/settings.php:1137 +msgid "Normal Account Page" +msgstr "" + +#: mod/settings.php:1138 +msgid "" +"Account for a regular personal profile that requires manual approval of " +"\"Friends\" and \"Followers\"." +msgstr "" + +#: mod/settings.php:1141 +msgid "Soapbox Page" +msgstr "" + +#: mod/settings.php:1142 +msgid "" +"Account for a public profile that automatically approves contact requests as " +"\"Followers\"." +msgstr "" + +#: mod/settings.php:1145 +msgid "Public Forum" +msgstr "" + +#: mod/settings.php:1146 +msgid "Automatically approves all contact requests." +msgstr "" + +#: mod/settings.php:1149 +msgid "Automatic Friend Page" +msgstr "" + +#: mod/settings.php:1150 +msgid "" +"Account for a popular profile that automatically approves contact requests " +"as \"Friends\"." +msgstr "" + +#: mod/settings.php:1153 +msgid "Private Forum [Experimental]" +msgstr "" + +#: mod/settings.php:1154 +msgid "Requires manual approval of contact requests." +msgstr "" + +#: mod/settings.php:1165 +msgid "OpenID:" +msgstr "" + +#: mod/settings.php:1165 +msgid "(Optional) Allow this OpenID to login to this account." +msgstr "" + +#: mod/settings.php:1173 +msgid "Publish your default profile in your local site directory?" +msgstr "" + +#: mod/settings.php:1173 +msgid "Your profile may be visible in public." +msgstr "" + +#: mod/settings.php:1179 +msgid "Publish your default profile in the global social directory?" +msgstr "" + +#: mod/settings.php:1186 +msgid "Hide your contact/friend list from viewers of your default profile?" +msgstr "" + +#: mod/settings.php:1190 +msgid "" +"If enabled, posting public messages to Diaspora and other networks isn't " +"possible." +msgstr "" + +#: mod/settings.php:1195 +msgid "Allow friends to post to your profile page?" +msgstr "" + +#: mod/settings.php:1200 +msgid "Allow friends to tag your posts?" +msgstr "" + +#: mod/settings.php:1205 +msgid "Allow us to suggest you as a potential friend to new members?" +msgstr "" + +#: mod/settings.php:1210 +msgid "Permit unknown people to send you private mail?" +msgstr "" + +#: mod/settings.php:1218 +msgid "Profile is not published." +msgstr "" + +#: mod/settings.php:1226 +#, php-format +msgid "Your Identity Address is '%s' or '%s'." +msgstr "" + +#: mod/settings.php:1233 +msgid "Automatically expire posts after this many days:" +msgstr "" + +#: mod/settings.php:1233 +msgid "If empty, posts will not expire. Expired posts will be deleted" +msgstr "" + +#: mod/settings.php:1234 +msgid "Advanced expiration settings" +msgstr "" + +#: mod/settings.php:1235 +msgid "Advanced Expiration" +msgstr "" + +#: mod/settings.php:1236 +msgid "Expire posts:" +msgstr "" + +#: mod/settings.php:1237 +msgid "Expire personal notes:" +msgstr "" + +#: mod/settings.php:1238 +msgid "Expire starred posts:" +msgstr "" + +#: mod/settings.php:1239 +msgid "Expire photos:" +msgstr "" + +#: mod/settings.php:1240 +msgid "Only expire posts by others:" +msgstr "" + +#: mod/settings.php:1271 +msgid "Account Settings" +msgstr "" + +#: mod/settings.php:1279 +msgid "Password Settings" +msgstr "" + +#: mod/settings.php:1281 +msgid "Leave password fields blank unless changing" +msgstr "" + +#: mod/settings.php:1282 +msgid "Current Password:" +msgstr "" + +#: mod/settings.php:1282 mod/settings.php:1283 +msgid "Your current password to confirm the changes" +msgstr "" + +#: mod/settings.php:1283 +msgid "Password:" +msgstr "" + +#: mod/settings.php:1287 +msgid "Basic Settings" +msgstr "" + +#: mod/settings.php:1289 +msgid "Email Address:" +msgstr "" + +#: mod/settings.php:1290 +msgid "Your Timezone:" +msgstr "" + +#: mod/settings.php:1291 +msgid "Your Language:" +msgstr "" + +#: mod/settings.php:1291 +msgid "" +"Set the language we use to show you friendica interface and to send you " +"emails" +msgstr "" + +#: mod/settings.php:1292 +msgid "Default Post Location:" +msgstr "" + +#: mod/settings.php:1293 +msgid "Use Browser Location:" +msgstr "" + +#: mod/settings.php:1296 +msgid "Security and Privacy Settings" +msgstr "" + +#: mod/settings.php:1298 +msgid "Maximum Friend Requests/Day:" +msgstr "" + +#: mod/settings.php:1298 mod/settings.php:1328 +msgid "(to prevent spam abuse)" +msgstr "" + +#: mod/settings.php:1299 +msgid "Default Post Permissions" +msgstr "" + +#: mod/settings.php:1300 +msgid "(click to open/close)" +msgstr "" + +#: mod/settings.php:1311 +msgid "Default Private Post" +msgstr "" + +#: mod/settings.php:1312 +msgid "Default Public Post" +msgstr "" + +#: mod/settings.php:1316 +msgid "Default Permissions for New Posts" +msgstr "" + +#: mod/settings.php:1328 +msgid "Maximum private messages per day from unknown people:" +msgstr "" + +#: mod/settings.php:1331 +msgid "Notification Settings" +msgstr "" + +#: mod/settings.php:1332 +msgid "By default post a status message when:" +msgstr "" + +#: mod/settings.php:1333 +msgid "accepting a friend request" +msgstr "" + +#: mod/settings.php:1334 +msgid "joining a forum/community" +msgstr "" + +#: mod/settings.php:1335 +msgid "making an interesting profile change" +msgstr "" + +#: mod/settings.php:1336 +msgid "Send a notification email when:" +msgstr "" + +#: mod/settings.php:1337 +msgid "You receive an introduction" +msgstr "" + +#: mod/settings.php:1338 +msgid "Your introductions are confirmed" +msgstr "" + +#: mod/settings.php:1339 +msgid "Someone writes on your profile wall" +msgstr "" + +#: mod/settings.php:1340 +msgid "Someone writes a followup comment" +msgstr "" + +#: mod/settings.php:1341 +msgid "You receive a private message" +msgstr "" + +#: mod/settings.php:1342 +msgid "You receive a friend suggestion" +msgstr "" + +#: mod/settings.php:1343 +msgid "You are tagged in a post" +msgstr "" + +#: mod/settings.php:1344 +msgid "You are poked/prodded/etc. in a post" +msgstr "" + +#: mod/settings.php:1346 +msgid "Activate desktop notifications" +msgstr "" + +#: mod/settings.php:1346 +msgid "Show desktop popup on new notifications" +msgstr "" + +#: mod/settings.php:1348 +msgid "Text-only notification emails" +msgstr "" + +#: mod/settings.php:1350 +msgid "Send text only notification emails, without the html part" +msgstr "" + +#: mod/settings.php:1352 +msgid "Advanced Account/Page Type Settings" +msgstr "" + +#: mod/settings.php:1353 +msgid "Change the behaviour of this account for special situations" +msgstr "" + +#: mod/settings.php:1356 +msgid "Relocate" +msgstr "" + +#: mod/settings.php:1357 +msgid "" +"If you have moved this profile from another server, and some of your " +"contacts don't receive your updates, try pushing this button." +msgstr "" + +#: mod/settings.php:1358 +msgid "Resend relocate message to contacts" +msgstr "" + +#: mod/subthread.php:106 +#, php-format +msgid "%1$s is following %2$s's %3$s" +msgstr "" + +#: mod/suggest.php:30 +msgid "Do you really want to delete this suggestion?" +msgstr "" + +#: mod/suggest.php:74 +msgid "" +"No suggestions available. If this is a new site, please try again in 24 " +"hours." +msgstr "" + +#: mod/suggest.php:87 mod/suggest.php:107 +msgid "Ignore/Hide" +msgstr "" + +#: mod/tagrm.php:46 +msgid "Tag removed" +msgstr "" + +#: mod/tagrm.php:85 +msgid "Remove Item Tag" +msgstr "" + +#: mod/tagrm.php:87 +msgid "Select a tag to remove: " +msgstr "" + +#: mod/uexport.php:39 +msgid "Export account" +msgstr "" + +#: mod/uexport.php:39 +msgid "" +"Export your account info and contacts. Use this to make a backup of your " +"account and/or to move it to another server." +msgstr "" + +#: mod/uexport.php:40 +msgid "Export all" +msgstr "" + +#: mod/uexport.php:40 +msgid "" +"Export your accout info, contacts and all your items as json. Could be a " +"very big file, and could take a lot of time. Use this to make a full backup " +"of your account (photos are not exported)" +msgstr "" + +#: mod/unfollow.php:33 +msgid "Contact wasn't found or can't be unfollowed." +msgstr "" + +#: mod/unfollow.php:47 +msgid "Contact unfollowed" +msgstr "" + +#: mod/unfollow.php:73 +msgid "You aren't a friend of this contact." +msgstr "" + +#: mod/unfollow.php:79 +msgid "Unfollowing is currently not supported by your network." +msgstr "" + +#: mod/videos.php:127 +msgid "Do you really want to delete this video?" +msgstr "" + +#: mod/videos.php:132 +msgid "Delete Video" +msgstr "" + +#: mod/videos.php:211 +msgid "No videos selected" +msgstr "" + +#: mod/videos.php:405 +msgid "Recent Videos" +msgstr "" + +#: mod/videos.php:407 +msgid "Upload New Videos" +msgstr "" + +#: mod/wallmessage.php:45 mod/wallmessage.php:109 +#, php-format +msgid "Number of daily wall messages for %s exceeded. Message failed." +msgstr "" + +#: mod/wallmessage.php:56 +msgid "Unable to check your home location." +msgstr "" + +#: mod/wallmessage.php:83 mod/wallmessage.php:92 +msgid "No recipient." +msgstr "" + +#: mod/wallmessage.php:130 +#, php-format +msgid "" +"If you wish for %s to respond, please check that the privacy settings on " +"your site allow private mail from unknown senders." +msgstr "" + +#: object/Item.php:348 msgid "via" msgstr "" -#: view/theme/duepuntozero/config.php:47 +#: view/theme/duepuntozero/config.php:48 msgid "greenzero" msgstr "" -#: view/theme/duepuntozero/config.php:48 +#: view/theme/duepuntozero/config.php:49 msgid "purplezero" msgstr "" -#: view/theme/duepuntozero/config.php:49 +#: view/theme/duepuntozero/config.php:50 msgid "easterbunny" msgstr "" -#: view/theme/duepuntozero/config.php:50 +#: view/theme/duepuntozero/config.php:51 msgid "darkzero" msgstr "" -#: view/theme/duepuntozero/config.php:51 +#: view/theme/duepuntozero/config.php:52 msgid "comix" msgstr "" -#: view/theme/duepuntozero/config.php:52 +#: view/theme/duepuntozero/config.php:53 msgid "slackr" msgstr "" -#: view/theme/duepuntozero/config.php:67 +#: view/theme/duepuntozero/config.php:68 msgid "Variations" msgstr "" @@ -8850,167 +8873,167 @@ msgstr "" msgid "Resize to best fit and retain aspect ratio." msgstr "" -#: view/theme/frio/config.php:50 +#: view/theme/frio/config.php:51 msgid "Default" msgstr "" -#: view/theme/frio/config.php:62 +#: view/theme/frio/config.php:63 msgid "Note: " msgstr "" -#: view/theme/frio/config.php:62 +#: view/theme/frio/config.php:63 msgid "Check image permissions if all users are allowed to visit the image" msgstr "" -#: view/theme/frio/config.php:70 +#: view/theme/frio/config.php:71 msgid "Select scheme" msgstr "" -#: view/theme/frio/config.php:71 +#: view/theme/frio/config.php:72 msgid "Navigation bar background color" msgstr "" -#: view/theme/frio/config.php:72 +#: view/theme/frio/config.php:73 msgid "Navigation bar icon color " msgstr "" -#: view/theme/frio/config.php:73 +#: view/theme/frio/config.php:74 msgid "Link color" msgstr "" -#: view/theme/frio/config.php:74 +#: view/theme/frio/config.php:75 msgid "Set the background color" msgstr "" -#: view/theme/frio/config.php:75 +#: view/theme/frio/config.php:76 msgid "Content background transparency" msgstr "" -#: view/theme/frio/config.php:76 +#: view/theme/frio/config.php:77 msgid "Set the background image" msgstr "" -#: view/theme/frio/theme.php:230 +#: view/theme/frio/theme.php:231 msgid "Guest" msgstr "" -#: view/theme/frio/theme.php:236 +#: view/theme/frio/theme.php:237 msgid "Visitor" msgstr "" -#: view/theme/quattro/config.php:73 +#: view/theme/quattro/config.php:74 msgid "Alignment" msgstr "" -#: view/theme/quattro/config.php:73 +#: view/theme/quattro/config.php:74 msgid "Left" msgstr "" -#: view/theme/quattro/config.php:73 +#: view/theme/quattro/config.php:74 msgid "Center" msgstr "" -#: view/theme/quattro/config.php:74 +#: view/theme/quattro/config.php:75 msgid "Color scheme" msgstr "" -#: view/theme/quattro/config.php:75 +#: view/theme/quattro/config.php:76 msgid "Posts font size" msgstr "" -#: view/theme/quattro/config.php:76 +#: view/theme/quattro/config.php:77 msgid "Textareas font size" msgstr "" -#: view/theme/vier/config.php:70 +#: view/theme/vier/config.php:71 msgid "Comma separated list of helper forums" msgstr "" -#: view/theme/vier/config.php:116 +#: view/theme/vier/config.php:117 msgid "Set style" msgstr "" -#: view/theme/vier/config.php:117 +#: view/theme/vier/config.php:118 msgid "Community Pages" msgstr "" -#: view/theme/vier/config.php:118 view/theme/vier/theme.php:143 +#: view/theme/vier/config.php:119 view/theme/vier/theme.php:144 msgid "Community Profiles" msgstr "" -#: view/theme/vier/config.php:119 +#: view/theme/vier/config.php:120 msgid "Help or @NewHere ?" msgstr "" -#: view/theme/vier/config.php:120 view/theme/vier/theme.php:384 +#: view/theme/vier/config.php:121 view/theme/vier/theme.php:385 msgid "Connect Services" msgstr "" -#: view/theme/vier/config.php:121 view/theme/vier/theme.php:191 +#: view/theme/vier/config.php:122 view/theme/vier/theme.php:192 msgid "Find Friends" msgstr "" -#: view/theme/vier/config.php:122 view/theme/vier/theme.php:173 +#: view/theme/vier/config.php:123 view/theme/vier/theme.php:174 msgid "Last users" msgstr "" -#: view/theme/vier/theme.php:192 +#: view/theme/vier/theme.php:193 msgid "Local Directory" msgstr "" -#: view/theme/vier/theme.php:284 +#: view/theme/vier/theme.php:285 msgid "Quick Start" msgstr "" -#: src/App.php:527 +#: src/App.php:523 msgid "Delete this item?" msgstr "" -#: src/App.php:529 +#: src/App.php:525 msgid "show fewer" msgstr "" -#: boot.php:735 +#: boot.php:724 #, php-format msgid "Update %s failed. See error logs." msgstr "" -#: boot.php:847 +#: boot.php:836 msgid "Create a New Account" msgstr "" -#: boot.php:875 +#: boot.php:864 msgid "Password: " msgstr "" -#: boot.php:876 +#: boot.php:865 msgid "Remember me" msgstr "" -#: boot.php:879 +#: boot.php:868 msgid "Or login using OpenID: " msgstr "" -#: boot.php:885 +#: boot.php:874 msgid "Forgot your password?" msgstr "" -#: boot.php:888 +#: boot.php:877 msgid "Website Terms of Service" msgstr "" -#: boot.php:889 +#: boot.php:878 msgid "terms of service" msgstr "" -#: boot.php:891 +#: boot.php:880 msgid "Website Privacy Policy" msgstr "" -#: boot.php:892 +#: boot.php:881 msgid "privacy policy" msgstr "" -#: index.php:436 +#: index.php:437 msgid "toggle mobile" msgstr "" From 6d7ececc4206dd9b5dc06cdf4454a93bf54a664e Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 15 Sep 2017 19:41:30 +0000 Subject: [PATCH 38/49] Bugfix for pictures that weren't stored / reworked database calls --- include/Contact.php | 14 +++---- include/Photo.php | 90 ++++++--------------------------------------- include/dba.php | 31 ---------------- include/dfrn.php | 4 +- include/message.php | 44 +++++++--------------- include/threads.php | 6 +-- mod/delegate.php | 5 +-- mod/profiles.php | 8 +--- mod/proxy.php | 28 ++++---------- mod/search.php | 43 +++++++++------------- mod/settings.php | 9 +---- mod/suggest.php | 5 +-- 12 files changed, 64 insertions(+), 223 deletions(-) diff --git a/include/Contact.php b/include/Contact.php index 7d480ab020..69c3b121f8 100644 --- a/include/Contact.php +++ b/include/Contact.php @@ -9,27 +9,27 @@ use Friendica\Network\Probe; // authorisation to do this. function user_remove($uid) { - if(! $uid) + if (!$uid) { return; + } + logger('Removing user: ' . $uid); - $r = q("select * from user where uid = %d limit 1", intval($uid)); + $r = dba::select('user', array(), array('uid' => $uid), array("limit" => 1)); - call_hooks('remove_user',$r[0]); + call_hooks('remove_user',$r); // save username (actually the nickname as it is guaranteed // unique), so it cannot be re-registered in the future. - q("insert into userd ( username ) values ( '%s' )", - $r[0]['nickname'] - ); + dba::insert('userd', array('username' => $r['nickname'])); // The user and related data will be deleted in "cron_expire_and_remove_users" (cronjobs.php) q("UPDATE `user` SET `account_removed` = 1, `account_expires_on` = UTC_TIMESTAMP() WHERE `uid` = %d", intval($uid)); proc_run(PRIORITY_HIGH, "include/notifier.php", "removeme", $uid); // Send an update to the directory - proc_run(PRIORITY_LOW, "include/directory.php", $r[0]['url']); + proc_run(PRIORITY_LOW, "include/directory.php", $r['url']); if($uid == local_user()) { unset($_SESSION['authenticated']); diff --git a/include/Photo.php b/include/Photo.php index f02ee130a0..78d448fbc2 100644 --- a/include/Photo.php +++ b/include/Photo.php @@ -628,92 +628,24 @@ class Photo { public function store($uid, $cid, $rid, $filename, $album, $scale, $profile = 0, $allow_cid = '', $allow_gid = '', $deny_cid = '', $deny_gid = '', $desc = '') { - $r = q("SELECT `guid` FROM `photo` WHERE `resource-id` = '%s' AND `guid` != '' LIMIT 1", - dbesc($rid) - ); + $r = dba::select('photo', array('guid'), array("`resource-id` = ? AND `guid` != ?", $rid, ''), array('limit' => 1)); if (dbm::is_result($r)) { - $guid = $r[0]['guid']; + $guid = $r['guid']; } else { $guid = get_guid(); } - $x = q("SELECT `id` FROM `photo` WHERE `resource-id` = '%s' AND `uid` = %d AND `contact-id` = %d AND `scale` = %d LIMIT 1", - dbesc($rid), - intval($uid), - intval($cid), - intval($scale) - ); - if (dbm::is_result($x)) { - $r = q("UPDATE `photo` - SET `uid` = %d, - `contact-id` = %d, - `guid` = '%s', - `resource-id` = '%s', - `created` = '%s', - `edited` = '%s', - `filename` = '%s', - `type` = '%s', - `album` = '%s', - `height` = %d, - `width` = %d, - `datasize` = %d, - `data` = '%s', - `scale` = %d, - `profile` = %d, - `allow_cid` = '%s', - `allow_gid` = '%s', - `deny_cid` = '%s', - `deny_gid` = '%s', - `desc` = '%s' - WHERE `id` = %d", + $x = dba::select('photo', array('id'), array('resource-id' => $rid, 'uid' => $uid, 'contact-id' => $cid, 'scale' => $scale), array('limit' => 1)); - intval($uid), - intval($cid), - dbesc($guid), - dbesc($rid), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - dbesc(basename($filename)), - dbesc($this->getType()), - dbesc($album), - intval($this->getHeight()), - intval($this->getWidth()), - dbesc(strlen($this->imageString())), - dbesc($this->imageString()), - intval($scale), - intval($profile), - dbesc($allow_cid), - dbesc($allow_gid), - dbesc($deny_cid), - dbesc($deny_gid), - dbesc($desc), - intval($x[0]['id']) - ); + $fields = array('uid' => $uid, 'contact-id' => $cid, 'guid' => $guid, 'resource-id' => $rid, 'created' => datetime_convert(), 'edited' => datetime_convert(), + 'filename' => basename($filename), 'type' => $this->getType(), 'album' => $album, 'height' => $this->getHeight(), 'width' => $this->getWidth(), + 'datasize' => strlen($this->imageString()), 'data' => $this->imageString(), 'scale' => $scale, 'profile' => $profile, + 'allow_cid' => $allow_cid, 'allow_gid' => $allow_gid, 'deny_cid' => $deny_cid, 'deny_gid' => $deny_gid, 'desc' => $desc); + + if (dbm::is_result($x)) { + $r = dba::update('photo', $fields, array('id' => $x['id'])); } else { - $r = q("INSERT INTO `photo` - (`uid`, `contact-id`, `guid`, `resource-id`, `created`, `edited`, `filename`, type, `album`, `height`, `width`, `datasize`, `data`, `scale`, `profile`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid`, `desc`) - VALUES (%d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, '%s', %d, %d, '%s', '%s', '%s', '%s', '%s')", - intval($uid), - intval($cid), - dbesc($guid), - dbesc($rid), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - dbesc(basename($filename)), - dbesc($this->getType()), - dbesc($album), - intval($this->getHeight()), - intval($this->getWidth()), - dbesc(strlen($this->imageString())), - dbesc($this->imageString()), - intval($scale), - intval($profile), - dbesc($allow_cid), - dbesc($allow_gid), - dbesc($deny_cid), - dbesc($deny_gid), - dbesc($desc) - ); + $r = dba::insert('photo', $fields); } return $r; diff --git a/include/dba.php b/include/dba.php index 9bf7a67d46..fa33f245ae 100644 --- a/include/dba.php +++ b/include/dba.php @@ -1400,37 +1400,6 @@ function qu($sql) { return false; } -/** - * - * Raw db query, no arguments - * - */ -function dbq($sql) { - global $db; - - if ($db && $db->connected) { - $ret = $db->q($sql); - } else { - $ret = false; - } - return $ret; -} - -// Caller is responsible for ensuring that any integer arguments to -// dbesc_array are actually integers and not malformed strings containing -// SQL injection vectors. All integer array elements should be specifically -// cast to int to avoid trouble. -function dbesc_array_cb(&$item, $key) { - if (is_string($item)) - $item = dbesc($item); -} - -function dbesc_array(&$arr) { - if (is_array($arr) && count($arr)) { - array_walk($arr,'dbesc_array_cb'); - } -} - function dba_timer() { return microtime(true); } diff --git a/include/dfrn.php b/include/dfrn.php index c8e89fe40f..9a821a9d91 100644 --- a/include/dfrn.php +++ b/include/dfrn.php @@ -1669,9 +1669,7 @@ class dfrn { $msg["seen"] = 0; $msg["replied"] = 0; - dbm::esc_array($msg, true); - - $r = dbq("INSERT INTO `mail` (`".implode("`, `", array_keys($msg))."`) VALUES (".implode(", ", array_values($msg)).")"); + dba::insert('mail', $msg); // send notifications. /// @TODO Arange this mess diff --git a/include/message.php b/include/message.php index 6800663b5c..5914621416 100644 --- a/include/message.php +++ b/include/message.php @@ -60,22 +60,14 @@ function send_message($recipient=0, $body='', $subject='', $replyto=''){ $handles = $recip_handle . ';' . $sender_handle; - $r = q("insert into conv (uid,guid,creator,created,updated,subject,recips) values(%d, '%s', '%s', '%s', '%s', '%s', '%s') ", - intval(local_user()), - dbesc($conv_guid), - dbesc($sender_handle), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - dbesc($subject), - dbesc($handles) - ); + $fields = array('uid' => local_user(), 'guid' => $conv_guid, 'creator' => $sender_handle, + 'created' => datetime_convert(), 'updated' => datetime_convert(), + 'subject' => $subject, 'recips' => $handles); + $r = dba::insert('conv', $fields); - $r = q("select * from conv where guid = '%s' and uid = %d limit 1", - dbesc($conv_guid), - intval(local_user()) - ); + $r = dba::select('conv', array('id', array('guid' => $conv_guid, 'uid' => local_user())), array('limit' => 1)); if (dbm::is_result($r)) - $convid = $r[0]['id']; + $convid = $r['id']; } if (! $convid) { @@ -194,28 +186,18 @@ function send_wallmessage($recipient='', $body='', $subject='', $replyto=''){ $handles = $recip_handle . ';' . $sender_handle; - $r = q("INSERT INTO `conv` (`uid`,`guid`,`creator`,`created`,`updated`,`subject`,`recips`) values(%d, '%s', '%s', '%s', '%s', '%s', '%s') ", - intval($recipient['uid']), - dbesc($conv_guid), - dbesc($sender_handle), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - dbesc($subject), - dbesc($handles) - ); + $fields = array('uid' => $recipient['uid'], 'guid' => $conv_guid, 'creator' => $sender_handle, + 'created' => datetime_convert(), 'updated' => datetime_convert(), + 'subject' => $subject, 'recips' => $handles); + $r = dba::insert('conv', $fields); - $r = q("SELECT * FROM `conv` WHERE `guid` = '%s' AND `uid` = %d LIMIT 1", - dbesc($conv_guid), - intval($recipient['uid']) - ); - - - if (! dbm::is_result($r)) { + $r = dba::select('conv', array('id', array('guid' => $conv_guid, 'uid' => $recipient['uid'])), array('limit' => 1)); + if (!dbm::is_result($r)) { logger('send message: conversation not found.'); return -4; } - $convid = $r[0]['id']; + $convid = $r['id']; $r = q("INSERT INTO `mail` ( `uid`, `guid`, `convid`, `from-name`, `from-photo`, `from-url`, `contact-id`, `title`, `body`, `seen`, `reply`, `replied`, `uri`, `parent-uri`, `created`, `unknown`) diff --git a/include/threads.php b/include/threads.php index 4cb8815693..906766da87 100644 --- a/include/threads.php +++ b/include/threads.php @@ -16,11 +16,7 @@ function add_thread($itemid, $onlyshadow = false) { $item['iid'] = $itemid; if (!$onlyshadow) { - $result = dbq("INSERT INTO `thread` (`" - .implode("`, `", array_keys($item)) - ."`) VALUES ('" - .implode("', '", array_values($item)) - ."')"); + $result = dba::insert('thread', $item); logger("Add thread for item ".$itemid." - ".print_r($result, true), LOGGER_DEBUG); } diff --git a/mod/delegate.php b/mod/delegate.php index 4d35d46c70..4bccf1142a 100644 --- a/mod/delegate.php +++ b/mod/delegate.php @@ -35,10 +35,7 @@ function delegate_content(App $a) { dbesc(normalise_link(System::baseUrl() . '/profile/' . $r[0]['nickname'])) ); if (dbm::is_result($r)) { - q("insert into manage ( uid, mid ) values ( %d , %d ) ", - intval($a->argv[2]), - intval(local_user()) - ); + dba::insert('manage', array('uid' => $a->argv[2], 'mid' => local_user())); } } goaway(System::baseUrl() . '/delegate'); diff --git a/mod/profiles.php b/mod/profiles.php index 42f4587563..4a1d1ad934 100644 --- a/mod/profiles.php +++ b/mod/profiles.php @@ -108,13 +108,7 @@ function profiles_init(App $a) { $r1[0]['net-publish'] = 0; $r1[0]['profile-name'] = dbesc($name); - dbm::esc_array($r1[0], true); - - $r2 = dbq("INSERT INTO `profile` (`" - . implode("`, `", array_keys($r1[0])) - . "`) VALUES (" - . implode(", ", array_values($r1[0])) - . ")" ); + dba::insert('profile', $r1[0]); $r3 = q("SELECT `id` FROM `profile` WHERE `uid` = %d AND `profile-name` = '%s' LIMIT 1", intval(local_user()), diff --git a/mod/proxy.php b/mod/proxy.php index 20d02af85a..d6f76da70b 100644 --- a/mod/proxy.php +++ b/mod/proxy.php @@ -142,10 +142,10 @@ function proxy_init(App $a) { $r = array(); if (!$direct_cache && ($cachefile == '')) { - $r = qu("SELECT * FROM `photo` WHERE `resource-id` = '%s' LIMIT 1", $urlhash); + $r = dba::select('photo', array('data', 'desc'), array('resource-id' => $urlhash), array('limit' => 1)); if (dbm::is_result($r)) { - $img_str = $r[0]['data']; - $mime = $r[0]['desc']; + $img_str = $r['data']; + $mime = $r['desc']; if ($mime == '') { $mime = 'image/jpeg'; } @@ -181,23 +181,11 @@ function proxy_init(App $a) { die(); } - q("INSERT INTO `photo` - ( `uid`, `contact-id`, `guid`, `resource-id`, `created`, `edited`, `filename`, `album`, `height`, `width`, `desc`, `data`, `scale`, `profile`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` ) - VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', %d, %d, '%s', '%s', '%s', '%s' )", - 0, 0, get_guid(), dbesc($urlhash), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - dbesc(basename(dbesc($_REQUEST['url']))), - dbesc(''), - intval(imagesy($image)), - intval(imagesx($image)), - $mime, - dbesc($img_str), - 100, - intval(0), - dbesc(''), dbesc(''), dbesc(''), dbesc('') - ); - + $fields = array('uid' => 0, 'contact-id' => 0, 'guid' => get_guid(), 'resource-id' => $urlhash, 'created' => datetime_convert(), 'edited' => datetime_convert(), + 'filename' => basename($_REQUEST['url']), 'type' => '', 'album' => '', 'height' => imagesy($image), 'width' => imagesx($image), + 'datasize' => 0, 'data' => $img_str, 'scale' => 100, 'profile' => 0, + 'allow_cid' => '', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '', 'desc' => $mime); + dba::insert('photo', $fields); } else { $img = new Photo($img_str, $mime); if ($img->is_valid() && !$direct_cache && ($cachefile == '')) { diff --git a/mod/search.php b/mod/search.php index 1975a05bf6..ee652ee8aa 100644 --- a/mod/search.php +++ b/mod/search.php @@ -11,7 +11,7 @@ function search_saved_searches() { $o = ''; - if(! feature_enabled(local_user(),'savedsearch')) + if (! feature_enabled(local_user(),'savedsearch')) return $o; $r = q("SELECT `id`,`term` FROM `search` WHERE `uid` = %d", @@ -50,30 +50,23 @@ function search_init(App $a) { $search = ((x($_GET,'search')) ? notags(trim(rawurldecode($_GET['search']))) : ''); - if(local_user()) { - if(x($_GET,'save') && $search) { + if (local_user()) { + if (x($_GET,'save') && $search) { $r = q("SELECT * FROM `search` WHERE `uid` = %d AND `term` = '%s' LIMIT 1", intval(local_user()), dbesc($search) ); - if (! dbm::is_result($r)) { - q("INSERT INTO `search` (`uid`,`term`) VALUES ( %d, '%s')", - intval(local_user()), - dbesc($search) - ); + if (!dbm::is_result($r)) { + dbm::insert('search', array('uid' => local_user(), 'term' => $search)); } } - if(x($_GET,'remove') && $search) { - q("DELETE FROM `search` WHERE `uid` = %d AND `term` = '%s' LIMIT 1", - intval(local_user()), - dbesc($search) - ); + if (x($_GET,'remove') && $search) { + dbm::delete('search', array('uid' => local_user(), 'term' => $search)); } $a->page['aside'] .= search_saved_searches(); - } - else { + } else { unset($_SESSION['theme']); unset($_SESSION['mobile-theme']); } @@ -85,7 +78,7 @@ function search_init(App $a) { function search_post(App $a) { - if(x($_POST,'search')) + if (x($_POST,'search')) $a->data['search'] = $_POST['search']; } @@ -135,13 +128,13 @@ function search_content(App $a) { nav_set_selected('search'); - if(x($a->data,'search')) + if (x($a->data,'search')) $search = notags(trim($a->data['search'])); else $search = ((x($_GET,'search')) ? notags(trim(rawurldecode($_GET['search']))) : ''); $tag = false; - if(x($_GET,'tag')) { + if (x($_GET,'tag')) { $tag = true; $search = ((x($_GET,'tag')) ? notags(trim(rawurldecode($_GET['tag']))) : ''); } @@ -154,18 +147,18 @@ function search_content(App $a) { '$content' => search($search,'search-box','search',((local_user()) ? true : false), false) )); - if(strpos($search,'#') === 0) { + if (strpos($search,'#') === 0) { $tag = true; $search = substr($search,1); } - if(strpos($search,'@') === 0) { + if (strpos($search,'@') === 0) { return dirfind_content($a); } - if(strpos($search,'!') === 0) { + if (strpos($search,'!') === 0) { return dirfind_content($a); } - if(x($_GET,'search-option')) + if (x($_GET,'search-option')) switch($_GET['search-option']) { case 'fulltext': break; @@ -180,7 +173,7 @@ function search_content(App $a) { break; } - if(! $search) + if (! $search) return $o; if (get_config('system','only_tag_search')) @@ -191,7 +184,7 @@ function search_content(App $a) { // OR your own posts if you are a logged in member // No items will be shown if the member has a blocked profile wall. - if($tag) { + if ($tag) { logger("Start tag search for '".$search."'", LOGGER_DEBUG); $r = q("SELECT %s @@ -224,7 +217,7 @@ function search_content(App $a) { } - if($tag) + if ($tag) $title = sprintf( t('Items tagged with: %s'), $search); else $title = sprintf( t('Results for: %s'), $search); diff --git a/mod/settings.php b/mod/settings.php index c98e1b99be..9970d32595 100644 --- a/mod/settings.php +++ b/mod/settings.php @@ -231,17 +231,12 @@ function settings_post(App $a) { intval(local_user()) ); if (! dbm::is_result($r)) { - q("INSERT INTO `mailacct` (`uid`) VALUES (%d)", - intval(local_user()) - ); + dba::insert('mailacct', array('uid' => local_user())); } if(strlen($mail_pass)) { $pass = ''; openssl_public_encrypt($mail_pass,$pass,$a->user['pubkey']); - q("UPDATE `mailacct` SET `pass` = '%s' WHERE `uid` = %d", - dbesc(bin2hex($pass)), - intval(local_user()) - ); + dba::update('mailacct', array('pass' => bin2hex($pass)), array('uid' => local_user())); } $r = q("UPDATE `mailacct` SET `server` = '%s', `port` = %d, `ssltype` = '%s', `user` = '%s', `action` = %d, `movetofolder` = '%s', diff --git a/mod/suggest.php b/mod/suggest.php index 19e89f05ba..e71c726952 100644 --- a/mod/suggest.php +++ b/mod/suggest.php @@ -39,10 +39,7 @@ function suggest_init(App $a) { } // Now check how the user responded to the confirmation query if (!$_REQUEST['canceled']) { - q("INSERT INTO `gcign` ( `uid`, `gcid` ) VALUES ( %d, %d ) ", - intval(local_user()), - intval($_GET['ignore']) - ); + dba::insert('gcign', array('uid' => local_user(), 'gcid' => $_GET['ignore'])); } } From dfd48dd6f685dcc0b341d2a8e535dfbbf73b4f2e Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 15 Sep 2017 21:00:39 +0000 Subject: [PATCH 39/49] "qu" is no more --- include/dba.php | 39 --------------------------------------- include/items.php | 2 +- include/photos.php | 4 ++-- mod/admin.php | 14 +++++++------- mod/nodeinfo.php | 6 +++--- mod/photo.php | 6 +++--- mod/photos.php | 18 +++++++++--------- mod/ping.php | 14 +++++++------- 8 files changed, 32 insertions(+), 71 deletions(-) diff --git a/include/dba.php b/include/dba.php index fa33f245ae..c7266b9798 100644 --- a/include/dba.php +++ b/include/dba.php @@ -1361,45 +1361,6 @@ function q($sql) { return $data; } -/** - * @brief Performs a query with "dirty reads" - deprecated - * - * Please use the dba:: functions instead: - * dba::select, dba::exists, dba::insert - * dba::delete, dba::update, dba::p, dba::e - * - * @param $args Query parameters (1 to N parameters of different types) - * @return array Query array - */ -function qu($sql) { - global $db; - - $args = func_get_args(); - unset($args[0]); - - if ($db && $db->connected) { - $sql = $db->clean_query($sql); - $sql = $db->any_value_fallback($sql); - $stmt = @vsprintf($sql,$args); // Disabled warnings - if ($stmt === false) - logger('dba: vsprintf error: ' . print_r(debug_backtrace(),true), LOGGER_DEBUG); - - $db->log_index($stmt); - - $retval = $db->q($stmt); - return $retval; - } - - /** - * - * This will happen occasionally trying to store the - * session data after abnormal program termination - * - */ - logger('dba: no database: ' . print_r($args,true)); - return false; -} - function dba_timer() { return microtime(true); } diff --git a/include/items.php b/include/items.php index f2ee2311b7..4b61641627 100644 --- a/include/items.php +++ b/include/items.php @@ -955,7 +955,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f * An unique index would help - but the limitations of MySQL (maximum size of index values) prevent this. */ if ($arr["uid"] == 0) { - $r = qu("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = 0 LIMIT 1", dbesc(trim($arr['uri']))); + $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = 0 LIMIT 1", dbesc(trim($arr['uri']))); if (dbm::is_result($r)) { logger('Global item already stored. URI: '.$arr['uri'].' on network '.$arr['network'], LOGGER_DEBUG); return 0; diff --git a/include/photos.php b/include/photos.php index 6e0002bd47..49ba83fa3c 100644 --- a/include/photos.php +++ b/include/photos.php @@ -48,7 +48,7 @@ function photo_albums($uid, $update = false) { if (!Config::get('system', 'no_count', false)) { /// @todo This query needs to be renewed. It is really slow // At this time we just store the data in the cache - $albums = qu("SELECT COUNT(DISTINCT `resource-id`) AS `total`, `album`, ANY_VALUE(`created`) AS `created` + $albums = q("SELECT COUNT(DISTINCT `resource-id`) AS `total`, `album`, ANY_VALUE(`created`) AS `created` FROM `photo` WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' $sql_extra GROUP BY `album` ORDER BY `created` DESC", @@ -58,7 +58,7 @@ function photo_albums($uid, $update = false) { ); } else { // This query doesn't do the count and is much faster - $albums = qu("SELECT DISTINCT(`album`), '' AS `total` + $albums = q("SELECT DISTINCT(`album`), '' AS `total` FROM `photo` USE INDEX (`uid_album_scale_created`) WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' $sql_extra", intval($uid), diff --git a/mod/admin.php b/mod/admin.php index 6d1adc7012..ee95a180a5 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -457,7 +457,7 @@ function admin_page_federation(App $a) { foreach ($platforms as $p) { // get a total count for the platform, the name and version of the // highest version and the protocol tpe - $c = qu('SELECT COUNT(*) AS `total`, ANY_VALUE(`platform`) AS `platform`, + $c = q('SELECT COUNT(*) AS `total`, ANY_VALUE(`platform`) AS `platform`, ANY_VALUE(`network`) AS `network`, MAX(`version`) AS `version` FROM `gserver` WHERE `platform` LIKE "%s" AND `last_contact` >= `last_failure` ORDER BY `version` ASC;', $p); @@ -465,7 +465,7 @@ function admin_page_federation(App $a) { // what versions for that platform do we know at all? // again only the active nodes - $v = qu('SELECT COUNT(*) AS `total`, `version` FROM `gserver` + $v = q('SELECT COUNT(*) AS `total`, `version` FROM `gserver` WHERE `last_contact` >= `last_failure` AND `platform` LIKE "%s" GROUP BY `version` ORDER BY `version`;', $p); @@ -644,13 +644,13 @@ function admin_page_summary(App $a) { logger('accounts: '.print_r($accounts,true),LOGGER_DATA); - $r = qu("SELECT COUNT(`id`) AS `count` FROM `register`"); + $r = q("SELECT COUNT(`id`) AS `count` FROM `register`"); $pending = $r[0]['count']; - $r = qu("SELECT COUNT(*) AS `total` FROM `queue` WHERE 1"); + $r = q("SELECT COUNT(*) AS `total` FROM `queue` WHERE 1"); $queue = (($r) ? $r[0]['total'] : 0); - $r = qu("SELECT COUNT(*) AS `total` FROM `workerqueue` WHERE NOT `done`"); + $r = q("SELECT COUNT(*) AS `total` FROM `workerqueue` WHERE NOT `done`"); $workerqueue = (($r) ? $r[0]['total'] : 0); // We can do better, but this is a quick queue status @@ -1487,7 +1487,7 @@ function admin_page_users(App $a) { /* get users */ - $total = qu("SELECT COUNT(*) AS `total` FROM `user` WHERE 1"); + $total = q("SELECT COUNT(*) AS `total` FROM `user` WHERE 1"); if (count($total)) { $a->set_pager_total($total[0]['total']); $a->set_pager_itemspage(100); @@ -1522,7 +1522,7 @@ function admin_page_users(App $a) { $sql_order = "`".str_replace('.','`.`',$order)."`"; $sql_order_direction = ($order_direction === "+")?"ASC":"DESC"; - $users = qu("SELECT `user`.*, `contact`.`name`, `contact`.`url`, `contact`.`micro`, `user`.`account_expired`, `contact`.`last-item` AS `lastitem_date` + $users = q("SELECT `user`.*, `contact`.`name`, `contact`.`url`, `contact`.`micro`, `user`.`account_expired`, `contact`.`last-item` AS `lastitem_date` FROM `user` INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self` WHERE `user`.`verified` diff --git a/mod/nodeinfo.php b/mod/nodeinfo.php index 5cc2734c8e..e889d5a94e 100644 --- a/mod/nodeinfo.php +++ b/mod/nodeinfo.php @@ -188,7 +188,7 @@ function nodeinfo_cron() { } logger('cron_start'); - $users = qu("SELECT `user`.`uid`, `user`.`login_date`, `contact`.`last-item` + $users = q("SELECT `user`.`uid`, `user`.`login_date`, `contact`.`last-item` FROM `user` INNER JOIN `profile` ON `profile`.`uid` = `user`.`uid` AND `profile`.`is-default` INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self` @@ -220,7 +220,7 @@ function nodeinfo_cron() { Config::set('nodeinfo', 'active_users_monthly', $active_users_monthly); } - $posts = qu("SELECT COUNT(*) AS local_posts FROM `thread` WHERE `thread`.`wall` AND `thread`.`uid` != 0"); + $posts = q("SELECT COUNT(*) AS local_posts FROM `thread` WHERE `thread`.`wall` AND `thread`.`uid` != 0"); if (!is_array($posts)) { $local_posts = -1; @@ -231,7 +231,7 @@ function nodeinfo_cron() { logger('local_posts: '.$local_posts, LOGGER_DEBUG); - $posts = qu("SELECT COUNT(*) FROM `contact` + $posts = q("SELECT COUNT(*) FROM `contact` INNER JOIN `item` ON `item`.`contact-id` = `contact`.`id` AND `item`.`uid` = `contact`.`uid` AND `item`.`id` != `item`.`parent` AND `item`.`network` IN ('%s', '%s', '%s') WHERE `contact`.`self`", diff --git a/mod/photo.php b/mod/photo.php index 3c5fdd7be4..5896c90baa 100644 --- a/mod/photo.php +++ b/mod/photo.php @@ -74,7 +74,7 @@ function photo_init(App $a) { $uid = str_replace(array('.jpg','.png'),array('',''), $person); - $r = qu("SELECT * FROM `photo` WHERE `scale` = %d AND `uid` = %d AND `profile` = 1 LIMIT 1", + $r = q("SELECT * FROM `photo` WHERE `scale` = %d AND `uid` = %d AND `profile` = 1 LIMIT 1", intval($resolution), intval($uid) ); @@ -104,7 +104,7 @@ function photo_init(App $a) { } // check if the photo exists and get the owner of the photo - $r = qu("SELECT `uid` FROM `photo` WHERE `resource-id` = '%s' LIMIT 1", + $r = q("SELECT `uid` FROM `photo` WHERE `resource-id` = '%s' LIMIT 1", dbesc($photo), intval($resolution) ); @@ -114,7 +114,7 @@ function photo_init(App $a) { // Now we'll see if we can access the photo - $r = qu("SELECT * FROM `photo` WHERE `resource-id` = '%s' AND `scale` <= %d $sql_extra ORDER BY scale DESC LIMIT 1", + $r = q("SELECT * FROM `photo` WHERE `resource-id` = '%s' AND `scale` <= %d $sql_extra ORDER BY scale DESC LIMIT 1", dbesc($photo), intval($resolution) ); diff --git a/mod/photos.php b/mod/photos.php index ac54e0e096..6c9f4bd662 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -29,7 +29,7 @@ function photos_init(App $a) { if ($a->argc > 1) { $nick = $a->argv[1]; - $user = qu("SELECT * FROM `user` WHERE `nickname` = '%s' AND `blocked` = 0 LIMIT 1", + $user = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `blocked` = 0 LIMIT 1", dbesc($nick) ); @@ -153,7 +153,7 @@ function photos_post(App $a) { } if ($contact_id) { - $r = qu("SELECT `uid` FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `id` = %d AND `uid` = %d LIMIT 1", + $r = q("SELECT `uid` FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `id` = %d AND `uid` = %d LIMIT 1", intval($contact_id), intval($page_owner_uid) ); @@ -170,7 +170,7 @@ function photos_post(App $a) { killme(); } - $r = qu("SELECT `contact`.*, `user`.`nickname` FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid` + $r = q("SELECT `contact`.*, `user`.`nickname` FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid` WHERE `user`.`uid` = %d AND `self` = 1 LIMIT 1", intval($page_owner_uid) ); @@ -192,7 +192,7 @@ function photos_post(App $a) { return; // NOTREACHED } - $r = qu("SELECT `album` FROM `photo` WHERE `album` = '%s' AND `uid` = %d", + $r = q("SELECT `album` FROM `photo` WHERE `album` = '%s' AND `uid` = %d", dbesc($album), intval($page_owner_uid) ); @@ -1378,7 +1378,7 @@ function photos_content(App $a) { else $order = 'DESC'; - $prvnxt = qu("SELECT `resource-id` FROM `photo` WHERE `album` = '%s' AND `uid` = %d AND `scale` = 0 + $prvnxt = q("SELECT `resource-id` FROM `photo` WHERE `album` = '%s' AND `uid` = %d AND `scale` = 0 $sql_extra ORDER BY `created` $order ", dbesc($ph[0]['album']), intval($owner_uid) @@ -1478,7 +1478,7 @@ function photos_content(App $a) { if (dbm::is_result($linked_items)) { $link_item = $linked_items[0]; - $r = qu("SELECT COUNT(*) AS `total` + $r = q("SELECT COUNT(*) AS `total` FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id` WHERE `parent-uri` = '%s' AND `uri` != '%s' AND `item`.`deleted` = 0 and `item`.`moderated` = 0 AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 @@ -1495,7 +1495,7 @@ function photos_content(App $a) { } - $r = qu("SELECT `item`.*, `item`.`id` AS `item_id`, + $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`network`, `contact`.`rel`, `contact`.`thumb`, `contact`.`self`, `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid` @@ -1835,7 +1835,7 @@ function photos_content(App $a) { // Default - show recent photos with upload link (if applicable) //$o = ''; - $r = qu("SELECT `resource-id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' + $r = q("SELECT `resource-id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' $sql_extra GROUP BY `resource-id`", intval($a->data['user']['uid']), dbesc('Contact Photos'), @@ -1846,7 +1846,7 @@ function photos_content(App $a) { $a->set_pager_itemspage(20); } - $r = qu("SELECT `resource-id`, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`filename`) AS `filename`, + $r = q("SELECT `resource-id`, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`filename`) AS `filename`, ANY_VALUE(`type`) AS `type`, ANY_VALUE(`album`) AS `album`, max(`scale`) AS `scale`, ANY_VALUE(`created`) AS `created` FROM `photo` WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' diff --git a/mod/ping.php b/mod/ping.php index 5a5bdcd589..59fa521214 100644 --- a/mod/ping.php +++ b/mod/ping.php @@ -118,7 +118,7 @@ function ping_init(App $a) $notifs = ping_get_notifications(local_user()); - $items_unseen = qu("SELECT `item`.`id`, `item`.`parent`, `item`.`verb`, `item`.`wall`, `item`.`author-name`, + $items_unseen = q("SELECT `item`.`id`, `item`.`parent`, `item`.`verb`, `item`.`wall`, `item`.`author-name`, `item`.`contact-id`, `item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object`, `pitem`.`author-name` AS `pname`, `pitem`.`author-link` AS `plink` FROM `item` INNER JOIN `item` AS `pitem` ON `pitem`.`id` = `item`.`parent` @@ -167,13 +167,13 @@ function ping_init(App $a) } } - $intros1 = qu("SELECT `intro`.`id`, `intro`.`datetime`, + $intros1 = q("SELECT `intro`.`id`, `intro`.`datetime`, `fcontact`.`name`, `fcontact`.`url`, `fcontact`.`photo` FROM `intro` LEFT JOIN `fcontact` ON `intro`.`fid` = `fcontact`.`id` WHERE `intro`.`uid` = %d AND `intro`.`blocked` = 0 AND `intro`.`ignore` = 0 AND `intro`.`fid` != 0", intval(local_user()) ); - $intros2 = qu("SELECT `intro`.`id`, `intro`.`datetime`, + $intros2 = q("SELECT `intro`.`id`, `intro`.`datetime`, `contact`.`name`, `contact`.`url`, `contact`.`photo` FROM `intro` LEFT JOIN `contact` ON `intro`.`contact-id` = `contact`.`id` WHERE `intro`.`uid` = %d AND `intro`.`blocked` = 0 AND `intro`.`ignore` = 0 AND `intro`.`contact-id` != 0", @@ -184,7 +184,7 @@ function ping_init(App $a) $intros = $intros1 + $intros2; $myurl = System::baseUrl() . '/profile/' . $a->user['nickname'] ; - $mails = qu("SELECT `id`, `from-name`, `from-url`, `from-photo`, `created` FROM `mail` + $mails = q("SELECT `id`, `from-name`, `from-url`, `from-photo`, `created` FROM `mail` WHERE `uid` = %d AND `seen` = 0 AND `from-url` != '%s' ", intval(local_user()), dbesc($myurl) @@ -192,7 +192,7 @@ function ping_init(App $a) $mail_count = count($mails); if ($a->config['register_policy'] == REGISTER_APPROVE && is_site_admin()){ - $regs = qu("SELECT `contact`.`name`, `contact`.`url`, `contact`.`micro`, `register`.`created`, COUNT(*) AS `total` + $regs = q("SELECT `contact`.`name`, `contact`.`url`, `contact`.`micro`, `register`.`created`, COUNT(*) AS `total` FROM `contact` RIGHT JOIN `register` ON `register`.`uid` = `contact`.`uid` WHERE `contact`.`self` = 1"); @@ -204,7 +204,7 @@ function ping_init(App $a) $cachekey = "ping_init:".local_user(); $ev = Cache::get($cachekey); if (is_null($ev)) { - $ev = qu("SELECT type, start, adjust FROM `event` + $ev = q("SELECT type, start, adjust FROM `event` WHERE `event`.`uid` = %d AND `start` < '%s' AND `finish` > '%s' and `ignore` = 0 ORDER BY `start` ASC ", intval(local_user()), @@ -424,7 +424,7 @@ function ping_get_notifications($uid) $a = get_app(); do { - $r = qu("SELECT `notify`.*, `item`.`visible`, `item`.`spam`, `item`.`deleted` + $r = q("SELECT `notify`.*, `item`.`visible`, `item`.`spam`, `item`.`deleted` FROM `notify` LEFT JOIN `item` ON `item`.`id` = `notify`.`iid` WHERE `notify`.`uid` = %d AND `notify`.`msg` != '' AND NOT (`notify`.`type` IN (%d, %d)) From 72b42ad68863593817dbb68c29c1751996a9a88f Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 15 Sep 2017 21:17:58 +0000 Subject: [PATCH 40/49] Last blob is now filled with the new functions --- mod/wall_attach.php | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/mod/wall_attach.php b/mod/wall_attach.php index 8bf1fdbf19..9f455a19f3 100644 --- a/mod/wall_attach.php +++ b/mod/wall_attach.php @@ -138,21 +138,12 @@ function wall_attach_post(App $a) { $mimetype = z_mime_content_type($filename); $hash = get_guid(64); $created = datetime_convert(); - $r = q("INSERT INTO `attach` ( `uid`, `hash`, `filename`, `filetype`, `filesize`, `data`, `created`, `edited`, `allow_cid`, `allow_gid`,`deny_cid`, `deny_gid` ) - VALUES ( %d, '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ", - intval($page_owner_uid), - dbesc($hash), - dbesc($filename), - dbesc($mimetype), - intval($filesize), - dbesc($filedata), - dbesc($created), - dbesc($created), - dbesc('<' . $page_owner_cid . '>'), - dbesc(''), - dbesc(''), - dbesc('') - ); + + $fields = array('uid' => $page_owner_uid, 'hash' => $hash, 'filename' => $filename, 'filetype' => $mimetype, + 'filesize' => $filesize, 'data' => $filedata, 'created' => $created, 'edited' => $created, + 'allow_cid' => '<' . $page_owner_cid . '>', 'allow_gid' => '','deny_cid' => '', 'deny_gid' => ''); + + $r = dba::insert('attach', $fields); @unlink($src); From 0eb92bf12a683358afb991da16ff7a3feab49796 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 16 Sep 2017 05:09:14 +0000 Subject: [PATCH 41/49] Unused functions removed --- include/dba.php | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/include/dba.php b/include/dba.php index c7266b9798..bc38029351 100644 --- a/include/dba.php +++ b/include/dba.php @@ -7,11 +7,6 @@ require_once('include/datetime.php'); /** * @class MySQL database class * - * For debugging, insert 'dbg(1);' anywhere in the program flow. - * dbg(0); will turn it off. Logging is performed at LOGGER_DATA level. - * When logging, all binary info is converted to text and html entities are escaped so that - * the debugging stream is safe to view within both terminals and web pages. - * * This class is for the low level database stuff that does driver specific things. */ @@ -242,10 +237,6 @@ class dba { return $data; } - public function dbg($dbg) { - $this->debug = $dbg; - } - public function escape($str) { if ($this->db && $this->connected) { switch ($this->driver) { @@ -1291,24 +1282,6 @@ class dba { } } -function printable($s) { - $s = preg_replace("~([\x01-\x08\x0E-\x0F\x10-\x1F\x7F-\xFF])~",".", $s); - $s = str_replace("\x00",'.',$s); - if (x($_SERVER,'SERVER_NAME')) { - $s = escape_tags($s); - } - return $s; -} - -// Procedural functions -function dbg($state) { - global $db; - - if ($db) { - $db->dbg($state); - } -} - function dbesc($str) { global $db; From 0982a30c89eb143ad62d46e8c6389da9480da4cf Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 16 Sep 2017 17:22:22 +0000 Subject: [PATCH 42/49] Improvement for PR 3705: The detection has to be changed here as well --- include/diaspora.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/diaspora.php b/include/diaspora.php index 8bfba6eff4..af934cc937 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -1013,7 +1013,8 @@ class Diaspora { * @param array $item The item array */ private static function fetch_guid($item) { - preg_replace_callback("=diaspora://.*?/([^\s\]]*)=ism", + $expression = "=diaspora://.*?/post/([0-9A-Za-z\-_@.:]{15,254}[0-9A-Za-z])=ism"; + preg_replace_callback($expression, function ($match) use ($item) { return self::fetch_guid_sub($match, $item); }, $item["body"]); From ef8ad9f1ede56c80ba0cc13298511d7943e04894 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 16 Sep 2017 18:23:24 +0000 Subject: [PATCH 43/49] Diaspora: Sending retractions only worked for posts - nor for comments or likes --- include/diaspora.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/include/diaspora.php b/include/diaspora.php index 8bfba6eff4..ad1691ba4a 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -3525,7 +3525,14 @@ class Diaspora { $itemaddr = self::handle_from_contact($item["contact-id"], $item["gcontact-id"]); $msg_type = "retraction"; - $target_type = "Post"; + + if ($item['id'] == $item['parent']) { + $target_type = "Post"; + } elseif ($item["verb"] == ACTIVITY_LIKE) { + $target_type = "Like"; + } else { + $target_type = "Comment"; + } $message = array("author" => $itemaddr, "target_guid" => $item['guid'], From 8d4736c942b9ccfc3473264684d6ccd1081c428c Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 17 Sep 2017 08:01:22 +0000 Subject: [PATCH 44/49] OStatus: We can now process delete messages / better account detection --- boot.php | 1 + include/Contact.php | 26 ++++++++- include/ostatus.php | 132 +++++++++++++++++++++++++++++--------------- include/threads.php | 5 +- 4 files changed, 115 insertions(+), 49 deletions(-) diff --git a/boot.php b/boot.php index 417502b960..32fee4f509 100644 --- a/boot.php +++ b/boot.php @@ -394,6 +394,7 @@ define ( 'ACTIVITY_POST', NAMESPACE_ACTIVITY_SCHEMA . 'post' ); define ( 'ACTIVITY_UPDATE', NAMESPACE_ACTIVITY_SCHEMA . 'update' ); define ( 'ACTIVITY_TAG', NAMESPACE_ACTIVITY_SCHEMA . 'tag' ); define ( 'ACTIVITY_FAVORITE', NAMESPACE_ACTIVITY_SCHEMA . 'favorite' ); +define ( 'ACTIVITY_UNFAVORITE', NAMESPACE_ACTIVITY_SCHEMA . 'unfavorite' ); define ( 'ACTIVITY_SHARE', NAMESPACE_ACTIVITY_SCHEMA . 'share' ); define ( 'ACTIVITY_DELETE', NAMESPACE_ACTIVITY_SCHEMA . 'delete' ); diff --git a/include/Contact.php b/include/Contact.php index 69c3b121f8..a4477c8cb3 100644 --- a/include/Contact.php +++ b/include/Contact.php @@ -206,6 +206,8 @@ function get_contact_details_by_url($url, $uid = -1, $default = array()) { return $cache[$url][$uid]; } + $ssl_url = str_replace('http://', 'https://', $url); + // Fetch contact data from the contact table for the given user $s = dba::p("SELECT `id`, `id` AS `cid`, 0 AS `gid`, 0 AS `zid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, `xmpp`, `keywords`, `gender`, `photo`, `thumb`, `micro`, `forum`, `prv`, (`forum` | `prv`) AS `community`, `contact-type`, `bd` AS `birthday`, `self` @@ -213,6 +215,15 @@ function get_contact_details_by_url($url, $uid = -1, $default = array()) { normalise_link($url), $uid); $r = dba::inArray($s); + // Fetch contact data from the contact table for the given user, checking with the alias + if (!dbm::is_result($r)) { + $s = dba::p("SELECT `id`, `id` AS `cid`, 0 AS `gid`, 0 AS `zid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, `xmpp`, + `keywords`, `gender`, `photo`, `thumb`, `micro`, `forum`, `prv`, (`forum` | `prv`) AS `community`, `contact-type`, `bd` AS `birthday`, `self` + FROM `contact` WHERE `alias` IN (?, ?, ?) AND `uid` = ?", + normalise_link($url), $url, $ssl_url, $uid); + $r = dba::inArray($s); + } + // Fetch the data from the contact table with "uid=0" (which is filled automatically) if (!dbm::is_result($r)) { $s = dba::p("SELECT `id`, 0 AS `cid`, `id` AS `zid`, 0 AS `gid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, `xmpp`, @@ -222,6 +233,15 @@ function get_contact_details_by_url($url, $uid = -1, $default = array()) { $r = dba::inArray($s); } + // Fetch the data from the contact table with "uid=0" (which is filled automatically) - checked with the alias + if (!dbm::is_result($r)) { + $s = dba::p("SELECT `id`, 0 AS `cid`, `id` AS `zid`, 0 AS `gid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, `xmpp`, + `keywords`, `gender`, `photo`, `thumb`, `micro`, `forum`, `prv`, (`forum` | `prv`) AS `community`, `contact-type`, `bd` AS `birthday`, 0 AS `self` + FROM `contact` WHERE `alias` IN (?, ?, ?) AND `uid` = 0", + normalise_link($url), $url, $ssl_url); + $r = dba::inArray($s); + } + // Fetch the data from the gcontact table if (!dbm::is_result($r)) { $s = dba::p("SELECT 0 AS `id`, 0 AS `cid`, `id` AS `gid`, 0 AS `zid`, 0 AS `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, '' AS `xmpp`, @@ -542,8 +562,10 @@ function get_contact($url, $uid = 0, $no_update = false) { // Then the alias (which could be anything) if (!dbm::is_result($contact)) { - $r = dba::p("SELECT `id`, `avatar-date` FROM `contact` WHERE `alias` IN (?, ?) AND `uid` = ? LIMIT 1", - $url, normalise_link($url), $uid); + // The link could be provided as http although we stored it as https + $ssl_url = str_replace('http://', 'https://', $url); + $r = dba::p("SELECT `id`, `avatar-date` FROM `contact` WHERE `alias` IN (?, ?, ?) AND `uid` = ? LIMIT 1", + $url, normalise_link($url), $ssl_url, $uid); $contact = dba::fetch($r); dba::close($r); } diff --git a/include/ostatus.php b/include/ostatus.php index 45ac8061c9..9472c56e03 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -7,6 +7,7 @@ use Friendica\App; use Friendica\Core\System; use Friendica\Core\Config; use Friendica\Network\Probe; +use Friendica\Util\Lock; require_once 'include/Contact.php'; require_once 'include/threads.php'; @@ -64,28 +65,34 @@ class ostatus { $author["contact-id"] = $contact["id"]; + $found = false; + if ($author["author-link"] != "") { if ($aliaslink == "") { $aliaslink = $author["author-link"]; } - $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `nurl` IN ('%s', '%s') AND `network` != '%s'", - intval($importer["uid"]), dbesc(normalise_link($author["author-link"])), - dbesc(normalise_link($aliaslink)), dbesc(NETWORK_STATUSNET)); + $condition = array("`uid` = ? AND `nurl` IN (?, ?) AND `network` != ?", $importer["uid"], + normalise_link($author["author-link"]), normalise_link($aliaslink), NETWORK_STATUSNET); + $r = dba::select('contact', array(), $condition, array('limit' => 1)); if (dbm::is_result($r)) { - $contact = $r[0]; - $author["contact-id"] = $r[0]["id"]; - $author["author-link"] = $r[0]["url"]; + $found = true; + $contact = $r; + $author["contact-id"] = $r["id"]; + $author["author-link"] = $r["url"]; } - } elseif ($addr != "") { - // Should not happen - $contact = dba::fetch_first("SELECT * FROM `contact` WHERE `uid` = ? AND `addr` = ? AND `network` != ?", - $importer["uid"], $addr, NETWORK_STATUSNET); + } - if (dbm::is_result($contact)) { - $author["contact-id"] = $contact["id"]; - $author["author-link"] = $contact["url"]; + if (!$found && ($addr != "")) { + $condition = array("`uid` = ? AND `addr` = ? AND `network` != ?", + $importer["uid"], $addr, NETWORK_STATUSNET); + $r = dba::select('contact', array(), $condition, array('limit' => 1)); + + if (dbm::is_result($r)) { + $contact = $r; + $author["contact-id"] = $r["id"]; + $author["author-link"] = $r["url"]; } } @@ -176,14 +183,16 @@ class ostatus { $cid = get_contact($author["author-link"], 0); if ($cid) { + $fields = array('url', 'name', 'nick', 'alias', 'about', 'location'); + $old_contact = dba::select('contact', $fields, array('id' => $cid), array('limit' => 1)); + // Update it with the current values - q("UPDATE `contact` SET `url` = '%s', `name` = '%s', `nick` = '%s', `alias` = '%s', - `about` = '%s', `location` = '%s', - `success_update` = '%s', `last-update` = '%s' - WHERE `id` = %d", - dbesc($author["author-link"]), dbesc($contact["name"]), dbesc($contact["nick"]), - dbesc($contact["alias"]), dbesc($contact["about"]), dbesc($contact["location"]), - dbesc(datetime_convert()), dbesc(datetime_convert()), intval($cid)); + $fields = array('url' => $author["author-link"], 'name' => $contact["name"], + 'nick' => $contact["nick"], 'alias' => $contact["alias"], + 'about' => $contact["about"], 'location' => $contact["location"], + 'success_update' => datetime_convert(), 'last-update' => datetime_convert()); + + dba::update('contact', $fields, array('id' => $cid), $old_contact); // Update the avatar update_contact_avatar($author["author-avatar"], 0, $cid); @@ -370,18 +379,39 @@ class ostatus { $item = array_merge($header, $author); + $item["uri"] = $xpath->query('atom:id/text()', $entry)->item(0)->nodeValue; + $item["verb"] = $xpath->query('activity:verb/text()', $entry)->item(0)->nodeValue; - /// Delete a message + // Delete a message if (in_array($item["verb"], array('qvitter-delete-notice', ACTIVITY_DELETE, 'delete'))) { - // ignore "Delete" messages (by now) - logger("Ignore delete message ".print_r($item, true)); + self::deleteNotice($item); continue; } + if (in_array($item["verb"], array(NAMESPACE_OSTATUS."/unfavorite", ACTIVITY_UNFAVORITE))) { + // Ignore "Unfavorite" message + logger("Ignore unfavorite message ".print_r($item, true), LOGGER_DEBUG); + continue; + } + + // Deletions come with the same uri, so we check for duplicates after processing deletions + if (dba::exists('item', array('uid' => $importer["uid"], 'uri' => $item["uri"]))) { + logger('Post with URI '.$item["uri"].' already existed for user '.$importer["uid"].'.', LOGGER_DEBUG); + continue; + } else { + logger('Processing post with URI '.$item["uri"].' for user '.$importer["uid"].'.', LOGGER_DEBUG); + } + if ($item["verb"] == ACTIVITY_JOIN) { // ignore "Join" messages - logger("Ignore join message ".print_r($item, true)); + logger("Ignore join message ".print_r($item, true), LOGGER_DEBUG); + continue; + } + + if ($item["verb"] == "http://mastodon.social/schema/1.0/block") { + // ignore mastodon "block" messages + logger("Ignore block message ".print_r($item, true), LOGGER_DEBUG); continue; } @@ -395,12 +425,6 @@ class ostatus { continue; } - if ($item["verb"] == NAMESPACE_OSTATUS."/unfavorite") { - // Ignore "Unfavorite" message - logger("Ignore unfavorite message ".print_r($item, true)); - continue; - } - if ($item["verb"] == ACTIVITY_FAVORITE) { $orig_uri = $xpath->query("activity:object/atom:id", $entry)->item(0)->nodeValue; logger("Favorite ".$orig_uri." ".print_r($item, true)); @@ -411,10 +435,8 @@ class ostatus { } // http://activitystrea.ms/schema/1.0/rsvp-yes - // http://activitystrea.ms/schema/1.0/unfavorite - // http://mastodon.social/schema/1.0/block if (!in_array($item["verb"], array(ACTIVITY_POST, ACTIVITY_LIKE, ACTIVITY_SHARE))) { - logger("Unhandled verb ".$item["verb"]." ".print_r($item, true)); + logger("Unhandled verb ".$item["verb"]." ".print_r($item, true), LOGGER_DEBUG); } self::processPost($xpath, $entry, $item, $importer); @@ -457,17 +479,44 @@ class ostatus { if ($found) { logger("Item with uri ".$item["uri"]." for user ".$importer["uid"]." already exists.", LOGGER_DEBUG); } else { - $ret = item_store($item); - logger('Item was stored with return value '.$ret); + // We are having duplicated entries. Hopefully this solves it. + if (Lock::set('ostatus_process_item_store')) { + $ret = item_store($item); + Lock::remove('ostatus_process_item_store'); + logger("Item with uri ".$item["uri"]." for user ".$importer["uid"].' stored. Return value: '.$ret); + } else { + $ret = item_store($item); + logger("We couldn't lock - but tried to store the item anyway. Return value is ".$ret); + } } } } self::$itemlist = array(); } + logger('Processing done for post with URI '.$item["uri"].' for user '.$importer["uid"].'.', LOGGER_DEBUG); } return true; } + private static function deleteNotice($item) { + + $condition = array('uid' => $item['uid'], 'author-link' => $item['author-link'], 'uri' => $item['uri']); + $deleted = dba::select('item', array('id', 'parent-uri'), $condition, array('limit' => 1)); + if (!dbm::is_result($deleted)) { + logger('Item from '.$item['author-link'].' with uri '.$item['uri'].' for user '.$item['uid']." wasn't found. We don't delete it. "); + return; + } + + // Currently we don't have a central deletion function that we could use in this case. The function "item_drop" doesn't work for that case + dba::update('item', array('deleted' => true, 'title' => '', 'body' => '', + 'edited' => datetime_convert(), 'changed' => datetime_convert()), + array('id' => $deleted["id"])); + + delete_thread($deleted["id"], $deleted["parent-uri"]); + + logger('Deleted item with uri '.$item['uri'].' for user '.$item['uid']); + } + /** * @brief Processes the XML for a post * @@ -477,13 +526,6 @@ class ostatus { * @param array $importer user record of the importing user */ private static function processPost($xpath, $entry, &$item, $importer) { - $item["uri"] = $xpath->query('atom:id/text()', $entry)->item(0)->nodeValue; - - if (dba::exists('item', array('uid' => $importer["uid"], 'uri' => $item["uri"]))) { - logger('Post with URI '.$item["uri"].' already existed for user '.$importer["uid"].'.'); - return; - } - $item["body"] = html2bbcode($xpath->query('atom:content/text()', $entry)->item(0)->nodeValue); $item["object-type"] = $xpath->query('activity:object-type/text()', $entry)->item(0)->nodeValue; if (($item["object-type"] == ACTIVITY_OBJ_BOOKMARK) || ($item["object-type"] == ACTIVITY_OBJ_EVENT)) { @@ -601,7 +643,7 @@ class ostatus { if (!dba::exists('item', array('uid' => $importer["uid"], 'uri' => $item['parent-uri']))) { self::fetchRelated($related, $item["parent-uri"], $importer); } else { - logger('Reply with URI '.$item["uri"].' already existed for user '.$importer["uid"].'.'); + logger('Reply with URI '.$item["uri"].' already existed for user '.$importer["uid"].'.', LOGGER_DEBUG); } $item["type"] = 'remote-comment'; @@ -766,7 +808,7 @@ class ostatus { private static function fetchSelf($self, &$item) { $condition = array('`item-uri` = ? AND `protocol` IN (?, ?)', $self, PROTOCOL_DFRN, PROTOCOL_OSTATUS_SALMON); if (dba::exists('conversation', $condition)) { - logger('Conversation '.$item['uri'].' is already stored.'); + logger('Conversation '.$item['uri'].' is already stored.', LOGGER_DEBUG); return; } @@ -786,7 +828,7 @@ class ostatus { $item["protocol"] = PROTOCOL_OSTATUS_SALMON; $item["source"] = $xml; - logger('Conversation '.$item['uri'].' is now fetched.'); + logger('Conversation '.$item['uri'].' is now fetched.', LOGGER_DEBUG); } /** diff --git a/include/threads.php b/include/threads.php index 906766da87..8e58a04b31 100644 --- a/include/threads.php +++ b/include/threads.php @@ -240,18 +240,19 @@ function delete_thread_uri($itemuri, $uid) { function delete_thread($itemid, $itemuri = "") { $item = q("SELECT `uid` FROM `thread` WHERE `iid` = %d", intval($itemid)); + // Using dba::delete at this time could delete the associated item entries $result = q("DELETE FROM `thread` WHERE `iid` = %d", intval($itemid)); logger("delete_thread: Deleted thread for item ".$itemid." - ".print_r($result, true), LOGGER_DEBUG); if ($itemuri != "") { - $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND NOT (`uid` IN (%d, 0))", + $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND NOT `deleted` AND NOT (`uid` IN (%d, 0))", dbesc($itemuri), intval($item["uid"]) ); if (!dbm::is_result($r)) { dba::delete('item', array('uri' => $itemuri, 'uid' => 0)); - logger("delete_thread: Deleted shadow for item ".$itemuri." - ".print_r($result, true), LOGGER_DEBUG); + logger("delete_thread: Deleted shadow for item ".$itemuri, LOGGER_DEBUG); } } } From 926314a24c2b042f7a794c8daf8c78dd35549e85 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 17 Sep 2017 08:13:10 +0000 Subject: [PATCH 45/49] gcontact is now updated with the new database functions as well --- include/socgraph.php | 55 ++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/include/socgraph.php b/include/socgraph.php index 621085b0ee..081290d810 100644 --- a/include/socgraph.php +++ b/include/socgraph.php @@ -2238,22 +2238,22 @@ function update_gcontact($contact) { if ($update) { logger("Update gcontact for ".$contact["url"], LOGGER_DEBUG); + $condition = array('`nurl` = ? AND (`generation` = 0 OR `generation` >= ?)', + normalise_link($contact["url"]), $contact["generation"]); + $contact["updated"] = dbm::date($contact["updated"]); - q("UPDATE `gcontact` SET `photo` = '%s', `name` = '%s', `nick` = '%s', `addr` = '%s', `network` = '%s', - `birthday` = '%s', `gender` = '%s', `keywords` = '%s', `hide` = %d, `nsfw` = %d, - `contact-type` = %d, `alias` = '%s', `notify` = '%s', `url` = '%s', - `location` = '%s', `about` = '%s', `generation` = %d, `updated` = '%s', - `server_url` = '%s', `connect` = '%s' - WHERE `nurl` = '%s' AND (`generation` = 0 OR `generation` >= %d)", - dbesc($contact["photo"]), dbesc($contact["name"]), dbesc($contact["nick"]), - dbesc($contact["addr"]), dbesc($contact["network"]), dbesc($contact["birthday"]), - dbesc($contact["gender"]), dbesc($contact["keywords"]), intval($contact["hide"]), - intval($contact["nsfw"]), intval($contact["contact-type"]), dbesc($contact["alias"]), - dbesc($contact["notify"]), dbesc($contact["url"]), dbesc($contact["location"]), - dbesc($contact["about"]), intval($contact["generation"]), dbesc(dbm::date($contact["updated"])), - dbesc($contact["server_url"]), dbesc($contact["connect"]), - dbesc(normalise_link($contact["url"])), intval($contact["generation"])); + $updated = array('photo' => $contact['photo'], 'name' => $contact['name'], + 'nick' => $contact['nick'], 'addr' => $contact['addr'], + 'network' => $contact['network'], 'birthday' => $contact['birthday'], + 'gender' => $contact['gender'], 'keywords' => $contact['keywords'], + 'hide' => $contact['hide'], 'nsfw' => $contact['nsfw'], + 'contact-type' => $contact['contact-type'], 'alias' => $contact['alias'], + 'notify' => $contact['notify'], 'url' => $contact['url'], + 'location' => $contact['location'], 'about' => $contact['about'], + 'generation' => $contact['generation'], 'updated' => $contact['updated'], + 'server_url' => $contact['server_url'], 'connect' => $contact['connect']); + dba::update('gcontact', $updated, $condition, $fields); // Now update the contact entry with the user id "0" as well. // This is used for the shadow copies of public items. @@ -2261,20 +2261,25 @@ function update_gcontact($contact) { dbesc(normalise_link($contact["url"]))); if (dbm::is_result($r)) { - logger("Update shadow contact ".$r[0]["id"], LOGGER_DEBUG); + logger("Update public contact ".$r[0]["id"], LOGGER_DEBUG); update_contact_avatar($contact["photo"], 0, $r[0]["id"]); - q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `addr` = '%s', - `network` = '%s', `bd` = '%s', `gender` = '%s', - `keywords` = '%s', `alias` = '%s', `contact-type` = %d, - `url` = '%s', `location` = '%s', `about` = '%s' - WHERE `id` = %d", - dbesc($contact["name"]), dbesc($contact["nick"]), dbesc($contact["addr"]), - dbesc($contact["network"]), dbesc($contact["birthday"]), dbesc($contact["gender"]), - dbesc($contact["keywords"]), dbesc($contact["alias"]), intval($contact["contact-type"]), - dbesc($contact["url"]), dbesc($contact["location"]), dbesc($contact["about"]), - intval($r[0]["id"])); + $fields = array('name', 'nick', 'addr', + 'network', 'bd', 'gender', + 'keywords', 'alias', 'contact-type', + 'url', 'location', 'about'); + $old_contact = dba::select('contact', $fields, array('id' => $r[0]["id"]), array('limit' => 1)); + + // Update it with the current values + $fields = array('name' => $contact['name'], 'nick' => $contact['nick'], + 'addr' => $contact['addr'], 'network' => $contact['network'], + 'bd' => $contact['birthday'], 'gender' => $contact['gender'], + 'keywords' => $contact['keywords'], 'alias' => $contact['alias'], + 'contact-type' => $contact['contact-type'], 'url' => $contact['url'], + 'location' => $contact['location'], 'about' => $contact['about']); + + dba::update('contact', $fields, array('id' => $r[0]["id"]), $old_contact); } } From 5ed24954f0522474c6707fba23c1511600f9e6de Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 18 Sep 2017 06:09:18 +0000 Subject: [PATCH 46/49] Bugfix: Pleroma was detected as Mastodon --- include/socgraph.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/socgraph.php b/include/socgraph.php index 081290d810..f0a855d70c 100644 --- a/include/socgraph.php +++ b/include/socgraph.php @@ -1158,8 +1158,9 @@ function poco_check_server($server_url, $network = "", $force = false) { $network = NETWORK_OSTATUS; } } - if (strstr($orig_version, 'Pleroma')) { + if (strstr($orig_version.$version, 'Pleroma')) { $platform = 'Pleroma'; + $version = trim(str_replace('Pleroma', '', $version)); } } From b79c3241c62b6c4a0aadbf6a467df4aff6872f00 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 19 Sep 2017 11:53:19 +0000 Subject: [PATCH 47/49] Directly serve atom+xml if requested --- include/ostatus.php | 4 ++-- mod/display.php | 23 ++++++++++++++++------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/include/ostatus.php b/include/ostatus.php index 9472c56e03..19392b9173 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -674,7 +674,7 @@ class ostatus { self::$conv_list[$conversation] = true; - $conversation_data = z_fetch_url($conversation); + $conversation_data = z_fetch_url($conversation, false, $redirects, array('accept_content' => 'application/atom+xml')); if (!$conversation_data['success']) { return; @@ -855,7 +855,7 @@ class ostatus { } $stored = false; - $related_data = z_fetch_url($related); + $related_data = z_fetch_url($related, false, $redirects, array('accept_content' => 'application/atom+xml')); if (!$related_data['success']) { return; diff --git a/mod/display.php b/mod/display.php index d8cdf658a6..37d3a123a8 100644 --- a/mod/display.php +++ b/mod/display.php @@ -17,13 +17,7 @@ function display_init(App $a) { if ($a->argc == 3) { if (substr($a->argv[2], -5) == '.atom') { $item_id = substr($a->argv[2], 0, -5); - $xml = dfrn::itemFeed($item_id); - if ($xml == '') { - http_status_exit(500); - } - header("Content-type: application/atom+xml"); - echo $xml; - killme(); + displayShowFeed($item_id); } } @@ -70,6 +64,12 @@ function display_init(App $a) { AND `item`.`guid` = ? LIMIT 1", $a->argv[1]); } if (dbm::is_result($r)) { + + if (strstr($_SERVER['HTTP_ACCEPT'], 'application/atom+xml')) { + logger('Directly serving XML for id '.$r["id"], LOGGER_DEBUG); + displayShowFeed($r["id"]); + } + if ($r["id"] != $r["parent"]) { $r = dba::fetch_first("SELECT `id`, `author-name`, `author-link`, `author-avatar`, `network`, `body`, `uid`, `owner-link` FROM `item` WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` @@ -499,3 +499,12 @@ function display_content(App $a, $update = 0) { return $o; } +function displayShowFeed($item_id) { + $xml = dfrn::itemFeed($item_id); + if ($xml == '') { + http_status_exit(500); + } + header("Content-type: application/atom+xml"); + echo $xml; + killme(); +} From fdc010bb1b9f2998ea950527f4bc9f136d4cf080 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 19 Sep 2017 12:59:24 +0000 Subject: [PATCH 48/49] Bugfix: Mails weren't created --- include/message.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/message.php b/include/message.php index 5914621416..d6b1601110 100644 --- a/include/message.php +++ b/include/message.php @@ -65,7 +65,7 @@ function send_message($recipient=0, $body='', $subject='', $replyto=''){ 'subject' => $subject, 'recips' => $handles); $r = dba::insert('conv', $fields); - $r = dba::select('conv', array('id', array('guid' => $conv_guid, 'uid' => local_user())), array('limit' => 1)); + $r = dba::select('conv', array('id'), array('guid' => $conv_guid, 'uid' => local_user()), array('limit' => 1)); if (dbm::is_result($r)) $convid = $r['id']; } @@ -191,7 +191,7 @@ function send_wallmessage($recipient='', $body='', $subject='', $replyto=''){ 'subject' => $subject, 'recips' => $handles); $r = dba::insert('conv', $fields); - $r = dba::select('conv', array('id', array('guid' => $conv_guid, 'uid' => $recipient['uid'])), array('limit' => 1)); + $r = dba::select('conv', array('id'), array('guid' => $conv_guid, 'uid' => $recipient['uid']), array('limit' => 1)); if (!dbm::is_result($r)) { logger('send message: conversation not found.'); return -4; From 1939de2b33a0135a8e55c9e9dbfc1688e460c779 Mon Sep 17 00:00:00 2001 From: Alexander Fortin Date: Sat, 23 Sep 2017 19:56:37 +0200 Subject: [PATCH 49/49] Fix Nginx example config Check https://stackoverflow.com/questions/15423500/nginx-showing-blank-php-pages#16887296 for the rest of the change (without, I get white page on a testing vagrant box) --- mods/sample-nginx.config | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mods/sample-nginx.config b/mods/sample-nginx.config index 6bf75bd818..ac518cbd48 100644 --- a/mods/sample-nginx.config +++ b/mods/sample-nginx.config @@ -129,9 +129,8 @@ server { # With php5-fpm: fastcgi_pass unix:/var/run/php5-fpm.sock; - include fastcgi_params; + include fastcgi.conf; fastcgi_index index.php; - fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } # deny access to all dot files