Browse Source

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

tags/3.4.1^2
Michael Vogel 5 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 ""
msgid "is interested in:"
msgstr ""

#: ../../mod/events.php:68 ../../mod/events.php:70
#: ../../mod/events.php:71 ../../mod/events.php:73
msgid "Event title and start time are required."
msgstr ""

#: ../../mod/events.php:303
#: ../../mod/events.php:306
msgid "l, F j"
msgstr ""

#: ../../mod/events.php:325
#: ../../mod/events.php:328
msgid "Edit event"
msgstr ""

#: ../../mod/events.php:383
#: ../../mod/events.php:386
msgid "Create New Event"
msgstr ""

#: ../../mod/events.php:384
#: ../../mod/events.php:387
msgid "Previous"
msgstr ""

#: ../../mod/events.php:385 ../../mod/install.php:207
#: ../../mod/events.php:388 ../../mod/install.php:207
msgid "Next"
msgstr ""

#: ../../mod/events.php:458
msgid "hour:minute"
msgstr ""

#: ../../mod/events.php:468
#: ../../mod/events.php:480
msgid "Event details"
msgstr ""

#: ../../mod/events.php:469
#, php-format
msgid "Format is %s %s. Starting date and Title are required."
#: ../../mod/events.php:481
msgid "Starting date and Title are required."
msgstr ""

#: ../../mod/events.php:471
#: ../../mod/events.php:482
msgid "Event Starts:"
msgstr ""

#: ../../mod/events.php:471 ../../mod/events.php:485
#: ../../mod/events.php:482 ../../mod/events.php:494
msgid "Required"
msgstr ""

#: ../../mod/events.php:474
#: ../../mod/events.php:484
msgid "Finish date/time is not known or not relevant"
msgstr ""

#: ../../mod/events.php:476
#: ../../mod/events.php:486
msgid "Event Finishes:"
msgstr ""

#: ../../mod/events.php:479
#: ../../mod/events.php:488
msgid "Adjust for viewer timezone"
msgstr ""

#: ../../mod/events.php:481
#: ../../mod/events.php:490
msgid "Description:"
msgstr ""

#: ../../mod/events.php:485
#: ../../mod/events.php:494
msgid "Title:"
msgstr ""

#: ../../mod/events.php:487
#: ../../mod/events.php:496
msgid "Share this event"
msgstr ""

@@ -6842,7 +6851,7 @@ msgid "Not available."
msgstr ""

#: ../../mod/profiles.php:18 ../../mod/profiles.php:133
#: ../../mod/profiles.php:179 ../../mod/profiles.php:630
#: ../../mod/profiles.php:179 ../../mod/profiles.php:626
#: ../../mod/dfrn_confirm.php:64
msgid "Profile not found."
msgstr ""
@@ -6867,278 +6876,277 @@ msgstr ""
msgid "Profile Name is required."
msgstr ""

#: ../../mod/profiles.php:340
#: ../../mod/profiles.php:336
msgid "Marital Status"
msgstr ""

#: ../../mod/profiles.php:344
#: ../../mod/profiles.php:340
msgid "Romantic Partner"
msgstr ""

#: ../../mod/profiles.php:348
#: ../../mod/profiles.php:344
msgid "Likes"
msgstr ""

#: ../../mod/profiles.php:352
#: ../../mod/profiles.php:348
msgid "Dislikes"
msgstr ""

#: ../../mod/profiles.php:356
#: ../../mod/profiles.php:352
msgid "Work/Employment"
msgstr ""

#: ../../mod/profiles.php:359
#: ../../mod/profiles.php:355
msgid "Religion"
msgstr ""

#: ../../mod/profiles.php:363
#: ../../mod/profiles.php:359
msgid "Political Views"
msgstr ""

#: ../../mod/profiles.php:367
#: ../../mod/profiles.php:363
msgid "Gender"
msgstr ""

#: ../../mod/profiles.php:371
#: ../../mod/profiles.php:367
msgid "Sexual Preference"
msgstr ""

#: ../../mod/profiles.php:375
#: ../../mod/profiles.php:371
msgid "Homepage"
msgstr ""

#: ../../mod/profiles.php:379 ../../mod/profiles.php:698
#: ../../mod/profiles.php:375 ../../mod/profiles.php:694
msgid "Interests"
msgstr ""

#: ../../mod/profiles.php:383
#: ../../mod/profiles.php:379
msgid "Address"
msgstr ""

#: ../../mod/profiles.php:390 ../../mod/profiles.php:694
#: ../../mod/profiles.php:386 ../../mod/profiles.php:690
msgid "Location"
msgstr ""

#: ../../mod/profiles.php:473
#: ../../mod/profiles.php:469
msgid "Profile updated."
msgstr ""

#: ../../mod/profiles.php:568
#: ../../mod/profiles.php:564
msgid " and "
msgstr ""

#: ../../mod/profiles.php:576
#: ../../mod/profiles.php:572
msgid "public profile"
msgstr ""

#: ../../mod/profiles.php:579
#: ../../mod/profiles.php:575
#, php-format
msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
msgstr ""

