aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--addon/facebook/facebook.php34
-rw-r--r--addon/js_upload/js_upload.php6
-rw-r--r--addon/statusnet/statusnet.php66
-rw-r--r--addon/twitter/twitter.php24
-rw-r--r--boot.php2094
-rw-r--r--database.sql8
-rw-r--r--images/diaspora.pngbin0 -> 461 bytes
-rw-r--r--images/friendika-16.pngbin770 -> 756 bytes
-rw-r--r--include/Scrape.php88
-rw-r--r--include/acl.js4
-rw-r--r--include/acl_selectors.php4
-rw-r--r--include/api.php449
-rw-r--r--include/attach.php11
-rw-r--r--include/auth.php12
-rw-r--r--include/config.php218
-rw-r--r--include/conversation.php46
-rw-r--r--include/cronhooks.php43
-rw-r--r--include/crypto.php184
-rw-r--r--include/datetime.php109
-rw-r--r--include/diaspora.php815
-rw-r--r--include/event.php13
-rw-r--r--include/group.php28
-rw-r--r--include/items.php46
-rw-r--r--include/main.js12
-rw-r--r--include/network.php695
-rw-r--r--include/notifier.php69
-rw-r--r--include/oembed.php6
-rw-r--r--include/plugin.php199
-rw-r--r--include/poller.php22
-rw-r--r--include/salmon.php95
-rw-r--r--include/security.php4
-rw-r--r--include/text.php954
-rw-r--r--index.php8
-rw-r--r--library/ASNValue.class.php169
-rw-r--r--library/asn1.php7
-rw-r--r--library/simplepie/simplepie.inc7
-rw-r--r--mod/admin.php8
-rw-r--r--mod/contactgroup.php50
-rw-r--r--mod/contacts.php37
-rw-r--r--mod/dfrn_confirm.php96
-rw-r--r--mod/dfrn_notify.php1
-rw-r--r--mod/dfrn_poll.php8
-rw-r--r--mod/dfrn_request.php10
-rw-r--r--mod/display.php2
-rw-r--r--mod/events.php12
-rw-r--r--mod/follow.php30
-rw-r--r--mod/friendika.php4
-rw-r--r--mod/hcard.php50
-rw-r--r--mod/help.php11
-rw-r--r--mod/hostxrd.php (renamed from include/hostxrd.php)5
-rw-r--r--mod/install.php6
-rw-r--r--mod/item.php95
-rw-r--r--mod/login.php2
-rw-r--r--mod/lostpass.php8
-rw-r--r--mod/network.php3
-rw-r--r--mod/notifications.php20
-rw-r--r--mod/openid.php10
-rw-r--r--mod/parse_url.php2
-rw-r--r--mod/photo.php17
-rw-r--r--mod/photos.php4
-rw-r--r--mod/probe.php24
-rw-r--r--mod/profile.php5
-rw-r--r--mod/profiles.php7
-rw-r--r--mod/pubsub.php4
-rw-r--r--mod/receive.php203
-rw-r--r--mod/redir.php4
-rw-r--r--mod/register.php10
-rw-r--r--mod/removeme.php2
-rw-r--r--mod/salmon.php54
-rw-r--r--mod/search.php1
-rw-r--r--mod/wall_attach.php6
-rw-r--r--mod/webfinger.php2
-rw-r--r--mod/xrd.php14
-rw-r--r--update.php26
-rw-r--r--util/messages.po2622
-rw-r--r--util/strings.php2410
-rw-r--r--view/api_config_xml.tpl (renamed from view/apiconfig.tpl)19
-rw-r--r--view/api_timeline_atom.tpl51
-rw-r--r--view/api_timeline_xml.tpl1
-rw-r--r--view/api_user_xml.tpl6
-rw-r--r--view/atom_feed.tpl4
-rw-r--r--view/atom_feed_dfrn.tpl28
-rw-r--r--view/de/messages.po2747
-rw-r--r--view/de/strings.php381
-rw-r--r--view/diaspora_comment.tpl11
-rw-r--r--view/diaspora_comment_relay.tpl12
-rw-r--r--view/diaspora_like.tpl12
-rw-r--r--view/diaspora_like_relay.tpl13
-rw-r--r--view/diaspora_post.tpl11
-rw-r--r--view/diaspora_retract.tpl9
-rw-r--r--view/diaspora_share.tpl8
-rw-r--r--view/jot-header.tpl1
-rw-r--r--view/magicsig.tpl2
-rw-r--r--view/profile_edit.tpl3
-rw-r--r--view/profile_vcard.tpl2
-rw-r--r--view/pt-br/messages.po2
-rw-r--r--view/pt-br/strings.php2
-rw-r--r--view/register.tpl3
-rw-r--r--view/theme/duepuntozero/style.css8
-rw-r--r--view/xrd_host.tpl2
-rw-r--r--view/xrd_person.tpl2
101 files changed, 9780 insertions, 5994 deletions
diff --git a/addon/facebook/facebook.php b/addon/facebook/facebook.php
index 73518afb2..47e7691e4 100644
--- a/addon/facebook/facebook.php
+++ b/addon/facebook/facebook.php
@@ -111,13 +111,13 @@ function facebook_init(&$a) {
$token = substr($token,0,strpos($token,'&'));
set_pconfig($uid,'facebook','access_token',$token);
set_pconfig($uid,'facebook','post','1');
+ set_pconfig($uid,'facebook','no_linking',1);
fb_get_self($uid);
fb_get_friends($uid);
fb_consume_all($uid);
}
- // todo: is this a browser session or a server session? where do we go?
}
}
@@ -214,7 +214,7 @@ function fb_get_friends($uid) {
dbesc(($jp->nickname) ? $jp->nickname : strtolower($jp->first_name)),
dbesc('https://graph.facebook.com/' . $jp->id . '/picture'),
dbesc(NETWORK_FACEBOOK),
- intval(REL_BUD),
+ intval(CONTACT_IS_FRIEND),
intval(1),
intval(1)
);
@@ -258,6 +258,8 @@ function fb_get_friends($uid) {
}
}
+// This is the POST method to the facebook settings page
+// Content is posted to Facebook in the function facebook_post_hook()
function facebook_post(&$a) {
@@ -298,6 +300,8 @@ function facebook_post(&$a) {
return;
}
+// Facebook settings form
+
function facebook_content(&$a) {
if(! local_user()) {
@@ -347,14 +351,18 @@ function facebook_content(&$a) {
$o .= '<form action="facebook" method="post" >';
$post_by_default = get_pconfig(local_user(),'facebook','post_by_default');
$checked = (($post_by_default) ? ' checked="checked" ' : '');
- $o .= '<input type="checkbox" name="post_by_default" value="1"' . $checked . '/>' . ' ' . t('Post to Facebook by default') . '<br />';
+ $o .= '<input type="checkbox" name="post_by_default" value="1"' . $checked . '/>' . ' ' . t('Post to Facebook by default') . EOL;
$no_linking = get_pconfig(local_user(),'facebook','no_linking');
$checked = (($no_linking) ? '' : ' checked="checked" ');
- $o .= '<input type="checkbox" name="facebook_linking" value="1"' . $checked . '/>' . ' ' . t('Link all your Facebook friends and conversations') . '<br />';
-
-
+ $o .= '<input type="checkbox" name="facebook_linking" value="1"' . $checked . '/>' . ' ' . t('Link all your Facebook friends and conversations') . EOL ;
+ $hidden = (($a->user['hidewall'] || get_config('system','block_public')) ? true : false);
+ if(! $hidden) {
+ $o .= EOL;
+ $o .= t('Warning: Your Facebook privacy settings can not be imported.') . EOL;
+ $o .= t('Linked Facebook items <strong>may</strong> be publicly visible, depending on your privacy settings for this website/account.') . EOL;
+ }
$o .= '<input type="submit" name="submit" value="' . t('Submit') . '" /></form></div>';
}
@@ -522,6 +530,13 @@ function facebook_post_hook(&$a,&$b) {
$fb_enable = (($fb_post && x($_POST,'facebook_enable')) ? intval($_POST['facebook_enable']) : 0);
$fb_token = get_pconfig(local_user(),'facebook','access_token');
+ // if API is used, default to the chosen settings
+ if($_POST['api_source'] && intval(get_pconfig(local_user(),'facebook','post_by_default')))
+ $fb_enable = 1;
+
+
+
+
logger('facebook: $fb_post: ' . $fb_post . ' $fb_enable: ' . $fb_enable . ' $fb_token: ' . $fb_token,LOGGER_DEBUG);
// post to facebook if it's a public post and we've ticked the 'post to Facebook' box,
@@ -564,7 +579,7 @@ function facebook_post_hook(&$a,&$b) {
$msg = preg_replace("/\[img\](.*?)\[\/img\]/is", t('Image: ') . '$1', $msg);
- if((strpos($link,$a->get_baseurl()) !== false) && (! $image))
+ if((strpos($link,z_root()) !== false) && (! $image))
$image = $a->get_baseurl() . '/images/friendika-64.jpg';
$msg = trim(strip_tags(bbcode($msg)));
@@ -746,6 +761,8 @@ function fb_consume_all($uid) {
$access_token = get_pconfig($uid,'facebook','access_token');
if(! $access_token)
return;
+
+
$s = fetch_url('https://graph.facebook.com/me/feed?access_token=' . $access_token);
if($s) {
$j = json_decode($s);
@@ -772,13 +789,12 @@ function fb_consume_stream($uid,$j,$wall = false) {
intval($uid)
);
- $user = q("SELECT `nickname` FROM `user` WHERE `uid` = %d LIMIT 1",
+ $user = q("SELECT `nickname`, `blockwall` FROM `user` WHERE `uid` = %d LIMIT 1",
intval($uid)
);
if(count($user))
$my_local_url = $a->get_baseurl() . '/profile/' . $user[0]['nickname'];
-
$self_id = get_pconfig($uid,'facebook','self_id');
if(! count($j->data) || (! strlen($self_id)))
return;
diff --git a/addon/js_upload/js_upload.php b/addon/js_upload/js_upload.php
index 331548f88..1996b8504 100644
--- a/addon/js_upload/js_upload.php
+++ b/addon/js_upload/js_upload.php
@@ -298,10 +298,10 @@ class qqFileUploader {
return array('error' => t('Uploaded file is empty'));
}
- if ($size > $this->sizeLimit) {
+// if ($size > $this->sizeLimit) {
- return array('error' => t('Uploaded file is too large'));
- }
+// return array('error' => t('Uploaded file is too large'));
+// }
$maximagesize = get_config('system','maximagesize');
diff --git a/addon/statusnet/statusnet.php b/addon/statusnet/statusnet.php
index 062884b96..2f02ded54 100644
--- a/addon/statusnet/statusnet.php
+++ b/addon/statusnet/statusnet.php
@@ -1,7 +1,7 @@
<?php
/**
* Name: StatusNet Connector
- * Version: 1.0
+ * Version: 1.0.2
* Author: Tobias Diekershoff <https://diekershoff.homeunix.net/friendika/profile/tobias>
*/
@@ -51,6 +51,57 @@ class StatusNetOAuth extends TwitterOAuth {
parent::__construct($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret);
$this->host = $apipath;
}
+ /**
+ * Make an HTTP request
+ *
+ * @return API results
+ *
+ * Copied here from the twitteroauth library and complemented by applying the proxy settings of friendika
+ */
+ function http($url, $method, $postfields = NULL) {
+ $this->http_info = array();
+ $ci = curl_init();
+ /* Curl settings */
+ $prx = get_config('system','proxy');
+ logger('Proxy SN: '.$prx);
+ if(strlen($prx)) {
+ curl_setopt($ci, CURLOPT_HTTPPROXYTUNNEL, 1);
+ curl_setopt($ci, CURLOPT_PROXY, $prx);
+ $prxusr = get_config('system','proxyuser');
+ if(strlen($prxusr))
+ curl_setopt($ci, CURLOPT_PROXYUSERPWD, $prxusr);
+ }
+ curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);
+ curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
+ curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
+ curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
+ curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));
+ curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
+ curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));
+ curl_setopt($ci, CURLOPT_HEADER, FALSE);
+
+ switch ($method) {
+ case 'POST':
+ curl_setopt($ci, CURLOPT_POST, TRUE);
+ if (!empty($postfields)) {
+ curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
+ }
+ break;
+ case 'DELETE':
+ curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
+ if (!empty($postfields)) {
+ $url = "{$url}?{$postfields}";
+ }
+ }
+
+ curl_setopt($ci, CURLOPT_URL, $url);
+ $response = curl_exec($ci);
+ $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
+ $this->http_info = array_merge($this->http_info, curl_getinfo($ci));
+ $this->url = $url;
+ curl_close ($ci);
+ return $response;
+ }
}
function statusnet_install() {
@@ -276,7 +327,7 @@ function statusnet_settings(&$a,&$s) {
$connection = new StatusNetOAuth($api,$ckey,$csecret,$otoken,$osecret);
$details = $connection->get('account/verify_credentials');
$s .= '<div id="statusnet-info" ><img id="statusnet-avatar" src="'.$details->profile_image_url.'" /><p id="statusnet-info-block">'. t('Currently connected to: ') .'<a href="'.$details->statusnet_profile_url.'" target="_statusnet">'.$details->screen_name.'</a><br /><em>'.$details->description.'</em></p></div>';
- $s .= '<p>'. t('If enabled all your <strong>public</strong> postings will be posted to the associated StatusNet account.') .'</p>';
+ $s .= '<p>'. t('If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry.') .'</p>';
$s .= '<div id="statusnet-enable-wrapper">';
$s .= '<label id="statusnet-enable-label" for="statusnet-checkbox">'. t('Allow posting to StatusNet') .'</label>';
$s .= '<input id="statusnet-checkbox" type="checkbox" name="statusnet-enable" value="1" ' . $checked . '/>';
@@ -322,6 +373,9 @@ function statusnet_post_hook(&$a,&$b) {
$statusnet_post = get_pconfig(local_user(),'statusnet','post');
$statusnet_enable = (($statusnet_post && x($_POST,'statusnet_enable')) ? intval($_POST['statusnet_enable']) : 0);
+ // if API is used, default to the chosen settings
+ if($_POST['api_source'] && intval(get_pconfig(local_user(),'statusnet','post_by_default')))
+ $statusnet_enable = 1;
if($statusnet_enable && $statusnet_post) {
require_once('include/bbcode.php');
@@ -402,10 +456,10 @@ function statusnet_plugin_admin(&$a, &$o){
/* empty form to add new site */
$id++;
$sitesform[] = Array(
- 'sitename' => Array("sitename[$id]", "Site name", "", ""),
- 'apiurl' => Array("apiurl[$id]", "Api url", "", ""),
- 'secret' => Array("secret[$id]", "Secret", "", ""),
- 'key' => Array("key[$id]", "Key", "", ""),
+ 'sitename' => Array("sitename[$id]", t("Site name"), "", ""),
+ 'apiurl' => Array("apiurl[$id]", t("API URL"), "", ""),
+ 'secret' => Array("secret[$id]", t("Consumer Secret"), "", ""),
+ 'key' => Array("key[$id]", t("Consumer Key"), "", ""),
);
diff --git a/addon/twitter/twitter.php b/addon/twitter/twitter.php
index 26b324aca..b1c8a0a89 100644
--- a/addon/twitter/twitter.php
+++ b/addon/twitter/twitter.php
@@ -1,7 +1,7 @@
<?php
/**
* Name: Twitter Connector
- * Version: 1.0
+ * Version: 1.0.1
* Author: Tobias Diekershoff <https://diekershoff.homeunix.net/friendika/profile/tobias>
*/
@@ -87,7 +87,8 @@ function twitter_settings_post ($a,$post) {
*/
del_pconfig( local_user(), 'twitter', 'consumerkey' );
del_pconfig( local_user(), 'twitter', 'consumersecret' );
- del_pconfig( local_user(), 'twitter', 'post' );
+ del_pconfig( local_user(), 'twitter', 'post' );
+ del_pconfig( local_user(), 'twitter', 'post_by_default' );
} else {
if (isset($_POST['twitter-pin'])) {
// if the user supplied us with a PIN from Twitter, let the magic of OAuth happen
@@ -105,11 +106,13 @@ function twitter_settings_post ($a,$post) {
set_pconfig(local_user(),'twitter', 'oauthsecret', $token['oauth_token_secret']);
set_pconfig(local_user(),'twitter', 'post', 1);
// reload the Addon Settings page, if we don't do it see Bug #42
- header('Location: '.$a->get_baseurl().'/settings/addon');
+ goaway($a->get_baseurl().'/settings/addon');
} else {
// if no PIN is supplied in the POST variables, the user has changed the setting
// to post a tweet for every new __public__ posting to the wall
set_pconfig(local_user(),'twitter','post',intval($_POST['twitter-enable']));
+ set_pconfig(local_user(),'twitter','post_by_default',intval($_POST['twitter-default']));
+ info( t('Twitter settings updated.') . EOL);
}}
}
function twitter_settings(&$a,&$s) {
@@ -127,6 +130,9 @@ function twitter_settings(&$a,&$s) {
$osecret = get_pconfig(local_user(), 'twitter', 'oauthsecret' );
$enabled = get_pconfig(local_user(), 'twitter', 'post');
$checked = (($enabled) ? ' checked="checked" ' : '');
+ $defenabled = get_pconfig(local_user(),'twitter','post_by_default');
+ $defchecked = (($defenabled) ? ' checked="checked" ' : '');
+
$s .= '<div class="settings-block">';
$s .= '<h3>'. t('Twitter Posting Settings') .'</h3>';
@@ -172,11 +178,15 @@ function twitter_settings(&$a,&$s) {
$connection = new TwitterOAuth($ckey,$csecret,$otoken,$osecret);
$details = $connection->get('account/verify_credentials');
$s .= '<div id="twitter-info" ><img id="twitter-avatar" src="'.$details->profile_image_url.'" /><p id="twitter-info-block">'. t('Currently connected to: ') .'<a href="https://twitter.com/'.$details->screen_name.'" target="_twitter">'.$details->screen_name.'</a><br /><em>'.$details->description.'</em></p></div>';
- $s .= '<p>'. t('If enabled all your <strong>public</strong> postings will be posted to the associated Twitter account as well.') .'</p>';
+ $s .= '<p>'. t('If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry.') .'</p>';
$s .= '<div id="twitter-enable-wrapper">';
- $s .= '<label id="twitter-enable-label" for="twitter-checkbox">'. t('Send public postings to Twitter'). '</label>';
+ $s .= '<label id="twitter-enable-label" for="twitter-checkbox">'. t('Allow posting to Twitter'). '</label>';
$s .= '<input id="twitter-checkbox" type="checkbox" name="twitter-enable" value="1" ' . $checked . '/>';
+ $s .= '<div class="clear"></div>';
+ $s .= '<label id="twitter-default-label" for="twitter-default">'. t('Send public postings to Twitter by default') .'</label>';
+ $s .= '<input id="twitter-default" type="checkbox" name="twitter-default" value="1" ' . $defchecked . '/>';
$s .= '</div><div class="clear"></div>';
+
$s .= '<div id="twitter-disconnect-wrapper">';
$s .= '<label id="twitter-disconnect-label" for="twitter-disconnect">'. t('Clear OAuth configuration') .'</label>';
$s .= '<input id="twitter-disconnect" type="checkbox" name="twitter-disconnect" value="1" />';
@@ -215,6 +225,10 @@ function twitter_post_hook(&$a,&$b) {
$twitter_post = intval(get_pconfig(local_user(),'twitter','post'));
$twitter_enable = (($twitter_post && x($_POST,'twitter_enable')) ? intval($_POST['twitter_enable']) : 0);
+ // if API is used, default to the chosen settings
+ if($_POST['api_source'] && intval(get_pconfig(local_user(),'twitter','post_by_default')))
+ $twitter_enable = 1;
+
if($twitter_post && $twitter_enable) {
logger('Posting to Twitter', LOGGER_DEBUG);
require_once('library/twitteroauth.php');
diff --git a/boot.php b/boot.php
index f4b43e4c9..39bb6a9da 100644
--- a/boot.php
+++ b/boot.php
@@ -1,12 +1,19 @@
<?php
-define ( 'FRIENDIKA_VERSION', '2.2.1050' );
+require_once('include/config.php');
+require_once('include/network.php');
+require_once('include/plugin.php');
+require_once('include/text.php');
+require_once("include/pgettext.php");
+
+
+define ( 'FRIENDIKA_VERSION', '2.2.1074' );
define ( 'DFRN_PROTOCOL_VERSION', '2.21' );
-define ( 'DB_UPDATE_VERSION', 1076 );
+define ( 'DB_UPDATE_VERSION', 1079 );
define ( 'EOL', "<br />\r\n" );
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
-define ( 'DOWN_ARROW', '&#x21e9;' );
+
/**
*
@@ -48,13 +55,12 @@ define ( 'REGISTER_OPEN', 2 );
/**
* relationship types
- * When used in contact records, this indicates that 'uid' has
- * this relationship with contact['name']
*/
-define ( 'REL_VIP', 1); // other person is 'following' us
-define ( 'REL_FAN', 2); // we are 'following' other person
-define ( 'REL_BUD', 3); // mutual relationship
+define ( 'CONTACT_IS_FOLLOWER', 1);
+define ( 'CONTACT_IS_SHARING', 2);
+define ( 'CONTACT_IS_FRIEND', 3);
+
/**
* Hook array order
@@ -69,10 +75,10 @@ define ( 'HOOK_FUNCTION', 2);
* page/profile types
*
* PAGE_NORMAL is a typical personal profile account
- * PAGE_SOAPBOX automatically approves all friend requests as REL_FAN, (readonly)
- * PAGE_COMMUNITY automatically approves all friend requests as REL_FAN, but with
+ * PAGE_SOAPBOX automatically approves all friend requests as CONTACT_IS_SHARING, (readonly)
+ * PAGE_COMMUNITY automatically approves all friend requests as CONTACT_IS_SHARING, but with
* write access to wall and comments (no email and not included in page owner's ACL lists)
- * PAGE_FREELOVE automatically approves all friend requests as full friends (REL_BUD).
+ * PAGE_FREELOVE automatically approves all friend requests as full friends (CONTACT_IS_FRIEND).
*
*/
@@ -199,12 +205,6 @@ function startup() {
}
-/*
- * translation system
- */
-require_once("include/pgettext.php");
-
-
/**
*
* class: App
@@ -270,7 +270,8 @@ class App {
if(x($_SERVER,'SERVER_NAME')) {
$this->hostname = $_SERVER['SERVER_NAME'];
-
+ if(x($_SERVER,'SERVER_PORT') && $_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443)
+ $this->hostname .= ':' . $_SERVER['SERVER_PORT'];
/**
* Figure out if we are running at the top of a domain
* or in a sub-directory and adjust accordingly
@@ -281,7 +282,12 @@ class App {
$this->path = $path;
}
- set_include_path("include/$this->hostname" . PATH_SEPARATOR . 'include' . PATH_SEPARATOR . '.' );
+ set_include_path(
+ "include/$this->hostname" . PATH_SEPARATOR
+ . 'include' . PATH_SEPARATOR
+ . 'library' . PATH_SEPARATOR
+ . 'library/phpsec' . PATH_SEPARATOR
+ . '.' );
if((x($_SERVER,'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'],0,2) === "q=")
$this->query_string = substr($_SERVER['QUERY_STRING'],2);
@@ -318,13 +324,12 @@ class App {
/**
* Special handling for the webfinger/lrdd host XRD file
- * Just spit out the contents and exit.
*/
if($this->cmd === '.well-known/host-meta') {
- require_once('include/hostxrd.php');
- hostxrd($this->get_baseurl());
- // NOTREACHED
+ $this->argc = 1;
+ $this->argv = array('hostxrd');
+ $this->module = 'hostxrd';
}
/**
@@ -400,7 +405,7 @@ class App {
$this->page['title'] = $this->config['sitename'];
$tpl = file_get_contents('view/head.tpl');
$this->page['htmlhead'] = replace_macros($tpl,array(
- '$baseurl' => $this->get_baseurl(),
+ '$baseurl' => $this->get_baseurl(), // FIXME for z_path!!!!
'$generator' => 'Friendika' . ' ' . FRIENDIKA_VERSION,
'$delitem' => t('Delete this item?'),
'$comment' => t('Comment')
@@ -473,39 +478,33 @@ function system_unavailable() {
}}
-// install and uninstall plugin
-if (! function_exists('uninstall_plugin')){
-function uninstall_plugin($plugin){
- logger("Addons: uninstalling " . $plugin);
- q("DELETE FROM `addon` WHERE `name` = '%s' LIMIT 1",
- dbesc($plugin)
- );
- @include_once('addon/' . $plugin . '/' . $plugin . '.php');
- if(function_exists($plugin . '_uninstall')) {
- $func = $plugin . '_uninstall';
- $func();
- }
-}}
+function clean_urls() {
+ global $a;
+// if($a->config['system']['clean_urls'])
+ return true;
+// return false;
+}
+
+function z_path() {
+ global $a;
+ $base = $a->get_baseurl();
+ if(! clean_urls())
+ $base .= '/?q=';
+ return $base;
+}
+
+function z_root() {
+ global $a;
+ return $a->get_baseurl();
+}
+
+function absurl($path) {
+ if(strpos($path,'/') === 0)
+ return z_path() . $path;
+ return $path;
+}
-if (! function_exists('install_plugin')){
-function install_plugin($plugin){
- logger("Addons: installing " . $plugin);
- $t = filemtime('addon/' . $plugin . '/' . $plugin . '.php');
- @include_once('addon/' . $plugin . '/' . $plugin . '.php');
- if(function_exists($plugin . '_install')) {
- $func = $plugin . '_install';
- $func();
-
- $plugin_admin = (function_exists($plugin."_plugin_admin")?1:0);
-
- $r = q("INSERT INTO `addon` (`name`, `installed`, `timestamp`, `plugin_admin`) VALUES ( '%s', 1, %d , %d ) ",
- dbesc($plugin),
- intval($t),
- $plugin_admin
- );
- }
-}}
// Primarily involved with database upgrade, but also sets the
// base url for use in cmdline programs which don't have
@@ -610,271 +609,19 @@ function check_config(&$a) {
return;
}}
-// reload all updated plugins
-
-if(! function_exists('reload_plugins')) {
-function reload_plugins() {
- $plugins = get_config('system','addon');
- if(strlen($plugins)) {
-
- $r = q("SELECT * FROM `addon` WHERE `installed` = 1");
- if(count($r))
- $installed = $r;
- else
- $installed = array();
-
- $parr = explode(',',$plugins);
- if(count($parr)) {
- foreach($parr as $pl) {
- $pl = trim($pl);
-
- $t = filemtime('addon/' . $pl . '/' . $pl . '.php');
- foreach($installed as $i) {
- if(($i['name'] == $pl) && ($i['timestamp'] != $t)) {
- logger('Reloading plugin: ' . $i['name']);
- @include_once('addon/' . $pl . '/' . $pl . '.php');
-
- if(function_exists($pl . '_uninstall')) {
- $func = $pl . '_uninstall';
- $func();
- }
- if(function_exists($pl . '_install')) {
- $func = $pl . '_install';
- $func();
- }
- q("UPDATE `addon` SET `timestamp` = %d WHERE `id` = %d LIMIT 1",
- intval($t),
- intval($i['id'])
- );
- }
- }
- }
- }
- }
-}}
-
-
-
-// This is our template processor.
-// $s is the string requiring macro substitution.
-// $r is an array of key value pairs (search => replace)
-// returns substituted string.
-// WARNING: this is pretty basic, and doesn't properly handle search strings that are substrings of each other.
-// For instance if 'test' => "foo" and 'testing' => "bar", testing could become either bar or fooing,
-// depending on the order in which they were declared in the array.
-
-require_once("include/template_processor.php");
-
-if(! function_exists('replace_macros')) {
-function replace_macros($s,$r) {
- global $t;
-
- return $t->replace($s,$r);
-
-}}
-
-
-// curl wrapper. If binary flag is true, return binary
-// results.
-
-if(! function_exists('fetch_url')) {
-function fetch_url($url,$binary = false, &$redirects = 0) {
-
- $a = get_app();
-
- $ch = curl_init($url);
- if(($redirects > 8) || (! $ch))
- return false;
-
- curl_setopt($ch, CURLOPT_HEADER, true);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
- curl_setopt($ch, CURLOPT_USERAGENT, "Friendika");
-
- $curl_time = intval(get_config('system','curl_timeout'));
- curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
-
- // by default we will allow self-signed certs
- // but you can override this
-
- $check_cert = get_config('system','verifyssl');
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
-
- $prx = get_config('system','proxy');
- if(strlen($prx)) {
- curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
- curl_setopt($ch, CURLOPT_PROXY, $prx);
- $prxusr = get_config('system','proxyuser');
- if(strlen($prxusr))
- curl_setopt($ch, CURLOPT_PROXYUSERPWD, $prxusr);
- }
- if($binary)
- curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
-
- $a->set_curl_code(0);
-
- // don't let curl abort the entire application
- // if it throws any errors.
-
- $s = @curl_exec($ch);
-
- $base = $s;
- $curl_info = curl_getinfo($ch);
- $http_code = $curl_info['http_code'];
-
- $header = '';
-
- // Pull out multiple headers, e.g. proxy and continuation headers
- // allow for HTTP/2.x without fixing code
-
- while(preg_match('/^HTTP\/[1-2].+? [1-5][0-9][0-9]/',$base)) {
- $chunk = substr($base,0,strpos($base,"\r\n\r\n")+4);
- $header .= $chunk;
- $base = substr($base,strlen($chunk));
- }
-
- if($http_code == 301 || $http_code == 302 || $http_code == 303 || $http_code == 307) {
- $matches = array();
- preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
- $url = trim(array_pop($matches));
- $url_parsed = @parse_url($url);
- if (isset($url_parsed)) {
- $redirects++;
- return fetch_url($url,$binary,$redirects);
- }
- }
-
- $a->set_curl_code($http_code);
-
- $body = substr($s,strlen($header));
-
- $a->set_curl_headers($header);
-
- curl_close($ch);
- return($body);
-}}
-
-// post request to $url. $params is an array of post variables.
-
-if(! function_exists('post_url')) {
-function post_url($url,$params, $headers = null, &$redirects = 0) {
- $a = get_app();
- $ch = curl_init($url);
- if(($redirects > 8) || (! $ch))
- return false;
-
- curl_setopt($ch, CURLOPT_HEADER, true);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
- curl_setopt($ch, CURLOPT_POST,1);
- curl_setopt($ch, CURLOPT_POSTFIELDS,$params);
- curl_setopt($ch, CURLOPT_USERAGENT, "Friendika");
-
- $curl_time = intval(get_config('system','curl_timeout'));
- curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
-
- if(defined('LIGHTTPD')) {
- if(!is_array($headers)) {
- $headers = array('Expect:');
- } else {
- if(!in_array('Expect:', $headers)) {
- array_push($headers, 'Expect:');
- }
- }
- }
- if($headers)
- curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
-
- $check_cert = get_config('system','verifyssl');
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
- $prx = get_config('system','proxy');
- if(strlen($prx)) {
- curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
- curl_setopt($ch, CURLOPT_PROXY, $prx);
- $prxusr = get_config('system','proxyuser');
- if(strlen($prxusr))
- curl_setopt($ch, CURLOPT_PROXYUSERPWD, $prxusr);
- }
-
- $a->set_curl_code(0);
-
- // don't let curl abort the entire application
- // if it throws any errors.
-
- $s = @curl_exec($ch);
-
- $base = $s;
- $curl_info = curl_getinfo($ch);
- $http_code = $curl_info['http_code'];
-
- $header = '';
-
- // Pull out multiple headers, e.g. proxy and continuation headers
- // allow for HTTP/2.x without fixing code
-
- while(preg_match('/^HTTP\/[1-2].+? [1-5][0-9][0-9]/',$base)) {
- $chunk = substr($base,0,strpos($base,"\r\n\r\n")+4);
- $header .= $chunk;
- $base = substr($base,strlen($chunk));
- }
-
- if($http_code == 301 || $http_code == 302 || $http_code == 303) {
- $matches = array();
- preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
- $url = trim(array_pop($matches));
- $url_parsed = @parse_url($url);
- if (isset($url_parsed)) {
- $redirects++;
- return post_url($url,$binary,$headers,$redirects);
- }
- }
- $a->set_curl_code($http_code);
- $body = substr($s,strlen($header));
-
- $a->set_curl_headers($header);
-
- curl_close($ch);
- return($body);
-}}
-
-// random hash, 64 chars
-
-if(! function_exists('random_string')) {
-function random_string() {
- return(hash('sha256',uniqid(rand(),true)));
-}}
-
-/**
- * This is our primary input filter.
- *
- * The high bit hack only involved some old IE browser, forget which (IE5/Mac?)
- * that had an XSS attack vector due to stripping the high-bit on an 8-bit character
- * after cleansing, and angle chars with the high bit set could get through as markup.
- *
- * This is now disabled because it was interfering with some legitimate unicode sequences
- * and hopefully there aren't a lot of those browsers left.
- *
- * Use this on any text input where angle chars are not valid or permitted
- * They will be replaced with safer brackets. This may be filtered further
- * if these are not allowed either.
- *
- */
-
-if(! function_exists('notags')) {
-function notags($string) {
-
- return(str_replace(array("<",">"), array('[',']'), $string));
-
-// High-bit filter no longer used
-// return(str_replace(array("<",">","\xBA","\xBC","\xBE"), array('[',']','','',''), $string));
-}}
-
-// use this on "body" or "content" input where angle chars shouldn't be removed,
-// and allow them to be safely displayed.
-if(! function_exists('escape_tags')) {
-function escape_tags($string) {
+function get_guid($size=16) {
+ $exists = true; // assume by default that we don't have a unique guid
+ do {
+ $s = random_string($size);
+ $r = q("select id from guid where guid = '%s' limit 1", dbesc($s));
+ if(! count($r))
+ $exists = false;
+ } while($exists);
+ q("insert into guid ( guid ) values ( '%s' ) ", dbesc($s));
+ return $s;
+}
- return(htmlspecialchars($string));
-}}
// wrapper for adding a login box. If $register == true provide a registration
// link. This will most always depend on the value of $a->config['register_policy'].
@@ -930,77 +677,6 @@ function login($register = false) {
return $o;
}}
-// generate a string that's random, but usually pronounceable.
-// used to generate initial passwords
-
-if(! function_exists('autoname')) {
-function autoname($len) {
-
- $vowels = array('a','a','ai','au','e','e','e','ee','ea','i','ie','o','ou','u');
- if(mt_rand(0,5) == 4)
- $vowels[] = 'y';
-
- $cons = array(
- 'b','bl','br',
- 'c','ch','cl','cr',
- 'd','dr',
- 'f','fl','fr',
- 'g','gh','gl','gr',
- 'h',
- 'j',
- 'k','kh','kl','kr',
- 'l',
- 'm',
- 'n',
- 'p','ph','pl','pr',
- 'qu',
- 'r','rh',
- 's','sc','sh','sm','sp','st',
- 't','th','tr',
- 'v',
- 'w','wh',
- 'x',
- 'z','zh'
- );
-
- $midcons = array('ck','ct','gn','ld','lf','lm','lt','mb','mm', 'mn','mp',
- 'nd','ng','nk','nt','rn','rp','rt');
-
- $noend = array('bl', 'br', 'cl','cr','dr','fl','fr','gl','gr',
- 'kh', 'kl','kr','mn','pl','pr','rh','tr','qu','wh');
-
- $start = mt_rand(0,2);
- if($start == 0)
- $table = $vowels;
- else
- $table = $cons;
-
- $word = '';
-
- for ($x = 0; $x < $len; $x ++) {
- $r = mt_rand(0,count($table) - 1);
- $word .= $table[$r];
-
- if($table == $vowels)
- $table = array_merge($cons,$midcons);
- else
- $table = $vowels;
-
- }
-
- $word = substr($word,0,$len);
-
- foreach($noend as $noe) {
- if((strlen($word) > 2) && (substr($word,-2) == $noe)) {
- $word = substr($word,0,-1);
- break;
- }
- }
- if(substr($word,-1) == 'q')
- $word = substr($word,0,-1);
- return $word;
-}}
-
// Used to end the current process, after saving session state.
if(! function_exists('killme')) {
@@ -1017,23 +693,6 @@ function goaway($s) {
killme();
}}
-// Generic XML return
-// Outputs a basic dfrn XML status structure to STDOUT, with a <status> variable
-// of $st and an optional text <message> of $message and terminates the current process.
-
-if(! function_exists('xml_status')) {
-function xml_status($st, $message = '') {
-
- $xml_message = ((strlen($message)) ? "\t<message>" . xmlify($message) . "</message>\r\n" : '');
-
- if($st)
- logger('xml_status returning non_zero: ' . $st . " message=" . $message);
-
- header( "Content-type: text/xml" );
- echo '<?xml version="1.0" encoding="UTF-8"?>'."\r\n";
- echo "<result>\r\n\t<status>$st</status>\r\n$xml_message</result>\r\n";
- killme();
-}}
// Returns the uid of locally logged in user or false.
@@ -1079,1231 +738,6 @@ function get_max_import_size() {
}}
-// escape text ($str) for XML transport
-// returns escaped text.
-
-if(! function_exists('xmlify')) {
-function xmlify($str) {
- $buffer = '';
-
- for($x = 0; $x < strlen($str); $x ++) {
- $char = $str[$x];
-
- switch( $char ) {
-
- case "\r" :
- break;
- case "&" :
- $buffer .= '&amp;';
- break;
- case "'" :
- $buffer .= '&apos;';
- break;
- case "\"" :
- $buffer .= '&quot;';
- break;
- case '<' :
- $buffer .= '&lt;';
- break;
- case '>' :
- $buffer .= '&gt;';
- break;
- case "\n" :
- $buffer .= "\n";
- break;
- default :
- $buffer .= $char;
- break;
- }
- }
- $buffer = trim($buffer);
- return($buffer);
-}}
-
-// undo an xmlify
-// pass xml escaped text ($s), returns unescaped text
-
-if(! function_exists('unxmlify')) {
-function unxmlify($s) {
- $ret = str_replace('&amp;','&', $s);
- $ret = str_replace(array('&lt;','&gt;','&quot;','&apos;'),array('<','>','"',"'"),$ret);
- return $ret;
-}}
-
-// convenience wrapper, reverse the operation "bin2hex"
-
-if(! function_exists('hex2bin')) {
-function hex2bin($s) {
- if(! ctype_xdigit($s)) {
- logger('hex2bin: illegal input: ' . print_r(debug_backtrace(), true));
- return($s);
- }
-
- return(pack("H*",$s));
-}}
-
-// Automatic pagination.
-// To use, get the count of total items.
-// Then call $a->set_pager_total($number_items);
-// Optionally call $a->set_pager_itemspage($n) to the number of items to display on each page
-// Then call paginate($a) after the end of the display loop to insert the pager block on the page
-// (assuming there are enough items to paginate).
-// When using with SQL, the setting LIMIT %d, %d => $a->pager['start'],$a->pager['itemspage']
-// will limit the results to the correct items for the current page.
-// The actual page handling is then accomplished at the application layer.
-
-if(! function_exists('paginate')) {
-function paginate(&$a) {
- $o = '';
- $stripped = preg_replace('/(&page=[0-9]*)/','',$a->query_string);
- $stripped = str_replace('q=','',$stripped);
- $stripped = trim($stripped,'/');
- $pagenum = $a->pager['page'];
- $url = $a->get_baseurl() . '/' . $stripped;
-
-
- if($a->pager['total'] > $a->pager['itemspage']) {
- $o .= '<div class="pager">';
- if($a->pager['page'] != 1)
- $o .= '<span class="pager_prev">'."<a href=\"$url".'&page='.($a->pager['page'] - 1).'">' . t('prev') . '</a></span> ';
-
- $o .= "<span class=\"pager_first\"><a href=\"$url"."&page=1\">" . t('first') . "</a></span> ";
-
- $numpages = $a->pager['total'] / $a->pager['itemspage'];
-
- $numstart = 1;
- $numstop = $numpages;
-
- if($numpages > 14) {
- $numstart = (($pagenum > 7) ? ($pagenum - 7) : 1);
- $numstop = (($pagenum > ($numpages - 7)) ? $numpages : ($numstart + 14));
- }
-
- for($i = $numstart; $i <= $numstop; $i++){
- if($i == $a->pager['page'])
- $o .= '<span class="pager_current">'.(($i < 10) ? '&nbsp;'.$i : $i);
- else
- $o .= "<span class=\"pager_n\"><a href=\"$url"."&page=$i\">".(($i < 10) ? '&nbsp;'.$i : $i)."</a>";
- $o .= '</span> ';
- }
-
- if(($a->pager['total'] % $a->pager['itemspage']) != 0) {
- if($i == $a->pager['page'])
- $o .= '<span class="pager_current">'.(($i < 10) ? '&nbsp;'.$i : $i);
- else
- $o .= "<span class=\"pager_n\"><a href=\"$url"."&page=$i\">".(($i < 10) ? '&nbsp;'.$i : $i)."</a>";
- $o .= '</span> ';
- }
-
- $lastpage = (($numpages > intval($numpages)) ? intval($numpages)+1 : $numpages);
- $o .= "<span class=\"pager_last\"><a href=\"$url"."&page=$lastpage\">" . t('last') . "</a></span> ";
-
- if(($a->pager['total'] - ($a->pager['itemspage'] * $a->pager['page'])) > 0)
- $o .= '<span class="pager_next">'."<a href=\"$url"."&page=".($a->pager['page'] + 1).'">' . t('next') . '</a></span>';
- $o .= '</div>'."\r\n";
- }
- return $o;
-}}
-
-// Turn user/group ACLs stored as angle bracketed text into arrays
-
-if(! function_exists('expand_acl')) {
-function expand_acl($s) {
- // turn string array of angle-bracketed elements into numeric array
- // e.g. "<1><2><3>" => array(1,2,3);
- $ret = array();
-
- if(strlen($s)) {
- $t = str_replace('<','',$s);
- $a = explode('>',$t);
- foreach($a as $aa) {
- if(intval($aa))
- $ret[] = intval($aa);
- }
- }
- return $ret;
-}}
-
-// Used to wrap ACL elements in angle brackets for storage
-
-if(! function_exists('sanitise_acl')) {
-function sanitise_acl(&$item) {
- if(intval($item))
- $item = '<' . intval(notags(trim($item))) . '>';
- else
- unset($item);
-}}
-
-// retrieve a "family" of config variables from database to cached storage
-
-if(! function_exists('load_config')) {
-function load_config($family) {
- global $a;
- $r = q("SELECT * FROM `config` WHERE `cat` = '%s'",
- dbesc($family)
- );
- if(count($r)) {
- foreach($r as $rr) {
- $k = $rr['k'];
- if ($rr['cat'] === 'config') {
- $a->config[$k] = $rr['v'];
- } else {
- $a->config[$family][$k] = $rr['v'];
- }
- }
- }
-}}
-
-// get a particular config variable given the family name
-// and key. Returns false if not set.
-// $instore is only used by the set_config function
-// to determine if the key already exists in the DB
-// If a key is found in the DB but doesn't exist in
-// local config cache, pull it into the cache so we don't have
-// to hit the DB again for this item.
-
-if(! function_exists('get_config')) {
-function get_config($family, $key, $instore = false) {
-
- global $a;
-
- if(! $instore) {
- if(isset($a->config[$family][$key])) {
- if($a->config[$family][$key] === '!<unset>!') {
- return false;
- }
- return $a->config[$family][$key];
- }
- }
- $ret = q("SELECT `v` FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
- dbesc($family),
- dbesc($key)
- );
- if(count($ret)) {
- // manage array value
- $val = (preg_match("|^a:[0-9]+:{.*}$|", $ret[0]['v'])?unserialize( $ret[0]['v']):$ret[0]['v']);
- $a->config[$family][$key] = $val;
- return $val;
- }
- else {
- $a->config[$family][$key] = '!<unset>!';
- }
- return false;
-}}
-
-// Store a config value ($value) in the category ($family)
-// under the key ($key)
-// Return the value, or false if the database update failed
-
-if(! function_exists('set_config')) {
-function set_config($family,$key,$value) {
- global $a;
-
- // manage array value
- $dbvalue = (is_array($value)?serialize($value):$value);
-
- if(get_config($family,$key,true) === false) {
- $a->config[$family][$key] = $value;
- $ret = q("INSERT INTO `config` ( `cat`, `k`, `v` ) VALUES ( '%s', '%s', '%s' ) ",
- dbesc($family),
- dbesc($key),
- dbesc($dbvalue)
- );
- if($ret)
- return $value;
- return $ret;
- }
-
- $ret = q("UPDATE `config` SET `v` = '%s' WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
- dbesc($dbvalue),
- dbesc($family),
- dbesc($key)
- );
-
- $a->config[$family][$key] = $value;
-
- if($ret)
- return $value;
- return $ret;
-}}
-
-
-if(! function_exists('load_pconfig')) {
-function load_pconfig($uid,$family) {
- global $a;
- $r = q("SELECT * FROM `pconfig` WHERE `cat` = '%s' AND `uid` = %d",
- dbesc($family),
- intval($uid)
- );
- if(count($r)) {
- foreach($r as $rr) {
- $k = $rr['k'];
- $a->config[$uid][$family][$k] = $rr['v'];
- }
- }
-}}
-
-
-
-if(! function_exists('get_pconfig')) {
-function get_pconfig($uid,$family, $key, $instore = false) {
-
- global $a;
-
- if(! $instore) {
- if(isset($a->config[$uid][$family][$key])) {
- if($a->config[$uid][$family][$key] === '!<unset>!') {
- return false;
- }
- return $a->config[$uid][$family][$key];
- }
- }
-
- $ret = q("SELECT `v` FROM `pconfig` WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' LIMIT 1",
- intval($uid),
- dbesc($family),
- dbesc($key)
- );
-
- if(count($ret)) {
- $a->config[$uid][$family][$key] = $ret[0]['v'];
- return $ret[0]['v'];
- }
- else {
- $a->config[$uid][$family][$key] = '!<unset>!';
- }
- return false;
-}}
-
-if(! function_exists('del_config')) {
-function del_config($family,$key) {
-
- global $a;
- if(x($a->config[$family],$key))
- unset($a->config[$family][$key]);
- $ret = q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
- dbesc($cat),
- dbesc($key)
- );
- return $ret;
-}}
-
-
-
-// Same as above functions except these are for personal config storage and take an
-// additional $uid argument.
-
-if(! function_exists('set_pconfig')) {
-function set_pconfig($uid,$family,$key,$value) {
-
- global $a;
-
- if(get_pconfig($uid,$family,$key,true) === false) {
- $a->config[$uid][$family][$key] = $value;
- $ret = q("INSERT INTO `pconfig` ( `uid`, `cat`, `k`, `v` ) VALUES ( %d, '%s', '%s', '%s' ) ",
- intval($uid),
- dbesc($family),
- dbesc($key),
- dbesc($value)
- );
- if($ret)
- return $value;
- return $ret;
- }
- $ret = q("UPDATE `pconfig` SET `v` = '%s' WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' LIMIT 1",
- dbesc($value),
- intval($uid),
- dbesc($family),
- dbesc($key)
- );
-
- $a->config[$uid][$family][$key] = $value;
-
- if($ret)
- return $value;
- return $ret;
-}}
-
-if(! function_exists('del_pconfig')) {
-function del_pconfig($uid,$family,$key) {
-
- global $a;
- if(x($a->config[$uid][$family],$key))
- unset($a->config[$uid][$family][$key]);
- $ret = q("DELETE FROM `pconfig` WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' LIMIT 1",
- intval($uid),
- dbesc($family),
- dbesc($key)
- );
- return $ret;
-}}
-
-
-// convert an XML document to a normalised, case-corrected array
-// used by webfinger
-
-if(! function_exists('convert_xml_element_to_array')) {
-function convert_xml_element_to_array($xml_element, &$recursion_depth=0) {
-
- // If we're getting too deep, bail out
- if ($recursion_depth > 512) {
- return(null);
- }
-
- if (!is_string($xml_element) &&
- !is_array($xml_element) &&
- (get_class($xml_element) == 'SimpleXMLElement')) {
- $xml_element_copy = $xml_element;
- $xml_element = get_object_vars($xml_element);
- }
-
- if (is_array($xml_element)) {
- $result_array = array();
- if (count($xml_element) <= 0) {
- return (trim(strval($xml_element_copy)));
- }
-
- foreach($xml_element as $key=>$value) {
-
- $recursion_depth++;
- $result_array[strtolower($key)] =
- convert_xml_element_to_array($value, $recursion_depth);
- $recursion_depth--;
- }
- if ($recursion_depth == 0) {
- $temp_array = $result_array;
- $result_array = array(
- strtolower($xml_element_copy->getName()) => $temp_array,
- );
- }
-
- return ($result_array);
-
- } else {
- return (trim(strval($xml_element)));
- }
-}}
-
-// Given an email style address, perform webfinger lookup and
-// return the resulting DFRN profile URL, or if no DFRN profile URL
-// is located, returns an OStatus subscription template (prefixed
-// with the string 'stat:' to identify it as on OStatus template).
-// If this isn't an email style address just return $s.
-// Return an empty string if email-style addresses but webfinger fails,
-// or if the resultant personal XRD doesn't contain a supported
-// subscription/friend-request attribute.
-
-if(! function_exists('webfinger_dfrn')) {
-function webfinger_dfrn($s) {
- if(! strstr($s,'@')) {
- return $s;
- }
- $links = webfinger($s);
- logger('webfinger_dfrn: ' . $s . ':' . print_r($links,true), LOGGER_DATA);
- if(count($links)) {
- foreach($links as $link)
- if($link['@attributes']['rel'] === NAMESPACE_DFRN)
- return $link['@attributes']['href'];
- foreach($links as $link)
- if($link['@attributes']['rel'] === NAMESPACE_OSTATUSSUB)
- return 'stat:' . $link['@attributes']['template'];
- }
- return '';
-}}
-
-// Given an email style address, perform webfinger lookup and
-// return the array of link attributes from the personal XRD file.
-// On error/failure return an empty array.
-
-
-if(! function_exists('webfinger')) {
-function webfinger($s) {
- $host = '';
- if(strstr($s,'@')) {
- $host = substr($s,strpos($s,'@') + 1);
- }
- if(strlen($host)) {
- $tpl = fetch_lrdd_template($host);
- logger('webfinger: lrdd template: ' . $tpl);
- if(strlen($tpl)) {
- $pxrd = str_replace('{uri}', urlencode('acct:' . $s), $tpl);
- logger('webfinger: pxrd: ' . $pxrd);
- $links = fetch_xrd_links($pxrd);
- if(! count($links)) {
- // try with double slashes
- $pxrd = str_replace('{uri}', urlencode('acct://' . $s), $tpl);
- logger('webfinger: pxrd: ' . $pxrd);
- $links = fetch_xrd_links($pxrd);
- }
- return $links;
- }
- }
- return array();
-}}
-
-if(! function_exists('lrdd')) {
-function lrdd($uri) {
-
- $a = get_app();
-
- // default priority is host priority, host-meta first
-
- $priority = 'host';
-
- // All we have is an email address. Resource-priority is irrelevant
- // because our URI isn't directly resolvable.
-
- if(strstr($uri,'@')) {
- return(webfinger($uri));
- }
-
- // get the host meta file
-
- $host = @parse_url($uri);
-
- if($host) {
- $url = ((x($host,'scheme')) ? $host['scheme'] : 'http') . '://';
- $url .= $host['host'] . '/.well-known/host-meta' ;
- }
- else
- return array();
-
- logger('lrdd: constructed url: ' . $url);
-
- $xml = fetch_url($url);
- $headers = $a->get_curl_headers();
-
- if (! $xml)
- return array();
-
- logger('lrdd: host_meta: ' . $xml, LOGGER_DATA);
-
- $h = parse_xml_string($xml);
- if(! $h)
- return array();
-
- $arr = convert_xml_element_to_array($h);
-
- if(isset($arr['xrd']['property'])) {
- $property = $arr['crd']['property'];
- if(! isset($property[0]))
- $properties = array($property);
- else
- $properties = $property;
- foreach($properties as $prop)
- if((string) $prop['@attributes'] === 'http://lrdd.net/priority/resource')
- $priority = 'resource';
- }
-
- // save the links in case we need them
-
- $links = array();
-
- if(isset($arr['xrd']['link'])) {
- $link = $arr['xrd']['link'];
- if(! isset($link[0]))
- $links = array($link);
- else
- $links = $link;
- }
-
- // do we have a template or href?
-
- if(count($links)) {
- foreach($links as $link) {
- if($link['@attributes']['rel'] && attribute_contains($link['@attributes']['rel'],'lrdd')) {
- if(x($link['@attributes'],'template'))
- $tpl = $link['@attributes']['template'];
- elseif(x($link['@attributes'],'href'))
- $href = $link['@attributes']['href'];
- }
- }
- }
-
- if((! isset($tpl)) || (! strpos($tpl,'{uri}')))
- $tpl = '';
-
- if($priority === 'host') {
- if(strlen($tpl))
- $pxrd = str_replace('{uri}', urlencode($uri), $tpl);
- elseif(isset($href))
- $pxrd = $href;
- if(isset($pxrd)) {
- logger('lrdd: (host priority) pxrd: ' . $pxrd);
- $links = fetch_xrd_links($pxrd);
- return $links;
- }
-
- $lines = explode("\n",$headers);
- if(count($lines)) {
- foreach($lines as $line) {
- if((stristr($line,'link:')) && preg_match('/<([^>].*)>.*rel\=[\'\"]lrdd[\'\"]/',$line,$matches)) {
- return(fetch_xrd_links($matches[1]));
- break;
- }
- }
- }
- }
-
-
- // priority 'resource'
-
-
- $html = fetch_url($uri);
- $headers = $a->get_curl_headers();
- logger('lrdd: headers=' . $headers, LOGGER_DEBUG);
-
- // don't try and parse raw xml as html
- if(! strstr($html,'<?xml')) {
- require_once('library/HTML5/Parser.php');
- $dom = @HTML5_Parser::parse($html);
-
- if($dom) {
- $items = $dom->getElementsByTagName('link');
- foreach($items as $item) {
- $x = $item->getAttribute('rel');
- if($x == "lrdd") {
- $pagelink = $item->getAttribute('href');
- break;
- }
- }
- }
- }
-
- if(isset($pagelink))
- return(fetch_xrd_links($pagelink));
-
- // next look in HTTP headers
-
- $lines = explode("\n",$headers);
- if(count($lines)) {
- foreach($lines as $line) {
- // TODO alter the following regex to support multiple relations (space separated)
- if((stristr($line,'link:')) && preg_match('/<([^>].*)>.*rel\=[\'\"]lrdd[\'\"]/',$line,$matches)) {
- $pagelink = $matches[1];
- break;
- }
- // don't try and run feeds through the html5 parser
- if(stristr($line,'content-type:') && ((stristr($line,'application/atom+xml')) || (stristr($line,'application/rss+xml'))))
- return array();
- if(stristr($html,'<rss') || stristr($html,'<feed'))
- return array();
- }
- }
-
- if(isset($pagelink))
- return(fetch_xrd_links($pagelink));
-
- // If we haven't found any links, return the host xrd links (which we have already fetched)
-
- if(isset($links))
- return $links;
-
- return array();
-
-}}
-
-
-
-// Given a host name, locate the LRDD template from that
-// host. Returns the LRDD template or an empty string on
-// error/failure.
-
-if(! function_exists('fetch_lrdd_template')) {
-function fetch_lrdd_template($host) {
- $tpl = '';
-
- $url1 = 'https://' . $host . '/.well-known/host-meta' ;
- $url2 = 'http://' . $host . '/.well-known/host-meta' ;
- $links = fetch_xrd_links($url1);
- logger('fetch_lrdd_template from: ' . $url1);
- logger('template (https): ' . print_r($links,true));
- if(! count($links)) {
- logger('fetch_lrdd_template from: ' . $url2);
- $links = fetch_xrd_links($url2);
- logger('template (http): ' . print_r($links,true));
- }
- if(count($links)) {
- foreach($links as $link)
- if($link['@attributes']['rel'] && $link['@attributes']['rel'] === 'lrdd')
- $tpl = $link['@attributes']['template'];
- }
- if(! strpos($tpl,'{uri}'))
- $tpl = '';
- return $tpl;
-}}
-
-// Given a URL, retrieve the page as an XRD document.
-// Return an array of links.
-// on error/failure return empty array.
-
-if(! function_exists('fetch_xrd_links')) {
-function fetch_xrd_links($url) {
-
-
- $xml = fetch_url($url);
- if (! $xml)
- return array();
-
- logger('fetch_xrd_links: ' . $xml, LOGGER_DATA);
- $h = parse_xml_string($xml);
- if(! $h)
- return array();
-
- $arr = convert_xml_element_to_array($h);
-
- $links = array();
-
- if(isset($arr['xrd']['link'])) {
- $link = $arr['xrd']['link'];
- if(! isset($link[0]))
- $links = array($link);
- else
- $links = $link;
- }
- if(isset($arr['xrd']['alias'])) {
- $alias = $arr['xrd']['alias'];
- if(! isset($alias[0]))
- $aliases = array($alias);
- else
- $aliases = $alias;
- foreach($aliases as $alias) {
- $links[]['@attributes'] = array('rel' => 'alias' , 'href' => $alias);
- }
- }
-
- logger('fetch_xrd_links: ' . print_r($links,true), LOGGER_DATA);
-
- return $links;
-
-}}
-
-// Convert an ACL array to a storable string
-
-if(! function_exists('perms2str')) {
-function perms2str($p) {
- $ret = '';
- $tmp = $p;
- if(is_array($tmp)) {
- array_walk($tmp,'sanitise_acl');
- $ret = implode('',$tmp);
- }
- return $ret;
-}}
-
-// generate a guaranteed unique (for this domain) item ID for ATOM
-// safe from birthday paradox
-
-if(! function_exists('item_new_uri')) {
-function item_new_uri($hostname,$uid) {
-
- do {
- $dups = false;
- $hash = random_string();
-
- $uri = "urn:X-dfrn:" . $hostname . ':' . $uid . ':' . $hash;
-
- $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' LIMIT 1",
- dbesc($uri));
- if(count($r))
- $dups = true;
- } while($dups == true);
- return $uri;
-}}
-
-// Generate a guaranteed unique photo ID.
-// safe from birthday paradox
-
-if(! function_exists('photo_new_resource')) {
-function photo_new_resource() {
-
- do {
- $found = false;
- $resource = hash('md5',uniqid(mt_rand(),true));
- $r = q("SELECT `id` FROM `photo` WHERE `resource-id` = '%s' LIMIT 1",
- dbesc($resource)
- );
- if(count($r))
- $found = true;
- } while($found == true);
- return $resource;
-}}
-
-
-// Take a URL from the wild, prepend http:// if necessary
-// and check DNS to see if it's real
-// return true if it's OK, false if something is wrong with it
-
-if(! function_exists('validate_url')) {
-function validate_url(&$url) {
- if(substr($url,0,4) != 'http')
- $url = 'http://' . $url;
- $h = @parse_url($url);
-
- if(($h) && (dns_get_record($h['host'], DNS_A + DNS_CNAME + DNS_PTR))) {
- return true;
- }
- return false;
-}}
-
-// checks that email is an actual resolvable internet address
-
-if(! function_exists('validate_email')) {
-function validate_email($addr) {
-
- if(! strpos($addr,'@'))
- return false;
- $h = substr($addr,strpos($addr,'@') + 1);
-
- if(($h) && (dns_get_record($h, DNS_A + DNS_CNAME + DNS_PTR + DNS_MX))) {
- return true;
- }
- return false;
-}}
-
-// Check $url against our list of allowed sites,
-// wildcards allowed. If allowed_sites is unset return true;
-// If url is allowed, return true.
-// otherwise, return false
-
-if(! function_exists('allowed_url')) {
-function allowed_url($url) {
-
- $h = @parse_url($url);
-
- if(! $h) {
- return false;
- }
-
- $str_allowed = get_config('system','allowed_sites');
- if(! $str_allowed)
- return true;
-
- $found = false;
-
- $host = strtolower($h['host']);
-
- // always allow our own site
-
- if($host == strtolower($_SERVER['SERVER_NAME']))
- return true;
-
- $fnmatch = function_exists('fnmatch');
- $allowed = explode(',',$str_allowed);
-
- if(count($allowed)) {
- foreach($allowed as $a) {
- $pat = strtolower(trim($a));
- if(($fnmatch && fnmatch($pat,$host)) || ($pat == $host)) {
- $found = true;
- break;
- }
- }
- }
- return $found;
-}}
-
-// check if email address is allowed to register here.
-// Compare against our list (wildcards allowed).
-// Returns false if not allowed, true if allowed or if
-// allowed list is not configured.
-
-if(! function_exists('allowed_email')) {
-function allowed_email($email) {
-
-
- $domain = strtolower(substr($email,strpos($email,'@') + 1));
- if(! $domain)
- return false;
-
- $str_allowed = get_config('system','allowed_email');
- if(! $str_allowed)
- return true;
-
- $found = false;
-
- $fnmatch = function_exists('fnmatch');
- $allowed = explode(',',$str_allowed);
-
- if(count($allowed)) {
- foreach($allowed as $a) {
- $pat = strtolower(trim($a));
- if(($fnmatch && fnmatch($pat,$domain)) || ($pat == $domain)) {
- $found = true;
- break;
- }
- }
- }
- return $found;
-}}
-
-
-
-// wrapper to load a view template, checking for alternate
-// languages before falling back to the default
-
-// obsolete, deprecated.
-
-if(! function_exists('load_view_file')) {
-function load_view_file($s) {
- global $lang, $a;
- if(! isset($lang))
- $lang = 'en';
- $b = basename($s);
- $d = dirname($s);
- if(file_exists("$d/$lang/$b"))
- return file_get_contents("$d/$lang/$b");
-
- $theme = current_theme();
-
- if(file_exists("$d/theme/$theme/$b"))
- return file_get_contents("$d/theme/$theme/$b");
-
- return file_get_contents($s);
-}}
-
-if(! function_exists('get_intltext_template')) {
-function get_intltext_template($s) {
- global $lang;
-
- if(! isset($lang))
- $lang = 'en';
-
- if(file_exists("view/$lang/$s"))
- return file_get_contents("view/$lang/$s");
- elseif(file_exists("view/en/$s"))
- return file_get_contents("view/en/$s");
- else
- return file_get_contents("view/$s");
-}}
-
-if(! function_exists('get_markup_template')) {
-function get_markup_template($s) {
-
- $theme = current_theme();
-
- if(file_exists("view/theme/$theme/$s"))
- return file_get_contents("view/theme/$theme/$s");
- else
- return file_get_contents("view/$s");
-
-}}
-
-
-
-
-
-// for html,xml parsing - let's say you've got
-// an attribute foobar="class1 class2 class3"
-// and you want to find out if it contains 'class3'.
-// you can't use a normal sub string search because you
-// might match 'notclass3' and a regex to do the job is
-// possible but a bit complicated.
-// pass the attribute string as $attr and the attribute you
-// are looking for as $s - returns true if found, otherwise false
-
-if(! function_exists('attribute_contains')) {
-function attribute_contains($attr,$s) {
- $a = explode(' ', $attr);
- if(count($a) && in_array($s,$a))
- return true;
- return false;
-}}
-
-if(! function_exists('logger')) {
-function logger($msg,$level = 0) {
- $debugging = get_config('system','debugging');
- $loglevel = intval(get_config('system','loglevel'));
- $logfile = get_config('system','logfile');
-
- if((! $debugging) || (! $logfile) || ($level > $loglevel))
- return;
-
- @file_put_contents($logfile, datetime_convert() . ':' . session_id() . ' ' . $msg . "\n", FILE_APPEND);
- return;
-}}
-
-
-if(! function_exists('activity_match')) {
-function activity_match($haystack,$needle) {
- if(($haystack === $needle) || ((basename($needle) === $haystack) && strstr($needle,NAMESPACE_ACTIVITY_SCHEMA)))
- return true;
- return false;
-}}
-
-
-// Pull out all #hashtags and @person tags from $s;
-// We also get @person@domain.com - which would make
-// the regex quite complicated as tags can also
-// end a sentence. So we'll run through our results
-// and strip the period from any tags which end with one.
-// Returns array of tags found, or empty array.
-
-
-if(! function_exists('get_tags')) {
-function get_tags($s) {
- $ret = array();
-
- // ignore anything in a code block
-
- $s = preg_replace('/\[code\](.*?)\[\/code\]/sm','',$s);
-
- // Match full names against @tags including the space between first and last
- // We will look these up afterward to see if they are full names or not recognisable.
-
- if(preg_match_all('/(@[^ \x0D\x0A,:?]+ [^ \x0D\x0A,:?]+)([ \x0D\x0A,:?]|$)/',$s,$match)) {
- foreach($match[1] as $mtch) {
- if(strstr($mtch,"]")) {
- // we might be inside a bbcode color tag - leave it alone
- continue;
- }
- if(substr($mtch,-1,1) === '.')
- $ret[] = substr($mtch,0,-1);
- else
- $ret[] = $mtch;
- }
- }
-
- // Otherwise pull out single word tags. These can be @nickname, @first_last
- // and #hash tags.
-
- if(preg_match_all('/([@#][^ \x0D\x0A,:?]+)([ \x0D\x0A,:?]|$)/',$s,$match)) {
- foreach($match[1] as $mtch) {
- if(strstr($mtch,"]")) {
- // we might be inside a bbcode color tag - leave it alone
- continue;
- }
- // ignore strictly numeric tags like #1
- if((strpos($mtch,'#') === 0) && ctype_digit(substr($mtch,1)))
- continue;
- if(substr($mtch,-1,1) === '.')
- $ret[] = substr($mtch,0,-1);
- else
- $ret[] = $mtch;
- }
- }
- return $ret;
-}}
-
-
-// quick and dirty quoted_printable encoding
-
-if(! function_exists('qp')) {
-function qp($s) {
-return str_replace ("%","=",rawurlencode($s));
-}}
-
-
-
-if(! function_exists('get_mentions')) {
-function get_mentions($item) {
- $o = '';
- if(! strlen($item['tag']))
- return $o;
-
- $arr = explode(',',$item['tag']);
- foreach($arr as $x) {
- $matches = null;
- if(preg_match('/@\[url=([^\]]*)\]/',$x,$matches)) {
- $o .= "\t\t" . '<link rel="mentioned" href="' . $matches[1] . '" />' . "\r\n";
- $o .= "\t\t" . '<link rel="ostatus:attention" href="' . $matches[1] . '" />' . "\r\n";
- }
- }
- return $o;
-}}
-
-if(! function_exists('contact_block')) {
-function contact_block() {
- $o = '';
- $a = get_app();
-
- $shown = get_pconfig($a->profile['uid'],'system','display_friend_count');
- if(! $shown)
- $shown = 24;
-
- if((! is_array($a->profile)) || ($a->profile['hide-friends']))
- return $o;
- $r = q("SELECT COUNT(*) AS `total` FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 and `pending` = 0",
- intval($a->profile['uid'])
- );
- if(count($r)) {
- $total = intval($r[0]['total']);
- }
- if(! $total) {
- $o .= '<h4 class="contact-h4">' . t('No contacts') . '</h4>';
- return $o;
- }
- $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 and `pending` = 0 ORDER BY RAND() LIMIT %d",
- intval($a->profile['uid']),
- intval($shown)
- );
- if(count($r)) {
- $o .= '<h4 class="contact-h4">' . sprintf( tt('%d Contact','%d Contacts', $total),$total) . '</h4><div id="contact-block">';
- foreach($r as $rr) {
- $o .= micropro($rr,true,'mpfriend');
- }
- $o .= '</div><div id="contact-block-end"></div>';
- $o .= '<div id="viewcontacts"><a id="viewcontacts-link" href="viewcontacts/' . $a->profile['nickname'] . '">' . t('View Contacts') . '</a></div>';
-
- }
-
- $arr = array('contacts' => $r, 'output' => $o);
-
- call_hooks('contact_block_end', $arr);
- return $o;
-
-}}
-
-if(! function_exists('micropro')) {
-function micropro($contact, $redirect = false, $class = '', $textmode = false) {
-
- if($class)
- $class = ' ' . $class;
-
- $url = $contact['url'];
- $sparkle = '';
-
- if($redirect) {
- $a = get_app();
- $redirect_url = $a->get_baseurl() . '/redir/' . $contact['id'];
- if(local_user() && ($contact['uid'] == local_user()) && ($contact['network'] === 'dfrn')) {
- $url = $redirect_url;
- $sparkle = ' sparkle';
- }
- }
- $click = ((x($contact,'click')) ? ' onclick="' . $contact['click'] . '" ' : '');
- if($click)
- $url = '';
- if($textmode) {
- return '<div class="contact-block-textdiv' . $class . '"><a class="contact-block-link' . $class . $sparkle
- . (($click) ? ' fakelink' : '') . '" '
- . (($url) ? ' href="' . $url . '"' : '') . $click
- . '" title="' . $contact['name'] . ' [' . $contact['url'] . ']" alt="' . $contact['name']
- . '" >'. $contact['name'] . '</a></div>' . "\r\n";
- }
- else {
- return '<div class="contact-block-div' . $class . '"><a class="contact-block-link' . $class . $sparkle
- . (($click) ? ' fakelink' : '') . '" '
- . (($url) ? ' href="' . $url . '"' : '') . $click . ' ><img class="contact-block-img' . $class . $sparkle . '" src="'
- . $contact['micro'] . '" title="' . $contact['name'] . ' [' . $contact['url'] . ']" alt="' . $contact['name']
- . '" /></a></div>' . "\r\n";
- }
-}}
-
-
-
-if(! function_exists('search')) {
-function search($s,$id='search-box',$url='/search') {
- $a = get_app();
- $o = '<div id="' . $id . '">';
- $o .= '<form action="' . $a->get_baseurl() . $url . '" method="get" >';
- $o .= '<input type="text" name="search" id="search-text" value="' . $s .'" />';
- $o .= '<input type="submit" name="submit" id="search-submit" value="' . t('Search') . '" />';
- $o .= '</form></div>';
- return $o;
-}}
-
-if(! function_exists('valid_email')) {
-function valid_email($x){
- if(preg_match('/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)+$/',$x))
- return true;
- return false;
-}}
-
-
-if(! function_exists('gravatar_img')) {
-function gravatar_img($email) {
- $size = 175;
- $opt = 'identicon'; // psuedo-random geometric pattern if not found
- $rating = 'pg';
- $hash = md5(trim(strtolower($email)));
-
- $url = 'http://www.gravatar.com/avatar/' . $hash . '.jpg'
- . '?s=' . $size . '&d=' . $opt . '&r=' . $rating;
-
- logger('gravatar: ' . $email . ' ' . $url);
- return $url;
-}}
-
-if(! function_exists('aes_decrypt')) {
-function aes_decrypt($val,$ky)
-{
- $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
- for($a=0;$a<strlen($ky);$a++)
- $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a]));
- $mode = MCRYPT_MODE_ECB;
- $enc = MCRYPT_RIJNDAEL_128;
- $dec = @mcrypt_decrypt($enc, $key, $val, $mode, @mcrypt_create_iv( @mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM ) );
- return rtrim($dec,(( ord(substr($dec,strlen($dec)-1,1))>=0 and ord(substr($dec, strlen($dec)-1,1))<=16)? chr(ord( substr($dec,strlen($dec)-1,1))):null));
-}}
-
-
-if(! function_exists('aes_encrypt')) {
-function aes_encrypt($val,$ky)
-{
- $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
- for($a=0;$a<strlen($ky);$a++)
- $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a]));
- $mode=MCRYPT_MODE_ECB;
- $enc=MCRYPT_RIJNDAEL_128;
- $val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16)));
- return mcrypt_encrypt($enc, $key, $val, $mode, mcrypt_create_iv( mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM));
-}}
-
-
-/**
- *
- * Function: linkify
- *
- * Replace naked text hyperlink with HTML formatted hyperlink
- *
- */
-
-if(! function_exists('linkify')) {
-function linkify($s) {
- $s = preg_replace("/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'\%\$\!\+]*)/", ' <a href="$1" target="external-link">$1</a>', $s);
- return($s);
-}}
-
-
-/**
- *
- * Function: smilies
- *
- * Description:
- * Replaces text emoticons with graphical images
- *
- * @Parameter: string $s
- *
- * Returns string
- */
-
-if(! function_exists('smilies')) {
-function smilies($s) {
- $a = get_app();
-
- return str_replace(
- array( '&lt;3', '&lt;/3', '&lt;\\3', ':-)', ':)', ';-)', ':-(', ':(', ':-P', ':P', ':-"', ':-x', ':-X', ':-D', '8-|', '8-O'),
- array(
- '<img src="' . $a->get_baseurl() . '/images/smiley-heart.gif" alt="<3" />',
- '<img src="' . $a->get_baseurl() . '/images/smiley-brokenheart.gif" alt="</3" />',
- '<img src="' . $a->get_baseurl() . '/images/smiley-brokenheart.gif" alt="<\\3" />',
- '<img src="' . $a->get_baseurl() . '/images/smiley-smile.gif" alt=":-)" />',
- '<img src="' . $a->get_baseurl() . '/images/smiley-smile.gif" alt=":)" />',
- '<img src="' . $a->get_baseurl() . '/images/smiley-wink.gif" alt=";-)" />',
- '<img src="' . $a->get_baseurl() . '/images/smiley-frown.gif" alt=":-(" />',
- '<img src="' . $a->get_baseurl() . '/images/smiley-frown.gif" alt=":(" />',
- '<img src="' . $a->get_baseurl() . '/images/smiley-tongue-out.gif" alt=":-P" />',
- '<img src="' . $a->get_baseurl() . '/images/smiley-tongue-out.gif" alt=":P" />',
- '<img src="' . $a->get_baseurl() . '/images/smiley-kiss.gif" alt=":-\"" />',
- '<img src="' . $a->get_baseurl() . '/images/smiley-kiss.gif" alt=":-x" />',
- '<img src="' . $a->get_baseurl() . '/images/smiley-kiss.gif" alt=":-X" />',
- '<img src="' . $a->get_baseurl() . '/images/smiley-laughing.gif" alt=":-D" />',
- '<img src="' . $a->get_baseurl() . '/images/smiley-surprised.gif" alt="8-|" />',
- '<img src="' . $a->get_baseurl() . '/images/smiley-surprised.gif" alt="8-O" />'
- ), $s);
-}}
-
/**
*
@@ -2395,6 +829,8 @@ function profile_load(&$a, $nickname, $profile = 0) {
if(! function_exists('profile_sidebar')) {
function profile_sidebar($profile) {
+ $a = get_app();
+
$o = '';
$location = '';
$address = false;
@@ -2453,6 +889,55 @@ function profile_sidebar($profile) {
$location = $gender = $marital = $homepage = '';
}
+ $podloc = $a->get_baseurl();
+ $searchable = (($profile['publish'] && $profile['net-publish']) ? 'true' : 'false' );
+ $nickname = $profile['nick'];
+ $photo300 = $a->get_baseurl() . '/photo/custom/300/' . $profile['uid'] . '.jpg';
+ $photo100 = $a->get_baseurl() . '/photo/custom/100/' . $profile['uid'] . '.jpg';
+ $photo50 = $a->get_baseurl() . '/photo/custom/50/' . $profile['uid'] . '.jpg';
+
+ $diaspora_vcard = <<< EOT
+
+<div style="display:none;">
+<dl class='entity_nickname'>
+<dt>Nickname</dt>
+<dd>
+<a class="nickname url uid" href="$podloc" rel="me">$nickname</a>
+</dd>
+</dl>
+<dl class="entity_url">
+<dt>URL</dt>
+<dd>
+<a class="url" href="$podloc" id="pod_location" rel="me">$podloc</a>
+</dd>
+</dl>
+<dl class="entity_photo">
+<dt>Photo</dt>
+<dd>
+<img class="photo avatar" height="300px" width="300px" src="$photo300">
+</dd>
+</dl>
+<dl class="entity_photo_medium">
+<dt>Photo</dt>
+<dd>
+<img class="photo avatar" height="100px" width="100px" src="$photo100">
+</dd>
+</dl>
+<dl class="entity_photo_small">
+<dt>Photo</dt>
+<dd>
+<img class="photo avatar" height="50px" width="50px" src="$photo50">
+</dd>
+</dl>
+<dl class='entity_searchable'>
+<dt>Searchable</dt>
+<dd>
+<span class='searchable'>$searchable</span>
+</dd>
+</dl>
+</div>
+EOT;
+
$tpl = get_markup_template('profile_vcard.tpl');
$o .= replace_macros($tpl, array(
@@ -2465,7 +950,8 @@ function profile_sidebar($profile) {
'$gender' => $gender,
'$pubkey' => $pubkey,
'$marital' => $marital,
- '$homepage' => $homepage
+ '$homepage' => $homepage,
+ '$diaspora' => $diaspora_vcard
));
@@ -2477,81 +963,6 @@ function profile_sidebar($profile) {
}}
-if(! function_exists('register_hook')) {
-function register_hook($hook,$file,$function) {
-
- $r = q("SELECT * FROM `hook` WHERE `hook` = '%s' AND `file` = '%s' AND `function` = '%s' LIMIT 1",
- dbesc($hook),
- dbesc($file),
- dbesc($function)
- );
- if(count($r))
- return true;
-
- $r = q("INSERT INTO `hook` (`hook`, `file`, `function`) VALUES ( '%s', '%s', '%s' ) ",
- dbesc($hook),
- dbesc($file),
- dbesc($function)
- );
- return $r;
-}}
-
-if(! function_exists('unregister_hook')) {
-function unregister_hook($hook,$file,$function) {
-
- $r = q("DELETE FROM `hook` WHERE `hook` = '%s' AND `file` = '%s' AND `function` = '%s' LIMIT 1",
- dbesc($hook),
- dbesc($file),
- dbesc($function)
- );
- return $r;
-}}
-
-
-if(! function_exists('load_hooks')) {
-function load_hooks() {
- $a = get_app();
- $a->hooks = array();
- $r = q("SELECT * FROM `hook` WHERE 1");
- if(count($r)) {
- foreach($r as $rr) {
- $a->hooks[] = array($rr['hook'], $rr['file'], $rr['function']);
- }
- }
-}}
-
-
-if(! function_exists('call_hooks')) {
-function call_hooks($name, &$data = null) {
- $a = get_app();
-
- if(count($a->hooks)) {
- foreach($a->hooks as $hook) {
- if($hook[HOOK_HOOK] === $name) {
- @include_once($hook[HOOK_FILE]);
- if(function_exists($hook[HOOK_FUNCTION])) {
- $func = $hook[HOOK_FUNCTION];
- $func($a,$data);
- }
- }
- }
- }
-}}
-
-
-if(! function_exists('day_translate')) {
-function day_translate($s) {
- $ret = str_replace(array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'),
- array( t('Monday'), t('Tuesday'), t('Wednesday'), t('Thursday'), t('Friday'), t('Saturday'), t('Sunday')),
- $s);
-
- $ret = str_replace(array('January','February','March','April','May','June','July','August','September','October','November','December'),
- array( t('January'), t('February'), t('March'), t('April'), t('May'), t('June'), t('July'), t('August'), t('September'), t('October'), t('November'), t('December')),
- $ret);
-
- return $ret;
-}}
-
if(! function_exists('get_birthdays')) {
function get_birthdays() {
@@ -2602,79 +1013,6 @@ function get_birthdays() {
}}
-if(! function_exists('normalise_link')) {
-function normalise_link($url) {
- $ret = str_replace(array('https:','//www.'), array('http:','//'), $url);
- return(rtrim($ret,'/'));
-}}
-
-/**
- *
- * Compare two URLs to see if they are the same, but ignore
- * slight but hopefully insignificant differences such as if one
- * is https and the other isn't, or if one is www.something and
- * the other isn't - and also ignore case differences.
- *
- * Return true if the URLs match, otherwise false.
- *
- */
-
-if(! function_exists('link_compare')) {
-function link_compare($a,$b) {
- if(strcasecmp(normalise_link($a),normalise_link($b)) === 0)
- return true;
- return false;
-}}
-
-
-if(! function_exists('prepare_body')) {
-function prepare_body($item,$attach = false) {
-
- $s = prepare_text($item['body']);
- if(! $attach)
- return $s;
-
- $arr = explode(',',$item['attach']);
- if(count($arr)) {
- $s .= '<div class="body-attach">';
- foreach($arr as $r) {
- $matches = false;
- $icon = '';
- $cnt = preg_match('|\[attach\]href=\"(.*?)\" size=\"(.*?)\" type=\"(.*?)\" title=\"(.*?)\"\[\/attach\]|',$r,$matches);
- if($cnt) {
- $icontype = strtolower(substr($matches[3],0,strpos($matches[3],'/')));
- switch($icontype) {
- case 'video':
- case 'audio':
- case 'image':
- case 'text':
- $icon = '<div class="attachtype type-' . $icontype . '"></div>';
- break;
- default:
- $icon = '<div class="attachtype type-unkn"></div>';
- break;
- }
- $title = ((strlen(trim($matches[4]))) ? escape_tags(trim($matches[4])) : escape_tags($matches[1]));
- $title .= ' ' . $matches[2] . ' ' . t('bytes');
-
- $s .= '<a href="' . strip_tags($matches[1]) . '" title="' . $title . '" class="attachlink" target="external-link" >' . $icon . '</a>';
- }
- }
- $s .= '<div class="clear"></div></div>';
- }
- return $s;
-}}
-
-if(! function_exists('prepare_text')) {
-function prepare_text($text) {
-
- require_once('include/bbcode.php');
-
- $s = smilies(bbcode($text));
-
- return $s;
-}}
-
/**
*
* Wrap calls to proc_close(proc_open()) and call hook
@@ -2785,106 +1123,6 @@ function feed_birthday($uid,$tz) {
return $birthday;
}}
-/**
- * return atom link elements for all of our hubs
- */
-
-if(! function_exists('feed_hublinks')) {
-function feed_hublinks() {
-
- $hub = get_config('system','huburl');
-
- $hubxml = '';
- if(strlen($hub)) {
- $hubs = explode(',', $hub);
- if(count($hubs)) {
- foreach($hubs as $h) {
- $h = trim($h);
- if(! strlen($h))
- continue;
- $hubxml .= '<link rel="hub" href="' . xmlify($h) . '" />' . "\n" ;
- }
- }
- }
- return $hubxml;
-}}
-
-/* return atom link elements for salmon endpoints */
-
-if(! function_exists('feed_salmonlinks')) {
-function feed_salmonlinks($nick) {
-
- $a = get_app();
-
- $salmon = '<link rel="salmon" href="' . xmlify($a->get_baseurl() . '/salmon/' . $nick) . '" />' . "\n" ;
-
- // old style links that status.net still needed as of 12/2010
-
- $salmon .= ' <link rel="http://salmon-protocol.org/ns/salmon-replies" href="' . xmlify($a->get_baseurl() . '/salmon/' . $nick) . '" />' . "\n" ;
- $salmon .= ' <link rel="http://salmon-protocol.org/ns/salmon-mention" href="' . xmlify($a->get_baseurl() . '/salmon/' . $nick) . '" />' . "\n" ;
- return $salmon;
-}}
-
-if(! function_exists('get_plink')) {
-function get_plink($item) {
- $a = get_app();
- $plink = (((x($item,'plink')) && (! $item['private'])) ? '<div class="wall-item-links-wrapper"><a href="'
- . $item['plink'] . '" title="' . t('link to source') . '" target="external-link" class="icon remote-link"></a></div>' : '');
- return $plink;
-}}
-
-if(! function_exists('unamp')) {
-function unamp($s) {
- return str_replace('&amp;', '&', $s);
-}}
-
-
-
-
-if(! function_exists('lang_selector')) {
-function lang_selector() {
- global $lang;
- $o = '<div id="lang-select-icon" class="icon language" title="' . t('Select an alternate language') . '" onclick="openClose(\'language-selector\');" ></div>';
- $o .= '<div id="language-selector" style="display: none;" >';
- $o .= '<form action="" method="post" ><select name="system_language" onchange="this.form.submit();" >';
- $langs = glob('view/*/strings.php');
- if(is_array($langs) && count($langs)) {
- if(! in_array('view/en/strings.php',$langs))
- $langs[] = 'view/en/';
- asort($langs);
- foreach($langs as $l) {
- $ll = substr($l,5);
- $ll = substr($ll,0,strrpos($ll,'/'));
- $selected = (($ll === $lang) ? ' selected="selected" ' : '');
- $o .= '<option value="' . $ll . '"' . $selected . '>' . $ll . '</option>';
- }
- }
- $o .= '</select></form></div>';
- return $o;
-}}
-
-
-if(! function_exists('parse_xml_string')) {
-function parse_xml_string($s,$strict = true) {
- if($strict) {
- if(! strstr($s,'<?xml'))
- return false;
- $s2 = substr($s,strpos($s,'<?xml'));
- }
- else
- $s2 = $s;
- libxml_use_internal_errors(true);
-
- $x = @simplexml_load_string($s2);
- if(! $x) {
- logger('libxml: parse: error: ' . $s2, LOGGER_DATA);
- foreach(libxml_get_errors() as $err)
- logger('libxml: parse: ' . $err->code." at ".$err->line.":".$err->column." : ".$err->message, LOGGER_DATA);
- libxml_clear_errors();
- }
- return $x;
-}}
-
if(! function_exists('is_site_admin')) {
function is_site_admin() {
$a = get_app();
@@ -2893,84 +1131,28 @@ function is_site_admin() {
return false;
}}
-/*
- * parse plugin comment in search of plugin infos.
- * like
- *
- * * Name: Plugin
- * * Description: A plugin which plugs in
- * * Version: 1.2.3
- * * Author: John <profile url>
- * * Author: Jane <email>
- * *
- */
-if (! function_exists('get_plugin_info')){
-function get_plugin_info($plugin){
- if (!is_file("addon/$plugin/$plugin.php")) return false;
-
- $f = file_get_contents("addon/$plugin/$plugin.php");
- $r = preg_match("|/\*.*\*/|msU", $f, $m);
-
- $info=Array(
- 'name' => $plugin,
- 'description' => "",
- 'author' => array(),
- 'version' => ""
+if(! function_exists('load_contact_links')) {
+function load_contact_links($uid) {
+
+ $a = get_app();
+
+ $ret = array();
+
+ if(! $uid || x($a->contacts,'empty'))
+ return;
+
+ $r = q("SELECT `id`,`network`,`url`,`thumb` FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 ",
+ intval($uid)
);
-
- if ($r){
- $ll = explode("\n", $m[0]);
- foreach( $ll as $l ) {
- $l = trim($l,"\t\n\r */");
- if ($l!=""){
- list($k,$v) = array_map("trim", explode(":",$l,2));
- $k= strtolower($k);
- if ($k=="author"){
- $r=preg_match("|([^<]+)<([^>]+)>|", $v, $m);
- if ($r) {
- $info['author'][] = array('name'=>$m[1], 'link'=>$m[2]);
- } else {
- $info['author'][] = array('name'=>$v);
- }
- } else {
- if (array_key_exists($k,$info)){
- $info[$k]=$v;
- }
- }
-
- }
+ if(count($r)) {
+ foreach($r as $rr){
+ $url = normalise_link($rr['url']);
+ $ret[$url] = $rr;
}
-
}
- return $info;
-}}
-
-if(! function_exists('set_nav_selected')){
-function set_nav_selected($id){
- return '<script> $(document).ready(function() { $("#'.$id.'").addClass("selected"); });</script>';
-}}
-
-if(! function_exists('return_bytes')) {
-function return_bytes ($size_str) {
- switch (substr ($size_str, -1))
- {
- case 'M': case 'm': return (int)$size_str * 1048576;
- case 'K': case 'k': return (int)$size_str * 1024;
- case 'G': case 'g': return (int)$size_str * 1073741824;
- default: return $size_str;
- }
+ else
+ $ret['empty'] = true;
+ $a->contacts = $ret;
+ return;
}}
-
-function generate_guid() {
- $found = true;
- do {
- $guid = substr(random_string(),0,16);
- $x = q("SELECT `uid` FROM `user` WHERE `guid` = '%s' LIMIT 1",
- dbesc($guid)
- );
- if(! count($x))
- $found = false;
- } while ($found == true );
- return $guid;
-}
diff --git a/database.sql b/database.sql
index 50697845a..89c4b4267 100644
--- a/database.sql
+++ b/database.sql
@@ -160,6 +160,7 @@ CREATE TABLE IF NOT EXISTS `intro` (
CREATE TABLE IF NOT EXISTS `item` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `guid` char(64) NOT NULL,
`uri` char(255) NOT NULL,
`uid` int(10) unsigned NOT NULL DEFAULT '0',
`contact-id` int(10) unsigned NOT NULL DEFAULT '0',
@@ -208,6 +209,7 @@ CREATE TABLE IF NOT EXISTS `item` (
`deleted` tinyint(1) NOT NULL DEFAULT '0',
`last-child` tinyint(1) unsigned NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
+ KEY `guid` (`guid`),
KEY `uri` (`uri`),
KEY `uid` (`uid`),
KEY `contact-id` (`contact-id`),
@@ -573,3 +575,9 @@ CREATE TABLE IF NOT EXISTS `attach` (
`deny_gid` MEDIUMTEXT NOT NULL
) ENGINE = MYISAM DEFAULT CHARSET=utf8;
+CREATE TABLE IF NOT EXISTS `guid` (
+`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+`guid` CHAR( 64 ) NOT NULL ,
+INDEX ( `guid` )
+) ENGINE = MYISAM DEFAULT CHARSET=utf8;
+
diff --git a/images/diaspora.png b/images/diaspora.png
new file mode 100644
index 000000000..725fae718
--- /dev/null
+++ b/images/diaspora.png
Binary files differ
diff --git a/images/friendika-16.png b/images/friendika-16.png
index 3793508fb..745b7ac6c 100644
--- a/images/friendika-16.png
+++ b/images/friendika-16.png
Binary files differ
diff --git a/include/Scrape.php b/include/Scrape.php
index 6726d0b15..bfe795e19 100644
--- a/include/Scrape.php
+++ b/include/Scrape.php
@@ -1,6 +1,7 @@
<?php
require_once('library/HTML5/Parser.php');
+require_once('include/crypto.php');
if(! function_exists('scrape_dfrn')) {
function scrape_dfrn($url) {
@@ -171,6 +172,8 @@ function scrape_vcard($url) {
// Pull out hCard profile elements
+ $largest_photo = 0;
+
$items = $dom->getElementsByTagName('*');
foreach($items as $item) {
if(attribute_contains($item->getAttribute('class'), 'vcard')) {
@@ -179,8 +182,13 @@ function scrape_vcard($url) {
if(attribute_contains($x->getAttribute('class'),'fn'))
$ret['fn'] = $x->textContent;
if((attribute_contains($x->getAttribute('class'),'photo'))
- || (attribute_contains($x->getAttribute('class'),'avatar')))
- $ret['photo'] = $x->getAttribute('src');
+ || (attribute_contains($x->getAttribute('class'),'avatar'))) {
+ $size = intval($x->getAttribute('width'));
+ if(($size > $largest_photo) || (! $largest_photo)) {
+ $ret['photo'] = $x->getAttribute('src');
+ $largest_photo = $size;
+ }
+ }
if((attribute_contains($x->getAttribute('class'),'nickname'))
|| (attribute_contains($x->getAttribute('class'),'uid')))
$ret['nick'] = $x->textContent;
@@ -289,13 +297,24 @@ function probe_url($url) {
if(! $url)
return $result;
- $diaspora = false;
+ $diaspora = false;
+ $diaspora_base = '';
+ $diaspora_guid = '';
+ $diaspora_key = '';
$email_conversant = false;
$twitter = ((strpos($url,'twitter.com') !== false) ? true : false);
+ $at_addr = ((strpos($url,'@') !== false) ? true : false);
+
if(! $twitter) {
- $links = lrdd($url);
+
+ if(strpos($url,'mailto:') !== false && $at_addr) {
+ $url = str_replace('mailto:','',$url);
+ $links = array();
+ }
+ else
+ $links = lrdd($url);
if(count($links)) {
logger('probe_url: found lrdd links: ' . print_r($links,true), LOGGER_DATA);
@@ -312,8 +331,19 @@ function probe_url($url) {
$hcard = unamp($link['@attributes']['href']);
if($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page')
$profile = unamp($link['@attributes']['href']);
- if($link['@attributes']['rel'] === 'http://joindiaspora.com/seed_location')
+ if($link['@attributes']['rel'] === 'http://joindiaspora.com/seed_location') {
+ $diaspora_base = unamp($link['@attributes']['href']);
+ $diaspora = true;
+ }
+ if($link['@attributes']['rel'] === 'http://joindiaspora.com/guid') {
+ $diaspora_guid = unamp($link['@attributes']['href']);
+ $diaspora = true;
+ }
+ if($link['@attributes']['rel'] === 'diaspora-public-key') {
+ $diaspora_key = base64_decode(unamp($link['@attributes']['href']));
+ $pubkey = rsatopem($diaspora_key);
$diaspora = true;
+ }
}
// Status.Net can have more than one profile URL. We need to match the profile URL
@@ -411,8 +441,17 @@ function probe_url($url) {
}
}
+ if($diaspora && $diaspora_base && $diaspora_guid) {
+ $notify = $diaspora_base . 'receive/post/' . $diaspora_guid;
+ if(strpos($url,'@'))
+ $addr = str_replace('acct:', '', $url);
+ }
+
if($network !== NETWORK_ZOT && $network !== NETWORK_DFRN && $network !== NETWORK_MAIL) {
- $network = NETWORK_OSTATUS;
+ if($diaspora)
+ $network = NETWORK_DIASPORA;
+ else
+ $network = NETWORK_OSTATUS;
$priority = 0;
if($hcard) {
@@ -429,13 +468,6 @@ function probe_url($url) {
logger('probe_url: scrape_vcard: ' . print_r($vcard,true), LOGGER_DATA);
}
- if(! $profile) {
- if($diaspora)
- $profile = $hcard;
- else
- $profile = $url;
- }
-
if($twitter) {
logger('twitter: setup');
$tid = basename($url);
@@ -451,10 +483,18 @@ function probe_url($url) {
if(x($vcard,'nick'))
$vcard['fn'] = $vcard['nick'];
-
- if(((! isset($vcard)) && (! $poll)) || ($twitter)) {
+ $check_feed = false;
+
+ if($twitter || ! $poll)
+ $check_feed = true;
+ if((! isset($vcard)) || (! $profile))
+ $check_feed = true;
+ if(($at_addr) && (! count($links)))
+ $check_feed = false;
+
+ if($check_feed) {
- $feedret = scrape_feed($url);
+ $feedret = scrape_feed(($poll) ? $poll : $url);
logger('probe_url: scrape_feed returns: ' . print_r($feedret,true), LOGGER_DATA);
if(count($feedret) && ($feedret['feed_atom'] || $feedret['feed_rss'])) {
$poll = ((x($feedret,'feed_atom')) ? unamp($feedret['feed_atom']) : unamp($feedret['feed_rss']));
@@ -488,6 +528,8 @@ function probe_url($url) {
if(strpos($vcard['fn'],'@') !== false)
$vcard['fn'] = substr($vcard['fn'],0,strpos($vcard['fn'],'@'));
$email = unxmlify($author->get_email());
+ if(! $profile && $author->get_link())
+ $profile = trim(unxmlify($author->get_link()));
if(! $vcard['photo']) {
$rawtags = $feed->get_feed_tags( SIMPLEPIE_NAMESPACE_ATOM_10, 'author');
if($rawtags) {
@@ -508,6 +550,8 @@ function probe_url($url) {
if(strpos($vcard['fn'],'@') !== false)
$vcard['fn'] = substr($vcard['fn'],0,strpos($vcard['fn'],'@'));
$email = unxmlify($author->get_email());
+ if(! $profile && $author->get_link())
+ $profile = trim(unxmlify($author->get_link()));
}
if(! $vcard['photo']) {
$rawmedia = $item->get_item_tags('http://search.yahoo.com/mrss/','thumbnail');
@@ -545,8 +589,10 @@ function probe_url($url) {
if(strpos($vcard['nick'],' '))
$vcard['nick'] = trim(substr($vcard['nick'],0,strpos($vcard['nick'],' ')));
}
- $network = 'feed';
- $priority = 2;
+ if(! $network)
+ $network = 'feed';
+ if(! $priority)
+ $priority = 2;
}
}
@@ -554,8 +600,12 @@ function probe_url($url) {
$a = get_app();
$vcard['photo'] = $a->get_baseurl() . '/images/default-profile.jpg' ;
}
+
+ if(! $profile)
+ $profile = $url;
+
$vcard['fn'] = notags($vcard['fn']);
- $vcard['nick'] = notags($vcard['nick']);
+ $vcard['nick'] = str_replace(' ','',notags($vcard['nick']));
$result['name'] = $vcard['fn'];
diff --git a/include/acl.js b/include/acl.js
index a0a1f5dd8..82b631ee9 100644
--- a/include/acl.js
+++ b/include/acl.js
@@ -153,6 +153,9 @@ ACL.prototype.updateview = function(){
$('#jot-perms-icon').removeClass('lock').addClass('unlock');
$('#jot-public').show();
$('.profile-jot-net input').attr('disabled', false);
+ if(editor != false) {
+ $('#profile-jot-desc').html(ispublic);
+ }
} else {
that.showall.removeClass("selected");
@@ -160,6 +163,7 @@ ACL.prototype.updateview = function(){
$('#jot-perms-icon').removeClass('unlock').addClass('lock');
$('#jot-public').hide();
$('.profile-jot-net input').attr('disabled', 'disabled');
+ $('#profile-jot-desc').html('&nbsp;');
}
$("#acl-list-content .acl-list-item").each(function(){
diff --git a/include/acl_selectors.php b/include/acl_selectors.php
index 99de67d64..48ba77a88 100644
--- a/include/acl_selectors.php
+++ b/include/acl_selectors.php
@@ -96,7 +96,7 @@ function contact_selector($selname, $selclass, $preselected = false, $options) {
$sql_extra = '';
if($x['mutual']) {
- $sql_extra .= sprintf(" AND `rel` = %d ", intval(REL_BUD));
+ $sql_extra .= sprintf(" AND `rel` = %d ", intval(CONTACT_IS_FRIEND));
}
if(intval($x['exclude']))
@@ -163,7 +163,7 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
$sql_extra = '';
if($privmail || $celeb) {
- $sql_extra .= sprintf(" AND `rel` = %d ", intval(REL_BUD));
+ $sql_extra .= sprintf(" AND `rel` = %d ", intval(CONTACT_IS_FRIEND));
}
if($privmail) {
diff --git a/include/api.php b/include/api.php
index 4e5ea43bd..7a44cf023 100644
--- a/include/api.php
+++ b/include/api.php
@@ -10,10 +10,9 @@
$API = Array();
-
function api_date($str){
//Wed May 23 06:01:13 +0000 2007
- return datetime_convert('UTC', 'UTC', $str, "D M d h:i:s +0000 Y" );
+ return datetime_convert('UTC', 'UTC', $str, "D M d H:i:s +0000 Y" );
}
@@ -111,7 +110,11 @@
if ($info['auth']===true && local_user()===false) {
api_login($a);
}
-
+
+ load_contact_links(local_user());
+
+ logger('API call for ' . $a->user['username'] . ': ' . $a->query_string);
+ logger('API parameters: ' . print_r($_REQUEST,true));
$type="json";
if (strpos($a->query_string, ".xml")>0) $type="xml";
if (strpos($a->query_string, ".json")>0) $type="json";
@@ -145,7 +148,26 @@
//echo "<pre>"; var_dump($r); die();
}
}
- return false;
+ $r = '<status><error>not implemented</error></status>';
+ switch($type){
+ case "xml":
+ header ("Content-Type: text/xml");
+ return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r;
+ break;
+ case "json":
+ header ("Content-Type: application/json");
+ return json_encode(array('error' => 'not implemented'));
+ break;
+ case "rss":
+ header ("Content-Type: application/rss+xml");
+ return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r;
+ break;
+ case "atom":
+ header ("Content-Type: application/atom+xml");
+ return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r;
+ break;
+
+ }
}
/**
@@ -157,7 +179,9 @@
$arr['$rss'] = array(
'alternate' => $user_info['url'],
'self' => $a->get_baseurl(). "/". $a->query_string,
+ 'base' => $a->get_baseurl(),
'updated' => api_date(null),
+ 'atom_updated' => datetime_convert('UTC','UTC','now',ATOM_TIME),
'language' => $user_info['language'],
'logo' => $a->get_baseurl()."/images/friendika-32.png",
);
@@ -168,9 +192,10 @@
/**
* Returns user info array.
*/
- function api_get_user(&$a, $contact_id=Null){
+ function api_get_user(&$a, $contact_id = Null){
$user = null;
$extra_query = "";
+
if(!is_null($contact_id)){
$user=$contact_id;
$extra_query = "AND `contact`.`id` = %d ";
@@ -185,7 +210,7 @@
$extra_query = "AND `contact`.`nick` = '%s' ";
}
- if (is_null($user)){
+ if (is_null($user) && $a->argc > 3){
list($user, $null) = explode(".",$a->argv[3]);
if(is_numeric($user)){
$user = intval($user);
@@ -196,17 +221,17 @@
}
}
- if ($user==='') {
+ if (! $user) {
if (local_user()===false) {
api_login($a); return False;
} else {
$user = $_SESSION['uid'];
- $extra_query = "AND `contact`.`uid` = %d ";
+ $extra_query = "AND `contact`.`uid` = %d AND `contact`.`self` = 1 ";
}
}
-
+ logger('api_user: ' . $extra_query . ' ' , $user);
// user info
$uinfo = q("SELECT *, `contact`.`id` as `cid` FROM `contact`
WHERE 1
@@ -217,43 +242,135 @@
return False;
}
- // count public wall messages
- $r = q("SELECT COUNT(`id`) as `count` FROM `item`
- WHERE `uid` = %d
- AND `type`='wall'
- AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`=''",
- intval($uinfo[0]['uid'])
- );
- $countitms = $r[0]['count'];
-
+ if($uinfo[0]['self']) {
+ $usr = q("select * from user where uid = %d limit 1",
+ intval(local_user())
+ );
+ $profile = q("select * from profile where uid = %d and `is-default` = 1 limit 1",
+ intval(local_user())
+ );
+
+ // count public wall messages
+ $r = q("SELECT COUNT(`id`) as `count` FROM `item`
+ WHERE `uid` = %d
+ AND `type`='wall'
+ AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`=''",
+ intval($uinfo[0]['uid'])
+ );
+ $countitms = $r[0]['count'];
+ }
+ else {
+ $r = q("SELECT COUNT(`id`) as `count` FROM `item`
+ WHERE `contact-id` = %d
+ AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`=''",
+ intval($uinfo[0]['id'])
+ );
+ $countitms = $r[0]['count'];
+ }
+
// count friends
$r = q("SELECT COUNT(`id`) as `count` FROM `contact`
- WHERE `uid` = %d
+ WHERE `uid` = %d AND `rel` IN ( %d, %d )
AND `self`=0 AND `blocked`=0",
- intval($uinfo[0]['uid'])
+ intval($uinfo[0]['uid']),
+ intval(CONTACT_IS_SHARING),
+ intval(CONTACT_IS_FRIEND)
);
$countfriends = $r[0]['count'];
-
+
+ $r = q("SELECT COUNT(`id`) as `count` FROM `contact`
+ WHERE `uid` = %d AND `rel` IN ( %d, %d )
+ AND `self`=0 AND `blocked`=0",
+ intval($uinfo[0]['uid']),
+ intval(CONTACT_IS_FOLLOWER),
+ intval(CONTACT_IS_FRIEND)
+ );
+ $countfollowers = $r[0]['count'];
+
+ $r = q("SELECT count(`id`) as `count` FROM item where starred = 1 and uid = %d and deleted = 0",
+ intval($uinfo[0]['uid'])
+ );
+ $starred = $r[0]['count'];
+
+
+ if(! $uinfo[0]['self']) {
+ $countfriends = 0;
+ $countfollowers = 0;
+ $starred = 0;
+ }
$ret = Array(
- 'uid' => $uinfo[0]['uid'],
- 'id' => $uinfo[0]['cid'],
+ 'uid' => intval($uinfo[0]['uid']),
+ 'id' => intval($uinfo[0]['cid']),
'name' => $uinfo[0]['name'],
- 'screen_name' => $uinfo[0]['nick'],
- 'location' => '', //$uinfo[0]['default-location'],
+ 'screen_name' => (($uinfo[0]['nick']) ? $uinfo[0]['nick'] : $uinfo[0]['name']),
+ 'location' => ($usr) ? $usr[0]['default-location'] : '',
'profile_image_url' => $uinfo[0]['micro'],
'url' => $uinfo[0]['url'],
'contact_url' => $a->get_baseurl()."/contacts/".$uinfo[0]['cid'],
- 'protected' => false, #
- 'friends_count' => $countfriends,
+ 'protected' => false,
+ 'friends_count' => intval($countfriends),
'created_at' => api_date($uinfo[0]['name-date']),
+ 'utc_offset' => "+00:00",
+ 'time_zone' => 'UTC', //$uinfo[0]['timezone'],
+ 'geo_enabled' => false,
+ 'statuses_count' => intval($countitms), #XXX: fix me
+ 'lang' => 'en', #XXX: fix me
+ 'description' => (($profile) ? $profile[0]['pdesc'] : ''),
+ 'followers_count' => intval($countfollowers),
+ 'favourites_count' => intval($starred),
+ 'contributors_enabled' => false,
+ 'follow_request_sent' => false,
+ 'profile_background_color' => 'cfe8f6',
+ 'profile_text_color' => '000000',
+ 'profile_link_color' => 'FF8500',
+ 'profile_sidebar_fill_color' =>'AD0066',
+ 'profile_sidebar_border_color' => 'AD0066',
+ 'profile_background_image_url' => '',
+ 'profile_background_tile' => false,
+ 'profile_use_background_image' => false,
+ 'notifications' => false,
+ 'following' => '', #XXX: fix me
+ 'verified' => true, #XXX: fix me
+ #'status' => null
+ );
+
+ return $ret;
+
+ }
+
+ function api_item_get_user(&$a, $item) {
+ // The author is our direct contact, in a conversation with us.
+ if(link_compare($item['url'],$item['author-link'])) {
+ return api_get_user($a,$item['cid']);
+ }
+ else {
+ // The author may be a contact of ours, but is replying to somebody else.
+ // Figure out if we know him/her.
+ $normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']);
+ if(($normalised != 'mailbox') && (x($a->contacts[$normalised])))
+ return api_get_user($a,$a->contacts[$normalised]['id']);
+ }
+ // We don't know this person directly.
+ $ret = array(
+ 'uid' => 0,
+ 'id' => 0,
+ 'name' => $item['author-name'],
+ 'screen_name' => $item['author_name'],
+ 'location' => '', //$uinfo[0]['default-location'],
+ 'profile_image_url' => $item['author-avatar'],
+ 'url' => $item['author-link'],
+ 'contact_url' => 0,
+ 'protected' => false, #
+ 'friends_count' => 0,
+ 'created_at' => '',
'utc_offset' => 0, #XXX: fix me
'time_zone' => '', //$uinfo[0]['timezone'],
'geo_enabled' => false,
- 'statuses_count' => $countitms, #XXX: fix me
+ 'statuses_count' => 0,
'lang' => 'en', #XXX: fix me
'description' => '',
- 'followers_count' => $countfriends, #XXX: fix me
+ 'followers_count' => 0,
'favourites_count' => 0,
'contributors_enabled' => false,
'follow_request_sent' => false,
@@ -270,9 +387,8 @@
'followers' => '', #XXX: fix me
#'status' => null
);
-
- return $ret;
-
+
+ return $ret;
}
/**
@@ -281,7 +397,7 @@
function api_xmlify($val){
if (is_bool($val)) return $val?"true":"false";
if (is_array($val)) return array_map('api_xmlify', $val);
- return xmlify($val);
+ return xmlify((string) $val);
}
/**
@@ -289,9 +405,11 @@
*/
function api_apply_template($templatename, $type, $data){
+ $a = get_app();
+
switch($type){
- case "rss":
case "atom":
+ case "rss":
case "xml":
$data = api_xmlify($data);
$tpl = get_markup_template("api_".$templatename."_".$type.".tpl");
@@ -323,20 +441,39 @@
api_register_func('api/account/verify_credentials','api_account_verify_credentials', true);
+ /**
+ * get data from $_POST or $_GET
+ */
+ function requestdata($k){
+ if (isset($_POST[$k])){
+ return $_POST[$k];
+ }
+ if (isset($_GET[$k])){
+ return $_GET[$k];
+ }
+ return null;
+ }
// TODO - media uploads
-
function api_statuses_update(&$a, $type) {
if (local_user()===false) return false;
$user_info = api_get_user($a);
// convert $_POST array items to the form we use for web posts.
- $_POST['body'] = urldecode($_POST['status']);
- $_POST['parent'] = $_POST['in_reply_to_status_id'];
- if($_POST['lat'] && $_POST['long'])
- $_POST['coord'] = sprintf("%s %s",$_POST['lat'],$_POST['long']);
+ // logger('api_post: ' . print_r($_POST,true));
+
+ $_POST['body'] = urldecode(requestdata('status'));
+
+ $parent = requestdata('in_reply_to_status_id');
+ if(ctype_digit($parent))
+ $_POST['parent'] = $parent;
+ else
+ $_POST['parent_uri'] = $parent;
+
+ if(requestdata('lat') && requestdata('long'))
+ $_POST['coord'] = sprintf("%s %s",requestdata('lat'),requestdata('long'));
$_POST['profile_uid'] = local_user();
- if($_POST['parent'])
+ if(requestdata('parent'))
$_POST['type'] = 'net-comment';
else
$_POST['type'] = 'wall';
@@ -473,7 +610,85 @@
$user_info = api_get_user($a);
// get last newtork messages
- $sql_extra = " AND `item`.`parent` IN ( SELECT `parent` FROM `item` WHERE `id` = `parent` ) ";
+// $sql_extra = " AND `item`.`parent` IN ( SELECT `parent` FROM `item` WHERE `id` = `parent` ) ";
+
+ $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
+ `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
+ `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`,
+ `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
+ FROM `item`, `contact`
+ WHERE `item`.`uid` = %d
+ AND `item`.`visible` = 1 AND `item`.`deleted` = 0
+ AND `contact`.`id` = `item`.`contact-id`
+ AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
+ $sql_extra
+ ORDER BY `item`.`received` DESC LIMIT %d ,%d ",
+ intval($user_info['uid']),
+ 0,20
+ );
+
+ $ret = api_format_items($r,$user_info);
+
+
+ $data = array('$statuses' => $ret);
+ switch($type){
+ case "atom":
+ case "rss":
+ $data = api_rss_extra($a, $data, $user_info);
+ }
+
+ return api_apply_template("timeline", $type, $data);
+ }
+ api_register_func('api/statuses/home_timeline','api_statuses_home_timeline', true);
+ api_register_func('api/statuses/friends_timeline','api_statuses_home_timeline', true);
+
+
+
+ function api_statuses_user_timeline(&$a, $type){
+ if (local_user()===false) return false;
+
+ $user_info = api_get_user($a);
+ // get last newtork messages
+// $sql_extra = " AND `item`.`parent` IN ( SELECT `parent` FROM `item` WHERE `id` = `parent` ) ";
+
+ $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
+ `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
+ `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`,
+ `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
+ FROM `item`, `contact`
+ WHERE `item`.`uid` = %d
+ AND `item`.`visible` = 1 AND `item`.`deleted` = 0
+ AND `item`.`wall` = 1
+ AND `contact`.`id` = `item`.`contact-id`
+ AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
+ $sql_extra
+ ORDER BY `item`.`received` DESC LIMIT %d ,%d ",
+ intval($user_info['uid']),
+ 0,20
+ );
+
+ $ret = api_format_items($r,$user_info);
+
+
+ $data = array('$statuses' => $ret);
+ switch($type){
+ case "atom":
+ case "rss":
+ $data = api_rss_extra($a, $data, $user_info);
+ }
+
+ return api_apply_template("timeline", $type, $data);
+ }
+
+ api_register_func('api/statuses/user_timeline','api_statuses_user_timeline', true);
+
+
+ function api_favorites(&$a, $type){
+ if (local_user()===false) return false;
+
+ $user_info = api_get_user($a);
+ // get last newtork messages
+// $sql_extra = " AND `item`.`parent` IN ( SELECT `parent` FROM `item` WHERE `id` = `parent` ) ";
$r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
`contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
@@ -482,30 +697,56 @@
FROM `item`, `contact`
WHERE `item`.`uid` = %d
AND `item`.`visible` = 1 AND `item`.`deleted` = 0
+ AND `item`.`starred` = 1
AND `contact`.`id` = `item`.`contact-id`
AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
$sql_extra
- ORDER BY `item`.`created` DESC LIMIT %d ,%d ",
+ ORDER BY `item`.`received` DESC LIMIT %d ,%d ",
intval($user_info['uid']),
0,20
);
+
+ $ret = api_format_items($r,$user_info);
+
+
+ $data = array('$statuses' => $ret);
+ switch($type){
+ case "atom":
+ case "rss":
+ $data = api_rss_extra($a, $data, $user_info);
+ }
+
+ return api_apply_template("timeline", $type, $data);
+ }
+
+ api_register_func('api/favorites','api_favorites', true);
+
+
+ function api_format_items($r,$user_info) {
+
+ //logger('api_format_items: ' . print_r($r,true));
+
+ //logger('api_format_items: ' . print_r($user_info,true));
+
+ $a = get_app();
$ret = Array();
foreach($r as $item) {
- $status_user = (($item['cid']==$user_info['id'])?$user_info: api_get_user($a,$item['cid']));
+ $status_user = (($item['cid']==$user_info['id'])?$user_info: api_item_get_user($a,$item));
$status = array(
'created_at'=> api_date($item['created']),
'published' => datetime_convert('UTC','UTC',$item['created'],ATOM_TIME),
'updated' => datetime_convert('UTC','UTC',$item['edited'],ATOM_TIME),
- 'id' => $item['id'],
+ 'id' => intval($item['id']),
+ 'message_id' => $item['uri'],
'text' => strip_tags(bbcode($item['body'])),
- 'html' => bbcode($item['body']),
+ 'statusnet_html' => bbcode($item['body']),
'source' => (($item['app']) ? $item['app'] : 'web'),
'url' => ($item['plink']!=''?$item['plink']:$item['author-link']),
'truncated' => False,
- 'in_reply_to_status_id' => ($item['parent']!=$item['id']?$item['parent']:''),
+ 'in_reply_to_status_id' => ($item['parent']!=$item['id']? intval($item['parent']):''),
'in_reply_to_user_id' => '',
- 'favorited' => false,
+ 'favorited' => $item['starred'] ? true : false,
'in_reply_to_screen_name' => '',
'geo' => '',
'coordinates' => $item['coord'],
@@ -514,28 +755,16 @@
'annotations' => '',
'entities' => '',
'user' => $status_user ,
- 'objecttype' => $item['object-type'],
- 'verb' => $item['verb'],
- 'self' => $a->get_baseurl()."/api/statuses/show/".$ite['id'].".".$type,
- 'edit' => $a->get_baseurl()."/api/statuses/show/".$ite['id'].".".$type,
+ 'objecttype' => (($item['object-type']) ? $item['object-type'] : ACTIVITY_OBJ_NOTE),
+ 'verb' => (($item['verb']) ? $item['verb'] : ACTIVITY_POST),
+ 'self' => $a->get_baseurl()."/api/statuses/show/".$item['id'].".".$type,
+ 'edit' => $a->get_baseurl()."/api/statuses/show/".$item['id'].".".$type,
);
$ret[]=$status;
};
-
- $data = array('$statuses' => $ret);
- switch($type){
- case "atom":
- case "rss":
- $data = api_rss_extra($a, $data, $user_info);
- }
-
- return api_apply_template("timeline", $type, $data);
+ return $ret;
}
- api_register_func('api/statuses/home_timeline','api_statuses_home_timeline', true);
- api_register_func('api/statuses/friends_timeline','api_statuses_home_timeline', true);
- api_register_func('api/statuses/user_timeline','api_statuses_home_timeline', true);
- # TODO: user_timeline should be profile view
-
+
function api_account_rate_limit_status(&$a,$type) {
@@ -550,3 +779,93 @@
}
api_register_func('api/account/rate_limit_status','api_account_rate_limit_status',true);
+
+
+ function api_statusnet_config(&$a,$type) {
+ $name = $a->config['sitename'];
+ $server = $a->get_hostname();
+ $logo = $a->get_baseurl() . '/images/friendika-64.png';
+ $email = $a->config['admin_email'];
+ $closed = (($a->config['register_policy'] == REGISTER_CLOSED) ? 'true' : 'false');
+ $private = (($a->config['system']['block_public']) ? 'true' : 'false');
+ $textlimit = (string) (($a->config['max_import_size']) ? $a->config['max_import_size'] : 200000);
+ if($a->config['api_import_size'])
+ $texlimit = string($a->config['api_import_size']);
+ $ssl = (($a->config['system']['have_ssl']) ? 'true' : 'false');
+ $sslserver = (($ssl === 'true') ? str_replace('http:','https:',$a->get_baseurl()) : '');
+
+ $config = array(
+ 'site' => array('name' => $name,'server' => $server, 'theme' => 'default', 'path' => '',
+ 'logo' => $logo, 'fancy' => 'true', 'language' => 'en', 'email' => $email, 'broughtby' => '',
+ 'broughtbyurl' => '', 'timezone' => 'UTC', 'closed' => $closed, 'inviteonly' => 'false',
+ 'private' => $private, 'textlimit' => $textlimit, 'sslserver' => $sslserver, 'ssl' => $ssl,
+ 'shorturllength' => '30'
+ ),
+ );
+
+ return api_apply_template('config', $type, array('$config' => $config));
+
+ }
+ api_register_func('api/statusnet/config','api_statusnet_config',false);
+
+
+ function api_statusnet_version(&$a,$type) {
+
+ // liar
+
+ if($type === 'xml') {
+ header("Content-type: application/xml");
+ echo '<?xml version="1.0" encoding="UTF-8"?>' . "\r\n" . '<version>0.9.7</version>' . "\r\n";
+ killme();
+ }
+ elseif($type === 'json') {
+ header("Content-type: application/json");
+ echo '"0.9.7"';
+ killme();
+ }
+ }
+ api_register_func('api/statusnet/version','api_statusnet_version',false);
+
+
+ function api_ff_ids(&$a,$type,$qtype) {
+ if(! local_user())
+ return false;
+
+ if($qtype == 'friends')
+ $sql_extra = sprintf(" AND ( `rel` = %d OR `rel` = %d ) ", intval(CONTACT_IS_SHARING), intval(CONTACT_IS_FRIEND));
+ if($qtype == 'followers')
+ $sql_extra = sprintf(" AND ( `rel` = %d OR `rel` = %d ) ", intval(CONTACT_IS_FOLLOWER), intval(CONTACT_IS_FRIEND));
+
+
+ $r = q("SELECT id FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 $sql_extra",
+ intval(local_user())
+ );
+
+ if(is_array($r)) {
+ if($type === 'xml') {
+ header("Content-type: application/xml");
+ echo '<?xml version="1.0" encoding="UTF-8"?>' . "\r\n" . '<ids>' . "\r\n";
+ foreach($r as $rr)
+ echo '<id>' . $rr['id'] . '</id>' . "\r\n";
+ echo '</ids>' . "\r\n";
+ killme();
+ }
+ elseif($type === 'json') {
+ $ret = array();
+ header("Content-type: application/json");
+ foreach($r as $rr) $ret[] = $rr['id'];
+ echo json_encode($ret);
+ killme();
+ }
+ }
+ }
+
+ function api_friends_ids(&$a,$type) {
+ api_ff_ids($a,$type,'friends');
+ }
+ function api_followers_ids(&$a,$type) {
+ api_ff_ids($a,$type,'followers');
+ }
+ api_register_func('api/friends/ids','api_friends_ids',true);
+ api_register_func('api/followers/ids','api_followers_ids',true);
+
diff --git a/include/attach.php b/include/attach.php
index ca53081d9..4001d2af1 100644
--- a/include/attach.php
+++ b/include/attach.php
@@ -1,7 +1,7 @@
<?php
-if(!function_exists('mime_content_type')) {
-function mime_content_type($filename) {
+
+function z_mime_content_type($filename) {
$mime_types = array(
@@ -61,8 +61,9 @@ function mime_content_type($filename) {
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
);
- if(strpos($filename,'.') !== false) {
- $ext = strtolower(array_pop(explode('.',$filename)));
+ $dot = strpos($filename,'.');
+ if($dot !== false) {
+ $ext = strtolower(substr($filename,$dot+1));
if (array_key_exists($ext, $mime_types)) {
return $mime_types[$ext];
}
@@ -76,5 +77,5 @@ function mime_content_type($filename) {
else {
return 'application/octet-stream';
}
-}}
+}
diff --git a/include/auth.php b/include/auth.php
index d1eb9d131..768af626f 100644
--- a/include/auth.php
+++ b/include/auth.php
@@ -25,7 +25,7 @@ if((isset($_SESSION)) && (x($_SESSION,'authenticated')) && ((! (x($_POST,'auth-p
nuke_session();
info( t('Logged out.') . EOL);
- goaway($a->get_baseurl());
+ goaway(z_root());
}
if(x($_SESSION,'visitor_id') && (! x($_SESSION,'uid'))) {
@@ -45,7 +45,7 @@ if((isset($_SESSION)) && (x($_SESSION,'authenticated')) && ((! (x($_POST,'auth-p
// extra paranoia - if the IP changed, log them out
if($check && ($_SESSION['addr'] != $_SERVER['REMOTE_ADDR'])) {
nuke_session();
- goaway($a->get_baseurl());
+ goaway(z_root());
}
$r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
@@ -54,7 +54,7 @@ if((isset($_SESSION)) && (x($_SESSION,'authenticated')) && ((! (x($_POST,'auth-p
if(! count($r)) {
nuke_session();
- goaway($a->get_baseurl());
+ goaway(z_root());
}
// initialise user environment
@@ -118,7 +118,7 @@ else {
if(($noid) || (strpos($temp_string,'@')) || (! validate_url($temp_string))) {
$a = get_app();
notice( t('Login failed.') . EOL);
- goaway($a->get_baseurl());
+ goaway(z_root());
// NOTREACHED
}
@@ -143,7 +143,7 @@ else {
if($a->config['register_policy'] == REGISTER_CLOSED) {
$a = get_app();
notice( t('Login failed.') . EOL);
- goaway($a->get_baseurl());
+ goaway(z_root());
// NOTREACHED
}
// new account
@@ -196,7 +196,7 @@ else {
if((! $record) || (! count($record))) {
logger('authenticate: failed login attempt: ' . trim($_POST['openid_url']));
notice( t('Login failed.') . EOL );
- goaway($a->get_baseurl());
+ goaway(z_root());
}
$_SESSION['uid'] = $record['uid'];
diff --git a/include/config.php b/include/config.php
new file mode 100644
index 000000000..f565ab117
--- /dev/null
+++ b/include/config.php
@@ -0,0 +1,218 @@
+<?php
+
+/**
+ *
+ * Arbitrary configuration storage
+ * Note:
+ * Please do not store booleans - convert to 0/1 integer values
+ * The get_?config() functions return boolean false for keys that are unset,
+ * and this could lead to subtle bugs.
+ *
+ * There are a few places in the code (such as the admin panel) where boolean
+ * configurations need to be fixed as of 10/08/2011.
+ */
+
+
+// retrieve a "family" of config variables from database to cached storage
+
+if(! function_exists('load_config')) {
+function load_config($family) {
+ global $a;
+ $r = q("SELECT * FROM `config` WHERE `cat` = '%s'",
+ dbesc($family)
+ );
+ if(count($r)) {
+ foreach($r as $rr) {
+ $k = $rr['k'];
+ if ($rr['cat'] === 'config') {
+ $a->config[$k] = $rr['v'];
+ } else {
+ $a->config[$family][$k] = $rr['v'];
+ }
+ }
+ }
+}}
+
+// get a particular config variable given the family name
+// and key. Returns false if not set.
+// $instore is only used by the set_config function
+// to determine if the key already exists in the DB
+// If a key is found in the DB but doesn't exist in
+// local config cache, pull it into the cache so we don't have
+// to hit the DB again for this item.
+
+if(! function_exists('get_config')) {
+function get_config($family, $key, $instore = false) {
+
+ global $a;
+
+ if(! $instore) {
+ if(isset($a->config[$family][$key])) {
+ if($a->config[$family][$key] === '!<unset>!') {
+ return false;
+ }
+ return $a->config[$family][$key];
+ }
+ }
+ $ret = q("SELECT `v` FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
+ dbesc($family),
+ dbesc($key)
+ );
+ if(count($ret)) {
+ // manage array value
+ $val = (preg_match("|^a:[0-9]+:{.*}$|", $ret[0]['v'])?unserialize( $ret[0]['v']):$ret[0]['v']);
+ $a->config[$family][$key] = $val;
+ return $val;
+ }
+ else {
+ $a->config[$family][$key] = '!<unset>!';
+ }
+ return false;
+}}
+
+// Store a config value ($value) in the category ($family)
+// under the key ($key)
+// Return the value, or false if the database update failed
+
+if(! function_exists('set_config')) {
+function set_config($family,$key,$value) {
+ global $a;
+
+ // manage array value
+ $dbvalue = (is_array($value)?serialize($value):$value);
+
+ if(get_config($family,$key,true) === false) {
+ $a->config[$family][$key] = $value;
+ $ret = q("INSERT INTO `config` ( `cat`, `k`, `v` ) VALUES ( '%s', '%s', '%s' ) ",
+ dbesc($family),
+ dbesc($key),
+ dbesc($dbvalue)
+ );
+ if($ret)
+ return $value;
+ return $ret;
+ }
+
+ $ret = q("UPDATE `config` SET `v` = '%s' WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
+ dbesc($dbvalue),
+ dbesc($family),
+ dbesc($key)
+ );
+
+ $a->config[$family][$key] = $value;
+
+ if($ret)
+ return $value;
+ return $ret;
+}}
+
+
+if(! function_exists('load_pconfig')) {
+function load_pconfig($uid,$family) {
+ global $a;
+ $r = q("SELECT * FROM `pconfig` WHERE `cat` = '%s' AND `uid` = %d",
+ dbesc($family),
+ intval($uid)
+ );
+ if(count($r)) {
+ foreach($r as $rr) {
+ $k = $rr['k'];
+ $a->config[$uid][$family][$k] = $rr['v'];
+ }
+ }
+}}
+
+
+
+if(! function_exists('get_pconfig')) {
+function get_pconfig($uid,$family, $key, $instore = false) {
+
+ global $a;
+
+ if(! $instore) {
+ if(isset($a->config[$uid][$family][$key])) {
+ if($a->config[$uid][$family][$key] === '!<unset>!') {
+ return false;
+ }
+ return $a->config[$uid][$family][$key];
+ }
+ }
+
+ $ret = q("SELECT `v` FROM `pconfig` WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' LIMIT 1",
+ intval($uid),
+ dbesc($family),
+ dbesc($key)
+ );
+
+ if(count($ret)) {
+ $a->config[$uid][$family][$key] = $ret[0]['v'];
+ return $ret[0]['v'];
+ }
+ else {
+ $a->config[$uid][$family][$key] = '!<unset>!';
+ }
+ return false;
+}}
+
+if(! function_exists('del_config')) {
+function del_config($family,$key) {
+
+ global $a;
+ if(x($a->config[$family],$key))
+ unset($a->config[$family][$key]);
+ $ret = q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
+ dbesc($cat),
+ dbesc($key)
+ );
+ return $ret;
+}}
+
+
+
+// Same as above functions except these are for personal config storage and take an
+// additional $uid argument.
+
+if(! function_exists('set_pconfig')) {
+function set_pconfig($uid,$family,$key,$value) {
+
+ global $a;
+
+ if(get_pconfig($uid,$family,$key,true) === false) {
+ $a->config[$uid][$family][$key] = $value;
+ $ret = q("INSERT INTO `pconfig` ( `uid`, `cat`, `k`, `v` ) VALUES ( %d, '%s', '%s', '%s' ) ",
+ intval($uid),
+ dbesc($family),
+ dbesc($key),
+ dbesc($value)
+ );
+ if($ret)
+ return $value;
+ return $ret;
+ }
+ $ret = q("UPDATE `pconfig` SET `v` = '%s' WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' LIMIT 1",
+ dbesc($value),
+ intval($uid),
+ dbesc($family),
+ dbesc($key)
+ );
+
+ $a->config[$uid][$family][$key] = $value;
+
+ if($ret)
+ return $value;
+ return $ret;
+}}
+
+if(! function_exists('del_pconfig')) {
+function del_pconfig($uid,$family,$key) {
+
+ global $a;
+ if(x($a->config[$uid][$family],$key))
+ unset($a->config[$uid][$family][$key]);
+ $ret = q("DELETE FROM `pconfig` WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' LIMIT 1",
+ intval($uid),
+ dbesc($family),
+ dbesc($key)
+ );
+ return $ret;
+}}
diff --git a/include/conversation.php b/include/conversation.php
index 82a107c07..0d901a3c0 100644
--- a/include/conversation.php
+++ b/include/conversation.php
@@ -283,14 +283,14 @@ function conversation(&$a, $items, $mode, $update) {
continue;
$toplevelpost = (($item['id'] == $item['parent']) ? true : false);
-
+ $toplevelprivate = false;
// Take care of author collapsing and comment collapsing
// If a single author has more than 3 consecutive top-level posts, squash the remaining ones.
// If there are more than two comments, squash all but the last 2.
-
+
if($toplevelpost) {
-
+ $toplevelprivate = (($toplevelpost && $item['private']) ? true : false);
$item_writeable = (($item['writable'] || $item['self']) ? true : false);
if($blowhard == $item['cid'] && (! $item['self']) && ($mode != 'profile') && ($mode != 'notes')) {
@@ -312,9 +312,12 @@ function conversation(&$a, $items, $mode, $update) {
$comments_seen = 0;
$comments_collapsed = false;
}
- else
+ else {
+ // prevent private email from leaking into public conversation
+ if((! $toplevelpost) && (! toplevelprivate) && ($item['private']) && ($profile_owner != local_user()))
+ continue;
$comments_seen ++;
-
+ }
$override_comment_box = ((($page_writeable) && ($item_writeable)) ? true : false);
$show_comment_box = ((($page_writeable) && ($item_writeable) && ($comments_seen == $comments[$item['parent']])) ? true : false);
@@ -347,7 +350,7 @@ function conversation(&$a, $items, $mode, $update) {
if(($toplevelpost) && (! $item['self']) && ($mode !== 'profile')) {
- if($item['type'] === 'wall') {
+ if($item['wall']) {
// On the network page, I am the owner. On the display page it will be the profile owner.
// This will have been stored in $a->page_contact by our calling page.
@@ -359,7 +362,7 @@ function conversation(&$a, $items, $mode, $update) {
$template = $wallwall;
$commentww = 'ww';
}
- if(($item['type'] === 'remote') && (strlen($item['owner-link'])) && ($item['owner-link'] != $item['author-link'])) {
+ if((! $item['wall']) && (strlen($item['owner-link'])) && ($item['owner-link'] != $item['author-link'])) {
// Could be anybody.
@@ -444,7 +447,7 @@ function conversation(&$a, $items, $mode, $update) {
$profile_link = '';
$normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']);
- if(($normalised != 'mailbox') && (x($a->contacts[$normalised])))
+ if(($normalised != 'mailbox') && (x($a->contacts,$normalised)))
$profile_avatar = $a->contacts[$normalised]['thumb'];
else
$profile_avatar = (((strlen($item['author-avatar'])) && $diff_author) ? $item['author-avatar'] : $thumb);
@@ -533,33 +536,6 @@ function conversation(&$a, $items, $mode, $update) {
return $o;
}
-
-if(! function_exists('load_contact_links')) {
-function load_contact_links($uid) {
-
- $a = get_app();
-
- $ret = array();
-
- if(! $uid || x($a->contacts,'empty'))
- return;
-
- $r = q("SELECT `id`,`network`,`url`,`thumb` FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 ",
- intval($uid)
- );
- if(count($r)) {
- foreach($r as $rr){
- $url = normalise_link($rr['url']);
- $ret[$url] = $rr;
- }
- }
- else
- $ret['empty'] = true;
- $a->contacts = $ret;
- return;
-}}
-
-
function best_link_url($item,&$sparkle) {
$a = get_app();
diff --git a/include/cronhooks.php b/include/cronhooks.php
new file mode 100644
index 000000000..37541f013
--- /dev/null
+++ b/include/cronhooks.php
@@ -0,0 +1,43 @@
+<?php
+
+require_once("boot.php");
+
+
+function cronhooks_run($argv, $argc){
+ global $a, $db;
+
+ if(is_null($a)) {
+ $a = new App;
+ }
+
+ if(is_null($db)) {
+ @include(".htconfig.php");
+ require_once("dba.php");
+ $db = new dba($db_host, $db_user, $db_pass, $db_data);
+ unset($db_host, $db_user, $db_pass, $db_data);
+ };
+
+ require_once('include/session.php');
+ require_once('include/datetime.php');
+
+ load_config('config');
+ load_config('system');
+
+ $a->set_baseurl(get_config('system','url'));
+
+ load_hooks();
+
+ logger('cronhooks: start');
+
+
+ $d = datetime_convert();
+
+ call_hooks('cron', $d);
+
+ return;
+}
+
+if (array_search(__file__,get_included_files())===0){
+ cronhooks_run($argv,$argc);
+ killme();
+}
diff --git a/include/crypto.php b/include/crypto.php
new file mode 100644
index 000000000..1ab9e7b25
--- /dev/null
+++ b/include/crypto.php
@@ -0,0 +1,184 @@
+<?php
+
+require_once('library/ASNValue.class.php');
+require_once('library/asn1.php');
+
+
+function rsa_sign($data,$key) {
+
+ $sig = '';
+ if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
+ openssl_sign($data,$sig,$key,'sha256');
+ }
+ else {
+ if(strlen($key) < 1024 || extension_loaded('gmp')) {
+ require_once('library/phpsec/Crypt/RSA.php');
+ $rsa = new CRYPT_RSA();
+ $rsa->signatureMode = CRYPT_RSA_SIGNATURE_PKCS1;
+ $rsa->setHash('sha256');
+ $rsa->loadKey($key);
+ $sig = $rsa->sign($data);
+ }
+ else {
+ logger('rsa_sign: insecure algorithm used. Please upgrade PHP to 5.3');
+ openssl_private_encrypt(hex2bin('3031300d060960864801650304020105000420') . hash('sha256',$data,true), $sig, $key);
+ }
+ }
+ return $sig;
+}
+
+function rsa_verify($data,$sig,$key) {
+
+ if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
+ $verify = openssl_verify($data,$sig,$key,'sha256');
+ }
+ else {
+ if(strlen($key) <= 300 || extension_loaded('gmp')) {
+ require_once('library/phpsec/Crypt/RSA.php');
+ $rsa = new CRYPT_RSA();
+ $rsa->signatureMode = CRYPT_RSA_SIGNATURE_PKCS1;
+ $rsa->setHash('sha256');
+ $rsa->loadKey($key);
+ $verify = $rsa->verify($data,$sig);
+ }
+ else {
+ // fallback sha256 verify for PHP < 5.3 and large key lengths
+ $rawsig = '';
+ openssl_public_decrypt($sig,$rawsig,$key);
+ $verify = (($rawsig && substr($rawsig,-32) === hash('sha256',$data,true)) ? true : false);
+ }
+ }
+ return $verify;
+}
+
+
+function DerToPem($Der, $Private=false)
+{
+ //Encode:
+ $Der = base64_encode($Der);
+ //Split lines:
+ $lines = str_split($Der, 65);
+ $body = implode("\n", $lines);
+ //Get title:
+ $title = $Private? 'RSA PRIVATE KEY' : 'PUBLIC KEY';
+ //Add wrapping:
+ $result = "-----BEGIN {$title}-----\n";
+ $result .= $body . "\n";
+ $result .= "-----END {$title}-----\n";
+
+ return $result;
+}
+
+function DerToRsa($Der)
+{
+ //Encode:
+ $Der = base64_encode($Der);
+ //Split lines:
+ $lines = str_split($Der, 65);
+ $body = implode("\n", $lines);
+ //Get title:
+ $title = 'RSA PUBLIC KEY';
+ //Add wrapping:
+ $result = "-----BEGIN {$title}-----\n";
+ $result .= $body . "\n";
+ $result .= "-----END {$title}-----\n";
+
+ return $result;
+}
+
+
+function pkcs8_encode($Modulus,$PublicExponent) {
+ //Encode key sequence
+ $modulus = new ASNValue(ASNValue::TAG_INTEGER);
+ $modulus->SetIntBuffer($Modulus);
+ $publicExponent = new ASNValue(ASNValue::TAG_INTEGER);
+ $publicExponent->SetIntBuffer($PublicExponent);
+ $keySequenceItems = array($modulus, $publicExponent);
+ $keySequence = new ASNValue(ASNValue::TAG_SEQUENCE);
+ $keySequence->SetSequence($keySequenceItems);
+ //Encode bit string
+ $bitStringValue = $keySequence->Encode();
+ $bitStringValue = chr(0x00) . $bitStringValue; //Add unused bits byte
+ $bitString = new ASNValue(ASNValue::TAG_BITSTRING);
+ $bitString->Value = $bitStringValue;
+ //Encode body
+ $bodyValue = "\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01\x05\x00" . $bitString->Encode();
+ $body = new ASNValue(ASNValue::TAG_SEQUENCE);
+ $body->Value = $bodyValue;
+ //Get DER encoded public key:
+ $PublicDER = $body->Encode();
+ return $PublicDER;
+}
+
+
+function pkcs1_encode($Modulus,$PublicExponent) {
+ //Encode key sequence
+ $modulus = new ASNValue(ASNValue::TAG_INTEGER);
+ $modulus->SetIntBuffer($Modulus);
+ $publicExponent = new ASNValue(ASNValue::TAG_INTEGER);
+ $publicExponent->SetIntBuffer($PublicExponent);
+ $keySequenceItems = array($modulus, $publicExponent);
+ $keySequence = new ASNValue(ASNValue::TAG_SEQUENCE);
+ $keySequence->SetSequence($keySequenceItems);
+ //Encode bit string
+ $bitStringValue = $keySequence->Encode();
+ return $bitStringValue;
+}
+
+
+function metopem($m,$e) {
+ $der = pkcs8_encode($m,$e);
+ $key = DerToPem($der,false);
+ return $key;
+}
+
+
+function pubrsatome($key,&$m,&$e) {
+ require_once('library/asn1.php');
+ require_once('include/salmon.php');
+
+ $lines = explode("\n",$key);
+ unset($lines[0]);
+ unset($lines[count($lines)]);
+ $x = base64_decode(implode('',$lines));
+
+ $r = ASN_BASE::parseASNString($x);
+
+ $m = base64url_decode($r[0]->asnData[0]->asnData);
+ $e = base64url_decode($r[0]->asnData[1]->asnData);
+}
+
+
+function rsatopem($key) {
+ pubrsatome($key,$m,$e);
+ return(metopem($m,$e));
+}
+
+function pemtorsa($key) {
+ pemtome($key,$m,$e);
+ return(metorsa($m,$e));
+}
+
+function pemtome($key,&$m,&$e) {
+ require_once('include/salmon.php');
+ $lines = explode("\n",$key);
+ unset($lines[0]);
+ unset($lines[count($lines)]);
+ $x = base64_decode(implode('',$lines));
+
+ $r = ASN_BASE::parseASNString($x);
+
+ $m = base64url_decode($r[0]->asnData[1]->asnData[0]->asnData[0]->asnData);
+ $e = base64url_decode($r[0]->asnData[1]->asnData[0]->asnData[1]->asnData);
+}
+
+function metorsa($m,$e) {
+ $der = pkcs1_encode($m,$e);
+ $key = DerToRsa($der);
+ return $key;
+}
+
+function salmon_key($pubkey) {
+ pemtome($pubkey,$m,$e);
+ return 'RSA' . '.' . base64url_encode($m,true) . '.' . base64url_encode($e,true) ;
+}
diff --git a/include/datetime.php b/include/datetime.php
index a056eaa60..3033b88af 100644
--- a/include/datetime.php
+++ b/include/datetime.php
@@ -84,12 +84,47 @@ function datetime_convert($from = 'UTC', $to = 'UTC', $s = 'now', $fmt = "Y-m-d
function dob($dob) {
list($year,$month,$day) = sscanf($dob,'%4d-%2d-%2d');
$y = datetime_convert('UTC',date_default_timezone_get(),'now','Y');
- $o = datesel('',1920,$y,true,$year,$month,$day);
+ $f = get_config('system','birthday_input_format');
+ if(! $f)
+ $f = 'ymd';
+ $o = datesel($f,'',1920,$y,true,$year,$month,$day);
+ return $o;
+}
+
+
+function datesel_format($f) {
+
+ $o = '';
+
+ if(strlen($f)) {
+ for($x = 0; $x < strlen($f); $x ++) {
+ switch($f[$x]) {
+ case 'y':
+ if(strlen($o))
+ $o .= '-';
+ $o .= t('year');
+ break;
+ case 'm':
+ if(strlen($o))
+ $o .= '-';
+ $o .= t('month');
+ break;
+ case 'd':
+ if(strlen($o))
+ $o .= '-';
+ $o .= t('day');
+ break;
+ default:
+ break;
+ }
+ }
+ }
return $o;
}
// returns a date selector.
+// $f = format string, e.g. 'ymd' or 'mdy'
// $pre = prefix (if needed) for HTML name and class fields
// $ymin = first year shown in selector dropdown
// $ymax = last year shown in selector dropdown
@@ -99,40 +134,52 @@ function dob($dob) {
// $d = already selected day
if(! function_exists('datesel')) {
-function datesel($pre,$ymin,$ymax,$allow_blank,$y,$m,$d) {
+function datesel($f,$pre,$ymin,$ymax,$allow_blank,$y,$m,$d) {
$o = '';
- $o .= "<select name=\"{$pre}year\" class=\"{$pre}year\" size=\"1\">";
- if($allow_blank) {
- $sel = (($y == '0000') ? " selected=\"selected\" " : "");
- $o .= "<option value=\"0000\" $sel ></option>";
- }
- if($ymax > $ymin) {
- for($x = $ymax; $x >= $ymin; $x --) {
- $sel = (($x == $y) ? " selected=\"selected\" " : "");
- $o .= "<option value=\"$x\" $sel>$x</option>";
- }
- }
- else {
- for($x = $ymax; $x <= $ymin; $x ++) {
- $sel = (($x == $y) ? " selected=\"selected\" " : "");
- $o .= "<option value=\"$x\" $sel>$x</option>";
- }
- }
+ if(strlen($f)) {
+ for($z = 0; $z < strlen($f); $z ++) {
+ if($f[$z] === 'y') {
+
+ $o .= "<select name=\"{$pre}year\" class=\"{$pre}year\" size=\"1\">";
+ if($allow_blank) {
+ $sel = (($y == '0000') ? " selected=\"selected\" " : "");
+ $o .= "<option value=\"0000\" $sel ></option>";
+ }
+
+ if($ymax > $ymin) {
+ for($x = $ymax; $x >= $ymin; $x --) {
+ $sel = (($x == $y) ? " selected=\"selected\" " : "");
+ $o .= "<option value=\"$x\" $sel>$x</option>";
+ }
+ }
+ else {
+ for($x = $ymax; $x <= $ymin; $x ++) {
+ $sel = (($x == $y) ? " selected=\"selected\" " : "");
+ $o .= "<option value=\"$x\" $sel>$x</option>";
+ }
+ }
+ }
+ elseif($f[$z] == 'm') {
- $o .= "</select> <select name=\"{$pre}month\" class=\"{$pre}month\" size=\"1\">";
- for($x = (($allow_blank) ? 0 : 1); $x <= 12; $x ++) {
- $sel = (($x == $m) ? " selected=\"selected\" " : "");
- $y = (($x) ? $x : '');
- $o .= "<option value=\"$x\" $sel>$y</option>";
- }
-
- $o .= "</select> <select name=\"{$pre}day\" class=\"{$pre}day\" size=\"1\">";
- for($x = (($allow_blank) ? 0 : 1); $x <= 31; $x ++) {
- $sel = (($x == $d) ? " selected=\"selected\" " : "");
- $y = (($x) ? $x : '');
- $o .= "<option value=\"$x\" $sel>$y</option>";
+ $o .= "</select> <select name=\"{$pre}month\" class=\"{$pre}month\" size=\"1\">";
+ for($x = (($allow_blank) ? 0 : 1); $x <= 12; $x ++) {
+ $sel = (($x == $m) ? " selected=\"selected\" " : "");
+ $y = (($x) ? $x : '');
+ $o .= "<option value=\"$x\" $sel>$y</option>";
+ }
+ }
+ elseif($f[$z] == 'd') {
+
+ $o .= "</select> <select name=\"{$pre}day\" class=\"{$pre}day\" size=\"1\">";
+ for($x = (($allow_blank) ? 0 : 1); $x <= 31; $x ++) {
+ $sel = (($x == $d) ? " selected=\"selected\" " : "");
+ $y = (($x) ? $x : '');
+ $o .= "<option value=\"$x\" $sel>$y</option>";
+ }
+ }
+ }
}
$o .= "</select>";
diff --git a/include/diaspora.php b/include/diaspora.php
new file mode 100644
index 000000000..e089e3f04
--- /dev/null
+++ b/include/diaspora.php
@@ -0,0 +1,815 @@
+<?php
+
+require_once('include/crypto.php');
+require_once('include/items.php');
+
+function get_diaspora_key($uri) {
+ $key = '';
+
+ logger('Fetching diaspora key for: ' . $uri);
+
+ $arr = lrdd($uri);
+
+ if(is_array($arr)) {
+ foreach($arr as $a) {
+ if($a['@attributes']['rel'] === 'diaspora-public-key') {
+ $key = base64_decode($a['@attributes']['href']);
+ }
+ }
+ }
+ else {
+ return '';
+ }
+
+ if($key)
+ return rsatopem($key);
+ return '';
+}
+
+
+function diaspora_base_message($type,$data) {
+
+ $tpl = get_markup_template('diaspora_' . $type . '.tpl');
+ if(! $tpl)
+ return '';
+ return replace_macros($tpl,$data);
+
+}
+
+
+function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey) {
+ $a = get_app();
+
+ $inner_aes_key = random_string(32);
+ $b_inner_aes_key = base64_encode($inner_aes_key);
+ $inner_iv = random_string(32);
+ $b_inner_iv = base64_encode($inner_iv);
+
+ $outer_aes_key = random_string(32);
+ $b_outer_aes_key = base64_encode($outer_aes_key);
+ $outer_iv = random_string(32);
+ $b_outer_iv = base64_encode($outer_iv);
+
+ $handle = 'acct:' . $user['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
+
+ $padded_data = pkcs5_pad($msg,16);
+ $inner_encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $inner_aes_key, $padded_data, MCRYPT_MODE_CBC, $inner_iv);
+
+ $b64_data = base64_encode($inner_encrypted);
+
+
+ $b64url_data = base64url_encode($b64_data);
+ $b64url_stripped = str_replace(array("\n","\r"," ","\t"),array('','','',''),$b64url_data);
+ $lines = str_split($b64url_stripped,60);
+ $data = implode("\n",$lines);
+ $data = $data . (($data[-1] != "\n") ? "\n" : '') ;
+ $type = 'application/atom+xml';
+ $encoding = 'base64url';
+ $alg = 'RSA-SHA256';
+
+ $signable_data = $data . '.' . base64url_encode($type) . "\n" . '.'
+ . base64url_encode($encoding) . "\n" . '.' . base64url_encode($alg) . "\n";
+
+ $signature = rsa_sign($signable_data,$prvkey);
+ $sig = base64url_encode($signature);
+
+$decrypted_header = <<< EOT
+<decrypted_header>
+ <iv>$b_inner_iv</iv>
+ <aes_key>$b_inner_aes_key</aes_key>
+ <author>
+ <name>{$user['username']}</name>
+ <uri>$handle</uri>
+ </author>
+</decrypted_header>
+EOT;
+
+ $decrypted_header = pkcs5_pad($decrypted_header,16);
+
+ $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $outer_aes_key, $decrypted_header, MCRYPT_MODE_CBC, $outer_iv);
+
+ $outer_json = json_encode(array('iv' => $b_outer_iv,'key' => $b_outer_aes_key));
+ $encrypted_outer_key_bundle = '';
+ openssl_public_encrypt($outer_json,$encrypted_outer_key_bundle,$pubkey);
+
+ $b64_encrypted_outer_key_bundle = base64_encode($encrypted_outer_key_bundle);
+ $encrypted_header_json_object = json_encode(array('aes_key' => base64_encode($encrypted_outer_key_bundle),
+ 'ciphertext' => base64_encode($ciphertext)));
+ $encrypted_header = '<encrypted_header>' . base64_encode($encrypted_header_json_object) . '</encrypted_header>';
+
+$magic_env = <<< EOT
+<?xml version='1.0' encoding='UTF-8'?>
+<entry xmlns='http://www.w3.org/2005/Atom'>
+ $encrypted_header
+ <me:env xmlns:me="http://salmon-protocol.org/ns/magic-env">
+ <me:encoding>base64url</me:encoding>
+ <me:alg>RSA-SHA256</me:alg>
+ <me:data type="application/atom+xml">$data</me:data>
+ <me:sig>$sig</me:sig>
+ </me:env>
+</entry>
+EOT;
+
+ return $magic_env;
+
+}
+
+/**
+ *
+ * diaspora_decode($importer,$xml)
+ * array $importer -> from user table
+ * string $xml -> urldecoded Diaspora salmon
+ *
+ * Returns array
+ * 'message' -> decoded Diaspora XML message
+ * 'author' -> author diaspora handle
+ * 'key' -> author public key (converted to pkcs#8)
+ *
+ * Author and key are used elsewhere to save a lookup for verifying replies and likes
+ */
+
+
+function diaspora_decode($importer,$xml) {
+
+ $basedom = parse_xml_string($xml);
+
+ $atom = $basedom->children(NAMESPACE_ATOM1);
+
+ // Diaspora devs: This is kind of sucky - 'encrypted_header' does not belong in the atom namespace
+
+ $encrypted_header = json_decode(base64_decode($atom->encrypted_header));
+
+ $encrypted_aes_key_bundle = base64_decode($encrypted_header->aes_key);
+ $ciphertext = base64_decode($encrypted_header->ciphertext);
+
+ $outer_key_bundle = '';
+ openssl_private_decrypt($encrypted_aes_key_bundle,$outer_key_bundle,$importer['prvkey']);
+
+ $j_outer_key_bundle = json_decode($outer_key_bundle);
+
+ $outer_iv = base64_decode($j_outer_key_bundle->iv);
+ $outer_key = base64_decode($j_outer_key_bundle->key);
+
+ $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $outer_key, $ciphertext, MCRYPT_MODE_CBC, $outer_iv);
+
+ $decrypted = pkcs5_unpad($decrypted);
+
+ /**
+ * $decrypted now contains something like
+ *
+ * <decrypted_header>
+ * <iv>8e+G2+ET8l5BPuW0sVTnQw==</iv>
+ * <aes_key>UvSMb4puPeB14STkcDWq+4QE302Edu15oaprAQSkLKU=</aes_key>
+ * <author>
+ * <name>Ryan Hughes</name>
+ * <uri>acct:galaxor@diaspora.pirateship.org</uri>
+ * </author>
+ * </decrypted_header>
+ */
+
+ logger('decrypted: ' . $decrypted);
+ $idom = parse_xml_string($decrypted,false);
+
+ $inner_iv = base64_decode($idom->iv);
+ $inner_aes_key = base64_decode($idom->aes_key);
+
+ $author_link = str_replace('acct:','',$idom->author->uri);
+
+ $dom = $basedom->children(NAMESPACE_SALMON_ME);
+
+ // figure out where in the DOM tree our data is hiding
+
+ if($dom->provenance->data)
+ $base = $dom->provenance;
+ elseif($dom->env->data)
+ $base = $dom->env;
+ elseif($dom->data)
+ $base = $dom;
+
+ if(! $base) {
+ logger('mod-diaspora: unable to locate salmon data in xml ');
+ http_status_exit(400);
+ }
+
+
+ // Stash the signature away for now. We have to find their key or it won't be good for anything.
+ $signature = base64url_decode($base->sig);
+
+ // unpack the data
+
+ // strip whitespace so our data element will return to one big base64 blob
+ $data = str_replace(array(" ","\t","\r","\n"),array("","","",""),$base->data);
+
+ // Add back the 60 char linefeeds
+
+ // Diaspora devs: This completely violates the entire principle of salmon magic signatures,
+ // which was to have a message signing format that was completely ambivalent to linefeeds
+ // and transport whitespace mangling, and base64 wrapping rules. Guess what? PHP and Ruby
+ // use different linelengths for base64 output.
+
+ $lines = str_split($data,60);
+ $data = implode("\n",$lines);
+
+
+ // stash away some other stuff for later
+
+ $type = $base->data[0]->attributes()->type[0];
+ $keyhash = $base->sig[0]->attributes()->keyhash[0];
+ $encoding = $base->encoding;
+ $alg = $base->alg;
+
+ // Diaspora devs: I can't even begin to tell you how sucky this is. Read the freaking spec.
+
+ $signed_data = $data . (($data[-1] != "\n") ? "\n" : '') . '.' . base64url_encode($type) . "\n" . '.' . base64url_encode($encoding) . "\n" . '.' . base64url_encode($alg) . "\n";
+
+
+ // decode the data
+ $data = base64url_decode($data);
+
+ // Now pull out the inner encrypted blob
+
+ $inner_encrypted = base64_decode($data);
+
+ $inner_decrypted =
+ $inner_decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $inner_aes_key, $inner_encrypted, MCRYPT_MODE_CBC, $inner_iv);
+
+ $inner_decrypted = pkcs5_unpad($inner_decrypted);
+
+ if(! $author_link) {
+ logger('mod-diaspora: Could not retrieve author URI.');
+ http_status_exit(400);
+ }
+
+ // Once we have the author URI, go to the web and try to find their public key
+ // *** or look it up locally ***
+
+ logger('mod-diaspora: Fetching key for ' . $author_link );
+
+ // Get diaspora public key (pkcs#1) and convert to pkcs#8
+
+ $key = get_diaspora_key($author_link);
+
+ if(! $key) {
+ logger('mod-diaspora: Could not retrieve author key.');
+ http_status_exit(400);
+ }
+
+ $verify = rsa_verify($signed_data,$signature,$key);
+
+ if(! $verify) {
+ logger('mod-diaspora: Message did not verify. Discarding.');
+ http_status_exit(400);
+ }
+
+ logger('mod-diaspora: Message verified.');
+
+ return array('message' => $inner_decrypted, 'author' => $author_link, 'key' => $key);
+
+}
+
+function diaspora_get_contact_by_handle($uid,$handle) {
+ $r = q("SELECT * FROM `contact` WHERE `network` = '%s' AND `uid` = %d AND `addr` = '%s' LIMIT 1",
+ dbesc(NETWORK_DIASPORA),
+ intval($uid),
+ dbesc($handle)
+ );
+ if($r && count($r))
+ return $r[0];
+ return false;
+}
+
+function find_person_by_handle($handle) {
+ // we don't care about the uid, we just want to save an expensive webfinger probe
+ $r = q("select * from contact where network = '%s' and addr = '%s' LIMIT 1",
+ dbesc(NETWORK_DIASPORA),
+ dbesc($handle)
+ );
+ if(count($r))
+ return $r[0];
+ $r = probe_url($handle);
+ // need to cached this, perhaps in fcontact
+ if(count($r))
+ return ($r);
+ return false;
+}
+
+function diaspora_request($importer,$xml) {
+
+ $sender_handle = unxmlify($xml->sender_handle);
+ $recipient_handle = unxmlify($xml->recipient_handle);
+
+ if(! $sender_handle || ! $recipient_handle)
+ return;
+
+ $contact = diaspora_get_contact_by_handle($importer['uid'],$sender_handle);
+
+
+ if($contact) {
+
+ // perhaps we were already sharing with this person. Now they're sharing with us.
+ // That makes us friends.
+
+ if($contact['rel'] == CONTACT_IS_FOLLOWER) {
+ q("UPDATE `contact` SET `rel` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval(CONTACT_IS_FRIEND),
+ intval($contact['id']),
+ intval($importer['uid'])
+ );
+ }
+ // send notification?
+ return;
+ }
+
+ require_once('include/Scrape.php');
+ $ret = probe_url($sender_handle);
+
+ if((! count($ret)) || ($ret['network'] != NETWORK_DIASPORA)) {
+ logger('diaspora_request: Cannot resolve diaspora handle ' . $sender_handle . ' for ' . $recipient_handle);
+ return;
+ }
+
+ $r = q("INSERT INTO `contact` (`uid`, `network`,`addr`,`created`,`url`,`name`,`nick`,`photo`,`pubkey`,`notify`,`poll`,`blocked`,`priority`)
+ VALUES ( %d, '%s', '%s', '%s','%s','%s','%s','%s','%s','%s','%s',%d,%d) ",
+ intval($importer['uid']),
+ dbesc($ret['network']),
+ dbesc($ret['addr']),
+ datetime_convert(),
+ dbesc($ret['url']),
+ dbesc($ret['name']),
+ dbesc($ret['nick']),
+ dbesc($ret['photo']),
+ dbesc($ret['pubkey']),
+ dbesc($ret['notify']),
+ dbesc($ret['poll']),
+ 1,
+ 2
+ );
+
+ // find the contact record we just created
+
+ $contact_record = diaspora_get_contact_by_handle($importer['uid'],$sender_handle);
+
+ $hash = random_string() . (string) time(); // Generate a confirm_key
+
+ if($contact_record) {
+ $ret = q("INSERT INTO `intro` ( `uid`, `contact-id`, `blocked`, `knowyou`, `note`, `hash`, `datetime`,`blocked`)
+ VALUES ( %d, %d, 1, %d, '%s', '%s', '%s', 0 )",
+ intval($importer['uid']),
+ intval($contact_record['id']),
+ 0,
+ dbesc( t('Sharing notification from Diaspora network')),
+ dbesc($hash),
+ dbesc(datetime_convert())
+ );
+ }
+
+ return;
+}
+
+function diaspora_post($importer,$xml) {
+
+ $guid = notags(unxmlify($xml->guid));
+ $diaspora_handle = notags(unxmlify($xml->diaspora_handle));
+
+ $contact = diaspora_get_contact_by_handle($importer['uid'],$diaspora_handle);
+ if(! $contact)
+ return;
+
+ if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) {
+ logger('diaspora_post: Ignoring this author.');
+ http_status_exit(202);
+ // NOTREACHED
+ }
+
+ $message_id = $diaspora_handle . ':' . $guid;
+ $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1",
+ intval($importer['uid']),
+ dbesc($message_id),
+ dbesc($guid)
+ );
+ if(count($r))
+ return;
+
+ // allocate a guid on our system - we aren't fixing any collisions.
+ // we're ignoring them
+
+ $g = q("select * from guid where guid = '%s' limit 1",
+ dbesc($guid)
+ );
+ if(! count($g)) {
+ q("insert into guid ( guid ) values ( '%s' )",
+ dbesc($guid)
+ );
+ }
+
+ $created = unxmlify($xml->created_at);
+ $private = ((unxmlify($xml->public) == 'false') ? 1 : 0);
+
+ $body = unxmlify($xml->raw_message);
+
+ require_once('library/HTMLPurifier.auto.php');
+ require_once('include/html2bbcode.php');
+
+ $maxlen = get_max_import_size();
+ if($maxlen && (strlen($body) > $maxlen))
+ $body = substr($body,0, $maxlen);
+
+ if((strpos($body,'<') !== false) || (strpos($body,'>') !== false)) {
+
+ $body = preg_replace('#<object[^>]+>.+?' . 'http://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?</object>#s',
+ '[youtube]$1[/youtube]', $body);
+
+ $body = preg_replace('#<iframe[^>].+?' . 'http://www.youtube.com/embed/([A-Za-z0-9\-_=]+).+?</iframe>#s',
+ '[youtube]$1[/youtube]', $body);
+
+ $body = oembed_html2bbcode($body);
+
+ $config = HTMLPurifier_Config::createDefault();
+ $config->set('Cache.DefinitionImpl', null);
+ $purifier = new HTMLPurifier($config);
+ $body = $purifier->purify($body);
+
+ $body = html2bbcode($body);
+ }
+
+ $datarray = array();
+ $datarray['uid'] = $importer['uid'];
+ $datarray['contact-id'] = $contact['id'];
+ $datarray['wall'] = 0;
+ $datarray['guid'] = $guid;
+ $datarray['uri'] = $datarray['parent-uri'] = $message_id;
+ $datarray['created'] = $datarray['edited'] = datetime_convert('UTC','UTC',$created);
+ $datarray['private'] = $private;
+ $datarray['parent'] = 0;
+ $datarray['owner-name'] = $contact['name'];
+ $datarray['owner-link'] = $contact['url'];
+ $datarray['owner-avatar'] = $contact['thumb'];
+ $datarray['author-name'] = $contact['name'];
+ $datarray['author-link'] = $contact['url'];
+ $datarray['author-avatar'] = $contact['thumb'];
+ $datarray['body'] = $body;
+
+ item_store($datarray);
+
+ return;
+
+}
+
+function diaspora_comment($importer,$xml,$msg) {
+
+ $guid = notags(unxmlify($xml->guid));
+ $parent_guid = notags(unxmlify($xml->parent_guid));
+ $diaspora_handle = notags(unxmlify($xml->diaspora_handle));
+ $target_type = notags(unxmlify($xml->target_type));
+ $text = unxmlify($xml->text);
+ $author_signature = notags(unxmlify($xml->author_signature));
+
+ $parent_author_signature = (($xml->parent_author_signature) ? notags(unxmlify($xml->parent_author_signature)) : '');
+
+ $text = $xml->text;
+
+ $contact = diaspora_get_contact_by_handle($importer['uid'],$msg['author']);
+ if(! $contact)
+ return;
+
+ if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) {
+ logger('diaspora_comment: Ignoring this author.');
+ http_status_exit(202);
+ // NOTREACHED
+ }
+
+ $r = q("SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
+ intval($importer['uid']),
+ dbesc($parent_guid)
+ );
+ if(! count($r)) {
+ logger('diaspora_comment: parent item not found: ' . $guid);
+ return;
+ }
+ $parent_item = $r[0];
+
+ $author_signed_data = $guid . ';' . $parent_guid . ';' . $text . ';' . $diaspora_handle;
+
+ $author_signature = base64_decode($author_signature);
+
+ if(stricmp($diaspora_handle,$msg['author']) == 0) {
+ $person = $contact;
+ $key = $msg['key'];
+ }
+ else {
+ $person = find_person_by_handle($diaspora_handle);
+
+ if(is_array($person) && x($person,'pubkey'))
+ $key = $person['pubkey'];
+ else {
+ logger('diaspora_comment: unable to find author details');
+ return;
+ }
+ }
+
+ if(! rsa_verify($author_signed_data,$author_signature,$key)) {
+ logger('diaspora_comment: verification failed.');
+ return;
+ }
+
+ if($parent_author_signature) {
+ $owner_signed_data = $guid . ';' . $parent_guid . ';' . $text . ';' . $msg['author'];
+
+ $parent_author_signature = base64_decode($parent_author_signature);
+
+ $key = $msg['key'];
+
+ if(! rsa_verify($owner_signed_data,$parent_author_signature,$key)) {
+ logger('diaspora_comment: owner verification failed.');
+ return;
+ }
+ }
+
+ // Phew! Everything checks out. Now create an item.
+
+ require_once('library/HTMLPurifier.auto.php');
+ require_once('include/html2bbcode.php');
+
+ $body = $text;
+
+ $maxlen = get_max_import_size();
+ if($maxlen && (strlen($body) > $maxlen))
+ $body = substr($body,0, $maxlen);
+
+ if((strpos($body,'<') !== false) || (strpos($body,'>') !== false)) {
+
+ $body = preg_replace('#<object[^>]+>.+?' . 'http://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?</object>#s',
+ '[youtube]$1[/youtube]', $body);
+
+ $body = preg_replace('#<iframe[^>].+?' . 'http://www.youtube.com/embed/([A-Za-z0-9\-_=]+).+?</iframe>#s',
+ '[youtube]$1[/youtube]', $body);
+
+ $body = oembed_html2bbcode($body);
+
+ $config = HTMLPurifier_Config::createDefault();
+ $config->set('Cache.DefinitionImpl', null);
+ $purifier = new HTMLPurifier($config);
+ $body = $purifier->purify($body);
+
+ $body = html2bbcode($body);
+ }
+
+ $message_id = $diaspora_handle . ':' . $guid;
+
+ $datarray = array();
+ $datarray['uid'] = $importer['uid'];
+ $datarray['contact-id'] = $contact['id'];
+ $datarray['wall'] = $parent_item['wall'];
+ $datarray['gravity'] = GRAVITY_COMMENT;
+ $datarray['guid'] = $guid;
+ $datarray['uri'] = $message_id;
+ $datarray['parent-uri'] = $parent_item['uri'];
+
+ // No timestamps for comments? OK, we'll the use current time.
+ $datarray['created'] = $datarray['edited'] = datetime_convert();
+ $datarray['private'] = $parent_item['private'];
+
+ $datarray['owner-name'] = $contact['name'];
+ $datarray['owner-link'] = $contact['url'];
+ $datarray['owner-avatar'] = $contact['thumb'];
+
+ $datarray['author-name'] = $person['name'];
+ $datarray['author-link'] = $person['url'];
+ $datarray['author-avatar'] = ((x($person,'thumb')) ? $person['thumb'] : $person['photo']);
+ $datarray['body'] = $body;
+
+ item_store($datarray);
+
+ return;
+
+}
+
+function diaspora_like($importer,$xml,$msg) {
+
+ $guid = notags(unxmlify($xml->guid));
+ $parent_guid = notags(unxmlify($xml->parent_guid));
+ $diaspora_handle = notags(unxmlify($xml->diaspora_handle));
+ $target_type = notags(unxmlify($xml->target_type));
+ $positive = notags(unxmlify($xml->positive));
+ $author_signature = notags(unxmlify($xml->author_signature));
+
+ $parent_author_signature = (($xml->parent_author_signature) ? notags(unxmlify($xml->parent_author_signature)) : '');
+
+ // likes on comments not supported here and likes on photos not supported by Diaspora
+
+ if($target_type !== 'Post')
+ return;
+
+ $contact = diaspora_get_contact_by_handle($importer['uid'],$msg['author']);
+ if(! $contact)
+ return;
+
+ if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) {
+ logger('diaspora_like: Ignoring this author.');
+ http_status_exit(202);
+ // NOTREACHED
+ }
+
+ $r = q("SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
+ intval($importer['uid']),
+ dbesc($parent_guid)
+ );
+ if(! count($r)) {
+ logger('diaspora_like: parent item not found: ' . $guid);
+ return;
+ }
+
+ $parent_item = $r[0];
+
+ $r = q("SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '$s' LIMIT 1",
+ intval($importer['uid']),
+ dbesc($guid)
+ );
+ if(count($r)) {
+ if($positive === 'true') {
+ logger('diaspora_like: duplicate like: ' . $guid);
+ return;
+ }
+ if($positive === 'false') {
+ q("UPDATE `item` SET `deleted` = 1 WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval($r[0]['id']),
+ intval($importer['uid'])
+ );
+ // FIXME
+ // send notification via proc_run()
+ return;
+ }
+ }
+ if($positive === 'false') {
+ logger('diaspora_like: unlike received with no corresponding like');
+ return;
+ }
+
+ $author_signed_data = $guid . ';' . $parent_guid . ';' . $target_type . ';' . $positive . ';' . $diaspora_handle;
+
+ $author_signature = base64_decode($author_signature);
+
+ if(stricmp($diaspora_handle,$msg['author']) == 0) {
+ $person = $contact;
+ $key = $msg['key'];
+ }
+ else {
+ $person = find_person_by_handle($diaspora_handle);
+ if(is_array($person) && x($person,'pubkey'))
+ $key = $person['pubkey'];
+ else {
+ logger('diaspora_comment: unable to find author details');
+ return;
+ }
+ }
+
+ if(! rsa_verify($author_signed_data,$author_signature,$key)) {
+ logger('diaspora_like: verification failed.');
+ return;
+ }
+
+ if($parent_author_signature) {
+ $owner_signed_data = $guid . ';' . $parent_guid . ';' . $target_type . ';' . $positive . ';' . $msg['author'];
+
+ $parent_author_signature = base64_decode($parent_author_signature);
+
+ $key = $msg['key'];
+
+ if(! rsa_verify($owner_signed_data,$parent_author_signature,$key)) {
+ logger('diaspora_like: owner verification failed.');
+ return;
+ }
+ }
+
+ // Phew! Everything checks out. Now create an item.
+
+ $uri = $diaspora_handle . ':' . $guid;
+
+ $activity = ACTIVITY_LIKE;
+ $post_type = (($parent_item['resource-id']) ? t('photo') : t('status'));
+ $objtype = (($parent_item['resource-id']) ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
+ $link = xmlify('<link rel="alternate" type="text/html" href="' . $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $parent_item['id'] . '" />' . "\n") ;
+ $body = $parent_item['body'];
+
+ $obj = <<< EOT
+
+ <object>
+ <type>$objtype</type>
+ <local>1</local>
+ <id>{$parent_item['uri']}</id>
+ <link>$link</link>
+ <title></title>
+ <content>$body</content>
+ </object>
+EOT;
+ $bodyverb = t('%1$s likes %2$s\'s %3$s');
+
+ $arr = array();
+
+ $arr['uri'] = $uri;
+ $arr['uid'] = $importer['uid'];
+ $arr['contact-id'] = $contact['id'];
+ $arr['type'] = 'activity';
+ $arr['wall'] = $parent_item['wall'];
+ $arr['gravity'] = GRAVITY_LIKE;
+ $arr['parent'] = $parent_item['id'];
+ $arr['parent-uri'] = $parent_item['uri'];
+
+ $datarray['owner-name'] = $contact['name'];
+ $datarray['owner-link'] = $contact['url'];
+ $datarray['owner-avatar'] = $contact['thumb'];
+
+ $datarray['author-name'] = $person['name'];
+ $datarray['author-link'] = $person['url'];
+ $datarray['author-avatar'] = ((x($person,'thumb')) ? $person['thumb'] : $person['photo']);
+
+ $ulink = '[url=' . $contact['url'] . ']' . $contact['name'] . '[/url]';
+ $alink = '[url=' . $parent_item['author-link'] . ']' . $parent_item['author-name'] . '[/url]';
+ $plink = '[url=' . $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $parent_item['id'] . ']' . $post_type . '[/url]';
+ $arr['body'] = sprintf( $bodyverb, $ulink, $alink, $plink );
+
+ $arr['private'] = $parent_item['private'];
+ $arr['verb'] = $activity;
+ $arr['object-type'] = $objtype;
+ $arr['object'] = $obj;
+ $arr['visible'] = 1;
+ $arr['unseen'] = 1;
+ $arr['last-child'] = 0;
+
+ $post_id = item_store($arr);
+
+
+ // FIXME send notification
+
+
+}
+
+function diaspora_retraction($importer,$xml) {
+
+ $guid = notags(unxmlify($xml->guid));
+ $diaspora_handle = notags(unxmlify($xml->diaspora_handle));
+
+ $contact = diaspora_get_contact_by_handle($importer['uid'],$diaspora_handle);
+ if(! $contact)
+ return;
+
+// if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) {
+// logger('diaspora_retraction: Ignoring this author.');
+// http_status_exit(202);
+// // NOTREACHED
+// }
+
+
+
+}
+
+function diaspora_share($me,$contact) {
+ $a = get_app();
+ $myaddr = $me['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
+ $theiraddr = $contact['addr'];
+
+ $tpl = get_markup_template('diaspora_share.tpl');
+ $msg = replace_macros($tpl, array(
+ '$sender' => myaddr,
+ '$recipient' => $theiraddr
+ ));
+
+ $slap = 'xml=' . urlencode(diaspora_msg_build($msg,$me,$contact,$me['prvkey'],$contact['pubkey']));
+
+ post_url($contact['notify'],$slap);
+ $return_code = $a->get_curl_code();
+ return $return_code;
+}
+
+function diaspora_send_status($item,$owner,$contact) {
+
+ $a = get_app();
+ $myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
+ $theiraddr = $contact['addr'];
+ require_once('include/bbcode.php');
+
+ $body = xmlify(bbcode($item['body']));
+ $public = (($item['private']) ? 'false' : 'true');
+
+ require_once('include/datetime.php');
+ $created = datetime_convert('UTC','UTC',$item['created'],'Y-m-d h:i:s \U\T\C');
+
+ $tpl = get_markup_template('diaspora_post.tpl');
+ $msg = replace_macros($tpl, array(
+ '$body' => $body,
+ '$guid' => $item['guid'],
+ '$handle' => xmlify($myaddr),
+ '$public' => $public,
+ '$created' => $created
+ ));
+
+ logger('diaspora_send_status: base message: ' . $msg, LOGGER_DATA);
+
+ $slap = 'xml=' . urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey']));
+
+ post_url($contact['notify'],$slap);
+ $return_code = $a->get_curl_code();
+ logger('diaspora_send_status: returns: ' . $return_code);
+ return $return_code;
+}
+
diff --git a/include/event.php b/include/event.php
index aab195d24..99f685d0b 100644
--- a/include/event.php
+++ b/include/event.php
@@ -197,6 +197,7 @@ function event_store($arr) {
$arr['type'] = (($arr['type']) ? $arr['type'] : 'event' );
$arr['cid'] = ((intval($arr['cid'])) ? intval($arr['cid']) : 0);
$arr['uri'] = (x($arr,'uri') ? $arr['uri'] : item_new_uri($a->get_hostname(),$arr['uid']));
+ $arr['private'] = ((x($arr,'private')) ? intval($arr['private']) : 0);
if($arr['cid'])
$c = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
@@ -275,7 +276,7 @@ function event_store($arr) {
$object .= '</object>' . "\n";
- q("UPDATE `item` SET `body` = '%s', `object` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s', `edited` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ q("UPDATE `item` SET `body` = '%s', `object` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s', `edited` = '%s', `private` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
dbesc(format_event_bbcode($arr)),
dbesc($object),
dbesc($arr['allow_cid']),
@@ -283,6 +284,7 @@ function event_store($arr) {
dbesc($arr['deny_cid']),
dbesc($arr['deny_gid']),
dbesc($arr['edited']),
+ intval($arr['private']),
intval($r[0]['id']),
intval($arr['uid'])
);
@@ -341,10 +343,11 @@ function event_store($arr) {
$item_arr['author-link'] = $contact['url'];
$item_arr['author-avatar'] = $contact['thumb'];
$item_arr['title'] = '';
- $item_arr['allow_cid'] = $str_contact_allow;
- $item_arr['allow_gid'] = $str_group_allow;
- $item_arr['deny_cid'] = $str_contact_deny;
- $item_arr['deny_gid'] = $str_group_deny;
+ $item_arr['allow_cid'] = $arr['allow_cid'];
+ $item_arr['allow_gid'] = $arr['allow_gid'];
+ $item_arr['deny_cid'] = $arr['deny_cid'];
+ $item_arr['deny_gid'] = $arr['deny_gid'];
+ $item_arr['private'] = $arr['private'];
$item_arr['last-child'] = 1;
$item_arr['visible'] = 1;
$item_arr['verb'] = ACTIVITY_POST;
diff --git a/include/group.php b/include/group.php
index e16c900d9..1ebae7b7b 100644
--- a/include/group.php
+++ b/include/group.php
@@ -136,7 +136,7 @@ function group_public_members($gid) {
-function group_side($every="contacts",$each="group",$edit = false, $group_id = 0) {
+function group_side($every="contacts",$each="group",$edit = false, $group_id = 0, $cid = 0) {
$o = '';
@@ -160,10 +160,19 @@ EOT;
$r = q("SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
intval($_SESSION['uid'])
);
+ if($cid) {
+ $member_of = groups_containing(local_user(),$cid);
+ }
+
if(count($r)) {
foreach($r as $rr) {
$selected = (($group_id == $rr['id']) ? ' class="group-selected" ' : '');
- $o .= ' <li class="sidebar-group-li">' . (($edit) ? "<a href=\"group/{$rr['id']}\" title=\"" . t('Edit') . "\" ><img src=\"images/spencil.gif\" alt=\"" . t('Edit') . "\"></a> " : "") . "<a href=\"$each/{$rr['id']}\" $selected >{$rr['name']}</a></li>\r\n";
+ $o .= ' <li class="sidebar-group-li">'
+ . (($edit) ? "<a href=\"group/{$rr['id']}\" title=\"" . t('Edit')
+ . "\" ><img src=\"images/spencil.gif\" alt=\"" . t('Edit') . "\"></a> " : "")
+ . (($cid) ? '<input type="checkbox" class="' . (($selected) ? 'ticked' : 'unticked') . '" onclick="contactgroupChangeMember(' . $rr['id'] . ',' . $cid . ');return true;" '
+ . ((in_array($rr['id'],$member_of)) ? ' checked="checked" ' : '') . '/>' : '')
+ . "<a href=\"$each/{$rr['id']}\" $selected >{$rr['name']}</a></li>\r\n";
}
}
$o .= " </ul>\r\n </div>";
@@ -204,3 +213,18 @@ function member_of($c) {
}
+function groups_containing($uid,$c) {
+
+ $r = q("SELECT `gid` FROM `group_member` WHERE `uid` = %d AND `group_member`.`contact-id` = %d ",
+ intval($uid),
+ intval($c)
+ );
+
+ $ret = array();
+ if(count($r)) {
+ foreach($r as $rr)
+ $ret[] = $rr['gid'];
+ }
+
+ return $ret;
+} \ No newline at end of file
diff --git a/include/items.php b/include/items.php
index 6593647ba..ec519ad9b 100644
--- a/include/items.php
+++ b/include/items.php
@@ -6,7 +6,6 @@ require_once('include/salmon.php');
function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0) {
-
// default permissions - anonymous user
if(! strlen($owner_nick))
@@ -113,7 +112,7 @@ function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0)
$items = $r;
- $feed_template = get_markup_template('atom_feed.tpl');
+ $feed_template = get_markup_template(($dfrn_id) ? 'atom_feed_dfrn.tpl' : 'atom_feed.tpl');
$atom = '';
@@ -154,6 +153,9 @@ function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0)
if($dfrn_id === '') {
$type = 'html';
+ // catch any email that's in a public conversation and make sure it doesn't leak
+ if($item['private'])
+ continue;
}
else {
$type = 'text';
@@ -485,7 +487,6 @@ function get_atom_elements($feed,$item) {
if((x($res,'verb')) && ($res['verb'] === 'http://ostatus.org/schema/1.0/unfollow'))
$res['verb'] = ACTIVITY_UNFOLLOW;
-
$cats = $item->get_categories();
if($cats) {
$tag_arr = array();
@@ -520,7 +521,7 @@ function get_atom_elements($feed,$item) {
if(! $type)
$type = 'application/octet-stream';
- $att_arr[] = '[attach]href="' . $link . '" size="' . $len . '" type="' . $type . '" title="' . $title . '"[/attach]';
+ $att_arr[] = '[attach]href="' . $link . '" length="' . $len . '" type="' . $type . '" title="' . $title . '"[/attach]';
}
$res['attach'] = implode(',', $att_arr);
}
@@ -720,6 +721,13 @@ function item_store($arr,$force_parent = false) {
if($r[0]['uri'] != $r[0]['parent-uri']) {
$arr['thr-parent'] = $arr['parent-uri'];
$arr['parent-uri'] = $r[0]['parent-uri'];
+ $z = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `parent-uri` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($r[0]['parent-uri']),
+ dbesc($r[0]['parent-uri']),
+ intval($arr['uid'])
+ );
+ if($z && count($z))
+ $r = $z;
}
$parent_id = $r[0]['id'];
@@ -749,6 +757,8 @@ function item_store($arr,$force_parent = false) {
}
}
+ $arr['guid'] = get_guid();
+
call_hooks('post_remote',$arr);
dbesc_array($arr);
@@ -917,7 +927,7 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
$postvars['dissolve'] = '1';
- if((($contact['rel']) && ($contact['rel'] != REL_FAN) && (! $contact['blocked'])) || ($owner['page-flags'] == PAGE_COMMUNITY)) {
+ if((($contact['rel']) && ($contact['rel'] != CONTACT_IS_SHARING) && (! $contact['blocked'])) || ($owner['page-flags'] == PAGE_COMMUNITY)) {
$postvars['data'] = $atom;
$postvars['perm'] = 'rw';
}
@@ -997,6 +1007,11 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $secure_fee
require_once('library/simplepie/simplepie.inc');
+ if(! strlen($xml)) {
+ logger('consume_feed: empty input');
+ return;
+ }
+
$feed = new SimplePie();
$feed->set_raw_data($xml);
if($datedir)
@@ -1023,7 +1038,9 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $secure_fee
if(count($hubs))
$hub = implode(',', $hubs);
- $rawtags = $feed->get_feed_tags( SIMPLEPIE_NAMESPACE_ATOM_10, 'author');
+ $rawtags = $feed->get_feed_tags( NAMESPACE_DFRN, 'owner');
+ if(! $rawtags)
+ $rawtags = $feed->get_feed_tags( SIMPLEPIE_NAMESPACE_ATOM_10, 'author');
if($rawtags) {
$elems = $rawtags[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10];
if($elems['name'][0]['attribs'][NAMESPACE_DFRN]['updated']) {
@@ -1349,6 +1366,7 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $secure_fee
$ev['uid'] = $importer['uid'];
$ev['uri'] = $item_id;
$ev['edited'] = $datarray['edited'];
+ $ev['private'] = $datarray['private'];
if(is_array($contact))
$ev['cid'] = $contact['id'];
@@ -1444,9 +1462,9 @@ function new_follower($importer,$contact,$datarray,$item) {
$nick = $rawtag[0]['child'][NAMESPACE_POCO]['preferredUsername'][0]['data'];
if(is_array($contact)) {
- if($contact['network'] == 'stat' && $contact['rel'] == REL_FAN) {
+ if($contact['network'] == 'stat' && $contact['rel'] == CONTACT_IS_SHARING) {
$r = q("UPDATE `contact` SET `rel` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval(REL_BUD),
+ intval(CONTACT_IS_FRIEND),
intval($contact['id']),
intval($importer['uid'])
);
@@ -1468,12 +1486,12 @@ function new_follower($importer,$contact,$datarray,$item) {
dbesc($nick),
dbesc($photo),
dbesc('stat'),
- intval(REL_VIP)
+ intval(CONTACT_IS_FOLLOWER)
);
$r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `url` = '%s' AND `pending` = 1 AND `rel` = %d LIMIT 1",
intval($importer['uid']),
dbesc($url),
- intval(REL_VIP)
+ intval(CONTACT_IS_FOLLOWER)
);
if(count($r))
$contact_record = $r[0];
@@ -1518,9 +1536,9 @@ function new_follower($importer,$contact,$datarray,$item) {
function lose_follower($importer,$contact,$datarray,$item) {
- if(($contact['rel'] == REL_BUD) || ($contact['rel'] == REL_FAN)) {
+ if(($contact['rel'] == CONTACT_IS_FRIEND) || ($contact['rel'] == CONTACT_IS_SHARING)) {
q("UPDATE `contact` SET `rel` = %d WHERE `id` = %d LIMIT 1",
- intval(REL_FAN),
+ intval(CONTACT_IS_SHARING),
intval($contact['id'])
);
}
@@ -1726,11 +1744,11 @@ function item_getfeedattach($item) {
if(count($arr)) {
foreach($arr as $r) {
$matches = false;
- $cnt = preg_match('|\[attach\]href=\"(.*?)\" size=\"(.*?)\" type=\"(.*?)\" title=\"(.*?)\"\[\/attach\]|',$r,$matches);
+ $cnt = preg_match('|\[attach\]href=\"(.*?)\" length=\"(.*?)\" type=\"(.*?)\" title=\"(.*?)\"\[\/attach\]|',$r,$matches);
if($cnt) {
$ret .= '<link rel="enclosure" href="' . xmlify($matches[1]) . '" type="' . xmlify($matches[3]) . '" ';
if(intval($matches[2]))
- $ret .= 'size="' . intval($matches[2]) . '" ';
+ $ret .= 'length="' . intval($matches[2]) . '" ';
if($matches[4] !== ' ')
$ret .= 'title="' . xmlify(trim($matches[4])) . '" ';
$ret .= ' />' . "\r\n";
diff --git a/include/main.js b/include/main.js
index 3574e6eb8..83dcc720c 100644
--- a/include/main.js
+++ b/include/main.js
@@ -194,7 +194,8 @@
else {
$('#' + ident + ' ' + '.wall-item-ago').replaceWith($(this).find('.wall-item-ago'));
- $('#' + ident + ' ' + '.wall-item-comment-wrapper').replaceWith($(this).find('.wall-item-comment-wrapper'));
+ if($('#' + ident + ' ' + '.comment-edit-text-empty').length)
+ $('#' + ident + ' ' + '.wall-item-comment-wrapper').replaceWith($(this).find('.wall-item-comment-wrapper'));
$('#' + ident + ' ' + '.wall-item-like').replaceWith($(this).find('.wall-item-like'));
$('#' + ident + ' ' + '.wall-item-dislike').replaceWith($(this).find('.wall-item-dislike'));
$('#' + ident + ' ' + '.my-comment-photo').each(function() {
@@ -361,6 +362,14 @@
});
}
+ function contactgroupChangeMember(gid,cid) {
+ $('body').css('cursor', 'wait');
+ $.get('contactgroup/' + gid + '/' + cid, function(data) {
+ $('body').css('cursor', 'auto');
+ });
+ }
+
+
function checkboxhighlight(box) {
if($(box).is(':checked')) {
$(box).addClass('checkeditem');
@@ -414,3 +423,4 @@ Array.prototype.remove = function(item) {
this.length = from < 0 ? this.length + from : from;
return this.push.apply(this, rest);
};
+
diff --git a/include/network.php b/include/network.php
new file mode 100644
index 000000000..bbf1d6a63
--- /dev/null
+++ b/include/network.php
@@ -0,0 +1,695 @@
+<?php
+
+
+// curl wrapper. If binary flag is true, return binary
+// results.
+
+if(! function_exists('fetch_url')) {
+function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0) {
+
+ $a = get_app();
+
+ $ch = curl_init($url);
+ if(($redirects > 8) || (! $ch))
+ return false;
+
+ curl_setopt($ch, CURLOPT_HEADER, true);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
+ curl_setopt($ch, CURLOPT_USERAGENT, "Friendika");
+
+ if(intval($timeout)) {
+ curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
+ }
+ else {
+ $curl_time = intval(get_config('system','curl_timeout'));
+ curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
+ }
+ // by default we will allow self-signed certs
+ // but you can override this
+
+ $check_cert = get_config('system','verifyssl');
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
+
+ $prx = get_config('system','proxy');
+ if(strlen($prx)) {
+ curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
+ curl_setopt($ch, CURLOPT_PROXY, $prx);
+ $prxusr = get_config('system','proxyuser');
+ if(strlen($prxusr))
+ curl_setopt($ch, CURLOPT_PROXYUSERPWD, $prxusr);
+ }
+ if($binary)
+ curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
+
+ $a->set_curl_code(0);
+
+ // don't let curl abort the entire application
+ // if it throws any errors.
+
+ $s = @curl_exec($ch);
+
+ $base = $s;
+ $curl_info = curl_getinfo($ch);
+ $http_code = $curl_info['http_code'];
+
+ $header = '';
+
+ // Pull out multiple headers, e.g. proxy and continuation headers
+ // allow for HTTP/2.x without fixing code
+
+ while(preg_match('/^HTTP\/[1-2].+? [1-5][0-9][0-9]/',$base)) {
+ $chunk = substr($base,0,strpos($base,"\r\n\r\n")+4);
+ $header .= $chunk;
+ $base = substr($base,strlen($chunk));
+ }
+
+ if($http_code == 301 || $http_code == 302 || $http_code == 303 || $http_code == 307) {
+ $matches = array();
+ preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
+ $url = trim(array_pop($matches));
+ $url_parsed = @parse_url($url);
+ if (isset($url_parsed)) {
+ $redirects++;
+ return fetch_url($url,$binary,$redirects,$timeout);
+ }
+ }
+
+ $a->set_curl_code($http_code);
+
+ $body = substr($s,strlen($header));
+
+ $a->set_curl_headers($header);
+
+ curl_close($ch);
+ return($body);
+}}
+
+// post request to $url. $params is an array of post variables.
+
+if(! function_exists('post_url')) {
+function post_url($url,$params, $headers = null, &$redirects = 0, $timeout = 0) {
+ $a = get_app();
+ $ch = curl_init($url);
+ if(($redirects > 8) || (! $ch))
+ return false;
+
+ curl_setopt($ch, CURLOPT_HEADER, true);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
+ curl_setopt($ch, CURLOPT_POST,1);
+ curl_setopt($ch, CURLOPT_POSTFIELDS,$params);
+ curl_setopt($ch, CURLOPT_USERAGENT, "Friendika");
+
+ if(intval($timeout)) {
+ curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
+ }
+ else {
+ $curl_time = intval(get_config('system','curl_timeout'));
+ curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
+ }
+
+ if(defined('LIGHTTPD')) {
+ if(!is_array($headers)) {
+ $headers = array('Expect:');
+ } else {
+ if(!in_array('Expect:', $headers)) {
+ array_push($headers, 'Expect:');
+ }
+ }
+ }
+ if($headers)
+ curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
+
+ $check_cert = get_config('system','verifyssl');
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
+ $prx = get_config('system','proxy');
+ if(strlen($prx)) {
+ curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
+ curl_setopt($ch, CURLOPT_PROXY, $prx);
+ $prxusr = get_config('system','proxyuser');
+ if(strlen($prxusr))
+ curl_setopt($ch, CURLOPT_PROXYUSERPWD, $prxusr);
+ }
+
+ $a->set_curl_code(0);
+
+ // don't let curl abort the entire application
+ // if it throws any errors.
+
+ $s = @curl_exec($ch);
+
+ $base = $s;
+ $curl_info = curl_getinfo($ch);
+ $http_code = $curl_info['http_code'];
+
+ $header = '';
+
+ // Pull out multiple headers, e.g. proxy and continuation headers
+ // allow for HTTP/2.x without fixing code
+
+ while(preg_match('/^HTTP\/[1-2].+? [1-5][0-9][0-9]/',$base)) {
+ $chunk = substr($base,0,strpos($base,"\r\n\r\n")+4);
+ $header .= $chunk;
+ $base = substr($base,strlen($chunk));
+ }
+
+ if($http_code == 301 || $http_code == 302 || $http_code == 303) {
+ $matches = array();
+ preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
+ $url = trim(array_pop($matches));
+ $url_parsed = @parse_url($url);
+ if (isset($url_parsed)) {
+ $redirects++;
+ return post_url($url,$params,$headers,$redirects,$timeout);
+ }
+ }
+ $a->set_curl_code($http_code);
+ $body = substr($s,strlen($header));
+
+ $a->set_curl_headers($header);
+
+ curl_close($ch);
+ return($body);
+}}
+
+// Generic XML return
+// Outputs a basic dfrn XML status structure to STDOUT, with a <status> variable
+// of $st and an optional text <message> of $message and terminates the current process.
+
+if(! function_exists('xml_status')) {
+function xml_status($st, $message = '') {
+
+ $xml_message = ((strlen($message)) ? "\t<message>" . xmlify($message) . "</message>\r\n" : '');
+
+ if($st)
+ logger('xml_status returning non_zero: ' . $st . " message=" . $message);
+
+ header( "Content-type: text/xml" );
+ echo '<?xml version="1.0" encoding="UTF-8"?>'."\r\n";
+ echo "<result>\r\n\t<status>$st</status>\r\n$xml_message</result>\r\n";
+ killme();
+}}
+
+
+if(! function_exists('http_status_exit')) {
+function http_status_exit($val) {
+
+ if($val >= 400)
+ $err = 'Error';
+ if($val >= 200 && $val < 300)
+ $err = 'OK';
+
+ logger('http_status_exit ' . $val);
+ header($_SERVER["SERVER_PROTOCOL"] . ' ' . $val . ' ' . $err);
+ killme();
+
+}}
+
+
+// convert an XML document to a normalised, case-corrected array
+// used by webfinger
+
+if(! function_exists('convert_xml_element_to_array')) {
+function convert_xml_element_to_array($xml_element, &$recursion_depth=0) {
+
+ // If we're getting too deep, bail out
+ if ($recursion_depth > 512) {
+ return(null);
+ }
+
+ if (!is_string($xml_element) &&
+ !is_array($xml_element) &&
+ (get_class($xml_element) == 'SimpleXMLElement')) {
+ $xml_element_copy = $xml_element;
+ $xml_element = get_object_vars($xml_element);
+ }
+
+ if (is_array($xml_element)) {
+ $result_array = array();
+ if (count($xml_element) <= 0) {
+ return (trim(strval($xml_element_copy)));
+ }
+
+ foreach($xml_element as $key=>$value) {
+
+ $recursion_depth++;
+ $result_array[strtolower($key)] =
+ convert_xml_element_to_array($value, $recursion_depth);
+ $recursion_depth--;
+ }
+ if ($recursion_depth == 0) {
+ $temp_array = $result_array;
+ $result_array = array(
+ strtolower($xml_element_copy->getName()) => $temp_array,
+ );
+ }
+
+ return ($result_array);
+
+ } else {
+ return (trim(strval($xml_element)));
+ }
+}}
+
+// Given an email style address, perform webfinger lookup and
+// return the resulting DFRN profile URL, or if no DFRN profile URL
+// is located, returns an OStatus subscription template (prefixed
+// with the string 'stat:' to identify it as on OStatus template).
+// If this isn't an email style address just return $s.
+// Return an empty string if email-style addresses but webfinger fails,
+// or if the resultant personal XRD doesn't contain a supported
+// subscription/friend-request attribute.
+
+if(! function_exists('webfinger_dfrn')) {
+function webfinger_dfrn($s) {
+ if(! strstr($s,'@')) {
+ return $s;
+ }
+ $links = webfinger($s);
+ logger('webfinger_dfrn: ' . $s . ':' . print_r($links,true), LOGGER_DATA);
+ if(count($links)) {
+ foreach($links as $link)
+ if($link['@attributes']['rel'] === NAMESPACE_DFRN)
+ return $link['@attributes']['href'];
+ foreach($links as $link)
+ if($link['@attributes']['rel'] === NAMESPACE_OSTATUSSUB)
+ return 'stat:' . $link['@attributes']['template'];
+ }
+ return '';
+}}
+
+// Given an email style address, perform webfinger lookup and
+// return the array of link attributes from the personal XRD file.
+// On error/failure return an empty array.
+
+
+if(! function_exists('webfinger')) {
+function webfinger($s) {
+ $host = '';
+ if(strstr($s,'@')) {
+ $host = substr($s,strpos($s,'@') + 1);
+ }
+ if(strlen($host)) {
+ $tpl = fetch_lrdd_template($host);
+ logger('webfinger: lrdd template: ' . $tpl);
+ if(strlen($tpl)) {
+ $pxrd = str_replace('{uri}', urlencode('acct:' . $s), $tpl);
+ logger('webfinger: pxrd: ' . $pxrd);
+ $links = fetch_xrd_links($pxrd);
+ if(! count($links)) {
+ // try with double slashes
+ $pxrd = str_replace('{uri}', urlencode('acct://' . $s), $tpl);
+ logger('webfinger: pxrd: ' . $pxrd);
+ $links = fetch_xrd_links($pxrd);
+ }
+ return $links;
+ }
+ }
+ return array();
+}}
+
+if(! function_exists('lrdd')) {
+function lrdd($uri) {
+
+ $a = get_app();
+
+ // default priority is host priority, host-meta first
+
+ $priority = 'host';
+
+ // All we have is an email address. Resource-priority is irrelevant
+ // because our URI isn't directly resolvable.
+
+ if(strstr($uri,'@')) {
+ return(webfinger($uri));
+ }
+
+ // get the host meta file
+
+ $host = @parse_url($uri);
+
+ if($host) {
+ $url = ((x($host,'scheme')) ? $host['scheme'] : 'http') . '://';
+ $url .= $host['host'] . '/.well-known/host-meta' ;
+ }
+ else
+ return array();
+
+ logger('lrdd: constructed url: ' . $url);
+
+ $xml = fetch_url($url);
+ $headers = $a->get_curl_headers();
+
+ if (! $xml)
+ return array();
+
+ logger('lrdd: host_meta: ' . $xml, LOGGER_DATA);
+
+ $h = parse_xml_string($xml);
+ if(! $h)
+ return array();
+
+ $arr = convert_xml_element_to_array($h);
+
+ if(isset($arr['xrd']['property'])) {
+ $property = $arr['crd']['property'];
+ if(! isset($property[0]))
+ $properties = array($property);
+ else
+ $properties = $property;
+ foreach($properties as $prop)
+ if((string) $prop['@attributes'] === 'http://lrdd.net/priority/resource')
+ $priority = 'resource';
+ }
+
+ // save the links in case we need them
+
+ $links = array();
+
+ if(isset($arr['xrd']['link'])) {
+ $link = $arr['xrd']['link'];
+ if(! isset($link[0]))
+ $links = array($link);
+ else
+ $links = $link;
+ }
+
+ // do we have a template or href?
+
+ if(count($links)) {
+ foreach($links as $link) {
+ if($link['@attributes']['rel'] && attribute_contains($link['@attributes']['rel'],'lrdd')) {
+ if(x($link['@attributes'],'template'))
+ $tpl = $link['@attributes']['template'];
+ elseif(x($link['@attributes'],'href'))
+ $href = $link['@attributes']['href'];
+ }
+ }
+ }
+
+ if((! isset($tpl)) || (! strpos($tpl,'{uri}')))
+ $tpl = '';
+
+ if($priority === 'host') {
+ if(strlen($tpl))
+ $pxrd = str_replace('{uri}', urlencode($uri), $tpl);
+ elseif(isset($href))
+ $pxrd = $href;
+ if(isset($pxrd)) {
+ logger('lrdd: (host priority) pxrd: ' . $pxrd);
+ $links = fetch_xrd_links($pxrd);
+ return $links;
+ }
+
+ $lines = explode("\n",$headers);
+ if(count($lines)) {
+ foreach($lines as $line) {
+ if((stristr($line,'link:')) && preg_match('/<([^>].*)>.*rel\=[\'\"]lrdd[\'\"]/',$line,$matches)) {
+ return(fetch_xrd_links($matches[1]));
+ break;
+ }
+ }
+ }
+ }
+
+
+ // priority 'resource'
+
+
+ $html = fetch_url($uri);
+ $headers = $a->get_curl_headers();
+ logger('lrdd: headers=' . $headers, LOGGER_DEBUG);
+
+ // don't try and parse raw xml as html
+ if(! strstr($html,'<?xml')) {
+ require_once('library/HTML5/Parser.php');
+ $dom = @HTML5_Parser::parse($html);
+
+ if($dom) {
+ $items = $dom->getElementsByTagName('link');
+ foreach($items as $item) {
+ $x = $item->getAttribute('rel');
+ if($x == "lrdd") {
+ $pagelink = $item->getAttribute('href');
+ break;
+ }
+ }
+ }
+ }
+
+ if(isset($pagelink))
+ return(fetch_xrd_links($pagelink));
+
+ // next look in HTTP headers
+
+ $lines = explode("\n",$headers);
+ if(count($lines)) {
+ foreach($lines as $line) {
+ // TODO alter the following regex to support multiple relations (space separated)
+ if((stristr($line,'link:')) && preg_match('/<([^>].*)>.*rel\=[\'\"]lrdd[\'\"]/',$line,$matches)) {
+ $pagelink = $matches[1];
+ break;
+ }
+ // don't try and run feeds through the html5 parser
+ if(stristr($line,'content-type:') && ((stristr($line,'application/atom+xml')) || (stristr($line,'application/rss+xml'))))
+ return array();
+ if(stristr($html,'<rss') || stristr($html,'<feed'))
+ return array();
+ }
+ }
+
+ if(isset($pagelink))
+ return(fetch_xrd_links($pagelink));
+
+ // If we haven't found any links, return the host xrd links (which we have already fetched)
+
+ if(isset($links))
+ return $links;
+
+ return array();
+
+}}
+
+
+
+// Given a host name, locate the LRDD template from that
+// host. Returns the LRDD template or an empty string on
+// error/failure.
+
+if(! function_exists('fetch_lrdd_template')) {
+function fetch_lrdd_template($host) {
+ $tpl = '';
+
+ $url1 = 'https://' . $host . '/.well-known/host-meta' ;
+ $url2 = 'http://' . $host . '/.well-known/host-meta' ;
+ $links = fetch_xrd_links($url1);
+ logger('fetch_lrdd_template from: ' . $url1);
+ logger('template (https): ' . print_r($links,true));
+ if(! count($links)) {
+ logger('fetch_lrdd_template from: ' . $url2);
+ $links = fetch_xrd_links($url2);
+ logger('template (http): ' . print_r($links,true));
+ }
+ if(count($links)) {
+ foreach($links as $link)
+ if($link['@attributes']['rel'] && $link['@attributes']['rel'] === 'lrdd')
+ $tpl = $link['@attributes']['template'];
+ }
+ if(! strpos($tpl,'{uri}'))
+ $tpl = '';
+ return $tpl;
+}}
+
+// Given a URL, retrieve the page as an XRD document.
+// Return an array of links.
+// on error/failure return empty array.
+
+if(! function_exists('fetch_xrd_links')) {
+function fetch_xrd_links($url) {
+
+ $xrd_timeout = intval(get_config('system','xrd_timeout'));
+ $redirects = 0;
+ $xml = fetch_url($url,false,$redirects,(($xrd_timeout) ? $xrd_timeout : 30));
+
+ logger('fetch_xrd_links: ' . $xml, LOGGER_DATA);
+
+ if ((! $xml) || (! stristr($xml,'<xrd')))
+ return array();
+
+ $h = parse_xml_string($xml);
+ if(! $h)
+ return array();
+
+ $arr = convert_xml_element_to_array($h);
+
+ $links = array();
+
+ if(isset($arr['xrd']['link'])) {
+ $link = $arr['xrd']['link'];
+ if(! isset($link[0]))
+ $links = array($link);
+ else
+ $links = $link;
+ }
+ if(isset($arr['xrd']['alias'])) {
+ $alias = $arr['xrd']['alias'];
+ if(! isset($alias[0]))
+ $aliases = array($alias);
+ else
+ $aliases = $alias;
+ if(count($aliases)) {
+ foreach($aliases as $alias) {
+ $links[]['@attributes'] = array('rel' => 'alias' , 'href' => $alias);
+ }
+ }
+ }
+
+ logger('fetch_xrd_links: ' . print_r($links,true), LOGGER_DATA);
+
+ return $links;
+
+}}
+
+
+// Take a URL from the wild, prepend http:// if necessary
+// and check DNS to see if it's real
+// return true if it's OK, false if something is wrong with it
+
+if(! function_exists('validate_url')) {
+function validate_url(&$url) {
+ if(substr($url,0,4) != 'http')
+ $url = 'http://' . $url;
+ $h = @parse_url($url);
+
+ if(($h) && (dns_get_record($h['host'], DNS_A + DNS_CNAME + DNS_PTR))) {
+ return true;
+ }
+ return false;
+}}
+
+// checks that email is an actual resolvable internet address
+
+if(! function_exists('validate_email')) {
+function validate_email($addr) {
+
+ if(! strpos($addr,'@'))
+ return false;
+ $h = substr($addr,strpos($addr,'@') + 1);
+
+ if(($h) && (dns_get_record($h, DNS_A + DNS_CNAME + DNS_PTR + DNS_MX))) {
+ return true;
+ }
+ return false;
+}}
+
+// Check $url against our list of allowed sites,
+// wildcards allowed. If allowed_sites is unset return true;
+// If url is allowed, return true.
+// otherwise, return false
+
+if(! function_exists('allowed_url')) {
+function allowed_url($url) {
+
+ $h = @parse_url($url);
+
+ if(! $h) {
+ return false;
+ }
+
+ $str_allowed = get_config('system','allowed_sites');
+ if(! $str_allowed)
+ return true;
+
+ $found = false;
+
+ $host = strtolower($h['host']);
+
+ // always allow our own site
+
+ if($host == strtolower($_SERVER['SERVER_NAME']))
+ return true;
+
+ $fnmatch = function_exists('fnmatch');
+ $allowed = explode(',',$str_allowed);
+
+ if(count($allowed)) {
+ foreach($allowed as $a) {
+ $pat = strtolower(trim($a));
+ if(($fnmatch && fnmatch($pat,$host)) || ($pat == $host)) {
+ $found = true;
+ break;
+ }
+ }
+ }
+ return $found;
+}}
+
+// check if email address is allowed to register here.
+// Compare against our list (wildcards allowed).
+// Returns false if not allowed, true if allowed or if
+// allowed list is not configured.
+
+if(! function_exists('allowed_email')) {
+function allowed_email($email) {
+
+
+ $domain = strtolower(substr($email,strpos($email,'@') + 1));
+ if(! $domain)
+ return false;
+
+ $str_allowed = get_config('system','allowed_email');
+ if(! $str_allowed)
+ return true;
+
+ $found = false;
+
+ $fnmatch = function_exists('fnmatch');
+ $allowed = explode(',',$str_allowed);
+
+ if(count($allowed)) {
+ foreach($allowed as $a) {
+ $pat = strtolower(trim($a));
+ if(($fnmatch && fnmatch($pat,$domain)) || ($pat == $domain)) {
+ $found = true;
+ break;
+ }
+ }
+ }
+ return $found;
+}}
+
+
+if(! function_exists('gravatar_img')) {
+function gravatar_img($email) {
+ $size = 175;
+ $opt = 'identicon'; // psuedo-random geometric pattern if not found
+ $rating = 'pg';
+ $hash = md5(trim(strtolower($email)));
+
+ $url = 'http://www.gravatar.com/avatar/' . $hash . '.jpg'
+ . '?s=' . $size . '&d=' . $opt . '&r=' . $rating;
+
+ logger('gravatar: ' . $email . ' ' . $url);
+ return $url;
+}}
+
+
+if(! function_exists('parse_xml_string')) {
+function parse_xml_string($s,$strict = true) {
+ if($strict) {
+ if(! strstr($s,'<?xml'))
+ return false;
+ $s2 = substr($s,strpos($s,'<?xml'));
+ }
+ else
+ $s2 = $s;
+ libxml_use_internal_errors(true);
+
+ $x = @simplexml_load_string($s2);
+ if(! $x) {
+ logger('libxml: parse: error: ' . $s2, LOGGER_DATA);
+ foreach(libxml_get_errors() as $err)
+ logger('libxml: parse: ' . $err->code." at ".$err->line.":".$err->column." : ".$err->message, LOGGER_DATA);
+ libxml_clear_errors();
+ }
+ return $x;
+}}
diff --git a/include/notifier.php b/include/notifier.php
index 59e573762..15fb38534 100644
--- a/include/notifier.php
+++ b/include/notifier.php
@@ -50,8 +50,10 @@ function notifier_run($argv, $argc){
$recipients = array();
$url_recipients = array();
- if($cmd === 'mail') {
+ $normal_mode = true;
+ if($cmd === 'mail') {
+ $normal_mode = false;
$message = q("SELECT * FROM `mail` WHERE `id` = %d LIMIT 1",
intval($item_id)
);
@@ -64,6 +66,7 @@ function notifier_run($argv, $argc){
}
elseif($cmd === 'expire') {
+ $normal_mode = false;
$expire = true;
$items = q("SELECT * FROM `item` WHERE `uid` = %d AND `wall` = 1
AND `deleted` = 1 AND `changed` > UTC_TIMESTAMP - INTERVAL 10 MINUTE",
@@ -75,6 +78,7 @@ function notifier_run($argv, $argc){
return;
}
elseif($cmd === 'suggest') {
+ $normal_mode = false;
$suggest = q("SELECT * FROM `fsuggest` WHERE `id` = %d LIMIT 1",
intval($item_id)
);
@@ -95,7 +99,7 @@ function notifier_run($argv, $argc){
return;
}
- $parent_item = $r[0];
+ $target_item = $r[0];
$parent_id = intval($r[0]['parent']);
$uid = $r[0]['uid'];
$updated = $r[0]['edited'];
@@ -119,7 +123,8 @@ function notifier_run($argv, $argc){
$top_level = true;
}
- $r = q("SELECT `contact`.*, `user`.`timezone`, `user`.`nickname`, `user`.`sprvkey`, `user`.`spubkey`,
+ $r = q("SELECT `contact`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`,
+ `user`.`timezone`, `user`.`nickname`, `user`.`sprvkey`, `user`.`spubkey`,
`user`.`page-flags`, `user`.`prvnets`
FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid`
WHERE `contact`.`uid` = %d AND `contact`.`self` = 1 LIMIT 1",
@@ -145,7 +150,7 @@ function notifier_run($argv, $argc){
$parent = $items[0];
- if($parent['type'] === 'remote' && (! $expire)) {
+ if($parent['wall'] == 0 && (! $expire)) {
// local followup to remote post
$followup = true;
$notify_hub = false; // not public
@@ -289,6 +294,11 @@ function notifier_run($argv, $argc){
if(! $item['parent'])
continue;
+ // private emails may be in included in public conversations. Filter them.
+
+ if(($notify_hub) && $item['private'])
+ continue;
+
$contact = get_item_contact($item,$contacts);
if(! $contact)
continue;
@@ -311,9 +321,9 @@ function notifier_run($argv, $argc){
$mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1);
if(! $mail_disabled) {
- if((! strlen($parent_item['allow_cid'])) && (! strlen($parent_item['allow_gid']))
- && (! strlen($parent_item['deny_cid'])) && (! strlen($parent_item['deny_gid']))
- && (intval($parent_item['pubmail']))) {
+ if((! strlen($target_item['allow_cid'])) && (! strlen($target_item['allow_gid']))
+ && (! strlen($target_item['deny_cid'])) && (! strlen($target_item['deny_gid']))
+ && (intval($target_item['pubmail']))) {
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `network` = '%s'",
intval($uid),
dbesc(NETWORK_MAIL)
@@ -346,7 +356,7 @@ function notifier_run($argv, $argc){
$deliver_status = 0;
switch($contact['network']) {
- case 'dfrn':
+ case NETWORK_DFRN:
logger('notifier: dfrndelivery: ' . $contact['name']);
$deliver_status = dfrn_deliver($owner,$contact,$atom);
@@ -364,7 +374,7 @@ function notifier_run($argv, $argc){
);
}
break;
- case 'stat':
+ case NETWORK_OSTATUS:
// Do not send to otatus if we are not configured to send to public networks
if($owner['prvnets'])
@@ -414,7 +424,7 @@ function notifier_run($argv, $argc){
}
break;
- case 'mail':
+ case NETWORK_MAIL:
if(get_config('system','dfrn_only'))
break;
@@ -491,9 +501,34 @@ function notifier_run($argv, $argc){
mail($addr, $subject, $message, $headers);
}
break;
- case 'feed':
- case 'face':
- case 'dspr':
+ case NETWORK_DIASPORA:
+ if(get_config('system','dfrn_only') || (! get_config('diaspora_enabled')) || (! $normal_mode))
+ break;
+
+ if($target_item['deleted']) {
+ // diaspora delete, (check for like)
+
+ break;
+ }
+ elseif($followup) {
+ // send to owner to relay
+
+ break;
+ }
+ elseif($target_item['parent'] != $target_item['id']) {
+ // we are the relay
+
+ break;
+ }
+ elseif($top_level) {
+ diaspora_send_status($target_item,$owner,$contact);
+ break;
+ }
+
+ break;
+
+ case NETWORK_FEED:
+ case NETWORK_FACEBOOK:
if(get_config('system','dfrn_only'))
break;
default:
@@ -504,7 +539,7 @@ function notifier_run($argv, $argc){
// send additional slaps to mentioned remote tags (@foo@example.com)
- if($slap && count($url_recipients) && $followup && $notify_hub && (! $expire)) {
+ if($slap && count($url_recipients) && ($followup || $top_level) && $notify_hub && (! $expire)) {
if(! get_config('system','dfrn_only')) {
foreach($url_recipients as $url) {
if($url) {
@@ -542,7 +577,7 @@ function notifier_run($argv, $argc){
*
*/
- $max_allowed = ((get_config('system','maxpubdeliver') === false) ? 150 : intval(get_config('system','maxpubdeliver')));
+ $max_allowed = ((get_config('system','maxpubdeliver') === false) ? 999 : intval(get_config('system','maxpubdeliver')));
/**
*
@@ -552,10 +587,10 @@ function notifier_run($argv, $argc){
*/
$r = q("SELECT `id`, `name` FROM `contact`
- WHERE `network` = 'dfrn' AND `uid` = %d AND `blocked` = 0 AND `pending` = 0
+ WHERE `network` = NETWORK_DFRN AND `uid` = %d AND `blocked` = 0 AND `pending` = 0
AND `rel` != %d ",
intval($owner['uid']),
- intval(REL_FAN)
+ intval(CONTACT_IS_SHARING)
);
if((count($r)) && (($max_allowed == 0) || (count($r) < $max_allowed))) {
diff --git a/include/oembed.php b/include/oembed.php
index 06a37d8e4..06f71a3b3 100644
--- a/include/oembed.php
+++ b/include/oembed.php
@@ -7,6 +7,7 @@ function oembed_replacecb($matches){
function oembed_fetch_url($embedurl){
+
$r = q("SELECT v FROM `cache` WHERE k='%s'",
dbesc($embedurl));
@@ -16,7 +17,10 @@ function oembed_fetch_url($embedurl){
$txt = "";
// try oembed autodiscovery
- $html_text = fetch_url($embedurl);
+ $redirects = 0;
+ $html_text = fetch_url($embedurl, false, $redirects, 15);
+ if(! $html_text)
+ return;
$dom = @DOMDocument::loadHTML($html_text);
if ($dom){
$xpath = new DOMXPath($dom);
diff --git a/include/plugin.php b/include/plugin.php
new file mode 100644
index 000000000..9f2832981
--- /dev/null
+++ b/include/plugin.php
@@ -0,0 +1,199 @@
+<?php
+
+
+// install and uninstall plugin
+if (! function_exists('uninstall_plugin')){
+function uninstall_plugin($plugin){
+ logger("Addons: uninstalling " . $plugin);
+ q("DELETE FROM `addon` WHERE `name` = '%s' LIMIT 1",
+ dbesc($plugin)
+ );
+
+ @include_once('addon/' . $plugin . '/' . $plugin . '.php');
+ if(function_exists($plugin . '_uninstall')) {
+ $func = $plugin . '_uninstall';
+ $func();
+ }
+}}
+
+if (! function_exists('install_plugin')){
+function install_plugin($plugin){
+ logger("Addons: installing " . $plugin);
+ $t = filemtime('addon/' . $plugin . '/' . $plugin . '.php');
+ @include_once('addon/' . $plugin . '/' . $plugin . '.php');
+ if(function_exists($plugin . '_install')) {
+ $func = $plugin . '_install';
+ $func();
+
+ $plugin_admin = (function_exists($plugin."_plugin_admin")?1:0);
+
+ $r = q("INSERT INTO `addon` (`name`, `installed`, `timestamp`, `plugin_admin`) VALUES ( '%s', 1, %d , %d ) ",
+ dbesc($plugin),
+ intval($t),
+ $plugin_admin
+ );
+ }
+}}
+
+// reload all updated plugins
+
+if(! function_exists('reload_plugins')) {
+function reload_plugins() {
+ $plugins = get_config('system','addon');
+ if(strlen($plugins)) {
+
+ $r = q("SELECT * FROM `addon` WHERE `installed` = 1");
+ if(count($r))
+ $installed = $r;
+ else
+ $installed = array();
+
+ $parr = explode(',',$plugins);
+ if(count($parr)) {
+ foreach($parr as $pl) {
+ $pl = trim($pl);
+
+ $t = filemtime('addon/' . $pl . '/' . $pl . '.php');
+ foreach($installed as $i) {
+ if(($i['name'] == $pl) && ($i['timestamp'] != $t)) {
+ logger('Reloading plugin: ' . $i['name']);
+ @include_once('addon/' . $pl . '/' . $pl . '.php');
+
+ if(function_exists($pl . '_uninstall')) {
+ $func = $pl . '_uninstall';
+ $func();
+ }
+ if(function_exists($pl . '_install')) {
+ $func = $pl . '_install';
+ $func();
+ }
+ q("UPDATE `addon` SET `timestamp` = %d WHERE `id` = %d LIMIT 1",
+ intval($t),
+ intval($i['id'])
+ );
+ }
+ }
+ }
+ }
+ }
+}}
+
+
+
+
+
+if(! function_exists('register_hook')) {
+function register_hook($hook,$file,$function) {
+
+ $r = q("SELECT * FROM `hook` WHERE `hook` = '%s' AND `file` = '%s' AND `function` = '%s' LIMIT 1",
+ dbesc($hook),
+ dbesc($file),
+ dbesc($function)
+ );
+ if(count($r))
+ return true;
+
+ $r = q("INSERT INTO `hook` (`hook`, `file`, `function`) VALUES ( '%s', '%s', '%s' ) ",
+ dbesc($hook),
+ dbesc($file),
+ dbesc($function)
+ );
+ return $r;
+}}
+
+if(! function_exists('unregister_hook')) {
+function unregister_hook($hook,$file,$function) {
+
+ $r = q("DELETE FROM `hook` WHERE `hook` = '%s' AND `file` = '%s' AND `function` = '%s' LIMIT 1",
+ dbesc($hook),
+ dbesc($file),
+ dbesc($function)
+ );
+ return $r;
+}}
+
+
+if(! function_exists('load_hooks')) {
+function load_hooks() {
+ $a = get_app();
+ $a->hooks = array();
+ $r = q("SELECT * FROM `hook` WHERE 1");
+ if(count($r)) {
+ foreach($r as $rr) {
+ $a->hooks[] = array($rr['hook'], $rr['file'], $rr['function']);
+ }
+ }
+}}
+
+
+if(! function_exists('call_hooks')) {
+function call_hooks($name, &$data = null) {
+ $a = get_app();
+
+ if(count($a->hooks)) {
+ foreach($a->hooks as $hook) {
+ if($hook[HOOK_HOOK] === $name) {
+ @include_once($hook[HOOK_FILE]);
+ if(function_exists($hook[HOOK_FUNCTION])) {
+ $func = $hook[HOOK_FUNCTION];
+ $func($a,$data);
+ }
+ }
+ }
+ }
+}}
+
+
+/*
+ * parse plugin comment in search of plugin infos.
+ * like
+ *
+ * * Name: Plugin
+ * * Description: A plugin which plugs in
+ * * Version: 1.2.3
+ * * Author: John <profile url>
+ * * Author: Jane <email>
+ * *
+ */
+
+if (! function_exists('get_plugin_info')){
+function get_plugin_info($plugin){
+ if (!is_file("addon/$plugin/$plugin.php")) return false;
+
+ $f = file_get_contents("addon/$plugin/$plugin.php");
+ $r = preg_match("|/\*.*\*/|msU", $f, $m);
+
+ $info=Array(
+ 'name' => $plugin,
+ 'description' => "",
+ 'author' => array(),
+ 'version' => ""
+ );
+
+ if ($r){
+ $ll = explode("\n", $m[0]);
+ foreach( $ll as $l ) {
+ $l = trim($l,"\t\n\r */");
+ if ($l!=""){
+ list($k,$v) = array_map("trim", explode(":",$l,2));
+ $k= strtolower($k);
+ if ($k=="author"){
+ $r=preg_match("|([^<]+)<([^>]+)>|", $v, $m);
+ if ($r) {
+ $info['author'][] = array('name'=>$m[1], 'link'=>$m[2]);
+ } else {
+ $info['author'][] = array('name'=>$v);
+ }
+ } else {
+ if (array_key_exists($k,$info)){
+ $info[$k]=$v;
+ }
+ }
+
+ }
+ }
+
+ }
+ return $info;
+}}
+
diff --git a/include/poller.php b/include/poller.php
index 569eb59d1..651736a99 100644
--- a/include/poller.php
+++ b/include/poller.php
@@ -80,15 +80,14 @@ function poller_run($argv, $argc){
$d = datetime_convert();
if(! $restart)
- call_hooks('cron', $d);
-
+ proc_run('php','include/cronhooks.php');
$contacts = q("SELECT `id` FROM `contact`
WHERE ( `rel` = %d OR `rel` = %d ) AND `poll` != ''
$sql_extra
AND `self` = 0 AND `blocked` = 0 AND `readonly` = 0 ORDER BY RAND()",
- intval(REL_FAN),
- intval(REL_BUD)
+ intval(CONTACT_IS_SHARING),
+ intval(CONTACT_IS_FRIEND)
);
if(! count($contacts)) {
@@ -101,7 +100,7 @@ function poller_run($argv, $argc){
intval($c['id'])
);
- if(! count($res))
+ if((! $res) || (! count($res)))
continue;
foreach($res as $contact) {
@@ -312,7 +311,7 @@ function poller_run($argv, $argc){
// Will only do this once per notify-enabled OStatus contact
// or if relationship changes
- $stat_writeable = ((($contact['notify']) && ($contact['rel'] == REL_VIP || $contact['rel'] == REL_BUD)) ? 1 : 0);
+ $stat_writeable = ((($contact['notify']) && ($contact['rel'] == CONTACT_IS_FOLLOWER || $contact['rel'] == CONTACT_IS_FRIEND)) ? 1 : 0);
if($stat_writeable != $contact['writable']) {
q("UPDATE `contact` SET `writable` = %d WHERE `id` = %d LIMIT 1",
@@ -323,7 +322,7 @@ function poller_run($argv, $argc){
// Are we allowed to import from this person?
- if($contact['rel'] == REL_VIP || $contact['blocked'] || $contact['readonly'])
+ if($contact['rel'] == CONTACT_IS_FOLLOWER || $contact['blocked'] || $contact['readonly'])
continue;
$xml = fetch_url($contact['poll']);
@@ -421,6 +420,10 @@ function poller_run($argv, $argc){
$datarray['contact-id'] = $contact['id'];
if($datarray['parent-uri'] === $datarray['uri'])
$datarray['private'] = 1;
+ if(! get_pconfig($importer_uid,'system','allow_public_email_replies')) {
+ $datarray['private'] = 1;
+ $datarray['allow_cid'] = '<' . $contact['id'] . '>';
+ }
$datarray['author-name'] = $contact['name'];
$datarray['author-link'] = 'mailbox';
$datarray['author-avatar'] = $contact['photo'];
@@ -440,7 +443,8 @@ function poller_run($argv, $argc){
}
}
elseif($contact['network'] === NETWORK_FACEBOOK) {
- // TODO: work in progress
+ // This is picked up by the Facebook plugin on a cron hook.
+ // Ignored here.
}
if($xml) {
@@ -463,7 +467,7 @@ function poller_run($argv, $argc){
consume_feed($xml,$importer,$contact,$hub,1);
- if((strlen($hub)) && ($hub_update) && (($contact['rel'] == REL_BUD) || (($contact['network'] === NETWORK_OSTATUS) && (! $contact['readonly'])))) {
+ if((strlen($hub)) && ($hub_update) && (($contact['rel'] == CONTACT_IS_FRIEND) || (($contact['network'] === NETWORK_OSTATUS) && (! $contact['readonly'])))) {
logger('poller: subscribing to hub(s) : ' . $hub . ' contact name : ' . $contact['name'] . ' local user : ' . $importer['name']);
$hubs = explode(',', $hub);
if(count($hubs)) {
diff --git a/include/salmon.php b/include/salmon.php
index 473432f25..4043b4f1d 100644
--- a/include/salmon.php
+++ b/include/salmon.php
@@ -1,53 +1,8 @@
<?php
-require_once('library/asn1.php');
+require_once('include/crypto.php');
-function salmon_key($pubkey) {
- $lines = explode("\n",$pubkey);
- unset($lines[0]);
- unset($lines[count($lines)]);
- $x = base64_decode(implode('',$lines));
- $r = ASN_BASE::parseASNString($x);
-
- $m = $r[0]->asnData[1]->asnData[0]->asnData[0]->asnData;
- $e = $r[0]->asnData[1]->asnData[0]->asnData[1]->asnData;
-
-
- return 'RSA' . '.' . $m . '.' . $e ;
-}
-
-
-function base64url_encode($s, $strip_padding = false) {
-
- $s = strtr(base64_encode($s),'+/','-_');
-
- if($strip_padding)
- $s = str_replace('=','',$s);
-
- return $s;
-}
-
-function base64url_decode($s) {
-
-/*
- * // Placeholder for new rev of salmon which strips base64 padding.
- * // PHP base64_decode handles the un-padded input without requiring this step
- * // Uncomment if you find you need it.
- *
- * $l = strlen($s);
- * if(! strpos($s,'=')) {
- * $m = $l % 4;
- * if($m == 2)
- * $s .= '==';
- * if($m == 3)
- * $s .= '=';
- * }
- *
- */
-
- return base64_decode(strtr($s,'-_','+/'));
-}
function get_salmon_key($uri,$keyhash) {
$ret = array();
@@ -141,28 +96,20 @@ EOT;
$data_type = 'application/atom+xml';
$encoding = 'base64url';
$algorithm = 'RSA-SHA256';
- $keyhash = base64url_encode(hash('sha256',salmon_key($owner['spubkey'])));
-
- // Setup RSA stuff to PKCS#1 sign the data
-
- set_include_path(get_include_path() . PATH_SEPARATOR . 'library/phpsec');
-
- require_once('library/phpsec/Crypt/RSA.php');
-
- $rsa = new CRYPT_RSA();
- $rsa->signatureMode = CRYPT_RSA_SIGNATURE_PKCS1;
- $rsa->setHash('sha256');
- $rsa->loadKey($owner['sprvkey']);
+ $keyhash = base64url_encode(hash('sha256',salmon_key($owner['spubkey'])),true);
// precomputed base64url encoding of data_type, encoding, algorithm concatenated with periods
$precomputed = '.YXBwbGljYXRpb24vYXRvbSt4bWw=.YmFzZTY0dXJs.UlNBLVNIQTI1Ng==';
- $signature = base64url_encode($rsa->sign($data . $precomputed));
+ $signature = base64url_encode(rsa_sign(str_replace('=','',$data . $precomputed),true),$owner['sprvkey']);
+
+ $signature2 = base64url_encode(rsa_sign($data . $precomputed),$owner['sprvkey']);
- $signature2 = base64url_encode($rsa->sign($data));
+ $signature3 = base64url_encode(rsa_sign($data),$owner['sprvkey']);
$salmon_tpl = get_markup_template('magicsig.tpl');
+
$salmon = replace_macros($salmon_tpl,array(
'$data' => $data,
'$encoding' => $encoding,
@@ -184,11 +131,11 @@ EOT;
if($return_code > 299) {
- logger('slapper: compliant salmon failed. Falling back to status.net hack');
+ logger('slapper: compliant salmon failed. Falling back to status.net hack2');
// Entirely likely that their salmon implementation is
// non-compliant. Let's try once more, this time only signing
- // the data, without the precomputed blob
+ // the data, without stripping '=' chars
$salmon = replace_macros($salmon_tpl,array(
'$data' => $data,
@@ -205,6 +152,30 @@ EOT;
));
$return_code = $a->get_curl_code();
+
+ if($return_code > 299) {
+
+ logger('slapper: compliant salmon failed. Falling back to status.net hack3');
+
+ // Entirely likely that their salmon implementation is
+ // non-compliant. Let's try once more, this time only signing
+ // the data, without the precomputed blob
+
+ $salmon = replace_macros($salmon_tpl,array(
+ '$data' => $data,
+ '$encoding' => $encoding,
+ '$algorithm' => $algorithm,
+ '$keyhash' => $keyhash,
+ '$signature' => $signature3
+ ));
+
+ // slap them
+ post_url($url,$salmon, array(
+ 'Content-type: application/magic-envelope+xml',
+ 'Content-length: ' . strlen($salmon)
+ ));
+ $return_code = $a->get_curl_code();
+ }
}
logger('slapper returned ' . $return_code);
if(! $return_code)
diff --git a/include/security.php b/include/security.php
index 789e47db2..6fbdd697f 100644
--- a/include/security.php
+++ b/include/security.php
@@ -28,8 +28,8 @@ function can_write_wall(&$a,$owner) {
AND `user`.`blockwall` = 0 AND `readonly` = 0 AND ( `contact`.`rel` IN ( %d , %d ) OR `user`.`page-flags` = %d ) LIMIT 1",
intval($owner),
intval(remote_user()),
- intval(REL_VIP),
- intval(REL_BUD),
+ intval(CONTACT_IS_FOLLOWER),
+ intval(CONTACT_IS_FRIEND),
intval(PAGE_COMMUNITY)
);
if(count($r)) {
diff --git a/include/text.php b/include/text.php
new file mode 100644
index 000000000..803bf0e51
--- /dev/null
+++ b/include/text.php
@@ -0,0 +1,954 @@
+<?php
+
+// This is our template processor.
+// $s is the string requiring macro substitution.
+// $r is an array of key value pairs (search => replace)
+// returns substituted string.
+// WARNING: this is pretty basic, and doesn't properly handle search strings that are substrings of each other.
+// For instance if 'test' => "foo" and 'testing' => "bar", testing could become either bar or fooing,
+// depending on the order in which they were declared in the array.
+
+require_once("include/template_processor.php");
+
+if(! function_exists('replace_macros')) {
+function replace_macros($s,$r) {
+ global $t;
+
+ return $t->replace($s,$r);
+
+}}
+
+
+// random string, there are 86 characters max in text mode, 128 for hex
+// output is urlsafe
+
+define('RANDOM_STRING_HEX', 0x00 );
+define('RANDOM_STRING_TEXT', 0x01 );
+
+if(! function_exists('random_string')) {
+function random_string($size = 64,$type = RANDOM_STRING_HEX) {
+ // generate a bit of entropy and run it through the whirlpool
+ $s = hash('whirlpool', (string) rand() . uniqid(rand(),true) . (string) rand(),(($type == RANDOM_STRING_TEXT) ? true : false));
+ $s = (($type == RANDOM_STRING_TEXT) ? str_replace("\n","",base64url_encode($s,true)) : $s);
+ return(substr($s,0,$size));
+}}
+
+/**
+ * This is our primary input filter.
+ *
+ * The high bit hack only involved some old IE browser, forget which (IE5/Mac?)
+ * that had an XSS attack vector due to stripping the high-bit on an 8-bit character
+ * after cleansing, and angle chars with the high bit set could get through as markup.
+ *
+ * This is now disabled because it was interfering with some legitimate unicode sequences
+ * and hopefully there aren't a lot of those browsers left.
+ *
+ * Use this on any text input where angle chars are not valid or permitted
+ * They will be replaced with safer brackets. This may be filtered further
+ * if these are not allowed either.
+ *
+ */
+
+if(! function_exists('notags')) {
+function notags($string) {
+
+ return(str_replace(array("<",">"), array('[',']'), $string));
+
+// High-bit filter no longer used
+// return(str_replace(array("<",">","\xBA","\xBC","\xBE"), array('[',']','','',''), $string));
+}}
+
+// use this on "body" or "content" input where angle chars shouldn't be removed,
+// and allow them to be safely displayed.
+
+if(! function_exists('escape_tags')) {
+function escape_tags($string) {
+
+ return(htmlspecialchars($string));
+}}
+
+
+// generate a string that's random, but usually pronounceable.
+// used to generate initial passwords
+
+if(! function_exists('autoname')) {
+function autoname($len) {
+
+ $vowels = array('a','a','ai','au','e','e','e','ee','ea','i','ie','o','ou','u');
+ if(mt_rand(0,5) == 4)
+ $vowels[] = 'y';
+
+ $cons = array(
+ 'b','bl','br',
+ 'c','ch','cl','cr',
+ 'd','dr',
+ 'f','fl','fr',
+ 'g','gh','gl','gr',
+ 'h',
+ 'j',
+ 'k','kh','kl','kr',
+ 'l',
+ 'm',
+ 'n',
+ 'p','ph','pl','pr',
+ 'qu',
+ 'r','rh',
+ 's','sc','sh','sm','sp','st',
+ 't','th','tr',
+ 'v',
+ 'w','wh',
+ 'x',
+ 'z','zh'
+ );
+
+ $midcons = array('ck','ct','gn','ld','lf','lm','lt','mb','mm', 'mn','mp',
+ 'nd','ng','nk','nt','rn','rp','rt');
+
+ $noend = array('bl', 'br', 'cl','cr','dr','fl','fr','gl','gr',
+ 'kh', 'kl','kr','mn','pl','pr','rh','tr','qu','wh');
+
+ $start = mt_rand(0,2);
+ if($start == 0)
+ $table = $vowels;
+ else
+ $table = $cons;
+
+ $word = '';
+
+ for ($x = 0; $x < $len; $x ++) {
+ $r = mt_rand(0,count($table) - 1);
+ $word .= $table[$r];
+
+ if($table == $vowels)
+ $table = array_merge($cons,$midcons);
+ else
+ $table = $vowels;
+
+ }
+
+ $word = substr($word,0,$len);
+
+ foreach($noend as $noe) {
+ if((strlen($word) > 2) && (substr($word,-2) == $noe)) {
+ $word = substr($word,0,-1);
+ break;
+ }
+ }
+ if(substr($word,-1) == 'q')
+ $word = substr($word,0,-1);
+ return $word;
+}}
+
+
+// escape text ($str) for XML transport
+// returns escaped text.
+
+if(! function_exists('xmlify')) {
+function xmlify($str) {
+ $buffer = '';
+
+ for($x = 0; $x < strlen($str); $x ++) {
+ $char = $str[$x];
+
+ switch( $char ) {
+
+ case "\r" :
+ break;
+ case "&" :
+ $buffer .= '&amp;';
+ break;
+ case "'" :
+ $buffer .= '&apos;';
+ break;
+ case "\"" :
+ $buffer .= '&quot;';
+ break;
+ case '<' :
+ $buffer .= '&lt;';
+ break;
+ case '>' :
+ $buffer .= '&gt;';
+ break;
+ case "\n" :
+ $buffer .= "\n";
+ break;
+ default :
+ $buffer .= $char;
+ break;
+ }
+ }
+ $buffer = trim($buffer);
+ return($buffer);
+}}
+
+// undo an xmlify
+// pass xml escaped text ($s), returns unescaped text
+
+if(! function_exists('unxmlify')) {
+function unxmlify($s) {
+ $ret = str_replace('&amp;','&', $s);
+ $ret = str_replace(array('&lt;','&gt;','&quot;','&apos;'),array('<','>','"',"'"),$ret);
+ return $ret;
+}}
+
+// convenience wrapper, reverse the operation "bin2hex"
+
+if(! function_exists('hex2bin')) {
+function hex2bin($s) {
+ if(! ctype_xdigit($s)) {
+ logger('hex2bin: illegal input: ' . print_r(debug_backtrace(), true));
+ return($s);
+ }
+
+ return(pack("H*",$s));
+}}
+
+// Automatic pagination.
+// To use, get the count of total items.
+// Then call $a->set_pager_total($number_items);
+// Optionally call $a->set_pager_itemspage($n) to the number of items to display on each page
+// Then call paginate($a) after the end of the display loop to insert the pager block on the page
+// (assuming there are enough items to paginate).
+// When using with SQL, the setting LIMIT %d, %d => $a->pager['start'],$a->pager['itemspage']
+// will limit the results to the correct items for the current page.
+// The actual page handling is then accomplished at the application layer.
+
+if(! function_exists('paginate')) {
+function paginate(&$a) {
+ $o = '';
+ $stripped = preg_replace('/(&page=[0-9]*)/','',$a->query_string);
+ $stripped = str_replace('q=','',$stripped);
+ $stripped = trim($stripped,'/');
+ $pagenum = $a->pager['page'];
+ $url = $a->get_baseurl() . '/' . $stripped;
+
+
+ if($a->pager['total'] > $a->pager['itemspage']) {
+ $o .= '<div class="pager">';
+ if($a->pager['page'] != 1)
+ $o .= '<span class="pager_prev">'."<a href=\"$url".'&page='.($a->pager['page'] - 1).'">' . t('prev') . '</a></span> ';
+
+ $o .= "<span class=\"pager_first\"><a href=\"$url"."&page=1\">" . t('first') . "</a></span> ";
+
+ $numpages = $a->pager['total'] / $a->pager['itemspage'];
+
+ $numstart = 1;
+ $numstop = $numpages;
+
+ if($numpages > 14) {
+ $numstart = (($pagenum > 7) ? ($pagenum - 7) : 1);
+ $numstop = (($pagenum > ($numpages - 7)) ? $numpages : ($numstart + 14));
+ }
+
+ for($i = $numstart; $i <= $numstop; $i++){
+ if($i == $a->pager['page'])
+ $o .= '<span class="pager_current">'.(($i < 10) ? '&nbsp;'.$i : $i);
+ else
+ $o .= "<span class=\"pager_n\"><a href=\"$url"."&page=$i\">".(($i < 10) ? '&nbsp;'.$i : $i)."</a>";
+ $o .= '</span> ';
+ }
+
+ if(($a->pager['total'] % $a->pager['itemspage']) != 0) {
+ if($i == $a->pager['page'])
+ $o .= '<span class="pager_current">'.(($i < 10) ? '&nbsp;'.$i : $i);
+ else
+ $o .= "<span class=\"pager_n\"><a href=\"$url"."&page=$i\">".(($i < 10) ? '&nbsp;'.$i : $i)."</a>";
+ $o .= '</span> ';
+ }
+
+ $lastpage = (($numpages > intval($numpages)) ? intval($numpages)+1 : $numpages);
+ $o .= "<span class=\"pager_last\"><a href=\"$url"."&page=$lastpage\">" . t('last') . "</a></span> ";
+
+ if(($a->pager['total'] - ($a->pager['itemspage'] * $a->pager['page'])) > 0)
+ $o .= '<span class="pager_next">'."<a href=\"$url"."&page=".($a->pager['page'] + 1).'">' . t('next') . '</a></span>';
+ $o .= '</div>'."\r\n";
+ }
+ return $o;
+}}
+
+// Turn user/group ACLs stored as angle bracketed text into arrays
+
+if(! function_exists('expand_acl')) {
+function expand_acl($s) {
+ // turn string array of angle-bracketed elements into numeric array
+ // e.g. "<1><2><3>" => array(1,2,3);
+ $ret = array();
+
+ if(strlen($s)) {
+ $t = str_replace('<','',$s);
+ $a = explode('>',$t);
+ foreach($a as $aa) {
+ if(intval($aa))
+ $ret[] = intval($aa);
+ }
+ }
+ return $ret;
+}}
+
+// Used to wrap ACL elements in angle brackets for storage
+
+if(! function_exists('sanitise_acl')) {
+function sanitise_acl(&$item) {
+ if(intval($item))
+ $item = '<' . intval(notags(trim($item))) . '>';
+ else
+ unset($item);
+}}
+
+
+// Convert an ACL array to a storable string
+
+if(! function_exists('perms2str')) {
+function perms2str($p) {
+ $ret = '';
+ $tmp = $p;
+ if(is_array($tmp)) {
+ array_walk($tmp,'sanitise_acl');
+ $ret = implode('',$tmp);
+ }
+ return $ret;
+}}
+
+// generate a guaranteed unique (for this domain) item ID for ATOM
+// safe from birthday paradox
+
+if(! function_exists('item_new_uri')) {
+function item_new_uri($hostname,$uid) {
+
+ do {
+ $dups = false;
+ $hash = random_string();
+
+ $uri = "urn:X-dfrn:" . $hostname . ':' . $uid . ':' . $hash;
+
+ $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' LIMIT 1",
+ dbesc($uri));
+ if(count($r))
+ $dups = true;
+ } while($dups == true);
+ return $uri;
+}}
+
+// Generate a guaranteed unique photo ID.
+// safe from birthday paradox
+
+if(! function_exists('photo_new_resource')) {
+function photo_new_resource() {
+
+ do {
+ $found = false;
+ $resource = hash('md5',uniqid(mt_rand(),true));
+ $r = q("SELECT `id` FROM `photo` WHERE `resource-id` = '%s' LIMIT 1",
+ dbesc($resource)
+ );
+ if(count($r))
+ $found = true;
+ } while($found == true);
+ return $resource;
+}}
+
+
+// wrapper to load a view template, checking for alternate
+// languages before falling back to the default
+
+// obsolete, deprecated.
+
+if(! function_exists('load_view_file')) {
+function load_view_file($s) {
+ global $lang, $a;
+ if(! isset($lang))
+ $lang = 'en';
+ $b = basename($s);
+ $d = dirname($s);
+ if(file_exists("$d/$lang/$b"))
+ return file_get_contents("$d/$lang/$b");
+
+ $theme = current_theme();
+
+ if(file_exists("$d/theme/$theme/$b"))
+ return file_get_contents("$d/theme/$theme/$b");
+
+ return file_get_contents($s);
+}}
+
+if(! function_exists('get_intltext_template')) {
+function get_intltext_template($s) {
+ global $lang;
+
+ if(! isset($lang))
+ $lang = 'en';
+
+ if(file_exists("view/$lang/$s"))
+ return file_get_contents("view/$lang/$s");
+ elseif(file_exists("view/en/$s"))
+ return file_get_contents("view/en/$s");
+ else
+ return file_get_contents("view/$s");
+}}
+
+if(! function_exists('get_markup_template')) {
+function get_markup_template($s) {
+
+ $theme = current_theme();
+
+ if(file_exists("view/theme/$theme/$s"))
+ return file_get_contents("view/theme/$theme/$s");
+ else
+ return file_get_contents("view/$s");
+
+}}
+
+
+
+
+
+// for html,xml parsing - let's say you've got
+// an attribute foobar="class1 class2 class3"
+// and you want to find out if it contains 'class3'.
+// you can't use a normal sub string search because you
+// might match 'notclass3' and a regex to do the job is
+// possible but a bit complicated.
+// pass the attribute string as $attr and the attribute you
+// are looking for as $s - returns true if found, otherwise false
+
+if(! function_exists('attribute_contains')) {
+function attribute_contains($attr,$s) {
+ $a = explode(' ', $attr);
+ if(count($a) && in_array($s,$a))
+ return true;
+ return false;
+}}
+
+if(! function_exists('logger')) {
+function logger($msg,$level = 0) {
+ $debugging = get_config('system','debugging');
+ $loglevel = intval(get_config('system','loglevel'));
+ $logfile = get_config('system','logfile');
+
+ if((! $debugging) || (! $logfile) || ($level > $loglevel))
+ return;
+
+ @file_put_contents($logfile, datetime_convert() . ':' . session_id() . ' ' . $msg . "\n", FILE_APPEND);
+ return;
+}}
+
+
+if(! function_exists('activity_match')) {
+function activity_match($haystack,$needle) {
+ if(($haystack === $needle) || ((basename($needle) === $haystack) && strstr($needle,NAMESPACE_ACTIVITY_SCHEMA)))
+ return true;
+ return false;
+}}
+
+
+// Pull out all #hashtags and @person tags from $s;
+// We also get @person@domain.com - which would make
+// the regex quite complicated as tags can also
+// end a sentence. So we'll run through our results
+// and strip the period from any tags which end with one.
+// Returns array of tags found, or empty array.
+
+
+if(! function_exists('get_tags')) {
+function get_tags($s) {
+ $ret = array();
+
+ // ignore anything in a code block
+
+ $s = preg_replace('/\[code\](.*?)\[\/code\]/sm','',$s);
+
+ // Match full names against @tags including the space between first and last
+ // We will look these up afterward to see if they are full names or not recognisable.
+
+ if(preg_match_all('/(@[^ \x0D\x0A,:?]+ [^ \x0D\x0A,:?]+)([ \x0D\x0A,:?]|$)/',$s,$match)) {
+ foreach($match[1] as $mtch) {
+ if(strstr($mtch,"]")) {
+ // we might be inside a bbcode color tag - leave it alone
+ continue;
+ }
+ if(substr($mtch,-1,1) === '.')
+ $ret[] = substr($mtch,0,-1);
+ else
+ $ret[] = $mtch;
+ }
+ }
+
+ // Otherwise pull out single word tags. These can be @nickname, @first_last
+ // and #hash tags.
+
+ if(preg_match_all('/([@#][^ \x0D\x0A,:?]+)([ \x0D\x0A,:?]|$)/',$s,$match)) {
+ foreach($match[1] as $mtch) {
+ if(strstr($mtch,"]")) {
+ // we might be inside a bbcode color tag - leave it alone
+ continue;
+ }
+ // ignore strictly numeric tags like #1
+ if((strpos($mtch,'#') === 0) && ctype_digit(substr($mtch,1)))
+ continue;
+ if(substr($mtch,-1,1) === '.')
+ $ret[] = substr($mtch,0,-1);
+ else
+ $ret[] = $mtch;
+ }
+ }
+ return $ret;
+}}
+
+
+// quick and dirty quoted_printable encoding
+
+if(! function_exists('qp')) {
+function qp($s) {
+return str_replace ("%","=",rawurlencode($s));
+}}
+
+
+
+if(! function_exists('get_mentions')) {
+function get_mentions($item) {
+ $o = '';
+ if(! strlen($item['tag']))
+ return $o;
+
+ $arr = explode(',',$item['tag']);
+ foreach($arr as $x) {
+ $matches = null;
+ if(preg_match('/@\[url=([^\]]*)\]/',$x,$matches)) {
+ $o .= "\t\t" . '<link rel="mentioned" href="' . $matches[1] . '" />' . "\r\n";
+ $o .= "\t\t" . '<link rel="ostatus:attention" href="' . $matches[1] . '" />' . "\r\n";
+ }
+ }
+ return $o;
+}}
+
+if(! function_exists('contact_block')) {
+function contact_block() {
+ $o = '';
+ $a = get_app();
+
+ $shown = get_pconfig($a->profile['uid'],'system','display_friend_count');
+ if(! $shown)
+ $shown = 24;
+
+ if((! is_array($a->profile)) || ($a->profile['hide-friends']))
+ return $o;
+ $r = q("SELECT COUNT(*) AS `total` FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 and `pending` = 0",
+ intval($a->profile['uid'])
+ );
+ if(count($r)) {
+ $total = intval($r[0]['total']);
+ }
+ if(! $total) {
+ $o .= '<h4 class="contact-h4">' . t('No contacts') . '</h4>';
+ return $o;
+ }
+ $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 and `pending` = 0 ORDER BY RAND() LIMIT %d",
+ intval($a->profile['uid']),
+ intval($shown)
+ );
+ if(count($r)) {
+ $o .= '<h4 class="contact-h4">' . sprintf( tt('%d Contact','%d Contacts', $total),$total) . '</h4><div id="contact-block">';
+ foreach($r as $rr) {
+ $o .= micropro($rr,true,'mpfriend');
+ }
+ $o .= '</div><div id="contact-block-end"></div>';
+ $o .= '<div id="viewcontacts"><a id="viewcontacts-link" href="viewcontacts/' . $a->profile['nickname'] . '">' . t('View Contacts') . '</a></div>';
+
+ }
+
+ $arr = array('contacts' => $r, 'output' => $o);
+
+ call_hooks('contact_block_end', $arr);
+ return $o;
+
+}}
+
+if(! function_exists('micropro')) {
+function micropro($contact, $redirect = false, $class = '', $textmode = false) {
+
+ if($class)
+ $class = ' ' . $class;
+
+ $url = $contact['url'];
+ $sparkle = '';
+
+ if($redirect) {
+ $a = get_app();
+ $redirect_url = $a->get_baseurl() . '/redir/' . $contact['id'];
+ if(local_user() && ($contact['uid'] == local_user()) && ($contact['network'] === 'dfrn')) {
+ $url = $redirect_url;
+ $sparkle = ' sparkle';
+ }
+ }
+ $click = ((x($contact,'click')) ? ' onclick="' . $contact['click'] . '" ' : '');
+ if($click)
+ $url = '';
+ if($textmode) {
+ return '<div class="contact-block-textdiv' . $class . '"><a class="contact-block-link' . $class . $sparkle
+ . (($click) ? ' fakelink' : '') . '" '
+ . (($url) ? ' href="' . $url . '"' : '') . $click
+ . '" title="' . $contact['name'] . ' [' . $contact['url'] . ']" alt="' . $contact['name']
+ . '" >'. $contact['name'] . '</a></div>' . "\r\n";
+ }
+ else {
+ return '<div class="contact-block-div' . $class . '"><a class="contact-block-link' . $class . $sparkle
+ . (($click) ? ' fakelink' : '') . '" '
+ . (($url) ? ' href="' . $url . '"' : '') . $click . ' ><img class="contact-block-img' . $class . $sparkle . '" src="'
+ . $contact['micro'] . '" title="' . $contact['name'] . ' [' . $contact['url'] . ']" alt="' . $contact['name']
+ . '" /></a></div>' . "\r\n";
+ }
+}}
+
+
+
+if(! function_exists('search')) {
+function search($s,$id='search-box',$url='/search') {
+ $a = get_app();
+ $o = '<div id="' . $id . '">';
+ $o .= '<form action="' . $a->get_baseurl() . $url . '" method="get" >';
+ $o .= '<input type="text" name="search" id="search-text" value="' . $s .'" />';
+ $o .= '<input type="submit" name="submit" id="search-submit" value="' . t('Search') . '" />';
+ $o .= '</form></div>';
+ return $o;
+}}
+
+if(! function_exists('valid_email')) {
+function valid_email($x){
+ if(preg_match('/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)+$/',$x))
+ return true;
+ return false;
+}}
+
+
+if(! function_exists('aes_decrypt')) {
+function aes_decrypt($val,$ky)
+{
+ $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
+ for($a=0;$a<strlen($ky);$a++)
+ $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a]));
+ $mode = MCRYPT_MODE_ECB;
+ $enc = MCRYPT_RIJNDAEL_128;
+ $dec = @mcrypt_decrypt($enc, $key, $val, $mode, @mcrypt_create_iv( @mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM ) );
+ return rtrim($dec,(( ord(substr($dec,strlen($dec)-1,1))>=0 and ord(substr($dec, strlen($dec)-1,1))<=16)? chr(ord( substr($dec,strlen($dec)-1,1))):null));
+}}
+
+
+if(! function_exists('aes_encrypt')) {
+function aes_encrypt($val,$ky)
+{
+ $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
+ for($a=0;$a<strlen($ky);$a++)
+ $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a]));
+ $mode=MCRYPT_MODE_ECB;
+ $enc=MCRYPT_RIJNDAEL_128;
+ $val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16)));
+ return mcrypt_encrypt($enc, $key, $val, $mode, mcrypt_create_iv( mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM));
+}}
+
+
+/**
+ *
+ * Function: linkify
+ *
+ * Replace naked text hyperlink with HTML formatted hyperlink
+ *
+ */
+
+if(! function_exists('linkify')) {
+function linkify($s) {
+ $s = preg_replace("/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'\%\$\!\+]*)/", ' <a href="$1" target="external-link">$1</a>', $s);
+ return($s);
+}}
+
+
+/**
+ *
+ * Function: smilies
+ *
+ * Description:
+ * Replaces text emoticons with graphical images
+ *
+ * @Parameter: string $s
+ *
+ * Returns string
+ */
+
+if(! function_exists('smilies')) {
+function smilies($s) {
+ $a = get_app();
+
+ return str_replace(
+ array( '&lt;3', '&lt;/3', '&lt;\\3', ':-)', ':)', ';-)', ':-(', ':(', ':-P', ':P', ':-"', ':-x', ':-X', ':-D', '8-|', '8-O',
+ '~friendika', 'Diaspora*' ),
+ array(
+ '<img src="' . $a->get_baseurl() . '/images/smiley-heart.gif" alt="<3" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-brokenheart.gif" alt="</3" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-brokenheart.gif" alt="<\\3" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-smile.gif" alt=":-)" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-smile.gif" alt=":)" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-wink.gif" alt=";-)" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-frown.gif" alt=":-(" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-frown.gif" alt=":(" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-tongue-out.gif" alt=":-P" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-tongue-out.gif" alt=":P" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-kiss.gif" alt=":-\"" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-kiss.gif" alt=":-x" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-kiss.gif" alt=":-X" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-laughing.gif" alt=":-D" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-surprised.gif" alt="8-|" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-surprised.gif" alt="8-O" />',
+ '<a href="http://project.friendika.com">~friendika <img src="' . $a->get_baseurl() . '/images/friendika-16.png" alt="~friendika" /></a>',
+ '<a href="http://joindiaspora.com">Diaspora<img src="' . $a->get_baseurl() . '/images/diaspora.png" alt="Diaspora*" /></a>',
+
+ ), $s);
+}}
+
+
+
+if(! function_exists('day_translate')) {
+function day_translate($s) {
+ $ret = str_replace(array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'),
+ array( t('Monday'), t('Tuesday'), t('Wednesday'), t('Thursday'), t('Friday'), t('Saturday'), t('Sunday')),
+ $s);
+
+ $ret = str_replace(array('January','February','March','April','May','June','July','August','September','October','November','December'),
+ array( t('January'), t('February'), t('March'), t('April'), t('May'), t('June'), t('July'), t('August'), t('September'), t('October'), t('November'), t('December')),
+ $ret);
+
+ return $ret;
+}}
+
+
+if(! function_exists('normalise_link')) {
+function normalise_link($url) {
+ $ret = str_replace(array('https:','//www.'), array('http:','//'), $url);
+ return(rtrim($ret,'/'));
+}}
+
+/**
+ *
+ * Compare two URLs to see if they are the same, but ignore
+ * slight but hopefully insignificant differences such as if one
+ * is https and the other isn't, or if one is www.something and
+ * the other isn't - and also ignore case differences.
+ *
+ * Return true if the URLs match, otherwise false.
+ *
+ */
+
+if(! function_exists('link_compare')) {
+function link_compare($a,$b) {
+ if(strcasecmp(normalise_link($a),normalise_link($b)) === 0)
+ return true;
+ return false;
+}}
+
+// Given an item array, convert the body element from bbcode to html and add smilie icons.
+// If attach is true, also add icons for item attachments
+
+
+if(! function_exists('prepare_body')) {
+function prepare_body($item,$attach = false) {
+
+ $s = prepare_text($item['body']);
+ if(! $attach)
+ return $s;
+
+ $arr = explode(',',$item['attach']);
+ if(count($arr)) {
+ $s .= '<div class="body-attach">';
+ foreach($arr as $r) {
+ $matches = false;
+ $icon = '';
+ $cnt = preg_match('|\[attach\]href=\"(.*?)\" length=\"(.*?)\" type=\"(.*?)\" title=\"(.*?)\"\[\/attach\]|',$r,$matches);
+ if($cnt) {
+ $icontype = strtolower(substr($matches[3],0,strpos($matches[3],'/')));
+ switch($icontype) {
+ case 'video':
+ case 'audio':
+ case 'image':
+ case 'text':
+ $icon = '<div class="attachtype type-' . $icontype . '"></div>';
+ break;
+ default:
+ $icon = '<div class="attachtype type-unkn"></div>';
+ break;
+ }
+ $title = ((strlen(trim($matches[4]))) ? escape_tags(trim($matches[4])) : escape_tags($matches[1]));
+ $title .= ' ' . $matches[2] . ' ' . t('bytes');
+
+ $s .= '<a href="' . strip_tags($matches[1]) . '" title="' . $title . '" class="attachlink" target="external-link" >' . $icon . '</a>';
+ }
+ }
+ $s .= '<div class="clear"></div></div>';
+ }
+ return $s;
+}}
+
+
+// Given a text string, convert from bbcode to html and add smilie icons.
+
+if(! function_exists('prepare_text')) {
+function prepare_text($text) {
+
+ require_once('include/bbcode.php');
+
+ $s = smilies(bbcode($text));
+
+ return $s;
+}}
+
+
+/**
+ * return atom link elements for all of our hubs
+ */
+
+if(! function_exists('feed_hublinks')) {
+function feed_hublinks() {
+
+ $hub = get_config('system','huburl');
+
+ $hubxml = '';
+ if(strlen($hub)) {
+ $hubs = explode(',', $hub);
+ if(count($hubs)) {
+ foreach($hubs as $h) {
+ $h = trim($h);
+ if(! strlen($h))
+ continue;
+ $hubxml .= '<link rel="hub" href="' . xmlify($h) . '" />' . "\n" ;
+ }
+ }
+ }
+ return $hubxml;
+}}
+
+/* return atom link elements for salmon endpoints */
+
+if(! function_exists('feed_salmonlinks')) {
+function feed_salmonlinks($nick) {
+
+ $a = get_app();
+
+ $salmon = '<link rel="salmon" href="' . xmlify($a->get_baseurl() . '/salmon/' . $nick) . '" />' . "\n" ;
+
+ // old style links that status.net still needed as of 12/2010
+
+ $salmon .= ' <link rel="http://salmon-protocol.org/ns/salmon-replies" href="' . xmlify($a->get_baseurl() . '/salmon/' . $nick) . '" />' . "\n" ;
+ $salmon .= ' <link rel="http://salmon-protocol.org/ns/salmon-mention" href="' . xmlify($a->get_baseurl() . '/salmon/' . $nick) . '" />' . "\n" ;
+ return $salmon;
+}}
+
+if(! function_exists('get_plink')) {
+function get_plink($item) {
+ $a = get_app();
+ $plink = (((x($item,'plink')) && (! $item['private'])) ? '<div class="wall-item-links-wrapper"><a href="'
+ . $item['plink'] . '" title="' . t('link to source') . '" target="external-link" class="icon remote-link"></a></div>' : '');
+ return $plink;
+}}
+
+if(! function_exists('unamp')) {
+function unamp($s) {
+ return str_replace('&amp;', '&', $s);
+}}
+
+
+
+
+if(! function_exists('lang_selector')) {
+function lang_selector() {
+ global $lang;
+ $o = '<div id="lang-select-icon" class="icon language" title="' . t('Select an alternate language') . '" onclick="openClose(\'language-selector\');" ></div>';
+ $o .= '<div id="language-selector" style="display: none;" >';
+ $o .= '<form action="" method="post" ><select name="system_language" onchange="this.form.submit();" >';
+ $langs = glob('view/*/strings.php');
+ if(is_array($langs) && count($langs)) {
+ if(! in_array('view/en/strings.php',$langs))
+ $langs[] = 'view/en/';
+ asort($langs);
+ foreach($langs as $l) {
+ $ll = substr($l,5);
+ $ll = substr($ll,0,strrpos($ll,'/'));
+ $selected = (($ll === $lang) ? ' selected="selected" ' : '');
+ $o .= '<option value="' . $ll . '"' . $selected . '>' . $ll . '</option>';
+ }
+ }
+ $o .= '</select></form></div>';
+ return $o;
+}}
+
+
+if(! function_exists('return_bytes')) {
+function return_bytes ($size_str) {
+ switch (substr ($size_str, -1))
+ {
+ case 'M': case 'm': return (int)$size_str * 1048576;
+ case 'K': case 'k': return (int)$size_str * 1024;
+ case 'G': case 'g': return (int)$size_str * 1073741824;
+ default: return $size_str;
+ }
+}}
+
+function generate_user_guid() {
+ $found = true;
+ do {
+ $guid = random_string(16);
+ $x = q("SELECT `uid` FROM `user` WHERE `guid` = '%s' LIMIT 1",
+ dbesc($guid)
+ );
+ if(! count($x))
+ $found = false;
+ } while ($found == true );
+ return $guid;
+}
+
+
+function pkcs5_pad ($text, $blocksize)
+{
+ $pad = $blocksize - (strlen($text) % $blocksize);
+ return $text . str_repeat(chr($pad), $pad);
+}
+
+function pkcs5_unpad($text)
+{
+ $pad = ord($text{strlen($text)-1});
+ if ($pad > strlen($text)) return false;
+ if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
+ return substr($text, 0, -1 * $pad);
+}
+
+
+function base64url_encode($s, $strip_padding = false) {
+
+ $s = strtr(base64_encode($s),'+/','-_');
+
+ if($strip_padding)
+ $s = str_replace('=','',$s);
+
+ return $s;
+}
+
+function base64url_decode($s) {
+
+/*
+ * // Placeholder for new rev of salmon which strips base64 padding.
+ * // PHP base64_decode handles the un-padded input without requiring this step
+ * // Uncomment if you find you need it.
+ *
+ * $l = strlen($s);
+ * if(! strpos($s,'=')) {
+ * $m = $l % 4;
+ * if($m == 2)
+ * $s .= '==';
+ * if($m == 3)
+ * $s .= '=';
+ * }
+ *
+ */
+
+ return base64_decode(strtr($s,'-_','+/'));
+}
+
+function cc_license() {
+return '<div class="cc-license">' . t('Shared content is covered by the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> license.') . '</div>';
+}
diff --git a/index.php b/index.php
index 3e72baddc..80e8ca3b0 100644
--- a/index.php
+++ b/index.php
@@ -194,12 +194,18 @@ if(strlen($a->module)) {
*/
if(! $a->module_loaded) {
+
+ // Stupid browser tried to pre-fetch our ACL img template. Don't log the event or return anything - just quietly exit.
+ if((x($_SERVER,'QUERY_STRING')) && strpos($_SERVER['QUERY_STRING'],'{0}') !== false) {
+ killme();
+ }
+
if((x($_SERVER,'QUERY_STRING')) && ($_SERVER['QUERY_STRING'] === 'q=internal_error.html') && isset($dreamhost_error_hack)) {
logger('index.php: dreamhost_error_hack invoked. Original URI =' . $_SERVER['REQUEST_URI']);
goaway($a->get_baseurl() . $_SERVER['REQUEST_URI']);
}
- logger('index.php: page not found: ' . $_SERVER['REQUEST_URI'] . ' QUERY: ' . $_SERVER['QUERY_STRING'], LOGGER_DEBUG);
+ logger('index.php: page not found: ' . $_SERVER['REQUEST_URI'] . ' ADDRESS: ' . $_SERVER['REMOTE_ADDR'] . ' QUERY: ' . $_SERVER['QUERY_STRING'], LOGGER_DEBUG);
header($_SERVER["SERVER_PROTOCOL"] . ' 404 ' . t('Not Found'));
notice( t('Page not found.' ) . EOL);
}
diff --git a/library/ASNValue.class.php b/library/ASNValue.class.php
new file mode 100644
index 000000000..7a3c5d20e
--- /dev/null
+++ b/library/ASNValue.class.php
@@ -0,0 +1,169 @@
+<?php
+//-----------------------------------------------------------------------------
+// ASNValue class by A.Oliinyk
+// contact@pumka.net
+//-----------------------------------------------------------------------------
+class ASNValue
+{
+ const TAG_INTEGER = 0x02;
+ const TAG_BITSTRING = 0x03;
+ const TAG_SEQUENCE = 0x30;
+
+ public $Tag;
+ public $Value;
+
+ function __construct($Tag=0x00, $Value='')
+ {
+ $this->Tag = $Tag;
+ $this->Value = $Value;
+ }
+
+ function Encode()
+ {
+ //Write type
+ $result = chr($this->Tag);
+
+ //Write size
+ $size = strlen($this->Value);
+ if ($size < 127) {
+ //Write size as is
+ $result .= chr($size);
+ }
+ else {
+ //Prepare length sequence
+ $sizeBuf = self::IntToBin($size);
+
+ //Write length sequence
+ $firstByte = 0x80 + strlen($sizeBuf);
+ $result .= chr($firstByte) . $sizeBuf;
+ }
+
+ //Write value
+ $result .= $this->Value;
+
+ return $result;
+ }
+
+ function Decode(&$Buffer)
+ {
+ //Read type
+ $this->Tag = self::ReadByte($Buffer);
+
+ //Read first byte
+ $firstByte = self::ReadByte($Buffer);
+
+ if ($firstByte < 127) {
+ $size = $firstByte;
+ }
+ else if ($firstByte > 127) {
+ $sizeLen = $firstByte - 0x80;
+ //Read length sequence
+ $size = self::BinToInt(self::ReadBytes($Buffer, $sizeLen));
+ }
+ else {
+ throw new Exception("Invalid ASN length value");
+ }
+
+ $this->Value = self::ReadBytes($Buffer, $size);
+ }
+
+ protected static function ReadBytes(&$Buffer, $Length)
+ {
+ $result = substr($Buffer, 0, $Length);
+ $Buffer = substr($Buffer, $Length);
+
+ return $result;
+ }
+
+ protected static function ReadByte(&$Buffer)
+ {
+ return ord(self::ReadBytes($Buffer, 1));
+ }
+
+ protected static function BinToInt($Bin)
+ {
+ $len = strlen($Bin);
+ $result = 0;
+ for ($i=0; $i<$len; $i++) {
+ $curByte = self::ReadByte($Bin);
+ $result += $curByte << (($len-$i-1)*8);
+ }
+
+ return $result;
+ }
+
+ protected static function IntToBin($Int)
+ {
+ $result = '';
+ do {
+ $curByte = $Int % 256;
+ $result .= chr($curByte);
+
+ $Int = ($Int - $curByte) / 256;
+ } while ($Int > 0);
+
+ $result = strrev($result);
+
+ return $result;
+ }
+
+ function SetIntBuffer($Value)
+ {
+ if (strlen($Value) > 1) {
+ $firstByte = ord($Value{0});
+ if ($firstByte & 0x80) { //first bit set
+ $Value = chr(0x00) . $Value;
+ }
+ }
+
+ $this->Value = $Value;
+ }
+
+ function GetIntBuffer()
+ {
+ $result = $this->Value;
+ if (ord($result{0}) == 0x00) {
+ $result = substr($result, 1);
+ }
+
+ return $result;
+ }
+
+ function SetInt($Value)
+ {
+ $Value = self::IntToBin($Value);
+
+ $this->SetIntBuffer($Value);
+ }
+
+ function GetInt()
+ {
+ $result = $this->GetIntBuffer();
+ $result = self::BinToInt($result);
+
+ return $result;
+ }
+
+ function SetSequence($Values)
+ {
+ $result = '';
+ foreach ($Values as $item) {
+ $result .= $item->Encode();
+ }
+
+ $this->Value = $result;
+ }
+
+ function GetSequence()
+ {
+ $result = array();
+ $seq = $this->Value;
+ while (strlen($seq)) {
+ $val = new ASNValue();
+ $val->Decode($seq);
+ $result[] = $val;
+ }
+
+ return $result;
+ }
+}
diff --git a/library/asn1.php b/library/asn1.php
index 713978e8c..e84398bf6 100644
--- a/library/asn1.php
+++ b/library/asn1.php
@@ -187,7 +187,6 @@ class ASN_BASE {
return new ASN_BOOLEAN((bool)$data);
case ASN_INTEGER:
return new ASN_INTEGER(strtr(base64_encode($data),'+/','-_'));
-// return new ASN_INTEGER(ord($data));
case ASN_BIT_STR:
return new ASN_BIT_STR(self::parseASNString($data, $level+1, $maxLevels));
case ASN_OCTET_STR:
@@ -290,9 +289,3 @@ class ASN_BASE {
}
-
-function accum($s) {
- $result = strtr(base64_encode($s),'+/=','-_,');
- return $result;
-}
-
diff --git a/library/simplepie/simplepie.inc b/library/simplepie/simplepie.inc
index c3ba02b7d..8a2739f52 100644
--- a/library/simplepie/simplepie.inc
+++ b/library/simplepie/simplepie.inc
@@ -5517,6 +5517,7 @@ class SimplePie_Item
$type = null;
$url = null;
$width = null;
+ $title = $title_parent;
$url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
if (isset($link['attribs']['']['type']))
@@ -5527,9 +5528,13 @@ class SimplePie_Item
{
$length = ceil($link['attribs']['']['length']);
}
+ if (isset($link['attribs']['']['title']))
+ {
+ $title = $this->sanitize($link['attribs']['']['title'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
// Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
- $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width);
+ $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title, $width);
}
}
diff --git a/mod/admin.php b/mod/admin.php
index f7dde7bcb..1a926443f 100644
--- a/mod/admin.php
+++ b/mod/admin.php
@@ -192,8 +192,8 @@ function admin_page_site_post(&$a){
$no_community_page = !((x($_POST,'no_community_page')) ? True : False);
$verifyssl = ((x($_POST,'verifyssl')) ? True : False);
- $proxyuser = ((x($_POST,'proxyuser')) ? notags(trim($_POST['global_search_url'])) : '');
- $proxy = ((x($_POST,'proxy')) ? notags(trim($_POST['global_search_url'])) : '');
+ $proxyuser = ((x($_POST,'proxyuser')) ? notags(trim($_POST['proxyuser'])) : '');
+ $proxy = ((x($_POST,'proxy')) ? notags(trim($_POST['proxy'])) : '');
$timeout = ((x($_POST,'timeout')) ? intval(trim($_POST['timeout'])) : 60);
$dfrn_only = ((x($_POST,'dfrn_only')) ? True : False);
$ostatus_disabled = !((x($_POST,'ostatus_disabled')) ? True : False);
@@ -234,7 +234,7 @@ function admin_page_site_post(&$a){
set_config('system','no_gravatar', $no_gravatar);
set_config('system','no_regfullname', $no_regfullname);
set_config('system','no_community_page', $no_community_page);
- set_config('system','proxy', $no_utf);
+ set_config('system','no_utf', $no_utf);
set_config('system','verifyssl', $verifyssl);
set_config('system','proxyuser', $proxyuser);
set_config('system','proxy', $proxy);
@@ -322,7 +322,7 @@ function admin_page_site(&$a) {
'$no_openid' => array('no_openid', t("OpenID support"), !get_config('system','no_openid'), "OpenID support for registration and logins."),
'$no_gravatar' => array('no_gravatar', t("Gravatar support"), !get_config('system','no_gravatar'), "Search new user's photo on Gravatar."),
'$no_regfullname' => array('no_regfullname', t("Fullname check"), !get_config('system','no_regfullname'), "Force users to register with a space between firstname and lastname in Full name, as an antispam measure"),
- '$no_utf' => array('no_utf', t("UTF-8 Regular expressions"), !get_config('system','proxy'), "Use PHP UTF8 regular expressions"),
+ '$no_utf' => array('no_utf', t("UTF-8 Regular expressions"), !get_config('system','no_utf'), "Use PHP UTF8 regular expressions"),
'$no_community_page' => array('no_community_page', t("Show Community Page"), !get_config('system','no_community_page'), "Display a Community page showing all recent public postings on this site."),
'$ostatus_disabled' => array('ostatus_disabled', t("Enable OStatus support"), !get_config('system','ostatus_disable'), "Provide built-in OStatus \x28identi.ca, status.net, etc.\x29 compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed."),
'$dfrn_only' => array('dfrn_only', t('Only allow Friendika contacts'), get_config('system','dfrn_only'), "All contacts must use Friendika protocols. All other built-in communication protocols disabled."),
diff --git a/mod/contactgroup.php b/mod/contactgroup.php
new file mode 100644
index 000000000..bf81afe07
--- /dev/null
+++ b/mod/contactgroup.php
@@ -0,0 +1,50 @@
+<?php
+
+require_once('include/group.php');
+
+function contactgroup_content(&$a) {
+
+
+ if(! local_user()) {
+ killme();
+ }
+
+ if(($a->argc > 2) && intval($a->argv[1]) && intval($a->argv[2])) {
+ $r = q("SELECT `id` FROM `contact` WHERE `id` = %d AND `uid` = %d and `self` = 0 and `blocked` = 0 AND `pending` = 0 LIMIT 1",
+ intval($a->argv[2]),
+ intval(local_user())
+ );
+ if(count($r))
+ $change = intval($a->argv[2]);
+ }
+
+ if(($a->argc > 1) && (intval($a->argv[1]))) {
+
+ $r = q("SELECT * FROM `group` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1",
+ intval($a->argv[1]),
+ intval(local_user())
+ );
+ if(! count($r)) {
+ killme();
+ }
+
+ $group = $r[0];
+ $members = group_get_members($group['id']);
+ $preselected = array();
+ if(count($members)) {
+ foreach($members as $member)
+ $preselected[] = $member['id'];
+ }
+
+ if($change) {
+ if(in_array($change,$preselected)) {
+ group_rmv_member(local_user(),$group['name'],$change);
+ }
+ else {
+ group_add_member(local_user(),$group['name'],$change);
+ }
+ }
+ }
+
+ killme();
+} \ No newline at end of file
diff --git a/mod/contacts.php b/mod/contacts.php
index 1fa07688c..f8b9a743f 100644
--- a/mod/contacts.php
+++ b/mod/contacts.php
@@ -6,10 +6,22 @@ function contacts_init(&$a) {
if(! local_user())
return;
+ $contact_id = 0;
+ if(($a->argc == 2) && intval($a->argv[1])) {
+ $contact_id = intval($a->argv[1]);
+ $r = q("SELECT * FROM `contact` WHERE `uid` = %d and `id` = %d LIMIT 1",
+ intval(local_user()),
+ intval($contact_id)
+ );
+ if(! count($r)) {
+ $contact_id = 0;
+ }
+ }
+
require_once('include/group.php');
if(! x($a->page,'aside'))
$a->page['aside'] = '';
- $a->page['aside'] .= group_side();
+ $a->page['aside'] .= group_side('contacts','group',false,0,$contact_id);
$inv = '<div class="side-link" id="side-invite-link" ><a href="invite" >' . t("Invite Friends") . '</a></div>';
@@ -237,16 +249,16 @@ function contacts_content(&$a) {
$tpl = get_markup_template("contact_edit.tpl");
switch($r[0]['rel']) {
- case REL_BUD:
+ case CONTACT_IS_FRIEND:
$dir_icon = 'images/lrarrow.gif';
$alt_text = t('Mutual Friendship');
break;
- case REL_VIP;
+ case CONTACT_IS_FOLLOWER;
$dir_icon = 'images/larrow.gif';
$alt_text = t('is a fan of yours');
break;
- case REL_FAN;
+ case CONTACT_IS_SHARING;
$dir_icon = 'images/rarrow.gif';
$alt_text = t('you are a fan of');
break;
@@ -264,13 +276,6 @@ function contacts_content(&$a) {
}
$grps = '';
- $member_of = member_of($r[0]['id']);
- if(is_array($member_of) && count($member_of)) {
- $grps = t('Member of: ') . EOL . '<ul>';
- foreach($member_of as $member)
- $grps .= '<li><a href="group/' . $member['id'] . '" title="' . t('Edit') . '" ><img src="images/spencil.gif" alt="' . t('Edit') . '" /></a> <a href="network/' . $member['id'] . '">' . $member['name'] . '</a></li>';
- $grps .= '</ul>';
- }
$insecure = '<div id="profile-edit-insecure"><p><img src="images/unlock_icon.gif" alt="' . t('Privacy Unavailable') . '" />&nbsp;'
. t('Private communications are not available for this contact.') . '</p></div>';
@@ -314,7 +319,7 @@ function contacts_content(&$a) {
'$contact_id' => $r[0]['id'],
'$block_text' => (($r[0]['blocked']) ? t('Unblock this contact') : t('Block this contact') ),
'$ignore_text' => (($r[0]['readonly']) ? t('Unignore this contact') : t('Ignore this contact') ),
- '$insecure' => (($r[0]['network'] !== NETWORK_DFRN && $r[0]['network'] !== NETWORK_MAIL && $r[0]['network'] !== NETWORK_FACEBOOK) ? $insecure : ''),
+ '$insecure' => (($r[0]['network'] !== NETWORK_DFRN && $r[0]['network'] !== NETWORK_MAIL && $r[0]['network'] !== NETWORK_FACEBOOK && $r[0]['network'] !== NETWORK_DIASPORA) ? $insecure : ''),
'$info' => $r[0]['info'],
'$blocked' => (($r[0]['blocked']) ? '<div id="block-message">' . t('Currently blocked') . '</div>' : ''),
'$ignored' => (($r[0]['readonly']) ? '<div id="ignore-message">' . t('Currently ignored') . '</div>' : ''),
@@ -363,7 +368,7 @@ function contacts_content(&$a) {
$search = dbesc($search.'*');
$sql_extra .= ((strlen($search)) ? " AND MATCH `name` AGAINST ('$search' IN BOOLEAN MODE) " : "");
- $sql_extra2 = ((($sort_type > 0) && ($sort_type <= REL_BUD)) ? sprintf(" AND `rel` = %d ",intval($sort_type)) : '');
+ $sql_extra2 = ((($sort_type > 0) && ($sort_type <= CONTACT_IS_FRIEND)) ? sprintf(" AND `rel` = %d ",intval($sort_type)) : '');
$r = q("SELECT COUNT(*) AS `total` FROM `contact`
@@ -387,15 +392,15 @@ function contacts_content(&$a) {
continue;
switch($rr['rel']) {
- case REL_BUD:
+ case CONTACT_IS_FRIEND:
$dir_icon = 'images/lrarrow.gif';
$alt_text = t('Mutual Friendship');
break;
- case REL_VIP;
+ case CONTACT_IS_FOLLOWER;
$dir_icon = 'images/larrow.gif';
$alt_text = t('is a fan of yours');
break;
- case REL_FAN;
+ case CONTACT_IS_SHARING;
$dir_icon = 'images/rarrow.gif';
$alt_text = t('you are a fan of');
break;
diff --git a/mod/dfrn_confirm.php b/mod/dfrn_confirm.php
index e2094b1f3..4088178c0 100644
--- a/mod/dfrn_confirm.php
+++ b/mod/dfrn_confirm.php
@@ -123,9 +123,12 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
$dfrn_confirm = $contact['confirm'];
$aes_allow = $contact['aes_allow'];
- $network = ((strlen($contact['issued-id'])) ? 'dfrn' : 'stat');
+ $network = ((strlen($contact['issued-id'])) ? NETWORK_DFRN : NETWORK_OSTATUS);
- if($network === 'dfrn') {
+ if($contact['network'])
+ $network = $contact['network'];
+
+ if($network === NETWORK_DFRN) {
/**
*
@@ -298,19 +301,19 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
*
*/
- require_once("Photo.php");
+ require_once('include/Photo.php');
$photos = import_profile_photo($contact['photo'],$uid,$contact_id);
logger('dfrn_confirm: confirm - imported photos');
- if($network === 'dfrn') {
+ if($network === NETWORK_DFRN) {
- $new_relation = REL_VIP;
- if(($relation == REL_FAN) || ($duplex))
- $new_relation = REL_BUD;
+ $new_relation = CONTACT_IS_FOLLOWER;
+ if(($relation == CONTACT_IS_SHARING) || ($duplex))
+ $new_relation = CONTACT_IS_FRIEND;
- if(($relation == REL_FAN) && ($duplex))
+ if(($relation == CONTACT_IS_SHARING) && ($duplex))
$duplex = 0;
$r = q("UPDATE `contact` SET `photo` = '%s',
@@ -337,21 +340,29 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
);
}
else {
- // $network !== 'dfrn'
-
- $notify = '';
- $poll = '';
-
- $arr = 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'];
+
+ // $network !== NETWORK_DFRN
+
+ $network = (($contact['network']) ? $contact['network'] : NETWORK_OSTATUS);
+ $notify = (($contact['notify']) ? $contact['notify'] : '');
+ $poll = (($contact['poll']) ? $contact['poll'] : '');
+
+ if((! $contact['notify']) || (! $contact['poll'])) {
+ $arr = 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'];
+ }
}
}
+ $new_relation = $contact['rel'];
+ if($network === NETWORK_DIASPORA && $duplex)
+ $new_relation = CONTACT_IS_FRIEND;
+
$r = q("DELETE FROM `intro` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($intro_id),
intval($uid)
@@ -368,7 +379,8 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
`poll` = '%s',
`blocked` = 0,
`pending` = 0,
- `network` = 'stat'
+ `network` = '%s',
+ `rel` = %d
WHERE `id` = %d LIMIT 1
",
dbesc($photos[0]),
@@ -379,6 +391,8 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
dbesc(datetime_convert()),
dbesc($notify),
dbesc($poll),
+ dbesc($network),
+ intval($new_relation),
intval($contact_id)
);
}
@@ -401,7 +415,13 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
$r = q("SELECT `hide-friends` FROM `profile` WHERE `uid` = %d AND `is-default` = 1 LIMIT 1",
intval($uid)
);
- if((count($r)) && ($r[0]['hide-friends'] == 0) && (is_array($contact)) && isset($new_relation) && ($new_relation == REL_BUD)) {
+ if((count($r)) && ($r[0]['hide-friends'] == 0) && (is_array($contact)) && isset($new_relation) && ($new_relation == CONTACT_IS_FRIEND)) {
+
+ if($r[0]['network'] === NETWORK_DIASPORA) {
+ require_once('include/diaspora.php');
+ $ret = diaspora_share($user[0],$r[0]);
+ logger('mod_follow: diaspora_share returns: ' . $ret);
+ }
require_once('include/items.php');
@@ -528,12 +548,22 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
dbesc($decrypted_source_url),
intval($local_uid)
);
-
if(! count($ret)) {
- // this is either a bogus confirmation (?) or we deleted the original introduction.
- $message = t('Contact record was not found for you on our site.');
- xml_status(3,$message);
- return; // NOTREACHED
+ if(strstr($decrypted_source_url,'http:'))
+ $newurl = str_replace('http:','https:',$decrypted_source_url);
+ else
+ $newurl = str_replace('https:','http:',$decrypted_source_url);
+
+ $ret = q("SELECT * FROM `contact` WHERE `url` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($newurl),
+ intval($local_uid)
+ );
+ if(! count($r)) {
+ // this is either a bogus confirmation (?) or we deleted the original introduction.
+ $message = t('Contact record was not found for you on our site.');
+ xml_status(3,$message);
+ return; // NOTREACHED
+ }
}
$relation = $ret[0]['rel'];
@@ -592,11 +622,11 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
logger('dfrn_confirm: request - photos imported');
- $new_relation = REL_FAN;
- if(($relation == REL_VIP) || ($duplex))
- $new_relation = REL_BUD;
+ $new_relation = CONTACT_IS_SHARING;
+ if(($relation == CONTACT_IS_FOLLOWER) || ($duplex))
+ $new_relation = CONTACT_IS_FRIEND;
- if(($relation == REL_VIP) && ($duplex))
+ if(($relation == CONTACT_IS_FOLLOWER) && ($duplex))
$duplex = 0;
$r = q("UPDATE `contact` SET
@@ -639,7 +669,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
if((count($r)) && ($r[0]['notify-flags'] & NOTIFY_CONFIRM)) {
push_lang($r[0]['language']);
- $tpl = (($new_relation == REL_BUD)
+ $tpl = (($new_relation == CONTACT_IS_FRIEND)
? get_intltext_template('friend_complete_eml.tpl')
: get_intltext_template('intro_complete_eml.tpl'));
@@ -672,7 +702,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
// somebody arrived here by mistake or they are fishing. Send them to the homepage.
- goaway($a->get_baseurl());
+ goaway(z_root());
// NOTREACHED
}
diff --git a/mod/dfrn_notify.php b/mod/dfrn_notify.php
index 0dc96f8a7..f284b8b38 100644
--- a/mod/dfrn_notify.php
+++ b/mod/dfrn_notify.php
@@ -704,6 +704,7 @@ function dfrn_notify_post(&$a) {
$ev['uid'] = $importer['uid'];
$ev['uri'] = $item_id;
$ev['edited'] = $datarray['edited'];
+ $ev['private'] = $datarray['private'];
$r = q("SELECT * FROM `event` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
dbesc($item_id),
diff --git a/mod/dfrn_poll.php b/mod/dfrn_poll.php
index 76803ef1b..09f198b81 100644
--- a/mod/dfrn_poll.php
+++ b/mod/dfrn_poll.php
@@ -61,7 +61,7 @@ function dfrn_poll_init(&$a) {
$my_id = '0:' . $dfrn_id;
break;
default:
- goaway($a->get_baseurl());
+ goaway(z_root());
break; // NOTREACHED
}
@@ -100,7 +100,7 @@ function dfrn_poll_init(&$a) {
$profile = $r[0]['nickname'];
goaway((strlen($destination_url)) ? $destination_url : $a->get_baseurl() . '/profile/' . $profile);
}
- goaway($a->get_baseurl());
+ goaway(z_root());
}
@@ -297,7 +297,7 @@ function dfrn_poll_post(&$a) {
$my_id = '0:' . $dfrn_id;
break;
default:
- goaway($a->get_baseurl());
+ goaway(z_root());
break; // NOTREACHED
}
@@ -420,7 +420,7 @@ function dfrn_poll_content(&$a) {
$my_id = '0:' . $dfrn_id;
break;
default:
- goaway($a->get_baseurl());
+ goaway(z_root());
break; // NOTREACHED
}
diff --git a/mod/dfrn_request.php b/mod/dfrn_request.php
index c9811fa60..79070604b 100644
--- a/mod/dfrn_request.php
+++ b/mod/dfrn_request.php
@@ -48,7 +48,7 @@ function dfrn_request_post(&$a) {
if($_POST['cancel']) {
- goaway($a->get_baseurl());
+ goaway(z_root());
}
@@ -190,7 +190,7 @@ function dfrn_request_post(&$a) {
// invalid/bogus request
notice( t('Unrecoverable protocol error.') . EOL );
- goaway($a->get_baseurl());
+ goaway(z_root());
return; // NOTREACHED
}
@@ -309,7 +309,7 @@ function dfrn_request_post(&$a) {
notice( t('You have already introduced yourself here.') . EOL );
return;
}
- elseif($ret[0]['rel'] == REL_BUD) {
+ elseif($ret[0]['rel'] == CONTACT_IS_FRIEND) {
notice( sprintf( t('Apparently you are already friends with %s.'), $a->profile['name']) . EOL);
return;
}
@@ -445,7 +445,7 @@ function dfrn_request_post(&$a) {
*
* OStatus network
* Check contact existence
- * Try and scrape together enough information to create a contact record, with us as REL_VIP
+ * Try and scrape together enough information to create a contact record, with us as CONTACT_IS_FOLLOWER
* Substitute our user's feed URL into $url template
* Send the subscriber home to subscribe
*
@@ -602,7 +602,7 @@ function dfrn_request_content(&$a) {
$myaddr = $a->get_baseurl() . '/profile/' . $a->user['nickname'];
}
else {
- $myaddr = $a->user['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3 );
+ $myaddr = $a->user['nickname'] . '@' . substr(z_root(), strpos(z_root(),'://') + 3 );
}
}
elseif(x($_GET,'addr')) {
diff --git a/mod/display.php b/mod/display.php
index 159ff57ed..52a84e755 100644
--- a/mod/display.php
+++ b/mod/display.php
@@ -114,7 +114,7 @@ function display_content(&$a) {
}
- $o .= '<div class="cc-license">' . t('Shared content is covered by the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> license.') . '</div>';
+ $o .= cc_license();
return $o;
}
diff --git a/mod/events.php b/mod/events.php
index b0b54601f..27ca69830 100644
--- a/mod/events.php
+++ b/mod/events.php
@@ -297,6 +297,12 @@ function events_content(&$a) {
$fhour = ((x($orig_event)) ? datetime_convert('UTC', $tz, $fdt, 'H') : 0);
$fminute = ((x($orig_event)) ? datetime_convert('UTC', $tz, $fdt, 'i') : 0);
+ $f = get_config('system','event_input_format');
+ if(! $f)
+ $f = 'ymd';
+
+ $dateformat = datesel_format($f);
+ $timeformat = t('hour:minute');
require_once('include/acl_selectors.php');
@@ -306,14 +312,14 @@ function events_content(&$a) {
'$cid' => $cid,
'$uri' => $uri,
'$e_text' => t('Event details'),
- '$e_desc' => t('Format is year-month-day hour:minute. Starting date and Description are required.'),
+ '$e_desc' => sprintf( t('Format is %s %s. Starting date and Description are required.'),$dateformat,$timeformat),
'$s_text' => t('Event Starts:') . ' <span class="required">*</span> ',
- '$s_dsel' => datesel('start',$syear+5,$syear,false,$syear,$smonth,$sday),
+ '$s_dsel' => datesel($f,'start',$syear+5,$syear,false,$syear,$smonth,$sday),
'$s_tsel' => timesel('start',$shour,$sminute),
'$n_text' => t('Finish date/time is not known or not relevant'),
'$n_checked' => $n_checked,
'$f_text' => t('Event Finishes:'),
- '$f_dsel' => datesel('finish',$fyear+5,$fyear,false,$fyear,$fmonth,$fday),
+ '$f_dsel' => datesel($f,'finish',$fyear+5,$fyear,false,$fyear,$fmonth,$fday),
'$f_tsel' => timesel('finish',$fhour,$fminute),
'$a_text' => t('Adjust for viewer timezone'),
'$a_checked' => $a_checked,
diff --git a/mod/follow.php b/mod/follow.php
index 830399ff5..14b2ea46c 100644
--- a/mod/follow.php
+++ b/mod/follow.php
@@ -58,7 +58,7 @@ function follow_post(&$a) {
}
if($ret['network'] === NETWORK_OSTATUS && get_config('system','ostatus_disabled')) {
- notice( t('Communication options with this network have been restricted.') . EOL);
+ notice( t('The profile address specified belongs to a network which has been disabled on this site.') . EOL);
$ret['notify'] = '';
}
@@ -71,6 +71,9 @@ function follow_post(&$a) {
$writeable = 1;
}
+ if($ret['network'] === NETWORK_DIASPORA)
+ $writeable = 1;
+
// check if we already have a contact
// the poll url is more reliable than the profile url, as we may have
// indirect links or webfinger links
@@ -82,15 +85,20 @@ function follow_post(&$a) {
if(count($r)) {
// update contact
- if($r[0]['rel'] == REL_VIP) {
+ if($r[0]['rel'] == CONTACT_IS_FOLLOWER || ($network === NETWORK_DIASPORA && $r[0]['rel'] == CONTACT_IS_SHARING)) {
q("UPDATE `contact` SET `rel` = %d , `readonly` = 0 WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval(REL_BUD),
+ intval(CONTACT_IS_FRIEND),
intval($r[0]['id']),
intval(local_user())
);
}
}
else {
+
+ $new_relation = (($ret['network'] === NETWORK_MAIL) ? CONTACT_IS_FRIEND : CONTACT_IS_SHARING);
+ if($ret['network'] === NETWORK_DIASPORA)
+ $new_relation = CONTACT_IS_FOLLOWER;
+
// create contact record
$r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `addr`, `alias`, `notify`, `poll`, `name`, `nick`, `photo`, `network`, `rel`, `priority`,
`writable`, `blocked`, `readonly`, `pending` )
@@ -106,7 +114,7 @@ function follow_post(&$a) {
dbesc($ret['nick']),
dbesc($ret['photo']),
dbesc($ret['network']),
- intval(($ret['network'] === NETWORK_MAIL) ? REL_BUD : REL_FAN),
+ intval($new_relation),
intval($ret['priority']),
intval($writeable)
);
@@ -175,10 +183,16 @@ function follow_post(&$a) {
intval(local_user())
);
-
- if((count($r)) && (x($contact,'notify')) && (strlen($contact['notify']))) {
- require_once('include/salmon.php');
- slapper($r[0],$contact['notify'],$slap);
+ if(count($r)) {
+ if(($contact['network'] == NETWORK_OSTATUS) && (strlen($contact['notify']))) {
+ require_once('include/salmon.php');
+ slapper($r[0],$contact['notify'],$slap);
+ }
+ if($contact['network'] == NETWORK_DIASPORA) {
+ require_once('include/diaspora.php');
+ $ret = diaspora_share($a->user,$r[0]);
+ logger('mod_follow: diaspora_share returns: ' . $ret);
+ }
}
goaway($_SESSION['return_url']);
diff --git a/mod/friendika.php b/mod/friendika.php
index 753a9f478..d0e709c75 100644
--- a/mod/friendika.php
+++ b/mod/friendika.php
@@ -16,7 +16,7 @@ function friendika_init(&$a) {
$data = Array(
'version' => FRIENDIKA_VERSION,
- 'url' => $a->get_baseurl(),
+ 'url' => z_root(),
'plugins' => $a->plugins,
'register_policy' => $register_policy[$a->config['register_policy']],
'admin' => $admin,
@@ -40,7 +40,7 @@ function friendika_content(&$a) {
$o .= '<p></p><p>';
$o .= t('This is Friendika version') . ' ' . FRIENDIKA_VERSION . ' ';
- $o .= t('running at web location') . ' ' . $a->get_baseurl() . '</p><p>';
+ $o .= t('running at web location') . ' ' . z_root() . '</p><p>';
$o .= t('Shared content within the Friendika network is provided under the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 license</a>') . '</p><p>';
diff --git a/mod/hcard.php b/mod/hcard.php
new file mode 100644
index 000000000..5505ca08e
--- /dev/null
+++ b/mod/hcard.php
@@ -0,0 +1,50 @@
+<?php
+
+function hcard_init(&$a) {
+
+ if((get_config('system','block_public')) && (! local_user()) && (! remote_user()))
+ return;
+
+ if($a->argc > 1)
+ $which = $a->argv[1];
+ else {
+ notice( t('No profile') . EOL );
+ $a->error = 404;
+ return;
+ }
+
+ $profile = 0;
+ if((local_user()) && ($a->argc > 2) && ($a->argv[2] === 'view')) {
+ $which = $a->user['nickname'];
+ $profile = $a->argv[1];
+ }
+
+ profile_load($a,$which,$profile);
+
+ if((x($a->profile,'page-flags')) && ($a->profile['page-flags'] == PAGE_COMMUNITY)) {
+ $a->page['htmlhead'] .= '<meta name="friendika.community" content="true" />';
+ }
+ if(x($a->profile,'openidserver'))
+ $a->page['htmlhead'] .= '<link rel="openid.server" href="' . $a->profile['openidserver'] . '" />' . "\r\n";
+ if(x($a->profile,'openid')) {
+ $delegate = ((strstr($a->profile['openid'],'://')) ? $a->profile['openid'] : 'http://' . $a->profile['openid']);
+ $a->page['htmlhead'] .= '<link rel="openid.delegate" href="' . $delegate . '" />' . "\r\n";
+ }
+
+ $keywords = ((x($a->profile,'pub_keywords')) ? $a->profile['pub_keywords'] : '');
+ $keywords = str_replace(array(',',' ',',,'),array(' ',',',','),$keywords);
+ if(strlen($keywords))
+ $a->page['htmlhead'] .= '<meta name="keywords" content="' . $keywords . '" />' . "\r\n" ;
+
+ $a->page['htmlhead'] .= '<meta name="dfrn-global-visibility" content="' . (($a->profile['net-publish']) ? 'true' : 'false') . '" />' . "\r\n" ;
+ $a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . $a->get_baseurl() . '/dfrn_poll/' . $which .'" />' . "\r\n" ;
+ $uri = urlencode('acct:' . $a->profile['nickname'] . '@' . $a->get_hostname() . (($a->path) ? '/' . $a->path : ''));
+ $a->page['htmlhead'] .= '<link rel="lrdd" type="application/xrd+xml" href="' . $a->get_baseurl() . '/xrd/?uri=' . $uri . '" />' . "\r\n";
+ header('Link: <' . $a->get_baseurl() . '/xrd/?uri=' . $uri . '>; rel="lrdd"; type="application/xrd+xml"', false);
+
+ $dfrn_pages = array('request', 'confirm', 'notify', 'poll');
+ foreach($dfrn_pages as $dfrn)
+ $a->page['htmlhead'] .= "<link rel=\"dfrn-{$dfrn}\" href=\"".$a->get_baseurl()."/dfrn_{$dfrn}/{$which}\" />\r\n";
+
+}
+
diff --git a/mod/help.php b/mod/help.php
index 561f5381f..495b4ccc2 100644
--- a/mod/help.php
+++ b/mod/help.php
@@ -9,7 +9,9 @@ function load_doc_file($s) {
$d = dirname($s);
if(file_exists("$d/$lang/$b"))
return file_get_contents("$d/$lang/$b");
- return file_get_contents($s);
+ if(file_exists($s))
+ return file_get_contents($s);
+ return '';
}}
@@ -31,7 +33,12 @@ function help_content(&$a) {
$a->page['title'] = t('Help');
}
-
+ if(! strlen($text)) {
+ header($_SERVER["SERVER_PROTOCOL"] . ' 404 ' . t('Not Found'));
+ notice( t('Page not found.' ) . EOL);
+ return;
+ }
+
return Markdown($text);
} \ No newline at end of file
diff --git a/include/hostxrd.php b/mod/hostxrd.php
index 7040f927d..c7861d26d 100644
--- a/include/hostxrd.php
+++ b/mod/hostxrd.php
@@ -1,11 +1,10 @@
<?php
-function hostxrd($baseurl) {
-
+function hostxrd_init(&$a) {
header('Access-Control-Allow-Origin: *');
header("Content-type: text/xml");
$tpl = file_get_contents('view/xrd_host.tpl');
- echo str_replace('$domain',$baseurl,$tpl);
+ echo str_replace(array('$zroot','$domain'),array(z_root(),z_path()),$tpl);
session_write_close();
exit();
diff --git a/mod/install.php b/mod/install.php
index 970ff6af8..27cc6af84 100644
--- a/mod/install.php
+++ b/mod/install.php
@@ -123,15 +123,15 @@ function install_content(&$a) {
$o .= replace_macros($tpl, array(
'$lbl_01' => t('Friendika Social Network'),
'$lbl_02' => t('Installation'),
- '$lbl_03' => t('In order to install Friendika we need to know how to contact your database.'),
+ '$lbl_03' => t('In order to install Friendika we need to know how to connect to your database.'),
'$lbl_04' => t('Please contact your hosting provider or site administrator if you have questions about these settings.'),
- '$lbl_05' => t('The database you specify below must already exist. If it does not, please create it before continuing.'),
+ '$lbl_05' => t('The database you specify below should already exist. If it does not, please create it before continuing.'),
'$lbl_06' => t('Database Server Name'),
'$lbl_07' => t('Database Login Name'),
'$lbl_08' => t('Database Login Password'),
'$lbl_09' => t('Database Name'),
'$lbl_10' => t('Please select a default timezone for your website'),
- '$lbl_11' => t('Site administrator email address. Your account email address will need match this.'),
+ '$lbl_11' => t('Site administrator email address. Your account email address must match this in order to use the web admin panel.'),
'$baseurl' => $a->get_baseurl(),
'$tzselect' => ((x($_POST,'timezone')) ? select_timezone($_POST['timezone']) : select_timezone()),
'$submit' => t('Submit'),
diff --git a/mod/item.php b/mod/item.php
index f6f665a18..ef0b232d5 100644
--- a/mod/item.php
+++ b/mod/item.php
@@ -6,6 +6,8 @@
* text stuff. This function handles status, wall-to-wall status,
* local comments, and remote coments - that are posted on this site
* (as opposed to being delivered in a feed).
+ * Also processed here are posts and comments coming through the
+ * statusnet/twitter API.
* All of these become an "item" which is our basic unit of
* information.
* Posts that originate externally or do not fall into the above
@@ -33,22 +35,61 @@ function item_post(&$a) {
call_hooks('post_local_start', $_POST);
+ $api_source = ((x($_POST,'api_source') && $_POST['api_source']) ? true : false);
+
+ /**
+ * Is this a reply to something?
+ */
+
$parent = ((x($_POST,'parent')) ? intval($_POST['parent']) : 0);
+ $parent_uri = ((x($_POST,'parent_uri')) ? trim($_POST['parent_uri']) : '');
$parent_item = null;
$parent_contact = null;
+ $thr_parent = '';
+ $parid = 0;
+ $r = false;
- if($parent) {
- $r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1",
- intval($parent)
- );
- if(! count($r)) {
+ if($parent || $parent_uri) {
+
+ if(! x($_POST,'type'))
+ $_POST['type'] = 'net-comment';
+
+ if($parent) {
+ $r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1",
+ intval($parent)
+ );
+ }
+ elseif($parent_uri && local_user()) {
+ // This is coming from an API source, and we are logged in
+ $r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($parent_uri),
+ intval(local_user())
+ );
+ }
+ // if this isn't the real parent of the conversation, find it
+ if($r !== false && count($r)) {
+ $parid = $r[0]['parent'];
+ if($r[0]['id'] != $r[0]['parent']) {
+ $r = q("SELECT * FROM `item` WHERE `id` = `parent` AND `parent` = %d LIMIT 1",
+ intval($parid)
+ );
+ }
+ }
+
+ if(($r === false) || (! count($r))) {
notice( t('Unable to locate original post.') . EOL);
if(x($_POST,'return'))
goaway($a->get_baseurl() . "/" . $_POST['return'] );
killme();
}
$parent_item = $r[0];
+ $parent = $r[0]['id'];
+
+ // multi-level threading - preserve the info but re-parent to our single level threading
+ if(($parid) && ($parid != $parent))
+ $thr_parent = $parent_uri;
+
if($parent_item['contact-id'] && $uid) {
$r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($parent_item['contact-id']),
@@ -59,6 +100,8 @@ function item_post(&$a) {
}
}
+ if($parent) logger('mod_post: parent=' . $parent);
+
$profile_uid = ((x($_POST,'profile_uid')) ? intval($_POST['profile_uid']) : 0);
$post_id = ((x($_POST['post_id'])) ? intval($_POST['post_id']) : 0);
$app = ((x($_POST['source'])) ? strip_tags($_POST['source']) : '');
@@ -135,6 +178,20 @@ function item_post(&$a) {
$pubmail_enable = ((x($_POST,'pubmail_enable') && intval($_POST['pubmail_enable']) && (! $private)) ? 1 : 0);
+ // if using the API, we won't see pubmail_enable - figure out if it should be set
+
+ if($api_source && $profile_uid && $profile_uid == local_user() && (! $private)) {
+ $mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1);
+ if(! $mail_disabled) {
+ $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d AND `server` != '' LIMIT 1",
+ intval(local_user())
+ );
+ if(count($r) && intval($r[0]['pubmail']))
+ $pubmail_enabled = true;
+ }
+ }
+
+
if(! strlen($body)) {
info( t('Empty post discarded.') . EOL );
if(x($_POST,'return'))
@@ -180,6 +237,8 @@ function item_post(&$a) {
$contact_record = $r[0];
}
+
+
$post_type = notags(trim($_POST['type']));
if($post_type === 'net-comment') {
@@ -259,6 +318,10 @@ function item_post(&$a) {
if(count($r)) {
$r = q("UPDATE `attach` SET `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s'
WHERE `uid` = %d AND `id` = %d LIMIT 1",
+ dbesc($str_contact_allow),
+ dbesc($str_group_allow),
+ dbesc($str_contact_deny),
+ dbesc($str_group_deny),
intval($profile_uid),
intval($attach)
);
@@ -391,7 +454,7 @@ function item_post(&$a) {
if(count($r)) {
if(strlen($attachments))
$attachments .= ',';
- $attachments .= '[attach]href="' . $a->get_baseurl() . '/attach/' . $r[0]['id'] . '" size="' . $r[0]['filesize'] . '" type="' . $r[0]['filetype'] . '" title="' . (($r[0]['filename']) ? $r[0]['filename'] : ' ') . '"[/attach]';
+ $attachments .= '[attach]href="' . $a->get_baseurl() . '/attach/' . $r[0]['id'] . '" length="' . $r[0]['filesize'] . '" type="' . $r[0]['filetype'] . '" title="' . (($r[0]['filename']) ? $r[0]['filename'] : '') . '"[/attach]';
}
$body = str_replace($match[1],'',$body);
}
@@ -443,6 +506,7 @@ function item_post(&$a) {
$datarray['private'] = $private;
$datarray['pubmail'] = $pubmail_enable;
$datarray['attach'] = $attachments;
+ $datarray['thr-parent'] = $thr_parent;
/**
* These fields are for the convenience of plugins...
@@ -456,6 +520,9 @@ function item_post(&$a) {
if($orig_post)
$datarray['edit'] = true;
+ else
+ $datarray['guid'] = get_guid();
+
call_hooks('post_local',$datarray);
@@ -479,10 +546,11 @@ function item_post(&$a) {
$post_id = 0;
- $r = q("INSERT INTO `item` (`uid`,`type`,`wall`,`gravity`,`contact-id`,`owner-name`,`owner-link`,`owner-avatar`,
- `author-name`, `author-link`, `author-avatar`, `created`, `edited`, `received`, `changed`, `uri`, `title`, `body`, `app`, `location`, `coord`,
+ $r = q("INSERT INTO `item` (`guid`, `uid`,`type`,`wall`,`gravity`,`contact-id`,`owner-name`,`owner-link`,`owner-avatar`,
+ `author-name`, `author-link`, `author-avatar`, `created`, `edited`, `received`, `changed`, `uri`, `thr-parent`, `title`, `body`, `app`, `location`, `coord`,
`tag`, `inform`, `verb`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid`, `private`, `pubmail`, `attach` )
- VALUES( %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s' )",
+ VALUES( '%s', %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s' )",
+ dbesc($datarray['guid']),
intval($datarray['uid']),
dbesc($datarray['type']),
intval($datarray['wall']),
@@ -499,6 +567,7 @@ function item_post(&$a) {
dbesc($datarray['received']),
dbesc($datarray['changed']),
dbesc($datarray['uri']),
+ dbesc($datarray['thr-parent']),
dbesc($datarray['title']),
dbesc($datarray['body']),
dbesc($datarray['app']),
@@ -731,12 +800,16 @@ function item_post(&$a) {
}
logger('post_complete');
+
+ // figure out how to return, depending on from whence we came
+
+ if($api_source)
+ return;
+
if((x($_POST,'return')) && strlen($_POST['return'])) {
logger('return: ' . $_POST['return']);
goaway($a->get_baseurl() . "/" . $_POST['return'] );
}
- if($_POST['api_source'])
- return;
$json = array('success' => 1);
if(x($_POST,'jsreload') && strlen($_POST['jsreload']))
$json['reload'] = $a->get_baseurl() . '/' . $_POST['jsreload'];
diff --git a/mod/login.php b/mod/login.php
index 58af42d74..10b4d3001 100644
--- a/mod/login.php
+++ b/mod/login.php
@@ -3,6 +3,8 @@
function login_content(&$a) {
if(x($_SESSION,'theme'))
unset($_SESSION['theme']);
+ if(local_user())
+ goaway(z_root());
return login(($a->config['register_policy'] == REGISTER_CLOSED) ? false : true);
} \ No newline at end of file
diff --git a/mod/lostpass.php b/mod/lostpass.php
index 3453a0db4..b71398fa4 100644
--- a/mod/lostpass.php
+++ b/mod/lostpass.php
@@ -5,7 +5,7 @@ function lostpass_post(&$a) {
$email = notags(trim($_POST['login-name']));
if(! $email)
- goaway($a->get_baseurl());
+ goaway(z_root());
$r = q("SELECT * FROM `user` WHERE ( `email` = '%s' OR `nickname` = '%s' ) AND `verified` = 1 AND `blocked` = 0 LIMIT 1",
dbesc($email),
@@ -14,7 +14,7 @@ function lostpass_post(&$a) {
if(! count($r)) {
notice( t('No valid account found.') . EOL);
- goaway($a->get_baseurl());
+ goaway(z_root());
}
$uid = $r[0]['uid'];
@@ -46,7 +46,7 @@ function lostpass_post(&$a) {
. 'Content-transfer-encoding: 8bit' );
- goaway($a->get_baseurl());
+ goaway(z_root());
}
@@ -62,7 +62,7 @@ function lostpass_content(&$a) {
);
if(! count($r)) {
notice( t("Request could not be verified. \x28You may have previously submitted it.\x29 Password reset failed.") . EOL);
- goaway($a->get_baseurl());
+ goaway(z_root());
return;
}
$uid = $r[0]['uid'];
diff --git a/mod/network.php b/mod/network.php
index 8d377fa0e..7cac7b858 100644
--- a/mod/network.php
+++ b/mod/network.php
@@ -297,9 +297,8 @@ function network_content(&$a, $update = 0) {
$o .= conversation($a,$r,$mode,$update);
if(! $update) {
-
$o .= paginate($a);
- $o .= '<div class="cc-license">' . t('Shared content is covered by the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> license.') . '</div>';
+ $o .= cc_license();
}
return $o;
diff --git a/mod/notifications.php b/mod/notifications.php
index 6f9ece184..920d0d82d 100644
--- a/mod/notifications.php
+++ b/mod/notifications.php
@@ -3,7 +3,7 @@
function notifications_post(&$a) {
if(! local_user()) {
- goaway($a->get_baseurl());
+ goaway(z_root());
}
$request_id = (($a->argc > 1) ? $a->argv[1] : 0);
@@ -60,7 +60,7 @@ function notifications_content(&$a) {
if(! local_user()) {
notice( t('Permission denied.') . EOL);
- goaway($a->get_baseurl());
+ return;
}
$o = '';
@@ -122,23 +122,25 @@ function notifications_content(&$a) {
continue;
}
- $friend_selected = (($rr['network'] !== 'stat') ? ' checked="checked" ' : ' disabled ');
- $fan_selected = (($rr['network'] === 'stat') ? ' checked="checked" disabled ' : '');
+ $friend_selected = (($rr['network'] !== NETWORK_OSTATUS) ? ' checked="checked" ' : ' disabled ');
+ $fan_selected = (($rr['network'] === NETWORK_OSTATUS) ? ' checked="checked" disabled ' : '');
$dfrn_tpl = get_markup_template('netfriend.tpl');
$knowyou = '';
$dfrn_text = '';
- if($rr['network'] !== 'stat') {
- $knowyou = t('Claims to be known to you: ') . (($rr['knowyou']) ? t('yes') : t('no'));
-
+ if($rr['network'] === NETWORK_DFRN || $rr['network'] === NETWORK_DIASPORA) {
+ if($rr['network'] === NETWORK_DFRN)
+ $knowyou = t('Claims to be known to you: ') . (($rr['knowyou']) ? t('yes') : t('no'));
+ else
+ $knowyou = '';
$dfrn_text = replace_macros($dfrn_tpl,array(
'$intro_id' => $rr['intro_id'],
'$friend_selected' => $friend_selected,
'$fan_selected' => $fan_selected,
'$approve_as' => t('Approve as: '),
'$as_friend' => t('Friend'),
- '$as_fan' => t('Fan/Admirer')
+ '$as_fan' => (($rr['network'] == NETWORK_DIASPORA) ? t('Sharer') : t('Fan/Admirer'))
));
}
@@ -146,7 +148,7 @@ function notifications_content(&$a) {
$o .= replace_macros($tpl,array(
'$str_notifytype' => t('Notification type: '),
- '$notify_type' => (($rr['network'] !== 'stat') ? t('Friend/Connect Request') : t('New Follower')),
+ '$notify_type' => (($rr['network'] !== NETWORK_OSTATUS) ? t('Friend/Connect Request') : t('New Follower')),
'$dfrn_text' => $dfrn_text,
'$dfrn_id' => $rr['issued-id'],
'$uid' => $_SESSION['uid'],
diff --git a/mod/openid.php b/mod/openid.php
index 537d84ce3..6fbd013b8 100644
--- a/mod/openid.php
+++ b/mod/openid.php
@@ -8,7 +8,7 @@ function openid_content(&$a) {
$noid = get_config('system','no_openid');
if($noid)
- goaway($a->get_baseurl());
+ goaway(z_root());
if((x($_GET,'openid_mode')) && (x($_SESSION,'openid'))) {
$openid = new LightOpenID;
@@ -49,7 +49,7 @@ function openid_content(&$a) {
if($a->config['register_policy'] != REGISTER_CLOSED)
goaway($a->get_baseurl() . '/register' . $args);
else
- goaway($a->get_baseurl());
+ goaway(z_root());
// NOTREACHED
}
@@ -60,7 +60,7 @@ function openid_content(&$a) {
);
if(! count($r)) {
notice( t('Login failed.') . EOL );
- goaway($a->get_baseurl());
+ goaway(z_root());
}
unset($_SESSION['openid']);
@@ -116,10 +116,10 @@ function openid_content(&$a) {
if(($a->module !== 'home') && isset($_SESSION['return_url']))
goaway($a->get_baseurl() . '/' . $_SESSION['return_url']);
else
- goaway($a->get_baseurl());
+ goaway(z_root());
}
}
notice( t('Login failed.') . EOL);
- goaway($a->get_baseurl());
+ goaway(z_root());
// NOTREACHED
}
diff --git a/mod/parse_url.php b/mod/parse_url.php
index 46c6b46e9..9bb0bc464 100644
--- a/mod/parse_url.php
+++ b/mod/parse_url.php
@@ -116,7 +116,7 @@ function parse_url_content(&$a) {
}
if(strlen($text)) {
- $text = '<br /><br />' . $text;
+ $text = '<br /><br /><blockquote>' . $text . '</blockquote><br />';
}
echo sprintf($template,$url,($title) ? $title : $url,$text);
diff --git a/mod/photo.php b/mod/photo.php
index 9809aa418..3994620f8 100644
--- a/mod/photo.php
+++ b/mod/photo.php
@@ -5,6 +5,11 @@ require_once('include/security.php');
function photo_init(&$a) {
switch($a->argc) {
+ case 4:
+ $person = $a->argv[3];
+ $customres = intval($a->argv[2]);
+ $type = $a->argv[1];
+ break;
case 3:
$person = $a->argv[2];
$type = $a->argv[1];
@@ -29,6 +34,7 @@ function photo_init(&$a) {
switch($type) {
case 'profile':
+ case 'custom':
$resolution = 4;
break;
case 'micro':
@@ -113,8 +119,17 @@ function photo_init(&$a) {
// NOTREACHED
}
+ if(intval($customres) && $customres > 0 && $customres < 500) {
+ require_once('include/Photo.php');
+ $ph = new Photo($data);
+ if($ph->is_valid()) {
+ $ph->scaleImageSquare($customres);
+ $data = $ph->imageString();
+ }
+ }
+
header("Content-type: image/jpeg");
echo $data;
killme();
// NOTREACHED
-} \ No newline at end of file
+}
diff --git a/mod/photos.php b/mod/photos.php
index 4a72bb680..cb13b7603 100644
--- a/mod/photos.php
+++ b/mod/photos.php
@@ -903,7 +903,7 @@ function photos_content(&$a) {
$album = hex2bin($datum);
$r = q("SELECT `resource-id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = %d AND `album` = '%s'
- $sql_extra GROUP BY `resource-id`",
+ AND `scale` <= 4 $sql_extra GROUP BY `resource-id`",
intval($owner_uid),
dbesc($album)
);
@@ -913,7 +913,7 @@ function photos_content(&$a) {
}
$r = q("SELECT `resource-id`, `id`, `filename`, max(`scale`) AS `scale`, `desc` FROM `photo` WHERE `uid` = %d AND `album` = '%s'
- $sql_extra GROUP BY `resource-id` ORDER BY `created` DESC LIMIT %d , %d",
+ AND `scale` <= 4 $sql_extra GROUP BY `resource-id` ORDER BY `created` DESC LIMIT %d , %d",
intval($owner_uid),
dbesc($album),
intval($a->pager['start']),
diff --git a/mod/probe.php b/mod/probe.php
new file mode 100644
index 000000000..c95db291b
--- /dev/null
+++ b/mod/probe.php
@@ -0,0 +1,24 @@
+<?php
+
+require_once('include/Scrape.php');
+
+function probe_content(&$a) {
+
+ $o .= '<h3>Probe Diagnostic</h3>';
+
+ $o .= '<form action="probe" method="get">';
+ $o .= 'Lookup address: <input type="text" style="width: 250px;" name="addr" value="' . $_GET['addr'] .'" />';
+ $o .= '<input type="submit" name="submit" value="Submit" /></form>';
+
+ $o .= '<br /><br />';
+
+ if(x($_GET,'addr')) {
+
+ $addr = trim($_GET['addr']);
+ $res = probe_url($addr);
+ $o .= '<pre>';
+ $o .= str_replace("\n",'<br />',print_r($res,true));
+ $o .= '</pre>';
+ }
+ return $o;
+}
diff --git a/mod/profile.php b/mod/profile.php
index 7e47c91bb..b309ea647 100644
--- a/mod/profile.php
+++ b/mod/profile.php
@@ -21,7 +21,7 @@ function profile_init(&$a) {
profile_load($a,$which,$profile);
- if((x($a->profile,'page-flags')) && ($a->profile['page-flags'] & PAGE_COMMUNITY)) {
+ if((x($a->profile,'page-flags')) && ($a->profile['page-flags'] == PAGE_COMMUNITY)) {
$a->page['htmlhead'] .= '<meta name="friendika.community" content="true" />';
}
if(x($a->profile,'openidserver'))
@@ -236,9 +236,8 @@ function profile_content(&$a, $update = 0) {
$o .= conversation($a,$r,'profile',$update);
if(! $update) {
-
$o .= paginate($a);
- $o .= '<div class="cc-license">' . t('Shared content is covered by the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> license.') . '</div>';
+ $o .= cc_license();
}
return $o;
diff --git a/mod/profiles.php b/mod/profiles.php
index 7041249e2..9b0a2970b 100644
--- a/mod/profiles.php
+++ b/mod/profiles.php
@@ -361,6 +361,9 @@ function profiles_content(&$a) {
$a->page['htmlhead'] .= replace_macros($tpl, array('$baseurl' => $a->get_baseurl()));
$a->page['htmlhead'] .= "<script type=\"text/javascript\" src=\"include/country.js\" ></script>";
+ $f = get_config('system','birthday_input_format');
+ if(! $f)
+ $f = 'ymd';
$is_default = (($r[0]['is-default']) ? 1 : 0);
$tpl = get_markup_template("profile_edit.tpl");
@@ -375,7 +378,7 @@ function profiles_content(&$a) {
'$lbl_fullname' => t('Your Full Name:'),
'$lbl_title' => t('Title/Description:'),
'$lbl_gender' => t('Your Gender:'),
- '$lbl_bd' => t("Birthday \x28y/m/d\x29:"),
+ '$lbl_bd' => sprintf( t("Birthday \x28%s\x29:"),datesel_format($f)),
'$lbl_address' => t('Street Address:'),
'$lbl_city' => t('Locality/City:'),
'$lbl_zip' => t('Postal/Zip Code:'),
@@ -466,7 +469,7 @@ function profiles_content(&$a) {
'$id' => $rr['id'],
'$alt' => t('Profile Image'),
'$profile_name' => $rr['profile-name'],
- '$visible' => (($rr['is-default']) ? '<strong>' . t('Visible to everybody') . '</strong>'
+ '$visible' => (($rr['is-default']) ? '<strong>' . t('visible to everybody') . '</strong>'
: '<a href="' . $a->get_baseurl() . '/profperm/' . $rr['id'] . '" />' . t('Edit visibility') . '</a>')
));
}
diff --git a/mod/pubsub.php b/mod/pubsub.php
index edb0a7fe1..d6e3d378f 100644
--- a/mod/pubsub.php
+++ b/mod/pubsub.php
@@ -111,8 +111,8 @@ function pubsub_post(&$a) {
AND ( `rel` = %d OR `rel` = %d ) AND `blocked` = 0 AND `readonly` = 0 LIMIT 1",
intval($contact_id),
intval($importer['uid']),
- intval(REL_FAN),
- intval(REL_BUD)
+ intval(CONTACT_IS_SHARING),
+ intval(CONTACT_IS_FRIEND)
);
if(! count($r)) {
diff --git a/mod/receive.php b/mod/receive.php
index 6fb68e154..19c163967 100644
--- a/mod/receive.php
+++ b/mod/receive.php
@@ -6,25 +6,14 @@
require_once('include/salmon.php');
-require_once('library/simplepie/simplepie.inc');
-
-function receive_return($val) {
-
- if($val >= 400)
- $err = 'Error';
- if($val >= 200 && $val < 300)
- $err = 'OK';
-
- logger('mod-diaspora returns ' . $val);
- header($_SERVER["SERVER_PROTOCOL"] . ' ' . $val . ' ' . $err);
- killme();
-
-}
+require_once('include/crypto.php');
+require_once('include/diaspora.php');
+
function receive_post(&$a) {
if($a->argc != 3 || $a->argv[1] !== 'users')
- receive_return(500);
+ http_status_exit(500);
$guid = $a->argv[2];
@@ -32,183 +21,51 @@ function receive_post(&$a) {
dbesc($guid)
);
if(! count($r))
- salmon_return(500);
+ http_status_exit(500);
$importer = $r[0];
- $xml = $_POST['xml'];
+ // It is an application/x-www-form-urlencoded
+
+ $xml = urldecode($_POST['xml']);
logger('mod-diaspora: new salmon ' . $xml, LOGGER_DATA);
if(! $xml)
- receive_return(500);
-
- // parse the xml
-
- $dom = simplexml_load_string($xml,'SimpleXMLElement',0,NAMESPACE_SALMON_ME);
-
- // figure out where in the DOM tree our data is hiding
-
- if($dom->provenance->data)
- $base = $dom->provenance;
- elseif($dom->env->data)
- $base = $dom->env;
- elseif($dom->data)
- $base = $dom;
-
- if(! $base) {
- logger('mod-diaspora: unable to locate salmon data in xml ');
- receive_return(400);
- }
-
- // Stash the signature away for now. We have to find their key or it won't be good for anything.
- $signature = base64url_decode($base->sig);
+ http_status_exit(500);
- // unpack the data
+ $msg = diaspora_decode($importer,$xml);
- // strip whitespace so our data element will return to one big base64 blob
- $data = str_replace(array(" ","\t","\r","\n"),array("","","",""),$base->data);
+ logger('mod-diaspora: decoded msg: ' . print_r($msg,true), LOGGER_DATA);
- // stash away some other stuff for later
+ if(! is_array($msg))
+ http_status_exit(500);
- $type = $base->data[0]->attributes()->type[0];
- $keyhash = $base->sig[0]->attributes()->keyhash[0];
- $encoding = $base->encoding;
- $alg = $base->alg;
- $signed_data = $data . '.' . base64url_encode($type) . '.' . base64url_encode($encoding) . '.' . base64url_encode($alg);
+ $parsed_xml = parse_xml_string($msg['message'],false);
- // decode the data
- $data = base64url_decode($data);
+ $xmlbase = $parsed_xml->post;
- // Remove the xml declaration
- $data = preg_replace('/\<\?xml[^\?].*\?\>/','',$data);
-
- // Create a fake feed wrapper so simplepie doesn't choke
-
- $tpl = get_markup_template('fake_feed.tpl');
-
- $base = substr($data,strpos($data,'<entry'));
-
- $feedxml = $tpl . $base . '</feed>';
-
- logger('mod-diaspora: Processed feed: ' . $feedxml);
-
- // Now parse it like a normal atom feed to scrape out the author URI
-
- $feed = new SimplePie();
- $feed->set_raw_data($feedxml);
- $feed->enable_order_by_date(false);
- $feed->init();
-
- logger('mod-diaspora: Feed parsed.');
-
- if($feed->get_item_quantity()) {
- foreach($feed->get_items() as $item) {
- $author = $item->get_author();
- $author_link = unxmlify($author->get_link());
- break;
- }
+ if($xmlbase->request) {
+ diaspora_request($importer,$xmlbase->request);
}
-
- if(! $author_link) {
- logger('mod-diaspora: Could not retrieve author URI.');
- receive_return(400);
+ elseif($xmlbase->status_message) {
+ diaspora_post($importer,$xmlbase->status_message);
}
-
- // Once we have the author URI, go to the web and try to find their public key
-
- logger('mod-salmon: Fetching key for ' . $author_link );
-
-
- $key = get_salmon_key($author_link,$keyhash);
-
- if(! $key) {
- logger('mod-salmon: Could not retrieve author key.');
- receive_return(400);
+ elseif($xmlbase->comment) {
+ diaspora_comment($importer,$xmlbase->comment,$msg);
}
-
- // Setup RSA stuff to verify the signature
-
- set_include_path(get_include_path() . PATH_SEPARATOR . 'library' . PATH_SEPARATOR . 'phpsec');
-
- require_once('library/phpsec/Crypt/RSA.php');
-
- $key_info = explode('.',$key);
-
- $m = base64url_decode($key_info[1]);
- $e = base64url_decode($key_info[2]);
-
- logger('mod-salmon: key details: ' . print_r($key_info,true));
-
- $rsa = new CRYPT_RSA();
- $rsa->signatureMode = CRYPT_RSA_SIGNATURE_PKCS1;
- $rsa->setHash('sha256');
-
- $rsa->modulus = new Math_BigInteger($m, 256);
- $rsa->k = strlen($rsa->modulus->toBytes());
- $rsa->exponent = new Math_BigInteger($e, 256);
-
- $verify = $rsa->verify($signed_data,$signature);
-
- if(! $verify) {
- logger('mod-diaspora: Message did not verify. Discarding.');
- receive_return(400);
+ elseif($xmlbase->like) {
+ diaspora_like($importer,$xmlbase->like,$msg);
}
-
- logger('mod-diaspora: Message verified.');
-
- /* decrypt the sucker */
- /*
- // TODO
- */
-
- /*
- *
- * If we reached this point, the message is good. Now let's figure out if the author is allowed to send us stuff.
- *
- */
-
- $r = q("SELECT * FROM `contact` WHERE `network` = 'dspr' AND ( `url` = '%s' OR `alias` = '%s')
- AND `uid` = %d LIMIT 1",
- dbesc($author_link),
- dbesc($author_link),
- intval($importer['uid'])
- );
- if(! count($r)) {
- logger('mod-diaspora: Author unknown to us.');
- }
-
- // is this a follower? Or have we ignored the person?
- // If so we can not accept this post.
-
- if((count($r)) && (($r[0]['readonly']) || ($r[0]['rel'] == REL_VIP) || ($r[0]['blocked']))) {
- logger('mod-diaspora: Ignoring this author.');
- receive_return(202);
- // NOTREACHED
+ elseif($xmlbase->retraction) {
+ diaspora_retraction($importer,$xmlbase->retraction,$msg);
+ }
+ else {
+ logger('mod-diaspora: unknown message type: ' . print_r($xmlbase,true));
}
- require_once('include/items.php');
-
- // Placeholder for hub discovery. We shouldn't find any hubs
- // since we supplied the fake feed header - and it doesn't have any.
-
- $hub = '';
-
- /**
- *
- * anti-spam measure: consume_feed will accept a follow activity from
- * this person (and nothing else) if there is no existing contact record.
- *
- */
-
- $contact_rec = ((count($r)) ? $r[0] : null);
-
- consume_feed($feedxml,$importer,$contact_rec,$hub);
-
- receive_return(200);
+ http_status_exit(200);
+ // NOTREACHED
}
-
-
-
diff --git a/mod/redir.php b/mod/redir.php
index 8d0c8f4b3..eb9702b04 100644
--- a/mod/redir.php
+++ b/mod/redir.php
@@ -3,7 +3,7 @@
function redir_init(&$a) {
if((! local_user()) || (! ($a->argc == 2)) || (! intval($a->argv[1])))
- goaway($a->get_baseurl());
+ goaway(z_root());
$cid = $a->argv[1];
$url = ((x($_GET,'url')) ? $_GET['url'] : '');
@@ -13,7 +13,7 @@ function redir_init(&$a) {
);
if((! count($r)) || ($r[0]['network'] !== 'dfrn'))
- goaway($a->get_baseurl());
+ goaway(z_root());
$dfrn_id = $orig_id = (($r[0]['issued-id']) ? $r[0]['issued-id'] : $r[0]['dfrn-id']);
diff --git a/mod/register.php b/mod/register.php
index 0906395d2..5fceebd4b 100644
--- a/mod/register.php
+++ b/mod/register.php
@@ -201,7 +201,7 @@ function register_post(&$a) {
$r = q("INSERT INTO `user` ( `guid`, `username`, `password`, `email`, `openid`, `nickname`,
`pubkey`, `prvkey`, `spubkey`, `sprvkey`, `register_date`, `verified`, `blocked` )
VALUES ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d )",
- dbesc(generate_guid()),
+ dbesc(generate_user_guid()),
dbesc($username),
dbesc($new_password_encoded),
dbesc($email),
@@ -373,7 +373,7 @@ function register_post(&$a) {
if($res) {
info( t('Registration successful. Please check your email for further instructions.') . EOL ) ;
- goaway($a->get_baseurl());
+ goaway(z_root());
}
else {
notice( t('Failed to send email message. Here is the message that failed.') . $email_tpl . EOL );
@@ -382,7 +382,7 @@ function register_post(&$a) {
elseif($a->config['register_policy'] == REGISTER_APPROVE) {
if(! strlen($a->config['admin_email'])) {
notice( t('Your registration can not be processed.') . EOL);
- goaway($a->get_baseurl());
+ goaway(z_root());
}
$hash = random_string();
@@ -428,7 +428,7 @@ function register_post(&$a) {
if($res) {
info( t('Your registration is pending approval by the site owner.') . EOL ) ;
- goaway($a->get_baseurl());
+ goaway(z_root());
}
}
@@ -501,7 +501,7 @@ function register_content(&$a) {
}
- $license = t('Shared content is covered by the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> license.');
+ $license = cc_license();
$o = get_markup_template("register.tpl");
diff --git a/mod/removeme.php b/mod/removeme.php
index 6a56963b6..c181ee6ea 100644
--- a/mod/removeme.php
+++ b/mod/removeme.php
@@ -29,7 +29,7 @@ function removeme_post(&$a) {
function removeme_content(&$a) {
if(! local_user())
- goaway($a->get_baseurl());
+ goaway(z_root());
$hash = random_string();
diff --git a/mod/salmon.php b/mod/salmon.php
index 56ac071b0..0264e820d 100644
--- a/mod/salmon.php
+++ b/mod/salmon.php
@@ -5,6 +5,7 @@
// complicated process to try and sort out.
require_once('include/salmon.php');
+require_once('include/crypto.php');
require_once('library/simplepie/simplepie.inc');
function salmon_return($val) {
@@ -33,7 +34,7 @@ function salmon_post(&$a) {
dbesc($nick)
);
if(! count($r))
- salmon_return(500);
+ http_status_exit(500);
$importer = $r[0];
@@ -52,7 +53,7 @@ function salmon_post(&$a) {
if(! $base) {
logger('mod-salmon: unable to locate salmon data in xml ');
- salmon_return(400);
+ http_status_exit(400);
}
// Stash the signature away for now. We have to find their key or it won't be good for anything.
@@ -72,12 +73,16 @@ function salmon_post(&$a) {
$encoding = $base->encoding;
$alg = $base->alg;
- // If we're talking to status.net or one of their ilk, they aren't following the magic envelope spec
- // and only signed the data element. We'll be nice and let them validate anyway.
+ // Salmon magic signatures have evolved and there is no way of knowing ahead of time which
+ // flavour we have. We'll try and verify it regardless.
$stnet_signed_data = $data;
+
$signed_data = $data . '.' . base64url_encode($type) . '.' . base64url_encode($encoding) . '.' . base64url_encode($alg);
+ $compliant_format = str_replace('=','',$signed_data);
+
+
// decode the data
$data = base64url_decode($data);
@@ -113,7 +118,7 @@ function salmon_post(&$a) {
if(! $author_link) {
logger('mod-salmon: Could not retrieve author URI.');
- salmon_return(400);
+ http_status_exit(400);
}
// Once we have the author URI, go to the web and try to find their public key
@@ -125,44 +130,35 @@ function salmon_post(&$a) {
if(! $key) {
logger('mod-salmon: Could not retrieve author key.');
- salmon_return(400);
+ http_status_exit(400);
}
- // Setup RSA stuff to verify the signature
-
- set_include_path(get_include_path() . PATH_SEPARATOR . 'library/phpsec');
-
- require_once('library/phpsec/Crypt/RSA.php');
-
$key_info = explode('.',$key);
$m = base64url_decode($key_info[1]);
$e = base64url_decode($key_info[2]);
- logger('mod-salmon: key details: ' . print_r($key_info,true));
-
- $rsa = new CRYPT_RSA();
- $rsa->signatureMode = CRYPT_RSA_SIGNATURE_PKCS1;
- $rsa->setHash('sha256');
+ logger('mod-salmon: key details: ' . print_r($key_info,true), LOGGER_DEBUG);
- $rsa->modulus = new Math_BigInteger($m, 256);
- $rsa->k = strlen($rsa->modulus->toBytes());
- $rsa->exponent = new Math_BigInteger($e, 256);
+ $pubkey = metopem($m,$e);
// We should have everything we need now. Let's see if it verifies.
- // If it fails with the proper data format, try again using just the data
- // (e.g. status.net)
- $verify = $rsa->verify($signed_data,$signature);
+ $verify = rsa_verify($compliant_format,$signature,$pubkey);
+
+ if(! $verify) {
+ logger('mod-salmon: message did not verify using protocol. Trying padding hack.');
+ $verify = rsa_verify($signed_data,$signature,$pubkey);
+ }
if(! $verify) {
- logger('mod-salmon: message did not verify using protocol. Trying statusnet hack.');
- $verify = $rsa->verify($stnet_signed_data,$signature);
+ logger('mod-salmon: message did not verify using padding. Trying old statusnet hack.');
+ $verify = rsa_verify($stnet_signed_data,$signature,$pubkey);
}
if(! $verify) {
logger('mod-salmon: Message did not verify. Discarding.');
- salmon_return(400);
+ http_status_exit(400);
}
logger('mod-salmon: Message verified.');
@@ -187,9 +183,9 @@ function salmon_post(&$a) {
// is this a follower? Or have we ignored the person?
// If so we can not accept this post.
- if((count($r)) && (($r[0]['readonly']) || ($r[0]['rel'] == REL_VIP) || ($r[0]['blocked']))) {
+ if((count($r)) && (($r[0]['readonly']) || ($r[0]['rel'] == CONTACT_IS_FOLLOWER) || ($r[0]['blocked']))) {
logger('mod-salmon: Ignoring this author.');
- salmon_return(202);
+ http_status_exit(202);
// NOTREACHED
}
@@ -211,7 +207,7 @@ function salmon_post(&$a) {
consume_feed($feedxml,$importer,$contact_rec,$hub);
- salmon_return(200);
+ http_status_exit(200);
}
diff --git a/mod/search.php b/mod/search.php
index 9b465c0e5..88ff9bbb7 100644
--- a/mod/search.php
+++ b/mod/search.php
@@ -91,6 +91,7 @@ function search_content(&$a) {
$o .= conversation($a,$r,'search',false);
$o .= paginate($a);
+ $o .= cc_license();
return $o;
}
diff --git a/mod/wall_attach.php b/mod/wall_attach.php
index f18fd10b7..ef6554df3 100644
--- a/mod/wall_attach.php
+++ b/mod/wall_attach.php
@@ -60,11 +60,11 @@ function wall_attach_post(&$a) {
}
$filedata = @file_get_contents($src);
-
- $mimetype = mime_content_type($src);
+ $mimetype = z_mime_content_type($filename);
+ if((! strlen($mimetype)) || ($mimetype === 'application/octet-stream') && function_exists('mime_content_type'))
+ $mimetype = mime_content_type($filename);
$hash = random_string();
$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),
diff --git a/mod/webfinger.php b/mod/webfinger.php
index f6d6026b4..74bd2c954 100644
--- a/mod/webfinger.php
+++ b/mod/webfinger.php
@@ -23,4 +23,4 @@ function webfinger_content(&$a) {
$o .= '</pre>';
}
return $o;
-} \ No newline at end of file
+}
diff --git a/mod/xrd.php b/mod/xrd.php
index accc2f68e..fcec74336 100644
--- a/mod/xrd.php
+++ b/mod/xrd.php
@@ -1,8 +1,8 @@
<?php
-require_once('salmon.php');
+require_once('include/crypto.php');
-function xrd_content(&$a) {
+function xrd_init(&$a) {
$uri = urldecode(notags(trim($_GET['uri'])));
@@ -27,25 +27,23 @@ function xrd_content(&$a) {
header('Access-Control-Allow-Origin: *');
header("Content-type: text/xml");
- $dspr_enabled = get_config('system','diaspora_enabled');
-
- if($dspr_enabled) {
+ if(get_config('system','diaspora_enabled')) {
$tpl = file_get_contents('view/xrd_diaspora.tpl');
$dspr = replace_macros($tpl,array(
'$baseurl' => $a->get_baseurl(),
'$dspr_guid' => $r[0]['guid'],
- '$dspr_key' => base64_encode($r[0]['pubkey'])
+ '$dspr_key' => base64_encode(pemtorsa($r[0]['pubkey']))
));
}
else
$dspr = '';
-
$tpl = file_get_contents('view/xrd_person.tpl');
$o = replace_macros($tpl, array(
'$accturi' => $uri,
'$profile_url' => $a->get_baseurl() . '/profile/' . $r[0]['nickname'],
+ '$hcard_url' => $a->get_baseurl() . '/hcard/' . $r[0]['nickname'],
'$atom' => $a->get_baseurl() . '/dfrn_poll/' . $r[0]['nickname'],
'$photo' => $a->get_baseurl() . '/photo/profile/' . $r[0]['uid'] . '.jpg',
'$dspr' => $dspr,
@@ -58,7 +56,7 @@ function xrd_content(&$a) {
$arr = array('user' => $r[0], 'xml' => $o);
call_hooks('personal_xrd', $arr);
- echo $o;
+ echo $arr['xml'];
killme();
}
diff --git a/update.php b/update.php
index 9c55f15cf..256ab48e8 100644
--- a/update.php
+++ b/update.php
@@ -1,6 +1,6 @@
<?php
-define( 'UPDATE_VERSION' , 1076 );
+define( 'UPDATE_VERSION' , 1079 );
/**
*
@@ -623,4 +623,26 @@ function update_1075() {
);
}
}
-} \ No newline at end of file
+}
+
+function update_1076() {
+ q("CREATE TABLE `guid` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+ `guid` CHAR( 16 ) NOT NULL , INDEX ( `guid` ) ) ENGINE = MYISAM ");
+
+}
+
+// There was a typo in 1076 so we'll try again in 1077 to make sure
+// We'll also make it big enough to allow for future growth, I seriously
+// doubt Diaspora will be able to leave guids at 16 bytes,
+// and we can also use the same structure for our own larger guids
+
+function update_1077() {
+ q("CREATE TABLE IF NOT EXISTS `guid` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+ `guid` CHAR( 16 ) NOT NULL , INDEX ( `guid` ) ) ENGINE = MYISAM ");
+
+ q("ALTER TABLE `guid` CHANGE `guid` `guid` CHAR( 64 ) NOT NULL");
+}
+
+function update_1078() {
+ q("ALTER TABLE `item` ADD `guid` CHAR( 64 ) NOT NULL AFTER `id` , ADD INDEX ( `guid` ) ");
+}
diff --git a/util/messages.po b/util/messages.po
index 68c844388..2be9ac595 100644
--- a/util/messages.po
+++ b/util/messages.po
@@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: 2.2.991\n"
+"Project-Id-Version: 2.2.1072\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-05-26 06:46-0700\n"
+"POT-Creation-Date: 2011-08-14 21:17-0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -30,26 +30,27 @@ msgid "Contact update failed."
msgstr ""
#: ../../mod/crepair.php:54 ../../mod/wall_attach.php:43
-#: ../../mod/photos.php:89 ../../mod/photos.php:802 ../../mod/editpost.php:10
-#: ../../mod/install.php:93 ../../mod/notifications.php:56
-#: ../../mod/contacts.php:106 ../../mod/settings.php:15
-#: ../../mod/settings.php:20 ../../mod/settings.php:251
-#: ../../mod/manage.php:75 ../../mod/network.php:6 ../../mod/notes.php:20
-#: ../../mod/attach.php:64 ../../mod/group.php:19
+#: ../../mod/fsuggest.php:78 ../../mod/events.php:102 ../../mod/photos.php:122
+#: ../../mod/photos.php:849 ../../mod/editpost.php:10 ../../mod/install.php:96
+#: ../../mod/notifications.php:62 ../../mod/contacts.php:132
+#: ../../mod/settings.php:41 ../../mod/settings.php:46
+#: ../../mod/settings.php:305 ../../mod/manage.php:75 ../../mod/network.php:6
+#: ../../mod/notes.php:20 ../../mod/attach.php:33 ../../mod/group.php:19
#: ../../mod/viewcontacts.php:21 ../../mod/register.php:27
-#: ../../mod/regmod.php:18 ../../mod/item.php:57 ../../mod/item.php:801
+#: ../../mod/regmod.php:111 ../../mod/item.php:110
#: ../../mod/profile_photo.php:19 ../../mod/profile_photo.php:133
#: ../../mod/profile_photo.php:144 ../../mod/profile_photo.php:155
-#: ../../mod/message.php:8 ../../mod/message.php:116
+#: ../../mod/message.php:8 ../../mod/message.php:116 ../../mod/admin.php:10
#: ../../mod/wall_upload.php:42 ../../mod/follow.php:8
-#: ../../mod/display.php:138 ../../mod/profiles.php:7
-#: ../../mod/profiles.php:230 ../../mod/invite.php:13 ../../mod/invite.php:54
-#: ../../mod/dfrn_confirm.php:53 ../../addon/facebook/facebook.php:242
-#: ../../index.php:256
+#: ../../mod/display.php:108 ../../mod/profiles.php:7
+#: ../../mod/profiles.php:226 ../../mod/invite.php:13 ../../mod/invite.php:81
+#: ../../mod/dfrn_confirm.php:53 ../../addon/facebook/facebook.php:308
+#: ../../include/items.php:1930 ../../index.php:266
msgid "Permission denied."
msgstr ""
-#: ../../mod/crepair.php:68 ../../mod/contacts.php:214
+#: ../../mod/crepair.php:68 ../../mod/fsuggest.php:20
+#: ../../mod/fsuggest.php:92 ../../mod/contacts.php:240
#: ../../mod/dfrn_confirm.php:114
msgid "Contact not found."
msgstr ""
@@ -70,7 +71,7 @@ msgid ""
"uncertain what to do on this page."
msgstr ""
-#: ../../mod/crepair.php:85
+#: ../../mod/crepair.php:85 ../../mod/admin.php:464 ../../mod/admin.php:473
msgid "Name"
msgstr ""
@@ -98,20 +99,25 @@ msgstr ""
msgid "Poll/Feed URL"
msgstr ""
-#: ../../mod/crepair.php:100 ../../mod/photos.php:830 ../../mod/photos.php:887
-#: ../../mod/photos.php:1095 ../../mod/photos.php:1135
-#: ../../mod/photos.php:1174 ../../mod/photos.php:1205
-#: ../../mod/install.php:133 ../../mod/contacts.php:264
-#: ../../mod/settings.php:426 ../../mod/manage.php:106 ../../mod/group.php:76
-#: ../../mod/group.php:159 ../../mod/profiles.php:383 ../../mod/invite.php:68
-#: ../../addon/facebook/facebook.php:289
-#: ../../addon/randplace/randplace.php:179 ../../addon/oembed/oembed.php:49
-#: ../../addon/statusnet/statusnet.php:216
-#: ../../addon/statusnet/statusnet.php:230
-#: ../../addon/statusnet/statusnet.php:256
-#: ../../addon/statusnet/statusnet.php:263
-#: ../../addon/statusnet/statusnet.php:285 ../../addon/twitter/twitter.php:156
-#: ../../addon/twitter/twitter.php:175 ../../include/conversation.php:383
+#: ../../mod/crepair.php:100 ../../mod/fsuggest.php:107
+#: ../../mod/events.php:333 ../../mod/photos.php:877 ../../mod/photos.php:934
+#: ../../mod/photos.php:1144 ../../mod/photos.php:1184
+#: ../../mod/photos.php:1223 ../../mod/photos.php:1254
+#: ../../mod/install.php:137 ../../mod/contacts.php:296
+#: ../../mod/settings.php:482 ../../mod/manage.php:106 ../../mod/group.php:84
+#: ../../mod/group.php:167 ../../mod/admin.php:298 ../../mod/admin.php:461
+#: ../../mod/admin.php:587 ../../mod/admin.php:652 ../../mod/profiles.php:372
+#: ../../mod/invite.php:106 ../../addon/facebook/facebook.php:366
+#: ../../addon/randplace/randplace.php:178
+#: ../../addon/impressum/impressum.php:69 ../../addon/oembed/oembed.php:41
+#: ../../addon/statusnet/statusnet.php:274
+#: ../../addon/statusnet/statusnet.php:288
+#: ../../addon/statusnet/statusnet.php:314
+#: ../../addon/statusnet/statusnet.php:321
+#: ../../addon/statusnet/statusnet.php:343
+#: ../../addon/statusnet/statusnet.php:468 ../../addon/piwik/piwik.php:76
+#: ../../addon/twitter/twitter.php:171 ../../addon/twitter/twitter.php:194
+#: ../../addon/twitter/twitter.php:280 ../../include/conversation.php:409
msgid "Submit"
msgstr ""
@@ -132,8 +138,112 @@ msgstr ""
msgid "File upload failed."
msgstr ""
+#: ../../mod/fsuggest.php:63
+msgid "Friend suggestion sent."
+msgstr ""
+
+#: ../../mod/fsuggest.php:97
+msgid "Suggest Friends"
+msgstr ""
+
+#: ../../mod/fsuggest.php:99
+#, php-format
+msgid "Suggest a friend for %s"
+msgstr ""
+
+#: ../../mod/events.php:112 ../../mod/photos.php:834 ../../mod/notes.php:46
+#: ../../mod/profile.php:116
+msgid "Status"
+msgstr ""
+
+#: ../../mod/events.php:113 ../../mod/photos.php:835 ../../mod/notes.php:47
+#: ../../mod/profperm.php:103 ../../mod/profile.php:117
+#: ../../include/profile_advanced.php:7
+msgid "Profile"
+msgstr ""
+
+#: ../../mod/events.php:114 ../../mod/photos.php:836 ../../mod/notes.php:48
+#: ../../mod/profile.php:118
+msgid "Photos"
+msgstr ""
+
+#: ../../mod/events.php:115 ../../mod/events.php:120 ../../mod/photos.php:837
+#: ../../mod/notes.php:49 ../../mod/profile.php:119
+msgid "Events"
+msgstr ""
+
+#: ../../mod/events.php:116 ../../mod/photos.php:838 ../../mod/notes.php:50
+#: ../../mod/notes.php:55 ../../mod/profile.php:120
+msgid "Personal Notes"
+msgstr ""
+
+#: ../../mod/events.php:210
+msgid "Create New Event"
+msgstr ""
+
+#: ../../mod/events.php:213
+msgid "Previous"
+msgstr ""
+
+#: ../../mod/events.php:216
+msgid "Next"
+msgstr ""
+
+#: ../../mod/events.php:223
+msgid "l, F j"
+msgstr ""
+
+#: ../../mod/events.php:235
+msgid "Edit event"
+msgstr ""
+
+#: ../../mod/events.php:237 ../../include/text.php:846
+msgid "link to source"
+msgstr ""
+
+#: ../../mod/events.php:305
+msgid "hour:minute"
+msgstr ""
+
+#: ../../mod/events.php:314
+msgid "Event details"
+msgstr ""
+
+#: ../../mod/events.php:315
+#, php-format
+msgid "Format is %s %s. Starting date and Description are required."
+msgstr ""
+
+#: ../../mod/events.php:316
+msgid "Event Starts:"
+msgstr ""
+
+#: ../../mod/events.php:319
+msgid "Finish date/time is not known or not relevant"
+msgstr ""
+
+#: ../../mod/events.php:321
+msgid "Event Finishes:"
+msgstr ""
+
+#: ../../mod/events.php:324
+msgid "Adjust for viewer timezone"
+msgstr ""
+
+#: ../../mod/events.php:326
+msgid "Description:"
+msgstr ""
+
+#: ../../mod/events.php:328 ../../include/event.php:37 ../../boot.php:868
+msgid "Location:"
+msgstr ""
+
+#: ../../mod/events.php:330
+msgid "Share this event"
+msgstr ""
+
#: ../../mod/tagrm.php:11 ../../mod/tagrm.php:94
-#: ../../mod/dfrn_request.php:644 ../../addon/js_upload/js_upload.php:41
+#: ../../mod/dfrn_request.php:644 ../../addon/js_upload/js_upload.php:45
msgid "Cancel"
msgstr ""
@@ -158,204 +268,225 @@ msgstr ""
msgid "%s welcomes %s"
msgstr ""
-#: ../../mod/photos.php:34
+#: ../../mod/photos.php:37
msgid "Photo Albums"
msgstr ""
-#: ../../mod/photos.php:38 ../../mod/photos.php:110 ../../mod/photos.php:810
-#: ../../mod/photos.php:879 ../../mod/photos.php:894 ../../mod/photos.php:1282
-#: ../../mod/photos.php:1293 ../../include/Photo.php:233
-#: ../../include/Photo.php:240 ../../include/Photo.php:247
-#: ../../include/items.php:1041 ../../include/items.php:1044
-#: ../../include/items.php:1047
+#: ../../mod/photos.php:45 ../../mod/photos.php:143 ../../mod/photos.php:857
+#: ../../mod/photos.php:926 ../../mod/photos.php:941 ../../mod/photos.php:1332
+#: ../../mod/photos.php:1344
msgid "Contact Photos"
msgstr ""
-#: ../../mod/photos.php:99
+#: ../../mod/photos.php:57 ../../mod/settings.php:9
+msgid "everybody"
+msgstr ""
+
+#: ../../mod/photos.php:132
msgid "Contact information unavailable"
msgstr ""
-#: ../../mod/photos.php:110 ../../mod/photos.php:535 ../../mod/photos.php:879
-#: ../../mod/photos.php:894 ../../mod/register.php:290
-#: ../../mod/register.php:297 ../../mod/register.php:304
+#: ../../mod/photos.php:143 ../../mod/photos.php:577 ../../mod/photos.php:926
+#: ../../mod/photos.php:941 ../../mod/register.php:316
+#: ../../mod/register.php:323 ../../mod/register.php:330
#: ../../mod/profile_photo.php:58 ../../mod/profile_photo.php:65
#: ../../mod/profile_photo.php:72 ../../mod/profile_photo.php:160
#: ../../mod/profile_photo.php:236 ../../mod/profile_photo.php:245
msgid "Profile Photos"
msgstr ""
-#: ../../mod/photos.php:120
+#: ../../mod/photos.php:153
msgid "Album not found."
msgstr ""
-#: ../../mod/photos.php:138 ../../mod/photos.php:888
+#: ../../mod/photos.php:171 ../../mod/photos.php:935
msgid "Delete Album"
msgstr ""
-#: ../../mod/photos.php:201 ../../mod/photos.php:1096
+#: ../../mod/photos.php:234 ../../mod/photos.php:1145
msgid "Delete Photo"
msgstr ""
-#: ../../mod/photos.php:473
+#: ../../mod/photos.php:508
msgid "was tagged in a"
msgstr ""
-#: ../../mod/photos.php:473 ../../mod/like.php:110
-#: ../../include/conversation.php:20
+#: ../../mod/photos.php:508 ../../mod/like.php:110
+#: ../../include/diaspora.php:446 ../../include/conversation.php:31
msgid "photo"
msgstr ""
-#: ../../mod/photos.php:473
+#: ../../mod/photos.php:508
msgid "by"
msgstr ""
-#: ../../mod/photos.php:563 ../../addon/js_upload/js_upload.php:306
+#: ../../mod/photos.php:608 ../../addon/js_upload/js_upload.php:310
msgid "Image exceeds size limit of "
msgstr ""
-#: ../../mod/photos.php:577 ../../mod/profile_photo.php:118
+#: ../../mod/photos.php:616
+msgid "Image file is empty."
+msgstr ""
+
+#: ../../mod/photos.php:630 ../../mod/profile_photo.php:118
#: ../../mod/wall_upload.php:65
msgid "Unable to process image."
msgstr ""
-#: ../../mod/photos.php:597 ../../mod/profile_photo.php:241
-#: ../../mod/wall_upload.php:82
+#: ../../mod/photos.php:650 ../../mod/profile_photo.php:241
+#: ../../mod/wall_upload.php:84
msgid "Image upload failed."
msgstr ""
-#: ../../mod/photos.php:680 ../../mod/dfrn_request.php:591
-#: ../../mod/viewcontacts.php:16 ../../mod/display.php:7
-#: ../../mod/search.php:13 ../../mod/directory.php:20
+#: ../../mod/photos.php:733 ../../mod/community.php:9
+#: ../../mod/dfrn_request.php:591 ../../mod/viewcontacts.php:16
+#: ../../mod/display.php:7 ../../mod/search.php:13 ../../mod/directory.php:20
msgid "Public access denied."
msgstr ""
-#: ../../mod/photos.php:690
+#: ../../mod/photos.php:743
msgid "No photos selected"
msgstr ""
-#: ../../mod/photos.php:837
+#: ../../mod/photos.php:820
+msgid "Access to this item is restricted."
+msgstr ""
+
+#: ../../mod/photos.php:884
msgid "Upload Photos"
msgstr ""
-#: ../../mod/photos.php:840 ../../mod/photos.php:883
+#: ../../mod/photos.php:887 ../../mod/photos.php:930
msgid "New album name: "
msgstr ""
-#: ../../mod/photos.php:841
+#: ../../mod/photos.php:888
msgid "or existing album name: "
msgstr ""
-#: ../../mod/photos.php:843 ../../mod/photos.php:1091
+#: ../../mod/photos.php:890 ../../mod/photos.php:1140
msgid "Permissions"
msgstr ""
-#: ../../mod/photos.php:898
+#: ../../mod/photos.php:945
msgid "Edit Album"
msgstr ""
-#: ../../mod/photos.php:908 ../../mod/photos.php:1311
+#: ../../mod/photos.php:955 ../../mod/photos.php:1362
msgid "View Photo"
msgstr ""
-#: ../../mod/photos.php:937
+#: ../../mod/photos.php:984
msgid "Photo not available"
msgstr ""
-#: ../../mod/photos.php:986
+#: ../../mod/photos.php:1033
msgid "Edit photo"
msgstr ""
-#: ../../mod/photos.php:987
+#: ../../mod/photos.php:1034
msgid "Use as profile photo"
msgstr ""
-#: ../../mod/photos.php:993 ../../include/conversation.php:316
+#: ../../mod/photos.php:1040 ../../include/conversation.php:342
msgid "Private Message"
msgstr ""
-#: ../../mod/photos.php:1000
-msgid "<< Prev"
-msgstr ""
-
-#: ../../mod/photos.php:1004
+#: ../../mod/photos.php:1051
msgid "View Full Size"
msgstr ""
-#: ../../mod/photos.php:1009
-msgid "Next >>"
-msgstr ""
-
-#: ../../mod/photos.php:1071
+#: ../../mod/photos.php:1119
msgid "Tags: "
msgstr ""
-#: ../../mod/photos.php:1074
+#: ../../mod/photos.php:1122
msgid "[Remove any tag]"
msgstr ""
-#: ../../mod/photos.php:1084
+#: ../../mod/photos.php:1133
msgid "New album name"
msgstr ""
-#: ../../mod/photos.php:1087
+#: ../../mod/photos.php:1136
msgid "Caption"
msgstr ""
-#: ../../mod/photos.php:1089
+#: ../../mod/photos.php:1138
msgid "Add a Tag"
msgstr ""
-#: ../../mod/photos.php:1093
+#: ../../mod/photos.php:1142
msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
msgstr ""
-#: ../../mod/photos.php:1113 ../../include/conversation.php:364
+#: ../../mod/photos.php:1162 ../../include/conversation.php:390
msgid "I like this (toggle)"
msgstr ""
-#: ../../mod/photos.php:1114 ../../include/conversation.php:365
+#: ../../mod/photos.php:1163 ../../include/conversation.php:391
msgid "I don't like this (toggle)"
msgstr ""
-#: ../../mod/photos.php:1115 ../../include/conversation.php:366
-#: ../../include/conversation.php:731
+#: ../../mod/photos.php:1164 ../../include/conversation.php:392
+#: ../../include/conversation.php:746
msgid "Share"
msgstr ""
-#: ../../mod/photos.php:1116 ../../mod/editpost.php:97
+#: ../../mod/photos.php:1165 ../../mod/editpost.php:99
#: ../../mod/message.php:190 ../../mod/message.php:324
-#: ../../include/conversation.php:367 ../../include/conversation.php:741
+#: ../../include/conversation.php:393 ../../include/conversation.php:756
msgid "Please wait"
msgstr ""
-#: ../../mod/photos.php:1132 ../../mod/photos.php:1171
-#: ../../mod/photos.php:1202 ../../include/conversation.php:380
+#: ../../mod/photos.php:1181 ../../mod/photos.php:1220
+#: ../../mod/photos.php:1251 ../../include/conversation.php:406
msgid "This is you"
msgstr ""
-#: ../../mod/photos.php:1134 ../../mod/photos.php:1173
-#: ../../mod/photos.php:1204 ../../include/conversation.php:382
-#: ../../boot.php:386
+#: ../../mod/photos.php:1183 ../../mod/photos.php:1222
+#: ../../mod/photos.php:1253 ../../include/conversation.php:408
+#: ../../boot.php:411
msgid "Comment"
msgstr ""
-#: ../../mod/photos.php:1232 ../../mod/group.php:146
-#: ../../include/conversation.php:179 ../../include/conversation.php:393
+#: ../../mod/photos.php:1281 ../../mod/group.php:154 ../../mod/admin.php:468
+#: ../../include/conversation.php:427
msgid "Delete"
msgstr ""
-#: ../../mod/photos.php:1298
+#: ../../mod/photos.php:1349
msgid "Recent Photos"
msgstr ""
-#: ../../mod/photos.php:1302
+#: ../../mod/photos.php:1353
msgid "Upload New Photos"
msgstr ""
-#: ../../mod/photos.php:1315
+#: ../../mod/photos.php:1366
msgid "View Album"
msgstr ""
+#: ../../mod/community.php:14
+msgid "Not available."
+msgstr ""
+
+#: ../../mod/community.php:26 ../../include/nav.php:79
+msgid "Community"
+msgstr ""
+
+#: ../../mod/community.php:56 ../../mod/search.php:65
+msgid "No results."
+msgstr ""
+
+#: ../../mod/community.php:83 ../../mod/network.php:302
+#: ../../mod/register.php:504 ../../mod/profile.php:241
+#: ../../mod/display.php:117
+msgid ""
+"Shared content is covered by the <a href=\"http://creativecommons.org/"
+"licenses/by/3.0/\">Creative Commons Attribution 3.0</a> license."
+msgstr ""
+
#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
msgid "Item not found"
msgstr ""
@@ -364,62 +495,62 @@ msgstr ""
msgid "Edit post"
msgstr ""
-#: ../../mod/editpost.php:75 ../../include/conversation.php:717
+#: ../../mod/editpost.php:75 ../../include/conversation.php:732
msgid "Post to Email"
msgstr ""
-#: ../../mod/editpost.php:88 ../../include/group.php:169
-#: ../../include/conversation.php:391
+#: ../../mod/editpost.php:90 ../../include/group.php:171
+#: ../../include/group.php:172 ../../include/conversation.php:417
msgid "Edit"
msgstr ""
-#: ../../mod/editpost.php:89 ../../mod/message.php:188
-#: ../../mod/message.php:322 ../../include/conversation.php:732
+#: ../../mod/editpost.php:91 ../../mod/message.php:188
+#: ../../mod/message.php:322 ../../include/conversation.php:747
msgid "Upload photo"
msgstr ""
-#: ../../mod/editpost.php:90 ../../include/conversation.php:733
+#: ../../mod/editpost.php:92 ../../include/conversation.php:748
msgid "Attach file"
msgstr ""
-#: ../../mod/editpost.php:91 ../../mod/message.php:189
-#: ../../mod/message.php:323 ../../include/conversation.php:734
+#: ../../mod/editpost.php:93 ../../mod/message.php:189
+#: ../../mod/message.php:323 ../../include/conversation.php:749
msgid "Insert web link"
msgstr ""
-#: ../../mod/editpost.php:92 ../../include/conversation.php:735
+#: ../../mod/editpost.php:94 ../../include/conversation.php:750
msgid "Insert YouTube video"
msgstr ""
-#: ../../mod/editpost.php:93 ../../include/conversation.php:736
+#: ../../mod/editpost.php:95 ../../include/conversation.php:751
msgid "Insert Vorbis [.ogg] video"
msgstr ""
-#: ../../mod/editpost.php:94 ../../include/conversation.php:737
+#: ../../mod/editpost.php:96 ../../include/conversation.php:752
msgid "Insert Vorbis [.ogg] audio"
msgstr ""
-#: ../../mod/editpost.php:95 ../../include/conversation.php:738
+#: ../../mod/editpost.php:97 ../../include/conversation.php:753
msgid "Set your location"
msgstr ""
-#: ../../mod/editpost.php:96 ../../include/conversation.php:739
+#: ../../mod/editpost.php:98 ../../include/conversation.php:754
msgid "Clear browser location"
msgstr ""
-#: ../../mod/editpost.php:98 ../../include/conversation.php:742
+#: ../../mod/editpost.php:100 ../../include/conversation.php:757
msgid "Permission settings"
msgstr ""
-#: ../../mod/editpost.php:106 ../../include/conversation.php:750
+#: ../../mod/editpost.php:108 ../../include/conversation.php:765
msgid "CC: email addresses"
msgstr ""
-#: ../../mod/editpost.php:107 ../../include/conversation.php:751
+#: ../../mod/editpost.php:109 ../../include/conversation.php:766
msgid "Public post"
msgstr ""
-#: ../../mod/editpost.php:109 ../../include/conversation.php:753
+#: ../../mod/editpost.php:111 ../../include/conversation.php:768
msgid "Example: bob@example.com, mary@example.com"
msgstr ""
@@ -496,7 +627,7 @@ msgstr ""
msgid "Disallowed profile URL."
msgstr ""
-#: ../../mod/dfrn_request.php:406 ../../mod/contacts.php:90
+#: ../../mod/dfrn_request.php:406 ../../mod/contacts.php:116
msgid "Failed to update contact record."
msgstr ""
@@ -528,7 +659,7 @@ msgstr ""
msgid "Confirm"
msgstr ""
-#: ../../mod/dfrn_request.php:542 ../../include/items.php:1440
+#: ../../mod/dfrn_request.php:542 ../../include/items.php:1519
msgid "[Name Withheld]"
msgstr ""
@@ -536,11 +667,11 @@ msgstr ""
msgid "Introduction received at "
msgstr ""
-#: ../../mod/dfrn_request.php:551 ../../mod/lostpass.php:40
-#: ../../mod/lostpass.php:102 ../../mod/register.php:335
-#: ../../mod/register.php:385 ../../mod/regmod.php:98
-#: ../../mod/dfrn_notify.php:191 ../../mod/dfrn_notify.php:443
-#: ../../mod/dfrn_confirm.php:658 ../../include/items.php:1449
+#: ../../mod/dfrn_request.php:551 ../../mod/lostpass.php:44
+#: ../../mod/lostpass.php:106 ../../mod/register.php:369
+#: ../../mod/register.php:423 ../../mod/regmod.php:54
+#: ../../mod/dfrn_notify.php:291 ../../mod/dfrn_notify.php:547
+#: ../../mod/dfrn_confirm.php:674 ../../include/items.php:1528
msgid "Administrator"
msgstr ""
@@ -559,18 +690,21 @@ msgid "Please answer the following:"
msgstr ""
#: ../../mod/dfrn_request.php:633
-msgid "Does $name know you?"
+#, php-format
+msgid "Does %s know you?"
msgstr ""
-#: ../../mod/dfrn_request.php:634 ../../mod/settings.php:350
-#: ../../mod/settings.php:362 ../../mod/register.php:459
-#: ../../mod/profiles.php:358 ../../mod/profiles.php:367
+#: ../../mod/dfrn_request.php:634 ../../mod/settings.php:415
+#: ../../mod/settings.php:421 ../../mod/settings.php:429
+#: ../../mod/settings.php:433 ../../mod/register.php:498
+#: ../../mod/profiles.php:354
msgid "Yes"
msgstr ""
-#: ../../mod/dfrn_request.php:635 ../../mod/settings.php:351
-#: ../../mod/settings.php:363 ../../mod/register.php:460
-#: ../../mod/profiles.php:359 ../../mod/profiles.php:368
+#: ../../mod/dfrn_request.php:635 ../../mod/settings.php:415
+#: ../../mod/settings.php:421 ../../mod/settings.php:429
+#: ../../mod/settings.php:433 ../../mod/register.php:499
+#: ../../mod/profiles.php:355
msgid "No"
msgstr ""
@@ -608,188 +742,208 @@ msgstr ""
msgid "Submit Request"
msgstr ""
-#: ../../mod/install.php:33
+#: ../../mod/install.php:34
msgid "Could not create/connect to database."
msgstr ""
-#: ../../mod/install.php:38
+#: ../../mod/install.php:39
msgid "Connected to database."
msgstr ""
-#: ../../mod/install.php:72
+#: ../../mod/install.php:75
msgid "Proceed with Installation"
msgstr ""
-#: ../../mod/install.php:74
+#: ../../mod/install.php:77
msgid "Your Friendika site database has been installed."
msgstr ""
-#: ../../mod/install.php:75
+#: ../../mod/install.php:78
msgid ""
"IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
msgstr ""
-#: ../../mod/install.php:76 ../../mod/install.php:86 ../../mod/install.php:199
+#: ../../mod/install.php:79 ../../mod/install.php:89 ../../mod/install.php:207
msgid "Please see the file \"INSTALL.txt\"."
msgstr ""
-#: ../../mod/install.php:78
+#: ../../mod/install.php:81
msgid "Proceed to registration"
msgstr ""
-#: ../../mod/install.php:84
+#: ../../mod/install.php:87
msgid "Database import failed."
msgstr ""
-#: ../../mod/install.php:85
+#: ../../mod/install.php:88
msgid ""
"You may need to import the file \"database.sql\" manually using phpmyadmin "
"or mysql."
msgstr ""
-#: ../../mod/install.php:98
+#: ../../mod/install.php:101
msgid "Welcome to Friendika."
msgstr ""
-#: ../../mod/install.php:121
+#: ../../mod/install.php:124
msgid "Friendika Social Network"
msgstr ""
-#: ../../mod/install.php:122
+#: ../../mod/install.php:125
msgid "Installation"
msgstr ""
-#: ../../mod/install.php:123
+#: ../../mod/install.php:126
msgid ""
-"In order to install Friendika we need to know how to contact your database."
+"In order to install Friendika we need to know how to connect to your "
+"database."
msgstr ""
-#: ../../mod/install.php:124
+#: ../../mod/install.php:127
msgid ""
"Please contact your hosting provider or site administrator if you have "
"questions about these settings."
msgstr ""
-#: ../../mod/install.php:125
+#: ../../mod/install.php:128
msgid ""
-"The database you specify below must already exist. If it does not, please "
+"The database you specify below should already exist. If it does not, please "
"create it before continuing."
msgstr ""
-#: ../../mod/install.php:126
+#: ../../mod/install.php:129
msgid "Database Server Name"
msgstr ""
-#: ../../mod/install.php:127
+#: ../../mod/install.php:130
msgid "Database Login Name"
msgstr ""
-#: ../../mod/install.php:128
+#: ../../mod/install.php:131
msgid "Database Login Password"
msgstr ""
-#: ../../mod/install.php:129
+#: ../../mod/install.php:132
msgid "Database Name"
msgstr ""
-#: ../../mod/install.php:130
+#: ../../mod/install.php:133
msgid "Please select a default timezone for your website"
msgstr ""
-#: ../../mod/install.php:148
+#: ../../mod/install.php:134
+msgid ""
+"Site administrator email address. Your account email address must match this "
+"in order to use the web admin panel."
+msgstr ""
+
+#: ../../mod/install.php:153
msgid "Could not find a command line version of PHP in the web server PATH."
msgstr ""
-#: ../../mod/install.php:149
+#: ../../mod/install.php:154
msgid ""
"This is required. Please adjust the configuration file .htconfig.php "
"accordingly."
msgstr ""
-#: ../../mod/install.php:156
+#: ../../mod/install.php:161
msgid ""
"The command line version of PHP on your system does not have "
"\"register_argc_argv\" enabled."
msgstr ""
-#: ../../mod/install.php:157
+#: ../../mod/install.php:162
msgid "This is required for message delivery to work."
msgstr ""
-#: ../../mod/install.php:179
+#: ../../mod/install.php:184
msgid ""
"Error: the \"openssl_pkey_new\" function on this system is not able to "
"generate encryption keys"
msgstr ""
-#: ../../mod/install.php:180
+#: ../../mod/install.php:185
msgid ""
"If running under Windows, please see \"http://www.php.net/manual/en/openssl."
"installation.php\"."
msgstr ""
-#: ../../mod/install.php:189
+#: ../../mod/install.php:194
msgid ""
"Error: Apache webserver mod-rewrite module is required but not installed."
msgstr ""
-#: ../../mod/install.php:191
+#: ../../mod/install.php:196
msgid "Error: libCURL PHP module required but not installed."
msgstr ""
-#: ../../mod/install.php:193
+#: ../../mod/install.php:198
msgid ""
"Error: GD graphics PHP module with JPEG support required but not installed."
msgstr ""
-#: ../../mod/install.php:195
+#: ../../mod/install.php:200
msgid "Error: openssl PHP module required but not installed."
msgstr ""
-#: ../../mod/install.php:197
+#: ../../mod/install.php:202
msgid "Error: mysqli PHP module required but not installed."
msgstr ""
-#: ../../mod/install.php:208
+#: ../../mod/install.php:204
+msgid "Error: mb_string PHP module required but not installed."
+msgstr ""
+
+#: ../../mod/install.php:216
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:209
+#: ../../mod/install.php:217
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:210
+#: ../../mod/install.php:218
msgid ""
"Please check with your site documentation or support people to see if this "
"situation can be corrected."
msgstr ""
-#: ../../mod/install.php:211
+#: ../../mod/install.php:219
msgid ""
"If not, you may be required to perform a manual installation. Please see the "
"file \"INSTALL.txt\" for instructions."
msgstr ""
-#: ../../mod/install.php:220
+#: ../../mod/install.php:228
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:235
+#: ../../mod/install.php:243
msgid "Errors encountered creating database tables."
msgstr ""
+#: ../../mod/update_community.php:18 ../../mod/update_network.php:22
+#: ../../mod/update_profile.php:41
+msgid "[Embedded content - reload page to view]"
+msgstr ""
+
#: ../../mod/match.php:10
msgid "Profile Match"
msgstr ""
-#: ../../mod/match.php:50
+#: ../../mod/match.php:18
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr ""
+
+#: ../../mod/match.php:54
msgid "No matches"
msgstr ""
@@ -806,628 +960,669 @@ msgstr ""
msgid "Welcome to %s"
msgstr ""
-#: ../../mod/notifications.php:28
+#: ../../mod/notifications.php:26
msgid "Invalid request identifier."
msgstr ""
-#: ../../mod/notifications.php:31 ../../mod/notifications.php:133
+#: ../../mod/notifications.php:35 ../../mod/notifications.php:118
+#: ../../mod/notifications.php:162
msgid "Discard"
msgstr ""
-#: ../../mod/notifications.php:41 ../../mod/notifications.php:132
+#: ../../mod/notifications.php:47 ../../mod/notifications.php:117
+#: ../../mod/notifications.php:161
msgid "Ignore"
msgstr ""
-#: ../../mod/notifications.php:68
+#: ../../mod/notifications.php:74
msgid "Pending Friend/Connect Notifications"
msgstr ""
-#: ../../mod/notifications.php:72
+#: ../../mod/notifications.php:78
msgid "Show Ignored Requests"
msgstr ""
-#: ../../mod/notifications.php:72
+#: ../../mod/notifications.php:78
msgid "Hide Ignored Requests"
msgstr ""
-#: ../../mod/notifications.php:104
+#: ../../mod/notifications.php:105 ../../mod/notifications.php:148
+msgid "Notification type: "
+msgstr ""
+
+#: ../../mod/notifications.php:106
+msgid "Friend Suggestion"
+msgstr ""
+
+#: ../../mod/notifications.php:108
+#, php-format
+msgid "suggested by %s"
+msgstr ""
+
+#: ../../mod/notifications.php:114 ../../mod/notifications.php:159
+#: ../../mod/admin.php:466
+msgid "Approve"
+msgstr ""
+
+#: ../../mod/notifications.php:133
msgid "Claims to be known to you: "
msgstr ""
-#: ../../mod/notifications.php:104
+#: ../../mod/notifications.php:133
msgid "yes"
msgstr ""
-#: ../../mod/notifications.php:104
+#: ../../mod/notifications.php:133
msgid "no"
msgstr ""
-#: ../../mod/notifications.php:110
+#: ../../mod/notifications.php:139
msgid "Approve as: "
msgstr ""
-#: ../../mod/notifications.php:111
+#: ../../mod/notifications.php:140
msgid "Friend"
msgstr ""
-#: ../../mod/notifications.php:112
+#: ../../mod/notifications.php:141
msgid "Fan/Admirer"
msgstr ""
-#: ../../mod/notifications.php:119
-msgid "Notification type: "
-msgstr ""
-
-#: ../../mod/notifications.php:120
+#: ../../mod/notifications.php:149
msgid "Friend/Connect Request"
msgstr ""
-#: ../../mod/notifications.php:120
+#: ../../mod/notifications.php:149
msgid "New Follower"
msgstr ""
-#: ../../mod/notifications.php:130 ../../mod/notifications.php:153
-msgid "Approve"
-msgstr ""
-
-#: ../../mod/notifications.php:139
+#: ../../mod/notifications.php:168
msgid "No notifications."
msgstr ""
-#: ../../mod/notifications.php:143
-msgid "User registrations waiting for confirm"
-msgstr ""
-
-#: ../../mod/notifications.php:154
-msgid "Deny"
-msgstr ""
-
-#: ../../mod/notifications.php:159
-msgid "No registrations."
-msgstr ""
-
-#: ../../mod/contacts.php:12
+#: ../../mod/contacts.php:26
msgid "Invite Friends"
msgstr ""
-#: ../../mod/contacts.php:15
+#: ../../mod/contacts.php:32
+#, php-format
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../mod/contacts.php:41
msgid "Find People With Shared Interests"
msgstr ""
-#: ../../mod/contacts.php:19
+#: ../../mod/contacts.php:45
msgid "Connect/Follow"
msgstr ""
-#: ../../mod/contacts.php:20
+#: ../../mod/contacts.php:46
msgid "Example: bob@example.com, http://example.com/barbara"
msgstr ""
-#: ../../mod/contacts.php:21
+#: ../../mod/contacts.php:47
msgid "Follow"
msgstr ""
-#: ../../mod/contacts.php:43 ../../mod/contacts.php:124
+#: ../../mod/contacts.php:69 ../../mod/contacts.php:150
msgid "Could not access contact record."
msgstr ""
-#: ../../mod/contacts.php:57
+#: ../../mod/contacts.php:83
msgid "Could not locate selected profile."
msgstr ""
-#: ../../mod/contacts.php:88
+#: ../../mod/contacts.php:114
msgid "Contact updated."
msgstr ""
-#: ../../mod/contacts.php:146
+#: ../../mod/contacts.php:172
msgid "Contact has been blocked"
msgstr ""
-#: ../../mod/contacts.php:146
+#: ../../mod/contacts.php:172
msgid "Contact has been unblocked"
msgstr ""
-#: ../../mod/contacts.php:160
+#: ../../mod/contacts.php:186
msgid "Contact has been ignored"
msgstr ""
-#: ../../mod/contacts.php:160
+#: ../../mod/contacts.php:186
msgid "Contact has been unignored"
msgstr ""
-#: ../../mod/contacts.php:181
+#: ../../mod/contacts.php:207
msgid "stopped following"
msgstr ""
-#: ../../mod/contacts.php:200
+#: ../../mod/contacts.php:226
msgid "Contact has been removed."
msgstr ""
-#: ../../mod/contacts.php:228 ../../mod/contacts.php:363
+#: ../../mod/contacts.php:254 ../../mod/contacts.php:397
msgid "Mutual Friendship"
msgstr ""
-#: ../../mod/contacts.php:232 ../../mod/contacts.php:367
+#: ../../mod/contacts.php:258 ../../mod/contacts.php:401
msgid "is a fan of yours"
msgstr ""
-#: ../../mod/contacts.php:237 ../../mod/contacts.php:371
+#: ../../mod/contacts.php:263 ../../mod/contacts.php:405
msgid "you are a fan of"
msgstr ""
-#: ../../mod/contacts.php:252
+#: ../../mod/contacts.php:280
msgid "Privacy Unavailable"
msgstr ""
-#: ../../mod/contacts.php:253
+#: ../../mod/contacts.php:281
msgid "Private communications are not available for this contact."
msgstr ""
-#: ../../mod/contacts.php:256
+#: ../../mod/contacts.php:284
msgid "Never"
msgstr ""
-#: ../../mod/contacts.php:260
+#: ../../mod/contacts.php:288
msgid "(Update was successful)"
msgstr ""
-#: ../../mod/contacts.php:260
+#: ../../mod/contacts.php:288
msgid "(Update was not successful)"
msgstr ""
-#: ../../mod/contacts.php:263
+#: ../../mod/contacts.php:291
+msgid "Suggest friends"
+msgstr ""
+
+#: ../../mod/contacts.php:295
msgid "Contact Editor"
msgstr ""
-#: ../../mod/contacts.php:265
+#: ../../mod/contacts.php:297
msgid "Profile Visibility"
msgstr ""
-#: ../../mod/contacts.php:266
+#: ../../mod/contacts.php:298
#, php-format
msgid ""
"Please choose the profile you would like to display to %s when viewing your "
"profile securely."
msgstr ""
-#: ../../mod/contacts.php:267
+#: ../../mod/contacts.php:299
msgid "Contact Information / Notes"
msgstr ""
-#: ../../mod/contacts.php:268
+#: ../../mod/contacts.php:300
msgid "Online Reputation"
msgstr ""
-#: ../../mod/contacts.php:269
+#: ../../mod/contacts.php:301
msgid ""
"Occasionally your friends may wish to inquire about this person's online "
"legitimacy."
msgstr ""
-#: ../../mod/contacts.php:270
+#: ../../mod/contacts.php:302
msgid ""
"You may help them choose whether or not to interact with this person by "
"providing a <em>reputation</em> to guide them."
msgstr ""
-#: ../../mod/contacts.php:271
+#: ../../mod/contacts.php:303
msgid ""
"Please take a moment to elaborate on this selection if you feel it could be "
"helpful to others."
msgstr ""
-#: ../../mod/contacts.php:272
-msgid "Visit $name's profile"
+#: ../../mod/contacts.php:304 ../../mod/contacts.php:421
+#: ../../mod/viewcontacts.php:61
+#, php-format
+msgid "Visit %s's profile [%s]"
msgstr ""
-#: ../../mod/contacts.php:273
+#: ../../mod/contacts.php:305
msgid "Block/Unblock contact"
msgstr ""
-#: ../../mod/contacts.php:274
+#: ../../mod/contacts.php:306
msgid "Ignore contact"
msgstr ""
-#: ../../mod/contacts.php:275
+#: ../../mod/contacts.php:307
msgid "Repair contact URL settings"
msgstr ""
-#: ../../mod/contacts.php:276
+#: ../../mod/contacts.php:308
msgid "Repair contact URL settings (WARNING: Advanced)"
msgstr ""
-#: ../../mod/contacts.php:277
+#: ../../mod/contacts.php:309
msgid "View conversations"
msgstr ""
-#: ../../mod/contacts.php:278
+#: ../../mod/contacts.php:312
msgid "Delete contact"
msgstr ""
-#: ../../mod/contacts.php:280
+#: ../../mod/contacts.php:314
msgid "Last updated: "
msgstr ""
-#: ../../mod/contacts.php:281
+#: ../../mod/contacts.php:315
msgid "Update public posts: "
msgstr ""
-#: ../../mod/contacts.php:283
+#: ../../mod/contacts.php:317 ../../mod/admin.php:701
msgid "Update now"
msgstr ""
-#: ../../mod/contacts.php:286
+#: ../../mod/contacts.php:320
msgid "Unblock this contact"
msgstr ""
-#: ../../mod/contacts.php:286
+#: ../../mod/contacts.php:320
msgid "Block this contact"
msgstr ""
-#: ../../mod/contacts.php:287
+#: ../../mod/contacts.php:321
msgid "Unignore this contact"
msgstr ""
-#: ../../mod/contacts.php:287
+#: ../../mod/contacts.php:321
msgid "Ignore this contact"
msgstr ""
-#: ../../mod/contacts.php:290
+#: ../../mod/contacts.php:324
msgid "Currently blocked"
msgstr ""
-#: ../../mod/contacts.php:291
+#: ../../mod/contacts.php:325
msgid "Currently ignored"
msgstr ""
-#: ../../mod/contacts.php:322 ../../include/nav.php:109
-#: ../../include/acl_selectors.php:141 ../../include/acl_selectors.php:156
+#: ../../mod/contacts.php:356 ../../include/nav.php:110
msgid "Contacts"
msgstr ""
-#: ../../mod/contacts.php:324
+#: ../../mod/contacts.php:358
msgid "Show Blocked Connections"
msgstr ""
-#: ../../mod/contacts.php:324
+#: ../../mod/contacts.php:358
msgid "Hide Blocked Connections"
msgstr ""
-#: ../../mod/contacts.php:326 ../../mod/directory.php:55
+#: ../../mod/contacts.php:360 ../../mod/directory.php:55
msgid "Finding: "
msgstr ""
-#: ../../mod/contacts.php:327 ../../mod/directory.php:57
+#: ../../mod/contacts.php:361 ../../mod/directory.php:57
msgid "Find"
msgstr ""
-#: ../../mod/contacts.php:387 ../../mod/viewcontacts.php:52
-msgid "Visit $username's profile"
+#: ../../mod/contacts.php:422 ../../include/conversation.php:612
+msgid "Edit contact"
msgstr ""
-#: ../../mod/contacts.php:388 ../../include/conversation.php:597
-msgid "Edit contact"
+#: ../../mod/lostpass.php:16
+msgid "No valid account found."
msgstr ""
-#: ../../mod/lostpass.php:27
+#: ../../mod/lostpass.php:31
msgid "Password reset request issued. Check your email."
msgstr ""
-#: ../../mod/lostpass.php:38
+#: ../../mod/lostpass.php:42
#, php-format
msgid "Password reset requested at %s"
msgstr ""
-#: ../../mod/lostpass.php:60
+#: ../../mod/lostpass.php:64
msgid ""
"Request could not be verified. (You may have previously submitted it.) "
"Password reset failed."
msgstr ""
-#: ../../mod/lostpass.php:78 ../../boot.php:852
+#: ../../mod/lostpass.php:82 ../../boot.php:654
msgid "Password Reset"
msgstr ""
-#: ../../mod/lostpass.php:79
+#: ../../mod/lostpass.php:83
msgid "Your password has been reset as requested."
msgstr ""
-#: ../../mod/lostpass.php:80
+#: ../../mod/lostpass.php:84
msgid "Your new password is"
msgstr ""
-#: ../../mod/lostpass.php:81
+#: ../../mod/lostpass.php:85
msgid "Save or copy your new password - and then"
msgstr ""
-#: ../../mod/lostpass.php:82
+#: ../../mod/lostpass.php:86
msgid "click here to login"
msgstr ""
-#: ../../mod/lostpass.php:83
+#: ../../mod/lostpass.php:87
msgid ""
"Your password may be changed from the <em>Settings</em> page after "
"successful login."
msgstr ""
-#: ../../mod/lostpass.php:114
+#: ../../mod/lostpass.php:118
msgid "Forgot your Password?"
msgstr ""
-#: ../../mod/lostpass.php:115
+#: ../../mod/lostpass.php:119
msgid ""
"Enter your email address and submit to have your password reset. Then check "
"your email for further instructions."
msgstr ""
-#: ../../mod/lostpass.php:116
+#: ../../mod/lostpass.php:120
msgid "Nickname or Email: "
msgstr ""
-#: ../../mod/lostpass.php:117
+#: ../../mod/lostpass.php:121
msgid "Reset"
msgstr ""
-#: ../../mod/settings.php:38
+#: ../../mod/settings.php:64
msgid "Passwords do not match. Password unchanged."
msgstr ""
-#: ../../mod/settings.php:43
+#: ../../mod/settings.php:69
msgid "Empty passwords are not allowed. Password unchanged."
msgstr ""
-#: ../../mod/settings.php:54
+#: ../../mod/settings.php:80
msgid "Password changed."
msgstr ""
-#: ../../mod/settings.php:56
+#: ../../mod/settings.php:82
msgid "Password update failed. Please try again."
msgstr ""
-#: ../../mod/settings.php:138
+#: ../../mod/settings.php:161
+msgid "Failed to connect with email account using the settings provided."
+msgstr ""
+
+#: ../../mod/settings.php:188
msgid " Please use a shorter name."
msgstr ""
-#: ../../mod/settings.php:140
+#: ../../mod/settings.php:190
msgid " Name too short."
msgstr ""
-#: ../../mod/settings.php:146
+#: ../../mod/settings.php:196
msgid " Not valid email."
msgstr ""
-#: ../../mod/settings.php:148
+#: ../../mod/settings.php:198
msgid " Cannot change to that email."
msgstr ""
-#: ../../mod/settings.php:206
+#: ../../mod/settings.php:257 ../../addon/facebook/facebook.php:297
+#: ../../addon/impressum/impressum.php:64 ../../addon/piwik/piwik.php:89
+#: ../../addon/twitter/twitter.php:275
msgid "Settings updated."
msgstr ""
-#: ../../mod/settings.php:256 ../../mod/settings.php:418
-#: ../../addon/widgets/widgets.php:123
-msgid "Plugin Settings"
+#: ../../mod/settings.php:311 ../../include/nav.php:108
+msgid "Account settings"
msgstr ""
-#: ../../mod/settings.php:257 ../../mod/settings.php:417
-msgid "Account Settings"
+#: ../../mod/settings.php:312
+msgid "Plugin settings"
msgstr ""
-#: ../../mod/settings.php:263
+#: ../../mod/settings.php:322
msgid "No Plugin settings configured"
msgstr ""
-#: ../../mod/settings.php:323
+#: ../../mod/settings.php:329 ../../addon/widgets/widgets.php:122
+msgid "Plugin Settings"
+msgstr ""
+
+#: ../../mod/settings.php:382 ../../mod/admin.php:133 ../../mod/admin.php:443
msgid "Normal Account"
msgstr ""
-#: ../../mod/settings.php:324
+#: ../../mod/settings.php:383
msgid "This account is a normal personal profile"
msgstr ""
-#: ../../mod/settings.php:325
+#: ../../mod/settings.php:386 ../../mod/admin.php:134 ../../mod/admin.php:444
msgid "Soapbox Account"
msgstr ""
-#: ../../mod/settings.php:326
+#: ../../mod/settings.php:387
msgid "Automatically approve all connection/friend requests as read-only fans"
msgstr ""
-#: ../../mod/settings.php:327
+#: ../../mod/settings.php:390 ../../mod/admin.php:135 ../../mod/admin.php:445
msgid "Community/Celebrity Account"
msgstr ""
-#: ../../mod/settings.php:328
+#: ../../mod/settings.php:391
msgid "Automatically approve all connection/friend requests as read-write fans"
msgstr ""
-#: ../../mod/settings.php:329
+#: ../../mod/settings.php:394 ../../mod/admin.php:136 ../../mod/admin.php:446
msgid "Automatic Friend Account"
msgstr ""
-#: ../../mod/settings.php:330
+#: ../../mod/settings.php:395
msgid "Automatically approve all connection/friend requests as friends"
msgstr ""
-#: ../../mod/settings.php:339
-msgid "OpenID: "
+#: ../../mod/settings.php:405
+msgid "OpenID:"
+msgstr ""
+
+#: ../../mod/settings.php:405
+msgid "(Optional) Allow this OpenID to login to this account."
msgstr ""
-#: ../../mod/settings.php:339
-msgid "&nbsp;(Optional) Allow this OpenID to login to this account."
+#: ../../mod/settings.php:415
+msgid "Publish your default profile in your local site directory?"
+msgstr ""
+
+#: ../../mod/settings.php:421
+msgid "Publish your default profile in the global social directory?"
msgstr ""
-#: ../../mod/settings.php:349
-msgid "Publish your default profile in site directory?"
+#: ../../mod/settings.php:429
+msgid "Hide your contact/friend list from viewers of your default profile?"
msgstr ""
-#: ../../mod/settings.php:361
-msgid "Publish your default profile in global social directory?"
+#: ../../mod/settings.php:433
+msgid "Hide profile details and all your messages from unknown viewers?"
msgstr ""
-#: ../../mod/settings.php:377
+#: ../../mod/settings.php:442
msgid "Profile is <strong>not published</strong>."
msgstr ""
-#: ../../mod/settings.php:398 ../../mod/profile_photo.php:196
+#: ../../mod/settings.php:461 ../../mod/profile_photo.php:196
msgid "or"
msgstr ""
-#: ../../mod/settings.php:403
+#: ../../mod/settings.php:466
msgid "Your Identity Address is"
msgstr ""
-#: ../../mod/settings.php:413
+#: ../../mod/settings.php:480
+msgid "Account Settings"
+msgstr ""
+
+#: ../../mod/settings.php:487
msgid "Export Personal Data"
msgstr ""
-#: ../../mod/settings.php:419
+#: ../../mod/settings.php:490
+msgid "Password Settings"
+msgstr ""
+
+#: ../../mod/settings.php:491
+msgid "New Password:"
+msgstr ""
+
+#: ../../mod/settings.php:492
+msgid "Confirm:"
+msgstr ""
+
+#: ../../mod/settings.php:492
+msgid "Leave password fields blank unless changing"
+msgstr ""
+
+#: ../../mod/settings.php:496
msgid "Basic Settings"
msgstr ""
-#: ../../mod/settings.php:420 ../../include/profile_advanced.php:10
+#: ../../mod/settings.php:497 ../../include/profile_advanced.php:10
msgid "Full Name:"
msgstr ""
-#: ../../mod/settings.php:421
+#: ../../mod/settings.php:498
msgid "Email Address:"
msgstr ""
-#: ../../mod/settings.php:422
+#: ../../mod/settings.php:499
msgid "Your Timezone:"
msgstr ""
-#: ../../mod/settings.php:423
+#: ../../mod/settings.php:500
msgid "Default Post Location:"
msgstr ""
-#: ../../mod/settings.php:424
+#: ../../mod/settings.php:501
msgid "Use Browser Location:"
msgstr ""
-#: ../../mod/settings.php:425
+#: ../../mod/settings.php:502
msgid "Display Theme:"
msgstr ""
-#: ../../mod/settings.php:427
+#: ../../mod/settings.php:506
msgid "Security and Privacy Settings"
msgstr ""
-#: ../../mod/settings.php:428
+#: ../../mod/settings.php:508
msgid "Maximum Friend Requests/Day:"
msgstr ""
-#: ../../mod/settings.php:429
+#: ../../mod/settings.php:508
msgid "(to prevent spam abuse)"
msgstr ""
-#: ../../mod/settings.php:430
+#: ../../mod/settings.php:509
+msgid "Default Post Permissions"
+msgstr ""
+
+#: ../../mod/settings.php:510
+msgid "(click to open/close)"
+msgstr ""
+
+#: ../../mod/settings.php:514
msgid "Allow friends to post to your profile page:"
msgstr ""
-#: ../../mod/settings.php:431
-msgid "Automatically expire (delete) posts older than"
+#: ../../mod/settings.php:515
+msgid "Automatically expire posts after days:"
msgstr ""
-#: ../../mod/settings.php:432 ../../include/datetime.php:154
-msgid "days"
+#: ../../mod/settings.php:515
+msgid "If empty, posts will not expire. Expired posts will be deleted"
msgstr ""
-#: ../../mod/settings.php:433
+#: ../../mod/settings.php:524
msgid "Notification Settings"
msgstr ""
-#: ../../mod/settings.php:434
+#: ../../mod/settings.php:525
msgid "Send a notification email when:"
msgstr ""
-#: ../../mod/settings.php:435
+#: ../../mod/settings.php:526
msgid "You receive an introduction"
msgstr ""
-#: ../../mod/settings.php:436
+#: ../../mod/settings.php:527
msgid "Your introductions are confirmed"
msgstr ""
-#: ../../mod/settings.php:437
+#: ../../mod/settings.php:528
msgid "Someone writes on your profile wall"
msgstr ""
-#: ../../mod/settings.php:438
+#: ../../mod/settings.php:529
msgid "Someone writes a followup comment"
msgstr ""
-#: ../../mod/settings.php:439
+#: ../../mod/settings.php:530
msgid "You receive a private message"
msgstr ""
-#: ../../mod/settings.php:440
-msgid "Password Settings"
-msgstr ""
-
-#: ../../mod/settings.php:441
-msgid "Leave password fields blank unless changing"
-msgstr ""
-
-#: ../../mod/settings.php:442
-msgid "New Password:"
-msgstr ""
-
-#: ../../mod/settings.php:443
-msgid "Confirm:"
-msgstr ""
-
-#: ../../mod/settings.php:444
-msgid "Advanced Page Settings"
-msgstr ""
-
-#: ../../mod/settings.php:459
-msgid "Default Post Permissions"
-msgstr ""
-
-#: ../../mod/settings.php:460
-msgid "(click to open/close)"
-msgstr ""
-
-#: ../../mod/settings.php:473
+#: ../../mod/settings.php:534
msgid "Email/Mailbox Setup"
msgstr ""
-#: ../../mod/settings.php:474
+#: ../../mod/settings.php:535
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:475
+#: ../../mod/settings.php:536
+msgid "Last successful email check:"
+msgstr ""
+
+#: ../../mod/settings.php:537
+msgid "Email access is disabled on this site."
+msgstr ""
+
+#: ../../mod/settings.php:538
msgid "IMAP server name:"
msgstr ""
-#: ../../mod/settings.php:477
+#: ../../mod/settings.php:539
msgid "IMAP port:"
msgstr ""
-#: ../../mod/settings.php:479
-msgid "Security (TLS or SSL):"
+#: ../../mod/settings.php:540
+msgid "Security:"
+msgstr ""
+
+#: ../../mod/settings.php:540
+msgid "None"
msgstr ""
-#: ../../mod/settings.php:481
+#: ../../mod/settings.php:541
msgid "Email login name:"
msgstr ""
-#: ../../mod/settings.php:483
+#: ../../mod/settings.php:542
msgid "Email password:"
msgstr ""
-#: ../../mod/settings.php:484
-msgid "Reply-to address (Optional):"
+#: ../../mod/settings.php:543
+msgid "Reply-to address:"
msgstr ""
-#: ../../mod/settings.php:486
+#: ../../mod/settings.php:544
msgid "Send public posts to all email contacts:"
msgstr ""
-#: ../../mod/settings.php:488
-msgid "Email access is disabled on this site."
+#: ../../mod/settings.php:549
+msgid "Advanced Page Settings"
msgstr ""
#: ../../mod/manage.php:37
@@ -1449,15 +1644,23 @@ msgstr ""
msgid "Select an identity to manage: "
msgstr ""
-#: ../../mod/network.php:18
-msgid "Normal View"
+#: ../../mod/network.php:27
+msgid "View Conversations"
+msgstr ""
+
+#: ../../mod/network.php:29
+msgid "View New Items"
+msgstr ""
+
+#: ../../mod/network.php:35
+msgid "View Any Items"
msgstr ""
-#: ../../mod/network.php:20
-msgid "New Item View"
+#: ../../mod/network.php:43
+msgid "View Starred Items"
msgstr ""
-#: ../../mod/network.php:64
+#: ../../mod/network.php:94
#, php-format
msgid "Warning: This group contains %s member from an insecure network."
msgid_plural ""
@@ -1465,54 +1668,131 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: ../../mod/network.php:67
+#: ../../mod/network.php:97
msgid "Private messages to this group are at risk of public disclosure."
msgstr ""
-#: ../../mod/network.php:129
+#: ../../mod/network.php:164
msgid "No such group"
msgstr ""
-#: ../../mod/network.php:140
+#: ../../mod/network.php:175
msgid "Group is empty"
msgstr ""
-#: ../../mod/network.php:144
+#: ../../mod/network.php:180
msgid "Group: "
msgstr ""
-#: ../../mod/network.php:154
+#: ../../mod/network.php:190
msgid "Contact: "
msgstr ""
-#: ../../mod/network.php:156
+#: ../../mod/network.php:192
msgid "Private messages to this person are at risk of public disclosure."
msgstr ""
-#: ../../mod/network.php:161
+#: ../../mod/network.php:197
msgid "Invalid contact."
msgstr ""
-#: ../../mod/network.php:262 ../../mod/register.php:465
-#: ../../mod/profile.php:265 ../../mod/display.php:147
+#: ../../mod/notes.php:74
+msgid "Save"
+msgstr ""
+
+#: ../../mod/newmember.php:6
+msgid "Welcome to Friendika"
+msgstr ""
+
+#: ../../mod/newmember.php:8
+msgid "New Member Checklist"
+msgstr ""
+
+#: ../../mod/newmember.php:12
msgid ""
-"Shared content is covered by the <a href=\"http://creativecommons.org/"
-"licenses/by/3.0/\">Creative Commons Attribution 3.0</a> license."
+"We would like to offer some tips and links to help make your experience "
+"enjoyable. Click any item to visit the relevant page."
msgstr ""
-#: ../../mod/notes.php:41 ../../mod/apps.php:8
-msgid "Private Notes"
+#: ../../mod/newmember.php:16
+msgid ""
+"On your <em>Settings</em> page - change your initial password. Also make a "
+"note of your Identity Address. This will be useful in making friends."
msgstr ""
-#: ../../mod/notes.php:60
-msgid "Save"
+#: ../../mod/newmember.php:18
+msgid ""
+"Review the other settings, particularly the privacy settings. An unpublished "
+"directory listing is like having an unlisted phone number. In general, you "
+"should probably publish your listing - unless all of your friends and "
+"potential friends know exactly how to find you."
+msgstr ""
+
+#: ../../mod/newmember.php:20
+msgid ""
+"Upload a profile photo if you have not done so already. Studies have shown "
+"that people with real photos of themselves are ten times more likely to make "
+"friends than people who do not."
+msgstr ""
+
+#: ../../mod/newmember.php:23
+msgid ""
+"Authorise the Facebook Connector if you currently have a Facebook account "
+"and we will (optionally) import all your Facebook friends and conversations."
msgstr ""
-#: ../../mod/attach.php:6
+#: ../../mod/newmember.php:28
+msgid ""
+"Enter your email access information on your Settings page if you wish to "
+"import and interact with friends or mailing lists from your email INBOX"
+msgstr ""
+
+#: ../../mod/newmember.php:30
+msgid ""
+"Edit your <strong>default</strong> profile to your liking. Review the "
+"settings for hiding your list of friends and hiding the profile from unknown "
+"visitors."
+msgstr ""
+
+#: ../../mod/newmember.php:32
+msgid ""
+"Set some public keywords for your default profile which describe your "
+"interests. We may be able to find other people with similar interests and "
+"suggest friendships."
+msgstr ""
+
+#: ../../mod/newmember.php:34
+msgid ""
+"Your Contacts page is your gateway to managing friendships and connecting "
+"with friends on other networks. Typically you enter their address or site "
+"URL in the <em>Connect</em> dialog."
+msgstr ""
+
+#: ../../mod/newmember.php:36
+msgid ""
+"The Directory page lets you find other people in this network or other "
+"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
+"their profile page. Provide your own Identity Address if requested."
+msgstr ""
+
+#: ../../mod/newmember.php:38
+msgid ""
+"Once you have made some friends, organize them into private conversation "
+"groups from the sidebar of your Contacts page and then you can interact with "
+"each group privately on your Network page."
+msgstr ""
+
+#: ../../mod/newmember.php:40
+msgid ""
+"Our <strong>help</strong> pages may be consulted for detail on other program "
+"features and resources."
+msgstr ""
+
+#: ../../mod/attach.php:8
msgid "Item not available."
msgstr ""
-#: ../../mod/attach.php:16
+#: ../../mod/attach.php:20
msgid "Item was not found."
msgstr ""
@@ -1524,7 +1804,7 @@ msgstr ""
msgid "Could not create group."
msgstr ""
-#: ../../mod/group.php:43 ../../mod/group.php:115
+#: ../../mod/group.php:43 ../../mod/group.php:123
msgid "Group not found."
msgstr ""
@@ -1532,64 +1812,59 @@ msgstr ""
msgid "Group name changed."
msgstr ""
-#: ../../mod/group.php:67 ../../mod/profperm.php:19 ../../index.php:255
+#: ../../mod/group.php:67 ../../mod/profperm.php:19 ../../index.php:265
msgid "Permission denied"
msgstr ""
-#: ../../mod/group.php:74
+#: ../../mod/group.php:82
msgid "Create a group of contacts/friends."
msgstr ""
-#: ../../mod/group.php:75 ../../mod/group.php:158
+#: ../../mod/group.php:83 ../../mod/group.php:166
msgid "Group Name: "
msgstr ""
-#: ../../mod/group.php:90
+#: ../../mod/group.php:98
msgid "Group removed."
msgstr ""
-#: ../../mod/group.php:92
+#: ../../mod/group.php:100
msgid "Unable to remove group."
msgstr ""
-#: ../../mod/group.php:156 ../../mod/profperm.php:96
+#: ../../mod/group.php:164 ../../mod/profperm.php:105
msgid "Click on a contact to add or remove."
msgstr ""
-#: ../../mod/group.php:157
+#: ../../mod/group.php:165
msgid "Group Editor"
msgstr ""
-#: ../../mod/group.php:172
+#: ../../mod/group.php:180
msgid "Members"
msgstr ""
-#: ../../mod/group.php:186
+#: ../../mod/group.php:195
msgid "All Contacts"
msgstr ""
-#: ../../mod/profperm.php:25 ../../mod/profperm.php:46
+#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
msgid "Invalid profile identifier."
msgstr ""
-#: ../../mod/profperm.php:92
+#: ../../mod/profperm.php:101
msgid "Profile Visibility Editor"
msgstr ""
-#: ../../mod/profperm.php:94 ../../mod/profile.php:116
-#: ../../include/profile_advanced.php:7
-msgid "Profile"
-msgstr ""
-
-#: ../../mod/profperm.php:105
+#: ../../mod/profperm.php:114
msgid "Visible To"
msgstr ""
-#: ../../mod/profperm.php:116
+#: ../../mod/profperm.php:128
msgid "All Contacts (with secure profile access)"
msgstr ""
-#: ../../mod/viewcontacts.php:25 ../../boot.php:2059
+#: ../../mod/viewcontacts.php:25 ../../include/text.php:555
msgid "View Contacts"
msgstr ""
@@ -1597,272 +1872,282 @@ msgstr ""
msgid "No contacts."
msgstr ""
-#: ../../mod/register.php:49
+#: ../../mod/register.php:53
+msgid "An invitation is required."
+msgstr ""
+
+#: ../../mod/register.php:58
+msgid "Invitation could not be verified."
+msgstr ""
+
+#: ../../mod/register.php:66
msgid "Invalid OpenID url"
msgstr ""
-#: ../../mod/register.php:64
+#: ../../mod/register.php:81
msgid "Please enter the required information."
msgstr ""
-#: ../../mod/register.php:76
+#: ../../mod/register.php:95
msgid "Please use a shorter name."
msgstr ""
-#: ../../mod/register.php:78
+#: ../../mod/register.php:97
msgid "Name too short."
msgstr ""
-#: ../../mod/register.php:93
+#: ../../mod/register.php:112
msgid "That doesn't appear to be your full (First Last) name."
msgstr ""
-#: ../../mod/register.php:97
+#: ../../mod/register.php:117
msgid "Your email domain is not among those allowed on this site."
msgstr ""
-#: ../../mod/register.php:100
+#: ../../mod/register.php:120
msgid "Not a valid email address."
msgstr ""
-#: ../../mod/register.php:106
+#: ../../mod/register.php:130
msgid "Cannot use that email."
msgstr ""
-#: ../../mod/register.php:111
+#: ../../mod/register.php:136
msgid ""
"Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and "
"must also begin with a letter."
msgstr ""
-#: ../../mod/register.php:117 ../../mod/register.php:217
+#: ../../mod/register.php:142 ../../mod/register.php:243
msgid "Nickname is already registered. Please choose another."
msgstr ""
-#: ../../mod/register.php:136
+#: ../../mod/register.php:161
msgid "SERIOUS ERROR: Generation of security keys failed."
msgstr ""
-#: ../../mod/register.php:203
+#: ../../mod/register.php:229
msgid "An error occurred during registration. Please try again."
msgstr ""
-#: ../../mod/register.php:239
+#: ../../mod/register.php:265
msgid "An error occurred creating your default profile. Please try again."
msgstr ""
-#: ../../mod/register.php:333 ../../mod/regmod.php:96
+#: ../../mod/register.php:367 ../../mod/regmod.php:52
#, php-format
msgid "Registration details for %s"
msgstr ""
-#: ../../mod/register.php:341
+#: ../../mod/register.php:375
msgid ""
"Registration successful. Please check your email for further instructions."
msgstr ""
-#: ../../mod/register.php:345
+#: ../../mod/register.php:379
msgid "Failed to send email message. Here is the message that failed."
msgstr ""
-#: ../../mod/register.php:350
+#: ../../mod/register.php:384
msgid "Your registration can not be processed."
msgstr ""
-#: ../../mod/register.php:383
+#: ../../mod/register.php:421
#, php-format
msgid "Registration request at %s"
msgstr ""
-#: ../../mod/register.php:392
+#: ../../mod/register.php:430
msgid "Your registration is pending approval by the site owner."
msgstr ""
-#: ../../mod/register.php:440
+#: ../../mod/register.php:479
msgid ""
"You may (optionally) fill in this form via OpenID by supplying your OpenID "
"and clicking 'Register'."
msgstr ""
-#: ../../mod/register.php:441
+#: ../../mod/register.php:480
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:442
+#: ../../mod/register.php:481
msgid "Your OpenID (optional): "
msgstr ""
-#: ../../mod/register.php:456
+#: ../../mod/register.php:495
msgid "Include your profile in member directory?"
msgstr ""
-#: ../../mod/register.php:472
+#: ../../mod/register.php:511
+msgid "Membership on this site is by invitation only."
+msgstr ""
+
+#: ../../mod/register.php:512
+msgid "Your invitation ID: "
+msgstr ""
+
+#: ../../mod/register.php:515 ../../mod/admin.php:299
msgid "Registration"
msgstr ""
-#: ../../mod/register.php:480
+#: ../../mod/register.php:523
msgid "Your Full Name (e.g. Joe Smith): "
msgstr ""
-#: ../../mod/register.php:481
+#: ../../mod/register.php:524
msgid "Your Email Address: "
msgstr ""
-#: ../../mod/register.php:482
+#: ../../mod/register.php:525
msgid ""
"Choose a profile nickname. This must begin with a text character. Your "
"profile address on this site will then be '<strong>nickname@$sitename</"
"strong>'."
msgstr ""
-#: ../../mod/register.php:483
+#: ../../mod/register.php:526
msgid "Choose a nickname: "
msgstr ""
-#: ../../mod/register.php:486 ../../include/nav.php:59 ../../boot.php:835
+#: ../../mod/register.php:529 ../../include/nav.php:59 ../../boot.php:637
msgid "Register"
msgstr ""
-#: ../../mod/like.php:110 ../../addon/facebook/facebook.php:774
-#: ../../include/conversation.php:20
+#: ../../mod/like.php:110 ../../addon/facebook/facebook.php:954
+#: ../../include/diaspora.php:446 ../../include/conversation.php:26
+#: ../../include/conversation.php:35
msgid "status"
msgstr ""
-#: ../../mod/like.php:127 ../../addon/facebook/facebook.php:778
-#: ../../include/conversation.php:25
+#: ../../mod/like.php:127 ../../addon/facebook/facebook.php:958
+#: ../../include/diaspora.php:463 ../../include/conversation.php:43
#, php-format
msgid "%1$s likes %2$s's %3$s"
msgstr ""
-#: ../../mod/like.php:129 ../../include/conversation.php:28
+#: ../../mod/like.php:129 ../../include/diaspora.php:465
+#: ../../include/conversation.php:46
#, php-format
msgid "%1$s doesn't like %2$s's %3$s"
msgstr ""
-#: ../../mod/friendika.php:43
+#: ../../mod/friendika.php:42
msgid "This is Friendika version"
msgstr ""
-#: ../../mod/friendika.php:44
+#: ../../mod/friendika.php:43
msgid "running at web location"
msgstr ""
-#: ../../mod/friendika.php:46
+#: ../../mod/friendika.php:45
msgid ""
"Shared content within the Friendika network is provided under the <a href="
"\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution "
"3.0 license</a>"
msgstr ""
-#: ../../mod/friendika.php:48
+#: ../../mod/friendika.php:47
msgid ""
"Please visit <a href=\"http://project.friendika.com\">Project.Friendika.com</"
"a> to learn more about the Friendika project."
msgstr ""
-#: ../../mod/friendika.php:50
+#: ../../mod/friendika.php:49
msgid "Bug reports and issues: please visit"
msgstr ""
-#: ../../mod/friendika.php:51
+#: ../../mod/friendika.php:50
msgid ""
"Suggestions, praise, donations, etc. - please email \"Info\" at Friendika - "
"dot com"
msgstr ""
-#: ../../mod/friendika.php:56
+#: ../../mod/friendika.php:55
msgid "Installed plugins/addons/apps"
msgstr ""
-#: ../../mod/friendika.php:64
+#: ../../mod/friendika.php:63
msgid "No installed plugins/addons/apps"
msgstr ""
-#: ../../mod/regmod.php:12
-msgid "Please login."
+#: ../../mod/regmod.php:61
+msgid "Account approved."
msgstr ""
-#: ../../mod/regmod.php:56
+#: ../../mod/regmod.php:93
#, php-format
msgid "Registration revoked for %s"
msgstr ""
#: ../../mod/regmod.php:105
-msgid "Account approved."
-msgstr ""
-
-#: ../../mod/update_network.php:22 ../../mod/update_profile.php:41
-msgid "[Embedded content - reload page to view]"
+msgid "Please login."
msgstr ""
-#: ../../mod/item.php:37
+#: ../../mod/item.php:81
msgid "Unable to locate original post."
msgstr ""
-#: ../../mod/item.php:128
+#: ../../mod/item.php:196
msgid "Empty post discarded."
msgstr ""
-#: ../../mod/item.php:214 ../../mod/message.php:93
-#: ../../mod/wall_upload.php:79 ../../mod/wall_upload.php:88
-#: ../../mod/wall_upload.php:95
+#: ../../mod/item.php:296 ../../mod/message.php:93
+#: ../../mod/wall_upload.php:81 ../../mod/wall_upload.php:90
+#: ../../mod/wall_upload.php:97
msgid "Wall Photos"
msgstr ""
-#: ../../mod/item.php:517 ../../mod/item.php:560 ../../mod/item.php:583
-#: ../../mod/item.php:624 ../../mod/dfrn_notify.php:193
-#: ../../mod/dfrn_notify.php:401 ../../mod/dfrn_notify.php:444
-#: ../../mod/dfrn_notify.php:530 ../../mod/dfrn_notify.php:571
+#: ../../mod/item.php:623 ../../mod/item.php:668 ../../mod/item.php:691
+#: ../../mod/item.php:734 ../../mod/dfrn_notify.php:293
+#: ../../mod/dfrn_notify.php:503 ../../mod/dfrn_notify.php:548
+#: ../../mod/dfrn_notify.php:634 ../../mod/dfrn_notify.php:677
msgid "noreply"
msgstr ""
-#: ../../mod/item.php:559 ../../mod/item.php:623 ../../mod/dfrn_notify.php:570
+#: ../../mod/item.php:667 ../../mod/item.php:733 ../../mod/dfrn_notify.php:676
msgid "Administrator@"
msgstr ""
-#: ../../mod/item.php:562 ../../mod/dfrn_notify.php:446
-#: ../../mod/dfrn_notify.php:573
+#: ../../mod/item.php:670 ../../mod/dfrn_notify.php:550
+#: ../../mod/dfrn_notify.php:679
#, php-format
msgid "%s commented on an item at %s"
msgstr ""
-#: ../../mod/item.php:626
+#: ../../mod/item.php:736
#, php-format
msgid "%s posted to your profile wall at %s"
msgstr ""
-#: ../../mod/item.php:655
+#: ../../mod/item.php:765
msgid "System error. Post not saved."
msgstr ""
-#: ../../mod/item.php:674
+#: ../../mod/item.php:784
#, php-format
msgid ""
"This message was sent to you by %s, a member of the Friendika social network."
msgstr ""
-#: ../../mod/item.php:676
+#: ../../mod/item.php:786
#, php-format
msgid "You may visit them online at %s"
msgstr ""
-#: ../../mod/item.php:677
+#: ../../mod/item.php:787
msgid ""
"Please contact the sender by replying to this post if you do not wish to "
"receive these messages."
msgstr ""
-#: ../../mod/item.php:679
+#: ../../mod/item.php:789
#, php-format
msgid "%s posted an update."
msgstr ""
-#: ../../mod/item.php:730 ../../mod/display.php:25 ../../mod/display.php:142
-msgid "Item not found."
-msgstr ""
-
#: ../../mod/profile_photo.php:28
msgid "Image uploaded but image cropping failed."
msgstr ""
@@ -1918,6 +2203,10 @@ msgstr ""
msgid "Image uploaded successfully."
msgstr ""
+#: ../../mod/hcard.php:11 ../../mod/profile.php:11 ../../boot.php:792
+msgid "No profile"
+msgstr ""
+
#: ../../mod/removeme.php:42 ../../mod/removeme.php:45
msgid "Remove My Account"
msgstr ""
@@ -1952,7 +2241,7 @@ msgstr ""
msgid "Message could not be sent."
msgstr ""
-#: ../../mod/message.php:125 ../../include/nav.php:101
+#: ../../mod/message.php:125 ../../include/nav.php:102
msgid "Messages"
msgstr ""
@@ -1976,7 +2265,7 @@ msgstr ""
msgid "Conversation removed."
msgstr ""
-#: ../../mod/message.php:172 ../../include/conversation.php:684
+#: ../../mod/message.php:172 ../../include/conversation.php:699
msgid "Please enter a link URL:"
msgstr ""
@@ -1992,7 +2281,8 @@ msgstr ""
msgid "Subject:"
msgstr ""
-#: ../../mod/message.php:185 ../../mod/message.php:319 ../../mod/invite.php:63
+#: ../../mod/message.php:185 ../../mod/message.php:319
+#: ../../mod/invite.php:101
msgid "Your message:"
msgstr ""
@@ -2020,74 +2310,414 @@ msgstr ""
msgid "Send Reply"
msgstr ""
-#: ../../mod/profile.php:11 ../../boot.php:2270
-msgid "No profile"
+#: ../../mod/admin.php:66 ../../mod/admin.php:297
+msgid "Site"
msgstr ""
-#: ../../mod/profile.php:59
-msgid "Access to this profile has been restricted."
+#: ../../mod/admin.php:67 ../../mod/admin.php:460 ../../mod/admin.php:472
+msgid "Users"
msgstr ""
-#: ../../mod/profile.php:115
-msgid "Status"
+#: ../../mod/admin.php:68 ../../mod/admin.php:549 ../../mod/admin.php:586
+msgid "Plugins"
msgstr ""
-#: ../../mod/profile.php:117
-msgid "Photos"
+#: ../../mod/admin.php:69
+msgid "Update"
+msgstr ""
+
+#: ../../mod/admin.php:83 ../../mod/admin.php:651
+msgid "Logs"
+msgstr ""
+
+#: ../../mod/admin.php:88
+msgid "User registrations waiting for confirmation"
+msgstr ""
+
+#: ../../mod/admin.php:118 ../../mod/admin.php:502 ../../mod/display.php:25
+#: ../../mod/display.php:112 ../../include/items.php:1842
+msgid "Item not found."
+msgstr ""
+
+#: ../../mod/admin.php:151 ../../mod/admin.php:296 ../../mod/admin.php:459
+#: ../../mod/admin.php:548 ../../mod/admin.php:585 ../../mod/admin.php:650
+msgid "Administration"
+msgstr ""
+
+#: ../../mod/admin.php:152
+msgid "Summary"
+msgstr ""
+
+#: ../../mod/admin.php:153
+msgid "Registered users"
+msgstr ""
+
+#: ../../mod/admin.php:155
+msgid "Pending registrations"
+msgstr ""
+
+#: ../../mod/admin.php:156
+msgid "Version"
+msgstr ""
+
+#: ../../mod/admin.php:158
+msgid "Active plugins"
+msgstr ""
+
+#: ../../mod/admin.php:245
+msgid "Site settings updated."
+msgstr ""
+
+#: ../../mod/admin.php:289
+msgid "Closed"
+msgstr ""
+
+#: ../../mod/admin.php:290
+msgid "Requires approval"
+msgstr ""
+
+#: ../../mod/admin.php:291
+msgid "Open"
+msgstr ""
+
+#: ../../mod/admin.php:300
+msgid "File upload"
+msgstr ""
+
+#: ../../mod/admin.php:301
+msgid "Policies"
+msgstr ""
+
+#: ../../mod/admin.php:302
+msgid "Advanced"
+msgstr ""
+
+#: ../../mod/admin.php:306 ../../addon/statusnet/statusnet.php:459
+msgid "Site name"
+msgstr ""
+
+#: ../../mod/admin.php:307
+msgid "Banner/Logo"
+msgstr ""
+
+#: ../../mod/admin.php:308
+msgid "System language"
+msgstr ""
+
+#: ../../mod/admin.php:309
+msgid "System theme"
+msgstr ""
+
+#: ../../mod/admin.php:311
+msgid "Maximum image size"
+msgstr ""
+
+#: ../../mod/admin.php:313
+msgid "Register policy"
+msgstr ""
+
+#: ../../mod/admin.php:314
+msgid "Register text"
+msgstr ""
+
+#: ../../mod/admin.php:315
+msgid "Allowed friend domains"
+msgstr ""
+
+#: ../../mod/admin.php:316
+msgid "Allowed email domains"
+msgstr ""
+
+#: ../../mod/admin.php:317
+msgid "Block public"
+msgstr ""
+
+#: ../../mod/admin.php:318
+msgid "Force publish"
+msgstr ""
+
+#: ../../mod/admin.php:319
+msgid "Global directory update URL"
+msgstr ""
+
+#: ../../mod/admin.php:321
+msgid "Block multiple registrations"
+msgstr ""
+
+#: ../../mod/admin.php:322
+msgid "OpenID support"
+msgstr ""
+
+#: ../../mod/admin.php:323
+msgid "Gravatar support"
+msgstr ""
+
+#: ../../mod/admin.php:324
+msgid "Fullname check"
+msgstr ""
+
+#: ../../mod/admin.php:325
+msgid "UTF-8 Regular expressions"
+msgstr ""
+
+#: ../../mod/admin.php:326
+msgid "Show Community Page"
+msgstr ""
+
+#: ../../mod/admin.php:327
+msgid "Enable OStatus support"
+msgstr ""
+
+#: ../../mod/admin.php:328
+msgid "Only allow Friendika contacts"
+msgstr ""
+
+#: ../../mod/admin.php:329
+msgid "Verify SSL"
+msgstr ""
+
+#: ../../mod/admin.php:330
+msgid "Proxy user"
+msgstr ""
+
+#: ../../mod/admin.php:331
+msgid "Proxy URL"
+msgstr ""
+
+#: ../../mod/admin.php:332
+msgid "Network timeout"
+msgstr ""
+
+#: ../../mod/admin.php:353
+#, php-format
+msgid "%s user blocked"
+msgid_plural "%s users blocked/unblocked"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../mod/admin.php:360
+#, php-format
+msgid "%s user deleted"
+msgid_plural "%s users deleted"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../mod/admin.php:394
+#, php-format
+msgid "User '%s' deleted"
+msgstr ""
+
+#: ../../mod/admin.php:401
+#, php-format
+msgid "User '%s' unblocked"
+msgstr ""
+
+#: ../../mod/admin.php:401
+#, php-format
+msgid "User '%s' blocked"
+msgstr ""
+
+#: ../../mod/admin.php:462
+msgid "select all"
+msgstr ""
+
+#: ../../mod/admin.php:463
+msgid "User registrations waiting for confirm"
+msgstr ""
+
+#: ../../mod/admin.php:464
+msgid "Request date"
+msgstr ""
+
+#: ../../mod/admin.php:464 ../../mod/admin.php:473
+msgid "Email"
+msgstr ""
+
+#: ../../mod/admin.php:465
+msgid "No registrations."
+msgstr ""
+
+#: ../../mod/admin.php:467
+msgid "Deny"
+msgstr ""
+
+#: ../../mod/admin.php:469
+msgid "Block"
+msgstr ""
+
+#: ../../mod/admin.php:470
+msgid "Unblock"
+msgstr ""
+
+#: ../../mod/admin.php:473
+msgid "Register date"
+msgstr ""
+
+#: ../../mod/admin.php:473
+msgid "Last login"
+msgstr ""
+
+#: ../../mod/admin.php:473
+msgid "Last item"
+msgstr ""
+
+#: ../../mod/admin.php:473
+msgid "Account"
+msgstr ""
+
+#: ../../mod/admin.php:475
+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:476
+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:512
+#, php-format
+msgid "Plugin %s disabled."
+msgstr ""
+
+#: ../../mod/admin.php:516
+#, php-format
+msgid "Plugin %s enabled."
+msgstr ""
+
+#: ../../mod/admin.php:526
+msgid "Disable"
+msgstr ""
+
+#: ../../mod/admin.php:528
+msgid "Enable"
+msgstr ""
+
+#: ../../mod/admin.php:550
+msgid "Toggle"
+msgstr ""
+
+#: ../../mod/admin.php:551 ../../include/nav.php:108
+msgid "Settings"
+msgstr ""
+
+#: ../../mod/admin.php:613
+msgid "Log settings updated."
msgstr ""
-#: ../../mod/openid.php:62 ../../mod/openid.php:122 ../../include/auth.php:114
-#: ../../include/auth.php:139 ../../include/auth.php:192
+#: ../../mod/admin.php:653
+msgid "Clear"
+msgstr ""
+
+#: ../../mod/admin.php:659
+msgid "Debugging"
+msgstr ""
+
+#: ../../mod/admin.php:660
+msgid "Log file"
+msgstr ""
+
+#: ../../mod/admin.php:660
+msgid "Must be writable by web server. Relative to your Friendika index.php."
+msgstr ""
+
+#: ../../mod/admin.php:661
+msgid "Log level"
+msgstr ""
+
+#: ../../mod/admin.php:702
+msgid "Close"
+msgstr ""
+
+#: ../../mod/admin.php:708
+msgid "FTP Host"
+msgstr ""
+
+#: ../../mod/admin.php:709
+msgid "FTP Path"
+msgstr ""
+
+#: ../../mod/admin.php:710
+msgid "FTP User"
+msgstr ""
+
+#: ../../mod/admin.php:711
+msgid "FTP Password"
+msgstr ""
+
+#: ../../mod/profile.php:102 ../../mod/display.php:63
+msgid "Access to this profile has been restricted."
+msgstr ""
+
+#: ../../mod/profile.php:133
+msgid "Tips for New Members"
+msgstr ""
+
+#: ../../mod/openid.php:62 ../../mod/openid.php:122 ../../include/auth.php:120
+#: ../../include/auth.php:145 ../../include/auth.php:198
msgid "Login failed."
msgstr ""
-#: ../../mod/openid.php:78 ../../include/auth.php:208
+#: ../../mod/openid.php:78 ../../include/auth.php:214
msgid "Welcome "
msgstr ""
-#: ../../mod/openid.php:79 ../../include/auth.php:209
+#: ../../mod/openid.php:79 ../../include/auth.php:215
msgid "Please upload a profile photo."
msgstr ""
-#: ../../mod/openid.php:82 ../../include/auth.php:212
+#: ../../mod/openid.php:82 ../../include/auth.php:218
msgid "Welcome back "
msgstr ""
-#: ../../mod/follow.php:43
-msgid "The profile address specified does not provide adequate information."
+#: ../../mod/follow.php:39
+msgid ""
+"This site is not configured to allow communications with other networks."
msgstr ""
-#: ../../mod/follow.php:45
+#: ../../mod/follow.php:40 ../../mod/follow.php:50
msgid "No compatible communication protocols or feeds were discovered."
msgstr ""
-#: ../../mod/follow.php:47
+#: ../../mod/follow.php:48
+msgid "The profile address specified does not provide adequate information."
+msgstr ""
+
+#: ../../mod/follow.php:52
msgid "An author or name was not found."
msgstr ""
-#: ../../mod/follow.php:49
+#: ../../mod/follow.php:54
msgid "No browser URL could be matched to this address."
msgstr ""
-#: ../../mod/follow.php:57
+#: ../../mod/follow.php:61
+msgid ""
+"The profile address specified belongs to a network which has been disabled "
+"on this site."
+msgstr ""
+
+#: ../../mod/follow.php:66
msgid ""
"Limited profile. This person will be unable to receive direct/personal "
"notifications from you."
msgstr ""
-#: ../../mod/follow.php:112
+#: ../../mod/follow.php:122
msgid "Unable to retrieve contact information."
msgstr ""
-#: ../../mod/follow.php:158
+#: ../../mod/follow.php:168
msgid "following"
msgstr ""
-#: ../../mod/display.php:135
+#: ../../mod/display.php:105
msgid "Item has been removed."
msgstr ""
-#: ../../mod/dfrn_notify.php:251
+#: ../../mod/dfrn_notify.php:353
msgid "New mail received at "
msgstr ""
@@ -2095,16 +2725,16 @@ msgstr ""
msgid "Applications"
msgstr ""
-#: ../../mod/search.php:26 ../../include/nav.php:70 ../../boot.php:2114
-msgid "Search"
+#: ../../mod/apps.php:11
+msgid "No installed applications."
msgstr ""
-#: ../../mod/search.php:69
-msgid "No results."
+#: ../../mod/search.php:26 ../../include/text.php:610 ../../include/nav.php:69
+msgid "Search"
msgstr ""
-#: ../../mod/profiles.php:21 ../../mod/profiles.php:240
-#: ../../mod/profiles.php:345 ../../mod/dfrn_confirm.php:62
+#: ../../mod/profiles.php:21 ../../mod/profiles.php:236
+#: ../../mod/profiles.php:341 ../../mod/dfrn_confirm.php:62
msgid "Profile not found."
msgstr ""
@@ -2112,213 +2742,210 @@ msgstr ""
msgid "Profile Name is required."
msgstr ""
-#: ../../mod/profiles.php:202
+#: ../../mod/profiles.php:198
msgid "Profile updated."
msgstr ""
-#: ../../mod/profiles.php:257
+#: ../../mod/profiles.php:253
msgid "Profile deleted."
msgstr ""
-#: ../../mod/profiles.php:273 ../../mod/profiles.php:304
+#: ../../mod/profiles.php:269 ../../mod/profiles.php:300
msgid "Profile-"
msgstr ""
-#: ../../mod/profiles.php:292 ../../mod/profiles.php:331
+#: ../../mod/profiles.php:288 ../../mod/profiles.php:327
msgid "New profile created."
msgstr ""
-#: ../../mod/profiles.php:310
+#: ../../mod/profiles.php:306
msgid "Profile unavailable to clone."
msgstr ""
-#: ../../mod/profiles.php:357
+#: ../../mod/profiles.php:353
msgid "Hide your contact/friend list from viewers of this profile?"
msgstr ""
-#: ../../mod/profiles.php:366
-msgid "Hide profile details and all your messages from unknown viewers?"
-msgstr ""
-
-#: ../../mod/profiles.php:382
+#: ../../mod/profiles.php:371
msgid "Edit Profile Details"
msgstr ""
-#: ../../mod/profiles.php:384
+#: ../../mod/profiles.php:373
msgid "View this profile"
msgstr ""
-#: ../../mod/profiles.php:385
+#: ../../mod/profiles.php:374
msgid "Create a new profile using these settings"
msgstr ""
-#: ../../mod/profiles.php:386
+#: ../../mod/profiles.php:375
msgid "Clone this profile"
msgstr ""
-#: ../../mod/profiles.php:387
+#: ../../mod/profiles.php:376
msgid "Delete this profile"
msgstr ""
-#: ../../mod/profiles.php:388
+#: ../../mod/profiles.php:377
msgid "Profile Name:"
msgstr ""
-#: ../../mod/profiles.php:389
+#: ../../mod/profiles.php:378
msgid "Your Full Name:"
msgstr ""
-#: ../../mod/profiles.php:390
+#: ../../mod/profiles.php:379
msgid "Title/Description:"
msgstr ""
-#: ../../mod/profiles.php:391
+#: ../../mod/profiles.php:380
msgid "Your Gender:"
msgstr ""
-#: ../../mod/profiles.php:392
-msgid "Birthday (y/m/d):"
+#: ../../mod/profiles.php:381
+#, php-format
+msgid "Birthday (%s):"
msgstr ""
-#: ../../mod/profiles.php:393
+#: ../../mod/profiles.php:382
msgid "Street Address:"
msgstr ""
-#: ../../mod/profiles.php:394
+#: ../../mod/profiles.php:383
msgid "Locality/City:"
msgstr ""
-#: ../../mod/profiles.php:395
+#: ../../mod/profiles.php:384
msgid "Postal/Zip Code:"
msgstr ""
-#: ../../mod/profiles.php:396
+#: ../../mod/profiles.php:385
msgid "Country:"
msgstr ""
-#: ../../mod/profiles.php:397
+#: ../../mod/profiles.php:386
msgid "Region/State:"
msgstr ""
-#: ../../mod/profiles.php:398
+#: ../../mod/profiles.php:387
msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
msgstr ""
-#: ../../mod/profiles.php:399
+#: ../../mod/profiles.php:388
msgid "Who: (if applicable)"
msgstr ""
-#: ../../mod/profiles.php:400
+#: ../../mod/profiles.php:389
msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
msgstr ""
-#: ../../mod/profiles.php:401 ../../include/profile_advanced.php:90
+#: ../../mod/profiles.php:390 ../../include/profile_advanced.php:90
msgid "Sexual Preference:"
msgstr ""
-#: ../../mod/profiles.php:402
+#: ../../mod/profiles.php:391
msgid "Homepage URL:"
msgstr ""
-#: ../../mod/profiles.php:403 ../../include/profile_advanced.php:115
+#: ../../mod/profiles.php:392 ../../include/profile_advanced.php:115
msgid "Political Views:"
msgstr ""
-#: ../../mod/profiles.php:404
+#: ../../mod/profiles.php:393
msgid "Religious Views:"
msgstr ""
-#: ../../mod/profiles.php:405
+#: ../../mod/profiles.php:394
msgid "Public Keywords:"
msgstr ""
-#: ../../mod/profiles.php:406
+#: ../../mod/profiles.php:395
msgid "Private Keywords:"
msgstr ""
-#: ../../mod/profiles.php:407
+#: ../../mod/profiles.php:396
msgid "Example: fishing photography software"
msgstr ""
-#: ../../mod/profiles.php:408
+#: ../../mod/profiles.php:397
msgid "(Used for suggesting potential friends, can be seen by others)"
msgstr ""
-#: ../../mod/profiles.php:409
+#: ../../mod/profiles.php:398
msgid "(Used for searching profiles, never shown to others)"
msgstr ""
-#: ../../mod/profiles.php:410
+#: ../../mod/profiles.php:399
msgid "Tell us about yourself..."
msgstr ""
-#: ../../mod/profiles.php:411
+#: ../../mod/profiles.php:400
msgid "Hobbies/Interests"
msgstr ""
-#: ../../mod/profiles.php:412
+#: ../../mod/profiles.php:401
msgid "Contact information and Social Networks"
msgstr ""
-#: ../../mod/profiles.php:413
+#: ../../mod/profiles.php:402
msgid "Musical interests"
msgstr ""
-#: ../../mod/profiles.php:414
+#: ../../mod/profiles.php:403
msgid "Books, literature"
msgstr ""
-#: ../../mod/profiles.php:415
+#: ../../mod/profiles.php:404
msgid "Television"
msgstr ""
-#: ../../mod/profiles.php:416
+#: ../../mod/profiles.php:405
msgid "Film/dance/culture/entertainment"
msgstr ""
-#: ../../mod/profiles.php:417
+#: ../../mod/profiles.php:406
msgid "Love/romance"
msgstr ""
-#: ../../mod/profiles.php:418
+#: ../../mod/profiles.php:407
msgid "Work/employment"
msgstr ""
-#: ../../mod/profiles.php:419
+#: ../../mod/profiles.php:408
msgid "School/education"
msgstr ""
-#: ../../mod/profiles.php:424
+#: ../../mod/profiles.php:413
msgid ""
"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
"be visible to anybody using the internet."
msgstr ""
-#: ../../mod/profiles.php:435 ../../mod/directory.php:112
+#: ../../mod/profiles.php:423 ../../mod/directory.php:112
msgid "Age: "
msgstr ""
-#: ../../mod/profiles.php:470 ../../include/nav.php:108
+#: ../../mod/profiles.php:458 ../../include/nav.php:109
msgid "Profiles"
msgstr ""
-#: ../../mod/profiles.php:471
+#: ../../mod/profiles.php:459
msgid "Change profile photo"
msgstr ""
-#: ../../mod/profiles.php:472
+#: ../../mod/profiles.php:460
msgid "Create New Profile"
msgstr ""
-#: ../../mod/profiles.php:482
+#: ../../mod/profiles.php:470
msgid "Profile Image"
msgstr ""
-#: ../../mod/profiles.php:484
-msgid "Visible to everybody"
+#: ../../mod/profiles.php:472
+msgid "visible to everybody"
msgstr ""
-#: ../../mod/profiles.php:485
+#: ../../mod/profiles.php:473
msgid "Edit visibility"
msgstr ""
@@ -2346,339 +2973,391 @@ msgstr ""
msgid "No entries (some entries may be hidden)."
msgstr ""
-#: ../../mod/invite.php:28
+#: ../../mod/invite.php:35
#, php-format
msgid "%s : Not a valid email address."
msgstr ""
-#: ../../mod/invite.php:32
+#: ../../mod/invite.php:59
#, php-format
msgid "Please join my network on %s"
msgstr ""
-#: ../../mod/invite.php:42
+#: ../../mod/invite.php:69
#, php-format
msgid "%s : Message delivery failed."
msgstr ""
-#: ../../mod/invite.php:46
+#: ../../mod/invite.php:73
#, php-format
msgid "%d message sent."
msgid_plural "%d messages sent."
msgstr[0] ""
msgstr[1] ""
-#: ../../mod/invite.php:61
+#: ../../mod/invite.php:92
+msgid "You have no more invitations available"
+msgstr ""
+
+#: ../../mod/invite.php:99
msgid "Send invitations"
msgstr ""
-#: ../../mod/invite.php:62
+#: ../../mod/invite.php:100
msgid "Enter email addresses, one per line:"
msgstr ""
-#: ../../mod/invite.php:64
+#: ../../mod/invite.php:102
#, php-format
msgid "Please join my social network on %s"
msgstr ""
-#: ../../mod/invite.php:65
+#: ../../mod/invite.php:103
msgid "To accept this invitation, please visit:"
msgstr ""
-#: ../../mod/invite.php:66
+#: ../../mod/invite.php:104
+msgid "You will need to supply this invitation code: $invite_code"
+msgstr ""
+
+#: ../../mod/invite.php:104
msgid ""
"Once you have registered, please connect with me via my profile page at:"
msgstr ""
-#: ../../mod/dfrn_confirm.php:231
+#: ../../mod/dfrn_confirm.php:233
msgid "Response from remote site was not understood."
msgstr ""
-#: ../../mod/dfrn_confirm.php:240
+#: ../../mod/dfrn_confirm.php:242
msgid "Unexpected response from remote site: "
msgstr ""
-#: ../../mod/dfrn_confirm.php:248
+#: ../../mod/dfrn_confirm.php:250
msgid "Confirmation completed successfully."
msgstr ""
-#: ../../mod/dfrn_confirm.php:250 ../../mod/dfrn_confirm.php:264
-#: ../../mod/dfrn_confirm.php:271
+#: ../../mod/dfrn_confirm.php:252 ../../mod/dfrn_confirm.php:266
+#: ../../mod/dfrn_confirm.php:273
msgid "Remote site reported: "
msgstr ""
-#: ../../mod/dfrn_confirm.php:262
+#: ../../mod/dfrn_confirm.php:264
msgid "Temporary failure. Please wait and try again."
msgstr ""
-#: ../../mod/dfrn_confirm.php:269
+#: ../../mod/dfrn_confirm.php:271
msgid "Introduction failed or was revoked."
msgstr ""
-#: ../../mod/dfrn_confirm.php:387
+#: ../../mod/dfrn_confirm.php:393
msgid "Unable to set contact photo."
msgstr ""
-#: ../../mod/dfrn_confirm.php:430 ../../include/conversation.php:61
+#: ../../mod/dfrn_confirm.php:436 ../../include/conversation.php:79
#, php-format
msgid "%1$s is now friends with %2$s"
msgstr ""
-#: ../../mod/dfrn_confirm.php:501
+#: ../../mod/dfrn_confirm.php:507
#, php-format
msgid "No user record found for '%s' "
msgstr ""
-#: ../../mod/dfrn_confirm.php:511
+#: ../../mod/dfrn_confirm.php:517
msgid "Our site encryption key is apparently messed up."
msgstr ""
-#: ../../mod/dfrn_confirm.php:522
+#: ../../mod/dfrn_confirm.php:528
msgid "Empty site URL was provided or URL could not be decrypted by us."
msgstr ""
-#: ../../mod/dfrn_confirm.php:534
+#: ../../mod/dfrn_confirm.php:549
msgid "Contact record was not found for you on our site."
msgstr ""
-#: ../../mod/dfrn_confirm.php:562
+#: ../../mod/dfrn_confirm.php:578
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:573
+#: ../../mod/dfrn_confirm.php:589
msgid "Unable to set your contact credentials on our system."
msgstr ""
-#: ../../mod/dfrn_confirm.php:626
+#: ../../mod/dfrn_confirm.php:642
msgid "Unable to update your contact profile details on our system"
msgstr ""
-#: ../../mod/dfrn_confirm.php:656
+#: ../../mod/dfrn_confirm.php:672
#, php-format
msgid "Connection accepted at %s"
msgstr ""
-#: ../../addon/facebook/facebook.php:248
+#: ../../addon/facebook/facebook.php:314
msgid "Facebook disabled"
msgstr ""
-#: ../../addon/facebook/facebook.php:253
+#: ../../addon/facebook/facebook.php:319
msgid "Updating contacts"
msgstr ""
-#: ../../addon/facebook/facebook.php:262
+#: ../../addon/facebook/facebook.php:328
msgid "Facebook API key is missing."
msgstr ""
-#: ../../addon/facebook/facebook.php:269
+#: ../../addon/facebook/facebook.php:335
msgid "Facebook Connect"
msgstr ""
-#: ../../addon/facebook/facebook.php:275
+#: ../../addon/facebook/facebook.php:341
msgid "Install Facebook connector for this account."
msgstr ""
-#: ../../addon/facebook/facebook.php:282
+#: ../../addon/facebook/facebook.php:348
msgid "Remove Facebook connector"
msgstr ""
-#: ../../addon/facebook/facebook.php:288
+#: ../../addon/facebook/facebook.php:354
msgid "Post to Facebook by default"
msgstr ""
-#: ../../addon/facebook/facebook.php:350
+#: ../../addon/facebook/facebook.php:358
+msgid "Link all your Facebook friends and conversations"
+msgstr ""
+
+#: ../../addon/facebook/facebook.php:363
+msgid "Warning: Your Facebook privacy settings can not be imported."
+msgstr ""
+
+#: ../../addon/facebook/facebook.php:364
+msgid ""
+"Linked Facebook items <strong>may</strong> be publicly visible, depending on "
+"your privacy settings for this website/account."
+msgstr ""
+
+#: ../../addon/facebook/facebook.php:419
msgid "Facebook"
msgstr ""
-#: ../../addon/facebook/facebook.php:351
+#: ../../addon/facebook/facebook.php:420
msgid "Facebook Connector Settings"
msgstr ""
-#: ../../addon/facebook/facebook.php:365
+#: ../../addon/facebook/facebook.php:434
msgid "Post to Facebook"
msgstr ""
-#: ../../addon/facebook/facebook.php:434
+#: ../../addon/facebook/facebook.php:507
msgid ""
"Post to Facebook cancelled because of multi-network access permission "
"conflict."
msgstr ""
-#: ../../addon/facebook/facebook.php:500
+#: ../../addon/facebook/facebook.php:580
msgid "Image: "
msgstr ""
-#: ../../addon/facebook/facebook.php:576
+#: ../../addon/facebook/facebook.php:656
msgid "View on Friendika"
msgstr ""
-#: ../../addon/widgets/widgets.php:41
-msgid "Widgets key: "
+#: ../../addon/facebook/facebook.php:687
+msgid "Facebook post failed. Queued for retry."
msgstr ""
-#: ../../addon/widgets/widgets.php:45
+#: ../../addon/widgets/widgets.php:53
msgid "Generate new key"
msgstr ""
+#: ../../addon/widgets/widgets.php:56
+msgid "Widgets key"
+msgstr ""
+
+#: ../../addon/widgets/widgets.php:58
+msgid "Widgets available"
+msgstr ""
+
#: ../../addon/widgets/widget_friends.php:30
msgid "Connect on Friendika!"
msgstr ""
-#: ../../addon/tictac/tictac.php:14
+#: ../../addon/tictac/tictac.php:20
msgid "Three Dimensional Tic-Tac-Toe"
msgstr ""
-#: ../../addon/tictac/tictac.php:47
+#: ../../addon/tictac/tictac.php:53
msgid "3D Tic-Tac-Toe"
msgstr ""
-#: ../../addon/tictac/tictac.php:52
+#: ../../addon/tictac/tictac.php:58
msgid "New game"
msgstr ""
-#: ../../addon/tictac/tictac.php:53
+#: ../../addon/tictac/tictac.php:59
msgid "New game with handicap"
msgstr ""
-#: ../../addon/tictac/tictac.php:54
+#: ../../addon/tictac/tictac.php:60
msgid ""
"Three dimensional tic-tac-toe is just like the traditional game except that "
"it is played on multiple levels simultaneously. "
msgstr ""
-#: ../../addon/tictac/tictac.php:55
+#: ../../addon/tictac/tictac.php:61
msgid ""
"In this case there are three levels. You win by getting three in a row on "
"any level, as well as up, down, and diagonally across the different levels."
msgstr ""
-#: ../../addon/tictac/tictac.php:57
+#: ../../addon/tictac/tictac.php:63
msgid ""
"The handicap game disables the center position on the middle level because "
"the player claiming this square often has an unfair advantage."
msgstr ""
-#: ../../addon/tictac/tictac.php:176
+#: ../../addon/tictac/tictac.php:182
msgid "You go first..."
msgstr ""
-#: ../../addon/tictac/tictac.php:181
+#: ../../addon/tictac/tictac.php:187
msgid "I'm going first this time..."
msgstr ""
-#: ../../addon/tictac/tictac.php:187
+#: ../../addon/tictac/tictac.php:193
msgid "You won!"
msgstr ""
-#: ../../addon/tictac/tictac.php:193 ../../addon/tictac/tictac.php:218
+#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
msgid "\"Cat\" game!"
msgstr ""
-#: ../../addon/tictac/tictac.php:216
+#: ../../addon/tictac/tictac.php:222
msgid "I won!"
msgstr ""
-#: ../../addon/randplace/randplace.php:171
+#: ../../addon/randplace/randplace.php:170
msgid "Randplace Settings"
msgstr ""
-#: ../../addon/randplace/randplace.php:173
+#: ../../addon/randplace/randplace.php:172
msgid "Enable Randplace Plugin"
msgstr ""
-#: ../../addon/java_upload/java_upload.php:33
-msgid "Select files to upload: "
-msgstr ""
-
-#: ../../addon/java_upload/java_upload.php:35
-msgid ""
-"Use the following controls only if the Java uploader [above] fails to launch."
-msgstr ""
-
-#: ../../addon/js_upload/js_upload.php:39
+#: ../../addon/js_upload/js_upload.php:43
msgid "Upload a file"
msgstr ""
-#: ../../addon/js_upload/js_upload.php:40
+#: ../../addon/js_upload/js_upload.php:44
msgid "Drop files here to upload"
msgstr ""
-#: ../../addon/js_upload/js_upload.php:42
+#: ../../addon/js_upload/js_upload.php:46
msgid "Failed"
msgstr ""
-#: ../../addon/js_upload/js_upload.php:288
+#: ../../addon/js_upload/js_upload.php:292
msgid "No files were uploaded."
msgstr ""
-#: ../../addon/js_upload/js_upload.php:294
+#: ../../addon/js_upload/js_upload.php:298
msgid "Uploaded file is empty"
msgstr ""
-#: ../../addon/js_upload/js_upload.php:299
-msgid "Uploaded file is too large"
-msgstr ""
-
-#: ../../addon/js_upload/js_upload.php:317
+#: ../../addon/js_upload/js_upload.php:321
msgid "File has an invalid extension, it should be one of "
msgstr ""
-#: ../../addon/js_upload/js_upload.php:328
+#: ../../addon/js_upload/js_upload.php:332
msgid "Upload was cancelled, or server error encountered"
msgstr ""
-#: ../../addon/oembed/oembed.php:29
+#: ../../addon/impressum/impressum.php:25
+msgid "Impressum"
+msgstr ""
+
+#: ../../addon/impressum/impressum.php:38
+#: ../../addon/impressum/impressum.php:40
+#: ../../addon/impressum/impressum.php:70
+msgid "Site Owner"
+msgstr ""
+
+#: ../../addon/impressum/impressum.php:38
+#: ../../addon/impressum/impressum.php:74
+msgid "Email Address"
+msgstr ""
+
+#: ../../addon/impressum/impressum.php:43
+#: ../../addon/impressum/impressum.php:72
+msgid "Postal Address"
+msgstr ""
+
+#: ../../addon/impressum/impressum.php:49
+msgid ""
+"The impressum addon needs to be configured!<br />Please add at least the "
+"<tt>owner</tt> variable to your config file. For other variables please "
+"refer to the README file of the addon."
+msgstr ""
+
+#: ../../addon/impressum/impressum.php:71
+msgid "Site Owners Profile"
+msgstr ""
+
+#: ../../addon/impressum/impressum.php:73
+msgid "Notes"
+msgstr ""
+
+#: ../../addon/oembed/oembed.php:30
msgid "OEmbed settings updated"
msgstr ""
-#: ../../addon/oembed/oembed.php:42
-msgid "Use OEmbed for YouTube videos: "
+#: ../../addon/oembed/oembed.php:43
+msgid "Use OEmbed for YouTube videos"
msgstr ""
-#: ../../addon/oembed/oembed.php:76
+#: ../../addon/oembed/oembed.php:71
msgid "URL to embed:"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:78
+#: ../../addon/statusnet/statusnet.php:133
msgid "Post to StatusNet"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:117
+#: ../../addon/statusnet/statusnet.php:175
msgid ""
"Please contact your site administrator.<br />The provided API URL is not "
"valid."
msgstr ""
-#: ../../addon/statusnet/statusnet.php:145
+#: ../../addon/statusnet/statusnet.php:203
msgid "We could not contact the StatusNet API with the Path you entered."
msgstr ""
-#: ../../addon/statusnet/statusnet.php:172
+#: ../../addon/statusnet/statusnet.php:230
msgid "StatusNet settings updated."
msgstr ""
-#: ../../addon/statusnet/statusnet.php:195
+#: ../../addon/statusnet/statusnet.php:253
msgid "StatusNet Posting Settings"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:209
+#: ../../addon/statusnet/statusnet.php:267
msgid "Globally Available StatusNet OAuthKeys"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:210
+#: ../../addon/statusnet/statusnet.php:268
msgid ""
"There are preconfigured OAuth key pairs for some StatusNet servers "
"available. If you are useing one of them, please use these credentials. If "
"not feel free to connect to any other StatusNet instance (see below)."
msgstr ""
-#: ../../addon/statusnet/statusnet.php:218
+#: ../../addon/statusnet/statusnet.php:276
msgid "Provide your own OAuth Credentials"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:219
+#: ../../addon/statusnet/statusnet.php:277
msgid ""
"No consumer key pair for StatusNet found. Register your Friendika Account as "
"an desktop client on your StatusNet account, copy the consumer key pair here "
@@ -2687,19 +3366,19 @@ msgid ""
"installation at your favorited StatusNet installation."
msgstr ""
-#: ../../addon/statusnet/statusnet.php:221
+#: ../../addon/statusnet/statusnet.php:279
msgid "OAuth Consumer Key"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:224
+#: ../../addon/statusnet/statusnet.php:282
msgid "OAuth Consumer Secret"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:227
+#: ../../addon/statusnet/statusnet.php:285
msgid "Base API Path (remember the trailing /)"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:248
+#: ../../addon/statusnet/statusnet.php:306
msgid ""
"To connect to your StatusNet account click the button below to get a "
"security code from StatusNet which you have to copy into the input box below "
@@ -2707,63 +3386,92 @@ msgid ""
"to StatusNet."
msgstr ""
-#: ../../addon/statusnet/statusnet.php:249
+#: ../../addon/statusnet/statusnet.php:307
msgid "Log in with StatusNet"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:251
+#: ../../addon/statusnet/statusnet.php:309
msgid "Copy the security code from StatusNet here"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:257
+#: ../../addon/statusnet/statusnet.php:315
msgid "Cancel Connection Process"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:259
+#: ../../addon/statusnet/statusnet.php:317
msgid "Current StatusNet API is"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:260
+#: ../../addon/statusnet/statusnet.php:318
msgid "Cancel StatusNet Connection"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:271 ../../addon/twitter/twitter.php:165
+#: ../../addon/statusnet/statusnet.php:329 ../../addon/twitter/twitter.php:180
msgid "Currently connected to: "
msgstr ""
-#: ../../addon/statusnet/statusnet.php:272
+#: ../../addon/statusnet/statusnet.php:330
msgid ""
-"If enabled all your <strong>public</strong> postings will be posted to the "
-"associated StatusNet account."
+"If enabled all your <strong>public</strong> postings can be posted to the "
+"associated StatusNet account. You can choose to do so by default (here) or "
+"for every posting separately in the posting options when writing the entry."
msgstr ""
-#: ../../addon/statusnet/statusnet.php:274
+#: ../../addon/statusnet/statusnet.php:332
msgid "Allow posting to StatusNet"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:277
+#: ../../addon/statusnet/statusnet.php:335
msgid "Send public postings to StatusNet by default"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:282 ../../addon/twitter/twitter.php:172
+#: ../../addon/statusnet/statusnet.php:340 ../../addon/twitter/twitter.php:191
msgid "Clear OAuth configuration"
msgstr ""
-#: ../../addon/twitter/twitter.php:64
+#: ../../addon/statusnet/statusnet.php:460
+msgid "API URL"
+msgstr ""
+
+#: ../../addon/statusnet/statusnet.php:461
+msgid "Consumer Secret"
+msgstr ""
+
+#: ../../addon/statusnet/statusnet.php:462
+msgid "Consumer Key"
+msgstr ""
+
+#: ../../addon/piwik/piwik.php:77
+msgid "Piwik Base URL"
+msgstr ""
+
+#: ../../addon/piwik/piwik.php:78
+msgid "Site ID"
+msgstr ""
+
+#: ../../addon/piwik/piwik.php:79
+msgid "Show opt-out cookie link?"
+msgstr ""
+
+#: ../../addon/twitter/twitter.php:70
msgid "Post to Twitter"
msgstr ""
-#: ../../addon/twitter/twitter.php:122
+#: ../../addon/twitter/twitter.php:115
+msgid "Twitter settings updated."
+msgstr ""
+
+#: ../../addon/twitter/twitter.php:137
msgid "Twitter Posting Settings"
msgstr ""
-#: ../../addon/twitter/twitter.php:129
+#: ../../addon/twitter/twitter.php:144
msgid ""
"No consumer key pair for Twitter found. Please contact your site "
"administrator."
msgstr ""
-#: ../../addon/twitter/twitter.php:148
+#: ../../addon/twitter/twitter.php:163
msgid ""
"At this Friendika instance the Twitter plugin was enabled but you have not "
"yet connected your account to your Twitter account. To do so click the "
@@ -2772,29 +3480,42 @@ msgid ""
"be posted to Twitter."
msgstr ""
-#: ../../addon/twitter/twitter.php:149
+#: ../../addon/twitter/twitter.php:164
msgid "Log in with Twitter"
msgstr ""
-#: ../../addon/twitter/twitter.php:151
+#: ../../addon/twitter/twitter.php:166
msgid "Copy the PIN from Twitter here"
msgstr ""
-#: ../../addon/twitter/twitter.php:166
+#: ../../addon/twitter/twitter.php:181
msgid ""
-"If enabled all your <strong>public</strong> postings will be posted to the "
-"associated Twitter account as well."
+"If enabled all your <strong>public</strong> postings can be posted to the "
+"associated Twitter account. You can choose to do so by default (here) or for "
+"every posting separately in the posting options when writing the entry."
+msgstr ""
+
+#: ../../addon/twitter/twitter.php:183
+msgid "Allow posting to Twitter"
msgstr ""
-#: ../../addon/twitter/twitter.php:168
-msgid "Send public postings to Twitter"
+#: ../../addon/twitter/twitter.php:186
+msgid "Send public postings to Twitter by default"
msgstr ""
-#: ../../include/profile_advanced.php:23 ../../boot.php:2356
+#: ../../addon/twitter/twitter.php:282
+msgid "Consumer key"
+msgstr ""
+
+#: ../../addon/twitter/twitter.php:283
+msgid "Consumer secret"
+msgstr ""
+
+#: ../../include/profile_advanced.php:23 ../../boot.php:880
msgid "Gender:"
msgstr ""
-#: ../../include/profile_advanced.php:36 ../../include/items.php:1086
+#: ../../include/profile_advanced.php:36 ../../include/items.php:1137
msgid "Birthday:"
msgstr ""
@@ -2814,7 +3535,7 @@ msgstr ""
msgid "<span class=\"heart\">&hearts;</span> Status:"
msgstr ""
-#: ../../include/profile_advanced.php:103 ../../boot.php:2362
+#: ../../include/profile_advanced.php:103 ../../boot.php:886
msgid "Homepage:"
msgstr ""
@@ -3122,6 +3843,133 @@ msgstr ""
msgid "Ask me"
msgstr ""
+#: ../../include/event.php:11
+msgid "l F d, Y \\@ g:i A"
+msgstr ""
+
+#: ../../include/event.php:17
+msgid "Starts:"
+msgstr ""
+
+#: ../../include/event.php:27
+msgid "Finishes:"
+msgstr ""
+
+#: ../../include/text.php:229
+msgid "prev"
+msgstr ""
+
+#: ../../include/text.php:231
+msgid "first"
+msgstr ""
+
+#: ../../include/text.php:260
+msgid "last"
+msgstr ""
+
+#: ../../include/text.php:263
+msgid "next"
+msgstr ""
+
+#: ../../include/text.php:542
+msgid "No contacts"
+msgstr ""
+
+#: ../../include/text.php:550
+#, php-format
+msgid "%d Contact"
+msgid_plural "%d Contacts"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/text.php:711
+msgid "Monday"
+msgstr ""
+
+#: ../../include/text.php:711
+msgid "Tuesday"
+msgstr ""
+
+#: ../../include/text.php:711
+msgid "Wednesday"
+msgstr ""
+
+#: ../../include/text.php:711
+msgid "Thursday"
+msgstr ""
+
+#: ../../include/text.php:711
+msgid "Friday"
+msgstr ""
+
+#: ../../include/text.php:711
+msgid "Saturday"
+msgstr ""
+
+#: ../../include/text.php:711
+msgid "Sunday"
+msgstr ""
+
+#: ../../include/text.php:715
+msgid "January"
+msgstr ""
+
+#: ../../include/text.php:715
+msgid "February"
+msgstr ""
+
+#: ../../include/text.php:715
+msgid "March"
+msgstr ""
+
+#: ../../include/text.php:715
+msgid "April"
+msgstr ""
+
+#: ../../include/text.php:715
+msgid "May"
+msgstr ""
+
+#: ../../include/text.php:715
+msgid "June"
+msgstr ""
+
+#: ../../include/text.php:715
+msgid "July"
+msgstr ""
+
+#: ../../include/text.php:715
+msgid "August"
+msgstr ""
+
+#: ../../include/text.php:715
+msgid "September"
+msgstr ""
+
+#: ../../include/text.php:715
+msgid "October"
+msgstr ""
+
+#: ../../include/text.php:715
+msgid "November"
+msgstr ""
+
+#: ../../include/text.php:715
+msgid "December"
+msgstr ""
+
+#: ../../include/text.php:778
+msgid "bytes"
+msgstr ""
+
+#: ../../include/text.php:861
+msgid "Select an alternate language"
+msgstr ""
+
+#: ../../include/diaspora.php:309
+msgid "Sharing notification from Diaspora network"
+msgstr ""
+
#: ../../include/oembed.php:95
msgid "Embedding disabled"
msgstr ""
@@ -3134,40 +3982,108 @@ msgstr ""
msgid "Everybody"
msgstr ""
-#: ../../include/nav.php:41 ../../boot.php:865
+#: ../../include/nav.php:41 ../../boot.php:667
msgid "Logout"
msgstr ""
-#: ../../include/nav.php:44 ../../boot.php:843 ../../boot.php:849
+#: ../../include/nav.php:41
+msgid "End this session"
+msgstr ""
+
+#: ../../include/nav.php:44 ../../boot.php:645 ../../boot.php:651
msgid "Login"
msgstr ""
-#: ../../include/nav.php:55 ../../include/nav.php:92
+#: ../../include/nav.php:44
+msgid "Sign in"
+msgstr ""
+
+#: ../../include/nav.php:55 ../../include/nav.php:93
msgid "Home"
msgstr ""
-#: ../../include/nav.php:68
+#: ../../include/nav.php:55
+msgid "Home Page"
+msgstr ""
+
+#: ../../include/nav.php:59
+msgid "Create an account"
+msgstr ""
+
+#: ../../include/nav.php:64
+msgid "Help and documentation"
+msgstr ""
+
+#: ../../include/nav.php:67
msgid "Apps"
msgstr ""
-#: ../../include/nav.php:80
+#: ../../include/nav.php:67
+msgid "Addon applications, utilities, games"
+msgstr ""
+
+#: ../../include/nav.php:69
+msgid "Search site content"
+msgstr ""
+
+#: ../../include/nav.php:79
+msgid "Conversations on this site"
+msgstr ""
+
+#: ../../include/nav.php:81
msgid "Directory"
msgstr ""
-#: ../../include/nav.php:90
+#: ../../include/nav.php:81
+msgid "People directory"
+msgstr ""
+
+#: ../../include/nav.php:91
msgid "Network"
msgstr ""
-#: ../../include/nav.php:98
+#: ../../include/nav.php:91
+msgid "Conversations from your friends"
+msgstr ""
+
+#: ../../include/nav.php:93
+msgid "Your posts and conversations"
+msgstr ""
+
+#: ../../include/nav.php:99
msgid "Notifications"
msgstr ""
-#: ../../include/nav.php:104
+#: ../../include/nav.php:99
+msgid "Friend requests"
+msgstr ""
+
+#: ../../include/nav.php:102
+msgid "Private mail"
+msgstr ""
+
+#: ../../include/nav.php:105
msgid "Manage"
msgstr ""
-#: ../../include/nav.php:107
-msgid "Settings"
+#: ../../include/nav.php:105
+msgid "Manage other pages"
+msgstr ""
+
+#: ../../include/nav.php:109
+msgid "Manage/edit profiles"
+msgstr ""
+
+#: ../../include/nav.php:110
+msgid "Manage/edit friends and contacts"
+msgstr ""
+
+#: ../../include/nav.php:117
+msgid "Admin"
+msgstr ""
+
+#: ../../include/nav.php:117
+msgid "Site setup and configuration"
msgstr ""
#: ../../include/auth.php:27
@@ -3178,71 +4094,79 @@ msgstr ""
msgid "Miscellaneous"
msgstr ""
-#: ../../include/datetime.php:148
-msgid "less than a second ago"
+#: ../../include/datetime.php:105 ../../include/datetime.php:237
+msgid "year"
msgstr ""
-#: ../../include/datetime.php:151
-msgid "year"
+#: ../../include/datetime.php:110 ../../include/datetime.php:238
+msgid "month"
msgstr ""
-#: ../../include/datetime.php:151
-msgid "years"
+#: ../../include/datetime.php:115 ../../include/datetime.php:240
+msgid "day"
msgstr ""
-#: ../../include/datetime.php:152
-msgid "month"
+#: ../../include/datetime.php:228
+msgid "never"
+msgstr ""
+
+#: ../../include/datetime.php:234
+msgid "less than a second ago"
msgstr ""
-#: ../../include/datetime.php:152
+#: ../../include/datetime.php:237
+msgid "years"
+msgstr ""
+
+#: ../../include/datetime.php:238
msgid "months"
msgstr ""
-#: ../../include/datetime.php:153
+#: ../../include/datetime.php:239
msgid "week"
msgstr ""
-#: ../../include/datetime.php:153
+#: ../../include/datetime.php:239
msgid "weeks"
msgstr ""
-#: ../../include/datetime.php:154
-msgid "day"
+#: ../../include/datetime.php:240
+msgid "days"
msgstr ""
-#: ../../include/datetime.php:155
+#: ../../include/datetime.php:241
msgid "hour"
msgstr ""
-#: ../../include/datetime.php:155
+#: ../../include/datetime.php:241
msgid "hours"
msgstr ""
-#: ../../include/datetime.php:156
+#: ../../include/datetime.php:242
msgid "minute"
msgstr ""
-#: ../../include/datetime.php:156
+#: ../../include/datetime.php:242
msgid "minutes"
msgstr ""
-#: ../../include/datetime.php:157
+#: ../../include/datetime.php:243
msgid "second"
msgstr ""
-#: ../../include/datetime.php:157
+#: ../../include/datetime.php:243
msgid "seconds"
msgstr ""
-#: ../../include/datetime.php:164
+#: ../../include/datetime.php:250
msgid " ago"
msgstr ""
-#: ../../include/poller.php:380
+#: ../../include/poller.php:418
msgid "From: "
msgstr ""
-#: ../../include/bbcode.php:83
+#: ../../include/bbcode.php:116
msgid "Image/photo"
msgstr ""
@@ -3251,327 +4175,229 @@ msgstr ""
msgid "Cannot locate DNS info for database server '%s'"
msgstr ""
-#: ../../include/acl_selectors.php:133
-msgid "Visible To:"
-msgstr ""
-
-#: ../../include/acl_selectors.php:133
-msgid "everybody"
+#: ../../include/acl_selectors.php:279
+msgid "Visible to everybody"
msgstr ""
-#: ../../include/acl_selectors.php:137 ../../include/acl_selectors.php:152
-msgid "Groups"
+#: ../../include/acl_selectors.php:280
+msgid "show"
msgstr ""
-#: ../../include/acl_selectors.php:148
-msgid "Except For:"
+#: ../../include/acl_selectors.php:281
+msgid "don't show"
msgstr ""
-#: ../../include/notifier.php:414
+#: ../../include/notifier.php:465
msgid "(no subject)"
msgstr ""
-#: ../../include/items.php:1447
+#: ../../include/items.php:1526
msgid "You have a new follower at "
msgstr ""
-#: ../../include/conversation.php:191 ../../include/conversation.php:451
-#: ../../include/conversation.php:452
+#: ../../include/conversation.php:23
+msgid "event"
+msgstr ""
+
+#: ../../include/conversation.php:213 ../../include/conversation.php:488
+#: ../../include/conversation.php:489
#, php-format
msgid "View %s's profile"
msgstr ""
-#: ../../include/conversation.php:207
+#: ../../include/conversation.php:222 ../../include/conversation.php:501
+#, php-format
+msgid "%s from %s"
+msgstr ""
+
+#: ../../include/conversation.php:230
msgid "View in context"
msgstr ""
-#: ../../include/conversation.php:278
+#: ../../include/conversation.php:301
msgid "See more posts like this"
msgstr ""
-#: ../../include/conversation.php:303
+#: ../../include/conversation.php:329
#, php-format
msgid "See all %d comments"
msgstr ""
-#: ../../include/conversation.php:453
+#: ../../include/conversation.php:427
+msgid "Select"
+msgstr ""
+
+#: ../../include/conversation.php:429
+msgid "toggle star status"
+msgstr ""
+
+#: ../../include/conversation.php:490
msgid "to"
msgstr ""
-#: ../../include/conversation.php:454
+#: ../../include/conversation.php:491
msgid "Wall-to-Wall"
msgstr ""
-#: ../../include/conversation.php:455
+#: ../../include/conversation.php:492
msgid "via Wall-To-Wall:"
msgstr ""
-#: ../../include/conversation.php:593
+#: ../../include/conversation.php:534
+msgid "Delete Selected Items"
+msgstr ""
+
+#: ../../include/conversation.php:608
msgid "View status"
msgstr ""
-#: ../../include/conversation.php:594
+#: ../../include/conversation.php:609
msgid "View profile"
msgstr ""
-#: ../../include/conversation.php:595
+#: ../../include/conversation.php:610
msgid "View photos"
msgstr ""
-#: ../../include/conversation.php:596
+#: ../../include/conversation.php:611
msgid "View recent"
msgstr ""
-#: ../../include/conversation.php:598
+#: ../../include/conversation.php:613
msgid "Send PM"
msgstr ""
-#: ../../include/conversation.php:648
+#: ../../include/conversation.php:663
#, php-format
msgid "%s likes this."
msgstr ""
-#: ../../include/conversation.php:648
+#: ../../include/conversation.php:663
#, php-format
msgid "%s doesn't like this."
msgstr ""
-#: ../../include/conversation.php:652
+#: ../../include/conversation.php:667
#, php-format
msgid "<span %1$s>%2$d people</span> like this."
msgstr ""
-#: ../../include/conversation.php:654
+#: ../../include/conversation.php:669
#, php-format
msgid "<span %1$s>%2$d people</span> don't like this."
msgstr ""
-#: ../../include/conversation.php:660
+#: ../../include/conversation.php:675
msgid "and"
msgstr ""
-#: ../../include/conversation.php:663
+#: ../../include/conversation.php:678
#, php-format
msgid ", and %d other people"
msgstr ""
-#: ../../include/conversation.php:664
+#: ../../include/conversation.php:679
#, php-format
msgid "%s like this."
msgstr ""
-#: ../../include/conversation.php:664
+#: ../../include/conversation.php:679
#, php-format
msgid "%s don't like this."
msgstr ""
-#: ../../include/conversation.php:683
+#: ../../include/conversation.php:698
msgid "Visible to <strong>everybody</strong>"
msgstr ""
-#: ../../include/conversation.php:685
+#: ../../include/conversation.php:700
msgid "Please enter a YouTube link:"
msgstr ""
-#: ../../include/conversation.php:686
+#: ../../include/conversation.php:701
msgid "Please enter a video(.ogg) link/URL:"
msgstr ""
-#: ../../include/conversation.php:687
+#: ../../include/conversation.php:702
msgid "Please enter an audio(.ogg) link/URL:"
msgstr ""
-#: ../../include/conversation.php:688
+#: ../../include/conversation.php:703
msgid "Where are you right now?"
msgstr ""
-#: ../../include/conversation.php:689
+#: ../../include/conversation.php:704
msgid "Enter a title for this item"
msgstr ""
-#: ../../include/conversation.php:740
+#: ../../include/conversation.php:755
msgid "Set title"
msgstr ""
-#: ../../boot.php:385
+#: ../../boot.php:410
msgid "Delete this item?"
msgstr ""
-#: ../../boot.php:834
+#: ../../boot.php:636
msgid "Create a New Account"
msgstr ""
-#: ../../boot.php:841
+#: ../../boot.php:643
msgid "Nickname or Email address: "
msgstr ""
-#: ../../boot.php:842
+#: ../../boot.php:644
msgid "Password: "
msgstr ""
-#: ../../boot.php:847
+#: ../../boot.php:649
msgid "Nickname/Email/OpenID: "
msgstr ""
-#: ../../boot.php:848
+#: ../../boot.php:650
msgid "Password (if not OpenID): "
msgstr ""
-#: ../../boot.php:851
+#: ../../boot.php:653
msgid "Forgot your password?"
msgstr ""
-#: ../../boot.php:1113
-msgid "prev"
-msgstr ""
-
-#: ../../boot.php:1115
-msgid "first"
-msgstr ""
-
-#: ../../boot.php:1144
-msgid "last"
-msgstr ""
-
-#: ../../boot.php:1147
-msgid "next"
-msgstr ""
-
-#: ../../boot.php:2046
-msgid "No contacts"
-msgstr ""
-
-#: ../../boot.php:2054
-#, php-format
-msgid "%d Contact"
-msgid_plural "%d Contacts"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../boot.php:2329
+#: ../../boot.php:853
msgid "Connect"
msgstr ""
-#: ../../boot.php:2344
-msgid "Location:"
-msgstr ""
-
-#: ../../boot.php:2348
+#: ../../boot.php:872
msgid ", "
msgstr ""
-#: ../../boot.php:2360
+#: ../../boot.php:884
msgid "Status:"
msgstr ""
-#: ../../boot.php:2457
-msgid "Monday"
-msgstr ""
-
-#: ../../boot.php:2457
-msgid "Tuesday"
-msgstr ""
-
-#: ../../boot.php:2457
-msgid "Wednesday"
-msgstr ""
-
-#: ../../boot.php:2457
-msgid "Thursday"
-msgstr ""
-
-#: ../../boot.php:2457
-msgid "Friday"
-msgstr ""
-
-#: ../../boot.php:2457
-msgid "Saturday"
-msgstr ""
-
-#: ../../boot.php:2457
-msgid "Sunday"
-msgstr ""
-
-#: ../../boot.php:2461
-msgid "January"
-msgstr ""
-
-#: ../../boot.php:2461
-msgid "February"
-msgstr ""
-
-#: ../../boot.php:2461
-msgid "March"
-msgstr ""
-
-#: ../../boot.php:2461
-msgid "April"
-msgstr ""
-
-#: ../../boot.php:2461
-msgid "May"
-msgstr ""
-
-#: ../../boot.php:2461
-msgid "June"
-msgstr ""
-
-#: ../../boot.php:2461
-msgid "July"
-msgstr ""
-
-#: ../../boot.php:2461
-msgid "August"
-msgstr ""
-
-#: ../../boot.php:2461
-msgid "September"
-msgstr ""
-
-#: ../../boot.php:2461
-msgid "October"
-msgstr ""
-
-#: ../../boot.php:2461
-msgid "November"
-msgstr ""
-
-#: ../../boot.php:2461
-msgid "December"
-msgstr ""
-
-#: ../../boot.php:2476
+#: ../../boot.php:975
msgid "g A l F d"
msgstr ""
-#: ../../boot.php:2494
+#: ../../boot.php:993
msgid "Birthday Reminders"
msgstr ""
-#: ../../boot.php:2495
+#: ../../boot.php:994
msgid "Birthdays this week:"
msgstr ""
-#: ../../boot.php:2496
+#: ../../boot.php:995
msgid "(Adjusted for local time)"
msgstr ""
-#: ../../boot.php:2507
+#: ../../boot.php:1006
msgid "[today]"
msgstr ""
-#: ../../boot.php:2570
-msgid "bytes"
-msgstr ""
-
-#: ../../boot.php:2744
-msgid "link to source"
-msgstr ""
-
-#: ../../index.php:199
+#: ../../index.php:209
msgid "Not Found"
msgstr ""
-#: ../../index.php:200
+#: ../../index.php:210
msgid "Page not found."
msgstr ""
diff --git a/util/strings.php b/util/strings.php
index a9591b0c2..d0e36217b 100644
--- a/util/strings.php
+++ b/util/strings.php
@@ -1,1391 +1,1033 @@
<?php
-function string_plural_select($n){
- return ($n != 1);
-}
-
-$a->strings['Not Found'] = 'Not Found';
-$a->strings['Page not found.' ] = 'Page not found.' ;
-$a->strings['Permission denied'] = 'Permission denied';
-$a->strings['Permission denied.'] = 'Permission denied.';
-$a->strings['Delete this item?'] = 'Delete this item?';
-$a->strings['Comment'] = 'Comment';
-$a->strings['Create a New Account'] = 'Create a New Account';
-$a->strings['Register'] = 'Register';
-$a->strings['Nickname or Email address: '] = 'Nickname or Email address: ';
-$a->strings['Password: '] = 'Password: ';
-$a->strings['Login'] = 'Login';
-$a->strings['Nickname/Email/OpenID: '] = 'Nickname/Email/OpenID: ';
-$a->strings["Password \x28if not OpenID\x29: "] = "Password \x28if not OpenID\x29: ";
-$a->strings['Forgot your password?'] = 'Forgot your password?';
-$a->strings['Password Reset'] = 'Password Reset';
-$a->strings['Logout'] = 'Logout';
-$a->strings['prev'] = 'prev';
-$a->strings['first'] = 'first';
-$a->strings['last'] = 'last';
-$a->strings['next'] = 'next';
-$a->strings['No contacts'] = 'No contacts';
-$a->strings['View Contacts'] = 'View Contacts';
-$a->strings['Search'] = 'Search';
-$a->strings['No profile'] = 'No profile';
-$a->strings['Connect'] = 'Connect';
-$a->strings['Location:'] = 'Location:';
-$a->strings[', '] = ', ';
-$a->strings['Gender:'] = 'Gender:';
-$a->strings['Status:'] = 'Status:';
-$a->strings['Homepage:'] = 'Homepage:';
-$a->strings['Monday'] = 'Monday';
-$a->strings['Tuesday'] = 'Tuesday';
-$a->strings['Wednesday'] = 'Wednesday';
-$a->strings['Thursday'] = 'Thursday';
-$a->strings['Friday'] = 'Friday';
-$a->strings['Saturday'] = 'Saturday';
-$a->strings['Sunday'] = 'Sunday';
-$a->strings['January'] = 'January';
-$a->strings['February'] = 'February';
-$a->strings['March'] = 'March';
-$a->strings['April'] = 'April';
-$a->strings['May'] = 'May';
-$a->strings['June'] = 'June';
-$a->strings['July'] = 'July';
-$a->strings['August'] = 'August';
-$a->strings['September'] = 'September';
-$a->strings['October'] = 'October';
-$a->strings['November'] = 'November';
-$a->strings['December'] = 'December';
-$a->strings['g A l F d'] = 'g A l F d';
-$a->strings['Birthday Reminders'] = 'Birthday Reminders';
-$a->strings['Birthdays this week:'] = 'Birthdays this week:';
-$a->strings["\x28Adjusted for local time\x29"] = "\x28Adjusted for local time\x29";
-$a->strings['[today]'] = '[today]';
-$a->strings['bytes'] = 'bytes';
-$a->strings['link to source'] = 'link to source';
-$a->strings['%d Contact'] = array(
- 0 => '%d Contact',
- 1 => '%d Contacts',
-);
-$a->strings['Applications'] = 'Applications';
-$a->strings['Private Notes'] = 'Private Notes';
-$a->strings['Item not available.'] = 'Item not available.';
-$a->strings['Item was not found.'] = 'Item was not found.';
-$a->strings["Invite Friends"] = "Invite Friends";
-$a->strings['Find People With Shared Interests'] = 'Find People With Shared Interests';
-$a->strings['Connect/Follow'] = 'Connect/Follow';
-$a->strings['Example: bob@example.com, http://example.com/barbara'] = 'Example: bob@example.com, http://example.com/barbara';
-$a->strings['Follow'] = 'Follow';
-$a->strings['Could not access contact record.'] = 'Could not access contact record.';
-$a->strings['Could not locate selected profile.'] = 'Could not locate selected profile.';
-$a->strings['Contact updated.'] = 'Contact updated.';
-$a->strings['Failed to update contact record.'] = 'Failed to update contact record.';
-$a->strings['Contact has been '] = 'Contact has been ';
-$a->strings['blocked'] = 'blocked';
-$a->strings['unblocked'] = 'unblocked';
-$a->strings['Contact has been blocked'] = 'Contact has been blocked';
-$a->strings['Contact has been unblocked'] = 'Contact has been unblocked';
-$a->strings['Contact has been ignored'] = 'Contact has been ignored';
-$a->strings['Contact has been unignored'] = 'Contact has been unignored';
-$a->strings['stopped following'] = 'stopped following';
-$a->strings['Contact has been removed.'] = 'Contact has been removed.';
-$a->strings['Contact not found.'] = 'Contact not found.';
-$a->strings['Mutual Friendship'] = 'Mutual Friendship';
-$a->strings['is a fan of yours'] = 'is a fan of yours';
-$a->strings['you are a fan of'] = 'you are a fan of';
-$a->strings['Privacy Unavailable'] = 'Privacy Unavailable';
-$a->strings['Private communications are not available for this contact.'] = 'Private communications are not available for this contact.';
-$a->strings['Never'] = 'Never';
-$a->strings["\x28Update was successful\x29"] = "\x28Update was successful\x29";
-$a->strings["\x28Update was not successful\x29"] = "\x28Update was not successful\x29";
-$a->strings['Contact Editor'] = 'Contact Editor';
-$a->strings['Submit'] = 'Submit';
-$a->strings['Profile Visibility'] = 'Profile Visibility';
-$a->strings['Please choose the profile you would like to display to %s when viewing your profile securely.'] = 'Please choose the profile you would like to display to %s when viewing your profile securely.';
-$a->strings['Contact Information / Notes'] = 'Contact Information / Notes';
-$a->strings['Online Reputation'] = 'Online Reputation';
-$a->strings['Occasionally your friends may wish to inquire about this person\'s online legitimacy.'] = 'Occasionally your friends may wish to inquire about this person\'s online legitimacy.';
-$a->strings['You may help them choose whether or not to interact with this person by providing a <em>reputation</em> to guide them.'] = 'You may help them choose whether or not to interact with this person by providing a <em>reputation</em> to guide them.';
-$a->strings['Please take a moment to elaborate on this selection if you feel it could be helpful to others.'] = 'Please take a moment to elaborate on this selection if you feel it could be helpful to others.';
-$a->strings['Visit $name\'s profile'] = 'Visit $name\'s profile';
-$a->strings['Block/Unblock contact'] = 'Block/Unblock contact';
-$a->strings['Ignore contact'] = 'Ignore contact';
-$a->strings['Repair contact URL settings'] = 'Repair contact URL settings';
-$a->strings["Repair contact URL settings \x28WARNING: Advanced\x29"] = "Repair contact URL settings \x28WARNING: Advanced\x29";
-$a->strings['View conversations'] = 'View conversations';
-$a->strings['Delete contact'] = 'Delete contact';
-$a->strings['Last updated: '] = 'Last updated: ';
-$a->strings['Update public posts: '] = 'Update public posts: ';
-$a->strings['Update now'] = 'Update now';
-$a->strings['Unblock this contact'] = 'Unblock this contact';
-$a->strings['Block this contact'] = 'Block this contact';
-$a->strings['Unignore this contact'] = 'Unignore this contact';
-$a->strings['Ignore this contact'] = 'Ignore this contact';
-$a->strings['Currently blocked'] = 'Currently blocked';
-$a->strings['Currently ignored'] = 'Currently ignored';
-$a->strings['Contacts'] = 'Contacts';
-$a->strings['Show Blocked Connections'] = 'Show Blocked Connections';
-$a->strings['Hide Blocked Connections'] = 'Hide Blocked Connections';
-$a->strings['Finding: '] = 'Finding: ';
-$a->strings['Find'] = 'Find';
-$a->strings['Visit $username\'s profile'] = 'Visit $username\'s profile';
-$a->strings['Edit contact'] = 'Edit contact';
-$a->strings['Contact settings applied.'] = 'Contact settings applied.';
-$a->strings['Contact update failed.'] = 'Contact update failed.';
-$a->strings['Repair Contact Settings'] = 'Repair Contact Settings';
-$a->strings['<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact will stop working.'] = '<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact will stop working.';
-$a->strings['Please use your browser \'Back\' button <strong>now</strong> if you are uncertain what to do on this page.'] = 'Please use your browser \'Back\' button <strong>now</strong> if you are uncertain what to do on this page.';
-$a->strings['Name'] = 'Name';
-$a->strings['Account Nickname'] = 'Account Nickname';
-$a->strings['Account URL'] = 'Account URL';
-$a->strings['Friend Request URL'] = 'Friend Request URL';
-$a->strings['Friend Confirm URL'] = 'Friend Confirm URL';
-$a->strings['Notification Endpoint URL'] = 'Notification Endpoint URL';
-$a->strings['Poll/Feed URL'] = 'Poll/Feed URL';
-$a->strings['Profile not found.'] = 'Profile not found.';
-$a->strings['Response from remote site was not understood.'] = 'Response from remote site was not understood.';
-$a->strings['Unexpected response from remote site: '] = 'Unexpected response from remote site: ';
-$a->strings["Confirmation completed successfully."] = "Confirmation completed successfully.";
-$a->strings['Remote site reported: '] = 'Remote site reported: ';
-$a->strings["Temporary failure. Please wait and try again."] = "Temporary failure. Please wait and try again.";
-$a->strings["Introduction failed or was revoked."] = "Introduction failed or was revoked.";
-$a->strings['Unable to set contact photo.'] = 'Unable to set contact photo.';
-$a->strings['%1$s is now friends with %2$s'] = '%1$s is now friends with %2$s';
-$a->strings['Our site encryption key is apparently messed up.'] = 'Our site encryption key is apparently messed up.';
-$a->strings['Empty site URL was provided or URL could not be decrypted by us.'] = 'Empty site URL was provided or URL could not be decrypted by us.';
-$a->strings['Contact record was not found for you on our site.'] = 'Contact record was not found for you on our site.';
-$a->strings['The ID provided by your system is a duplicate on our system. It should work if you try again.'] = 'The ID provided by your system is a duplicate on our system. It should work if you try again.';
-$a->strings['Unable to set your contact credentials on our system.'] = 'Unable to set your contact credentials on our system.';
-$a->strings['Unable to update your contact profile details on our system'] = 'Unable to update your contact profile details on our system';
-$a->strings["Connection accepted at %s"] = "Connection accepted at %s";
-$a->strings['Administrator'] = 'Administrator';
-$a->strings['noreply'] = 'noreply';
-$a->strings['%s commented on an item at %s'] = '%s commented on an item at %s';
-$a->strings["This introduction has already been accepted."] = "This introduction has already been accepted.";
-$a->strings['Profile location is not valid or does not contain profile information.'] = 'Profile location is not valid or does not contain profile information.';
-$a->strings['Warning: profile location has no identifiable owner name.'] = 'Warning: profile location has no identifiable owner name.';
-$a->strings['Warning: profile location has no profile photo.'] = 'Warning: profile location has no profile photo.';
-$a->strings["Introduction complete."] = "Introduction complete.";
-$a->strings['Unrecoverable protocol error.'] = 'Unrecoverable protocol error.';
-$a->strings['Profile unavailable.'] = 'Profile unavailable.';
-$a->strings['%s has received too many connection requests today.'] = '%s has received too many connection requests today.';
-$a->strings['Spam protection measures have been invoked.'] = 'Spam protection measures have been invoked.';
-$a->strings['Friends are advised to please try again in 24 hours.'] = 'Friends are advised to please try again in 24 hours.';
-$a->strings["Invalid locator"] = "Invalid locator";
-$a->strings["Unable to resolve your name at the provided location."] = "Unable to resolve your name at the provided location.";
-$a->strings['You have already introduced yourself here.'] = 'You have already introduced yourself here.';
-$a->strings['Apparently you are already friends with %s.'] = 'Apparently you are already friends with %s.';
-$a->strings['Invalid profile URL.'] = 'Invalid profile URL.';
-$a->strings['Disallowed profile URL.'] = 'Disallowed profile URL.';
-$a->strings['Your introduction has been sent.'] = 'Your introduction has been sent.';
-$a->strings["Please login to confirm introduction."] = "Please login to confirm introduction.";
-$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Incorrect identity currently logged in. Please login to <strong>this</strong> profile.";
-$a->strings['Welcome home %s.'] = 'Welcome home %s.';
-$a->strings['Please confirm your introduction/connection request to %s.'] = 'Please confirm your introduction/connection request to %s.';
-$a->strings['Confirm'] = 'Confirm';
-$a->strings['[Name Withheld]'] = '[Name Withheld]';
-$a->strings["Introduction received at "] = "Introduction received at ";
-$a->strings['Public access denied.'] = 'Public access denied.';
-$a->strings['Friend/Connection Request'] = 'Friend/Connection Request';
-$a->strings['Examples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, testuser@identi.ca'] = 'Examples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, testuser@identi.ca';
-$a->strings['Please answer the following:'] = 'Please answer the following:';
-$a->strings['Does $name know you?'] = 'Does $name know you?';
-$a->strings['Yes'] = 'Yes';
-$a->strings['No'] = 'No';
-$a->strings['Add a personal note:'] = 'Add a personal note:';
-$a->strings["Please enter your 'Identity Address' from one of the following supported social networks:"] = "Please enter your 'Identity Address' from one of the following supported social networks:";
-$a->strings['Friendika'] = 'Friendika';
-$a->strings['StatusNet/Federated Social Web'] = 'StatusNet/Federated Social Web';
-$a->strings["Private \x28secure\x29 network"] = "Private \x28secure\x29 network";
-$a->strings["Public \x28insecure\x29 network"] = "Public \x28insecure\x29 network";
-$a->strings['Your Identity Address:'] = 'Your Identity Address:';
-$a->strings['Submit Request'] = 'Submit Request';
-$a->strings['Cancel'] = 'Cancel';
+;
+$a->strings["Post successful."] = "";
+$a->strings["Contact settings applied."] = "";
+$a->strings["Contact update failed."] = "";
+$a->strings["Permission denied."] = "";
+$a->strings["Contact not found."] = "";
+$a->strings["Repair Contact Settings"] = "";
+$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact will stop working."] = "";
+$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "";
+$a->strings["Name"] = "";
+$a->strings["Account Nickname"] = "";
+$a->strings["Account URL"] = "";
+$a->strings["Friend Request URL"] = "";
+$a->strings["Friend Confirm URL"] = "";
+$a->strings["Notification Endpoint URL"] = "";
+$a->strings["Poll/Feed URL"] = "";
+$a->strings["Submit"] = "";
+$a->strings["Help:"] = "";
+$a->strings["Help"] = "";
+$a->strings["File exceeds size limit of %d"] = "";
+$a->strings["File upload failed."] = "";
+$a->strings["Friend suggestion sent."] = "";
+$a->strings["Suggest Friends"] = "";
+$a->strings["Suggest a friend for %s"] = "";
+$a->strings["Status"] = "";
+$a->strings["Profile"] = "";
+$a->strings["Photos"] = "";
+$a->strings["Events"] = "";
+$a->strings["Personal Notes"] = "";
+$a->strings["Create New Event"] = "";
+$a->strings["Previous"] = "";
+$a->strings["Next"] = "";
+$a->strings["l, F j"] = "";
+$a->strings["Edit event"] = "";
+$a->strings["link to source"] = "";
+$a->strings["hour:minute"] = "";
+$a->strings["Event details"] = "";
+$a->strings["Format is %s %s. Starting date and Description are required."] = "";
+$a->strings["Event Starts:"] = "";
+$a->strings["Finish date/time is not known or not relevant"] = "";
+$a->strings["Event Finishes:"] = "";
+$a->strings["Adjust for viewer timezone"] = "";
+$a->strings["Description:"] = "";
+$a->strings["Location:"] = "";
+$a->strings["Share this event"] = "";
+$a->strings["Cancel"] = "";
+$a->strings["Tag removed"] = "";
+$a->strings["Remove Item Tag"] = "";
+$a->strings["Select a tag to remove: "] = "";
+$a->strings["Remove"] = "";
+$a->strings["%s welcomes %s"] = "";
+$a->strings["Photo Albums"] = "";
+$a->strings["Contact Photos"] = "";
+$a->strings["everybody"] = "";
+$a->strings["Contact information unavailable"] = "";
+$a->strings["Profile Photos"] = "";
+$a->strings["Album not found."] = "";
+$a->strings["Delete Album"] = "";
+$a->strings["Delete Photo"] = "";
+$a->strings["was tagged in a"] = "";
+$a->strings["photo"] = "";
+$a->strings["by"] = "";
+$a->strings["Image exceeds size limit of "] = "";
+$a->strings["Image file is empty."] = "";
+$a->strings["Unable to process image."] = "";
+$a->strings["Image upload failed."] = "";
+$a->strings["Public access denied."] = "";
+$a->strings["No photos selected"] = "";
+$a->strings["Access to this item is restricted."] = "";
+$a->strings["Upload Photos"] = "";
+$a->strings["New album name: "] = "";
+$a->strings["or existing album name: "] = "";
+$a->strings["Permissions"] = "";
+$a->strings["Edit Album"] = "";
+$a->strings["View Photo"] = "";
+$a->strings["Photo not available"] = "";
+$a->strings["Edit photo"] = "";
+$a->strings["Use as profile photo"] = "";
+$a->strings["Private Message"] = "";
+$a->strings["View Full Size"] = "";
+$a->strings["Tags: "] = "";
+$a->strings["[Remove any tag]"] = "";
+$a->strings["New album name"] = "";
+$a->strings["Caption"] = "";
+$a->strings["Add a Tag"] = "";
+$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "";
+$a->strings["I like this (toggle)"] = "";
+$a->strings["I don't like this (toggle)"] = "";
+$a->strings["Share"] = "";
+$a->strings["Please wait"] = "";
+$a->strings["This is you"] = "";
+$a->strings["Comment"] = "";
+$a->strings["Delete"] = "";
+$a->strings["Recent Photos"] = "";
+$a->strings["Upload New Photos"] = "";
+$a->strings["View Album"] = "";
+$a->strings["Not available."] = "";
+$a->strings["Community"] = "";
+$a->strings["No results."] = "";
+$a->strings["Shared content is covered by the <a href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution 3.0</a> license."] = "";
+$a->strings["Item not found"] = "";
+$a->strings["Edit post"] = "";
+$a->strings["Post to Email"] = "";
+$a->strings["Edit"] = "";
+$a->strings["Upload photo"] = "";
+$a->strings["Attach file"] = "";
+$a->strings["Insert web link"] = "";
+$a->strings["Insert YouTube video"] = "";
+$a->strings["Insert Vorbis [.ogg] video"] = "";
+$a->strings["Insert Vorbis [.ogg] audio"] = "";
+$a->strings["Set your location"] = "";
+$a->strings["Clear browser location"] = "";
+$a->strings["Permission settings"] = "";
+$a->strings["CC: email addresses"] = "";
+$a->strings["Public post"] = "";
+$a->strings["Example: bob@example.com, mary@example.com"] = "";
+$a->strings["This introduction has already been accepted."] = "";
+$a->strings["Profile location is not valid or does not contain profile information."] = "";
+$a->strings["Warning: profile location has no identifiable owner name."] = "";
+$a->strings["Warning: profile location has no profile photo."] = "";
$a->strings["%d required parameter was not found at the given location"] = array(
- 0 => "%d required parameter was not found at the given location",
- 1 => "%d required parameters were not found at the given location",
+ 0 => "",
+ 1 => "",
+);
+$a->strings["Introduction complete."] = "";
+$a->strings["Unrecoverable protocol error."] = "";
+$a->strings["Profile unavailable."] = "";
+$a->strings["%s has received too many connection requests today."] = "";
+$a->strings["Spam protection measures have been invoked."] = "";
+$a->strings["Friends are advised to please try again in 24 hours."] = "";
+$a->strings["Invalid locator"] = "";
+$a->strings["Unable to resolve your name at the provided location."] = "";
+$a->strings["You have already introduced yourself here."] = "";
+$a->strings["Apparently you are already friends with %s."] = "";
+$a->strings["Invalid profile URL."] = "";
+$a->strings["Disallowed profile URL."] = "";
+$a->strings["Failed to update contact record."] = "";
+$a->strings["Your introduction has been sent."] = "";
+$a->strings["Please login to confirm introduction."] = "";
+$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "";
+$a->strings["Welcome home %s."] = "";
+$a->strings["Please confirm your introduction/connection request to %s."] = "";
+$a->strings["Confirm"] = "";
+$a->strings["[Name Withheld]"] = "";
+$a->strings["Introduction received at "] = "";
+$a->strings["Administrator"] = "";
+$a->strings["Friend/Connection Request"] = "";
+$a->strings["Examples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, testuser@identi.ca"] = "";
+$a->strings["Please answer the following:"] = "";
+$a->strings["Does %s know you?"] = "";
+$a->strings["Yes"] = "";
+$a->strings["No"] = "";
+$a->strings["Add a personal note:"] = "";
+$a->strings["Please enter your 'Identity Address' from one of the following supported social networks:"] = "";
+$a->strings["Friendika"] = "";
+$a->strings["StatusNet/Federated Social Web"] = "";
+$a->strings["Private (secure) network"] = "";
+$a->strings["Public (insecure) network"] = "";
+$a->strings["Your Identity Address:"] = "";
+$a->strings["Submit Request"] = "";
+$a->strings["Could not create/connect to database."] = "";
+$a->strings["Connected to database."] = "";
+$a->strings["Proceed with Installation"] = "";
+$a->strings["Your Friendika site database has been installed."] = "";
+$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "";
+$a->strings["Please see the file \"INSTALL.txt\"."] = "";
+$a->strings["Proceed to registration"] = "";
+$a->strings["Database import failed."] = "";
+$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "";
+$a->strings["Welcome to Friendika."] = "";
+$a->strings["Friendika Social Network"] = "";
+$a->strings["Installation"] = "";
+$a->strings["In order to install Friendika we need to know how to connect to your database."] = "";
+$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "";
+$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "";
+$a->strings["Database Server Name"] = "";
+$a->strings["Database Login Name"] = "";
+$a->strings["Database Login Password"] = "";
+$a->strings["Database Name"] = "";
+$a->strings["Please select a default timezone for your website"] = "";
+$a->strings["Site administrator email address. Your account email address must match this in order to use the web admin panel."] = "";
+$a->strings["Could not find a command line version of PHP in the web server PATH."] = "";
+$a->strings["This is required. Please adjust the configuration file .htconfig.php accordingly."] = "";
+$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "";
+$a->strings["This is required for message delivery to work."] = "";
+$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "";
+$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "";
+$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "";
+$a->strings["Error: libCURL PHP module required but not installed."] = "";
+$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "";
+$a->strings["Error: openssl PHP module required but not installed."] = "";
+$a->strings["Error: mysqli PHP module required but not installed."] = "";
+$a->strings["Error: mb_string PHP module required but not installed."] = "";
+$a->strings["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."] = "";
+$a->strings["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."] = "";
+$a->strings["Please check with your site documentation or support people to see if this situation can be corrected."] = "";
+$a->strings["If not, you may be required to perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "";
+$a->strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "";
+$a->strings["Errors encountered creating database tables."] = "";
+$a->strings["[Embedded content - reload page to view]"] = "";
+$a->strings["Profile Match"] = "";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "";
+$a->strings["No matches"] = "";
+$a->strings["Remote privacy information not available."] = "";
+$a->strings["Visible to:"] = "";
+$a->strings["Welcome to %s"] = "";
+$a->strings["Invalid request identifier."] = "";
+$a->strings["Discard"] = "";
+$a->strings["Ignore"] = "";
+$a->strings["Pending Friend/Connect Notifications"] = "";
+$a->strings["Show Ignored Requests"] = "";
+$a->strings["Hide Ignored Requests"] = "";
+$a->strings["Notification type: "] = "";
+$a->strings["Friend Suggestion"] = "";
+$a->strings["suggested by %s"] = "";
+$a->strings["Approve"] = "";
+$a->strings["Claims to be known to you: "] = "";
+$a->strings["yes"] = "";
+$a->strings["no"] = "";
+$a->strings["Approve as: "] = "";
+$a->strings["Friend"] = "";
+$a->strings["Fan/Admirer"] = "";
+$a->strings["Friend/Connect Request"] = "";
+$a->strings["New Follower"] = "";
+$a->strings["No notifications."] = "";
+$a->strings["Invite Friends"] = "";
+$a->strings["%d invitation available"] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["Find People With Shared Interests"] = "";
+$a->strings["Connect/Follow"] = "";
+$a->strings["Example: bob@example.com, http://example.com/barbara"] = "";
+$a->strings["Follow"] = "";
+$a->strings["Could not access contact record."] = "";
+$a->strings["Could not locate selected profile."] = "";
+$a->strings["Contact updated."] = "";
+$a->strings["Contact has been blocked"] = "";
+$a->strings["Contact has been unblocked"] = "";
+$a->strings["Contact has been ignored"] = "";
+$a->strings["Contact has been unignored"] = "";
+$a->strings["stopped following"] = "";
+$a->strings["Contact has been removed."] = "";
+$a->strings["Mutual Friendship"] = "";
+$a->strings["is a fan of yours"] = "";
+$a->strings["you are a fan of"] = "";
+$a->strings["Privacy Unavailable"] = "";
+$a->strings["Private communications are not available for this contact."] = "";
+$a->strings["Never"] = "";
+$a->strings["(Update was successful)"] = "";
+$a->strings["(Update was not successful)"] = "";
+$a->strings["Suggest friends"] = "";
+$a->strings["Contact Editor"] = "";
+$a->strings["Profile Visibility"] = "";
+$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "";
+$a->strings["Contact Information / Notes"] = "";
+$a->strings["Online Reputation"] = "";
+$a->strings["Occasionally your friends may wish to inquire about this person's online legitimacy."] = "";
+$a->strings["You may help them choose whether or not to interact with this person by providing a <em>reputation</em> to guide them."] = "";
+$a->strings["Please take a moment to elaborate on this selection if you feel it could be helpful to others."] = "";
+$a->strings["Visit %s's profile [%s]"] = "";
+$a->strings["Block/Unblock contact"] = "";
+$a->strings["Ignore contact"] = "";
+$a->strings["Repair contact URL settings"] = "";
+$a->strings["Repair contact URL settings (WARNING: Advanced)"] = "";
+$a->strings["View conversations"] = "";
+$a->strings["Delete contact"] = "";
+$a->strings["Last updated: "] = "";
+$a->strings["Update public posts: "] = "";
+$a->strings["Update now"] = "";
+$a->strings["Unblock this contact"] = "";
+$a->strings["Block this contact"] = "";
+$a->strings["Unignore this contact"] = "";
+$a->strings["Ignore this contact"] = "";
+$a->strings["Currently blocked"] = "";
+$a->strings["Currently ignored"] = "";
+$a->strings["Contacts"] = "";
+$a->strings["Show Blocked Connections"] = "";
+$a->strings["Hide Blocked Connections"] = "";
+$a->strings["Finding: "] = "";
+$a->strings["Find"] = "";
+$a->strings["Edit contact"] = "";
+$a->strings["No valid account found."] = "";
+$a->strings["Password reset request issued. Check your email."] = "";
+$a->strings["Password reset requested at %s"] = "";
+$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "";
+$a->strings["Password Reset"] = "";
+$a->strings["Your password has been reset as requested."] = "";
+$a->strings["Your new password is"] = "";
+$a->strings["Save or copy your new password - and then"] = "";
+$a->strings["click here to login"] = "";
+$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "";
+$a->strings["Forgot your Password?"] = "";
+$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "";
+$a->strings["Nickname or Email: "] = "";
+$a->strings["Reset"] = "";
+$a->strings["Passwords do not match. Password unchanged."] = "";
+$a->strings["Empty passwords are not allowed. Password unchanged."] = "";
+$a->strings["Password changed."] = "";
+$a->strings["Password update failed. Please try again."] = "";
+$a->strings["Failed to connect with email account using the settings provided."] = "";
+$a->strings[" Please use a shorter name."] = "";
+$a->strings[" Name too short."] = "";
+$a->strings[" Not valid email."] = "";
+$a->strings[" Cannot change to that email."] = "";
+$a->strings["Settings updated."] = "";
+$a->strings["Account settings"] = "";
+$a->strings["Plugin settings"] = "";
+$a->strings["No Plugin settings configured"] = "";
+$a->strings["Plugin Settings"] = "";
+$a->strings["Normal Account"] = "";
+$a->strings["This account is a normal personal profile"] = "";
+$a->strings["Soapbox Account"] = "";
+$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "";
+$a->strings["Community/Celebrity Account"] = "";
+$a->strings["Automatically approve all connection/friend requests as read-write fans"] = "";
+$a->strings["Automatic Friend Account"] = "";
+$a->strings["Automatically approve all connection/friend requests as friends"] = "";
+$a->strings["OpenID:"] = "";
+$a->strings["(Optional) Allow this OpenID to login to this account."] = "";
+$a->strings["Publish your default profile in your local site directory?"] = "";
+$a->strings["Publish your default profile in the global social directory?"] = "";
+$a->strings["Hide your contact/friend list from viewers of your default profile?"] = "";
+$a->strings["Hide profile details and all your messages from unknown viewers?"] = "";
+$a->strings["Profile is <strong>not published</strong>."] = "";
+$a->strings["or"] = "";
+$a->strings["Your Identity Address is"] = "";
+$a->strings["Account Settings"] = "";
+$a->strings["Export Personal Data"] = "";
+$a->strings["Password Settings"] = "";
+$a->strings["New Password:"] = "";
+$a->strings["Confirm:"] = "";
+$a->strings["Leave password fields blank unless changing"] = "";
+$a->strings["Basic Settings"] = "";
+$a->strings["Full Name:"] = "";
+$a->strings["Email Address:"] = "";
+$a->strings["Your Timezone:"] = "";
+$a->strings["Default Post Location:"] = "";
+$a->strings["Use Browser Location:"] = "";
+$a->strings["Display Theme:"] = "";
+$a->strings["Security and Privacy Settings"] = "";
+$a->strings["Maximum Friend Requests/Day:"] = "";
+$a->strings["(to prevent spam abuse)"] = "";
+$a->strings["Default Post Permissions"] = "";
+$a->strings["(click to open/close)"] = "";
+$a->strings["Allow friends to post to your profile page:"] = "";
+$a->strings["Automatically expire posts after days:"] = "";
+$a->strings["If empty, posts will not expire. Expired posts will be deleted"] = "";
+$a->strings["Notification Settings"] = "";
+$a->strings["Send a notification email when:"] = "";
+$a->strings["You receive an introduction"] = "";
+$a->strings["Your introductions are confirmed"] = "";
+$a->strings["Someone writes on your profile wall"] = "";
+$a->strings["Someone writes a followup comment"] = "";
+$a->strings["You receive a private message"] = "";
+$a->strings["Email/Mailbox Setup"] = "";
+$a->strings["If you wish to communicate with email contacts using this service (optional), please specify how to connect to your mailbox."] = "";
+$a->strings["Last successful email check:"] = "";
+$a->strings["Email access is disabled on this site."] = "";
+$a->strings["IMAP server name:"] = "";
+$a->strings["IMAP port:"] = "";
+$a->strings["Security:"] = "";
+$a->strings["None"] = "";
+$a->strings["Email login name:"] = "";
+$a->strings["Email password:"] = "";
+$a->strings["Reply-to address:"] = "";
+$a->strings["Send public posts to all email contacts:"] = "";
+$a->strings["Advanced Page Settings"] = "";
+$a->strings["Welcome back %s"] = "";
+$a->strings["Manage Identities and/or Pages"] = "";
+$a->strings["(Toggle between different identities or community/group pages which share your account details.)"] = "";
+$a->strings["Select an identity to manage: "] = "";
+$a->strings["View Conversations"] = "";
+$a->strings["View New Items"] = "";
+$a->strings["View Any Items"] = "";
+$a->strings["View Starred Items"] = "";
+$a->strings["Warning: This group contains %s member from an insecure network."] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["Private messages to this group are at risk of public disclosure."] = "";
+$a->strings["No such group"] = "";
+$a->strings["Group is empty"] = "";
+$a->strings["Group: "] = "";
+$a->strings["Contact: "] = "";
+$a->strings["Private messages to this person are at risk of public disclosure."] = "";
+$a->strings["Invalid contact."] = "";
+$a->strings["Save"] = "";
+$a->strings["Welcome to Friendika"] = "";
+$a->strings["New Member Checklist"] = "";
+$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page."] = "";
+$a->strings["On your <em>Settings</em> page - change your initial password. Also make a note of your Identity Address. This will be useful in making friends."] = "";
+$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "";
+$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "";
+$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "";
+$a->strings["Enter your email access information on your Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "";
+$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "";
+$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "";
+$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Connect</em> dialog."] = "";
+$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "";
+$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "";
+$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "";
+$a->strings["Item not available."] = "";
+$a->strings["Item was not found."] = "";
+$a->strings["Group created."] = "";
+$a->strings["Could not create group."] = "";
+$a->strings["Group not found."] = "";
+$a->strings["Group name changed."] = "";
+$a->strings["Permission denied"] = "";
+$a->strings["Create a group of contacts/friends."] = "";
+$a->strings["Group Name: "] = "";
+$a->strings["Group removed."] = "";
+$a->strings["Unable to remove group."] = "";
+$a->strings["Click on a contact to add or remove."] = "";
+$a->strings["Group Editor"] = "";
+$a->strings["Members"] = "";
+$a->strings["All Contacts"] = "";
+$a->strings["Invalid profile identifier."] = "";
+$a->strings["Profile Visibility Editor"] = "";
+$a->strings["Visible To"] = "";
+$a->strings["All Contacts (with secure profile access)"] = "";
+$a->strings["View Contacts"] = "";
+$a->strings["No contacts."] = "";
+$a->strings["An invitation is required."] = "";
+$a->strings["Invitation could not be verified."] = "";
+$a->strings["Invalid OpenID url"] = "";
+$a->strings["Please enter the required information."] = "";
+$a->strings["Please use a shorter name."] = "";
+$a->strings["Name too short."] = "";
+$a->strings["That doesn't appear to be your full (First Last) name."] = "";
+$a->strings["Your email domain is not among those allowed on this site."] = "";
+$a->strings["Not a valid email address."] = "";
+$a->strings["Cannot use that email."] = "";
+$a->strings["Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and must also begin with a letter."] = "";
+$a->strings["Nickname is already registered. Please choose another."] = "";
+$a->strings["SERIOUS ERROR: Generation of security keys failed."] = "";
+$a->strings["An error occurred during registration. Please try again."] = "";
+$a->strings["An error occurred creating your default profile. Please try again."] = "";
+$a->strings["Registration details for %s"] = "";
+$a->strings["Registration successful. Please check your email for further instructions."] = "";
+$a->strings["Failed to send email message. Here is the message that failed."] = "";
+$a->strings["Your registration can not be processed."] = "";
+$a->strings["Registration request at %s"] = "";
+$a->strings["Your registration is pending approval by the site owner."] = "";
+$a->strings["You may (optionally) fill in this form via OpenID by supplying your OpenID and clicking 'Register'."] = "";
+$a->strings["If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items."] = "";
+$a->strings["Your OpenID (optional): "] = "";
+$a->strings["Include your profile in member directory?"] = "";
+$a->strings["Membership on this site is by invitation only."] = "";
+$a->strings["Your invitation ID: "] = "";
+$a->strings["Registration"] = "";
+$a->strings["Your Full Name (e.g. Joe Smith): "] = "";
+$a->strings["Your Email Address: "] = "";
+$a->strings["Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be '<strong>nickname@\$sitename</strong>'."] = "";
+$a->strings["Choose a nickname: "] = "";
+$a->strings["Register"] = "";
+$a->strings["status"] = "";
+$a->strings["%1\$s likes %2\$s's %3\$s"] = "";
+$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "";
+$a->strings["This is Friendika version"] = "";
+$a->strings["running at web location"] = "";
+$a->strings["Shared content within the Friendika network is provided under the <a href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution 3.0 license</a>"] = "";
+$a->strings["Please visit <a href=\"http://project.friendika.com\">Project.Friendika.com</a> to learn more about the Friendika project."] = "";
+$a->strings["Bug reports and issues: please visit"] = "";
+$a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendika - dot com"] = "";
+$a->strings["Installed plugins/addons/apps"] = "";
+$a->strings["No installed plugins/addons/apps"] = "";
+$a->strings["Account approved."] = "";
+$a->strings["Registration revoked for %s"] = "";
+$a->strings["Please login."] = "";
+$a->strings["Unable to locate original post."] = "";
+$a->strings["Empty post discarded."] = "";
+$a->strings["Wall Photos"] = "";
+$a->strings["noreply"] = "";
+$a->strings["Administrator@"] = "";
+$a->strings["%s commented on an item at %s"] = "";
+$a->strings["%s posted to your profile wall at %s"] = "";
+$a->strings["System error. Post not saved."] = "";
+$a->strings["This message was sent to you by %s, a member of the Friendika social network."] = "";
+$a->strings["You may visit them online at %s"] = "";
+$a->strings["Please contact the sender by replying to this post if you do not wish to receive these messages."] = "";
+$a->strings["%s posted an update."] = "";
+$a->strings["Image uploaded but image cropping failed."] = "";
+$a->strings["Image size reduction [%s] failed."] = "";
+$a->strings["Unable to process image"] = "";
+$a->strings["Image exceeds size limit of %d"] = "";
+$a->strings["Upload File:"] = "";
+$a->strings["Upload Profile Photo"] = "";
+$a->strings["Upload"] = "";
+$a->strings["skip this step"] = "";
+$a->strings["select a photo from your photo albums"] = "";
+$a->strings["Crop Image"] = "";
+$a->strings["Please adjust the image cropping for optimum viewing."] = "";
+$a->strings["Done Editing"] = "";
+$a->strings["Image uploaded successfully."] = "";
+$a->strings["No profile"] = "";
+$a->strings["Remove My Account"] = "";
+$a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "";
+$a->strings["Please enter your password for verification:"] = "";
+$a->strings["No recipient selected."] = "";
+$a->strings["[no subject]"] = "";
+$a->strings["Unable to locate contact information."] = "";
+$a->strings["Message sent."] = "";
+$a->strings["Message could not be sent."] = "";
+$a->strings["Messages"] = "";
+$a->strings["Inbox"] = "";
+$a->strings["Outbox"] = "";
+$a->strings["New Message"] = "";
+$a->strings["Message deleted."] = "";
+$a->strings["Conversation removed."] = "";
+$a->strings["Please enter a link URL:"] = "";
+$a->strings["Send Private Message"] = "";
+$a->strings["To:"] = "";
+$a->strings["Subject:"] = "";
+$a->strings["Your message:"] = "";
+$a->strings["No messages."] = "";
+$a->strings["Delete conversation"] = "";
+$a->strings["D, d M Y - g:i A"] = "";
+$a->strings["Message not available."] = "";
+$a->strings["Delete message"] = "";
+$a->strings["Send Reply"] = "";
+$a->strings["Site"] = "";
+$a->strings["Users"] = "";
+$a->strings["Plugins"] = "";
+$a->strings["Update"] = "";
+$a->strings["Logs"] = "";
+$a->strings["User registrations waiting for confirmation"] = "";
+$a->strings["Item not found."] = "";
+$a->strings["Administration"] = "";
+$a->strings["Summary"] = "";
+$a->strings["Registered users"] = "";
+$a->strings["Pending registrations"] = "";
+$a->strings["Version"] = "";
+$a->strings["Active plugins"] = "";
+$a->strings["Site settings updated."] = "";
+$a->strings["Closed"] = "";
+$a->strings["Requires approval"] = "";
+$a->strings["Open"] = "";
+$a->strings["File upload"] = "";
+$a->strings["Policies"] = "";
+$a->strings["Advanced"] = "";
+$a->strings["Site name"] = "";
+$a->strings["Banner/Logo"] = "";
+$a->strings["System language"] = "";
+$a->strings["System theme"] = "";
+$a->strings["Maximum image size"] = "";
+$a->strings["Register policy"] = "";
+$a->strings["Register text"] = "";
+$a->strings["Allowed friend domains"] = "";
+$a->strings["Allowed email domains"] = "";
+$a->strings["Block public"] = "";
+$a->strings["Force publish"] = "";
+$a->strings["Global directory update URL"] = "";
+$a->strings["Block multiple registrations"] = "";
+$a->strings["OpenID support"] = "";
+$a->strings["Gravatar support"] = "";
+$a->strings["Fullname check"] = "";
+$a->strings["UTF-8 Regular expressions"] = "";
+$a->strings["Show Community Page"] = "";
+$a->strings["Enable OStatus support"] = "";
+$a->strings["Only allow Friendika contacts"] = "";
+$a->strings["Verify SSL"] = "";
+$a->strings["Proxy user"] = "";
+$a->strings["Proxy URL"] = "";
+$a->strings["Network timeout"] = "";
+$a->strings["%s user blocked"] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["%s user deleted"] = array(
+ 0 => "",
+ 1 => "",
);
-$a->strings['Global Directory'] = 'Global Directory';
-$a->strings['Normal site view'] = 'Normal site view';
-$a->strings['View all site entries'] = 'View all site entries';
-$a->strings['Site Directory'] = 'Site Directory';
-$a->strings['Age: '] = 'Age: ';
-$a->strings['Gender: '] = 'Gender: ';
-$a->strings["No entries \x28some entries may be hidden\x29."] = "No entries \x28some entries may be hidden\x29.";
-$a->strings['Item not found.'] = 'Item not found.';
-$a->strings['Item has been removed.'] = 'Item has been removed.';
-$a->strings['Shared content is covered by the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> license.'] = 'Shared content is covered by the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> license.';
-$a->strings['Item not found'] = 'Item not found';
-$a->strings['Edit post'] = 'Edit post';
-$a->strings['Visible to <strong>everybody</strong>'] = 'Visible to <strong>everybody</strong>';
-$a->strings["Post to Email"] = "Post to Email";
-$a->strings['Edit'] = 'Edit';
-$a->strings['Upload photo'] = 'Upload photo';
-$a->strings['Attach file'] = 'Attach file';
-$a->strings['Insert web link'] = 'Insert web link';
-$a->strings['Insert YouTube video'] = 'Insert YouTube video';
-$a->strings['Insert Vorbis [.ogg] video'] = 'Insert Vorbis [.ogg] video';
-$a->strings['Insert Vorbis [.ogg] audio'] = 'Insert Vorbis [.ogg] audio';
-$a->strings['Set your location'] = 'Set your location';
-$a->strings['Clear browser location'] = 'Clear browser location';
-$a->strings['Please wait'] = 'Please wait';
-$a->strings['Permission settings'] = 'Permission settings';
-$a->strings['CC: email addresses'] = 'CC: email addresses';
-$a->strings['Public post'] = 'Public post';
-$a->strings['Example: bob@example.com, mary@example.com'] = 'Example: bob@example.com, mary@example.com';
-$a->strings['The profile address specified does not provide adequate information.'] = 'The profile address specified does not provide adequate information.';
-$a->strings['No compatible communication protocols or feeds were discovered.'] = 'No compatible communication protocols or feeds were discovered.';
-$a->strings['An author or name was not found.'] = 'An author or name was not found.';
-$a->strings['No browser URL could be matched to this address.'] = 'No browser URL could be matched to this address.';
-$a->strings['Limited profile. This person will be unable to receive direct/personal notifications from you.'] = 'Limited profile. This person will be unable to receive direct/personal notifications from you.';
-$a->strings['Unable to retrieve contact information.'] = 'Unable to retrieve contact information.';
-$a->strings['following'] = 'following';
-$a->strings['This is Friendika version'] = 'This is Friendika version';
-$a->strings['running at web location'] = 'running at web location';
-$a->strings['Shared content within the Friendika network is provided under the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 license</a>'] = 'Shared content within the Friendika network is provided under the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 license</a>';
-$a->strings['Please visit <a href="http://project.friendika.com">Project.Friendika.com</a> to learn more about the Friendika project.'] = 'Please visit <a href="http://project.friendika.com">Project.Friendika.com</a> to learn more about the Friendika project.';
-$a->strings['Bug reports and issues: please visit'] = 'Bug reports and issues: please visit';
-$a->strings['Suggestions, praise, donations, etc. - please email "Info" at Friendika - dot com'] = 'Suggestions, praise, donations, etc. - please email "Info" at Friendika - dot com';
-$a->strings['Installed plugins/addons/apps'] = 'Installed plugins/addons/apps';
-$a->strings['No installed plugins/addons/apps'] = 'No installed plugins/addons/apps';
-$a->strings['Group created.'] = 'Group created.';
-$a->strings['Could not create group.'] = 'Could not create group.';
-$a->strings['Group not found.'] = 'Group not found.';
-$a->strings['Group name changed.'] = 'Group name changed.';
-$a->strings['Create a group of contacts/friends.'] = 'Create a group of contacts/friends.';
-$a->strings['Group Name: '] = 'Group Name: ';
-$a->strings['Group removed.'] = 'Group removed.';
-$a->strings['Unable to remove group.'] = 'Unable to remove group.';
-$a->strings['Delete'] = 'Delete';
-$a->strings['Click on a contact to add or remove.'] = 'Click on a contact to add or remove.';
-$a->strings['Group Editor'] = 'Group Editor';
-$a->strings['Members'] = 'Members';
-$a->strings['All Contacts'] = 'All Contacts';
-$a->strings['Help:'] = 'Help:';
-$a->strings['Help'] = 'Help';
-$a->strings["Welcome to %s"] = "Welcome to %s";
-$a->strings['Could not create/connect to database.'] = 'Could not create/connect to database.';
-$a->strings['Connected to database.'] = 'Connected to database.';
-$a->strings['Proceed with Installation'] = 'Proceed with Installation';
-$a->strings['Your Friendika site database has been installed.'] = 'Your Friendika site database has been installed.';
-$a->strings['IMPORTANT: You will need to [manually] setup a scheduled task for the poller.'] = 'IMPORTANT: You will need to [manually] setup a scheduled task for the poller.';
-$a->strings['Please see the file "INSTALL.txt".'] = 'Please see the file "INSTALL.txt".';
-$a->strings['Proceed to registration'] = 'Proceed to registration';
-$a->strings['Database import failed.'] = 'Database import failed.';
-$a->strings['You may need to import the file "database.sql" manually using phpmyadmin or mysql.'] = 'You may need to import the file "database.sql" manually using phpmyadmin or mysql.';
-$a->strings['Welcome to Friendika.'] = 'Welcome to Friendika.';
-$a->strings['Friendika Social Network'] = 'Friendika Social Network';
-$a->strings['Installation'] = 'Installation';
-$a->strings['In order to install Friendika we need to know how to contact your database.'] = 'In order to install Friendika we need to know how to contact your database.';
-$a->strings['Please contact your hosting provider or site administrator if you have questions about these settings.'] = 'Please contact your hosting provider or site administrator if you have questions about these settings.';
-$a->strings['The database you specify below must already exist. If it does not, please create it before continuing.'] = 'The database you specify below must already exist. If it does not, please create it before continuing.';
-$a->strings['Database Server Name'] = 'Database Server Name';
-$a->strings['Database Login Name'] = 'Database Login Name';
-$a->strings['Database Login Password'] = 'Database Login Password';
-$a->strings['Database Name'] = 'Database Name';
-$a->strings['Please select a default timezone for your website'] = 'Please select a default timezone for your website';
-$a->strings['Could not find a command line version of PHP in the web server PATH.'] = 'Could not find a command line version of PHP in the web server PATH.';
-$a->strings['This is required. Please adjust the configuration file .htconfig.php accordingly.'] = 'This is required. Please adjust the configuration file .htconfig.php accordingly.';
-$a->strings['The command line version of PHP on your system does not have "register_argc_argv" enabled.'] = 'The command line version of PHP on your system does not have "register_argc_argv" enabled.';
-$a->strings['This is required for message delivery to work.'] = 'This is required for message delivery to work.';
-$a->strings['Error: the "openssl_pkey_new" function on this system is not able to generate encryption keys'] = 'Error: the "openssl_pkey_new" function on this system is not able to generate encryption keys';
-$a->strings['If running under Windows, please see "http://www.php.net/manual/en/openssl.installation.php".'] = 'If running under Windows, please see "http://www.php.net/manual/en/openssl.installation.php".';
-$a->strings['Error: Apache webserver mod-rewrite module is required but not installed.'] = 'Error: Apache webserver mod-rewrite module is required but not installed.';
-$a->strings['Error: libCURL PHP module required but not installed.'] = 'Error: libCURL PHP module required but not installed.';
-$a->strings['Error: GD graphics PHP module with JPEG support required but not installed.'] = 'Error: GD graphics PHP module with JPEG support required but not installed.';
-$a->strings['Error: openssl PHP module required but not installed.'] = 'Error: openssl PHP module required but not installed.';
-$a->strings['Error: mysqli PHP module required but not installed.'] = 'Error: mysqli PHP module required but not installed.';
-$a->strings['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.'] = '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.';
-$a->strings['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.'] = '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.';
-$a->strings['Please check with your site documentation or support people to see if this situation can be corrected.'] = 'Please check with your site documentation or support people to see if this situation can be corrected.';
-$a->strings['If not, you may be required to perform a manual installation. Please see the file "INSTALL.txt" for instructions.'] = 'If not, you may be required to perform a manual installation. Please see the file "INSTALL.txt" for instructions.';
-$a->strings['The database configuration file ".htconfig.php" could not be written. Please use the enclosed text to create a configuration file in your web server root.'] = '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.';
-$a->strings['Errors encountered creating database tables.'] = 'Errors encountered creating database tables.';
-$a->strings['%s : Not a valid email address.'] = '%s : Not a valid email address.';
-$a->strings['Please join my network on %s'] = 'Please join my network on %s';
-$a->strings['%s : Message delivery failed.'] = '%s : Message delivery failed.';
-$a->strings['Send invitations'] = 'Send invitations';
-$a->strings['Enter email addresses, one per line:'] = 'Enter email addresses, one per line:';
-$a->strings['Your message:'] = 'Your message:';
-$a->strings['To accept this invitation, please visit:'] = 'To accept this invitation, please visit:';
-$a->strings['Once you have registered, please connect with me via my profile page at:'] = 'Once you have registered, please connect with me via my profile page at:';
+$a->strings["User '%s' deleted"] = "";
+$a->strings["User '%s' unblocked"] = "";
+$a->strings["User '%s' blocked"] = "";
+$a->strings["select all"] = "";
+$a->strings["User registrations waiting for confirm"] = "";
+$a->strings["Request date"] = "";
+$a->strings["Email"] = "";
+$a->strings["No registrations."] = "";
+$a->strings["Deny"] = "";
+$a->strings["Block"] = "";
+$a->strings["Unblock"] = "";
+$a->strings["Register date"] = "";
+$a->strings["Last login"] = "";
+$a->strings["Last item"] = "";
+$a->strings["Account"] = "";
+$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "";
+$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "";
+$a->strings["Plugin %s disabled."] = "";
+$a->strings["Plugin %s enabled."] = "";
+$a->strings["Disable"] = "";
+$a->strings["Enable"] = "";
+$a->strings["Toggle"] = "";
+$a->strings["Settings"] = "";
+$a->strings["Log settings updated."] = "";
+$a->strings["Clear"] = "";
+$a->strings["Debugging"] = "";
+$a->strings["Log file"] = "";
+$a->strings["Must be writable by web server. Relative to your Friendika index.php."] = "";
+$a->strings["Log level"] = "";
+$a->strings["Close"] = "";
+$a->strings["FTP Host"] = "";
+$a->strings["FTP Path"] = "";
+$a->strings["FTP User"] = "";
+$a->strings["FTP Password"] = "";
+$a->strings["Access to this profile has been restricted."] = "";
+$a->strings["Tips for New Members"] = "";
+$a->strings["Login failed."] = "";
+$a->strings["Welcome "] = "";
+$a->strings["Please upload a profile photo."] = "";
+$a->strings["Welcome back "] = "";
+$a->strings["This site is not configured to allow communications with other networks."] = "";
+$a->strings["No compatible communication protocols or feeds were discovered."] = "";
+$a->strings["The profile address specified does not provide adequate information."] = "";
+$a->strings["An author or name was not found."] = "";
+$a->strings["No browser URL could be matched to this address."] = "";
+$a->strings["The profile address specified belongs to a network which has been disabled on this site."] = "";
+$a->strings["Limited profile. This person will be unable to receive direct/personal notifications from you."] = "";
+$a->strings["Unable to retrieve contact information."] = "";
+$a->strings["following"] = "";
+$a->strings["Item has been removed."] = "";
+$a->strings["New mail received at "] = "";
+$a->strings["Applications"] = "";
+$a->strings["No installed applications."] = "";
+$a->strings["Search"] = "";
+$a->strings["Profile not found."] = "";
+$a->strings["Profile Name is required."] = "";
+$a->strings["Profile updated."] = "";
+$a->strings["Profile deleted."] = "";
+$a->strings["Profile-"] = "";
+$a->strings["New profile created."] = "";
+$a->strings["Profile unavailable to clone."] = "";
+$a->strings["Hide your contact/friend list from viewers of this profile?"] = "";
+$a->strings["Edit Profile Details"] = "";
+$a->strings["View this profile"] = "";
+$a->strings["Create a new profile using these settings"] = "";
+$a->strings["Clone this profile"] = "";
+$a->strings["Delete this profile"] = "";
+$a->strings["Profile Name:"] = "";
+$a->strings["Your Full Name:"] = "";
+$a->strings["Title/Description:"] = "";
+$a->strings["Your Gender:"] = "";
+$a->strings["Birthday (%s):"] = "";
+$a->strings["Street Address:"] = "";
+$a->strings["Locality/City:"] = "";
+$a->strings["Postal/Zip Code:"] = "";
+$a->strings["Country:"] = "";
+$a->strings["Region/State:"] = "";
+$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "";
+$a->strings["Who: (if applicable)"] = "";
+$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "";
+$a->strings["Sexual Preference:"] = "";
+$a->strings["Homepage URL:"] = "";
+$a->strings["Political Views:"] = "";
+$a->strings["Religious Views:"] = "";
+$a->strings["Public Keywords:"] = "";
+$a->strings["Private Keywords:"] = "";
+$a->strings["Example: fishing photography software"] = "";
+$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "";
+$a->strings["(Used for searching profiles, never shown to others)"] = "";
+$a->strings["Tell us about yourself..."] = "";
+$a->strings["Hobbies/Interests"] = "";
+$a->strings["Contact information and Social Networks"] = "";
+$a->strings["Musical interests"] = "";
+$a->strings["Books, literature"] = "";
+$a->strings["Television"] = "";
+$a->strings["Film/dance/culture/entertainment"] = "";
+$a->strings["Love/romance"] = "";
+$a->strings["Work/employment"] = "";
+$a->strings["School/education"] = "";
+$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "";
+$a->strings["Age: "] = "";
+$a->strings["Profiles"] = "";
+$a->strings["Change profile photo"] = "";
+$a->strings["Create New Profile"] = "";
+$a->strings["Profile Image"] = "";
+$a->strings["visible to everybody"] = "";
+$a->strings["Edit visibility"] = "";
+$a->strings["Global Directory"] = "";
+$a->strings["Normal site view"] = "";
+$a->strings["View all site entries"] = "";
+$a->strings["Site Directory"] = "";
+$a->strings["Gender: "] = "";
+$a->strings["No entries (some entries may be hidden)."] = "";
+$a->strings["%s : Not a valid email address."] = "";
+$a->strings["Please join my network on %s"] = "";
+$a->strings["%s : Message delivery failed."] = "";
$a->strings["%d message sent."] = array(
- 0 => "%d message sent.",
- 1 => "%d messages sent.",
+ 0 => "",
+ 1 => "",
);
-$a->strings['Unable to locate original post.'] = 'Unable to locate original post.';
-$a->strings['Empty post discarded.'] = 'Empty post discarded.';
-$a->strings['Wall Photos'] = 'Wall Photos';
-$a->strings['%s posted to your profile wall at %s'] = '%s posted to your profile wall at %s';
-$a->strings['System error. Post not saved.'] = 'System error. Post not saved.';
-$a->strings['This message was sent to you by %s, a member of the Friendika social network.'] = 'This message was sent to you by %s, a member of the Friendika social network.';
-$a->strings['You may visit them online at %s'] = 'You may visit them online at %s';
-$a->strings['Please contact the sender by replying to this post if you do not wish to receive these messages.'] = 'Please contact the sender by replying to this post if you do not wish to receive these messages.';
-$a->strings['%s posted an update.'] = '%s posted an update.';
-$a->strings['photo'] = 'photo';
-$a->strings['status'] = 'status';
-$a->strings['%1$s likes %2$s\'s %3$s'] = '%1$s likes %2$s\'s %3$s';
-$a->strings['%1$s doesn\'t like %2$s\'s %3$s'] = '%1$s doesn\'t like %2$s\'s %3$s';
-$a->strings['Remote privacy information not available.'] = 'Remote privacy information not available.';
-$a->strings['Visible to:'] = 'Visible to:';
-$a->strings['Password reset request issued. Check your email.'] = 'Password reset request issued. Check your email.';
-$a->strings['Password reset requested at %s'] = 'Password reset requested at %s';
-$a->strings["Request could not be verified. \x28You may have previously submitted it.\x29 Password reset failed."] = "Request could not be verified. \x28You may have previously submitted it.\x29 Password reset failed.";
-$a->strings['Your password has been reset as requested.'] = 'Your password has been reset as requested.';
-$a->strings['Your new password is'] = 'Your new password is';
-$a->strings['Save or copy your new password - and then'] = 'Save or copy your new password - and then';
-$a->strings['click here to login'] = 'click here to login';
-$a->strings['Your password may be changed from the <em>Settings</em> page after successful login.'] = 'Your password may be changed from the <em>Settings</em> page after successful login.';
-$a->strings['Forgot your Password?'] = 'Forgot your Password?';
-$a->strings['Enter your email address and submit to have your password reset. Then check your email for further instructions.'] = 'Enter your email address and submit to have your password reset. Then check your email for further instructions.';
-$a->strings['Nickname or Email: '] = 'Nickname or Email: ';
-$a->strings['Reset'] = 'Reset';
-$a->strings["Welcome back %s"] = "Welcome back %s";
-$a->strings['Manage Identities and/or Pages'] = 'Manage Identities and/or Pages';
-$a->strings["\x28Toggle between different identities or community/group pages which share your account details.\x29"] = "\x28Toggle between different identities or community/group pages which share your account details.\x29";
-$a->strings['Select an identity to manage: '] = 'Select an identity to manage: ';
-$a->strings['Profile Match'] = 'Profile Match';
-$a->strings['No matches'] = 'No matches';
-$a->strings['No recipient selected.'] = 'No recipient selected.';
-$a->strings['[no subject]'] = '[no subject]';
-$a->strings['Unable to locate contact information.'] = 'Unable to locate contact information.';
-$a->strings['Message sent.'] = 'Message sent.';
-$a->strings['Message could not be sent.'] = 'Message could not be sent.';
-$a->strings['Messages'] = 'Messages';
-$a->strings['Inbox'] = 'Inbox';
-$a->strings['Outbox'] = 'Outbox';
-$a->strings['New Message'] = 'New Message';
-$a->strings['Message deleted.'] = 'Message deleted.';
-$a->strings['Conversation removed.'] = 'Conversation removed.';
-$a->strings['Please enter a link URL:'] = 'Please enter a link URL:';
-$a->strings['Send Private Message'] = 'Send Private Message';
-$a->strings['To:'] = 'To:';
-$a->strings['Subject:'] = 'Subject:';
-$a->strings['No messages.'] = 'No messages.';
-$a->strings['Delete conversation'] = 'Delete conversation';
-$a->strings['D, d M Y - g:i A'] = 'D, d M Y - g:i A';
-$a->strings['Message not available.'] = 'Message not available.';
-$a->strings['Delete message'] = 'Delete message';
-$a->strings['Send Reply'] = 'Send Reply';
-$a->strings['Normal View'] = 'Normal View';
-$a->strings['New Item View'] = 'New Item View';
-$a->strings['Private messages to this group are at risk of public disclosure.'] = 'Private messages to this group are at risk of public disclosure.';
-$a->strings['No such group'] = 'No such group';
-$a->strings['Group is empty'] = 'Group is empty';
-$a->strings['Group: '] = 'Group: ';
-$a->strings['Contact: '] = 'Contact: ';
-$a->strings['Private messages to this person are at risk of public disclosure.'] = 'Private messages to this person are at risk of public disclosure.';
-$a->strings['Invalid contact.'] = 'Invalid contact.';
-$a->strings['Warning: This group contains %s member from an insecure network.'] = array(
- 0 => 'Warning: This group contains %s member from an insecure network.',
- 1 => 'Warning: This group contains %s members from an insecure network.',
+$a->strings["You have no more invitations available"] = "";
+$a->strings["Send invitations"] = "";
+$a->strings["Enter email addresses, one per line:"] = "";
+$a->strings["Please join my social network on %s"] = "";
+$a->strings["To accept this invitation, please visit:"] = "";
+$a->strings["You will need to supply this invitation code: \$invite_code"] = "";
+$a->strings["Once you have registered, please connect with me via my profile page at:"] = "";
+$a->strings["Response from remote site was not understood."] = "";
+$a->strings["Unexpected response from remote site: "] = "";
+$a->strings["Confirmation completed successfully."] = "";
+$a->strings["Remote site reported: "] = "";
+$a->strings["Temporary failure. Please wait and try again."] = "";
+$a->strings["Introduction failed or was revoked."] = "";
+$a->strings["Unable to set contact photo."] = "";
+$a->strings["%1\$s is now friends with %2\$s"] = "";
+$a->strings["No user record found for '%s' "] = "";
+$a->strings["Our site encryption key is apparently messed up."] = "";
+$a->strings["Empty site URL was provided or URL could not be decrypted by us."] = "";
+$a->strings["Contact record was not found for you on our site."] = "";
+$a->strings["The ID provided by your system is a duplicate on our system. It should work if you try again."] = "";
+$a->strings["Unable to set your contact credentials on our system."] = "";
+$a->strings["Unable to update your contact profile details on our system"] = "";
+$a->strings["Connection accepted at %s"] = "";
+$a->strings["Facebook disabled"] = "";
+$a->strings["Updating contacts"] = "";
+$a->strings["Facebook API key is missing."] = "";
+$a->strings["Facebook Connect"] = "";
+$a->strings["Install Facebook connector for this account."] = "";
+$a->strings["Remove Facebook connector"] = "";
+$a->strings["Post to Facebook by default"] = "";
+$a->strings["Link all your Facebook friends and conversations"] = "";
+$a->strings["Warning: Your Facebook privacy settings can not be imported."] = "";
+$a->strings["Linked Facebook items <strong>may</strong> be publicly visible, depending on your privacy settings for this website/account."] = "";
+$a->strings["Facebook"] = "";
+$a->strings["Facebook Connector Settings"] = "";
+$a->strings["Post to Facebook"] = "";
+$a->strings["Post to Facebook cancelled because of multi-network access permission conflict."] = "";
+$a->strings["Image: "] = "";
+$a->strings["View on Friendika"] = "";
+$a->strings["Facebook post failed. Queued for retry."] = "";
+$a->strings["Generate new key"] = "";
+$a->strings["Widgets key"] = "";
+$a->strings["Widgets available"] = "";
+$a->strings["Connect on Friendika!"] = "";
+$a->strings["Three Dimensional Tic-Tac-Toe"] = "";
+$a->strings["3D Tic-Tac-Toe"] = "";
+$a->strings["New game"] = "";
+$a->strings["New game with handicap"] = "";
+$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "";
+$a->strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "";
+$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "";
+$a->strings["You go first..."] = "";
+$a->strings["I'm going first this time..."] = "";
+$a->strings["You won!"] = "";
+$a->strings["\"Cat\" game!"] = "";
+$a->strings["I won!"] = "";
+$a->strings["Randplace Settings"] = "";
+$a->strings["Enable Randplace Plugin"] = "";
+$a->strings["Upload a file"] = "";
+$a->strings["Drop files here to upload"] = "";
+$a->strings["Failed"] = "";
+$a->strings["No files were uploaded."] = "";
+$a->strings["Uploaded file is empty"] = "";
+$a->strings["File has an invalid extension, it should be one of "] = "";
+$a->strings["Upload was cancelled, or server error encountered"] = "";
+$a->strings["Impressum"] = "";
+$a->strings["Site Owner"] = "";
+$a->strings["Email Address"] = "";
+$a->strings["Postal Address"] = "";
+$a->strings["The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon."] = "";
+$a->strings["Site Owners Profile"] = "";
+$a->strings["Notes"] = "";
+$a->strings["OEmbed settings updated"] = "";
+$a->strings["Use OEmbed for YouTube videos"] = "";
+$a->strings["URL to embed:"] = "";
+$a->strings["Post to StatusNet"] = "";
+$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "";
+$a->strings["We could not contact the StatusNet API with the Path you entered."] = "";
+$a->strings["StatusNet settings updated."] = "";
+$a->strings["StatusNet Posting Settings"] = "";
+$a->strings["Globally Available StatusNet OAuthKeys"] = "";
+$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "";
+$a->strings["Provide your own OAuth Credentials"] = "";
+$a->strings["No consumer key pair for StatusNet found. Register your Friendika Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.<br />Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendika installation at your favorited StatusNet installation."] = "";
+$a->strings["OAuth Consumer Key"] = "";
+$a->strings["OAuth Consumer Secret"] = "";
+$a->strings["Base API Path (remember the trailing /)"] = "";
+$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet."] = "";
+$a->strings["Log in with StatusNet"] = "";
+$a->strings["Copy the security code from StatusNet here"] = "";
+$a->strings["Cancel Connection Process"] = "";
+$a->strings["Current StatusNet API is"] = "";
+$a->strings["Cancel StatusNet Connection"] = "";
+$a->strings["Currently connected to: "] = "";
+$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "";
+$a->strings["Allow posting to StatusNet"] = "";
+$a->strings["Send public postings to StatusNet by default"] = "";
+$a->strings["Clear OAuth configuration"] = "";
+$a->strings["API URL"] = "";
+$a->strings["Consumer Secret"] = "";
+$a->strings["Consumer Key"] = "";
+$a->strings["Piwik Base URL"] = "";
+$a->strings["Site ID"] = "";
+$a->strings["Show opt-out cookie link?"] = "";
+$a->strings["Post to Twitter"] = "";
+$a->strings["Twitter settings updated."] = "";
+$a->strings["Twitter Posting Settings"] = "";
+$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "";
+$a->strings["At this Friendika instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "";
+$a->strings["Log in with Twitter"] = "";
+$a->strings["Copy the PIN from Twitter here"] = "";
+$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "";
+$a->strings["Allow posting to Twitter"] = "";
+$a->strings["Send public postings to Twitter by default"] = "";
+$a->strings["Consumer key"] = "";
+$a->strings["Consumer secret"] = "";
+$a->strings["Gender:"] = "";
+$a->strings["Birthday:"] = "";
+$a->strings["j F, Y"] = "";
+$a->strings["j F"] = "";
+$a->strings["Age:"] = "";
+$a->strings["<span class=\"heart\">&hearts;</span> Status:"] = "";
+$a->strings["Homepage:"] = "";
+$a->strings["Religion:"] = "";
+$a->strings["About:"] = "";
+$a->strings["Hobbies/Interests:"] = "";
+$a->strings["Contact information and Social Networks:"] = "";
+$a->strings["Musical interests:"] = "";
+$a->strings["Books, literature:"] = "";
+$a->strings["Television:"] = "";
+$a->strings["Film/dance/culture/entertainment:"] = "";
+$a->strings["Love/Romance:"] = "";
+$a->strings["Work/employment:"] = "";
+$a->strings["School/education:"] = "";
+$a->strings["Unknown | Not categorised"] = "";
+$a->strings["Block immediately"] = "";
+$a->strings["Shady, spammer, self-marketer"] = "";
+$a->strings["Known to me, but no opinion"] = "";
+$a->strings["OK, probably harmless"] = "";
+$a->strings["Reputable, has my trust"] = "";
+$a->strings["Frequently"] = "";
+$a->strings["Hourly"] = "";
+$a->strings["Twice daily"] = "";
+$a->strings["Daily"] = "";
+$a->strings["Weekly"] = "";
+$a->strings["Monthly"] = "";
+$a->strings["Male"] = "";
+$a->strings["Female"] = "";
+$a->strings["Currently Male"] = "";
+$a->strings["Currently Female"] = "";
+$a->strings["Mostly Male"] = "";
+$a->strings["Mostly Female"] = "";
+$a->strings["Transgender"] = "";
+$a->strings["Intersex"] = "";
+$a->strings["Transsexual"] = "";
+$a->strings["Hermaphrodite"] = "";
+$a->strings["Neuter"] = "";
+$a->strings["Non-specific"] = "";
+$a->strings["Other"] = "";
+$a->strings["Undecided"] = "";
+$a->strings["Males"] = "";
+$a->strings["Females"] = "";
+$a->strings["Gay"] = "";
+$a->strings["Lesbian"] = "";
+$a->strings["No Preference"] = "";
+$a->strings["Bisexual"] = "";
+$a->strings["Autosexual"] = "";
+$a->strings["Abstinent"] = "";
+$a->strings["Virgin"] = "";
+$a->strings["Deviant"] = "";
+$a->strings["Fetish"] = "";
+$a->strings["Oodles"] = "";
+$a->strings["Nonsexual"] = "";
+$a->strings["Single"] = "";
+$a->strings["Lonely"] = "";
+$a->strings["Available"] = "";
+$a->strings["Unavailable"] = "";
+$a->strings["Dating"] = "";
+$a->strings["Unfaithful"] = "";
+$a->strings["Sex Addict"] = "";
+$a->strings["Friends"] = "";
+$a->strings["Friends/Benefits"] = "";
+$a->strings["Casual"] = "";
+$a->strings["Engaged"] = "";
+$a->strings["Married"] = "";
+$a->strings["Partners"] = "";
+$a->strings["Cohabiting"] = "";
+$a->strings["Happy"] = "";
+$a->strings["Not Looking"] = "";
+$a->strings["Swinger"] = "";
+$a->strings["Betrayed"] = "";
+$a->strings["Separated"] = "";
+$a->strings["Unstable"] = "";
+$a->strings["Divorced"] = "";
+$a->strings["Widowed"] = "";
+$a->strings["Uncertain"] = "";
+$a->strings["Complicated"] = "";
+$a->strings["Don't care"] = "";
+$a->strings["Ask me"] = "";
+$a->strings["l F d, Y \\@ g:i A"] = "";
+$a->strings["Starts:"] = "";
+$a->strings["Finishes:"] = "";
+$a->strings["prev"] = "";
+$a->strings["first"] = "";
+$a->strings["last"] = "";
+$a->strings["next"] = "";
+$a->strings["No contacts"] = "";
+$a->strings["%d Contact"] = array(
+ 0 => "",
+ 1 => "",
);
-$a->strings['Save'] = 'Save';
-$a->strings['Invalid request identifier.'] = 'Invalid request identifier.';
-$a->strings['Discard'] = 'Discard';
-$a->strings['Ignore'] = 'Ignore';
-$a->strings['Pending Friend/Connect Notifications'] = 'Pending Friend/Connect Notifications';
-$a->strings['Show Ignored Requests'] = 'Show Ignored Requests';
-$a->strings['Hide Ignored Requests'] = 'Hide Ignored Requests';
-$a->strings['Claims to be known to you: '] = 'Claims to be known to you: ';
-$a->strings['yes'] = 'yes';
-$a->strings['no'] = 'no';
-$a->strings['Approve as: '] = 'Approve as: ';
-$a->strings['Friend'] = 'Friend';
-$a->strings['Fan/Admirer'] = 'Fan/Admirer';
-$a->strings['Notification type: '] = 'Notification type: ';
-$a->strings['Friend/Connect Request'] = 'Friend/Connect Request';
-$a->strings['New Follower'] = 'New Follower';
-$a->strings['Approve'] = 'Approve';
-$a->strings['No notifications.'] = 'No notifications.';
-$a->strings['User registrations waiting for confirm'] = 'User registrations waiting for confirm';
-$a->strings['Deny'] = 'Deny';
-$a->strings['No registrations.'] = 'No registrations.';
-$a->strings['Post successful.'] = 'Post successful.';
-$a->strings['Login failed.'] = 'Login failed.';
-$a->strings["Welcome "] = "Welcome ";
-$a->strings['Please upload a profile photo.'] = 'Please upload a profile photo.';
-$a->strings["Welcome back "] = "Welcome back ";
-$a->strings['Photo Albums'] = 'Photo Albums';
-$a->strings['Contact Photos'] = 'Contact Photos';
-$a->strings['Contact information unavailable'] = 'Contact information unavailable';
-$a->strings['Profile Photos'] = 'Profile Photos';
-$a->strings['Album not found.'] = 'Album not found.';
-$a->strings['Delete Album'] = 'Delete Album';
-$a->strings['Delete Photo'] = 'Delete Photo';
-$a->strings['was tagged in a'] = 'was tagged in a';
-$a->strings['by'] = 'by';
-$a->strings['Image exceeds size limit of '] = 'Image exceeds size limit of ';
-$a->strings['Unable to process image.'] = 'Unable to process image.';
-$a->strings['Image upload failed.'] = 'Image upload failed.';
-$a->strings['No photos selected'] = 'No photos selected';
-$a->strings['Upload Photos'] = 'Upload Photos';
-$a->strings['New album name: '] = 'New album name: ';
-$a->strings['or existing album name: '] = 'or existing album name: ';
-$a->strings['Permissions'] = 'Permissions';
-$a->strings['Edit Album'] = 'Edit Album';
-$a->strings['View Photo'] = 'View Photo';
-$a->strings['Photo not available'] = 'Photo not available';
-$a->strings['Edit photo'] = 'Edit photo';
-$a->strings['Use as profile photo'] = 'Use as profile photo';
-$a->strings['Private Message'] = 'Private Message';
-$a->strings['<< Prev'] = '<< Prev';
-$a->strings['View Full Size'] = 'View Full Size';
-$a->strings['Next >>'] = 'Next >>';
-$a->strings['[Remove any tag]'] = '[Remove any tag]';
-$a->strings['New album name'] = 'New album name';
-$a->strings['Caption'] = 'Caption';
-$a->strings['Add a Tag'] = 'Add a Tag';
-$a->strings['Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping'] = 'Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping';
-$a->strings["I like this \x28toggle\x29"] = "I like this \x28toggle\x29";
-$a->strings["I don't like this \x28toggle\x29"] = "I don't like this \x28toggle\x29";
-$a->strings['Share'] = 'Share';
-$a->strings['This is you'] = 'This is you';
-$a->strings['Recent Photos'] = 'Recent Photos';
-$a->strings['Upload New Photos'] = 'Upload New Photos';
-$a->strings['View Album'] = 'View Album';
-$a->strings['Access to this profile has been restricted.'] = 'Access to this profile has been restricted.';
-$a->strings['Status'] = 'Status';
-$a->strings['Profile'] = 'Profile';
-$a->strings['Photos'] = 'Photos';
-$a->strings['Image uploaded but image cropping failed.'] = 'Image uploaded but image cropping failed.';
-$a->strings['Unable to process image'] = 'Unable to process image';
-$a->strings['Upload File:'] = 'Upload File:';
-$a->strings['Upload Profile Photo'] = 'Upload Profile Photo';
-$a->strings['Upload'] = 'Upload';
-$a->strings['or'] = 'or';
-$a->strings['skip this step'] = 'skip this step';
-$a->strings['select a photo from your photo albums'] = 'select a photo from your photo albums';
-$a->strings['Crop Image'] = 'Crop Image';
-$a->strings['Please adjust the image cropping for optimum viewing.'] = 'Please adjust the image cropping for optimum viewing.';
-$a->strings['Done Editing'] = 'Done Editing';
-$a->strings['Image uploaded successfully.'] = 'Image uploaded successfully.';
-$a->strings['Profile Name is required.'] = 'Profile Name is required.';
-$a->strings['Profile updated.'] = 'Profile updated.';
-$a->strings['Profile deleted.'] = 'Profile deleted.';
-$a->strings['Profile-'] = 'Profile-';
-$a->strings['New profile created.'] = 'New profile created.';
-$a->strings['Profile unavailable to clone.'] = 'Profile unavailable to clone.';
-$a->strings['Hide your contact/friend list from viewers of this profile?'] = 'Hide your contact/friend list from viewers of this profile?';
-$a->strings['Hide profile details and all your messages from unknown viewers?'] = 'Hide profile details and all your messages from unknown viewers?';
-$a->strings['Edit Profile Details'] = 'Edit Profile Details';
-$a->strings['View this profile'] = 'View this profile';
-$a->strings['Create a new profile using these settings'] = 'Create a new profile using these settings';
-$a->strings['Clone this profile'] = 'Clone this profile';
-$a->strings['Delete this profile'] = 'Delete this profile';
-$a->strings['Profile Name:'] = 'Profile Name:';
-$a->strings['Your Full Name:'] = 'Your Full Name:';
-$a->strings['Title/Description:'] = 'Title/Description:';
-$a->strings['Your Gender:'] = 'Your Gender:';
-$a->strings["Birthday \x28y/m/d\x29:"] = "Birthday \x28y/m/d\x29:";
-$a->strings['Street Address:'] = 'Street Address:';
-$a->strings['Locality/City:'] = 'Locality/City:';
-$a->strings['Postal/Zip Code:'] = 'Postal/Zip Code:';
-$a->strings['Country:'] = 'Country:';
-$a->strings['Region/State:'] = 'Region/State:';
-$a->strings['<span class="heart">&hearts;</span> Marital Status:'] = '<span class="heart">&hearts;</span> Marital Status:';
-$a->strings["Who: \x28if applicable\x29"] = "Who: \x28if applicable\x29";
-$a->strings['Examples: cathy123, Cathy Williams, cathy@example.com'] = 'Examples: cathy123, Cathy Williams, cathy@example.com';
-$a->strings['Sexual Preference:'] = 'Sexual Preference:';
-$a->strings['Homepage URL:'] = 'Homepage URL:';
-$a->strings['Political Views:'] = 'Political Views:';
-$a->strings['Religious Views:'] = 'Religious Views:';
-$a->strings['Public Keywords:'] = 'Public Keywords:';
-$a->strings['Private Keywords:'] = 'Private Keywords:';
-$a->strings['Example: fishing photography software'] = 'Example: fishing photography software';
-$a->strings["\x28Used for suggesting potential friends, can be seen by others\x29"] = "\x28Used for suggesting potential friends, can be seen by others\x29";
-$a->strings["\x28Used for searching profiles, never shown to others\x29"] = "\x28Used for searching profiles, never shown to others\x29";
-$a->strings['Tell us about yourself...'] = 'Tell us about yourself...';
-$a->strings['Hobbies/Interests'] = 'Hobbies/Interests';
-$a->strings['Contact information and Social Networks'] = 'Contact information and Social Networks';
-$a->strings['Musical interests'] = 'Musical interests';
-$a->strings['Books, literature'] = 'Books, literature';
-$a->strings['Television'] = 'Television';
-$a->strings['Film/dance/culture/entertainment'] = 'Film/dance/culture/entertainment';
-$a->strings['Love/romance'] = 'Love/romance';
-$a->strings['Work/employment'] = 'Work/employment';
-$a->strings['School/education'] = 'School/education';
-$a->strings['This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet.'] = 'This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet.';
-$a->strings['Profiles'] = 'Profiles';
-$a->strings['Change profile photo'] = 'Change profile photo';
-$a->strings['Create New Profile'] = 'Create New Profile';
-$a->strings['Profile Image'] = 'Profile Image';
-$a->strings['Visible to everybody'] = 'Visible to everybody';
-$a->strings['Edit visibility'] = 'Edit visibility';
-$a->strings['Invalid profile identifier.'] = 'Invalid profile identifier.';
-$a->strings['Profile Visibility Editor'] = 'Profile Visibility Editor';
-$a->strings['Visible To'] = 'Visible To';
-$a->strings["All Contacts \x28with secure profile access\x29"] = "All Contacts \x28with secure profile access\x29";
-$a->strings['Invalid OpenID url'] = 'Invalid OpenID url';
-$a->strings['Please enter the required information.'] = 'Please enter the required information.';
-$a->strings['Please use a shorter name.'] = 'Please use a shorter name.';
-$a->strings['Name too short.'] = 'Name too short.';
-$a->strings["That doesn't appear to be your full \x28First Last\x29 name."] = "That doesn't appear to be your full \x28First Last\x29 name.";
-$a->strings['Your email domain is not among those allowed on this site.'] = 'Your email domain is not among those allowed on this site.';
-$a->strings['Not a valid email address.'] = 'Not a valid email address.';
-$a->strings['Cannot use that email.'] = 'Cannot use that email.';
-$a->strings['Your "nickname" can only contain "a-z", "0-9", "-", and "_", and must also begin with a letter.'] = 'Your "nickname" can only contain "a-z", "0-9", "-", and "_", and must also begin with a letter.';
-$a->strings['Nickname is already registered. Please choose another.'] = 'Nickname is already registered. Please choose another.';
-$a->strings['SERIOUS ERROR: Generation of security keys failed.'] = 'SERIOUS ERROR: Generation of security keys failed.';
-$a->strings['An error occurred during registration. Please try again.'] = 'An error occurred during registration. Please try again.';
-$a->strings['An error occurred creating your default profile. Please try again.'] = 'An error occurred creating your default profile. Please try again.';
-$a->strings['Registration successful. Please check your email for further instructions.'] = 'Registration successful. Please check your email for further instructions.';
-$a->strings['Failed to send email message. Here is the message that failed.'] = 'Failed to send email message. Here is the message that failed.';
-$a->strings['Your registration can not be processed.'] = 'Your registration can not be processed.';
-$a->strings['Your registration is pending approval by the site owner.'] = 'Your registration is pending approval by the site owner.';
-$a->strings["You may \x28optionally\x29 fill in this form via OpenID by supplying your OpenID and clicking 'Register'."] = "You may \x28optionally\x29 fill in this form via OpenID by supplying your OpenID and clicking 'Register'.";
-$a->strings['If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items.'] = 'If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items.';
-$a->strings["Your OpenID \x28optional\x29: "] = "Your OpenID \x28optional\x29: ";
-$a->strings['Members of this network prefer to communicate with real people who use their real names.'] = 'Members of this network prefer to communicate with real people who use their real names.';
-$a->strings['Include your profile in member directory?'] = 'Include your profile in member directory?';
-$a->strings['Registration'] = 'Registration';
-$a->strings['Your Full Name ' . "\x28" . 'e.g. Joe Smith' . "\x29" . ': '] = 'Your Full Name ' . "\x28" . 'e.g. Joe Smith' . "\x29" . ': ';
-$a->strings['Your Email Address: '] = 'Your Email Address: ';
-$a->strings['Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be \'<strong>nickname@$sitename</strong>\'.'] = 'Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be \'<strong>nickname@$sitename</strong>\'.';
-$a->strings['Choose a nickname: '] = 'Choose a nickname: ';
-$a->strings['Please login.'] = 'Please login.';
-$a->strings['Account approved.'] = 'Account approved.';
-$a->strings['Remove My Account'] = 'Remove My Account';
-$a->strings['This will completely remove your account. Once this has been done it is not recoverable.'] = 'This will completely remove your account. Once this has been done it is not recoverable.';
-$a->strings['Please enter your password for verification:'] = 'Please enter your password for verification:';
-$a->strings['No results.'] = 'No results.';
-$a->strings['Passwords do not match. Password unchanged.'] = 'Passwords do not match. Password unchanged.';
-$a->strings['Empty passwords are not allowed. Password unchanged.'] = 'Empty passwords are not allowed. Password unchanged.';
-$a->strings['Password changed.'] = 'Password changed.';
-$a->strings['Password update failed. Please try again.'] = 'Password update failed. Please try again.';
-$a->strings[' Please use a shorter name.'] = ' Please use a shorter name.';
-$a->strings[' Name too short.'] = ' Name too short.';
-$a->strings[' Not valid email.'] = ' Not valid email.';
-$a->strings[' Cannot change to that email.'] = ' Cannot change to that email.';
-$a->strings['Settings updated.'] = 'Settings updated.';
-$a->strings['Plugin Settings'] = 'Plugin Settings';
-$a->strings['Account Settings'] = 'Account Settings';
-$a->strings['No Plugin settings configured'] = 'No Plugin settings configured';
-$a->strings['Normal Account'] = 'Normal Account';
-$a->strings['This account is a normal personal profile'] = 'This account is a normal personal profile';
-$a->strings['Soapbox Account'] = 'Soapbox Account';
-$a->strings['Automatically approve all connection/friend requests as read-only fans'] = 'Automatically approve all connection/friend requests as read-only fans';
-$a->strings['Community/Celebrity Account'] = 'Community/Celebrity Account';
-$a->strings['Automatically approve all connection/friend requests as read-write fans'] = 'Automatically approve all connection/friend requests as read-write fans';
-$a->strings['Automatic Friend Account'] = 'Automatic Friend Account';
-$a->strings['Automatically approve all connection/friend requests as friends'] = 'Automatically approve all connection/friend requests as friends';
-$a->strings['OpenID: '] = 'OpenID: ';
-$a->strings["&nbsp;\x28Optional\x29 Allow this OpenID to login to this account."] = "&nbsp;\x28Optional\x29 Allow this OpenID to login to this account.";
-$a->strings['Publish your default profile in site directory?'] = 'Publish your default profile in site directory?';
-$a->strings['Publish your default profile in global social directory?'] = 'Publish your default profile in global social directory?';
-$a->strings['Profile is <strong>not published</strong>.'] = 'Profile is <strong>not published</strong>.';
-$a->strings['Your Identity Address is'] = 'Your Identity Address is';
-$a->strings['Export Personal Data'] = 'Export Personal Data';
-$a->strings['Basic Settings'] = 'Basic Settings';
-$a->strings['Full Name:'] = 'Full Name:';
-$a->strings['Email Address:'] = 'Email Address:';
-$a->strings['Your Timezone:'] = 'Your Timezone:';
-$a->strings['Default Post Location:'] = 'Default Post Location:';
-$a->strings['Use Browser Location:'] = 'Use Browser Location:';
-$a->strings['Display Theme:'] = 'Display Theme:';
-$a->strings['Security and Privacy Settings'] = 'Security and Privacy Settings';
-$a->strings['Maximum Friend Requests/Day:'] = 'Maximum Friend Requests/Day:';
-$a->strings["\x28to prevent spam abuse\x29"] = "\x28to prevent spam abuse\x29";
-$a->strings['Allow friends to post to your profile page:'] = 'Allow friends to post to your profile page:';
-$a->strings["Automatically expire \x28delete\x29 posts older than"] = "Automatically expire \x28delete\x29 posts older than";
-$a->strings['days'] = 'days';
-$a->strings['Notification Settings'] = 'Notification Settings';
-$a->strings['Send a notification email when:'] = 'Send a notification email when:';
-$a->strings['You receive an introduction'] = 'You receive an introduction';
-$a->strings['Your introductions are confirmed'] = 'Your introductions are confirmed';
-$a->strings['Someone writes on your profile wall'] = 'Someone writes on your profile wall';
-$a->strings['Someone writes a followup comment'] = 'Someone writes a followup comment';
-$a->strings['You receive a private message'] = 'You receive a private message';
-$a->strings['Password Settings'] = 'Password Settings';
-$a->strings['Leave password fields blank unless changing'] = 'Leave password fields blank unless changing';
-$a->strings['New Password:'] = 'New Password:';
-$a->strings['Confirm:'] = 'Confirm:';
-$a->strings['Advanced Page Settings'] = 'Advanced Page Settings';
-$a->strings['Default Post Permissions'] = 'Default Post Permissions';
-$a->strings["\x28click to open/close\x29"] = "\x28click to open/close\x29";
-$a->strings['Email/Mailbox Setup'] = 'Email/Mailbox Setup';
-$a->strings["If you wish to communicate with email contacts using this service \x28optional\x29, please specify how to connect to your mailbox."] = "If you wish to communicate with email contacts using this service \x28optional\x29, please specify how to connect to your mailbox.";
-$a->strings['IMAP server name:'] = 'IMAP server name:';
-$a->strings['IMAP port:'] = 'IMAP port:';
-$a->strings["Security \x28TLS or SSL\x29:"] = "Security \x28TLS or SSL\x29:";
-$a->strings['Email login name:'] = 'Email login name:';
-$a->strings['Email password:'] = 'Email password:';
-$a->strings["Reply-to address \x28Optional\x29:"] = "Reply-to address \x28Optional\x29:";
-$a->strings['Send public posts to all email contacts:'] = 'Send public posts to all email contacts:';
-$a->strings['Email access is disabled on this site.'] = 'Email access is disabled on this site.';
-$a->strings['Tag removed'] = 'Tag removed';
-$a->strings['Remove Item Tag'] = 'Remove Item Tag';
-$a->strings['Select a tag to remove: '] = 'Select a tag to remove: ';
-$a->strings['Remove'] = 'Remove';
-$a->strings['[Embedded content - reload page to view]'] = '[Embedded content - reload page to view]';
-$a->strings['No contacts.'] = 'No contacts.';
-$a->strings['File upload failed.'] = 'File upload failed.';
-$a->strings['Image exceeds size limit of %d'] = 'Image exceeds size limit of %d';
-$a->strings['Visible To:'] = 'Visible To:';
-$a->strings['everybody'] = 'everybody';
-$a->strings['Groups'] = 'Groups';
-$a->strings['Except For:'] = 'Except For:';
-$a->strings['Logged out.'] = 'Logged out.';
-$a->strings['Image/photo'] = 'Image/photo';
-$a->strings['Unknown | Not categorised'] = 'Unknown | Not categorised';
-$a->strings['Block immediately'] = 'Block immediately';
-$a->strings['Shady, spammer, self-marketer'] = 'Shady, spammer, self-marketer';
-$a->strings['Known to me, but no opinion'] = 'Known to me, but no opinion';
-$a->strings['OK, probably harmless'] = 'OK, probably harmless';
-$a->strings['Reputable, has my trust'] = 'Reputable, has my trust';
-$a->strings['Frequently'] = 'Frequently';
-$a->strings['Hourly'] = 'Hourly';
-$a->strings['Twice daily'] = 'Twice daily';
-$a->strings['Daily'] = 'Daily';
-$a->strings['Weekly'] = 'Weekly';
-$a->strings['Monthly'] = 'Monthly';
-$a->strings['View %s\'s profile'] = 'View %s\'s profile';
-$a->strings['View in context'] = 'View in context';
-$a->strings['See more posts like this'] = 'See more posts like this';
-$a->strings['See all %d comments'] = 'See all %d comments';
-$a->strings['to'] = 'to';
-$a->strings['Wall-to-Wall'] = 'Wall-to-Wall';
-$a->strings['via Wall-To-Wall:'] = 'via Wall-To-Wall:';
-$a->strings['%s likes this.'] = '%s likes this.';
-$a->strings['%s doesn\'t like this.'] = '%s doesn\'t like this.';
-$a->strings['<span %1$s>%2$d people</span> like this.'] = '<span %1$s>%2$d people</span> like this.';
-$a->strings['<span %1$s>%2$d people</span> don\'t like this.'] = '<span %1$s>%2$d people</span> don\'t like this.';
-$a->strings['and'] = 'and';
-$a->strings[', and %d other people'] = ', and %d other people';
-$a->strings['%s like this.'] = '%s like this.';
-$a->strings['%s don\'t like this.'] = '%s don\'t like this.';
-$a->strings['Please enter a YouTube link:'] = 'Please enter a YouTube link:';
-$a->strings["Please enter a video\x28.ogg\x29 link/URL:"] = "Please enter a video\x28.ogg\x29 link/URL:";
-$a->strings["Please enter an audio\x28.ogg\x29 link/URL:"] = "Please enter an audio\x28.ogg\x29 link/URL:";
-$a->strings['Where are you right now?'] = 'Where are you right now?';
-$a->strings['Enter a title for this item'] = 'Enter a title for this item';
-$a->strings['Set title'] = 'Set title';
-$a->strings['Miscellaneous'] = 'Miscellaneous';
-$a->strings['less than a second ago'] = 'less than a second ago';
-$a->strings['year'] = 'year';
-$a->strings['years'] = 'years';
-$a->strings['month'] = 'month';
-$a->strings['months'] = 'months';
-$a->strings['week'] = 'week';
-$a->strings['weeks'] = 'weeks';
-$a->strings['day'] = 'day';
-$a->strings['hour'] = 'hour';
-$a->strings['hours'] = 'hours';
-$a->strings['minute'] = 'minute';
-$a->strings['minutes'] = 'minutes';
-$a->strings['second'] = 'second';
-$a->strings['seconds'] = 'seconds';
-$a->strings[' ago'] = ' ago';
-$a->strings['Cannot locate DNS info for database server \'%s\''] = 'Cannot locate DNS info for database server \'%s\'';
-$a->strings['Create a new group'] = 'Create a new group';
-$a->strings['Everybody'] = 'Everybody';
-$a->strings['Birthday:'] = 'Birthday:';
-$a->strings['Home'] = 'Home';
-$a->strings['Apps'] = 'Apps';
-$a->strings['Directory'] = 'Directory';
-$a->strings['Network'] = 'Network';
-$a->strings['Manage'] = 'Manage';
-$a->strings['Settings'] = 'Settings';
-$a->strings["\x28no subject\x29"] = "\x28no subject\x29";
-$a->strings['Embedding disabled'] = 'Embedding disabled';
-$a->strings['From: '] = 'From: ';
-$a->strings['j F, Y'] = 'j F, Y';
-$a->strings['j F'] = 'j F';
-$a->strings['Age:'] = 'Age:';
-$a->strings['<span class="heart">&hearts;</span> Status:'] = '<span class="heart">&hearts;</span> Status:';
-$a->strings['Religion:'] = 'Religion:';
-$a->strings['About:'] = 'About:';
-$a->strings['Hobbies/Interests:'] = 'Hobbies/Interests:';
-$a->strings['Contact information and Social Networks:'] = 'Contact information and Social Networks:';
-$a->strings['Musical interests:'] = 'Musical interests:';
-$a->strings['Books, literature:'] = 'Books, literature:';
-$a->strings['Television:'] = 'Television:';
-$a->strings['Film/dance/culture/entertainment:'] = 'Film/dance/culture/entertainment:';
-$a->strings['Love/Romance:'] = 'Love/Romance:';
-$a->strings['Work/employment:'] = 'Work/employment:';
-$a->strings['School/education:'] = 'School/education:';
-$a->strings['Male'] = 'Male';
-$a->strings['Female'] = 'Female';
-$a->strings['Currently Male'] = 'Currently Male';
-$a->strings['Currently Female'] = 'Currently Female';
-$a->strings['Mostly Male'] = 'Mostly Male';
-$a->strings['Mostly Female'] = 'Mostly Female';
-$a->strings['Transgender'] = 'Transgender';
-$a->strings['Intersex'] = 'Intersex';
-$a->strings['Transsexual'] = 'Transsexual';
-$a->strings['Hermaphrodite'] = 'Hermaphrodite';
-$a->strings['Neuter'] = 'Neuter';
-$a->strings['Non-specific'] = 'Non-specific';
-$a->strings['Other'] = 'Other';
-$a->strings['Undecided'] = 'Undecided';
-$a->strings['Males'] = 'Males';
-$a->strings['Females'] = 'Females';
-$a->strings['Gay'] = 'Gay';
-$a->strings['Lesbian'] = 'Lesbian';
-$a->strings['No Preference'] = 'No Preference';
-$a->strings['Bisexual'] = 'Bisexual';
-$a->strings['Autosexual'] = 'Autosexual';
-$a->strings['Abstinent'] = 'Abstinent';
-$a->strings['Virgin'] = 'Virgin';
-$a->strings['Deviant'] = 'Deviant';
-$a->strings['Fetish'] = 'Fetish';
-$a->strings['Oodles'] = 'Oodles';
-$a->strings['Nonsexual'] = 'Nonsexual';
-$a->strings['Single'] = 'Single';
-$a->strings['Lonely'] = 'Lonely';
-$a->strings['Available'] = 'Available';
-$a->strings['Unavailable'] = 'Unavailable';
-$a->strings['Dating'] = 'Dating';
-$a->strings['Unfaithful'] = 'Unfaithful';
-$a->strings['Sex Addict'] = 'Sex Addict';
-$a->strings['Friends'] = 'Friends';
-$a->strings['Friends/Benefits'] = 'Friends/Benefits';
-$a->strings['Casual'] = 'Casual';
-$a->strings['Engaged'] = 'Engaged';
-$a->strings['Married'] = 'Married';
-$a->strings['Partners'] = 'Partners';
-$a->strings['Cohabiting'] = 'Cohabiting';
-$a->strings['Happy'] = 'Happy';
-$a->strings['Not Looking'] = 'Not Looking';
-$a->strings['Swinger'] = 'Swinger';
-$a->strings['Betrayed'] = 'Betrayed';
-$a->strings['Separated'] = 'Separated';
-$a->strings['Unstable'] = 'Unstable';
-$a->strings['Divorced'] = 'Divorced';
-$a->strings['Widowed'] = 'Widowed';
-$a->strings['Uncertain'] = 'Uncertain';
-$a->strings['Complicated'] = 'Complicated';
-$a->strings['Don\'t care'] = 'Don\'t care';
-$a->strings['Ask me'] = 'Ask me';
-$a->strings['Facebook disabled'] = 'Facebook disabled';
-$a->strings['Updating contacts'] = 'Updating contacts';
-$a->strings['Facebook API key is missing.'] = 'Facebook API key is missing.';
-$a->strings['Facebook Connect'] = 'Facebook Connect';
-$a->strings['Install Facebook connector for this account.'] = 'Install Facebook connector for this account.';
-$a->strings['Remove Facebook connector'] = 'Remove Facebook connector';
-$a->strings['Post to Facebook by default'] = 'Post to Facebook by default';
-$a->strings['Facebook'] = 'Facebook';
-$a->strings['Facebook Connector Settings'] = 'Facebook Connector Settings';
-$a->strings['Post to Facebook'] = 'Post to Facebook';
-$a->strings['Post to Facebook cancelled because of multi-network access permission conflict.'] = 'Post to Facebook cancelled because of multi-network access permission conflict.';
-$a->strings['Image: '] = 'Image: ';
-$a->strings['View on Friendika'] = 'View on Friendika';
-$a->strings['Select files to upload: '] = 'Select files to upload: ';
-$a->strings['Use the following controls only if the Java uploader [above] fails to launch.'] = 'Use the following controls only if the Java uploader [above] fails to launch.';
-$a->strings['Upload a file'] = 'Upload a file';
-$a->strings['Drop files here to upload'] = 'Drop files here to upload';
-$a->strings['Failed'] = 'Failed';
-$a->strings['No files were uploaded.'] = 'No files were uploaded.';
-$a->strings['Uploaded file is empty'] = 'Uploaded file is empty';
-$a->strings['Uploaded file is too large'] = 'Uploaded file is too large';
-$a->strings['File has an invalid extension, it should be one of '] = 'File has an invalid extension, it should be one of ';
-$a->strings['Upload was cancelled, or server error encountered'] = 'Upload was cancelled, or server error encountered';
-$a->strings['OEmbed settings updated'] = 'OEmbed settings updated';
-$a->strings['URL to embed:'] = 'URL to embed:';
-$a->strings['Randplace Settings'] = 'Randplace Settings';
-$a->strings['Enable Randplace Plugin'] = 'Enable Randplace Plugin';
-$a->strings['Post to StatusNet'] = 'Post to StatusNet';
-$a->strings['Please contact your site administrator.<br />The provided API URL is not valid.'] = 'Please contact your site administrator.<br />The provided API URL is not valid.';
-$a->strings['We could not contact the StatusNet API with the Path you entered.'] = 'We could not contact the StatusNet API with the Path you entered.';
-$a->strings['StatusNet settings updated.'] = 'StatusNet settings updated.';
-$a->strings['StatusNet Posting Settings'] = 'StatusNet Posting Settings';
-$a->strings['Globally Available StatusNet OAuthKeys'] = 'Globally Available StatusNet OAuthKeys';
-$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance \x28see below\x29."] = "There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance \x28see below\x29.";
-$a->strings['Provide your own OAuth Credentials'] = 'Provide your own OAuth Credentials';
-$a->strings['No consumer key pair for StatusNet found. Register your Friendika Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.<br />Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendika installation at your favorited StatusNet installation.'] = 'No consumer key pair for StatusNet found. Register your Friendika Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.<br />Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendika installation at your favorited StatusNet installation.';
-$a->strings['OAuth Consumer Key'] = 'OAuth Consumer Key';
-$a->strings['OAuth Consumer Secret'] = 'OAuth Consumer Secret';
-$a->strings["Base API Path \x28remember the trailing /\x29"] = "Base API Path \x28remember the trailing /\x29";
-$a->strings['To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet.'] = 'To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet.';
-$a->strings['Log in with StatusNet'] = 'Log in with StatusNet';
-$a->strings['Copy the security code from StatusNet here'] = 'Copy the security code from StatusNet here';
-$a->strings['Cancel StatusNet Connection'] = 'Cancel StatusNet Connection';
-$a->strings['Currently connected to: '] = 'Currently connected to: ';
-$a->strings['If enabled all your <strong>public</strong> postings will be posted to the associated StatusNet account.'] = 'If enabled all your <strong>public</strong> postings will be posted to the associated StatusNet account.';
-$a->strings['Allow posting to StatusNet'] = 'Allow posting to StatusNet';
-$a->strings['Send public postings to StatusNet by default'] = 'Send public postings to StatusNet by default';
-$a->strings['Clear OAuth configuration'] = 'Clear OAuth configuration';
-$a->strings['Three Dimensional Tic-Tac-Toe'] = 'Three Dimensional Tic-Tac-Toe';
-$a->strings['3D Tic-Tac-Toe'] = '3D Tic-Tac-Toe';
-$a->strings['New game'] = 'New game';
-$a->strings['New game with handicap'] = 'New game with handicap';
-$a->strings['Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. '] = 'Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. ';
-$a->strings['In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels.'] = 'In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels.';
-$a->strings['The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage.'] = 'The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage.';
-$a->strings['You go first...'] = 'You go first...';
-$a->strings['I\'m going first this time...'] = 'I\'m going first this time...';
-$a->strings['You won!'] = 'You won!';
-$a->strings['"Cat" game!'] = '"Cat" game!';
-$a->strings['I won!'] = 'I won!';
-$a->strings['Post to Twitter'] = 'Post to Twitter';
-$a->strings['Twitter Posting Settings'] = 'Twitter Posting Settings';
-$a->strings['No consumer key pair for Twitter found. Please contact your site administrator.'] = 'No consumer key pair for Twitter found. Please contact your site administrator.';
-$a->strings['At this Friendika instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter.'] = 'At this Friendika instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter.';
-$a->strings['Copy the PIN from Twitter here'] = 'Copy the PIN from Twitter here';
-$a->strings['If enabled all your <strong>public</strong> postings will be posted to the associated Twitter account as well.'] = 'If enabled all your <strong>public</strong> postings will be posted to the associated Twitter account as well.';
-$a->strings['Send public postings to Twitter'] = 'Send public postings to Twitter';
-$a->strings['Connect on Friendika!'] = 'Connect on Friendika!';
-$a->strings['Widgets key: '] = 'Widgets key: ';
-$a->strings["Plugin Settings"] = "Plugin Settings";
-$a->strings['Africa/Abidjan'] = 'Africa/Abidjan';
-$a->strings['Africa/Accra'] = 'Africa/Accra';
-$a->strings['Africa/Addis_Ababa'] = 'Africa/Addis_Ababa';
-$a->strings['Africa/Algiers'] = 'Africa/Algiers';
-$a->strings['Africa/Asmara'] = 'Africa/Asmara';
-$a->strings['Africa/Asmera'] = 'Africa/Asmera';
-$a->strings['Africa/Bamako'] = 'Africa/Bamako';
-$a->strings['Africa/Bangui'] = 'Africa/Bangui';
-$a->strings['Africa/Banjul'] = 'Africa/Banjul';
-$a->strings['Africa/Bissau'] = 'Africa/Bissau';
-$a->strings['Africa/Blantyre'] = 'Africa/Blantyre';
-$a->strings['Africa/Brazzaville'] = 'Africa/Brazzaville';
-$a->strings['Africa/Bujumbura'] = 'Africa/Bujumbura';
-$a->strings['Africa/Cairo'] = 'Africa/Cairo';
-$a->strings['Africa/Casablanca'] = 'Africa/Casablanca';
-$a->strings['Africa/Ceuta'] = 'Africa/Ceuta';
-$a->strings['Africa/Conakry'] = 'Africa/Conakry';
-$a->strings['Africa/Dakar'] = 'Africa/Dakar';
-$a->strings['Africa/Dar_es_Salaam'] = 'Africa/Dar_es_Salaam';
-$a->strings['Africa/Djibouti'] = 'Africa/Djibouti';
-$a->strings['Africa/Douala'] = 'Africa/Douala';
-$a->strings['Africa/El_Aaiun'] = 'Africa/El_Aaiun';
-$a->strings['Africa/Freetown'] = 'Africa/Freetown';
-$a->strings['Africa/Gaborone'] = 'Africa/Gaborone';
-$a->strings['Africa/Harare'] = 'Africa/Harare';
-$a->strings['Africa/Johannesburg'] = 'Africa/Johannesburg';
-$a->strings['Africa/Kampala'] = 'Africa/Kampala';
-$a->strings['Africa/Khartoum'] = 'Africa/Khartoum';
-$a->strings['Africa/Kigali'] = 'Africa/Kigali';
-$a->strings['Africa/Kinshasa'] = 'Africa/Kinshasa';
-$a->strings['Africa/Lagos'] = 'Africa/Lagos';
-$a->strings['Africa/Libreville'] = 'Africa/Libreville';
-$a->strings['Africa/Lome'] = 'Africa/Lome';
-$a->strings['Africa/Luanda'] = 'Africa/Luanda';
-$a->strings['Africa/Lubumbashi'] = 'Africa/Lubumbashi';
-$a->strings['Africa/Lusaka'] = 'Africa/Lusaka';
-$a->strings['Africa/Malabo'] = 'Africa/Malabo';
-$a->strings['Africa/Maputo'] = 'Africa/Maputo';
-$a->strings['Africa/Maseru'] = 'Africa/Maseru';
-$a->strings['Africa/Mbabane'] = 'Africa/Mbabane';
-$a->strings['Africa/Mogadishu'] = 'Africa/Mogadishu';
-$a->strings['Africa/Monrovia'] = 'Africa/Monrovia';
-$a->strings['Africa/Nairobi'] = 'Africa/Nairobi';
-$a->strings['Africa/Ndjamena'] = 'Africa/Ndjamena';
-$a->strings['Africa/Niamey'] = 'Africa/Niamey';
-$a->strings['Africa/Nouakchott'] = 'Africa/Nouakchott';
-$a->strings['Africa/Ouagadougou'] = 'Africa/Ouagadougou';
-$a->strings['Africa/Porto-Novo'] = 'Africa/Porto-Novo';
-$a->strings['Africa/Sao_Tome'] = 'Africa/Sao_Tome';
-$a->strings['Africa/Timbuktu'] = 'Africa/Timbuktu';
-$a->strings['Africa/Tripoli'] = 'Africa/Tripoli';
-$a->strings['Africa/Tunis'] = 'Africa/Tunis';
-$a->strings['Africa/Windhoek'] = 'Africa/Windhoek';
-$a->strings['America/Adak'] = 'America/Adak';
-$a->strings['America/Anchorage'] = 'America/Anchorage';
-$a->strings['America/Anguilla'] = 'America/Anguilla';
-$a->strings['America/Antigua'] = 'America/Antigua';
-$a->strings['America/Araguaina'] = 'America/Araguaina';
-$a->strings['America/Argentina/Buenos_Aires'] = 'America/Argentina/Buenos_Aires';
-$a->strings['America/Argentina/Catamarca'] = 'America/Argentina/Catamarca';
-$a->strings['America/Argentina/ComodRivadavia'] = 'America/Argentina/ComodRivadavia';
-$a->strings['America/Argentina/Cordoba'] = 'America/Argentina/Cordoba';
-$a->strings['America/Argentina/Jujuy'] = 'America/Argentina/Jujuy';
-$a->strings['America/Argentina/La_Rioja'] = 'America/Argentina/La_Rioja';
-$a->strings['America/Argentina/Mendoza'] = 'America/Argentina/Mendoza';
-$a->strings['America/Argentina/Rio_Gallegos'] = 'America/Argentina/Rio_Gallegos';
-$a->strings['America/Argentina/Salta'] = 'America/Argentina/Salta';
-$a->strings['America/Argentina/San_Juan'] = 'America/Argentina/San_Juan';
-$a->strings['America/Argentina/San_Luis'] = 'America/Argentina/San_Luis';
-$a->strings['America/Argentina/Tucuman'] = 'America/Argentina/Tucuman';
-$a->strings['America/Argentina/Ushuaia'] = 'America/Argentina/Ushuaia';
-$a->strings['America/Aruba'] = 'America/Aruba';
-$a->strings['America/Asuncion'] = 'America/Asuncion';
-$a->strings['America/Atikokan'] = 'America/Atikokan';
-$a->strings['America/Atka'] = 'America/Atka';
-$a->strings['America/Bahia'] = 'America/Bahia';
-$a->strings['America/Barbados'] = 'America/Barbados';
-$a->strings['America/Belem'] = 'America/Belem';
-$a->strings['America/Belize'] = 'America/Belize';
-$a->strings['America/Blanc-Sablon'] = 'America/Blanc-Sablon';
-$a->strings['America/Boa_Vista'] = 'America/Boa_Vista';
-$a->strings['America/Bogota'] = 'America/Bogota';
-$a->strings['America/Boise'] = 'America/Boise';
-$a->strings['America/Buenos_Aires'] = 'America/Buenos_Aires';
-$a->strings['America/Cambridge_Bay'] = 'America/Cambridge_Bay';
-$a->strings['America/Campo_Grande'] = 'America/Campo_Grande';
-$a->strings['America/Cancun'] = 'America/Cancun';
-$a->strings['America/Caracas'] = 'America/Caracas';
-$a->strings['America/Catamarca'] = 'America/Catamarca';
-$a->strings['America/Cayenne'] = 'America/Cayenne';
-$a->strings['America/Cayman'] = 'America/Cayman';
-$a->strings['America/Chicago'] = 'America/Chicago';
-$a->strings['America/Chihuahua'] = 'America/Chihuahua';
-$a->strings['America/Coral_Harbour'] = 'America/Coral_Harbour';
-$a->strings['America/Cordoba'] = 'America/Cordoba';
-$a->strings['America/Costa_Rica'] = 'America/Costa_Rica';
-$a->strings['America/Cuiaba'] = 'America/Cuiaba';
-$a->strings['America/Curacao'] = 'America/Curacao';
-$a->strings['America/Danmarkshavn'] = 'America/Danmarkshavn';
-$a->strings['America/Dawson'] = 'America/Dawson';
-$a->strings['America/Dawson_Creek'] = 'America/Dawson_Creek';
-$a->strings['America/Denver'] = 'America/Denver';
-$a->strings['America/Detroit'] = 'America/Detroit';
-$a->strings['America/Dominica'] = 'America/Dominica';
-$a->strings['America/Edmonton'] = 'America/Edmonton';
-$a->strings['America/Eirunepe'] = 'America/Eirunepe';
-$a->strings['America/El_Salvador'] = 'America/El_Salvador';
-$a->strings['America/Ensenada'] = 'America/Ensenada';
-$a->strings['America/Fort_Wayne'] = 'America/Fort_Wayne';
-$a->strings['America/Fortaleza'] = 'America/Fortaleza';
-$a->strings['America/Glace_Bay'] = 'America/Glace_Bay';
-$a->strings['America/Godthab'] = 'America/Godthab';
-$a->strings['America/Goose_Bay'] = 'America/Goose_Bay';
-$a->strings['America/Grand_Turk'] = 'America/Grand_Turk';
-$a->strings['America/Grenada'] = 'America/Grenada';
-$a->strings['America/Guadeloupe'] = 'America/Guadeloupe';
-$a->strings['America/Guatemala'] = 'America/Guatemala';
-$a->strings['America/Guayaquil'] = 'America/Guayaquil';
-$a->strings['America/Guyana'] = 'America/Guyana';
-$a->strings['America/Halifax'] = 'America/Halifax';
-$a->strings['America/Havana'] = 'America/Havana';
-$a->strings['America/Hermosillo'] = 'America/Hermosillo';
-$a->strings['America/Indiana/Indianapolis'] = 'America/Indiana/Indianapolis';
-$a->strings['America/Indiana/Knox'] = 'America/Indiana/Knox';
-$a->strings['America/Indiana/Marengo'] = 'America/Indiana/Marengo';
-$a->strings['America/Indiana/Petersburg'] = 'America/Indiana/Petersburg';
-$a->strings['America/Indiana/Tell_City'] = 'America/Indiana/Tell_City';
-$a->strings['America/Indiana/Vevay'] = 'America/Indiana/Vevay';
-$a->strings['America/Indiana/Vincennes'] = 'America/Indiana/Vincennes';
-$a->strings['America/Indiana/Winamac'] = 'America/Indiana/Winamac';
-$a->strings['America/Indianapolis'] = 'America/Indianapolis';
-$a->strings['America/Inuvik'] = 'America/Inuvik';
-$a->strings['America/Iqaluit'] = 'America/Iqaluit';
-$a->strings['America/Jamaica'] = 'America/Jamaica';
-$a->strings['America/Jujuy'] = 'America/Jujuy';
-$a->strings['America/Juneau'] = 'America/Juneau';
-$a->strings['America/Kentucky/Louisville'] = 'America/Kentucky/Louisville';
-$a->strings['America/Kentucky/Monticello'] = 'America/Kentucky/Monticello';
-$a->strings['America/Knox_IN'] = 'America/Knox_IN';
-$a->strings['America/La_Paz'] = 'America/La_Paz';
-$a->strings['America/Lima'] = 'America/Lima';
-$a->strings['America/Los_Angeles'] = 'America/Los_Angeles';
-$a->strings['America/Louisville'] = 'America/Louisville';
-$a->strings['America/Maceio'] = 'America/Maceio';
-$a->strings['America/Managua'] = 'America/Managua';
-$a->strings['America/Manaus'] = 'America/Manaus';
-$a->strings['America/Marigot'] = 'America/Marigot';
-$a->strings['America/Martinique'] = 'America/Martinique';
-$a->strings['America/Matamoros'] = 'America/Matamoros';
-$a->strings['America/Mazatlan'] = 'America/Mazatlan';
-$a->strings['America/Mendoza'] = 'America/Mendoza';
-$a->strings['America/Menominee'] = 'America/Menominee';
-$a->strings['America/Merida'] = 'America/Merida';
-$a->strings['America/Mexico_City'] = 'America/Mexico_City';
-$a->strings['America/Miquelon'] = 'America/Miquelon';
-$a->strings['America/Moncton'] = 'America/Moncton';
-$a->strings['America/Monterrey'] = 'America/Monterrey';
-$a->strings['America/Montevideo'] = 'America/Montevideo';
-$a->strings['America/Montreal'] = 'America/Montreal';
-$a->strings['America/Montserrat'] = 'America/Montserrat';
-$a->strings['America/Nassau'] = 'America/Nassau';
-$a->strings['America/New_York'] = 'America/New_York';
-$a->strings['America/Nipigon'] = 'America/Nipigon';
-$a->strings['America/Nome'] = 'America/Nome';
-$a->strings['America/Noronha'] = 'America/Noronha';
-$a->strings['America/North_Dakota/Center'] = 'America/North_Dakota/Center';
-$a->strings['America/North_Dakota/New_Salem'] = 'America/North_Dakota/New_Salem';
-$a->strings['America/Ojinaga'] = 'America/Ojinaga';
-$a->strings['America/Panama'] = 'America/Panama';
-$a->strings['America/Pangnirtung'] = 'America/Pangnirtung';
-$a->strings['America/Paramaribo'] = 'America/Paramaribo';
-$a->strings['America/Phoenix'] = 'America/Phoenix';
-$a->strings['America/Port-au-Prince'] = 'America/Port-au-Prince';
-$a->strings['America/Port_of_Spain'] = 'America/Port_of_Spain';
-$a->strings['America/Porto_Acre'] = 'America/Porto_Acre';
-$a->strings['America/Porto_Velho'] = 'America/Porto_Velho';
-$a->strings['America/Puerto_Rico'] = 'America/Puerto_Rico';
-$a->strings['America/Rainy_River'] = 'America/Rainy_River';
-$a->strings['America/Rankin_Inlet'] = 'America/Rankin_Inlet';
-$a->strings['America/Recife'] = 'America/Recife';
-$a->strings['America/Regina'] = 'America/Regina';
-$a->strings['America/Resolute'] = 'America/Resolute';
-$a->strings['America/Rio_Branco'] = 'America/Rio_Branco';
-$a->strings['America/Rosario'] = 'America/Rosario';
-$a->strings['America/Santa_Isabel'] = 'America/Santa_Isabel';
-$a->strings['America/Santarem'] = 'America/Santarem';
-$a->strings['America/Santiago'] = 'America/Santiago';
-$a->strings['America/Santo_Domingo'] = 'America/Santo_Domingo';
-$a->strings['America/Sao_Paulo'] = 'America/Sao_Paulo';
-$a->strings['America/Scoresbysund'] = 'America/Scoresbysund';
-$a->strings['America/Shiprock'] = 'America/Shiprock';
-$a->strings['America/St_Barthelemy'] = 'America/St_Barthelemy';
-$a->strings['America/St_Johns'] = 'America/St_Johns';
-$a->strings['America/St_Kitts'] = 'America/St_Kitts';
-$a->strings['America/St_Lucia'] = 'America/St_Lucia';
-$a->strings['America/St_Thomas'] = 'America/St_Thomas';
-$a->strings['America/St_Vincent'] = 'America/St_Vincent';
-$a->strings['America/Swift_Current'] = 'America/Swift_Current';
-$a->strings['America/Tegucigalpa'] = 'America/Tegucigalpa';
-$a->strings['America/Thule'] = 'America/Thule';
-$a->strings['America/Thunder_Bay'] = 'America/Thunder_Bay';
-$a->strings['America/Tijuana'] = 'America/Tijuana';
-$a->strings['America/Toronto'] = 'America/Toronto';
-$a->strings['America/Tortola'] = 'America/Tortola';
-$a->strings['America/Vancouver'] = 'America/Vancouver';
-$a->strings['America/Virgin'] = 'America/Virgin';
-$a->strings['America/Whitehorse'] = 'America/Whitehorse';
-$a->strings['America/Winnipeg'] = 'America/Winnipeg';
-$a->strings['America/Yakutat'] = 'America/Yakutat';
-$a->strings['America/Yellowknife'] = 'America/Yellowknife';
-$a->strings['Antarctica/Casey'] = 'Antarctica/Casey';
-$a->strings['Antarctica/Davis'] = 'Antarctica/Davis';
-$a->strings['Antarctica/DumontDUrville'] = 'Antarctica/DumontDUrville';
-$a->strings['Antarctica/Macquarie'] = 'Antarctica/Macquarie';
-$a->strings['Antarctica/Mawson'] = 'Antarctica/Mawson';
-$a->strings['Antarctica/McMurdo'] = 'Antarctica/McMurdo';
-$a->strings['Antarctica/Palmer'] = 'Antarctica/Palmer';
-$a->strings['Antarctica/Rothera'] = 'Antarctica/Rothera';
-$a->strings['Antarctica/South_Pole'] = 'Antarctica/South_Pole';
-$a->strings['Antarctica/Syowa'] = 'Antarctica/Syowa';
-$a->strings['Antarctica/Vostok'] = 'Antarctica/Vostok';
-$a->strings['Arctic/Longyearbyen'] = 'Arctic/Longyearbyen';
-$a->strings['Asia/Aden'] = 'Asia/Aden';
-$a->strings['Asia/Almaty'] = 'Asia/Almaty';
-$a->strings['Asia/Amman'] = 'Asia/Amman';
-$a->strings['Asia/Anadyr'] = 'Asia/Anadyr';
-$a->strings['Asia/Aqtau'] = 'Asia/Aqtau';
-$a->strings['Asia/Aqtobe'] = 'Asia/Aqtobe';
-$a->strings['Asia/Ashgabat'] = 'Asia/Ashgabat';
-$a->strings['Asia/Ashkhabad'] = 'Asia/Ashkhabad';
-$a->strings['Asia/Baghdad'] = 'Asia/Baghdad';
-$a->strings['Asia/Bahrain'] = 'Asia/Bahrain';
-$a->strings['Asia/Baku'] = 'Asia/Baku';
-$a->strings['Asia/Bangkok'] = 'Asia/Bangkok';
-$a->strings['Asia/Beirut'] = 'Asia/Beirut';
-$a->strings['Asia/Bishkek'] = 'Asia/Bishkek';
-$a->strings['Asia/Brunei'] = 'Asia/Brunei';
-$a->strings['Asia/Calcutta'] = 'Asia/Calcutta';
-$a->strings['Asia/Choibalsan'] = 'Asia/Choibalsan';
-$a->strings['Asia/Chongqing'] = 'Asia/Chongqing';
-$a->strings['Asia/Chungking'] = 'Asia/Chungking';
-$a->strings['Asia/Colombo'] = 'Asia/Colombo';
-$a->strings['Asia/Dacca'] = 'Asia/Dacca';
-$a->strings['Asia/Damascus'] = 'Asia/Damascus';
-$a->strings['Asia/Dhaka'] = 'Asia/Dhaka';
-$a->strings['Asia/Dili'] = 'Asia/Dili';
-$a->strings['Asia/Dubai'] = 'Asia/Dubai';
-$a->strings['Asia/Dushanbe'] = 'Asia/Dushanbe';
-$a->strings['Asia/Gaza'] = 'Asia/Gaza';
-$a->strings['Asia/Harbin'] = 'Asia/Harbin';
-$a->strings['Asia/Ho_Chi_Minh'] = 'Asia/Ho_Chi_Minh';
-$a->strings['Asia/Hong_Kong'] = 'Asia/Hong_Kong';
-$a->strings['Asia/Hovd'] = 'Asia/Hovd';
-$a->strings['Asia/Irkutsk'] = 'Asia/Irkutsk';
-$a->strings['Asia/Istanbul'] = 'Asia/Istanbul';
-$a->strings['Asia/Jakarta'] = 'Asia/Jakarta';
-$a->strings['Asia/Jayapura'] = 'Asia/Jayapura';
-$a->strings['Asia/Jerusalem'] = 'Asia/Jerusalem';
-$a->strings['Asia/Kabul'] = 'Asia/Kabul';
-$a->strings['Asia/Kamchatka'] = 'Asia/Kamchatka';
-$a->strings['Asia/Karachi'] = 'Asia/Karachi';
-$a->strings['Asia/Kashgar'] = 'Asia/Kashgar';
-$a->strings['Asia/Kathmandu'] = 'Asia/Kathmandu';
-$a->strings['Asia/Katmandu'] = 'Asia/Katmandu';
-$a->strings['Asia/Kolkata'] = 'Asia/Kolkata';
-$a->strings['Asia/Krasnoyarsk'] = 'Asia/Krasnoyarsk';
-$a->strings['Asia/Kuala_Lumpur'] = 'Asia/Kuala_Lumpur';
-$a->strings['Asia/Kuching'] = 'Asia/Kuching';
-$a->strings['Asia/Kuwait'] = 'Asia/Kuwait';
-$a->strings['Asia/Macao'] = 'Asia/Macao';
-$a->strings['Asia/Macau'] = 'Asia/Macau';
-$a->strings['Asia/Magadan'] = 'Asia/Magadan';
-$a->strings['Asia/Makassar'] = 'Asia/Makassar';
-$a->strings['Asia/Manila'] = 'Asia/Manila';
-$a->strings['Asia/Muscat'] = 'Asia/Muscat';
-$a->strings['Asia/Nicosia'] = 'Asia/Nicosia';
-$a->strings['Asia/Novokuznetsk'] = 'Asia/Novokuznetsk';
-$a->strings['Asia/Novosibirsk'] = 'Asia/Novosibirsk';
-$a->strings['Asia/Omsk'] = 'Asia/Omsk';
-$a->strings['Asia/Oral'] = 'Asia/Oral';
-$a->strings['Asia/Phnom_Penh'] = 'Asia/Phnom_Penh';
-$a->strings['Asia/Pontianak'] = 'Asia/Pontianak';
-$a->strings['Asia/Pyongyang'] = 'Asia/Pyongyang';
-$a->strings['Asia/Qatar'] = 'Asia/Qatar';
-$a->strings['Asia/Qyzylorda'] = 'Asia/Qyzylorda';
-$a->strings['Asia/Rangoon'] = 'Asia/Rangoon';
-$a->strings['Asia/Riyadh'] = 'Asia/Riyadh';
-$a->strings['Asia/Saigon'] = 'Asia/Saigon';
-$a->strings['Asia/Sakhalin'] = 'Asia/Sakhalin';
-$a->strings['Asia/Samarkand'] = 'Asia/Samarkand';
-$a->strings['Asia/Seoul'] = 'Asia/Seoul';
-$a->strings['Asia/Shanghai'] = 'Asia/Shanghai';
-$a->strings['Asia/Singapore'] = 'Asia/Singapore';
-$a->strings['Asia/Taipei'] = 'Asia/Taipei';
-$a->strings['Asia/Tashkent'] = 'Asia/Tashkent';
-$a->strings['Asia/Tbilisi'] = 'Asia/Tbilisi';
-$a->strings['Asia/Tehran'] = 'Asia/Tehran';
-$a->strings['Asia/Tel_Aviv'] = 'Asia/Tel_Aviv';
-$a->strings['Asia/Thimbu'] = 'Asia/Thimbu';
-$a->strings['Asia/Thimphu'] = 'Asia/Thimphu';
-$a->strings['Asia/Tokyo'] = 'Asia/Tokyo';
-$a->strings['Asia/Ujung_Pandang'] = 'Asia/Ujung_Pandang';
-$a->strings['Asia/Ulaanbaatar'] = 'Asia/Ulaanbaatar';
-$a->strings['Asia/Ulan_Bator'] = 'Asia/Ulan_Bator';
-$a->strings['Asia/Urumqi'] = 'Asia/Urumqi';
-$a->strings['Asia/Vientiane'] = 'Asia/Vientiane';
-$a->strings['Asia/Vladivostok'] = 'Asia/Vladivostok';
-$a->strings['Asia/Yakutsk'] = 'Asia/Yakutsk';
-$a->strings['Asia/Yekaterinburg'] = 'Asia/Yekaterinburg';
-$a->strings['Asia/Yerevan'] = 'Asia/Yerevan';
-$a->strings['Atlantic/Azores'] = 'Atlantic/Azores';
-$a->strings['Atlantic/Bermuda'] = 'Atlantic/Bermuda';
-$a->strings['Atlantic/Canary'] = 'Atlantic/Canary';
-$a->strings['Atlantic/Cape_Verde'] = 'Atlantic/Cape_Verde';
-$a->strings['Atlantic/Faeroe'] = 'Atlantic/Faeroe';
-$a->strings['Atlantic/Faroe'] = 'Atlantic/Faroe';
-$a->strings['Atlantic/Jan_Mayen'] = 'Atlantic/Jan_Mayen';
-$a->strings['Atlantic/Madeira'] = 'Atlantic/Madeira';
-$a->strings['Atlantic/Reykjavik'] = 'Atlantic/Reykjavik';
-$a->strings['Atlantic/South_Georgia'] = 'Atlantic/South_Georgia';
-$a->strings['Atlantic/St_Helena'] = 'Atlantic/St_Helena';
-$a->strings['Atlantic/Stanley'] = 'Atlantic/Stanley';
-$a->strings['Australia/ACT'] = 'Australia/ACT';
-$a->strings['Australia/Adelaide'] = 'Australia/Adelaide';
-$a->strings['Australia/Brisbane'] = 'Australia/Brisbane';
-$a->strings['Australia/Broken_Hill'] = 'Australia/Broken_Hill';
-$a->strings['Australia/Canberra'] = 'Australia/Canberra';
-$a->strings['Australia/Currie'] = 'Australia/Currie';
-$a->strings['Australia/Darwin'] = 'Australia/Darwin';
-$a->strings['Australia/Eucla'] = 'Australia/Eucla';
-$a->strings['Australia/Hobart'] = 'Australia/Hobart';
-$a->strings['Australia/LHI'] = 'Australia/LHI';
-$a->strings['Australia/Lindeman'] = 'Australia/Lindeman';
-$a->strings['Australia/Lord_Howe'] = 'Australia/Lord_Howe';
-$a->strings['Australia/Melbourne'] = 'Australia/Melbourne';
-$a->strings['Australia/North'] = 'Australia/North';
-$a->strings['Australia/NSW'] = 'Australia/NSW';
-$a->strings['Australia/Perth'] = 'Australia/Perth';
-$a->strings['Australia/Queensland'] = 'Australia/Queensland';
-$a->strings['Australia/South'] = 'Australia/South';
-$a->strings['Australia/Sydney'] = 'Australia/Sydney';
-$a->strings['Australia/Tasmania'] = 'Australia/Tasmania';
-$a->strings['Australia/Victoria'] = 'Australia/Victoria';
-$a->strings['Australia/West'] = 'Australia/West';
-$a->strings['Australia/Yancowinna'] = 'Australia/Yancowinna';
-$a->strings['Brazil/Acre'] = 'Brazil/Acre';
-$a->strings['Brazil/DeNoronha'] = 'Brazil/DeNoronha';
-$a->strings['Brazil/East'] = 'Brazil/East';
-$a->strings['Brazil/West'] = 'Brazil/West';
-$a->strings['Canada/Atlantic'] = 'Canada/Atlantic';
-$a->strings['Canada/Central'] = 'Canada/Central';
-$a->strings['Canada/East-Saskatchewan'] = 'Canada/East-Saskatchewan';
-$a->strings['Canada/Eastern'] = 'Canada/Eastern';
-$a->strings['Canada/Mountain'] = 'Canada/Mountain';
-$a->strings['Canada/Newfoundland'] = 'Canada/Newfoundland';
-$a->strings['Canada/Pacific'] = 'Canada/Pacific';
-$a->strings['Canada/Saskatchewan'] = 'Canada/Saskatchewan';
-$a->strings['Canada/Yukon'] = 'Canada/Yukon';
-$a->strings['CET'] = 'CET';
-$a->strings['Chile/Continental'] = 'Chile/Continental';
-$a->strings['Chile/EasterIsland'] = 'Chile/EasterIsland';
-$a->strings['CST6CDT'] = 'CST6CDT';
-$a->strings['Cuba'] = 'Cuba';
-$a->strings['EET'] = 'EET';
-$a->strings['Egypt'] = 'Egypt';
-$a->strings['Eire'] = 'Eire';
-$a->strings['EST'] = 'EST';
-$a->strings['EST5EDT'] = 'EST5EDT';
-$a->strings['Etc/GMT'] = 'Etc/GMT';
-$a->strings['Etc/GMT+0'] = 'Etc/GMT+0';
-$a->strings['Etc/GMT+1'] = 'Etc/GMT+1';
-$a->strings['Etc/GMT+10'] = 'Etc/GMT+10';
-$a->strings['Etc/GMT+11'] = 'Etc/GMT+11';
-$a->strings['Etc/GMT+12'] = 'Etc/GMT+12';
-$a->strings['Etc/GMT+2'] = 'Etc/GMT+2';
-$a->strings['Etc/GMT+3'] = 'Etc/GMT+3';
-$a->strings['Etc/GMT+4'] = 'Etc/GMT+4';
-$a->strings['Etc/GMT+5'] = 'Etc/GMT+5';
-$a->strings['Etc/GMT+6'] = 'Etc/GMT+6';
-$a->strings['Etc/GMT+7'] = 'Etc/GMT+7';
-$a->strings['Etc/GMT+8'] = 'Etc/GMT+8';
-$a->strings['Etc/GMT+9'] = 'Etc/GMT+9';
-$a->strings['Etc/GMT-0'] = 'Etc/GMT-0';
-$a->strings['Etc/GMT-1'] = 'Etc/GMT-1';
-$a->strings['Etc/GMT-10'] = 'Etc/GMT-10';
-$a->strings['Etc/GMT-11'] = 'Etc/GMT-11';
-$a->strings['Etc/GMT-12'] = 'Etc/GMT-12';
-$a->strings['Etc/GMT-13'] = 'Etc/GMT-13';
-$a->strings['Etc/GMT-14'] = 'Etc/GMT-14';
-$a->strings['Etc/GMT-2'] = 'Etc/GMT-2';
-$a->strings['Etc/GMT-3'] = 'Etc/GMT-3';
-$a->strings['Etc/GMT-4'] = 'Etc/GMT-4';
-$a->strings['Etc/GMT-5'] = 'Etc/GMT-5';
-$a->strings['Etc/GMT-6'] = 'Etc/GMT-6';
-$a->strings['Etc/GMT-7'] = 'Etc/GMT-7';
-$a->strings['Etc/GMT-8'] = 'Etc/GMT-8';
-$a->strings['Etc/GMT-9'] = 'Etc/GMT-9';
-$a->strings['Etc/GMT0'] = 'Etc/GMT0';
-$a->strings['Etc/Greenwich'] = 'Etc/Greenwich';
-$a->strings['Etc/UCT'] = 'Etc/UCT';
-$a->strings['Etc/Universal'] = 'Etc/Universal';
-$a->strings['Etc/UTC'] = 'Etc/UTC';
-$a->strings['Etc/Zulu'] = 'Etc/Zulu';
-$a->strings['Europe/Amsterdam'] = 'Europe/Amsterdam';
-$a->strings['Europe/Andorra'] = 'Europe/Andorra';
-$a->strings['Europe/Athens'] = 'Europe/Athens';
-$a->strings['Europe/Belfast'] = 'Europe/Belfast';
-$a->strings['Europe/Belgrade'] = 'Europe/Belgrade';
-$a->strings['Europe/Berlin'] = 'Europe/Berlin';
-$a->strings['Europe/Bratislava'] = 'Europe/Bratislava';
-$a->strings['Europe/Brussels'] = 'Europe/Brussels';
-$a->strings['Europe/Bucharest'] = 'Europe/Bucharest';
-$a->strings['Europe/Budapest'] = 'Europe/Budapest';
-$a->strings['Europe/Chisinau'] = 'Europe/Chisinau';
-$a->strings['Europe/Copenhagen'] = 'Europe/Copenhagen';
-$a->strings['Europe/Dublin'] = 'Europe/Dublin';
-$a->strings['Europe/Gibraltar'] = 'Europe/Gibraltar';
-$a->strings['Europe/Guernsey'] = 'Europe/Guernsey';
-$a->strings['Europe/Helsinki'] = 'Europe/Helsinki';
-$a->strings['Europe/Isle_of_Man'] = 'Europe/Isle_of_Man';
-$a->strings['Europe/Istanbul'] = 'Europe/Istanbul';
-$a->strings['Europe/Jersey'] = 'Europe/Jersey';
-$a->strings['Europe/Kaliningrad'] = 'Europe/Kaliningrad';
-$a->strings['Europe/Kiev'] = 'Europe/Kiev';
-$a->strings['Europe/Lisbon'] = 'Europe/Lisbon';
-$a->strings['Europe/Ljubljana'] = 'Europe/Ljubljana';
-$a->strings['Europe/London'] = 'Europe/London';
-$a->strings['Europe/Luxembourg'] = 'Europe/Luxembourg';
-$a->strings['Europe/Madrid'] = 'Europe/Madrid';
-$a->strings['Europe/Malta'] = 'Europe/Malta';
-$a->strings['Europe/Mariehamn'] = 'Europe/Mariehamn';
-$a->strings['Europe/Minsk'] = 'Europe/Minsk';
-$a->strings['Europe/Monaco'] = 'Europe/Monaco';
-$a->strings['Europe/Moscow'] = 'Europe/Moscow';
-$a->strings['Europe/Nicosia'] = 'Europe/Nicosia';
-$a->strings['Europe/Oslo'] = 'Europe/Oslo';
-$a->strings['Europe/Paris'] = 'Europe/Paris';
-$a->strings['Europe/Podgorica'] = 'Europe/Podgorica';
-$a->strings['Europe/Prague'] = 'Europe/Prague';
-$a->strings['Europe/Riga'] = 'Europe/Riga';
-$a->strings['Europe/Rome'] = 'Europe/Rome';
-$a->strings['Europe/Samara'] = 'Europe/Samara';
-$a->strings['Europe/San_Marino'] = 'Europe/San_Marino';
-$a->strings['Europe/Sarajevo'] = 'Europe/Sarajevo';
-$a->strings['Europe/Simferopol'] = 'Europe/Simferopol';
-$a->strings['Europe/Skopje'] = 'Europe/Skopje';
-$a->strings['Europe/Sofia'] = 'Europe/Sofia';
-$a->strings['Europe/Stockholm'] = 'Europe/Stockholm';
-$a->strings['Europe/Tallinn'] = 'Europe/Tallinn';
-$a->strings['Europe/Tirane'] = 'Europe/Tirane';
-$a->strings['Europe/Tiraspol'] = 'Europe/Tiraspol';
-$a->strings['Europe/Uzhgorod'] = 'Europe/Uzhgorod';
-$a->strings['Europe/Vaduz'] = 'Europe/Vaduz';
-$a->strings['Europe/Vatican'] = 'Europe/Vatican';
-$a->strings['Europe/Vienna'] = 'Europe/Vienna';
-$a->strings['Europe/Vilnius'] = 'Europe/Vilnius';
-$a->strings['Europe/Volgograd'] = 'Europe/Volgograd';
-$a->strings['Europe/Warsaw'] = 'Europe/Warsaw';
-$a->strings['Europe/Zagreb'] = 'Europe/Zagreb';
-$a->strings['Europe/Zaporozhye'] = 'Europe/Zaporozhye';
-$a->strings['Europe/Zurich'] = 'Europe/Zurich';
-$a->strings['Factory'] = 'Factory';
-$a->strings['GB'] = 'GB';
-$a->strings['GB-Eire'] = 'GB-Eire';
-$a->strings['GMT'] = 'GMT';
-$a->strings['GMT+0'] = 'GMT+0';
-$a->strings['GMT-0'] = 'GMT-0';
-$a->strings['GMT0'] = 'GMT0';
-$a->strings['Greenwich'] = 'Greenwich';
-$a->strings['Hongkong'] = 'Hongkong';
-$a->strings['HST'] = 'HST';
-$a->strings['Iceland'] = 'Iceland';
-$a->strings['Indian/Antananarivo'] = 'Indian/Antananarivo';
-$a->strings['Indian/Chagos'] = 'Indian/Chagos';
-$a->strings['Indian/Christmas'] = 'Indian/Christmas';
-$a->strings['Indian/Cocos'] = 'Indian/Cocos';
-$a->strings['Indian/Comoro'] = 'Indian/Comoro';
-$a->strings['Indian/Kerguelen'] = 'Indian/Kerguelen';
-$a->strings['Indian/Mahe'] = 'Indian/Mahe';
-$a->strings['Indian/Maldives'] = 'Indian/Maldives';
-$a->strings['Indian/Mauritius'] = 'Indian/Mauritius';
-$a->strings['Indian/Mayotte'] = 'Indian/Mayotte';
-$a->strings['Indian/Reunion'] = 'Indian/Reunion';
-$a->strings['Iran'] = 'Iran';
-$a->strings['Israel'] = 'Israel';
-$a->strings['Jamaica'] = 'Jamaica';
-$a->strings['Japan'] = 'Japan';
-$a->strings['Kwajalein'] = 'Kwajalein';
-$a->strings['Libya'] = 'Libya';
-$a->strings['MET'] = 'MET';
-$a->strings['Mexico/BajaNorte'] = 'Mexico/BajaNorte';
-$a->strings['Mexico/BajaSur'] = 'Mexico/BajaSur';
-$a->strings['Mexico/General'] = 'Mexico/General';
-$a->strings['MST'] = 'MST';
-$a->strings['MST7MDT'] = 'MST7MDT';
-$a->strings['Navajo'] = 'Navajo';
-$a->strings['NZ'] = 'NZ';
-$a->strings['NZ-CHAT'] = 'NZ-CHAT';
-$a->strings['Pacific/Apia'] = 'Pacific/Apia';
-$a->strings['Pacific/Auckland'] = 'Pacific/Auckland';
-$a->strings['Pacific/Chatham'] = 'Pacific/Chatham';
-$a->strings['Pacific/Easter'] = 'Pacific/Easter';
-$a->strings['Pacific/Efate'] = 'Pacific/Efate';
-$a->strings['Pacific/Enderbury'] = 'Pacific/Enderbury';
-$a->strings['Pacific/Fakaofo'] = 'Pacific/Fakaofo';
-$a->strings['Pacific/Fiji'] = 'Pacific/Fiji';
-$a->strings['Pacific/Funafuti'] = 'Pacific/Funafuti';
-$a->strings['Pacific/Galapagos'] = 'Pacific/Galapagos';
-$a->strings['Pacific/Gambier'] = 'Pacific/Gambier';
-$a->strings['Pacific/Guadalcanal'] = 'Pacific/Guadalcanal';
-$a->strings['Pacific/Guam'] = 'Pacific/Guam';
-$a->strings['Pacific/Honolulu'] = 'Pacific/Honolulu';
-$a->strings['Pacific/Johnston'] = 'Pacific/Johnston';
-$a->strings['Pacific/Kiritimati'] = 'Pacific/Kiritimati';
-$a->strings['Pacific/Kosrae'] = 'Pacific/Kosrae';
-$a->strings['Pacific/Kwajalein'] = 'Pacific/Kwajalein';
-$a->strings['Pacific/Majuro'] = 'Pacific/Majuro';
-$a->strings['Pacific/Marquesas'] = 'Pacific/Marquesas';
-$a->strings['Pacific/Midway'] = 'Pacific/Midway';
-$a->strings['Pacific/Nauru'] = 'Pacific/Nauru';
-$a->strings['Pacific/Niue'] = 'Pacific/Niue';
-$a->strings['Pacific/Norfolk'] = 'Pacific/Norfolk';
-$a->strings['Pacific/Noumea'] = 'Pacific/Noumea';
-$a->strings['Pacific/Pago_Pago'] = 'Pacific/Pago_Pago';
-$a->strings['Pacific/Palau'] = 'Pacific/Palau';
-$a->strings['Pacific/Pitcairn'] = 'Pacific/Pitcairn';
-$a->strings['Pacific/Ponape'] = 'Pacific/Ponape';
-$a->strings['Pacific/Port_Moresby'] = 'Pacific/Port_Moresby';
-$a->strings['Pacific/Rarotonga'] = 'Pacific/Rarotonga';
-$a->strings['Pacific/Saipan'] = 'Pacific/Saipan';
-$a->strings['Pacific/Samoa'] = 'Pacific/Samoa';
-$a->strings['Pacific/Tahiti'] = 'Pacific/Tahiti';
-$a->strings['Pacific/Tarawa'] = 'Pacific/Tarawa';
-$a->strings['Pacific/Tongatapu'] = 'Pacific/Tongatapu';
-$a->strings['Pacific/Truk'] = 'Pacific/Truk';
-$a->strings['Pacific/Wake'] = 'Pacific/Wake';
-$a->strings['Pacific/Wallis'] = 'Pacific/Wallis';
-$a->strings['Pacific/Yap'] = 'Pacific/Yap';
-$a->strings['Poland'] = 'Poland';
-$a->strings['Portugal'] = 'Portugal';
-$a->strings['PRC'] = 'PRC';
-$a->strings['PST8PDT'] = 'PST8PDT';
-$a->strings['ROC'] = 'ROC';
-$a->strings['ROK'] = 'ROK';
-$a->strings['Singapore'] = 'Singapore';
-$a->strings['Turkey'] = 'Turkey';
-$a->strings['UCT'] = 'UCT';
-$a->strings['Universal'] = 'Universal';
-$a->strings['US/Alaska'] = 'US/Alaska';
-$a->strings['US/Aleutian'] = 'US/Aleutian';
-$a->strings['US/Arizona'] = 'US/Arizona';
-$a->strings['US/Central'] = 'US/Central';
-$a->strings['US/East-Indiana'] = 'US/East-Indiana';
-$a->strings['US/Eastern'] = 'US/Eastern';
-$a->strings['US/Hawaii'] = 'US/Hawaii';
-$a->strings['US/Indiana-Starke'] = 'US/Indiana-Starke';
-$a->strings['US/Michigan'] = 'US/Michigan';
-$a->strings['US/Mountain'] = 'US/Mountain';
-$a->strings['US/Pacific'] = 'US/Pacific';
-$a->strings['US/Pacific-New'] = 'US/Pacific-New';
-$a->strings['US/Samoa'] = 'US/Samoa';
-$a->strings['UTC'] = 'UTC';
-$a->strings['W-SU'] = 'W-SU';
-$a->strings['WET'] = 'WET';
-$a->strings['Zulu'] = 'Zulu';
+$a->strings["Monday"] = "";
+$a->strings["Tuesday"] = "";
+$a->strings["Wednesday"] = "";
+$a->strings["Thursday"] = "";
+$a->strings["Friday"] = "";
+$a->strings["Saturday"] = "";
+$a->strings["Sunday"] = "";
+$a->strings["January"] = "";
+$a->strings["February"] = "";
+$a->strings["March"] = "";
+$a->strings["April"] = "";
+$a->strings["May"] = "";
+$a->strings["June"] = "";
+$a->strings["July"] = "";
+$a->strings["August"] = "";
+$a->strings["September"] = "";
+$a->strings["October"] = "";
+$a->strings["November"] = "";
+$a->strings["December"] = "";
+$a->strings["bytes"] = "";
+$a->strings["Select an alternate language"] = "";
+$a->strings["Sharing notification from Diaspora network"] = "";
+$a->strings["Embedding disabled"] = "";
+$a->strings["Create a new group"] = "";
+$a->strings["Everybody"] = "";
+$a->strings["Logout"] = "";
+$a->strings["End this session"] = "";
+$a->strings["Login"] = "";
+$a->strings["Sign in"] = "";
+$a->strings["Home"] = "";
+$a->strings["Home Page"] = "";
+$a->strings["Create an account"] = "";
+$a->strings["Help and documentation"] = "";
+$a->strings["Apps"] = "";
+$a->strings["Addon applications, utilities, games"] = "";
+$a->strings["Search site content"] = "";
+$a->strings["Conversations on this site"] = "";
+$a->strings["Directory"] = "";
+$a->strings["People directory"] = "";
+$a->strings["Network"] = "";
+$a->strings["Conversations from your friends"] = "";
+$a->strings["Your posts and conversations"] = "";
+$a->strings["Notifications"] = "";
+$a->strings["Friend requests"] = "";
+$a->strings["Private mail"] = "";
+$a->strings["Manage"] = "";
+$a->strings["Manage other pages"] = "";
+$a->strings["Manage/edit profiles"] = "";
+$a->strings["Manage/edit friends and contacts"] = "";
+$a->strings["Admin"] = "";
+$a->strings["Site setup and configuration"] = "";
+$a->strings["Logged out."] = "";
+$a->strings["Miscellaneous"] = "";
+$a->strings["year"] = "";
+$a->strings["month"] = "";
+$a->strings["day"] = "";
+$a->strings["never"] = "";
+$a->strings["less than a second ago"] = "";
+$a->strings["years"] = "";
+$a->strings["months"] = "";
+$a->strings["week"] = "";
+$a->strings["weeks"] = "";
+$a->strings["days"] = "";
+$a->strings["hour"] = "";
+$a->strings["hours"] = "";
+$a->strings["minute"] = "";
+$a->strings["minutes"] = "";
+$a->strings["second"] = "";
+$a->strings["seconds"] = "";
+$a->strings[" ago"] = "";
+$a->strings["From: "] = "";
+$a->strings["Image/photo"] = "";
+$a->strings["Cannot locate DNS info for database server '%s'"] = "";
+$a->strings["Visible to everybody"] = "";
+$a->strings["show"] = "";
+$a->strings["don't show"] = "";
+$a->strings["(no subject)"] = "";
+$a->strings["You have a new follower at "] = "";
+$a->strings["event"] = "";
+$a->strings["View %s's profile"] = "";
+$a->strings["%s from %s"] = "";
+$a->strings["View in context"] = "";
+$a->strings["See more posts like this"] = "";
+$a->strings["See all %d comments"] = "";
+$a->strings["Select"] = "";
+$a->strings["toggle star status"] = "";
+$a->strings["to"] = "";
+$a->strings["Wall-to-Wall"] = "";
+$a->strings["via Wall-To-Wall:"] = "";
+$a->strings["Delete Selected Items"] = "";
+$a->strings["View status"] = "";
+$a->strings["View profile"] = "";
+$a->strings["View photos"] = "";
+$a->strings["View recent"] = "";
+$a->strings["Send PM"] = "";
+$a->strings["%s likes this."] = "";
+$a->strings["%s doesn't like this."] = "";
+$a->strings["<span %1\$s>%2\$d people</span> like this."] = "";
+$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = "";
+$a->strings["and"] = "";
+$a->strings[", and %d other people"] = "";
+$a->strings["%s like this."] = "";
+$a->strings["%s don't like this."] = "";
+$a->strings["Visible to <strong>everybody</strong>"] = "";
+$a->strings["Please enter a YouTube link:"] = "";
+$a->strings["Please enter a video(.ogg) link/URL:"] = "";
+$a->strings["Please enter an audio(.ogg) link/URL:"] = "";
+$a->strings["Where are you right now?"] = "";
+$a->strings["Enter a title for this item"] = "";
+$a->strings["Set title"] = "";
+$a->strings["Delete this item?"] = "";
+$a->strings["Create a New Account"] = "";
+$a->strings["Nickname or Email address: "] = "";
+$a->strings["Password: "] = "";
+$a->strings["Nickname/Email/OpenID: "] = "";
+$a->strings["Password (if not OpenID): "] = "";
+$a->strings["Forgot your password?"] = "";
+$a->strings["Connect"] = "";
+$a->strings[", "] = "";
+$a->strings["Status:"] = "";
+$a->strings["g A l F d"] = "";
+$a->strings["Birthday Reminders"] = "";
+$a->strings["Birthdays this week:"] = "";
+$a->strings["(Adjusted for local time)"] = "";
+$a->strings["[today]"] = "";
+$a->strings["Not Found"] = "";
+$a->strings["Page not found."] = "";
diff --git a/view/apiconfig.tpl b/view/api_config_xml.tpl
index 71ab241ce..3281e59dd 100644
--- a/view/apiconfig.tpl
+++ b/view/api_config_xml.tpl
@@ -1,25 +1,24 @@
-<?xml version="1.0" encoding="UTF-8"?>
<config>
<site>
- <name>$sitedesc</name>
- <server>$sitename</server>
+ <name>$config.site.name</name>
+ <server>$config.site.server</server>
<theme>default</theme>
<path></path>
- <logo>$sitelogo</logo>
+ <logo>$config.site.logo</logo>
<fancy>true</fancy>
<language>en</language>
- <email>$adminemail</email>
+ <email>$config.site.email</email>
<broughtby></broughtby>
<broughtbyurl></broughtbyurl>
<timezone>UTC</timezone>
- <closed>$siteclosed</closed>
+ <closed>$config.site.closed</closed>
<inviteonly>false</inviteonly>
- <private>$siteprivate</private>
- <textlimit>$textlimit</textlimit>
- <ssl>$has_ssl</ssl>
- <sslserver>$ssl_server</sslserver>
+ <private>$config.site.private</private>
+ <textlimit>$config.site.textlimit</textlimit>
+ <ssl>$config.site.ssl</ssl>
+ <sslserver>$config.site.sslserver</sslserver>
<shorturllength>30</shorturllength>
</site>
diff --git a/view/api_timeline_atom.tpl b/view/api_timeline_atom.tpl
index bd674f330..0e427feaa 100644
--- a/view/api_timeline_atom.tpl
+++ b/view/api_timeline_atom.tpl
@@ -1,10 +1,10 @@
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:statusnet="http://status.net/schema/api/1/">
<generator uri="http://status.net" version="0.9.7">StatusNet</generator>
- <id>tag:friendika:PublicTimeline</id>
- <title>Network on Friendika</title>
- <subtitle>Your network updates on Friendika</subtitle>
+ <id>$rss.self</id>
+ <title>Friendika</title>
+ <subtitle>Friendika API feed</subtitle>
<logo>$rss.logo</logo>
- <updated>$rss.updated</updated>
+ <updated>$rss.atom_updated</updated>
<link type="text/html" rel="alternate" href="$rss.alternate"/>
<link type="application/atom+xml" rel="self" href="$rss.self"/>
@@ -53,28 +53,17 @@
{{ for $statuses as $status }}
<entry>
<activity:object-type>$status.objecttype</activity:object-type>
- <id>$status.id</id>
+ <id>$status.message_id</id>
<title>$status.text</title>
- <content type="html">$status.html</content>
+ <content type="html">$status.statusnet_html</content>
<link rel="alternate" type="text/html" href="$status.url"/>
<activity:verb>$status.verb</activity:verb>
<published>$status.published</published>
<updated>$status.updated</updated>
- <!--
- <source>
- <id>http://identi.ca/api/statuses/user_timeline/397830.atom</id>
- <title>Sin Mobopolitan</title>
- <link rel="alternate" type="text/html" href="http://identi.ca/mobopolitan"/>
- <link rel="self" type="application/atom+xml" href="http://identi.ca/api/statuses/user_timeline/397830.atom"/>
- <link rel="license" href="http://creativecommons.org/licenses/by/3.0/"/>
- <icon>http://avatar.identi.ca/397830-96-20110312195623.jpeg</icon>
- <updated>2011-04-21T18:39:32+00:00</updated>
- </source>
- -->
<link rel="self" type="application/atom+xml" href="$status.self"/>
<link rel="edit" type="application/atom+xml" href="$status.edit"/>
- <statusnet:notice_info local_id="$status.id" source="$status.source" favorite="false" repeated="false">
+ <statusnet:notice_info local_id="$status.id" source="$status.source" >
</statusnet:notice_info>
<author>
@@ -82,10 +71,8 @@
<uri>$status.user.url</uri>
<name>$status.user.name</name>
<link rel="alternate" type="text/html" href="$status.user.url"/>
- <link rel="avatar" type="image/jpeg" media:width="106" media:height="106" href="$status.user.profile_image_url"/>
- <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="$status.user.profile_image_url"/>
<link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="$status.user.profile_image_url"/>
- <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="$status.user.profile_image_url"/>
+
<georss:point/>
<poco:preferredUsername>$status.user.screen_name</poco:preferredUsername>
<poco:displayName>$status.user.name</poco:displayName>
@@ -95,29 +82,7 @@
<poco:value>$status.user.url</poco:value>
<poco:primary>true</poco:primary>
</poco:urls>
- <!-- <statusnet:profile_info local_id="123710" following="true" blocking="false"></statusnet:profile_info> -->
</author>
- <!--Deprecation warning: activity:actor is present only for backward compatibility. It will be removed in the next version of StatusNet.-->
- <activity:actor>
- <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
- <id>$status.user.contact_url</id>
- <title>$status.user.name</title>
- <link rel="alternate" type="text/html" href="$status.user.url"/>
- <link rel="avatar" type="image/jpeg" media:width="106" media:height="106" href="$status.user.profile_image_url"/>
- <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="$status.user.profile_image_url"/>
- <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="$status.user.profile_image_url"/>
- <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="$status.user.profile_image_url"/>
- <georss:point/>
- <poco:preferredUsername>$status.user.screen_name</poco:preferredUsername>
- <poco:displayName>$status.user.name</poco:displayName>
- <poco:address />
- <poco:urls>
- <poco:type>homepage</poco:type>
- <poco:value>$status.user.url</poco:value>
- <poco:primary>true</poco:primary>
- </poco:urls>
- <!-- <statusnet:profile_info local_id="123710" following="true" blocking="false"></statusnet:profile_info> -->
- </activity:actor>
<link rel="ostatus:conversation" href="$status.url"/>
</entry>
diff --git a/view/api_timeline_xml.tpl b/view/api_timeline_xml.tpl
index 9914f6475..17860ca61 100644
--- a/view/api_timeline_xml.tpl
+++ b/view/api_timeline_xml.tpl
@@ -4,6 +4,7 @@
<created_at>$status.created_at</created_at>
<id>$status.id</id>
<text>$status.text</text>
+ <statusnet_html>$status.statusnet_html</statusnet_html>
<source>$status.source</source>
<truncated>$status.truncated</truncated>
<url>$status.url</url>
diff --git a/view/api_user_xml.tpl b/view/api_user_xml.tpl
index 15517fc42..78cc1f530 100644
--- a/view/api_user_xml.tpl
+++ b/view/api_user_xml.tpl
@@ -7,7 +7,7 @@
<profile_image_url>$user.profile_image_url</profile_image_url>
<url>$user.url</url>
<protected>$user.protected</protected>
- <followers_count>$user.followers</followers_count>
+ <followers_count>$user.followers_count</followers_count>
<profile_background_color>$user.profile_background_color</profile_background_color>
<profile_text_color>$user.profile_text_color</profile_text_color>
<profile_link_color>$user.profile_link_color</profile_link_color>
@@ -21,10 +21,10 @@
<profile_background_image_url>$user.profile_background_image_url</profile_background_image_url>
<profile_background_tile>$user.profile_background_tile</profile_background_tile>
<profile_use_background_image>$user.profile_use_background_image</profile_use_background_image>
- <notifications></notifications>
+ <notifications>$user.notifications</notifications>
<geo_enabled>$user.geo_enabled</geo_enabled>
<verified>$user.verified</verified>
- <following></following>
+ <following>$user.following</following>
<statuses_count>$user.statuses_count</statuses_count>
<lang>$user.lang</lang>
<contributors_enabled>$user.contributors_enabled</contributors_enabled>
diff --git a/view/atom_feed.tpl b/view/atom_feed.tpl
index 3d6bcc5b5..c7cc08297 100644
--- a/view/atom_feed.tpl
+++ b/view/atom_feed.tpl
@@ -19,10 +19,10 @@
<updated>$feed_updated</updated>
- <author>
+ <dfrn:owner>
<name dfrn:updated="$namdate" >$name</name>
<uri dfrn:updated="$uridate" >$profile_page</uri>
<link rel="photo" type="image/jpeg" dfrn:updated="$picdate" media:width="175" media:height="175" href="$photo" />
<link rel="avatar" type="image/jpeg" dfrn:updated="$picdate" media:width="175" media:height="175" href="$photo" />
$birthday
- </author>
+ </dfrn:owner>
diff --git a/view/atom_feed_dfrn.tpl b/view/atom_feed_dfrn.tpl
new file mode 100644
index 000000000..3d6bcc5b5
--- /dev/null
+++ b/view/atom_feed_dfrn.tpl
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<feed xmlns="http://www.w3.org/2005/Atom"
+ xmlns:thr="http://purl.org/syndication/thread/1.0"
+ xmlns:at="http://purl.org/atompub/tombstones/1.0"
+ xmlns:media="http://purl.org/syndication/atommedia"
+ xmlns:dfrn="http://purl.org/macgirvin/dfrn/1.0"
+ xmlns:as="http://activitystrea.ms/spec/1.0/"
+ xmlns:georss="http://www.georss.org/georss"
+ xmlns:poco="http://portablecontacts.net/spec/1.0"
+ xmlns:ostatus="http://ostatus.org/schema/1.0"
+ xmlns:statusnet="http://status.net/schema/api/1/" >
+
+ <id>$feed_id</id>
+ <title>$feed_title</title>
+ <generator uri="http://friendika.com" version="$version">Friendika</generator>
+ <link rel="license" href="http://creativecommons.org/licenses/by/3.0/" />
+ $hub
+ $salmon
+
+ <updated>$feed_updated</updated>
+
+ <author>
+ <name dfrn:updated="$namdate" >$name</name>
+ <uri dfrn:updated="$uridate" >$profile_page</uri>
+ <link rel="photo" type="image/jpeg" dfrn:updated="$picdate" media:width="175" media:height="175" href="$photo" />
+ <link rel="avatar" type="image/jpeg" dfrn:updated="$picdate" media:width="175" media:height="175" href="$photo" />
+ $birthday
+ </author>
diff --git a/view/de/messages.po b/view/de/messages.po
index 068303d24..98e8e6f22 100644
--- a/view/de/messages.po
+++ b/view/de/messages.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: friendika\n"
"Report-Msgid-Bugs-To: http://bugs.friendika.com/\n"
-"POT-Creation-Date: 2011-05-26 06:46-0700\n"
-"PO-Revision-Date: 2011-06-20 07:28+0000\n"
+"POT-Creation-Date: 2011-08-07 04:50-0700\n"
+"PO-Revision-Date: 2011-08-09 13:51+0000\n"
"Last-Translator: bavatar <tobias.diekershoff@gmx.net>\n"
"Language-Team: German (http://www.transifex.net/projects/p/friendika/team/de/)\n"
"MIME-Version: 1.0\n"
@@ -31,26 +31,27 @@ msgid "Contact update failed."
msgstr "Konnte den Kontakt nicht aktualisieren."
#: ../../mod/crepair.php:54 ../../mod/wall_attach.php:43
-#: ../../mod/photos.php:89 ../../mod/photos.php:802 ../../mod/editpost.php:10
-#: ../../mod/install.php:93 ../../mod/notifications.php:56
-#: ../../mod/contacts.php:106 ../../mod/settings.php:15
-#: ../../mod/settings.php:20 ../../mod/settings.php:251
-#: ../../mod/manage.php:75 ../../mod/network.php:6 ../../mod/notes.php:20
-#: ../../mod/attach.php:64 ../../mod/group.php:19
+#: ../../mod/fsuggest.php:78 ../../mod/events.php:102 ../../mod/photos.php:122
+#: ../../mod/photos.php:849 ../../mod/editpost.php:10 ../../mod/install.php:96
+#: ../../mod/notifications.php:62 ../../mod/contacts.php:132
+#: ../../mod/settings.php:41 ../../mod/settings.php:46
+#: ../../mod/settings.php:305 ../../mod/manage.php:75 ../../mod/network.php:6
+#: ../../mod/notes.php:20 ../../mod/attach.php:33 ../../mod/group.php:19
#: ../../mod/viewcontacts.php:21 ../../mod/register.php:27
-#: ../../mod/regmod.php:18 ../../mod/item.php:57 ../../mod/item.php:801
+#: ../../mod/regmod.php:111 ../../mod/item.php:110
#: ../../mod/profile_photo.php:19 ../../mod/profile_photo.php:133
#: ../../mod/profile_photo.php:144 ../../mod/profile_photo.php:155
-#: ../../mod/message.php:8 ../../mod/message.php:116
+#: ../../mod/message.php:8 ../../mod/message.php:116 ../../mod/admin.php:10
#: ../../mod/wall_upload.php:42 ../../mod/follow.php:8
-#: ../../mod/display.php:138 ../../mod/profiles.php:7
-#: ../../mod/profiles.php:230 ../../mod/invite.php:13 ../../mod/invite.php:54
-#: ../../mod/dfrn_confirm.php:53 ../../addon/facebook/facebook.php:242
-#: ../../index.php:256
+#: ../../mod/display.php:108 ../../mod/profiles.php:7
+#: ../../mod/profiles.php:226 ../../mod/invite.php:13 ../../mod/invite.php:81
+#: ../../mod/dfrn_confirm.php:53 ../../addon/facebook/facebook.php:308
+#: ../../include/items.php:1916 ../../index.php:266
msgid "Permission denied."
msgstr "Zugriff verweigert."
-#: ../../mod/crepair.php:68 ../../mod/contacts.php:214
+#: ../../mod/crepair.php:68 ../../mod/fsuggest.php:20
+#: ../../mod/fsuggest.php:92 ../../mod/contacts.php:240
#: ../../mod/dfrn_confirm.php:114
msgid "Contact not found."
msgstr "Kontakt nicht gefunden."
@@ -76,7 +77,7 @@ msgstr ""
"Bitte nutze den Zurück-Button deines Browsers <strong>jetzt</strong> wenn du"
" dir unsicher bist was auf dieser Seite gemacht wird."
-#: ../../mod/crepair.php:85
+#: ../../mod/crepair.php:85 ../../mod/admin.php:464 ../../mod/admin.php:473
msgid "Name"
msgstr "Name"
@@ -104,20 +105,25 @@ msgstr "URL Endpunkt für Benachrichtigungen"
msgid "Poll/Feed URL"
msgstr "Pull/Feed URL"
-#: ../../mod/crepair.php:100 ../../mod/photos.php:830 ../../mod/photos.php:887
-#: ../../mod/photos.php:1095 ../../mod/photos.php:1135
-#: ../../mod/photos.php:1174 ../../mod/photos.php:1205
-#: ../../mod/install.php:133 ../../mod/contacts.php:264
-#: ../../mod/settings.php:426 ../../mod/manage.php:106 ../../mod/group.php:76
-#: ../../mod/group.php:159 ../../mod/profiles.php:383 ../../mod/invite.php:68
-#: ../../addon/facebook/facebook.php:289
-#: ../../addon/randplace/randplace.php:179 ../../addon/oembed/oembed.php:49
-#: ../../addon/statusnet/statusnet.php:216
-#: ../../addon/statusnet/statusnet.php:230
-#: ../../addon/statusnet/statusnet.php:256
+#: ../../mod/crepair.php:100 ../../mod/fsuggest.php:107
+#: ../../mod/events.php:333 ../../mod/photos.php:877 ../../mod/photos.php:934
+#: ../../mod/photos.php:1144 ../../mod/photos.php:1184
+#: ../../mod/photos.php:1223 ../../mod/photos.php:1254
+#: ../../mod/install.php:137 ../../mod/contacts.php:296
+#: ../../mod/settings.php:482 ../../mod/manage.php:106 ../../mod/group.php:84
+#: ../../mod/group.php:167 ../../mod/admin.php:298 ../../mod/admin.php:461
+#: ../../mod/admin.php:587 ../../mod/admin.php:652 ../../mod/profiles.php:372
+#: ../../mod/invite.php:106 ../../addon/facebook/facebook.php:366
+#: ../../addon/randplace/randplace.php:178
+#: ../../addon/impressum/impressum.php:69 ../../addon/oembed/oembed.php:41
+#: ../../addon/statusnet/statusnet.php:223
+#: ../../addon/statusnet/statusnet.php:237
#: ../../addon/statusnet/statusnet.php:263
-#: ../../addon/statusnet/statusnet.php:285 ../../addon/twitter/twitter.php:156
-#: ../../addon/twitter/twitter.php:175 ../../include/conversation.php:383
+#: ../../addon/statusnet/statusnet.php:270
+#: ../../addon/statusnet/statusnet.php:292
+#: ../../addon/statusnet/statusnet.php:414 ../../addon/piwik/piwik.php:76
+#: ../../addon/twitter/twitter.php:171 ../../addon/twitter/twitter.php:194
+#: ../../addon/twitter/twitter.php:276 ../../include/conversation.php:406
msgid "Submit"
msgstr "Senden"
@@ -138,8 +144,112 @@ msgstr "Die Datei ist größer als das erlaubte Limit von %d"
msgid "File upload failed."
msgstr "Upload der Datei fehlgeschlagen."
+#: ../../mod/fsuggest.php:63
+msgid "Friend suggestion sent."
+msgstr "Kontaktvorschlag gesendet."
+
+#: ../../mod/fsuggest.php:97
+msgid "Suggest Friends"
+msgstr "Kontakte vorschlagen"
+
+#: ../../mod/fsuggest.php:99
+#, php-format
+msgid "Suggest a friend for %s"
+msgstr "Schlage %s einen Kontakt vor"
+
+#: ../../mod/events.php:112 ../../mod/photos.php:834 ../../mod/notes.php:46
+#: ../../mod/profile.php:116
+msgid "Status"
+msgstr "Status"
+
+#: ../../mod/events.php:113 ../../mod/photos.php:835 ../../mod/notes.php:47
+#: ../../mod/profperm.php:103 ../../mod/profile.php:117
+#: ../../include/profile_advanced.php:7
+msgid "Profile"
+msgstr "Profil"
+
+#: ../../mod/events.php:114 ../../mod/photos.php:836 ../../mod/notes.php:48
+#: ../../mod/profile.php:118
+msgid "Photos"
+msgstr "Bilder"
+
+#: ../../mod/events.php:115 ../../mod/events.php:120 ../../mod/photos.php:837
+#: ../../mod/notes.php:49 ../../mod/profile.php:119
+msgid "Events"
+msgstr "Veranstaltungen"
+
+#: ../../mod/events.php:116 ../../mod/photos.php:838 ../../mod/notes.php:50
+#: ../../mod/notes.php:55 ../../mod/profile.php:120
+msgid "Personal Notes"
+msgstr "Persönliche Notizen"
+
+#: ../../mod/events.php:210
+msgid "Create New Event"
+msgstr "Neue Veranstaltung erstellen"
+
+#: ../../mod/events.php:213
+msgid "Previous"
+msgstr "Vorherige"
+
+#: ../../mod/events.php:216
+msgid "Next"
+msgstr "Nächste"
+
+#: ../../mod/events.php:223
+msgid "l, F j"
+msgstr "l, F j"
+
+#: ../../mod/events.php:235
+msgid "Edit event"
+msgstr "Veranstaltung bearbeiten"
+
+#: ../../mod/events.php:237 ../../include/text.php:835
+msgid "link to source"
+msgstr "Link zum original Posting"
+
+#: ../../mod/events.php:305
+msgid "hour:minute"
+msgstr "Stunde:Minute"
+
+#: ../../mod/events.php:314
+msgid "Event details"
+msgstr "Veranstaltungsdetails"
+
+#: ../../mod/events.php:315
+#, php-format
+msgid "Format is %s %s. Starting date and Description are required."
+msgstr "Format ist %s %s. Anfangsdatum und Beschreibung sind notwendig."
+
+#: ../../mod/events.php:316
+msgid "Event Starts:"
+msgstr "Veranstaltungsbeginn:"
+
+#: ../../mod/events.php:319
+msgid "Finish date/time is not known or not relevant"
+msgstr "Enddatum/-zeit ist nicht bekannt oder nicht relevant"
+
+#: ../../mod/events.php:321
+msgid "Event Finishes:"
+msgstr "Veranstaltungsende:"
+
+#: ../../mod/events.php:324
+msgid "Adjust for viewer timezone"
+msgstr "An Zeitzone des Betrachters anpassen"
+
+#: ../../mod/events.php:326
+msgid "Description:"
+msgstr "Beschreibung"
+
+#: ../../mod/events.php:328 ../../include/event.php:37 ../../boot.php:869
+msgid "Location:"
+msgstr "Ort:"
+
+#: ../../mod/events.php:330
+msgid "Share this event"
+msgstr "Veranstaltung teilen"
+
#: ../../mod/tagrm.php:11 ../../mod/tagrm.php:94
-#: ../../mod/dfrn_request.php:644 ../../addon/js_upload/js_upload.php:41
+#: ../../mod/dfrn_request.php:644 ../../addon/js_upload/js_upload.php:45
msgid "Cancel"
msgstr "Abbrechen"
@@ -164,206 +274,231 @@ msgstr "Entfernen"
msgid "%s welcomes %s"
msgstr "%s heißt %s herzlich willkommen"
-#: ../../mod/photos.php:34
+#: ../../mod/photos.php:37
msgid "Photo Albums"
msgstr "Fotoalben"
-#: ../../mod/photos.php:38 ../../mod/photos.php:110 ../../mod/photos.php:810
-#: ../../mod/photos.php:879 ../../mod/photos.php:894 ../../mod/photos.php:1282
-#: ../../mod/photos.php:1293 ../../include/Photo.php:233
-#: ../../include/Photo.php:240 ../../include/Photo.php:247
-#: ../../include/items.php:1041 ../../include/items.php:1044
-#: ../../include/items.php:1047
+#: ../../mod/photos.php:45 ../../mod/photos.php:143 ../../mod/photos.php:857
+#: ../../mod/photos.php:926 ../../mod/photos.php:941 ../../mod/photos.php:1332
+#: ../../mod/photos.php:1344
msgid "Contact Photos"
msgstr "Kontaktbilder"
-#: ../../mod/photos.php:99
+#: ../../mod/photos.php:57 ../../mod/settings.php:9
+msgid "everybody"
+msgstr "jeder"
+
+#: ../../mod/photos.php:132
msgid "Contact information unavailable"
msgstr "Kontakt Informationen nicht verfügbar"
-#: ../../mod/photos.php:110 ../../mod/photos.php:535 ../../mod/photos.php:879
-#: ../../mod/photos.php:894 ../../mod/register.php:290
-#: ../../mod/register.php:297 ../../mod/register.php:304
+#: ../../mod/photos.php:143 ../../mod/photos.php:577 ../../mod/photos.php:926
+#: ../../mod/photos.php:941 ../../mod/register.php:316
+#: ../../mod/register.php:323 ../../mod/register.php:330
#: ../../mod/profile_photo.php:58 ../../mod/profile_photo.php:65
#: ../../mod/profile_photo.php:72 ../../mod/profile_photo.php:160
#: ../../mod/profile_photo.php:236 ../../mod/profile_photo.php:245
msgid "Profile Photos"
msgstr "Profilbilder"
-#: ../../mod/photos.php:120
+#: ../../mod/photos.php:153
msgid "Album not found."
msgstr "Album nicht gefunden."
-#: ../../mod/photos.php:138 ../../mod/photos.php:888
+#: ../../mod/photos.php:171 ../../mod/photos.php:935
msgid "Delete Album"
msgstr "Album löschen"
-#: ../../mod/photos.php:201 ../../mod/photos.php:1096
+#: ../../mod/photos.php:234 ../../mod/photos.php:1145
msgid "Delete Photo"
msgstr "Foto löschen"
-#: ../../mod/photos.php:473
+#: ../../mod/photos.php:508
msgid "was tagged in a"
msgstr "was tagged in a"
-#: ../../mod/photos.php:473 ../../mod/like.php:110
-#: ../../include/conversation.php:20
+#: ../../mod/photos.php:508 ../../mod/like.php:110
+#: ../../include/conversation.php:31
msgid "photo"
msgstr "Foto"
-#: ../../mod/photos.php:473
+#: ../../mod/photos.php:508
msgid "by"
msgstr "von"
-#: ../../mod/photos.php:563 ../../addon/js_upload/js_upload.php:306
+#: ../../mod/photos.php:608 ../../addon/js_upload/js_upload.php:310
msgid "Image exceeds size limit of "
msgstr "Die Bildgröße übersteigt das Limit von "
-#: ../../mod/photos.php:577 ../../mod/profile_photo.php:118
+#: ../../mod/photos.php:616
+msgid "Image file is empty."
+msgstr "Bilddatei ist leer."
+
+#: ../../mod/photos.php:630 ../../mod/profile_photo.php:118
#: ../../mod/wall_upload.php:65
msgid "Unable to process image."
msgstr "Konnte das Bild nicht bearbeiten."
-#: ../../mod/photos.php:597 ../../mod/profile_photo.php:241
-#: ../../mod/wall_upload.php:82
+#: ../../mod/photos.php:650 ../../mod/profile_photo.php:241
+#: ../../mod/wall_upload.php:84
msgid "Image upload failed."
msgstr "Hochladen des Bildes gescheitert."
-#: ../../mod/photos.php:680 ../../mod/dfrn_request.php:591
-#: ../../mod/viewcontacts.php:16 ../../mod/display.php:7
-#: ../../mod/search.php:13 ../../mod/directory.php:20
+#: ../../mod/photos.php:733 ../../mod/community.php:9
+#: ../../mod/dfrn_request.php:591 ../../mod/viewcontacts.php:16
+#: ../../mod/display.php:7 ../../mod/search.php:13 ../../mod/directory.php:20
msgid "Public access denied."
msgstr "Öffentlicher Zugriff verweigert."
-#: ../../mod/photos.php:690
+#: ../../mod/photos.php:743
msgid "No photos selected"
msgstr "Keine Bilder ausgewählt"
-#: ../../mod/photos.php:837
+#: ../../mod/photos.php:820
+msgid "Access to this item is restricted."
+msgstr "Zugriff zu diesem Eintrag wurde eingeschrängt."
+
+#: ../../mod/photos.php:884
msgid "Upload Photos"
msgstr "Bilder hochladen"
-#: ../../mod/photos.php:840 ../../mod/photos.php:883
+#: ../../mod/photos.php:887 ../../mod/photos.php:930
msgid "New album name: "
msgstr "Name des neuen Albums: "
-#: ../../mod/photos.php:841
+#: ../../mod/photos.php:888
msgid "or existing album name: "
msgstr "oder existierender Albumname: "
-#: ../../mod/photos.php:843 ../../mod/photos.php:1091
+#: ../../mod/photos.php:890 ../../mod/photos.php:1140
msgid "Permissions"
msgstr "Berechtigungen"
-#: ../../mod/photos.php:898
+#: ../../mod/photos.php:945
msgid "Edit Album"
msgstr "Album bearbeiten"
-#: ../../mod/photos.php:908 ../../mod/photos.php:1311
+#: ../../mod/photos.php:955 ../../mod/photos.php:1362
msgid "View Photo"
msgstr "Fotos betrachten"
-#: ../../mod/photos.php:937
+#: ../../mod/photos.php:984
msgid "Photo not available"
msgstr "Foto nicht verfügbar"
-#: ../../mod/photos.php:986
+#: ../../mod/photos.php:1033
msgid "Edit photo"
msgstr "Foto bearbeiten"
-#: ../../mod/photos.php:987
+#: ../../mod/photos.php:1034
msgid "Use as profile photo"
msgstr "Als Profilbild verwenden"
-#: ../../mod/photos.php:993 ../../include/conversation.php:316
+#: ../../mod/photos.php:1040 ../../include/conversation.php:339
msgid "Private Message"
msgstr "Private Nachricht"
-#: ../../mod/photos.php:1000
-msgid "<< Prev"
-msgstr "<< Vorherige"
-
-#: ../../mod/photos.php:1004
+#: ../../mod/photos.php:1051
msgid "View Full Size"
msgstr "Betrachte Originalgröße"
-#: ../../mod/photos.php:1009
-msgid "Next >>"
-msgstr "Nächste >>"
-
-#: ../../mod/photos.php:1071
+#: ../../mod/photos.php:1119
msgid "Tags: "
msgstr "Tags: "
-#: ../../mod/photos.php:1074
+#: ../../mod/photos.php:1122
msgid "[Remove any tag]"
msgstr "[Tag entfernen]"
-#: ../../mod/photos.php:1084
+#: ../../mod/photos.php:1133
msgid "New album name"
msgstr "Name des neuen Albums"
-#: ../../mod/photos.php:1087
+#: ../../mod/photos.php:1136
msgid "Caption"
msgstr "Bildunterschrift"
-#: ../../mod/photos.php:1089
+#: ../../mod/photos.php:1138
msgid "Add a Tag"
msgstr "Tag hinzufügen"
-#: ../../mod/photos.php:1093
+#: ../../mod/photos.php:1142
msgid ""
"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
msgstr ""
"Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
-#: ../../mod/photos.php:1113 ../../include/conversation.php:364
+#: ../../mod/photos.php:1162 ../../include/conversation.php:387
msgid "I like this (toggle)"
msgstr "Ich mag das (toggle)"
-#: ../../mod/photos.php:1114 ../../include/conversation.php:365
+#: ../../mod/photos.php:1163 ../../include/conversation.php:388
msgid "I don't like this (toggle)"
msgstr "Ich mag das nicht (toggle)"
-#: ../../mod/photos.php:1115 ../../include/conversation.php:366
-#: ../../include/conversation.php:731
+#: ../../mod/photos.php:1164 ../../include/conversation.php:389
+#: ../../include/conversation.php:743
msgid "Share"
msgstr "Teilen"
-#: ../../mod/photos.php:1116 ../../mod/editpost.php:97
+#: ../../mod/photos.php:1165 ../../mod/editpost.php:99
#: ../../mod/message.php:190 ../../mod/message.php:324
-#: ../../include/conversation.php:367 ../../include/conversation.php:741
+#: ../../include/conversation.php:390 ../../include/conversation.php:753
msgid "Please wait"
msgstr "Bitte warten"
-#: ../../mod/photos.php:1132 ../../mod/photos.php:1171
-#: ../../mod/photos.php:1202 ../../include/conversation.php:380
+#: ../../mod/photos.php:1181 ../../mod/photos.php:1220
+#: ../../mod/photos.php:1251 ../../include/conversation.php:403
msgid "This is you"
msgstr "Das bist du"
-#: ../../mod/photos.php:1134 ../../mod/photos.php:1173
-#: ../../mod/photos.php:1204 ../../include/conversation.php:382
-#: ../../boot.php:386
+#: ../../mod/photos.php:1183 ../../mod/photos.php:1222
+#: ../../mod/photos.php:1253 ../../include/conversation.php:405
+#: ../../boot.php:412
msgid "Comment"
msgstr "Kommentar"
-#: ../../mod/photos.php:1232 ../../mod/group.php:146
-#: ../../include/conversation.php:179 ../../include/conversation.php:393
+#: ../../mod/photos.php:1281 ../../mod/group.php:154 ../../mod/admin.php:468
+#: ../../include/conversation.php:424
msgid "Delete"
msgstr "Löschen"
-#: ../../mod/photos.php:1298
+#: ../../mod/photos.php:1349
msgid "Recent Photos"
msgstr "Neuste Fotos"
-#: ../../mod/photos.php:1302
+#: ../../mod/photos.php:1353
msgid "Upload New Photos"
msgstr "Weitere Fotos hochladen"
-#: ../../mod/photos.php:1315
+#: ../../mod/photos.php:1366
msgid "View Album"
msgstr "Album betrachten"
+#: ../../mod/community.php:14
+msgid "Not available."
+msgstr "Nicht verfügbar."
+
+#: ../../mod/community.php:26 ../../include/nav.php:79
+msgid "Community"
+msgstr "Gemeinschaft"
+
+#: ../../mod/community.php:56 ../../mod/search.php:65
+msgid "No results."
+msgstr "Keine Ergebnisse."
+
+#: ../../mod/community.php:83 ../../mod/network.php:302
+#: ../../mod/register.php:504 ../../mod/profile.php:241
+#: ../../mod/display.php:117
+msgid ""
+"Shared content is covered by the <a "
+"href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons "
+"Attribution 3.0</a> license."
+msgstr ""
+"Geteilte Inhalte innerhalb des Friendika Netzwerks sind unter der <a "
+"href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons "
+"Attribution 3.0</a> verfügbar."
+
#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
msgid "Item not found"
msgstr "Beitrag nicht gefunden"
@@ -372,62 +507,62 @@ msgstr "Beitrag nicht gefunden"
msgid "Edit post"
msgstr "Beitrag bearbeiten"
-#: ../../mod/editpost.php:75 ../../include/conversation.php:717
+#: ../../mod/editpost.php:75 ../../include/conversation.php:729
msgid "Post to Email"
msgstr "An Email senden"
-#: ../../mod/editpost.php:88 ../../include/group.php:169
-#: ../../include/conversation.php:391
+#: ../../mod/editpost.php:90 ../../include/group.php:171
+#: ../../include/group.php:172 ../../include/conversation.php:414
msgid "Edit"
msgstr "Bearbeiten"
-#: ../../mod/editpost.php:89 ../../mod/message.php:188
-#: ../../mod/message.php:322 ../../include/conversation.php:732
+#: ../../mod/editpost.php:91 ../../mod/message.php:188
+#: ../../mod/message.php:322 ../../include/conversation.php:744
msgid "Upload photo"
msgstr "Foto hochladen"
-#: ../../mod/editpost.php:90 ../../include/conversation.php:733
+#: ../../mod/editpost.php:92 ../../include/conversation.php:745
msgid "Attach file"
msgstr "Datei anhängen"
-#: ../../mod/editpost.php:91 ../../mod/message.php:189
-#: ../../mod/message.php:323 ../../include/conversation.php:734
+#: ../../mod/editpost.php:93 ../../mod/message.php:189
+#: ../../mod/message.php:323 ../../include/conversation.php:746
msgid "Insert web link"
msgstr "Weblink einfügen"
-#: ../../mod/editpost.php:92 ../../include/conversation.php:735
+#: ../../mod/editpost.php:94 ../../include/conversation.php:747
msgid "Insert YouTube video"
msgstr "YouTube Video einfügen"
-#: ../../mod/editpost.php:93 ../../include/conversation.php:736
+#: ../../mod/editpost.php:95 ../../include/conversation.php:748
msgid "Insert Vorbis [.ogg] video"
msgstr "Vorbis [.ogg] Video einfügen"
-#: ../../mod/editpost.php:94 ../../include/conversation.php:737
+#: ../../mod/editpost.php:96 ../../include/conversation.php:749
msgid "Insert Vorbis [.ogg] audio"
msgstr "Vorbis [.ogg] Audio einfügen"
-#: ../../mod/editpost.php:95 ../../include/conversation.php:738
+#: ../../mod/editpost.php:97 ../../include/conversation.php:750
msgid "Set your location"
msgstr "Deinen Standort festlegen"
-#: ../../mod/editpost.php:96 ../../include/conversation.php:739
+#: ../../mod/editpost.php:98 ../../include/conversation.php:751
msgid "Clear browser location"
msgstr "Browser Standort leeren"
-#: ../../mod/editpost.php:98 ../../include/conversation.php:742
+#: ../../mod/editpost.php:100 ../../include/conversation.php:754
msgid "Permission settings"
msgstr "Berechtigungseinstellungen"
-#: ../../mod/editpost.php:106 ../../include/conversation.php:750
+#: ../../mod/editpost.php:108 ../../include/conversation.php:762
msgid "CC: email addresses"
msgstr "CC: EMail Addresse"
-#: ../../mod/editpost.php:107 ../../include/conversation.php:751
+#: ../../mod/editpost.php:109 ../../include/conversation.php:763
msgid "Public post"
msgstr "Öffentlicher Beitrag"
-#: ../../mod/editpost.php:109 ../../include/conversation.php:753
+#: ../../mod/editpost.php:111 ../../include/conversation.php:765
msgid "Example: bob@example.com, mary@example.com"
msgstr "Z.B.: bob@example.com, mary@example.com"
@@ -443,11 +578,15 @@ msgstr ""
#: ../../mod/dfrn_request.php:125 ../../mod/dfrn_request.php:356
msgid "Warning: profile location has no identifiable owner name."
-msgstr "Warning: profile location has no identifiable owner name."
+msgstr ""
+"Warnung: Es konnte kein Name des Besitzers von der angegebenen Profiladresse"
+" gefunden werden."
#: ../../mod/dfrn_request.php:127 ../../mod/dfrn_request.php:358
msgid "Warning: profile location has no profile photo."
-msgstr "Warning: profile location has no profile photo."
+msgstr ""
+"Warnung: Es konnte kein Profilbild bei der angegebenen Profiladresse "
+"gefunden werden."
#: ../../mod/dfrn_request.php:130 ../../mod/dfrn_request.php:361
#, php-format
@@ -508,7 +647,7 @@ msgstr "Ungültige Profil URL."
msgid "Disallowed profile URL."
msgstr "Nicht erlaubte Profil URL."
-#: ../../mod/dfrn_request.php:406 ../../mod/contacts.php:90
+#: ../../mod/dfrn_request.php:406 ../../mod/contacts.php:116
msgid "Failed to update contact record."
msgstr "Aktualisierung der Kontaktdaten fehlgeschlagen."
@@ -542,7 +681,7 @@ msgstr "Bitte bestätige deine Vorstellung/Verbindungs Anfrage bei %s."
msgid "Confirm"
msgstr "Bestätigen"
-#: ../../mod/dfrn_request.php:542 ../../include/items.php:1440
+#: ../../mod/dfrn_request.php:542 ../../include/items.php:1505
msgid "[Name Withheld]"
msgstr "[Name Zurückgehalten]"
@@ -550,11 +689,11 @@ msgstr "[Name Zurückgehalten]"
msgid "Introduction received at "
msgstr "Vorstellung erhalten auf"
-#: ../../mod/dfrn_request.php:551 ../../mod/lostpass.php:40
-#: ../../mod/lostpass.php:102 ../../mod/register.php:335
-#: ../../mod/register.php:385 ../../mod/regmod.php:98
-#: ../../mod/dfrn_notify.php:191 ../../mod/dfrn_notify.php:443
-#: ../../mod/dfrn_confirm.php:658 ../../include/items.php:1449
+#: ../../mod/dfrn_request.php:551 ../../mod/lostpass.php:44
+#: ../../mod/lostpass.php:106 ../../mod/register.php:369
+#: ../../mod/register.php:423 ../../mod/regmod.php:54
+#: ../../mod/dfrn_notify.php:291 ../../mod/dfrn_notify.php:547
+#: ../../mod/dfrn_confirm.php:658 ../../include/items.php:1514
msgid "Administrator"
msgstr "Administrator"
@@ -575,18 +714,21 @@ msgid "Please answer the following:"
msgstr "Bitte beantworte folgende Fragen:"
#: ../../mod/dfrn_request.php:633
-msgid "Does $name know you?"
-msgstr "Kennt $name dich?"
+#, php-format
+msgid "Does %s know you?"
+msgstr "Kennt %s dich?"
-#: ../../mod/dfrn_request.php:634 ../../mod/settings.php:350
-#: ../../mod/settings.php:362 ../../mod/register.php:459
-#: ../../mod/profiles.php:358 ../../mod/profiles.php:367
+#: ../../mod/dfrn_request.php:634 ../../mod/settings.php:415
+#: ../../mod/settings.php:421 ../../mod/settings.php:429
+#: ../../mod/settings.php:433 ../../mod/register.php:498
+#: ../../mod/profiles.php:354
msgid "Yes"
msgstr "Ja"
-#: ../../mod/dfrn_request.php:635 ../../mod/settings.php:351
-#: ../../mod/settings.php:363 ../../mod/register.php:460
-#: ../../mod/profiles.php:359 ../../mod/profiles.php:368
+#: ../../mod/dfrn_request.php:635 ../../mod/settings.php:415
+#: ../../mod/settings.php:421 ../../mod/settings.php:429
+#: ../../mod/settings.php:433 ../../mod/register.php:499
+#: ../../mod/profiles.php:355
msgid "No"
msgstr "Nein"
@@ -626,44 +768,44 @@ msgstr "Adresse deines Profils:"
msgid "Submit Request"
msgstr "Anfrage abschicken"
-#: ../../mod/install.php:33
+#: ../../mod/install.php:34
msgid "Could not create/connect to database."
msgstr ""
"Konnte die Verbindung zur Datenbank nicht aufbauen bzw. die Datenbank "
"anlegen."
-#: ../../mod/install.php:38
+#: ../../mod/install.php:39
msgid "Connected to database."
msgstr "Mit der Datenbank verbunden."
-#: ../../mod/install.php:72
+#: ../../mod/install.php:75
msgid "Proceed with Installation"
msgstr "Mit der Installation fortfahren"
-#: ../../mod/install.php:74
+#: ../../mod/install.php:77
msgid "Your Friendika site database has been installed."
msgstr "Die Datenbank deiner Friendika Seite wurde erfolgreich installiert."
-#: ../../mod/install.php:75
+#: ../../mod/install.php:78
msgid ""
"IMPORTANT: You will need to [manually] setup a scheduled task for the "
"poller."
msgstr ""
"WICHTIG: Du musst [manuell] einen cron Job (o.ä.) für den Poller einrichten."
-#: ../../mod/install.php:76 ../../mod/install.php:86 ../../mod/install.php:199
+#: ../../mod/install.php:79 ../../mod/install.php:89 ../../mod/install.php:207
msgid "Please see the file \"INSTALL.txt\"."
msgstr "Lies bitte die \"INSTALL.txt\"."
-#: ../../mod/install.php:78
+#: ../../mod/install.php:81
msgid "Proceed to registration"
msgstr "Mit der Registration fortfahren"
-#: ../../mod/install.php:84
+#: ../../mod/install.php:87
msgid "Database import failed."
msgstr "Import der Datenbank schlug fehl."
-#: ../../mod/install.php:85
+#: ../../mod/install.php:88
msgid ""
"You may need to import the file \"database.sql\" manually using phpmyadmin "
"or mysql."
@@ -671,26 +813,27 @@ msgstr ""
"Möglicherweise musst du die Datei \"database.sql\" manuell mit phpmyadmin "
"oder mysql importieren."
-#: ../../mod/install.php:98
+#: ../../mod/install.php:101
msgid "Welcome to Friendika."
msgstr "Willkommen bei Friendika."
-#: ../../mod/install.php:121
+#: ../../mod/install.php:124
msgid "Friendika Social Network"
msgstr "Friendika Soziales Netzwerk"
-#: ../../mod/install.php:122
+#: ../../mod/install.php:125
msgid "Installation"
msgstr "Installation"
-#: ../../mod/install.php:123
+#: ../../mod/install.php:126
msgid ""
-"In order to install Friendika we need to know how to contact your database."
+"In order to install Friendika we need to know how to connect to your "
+"database."
msgstr ""
-"Um Friendika installieren zu können müssen wir wissen, wie wir die Datenbank"
-" erreichen können."
+"Um Friendika installieren zu können, müssen wir wissen wie wir deine MySQL "
+"Datenbank erreichen."
-#: ../../mod/install.php:124
+#: ../../mod/install.php:127
msgid ""
"Please contact your hosting provider or site administrator if you have "
"questions about these settings."
@@ -698,40 +841,49 @@ msgstr ""
"Bitte kontaktiere den Hosting Provider oder den Administrator der Seite "
"falls du Fragen zu diesen Einstellungen haben solltest."
-#: ../../mod/install.php:125
+#: ../../mod/install.php:128
msgid ""
-"The database you specify below must already exist. If it does not, please "
+"The database you specify below should already exist. If it does not, please "
"create it before continuing."
msgstr ""
-"Die Datenbank die du hier angibst muss bereits existieren. Wenn dies noch "
-"nicht der Fall ist lege sie bitte an bevor du fortfährst."
+"Die Datenbank die du unten angibst sollte bereits existieren. Ist dies noch "
+"nicht der Fall erzeuge sie bitte bevor du mit der Installation vorfährst."
-#: ../../mod/install.php:126
+#: ../../mod/install.php:129
msgid "Database Server Name"
msgstr "Datenbank Server"
-#: ../../mod/install.php:127
+#: ../../mod/install.php:130
msgid "Database Login Name"
msgstr "Datenbank Nutzer"
-#: ../../mod/install.php:128
+#: ../../mod/install.php:131
msgid "Database Login Password"
msgstr "Datenbank Passwort"
-#: ../../mod/install.php:129
+#: ../../mod/install.php:132
msgid "Database Name"
msgstr "Datenbank Name"
-#: ../../mod/install.php:130
+#: ../../mod/install.php:133
msgid "Please select a default timezone for your website"
msgstr "Bitte wähle die standard Zeitzone deiner Webseite"
-#: ../../mod/install.php:148
+#: ../../mod/install.php:134
+msgid ""
+"Site administrator email address. Your account email address must match this"
+" in order to use the web admin panel."
+msgstr ""
+"Email Adresse des Seiten Administrators. Die Email Adresse deines Accounts "
+"muss mit dieser übereinstimmen, damit du das Administrationspanel nutzen "
+"kannst."
+
+#: ../../mod/install.php:153
msgid "Could not find a command line version of PHP in the web server PATH."
msgstr ""
"Konnte keine Kommandozeilenversion von PHP im PATH des Servers finden."
-#: ../../mod/install.php:149
+#: ../../mod/install.php:154
msgid ""
"This is required. Please adjust the configuration file .htconfig.php "
"accordingly."
@@ -739,7 +891,7 @@ msgstr ""
"Diese wird von Friendika benötigt. Bitte passe die Konfigurationsdatei "
".htconfig.php entsprechend an."
-#: ../../mod/install.php:156
+#: ../../mod/install.php:161
msgid ""
"The command line version of PHP on your system does not have "
"\"register_argc_argv\" enabled."
@@ -747,11 +899,11 @@ msgstr ""
"Die Kommandozeilenversion von PHP auf deinem System hat "
"\"register_argc_argv\" nicht aktiviert."
-#: ../../mod/install.php:157
+#: ../../mod/install.php:162
msgid "This is required for message delivery to work."
msgstr "Dies wird für die Auslieferung von Nachrichten benötigt."
-#: ../../mod/install.php:179
+#: ../../mod/install.php:184
msgid ""
"Error: the \"openssl_pkey_new\" function on this system is not able to "
"generate encryption keys"
@@ -759,7 +911,7 @@ msgstr ""
"Fehler: Die \"openssl_pkey_new\" Funktion auf diesem System ist nicht in der"
" lage Verschlüsselungsschlüssel zu erzeugen"
-#: ../../mod/install.php:180
+#: ../../mod/install.php:185
msgid ""
"If running under Windows, please see "
"\"http://www.php.net/manual/en/openssl.installation.php\"."
@@ -767,34 +919,39 @@ msgstr ""
"Wenn der Server unter Windows läuft, schau dir bitte "
"\"http://www.php.net/manual/en/openssl.installation.php\" an."
-#: ../../mod/install.php:189
+#: ../../mod/install.php:194
msgid ""
"Error: Apache webserver mod-rewrite module is required but not installed."
msgstr ""
"Fehler: Das Apache Modul mod-rewrite wird benötigt, es ist allerdings nicht "
"installiert."
-#: ../../mod/install.php:191
+#: ../../mod/install.php:196
msgid "Error: libCURL PHP module required but not installed."
msgstr ""
"Fehler: Das libCURL PHP Modul wird benötigt ist aber nicht installiert."
-#: ../../mod/install.php:193
+#: ../../mod/install.php:198
msgid ""
"Error: GD graphics PHP module with JPEG support required but not installed."
msgstr ""
"Fehler: Das GD Graphikmodul für PHP mit JPEG Unterstützung ist nicht "
"installiert."
-#: ../../mod/install.php:195
+#: ../../mod/install.php:200
msgid "Error: openssl PHP module required but not installed."
msgstr "Fehler: Das openssl Modul von PHP ist nict installiert."
-#: ../../mod/install.php:197
+#: ../../mod/install.php:202
msgid "Error: mysqli PHP module required but not installed."
msgstr "Fehler: Das mysqli Modul von PHP ist nicht installiert."
-#: ../../mod/install.php:208
+#: ../../mod/install.php:204
+msgid "Error: mb_string PHP module required but not installed."
+msgstr ""
+"Fehler: mb_string PHP Module wird benötigt ist aber nicht installiert."
+
+#: ../../mod/install.php:216
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."
@@ -803,7 +960,7 @@ msgstr ""
"Stammverzeichnis deines Webservers anzuliegen ist allerdings derzeit nicht "
"in der Lage dies zu tun."
-#: ../../mod/install.php:209
+#: ../../mod/install.php:217
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."
@@ -811,7 +968,7 @@ msgstr ""
"In den meisten Fällen ist dies ein Problem mit den Schreibrechten, der "
"Webserver könnte keine Schreiberlaubnis haben, selbst wenn du sie hast."
-#: ../../mod/install.php:210
+#: ../../mod/install.php:218
msgid ""
"Please check with your site documentation or support people to see if this "
"situation can be corrected."
@@ -819,7 +976,7 @@ msgstr ""
"Bitte überprüfe die Einstellungen und frage im Zweifelsfall dein Support "
"Team um diese Situations zu beheben."
-#: ../../mod/install.php:211
+#: ../../mod/install.php:219
msgid ""
"If not, you may be required to perform a manual installation. Please see the"
" file \"INSTALL.txt\" for instructions."
@@ -827,7 +984,7 @@ msgstr ""
"Sollte dies nicht möglich sein musst du die Installation manuell "
"durchführen. Lies dazu bitte in der Datei \"INSTALL.txt\"."
-#: ../../mod/install.php:220
+#: ../../mod/install.php:228
msgid ""
"The database configuration file \".htconfig.php\" could not be written. "
"Please use the enclosed text to create a configuration file in your web "
@@ -837,15 +994,26 @@ msgstr ""
"Bitte verwende den angefügten Text um die Datei im Stammverzeichnis deiner "
"Friendika Installation zu erzeugen."
-#: ../../mod/install.php:235
+#: ../../mod/install.php:243
msgid "Errors encountered creating database tables."
msgstr "Fehler aufgetreten wärend der Erzeugung der Datenbank Tabellen."
+#: ../../mod/update_community.php:18 ../../mod/update_network.php:22
+#: ../../mod/update_profile.php:41
+msgid "[Embedded content - reload page to view]"
+msgstr "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]"
+
#: ../../mod/match.php:10
msgid "Profile Match"
msgstr "Profil Übereinstimmungen"
-#: ../../mod/match.php:50
+#: ../../mod/match.php:18
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr ""
+"Keine Schlüsselwörter zum Abgleichen gefunden. Bitte füge einige "
+"Schlüsselwörter zu deinem Standardprofil hinzu."
+
+#: ../../mod/match.php:54
msgid "No matches"
msgstr "Keine Übereinstimmungen"
@@ -862,183 +1030,194 @@ msgstr "Sichtbar für:"
msgid "Welcome to %s"
msgstr "Willkommen zu %s"
-#: ../../mod/notifications.php:28
+#: ../../mod/notifications.php:26
msgid "Invalid request identifier."
msgstr "Invalid request identifier."
-#: ../../mod/notifications.php:31 ../../mod/notifications.php:133
+#: ../../mod/notifications.php:35 ../../mod/notifications.php:118
+#: ../../mod/notifications.php:162
msgid "Discard"
msgstr "Verwerfen"
-#: ../../mod/notifications.php:41 ../../mod/notifications.php:132
+#: ../../mod/notifications.php:47 ../../mod/notifications.php:117
+#: ../../mod/notifications.php:161
msgid "Ignore"
msgstr "Ignorieren"
-#: ../../mod/notifications.php:68
+#: ../../mod/notifications.php:74
msgid "Pending Friend/Connect Notifications"
msgstr "Anstehende Freundschafts/Kontakt Benachrichtigungen"
-#: ../../mod/notifications.php:72
+#: ../../mod/notifications.php:78
msgid "Show Ignored Requests"
msgstr "Zeige ignorierte Anfragen"
-#: ../../mod/notifications.php:72
+#: ../../mod/notifications.php:78
msgid "Hide Ignored Requests"
msgstr "Verberge ignorierte Anfragen"
-#: ../../mod/notifications.php:104
+#: ../../mod/notifications.php:105 ../../mod/notifications.php:148
+msgid "Notification type: "
+msgstr "Benachrichtigungs Typ: "
+
+#: ../../mod/notifications.php:106
+msgid "Friend Suggestion"
+msgstr "Kontakt Vorschlag"
+
+#: ../../mod/notifications.php:108
+#, php-format
+msgid "suggested by %s"
+msgstr "vorgeschlagen von %s"
+
+#: ../../mod/notifications.php:114 ../../mod/notifications.php:159
+#: ../../mod/admin.php:466
+msgid "Approve"
+msgstr "Genehmigen"
+
+#: ../../mod/notifications.php:133
msgid "Claims to be known to you: "
msgstr "Behauptet dich zu kennen: "
-#: ../../mod/notifications.php:104
+#: ../../mod/notifications.php:133
msgid "yes"
msgstr "ja"
-#: ../../mod/notifications.php:104
+#: ../../mod/notifications.php:133
msgid "no"
msgstr "nein"
-#: ../../mod/notifications.php:110
+#: ../../mod/notifications.php:139
msgid "Approve as: "
msgstr "Genehmigen als: "
-#: ../../mod/notifications.php:111
+#: ../../mod/notifications.php:140
msgid "Friend"
msgstr "Freund"
-#: ../../mod/notifications.php:112
+#: ../../mod/notifications.php:141
msgid "Fan/Admirer"
msgstr "Fan/Verehrer"
-#: ../../mod/notifications.php:119
-msgid "Notification type: "
-msgstr "Benachrichtigungs Typ: "
-
-#: ../../mod/notifications.php:120
+#: ../../mod/notifications.php:149
msgid "Friend/Connect Request"
msgstr "Kontakt-/Freundschaftsanfrage"
-#: ../../mod/notifications.php:120
+#: ../../mod/notifications.php:149
msgid "New Follower"
msgstr "Neuer Bewunderer"
-#: ../../mod/notifications.php:130 ../../mod/notifications.php:153
-msgid "Approve"
-msgstr "Genehmigen"
-
-#: ../../mod/notifications.php:139
+#: ../../mod/notifications.php:168
msgid "No notifications."
msgstr "Keine Benachrichtigungen."
-#: ../../mod/notifications.php:143
-msgid "User registrations waiting for confirm"
-msgstr "Neuanmeldungen die auf deine Bestätigung warten"
-
-#: ../../mod/notifications.php:154
-msgid "Deny"
-msgstr "Verwehren"
-
-#: ../../mod/notifications.php:159
-msgid "No registrations."
-msgstr "Keine Neuanmeldungen."
-
-#: ../../mod/contacts.php:12
+#: ../../mod/contacts.php:26
msgid "Invite Friends"
msgstr "Freunde einladen"
-#: ../../mod/contacts.php:15
+#: ../../mod/contacts.php:32
+#, php-format
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] "%d Einladung verfügbar"
+msgstr[1] "%d Einladungen verfügbar"
+
+#: ../../mod/contacts.php:41
msgid "Find People With Shared Interests"
msgstr "Finde Personen die deine Interessen teilen"
-#: ../../mod/contacts.php:19
+#: ../../mod/contacts.php:45
msgid "Connect/Follow"
msgstr "Verbinden/Folgen"
-#: ../../mod/contacts.php:20
+#: ../../mod/contacts.php:46
msgid "Example: bob@example.com, http://example.com/barbara"
msgstr "Beispiel: bob@example.com, http://example.com/barbara"
-#: ../../mod/contacts.php:21
+#: ../../mod/contacts.php:47
msgid "Follow"
msgstr "Folge"
-#: ../../mod/contacts.php:43 ../../mod/contacts.php:124
+#: ../../mod/contacts.php:69 ../../mod/contacts.php:150
msgid "Could not access contact record."
msgstr "Konnte nicht auf die Kontaktdaten zugreifen."
-#: ../../mod/contacts.php:57
+#: ../../mod/contacts.php:83
msgid "Could not locate selected profile."
msgstr "Konnte das ausgewählte Profiel nicht finden."
-#: ../../mod/contacts.php:88
+#: ../../mod/contacts.php:114
msgid "Contact updated."
msgstr "Kontakt aktualisiert."
-#: ../../mod/contacts.php:146
+#: ../../mod/contacts.php:172
msgid "Contact has been blocked"
msgstr "Kontakt wurde blockiert"
-#: ../../mod/contacts.php:146
+#: ../../mod/contacts.php:172
msgid "Contact has been unblocked"
msgstr "Kontakt wurde wieder frei gegeben"
-#: ../../mod/contacts.php:160
+#: ../../mod/contacts.php:186
msgid "Contact has been ignored"
msgstr "Der Kontakt wurde ignoriert"
-#: ../../mod/contacts.php:160
+#: ../../mod/contacts.php:186
msgid "Contact has been unignored"
msgstr "Kontakt wurde ignoriert"
-#: ../../mod/contacts.php:181
+#: ../../mod/contacts.php:207
msgid "stopped following"
msgstr "wird nicht mehr gefolgt"
-#: ../../mod/contacts.php:200
+#: ../../mod/contacts.php:226
msgid "Contact has been removed."
msgstr "Kontakt wurde entfernt."
-#: ../../mod/contacts.php:228 ../../mod/contacts.php:363
+#: ../../mod/contacts.php:254 ../../mod/contacts.php:397
msgid "Mutual Friendship"
msgstr "Beidseitige Freundschaft"
-#: ../../mod/contacts.php:232 ../../mod/contacts.php:367
+#: ../../mod/contacts.php:258 ../../mod/contacts.php:401
msgid "is a fan of yours"
msgstr "ist ein Fan von dir"
-#: ../../mod/contacts.php:237 ../../mod/contacts.php:371
+#: ../../mod/contacts.php:263 ../../mod/contacts.php:405
msgid "you are a fan of"
msgstr "du bist Fan von"
-#: ../../mod/contacts.php:252
+#: ../../mod/contacts.php:280
msgid "Privacy Unavailable"
msgstr "Privatsphäre nicht verfügbar"
-#: ../../mod/contacts.php:253
+#: ../../mod/contacts.php:281
msgid "Private communications are not available for this contact."
msgstr "Private Kommunikation ist für diesen Kontakt nicht verfügbar."
-#: ../../mod/contacts.php:256
+#: ../../mod/contacts.php:284
msgid "Never"
msgstr "Niemals"
-#: ../../mod/contacts.php:260
+#: ../../mod/contacts.php:288
msgid "(Update was successful)"
msgstr "(Aktualisierung war erfolgreich)"
-#: ../../mod/contacts.php:260
+#: ../../mod/contacts.php:288
msgid "(Update was not successful)"
msgstr "(Aktualisierung war nicht erfolgreich)"
-#: ../../mod/contacts.php:263
+#: ../../mod/contacts.php:291
+msgid "Suggest friends"
+msgstr "Kontakte vorschlagen"
+
+#: ../../mod/contacts.php:295
msgid "Contact Editor"
msgstr "Kontakt Editor"
-#: ../../mod/contacts.php:265
+#: ../../mod/contacts.php:297
msgid "Profile Visibility"
msgstr "Profil Anzeige"
-#: ../../mod/contacts.php:266
+#: ../../mod/contacts.php:298
#, php-format
msgid ""
"Please choose the profile you would like to display to %s when viewing your "
@@ -1047,15 +1226,15 @@ msgstr ""
"Bitte wähle eines deiner Profile das angezeitgt werden soll, wenn %s dein "
"Profil aufruft."
-#: ../../mod/contacts.php:267
+#: ../../mod/contacts.php:299
msgid "Contact Information / Notes"
msgstr "Kontakt Informationen / Notizen"
-#: ../../mod/contacts.php:268
+#: ../../mod/contacts.php:300
msgid "Online Reputation"
msgstr "Online Ruf"
-#: ../../mod/contacts.php:269
+#: ../../mod/contacts.php:301
msgid ""
"Occasionally your friends may wish to inquire about this person's online "
"legitimacy."
@@ -1063,7 +1242,7 @@ msgstr ""
"Es könnte sein, dass deine Freunde etwas über den Ruf einer Peron erfahren "
"möchten."
-#: ../../mod/contacts.php:270
+#: ../../mod/contacts.php:302
msgid ""
"You may help them choose whether or not to interact with this person by "
"providing a <em>reputation</em> to guide them."
@@ -1072,7 +1251,7 @@ msgstr ""
"interagieren sollten oder nicht indem du Informationen über den <em>Ruf</em>"
" der Person anbietest."
-#: ../../mod/contacts.php:271
+#: ../../mod/contacts.php:303
msgid ""
"Please take a moment to elaborate on this selection if you feel it could be "
"helpful to others."
@@ -1080,109 +1259,110 @@ msgstr ""
"Bitte nimm dir einen Moment und fülle diesen Punkt aus wenn du denkst das es"
" anderen helfen könnte."
-#: ../../mod/contacts.php:272
-msgid "Visit $name's profile"
-msgstr "Besuche das Profil von $name"
+#: ../../mod/contacts.php:304 ../../mod/contacts.php:421
+#: ../../mod/viewcontacts.php:61
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "Besuche %ss Profil [%s]"
-#: ../../mod/contacts.php:273
+#: ../../mod/contacts.php:305
msgid "Block/Unblock contact"
msgstr "Kontakt blockieren/freischalten"
-#: ../../mod/contacts.php:274
+#: ../../mod/contacts.php:306
msgid "Ignore contact"
msgstr "Ignoriere den Kontakt"
-#: ../../mod/contacts.php:275
+#: ../../mod/contacts.php:307
msgid "Repair contact URL settings"
msgstr "URL Einstellungen des Kontakts reparieren"
-#: ../../mod/contacts.php:276
+#: ../../mod/contacts.php:308
msgid "Repair contact URL settings (WARNING: Advanced)"
msgstr "URL Einstellungen des Kontakts reparieren (Achtung: Fortgeschritten)"
-#: ../../mod/contacts.php:277
+#: ../../mod/contacts.php:309
msgid "View conversations"
msgstr "Unterhaltungen anzeigen"
-#: ../../mod/contacts.php:278
+#: ../../mod/contacts.php:312
msgid "Delete contact"
msgstr "Lösche den Kontakt"
-#: ../../mod/contacts.php:280
+#: ../../mod/contacts.php:314
msgid "Last updated: "
msgstr "Letzte Aktualisierung: "
-#: ../../mod/contacts.php:281
+#: ../../mod/contacts.php:315
msgid "Update public posts: "
msgstr "Aktualisierung öffentlicher Nachrichten: "
-#: ../../mod/contacts.php:283
+#: ../../mod/contacts.php:317 ../../mod/admin.php:701
msgid "Update now"
msgstr "Jetzt aktualisieren"
-#: ../../mod/contacts.php:286
+#: ../../mod/contacts.php:320
msgid "Unblock this contact"
msgstr "Blockade dieses Kontakts aufheben"
-#: ../../mod/contacts.php:286
+#: ../../mod/contacts.php:320
msgid "Block this contact"
msgstr "Diesen Kontakt blockieren"
-#: ../../mod/contacts.php:287
+#: ../../mod/contacts.php:321
msgid "Unignore this contact"
msgstr "Diesen Kontakt nicht mehr ignorieren"
-#: ../../mod/contacts.php:287
+#: ../../mod/contacts.php:321
msgid "Ignore this contact"
msgstr "Diesen Kontakt ignorieren"
-#: ../../mod/contacts.php:290
+#: ../../mod/contacts.php:324
msgid "Currently blocked"
msgstr "Derzeit geblockt"
-#: ../../mod/contacts.php:291
+#: ../../mod/contacts.php:325
msgid "Currently ignored"
msgstr "Derzeit ignoriert"
-#: ../../mod/contacts.php:322 ../../include/nav.php:109
-#: ../../include/acl_selectors.php:141 ../../include/acl_selectors.php:156
+#: ../../mod/contacts.php:356 ../../include/nav.php:110
msgid "Contacts"
msgstr "Kontakte"
-#: ../../mod/contacts.php:324
+#: ../../mod/contacts.php:358
msgid "Show Blocked Connections"
msgstr "Zeige geblockte Verbindungen"
-#: ../../mod/contacts.php:324
+#: ../../mod/contacts.php:358
msgid "Hide Blocked Connections"
msgstr "Verstecke geblockte Verbindungen"
-#: ../../mod/contacts.php:326 ../../mod/directory.php:55
+#: ../../mod/contacts.php:360 ../../mod/directory.php:55
msgid "Finding: "
msgstr "Funde: "
-#: ../../mod/contacts.php:327 ../../mod/directory.php:57
+#: ../../mod/contacts.php:361 ../../mod/directory.php:57
msgid "Find"
msgstr "Finde"
-#: ../../mod/contacts.php:387 ../../mod/viewcontacts.php:52
-msgid "Visit $username's profile"
-msgstr "Besuche das Profil von $username"
-
-#: ../../mod/contacts.php:388 ../../include/conversation.php:597
+#: ../../mod/contacts.php:422 ../../include/conversation.php:609
msgid "Edit contact"
msgstr "Kontakt bearbeiten"
-#: ../../mod/lostpass.php:27
+#: ../../mod/lostpass.php:16
+msgid "No valid account found."
+msgstr "Kein gültiger Account gefunden."
+
+#: ../../mod/lostpass.php:31
msgid "Password reset request issued. Check your email."
msgstr "Zurücksetzen des Passworts eingeleitet. Bitte überprüfe deine Email."
-#: ../../mod/lostpass.php:38
+#: ../../mod/lostpass.php:42
#, php-format
msgid "Password reset requested at %s"
msgstr "Anfrage zum Zurücksetzen des Passworts auf %s erhalten"
-#: ../../mod/lostpass.php:60
+#: ../../mod/lostpass.php:64
msgid ""
"Request could not be verified. (You may have previously submitted it.) "
"Password reset failed."
@@ -1190,27 +1370,27 @@ msgstr ""
"Anfrage konnte nicht verifiziert werden. (Eventuell hast du bereits ähnliche"
" Anfrage gestellt.) Zurücksetzen des Passworts gescheitert."
-#: ../../mod/lostpass.php:78 ../../boot.php:852
+#: ../../mod/lostpass.php:82 ../../boot.php:655
msgid "Password Reset"
msgstr "Passwort zurücksetzen"
-#: ../../mod/lostpass.php:79
+#: ../../mod/lostpass.php:83
msgid "Your password has been reset as requested."
msgstr "Dein Passwort wurde wie gewünscht zurück gesetzt."
-#: ../../mod/lostpass.php:80
+#: ../../mod/lostpass.php:84
msgid "Your new password is"
msgstr "Dein neues Passwort lautet"
-#: ../../mod/lostpass.php:81
+#: ../../mod/lostpass.php:85
msgid "Save or copy your new password - and then"
msgstr "Speichere oder kopiere dein neues Passwort - und dann"
-#: ../../mod/lostpass.php:82
+#: ../../mod/lostpass.php:86
msgid "click here to login"
msgstr "hier klicken um dich anzumelden"
-#: ../../mod/lostpass.php:83
+#: ../../mod/lostpass.php:87
msgid ""
"Your password may be changed from the <em>Settings</em> page after "
"successful login."
@@ -1218,11 +1398,11 @@ msgstr ""
"Du kannst das Passwort unter den <em>Einstellungen</em> ändern sobald du "
"dich erfolgreich angemeldet hast."
-#: ../../mod/lostpass.php:114
+#: ../../mod/lostpass.php:118
msgid "Forgot your Password?"
msgstr "Hast du dein Passwort vergessen?"
-#: ../../mod/lostpass.php:115
+#: ../../mod/lostpass.php:119
msgid ""
"Enter your email address and submit to have your password reset. Then check "
"your email for further instructions."
@@ -1230,246 +1410,268 @@ msgstr ""
"Gib deine Email-Adresse an und fordere ein neues Passwort an. Es werden dir "
"dann weitere Informationen per Mail zugesand."
-#: ../../mod/lostpass.php:116
+#: ../../mod/lostpass.php:120
msgid "Nickname or Email: "
msgstr "Spitzname oder Email:"
-#: ../../mod/lostpass.php:117
+#: ../../mod/lostpass.php:121
msgid "Reset"
msgstr "Zurücksetzen"
-#: ../../mod/settings.php:38
+#: ../../mod/settings.php:64
msgid "Passwords do not match. Password unchanged."
msgstr ""
"Die Passwörter stimmen nicht überein. Das Passwort bleibt unverändert."
-#: ../../mod/settings.php:43
+#: ../../mod/settings.php:69
msgid "Empty passwords are not allowed. Password unchanged."
msgstr "Leere Passwörter sind nicht erlaubt. Passwort bleibt unverändert."
-#: ../../mod/settings.php:54
+#: ../../mod/settings.php:80
msgid "Password changed."
msgstr "Passwort ändern."
-#: ../../mod/settings.php:56
+#: ../../mod/settings.php:82
msgid "Password update failed. Please try again."
msgstr ""
"Aktualisierung des Passworts gescheitert, bitte versuche es noch einmal."
-#: ../../mod/settings.php:138
+#: ../../mod/settings.php:161
+msgid "Failed to connect with email account using the settings provided."
+msgstr ""
+"Konnte das Email Konto mit den angegebenen Einstellungen nicht erreichen."
+
+#: ../../mod/settings.php:188
msgid " Please use a shorter name."
msgstr " Bitte verwende einen kürzeren Namen."
-#: ../../mod/settings.php:140
+#: ../../mod/settings.php:190
msgid " Name too short."
msgstr " Name ist zu kurz."
-#: ../../mod/settings.php:146
+#: ../../mod/settings.php:196
msgid " Not valid email."
msgstr " Keine gültige EMail."
-#: ../../mod/settings.php:148
+#: ../../mod/settings.php:198
msgid " Cannot change to that email."
msgstr " Cannot change to that email."
-#: ../../mod/settings.php:206
+#: ../../mod/settings.php:257 ../../addon/facebook/facebook.php:297
+#: ../../addon/impressum/impressum.php:64 ../../addon/piwik/piwik.php:89
+#: ../../addon/twitter/twitter.php:271
msgid "Settings updated."
msgstr "Einstellungen aktualisiert."
-#: ../../mod/settings.php:256 ../../mod/settings.php:418
-#: ../../addon/widgets/widgets.php:123
-msgid "Plugin Settings"
-msgstr "Plugin Einstellungen"
-
-#: ../../mod/settings.php:257 ../../mod/settings.php:417
-msgid "Account Settings"
+#: ../../mod/settings.php:311 ../../include/nav.php:108
+msgid "Account settings"
msgstr "Account Einstellungen"
-#: ../../mod/settings.php:263
+#: ../../mod/settings.php:312
+msgid "Plugin settings"
+msgstr "Plugin Einstellungen"
+
+#: ../../mod/settings.php:322
msgid "No Plugin settings configured"
msgstr "Keine Erweiterungen konfiguriert"
-#: ../../mod/settings.php:323
+#: ../../mod/settings.php:329 ../../addon/widgets/widgets.php:122
+msgid "Plugin Settings"
+msgstr "Plugin Einstellungen"
+
+#: ../../mod/settings.php:382 ../../mod/admin.php:133 ../../mod/admin.php:443
msgid "Normal Account"
msgstr "Normaler Account"
-#: ../../mod/settings.php:324
+#: ../../mod/settings.php:383
msgid "This account is a normal personal profile"
msgstr "Dieser Account ist ein normales persönliches Profil"
-#: ../../mod/settings.php:325
+#: ../../mod/settings.php:386 ../../mod/admin.php:134 ../../mod/admin.php:444
msgid "Soapbox Account"
-msgstr "Sandkasten Accunt"
+msgstr "Sandkasten Account"
-#: ../../mod/settings.php:326
+#: ../../mod/settings.php:387
msgid "Automatically approve all connection/friend requests as read-only fans"
msgstr "Freundschaftsanfragen werden automatisch als Nurlese-Fans akzeptiert"
-#: ../../mod/settings.php:327
+#: ../../mod/settings.php:390 ../../mod/admin.php:135 ../../mod/admin.php:445
msgid "Community/Celebrity Account"
msgstr "Gemeinschafts/Berühmtheiten Account"
-#: ../../mod/settings.php:328
+#: ../../mod/settings.php:391
msgid ""
"Automatically approve all connection/friend requests as read-write fans"
msgstr ""
"Freundschaftsanfragen werden automatisch als Lese-und-Schreib-Fans "
"akzeptiert"
-#: ../../mod/settings.php:329
+#: ../../mod/settings.php:394 ../../mod/admin.php:136 ../../mod/admin.php:446
msgid "Automatic Friend Account"
msgstr "Automatischer Freundes Account"
-#: ../../mod/settings.php:330
+#: ../../mod/settings.php:395
msgid "Automatically approve all connection/friend requests as friends"
msgstr "Freundschaftsanfragen werden automatisch als Freund akzeptiert"
-#: ../../mod/settings.php:339
-msgid "OpenID: "
-msgstr "OpenID: "
+#: ../../mod/settings.php:405
+msgid "OpenID:"
+msgstr "OpenID:"
-#: ../../mod/settings.php:339
-msgid "&nbsp;(Optional) Allow this OpenID to login to this account."
+#: ../../mod/settings.php:405
+msgid "(Optional) Allow this OpenID to login to this account."
msgstr ""
-"&nbsp;(Optional) Erlaube dieser OpenID sich für diesen Account anzumelden."
+"(Optional) Erlaube die Anmeldung für diesen Account mit dieser OpenID."
-#: ../../mod/settings.php:349
-msgid "Publish your default profile in site directory?"
-msgstr "Dein Standard-Profil im Verzeichnis dieser Seite veröffentliche?"
+#: ../../mod/settings.php:415
+msgid "Publish your default profile in your local site directory?"
+msgstr "Veröffentliche dein Standardprofil im Verzeichnis der lokalen Seite?"
-#: ../../mod/settings.php:361
-msgid "Publish your default profile in global social directory?"
-msgstr "Dein Standard-Profil im weltweiten Verzeichnis veröffentlichen?"
+#: ../../mod/settings.php:421
+msgid "Publish your default profile in the global social directory?"
+msgstr "Veröffentliche dein Standardprofil im weltweiten Verzeichnis?"
+
+#: ../../mod/settings.php:429
+msgid "Hide your contact/friend list from viewers of your default profile?"
+msgstr ""
+"Verberge die Liste deiner Kontakte vor Betrachtern des Standardprofils."
-#: ../../mod/settings.php:377
+#: ../../mod/settings.php:433
+msgid "Hide profile details and all your messages from unknown viewers?"
+msgstr ""
+"Profildetails und all deine Beiträge vor unbekannten Besuchern verbergen?"
+
+#: ../../mod/settings.php:442
msgid "Profile is <strong>not published</strong>."
msgstr "Profil ist <strong>nicht veröffentlicht</strong>."
-#: ../../mod/settings.php:398 ../../mod/profile_photo.php:196
+#: ../../mod/settings.php:461 ../../mod/profile_photo.php:196
msgid "or"
msgstr "oder"
-#: ../../mod/settings.php:403
+#: ../../mod/settings.php:466
msgid "Your Identity Address is"
msgstr "Die Adresse deines Profils lautet:"
-#: ../../mod/settings.php:413
+#: ../../mod/settings.php:480
+msgid "Account Settings"
+msgstr "Account Einstellungen"
+
+#: ../../mod/settings.php:487
msgid "Export Personal Data"
msgstr "Perönliche Daten exportieren"
-#: ../../mod/settings.php:419
+#: ../../mod/settings.php:490
+msgid "Password Settings"
+msgstr "Passwort Einstellungen"
+
+#: ../../mod/settings.php:491
+msgid "New Password:"
+msgstr "Neues Passwort:"
+
+#: ../../mod/settings.php:492
+msgid "Confirm:"
+msgstr "Bestätigen:"
+
+#: ../../mod/settings.php:492
+msgid "Leave password fields blank unless changing"
+msgstr "Lass die Passwort-Felder leer außer du willst das Passwort ändern"
+
+#: ../../mod/settings.php:496
msgid "Basic Settings"
msgstr "Grundeinstellungen"
-#: ../../mod/settings.php:420 ../../include/profile_advanced.php:10
+#: ../../mod/settings.php:497 ../../include/profile_advanced.php:10
msgid "Full Name:"
msgstr "Kompletter Name:"
-#: ../../mod/settings.php:421
+#: ../../mod/settings.php:498
msgid "Email Address:"
msgstr "Email Adresse:"
-#: ../../mod/settings.php:422
+#: ../../mod/settings.php:499
msgid "Your Timezone:"
msgstr "Deine Zeitzone:"
-#: ../../mod/settings.php:423
+#: ../../mod/settings.php:500
msgid "Default Post Location:"
msgstr "Standardstandort:"
-#: ../../mod/settings.php:424
+#: ../../mod/settings.php:501
msgid "Use Browser Location:"
msgstr "Verwende den Standort des Browsers:"
-#: ../../mod/settings.php:425
+#: ../../mod/settings.php:502
msgid "Display Theme:"
msgstr "Theme:"
-#: ../../mod/settings.php:427
+#: ../../mod/settings.php:506
msgid "Security and Privacy Settings"
msgstr "Sicherheits und Privatsphären Einstellungen"
-#: ../../mod/settings.php:428
+#: ../../mod/settings.php:508
msgid "Maximum Friend Requests/Day:"
msgstr "Maximale Anzahl von Freundschaftsanfragen/Tag:"
-#: ../../mod/settings.php:429
+#: ../../mod/settings.php:508
msgid "(to prevent spam abuse)"
msgstr "(um SPAM zu vermeiden)"
-#: ../../mod/settings.php:430
+#: ../../mod/settings.php:509
+msgid "Default Post Permissions"
+msgstr "Grundeinstellung für Veröffentlichungen"
+
+#: ../../mod/settings.php:510
+msgid "(click to open/close)"
+msgstr "(klicke zum öffnen/schließen)"
+
+#: ../../mod/settings.php:514
msgid "Allow friends to post to your profile page:"
msgstr "Erlaube es Freunden Beiträge auf deiner Pinnwand zu posten:"
-#: ../../mod/settings.php:431
-msgid "Automatically expire (delete) posts older than"
-msgstr "Automatisch Beiträge verfallen lassen (löschen) die älter sind als"
+#: ../../mod/settings.php:515
+msgid "Automatically expire posts after days:"
+msgstr "Einträge verfallen automatisch nach Tagen:"
-#: ../../mod/settings.php:432 ../../include/datetime.php:154
-msgid "days"
-msgstr "Tage"
+#: ../../mod/settings.php:515
+msgid "If empty, posts will not expire. Expired posts will be deleted"
+msgstr ""
+"Wenn leer verfallen Einträge nie automatisch. Verfallene Einträge werden "
+"gelöscht."
-#: ../../mod/settings.php:433
+#: ../../mod/settings.php:524
msgid "Notification Settings"
msgstr "Benachrichtigungs Einstellungen"
-#: ../../mod/settings.php:434
+#: ../../mod/settings.php:525
msgid "Send a notification email when:"
msgstr "Benachrichtigungs-Email senden wenn:"
-#: ../../mod/settings.php:435
+#: ../../mod/settings.php:526
msgid "You receive an introduction"
msgstr "Du eine Vorstellung erhälst"
-#: ../../mod/settings.php:436
+#: ../../mod/settings.php:527
msgid "Your introductions are confirmed"
msgstr "Eine deiner Vorstellungen angenommen wurde"
-#: ../../mod/settings.php:437
+#: ../../mod/settings.php:528
msgid "Someone writes on your profile wall"
msgstr "Jemand etwas auf deiner Pinnwand postet"
-#: ../../mod/settings.php:438
+#: ../../mod/settings.php:529
msgid "Someone writes a followup comment"
msgstr "Jemand einen Kommentar verfasst"
-#: ../../mod/settings.php:439
+#: ../../mod/settings.php:530
msgid "You receive a private message"
msgstr "Du eine private Nachricht erhälst"
-#: ../../mod/settings.php:440
-msgid "Password Settings"
-msgstr "Passwort Einstellungen"
-
-#: ../../mod/settings.php:441
-msgid "Leave password fields blank unless changing"
-msgstr "Lass die Passwort-Felder leer außer du willst das Passwort ändern"
-
-#: ../../mod/settings.php:442
-msgid "New Password:"
-msgstr "Neues Passwort:"
-
-#: ../../mod/settings.php:443
-msgid "Confirm:"
-msgstr "Bestätigen:"
-
-#: ../../mod/settings.php:444
-msgid "Advanced Page Settings"
-msgstr "Erweiterte Seiten Einstellungen"
-
-#: ../../mod/settings.php:459
-msgid "Default Post Permissions"
-msgstr "Grundeinstellung für Veröffentlichungen"
-
-#: ../../mod/settings.php:460
-msgid "(click to open/close)"
-msgstr "(klicke zum öffnen/schließen)"
-
-#: ../../mod/settings.php:473
+#: ../../mod/settings.php:534
msgid "Email/Mailbox Setup"
msgstr "Email/Postfach Einstellungen"
-#: ../../mod/settings.php:474
+#: ../../mod/settings.php:535
msgid ""
"If you wish to communicate with email contacts using this service "
"(optional), please specify how to connect to your mailbox."
@@ -1477,37 +1679,49 @@ msgstr ""
"Wenn du mit Email Kontakten über diesen Service kommunizieren möchtest "
"(optional) gib bitte die Einstellungen für dein Postfach an."
-#: ../../mod/settings.php:475
+#: ../../mod/settings.php:536
+msgid "Last successful email check:"
+msgstr "Letzter erfolgreicher Email Check"
+
+#: ../../mod/settings.php:537
+msgid "Email access is disabled on this site."
+msgstr "Zugriff auf Emails für diese Seite deaktiviert."
+
+#: ../../mod/settings.php:538
msgid "IMAP server name:"
msgstr "IMAP Server Name:"
-#: ../../mod/settings.php:477
+#: ../../mod/settings.php:539
msgid "IMAP port:"
msgstr "IMAP Port:"
-#: ../../mod/settings.php:479
-msgid "Security (TLS or SSL):"
-msgstr "Sicherheit (TLS oder SSL)"
+#: ../../mod/settings.php:540
+msgid "Security:"
+msgstr "Sicherheit:"
+
+#: ../../mod/settings.php:540
+msgid "None"
+msgstr "Keine"
-#: ../../mod/settings.php:481
+#: ../../mod/settings.php:541
msgid "Email login name:"
msgstr "Email Login Name:"
-#: ../../mod/settings.php:483
+#: ../../mod/settings.php:542
msgid "Email password:"
msgstr "Email Passwort:"
-#: ../../mod/settings.php:484
-msgid "Reply-to address (Optional):"
-msgstr "Reply-to Adresse (Optional)"
+#: ../../mod/settings.php:543
+msgid "Reply-to address:"
+msgstr "Reply-to Adresse:"
-#: ../../mod/settings.php:486
+#: ../../mod/settings.php:544
msgid "Send public posts to all email contacts:"
msgstr "Sende öffentliche Einträge an alle Email Kontakte:"
-#: ../../mod/settings.php:488
-msgid "Email access is disabled on this site."
-msgstr "Zugriff auf Emails für diese Seite deaktiviert."
+#: ../../mod/settings.php:549
+msgid "Advanced Page Settings"
+msgstr "Erweiterte Seiten Einstellungen"
#: ../../mod/manage.php:37
#, php-format
@@ -1530,15 +1744,23 @@ msgstr ""
msgid "Select an identity to manage: "
msgstr "Wähle eine Identität zum Verwalten: "
-#: ../../mod/network.php:18
-msgid "Normal View"
-msgstr "Normale Ansicht"
+#: ../../mod/network.php:27
+msgid "View Conversations"
+msgstr "Unterhaltungen anzeigen"
+
+#: ../../mod/network.php:29
+msgid "View New Items"
+msgstr "Neue Einträge anzeigen"
-#: ../../mod/network.php:20
-msgid "New Item View"
-msgstr "Neue Einträge"
+#: ../../mod/network.php:35
+msgid "View Any Items"
+msgstr "Alle Einträge anzeigen"
-#: ../../mod/network.php:64
+#: ../../mod/network.php:43
+msgid "View Starred Items"
+msgstr "Gesternte Einträge anzeigen"
+
+#: ../../mod/network.php:94
#, php-format
msgid "Warning: This group contains %s member from an insecure network."
msgid_plural ""
@@ -1548,60 +1770,171 @@ msgstr[0] ""
msgstr[1] ""
"Warnung: Diese Gruppe beinhaltet %s Personen aus unsicheren Netzwerken."
-#: ../../mod/network.php:67
+#: ../../mod/network.php:97
msgid "Private messages to this group are at risk of public disclosure."
msgstr ""
"Private Nachrichten an diese Gruppe könnten an die Öffentlichkeit geraten."
-#: ../../mod/network.php:129
+#: ../../mod/network.php:164
msgid "No such group"
msgstr "Es gibt keine solche Gruppe"
-#: ../../mod/network.php:140
+#: ../../mod/network.php:175
msgid "Group is empty"
msgstr "Gruppe ist leer"
-#: ../../mod/network.php:144
+#: ../../mod/network.php:180
msgid "Group: "
msgstr "Gruppe: "
-#: ../../mod/network.php:154
+#: ../../mod/network.php:190
msgid "Contact: "
msgstr "Kontakt "
-#: ../../mod/network.php:156
+#: ../../mod/network.php:192
msgid "Private messages to this person are at risk of public disclosure."
msgstr ""
"Private Nachrichten an diese Person könnten an die Öffentlichkeit gelangen."
-#: ../../mod/network.php:161
+#: ../../mod/network.php:197
msgid "Invalid contact."
msgstr "Ungültiger Kontakt."
-#: ../../mod/network.php:262 ../../mod/register.php:465
-#: ../../mod/profile.php:265 ../../mod/display.php:147
+#: ../../mod/notes.php:74
+msgid "Save"
+msgstr "Speichern"
+
+#: ../../mod/newmember.php:6
+msgid "Welcome to Friendika"
+msgstr "Willkommen bei Friendika"
+
+#: ../../mod/newmember.php:8
+msgid "New Member Checklist"
+msgstr "Checkliste für neue Mitglieder"
+
+#: ../../mod/newmember.php:12
msgid ""
-"Shared content is covered by the <a "
-"href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons "
-"Attribution 3.0</a> license."
+"We would like to offer some tips and links to help make your experience "
+"enjoyable. Click any item to visit the relevant page."
msgstr ""
-"Geteilte Inhalte innerhalb des Friendika Netzwerks sind unter der <a "
-"href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons "
-"Attribution 3.0</a> verfügbar."
+"Wir möchten dir einige Tipps und Links anbieten um deine Erfahrung mit "
+"Friendika so angenehm wie möglich zu machen. Klicke einfach einen Aspekt an "
+"um weitere Informationen zu erhalten."
-#: ../../mod/notes.php:41 ../../mod/apps.php:8
-msgid "Private Notes"
-msgstr "Privater Beitrag"
+#: ../../mod/newmember.php:16
+msgid ""
+"On your <em>Settings</em> page - change your initial password. Also make a "
+"note of your Identity Address. This will be useful in making friends."
+msgstr ""
+"Ändere dein anfängliches Passwort auf der <em>Einstellungen</em> Seite. Bei "
+"dieser Gelegenheit solltest du dir die Adresse deines Profils merken, diese "
+"wird benötigt um mit Anderen in Kontakt zu treten."
-#: ../../mod/notes.php:60
-msgid "Save"
-msgstr "Speichern"
+#: ../../mod/newmember.php:18
+msgid ""
+"Review the other settings, particularly the privacy settings. An unpublished"
+" directory listing is like having an unlisted phone number. In general, you "
+"should probably publish your listing - unless all of your friends and "
+"potential friends know exactly how to find you."
+msgstr ""
+"Überprüfe die restlichen Einstellungen, insbesondere die Einstellungen zur "
+"Privatsphäre. Wenn du dein Profil nicht veröffentlichst ist das wie wenn "
+"niemand deine Telefonnummer kennt. Im Allgemeinen solltest du es "
+"veröffentlichen - außer all deine Freunde und potentiellen Freunde wissen "
+"wie man dich findet."
+
+#: ../../mod/newmember.php:20
+msgid ""
+"Upload a profile photo if you have not done so already. Studies have shown "
+"that people with real photos of themselves are ten times more likely to make"
+" friends than people who do not."
+msgstr ""
+"Lade ein Profilbild hoch falls du es noch nicht getan hast. Studien haben "
+"gezeigt, das es zehnmal wahrscheinlicher ist neue Freunde zu finden, wenn du"
+" ein Bild von dir selbst verwendest als wenn du dies nicht tust."
+
+#: ../../mod/newmember.php:23
+msgid ""
+"Authorise the Facebook Connector if you currently have a Facebook account "
+"and we will (optionally) import all your Facebook friends and conversations."
+msgstr ""
+"Richte die Verbindung zu Facebook ein, wenn du im Augenblick ein Facebook "
+"Konto hast und (optional) deine Facebook Freunde und Unterhaltungen "
+"importieren willst."
+
+#: ../../mod/newmember.php:28
+msgid ""
+"Enter your email access information on your Settings page if you wish to "
+"import and interact with friends or mailing lists from your email INBOX"
+msgstr ""
+"Gib deine Email Daten in deinen Einstellungen an, wenn du mit deinen Email-"
+"Kontakten / Email-Listen interagieren möchtest."
+
+#: ../../mod/newmember.php:30
+msgid ""
+"Edit your <strong>default</strong> profile to your liking. Review the "
+"settings for hiding your list of friends and hiding the profile from unknown"
+" visitors."
+msgstr ""
+"Editiere dein <strong>Standard</strong> Profil nach deinen Vorlieben. "
+"Überprüfe die Einstellungen zum Verbergen deiner Freundesliste vor "
+"unbekannten Betrachtern des Profils."
+
+#: ../../mod/newmember.php:32
+msgid ""
+"Set some public keywords for your default profile which describe your "
+"interests. We may be able to find other people with similar interests and "
+"suggest friendships."
+msgstr ""
+"Trage ein paar öffentliche Stichwörter in dein Standardprofil ein die deine "
+"Interessen beschreiben. Eventuell sind wir in der Lage Leute zu finden, die "
+"deine Interessen teilen und können dir dann Kontakte vorschlagen."
+
+#: ../../mod/newmember.php:34
+msgid ""
+"Your Contacts page is your gateway to managing friendships and connecting "
+"with friends on other networks. Typically you enter their address or site "
+"URL in the <em>Connect</em> dialog."
+msgstr ""
+"Deine Kontakte Seite ist die zentrale Stelle um deine Freundschaften zu "
+"koordinieren und neuen Kontakte, auch von anderen Netzwerken, zu folgen. "
+"Normalerweise gibst du einfach die URL der Seite in den <em>Verbinden</em> "
+"Dialog ein."
+
+#: ../../mod/newmember.php:36
+msgid ""
+"The Directory page lets you find other people in this network or other "
+"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
+"their profile page. Provide your own Identity Address if requested."
+msgstr ""
+"Über die Verzeichnisseite kannst du andere Personen auf diesem Server oder "
+"anderen verteilten Seiten finden. Halte nach einem <em>Verbinden</em> oder "
+"<em>Folgen</em> Link auf deren Profilseiten Ausschau und gib deine eigene "
+"Profiladresse an falls du danach gefragt wirst."
+
+#: ../../mod/newmember.php:38
+msgid ""
+"Once you have made some friends, organize them into private conversation "
+"groups from the sidebar of your Contacts page and then you can interact with"
+" each group privately on your Network page."
+msgstr ""
+"Sobald du einige Freunde gefunden hast, organisiere sie in Gruppen zur "
+"privaten Kommunikation im Seitenmenü der Kontakte-Seite. Du kannst dann mit "
+"jeder dieser Gruppen von der Netzwerkseite aus privat interagieren."
+
+#: ../../mod/newmember.php:40
+msgid ""
+"Our <strong>help</strong> pages may be consulted for detail on other program"
+" features and resources."
+msgstr ""
+"Unsere <strong>Hilfe</strong> Seiten können herangezogen werden um weitere "
+"Einzelheiten zu andern Programm Features zu erhalten."
-#: ../../mod/attach.php:6
+#: ../../mod/attach.php:8
msgid "Item not available."
msgstr "Beitrag nicht verfügbar."
-#: ../../mod/attach.php:16
+#: ../../mod/attach.php:20
msgid "Item was not found."
msgstr "Beitrag konnte nicht gefunden werden."
@@ -1613,7 +1946,7 @@ msgstr "Gruppe erstellt."
msgid "Could not create group."
msgstr "Konnte die Gruppe nicht erstellen."
-#: ../../mod/group.php:43 ../../mod/group.php:115
+#: ../../mod/group.php:43 ../../mod/group.php:123
msgid "Group not found."
msgstr "Gruppe nicht gefunden."
@@ -1621,64 +1954,59 @@ msgstr "Gruppe nicht gefunden."
msgid "Group name changed."
msgstr "Gruppenname geändert."
-#: ../../mod/group.php:67 ../../mod/profperm.php:19 ../../index.php:255
+#: ../../mod/group.php:67 ../../mod/profperm.php:19 ../../index.php:265
msgid "Permission denied"
msgstr "Zugriff verweigert"
-#: ../../mod/group.php:74
+#: ../../mod/group.php:82
msgid "Create a group of contacts/friends."
msgstr "Eine Gruppe von Kontakten/Freunden anlegen."
-#: ../../mod/group.php:75 ../../mod/group.php:158
+#: ../../mod/group.php:83 ../../mod/group.php:166
msgid "Group Name: "
msgstr "Gruppen Name:"
-#: ../../mod/group.php:90
+#: ../../mod/group.php:98
msgid "Group removed."
msgstr "Gruppe entfernt."
-#: ../../mod/group.php:92
+#: ../../mod/group.php:100
msgid "Unable to remove group."
msgstr "Konnte die Gruppe nicht entfernen."
-#: ../../mod/group.php:156 ../../mod/profperm.php:96
+#: ../../mod/group.php:164 ../../mod/profperm.php:105
msgid "Click on a contact to add or remove."
msgstr "Klicke einen Kontakt an um ihn hinzuzufügen oder zu entfernen"
-#: ../../mod/group.php:157
+#: ../../mod/group.php:165
msgid "Group Editor"
msgstr "Gruppen Editor"
-#: ../../mod/group.php:172
+#: ../../mod/group.php:180
msgid "Members"
msgstr "Mitglieder"
-#: ../../mod/group.php:186
+#: ../../mod/group.php:195
msgid "All Contacts"
msgstr "Alle Kontakte"
-#: ../../mod/profperm.php:25 ../../mod/profperm.php:46
+#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
msgid "Invalid profile identifier."
msgstr "Ungültiger Profil-Bezeichner"
-#: ../../mod/profperm.php:92
+#: ../../mod/profperm.php:101
msgid "Profile Visibility Editor"
msgstr "Editor für die Profil-Sichtbarkeit"
-#: ../../mod/profperm.php:94 ../../mod/profile.php:116
-#: ../../include/profile_advanced.php:7
-msgid "Profile"
-msgstr "Profil"
-
-#: ../../mod/profperm.php:105
+#: ../../mod/profperm.php:114
msgid "Visible To"
msgstr "Sichtbar für"
-#: ../../mod/profperm.php:116
+#: ../../mod/profperm.php:128
msgid "All Contacts (with secure profile access)"
msgstr "Alle Kontakte (mit gesichertem Profil zugriff)"
-#: ../../mod/viewcontacts.php:25 ../../boot.php:2059
+#: ../../mod/viewcontacts.php:25 ../../include/text.php:548
msgid "View Contacts"
msgstr "Kontakte anzeigen"
@@ -1686,39 +2014,47 @@ msgstr "Kontakte anzeigen"
msgid "No contacts."
msgstr "Keine Kontakte."
-#: ../../mod/register.php:49
+#: ../../mod/register.php:53
+msgid "An invitation is required."
+msgstr "Du benötigst eine Einladung."
+
+#: ../../mod/register.php:58
+msgid "Invitation could not be verified."
+msgstr "Die Einladung konnte nicht überprüft werden."
+
+#: ../../mod/register.php:66
msgid "Invalid OpenID url"
msgstr "Ungültige OpenID URL"
-#: ../../mod/register.php:64
+#: ../../mod/register.php:81
msgid "Please enter the required information."
msgstr "Bitte trage die erforderlichen Informationen ein."
-#: ../../mod/register.php:76
+#: ../../mod/register.php:95
msgid "Please use a shorter name."
msgstr "Bitte verwende einen kürzeren Namen."
-#: ../../mod/register.php:78
+#: ../../mod/register.php:97
msgid "Name too short."
msgstr "Der Name ist zu kurz."
-#: ../../mod/register.php:93
+#: ../../mod/register.php:112
msgid "That doesn't appear to be your full (First Last) name."
msgstr "Das scheint nicht dein kompletter Name (Vor- und Nachname) zu sein."
-#: ../../mod/register.php:97
+#: ../../mod/register.php:117
msgid "Your email domain is not among those allowed on this site."
msgstr "Die Domain deiner EMail Adresse ist nicht erlaubt auf dieser Seite."
-#: ../../mod/register.php:100
+#: ../../mod/register.php:120
msgid "Not a valid email address."
msgstr "Keine gültige EMail Adresse."
-#: ../../mod/register.php:106
+#: ../../mod/register.php:130
msgid "Cannot use that email."
msgstr "Konnte diese EMail Adresse nicht verwenden."
-#: ../../mod/register.php:111
+#: ../../mod/register.php:136
msgid ""
"Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and "
"must also begin with a letter."
@@ -1726,59 +2062,59 @@ msgstr ""
"Dein Spitzname darf nur aus Buchstaben und Zahlen (\"a-z\",\"0-9\", \"_\" "
"und \"-\") bestehen, außerdem muss er mit einem Buchstaben beginnen."
-#: ../../mod/register.php:117 ../../mod/register.php:217
+#: ../../mod/register.php:142 ../../mod/register.php:243
msgid "Nickname is already registered. Please choose another."
msgstr "Dieser Spitzname ist bereits vergeben. Bitte wähle einen anderen."
-#: ../../mod/register.php:136
+#: ../../mod/register.php:161
msgid "SERIOUS ERROR: Generation of security keys failed."
msgstr "SERIOUS ERROR: Generation of security keys failed."
-#: ../../mod/register.php:203
+#: ../../mod/register.php:229
msgid "An error occurred during registration. Please try again."
msgstr ""
"Wärend der Anmeldung ist ein Fehler aufgetreten. Bitte versuche es noch "
"einmal."
-#: ../../mod/register.php:239
+#: ../../mod/register.php:265
msgid "An error occurred creating your default profile. Please try again."
msgstr ""
"Bei der Erstellung des Standard-Profils ist ein Fehler aufgetreten. Bitte "
"versuche es noch einmal."
-#: ../../mod/register.php:333 ../../mod/regmod.php:96
+#: ../../mod/register.php:367 ../../mod/regmod.php:52
#, php-format
msgid "Registration details for %s"
msgstr "Details der Registration von %s"
-#: ../../mod/register.php:341
+#: ../../mod/register.php:375
msgid ""
"Registration successful. Please check your email for further instructions."
msgstr ""
"Registration erfolgreich. Eine EMail mit weiteren Anweisungen wurde an dich "
"gesendet."
-#: ../../mod/register.php:345
+#: ../../mod/register.php:379
msgid "Failed to send email message. Here is the message that failed."
msgstr ""
"Konnte die EMail nicht versenden. Hier ist die Nachricht die nicht gesendet "
"werden konnte."
-#: ../../mod/register.php:350
+#: ../../mod/register.php:384
msgid "Your registration can not be processed."
msgstr "Deine Registration konnte nicht verarbeitet werden."
-#: ../../mod/register.php:383
+#: ../../mod/register.php:421
#, php-format
msgid "Registration request at %s"
msgstr "Registrationsanfrage auf %s"
-#: ../../mod/register.php:392
+#: ../../mod/register.php:430
msgid "Your registration is pending approval by the site owner."
msgstr ""
"Deine Registration muss noch vom Betreiber der Seite freigegeben werden."
-#: ../../mod/register.php:440
+#: ../../mod/register.php:479
msgid ""
"You may (optionally) fill in this form via OpenID by supplying your OpenID "
"and clicking 'Register'."
@@ -1786,7 +2122,7 @@ msgstr ""
"Du kannst dieses Formular auch (optional) mit deiner OpenID ausfüllen indem "
"du deine OpenID angibst und 'Registrieren' klickst."
-#: ../../mod/register.php:441
+#: ../../mod/register.php:480
msgid ""
"If you are not familiar with OpenID, please leave that field blank and fill "
"in the rest of the items."
@@ -1794,27 +2130,36 @@ msgstr ""
"Wenn du nicht mit OpenID vertraut bist, lass dieses Feld bitte leer und "
"fülle die restlichen Felder aus."
-#: ../../mod/register.php:442
+#: ../../mod/register.php:481
msgid "Your OpenID (optional): "
msgstr "Deine OpenID (optional): "
-#: ../../mod/register.php:456
+#: ../../mod/register.php:495
msgid "Include your profile in member directory?"
msgstr "Soll dein Profil im Nutzerverzeichnis angezeigt werden?"
-#: ../../mod/register.php:472
+#: ../../mod/register.php:511
+msgid "Membership on this site is by invitation only."
+msgstr ""
+"Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich."
+
+#: ../../mod/register.php:512
+msgid "Your invitation ID: "
+msgstr "ID deiner Einladung: "
+
+#: ../../mod/register.php:515 ../../mod/admin.php:299
msgid "Registration"
msgstr "Registration"
-#: ../../mod/register.php:480
+#: ../../mod/register.php:523
msgid "Your Full Name (e.g. Joe Smith): "
msgstr "Vollständiger Name (z.B. Joe Smith): "
-#: ../../mod/register.php:481
+#: ../../mod/register.php:524
msgid "Your Email Address: "
msgstr "Deine EMail Adresse: "
-#: ../../mod/register.php:482
+#: ../../mod/register.php:525
msgid ""
"Choose a profile nickname. This must begin with a text character. Your "
"profile address on this site will then be "
@@ -1824,39 +2169,39 @@ msgstr ""
"beginnen. Die Adresse deines Profils auf dieser Seite wird "
"'<strong>spitzname@$sitename</strong>' sein."
-#: ../../mod/register.php:483
+#: ../../mod/register.php:526
msgid "Choose a nickname: "
msgstr "Spitznamen wählen: "
-#: ../../mod/register.php:486 ../../include/nav.php:59 ../../boot.php:835
+#: ../../mod/register.php:529 ../../include/nav.php:59 ../../boot.php:638
msgid "Register"
msgstr "Registrieren"
-#: ../../mod/like.php:110 ../../addon/facebook/facebook.php:774
-#: ../../include/conversation.php:20
+#: ../../mod/like.php:110 ../../addon/facebook/facebook.php:947
+#: ../../include/conversation.php:26 ../../include/conversation.php:35
msgid "status"
msgstr "Status"
-#: ../../mod/like.php:127 ../../addon/facebook/facebook.php:778
-#: ../../include/conversation.php:25
+#: ../../mod/like.php:127 ../../addon/facebook/facebook.php:951
+#: ../../include/conversation.php:43
#, php-format
msgid "%1$s likes %2$s's %3$s"
msgstr "%1$s mag %2$s's %3$s"
-#: ../../mod/like.php:129 ../../include/conversation.php:28
+#: ../../mod/like.php:129 ../../include/conversation.php:46
#, php-format
msgid "%1$s doesn't like %2$s's %3$s"
msgstr "%1$s mag %2$s's %3$s nicht"
-#: ../../mod/friendika.php:43
+#: ../../mod/friendika.php:42
msgid "This is Friendika version"
msgstr "Dies ist Friendika Version"
-#: ../../mod/friendika.php:44
+#: ../../mod/friendika.php:43
msgid "running at web location"
msgstr "die unter folgender Webadresse zu finden ist"
-#: ../../mod/friendika.php:46
+#: ../../mod/friendika.php:45
msgid ""
"Shared content within the Friendika network is provided under the <a "
"href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons "
@@ -1866,7 +2211,7 @@ msgstr ""
"href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons "
"Attribution 3.0 license</a> verfügbar"
-#: ../../mod/friendika.php:48
+#: ../../mod/friendika.php:47
msgid ""
"Please visit <a "
"href=\"http://project.friendika.com\">Project.Friendika.com</a> to learn "
@@ -1876,11 +2221,11 @@ msgstr ""
"href=\"http://project.friendika.com\">Project.Friendika.com</a> um mehr über"
" Friendika zu erfahren."
-#: ../../mod/friendika.php:50
+#: ../../mod/friendika.php:49
msgid "Bug reports and issues: please visit"
msgstr "Probleme oder Fehler gefunden? Bitte besuche"
-#: ../../mod/friendika.php:51
+#: ../../mod/friendika.php:50
msgid ""
"Suggestions, praise, donations, etc. - please email \"Info\" at Friendika - "
"dot com"
@@ -1888,72 +2233,68 @@ msgstr ""
"Vorschläge, Lobeshymnen, Spenden usw. - bitte eine Email an \"Info\" at "
"Friendika - dot com (englisch bevorzugt)"
-#: ../../mod/friendika.php:56
+#: ../../mod/friendika.php:55
msgid "Installed plugins/addons/apps"
msgstr "Installierte Plugins/Erweiterungen/Apps"
-#: ../../mod/friendika.php:64
+#: ../../mod/friendika.php:63
msgid "No installed plugins/addons/apps"
msgstr "Keine Plugins/Erweiterungen/Apps installiert"
-#: ../../mod/regmod.php:12
-msgid "Please login."
-msgstr "Bitte melde dich an."
+#: ../../mod/regmod.php:61
+msgid "Account approved."
+msgstr "Account freigegeben."
-#: ../../mod/regmod.php:56
+#: ../../mod/regmod.php:93
#, php-format
msgid "Registration revoked for %s"
msgstr "Registration für %s wurde zurück gezogen"
#: ../../mod/regmod.php:105
-msgid "Account approved."
-msgstr "Account freigegeben."
-
-#: ../../mod/update_network.php:22 ../../mod/update_profile.php:41
-msgid "[Embedded content - reload page to view]"
-msgstr "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]"
+msgid "Please login."
+msgstr "Bitte melde dich an."
-#: ../../mod/item.php:37
+#: ../../mod/item.php:81
msgid "Unable to locate original post."
msgstr "Konnte das original Posting nicht finden."
-#: ../../mod/item.php:128
+#: ../../mod/item.php:182
msgid "Empty post discarded."
msgstr "Leere Nachricht wurde verworfen."
-#: ../../mod/item.php:214 ../../mod/message.php:93
-#: ../../mod/wall_upload.php:79 ../../mod/wall_upload.php:88
-#: ../../mod/wall_upload.php:95
+#: ../../mod/item.php:282 ../../mod/message.php:93
+#: ../../mod/wall_upload.php:81 ../../mod/wall_upload.php:90
+#: ../../mod/wall_upload.php:97
msgid "Wall Photos"
msgstr "Pinnwand Bilder"
-#: ../../mod/item.php:517 ../../mod/item.php:560 ../../mod/item.php:583
-#: ../../mod/item.php:624 ../../mod/dfrn_notify.php:193
-#: ../../mod/dfrn_notify.php:401 ../../mod/dfrn_notify.php:444
-#: ../../mod/dfrn_notify.php:530 ../../mod/dfrn_notify.php:571
+#: ../../mod/item.php:605 ../../mod/item.php:650 ../../mod/item.php:673
+#: ../../mod/item.php:716 ../../mod/dfrn_notify.php:293
+#: ../../mod/dfrn_notify.php:503 ../../mod/dfrn_notify.php:548
+#: ../../mod/dfrn_notify.php:634 ../../mod/dfrn_notify.php:677
msgid "noreply"
msgstr "noreply"
-#: ../../mod/item.php:559 ../../mod/item.php:623 ../../mod/dfrn_notify.php:570
+#: ../../mod/item.php:649 ../../mod/item.php:715 ../../mod/dfrn_notify.php:676
msgid "Administrator@"
msgstr "Administrator@"
-#: ../../mod/item.php:562 ../../mod/dfrn_notify.php:446
-#: ../../mod/dfrn_notify.php:573
+#: ../../mod/item.php:652 ../../mod/dfrn_notify.php:550
+#: ../../mod/dfrn_notify.php:679
#, php-format
msgid "%s commented on an item at %s"
msgstr "%s kommentierte einen Beitrag auf %s"
-#: ../../mod/item.php:626
+#: ../../mod/item.php:718
#, php-format
msgid "%s posted to your profile wall at %s"
msgstr "%s hat auf deine Profilwand bei %s gepostet"
-#: ../../mod/item.php:655
+#: ../../mod/item.php:747
msgid "System error. Post not saved."
msgstr "Systemfehler. Nachricht konnte nicht gespeichert werden."
-#: ../../mod/item.php:674
+#: ../../mod/item.php:766
#, php-format
msgid ""
"This message was sent to you by %s, a member of the Friendika social "
@@ -1962,12 +2303,12 @@ msgstr ""
"Diese Nachricht wurde dir von %s gesendet, einem Mitglied des Sozialen "
"Netzwerks Friendika"
-#: ../../mod/item.php:676
+#: ../../mod/item.php:768
#, php-format
msgid "You may visit them online at %s"
msgstr "Du kannst sie online unter %s besuchen"
-#: ../../mod/item.php:677
+#: ../../mod/item.php:769
msgid ""
"Please contact the sender by replying to this post if you do not wish to "
"receive these messages."
@@ -1975,15 +2316,11 @@ msgstr ""
"Please contact the sender by replying to this post if you do not wish to "
"receive these messages."
-#: ../../mod/item.php:679
+#: ../../mod/item.php:771
#, php-format
msgid "%s posted an update."
msgstr "%s hat ein Update gepostet."
-#: ../../mod/item.php:730 ../../mod/display.php:25 ../../mod/display.php:142
-msgid "Item not found."
-msgstr "Beitrag nicht gefunden."
-
#: ../../mod/profile_photo.php:28
msgid "Image uploaded but image cropping failed."
msgstr "Bilder hochgeladen aber das Zuschneiden ist fehlgeschlagen."
@@ -2077,7 +2414,7 @@ msgstr "Nachricht gesendet."
msgid "Message could not be sent."
msgstr "Nachricht konnte nicht gesendet werden."
-#: ../../mod/message.php:125 ../../include/nav.php:101
+#: ../../mod/message.php:125 ../../include/nav.php:102
msgid "Messages"
msgstr "Nachrichten"
@@ -2101,7 +2438,7 @@ msgstr "Nachricht gelöscht."
msgid "Conversation removed."
msgstr "Unterhaltung gelöscht."
-#: ../../mod/message.php:172 ../../include/conversation.php:684
+#: ../../mod/message.php:172 ../../include/conversation.php:696
msgid "Please enter a link URL:"
msgstr "Bitte gib die URL des Links ein:"
@@ -2117,7 +2454,8 @@ msgstr "An:"
msgid "Subject:"
msgstr "Betreff:"
-#: ../../mod/message.php:185 ../../mod/message.php:319 ../../mod/invite.php:63
+#: ../../mod/message.php:185 ../../mod/message.php:319
+#: ../../mod/invite.php:101
msgid "Your message:"
msgstr "Deine Nachricht:"
@@ -2145,57 +2483,408 @@ msgstr "Nachricht löschen"
msgid "Send Reply"
msgstr "Antwort senden"
-#: ../../mod/profile.php:11 ../../boot.php:2270
+#: ../../mod/admin.php:66 ../../mod/admin.php:297
+msgid "Site"
+msgstr "Seite"
+
+#: ../../mod/admin.php:67 ../../mod/admin.php:460 ../../mod/admin.php:472
+msgid "Users"
+msgstr "Nutzer"
+
+#: ../../mod/admin.php:68 ../../mod/admin.php:549 ../../mod/admin.php:586
+msgid "Plugins"
+msgstr "Plugins"
+
+#: ../../mod/admin.php:69
+msgid "Update"
+msgstr "Aktualisierungen"
+
+#: ../../mod/admin.php:83 ../../mod/admin.php:651
+msgid "Logs"
+msgstr "Protokolle"
+
+#: ../../mod/admin.php:88
+msgid "User registrations waiting for confirmation"
+msgstr "Nutzeranmeldungen die auf Bestätigung warten"
+
+#: ../../mod/admin.php:118 ../../mod/admin.php:502 ../../mod/display.php:25
+#: ../../mod/display.php:112 ../../include/items.php:1828
+msgid "Item not found."
+msgstr "Beitrag nicht gefunden."
+
+#: ../../mod/admin.php:151 ../../mod/admin.php:296 ../../mod/admin.php:459
+#: ../../mod/admin.php:548 ../../mod/admin.php:585 ../../mod/admin.php:650
+msgid "Administration"
+msgstr "Administration"
+
+#: ../../mod/admin.php:152
+msgid "Summary"
+msgstr "Zusammenfassung"
+
+#: ../../mod/admin.php:153
+msgid "Registered users"
+msgstr "Registrierte Nutzer"
+
+#: ../../mod/admin.php:155
+msgid "Pending registrations"
+msgstr "Anstehende Anmeldungen"
+
+#: ../../mod/admin.php:156
+msgid "Version"
+msgstr "Version"
+
+#: ../../mod/admin.php:158
+msgid "Active plugins"
+msgstr "Aktive Plugins"
+
+#: ../../mod/admin.php:245
+msgid "Site settings updated."
+msgstr "Seiteneinstellungen aktualisiert."
+
+#: ../../mod/admin.php:289
+msgid "Closed"
+msgstr "Geschlossen"
+
+#: ../../mod/admin.php:290
+msgid "Requires approval"
+msgstr "Bedarf Zustimmung"
+
+#: ../../mod/admin.php:291
+msgid "Open"
+msgstr "Offen"
+
+#: ../../mod/admin.php:300
+msgid "File upload"
+msgstr "Datei hochladen"
+
+#: ../../mod/admin.php:301
+msgid "Policies"
+msgstr "Regeln"
+
+#: ../../mod/admin.php:302
+msgid "Advanced"
+msgstr "Erweitert"
+
+#: ../../mod/admin.php:306
+msgid "Site name"
+msgstr "Seiten Name"
+
+#: ../../mod/admin.php:307
+msgid "Banner/Logo"
+msgstr "Banner/Logo"
+
+#: ../../mod/admin.php:308
+msgid "System language"
+msgstr "System Sprache"
+
+#: ../../mod/admin.php:309
+msgid "System theme"
+msgstr "Systemweites Thema"
+
+#: ../../mod/admin.php:311
+msgid "Maximum image size"
+msgstr "Maximale Größe von Bildern"
+
+#: ../../mod/admin.php:313
+msgid "Register policy"
+msgstr "Registrationsmethode"
+
+#: ../../mod/admin.php:314
+msgid "Register text"
+msgstr "Registrationstext"
+
+#: ../../mod/admin.php:315
+msgid "Allowed friend domains"
+msgstr "Erlaubte Domains für Kontakte"
+
+#: ../../mod/admin.php:316
+msgid "Allowed email domains"
+msgstr "Erlaubte Domains für Emails"
+
+#: ../../mod/admin.php:317
+msgid "Block public"
+msgstr "Öffentlichen Zugriff blockieren"
+
+#: ../../mod/admin.php:318
+msgid "Force publish"
+msgstr "Erzwinge Veröffentlichung"
+
+#: ../../mod/admin.php:319
+msgid "Global directory update URL"
+msgstr "URL für Updates beim weltweiten Verzeichnis"
+
+#: ../../mod/admin.php:321
+msgid "Block multiple registrations"
+msgstr "Unterbinde mehrfach Registration"
+
+#: ../../mod/admin.php:322
+msgid "OpenID support"
+msgstr "OpenID Unterstützung"
+
+#: ../../mod/admin.php:323
+msgid "Gravatar support"
+msgstr "Gravatar Unterstützung"
+
+#: ../../mod/admin.php:324
+msgid "Fullname check"
+msgstr "Name auf Vollständigkeit überprüfen"
+
+#: ../../mod/admin.php:325
+msgid "UTF-8 Regular expressions"
+msgstr "UTF-8 Reguläre Ausdrücke"
+
+#: ../../mod/admin.php:326
+msgid "Show Community Page"
+msgstr "Gemeinschaftsseite anzeigen"
+
+#: ../../mod/admin.php:327
+msgid "Enable OStatus support"
+msgstr "OStatus Unterstützung aktivieren"
+
+#: ../../mod/admin.php:328
+msgid "Only allow Friendika contacts"
+msgstr "Erlaube ausschlließlich Friendika Kontakte"
+
+#: ../../mod/admin.php:329
+msgid "Verify SSL"
+msgstr "SSL Überprüfen"
+
+#: ../../mod/admin.php:330
+msgid "Proxy user"
+msgstr "Proxy Nutzer"
+
+#: ../../mod/admin.php:331
+msgid "Proxy URL"
+msgstr "Proxy URL"
+
+#: ../../mod/admin.php:332
+msgid "Network timeout"
+msgstr "Netzwerk Wartezeit"
+
+#: ../../mod/admin.php:353
+#, php-format
+msgid "%s user blocked"
+msgid_plural "%s users blocked/unblocked"
+msgstr[0] "%s Nutzer gesperrt"
+msgstr[1] "%s Nutzer gesperrt/entsperrt"
+
+#: ../../mod/admin.php:360
+#, php-format
+msgid "%s user deleted"
+msgid_plural "%s users deleted"
+msgstr[0] "%s Nutzer gelöscht"
+msgstr[1] "%s Nutzer gelöscht"
+
+#: ../../mod/admin.php:394
+#, php-format
+msgid "User '%s' deleted"
+msgstr "Nutzer '%s' gelöscht"
+
+#: ../../mod/admin.php:401
+#, php-format
+msgid "User '%s' unblocked"
+msgstr "Nutzer '%s' entsperrt"
+
+#: ../../mod/admin.php:401
+#, php-format
+msgid "User '%s' blocked"
+msgstr "Nutzer '%s' gesperrt"
+
+#: ../../mod/admin.php:462
+msgid "select all"
+msgstr "Alle auswählen"
+
+#: ../../mod/admin.php:463
+msgid "User registrations waiting for confirm"
+msgstr "Neuanmeldungen die auf deine Bestätigung warten"
+
+#: ../../mod/admin.php:464
+msgid "Request date"
+msgstr "Anfrage Datum"
+
+#: ../../mod/admin.php:464 ../../mod/admin.php:473
+msgid "Email"
+msgstr "Email"
+
+#: ../../mod/admin.php:465
+msgid "No registrations."
+msgstr "Keine Neuanmeldungen."
+
+#: ../../mod/admin.php:467
+msgid "Deny"
+msgstr "Verwehren"
+
+#: ../../mod/admin.php:469
+msgid "Block"
+msgstr "Sperren"
+
+#: ../../mod/admin.php:470
+msgid "Unblock"
+msgstr "Entsperren"
+
+#: ../../mod/admin.php:473
+msgid "Register date"
+msgstr "Anmeldedatum"
+
+#: ../../mod/admin.php:473
+msgid "Last login"
+msgstr "Letzte Anmeldung"
+
+#: ../../mod/admin.php:473
+msgid "Last item"
+msgstr "Letzter Beitrag"
+
+#: ../../mod/admin.php:473
+msgid "Account"
+msgstr "Nutzerkonto"
+
+#: ../../mod/admin.php:475
+msgid ""
+"Selected users will be deleted!\\n\\nEverything these users had posted on "
+"this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr ""
+"Die markierten Nutzer werden gelöscht!\\n\\nAlle Beiträge die diese Nutzer "
+"auf dieser Seite veröffentlicht haben werden permanent gelöscht!\\n\\nBist "
+"du dir sicher?"
+
+#: ../../mod/admin.php:476
+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 ""
+"Der Nutzer {0} wird gelöscht!\\n\\nAlles was dieser Nutzer auf dieser Seite "
+"veröffentlicht hat wird permanent gelöscht!\\n\\nBist du dir sicher?"
+
+#: ../../mod/admin.php:512
+#, php-format
+msgid "Plugin %s disabled."
+msgstr "Plugin %s deaktiviert."
+
+#: ../../mod/admin.php:516
+#, php-format
+msgid "Plugin %s enabled."
+msgstr "Plugin %s aktiviert."
+
+#: ../../mod/admin.php:526
+msgid "Disable"
+msgstr "Ausschalten"
+
+#: ../../mod/admin.php:528
+msgid "Enable"
+msgstr "Einschalten"
+
+#: ../../mod/admin.php:550
+msgid "Toggle"
+msgstr "Umschalten"
+
+#: ../../mod/admin.php:551 ../../include/nav.php:108
+msgid "Settings"
+msgstr "Einstellungen"
+
+#: ../../mod/admin.php:613
+msgid "Log settings updated."
+msgstr "Protokolleinstellungen aktualisiert."
+
+#: ../../mod/admin.php:653
+msgid "Clear"
+msgstr "löschen"
+
+#: ../../mod/admin.php:659
+msgid "Debugging"
+msgstr "Protokoll führen"
+
+#: ../../mod/admin.php:660
+msgid "Log file"
+msgstr "Protokolldatei"
+
+#: ../../mod/admin.php:660
+msgid "Must be writable by web server. Relative to your Friendika index.php."
+msgstr ""
+"Muss schreibbar durch den Webserver sein. Angabe relativ zu Friendikas "
+"indes.php."
+
+#: ../../mod/admin.php:661
+msgid "Log level"
+msgstr "Protokollevel"
+
+#: ../../mod/admin.php:702
+msgid "Close"
+msgstr "Schließen"
+
+#: ../../mod/admin.php:708
+msgid "FTP Host"
+msgstr "FTP Host"
+
+#: ../../mod/admin.php:709
+msgid "FTP Path"
+msgstr "FTP Pfad"
+
+#: ../../mod/admin.php:710
+msgid "FTP User"
+msgstr "FTP Nutzername"
+
+#: ../../mod/admin.php:711
+msgid "FTP Password"
+msgstr "FTP Passwort"
+
+#: ../../mod/profile.php:11 ../../boot.php:793
msgid "No profile"
msgstr "Kein Profil"
-#: ../../mod/profile.php:59
+#: ../../mod/profile.php:102 ../../mod/display.php:63
msgid "Access to this profile has been restricted."
-msgstr "Der Zugriff zu diesem Profil wurde eingeschrängt."
-
-#: ../../mod/profile.php:115
-msgid "Status"
-msgstr "Status"
+msgstr "Der Zugriff zu diesem Profil wurde eingeschränkt."
-#: ../../mod/profile.php:117
-msgid "Photos"
-msgstr "Bilder"
+#: ../../mod/profile.php:133
+msgid "Tips for New Members"
+msgstr "Tipps für neue Nutzer"
-#: ../../mod/openid.php:62 ../../mod/openid.php:122 ../../include/auth.php:114
-#: ../../include/auth.php:139 ../../include/auth.php:192
+#: ../../mod/openid.php:62 ../../mod/openid.php:122 ../../include/auth.php:120
+#: ../../include/auth.php:145 ../../include/auth.php:198
msgid "Login failed."
msgstr "Annmeldung fehlgeschlagen."
-#: ../../mod/openid.php:78 ../../include/auth.php:208
+#: ../../mod/openid.php:78 ../../include/auth.php:214
msgid "Welcome "
msgstr "Willkommen "
-#: ../../mod/openid.php:79 ../../include/auth.php:209
+#: ../../mod/openid.php:79 ../../include/auth.php:215
msgid "Please upload a profile photo."
msgstr "Bitte lade ein Profilbild hoch."
-#: ../../mod/openid.php:82 ../../include/auth.php:212
+#: ../../mod/openid.php:82 ../../include/auth.php:218
msgid "Welcome back "
msgstr "Willkommen zurück "
-#: ../../mod/follow.php:43
-msgid "The profile address specified does not provide adequate information."
-msgstr "Die angegebene Profiladresse liefert unzureichende Informationen."
+#: ../../mod/follow.php:39
+msgid ""
+"This site is not configured to allow communications with other networks."
+msgstr ""
+"Diese Seite ist so konfiguriert, dass keine Kommunikation mit anderen "
+"Netzwerken erfolgen kann."
-#: ../../mod/follow.php:45
+#: ../../mod/follow.php:40 ../../mod/follow.php:50
msgid "No compatible communication protocols or feeds were discovered."
msgstr ""
"Es wurden keine kompatiblen Kommunikationsprotokolle oder Feeds gefunden."
-#: ../../mod/follow.php:47
+#: ../../mod/follow.php:48
+msgid "The profile address specified does not provide adequate information."
+msgstr "Die angegebene Profiladresse liefert unzureichende Informationen."
+
+#: ../../mod/follow.php:52
msgid "An author or name was not found."
msgstr "Es wurde kein Autor oder Name gefunden."
-#: ../../mod/follow.php:49
+#: ../../mod/follow.php:54
msgid "No browser URL could be matched to this address."
msgstr "Zu dieser Adresse konnte keine passende Browser URL gefunden werden."
-#: ../../mod/follow.php:57
+#: ../../mod/follow.php:61
+msgid "Communication options with this network have been restricted."
+msgstr "Kommunikations-Optionen mit diesem Netzwerk wurden eingeschränkt."
+
+#: ../../mod/follow.php:66
msgid ""
"Limited profile. This person will be unable to receive direct/personal "
"notifications from you."
@@ -2203,19 +2892,19 @@ msgstr ""
"Eingeschränktes Profil. Diese Person wird keine direkten/privaten "
"Nachrichten von dir erhalten können."
-#: ../../mod/follow.php:112
+#: ../../mod/follow.php:121
msgid "Unable to retrieve contact information."
msgstr "Konnte die Kontaktinformationen nicht empfangen."
-#: ../../mod/follow.php:158
+#: ../../mod/follow.php:167
msgid "following"
msgstr "folgen"
-#: ../../mod/display.php:135
+#: ../../mod/display.php:105
msgid "Item has been removed."
msgstr "Eintrag wurde entfernt."
-#: ../../mod/dfrn_notify.php:251
+#: ../../mod/dfrn_notify.php:353
msgid "New mail received at "
msgstr "New mail received at "
@@ -2223,16 +2912,16 @@ msgstr "New mail received at "
msgid "Applications"
msgstr "Anwendungen"
-#: ../../mod/search.php:26 ../../include/nav.php:70 ../../boot.php:2114
+#: ../../mod/apps.php:11
+msgid "No installed applications."
+msgstr "Keine Applikationen installiert."
+
+#: ../../mod/search.php:26 ../../include/text.php:603 ../../include/nav.php:69
msgid "Search"
msgstr "Suche"
-#: ../../mod/search.php:69
-msgid "No results."
-msgstr "Keine Ergebnisse."
-
-#: ../../mod/profiles.php:21 ../../mod/profiles.php:240
-#: ../../mod/profiles.php:345 ../../mod/dfrn_confirm.php:62
+#: ../../mod/profiles.php:21 ../../mod/profiles.php:236
+#: ../../mod/profiles.php:341 ../../mod/dfrn_confirm.php:62
msgid "Profile not found."
msgstr "Profil nicht gefunden."
@@ -2240,187 +2929,183 @@ msgstr "Profil nicht gefunden."
msgid "Profile Name is required."
msgstr "Profilname ist erforderlich."
-#: ../../mod/profiles.php:202
+#: ../../mod/profiles.php:198
msgid "Profile updated."
msgstr "Profil aktualisiert."
-#: ../../mod/profiles.php:257
+#: ../../mod/profiles.php:253
msgid "Profile deleted."
msgstr "Profil gelöscht."
-#: ../../mod/profiles.php:273 ../../mod/profiles.php:304
+#: ../../mod/profiles.php:269 ../../mod/profiles.php:300
msgid "Profile-"
msgstr "Profil-"
-#: ../../mod/profiles.php:292 ../../mod/profiles.php:331
+#: ../../mod/profiles.php:288 ../../mod/profiles.php:327
msgid "New profile created."
msgstr "Neues Profil angelegt."
-#: ../../mod/profiles.php:310
+#: ../../mod/profiles.php:306
msgid "Profile unavailable to clone."
msgstr "Profil nicht zum Duplizieren verfügbar."
-#: ../../mod/profiles.php:357
+#: ../../mod/profiles.php:353
msgid "Hide your contact/friend list from viewers of this profile?"
msgstr "Liste der Kontakte/Freunde vor Betrachtern dieses Profils verbergen?"
-#: ../../mod/profiles.php:366
-msgid "Hide profile details and all your messages from unknown viewers?"
-msgstr ""
-"Profildetails und all deine Beiträge vor unbekannten Besuchern verbergen?"
-
-#: ../../mod/profiles.php:382
+#: ../../mod/profiles.php:371
msgid "Edit Profile Details"
msgstr "Profil bearbeiten"
-#: ../../mod/profiles.php:384
+#: ../../mod/profiles.php:373
msgid "View this profile"
msgstr "Dieses Profil anzeigen"
-#: ../../mod/profiles.php:385
+#: ../../mod/profiles.php:374
msgid "Create a new profile using these settings"
msgstr "Neues Profil anlegen und diese Einstellungen verwenden"
-#: ../../mod/profiles.php:386
+#: ../../mod/profiles.php:375
msgid "Clone this profile"
msgstr "Dieses Profil duplizieren"
-#: ../../mod/profiles.php:387
+#: ../../mod/profiles.php:376
msgid "Delete this profile"
msgstr "Dieses Profil löschen"
-#: ../../mod/profiles.php:388
+#: ../../mod/profiles.php:377
msgid "Profile Name:"
msgstr "Profilname:"
-#: ../../mod/profiles.php:389
+#: ../../mod/profiles.php:378
msgid "Your Full Name:"
msgstr "Dein kompletter Name:"
-#: ../../mod/profiles.php:390
+#: ../../mod/profiles.php:379
msgid "Title/Description:"
msgstr "Titel/Beschreibung:"
-#: ../../mod/profiles.php:391
+#: ../../mod/profiles.php:380
msgid "Your Gender:"
msgstr "Dein Geschlecht:"
-#: ../../mod/profiles.php:392
-msgid "Birthday (y/m/d):"
-msgstr "Geburtstag (y/m/d):"
+#: ../../mod/profiles.php:381
+#, php-format
+msgid "Birthday (%s):"
+msgstr "Geburtstag (%s):"
-#: ../../mod/profiles.php:393
+#: ../../mod/profiles.php:382
msgid "Street Address:"
msgstr "Adresse:"
-#: ../../mod/profiles.php:394
+#: ../../mod/profiles.php:383
msgid "Locality/City:"
msgstr "Wohnort/Stadt:"
-#: ../../mod/profiles.php:395
+#: ../../mod/profiles.php:384
msgid "Postal/Zip Code:"
msgstr "Postleitzahl:"
-#: ../../mod/profiles.php:396
+#: ../../mod/profiles.php:385
msgid "Country:"
msgstr "Land:"
-#: ../../mod/profiles.php:397
+#: ../../mod/profiles.php:386
msgid "Region/State:"
msgstr "Region/Bundesstaat:"
-#: ../../mod/profiles.php:398
+#: ../../mod/profiles.php:387
msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
msgstr "<span class=\"heart\">&hearts;</span> Beziehungs Status:"
-#: ../../mod/profiles.php:399
+#: ../../mod/profiles.php:388
msgid "Who: (if applicable)"
msgstr "Wer: (falls anwendbar)"
-#: ../../mod/profiles.php:400
+#: ../../mod/profiles.php:389
msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
msgstr "Beispiel: cathy123, Cathy Williams, cathy@example.com"
-#: ../../mod/profiles.php:401 ../../include/profile_advanced.php:90
+#: ../../mod/profiles.php:390 ../../include/profile_advanced.php:90
msgid "Sexual Preference:"
msgstr "Sexuelle Vorlieben:"
-#: ../../mod/profiles.php:402
+#: ../../mod/profiles.php:391
msgid "Homepage URL:"
msgstr "Adresse der Homepage:"
-#: ../../mod/profiles.php:403 ../../include/profile_advanced.php:115
+#: ../../mod/profiles.php:392 ../../include/profile_advanced.php:115
msgid "Political Views:"
msgstr "Politische Ansichten:"
-#: ../../mod/profiles.php:404
+#: ../../mod/profiles.php:393
msgid "Religious Views:"
msgstr "Religiöse Ansichten:"
-#: ../../mod/profiles.php:405
+#: ../../mod/profiles.php:394
msgid "Public Keywords:"
msgstr "Öffentliche Schlüsselwörter:"
-#: ../../mod/profiles.php:406
+#: ../../mod/profiles.php:395
msgid "Private Keywords:"
msgstr "Private Schlüsselwörter:"
-#: ../../mod/profiles.php:407
+#: ../../mod/profiles.php:396
msgid "Example: fishing photography software"
msgstr "Beispiel: Fischen Photographie Software"
-#: ../../mod/profiles.php:408
+#: ../../mod/profiles.php:397
msgid "(Used for suggesting potential friends, can be seen by others)"
msgstr ""
"(Wird verwendet um potentielle Freunde zu finden, könnte von Fremden "
"eingesehen werden)"
-#: ../../mod/profiles.php:409
+#: ../../mod/profiles.php:398
msgid "(Used for searching profiles, never shown to others)"
msgstr ""
"(Wird für die Suche nach Profilen verwendet und niemals veröffentlicht)"
-#: ../../mod/profiles.php:410
+#: ../../mod/profiles.php:399
msgid "Tell us about yourself..."
msgstr "Erzähle und ein bisschen von dir..."
-#: ../../mod/profiles.php:411
+#: ../../mod/profiles.php:400
msgid "Hobbies/Interests"
msgstr "Hobbies/Interessen"
-#: ../../mod/profiles.php:412
+#: ../../mod/profiles.php:401
msgid "Contact information and Social Networks"
msgstr "Kontaktinformationen und Soziale Netzwerke"
-#: ../../mod/profiles.php:413
+#: ../../mod/profiles.php:402
msgid "Musical interests"
msgstr "Musikalische Interessen"
-#: ../../mod/profiles.php:414
+#: ../../mod/profiles.php:403
msgid "Books, literature"
msgstr "Literatur/Bücher"
-#: ../../mod/profiles.php:415
+#: ../../mod/profiles.php:404
msgid "Television"
msgstr "Fernsehen"
-#: ../../mod/profiles.php:416
+#: ../../mod/profiles.php:405
msgid "Film/dance/culture/entertainment"
msgstr "Filme/Tänze/Kultur/Unterhaltung"
-#: ../../mod/profiles.php:417
+#: ../../mod/profiles.php:406
msgid "Love/romance"
msgstr "Liebesleben"
-#: ../../mod/profiles.php:418
+#: ../../mod/profiles.php:407
msgid "Work/employment"
msgstr "Arbeit/Beschäftigung"
-#: ../../mod/profiles.php:419
+#: ../../mod/profiles.php:408
msgid "School/education"
msgstr "Schule/Ausbildung"
-#: ../../mod/profiles.php:424
+#: ../../mod/profiles.php:413
msgid ""
"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
"be visible to anybody using the internet."
@@ -2428,31 +3113,31 @@ msgstr ""
"Dies ist dein <strong>öffentliches</strong> Profil.<br />Es "
"<strong>könnte</strong> für jeden Nutzer des Internets sichtbar sein."
-#: ../../mod/profiles.php:435 ../../mod/directory.php:112
+#: ../../mod/profiles.php:423 ../../mod/directory.php:112
msgid "Age: "
msgstr "Alter: "
-#: ../../mod/profiles.php:470 ../../include/nav.php:108
+#: ../../mod/profiles.php:458 ../../include/nav.php:109
msgid "Profiles"
msgstr "Profile"
-#: ../../mod/profiles.php:471
+#: ../../mod/profiles.php:459
msgid "Change profile photo"
msgstr "Profilbild ändern"
-#: ../../mod/profiles.php:472
+#: ../../mod/profiles.php:460
msgid "Create New Profile"
msgstr "Neues Profil anlegen"
-#: ../../mod/profiles.php:482
+#: ../../mod/profiles.php:470
msgid "Profile Image"
msgstr "Profilbild"
-#: ../../mod/profiles.php:484
-msgid "Visible to everybody"
-msgstr "Für jeden sichtbar"
+#: ../../mod/profiles.php:472
+msgid "visible to everybody"
+msgstr "sichtbar für jeden"
-#: ../../mod/profiles.php:485
+#: ../../mod/profiles.php:473
msgid "Edit visibility"
msgstr "Sichtbarkeit bearbeiten"
@@ -2480,46 +3165,54 @@ msgstr "Geschlecht:"
msgid "No entries (some entries may be hidden)."
msgstr "Keine Einträge (einige Einträge könnten versteckt sein)."
-#: ../../mod/invite.php:28
+#: ../../mod/invite.php:35
#, php-format
msgid "%s : Not a valid email address."
msgstr "%s: Keine gültige Email Adresse."
-#: ../../mod/invite.php:32
+#: ../../mod/invite.php:59
#, php-format
msgid "Please join my network on %s"
msgstr "Bitte trete meinem Netzwerk auf %s bei"
-#: ../../mod/invite.php:42
+#: ../../mod/invite.php:69
#, php-format
msgid "%s : Message delivery failed."
msgstr "%s: Zustellung der Nachricht fehlgeschlagen."
-#: ../../mod/invite.php:46
+#: ../../mod/invite.php:73
#, php-format
msgid "%d message sent."
msgid_plural "%d messages sent."
msgstr[0] "%d Nachricht gesendet."
msgstr[1] "%d Nachrichten gesendet."
-#: ../../mod/invite.php:61
+#: ../../mod/invite.php:92
+msgid "You have no more invitations available"
+msgstr "Du hast keine weiteren Einladungen"
+
+#: ../../mod/invite.php:99
msgid "Send invitations"
msgstr "Einladungen senden"
-#: ../../mod/invite.php:62
+#: ../../mod/invite.php:100
msgid "Enter email addresses, one per line:"
msgstr "Email Adressen eingeben, eine pro Zeile:"
-#: ../../mod/invite.php:64
+#: ../../mod/invite.php:102
#, php-format
msgid "Please join my social network on %s"
msgstr "Bitte trete meinem Sozialen Netzwerk auf %s bei"
-#: ../../mod/invite.php:65
+#: ../../mod/invite.php:103
msgid "To accept this invitation, please visit:"
msgstr "Um diese Einladung anzunehmen beuche bitte:"
-#: ../../mod/invite.php:66
+#: ../../mod/invite.php:104
+msgid "You will need to supply this invitation code: $invite_code"
+msgstr "Du benötigst den folgenden Einladungs Code: $invite_code"
+
+#: ../../mod/invite.php:104
msgid ""
"Once you have registered, please connect with me via my profile page at:"
msgstr ""
@@ -2556,7 +3249,7 @@ msgstr "Vorstellung schlug fehl oder wurde zurück gezogen."
msgid "Unable to set contact photo."
msgstr "Konnte das Bild des Kontakts nicht speichern."
-#: ../../mod/dfrn_confirm.php:430 ../../include/conversation.php:61
+#: ../../mod/dfrn_confirm.php:430 ../../include/conversation.php:79
#, php-format
msgid "%1$s is now friends with %2$s"
msgstr "%1$s ist nun mit %2$s befreundet"
@@ -2602,47 +3295,66 @@ msgstr "Die Updates für dein Profil konnten nicht gespeichert werden"
msgid "Connection accepted at %s"
msgstr "Auf %s wurde die Verbindung akzeptiert"
-#: ../../addon/facebook/facebook.php:248
+#: ../../addon/facebook/facebook.php:314
msgid "Facebook disabled"
msgstr "Facebook deaktiviert"
-#: ../../addon/facebook/facebook.php:253
+#: ../../addon/facebook/facebook.php:319
msgid "Updating contacts"
msgstr "Aktualisiere Kontakte"
-#: ../../addon/facebook/facebook.php:262
+#: ../../addon/facebook/facebook.php:328
msgid "Facebook API key is missing."
msgstr "Facebook API Schlüssel nicht gefunden"
-#: ../../addon/facebook/facebook.php:269
+#: ../../addon/facebook/facebook.php:335
msgid "Facebook Connect"
msgstr "Mit Facebook verbinden"
-#: ../../addon/facebook/facebook.php:275
+#: ../../addon/facebook/facebook.php:341
msgid "Install Facebook connector for this account."
msgstr "Facebook Connector für diesen Account installieren."
-#: ../../addon/facebook/facebook.php:282
+#: ../../addon/facebook/facebook.php:348
msgid "Remove Facebook connector"
msgstr "Facebook Connector entfernen"
-#: ../../addon/facebook/facebook.php:288
+#: ../../addon/facebook/facebook.php:354
msgid "Post to Facebook by default"
msgstr "Sende standardmäßig nach Facebook"
-#: ../../addon/facebook/facebook.php:350
+#: ../../addon/facebook/facebook.php:358
+msgid "Link all your Facebook friends and conversations"
+msgstr "Verknüpfe all deine Facebook-Freunde und Unterhaltungen"
+
+#: ../../addon/facebook/facebook.php:363
+msgid "Warning: Your Facebook privacy settings can not be imported."
+msgstr ""
+"Warnung: Deine Privatsphären Einstellungen können nicht von Facebook "
+"importiert werden."
+
+#: ../../addon/facebook/facebook.php:364
+msgid ""
+"Linked Facebook items <strong>may</strong> be publicly visible, depending on"
+" your privacy settings for this website/account."
+msgstr ""
+"Eingebundene Beiträge von Facebook <strong>könnten</strong> öffentlich "
+"sichtbar sein, abhängig von deinen Privatsphären-Einstellungen für dieses "
+"Nutzerkonto."
+
+#: ../../addon/facebook/facebook.php:419
msgid "Facebook"
msgstr "Facebook"
-#: ../../addon/facebook/facebook.php:351
+#: ../../addon/facebook/facebook.php:420
msgid "Facebook Connector Settings"
msgstr "Facebook Verbindungseinstellungen"
-#: ../../addon/facebook/facebook.php:365
+#: ../../addon/facebook/facebook.php:434
msgid "Post to Facebook"
msgstr "Zu Facebook posten"
-#: ../../addon/facebook/facebook.php:434
+#: ../../addon/facebook/facebook.php:507
msgid ""
"Post to Facebook cancelled because of multi-network access permission "
"conflict."
@@ -2650,43 +3362,51 @@ msgstr ""
"Das Senden nach Facebook wurde zurückgezogen da Konflikte bei den Multi-"
"Netzwerks-Rechten vorliegen."
-#: ../../addon/facebook/facebook.php:500
+#: ../../addon/facebook/facebook.php:573
msgid "Image: "
msgstr "Bild"
-#: ../../addon/facebook/facebook.php:576
+#: ../../addon/facebook/facebook.php:649
msgid "View on Friendika"
msgstr "Auf Friendika ansehen"
-#: ../../addon/widgets/widgets.php:41
-msgid "Widgets key: "
-msgstr "Widgets Schlüssel: "
+#: ../../addon/facebook/facebook.php:680
+msgid "Facebook post failed. Queued for retry."
+msgstr "Senden an Facebook gescheitert. Wir versuchen es später erneut."
-#: ../../addon/widgets/widgets.php:45
+#: ../../addon/widgets/widgets.php:53
msgid "Generate new key"
msgstr "Neuen Schlüssel erstellen"
+#: ../../addon/widgets/widgets.php:56
+msgid "Widgets key"
+msgstr "Widgets Schlüssel"
+
+#: ../../addon/widgets/widgets.php:58
+msgid "Widgets available"
+msgstr "Verfügbare Widgets"
+
#: ../../addon/widgets/widget_friends.php:30
msgid "Connect on Friendika!"
msgstr "Auf Friendika Verbinden!"
-#: ../../addon/tictac/tictac.php:14
+#: ../../addon/tictac/tictac.php:20
msgid "Three Dimensional Tic-Tac-Toe"
msgstr "Dreidimensionales Tic-Tac-Toe"
-#: ../../addon/tictac/tictac.php:47
+#: ../../addon/tictac/tictac.php:53
msgid "3D Tic-Tac-Toe"
msgstr "3D Tic-Tac-Toe"
-#: ../../addon/tictac/tictac.php:52
+#: ../../addon/tictac/tictac.php:58
msgid "New game"
msgstr "Neues Spiel"
-#: ../../addon/tictac/tictac.php:53
+#: ../../addon/tictac/tictac.php:59
msgid "New game with handicap"
msgstr "Neues Handicap Spiel"
-#: ../../addon/tictac/tictac.php:54
+#: ../../addon/tictac/tictac.php:60
msgid ""
"Three dimensional tic-tac-toe is just like the traditional game except that "
"it is played on multiple levels simultaneously. "
@@ -2694,7 +3414,7 @@ msgstr ""
"Drei dimensionales Tic-Tac-Toe ist genauso wie das herkömmliche Spiel, nur "
"das man es auf mehreren Ebenen gleichzeitig spielt."
-#: ../../addon/tictac/tictac.php:55
+#: ../../addon/tictac/tictac.php:61
msgid ""
"In this case there are three levels. You win by getting three in a row on "
"any level, as well as up, down, and diagonally across the different levels."
@@ -2703,7 +3423,7 @@ msgstr ""
"Reihe auf einer beliebigen Reihe schafft, oder drei übereinander oder "
"diagonal auf verschiedenen Ebenen."
-#: ../../addon/tictac/tictac.php:57
+#: ../../addon/tictac/tictac.php:63
msgid ""
"The handicap game disables the center position on the middle level because "
"the player claiming this square often has an unfair advantage."
@@ -2711,96 +3431,122 @@ msgstr ""
"Beim Handicap-Spiel wird die zentrale Position der mittleren Ebene gesperrt "
"da der Spieler der diese Ebene besitzt oft einen unfairen Vorteil genießt."
-#: ../../addon/tictac/tictac.php:176
+#: ../../addon/tictac/tictac.php:182
msgid "You go first..."
msgstr "Du fängst an..."
-#: ../../addon/tictac/tictac.php:181
+#: ../../addon/tictac/tictac.php:187
msgid "I'm going first this time..."
msgstr "Diesmal fange ich an..."
-#: ../../addon/tictac/tictac.php:187
+#: ../../addon/tictac/tictac.php:193
msgid "You won!"
msgstr "Du gewinnst!"
-#: ../../addon/tictac/tictac.php:193 ../../addon/tictac/tictac.php:218
+#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
msgid "\"Cat\" game!"
msgstr "Unentschieden!"
-#: ../../addon/tictac/tictac.php:216
+#: ../../addon/tictac/tictac.php:222
msgid "I won!"
msgstr "Ich gewinne!"
-#: ../../addon/randplace/randplace.php:171
+#: ../../addon/randplace/randplace.php:170
msgid "Randplace Settings"
msgstr "Randplace Einstellungen"
-#: ../../addon/randplace/randplace.php:173
+#: ../../addon/randplace/randplace.php:172
msgid "Enable Randplace Plugin"
msgstr "Randplace Erweiterung aktivieren"
-#: ../../addon/java_upload/java_upload.php:33
-msgid "Select files to upload: "
-msgstr "Wähle Dateien zum Upload aus: "
-
-#: ../../addon/java_upload/java_upload.php:35
-msgid ""
-"Use the following controls only if the Java uploader [above] fails to "
-"launch."
-msgstr ""
-"Verwende die folgenden Kontrollen nur, wenn der Java Uploader [oben] nicht "
-"funktioniert."
-
-#: ../../addon/js_upload/js_upload.php:39
+#: ../../addon/js_upload/js_upload.php:43
msgid "Upload a file"
msgstr "Datei hochladen"
-#: ../../addon/js_upload/js_upload.php:40
+#: ../../addon/js_upload/js_upload.php:44
msgid "Drop files here to upload"
msgstr "Ziehe die Dateien hier her die du hochladen willst"
-#: ../../addon/js_upload/js_upload.php:42
+#: ../../addon/js_upload/js_upload.php:46
msgid "Failed"
msgstr "Fehlgeschlagen"
-#: ../../addon/js_upload/js_upload.php:288
+#: ../../addon/js_upload/js_upload.php:292
msgid "No files were uploaded."
msgstr "Keine Dateien hochgeladen."
-#: ../../addon/js_upload/js_upload.php:294
+#: ../../addon/js_upload/js_upload.php:298
msgid "Uploaded file is empty"
msgstr "Hochgeladene Datei ist leer"
-#: ../../addon/js_upload/js_upload.php:299
+#: ../../addon/js_upload/js_upload.php:303
msgid "Uploaded file is too large"
msgstr "Hochgeladene Datei ist zu groß"
-#: ../../addon/js_upload/js_upload.php:317
+#: ../../addon/js_upload/js_upload.php:321
msgid "File has an invalid extension, it should be one of "
msgstr ""
"Die Dateiextension ist nicht erlaubt, sie muss eine der folgenden sein "
-#: ../../addon/js_upload/js_upload.php:328
+#: ../../addon/js_upload/js_upload.php:332
msgid "Upload was cancelled, or server error encountered"
msgstr "Upload abgebrochen oder Serverfehler aufgetreten"
-#: ../../addon/oembed/oembed.php:29
+#: ../../addon/impressum/impressum.php:25
+msgid "Impressum"
+msgstr "Impressum"
+
+#: ../../addon/impressum/impressum.php:38
+#: ../../addon/impressum/impressum.php:40
+#: ../../addon/impressum/impressum.php:70
+msgid "Site Owner"
+msgstr "Betreiber der Seite"
+
+#: ../../addon/impressum/impressum.php:38
+#: ../../addon/impressum/impressum.php:74
+msgid "Email Address"
+msgstr "Email Adresse"
+
+#: ../../addon/impressum/impressum.php:43
+#: ../../addon/impressum/impressum.php:72
+msgid "Postal Address"
+msgstr "Postalische Anschrift"
+
+#: ../../addon/impressum/impressum.php:49
+msgid ""
+"The impressum addon needs to be configured!<br />Please add at least the "
+"<tt>owner</tt> variable to your config file. For other variables please "
+"refer to the README file of the addon."
+msgstr ""
+"Das Impressums Plugin muss noch konfiguriert werden.<br />Bitte gebe "
+"mindestens den <tt>Betreiber</tt> in der Konfiguration an. Alle weiteren "
+"Parameter werden in der README Datei des Addons erleutert."
+
+#: ../../addon/impressum/impressum.php:71
+msgid "Site Owners Profile"
+msgstr "Profil des Seitenbetreibers"
+
+#: ../../addon/impressum/impressum.php:73
+msgid "Notes"
+msgstr "Hinweise"
+
+#: ../../addon/oembed/oembed.php:30
msgid "OEmbed settings updated"
msgstr "OEmbed Einstellungen aktualisiert."
-#: ../../addon/oembed/oembed.php:42
-msgid "Use OEmbed for YouTube videos: "
-msgstr "OEmbed für YouTube videos verwenden: "
+#: ../../addon/oembed/oembed.php:43
+msgid "Use OEmbed for YouTube videos"
+msgstr "OEmbed für Youtube Videos verwenden"
-#: ../../addon/oembed/oembed.php:76
+#: ../../addon/oembed/oembed.php:71
msgid "URL to embed:"
msgstr "URL zum Einbetten:"
-#: ../../addon/statusnet/statusnet.php:78
+#: ../../addon/statusnet/statusnet.php:82
msgid "Post to StatusNet"
msgstr "Nach StatusNet senden"
-#: ../../addon/statusnet/statusnet.php:117
+#: ../../addon/statusnet/statusnet.php:124
msgid ""
"Please contact your site administrator.<br />The provided API URL is not "
"valid."
@@ -2808,24 +3554,24 @@ msgstr ""
"Bitte kontaktiere den Administrator der Seite.<br />Die gegebene API URL ist"
" nicht gültig."
-#: ../../addon/statusnet/statusnet.php:145
+#: ../../addon/statusnet/statusnet.php:152
msgid "We could not contact the StatusNet API with the Path you entered."
msgstr ""
"Die StatusNet API konnte mit dem angegebenen Pfad nicht erreicht werden."
-#: ../../addon/statusnet/statusnet.php:172
+#: ../../addon/statusnet/statusnet.php:179
msgid "StatusNet settings updated."
msgstr "StatusNet Einstellungen aktualisiert."
-#: ../../addon/statusnet/statusnet.php:195
+#: ../../addon/statusnet/statusnet.php:202
msgid "StatusNet Posting Settings"
msgstr "StatusNet Posting Einstellungen"
-#: ../../addon/statusnet/statusnet.php:209
+#: ../../addon/statusnet/statusnet.php:216
msgid "Globally Available StatusNet OAuthKeys"
msgstr "Verfügbare OAuth Schlüssel für StatusNet"
-#: ../../addon/statusnet/statusnet.php:210
+#: ../../addon/statusnet/statusnet.php:217
msgid ""
"There are preconfigured OAuth key pairs for some StatusNet servers "
"available. If you are useing one of them, please use these credentials. If "
@@ -2835,11 +3581,11 @@ msgstr ""
" einen dieser Server benutzen, dann verwende doch bitte diese Schlüssel. "
"Falls nicht kannst du weiter unten deine eigenen OAuth Schlüssel eintragen."
-#: ../../addon/statusnet/statusnet.php:218
+#: ../../addon/statusnet/statusnet.php:225
msgid "Provide your own OAuth Credentials"
msgstr "Eigene OAuth Schlüssel eintragen"
-#: ../../addon/statusnet/statusnet.php:219
+#: ../../addon/statusnet/statusnet.php:226
msgid ""
"No consumer key pair for StatusNet found. Register your Friendika Account as"
" an desktop client on your StatusNet account, copy the consumer key pair "
@@ -2854,19 +3600,19 @@ msgstr ""
"deiner Friendika Seite fragen, ob es für deine bevorzugte StatusNet Instanz "
"eventuell bereits ein OAuth Schlüsselpaar gibt."
-#: ../../addon/statusnet/statusnet.php:221
+#: ../../addon/statusnet/statusnet.php:228
msgid "OAuth Consumer Key"
msgstr "OAuth Consumer Schlüssel"
-#: ../../addon/statusnet/statusnet.php:224
+#: ../../addon/statusnet/statusnet.php:231
msgid "OAuth Consumer Secret"
msgstr "OAuth Consumer Geheimnis"
-#: ../../addon/statusnet/statusnet.php:227
+#: ../../addon/statusnet/statusnet.php:234
msgid "Base API Path (remember the trailing /)"
msgstr "Basis-URL der StatusNet API (vergiss den abschließenden / nicht)"
-#: ../../addon/statusnet/statusnet.php:248
+#: ../../addon/statusnet/statusnet.php:255
msgid ""
"To connect to your StatusNet account click the button below to get a "
"security code from StatusNet which you have to copy into the input box below"
@@ -2878,59 +3624,78 @@ msgstr ""
"diesen in die Eingabebox weiter unten. Es werden ausschließlich deine "
"<strong>öffentlichen</strong> Nachrichten bei StatusNet veröffentllicht."
-#: ../../addon/statusnet/statusnet.php:249
+#: ../../addon/statusnet/statusnet.php:256
msgid "Log in with StatusNet"
msgstr "Bei StatusNet anmelden"
-#: ../../addon/statusnet/statusnet.php:251
+#: ../../addon/statusnet/statusnet.php:258
msgid "Copy the security code from StatusNet here"
msgstr "Kopiere den Sicherheitscode von StatusNet hier her"
-#: ../../addon/statusnet/statusnet.php:257
+#: ../../addon/statusnet/statusnet.php:264
msgid "Cancel Connection Process"
msgstr "Verbindungsprozess abbrechen"
-#: ../../addon/statusnet/statusnet.php:259
+#: ../../addon/statusnet/statusnet.php:266
msgid "Current StatusNet API is"
msgstr "Derzeitige StatusNet API URL lautet"
-#: ../../addon/statusnet/statusnet.php:260
+#: ../../addon/statusnet/statusnet.php:267
msgid "Cancel StatusNet Connection"
msgstr "Verbindung zum StatusNet Server abbrechen"
-#: ../../addon/statusnet/statusnet.php:271 ../../addon/twitter/twitter.php:165
+#: ../../addon/statusnet/statusnet.php:278 ../../addon/twitter/twitter.php:180
msgid "Currently connected to: "
msgstr "Momentan verbunden mit: "
-#: ../../addon/statusnet/statusnet.php:272
+#: ../../addon/statusnet/statusnet.php:279
msgid ""
-"If enabled all your <strong>public</strong> postings will be posted to the "
-"associated StatusNet account."
+"If enabled all your <strong>public</strong> postings can be posted to the "
+"associated StatusNet account. You can choose to do so by default (here) or "
+"for every posting separately in the posting options when writing the entry."
msgstr ""
-"Wenn aktiv, werden alle deine <strong>öffentlichen</strong> Beiträge auch "
-"auf dem verbundenen StatusNet Account veröffentlicht."
+"Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf "
+"dem verbundenen StatusNet Konto veröffentlicht werden. Du kannst dies (hier)"
+" als Standartverhalten einstellen oder für jeden Eintrag separat in den "
+"Beitragsoptionen beim Schreiben des Eintrags festlegen."
-#: ../../addon/statusnet/statusnet.php:274
+#: ../../addon/statusnet/statusnet.php:281
msgid "Allow posting to StatusNet"
msgstr "Nach StatusNet senden erlauben"
-#: ../../addon/statusnet/statusnet.php:277
+#: ../../addon/statusnet/statusnet.php:284
msgid "Send public postings to StatusNet by default"
msgstr "Veröffentliche alle öffentlichen Beiträge auch bei StatusNet"
-#: ../../addon/statusnet/statusnet.php:282 ../../addon/twitter/twitter.php:172
+#: ../../addon/statusnet/statusnet.php:289 ../../addon/twitter/twitter.php:191
msgid "Clear OAuth configuration"
msgstr "OAuth Konfiguration löschen"
-#: ../../addon/twitter/twitter.php:64
+#: ../../addon/piwik/piwik.php:77
+msgid "Piwik Base URL"
+msgstr "Piwik Basis URL"
+
+#: ../../addon/piwik/piwik.php:78
+msgid "Site ID"
+msgstr "Seiten ID"
+
+#: ../../addon/piwik/piwik.php:79
+msgid "Show opt-out cookie link?"
+msgstr "Link zum Setzen des Opt-Out Cookies anzeigen?"
+
+#: ../../addon/twitter/twitter.php:70
msgid "Post to Twitter"
msgstr "Nach Twitter senden"
-#: ../../addon/twitter/twitter.php:122
+#: ../../addon/twitter/twitter.php:115
+msgid "Twitter settings updated."
+msgstr "Twitter Einstellungen aktualisiert."
+
+#: ../../addon/twitter/twitter.php:137
msgid "Twitter Posting Settings"
msgstr "Twitter Posting Einstellungen"
-#: ../../addon/twitter/twitter.php:129
+#: ../../addon/twitter/twitter.php:144
msgid ""
"No consumer key pair for Twitter found. Please contact your site "
"administrator."
@@ -2938,7 +3703,7 @@ msgstr ""
"Kein Consumer Schlüsselpaar für Twitter gefunden. Bitte wende dich an den "
"Administrator der Seite."
-#: ../../addon/twitter/twitter.php:148
+#: ../../addon/twitter/twitter.php:163
msgid ""
"At this Friendika instance the Twitter plugin was enabled but you have not "
"yet connected your account to your Twitter account. To do so click the "
@@ -2952,31 +3717,46 @@ msgstr ""
"die PIN die du auf Twitter erhälst hier ein. Es werden ausschließlich deine "
"<strong>öffentlichen</strong> Nachrichten auf Twitter veröffentlicht."
-#: ../../addon/twitter/twitter.php:149
+#: ../../addon/twitter/twitter.php:164
msgid "Log in with Twitter"
msgstr "bei Twitter anmelden"
-#: ../../addon/twitter/twitter.php:151
+#: ../../addon/twitter/twitter.php:166
msgid "Copy the PIN from Twitter here"
msgstr "Kopiere die Twitter PIN hier her"
-#: ../../addon/twitter/twitter.php:166
+#: ../../addon/twitter/twitter.php:181
msgid ""
-"If enabled all your <strong>public</strong> postings will be posted to the "
-"associated Twitter account as well."
+"If enabled all your <strong>public</strong> postings can be posted to the "
+"associated Twitter account. You can choose to do so by default (here) or for"
+" every posting separately in the posting options when writing the entry."
msgstr ""
-"Wenn dies aktiviert ist, werden alle deine <strong>öffentlichen</strong> "
-"Nachricten auch auf dem verbundenen Twitter Account veröffentlicht."
+"Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf "
+"dem verbundenen Twitter Konto veröffentlicht werden. Du kannst dies (hier) "
+"als Standartverhalten einstellen oder für jeden Eintrag separat in den "
+"Beitragsoptionen beim Schreiben des Eintrags festlegen."
+
+#: ../../addon/twitter/twitter.php:183
+msgid "Allow posting to Twitter"
+msgstr "Nach Twitter senden erlauben"
+
+#: ../../addon/twitter/twitter.php:186
+msgid "Send public postings to Twitter by default"
+msgstr "Veröffentliche alle öffentlichen Beiträge auch bei Twitter"
-#: ../../addon/twitter/twitter.php:168
-msgid "Send public postings to Twitter"
-msgstr "Veröffentliche öffentliche Nachrichten auf Twitter"
+#: ../../addon/twitter/twitter.php:278
+msgid "Consumer key"
+msgstr "Anwender Schlüssel"
-#: ../../include/profile_advanced.php:23 ../../boot.php:2356
+#: ../../addon/twitter/twitter.php:279
+msgid "Consumer secret"
+msgstr "Anwender Geheimnis"
+
+#: ../../include/profile_advanced.php:23 ../../boot.php:881
msgid "Gender:"
msgstr "Geschlecht:"
-#: ../../include/profile_advanced.php:36 ../../include/items.php:1086
+#: ../../include/profile_advanced.php:36 ../../include/items.php:1123
msgid "Birthday:"
msgstr "Geburtstag:"
@@ -2996,7 +3776,7 @@ msgstr "Alter:"
msgid "<span class=\"heart\">&hearts;</span> Status:"
msgstr "<span class=\"heart\">&hearts;</span> Bezieungsstatus:"
-#: ../../include/profile_advanced.php:103 ../../boot.php:2362
+#: ../../include/profile_advanced.php:103 ../../boot.php:887
msgid "Homepage:"
msgstr "Homepage:"
@@ -3304,6 +4084,129 @@ msgstr "Ist mir nicht wichtig"
msgid "Ask me"
msgstr "Frag mich"
+#: ../../include/event.php:11
+msgid "l F d, Y \\@ g:i A"
+msgstr "l F d, Y \\@ g:i A"
+
+#: ../../include/event.php:17
+msgid "Starts:"
+msgstr "Beginnt:"
+
+#: ../../include/event.php:27
+msgid "Finishes:"
+msgstr "Endet:"
+
+#: ../../include/text.php:222
+msgid "prev"
+msgstr "vorige"
+
+#: ../../include/text.php:224
+msgid "first"
+msgstr "erste"
+
+#: ../../include/text.php:253
+msgid "last"
+msgstr "letzte"
+
+#: ../../include/text.php:256
+msgid "next"
+msgstr "nächste"
+
+#: ../../include/text.php:535
+msgid "No contacts"
+msgstr "Keine Kontakte"
+
+#: ../../include/text.php:543
+#, php-format
+msgid "%d Contact"
+msgid_plural "%d Contacts"
+msgstr[0] "%d Kontakt"
+msgstr[1] "%d Kontakte"
+
+#: ../../include/text.php:700
+msgid "Monday"
+msgstr "Montag"
+
+#: ../../include/text.php:700
+msgid "Tuesday"
+msgstr "Dienstag"
+
+#: ../../include/text.php:700
+msgid "Wednesday"
+msgstr "Mittwoch"
+
+#: ../../include/text.php:700
+msgid "Thursday"
+msgstr "Donnerstag"
+
+#: ../../include/text.php:700
+msgid "Friday"
+msgstr "Freitag"
+
+#: ../../include/text.php:700
+msgid "Saturday"
+msgstr "Samstag"
+
+#: ../../include/text.php:700
+msgid "Sunday"
+msgstr "Sonntag"
+
+#: ../../include/text.php:704
+msgid "January"
+msgstr "Januar"
+
+#: ../../include/text.php:704
+msgid "February"
+msgstr "Februar"
+
+#: ../../include/text.php:704
+msgid "March"
+msgstr "März"
+
+#: ../../include/text.php:704
+msgid "April"
+msgstr "April"
+
+#: ../../include/text.php:704
+msgid "May"
+msgstr "Mai"
+
+#: ../../include/text.php:704
+msgid "June"
+msgstr "Juni"
+
+#: ../../include/text.php:704
+msgid "July"
+msgstr "Juli"
+
+#: ../../include/text.php:704
+msgid "August"
+msgstr "August"
+
+#: ../../include/text.php:704
+msgid "September"
+msgstr "September"
+
+#: ../../include/text.php:704
+msgid "October"
+msgstr "Oktober"
+
+#: ../../include/text.php:704
+msgid "November"
+msgstr "November"
+
+#: ../../include/text.php:704
+msgid "December"
+msgstr "Dezember"
+
+#: ../../include/text.php:767
+msgid "bytes"
+msgstr "Byte"
+
+#: ../../include/text.php:850
+msgid "Select an alternate language"
+msgstr "Alternative Sprache auswählen"
+
#: ../../include/oembed.php:95
msgid "Embedding disabled"
msgstr "Einbettungen deaktiviert"
@@ -3316,41 +4219,109 @@ msgstr "Neue Gruppe erstellen"
msgid "Everybody"
msgstr "Alle Kontakte"
-#: ../../include/nav.php:41 ../../boot.php:865
+#: ../../include/nav.php:41 ../../boot.php:668
msgid "Logout"
msgstr "Abmelden"
-#: ../../include/nav.php:44 ../../boot.php:843 ../../boot.php:849
+#: ../../include/nav.php:41
+msgid "End this session"
+msgstr "Diese Sitzung beenden"
+
+#: ../../include/nav.php:44 ../../boot.php:646 ../../boot.php:652
msgid "Login"
msgstr "Anmeldung"
-#: ../../include/nav.php:55 ../../include/nav.php:92
+#: ../../include/nav.php:44
+msgid "Sign in"
+msgstr "Anmelden"
+
+#: ../../include/nav.php:55 ../../include/nav.php:93
msgid "Home"
msgstr "Persönlich"
-#: ../../include/nav.php:68
+#: ../../include/nav.php:55
+msgid "Home Page"
+msgstr "Home Page"
+
+#: ../../include/nav.php:59
+msgid "Create an account"
+msgstr "Account erstellen"
+
+#: ../../include/nav.php:64
+msgid "Help and documentation"
+msgstr "Hilfe und Dokumentation"
+
+#: ../../include/nav.php:67
msgid "Apps"
msgstr "Apps"
-#: ../../include/nav.php:80
+#: ../../include/nav.php:67
+msgid "Addon applications, utilities, games"
+msgstr "Addon Anwendungen, Dienstprogramme, Spiele"
+
+#: ../../include/nav.php:69
+msgid "Search site content"
+msgstr "Inhalt der Seite durchsuchen"
+
+#: ../../include/nav.php:79
+msgid "Conversations on this site"
+msgstr "Unterhaltungen auf dieser Seite"
+
+#: ../../include/nav.php:81
msgid "Directory"
msgstr "Verzeichnis"
-#: ../../include/nav.php:90
+#: ../../include/nav.php:81
+msgid "People directory"
+msgstr "Nutzerverzeichnis"
+
+#: ../../include/nav.php:91
msgid "Network"
msgstr "Netzwerk"
-#: ../../include/nav.php:98
+#: ../../include/nav.php:91
+msgid "Conversations from your friends"
+msgstr "Unterhaltungen deiner Kontakte"
+
+#: ../../include/nav.php:93
+msgid "Your posts and conversations"
+msgstr "Deine Einträge und Unterhaltungen"
+
+#: ../../include/nav.php:99
msgid "Notifications"
msgstr "Benachrichtigungen"
-#: ../../include/nav.php:104
+#: ../../include/nav.php:99
+msgid "Friend requests"
+msgstr "Kontaktanfragen"
+
+#: ../../include/nav.php:102
+msgid "Private mail"
+msgstr "Private Email"
+
+#: ../../include/nav.php:105
msgid "Manage"
msgstr "Verwalten"
-#: ../../include/nav.php:107
-msgid "Settings"
-msgstr "Einstellungen"
+#: ../../include/nav.php:105
+msgid "Manage other pages"
+msgstr "Andere Seiten verwalten"
+
+#: ../../include/nav.php:109
+msgid "Manage/edit profiles"
+msgstr "Profile verwalten/editieren"
+
+#: ../../include/nav.php:110
+msgid "Manage/edit friends and contacts"
+msgstr "Freunde und Kontakte verwalten/editieren"
+
+#: ../../include/nav.php:117
+msgid "Admin"
+msgstr "Administration"
+
+#: ../../include/nav.php:117
+msgid "Site setup and configuration"
+msgstr "Einstellungen der Seite und Konfiguration"
#: ../../include/auth.php:27
msgid "Logged out."
@@ -3360,71 +4331,79 @@ msgstr "Abgemeldet."
msgid "Miscellaneous"
msgstr "Verschiedenes"
-#: ../../include/datetime.php:148
-msgid "less than a second ago"
-msgstr "vor weniger als einer Sekunde"
-
-#: ../../include/datetime.php:151
+#: ../../include/datetime.php:105 ../../include/datetime.php:237
msgid "year"
msgstr "Jahr"
-#: ../../include/datetime.php:151
-msgid "years"
-msgstr "Jahre"
-
-#: ../../include/datetime.php:152
+#: ../../include/datetime.php:110 ../../include/datetime.php:238
msgid "month"
msgstr "Monat"
-#: ../../include/datetime.php:152
+#: ../../include/datetime.php:115 ../../include/datetime.php:240
+msgid "day"
+msgstr "Tag"
+
+#: ../../include/datetime.php:228
+msgid "never"
+msgstr "nie"
+
+#: ../../include/datetime.php:234
+msgid "less than a second ago"
+msgstr "vor weniger als einer Sekunde"
+
+#: ../../include/datetime.php:237
+msgid "years"
+msgstr "Jahre"
+
+#: ../../include/datetime.php:238
msgid "months"
msgstr "Monate"
-#: ../../include/datetime.php:153
+#: ../../include/datetime.php:239
msgid "week"
msgstr "Woche"
-#: ../../include/datetime.php:153
+#: ../../include/datetime.php:239
msgid "weeks"
msgstr "Wochen"
-#: ../../include/datetime.php:154
-msgid "day"
-msgstr "Tag"
+#: ../../include/datetime.php:240
+msgid "days"
+msgstr "Tage"
-#: ../../include/datetime.php:155
+#: ../../include/datetime.php:241
msgid "hour"
msgstr "Stunde"
-#: ../../include/datetime.php:155
+#: ../../include/datetime.php:241
msgid "hours"
msgstr "Stunden"
-#: ../../include/datetime.php:156
+#: ../../include/datetime.php:242
msgid "minute"
msgstr "Minute"
-#: ../../include/datetime.php:156
+#: ../../include/datetime.php:242
msgid "minutes"
msgstr "Minuten"
-#: ../../include/datetime.php:157
+#: ../../include/datetime.php:243
msgid "second"
msgstr "Sekunde"
-#: ../../include/datetime.php:157
+#: ../../include/datetime.php:243
msgid "seconds"
msgstr "Sekunden"
-#: ../../include/datetime.php:164
+#: ../../include/datetime.php:250
msgid " ago"
msgstr " her"
-#: ../../include/poller.php:380
+#: ../../include/poller.php:418
msgid "From: "
msgstr "Von: "
-#: ../../include/bbcode.php:83
+#: ../../include/bbcode.php:116
msgid "Image/photo"
msgstr "Bild/Foto"
@@ -3434,328 +4413,230 @@ msgid "Cannot locate DNS info for database server '%s'"
msgstr ""
"Kann die DNS Informationen für den Datenbanken Server '%s' nicht ermitteln."
-#: ../../include/acl_selectors.php:133
-msgid "Visible To:"
-msgstr "Sichtbar für:"
-
-#: ../../include/acl_selectors.php:133
-msgid "everybody"
-msgstr "jeder"
+#: ../../include/acl_selectors.php:279
+msgid "Visible to everybody"
+msgstr "Für jeden sichtbar"
-#: ../../include/acl_selectors.php:137 ../../include/acl_selectors.php:152
-msgid "Groups"
-msgstr "Gruppen"
+#: ../../include/acl_selectors.php:280
+msgid "show"
+msgstr "anzeigen"
-#: ../../include/acl_selectors.php:148
-msgid "Except For:"
-msgstr "Abgesehen von:"
+#: ../../include/acl_selectors.php:281
+msgid "don't show"
+msgstr "nicht anzeigen"
-#: ../../include/notifier.php:414
+#: ../../include/notifier.php:459
msgid "(no subject)"
msgstr "(kein Betreff)"
-#: ../../include/items.php:1447
+#: ../../include/items.php:1512
msgid "You have a new follower at "
msgstr "Du hast einen neuen Kontakt auf "
-#: ../../include/conversation.php:191 ../../include/conversation.php:451
-#: ../../include/conversation.php:452
+#: ../../include/conversation.php:23
+msgid "event"
+msgstr "Veranstaltung"
+
+#: ../../include/conversation.php:213 ../../include/conversation.php:485
+#: ../../include/conversation.php:486
#, php-format
msgid "View %s's profile"
msgstr "Betrachte %s's Profil"
-#: ../../include/conversation.php:207
+#: ../../include/conversation.php:222 ../../include/conversation.php:498
+#, php-format
+msgid "%s from %s"
+msgstr "%s von %s"
+
+#: ../../include/conversation.php:230
msgid "View in context"
msgstr "Im Zusammenhang betrachten"
-#: ../../include/conversation.php:278
+#: ../../include/conversation.php:301
msgid "See more posts like this"
msgstr "Mehr Beiträge wie diesen anzeigen"
-#: ../../include/conversation.php:303
+#: ../../include/conversation.php:326
#, php-format
msgid "See all %d comments"
msgstr "Alle %d Kommentare anzeigen"
-#: ../../include/conversation.php:453
+#: ../../include/conversation.php:424
+msgid "Select"
+msgstr "Auswählen"
+
+#: ../../include/conversation.php:426
+msgid "toggle star status"
+msgstr "Stern Status umschalten"
+
+#: ../../include/conversation.php:487
msgid "to"
msgstr "to"
-#: ../../include/conversation.php:454
+#: ../../include/conversation.php:488
msgid "Wall-to-Wall"
msgstr "Wall-to-Wall"
-#: ../../include/conversation.php:455
+#: ../../include/conversation.php:489
msgid "via Wall-To-Wall:"
msgstr "via Wall-To-Wall:"
-#: ../../include/conversation.php:593
+#: ../../include/conversation.php:531
+msgid "Delete Selected Items"
+msgstr "Lösche die markierten Beiträge"
+
+#: ../../include/conversation.php:605
msgid "View status"
msgstr "Status anzeigen"
-#: ../../include/conversation.php:594
+#: ../../include/conversation.php:606
msgid "View profile"
msgstr "Profil anzeigen"
-#: ../../include/conversation.php:595
+#: ../../include/conversation.php:607
msgid "View photos"
msgstr "Fotos ansehen"
-#: ../../include/conversation.php:596
+#: ../../include/conversation.php:608
msgid "View recent"
msgstr "Jüngste anzeigen"
-#: ../../include/conversation.php:598
+#: ../../include/conversation.php:610
msgid "Send PM"
msgstr "Private Nachricht senden"
-#: ../../include/conversation.php:648
+#: ../../include/conversation.php:660
#, php-format
msgid "%s likes this."
msgstr "%s mag dies."
-#: ../../include/conversation.php:648
+#: ../../include/conversation.php:660
#, php-format
msgid "%s doesn't like this."
msgstr "%s mag dies nicht."
-#: ../../include/conversation.php:652
+#: ../../include/conversation.php:664
#, php-format
msgid "<span %1$s>%2$d people</span> like this."
msgstr "<span %1$s>%2$d Personen</span> mögen dies."
-#: ../../include/conversation.php:654
+#: ../../include/conversation.php:666
#, php-format
msgid "<span %1$s>%2$d people</span> don't like this."
msgstr "<span %1$s>%2$d Personen</span> mögen dies nicht."
-#: ../../include/conversation.php:660
+#: ../../include/conversation.php:672
msgid "and"
msgstr "und"
-#: ../../include/conversation.php:663
+#: ../../include/conversation.php:675
#, php-format
msgid ", and %d other people"
msgstr " und %d andere"
-#: ../../include/conversation.php:664
+#: ../../include/conversation.php:676
#, php-format
msgid "%s like this."
msgstr "%s mag dies."
-#: ../../include/conversation.php:664
+#: ../../include/conversation.php:676
#, php-format
msgid "%s don't like this."
msgstr "%s mag dies nicht."
-#: ../../include/conversation.php:683
+#: ../../include/conversation.php:695
msgid "Visible to <strong>everybody</strong>"
msgstr "Für <strong>Jedermann</strong> sichtbar"
-#: ../../include/conversation.php:685
+#: ../../include/conversation.php:697
msgid "Please enter a YouTube link:"
msgstr "Bitte gebe den YouTube Link ein:"
-#: ../../include/conversation.php:686
+#: ../../include/conversation.php:698
msgid "Please enter a video(.ogg) link/URL:"
msgstr "Bitte gebe den Link zum Video(.ogg) an:"
-#: ../../include/conversation.php:687
+#: ../../include/conversation.php:699
msgid "Please enter an audio(.ogg) link/URL:"
msgstr "Bitte gebe den Link zum Audio(.ogg) an:"
-#: ../../include/conversation.php:688
+#: ../../include/conversation.php:700
msgid "Where are you right now?"
msgstr "Wo hälst du dich jetzt gerade auf?"
-#: ../../include/conversation.php:689
+#: ../../include/conversation.php:701
msgid "Enter a title for this item"
msgstr "Gib den Titel für diesen Beitrag ein"
-#: ../../include/conversation.php:740
+#: ../../include/conversation.php:752
msgid "Set title"
msgstr "Titel setzen"
-#: ../../boot.php:385
+#: ../../boot.php:411
msgid "Delete this item?"
msgstr "Diesen Beitrag löschen?"
-#: ../../boot.php:834
+#: ../../boot.php:637
msgid "Create a New Account"
msgstr "Neuen Account erstellen"
-#: ../../boot.php:841
+#: ../../boot.php:644
msgid "Nickname or Email address: "
msgstr "Spitzname oder Email-Adresse: "
-#: ../../boot.php:842
+#: ../../boot.php:645
msgid "Password: "
msgstr "Passwort: "
-#: ../../boot.php:847
+#: ../../boot.php:650
msgid "Nickname/Email/OpenID: "
msgstr "Spitzname/Email/OpenID: "
-#: ../../boot.php:848
+#: ../../boot.php:651
msgid "Password (if not OpenID): "
msgstr "Passwort (falls nicht OpenID): "
-#: ../../boot.php:851
+#: ../../boot.php:654
msgid "Forgot your password?"
msgstr "Passwort vergessen?"
-#: ../../boot.php:1113
-msgid "prev"
-msgstr "vorige"
-
-#: ../../boot.php:1115
-msgid "first"
-msgstr "erste"
-
-#: ../../boot.php:1144
-msgid "last"
-msgstr "letzte"
-
-#: ../../boot.php:1147
-msgid "next"
-msgstr "nächste"
-
-#: ../../boot.php:2046
-msgid "No contacts"
-msgstr "Keine Kontakte"
-
-#: ../../boot.php:2054
-#, php-format
-msgid "%d Contact"
-msgid_plural "%d Contacts"
-msgstr[0] "%d Kontakt"
-msgstr[1] "%d Kontakte"
-
-#: ../../boot.php:2329
+#: ../../boot.php:854
msgid "Connect"
msgstr "Verbinden"
-#: ../../boot.php:2344
-msgid "Location:"
-msgstr "Ort:"
-
-#: ../../boot.php:2348
+#: ../../boot.php:873
msgid ", "
msgstr ", "
-#: ../../boot.php:2360
+#: ../../boot.php:885
msgid "Status:"
msgstr "Status:"
-#: ../../boot.php:2457
-msgid "Monday"
-msgstr "Montag"
-
-#: ../../boot.php:2457
-msgid "Tuesday"
-msgstr "Dienstag"
-
-#: ../../boot.php:2457
-msgid "Wednesday"
-msgstr "Mittwoch"
-
-#: ../../boot.php:2457
-msgid "Thursday"
-msgstr "Donnerstag"
-
-#: ../../boot.php:2457
-msgid "Friday"
-msgstr "Freitag"
-
-#: ../../boot.php:2457
-msgid "Saturday"
-msgstr "Samstag"
-
-#: ../../boot.php:2457
-msgid "Sunday"
-msgstr "Sonntag"
-
-#: ../../boot.php:2461
-msgid "January"
-msgstr "Januar"
-
-#: ../../boot.php:2461
-msgid "February"
-msgstr "Februar"
-
-#: ../../boot.php:2461
-msgid "March"
-msgstr "März"
-
-#: ../../boot.php:2461
-msgid "April"
-msgstr "April"
-
-#: ../../boot.php:2461
-msgid "May"
-msgstr "Mai"
-
-#: ../../boot.php:2461
-msgid "June"
-msgstr "Juni"
-
-#: ../../boot.php:2461
-msgid "July"
-msgstr "Juli"
-
-#: ../../boot.php:2461
-msgid "August"
-msgstr "August"
-
-#: ../../boot.php:2461
-msgid "September"
-msgstr "September"
-
-#: ../../boot.php:2461
-msgid "October"
-msgstr "Oktober"
-
-#: ../../boot.php:2461
-msgid "November"
-msgstr "November"
-
-#: ../../boot.php:2461
-msgid "December"
-msgstr "Dezember"
-
-#: ../../boot.php:2476
+#: ../../boot.php:976
msgid "g A l F d"
msgstr "g A l F d"
-#: ../../boot.php:2494
+#: ../../boot.php:994
msgid "Birthday Reminders"
msgstr "Geburtstagserinnerungen"
-#: ../../boot.php:2495
+#: ../../boot.php:995
msgid "Birthdays this week:"
msgstr "Geburtstage diese Woche:"
-#: ../../boot.php:2496
+#: ../../boot.php:996
msgid "(Adjusted for local time)"
msgstr "(an die lokale Zeit angepasst)"
-#: ../../boot.php:2507
+#: ../../boot.php:1007
msgid "[today]"
msgstr "[heute]"
-#: ../../boot.php:2570
-msgid "bytes"
-msgstr "Byte"
-
-#: ../../boot.php:2744
-msgid "link to source"
-msgstr "Link zum original Posting"
-
-#: ../../index.php:199
+#: ../../index.php:209
msgid "Not Found"
msgstr "Nicht gefunden"
-#: ../../index.php:200
+#: ../../index.php:210
msgid "Page not found."
msgstr "Seite nicht gefunden."
diff --git a/view/de/strings.php b/view/de/strings.php
index 1fd7c3b46..83dc2f2db 100644
--- a/view/de/strings.php
+++ b/view/de/strings.php
@@ -24,6 +24,30 @@ $a->strings["Help:"] = "Hilfe:";
$a->strings["Help"] = "Hilfe";
$a->strings["File exceeds size limit of %d"] = "Die Datei ist größer als das erlaubte Limit von %d";
$a->strings["File upload failed."] = "Upload der Datei fehlgeschlagen.";
+$a->strings["Friend suggestion sent."] = "Kontaktvorschlag gesendet.";
+$a->strings["Suggest Friends"] = "Kontakte vorschlagen";
+$a->strings["Suggest a friend for %s"] = "Schlage %s einen Kontakt vor";
+$a->strings["Status"] = "Status";
+$a->strings["Profile"] = "Profil";
+$a->strings["Photos"] = "Bilder";
+$a->strings["Events"] = "Veranstaltungen";
+$a->strings["Personal Notes"] = "Persönliche Notizen";
+$a->strings["Create New Event"] = "Neue Veranstaltung erstellen";
+$a->strings["Previous"] = "Vorherige";
+$a->strings["Next"] = "Nächste";
+$a->strings["l, F j"] = "l, F j";
+$a->strings["Edit event"] = "Veranstaltung bearbeiten";
+$a->strings["link to source"] = "Link zum original Posting";
+$a->strings["hour:minute"] = "Stunde:Minute";
+$a->strings["Event details"] = "Veranstaltungsdetails";
+$a->strings["Format is %s %s. Starting date and Description are required."] = "Format ist %s %s. Anfangsdatum und Beschreibung sind notwendig.";
+$a->strings["Event Starts:"] = "Veranstaltungsbeginn:";
+$a->strings["Finish date/time is not known or not relevant"] = "Enddatum/-zeit ist nicht bekannt oder nicht relevant";
+$a->strings["Event Finishes:"] = "Veranstaltungsende:";
+$a->strings["Adjust for viewer timezone"] = "An Zeitzone des Betrachters anpassen";
+$a->strings["Description:"] = "Beschreibung";
+$a->strings["Location:"] = "Ort:";
+$a->strings["Share this event"] = "Veranstaltung teilen";
$a->strings["Cancel"] = "Abbrechen";
$a->strings["Tag removed"] = "Tag entfernt";
$a->strings["Remove Item Tag"] = "Gegenstands Tag entfernen";
@@ -32,6 +56,7 @@ $a->strings["Remove"] = "Entfernen";
$a->strings["%s welcomes %s"] = "%s heißt %s herzlich willkommen";
$a->strings["Photo Albums"] = "Fotoalben";
$a->strings["Contact Photos"] = "Kontaktbilder";
+$a->strings["everybody"] = "jeder";
$a->strings["Contact information unavailable"] = "Kontakt Informationen nicht verfügbar";
$a->strings["Profile Photos"] = "Profilbilder";
$a->strings["Album not found."] = "Album nicht gefunden.";
@@ -41,10 +66,12 @@ $a->strings["was tagged in a"] = "was tagged in a";
$a->strings["photo"] = "Foto";
$a->strings["by"] = "von";
$a->strings["Image exceeds size limit of "] = "Die Bildgröße übersteigt das Limit von ";
+$a->strings["Image file is empty."] = "Bilddatei ist leer.";
$a->strings["Unable to process image."] = "Konnte das Bild nicht bearbeiten.";
$a->strings["Image upload failed."] = "Hochladen des Bildes gescheitert.";
$a->strings["Public access denied."] = "Öffentlicher Zugriff verweigert.";
$a->strings["No photos selected"] = "Keine Bilder ausgewählt";
+$a->strings["Access to this item is restricted."] = "Zugriff zu diesem Eintrag wurde eingeschrängt.";
$a->strings["Upload Photos"] = "Bilder hochladen";
$a->strings["New album name: "] = "Name des neuen Albums: ";
$a->strings["or existing album name: "] = "oder existierender Albumname: ";
@@ -55,9 +82,7 @@ $a->strings["Photo not available"] = "Foto nicht verfügbar";
$a->strings["Edit photo"] = "Foto bearbeiten";
$a->strings["Use as profile photo"] = "Als Profilbild verwenden";
$a->strings["Private Message"] = "Private Nachricht";
-$a->strings["<< Prev"] = "<< Vorherige";
$a->strings["View Full Size"] = "Betrachte Originalgröße";
-$a->strings["Next >>"] = "Nächste >>";
$a->strings["Tags: "] = "Tags: ";
$a->strings["[Remove any tag]"] = "[Tag entfernen]";
$a->strings["New album name"] = "Name des neuen Albums";
@@ -74,6 +99,10 @@ $a->strings["Delete"] = "Löschen";
$a->strings["Recent Photos"] = "Neuste Fotos";
$a->strings["Upload New Photos"] = "Weitere Fotos hochladen";
$a->strings["View Album"] = "Album betrachten";
+$a->strings["Not available."] = "Nicht verfügbar.";
+$a->strings["Community"] = "Gemeinschaft";
+$a->strings["No results."] = "Keine Ergebnisse.";
+$a->strings["Shared content is covered by the <a href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution 3.0</a> license."] = "Geteilte Inhalte innerhalb des Friendika Netzwerks sind unter der <a href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution 3.0</a> verfügbar.";
$a->strings["Item not found"] = "Beitrag nicht gefunden";
$a->strings["Edit post"] = "Beitrag bearbeiten";
$a->strings["Post to Email"] = "An Email senden";
@@ -92,8 +121,8 @@ $a->strings["Public post"] = "Öffentlicher Beitrag";
$a->strings["Example: bob@example.com, mary@example.com"] = "Z.B.: bob@example.com, mary@example.com";
$a->strings["This introduction has already been accepted."] = "Diese Vorstellung wurde bereits abgeschlossen.";
$a->strings["Profile location is not valid or does not contain profile information."] = "Profil Adresse ist ungültig oder stellt einige Profildaten nicht zur Verfügung.";
-$a->strings["Warning: profile location has no identifiable owner name."] = "Warning: profile location has no identifiable owner name.";
-$a->strings["Warning: profile location has no profile photo."] = "Warning: profile location has no profile photo.";
+$a->strings["Warning: profile location has no identifiable owner name."] = "Warnung: Es konnte kein Name des Besitzers von der angegebenen Profiladresse gefunden werden.";
+$a->strings["Warning: profile location has no profile photo."] = "Warnung: Es konnte kein Profilbild bei der angegebenen Profiladresse gefunden werden.";
$a->strings["%d required parameter was not found at the given location"] = array(
0 => "",
1 => "",
@@ -123,7 +152,7 @@ $a->strings["Administrator"] = "Administrator";
$a->strings["Friend/Connection Request"] = "Freundschafts/Kontakt Anfrage";
$a->strings["Examples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, testuser@identi.ca"] = "Beispiele: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, testuser@identi.ca";
$a->strings["Please answer the following:"] = "Bitte beantworte folgende Fragen:";
-$a->strings["Does \$name know you?"] = "Kennt \$name dich?";
+$a->strings["Does %s know you?"] = "Kennt %s dich?";
$a->strings["Yes"] = "Ja";
$a->strings["No"] = "Nein";
$a->strings["Add a personal note:"] = "Eine persönliche Notiz anfügen:";
@@ -146,14 +175,15 @@ $a->strings["You may need to import the file \"database.sql\" manually using php
$a->strings["Welcome to Friendika."] = "Willkommen bei Friendika.";
$a->strings["Friendika Social Network"] = "Friendika Soziales Netzwerk";
$a->strings["Installation"] = "Installation";
-$a->strings["In order to install Friendika we need to know how to contact your database."] = "Um Friendika installieren zu können müssen wir wissen, wie wir die Datenbank erreichen können.";
+$a->strings["In order to install Friendika we need to know how to connect to your database."] = "Um Friendika installieren zu können, müssen wir wissen wie wir deine MySQL Datenbank erreichen.";
$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Bitte kontaktiere den Hosting Provider oder den Administrator der Seite falls du Fragen zu diesen Einstellungen haben solltest.";
-$a->strings["The database you specify below must already exist. If it does not, please create it before continuing."] = "Die Datenbank die du hier angibst muss bereits existieren. Wenn dies noch nicht der Fall ist lege sie bitte an bevor du fortfährst.";
+$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "Die Datenbank die du unten angibst sollte bereits existieren. Ist dies noch nicht der Fall erzeuge sie bitte bevor du mit der Installation vorfährst.";
$a->strings["Database Server Name"] = "Datenbank Server";
$a->strings["Database Login Name"] = "Datenbank Nutzer";
$a->strings["Database Login Password"] = "Datenbank Passwort";
$a->strings["Database Name"] = "Datenbank Name";
$a->strings["Please select a default timezone for your website"] = "Bitte wähle die standard Zeitzone deiner Webseite";
+$a->strings["Site administrator email address. Your account email address must match this in order to use the web admin panel."] = "Email Adresse des Seiten Administrators. Die Email Adresse deines Accounts muss mit dieser übereinstimmen, damit du das Administrationspanel nutzen kannst.";
$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Konnte keine Kommandozeilenversion von PHP im PATH des Servers finden.";
$a->strings["This is required. Please adjust the configuration file .htconfig.php accordingly."] = "Diese wird von Friendika benötigt. Bitte passe die Konfigurationsdatei .htconfig.php entsprechend an.";
$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "Die Kommandozeilenversion von PHP auf deinem System hat \"register_argc_argv\" nicht aktiviert.";
@@ -165,13 +195,16 @@ $a->strings["Error: libCURL PHP module required but not installed."] = "Fehler:
$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Fehler: Das GD Graphikmodul für PHP mit JPEG Unterstützung ist nicht installiert.";
$a->strings["Error: openssl PHP module required but not installed."] = "Fehler: Das openssl Modul von PHP ist nict installiert.";
$a->strings["Error: mysqli PHP module required but not installed."] = "Fehler: Das mysqli Modul von PHP ist nicht installiert.";
+$a->strings["Error: mb_string PHP module required but not installed."] = "Fehler: mb_string PHP Module wird benötigt ist aber nicht installiert.";
$a->strings["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."] = "Der Installationswizzard muss in der Lage sein eine Datei im Stammverzeichnis deines Webservers anzuliegen ist allerdings derzeit nicht in der Lage dies zu tun.";
$a->strings["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."] = "In den meisten Fällen ist dies ein Problem mit den Schreibrechten, der Webserver könnte keine Schreiberlaubnis haben, selbst wenn du sie hast.";
$a->strings["Please check with your site documentation or support people to see if this situation can be corrected."] = "Bitte überprüfe die Einstellungen und frage im Zweifelsfall dein Support Team um diese Situations zu beheben.";
$a->strings["If not, you may be required to perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "Sollte dies nicht möglich sein musst du die Installation manuell durchführen. Lies dazu bitte in der Datei \"INSTALL.txt\".";
$a->strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "Die Konfigurationsdatei \".htconfig.php\" konnte nicht angelegt werden. Bitte verwende den angefügten Text um die Datei im Stammverzeichnis deiner Friendika Installation zu erzeugen.";
$a->strings["Errors encountered creating database tables."] = "Fehler aufgetreten wärend der Erzeugung der Datenbank Tabellen.";
+$a->strings["[Embedded content - reload page to view]"] = "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]";
$a->strings["Profile Match"] = "Profil Übereinstimmungen";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "Keine Schlüsselwörter zum Abgleichen gefunden. Bitte füge einige Schlüsselwörter zu deinem Standardprofil hinzu.";
$a->strings["No matches"] = "Keine Übereinstimmungen";
$a->strings["Remote privacy information not available."] = "Entfernte Privatsphäreneinstellungen nicht verfügbar.";
$a->strings["Visible to:"] = "Sichtbar für:";
@@ -182,21 +215,24 @@ $a->strings["Ignore"] = "Ignorieren";
$a->strings["Pending Friend/Connect Notifications"] = "Anstehende Freundschafts/Kontakt Benachrichtigungen";
$a->strings["Show Ignored Requests"] = "Zeige ignorierte Anfragen";
$a->strings["Hide Ignored Requests"] = "Verberge ignorierte Anfragen";
+$a->strings["Notification type: "] = "Benachrichtigungs Typ: ";
+$a->strings["Friend Suggestion"] = "Kontakt Vorschlag";
+$a->strings["suggested by %s"] = "vorgeschlagen von %s";
+$a->strings["Approve"] = "Genehmigen";
$a->strings["Claims to be known to you: "] = "Behauptet dich zu kennen: ";
$a->strings["yes"] = "ja";
$a->strings["no"] = "nein";
$a->strings["Approve as: "] = "Genehmigen als: ";
$a->strings["Friend"] = "Freund";
$a->strings["Fan/Admirer"] = "Fan/Verehrer";
-$a->strings["Notification type: "] = "Benachrichtigungs Typ: ";
$a->strings["Friend/Connect Request"] = "Kontakt-/Freundschaftsanfrage";
$a->strings["New Follower"] = "Neuer Bewunderer";
-$a->strings["Approve"] = "Genehmigen";
$a->strings["No notifications."] = "Keine Benachrichtigungen.";
-$a->strings["User registrations waiting for confirm"] = "Neuanmeldungen die auf deine Bestätigung warten";
-$a->strings["Deny"] = "Verwehren";
-$a->strings["No registrations."] = "Keine Neuanmeldungen.";
$a->strings["Invite Friends"] = "Freunde einladen";
+$a->strings["%d invitation available"] = array(
+ 0 => "%d Einladung verfügbar",
+ 1 => "%d Einladungen verfügbar",
+);
$a->strings["Find People With Shared Interests"] = "Finde Personen die deine Interessen teilen";
$a->strings["Connect/Follow"] = "Verbinden/Folgen";
$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Beispiel: bob@example.com, http://example.com/barbara";
@@ -218,6 +254,7 @@ $a->strings["Private communications are not available for this contact."] = "Pri
$a->strings["Never"] = "Niemals";
$a->strings["(Update was successful)"] = "(Aktualisierung war erfolgreich)";
$a->strings["(Update was not successful)"] = "(Aktualisierung war nicht erfolgreich)";
+$a->strings["Suggest friends"] = "Kontakte vorschlagen";
$a->strings["Contact Editor"] = "Kontakt Editor";
$a->strings["Profile Visibility"] = "Profil Anzeige";
$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Bitte wähle eines deiner Profile das angezeitgt werden soll, wenn %s dein Profil aufruft.";
@@ -226,7 +263,7 @@ $a->strings["Online Reputation"] = "Online Ruf";
$a->strings["Occasionally your friends may wish to inquire about this person's online legitimacy."] = "Es könnte sein, dass deine Freunde etwas über den Ruf einer Peron erfahren möchten.";
$a->strings["You may help them choose whether or not to interact with this person by providing a <em>reputation</em> to guide them."] = "Du kannst ihnen bei der Entscheidung helfen ob sie mit einer Person interagieren sollten oder nicht indem du Informationen über den <em>Ruf</em> der Person anbietest.";
$a->strings["Please take a moment to elaborate on this selection if you feel it could be helpful to others."] = "Bitte nimm dir einen Moment und fülle diesen Punkt aus wenn du denkst das es anderen helfen könnte.";
-$a->strings["Visit \$name's profile"] = "Besuche das Profil von \$name";
+$a->strings["Visit %s's profile [%s]"] = "Besuche %ss Profil [%s]";
$a->strings["Block/Unblock contact"] = "Kontakt blockieren/freischalten";
$a->strings["Ignore contact"] = "Ignoriere den Kontakt";
$a->strings["Repair contact URL settings"] = "URL Einstellungen des Kontakts reparieren";
@@ -247,8 +284,8 @@ $a->strings["Show Blocked Connections"] = "Zeige geblockte Verbindungen";
$a->strings["Hide Blocked Connections"] = "Verstecke geblockte Verbindungen";
$a->strings["Finding: "] = "Funde: ";
$a->strings["Find"] = "Finde";
-$a->strings["Visit \$username's profile"] = "Besuche das Profil von \$username";
$a->strings["Edit contact"] = "Kontakt bearbeiten";
+$a->strings["No valid account found."] = "Kein gültiger Account gefunden.";
$a->strings["Password reset request issued. Check your email."] = "Zurücksetzen des Passworts eingeleitet. Bitte überprüfe deine Email.";
$a->strings["Password reset requested at %s"] = "Anfrage zum Zurücksetzen des Passworts auf %s erhalten";
$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Anfrage konnte nicht verifiziert werden. (Eventuell hast du bereits ähnliche Anfrage gestellt.) Zurücksetzen des Passworts gescheitert.";
@@ -266,30 +303,39 @@ $a->strings["Passwords do not match. Password unchanged."] = "Die Passwörter st
$a->strings["Empty passwords are not allowed. Password unchanged."] = "Leere Passwörter sind nicht erlaubt. Passwort bleibt unverändert.";
$a->strings["Password changed."] = "Passwort ändern.";
$a->strings["Password update failed. Please try again."] = "Aktualisierung des Passworts gescheitert, bitte versuche es noch einmal.";
+$a->strings["Failed to connect with email account using the settings provided."] = "Konnte das Email Konto mit den angegebenen Einstellungen nicht erreichen.";
$a->strings[" Please use a shorter name."] = " Bitte verwende einen kürzeren Namen.";
$a->strings[" Name too short."] = " Name ist zu kurz.";
$a->strings[" Not valid email."] = " Keine gültige EMail.";
$a->strings[" Cannot change to that email."] = " Cannot change to that email.";
$a->strings["Settings updated."] = "Einstellungen aktualisiert.";
-$a->strings["Plugin Settings"] = "Plugin Einstellungen";
-$a->strings["Account Settings"] = "Account Einstellungen";
+$a->strings["Account settings"] = "Account Einstellungen";
+$a->strings["Plugin settings"] = "Plugin Einstellungen";
$a->strings["No Plugin settings configured"] = "Keine Erweiterungen konfiguriert";
+$a->strings["Plugin Settings"] = "Plugin Einstellungen";
$a->strings["Normal Account"] = "Normaler Account";
$a->strings["This account is a normal personal profile"] = "Dieser Account ist ein normales persönliches Profil";
-$a->strings["Soapbox Account"] = "Sandkasten Accunt";
+$a->strings["Soapbox Account"] = "Sandkasten Account";
$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "Freundschaftsanfragen werden automatisch als Nurlese-Fans akzeptiert";
$a->strings["Community/Celebrity Account"] = "Gemeinschafts/Berühmtheiten Account";
$a->strings["Automatically approve all connection/friend requests as read-write fans"] = "Freundschaftsanfragen werden automatisch als Lese-und-Schreib-Fans akzeptiert";
$a->strings["Automatic Friend Account"] = "Automatischer Freundes Account";
$a->strings["Automatically approve all connection/friend requests as friends"] = "Freundschaftsanfragen werden automatisch als Freund akzeptiert";
-$a->strings["OpenID: "] = "OpenID: ";
-$a->strings["&nbsp;(Optional) Allow this OpenID to login to this account."] = "&nbsp;(Optional) Erlaube dieser OpenID sich für diesen Account anzumelden.";
-$a->strings["Publish your default profile in site directory?"] = "Dein Standard-Profil im Verzeichnis dieser Seite veröffentliche?";
-$a->strings["Publish your default profile in global social directory?"] = "Dein Standard-Profil im weltweiten Verzeichnis veröffentlichen?";
+$a->strings["OpenID:"] = "OpenID:";
+$a->strings["(Optional) Allow this OpenID to login to this account."] = "(Optional) Erlaube die Anmeldung für diesen Account mit dieser OpenID.";
+$a->strings["Publish your default profile in your local site directory?"] = "Veröffentliche dein Standardprofil im Verzeichnis der lokalen Seite?";
+$a->strings["Publish your default profile in the global social directory?"] = "Veröffentliche dein Standardprofil im weltweiten Verzeichnis?";
+$a->strings["Hide your contact/friend list from viewers of your default profile?"] = "Verberge die Liste deiner Kontakte vor Betrachtern des Standardprofils.";
+$a->strings["Hide profile details and all your messages from unknown viewers?"] = "Profildetails und all deine Beiträge vor unbekannten Besuchern verbergen?";
$a->strings["Profile is <strong>not published</strong>."] = "Profil ist <strong>nicht veröffentlicht</strong>.";
$a->strings["or"] = "oder";
$a->strings["Your Identity Address is"] = "Die Adresse deines Profils lautet:";
+$a->strings["Account Settings"] = "Account Einstellungen";
$a->strings["Export Personal Data"] = "Perönliche Daten exportieren";
+$a->strings["Password Settings"] = "Passwort Einstellungen";
+$a->strings["New Password:"] = "Neues Passwort:";
+$a->strings["Confirm:"] = "Bestätigen:";
+$a->strings["Leave password fields blank unless changing"] = "Lass die Passwort-Felder leer außer du willst das Passwort ändern";
$a->strings["Basic Settings"] = "Grundeinstellungen";
$a->strings["Full Name:"] = "Kompletter Name:";
$a->strings["Email Address:"] = "Email Adresse:";
@@ -300,9 +346,11 @@ $a->strings["Display Theme:"] = "Theme:";
$a->strings["Security and Privacy Settings"] = "Sicherheits und Privatsphären Einstellungen";
$a->strings["Maximum Friend Requests/Day:"] = "Maximale Anzahl von Freundschaftsanfragen/Tag:";
$a->strings["(to prevent spam abuse)"] = "(um SPAM zu vermeiden)";
+$a->strings["Default Post Permissions"] = "Grundeinstellung für Veröffentlichungen";
+$a->strings["(click to open/close)"] = "(klicke zum öffnen/schließen)";
$a->strings["Allow friends to post to your profile page:"] = "Erlaube es Freunden Beiträge auf deiner Pinnwand zu posten:";
-$a->strings["Automatically expire (delete) posts older than"] = "Automatisch Beiträge verfallen lassen (löschen) die älter sind als";
-$a->strings["days"] = "Tage";
+$a->strings["Automatically expire posts after days:"] = "Einträge verfallen automatisch nach Tagen:";
+$a->strings["If empty, posts will not expire. Expired posts will be deleted"] = "Wenn leer verfallen Einträge nie automatisch. Verfallene Einträge werden gelöscht.";
$a->strings["Notification Settings"] = "Benachrichtigungs Einstellungen";
$a->strings["Send a notification email when:"] = "Benachrichtigungs-Email senden wenn:";
$a->strings["You receive an introduction"] = "Du eine Vorstellung erhälst";
@@ -310,29 +358,27 @@ $a->strings["Your introductions are confirmed"] = "Eine deiner Vorstellungen ang
$a->strings["Someone writes on your profile wall"] = "Jemand etwas auf deiner Pinnwand postet";
$a->strings["Someone writes a followup comment"] = "Jemand einen Kommentar verfasst";
$a->strings["You receive a private message"] = "Du eine private Nachricht erhälst";
-$a->strings["Password Settings"] = "Passwort Einstellungen";
-$a->strings["Leave password fields blank unless changing"] = "Lass die Passwort-Felder leer außer du willst das Passwort ändern";
-$a->strings["New Password:"] = "Neues Passwort:";
-$a->strings["Confirm:"] = "Bestätigen:";
-$a->strings["Advanced Page Settings"] = "Erweiterte Seiten Einstellungen";
-$a->strings["Default Post Permissions"] = "Grundeinstellung für Veröffentlichungen";
-$a->strings["(click to open/close)"] = "(klicke zum öffnen/schließen)";
$a->strings["Email/Mailbox Setup"] = "Email/Postfach Einstellungen";
$a->strings["If you wish to communicate with email contacts using this service (optional), please specify how to connect to your mailbox."] = "Wenn du mit Email Kontakten über diesen Service kommunizieren möchtest (optional) gib bitte die Einstellungen für dein Postfach an.";
+$a->strings["Last successful email check:"] = "Letzter erfolgreicher Email Check";
+$a->strings["Email access is disabled on this site."] = "Zugriff auf Emails für diese Seite deaktiviert.";
$a->strings["IMAP server name:"] = "IMAP Server Name:";
$a->strings["IMAP port:"] = "IMAP Port:";
-$a->strings["Security (TLS or SSL):"] = "Sicherheit (TLS oder SSL)";
+$a->strings["Security:"] = "Sicherheit:";
+$a->strings["None"] = "Keine";
$a->strings["Email login name:"] = "Email Login Name:";
$a->strings["Email password:"] = "Email Passwort:";
-$a->strings["Reply-to address (Optional):"] = "Reply-to Adresse (Optional)";
+$a->strings["Reply-to address:"] = "Reply-to Adresse:";
$a->strings["Send public posts to all email contacts:"] = "Sende öffentliche Einträge an alle Email Kontakte:";
-$a->strings["Email access is disabled on this site."] = "Zugriff auf Emails für diese Seite deaktiviert.";
+$a->strings["Advanced Page Settings"] = "Erweiterte Seiten Einstellungen";
$a->strings["Welcome back %s"] = "Willkommen zurück %s";
$a->strings["Manage Identities and/or Pages"] = "Verwalte Identitäten und/oder Seiten";
$a->strings["(Toggle between different identities or community/group pages which share your account details.)"] = "(Wähle zwischen verschiedenen Identitäten oder Gemeinschafts/Gruppen Seiten die deine Accountdetails teilen.)";
$a->strings["Select an identity to manage: "] = "Wähle eine Identität zum Verwalten: ";
-$a->strings["Normal View"] = "Normale Ansicht";
-$a->strings["New Item View"] = "Neue Einträge";
+$a->strings["View Conversations"] = "Unterhaltungen anzeigen";
+$a->strings["View New Items"] = "Neue Einträge anzeigen";
+$a->strings["View Any Items"] = "Alle Einträge anzeigen";
+$a->strings["View Starred Items"] = "Gesternte Einträge anzeigen";
$a->strings["Warning: This group contains %s member from an insecure network."] = array(
0 => "",
1 => "",
@@ -344,9 +390,21 @@ $a->strings["Group: "] = "Gruppe: ";
$a->strings["Contact: "] = "Kontakt ";
$a->strings["Private messages to this person are at risk of public disclosure."] = "Private Nachrichten an diese Person könnten an die Öffentlichkeit gelangen.";
$a->strings["Invalid contact."] = "Ungültiger Kontakt.";
-$a->strings["Shared content is covered by the <a href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution 3.0</a> license."] = "Geteilte Inhalte innerhalb des Friendika Netzwerks sind unter der <a href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution 3.0</a> verfügbar.";
-$a->strings["Private Notes"] = "Privater Beitrag";
$a->strings["Save"] = "Speichern";
+$a->strings["Welcome to Friendika"] = "Willkommen bei Friendika";
+$a->strings["New Member Checklist"] = "Checkliste für neue Mitglieder";
+$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page."] = "Wir möchten dir einige Tipps und Links anbieten um deine Erfahrung mit Friendika so angenehm wie möglich zu machen. Klicke einfach einen Aspekt an um weitere Informationen zu erhalten.";
+$a->strings["On your <em>Settings</em> page - change your initial password. Also make a note of your Identity Address. This will be useful in making friends."] = "Ändere dein anfängliches Passwort auf der <em>Einstellungen</em> Seite. Bei dieser Gelegenheit solltest du dir die Adresse deines Profils merken, diese wird benötigt um mit Anderen in Kontakt zu treten.";
+$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "Überprüfe die restlichen Einstellungen, insbesondere die Einstellungen zur Privatsphäre. Wenn du dein Profil nicht veröffentlichst ist das wie wenn niemand deine Telefonnummer kennt. Im Allgemeinen solltest du es veröffentlichen - außer all deine Freunde und potentiellen Freunde wissen wie man dich findet.";
+$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Lade ein Profilbild hoch falls du es noch nicht getan hast. Studien haben gezeigt, das es zehnmal wahrscheinlicher ist neue Freunde zu finden, wenn du ein Bild von dir selbst verwendest als wenn du dies nicht tust.";
+$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "Richte die Verbindung zu Facebook ein, wenn du im Augenblick ein Facebook Konto hast und (optional) deine Facebook Freunde und Unterhaltungen importieren willst.";
+$a->strings["Enter your email access information on your Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Gib deine Email Daten in deinen Einstellungen an, wenn du mit deinen Email-Kontakten / Email-Listen interagieren möchtest.";
+$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Editiere dein <strong>Standard</strong> Profil nach deinen Vorlieben. Überprüfe die Einstellungen zum Verbergen deiner Freundesliste vor unbekannten Betrachtern des Profils.";
+$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Trage ein paar öffentliche Stichwörter in dein Standardprofil ein die deine Interessen beschreiben. Eventuell sind wir in der Lage Leute zu finden, die deine Interessen teilen und können dir dann Kontakte vorschlagen.";
+$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Connect</em> dialog."] = "Deine Kontakte Seite ist die zentrale Stelle um deine Freundschaften zu koordinieren und neuen Kontakte, auch von anderen Netzwerken, zu folgen. Normalerweise gibst du einfach die URL der Seite in den <em>Verbinden</em> Dialog ein.";
+$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "Über die Verzeichnisseite kannst du andere Personen auf diesem Server oder anderen verteilten Seiten finden. Halte nach einem <em>Verbinden</em> oder <em>Folgen</em> Link auf deren Profilseiten Ausschau und gib deine eigene Profiladresse an falls du danach gefragt wirst.";
+$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Sobald du einige Freunde gefunden hast, organisiere sie in Gruppen zur privaten Kommunikation im Seitenmenü der Kontakte-Seite. Du kannst dann mit jeder dieser Gruppen von der Netzwerkseite aus privat interagieren.";
+$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Unsere <strong>Hilfe</strong> Seiten können herangezogen werden um weitere Einzelheiten zu andern Programm Features zu erhalten.";
$a->strings["Item not available."] = "Beitrag nicht verfügbar.";
$a->strings["Item was not found."] = "Beitrag konnte nicht gefunden werden.";
$a->strings["Group created."] = "Gruppe erstellt.";
@@ -364,11 +422,12 @@ $a->strings["Members"] = "Mitglieder";
$a->strings["All Contacts"] = "Alle Kontakte";
$a->strings["Invalid profile identifier."] = "Ungültiger Profil-Bezeichner";
$a->strings["Profile Visibility Editor"] = "Editor für die Profil-Sichtbarkeit";
-$a->strings["Profile"] = "Profil";
$a->strings["Visible To"] = "Sichtbar für";
$a->strings["All Contacts (with secure profile access)"] = "Alle Kontakte (mit gesichertem Profil zugriff)";
$a->strings["View Contacts"] = "Kontakte anzeigen";
$a->strings["No contacts."] = "Keine Kontakte.";
+$a->strings["An invitation is required."] = "Du benötigst eine Einladung.";
+$a->strings["Invitation could not be verified."] = "Die Einladung konnte nicht überprüft werden.";
$a->strings["Invalid OpenID url"] = "Ungültige OpenID URL";
$a->strings["Please enter the required information."] = "Bitte trage die erforderlichen Informationen ein.";
$a->strings["Please use a shorter name."] = "Bitte verwende einen kürzeren Namen.";
@@ -392,6 +451,8 @@ $a->strings["You may (optionally) fill in this form via OpenID by supplying your
$a->strings["If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items."] = "Wenn du nicht mit OpenID vertraut bist, lass dieses Feld bitte leer und fülle die restlichen Felder aus.";
$a->strings["Your OpenID (optional): "] = "Deine OpenID (optional): ";
$a->strings["Include your profile in member directory?"] = "Soll dein Profil im Nutzerverzeichnis angezeigt werden?";
+$a->strings["Membership on this site is by invitation only."] = "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich.";
+$a->strings["Your invitation ID: "] = "ID deiner Einladung: ";
$a->strings["Registration"] = "Registration";
$a->strings["Your Full Name (e.g. Joe Smith): "] = "Vollständiger Name (z.B. Joe Smith): ";
$a->strings["Your Email Address: "] = "Deine EMail Adresse: ";
@@ -409,10 +470,9 @@ $a->strings["Bug reports and issues: please visit"] = "Probleme oder Fehler gefu
$a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendika - dot com"] = "Vorschläge, Lobeshymnen, Spenden usw. - bitte eine Email an \"Info\" at Friendika - dot com (englisch bevorzugt)";
$a->strings["Installed plugins/addons/apps"] = "Installierte Plugins/Erweiterungen/Apps";
$a->strings["No installed plugins/addons/apps"] = "Keine Plugins/Erweiterungen/Apps installiert";
-$a->strings["Please login."] = "Bitte melde dich an.";
-$a->strings["Registration revoked for %s"] = "Registration für %s wurde zurück gezogen";
$a->strings["Account approved."] = "Account freigegeben.";
-$a->strings["[Embedded content - reload page to view]"] = "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]";
+$a->strings["Registration revoked for %s"] = "Registration für %s wurde zurück gezogen";
+$a->strings["Please login."] = "Bitte melde dich an.";
$a->strings["Unable to locate original post."] = "Konnte das original Posting nicht finden.";
$a->strings["Empty post discarded."] = "Leere Nachricht wurde verworfen.";
$a->strings["Wall Photos"] = "Pinnwand Bilder";
@@ -425,7 +485,6 @@ $a->strings["This message was sent to you by %s, a member of the Friendika socia
$a->strings["You may visit them online at %s"] = "Du kannst sie online unter %s besuchen";
$a->strings["Please contact the sender by replying to this post if you do not wish to receive these messages."] = "Please contact the sender by replying to this post if you do not wish to receive these messages.";
$a->strings["%s posted an update."] = "%s hat ein Update gepostet.";
-$a->strings["Item not found."] = "Beitrag nicht gefunden.";
$a->strings["Image uploaded but image cropping failed."] = "Bilder hochgeladen aber das Zuschneiden ist fehlgeschlagen.";
$a->strings["Image size reduction [%s] failed."] = "Verkleinern der Bildgröße von [%s] ist gescheitert.";
$a->strings["Unable to process image"] = "Bild konnte nicht verarbeitet werden";
@@ -464,26 +523,113 @@ $a->strings["D, d M Y - g:i A"] = "D, d. M Y - g:i A";
$a->strings["Message not available."] = "Nachricht nicht verfügbar.";
$a->strings["Delete message"] = "Nachricht löschen";
$a->strings["Send Reply"] = "Antwort senden";
+$a->strings["Site"] = "Seite";
+$a->strings["Users"] = "Nutzer";
+$a->strings["Plugins"] = "Plugins";
+$a->strings["Update"] = "Aktualisierungen";
+$a->strings["Logs"] = "Protokolle";
+$a->strings["User registrations waiting for confirmation"] = "Nutzeranmeldungen die auf Bestätigung warten";
+$a->strings["Item not found."] = "Beitrag nicht gefunden.";
+$a->strings["Administration"] = "Administration";
+$a->strings["Summary"] = "Zusammenfassung";
+$a->strings["Registered users"] = "Registrierte Nutzer";
+$a->strings["Pending registrations"] = "Anstehende Anmeldungen";
+$a->strings["Version"] = "Version";
+$a->strings["Active plugins"] = "Aktive Plugins";
+$a->strings["Site settings updated."] = "Seiteneinstellungen aktualisiert.";
+$a->strings["Closed"] = "Geschlossen";
+$a->strings["Requires approval"] = "Bedarf Zustimmung";
+$a->strings["Open"] = "Offen";
+$a->strings["File upload"] = "Datei hochladen";
+$a->strings["Policies"] = "Regeln";
+$a->strings["Advanced"] = "Erweitert";
+$a->strings["Site name"] = "Seiten Name";
+$a->strings["Banner/Logo"] = "Banner/Logo";
+$a->strings["System language"] = "System Sprache";
+$a->strings["System theme"] = "Systemweites Thema";
+$a->strings["Maximum image size"] = "Maximale Größe von Bildern";
+$a->strings["Register policy"] = "Registrationsmethode";
+$a->strings["Register text"] = "Registrationstext";
+$a->strings["Allowed friend domains"] = "Erlaubte Domains für Kontakte";
+$a->strings["Allowed email domains"] = "Erlaubte Domains für Emails";
+$a->strings["Block public"] = "Öffentlichen Zugriff blockieren";
+$a->strings["Force publish"] = "Erzwinge Veröffentlichung";
+$a->strings["Global directory update URL"] = "URL für Updates beim weltweiten Verzeichnis";
+$a->strings["Block multiple registrations"] = "Unterbinde mehrfach Registration";
+$a->strings["OpenID support"] = "OpenID Unterstützung";
+$a->strings["Gravatar support"] = "Gravatar Unterstützung";
+$a->strings["Fullname check"] = "Name auf Vollständigkeit überprüfen";
+$a->strings["UTF-8 Regular expressions"] = "UTF-8 Reguläre Ausdrücke";
+$a->strings["Show Community Page"] = "Gemeinschaftsseite anzeigen";
+$a->strings["Enable OStatus support"] = "OStatus Unterstützung aktivieren";
+$a->strings["Only allow Friendika contacts"] = "Erlaube ausschlließlich Friendika Kontakte";
+$a->strings["Verify SSL"] = "SSL Überprüfen";
+$a->strings["Proxy user"] = "Proxy Nutzer";
+$a->strings["Proxy URL"] = "Proxy URL";
+$a->strings["Network timeout"] = "Netzwerk Wartezeit";
+$a->strings["%s user blocked"] = array(
+ 0 => "%s Nutzer gesperrt",
+ 1 => "%s Nutzer gesperrt/entsperrt",
+);
+$a->strings["%s user deleted"] = array(
+ 0 => "%s Nutzer gelöscht",
+ 1 => "%s Nutzer gelöscht",
+);
+$a->strings["User '%s' deleted"] = "Nutzer '%s' gelöscht";
+$a->strings["User '%s' unblocked"] = "Nutzer '%s' entsperrt";
+$a->strings["User '%s' blocked"] = "Nutzer '%s' gesperrt";
+$a->strings["select all"] = "Alle auswählen";
+$a->strings["User registrations waiting for confirm"] = "Neuanmeldungen die auf deine Bestätigung warten";
+$a->strings["Request date"] = "Anfrage Datum";
+$a->strings["Email"] = "Email";
+$a->strings["No registrations."] = "Keine Neuanmeldungen.";
+$a->strings["Deny"] = "Verwehren";
+$a->strings["Block"] = "Sperren";
+$a->strings["Unblock"] = "Entsperren";
+$a->strings["Register date"] = "Anmeldedatum";
+$a->strings["Last login"] = "Letzte Anmeldung";
+$a->strings["Last item"] = "Letzter Beitrag";
+$a->strings["Account"] = "Nutzerkonto";
+$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Die markierten Nutzer werden gelöscht!\\n\\nAlle Beiträge die diese Nutzer auf dieser Seite veröffentlicht haben werden permanent gelöscht!\\n\\nBist du dir sicher?";
+$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Der Nutzer {0} wird gelöscht!\\n\\nAlles was dieser Nutzer auf dieser Seite veröffentlicht hat wird permanent gelöscht!\\n\\nBist du dir sicher?";
+$a->strings["Plugin %s disabled."] = "Plugin %s deaktiviert.";
+$a->strings["Plugin %s enabled."] = "Plugin %s aktiviert.";
+$a->strings["Disable"] = "Ausschalten";
+$a->strings["Enable"] = "Einschalten";
+$a->strings["Toggle"] = "Umschalten";
+$a->strings["Settings"] = "Einstellungen";
+$a->strings["Log settings updated."] = "Protokolleinstellungen aktualisiert.";
+$a->strings["Clear"] = "löschen";
+$a->strings["Debugging"] = "Protokoll führen";
+$a->strings["Log file"] = "Protokolldatei";
+$a->strings["Must be writable by web server. Relative to your Friendika index.php."] = "Muss schreibbar durch den Webserver sein. Angabe relativ zu Friendikas indes.php.";
+$a->strings["Log level"] = "Protokollevel";
+$a->strings["Close"] = "Schließen";
+$a->strings["FTP Host"] = "FTP Host";
+$a->strings["FTP Path"] = "FTP Pfad";
+$a->strings["FTP User"] = "FTP Nutzername";
+$a->strings["FTP Password"] = "FTP Passwort";
$a->strings["No profile"] = "Kein Profil";
-$a->strings["Access to this profile has been restricted."] = "Der Zugriff zu diesem Profil wurde eingeschrängt.";
-$a->strings["Status"] = "Status";
-$a->strings["Photos"] = "Bilder";
+$a->strings["Access to this profile has been restricted."] = "Der Zugriff zu diesem Profil wurde eingeschränkt.";
+$a->strings["Tips for New Members"] = "Tipps für neue Nutzer";
$a->strings["Login failed."] = "Annmeldung fehlgeschlagen.";
$a->strings["Welcome "] = "Willkommen ";
$a->strings["Please upload a profile photo."] = "Bitte lade ein Profilbild hoch.";
$a->strings["Welcome back "] = "Willkommen zurück ";
-$a->strings["The profile address specified does not provide adequate information."] = "Die angegebene Profiladresse liefert unzureichende Informationen.";
+$a->strings["This site is not configured to allow communications with other networks."] = "Diese Seite ist so konfiguriert, dass keine Kommunikation mit anderen Netzwerken erfolgen kann.";
$a->strings["No compatible communication protocols or feeds were discovered."] = "Es wurden keine kompatiblen Kommunikationsprotokolle oder Feeds gefunden.";
+$a->strings["The profile address specified does not provide adequate information."] = "Die angegebene Profiladresse liefert unzureichende Informationen.";
$a->strings["An author or name was not found."] = "Es wurde kein Autor oder Name gefunden.";
$a->strings["No browser URL could be matched to this address."] = "Zu dieser Adresse konnte keine passende Browser URL gefunden werden.";
+$a->strings["Communication options with this network have been restricted."] = "Kommunikations-Optionen mit diesem Netzwerk wurden eingeschränkt.";
$a->strings["Limited profile. This person will be unable to receive direct/personal notifications from you."] = "Eingeschränktes Profil. Diese Person wird keine direkten/privaten Nachrichten von dir erhalten können.";
$a->strings["Unable to retrieve contact information."] = "Konnte die Kontaktinformationen nicht empfangen.";
$a->strings["following"] = "folgen";
$a->strings["Item has been removed."] = "Eintrag wurde entfernt.";
$a->strings["New mail received at "] = "New mail received at ";
$a->strings["Applications"] = "Anwendungen";
+$a->strings["No installed applications."] = "Keine Applikationen installiert.";
$a->strings["Search"] = "Suche";
-$a->strings["No results."] = "Keine Ergebnisse.";
$a->strings["Profile not found."] = "Profil nicht gefunden.";
$a->strings["Profile Name is required."] = "Profilname ist erforderlich.";
$a->strings["Profile updated."] = "Profil aktualisiert.";
@@ -492,7 +638,6 @@ $a->strings["Profile-"] = "Profil-";
$a->strings["New profile created."] = "Neues Profil angelegt.";
$a->strings["Profile unavailable to clone."] = "Profil nicht zum Duplizieren verfügbar.";
$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Liste der Kontakte/Freunde vor Betrachtern dieses Profils verbergen?";
-$a->strings["Hide profile details and all your messages from unknown viewers?"] = "Profildetails und all deine Beiträge vor unbekannten Besuchern verbergen?";
$a->strings["Edit Profile Details"] = "Profil bearbeiten";
$a->strings["View this profile"] = "Dieses Profil anzeigen";
$a->strings["Create a new profile using these settings"] = "Neues Profil anlegen und diese Einstellungen verwenden";
@@ -502,7 +647,7 @@ $a->strings["Profile Name:"] = "Profilname:";
$a->strings["Your Full Name:"] = "Dein kompletter Name:";
$a->strings["Title/Description:"] = "Titel/Beschreibung:";
$a->strings["Your Gender:"] = "Dein Geschlecht:";
-$a->strings["Birthday (y/m/d):"] = "Geburtstag (y/m/d):";
+$a->strings["Birthday (%s):"] = "Geburtstag (%s):";
$a->strings["Street Address:"] = "Adresse:";
$a->strings["Locality/City:"] = "Wohnort/Stadt:";
$a->strings["Postal/Zip Code:"] = "Postleitzahl:";
@@ -536,7 +681,7 @@ $a->strings["Profiles"] = "Profile";
$a->strings["Change profile photo"] = "Profilbild ändern";
$a->strings["Create New Profile"] = "Neues Profil anlegen";
$a->strings["Profile Image"] = "Profilbild";
-$a->strings["Visible to everybody"] = "Für jeden sichtbar";
+$a->strings["visible to everybody"] = "sichtbar für jeden";
$a->strings["Edit visibility"] = "Sichtbarkeit bearbeiten";
$a->strings["Global Directory"] = "Weltweites Verzeichnis";
$a->strings["Normal site view"] = "Normale Seitenansicht";
@@ -551,10 +696,12 @@ $a->strings["%d message sent."] = array(
0 => "%d Nachricht gesendet.",
1 => "%d Nachrichten gesendet.",
);
+$a->strings["You have no more invitations available"] = "Du hast keine weiteren Einladungen";
$a->strings["Send invitations"] = "Einladungen senden";
$a->strings["Enter email addresses, one per line:"] = "Email Adressen eingeben, eine pro Zeile:";
$a->strings["Please join my social network on %s"] = "Bitte trete meinem Sozialen Netzwerk auf %s bei";
$a->strings["To accept this invitation, please visit:"] = "Um diese Einladung anzunehmen beuche bitte:";
+$a->strings["You will need to supply this invitation code: \$invite_code"] = "Du benötigst den folgenden Einladungs Code: \$invite_code";
$a->strings["Once you have registered, please connect with me via my profile page at:"] = "Sobald du registriert bist kontaktiere mich bitte auf meiner Profilseite:";
$a->strings["Response from remote site was not understood."] = "Antwort der entfernten Gegenstelle unverständlich.";
$a->strings["Unexpected response from remote site: "] = "Unerwartete Antwort der Gegenstelle: ";
@@ -579,14 +726,19 @@ $a->strings["Facebook Connect"] = "Mit Facebook verbinden";
$a->strings["Install Facebook connector for this account."] = "Facebook Connector für diesen Account installieren.";
$a->strings["Remove Facebook connector"] = "Facebook Connector entfernen";
$a->strings["Post to Facebook by default"] = "Sende standardmäßig nach Facebook";
+$a->strings["Link all your Facebook friends and conversations"] = "Verknüpfe all deine Facebook-Freunde und Unterhaltungen";
+$a->strings["Warning: Your Facebook privacy settings can not be imported."] = "Warnung: Deine Privatsphären Einstellungen können nicht von Facebook importiert werden.";
+$a->strings["Linked Facebook items <strong>may</strong> be publicly visible, depending on your privacy settings for this website/account."] = "Eingebundene Beiträge von Facebook <strong>könnten</strong> öffentlich sichtbar sein, abhängig von deinen Privatsphären-Einstellungen für dieses Nutzerkonto.";
$a->strings["Facebook"] = "Facebook";
$a->strings["Facebook Connector Settings"] = "Facebook Verbindungseinstellungen";
$a->strings["Post to Facebook"] = "Zu Facebook posten";
$a->strings["Post to Facebook cancelled because of multi-network access permission conflict."] = "Das Senden nach Facebook wurde zurückgezogen da Konflikte bei den Multi-Netzwerks-Rechten vorliegen.";
$a->strings["Image: "] = "Bild";
$a->strings["View on Friendika"] = "Auf Friendika ansehen";
-$a->strings["Widgets key: "] = "Widgets Schlüssel: ";
+$a->strings["Facebook post failed. Queued for retry."] = "Senden an Facebook gescheitert. Wir versuchen es später erneut.";
$a->strings["Generate new key"] = "Neuen Schlüssel erstellen";
+$a->strings["Widgets key"] = "Widgets Schlüssel";
+$a->strings["Widgets available"] = "Verfügbare Widgets";
$a->strings["Connect on Friendika!"] = "Auf Friendika Verbinden!";
$a->strings["Three Dimensional Tic-Tac-Toe"] = "Dreidimensionales Tic-Tac-Toe";
$a->strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
@@ -602,8 +754,6 @@ $a->strings["\"Cat\" game!"] = "Unentschieden!";
$a->strings["I won!"] = "Ich gewinne!";
$a->strings["Randplace Settings"] = "Randplace Einstellungen";
$a->strings["Enable Randplace Plugin"] = "Randplace Erweiterung aktivieren";
-$a->strings["Select files to upload: "] = "Wähle Dateien zum Upload aus: ";
-$a->strings["Use the following controls only if the Java uploader [above] fails to launch."] = "Verwende die folgenden Kontrollen nur, wenn der Java Uploader [oben] nicht funktioniert.";
$a->strings["Upload a file"] = "Datei hochladen";
$a->strings["Drop files here to upload"] = "Ziehe die Dateien hier her die du hochladen willst";
$a->strings["Failed"] = "Fehlgeschlagen";
@@ -612,8 +762,15 @@ $a->strings["Uploaded file is empty"] = "Hochgeladene Datei ist leer";
$a->strings["Uploaded file is too large"] = "Hochgeladene Datei ist zu groß";
$a->strings["File has an invalid extension, it should be one of "] = "Die Dateiextension ist nicht erlaubt, sie muss eine der folgenden sein ";
$a->strings["Upload was cancelled, or server error encountered"] = "Upload abgebrochen oder Serverfehler aufgetreten";
+$a->strings["Impressum"] = "Impressum";
+$a->strings["Site Owner"] = "Betreiber der Seite";
+$a->strings["Email Address"] = "Email Adresse";
+$a->strings["Postal Address"] = "Postalische Anschrift";
+$a->strings["The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon."] = "Das Impressums Plugin muss noch konfiguriert werden.<br />Bitte gebe mindestens den <tt>Betreiber</tt> in der Konfiguration an. Alle weiteren Parameter werden in der README Datei des Addons erleutert.";
+$a->strings["Site Owners Profile"] = "Profil des Seitenbetreibers";
+$a->strings["Notes"] = "Hinweise";
$a->strings["OEmbed settings updated"] = "OEmbed Einstellungen aktualisiert.";
-$a->strings["Use OEmbed for YouTube videos: "] = "OEmbed für YouTube videos verwenden: ";
+$a->strings["Use OEmbed for YouTube videos"] = "OEmbed für Youtube Videos verwenden";
$a->strings["URL to embed:"] = "URL zum Einbetten:";
$a->strings["Post to StatusNet"] = "Nach StatusNet senden";
$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Bitte kontaktiere den Administrator der Seite.<br />Die gegebene API URL ist nicht gültig.";
@@ -634,18 +791,25 @@ $a->strings["Cancel Connection Process"] = "Verbindungsprozess abbrechen";
$a->strings["Current StatusNet API is"] = "Derzeitige StatusNet API URL lautet";
$a->strings["Cancel StatusNet Connection"] = "Verbindung zum StatusNet Server abbrechen";
$a->strings["Currently connected to: "] = "Momentan verbunden mit: ";
-$a->strings["If enabled all your <strong>public</strong> postings will be posted to the associated StatusNet account."] = "Wenn aktiv, werden alle deine <strong>öffentlichen</strong> Beiträge auch auf dem verbundenen StatusNet Account veröffentlicht.";
+$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen StatusNet Konto veröffentlicht werden. Du kannst dies (hier) als Standartverhalten einstellen oder für jeden Eintrag separat in den Beitragsoptionen beim Schreiben des Eintrags festlegen.";
$a->strings["Allow posting to StatusNet"] = "Nach StatusNet senden erlauben";
$a->strings["Send public postings to StatusNet by default"] = "Veröffentliche alle öffentlichen Beiträge auch bei StatusNet";
$a->strings["Clear OAuth configuration"] = "OAuth Konfiguration löschen";
+$a->strings["Piwik Base URL"] = "Piwik Basis URL";
+$a->strings["Site ID"] = "Seiten ID";
+$a->strings["Show opt-out cookie link?"] = "Link zum Setzen des Opt-Out Cookies anzeigen?";
$a->strings["Post to Twitter"] = "Nach Twitter senden";
+$a->strings["Twitter settings updated."] = "Twitter Einstellungen aktualisiert.";
$a->strings["Twitter Posting Settings"] = "Twitter Posting Einstellungen";
$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Kein Consumer Schlüsselpaar für Twitter gefunden. Bitte wende dich an den Administrator der Seite.";
$a->strings["At this Friendika instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Auf dieser Friendika Instanz wurde das Twitter Plugin aktiviert dein Account ist allerdings noch nicht mit einem Twitter Account verbunden. Um deinen Account mit Twitter zu verbinden, klick auf den Button weiter unten und gib die PIN die du auf Twitter erhälst hier ein. Es werden ausschließlich deine <strong>öffentlichen</strong> Nachrichten auf Twitter veröffentlicht.";
$a->strings["Log in with Twitter"] = "bei Twitter anmelden";
$a->strings["Copy the PIN from Twitter here"] = "Kopiere die Twitter PIN hier her";
-$a->strings["If enabled all your <strong>public</strong> postings will be posted to the associated Twitter account as well."] = "Wenn dies aktiviert ist, werden alle deine <strong>öffentlichen</strong> Nachricten auch auf dem verbundenen Twitter Account veröffentlicht.";
-$a->strings["Send public postings to Twitter"] = "Veröffentliche öffentliche Nachrichten auf Twitter";
+$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen Twitter Konto veröffentlicht werden. Du kannst dies (hier) als Standartverhalten einstellen oder für jeden Eintrag separat in den Beitragsoptionen beim Schreiben des Eintrags festlegen.";
+$a->strings["Allow posting to Twitter"] = "Nach Twitter senden erlauben";
+$a->strings["Send public postings to Twitter by default"] = "Veröffentliche alle öffentlichen Beiträge auch bei Twitter";
+$a->strings["Consumer key"] = "Anwender Schlüssel";
+$a->strings["Consumer secret"] = "Anwender Geheimnis";
$a->strings["Gender:"] = "Geschlecht:";
$a->strings["Birthday:"] = "Geburtstag:";
$a->strings["j F, Y"] = "j F, Y";
@@ -729,28 +893,80 @@ $a->strings["Uncertain"] = "Unsicher";
$a->strings["Complicated"] = "Kompliziert";
$a->strings["Don't care"] = "Ist mir nicht wichtig";
$a->strings["Ask me"] = "Frag mich";
+$a->strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A";
+$a->strings["Starts:"] = "Beginnt:";
+$a->strings["Finishes:"] = "Endet:";
+$a->strings["prev"] = "vorige";
+$a->strings["first"] = "erste";
+$a->strings["last"] = "letzte";
+$a->strings["next"] = "nächste";
+$a->strings["No contacts"] = "Keine Kontakte";
+$a->strings["%d Contact"] = array(
+ 0 => "%d Kontakt",
+ 1 => "%d Kontakte",
+);
+$a->strings["Monday"] = "Montag";
+$a->strings["Tuesday"] = "Dienstag";
+$a->strings["Wednesday"] = "Mittwoch";
+$a->strings["Thursday"] = "Donnerstag";
+$a->strings["Friday"] = "Freitag";
+$a->strings["Saturday"] = "Samstag";
+$a->strings["Sunday"] = "Sonntag";
+$a->strings["January"] = "Januar";
+$a->strings["February"] = "Februar";
+$a->strings["March"] = "März";
+$a->strings["April"] = "April";
+$a->strings["May"] = "Mai";
+$a->strings["June"] = "Juni";
+$a->strings["July"] = "Juli";
+$a->strings["August"] = "August";
+$a->strings["September"] = "September";
+$a->strings["October"] = "Oktober";
+$a->strings["November"] = "November";
+$a->strings["December"] = "Dezember";
+$a->strings["bytes"] = "Byte";
+$a->strings["Select an alternate language"] = "Alternative Sprache auswählen";
$a->strings["Embedding disabled"] = "Einbettungen deaktiviert";
$a->strings["Create a new group"] = "Neue Gruppe erstellen";
$a->strings["Everybody"] = "Alle Kontakte";
$a->strings["Logout"] = "Abmelden";
+$a->strings["End this session"] = "Diese Sitzung beenden";
$a->strings["Login"] = "Anmeldung";
+$a->strings["Sign in"] = "Anmelden";
$a->strings["Home"] = "Persönlich";
+$a->strings["Home Page"] = "Home Page";
+$a->strings["Create an account"] = "Account erstellen";
+$a->strings["Help and documentation"] = "Hilfe und Dokumentation";
$a->strings["Apps"] = "Apps";
+$a->strings["Addon applications, utilities, games"] = "Addon Anwendungen, Dienstprogramme, Spiele";
+$a->strings["Search site content"] = "Inhalt der Seite durchsuchen";
+$a->strings["Conversations on this site"] = "Unterhaltungen auf dieser Seite";
$a->strings["Directory"] = "Verzeichnis";
+$a->strings["People directory"] = "Nutzerverzeichnis";
$a->strings["Network"] = "Netzwerk";
+$a->strings["Conversations from your friends"] = "Unterhaltungen deiner Kontakte";
+$a->strings["Your posts and conversations"] = "Deine Einträge und Unterhaltungen";
$a->strings["Notifications"] = "Benachrichtigungen";
+$a->strings["Friend requests"] = "Kontaktanfragen";
+$a->strings["Private mail"] = "Private Email";
$a->strings["Manage"] = "Verwalten";
-$a->strings["Settings"] = "Einstellungen";
+$a->strings["Manage other pages"] = "Andere Seiten verwalten";
+$a->strings["Manage/edit profiles"] = "Profile verwalten/editieren";
+$a->strings["Manage/edit friends and contacts"] = "Freunde und Kontakte verwalten/editieren";
+$a->strings["Admin"] = "Administration";
+$a->strings["Site setup and configuration"] = "Einstellungen der Seite und Konfiguration";
$a->strings["Logged out."] = "Abgemeldet.";
$a->strings["Miscellaneous"] = "Verschiedenes";
-$a->strings["less than a second ago"] = "vor weniger als einer Sekunde";
$a->strings["year"] = "Jahr";
-$a->strings["years"] = "Jahre";
$a->strings["month"] = "Monat";
+$a->strings["day"] = "Tag";
+$a->strings["never"] = "nie";
+$a->strings["less than a second ago"] = "vor weniger als einer Sekunde";
+$a->strings["years"] = "Jahre";
$a->strings["months"] = "Monate";
$a->strings["week"] = "Woche";
$a->strings["weeks"] = "Wochen";
-$a->strings["day"] = "Tag";
+$a->strings["days"] = "Tage";
$a->strings["hour"] = "Stunde";
$a->strings["hours"] = "Stunden";
$a->strings["minute"] = "Minute";
@@ -761,19 +977,23 @@ $a->strings[" ago"] = " her";
$a->strings["From: "] = "Von: ";
$a->strings["Image/photo"] = "Bild/Foto";
$a->strings["Cannot locate DNS info for database server '%s'"] = "Kann die DNS Informationen für den Datenbanken Server '%s' nicht ermitteln.";
-$a->strings["Visible To:"] = "Sichtbar für:";
-$a->strings["everybody"] = "jeder";
-$a->strings["Groups"] = "Gruppen";
-$a->strings["Except For:"] = "Abgesehen von:";
+$a->strings["Visible to everybody"] = "Für jeden sichtbar";
+$a->strings["show"] = "anzeigen";
+$a->strings["don't show"] = "nicht anzeigen";
$a->strings["(no subject)"] = "(kein Betreff)";
$a->strings["You have a new follower at "] = "Du hast einen neuen Kontakt auf ";
+$a->strings["event"] = "Veranstaltung";
$a->strings["View %s's profile"] = "Betrachte %s's Profil";
+$a->strings["%s from %s"] = "%s von %s";
$a->strings["View in context"] = "Im Zusammenhang betrachten";
$a->strings["See more posts like this"] = "Mehr Beiträge wie diesen anzeigen";
$a->strings["See all %d comments"] = "Alle %d Kommentare anzeigen";
+$a->strings["Select"] = "Auswählen";
+$a->strings["toggle star status"] = "Stern Status umschalten";
$a->strings["to"] = "to";
$a->strings["Wall-to-Wall"] = "Wall-to-Wall";
$a->strings["via Wall-To-Wall:"] = "via Wall-To-Wall:";
+$a->strings["Delete Selected Items"] = "Lösche die markierten Beiträge";
$a->strings["View status"] = "Status anzeigen";
$a->strings["View profile"] = "Profil anzeigen";
$a->strings["View photos"] = "Fotos ansehen";
@@ -801,44 +1021,13 @@ $a->strings["Password: "] = "Passwort: ";
$a->strings["Nickname/Email/OpenID: "] = "Spitzname/Email/OpenID: ";
$a->strings["Password (if not OpenID): "] = "Passwort (falls nicht OpenID): ";
$a->strings["Forgot your password?"] = "Passwort vergessen?";
-$a->strings["prev"] = "vorige";
-$a->strings["first"] = "erste";
-$a->strings["last"] = "letzte";
-$a->strings["next"] = "nächste";
-$a->strings["No contacts"] = "Keine Kontakte";
-$a->strings["%d Contact"] = array(
- 0 => "%d Kontakt",
- 1 => "%d Kontakte",
-);
$a->strings["Connect"] = "Verbinden";
-$a->strings["Location:"] = "Ort:";
$a->strings[", "] = ", ";
$a->strings["Status:"] = "Status:";
-$a->strings["Monday"] = "Montag";
-$a->strings["Tuesday"] = "Dienstag";
-$a->strings["Wednesday"] = "Mittwoch";
-$a->strings["Thursday"] = "Donnerstag";
-$a->strings["Friday"] = "Freitag";
-$a->strings["Saturday"] = "Samstag";
-$a->strings["Sunday"] = "Sonntag";
-$a->strings["January"] = "Januar";
-$a->strings["February"] = "Februar";
-$a->strings["March"] = "März";
-$a->strings["April"] = "April";
-$a->strings["May"] = "Mai";
-$a->strings["June"] = "Juni";
-$a->strings["July"] = "Juli";
-$a->strings["August"] = "August";
-$a->strings["September"] = "September";
-$a->strings["October"] = "Oktober";
-$a->strings["November"] = "November";
-$a->strings["December"] = "Dezember";
$a->strings["g A l F d"] = "g A l F d";
$a->strings["Birthday Reminders"] = "Geburtstagserinnerungen";
$a->strings["Birthdays this week:"] = "Geburtstage diese Woche:";
$a->strings["(Adjusted for local time)"] = "(an die lokale Zeit angepasst)";
$a->strings["[today]"] = "[heute]";
-$a->strings["bytes"] = "Byte";
-$a->strings["link to source"] = "Link zum original Posting";
$a->strings["Not Found"] = "Nicht gefunden";
$a->strings["Page not found."] = "Seite nicht gefunden.";
diff --git a/view/diaspora_comment.tpl b/view/diaspora_comment.tpl
new file mode 100644
index 000000000..6ef4ab664
--- /dev/null
+++ b/view/diaspora_comment.tpl
@@ -0,0 +1,11 @@
+<XML>
+ <post>
+ <comment>
+ <guid>$guid</guid>
+ <parent_guid>$parent_guid</parent_guid>
+ <author_signature>$authorsig</author_signature>
+ <text>$body</text>
+ <diaspora_handle>$handle</diaspora_handle>
+ </comment>
+ </post>
+</XML> \ No newline at end of file
diff --git a/view/diaspora_comment_relay.tpl b/view/diaspora_comment_relay.tpl
new file mode 100644
index 000000000..e82de1171
--- /dev/null
+++ b/view/diaspora_comment_relay.tpl
@@ -0,0 +1,12 @@
+<XML>
+ <post>
+ <comment>
+ <guid>$guid</guid>
+ <parent_guid>$parent_guid</parent_guid>
+ <parent_author_signature>$parentsig</parent_author_signature>
+ <author_signature>$authorsig</author_signature>
+ <text>$body</text>
+ <diaspora_handle>$handle</diaspora_handle>
+ </comment>
+ </post>
+</XML> \ No newline at end of file
diff --git a/view/diaspora_like.tpl b/view/diaspora_like.tpl
new file mode 100644
index 000000000..76356eb29
--- /dev/null
+++ b/view/diaspora_like.tpl
@@ -0,0 +1,12 @@
+<XML>
+ <post>
+ <like>
+ <target_type>$type</target_type>
+ <guid>$guid</guid>
+ <parent_guid>$parent_guid</parent_guid>
+ <author_signature>$authorsig</author_signature>
+ <positive>$positive</positive>
+ <diaspora_handle>$handle</diaspora_handle>
+ </like>
+ </post>
+</XML>
diff --git a/view/diaspora_like_relay.tpl b/view/diaspora_like_relay.tpl
new file mode 100644
index 000000000..6feba96ad
--- /dev/null
+++ b/view/diaspora_like_relay.tpl
@@ -0,0 +1,13 @@
+<XML>
+ <post>
+ <like>
+ <guid>$guid</guid>
+ <target_type>$type</target_type>
+ <parent_guid>$parent_guid</parent_guid>
+ <parent_author_signature>$parentsig</parent_author_signature>
+ <author_signature>$authrosig</author_signature>
+ <positive>$positive</positive>
+ <diaspora_handle>$handle</diaspora_handle>
+ </like>
+ </post>
+</XML> \ No newline at end of file
diff --git a/view/diaspora_post.tpl b/view/diaspora_post.tpl
new file mode 100644
index 000000000..1ba3ebb1f
--- /dev/null
+++ b/view/diaspora_post.tpl
@@ -0,0 +1,11 @@
+<XML>
+ <post>
+ <status_message>
+ <raw_message>$body</raw_message>
+ <guid>$guid</guid>
+ <diaspora_handle>$handle</diaspora_handle>
+ <public>$public</public>
+ <created_at>$created</created_at>
+ </status_message>
+ </post>
+</XML> \ No newline at end of file
diff --git a/view/diaspora_retract.tpl b/view/diaspora_retract.tpl
new file mode 100644
index 000000000..6d5b6e22b
--- /dev/null
+++ b/view/diaspora_retract.tpl
@@ -0,0 +1,9 @@
+<XML>
+ <post>
+ <retraction>
+ <post_guid>$guid</post_guid>
+ <type>$type</type>
+ <diaspora_handle>$handle</diaspora_handle>
+ </retraction>
+ </post>
+</XML> \ No newline at end of file
diff --git a/view/diaspora_share.tpl b/view/diaspora_share.tpl
new file mode 100644
index 000000000..c16341b1e
--- /dev/null
+++ b/view/diaspora_share.tpl
@@ -0,0 +1,8 @@
+<XML>
+ <post>
+ <request>
+ <sender_handle>$sender</sender_handle>
+ <recipient_handle>$recipient</recipient_handle>
+ </request>
+ </post>
+</XML> \ No newline at end of file
diff --git a/view/jot-header.tpl b/view/jot-header.tpl
index 795267ee3..6195c5bbc 100644
--- a/view/jot-header.tpl
+++ b/view/jot-header.tpl
@@ -11,6 +11,7 @@ function initEditor(cb){
theme : "advanced",
mode : "specific_textareas",
editor_selector: /(profile-jot-text|prvmail-text)/,
+ auto_focus: "profile-jot-text",
plugins : "bbcode,paste,autoresize",
theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code",
theme_advanced_buttons2 : "",
diff --git a/view/magicsig.tpl b/view/magicsig.tpl
index 622e7c5a2..75f9bc475 100644
--- a/view/magicsig.tpl
+++ b/view/magicsig.tpl
@@ -5,5 +5,5 @@ $data
</me:data>
<me:encoding>$encoding</me:encoding>
<me:alg>$algorithm</me:alg>
-<me:sig keyhash="$keyhash">$signature</me:sig>
+<me:sig key_id="$keyhash">$signature</me:sig>
</me:env>
diff --git a/view/profile_edit.tpl b/view/profile_edit.tpl
index 053e19594..8dab72649 100644
--- a/view/profile_edit.tpl
+++ b/view/profile_edit.tpl
@@ -1,3 +1,5 @@
+$default
+
<h1>$banner</h1>
<div id="profile-edit-links">
@@ -12,7 +14,6 @@
<div id="profile-edit-links-end"></div>
-$default
<div id="profile-edit-wrapper" >
<form id="profile-edit-form" name="form1" action="profiles/$profile_id" method="post" >
diff --git a/view/profile_vcard.tpl b/view/profile_vcard.tpl
index 3cd96eabf..86655951d 100644
--- a/view/profile_vcard.tpl
+++ b/view/profile_vcard.tpl
@@ -24,3 +24,5 @@ $marital
$homepage
+$diaspora
+
diff --git a/view/pt-br/messages.po b/view/pt-br/messages.po
index c46770539..af52d6925 100644
--- a/view/pt-br/messages.po
+++ b/view/pt-br/messages.po
@@ -3416,7 +3416,7 @@ msgstr "segundos"
#: ../../include/datetime.php:164
msgid " ago"
-msgstr "atrás"
+msgstr " atrás"
#: ../../include/poller.php:380
msgid "From: "
diff --git a/view/pt-br/strings.php b/view/pt-br/strings.php
index 0e096cf96..4df793041 100644
--- a/view/pt-br/strings.php
+++ b/view/pt-br/strings.php
@@ -757,7 +757,7 @@ $a->strings["minute"] = "minuto";
$a->strings["minutes"] = "minutos";
$a->strings["second"] = "segundo";
$a->strings["seconds"] = "segundos";
-$a->strings[" ago"] = "atrás";
+$a->strings[" ago"] = " atrás";
$a->strings["From: "] = "De: ";
$a->strings["Image/photo"] = "Imagem/foto";
$a->strings["Cannot locate DNS info for database server '%s'"] = "Não foi possível localizar a informação de DNS para o servidor de banco de dados '%s'";
diff --git a/view/register.tpl b/view/register.tpl
index 16e8ba767..8ce1d20ac 100644
--- a/view/register.tpl
+++ b/view/register.tpl
@@ -57,5 +57,6 @@
<div id="register-submit-end" ></div>
</form>
-<div class="cc-license">$license</div>
+$license
+
diff --git a/view/theme/duepuntozero/style.css b/view/theme/duepuntozero/style.css
index e2b1a57dc..5943e5061 100644
--- a/view/theme/duepuntozero/style.css
+++ b/view/theme/duepuntozero/style.css
@@ -45,7 +45,7 @@ code {
border: 1px solid #444;
background: #EEE;
color: #444;
- padding: 0px 10px 10px 10px;
+ padding: 10px;
margin-top: 20px;
}
/*blockquote:before {
@@ -539,13 +539,12 @@ input#dfrn-url {
width: 300px;
}
-#profile-edit-drop-link-wrapper {
- float: left;
-}
#profile-edit-links-end {
clear: both;
+ margin-bottom: 15px;
}
+
.profile-listing-photo {
border: none;
}
@@ -1487,6 +1486,7 @@ input#dfrn-url {
height: 20px;
color:#cccccc;
border: 1px solid #cccccc;
+ padding: 3px 0px 0px 5px;
}
diff --git a/view/xrd_host.tpl b/view/xrd_host.tpl
index c6184e306..f1d9707d5 100644
--- a/view/xrd_host.tpl
+++ b/view/xrd_host.tpl
@@ -2,7 +2,7 @@
<XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'
xmlns:hm='http://host-meta.net/xrd/1.0'>
- <hm:Host>$domain</hm:Host>
+ <hm:Host>$zroot</hm:Host>
<Link rel='lrdd' template='$domain/xrd/?uri={uri}' />
<Link rel='acct-mgmt' href='$domain/amcd' />
diff --git a/view/xrd_person.tpl b/view/xrd_person.tpl
index 0dabaa5a3..fd11ad600 100644
--- a/view/xrd_person.tpl
+++ b/view/xrd_person.tpl
@@ -15,7 +15,7 @@
href="$profile_url" />
<Link rel="http://microformats.org/profile/hcard"
type="text/html"
- href="$profile_url" />
+ href="$hcard_url" />
<Link rel="http://webfinger.net/rel/avatar"
type="image/jpeg"
href="$photo" />