Browse Source

Merge remote-tracking branch 'upstream/develop' into 1505-ostatus

pull/1630/head
Michael Vogel 6 years ago
parent
commit
594f3e2815
21 changed files with 1857 additions and 1386 deletions
  1. +69
    -24
      include/diaspora.php
  2. +89
    -7
      include/items.php
  3. +85
    -22
      include/ostatus_conversation.php
  4. +9
    -7
      mod/allfriends.php
  5. +9
    -7
      mod/common.php
  6. +6
    -5
      mod/crepair.php
  7. +13
    -4
      mod/events.php
  8. +9
    -4
      mod/photos.php
  9. +2
    -2
      mod/search.php
  10. +91
    -19
      mod/videos.php
  11. +167
    -159
      util/messages.po
  12. +927
    -901
      view/cs/messages.po
  13. +13
    -8
      view/cs/strings.php
  14. +8
    -5
      view/templates/vcard-widget.tpl
  15. +6
    -0
      view/templates/video_top.tpl
  16. +81
    -59
      view/theme/duepuntozero/style.css
  17. +21
    -0
      view/theme/quattro/dark/style.css
  18. +21
    -0
      view/theme/quattro/green/style.css
  19. +21
    -0
      view/theme/quattro/lilac/style.css
  20. +161
    -125
      view/theme/quattro/quattro.less
  21. +49
    -28
      view/theme/vier/style.css

+ 69
- 24
include/diaspora.php View File