#: ../../mod/profiles.php:580
#: ../../mod/profiles.php:576
#, php-format
msgid " - Visit %1$s's %2$s"
msgstr ""

#: ../../mod/profiles.php:583
#: ../../mod/profiles.php:579
#, php-format
msgid "%1$s has an updated %2$s, changing %3$s."
msgstr ""

#: ../../mod/profiles.php:658
#: ../../mod/profiles.php:654
msgid "Hide contacts and friends:"
msgstr ""

#: ../../mod/profiles.php:663
#: ../../mod/profiles.php:659
msgid "Hide your contact/friend list from viewers of this profile?"
msgstr ""

#: ../../mod/profiles.php:685
#: ../../mod/profiles.php:681
msgid "Edit Profile Details"
msgstr ""

#: ../../mod/profiles.php:687
#: ../../mod/profiles.php:683
msgid "Change Profile Photo"
msgstr ""

#: ../../mod/profiles.php:688
#: ../../mod/profiles.php:684
msgid "View this profile"
msgstr ""

#: ../../mod/profiles.php:689
#: ../../mod/profiles.php:685
msgid "Create a new profile using these settings"
msgstr ""

#: ../../mod/profiles.php:690
#: ../../mod/profiles.php:686
msgid "Clone this profile"
msgstr ""

#: ../../mod/profiles.php:691
#: ../../mod/profiles.php:687
msgid "Delete this profile"
msgstr ""

#: ../../mod/profiles.php:692
#: ../../mod/profiles.php:688
msgid "Basic information"
msgstr ""

#: ../../mod/profiles.php:693
#: ../../mod/profiles.php:689
msgid "Profile picture"
msgstr ""

#: ../../mod/profiles.php:695
#: ../../mod/profiles.php:691
msgid "Preferences"
msgstr ""

#: ../../mod/profiles.php:696
#: ../../mod/profiles.php:692
msgid "Status information"
msgstr ""

#: ../../mod/profiles.php:697
#: ../../mod/profiles.php:693
msgid "Additional information"
msgstr ""

#: ../../mod/profiles.php:699 ../../mod/newmember.php:36
#: ../../mod/profiles.php:695 ../../mod/newmember.php:36
#: ../../mod/profile_photo.php:244
msgid "Upload Profile Photo"
msgstr ""

#: ../../mod/profiles.php:700
#: ../../mod/profiles.php:696
msgid "Profile Name:"
msgstr ""

#: ../../mod/profiles.php:701
#: ../../mod/profiles.php:697
msgid "Your Full Name:"
msgstr ""

#: ../../mod/profiles.php:702
#: ../../mod/profiles.php:698
msgid "Title/Description:"
msgstr ""

#: ../../mod/profiles.php:703
#: ../../mod/profiles.php:699
msgid "Your Gender:"
msgstr ""

#: ../../mod/profiles.php:704
#, php-format
msgid "Birthday (%s):"
#: ../../mod/profiles.php:700
msgid "Birthday :"
msgstr ""

#: ../../mod/profiles.php:705
#: ../../mod/profiles.php:701
msgid "Street Address:"
msgstr ""

#: ../../mod/profiles.php:706
#: ../../mod/profiles.php:702
msgid "Locality/City:"
msgstr ""

#: ../../mod/profiles.php:707
#: ../../mod/profiles.php:703
msgid "Postal/Zip Code:"
msgstr ""

#: ../../mod/profiles.php:708
#: ../../mod/profiles.php:704
msgid "Country:"
msgstr ""

#: ../../mod/profiles.php:709
#: ../../mod/profiles.php:705
msgid "Region/State:"
msgstr ""

#: ../../mod/profiles.php:710
#: ../../mod/profiles.php:706
msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
msgstr ""

#: ../../mod/profiles.php:711
#: ../../mod/profiles.php:707
msgid "Who: (if applicable)"
msgstr ""

#: ../../mod/profiles.php:712
#: ../../mod/profiles.php:708
msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
msgstr ""

#: ../../mod/profiles.php:713
#: ../../mod/profiles.php:709
msgid "Since [date]:"
msgstr ""

#: ../../mod/profiles.php:715
#: ../../mod/profiles.php:711
msgid "Homepage URL:"
msgstr ""

#: ../../mod/profiles.php:718
#: ../../mod/profiles.php:714
msgid "Religious Views:"
msgstr ""

#: ../../mod/profiles.php:719
#: ../../mod/profiles.php:715
msgid "Public Keywords:"
msgstr ""

#: ../../mod/profiles.php:720
#: ../../mod/profiles.php:716
msgid "Private Keywords:"
msgstr ""

#: ../../mod/profiles.php:723
#: ../../mod/profiles.php:719
msgid "Example: fishing photography software"
msgstr ""

#: ../../mod/profiles.php:724
#: ../../mod/profiles.php:720
msgid "(Used for suggesting potential friends, can be seen by others)"
msgstr ""

#: ../../mod/profiles.php:725
#: ../../mod/profiles.php:721
msgid "(Used for searching profiles, never shown to others)"
msgstr ""

#: ../../mod/profiles.php:726
#: ../../mod/profiles.php:722
msgid "Tell us about yourself..."
msgstr ""

#: ../../mod/profiles.php:727
#: ../../mod/profiles.php:723
msgid "Hobbies/Interests"
msgstr ""

#: ../../mod/profiles.php:728
#: ../../mod/profiles.php:724
msgid "Contact information and Social Networks"
msgstr ""

#: ../../mod/profiles.php:729
#: ../../mod/profiles.php:725
msgid "Musical interests"
msgstr ""

#: ../../mod/profiles.php:730
#: ../../mod/profiles.php:726
msgid "Books, literature"
msgstr ""

#: ../../mod/profiles.php:731
#: ../../mod/profiles.php:727
msgid "Television"
msgstr ""

#: ../../mod/profiles.php:732
#: ../../mod/profiles.php:728
msgid "Film/dance/culture/entertainment"
msgstr ""

#: ../../mod/profiles.php:733
#: ../../mod/profiles.php:729
msgid "Love/romance"
msgstr ""

#: ../../mod/profiles.php:734
#: ../../mod/profiles.php:730
msgid "Work/employment"
msgstr ""

#: ../../mod/profiles.php:735
#: ../../mod/profiles.php:731
msgid "School/education"
msgstr ""

#: ../../mod/profiles.php:740
#: ../../mod/profiles.php:736
msgid ""
"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
"be visible to anybody using the internet."
msgstr ""

#: ../../mod/profiles.php:750 ../../mod/directory.php:113
#: ../../mod/profiles.php:746 ../../mod/directory.php:113
msgid "Age: "
msgstr ""

#: ../../mod/profiles.php:803
#: ../../mod/profiles.php:799
msgid "Edit/Manage Profiles"
msgstr ""



+ 927
- 901
view/cs/messages.po
File diff suppressed because it is too large
View File


+ 13
- 8
view/cs/strings.php View File

@@ -76,13 +76,6 @@ $a->strings["Page not found."] = "Stránka nenalezena";
$a->strings["Permission denied"] = "Nedostatečné oprávnění";
$a->strings["Permission denied."] = "Přístup odmítnut.";
$a->strings["toggle mobile"] = "přepnout mobil";
$a->strings["Do you wish to confirm your identity (<tt>%s</tt>) with <tt>%s</tt>"] = "Přejete si potvrdit vaši identitu (<tt>%s</tt>) s <tt>%s</tt>";
$a->strings["Confirm"] = "Potvrdit";
$a->strings["Do not confirm"] = "Nepotvrzovat";
$a->strings["Trust This Site"] = "Důvěřovat tomuto webu";
$a->strings["No Identifier Sent"] = "Nezaslán žádný identifikátor";
$a->strings["Requested identity don't match logged in user."] = "Požadovaná identita neodpovídá přihlášenému uživateli";
$a->strings["Please wait; you are being redirected to <%s>"] = "Čekejte prosím, budete přesměrován na <%s>";
$a->strings["Delete this item?"] = "Odstranit tuto položku?";
$a->strings["Comment"] = "Okomentovat";
$a->strings["show more"] = "zobrazit více";
@@ -194,6 +187,7 @@ $a->strings["edit"] = "editovat";
$a->strings["Groups"] = "Skupiny";
$a->strings["Edit group"] = "Editovat skupinu";
$a->strings["Create a new group"] = "Vytvořit novou skupinu";
$a->strings["Group Name: "] = "Název skupiny: ";
$a->strings["Contacts not in any group"] = "Kontakty, které nejsou v žádné skupině";
$a->strings["add"] = "přidat";
$a->strings["Wall Photos"] = "Fotografie na zdi";
@@ -745,7 +739,6 @@ $a->strings["Group not found."] = "Skupina nenalezena.";
$a->strings["Group name changed."] = "Název skupiny byl změněn.";
$a->strings["Save Group"] = "Uložit Skupinu";
$a->strings["Create a group of contacts/friends."] = "Vytvořit skupinu kontaktů / přátel.";
$a->strings["Group Name: "] = "Název skupiny: ";
$a->strings["Group removed."] = "Skupina odstraněna. ";
$a->strings["Unable to remove group."] = "Nelze odstranit skupinu.";
$a->strings["Group Editor"] = "Editor skupin";
@@ -844,6 +837,9 @@ $a->strings["Plugin Settings"] = "Nastavení doplňku";
$a->strings["Off"] = "Vypnuto";
$a->strings["On"] = "Zapnuto";
$a->strings["Additional Features"] = "Další Funkčnosti";
$a->strings["General Social Media Settings"] = "General Social Media nastavení";
$a->strings["Disable intelligent shortening"] = "Vypnout inteligentní zkracování";
$a->strings["Normally the system tries to find the best link to add to shortened posts. If this option is enabled then every shortened post will always point to the original friendica post."] = "Normálně se systém snaží nalézt nejlepší link pro přidání zkrácených příspěvků. Pokud je tato volba aktivní, pak každý zkrácený příspěvek bude vždy ukazovat na originální friencika příspěvek";
$a->strings["Built-in support for %s connectivity is %s"] = "Vestavěná podpora pro připojení s %s je %s";
$a->strings["enabled"] = "povoleno";