@ -785,12 +785,21 @@ function diaspora_is_redmatrix($url) {
}
function diaspora_plink($addr, $guid) {
$r = q("SELECT `url`, `nick` FROM `fcontact` WHERE `addr`='%s' LIMIT 1", $addr);
$r = q("SELECT `url`, `nick`, `network` FROM `fcontact` WHERE `addr`='%s' LIMIT 1", $addr);
// Fallback
if (!$r)
return 'https://'.substr($addr,strpos($addr,'@')+1).'/posts/'.$guid;
// Friendica contacts are often detected as Diaspora contacts in the "fcontact" table
// So we try another way as well.
$s = q("SELECT `network` FROM `gcontact` WHERE `nurl`='%s' LIMIT 1", dbesc(normalise_link($r[0]["url"])));
if ($s)
$r[0]["network"] = $s[0]["network"];
if ($r[0]["network"] == NETWORK_DFRN)
return(str_replace("/profile/".$r[0]["nick"]."/", "/display/".$guid, $r[0]["url"]."/"));
if (diaspora_is_redmatrix($r[0]["url"]))
return $r[0]["url"]."/?f=&mid=".$guid;
@ -833,12 +842,19 @@ function diaspora_post($importer,$xml,$msg) {
$body = diaspora2bb($xml->raw_message);
// Add OEmbed and other information to the body
if (!diaspora_is_redmatrix($contact['url']))
$body = add_page_info_to_body($body, false, true);
$datarray = array();
$datarray["object"] = json_encode($xml);
if($xml->photo->remote_photo_path AND $xml->photo->remote_photo_name)
$datarray["object-type"] = ACTIVITY_OBJ_PHOTO;
else {
$datarray['object-type'] = ACTIVITY_OBJ_NOTE;
// Add OEmbed and other information to the body
if (!diaspora_is_redmatrix($contact['url']))
$body = add_page_info_to_body($body, false, true);
}
$str_tags = '';
$cnt = preg_match_all('/@\[url=(.*?)\[\/url\]/ism',$body,$matches,PREG_SET_ORDER);
@ -872,7 +888,10 @@ function diaspora_post($importer,$xml,$msg) {
$datarray['author-avatar'] = $contact['thumb'];
$datarray['body'] = $body;
$datarray['tag'] = $str_tags;
$datarray['app'] = 'Diaspora';
if ($xml->provider_display_name)
$datarray["app"] = unxmlify($xml->provider_display_name);
else
$datarray['app'] = 'Diaspora';
// if empty content it might be a photo that hasn't arrived yet. If a photo arrives, we'll make it visible.
@ -921,6 +940,8 @@ function diaspora_store_by_guid($guid, $server, $uid = 0) {
$author = $item["author"];
$guid = $item["guid"];
$private = $item["private"];
$object = $item["object"];
$objecttype = $item["object-type"];
$message_id = $author.':'.$guid;
$r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1",
@ -954,6 +975,8 @@ function diaspora_store_by_guid($guid, $server, $uid = 0) {
$datarray['tag'] = $str_tags;
$datarray['app'] = $app;
$datarray['visible'] = ((strlen($body)) ? 1 : 0);
$datarray['object'] = $object;
$datarray['object-type'] = $objecttype;
if ($datarray['contact-id'] == 0)
return false;
@ -1001,11 +1024,14 @@ function diaspora_fetch_message($guid, $server, $level = 0) {
$item["guid"] = unxmlify($source_xml->post->status_message->guid);
$item["private"] = (unxmlify($source_xml->post->status_message->public) == 'false');
$item["object"] = json_encode($source_xml->post);
if(strlen($source_xml->post->asphoto->objectId) && ($source_xml->post->asphoto->objectId != 0) && ($source_xml->post->asphoto->image_url)) {
$item["object-type"] = ACTIVITY_OBJ_PHOTO;
$body = '[url=' . notags(unxmlify($source_xml->post->asphoto->image_url)) . '][img]' . notags(unxmlify($source_xml->post->asphoto->objectId)) . '[/img][/url]' . "\n";
$body = scale_external_images($body,false);
} elseif($source_xml->post->asphoto->image_url) {
$item["object-type"] = ACTIVITY_OBJ_PHOTO;
$body = '[img]' . notags(unxmlify($source_xml->post->asphoto->image_url)) . '[/img]' . "\n";
$body = scale_external_images($body);
} elseif($source_xml->post->status_message) {
@ -1015,18 +1041,25 @@ function diaspora_fetch_message($guid, $server, $level = 0) {
if($source_xml->post->status_message->photo->remote_photo_path AND
$source_xml->post->status_message->photo->remote_photo_name) {
$item["object-type"] = ACTIVITY_OBJ_PHOTO;
$remote_photo_path = notags(unxmlify($source_xml->post->status_message->photo->remote_photo_path));
$remote_photo_name = notags(unxmlify($source_xml->post->status_message->photo->remote_photo_name));
$body = '[img]'.$remote_photo_path.$remote_photo_name.'[/img]'."\n".$body;
logger('embedded picture link found: '.$body, LOGGER_DEBUG);
}
} else
$item["object-type"] = ACTIVITY_OBJ_NOTE;
$body = scale_external_images($body);
// Add OEmbed and other information to the body
$body = add_page_info_to_body($body, false, true);
// To-Do: It could be a repeated redmatrix item
// Then we shouldn't add further data to it
if ($item["object-type"] == ACTIVITY_OBJ_NOTE)
$body = add_page_info_to_body($body, false, true);
} elseif($source_xml->post->reshare) {
// Reshare of a reshare
return diaspora_fetch_message($source_xml->post->reshare->root_guid, $server, ++$level);
@ -1081,16 +1114,17 @@ function diaspora_reshare($importer,$xml,$msg) {
$orig_author = notags(unxmlify($xml->root_diaspora_id));
$orig_guid = notags(unxmlify($xml->root_guid));
$orig_url = $a->get_baseurl()."/display/".$orig_guid;
$create_original_post = false;
// Do we already have this item?
$r = q("SELECT `body`, `tag`, `app`, `created`, `author-link`, `plink` FROM `item` WHERE `guid` = '%s' AND `visible` AND NOT `deleted` AND `body` != '' LIMIT 1",
$r = q("SELECT `body`, `tag`, `app`, `created`, `plink`, `object`, `object-type`, `uri` FROM `item` WHERE `guid` = '%s' AND `visible` AND NOT `deleted` AND `body` != '' LIMIT 1",
dbesc($orig_guid),
dbesc(NETWORK_DIASPORA)
);
if(count($r)) {
logger('reshared message '.$orig_guid." reshared by ".$guid.' already exists on system: '.$orig_url);
logger('reshared message '.$orig_guid." reshared by ".$guid.' already exists on system.');
// Maybe it is already a reshared item?
// Then refetch the content, since there can be many side effects with reshared posts from other networks or reshares from reshares
@ -1102,9 +1136,10 @@ function diaspora_reshare($importer,$xml,$msg) {
$str_tags = $r[0]["tag"];
$app = $r[0]["app"];
$orig_created = $r[0]["created"];
$orig_author = $r[0]["author-link"];
$create_original_post = ($body != "");
$orig_url = $a->get_baseurl()."/display/".$orig_guid;
$orig_plink = $r[0]["plink"];
$orig_uri = $r[0]["uri"];
$object = $r[0]["object"];
$objecttype = $r[0]["object-type"];
}
}
@ -1113,8 +1148,6 @@ function diaspora_reshare($importer,$xml,$msg) {
$str_tags = "";
$app = "";
$orig_url = 'https://'.substr($orig_author,strpos($orig_author,'@')+1).'/posts/'.$orig_guid;
$server = 'https://'.substr($orig_author,strpos($orig_author,'@')+1);
logger('1st try: reshared message '.$orig_guid." reshared by ".$guid.' will be fetched from original server: '.$server);
$item = diaspora_fetch_message($orig_guid, $server);
@ -1142,11 +1175,16 @@ function diaspora_reshare($importer,$xml,$msg) {
$orig_created = $item["created"];
$orig_author = $item["author"];
$orig_guid = $item["guid"];
$orig_plink = diaspora_plink($orig_author, $orig_guid);
$orig_uri = $orig_author.':'.$orig_guid;
$create_original_post = ($body != "");
$orig_url = $a->get_baseurl()."/display/".$orig_guid;
$object = $item["object"];
$objecttype = $item["object-type"];
}
}
$plink = diaspora_plink($diaspora_handle, $guid);
$person = find_diaspora_person_by_handle($orig_author);
$created = unxmlify($xml->created_at);
@ -1154,8 +1192,6 @@ function diaspora_reshare($importer,$xml,$msg) {
$datarray = array();
$plink = diaspora_plink($diaspora_handle, $guid);
$datarray['uid'] = $importer['uid'];
$datarray['contact-id'] = $contact['id'];
$datarray['wall'] = 0;
@ -1184,6 +1220,9 @@ function diaspora_reshare($importer,$xml,$msg) {
$datarray['body'] = $body;
}
$datarray["object"] = json_encode($xml);
$datarray['object-type'] = $objecttype;
$datarray['tag'] = $str_tags;
$datarray['app'] = $app;
@ -1199,9 +1238,10 @@ function diaspora_reshare($importer,$xml,$msg) {
$datarray2['uid'] = 0;
$datarray2['contact-id'] = get_contact($person['url'], 0);
$datarray2['guid'] = $orig_guid;
$datarray2['uri'] = $datarray2['parent-uri'] = $orig_author.':'.$orig_guid;
$datarray2['uri'] = $datarray2['parent-uri'] = $orig_uri;
$datarray2['changed'] = $datarray2['created'] = $datarray2['edited'] = $datarray2['commented'] = $datarray2['received'] = datetime_convert('UTC','UTC',$orig_created);
$datarray2['plink'] = diaspora_plink($orig_author, $orig_guid);
$datarray2['parent'] = 0;
$datarray2['plink'] = $orig_plink;
$datarray2['author-name'] = $person['name'];
$datarray2['author-link'] = $person['url'];
@ -1210,6 +1250,7 @@ function diaspora_reshare($importer,$xml,$msg) {
$datarray2['owner-link'] = $datarray2['author-link'];
$datarray2['owner-avatar'] = $datarray2['author-avatar'];
$datarray2['body'] = $body;
$datarray2["object"] = $object;
DiasporaFetchGuid($datarray2);
$message_id = item_store($datarray2);
@ -1295,6 +1336,8 @@ function diaspora_asphoto($importer,$xml,$msg) {
$datarray['author-link'] = $contact['url'];
$datarray['author-avatar'] = $contact['thumb'];
$datarray['body'] = $body;
$datarray["object"] = json_encode($xml);
$datarray['object-type'] = ACTIVITY_OBJ_PHOTO;
$datarray['app'] = 'Diaspora/Cubbi.es';
@ -1464,6 +1507,8 @@ function diaspora_comment($importer,$xml,$msg) {
$datarray['author-link'] = $person['url'];
$datarray['author-avatar'] = ((x($person,'thumb')) ? $person['thumb'] : $person['photo']);
$datarray['body'] = $body;
$datarray["object"] = json_encode($xml);
$datarray["object-type"] = ACTIVITY_OBJ_COMMENT;
// We can't be certain what the original app is if the message is relayed.
if(($parent_item['origin']) && (! $parent_author_signature))
@ -1790,7 +1835,7 @@ function diaspora_message($importer,$xml,$msg) {
dbesc($person['name']),
dbesc($person['photo']),
dbesc($person['url']),
intval($contact['id']),
intval($contact['id']),
dbesc($conversation['subject']),
dbesc($body),
0,
@ -2059,7 +2104,7 @@ function diaspora_like($importer,$xml,$msg) {
$activity = ACTIVITY_LIKE;
$post_type = (($parent_item['resource-id']) ? t('photo') : t('status'));
$objtype = (($parent_item['resource-id']) ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
$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'];
@ -2878,7 +2923,7 @@ function diaspora_send_retraction($item,$owner,$contact,$public_batch = false) {
$target_type = (($item['verb'] === ACTIVITY_LIKE) ? 'Like' : 'Comment');
}
else {
$tpl = get_markup_template('diaspora_signed_retract.tpl');
$target_type = 'StatusMessage';
}
@ -2924,7 +2969,7 @@ function diaspora_send_mail($item,$owner,$contact) {
$body = bb2diaspora($item['body']);
$created = datetime_convert('UTC','UTC',$item['created'],'Y-m-d H:i:s \U\T\C');
$signed_text = $item['guid'] . ';' . $cnv['guid'] . ';' . $body . ';'
. $created . ';' . $myaddr . ';' . $cnv['guid'];


+ 89
- 7
include/items.php View File

@ -464,12 +464,27 @@ function get_atom_elements($feed, $item, $contact = array()) {
// look for a photo. We should check media size and find the best one,
// but for now let's just find any author photo
// Additionally we look for an alternate author link. On OStatus this one is the one we want.
// Search for ostatus conversation url
$authorlinks = $item->feed->data["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["feed"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["author"][0]["child"]["http://www.w3.org/2005/Atom"]["link"];
if (is_array($authorlinks)) {
foreach ($authorlinks as $link) {
$linkdata = array_shift($link["attribs"]);
if ($linkdata["rel"] == "alternate")
$res["author-link"] = $linkdata["href"];
};
}
$rawauthor = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'author');
if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) {
$base = $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link'];
foreach($base as $link) {
if($link['attribs']['']['rel'] === 'alternate')
$res['author-link'] = unxmlify($link['attribs']['']['href']);
if(!x($res, 'author-avatar') || !$res['author-avatar']) {
if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar')
$res['author-avatar'] = unxmlify($link['attribs']['']['href']);
@ -828,7 +843,7 @@ function get_atom_elements($feed, $item, $contact = array()) {
logger('get_atom_elements: Looking for status.net repeated message');
$message = $child["http://activitystrea.ms/spec/1.0/"]["object"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["content"][0]["data"];
$orig_uri = $child["http://activitystrea.ms/spec/1.0/"]["object"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["id"][0]["data"];
$orig_id = ostatus_convert_href($child["http://activitystrea.ms/spec/1.0/"]["object"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["id"][0]["data"]);
$author = $child[SIMPLEPIE_NAMESPACE_ATOM_10]["author"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10];
$uri = $author["uri"][0]["data"];
$name = $author["name"][0]["data"];
@ -836,10 +851,10 @@ function get_atom_elements($feed, $item, $contact = array()) {
$avatar = $avatar["href"];
if (($name != "") and ($uri != "") and ($avatar != "") and ($message != "")) {
logger('get_atom_elements: fixing sender of repeated message.');
logger('get_atom_elements: fixing sender of repeated message. '.$orig_id, LOGGER_DEBUG);
if (!intval(get_config('system','wall-to-wall_share'))) {
$prefix = share_header($name, $uri, $avatar, "", "", $orig_uri);
$prefix = share_header($name, $uri, $avatar, "", "", $orig_link);
$res["body"] = $prefix.html2bbcode($message)."[/share]";
} else {
@ -864,8 +879,11 @@ function get_atom_elements($feed, $item, $contact = array()) {
$conversation = array_shift($link["attribs"]);
if ($conversation["rel"] == "ostatus:conversation") {
$res["ostatus_conversation"] = $conversation["href"];
$res["ostatus_conversation"] = ostatus_convert_href($conversation["href"]);
logger('get_atom_elements: found conversation url '.$res["ostatus_conversation"]);
} elseif ($conversation["rel"] == "alternate") {
$res["plink"] = $conversation["href"];
logger('get_atom_elements: found plink '.$res["plink"]);
}
};
}
@ -1090,6 +1108,14 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
unset($arr['dsprsig']);
}
// Converting the plink
if ($arr['network'] == NETWORK_OSTATUS) {
if (isset($arr['plink']))
$arr['plink'] = ostatus_convert_href($arr['plink']);
elseif (isset($arr['uri']))
$arr['plink'] = ostatus_convert_href($arr['uri']);
}
// if an OStatus conversation url was passed in, it is stored and then
// removed from the array.
$ostatus_conversation = null;
@ -1115,7 +1141,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
/* check for create date and expire time */
$uid = intval($arr['uid']);
$r = q("SELECT expire FROM user WHERE uid = %d", $uid);
$r = q("SELECT expire FROM user WHERE uid = %d", intval($uid));
if(count($r)) {
$expire_interval = $r[0]['expire'];
if ($expire_interval>0) {
@ -1141,6 +1167,19 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
}
}
// If there is no guid then take the same guid that was taken before for the same plink
if ((trim($arr['guid']) == "") AND (trim($arr['plink']) != "")) {
logger('item_store: checking for an existing guid for plink '.$arr['plink'], LOGGER_DEBUG);
$r = q("SELECT `guid` FROM `item` WHERE `plink` = '%s' AND `guid` != '' LIMIT 1",
dbesc(trim($arr['plink']))
);
if(count($r)) {
$arr['guid'] = $r[0]["guid"];
logger('item_store: found guid '.$arr['guid'].' for plink '.$arr['plink'], LOGGER_DEBUG);
}
}
// Shouldn't happen but we want to make absolutely sure it doesn't leak from a plugin.
// Deactivated, since the bbcode parser can handle with it - and it destroys posts with some smileys that contain "<"
//if((strpos($arr['body'],'<') !== false) || (strpos($arr['body'],'>') !== false))
@ -1347,12 +1386,36 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
}
}
$r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
$r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `network` = '%s' AND `uid` = %d LIMIT 1",
dbesc($arr['uri']),
dbesc($arr['network']),
intval($arr['uid'])
);
if($r && count($r)) {
logger('item-store: duplicate item ignored. ' . print_r($arr,true));
logger('duplicated item with the same uri found. ' . print_r($arr,true));
return 0;
}
$r = q("SELECT `id` FROM `item` WHERE `plink` = '%s' AND `network` = '%s' AND `uid` = %d LIMIT 1",
dbesc($arr['plink']),
dbesc($arr['network']),
intval($arr['uid'])
);
if($r && count($r)) {
logger('duplicated item with the same plink found. ' . print_r($arr,true));
return 0;
}
// Check for an existing post with the same content. There seems to be a problem with OStatus.
$r = q("SELECT `id` FROM `item` WHERE `body` = '%s' AND `network` = '%s' AND `created` = '%s' AND `contact-id` = %d AND `uid` = %d LIMIT 1",
dbesc($arr['body']),
dbesc($arr['network']),
dbesc($arr['created']),
intval($arr['contact-id']),
intval($arr['uid'])
);
if($r && count($r)) {
logger('duplicated item with the same body found. ' . print_r($arr,true));
return 0;
}
@ -2167,6 +2230,12 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
return;
}
// Test - remove before flight
// if ($contact['network'] === NETWORK_OSTATUS) {
// $tempfile = tempnam(get_temppath(), "ostatus");
// file_put_contents($tempfile, $xml);
// }
$feed = new SimplePie();
$feed->set_raw_data($xml);
if($datedir)
@ -4745,6 +4814,18 @@ function drop_item($id,$interactive = true) {
// ignore the result
}
// If item has attachments, drop them
foreach(explode(",",$item['attach']) as $attach){
preg_match("|attach/(\d+)|", $attach, $matches);
q("DELETE FROM `attach` WHERE `id` = %d AND `uid` = %d",
intval($matches[1]),
local_user()
);
// ignore the result
}
// clean up item_id and sign meta-data tables
/*
@ -4821,6 +4902,7 @@ function drop_item($id,$interactive = true) {
// Add a relayable_retraction signature for Diaspora.
store_diaspora_retract_sig($item, $a->user, $a->get_baseurl());
}
$drop_id = intval($item['id']);
// send the notification upstream/downstream as the case may be


+ 85
- 22
include/ostatus_conversation.php View File

@ -1,8 +1,33 @@
<?php
require_once("include/Contact.php");
define('OSTATUS_DEFAULT_POLL_INTERVAL', 30); // given in minutes
define('OSTATUS_DEFAULT_POLL_TIMEFRAME', 1440); // given in minutes
function check_conversations() {
function ostatus_convert_href($href) {
$elements = explode(":",$href);
if ((count($elements) <= 2) OR ($elements[0] != "tag"))
return $href;
$server = explode(",", $elements[1]);
$conversation = explode("=", $elements[2]);
if ((count($elements) == 4) AND ($elements[2] == "post"))
return "http://".$server[0]."/notice/".$elements[3];
if ((count($conversation) != 2) OR ($conversation[1] ==""))
return $href;
if ($elements[3] == "objectType=thread")
return "http://".$server[0]."/conversation/".$conversation[1];
else
return "http://".$server[0]."/notice/".$conversation[1];
return $href;
}
function check_conversations($override = false) {
$last = get_config('system','ostatus_last_poll');
$poll_interval = intval(get_config('system','ostatus_poll_interval'));
@ -10,16 +35,16 @@ function check_conversations() {
$poll_interval = OSTATUS_DEFAULT_POLL_INTERVAL;
// Don't poll if the interval is set negative
if ($poll_interval < 0)
if (($poll_interval < 0) AND !$override)
return;
$poll_timeframe = intval(get_config('system','ostatus_poll_timeframe'));
if(! $poll_timeframe)
if (!$poll_timeframe)
$poll_timeframe = OSTATUS_DEFAULT_POLL_TIMEFRAME;
if($last) {
if ($last AND !$override) {
$next = $last + ($poll_interval * 60);
if($next > time()) {
if ($next > time()) {
logger('poll interval not reached');
return;
}
@ -36,7 +61,7 @@ function check_conversations() {
complete_conversation($id, $url);
}
logger(' cron_end');
logger('cron_end');
set_config('system','ostatus_last_poll', time());
}
@ -44,6 +69,8 @@ function check_conversations() {
function complete_conversation($itemid, $conversation_url, $only_add_conversation = false) {
global $a;
$conversation_url = ostatus_convert_href($conversation_url);
if (intval(get_config('system','ostatus_poll_interval')) == -2)
return;
@ -107,12 +134,16 @@ function complete_conversation($itemid, $conversation_url, $only_add_conversatio
$items = array_reverse($items);
foreach ($items as $single_conv) {
// status.net changed the format of the activity streams. This is a quick fix.
if (@is_string($single_conv->object->id))
if (isset($single_conv->object->id))
$single_conv->id = $single_conv->object->id;
if (@!$single_conv->id AND $single_conv->provider->url AND $single_conv->statusnet_notice_info->local_id)
$single_conv->id = $single_conv->provider->url."notice/".$single_conv->statusnet_notice_info->local_id;
logger("Got id ".$single_conv->id, LOGGER_DEBUG);
$plink = ostatus_convert_href($single_conv->id);
if (isset($single_conv->object->url))
$plink = ostatus_convert_href($single_conv->object->url);
logger("Got url ".$plink, LOGGER_DEBUG);
if (@!$single_conv->id)
continue;
@ -120,8 +151,9 @@ function complete_conversation($itemid, $conversation_url, $only_add_conversatio
if ($first_id == "") {
$first_id = $single_conv->id;
$new_parents = q("SELECT `id`, `uri`, `contact-id`, `type`, `verb`, `visible` FROM `item` WHERE `uid` = %d AND `uri` = '%s' LIMIT 1",
intval($message["uid"]), dbesc($first_id));
$new_parents = q("SELECT `id`, `uri`, `contact-id`, `type`, `verb`, `visible` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `network` IN ('%s','%s') LIMIT 1",
intval($message["uid"]), dbesc($first_id),
dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DFRN));
if ($new_parents) {
$parent = $new_parents[0];
logger('adopting new parent '.$parent["id"].' for '.$itemid);
@ -136,12 +168,21 @@ function complete_conversation($itemid, $conversation_url, $only_add_conversatio
else
$parent_uri = $parent["uri"];
$message_exists = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' LIMIT 1",
intval($message["uid"]), dbesc($single_conv->id));
$message_exists = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `plink` = '%s' AND `network` IN ('%s','%s') LIMIT 1",
intval($message["uid"]), dbesc($plink),
dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DFRN));
if (!$message_exists)
$message_exists = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `network` IN ('%s','%s') LIMIT 1",
intval($message["uid"]), dbesc($single_conv->id),
dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DFRN));
if ($message_exists) {
if ($parent["id"] != 0) {
$existing_message = $message_exists[0];
logger('updating id '.$existing_message["id"].' to parent '.$parent["id"].' uri '.$parent["uri"].' thread '.$parent_uri, LOGGER_DEBUG);
// This is partly bad, since the entry in the thread table isn't updated
$r = q("UPDATE `item` SET `parent` = %d, `parent-uri` = '%s', `thr-parent` = '%s' WHERE `id` = %d",
intval($parent["id"]),
@ -152,21 +193,32 @@ function complete_conversation($itemid, $conversation_url, $only_add_conversatio
continue;
}
$actor = $single_conv->actor->id;
if (isset($single_conv->actor->url))
$actor = $single_conv->actor->url;
$contact = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' AND `network` != '%s'",
$message["uid"], normalise_link($single_conv->actor->id), NETWORK_STATUSNET);
$message["uid"], normalise_link($actor), NETWORK_STATUSNET);
if (count($contact)) {
logger("Found contact for url ".$single_conv->actor->id, LOGGER_DEBUG);
logger("Found contact for url ".$actor, LOGGER_DEBUG);
$contact_id = $contact[0]["id"];
} else {
logger("No contact found for url ".$single_conv->actor->id, LOGGER_DEBUG);
logger("No contact found for url ".$actor, LOGGER_DEBUG);
// Adding a global contact
// To-Do: Use this data for the post
$global_contact_id = get_contact($actor, 0);
logger("Global contact ".$global_contact_id." found for url ".$actor, LOGGER_DEBUG);
$contact_id = $parent["contact-id"];
}
$arr = array();
$arr["network"] = NETWORK_OSTATUS;
$arr["uri"] = $single_conv->id;
$arr["plink"] = $single_conv->id;
$arr["plink"] = $plink;
$arr["uid"] = $message["uid"];
$arr["contact-id"] = $contact_id;
if ($parent["id"] != 0)
@ -182,17 +234,26 @@ function complete_conversation($itemid, $conversation_url, $only_add_conversatio
if ($arr["owner-name"] == '')
$arr["owner-name"] = $single_conv->actor->displayName;
$arr["owner-link"] = $single_conv->actor->id;
$arr["owner-link"] = $actor;
$arr["owner-avatar"] = $single_conv->actor->image->url;
//$arr["author-name"] = $single_conv->actor->contact->displayName;
//$arr["author-name"] = $single_conv->actor->contact->preferredUsername;
$arr["author-name"] = $arr["owner-name"];
$arr["author-link"] = $single_conv->actor->id;
$arr["author-link"] = $actor;
$arr["author-avatar"] = $single_conv->actor->image->url;
$arr["body"] = html2bbcode($single_conv->content);
$arr["app"] = strip_tags($single_conv->statusnet_notice_info->source);
if ($arr["app"] == "")
if (isset($single_conv->status_net->notice_info->source))
$arr["app"] = strip_tags($single_conv->status_net->notice_info->source);
elseif (isset($single_conv->statusnet->notice_info->source))
$arr["app"] = strip_tags($single_conv->statusnet->notice_info->source);
elseif (isset($single_conv->statusnet_notice_info->source))
$arr["app"] = strip_tags($single_conv->statusnet_notice_info->source);
elseif (isset($single_conv->provider->displayName))
$arr["app"] = $single_conv->provider->displayName;
else
$arr["app"] = "OStatus";
$arr["verb"] = $parent["verb"];
$arr["visible"] = $parent["visible"];
$arr["location"] = $single_conv->location->displayName;
@ -206,6 +267,8 @@ function complete_conversation($itemid, $conversation_url, $only_add_conversatio
$newitem = item_store($arr);
logger('Stored new item '.$plink.' under id '.$newitem, LOGGER_DEBUG);
// Add the conversation entry (but don't fetch the whole conversation)
complete_conversation($newitem, $conversation_url, true);


+ 9
- 7
mod/allfriends.php View File

@ -20,13 +20,15 @@ function allfriends_content(&$a) {
intval(local_user())
);
$a->page['aside'] .= '<div class="vcard">'
. '<div class="fn label">' . $c[0]['name'] . '</div>'
. '<div id="profile-photo-wrapper">'
. '<a href="/contacts/' . $cid . '"><img class="photo" width="175" height="175"
src="' . $c[0]['photo'] . '" alt="' . $c[0]['name'] . '" /></div>'
. '</div>';
$vcard_widget .= replace_macros(get_markup_template("vcard-widget.tpl"),array(
'$name' => $c[0]['name'],
'$photo' => $c[0]['photo'],
'url' => z_root() . '/contacts/' . $cid
));
if(! x($a->page,'aside'))
$a->page['aside'] = '';
$a->page['aside'] .= $vcard_widget;
if(! count($c))
return;


+ 9
- 7
mod/common.php View File

@ -28,13 +28,15 @@ function common_content(&$a) {
);
}
$a->page['aside'] .= '<div class="vcard">'
. '<div class="fn label">' . $c[0]['name'] . '</div>'
. '<div id="profile-photo-wrapper">'
. '<img class="photo" width="175" height="175"
src="' . $c[0]['photo'] . '" alt="' . $c[0]['name'] . '" /></div>'
. '</div>';
$vcard_widget .= replace_macros(get_markup_template("vcard-widget.tpl"),array(
'$name' => $c[0]['name'],
'$photo' => $c[0]['photo'],
'url' => z_root() . '/contacts/' . $cid
));
if(! x($a->page,'aside'))
$a->page['aside'] = '';
$a->page['aside'] .= $vcard_widget;
if(! count($c))
return;


+ 6
- 5
mod/crepair.php View File

@ -22,11 +22,12 @@ function crepair_init(&$a) {
if($contact_id) {
$a->data['contact'] = $r[0];
$o .= '<div class="vcard">';
$o .= '<div class="fn">' . $a->data['contact']['name'] . '</div>';
$o .= '<div id="profile-photo-wrapper"><img class="photo" style="width: 175px; height: 175px;" src="' . $a->data['contact']['photo'] . '" alt="' . $a->data['contact']['name'] . '" /></div>';
$o .= '</div>';
$a->page['aside'] .= $o;
$tpl = get_markup_template("vcard-widget.tpl");
$vcard_widget .= replace_macros($tpl, array(
'$name' => $a->data['contact']['name'],
'$photo' => $a->data['contact']['photo']
));
$a->page['aside'] .= $vcard_widget;
}
}


+ 13
- 4
mod/events.php View File

@ -59,21 +59,30 @@ function events_post(&$a) {
// and we'll waste a bunch of time responding to it. Time that
// could've been spent doing something else.
if(strcmp($finish,$start) < 0)
$finish = $start;
$summary = escape_tags(trim($_POST['summary']));
$desc = escape_tags(trim($_POST['desc']));
$location = escape_tags(trim($_POST['location']));
$type = 'event';
$action = ($event_id == '') ? 'new' : "event/" . $event_id;
$onerror_url = $a->get_baseurl() . "/events/" . $action . "?summary=$summary&description=$desc&location=$location&start=$start_text&finish=$finish_text&adjust=$adjust&nofinish=$nofinish";
if(strcmp($finish,$start) < 0 && !$nofinish) {
notice( t('Event can not end before it has started.') . EOL);
if(intval($_REQUEST['preview'])) {
echo( t('Event can not end before it has started.'));
killme();
}
goaway($onerror_url);
}
if((! $summary) || (! $start)) {
notice( t('Event title and start time are required.') . EOL);
if(intval($_REQUEST['preview'])) {
echo( t('Event title and start time are required.'));
killme();
}
goaway($a->get_baseurl() . '/events/new');
goaway($onerror_url);
}
$share = ((intval($_POST['share'])) ? intval($_POST['share']) : 0);


+ 9
- 4
mod/photos.php View File

@ -30,10 +30,14 @@ function photos_init(&$a) {
$a->data['user'] = $r[0];
$o .= '<div class="vcard">';
$o .= '<div class="fn">' . $a->data['user']['username'] . '</div>';
$o .= '<div id="profile-photo-wrapper"><img class="photo" style="width: 175px; height: 175px;" src="' . $a->get_cached_avatar_image($a->get_baseurl() . '/photo/profile/' . $a->data['user']['uid'] . '.jpg') . '" alt="' . $a->data['user']['username'] . '" /></div>';
$o .= '</div>';
$profilephoto = $a->get_cached_avatar_image($a->get_baseurl() . '/photo/profile/' . $a->data['user']['uid'] . '.jpg');
$tpl = get_markup_template("vcard-widget.tpl");
$vcard_widget .= replace_macros($tpl, array(
'$name' => $a->data['user']['username'],
'$photo' => $profilephoto
));
$sql_extra = permissions_sql($a->data['user']['uid']);
@ -72,6 +76,7 @@ function photos_init(&$a) {
if(! x($a->page,'aside'))
$a->page['aside'] = '';
$a->page['aside'] .= $vcard_widget;
$a->page['aside'] .= $o;


+ 2
- 2
mod/search.php View File

@ -177,9 +177,9 @@ function search_content(&$a) {
if($tag)
$o .= '<h2>Items tagged with: ' . $search . '</h2>';
$o .= '<h2>' . sprintf( t('Items tagged with: %s'), $search) . '</h2>';
else
$o .= '<h2>Search results for: ' . $search . '</h2>';
$o .= '<h2>' . sprintf( t('Search results for: %s'), $search) . '</h2>';
logger("Start Conversation for '".$search."'", LOGGER_DEBUG);
$o .= conversation($a,$r,'search',false);


+ 91
- 19
mod/videos.php View File

@ -28,10 +28,14 @@ function videos_init(&$a) {
$a->data['user'] = $r[0];
$o .= '<div class="vcard">';
$o .= '<div class="fn">' . $a->data['user']['username'] . '</div>';
$o .= '<div id="profile-photo-wrapper"><img class="photo" style="width: 175px; height: 175px;" src="' . $a->get_cached_avatar_image($a->get_baseurl() . '/photo/profile/' . $a->data['user']['uid'] . '.jpg') . '" alt="' . $a->data['user']['username'] . '" /></div>';
$o .= '</div>';
$profilephoto = $a->get_cached_avatar_image($a->get_baseurl() . '/photo/profile/' . $a->data['user']['uid'] . '.jpg');
$tpl = get_markup_template("vcard-widget.tpl");
$vcard_widget = replace_macros($tpl, array(
'$name' => $a->data['user']['username'],
'$photo' => $profilephoto
));
/*$sql_extra = permissions_sql($a->data['user']['uid']);
@ -43,12 +47,12 @@ function videos_init(&$a) {
if(count($albums)) {
$a->data['albums'] = $albums;
$albums_visible = ((intval($a->data['user']['hidewall']) && (! local_user()) && (! remote_user())) ? false : true);
$albums_visible = ((intval($a->data['user']['hidewall']) && (! local_user()) && (! remote_user())) ? false : true);
if($albums_visible) {
$o .= '<div id="side-bar-photos-albums" class="widget">';
$o .= '<h3>' . '<a href="' . $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '">' . t('Photo Albums') . '</a></h3>';
$o .= '<ul>';
foreach($albums as $album) {
@ -57,7 +61,7 @@ function videos_init(&$a) {
if((! strlen($album['album'])) || ($album['album'] === 'Contact Photos') || ($album['album'] === t('Contact Photos')))
continue;
$o .= '<li>' . '<a href="photos/' . $a->argv[1] . '/album/' . bin2hex($album['album']) . '" >' . $album['album'] . '</a></li>';
$o .= '<li>' . '<a href="photos/' . $a->argv[1] . '/album/' . bin2hex($album['album']) . '" >' . $album['album'] . '</a></li>';
}
$o .= '</ul>';
}
@ -70,7 +74,7 @@ function videos_init(&$a) {
if(! x($a->page,'aside'))
$a->page['aside'] = '';
$a->page['aside'] .= $o;
$a->page['aside'] .= $vcard_widget;
$tpl = get_markup_template("videos_head.tpl");
@ -92,9 +96,76 @@ function videos_init(&$a) {
function videos_post(&$a) {
return;
$owner_uid = $a->data['user']['uid'];
if (local_user() != $owner_uid) goaway($a->get_baseurl() . '/videos/' . $a->data['user']['nickname']);
if(($a->argc == 2) && x($_POST,'delete') && x($_POST, 'id')) {
// Check if we should do HTML-based delete confirmation
if(!x($_REQUEST,'confirm')) {
if(x($_REQUEST,'canceled')) goaway($a->get_baseurl() . '/videos/' . $a->data['user']['nickname']);
$drop_url = $a->query_string;
$a->page['content'] = replace_macros(get_markup_template('confirm.tpl'), array(
'$method' => 'post',
'$message' => t('Do you really want to delete this video?'),
'$extra_inputs' => [
['name'=>'id', 'value'=> $_POST['id']],
['name'=>'delete', 'value'=>'x']
],
'$confirm' => t('Delete Video'),
'$confirm_url' => $drop_url,
'$confirm_name' => 'confirm', // Needed so that confirmation will bring us back into this if statement
'$cancel' => t('Cancel'),
));
$a->error = 1; // Set $a->error so the other module functions don't execute
return;
}
$video_id = $_POST['id'];
$r = q("SELECT `id` FROM `attach` WHERE `uid` = %d AND `id` = '%s' LIMIT 1",
intval(local_user()),
dbesc($video_id)
);
if(count($r)) {
q("DELETE FROM `attach` WHERE `uid` = %d AND `id` = '%s'",
intval(local_user()),
dbesc($video_id)
);
$i = q("SELECT * FROM `item` WHERE `attach` like '%%attach/%s%%' AND `uid` = %d LIMIT 1",
dbesc($video_id),
intval(local_user())
);
#echo "<pre>"; var_dump($i); killme();
if(count($i)) {
q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d",
dbesc(datetime_convert()),
dbesc(datetime_convert()),
dbesc($i[0]['uri']),
intval(local_user())
);
create_tags_from_itemuri($i[0]['uri'], local_user());
delete_thread_uri($i[0]['uri'], local_user());
$url = $a->get_baseurl();
$drop_id = intval($i[0]['id']);
if($i[0]['visible'])
proc_run('php',"include/notifier.php","drop","$drop_id");
}
}
goaway($a->get_baseurl() . '/videos/' . $a->data['user']['nickname']);
return; // NOTREACHED
}
goaway($a->get_baseurl() . '/videos/' . $a->data['user']['nickname']);
// DELETED -- look at mod/photos.php if you want to implement
}
@ -115,8 +186,8 @@ function videos_content(&$a) {
notice( t('Public access denied.') . EOL);
return;
}
require_once('include/bbcode.php');
require_once('include/security.php');
require_once('include/conversation.php');
@ -131,7 +202,7 @@ function videos_content(&$a) {
$_SESSION['video_return'] = $a->cmd;
//
// Parse arguments
// Parse arguments
//
if($a->argc > 3) {
@ -233,7 +304,7 @@ function videos_content(&$a) {
// tabs
$_is_owner = (local_user() && (local_user() == $owner_uid));
$o .= profile_tabs($a,$_is_owner, $a->data['user']['nickname']);
$o .= profile_tabs($a,$_is_owner, $a->data['user']['nickname']);
//
// dispatch request
@ -251,7 +322,7 @@ function videos_content(&$a) {
return; // no albums for now
// DELETED -- look at mod/photos.php if you want to implement
}
}
if($datatype === 'video') {
@ -307,20 +378,21 @@ function videos_content(&$a) {
'name' => $name_e,
'alt' => t('View Album'),
),
);
}
}
$tpl = get_markup_template('videos_recent.tpl');
$tpl = get_markup_template('videos_recent.tpl');
$o .= replace_macros($tpl, array(
'$title' => t('Recent Videos'),
'$can_post' => $can_post,
'$upload' => array(t('Upload New Videos'), $a->get_baseurl().'/videos/'.$a->data['user']['nickname'].'/upload'),
'$videos' => $videos,
'$delete_url' => (($can_post)?$a->get_baseurl().'/videos/'.$a->data['user']['nickname']:False)
));
$o .= paginate($a);
return $o;
}


+ 167
- 159
util/messages.po View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 3.4.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-05-21 10:43+0200\n"
"POT-Creation-Date: 2015-05-24 10:38+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -29,9 +29,9 @@ msgstr ""
#: ../../mod/photos.php:1084 ../../mod/photos.php:1203
#: ../../mod/photos.php:1514 ../../mod/photos.php:1565
#: ../../mod/photos.php:1609 ../../mod/photos.php:1697
#: ../../mod/invite.php:140 ../../mod/events.php:491 ../../mod/mood.php:137
#: ../../mod/invite.php:140 ../../mod/events.php:500 ../../mod/mood.php:137
#: ../../mod/message.php:335 ../../mod/message.php:564
#: ../../mod/profiles.php:686 ../../mod/install.php:248
#: ../../mod/profiles.php:682 ../../mod/install.php:248
#: ../../mod/install.php:286 ../../mod/crepair.php:190
#: ../../mod/content.php:710 ../../mod/poke.php:199 ../../mod/localtime.php:45
msgid "Submit"
@ -233,7 +233,7 @@ msgid "Your photos"
msgstr ""
#: ../../view/theme/diabook/theme.php:127 ../../boot.php:2156
#: ../../include/nav.php:80 ../../mod/events.php:382
#: ../../include/nav.php:80 ../../mod/events.php:385
msgid "Events"
msgstr ""
@ -260,7 +260,7 @@ msgid "event"
msgstr ""
#: ../../view/theme/diabook/theme.php:466
#: ../../view/theme/diabook/theme.php:475 ../../include/diaspora.php:2060
#: ../../view/theme/diabook/theme.php:475 ../../include/diaspora.php:2061
#: ../../include/conversation.php:121 ../../include/conversation.php:130
#: ../../include/conversation.php:248 ../../include/conversation.php:257
#: ../../mod/like.php:149 ../../mod/like.php:319 ../../mod/subthread.php:87
@ -268,14 +268,14 @@ msgstr ""
msgid "status"
msgstr ""
#: ../../view/theme/diabook/theme.php:471 ../../include/diaspora.php:2060
#: ../../view/theme/diabook/theme.php:471 ../../include/diaspora.php:2061
#: ../../include/conversation.php:126 ../../include/conversation.php:253
#: ../../include/text.php:1995 ../../mod/like.php:149
#: ../../mod/subthread.php:87 ../../mod/tagger.php:62
msgid "photo"
msgstr ""
#: ../../view/theme/diabook/theme.php:480 ../../include/diaspora.php:2076
#: ../../view/theme/diabook/theme.php:480 ../../include/diaspora.php:2077
#: ../../include/conversation.php:137 ../../mod/like.php:166
#, php-format
msgid "%1$s likes %2$s's %3$s"
@ -375,7 +375,7 @@ msgstr ""
msgid "Permission denied"
msgstr ""
#: ../../index.php:382 ../../include/items.php:4838 ../../mod/attach.php:33
#: ../../index.php:382 ../../include/items.php:4851 ../../mod/attach.php:33
#: ../../mod/wallmessage.php:9 ../../mod/wallmessage.php:33
#: ../../mod/wallmessage.php:79 ../../mod/wallmessage.php:103
#: ../../mod/group.php:19 ../../mod/delegate.php:12
@ -389,9 +389,9 @@ msgstr ""
#: ../../mod/notes.php:20 ../../mod/network.php:4 ../../mod/photos.php:134
#: ../../mod/photos.php:1050 ../../mod/follow.php:9 ../../mod/follow.php:39
#: ../../mod/follow.php:78 ../../mod/uimport.php:23 ../../mod/invite.php:15
#: ../../mod/invite.php:101 ../../mod/events.php:152 ../../mod/mood.php:114
#: ../../mod/invite.php:101 ../../mod/events.php:155 ../../mod/mood.php:114
#: ../../mod/message.php:38 ../../mod/message.php:174
#: ../../mod/profiles.php:165 ../../mod/profiles.php:618
#: ../../mod/profiles.php:165 ../../mod/profiles.php:614
#: ../../mod/install.php:151 ../../mod/crepair.php:119 ../../mod/poke.php:135
#: ../../mod/display.php:501 ../../mod/dfrn_confirm.php:55
#: ../../mod/item.php:169 ../../mod/item.php:185
@ -415,8 +415,9 @@ msgstr ""
msgid "Comment"
msgstr ""
#: ../../boot.php:751 ../../include/contact_widgets.php:205
#: ../../object/Item.php:393 ../../mod/content.php:606
#: ../../boot.php:751 ../../include/items.php:4962
#: ../../include/contact_widgets.php:205 ../../object/Item.php:393
#: ../../mod/content.php:606
msgid "show more"
msgstr ""
@ -515,28 +516,28 @@ msgstr ""
msgid "Manage/edit profiles"
msgstr ""
#: ../../boot.php:1600 ../../boot.php:1626 ../../mod/profiles.php:804
#: ../../boot.php:1600 ../../boot.php:1626 ../../mod/profiles.php:800
msgid "Change profile photo"
msgstr ""
#: ../../boot.php:1601 ../../mod/profiles.php:805
#: ../../boot.php:1601 ../../mod/profiles.php:801
msgid "Create New Profile"
msgstr ""
#: ../../boot.php:1611 ../../mod/profiles.php:816
#: ../../boot.php:1611 ../../mod/profiles.php:812
msgid "Profile Image"
msgstr ""
#: ../../boot.php:1614 ../../mod/profiles.php:818
#: ../../boot.php:1614 ../../mod/profiles.php:814
msgid "visible to everybody"
msgstr ""
#: ../../boot.php:1615 ../../mod/profiles.php:819
#: ../../boot.php:1615 ../../mod/profiles.php:815
msgid "Edit visibility"
msgstr ""
#: ../../boot.php:1637 ../../include/event.php:42
#: ../../include/bb2diaspora.php:155 ../../mod/events.php:483
#: ../../include/bb2diaspora.php:155 ../../mod/events.php:492
#: ../../mod/directory.php:136
msgid "Location:"
msgstr ""
@ -803,12 +804,12 @@ msgstr ""
msgid "Ability to mute notifications for a thread"
msgstr ""
#: ../../include/items.php:2330 ../../include/datetime.php:477
#: ../../include/items.php:2330 ../../include/datetime.php:457
#, php-format
msgid "%s's birthday"
msgstr ""
#: ../../include/items.php:2331 ../../include/datetime.php:478
#: ../../include/items.php:2331 ../../include/datetime.php:458
#, php-format
msgid "Happy Birthday %s"
msgstr ""
@ -839,21 +840,22 @@ msgstr ""
#: ../../mod/contacts.php:411 ../../mod/register.php:233
#: ../../mod/dfrn_request.php:845 ../../mod/api.php:105
#: ../../mod/suggest.php:29 ../../mod/follow.php:54 ../../mod/message.php:209
#: ../../mod/profiles.php:661 ../../mod/profiles.php:664
#: ../../mod/profiles.php:657 ../../mod/profiles.php:660
msgid "Yes"
msgstr ""
#: ../../include/items.php:4686 ../../include/conversation.php:1128
#: ../../mod/settings.php:622 ../../mod/settings.php:648
#: ../../mod/contacts.php:414 ../../mod/editpost.php:148
#: ../../mod/dfrn_request.php:859 ../../mod/fbrowser.php:81
#: ../../mod/fbrowser.php:116 ../../mod/suggest.php:32
#: ../../mod/photos.php:203 ../../mod/photos.php:292 ../../mod/follow.php:65
#: ../../mod/tagrm.php:11 ../../mod/tagrm.php:94 ../../mod/message.php:212
#: ../../mod/contacts.php:414 ../../mod/videos.php:116
#: ../../mod/editpost.php:148 ../../mod/dfrn_request.php:859
#: ../../mod/fbrowser.php:81 ../../mod/fbrowser.php:116
#: ../../mod/suggest.php:32 ../../mod/photos.php:203 ../../mod/photos.php:292
#: ../../mod/follow.php:65 ../../mod/tagrm.php:11 ../../mod/tagrm.php:94
#: ../../mod/message.php:212
msgid "Cancel"
msgstr ""
#: ../../include/items.php:4904
#: ../../include/items.php:4956
msgid "Archives"
msgstr ""
@ -1349,11 +1351,11 @@ msgstr ""
msgid "for %1$d %2$s"
msgstr ""
#: ../../include/profile_advanced.php:46 ../../mod/profiles.php:714
#: ../../include/profile_advanced.php:46 ../../mod/profiles.php:710
msgid "Sexual Preference:"
msgstr ""
#: ../../include/profile_advanced.php:50 ../../mod/profiles.php:716
#: ../../include/profile_advanced.php:50 ../../mod/profiles.php:712
msgid "Hometown:"
msgstr ""
@ -1361,7 +1363,7 @@ msgstr ""
msgid "Tags:"
msgstr ""
#: ../../include/profile_advanced.php:54 ../../mod/profiles.php:717
#: ../../include/profile_advanced.php:54 ../../mod/profiles.php:713
msgid "Political Views:"
msgstr ""
@ -1373,11 +1375,11 @@ msgstr ""
msgid "Hobbies/Interests:"
msgstr ""
#: ../../include/profile_advanced.php:62 ../../mod/profiles.php:721
#: ../../include/profile_advanced.php:62 ../../mod/profiles.php:717
msgid "Likes:"
msgstr ""
#: ../../include/profile_advanced.php:64 ../../mod/profiles.php:722
#: ../../include/profile_advanced.php:64 ../../mod/profiles.php:718
msgid "Dislikes:"
msgstr ""
@ -1783,71 +1785,75 @@ msgstr ""
msgid "Miscellaneous"
msgstr ""
#: ../../include/datetime.php:153 ../../include/datetime.php:290
msgid "year"
#: ../../include/datetime.php:141
msgid "YYYY-MM-DD or MM-DD"
msgstr ""
#: ../../include/datetime.php:158 ../../include/datetime.php:291
msgid "month"
#: ../../include/datetime.php:256
msgid "never"
msgstr ""
#: ../../include/datetime.php:163 ../../include/datetime.php:293
msgid "day"
#: ../../include/datetime.php:262
msgid "less than a second ago"
msgstr ""
#: ../../include/datetime.php:276
msgid "never"
#: ../../include/datetime.php:270
msgid "year"
msgstr ""
#: ../../include/datetime.php:282
msgid "less than a second ago"
#: ../../include/datetime.php:270
msgid "years"
msgstr ""
#: ../../include/datetime.php:290
msgid "years"
#: ../../include/datetime.php:271
msgid "month"
msgstr ""
#: ../../include/datetime.php:291
#: ../../include/datetime.php:271
msgid "months"
msgstr ""
#: ../../include/datetime.php:292
#: ../../include/datetime.php:272
msgid "week"
msgstr ""
#: ../../include/datetime.php:292
#: ../../include/datetime.php:272
msgid "weeks"
msgstr ""
#: ../../include/datetime.php:293
#: ../../include/datetime.php:273
msgid "day"
msgstr ""
#: ../../include/datetime.php:273
msgid "days"
msgstr ""
#: ../../include/datetime.php:294
#: ../../include/datetime.php:274
msgid "hour"
msgstr ""
#: ../../include/datetime.php:294
#: ../../include/datetime.php:274
msgid "hours"
msgstr ""
#: ../../include/datetime.php:295
#: ../../include/datetime.php:275
msgid "minute"
msgstr ""
#: ../../include/datetime.php:295
#: ../../include/datetime.php:275
msgid "minutes"
msgstr ""
#: ../../include/datetime.php:296
#: ../../include/datetime.php:276
msgid "second"
msgstr ""
#: ../../include/datetime.php:296
#: ../../include/datetime.php:276
msgid "seconds"
msgstr ""
#: ../../include/datetime.php:305
#: ../../include/datetime.php:285
#, php-format
msgid "%1$d %2$s ago"
msgstr ""
@ -1986,7 +1992,7 @@ msgstr ""
msgid "Sharing notification from Diaspora network"
msgstr ""
#: ../../include/diaspora.php:2493
#: ../../include/diaspora.php:2494
msgid "Attachments:"
msgstr ""
@ -2261,7 +2267,7 @@ msgstr ""
#: ../../include/conversation.php:1125 ../../object/Item.php:690
#: ../../mod/editpost.php:145 ../../mod/photos.php:1566
#: ../../mod/photos.php:1610 ../../mod/photos.php:1698
#: ../../mod/events.php:489 ../../mod/content.php:719
#: ../../mod/events.php:498 ../../mod/content.php:719
msgid "Preview"
msgstr ""
@ -2533,7 +2539,7 @@ msgstr ""
msgid "December"
msgstr ""
#: ../../include/text.php:1424 ../../mod/videos.php:301
#: ../../include/text.php:1424 ../../mod/videos.php:368
msgid "View Video"
msgstr ""
@ -2546,7 +2552,7 @@ msgid "Click to open/close"
msgstr ""
#: ../../include/text.php:1674 ../../include/text.php:1684
#: ../../mod/events.php:347
#: ../../mod/events.php:350
msgid "link to source"
msgstr ""
@ -3868,8 +3874,8 @@ msgstr ""
#: ../../mod/settings.php:1108 ../../mod/settings.php:1109
#: ../../mod/settings.php:1110 ../../mod/register.php:234
#: ../../mod/dfrn_request.php:845 ../../mod/api.php:106
#: ../../mod/follow.php:54 ../../mod/profiles.php:661
#: ../../mod/profiles.php:665
#: ../../mod/follow.php:54 ../../mod/profiles.php:657
#: ../../mod/profiles.php:661
msgid "No"
msgstr ""
@ -4643,30 +4649,38 @@ msgstr ""
msgid "Tips for New Members"
msgstr ""
#: ../../mod/videos.php:115 ../../mod/dfrn_request.php:777
#: ../../mod/videos.php:108
msgid "Do you really want to delete this video?"
msgstr ""
#: ../../mod/videos.php:113
msgid "Delete Video"
msgstr ""
#: ../../mod/videos.php:182 ../../mod/dfrn_request.php:777
#: ../../mod/viewcontacts.php:19 ../../mod/photos.php:920
#: ../../mod/search.php:89 ../../mod/community.php:18
#: ../../mod/display.php:214 ../../mod/directory.php:33
msgid "Public access denied."
msgstr ""
#: ../../mod/videos.php:125
#: ../../mod/videos.php:192
msgid "No videos selected"
msgstr ""
#: ../../mod/videos.php:226 ../../mod/photos.php:1031
#: ../../mod/videos.php:293 ../../mod/photos.php:1031
msgid "Access to this item is restricted."
msgstr ""
#: ../../mod/videos.php:308 ../../mod/photos.php:1808
#: ../../mod/videos.php:375 ../../mod/photos.php:1808
msgid "View Album"
msgstr ""
#: ../../mod/videos.php:317
#: ../../mod/videos.php:384
msgid "Recent Videos"
msgstr ""
#: ../../mod/videos.php:319
#: ../../mod/videos.php:386
msgid "Upload New Videos"
msgstr ""
@ -6642,72 +6656,67 @@ msgstr ""