1
1
Fork 0

Merge remote branch 'upstream/master'

This commit is contained in:
Michael 2012-02-26 21:47:47 +01:00
commit 437e18d7a7
48 changed files with 3239 additions and 1671 deletions

View file

@ -9,9 +9,9 @@ require_once('include/nav.php');
require_once('include/cache.php');
define ( 'FRIENDICA_PLATFORM', 'Friendica');
define ( 'FRIENDICA_VERSION', '2.3.1260' );
define ( 'FRIENDICA_VERSION', '2.3.1263' );
define ( 'DFRN_PROTOCOL_VERSION', '2.22' );
define ( 'DB_UPDATE_VERSION', 1123 );
define ( 'DB_UPDATE_VERSION', 1126 );
define ( 'EOL', "<br />\r\n" );
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );

View file

@ -257,6 +257,7 @@ CREATE TABLE IF NOT EXISTS `item` (
KEY `last-child` (`last-child`),
KEY `unseen` (`unseen`),
KEY `wall` (`wall`),
KEY `author-name` (`author-name`),
KEY `author-link` (`author-link`),
FULLTEXT KEY `title` (`title`),
FULLTEXT KEY `body` (`body`),
@ -809,5 +810,31 @@ INDEX ( `uid` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
--
-- Table structure for table `notify-threads`
--
-- notify-id: notify.id of the first notification of this thread
-- master-parent-item: item.id of the parent item
-- parent-item: item.id of the imediate parent (only for multi-thread)
-- not used yet.
-- receiver-uid: user.uid of the receiver of this notification.
--
-- If we query for a master-parent-item and receiver-uid...
-- * Returns 1 item: this is not the parent notification,
-- so just "follow" the thread (references to this notification)
-- * Returns no item: this is the first notification related to
-- this parent item. So, create the record and use the message-id
-- header.
CREATE TABLE IF NOT EXISTS `notify-threads` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`notify-id` INT NOT NULL,
`master-parent-item` INT( 10 ) unsigned NOT NULL DEFAULT '0',
`parent-item` INT( 10 ) unsigned NOT NULL DEFAULT '0',
`receiver-uid` INT NOT NULL,
INDEX ( `master-parent-item` ),
INDEX ( `receiver-uid` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;

View file

@ -34,3 +34,20 @@ Once you have created a post, you can not change the permissions assigned. Withi
In case you haven't yet figured this out, we are encouraging you to encourage your friends to use Friendica - because all these privacy features work much better within a privacy-aware network. Many of the other social networks Friendica can connect to have no privacy controls.
Profiles, Privacy, and Photos
=============================
The decentralised nature of Friendica (many websites exchanging information rather than one website which controls everything) has some implications with privacy as it relates to people on other sites. There are things you should be aware of, so you can decide best how to interact privately.
Sharing photos privately is a problem. We can only share them __privately__ with Friendica members. In order to share with other people, we need to prove who they are. We can prove the identity of Friendica members, as we have a mechanism to do so. Your friends on other networks will be blocked from viewing these private photos because we cannot prove that they should be allowed to see them.
Our developers are working on solutions to allow access to your friends - no matter what network they are on. However we take privacy seriously and don't behave like some networks that __pretend__ your photos are private, but make them available to others without proof of identity.
Your profile and "wall" may also be visited by your friends from other networks, and you can block access to these by web visitors that Friendica doesn't know. Be aware that this could include some of your friends on other networks.
This may produce undesired results when posting a long status message to (for instance) Twitter and even Facebook. When Friendica sends a post to these networks which exceeds the service length limit, we truncate it and provide a link to the original. The original is a link back to your Friendica profile. As Friendica cannot prove who they are, it may not be possible for these people to view your post in full.
For people in this situation we would recommend providing a "Twitter-length" summary, with more detail for friends that can see the post in full.
Blocking your profile or entire Friendica site from unknown web visitors also has serious implications for communicating with StatusNet/identi.ca members. These networks communicate with others via public protocols that are not authenticated. In order to view your posts, these networks have to access them as an "unknown web visitor". If we allowed this, it would mean anybody could in fact see your posts, and you've instructed Friendica not to allow this. So be aware that the act of blocking your profile to unknown visitors also has the effect of blocking outbound communication with public networks (such as identi.ca) and feed readers such as Google Reader.

View file

@ -32,6 +32,9 @@ $a->config['sitename'] = "Friendica Social Network";
// to the email address of an already registered person who can authorise
// and/or approve/deny the request.
// In order to perform system administration via the admin panel, admin_email
// must precisely match the email address of the person logged in.
$a->config['register_policy'] = REGISTER_OPEN;
$a->config['register_text'] = '';
$a->config['admin_email'] = '';
@ -64,6 +67,10 @@ $a->config['system']['huburl'] = 'http://pubsubhubbub.appspot.com';
$a->config['system']['rino_encrypt'] = true;
// allowed themes (change this from admin panel after installation)
$a->config['system']['allowed_themes'] = 'dispy,quattro,testbubble,vier,darkbubble,darkzero,duepuntozero,greenzero,purplezero,quattro-green,slackr';
// default system theme
$a->config['system']['theme'] = 'duepuntozero';

View file

@ -55,42 +55,12 @@ function diaspora2bb($s) {
$s = preg_replace("/(\[code\])+(.*?)(\[\/code\])+/ism","[code]$2[/code]", $s);
// Don't show link to full picture (until it is fixed)
$s = scale_diaspora_images($s, false);
$s = scale_external_images($s, false);
return $s;
}
function scale_diaspora_images($s,$include_link = true) {
$matches = null;
$c = preg_match_all('/\[img\](.*?)\[\/img\]/ism',$s,$matches,PREG_SET_ORDER);
if($c) {
require_once('include/Photo.php');
foreach($matches as $mtch) {
logger('scale_diaspora_image: ' . $mtch[1]);
$i = fetch_url($mtch[1]);
if($i) {
$ph = new Photo($i);
if($ph->is_valid()) {
if($ph->getWidth() > 600 || $ph->getHeight() > 600) {
$ph->scaleImage(600);
$new_width = $ph->getWidth();
$new_height = $ph->getHeight();
logger('scale_diaspora_image: ' . $new_width . 'w ' . $new_height . 'h' . 'match: ' . $mtch[0], LOGGER_DEBUG);
$s = str_replace($mtch[0],'[img=' . $new_width . 'x' . $new_height. ']' . $mtch[1] . '[/img]'
. "\n" . (($include_link)
? '[url=' . $mtch[1] . ']' . t('view full size') . '[/url]' . "\n"
: ''),$s);
logger('scale_diaspora_image: new string: ' . $s, LOGGER_DEBUG);
}
}
}
}
}
return $s;
}
function stripdcode_br_cb($s) {
return '[code]' . str_replace('<br />', "\n\t", $s[1]) . '[/code]';
}

View file

@ -273,10 +273,10 @@ function delivery_run($argv, $argc){
if($normal_mode) {
if($item_id == $item['id'] || $item['id'] == $item['parent'])
$atom .= atom_entry($item,'text',$item_contact,$owner,true);
$atom .= atom_entry($item,'text',null,$owner,true);
}
else
$atom .= atom_entry($item,'text',$item_contact,$owner,true);
$atom .= atom_entry($item,'text',null,$owner,true);
}
@ -364,7 +364,7 @@ function delivery_run($argv, $argc){
continue;
if(($top_level) && ($public_message) && ($item['author-link'] === $item['owner-link']) && (! $expire))
$slaps[] = atom_entry($item,'html',$item_contact,$owner,true);
$slaps[] = atom_entry($item,'html',null,$owner,true);
}
logger('notifier: slapdelivery: ' . $contact['name']);

View file

@ -794,15 +794,15 @@ function diaspora_reshare($importer,$xml) {
if(strlen($source_xml->post->asphoto->objectId) && ($source_xml->post->asphoto->objectId != 0) && ($source_xml->post->asphoto->image_url)) {
$body = '[url=' . notags(unxmlify($source_xml->post->asphoto->image_url)) . '][img]' . notags(unxmlify($source_xml->post->asphoto->objectId)) . '[/img][/url]' . "\n";
$body = scale_diaspora_images($body,false);
$body = scale_external_images($body,false);
}
elseif($source_xml->post->asphoto->image_url) {
$body = '[img]' . notags(unxmlify($source_xml->post->asphoto->image_url)) . '[/img]' . "\n";
$body = scale_diaspora_images($body);
$body = scale_external_images($body);
}
elseif($source_xml->post->status_message) {
$body = diaspora2bb($source_xml->post->status_message->raw_message);
$body = scale_diaspora_images($body);
$body = scale_external_images($body);
}
else {
@ -945,11 +945,11 @@ function diaspora_asphoto($importer,$xml) {
if(strlen($xml->objectId) && ($xml->objectId != 0) && ($xml->image_url)) {
$body = '[url=' . notags(unxmlify($xml->image_url)) . '][img]' . notags(unxmlify($xml->objectId)) . '[/img][/url]' . "\n";
$body = scale_diaspora_images($body,false);
$body = scale_external_images($body,false);
}
elseif($xml->image_url) {
$body = '[img]' . notags(unxmlify($xml->image_url)) . '[/img]' . "\n";
$body = scale_diaspora_images($body);
$body = scale_external_images($body);
}
else {
logger('diaspora_asphoto: no photo url found.');
@ -1476,7 +1476,7 @@ function diaspora_photo($importer,$xml,$msg) {
$link_text = '[img]' . $remote_photo_path . $remote_photo_name . '[/img]' . "\n";
$link_text = scale_diaspora_images($link_text);
$link_text = scale_external_images($link_text);
if(strpos($parent_item['body'],$link_text) === false) {
$r = q("update item set `body` = '%s', `visible` = 1 where `id` = %d and `uid` = %d limit 1",
@ -1803,6 +1803,9 @@ function diaspora_profile($importer,$xml) {
if(substr($birthday,5) === substr($contact['bd'],5))
$birthday = $contact['bd'];
// TODO: update name on item['author-name'] if the name changed. See consume_feed()
// Not doing this currently because D* protocol is scheduled for revision soon.
$r = q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', `avatar-date` = '%s' , `bd` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1",
dbesc($name),
dbesc(datetime_convert()),

View file

@ -13,7 +13,9 @@ function notification($params) {
$site_admin = sprintf( t('%s Administrator'), $sitename);
$sender_name = $product;
$sender_email = t('noreply') . '@' . $a->get_hostname();
$hostname = $a->get_hostname();
$sender_email = t('noreply') . '@' . $hostname;
$additional_mail_header = "";
if(array_key_exists('item',$params)) {
$title = $params['item']['title'];
@ -36,8 +38,15 @@ function notification($params) {
}
if($params['type'] == NOTIFY_COMMENT) {
logger("notification: params = " . print_r($params, true), LOGGER_DEBUG);
$subject = sprintf( t('%s commented on an item at %s'), $params['source_name'], $sitename);
$parent_id = $params['parent'];
// Some mail softwares relies on subject field for threading.
// So, we cannot have different subjects for notifications of the same thread.
// Before this we have the name of the replier on the subject rendering
// differents subjects for messages on the same thread.
$subject = sprintf( t('Someone commented on item #%d at %s'), $parent_id, $sitename);
$preamble = sprintf( t('%s commented on an item/conversation you have been following.'), $params['source_name']);
$epreamble = sprintf( t('%s commented in %s.'), '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]', '[url=$itemlink]' . t('a watched conversation') . '[/url]');
@ -126,8 +135,6 @@ function notification($params) {
} while($dups == true);
// create notification entry in DB
$r = q("insert into notify (hash,name,url,photo,date,uid,link,type,verb,otype)
@ -170,6 +177,40 @@ function notification($params) {
logger('notification: sending notification email');
$id_for_parent = "${params['parent']}@${hostname}";
// Is this the first email notification for this parent item and user?
$r = q("select `id` from `notify-threads` where `master-parent-item` = %d and `receiver-uid` = %d limit 1",
intval($params['parent']),
intval($params['uid']) );
// If so, create the record of it and use a message-id smtp header.
if(!$r) {
logger("norify_id:" . intval($notify_id). ", parent: " . intval($params['parent']) . "uid: " .
intval($params['uid']), LOGGER_DEBUG);
$r = q("insert into `notify-threads` (`notify-id`, `master-parent-item`, `receiver-uid`, `parent-item`)
values(%d,%d,%d,%d)",
intval($notify_id),
intval($params['parent']),
intval($params['uid']),
0 );
$additional_mail_header .= "Message-ID: <${id_for_parent}>\n";
$log_msg = "include/enotify: No previous notification found for this parent:\n" .
" parent: ${params['parent']}\n" . " uid : ${params['uid']}\n";
logger($log_msg, LOGGER_DEBUG);
}
// If not, just "follow" the thread.
else {
$additional_mail_header = "References: <${id_for_parent}>\nIn-Reply-To: <${id_for_parent}>\n";
logger("include/enotify: There's already a notification for this parent:\n" . print_r($r, true), LOGGER_DEBUG);
}
$textversion = strip_tags(html_entity_decode(bbcode(stripslashes(str_replace(array("\\r\\n", "\\r", "\\n"), "\n",
$body))),ENT_QUOTES,'UTF-8'));
@ -227,7 +268,8 @@ function notification($params) {
'toEmail' => $params['to_email'],
'messageSubject' => $subject,
'htmlVersion' => $email_html_body,
'textVersion' => $email_text_body
'textVersion' => $email_text_body,
'additionalMailHeader' => $additional_mail_header,
));
}
@ -248,6 +290,7 @@ class enotify {
* @param messageSubject subject of the message
* @param htmlVersion html version of the message
* @param textVersion text only version of the message
* @param additionalMailHeader additions to the smtp mail header
*/
static public function send($params) {
@ -262,6 +305,7 @@ class enotify {
// generate a multipart/alternative message header
$messageHeader =
$params['additionalMailHeader'] .
"From: {$params['fromName']} <{$params['fromEmail']}>\n" .
"Reply-To: {$params['fromName']} <{$params['replyTo']}>\n" .
"MIME-Version: 1.0\n" .
@ -291,4 +335,4 @@ class enotify {
logger("notification: enotify::send returns " . $res, LOGGER_DEBUG);
}
}
?>
?>

View file

@ -1308,12 +1308,28 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
}
if((is_array($contact)) && ($name_updated) && (strlen($new_name)) && ($name_updated > $contact['name-date'])) {
q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
$r = q("select * from contact where uid = %d and id = %d limit 1",
intval($contact['uid']),
intval($contact['id'])
);
$x = q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
dbesc(notags(trim($new_name))),
dbesc(datetime_convert()),
intval($contact['uid']),
intval($contact['id'])
);
// do our best to update the name on content items
if(count($r)) {
q("update item set `author-name` = '%s' where `author-name` = '%s' and `author-link` = '%s' and uid = %d",
dbesc(notags(trim($new_name))),
dbesc($r[0]['name']),
dbesc($r[0]['url']),
intval($contact['uid'])
);
}
}
if(strlen($birthday)) {
@ -1505,13 +1521,18 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
$item_id = $item->get_id();
$datarray = get_atom_elements($feed,$item);
if(! x($datarray,'author-name'))
if((! x($datarray,'author-name')) && ($contact['network'] != NETWORK_DFRN))
$datarray['author-name'] = $contact['name'];
if(! x($datarray,'author-link'))
if((! x($datarray,'author-link')) && ($contact['network'] != NETWORK_DFRN))
$datarray['author-link'] = $contact['url'];
if(! x($datarray,'author-avatar'))
if((! x($datarray,'author-avatar')) && ($contact['network'] != NETWORK_DFRN))
$datarray['author-avatar'] = $contact['thumb'];
if((! x($datarray,'author-name')) || (! x($datarray,'author-link'))) {
logger('consume_feed: no author information! ' . print_r($datarray,true));
continue;
}
$r = q("SELECT `uid`, `last-child`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
dbesc($item_id),
@ -1614,14 +1635,19 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
$datarray = get_atom_elements($feed,$item);
if(is_array($contact)) {
if(! x($datarray,'author-name'))
if((! x($datarray,'author-name')) && ($contact['network'] != NETWORK_DFRN))
$datarray['author-name'] = $contact['name'];
if(! x($datarray,'author-link'))
if((! x($datarray,'author-link')) && ($contact['network'] != NETWORK_DFRN))
$datarray['author-link'] = $contact['url'];
if(! x($datarray,'author-avatar'))
if((! x($datarray,'author-avatar')) && ($contact['network'] != NETWORK_DFRN))
$datarray['author-avatar'] = $contact['thumb'];
}
if((! x($datarray,'author-name')) || (! x($datarray,'author-link'))) {
logger('consume_feed: no author information! ' . print_r($datarray,true));
continue;
}
// special handling for events
if((x($datarray,'object-type')) && ($datarray['object-type'] === ACTIVITY_OBJ_EVENT)) {
@ -2197,7 +2223,8 @@ function local_delivery($importer,$data) {
'source_photo' => ((link_compare($datarray['author-link'],$importer['url']))
? $importer['thumb'] : $datarray['author-avatar']),
'verb' => ACTIVITY_POST,
'otype' => 'item'
'otype' => 'item',
'parent' => $parent,
));
@ -2291,7 +2318,7 @@ function local_delivery($importer,$data) {
if($datarray['type'] != 'activity') {
$myconv = q("SELECT `author-link`, `author-avatar` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `parent` != 0 ",
$myconv = q("SELECT `author-link`, `author-avatar`, `parent` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `parent` != 0 ",
dbesc($parent_uri),
intval($importer['importer_uid'])
);
@ -2304,6 +2331,8 @@ function local_delivery($importer,$data) {
continue;
require_once('include/enotify.php');
$conv_parent = $conv['parent'];
notification(array(
'type' => NOTIFY_COMMENT,
@ -2319,7 +2348,8 @@ function local_delivery($importer,$data) {
'source_photo' => ((link_compare($datarray['author-link'],$importer['url']))
? $importer['thumb'] : $datarray['author-avatar']),
'verb' => ACTIVITY_POST,
'otype' => 'item'
'otype' => 'item',
'parent' => $conv_parent,
));

View file

@ -776,3 +776,43 @@ function add_fcontact($arr,$update = false) {
return $r;
}
function scale_external_images($s,$include_link = true) {
$a = get_app();
$matches = null;
$c = preg_match_all('/\[img\](.*?)\[\/img\]/ism',$s,$matches,PREG_SET_ORDER);
if($c) {
require_once('include/Photo.php');
foreach($matches as $mtch) {
logger('scale_external_image: ' . $mtch[1]);
$hostname = str_replace('www.','',substr($a->get_baseurl(),strpos($a->get_baseurl(),'://')+3));
if(stristr($mtch[1],$hostname))
continue;
$i = fetch_url($mtch[1]);
if($i) {
$ph = new Photo($i);
if($ph->is_valid()) {
$orig_width = $ph->getWidth();
$orig_height = $ph->getHeight();
if($orig_width > 640 || $orig_height > 640) {
$ph->scaleImage(640);
$new_width = $ph->getWidth();
$new_height = $ph->getHeight();
logger('scale_external_images: ' . $orig_width . '->' . $new_width . 'w ' . $orig_height . '->' . $new_height . 'h' . ' match: ' . $mtch[0], LOGGER_DEBUG);
$s = str_replace($mtch[0],'[img=' . $new_width . 'x' . $new_height. ']' . $mtch[1] . '[/img]'
. "\n" . (($include_link)
? '[url=' . $mtch[1] . ']' . t('view full size') . '[/url]' . "\n"
: ''),$s);
logger('scale_external_images: new string: ' . $s, LOGGER_DEBUG);
}
}
}
}
}
return $s;
}

View file

@ -383,8 +383,8 @@ function notifier_run($argv, $argc){
continue;
if($item['id'] == $item_id) {
logger('notifier: followup: item: ' . print_r($item,true), LOGGER_DATA);
$slap = atom_entry($item,'html',$owner,$owner,false);
$atom .= atom_entry($item,'text',$owner,$owner,false);
$slap = atom_entry($item,'html',null,$owner,false);
$atom .= atom_entry($item,'text',null,$owner,false);
}
}
}
@ -411,13 +411,13 @@ function notifier_run($argv, $argc){
// older sites without a corresponding dfrn_notify change may do the wrong thing.
if($item_id == $item['id'] || $item['id'] == $item['parent'])
$atom .= atom_entry($item,'text',$contact,$owner,true);
$atom .= atom_entry($item,'text',null,$owner,true);
}
else
$atom .= atom_entry($item,'text',$contact,$owner,true);
$atom .= atom_entry($item,'text',null,$owner,true);
if(($top_level) && ($public_message) && ($item['author-link'] === $item['owner-link']) && (! $expire))
$slaps[] = atom_entry($item,'html',$contact,$owner,true);
$slaps[] = atom_entry($item,'html',null,$owner,true);
}
}
}

View file

@ -166,11 +166,6 @@ function call_hooks($name, &$data = null) {
if (! function_exists('get_plugin_info')){
function get_plugin_info($plugin){
if (!is_file("addon/$plugin/$plugin.php")) return false;
$f = file_get_contents("addon/$plugin/$plugin.php");
$r = preg_match("|/\*.*\*/|msU", $f, $m);
$info=Array(
'name' => $plugin,
'description' => "",
@ -178,6 +173,11 @@ function get_plugin_info($plugin){
'version' => ""
);
if (!is_file("addon/$plugin/$plugin.php")) return $info;
$f = file_get_contents("addon/$plugin/$plugin.php");
$r = preg_match("|/\*.*\*/|msU", $f, $m);
if ($r){
$ll = explode("\n", $m[0]);
foreach( $ll as $l ) {
@ -205,3 +205,74 @@ function get_plugin_info($plugin){
return $info;
}}
/*
* parse theme comment in search of theme infos.
* like
*
* * Name: My Theme
* * Description: My Cool Theme
* * Version: 1.2.3
* * Author: John <profile url>
* * Maintainer: Jane <profile url>
* *
*/
if (! function_exists('get_theme_info')){
function get_theme_info($theme){
$info=Array(
'name' => $theme,
'description' => "",
'author' => array(),
'maintainer' => array(),
'version' => "",
'experimental' => false,
'unsupported' => false
);
if(file_exists("view/theme/$theme/experimental"))
$info['experimental'] = true;
if(file_exists("view/theme/$theme/unsupported"))
$info['unsupported'] = true;
if (!is_file("view/theme/$theme/theme.php")) return $info;
$f = file_get_contents("view/theme/$theme/theme.php");
$r = preg_match("|/\*.*\*/|msU", $f, $m);
if ($r){
$ll = explode("\n", $m[0]);
foreach( $ll as $l ) {
$l = trim($l,"\t\n\r */");
if ($l!=""){
list($k,$v) = array_map("trim", explode(":",$l,2));
$k= strtolower($k);
if ($k=="author"){
$r=preg_match("|([^<]+)<([^>]+)>|", $v, $m);
if ($r) {
$info['author'][] = array('name'=>$m[1], 'link'=>$m[2]);
} else {
$info['author'][] = array('name'=>$v);
}
}
elseif ($k=="maintainer"){
$r=preg_match("|([^<]+)<([^>]+)>|", $v, $m);
if ($r) {
$info['maintainer'][] = array('name'=>$m[1], 'link'=>$m[2]);
} else {
$info['maintainer'][] = array('name'=>$v);
}
} else {
if (array_key_exists($k,$info)){
$info[$k]=$v;
}
}
}
}
}
return $info;
}}

View file

@ -114,7 +114,7 @@
var eNotif = $(data).find('notif')
notif = eNotif.attr('count');
if (notif>0){
if (notif>=0){
$("#nav-notifications-linkmenu").addClass("on");
nnm = $("#nav-notifications-menu");
@ -124,13 +124,13 @@
eNotif.children("note").each(function(){
e = $(this);
text = e.text().format("<span class='contactname'>"+e.attr('name')+"</span>");
html = notifications_tpl.format(e.attr('href'),e.attr('photo'), text, e.attr('date'));
html = notifications_tpl.format(e.attr('href'),e.attr('photo'), text, e.attr('date'), e.attr('seen'));
nnm.append(html);
});
} else {
$("#nav-notifications-linkmenu").removeClass("on");
$("#nav-notifications-menu").html(notifications_empty);
// $("#nav-notifications-linkmenu").removeClass("on");
// $("#nav-notifications-menu").html(notifications_empty);
}
if(notif == 0) { notif = ''; $('#notify-update').removeClass('show') } else { $('#notify-update').addClass('show') }
$('#notify-update').html(notif);

View file

@ -44,9 +44,35 @@
_dfrn_html2bbcode : function(s) {
s = tinymce.trim(s);
function rep(re, str) {
s = s.replace(re, str);
};
function rep(re, str) {
//modify code to keep stuff intact within [code][/code] blocks
//Waitman Gobble NO WARRANTY
var o = new Array();
var x = s.split("[code]");
var i = 0;
var si = "";
si = x.shift();
si = si.replace(re,str);
o.push(si);
for (i = 0; i < x.length; i++) {
var no = new Array();
var j = x.shift();
var g = j.split("[/code]");
no.push(g.shift());
si = g.shift();
si = si.replace(re,str);
no.push(si);
o.push(no.join("[/code]"));
}
s = o.join("[code]");
};
@ -123,11 +149,42 @@
// BBCode -> HTML from DFRN dialect
_dfrn_bbcode2html : function(s) {
s = tinymce.trim(s);
function rep(re, str) {
s = s.replace(re, str);
};
function rep(re, str) {
//modify code to keep stuff intact within [code][/code] blocks
//Waitman Gobble NO WARRANTY
var o = new Array();
var x = s.split("[code]");
var i = 0;
var si = "";
si = x.shift();
si = si.replace(re,str);
o.push(si);
for (i = 0; i < x.length; i++) {
var no = new Array();
var j = x.shift();
var g = j.split("[/code]");
no.push(g.shift());
si = g.shift();
si = si.replace(re,str);
no.push(si);
o.push(no.join("[/code]"));
}
s = o.join("[code]");
};
// example: [b] to <strong>
rep(/\n/gi,"<br />");
rep(/\[b\]/gi,"<strong>");

View file

@ -6,14 +6,19 @@
require_once("include/remoteupdate.php");
function admin_post(&$a){
if(!is_site_admin()) {
return;
}
// do not allow a page manager to access the admin panel at all.
if(x($_SESSION,'submanage') && intval($_SESSION['submanage']))
return;
// urls
if ($a->argc > 1){
switch ($a->argv[1]){
@ -66,6 +71,7 @@ function admin_content(&$a) {
'site' => Array($a->get_baseurl()."/admin/site/", t("Site") , "site"),
'users' => Array($a->get_baseurl()."/admin/users/", t("Users") , "users"),
'plugins'=> Array($a->get_baseurl()."/admin/plugins/", t("Plugins") , "plugins"),
'themes' => Array($a->get_baseurl()."/admin/themes/", t("Themes") , "themes"),
'update' => Array($a->get_baseurl()."/admin/update/", t("Update") , "update")
);
@ -108,6 +114,9 @@ function admin_content(&$a) {
case 'plugins':
$o = admin_page_plugins($a);
break;
case 'themes':
$o = admin_page_themes($a);
break;
case 'logs':
$o = admin_page_logs($a);
break;
@ -564,7 +573,7 @@ function admin_page_plugins(&$a){
'$info' => get_plugin_info($plugin),
'$admin_form' => $admin_form,
'$function' => 'plugins',
'$readme' => $readme
));
}
@ -593,11 +602,179 @@ function admin_page_plugins(&$a){
'$page' => t('Plugins'),
'$submit' => t('Submit'),
'$baseurl' => $a->get_baseurl(),
'$function' => 'plugins',
'$plugins' => $plugins
));
}
function toggle_theme(&$themes,$th,&$result) {
for($x = 0; $x < count($themes); $x ++) {
if($themes[$x]['name'] === $th) {
if($themes[$x]['allowed']) {
$themes[$x]['allowed'] = 0;
$result = 0;
}
else {
$themes[$x]['allowed'] = 1;
$result = 1;
}
}
}
}
function theme_status($themes,$th) {
for($x = 0; $x < count($themes); $x ++) {
if($themes[$x]['name'] === $th) {
if($themes[$x]['allowed']) {
return 1;
}
else {
return 0;
}
}
}
return 0;
}
function rebuild_theme_table($themes) {
$o = '';
if(count($themes)) {
foreach($themes as $th) {
if($th['allowed']) {
if(strlen($o))
$o .= ',';
$o .= $th['name'];
}
}
}
return $o;
}
/*
* Themes admin page
*/
function admin_page_themes(&$a){
$allowed_themes_str = get_config('system','allowed_themes');
$allowed_themes_raw = explode(',',$allowed_themes_str);
$allowed_themes = array();
if(count($allowed_themes_raw))
foreach($allowed_themes_raw as $x)
if(strlen(trim($x)))
$allowed_themes[] = trim($x);
$themes = array();
$files = glob('view/theme/*');
if($files) {
foreach($files as $file) {
$f = basename($file);
$is_experimental = intval(file_exists($file . '/experimental'));
$is_unsupported = 1-(intval(file_exists($file . '/unsupported')));
$is_allowed = intval(in_array($f,$allowed_themes));
$themes[] = array('name' => $f, 'experimental' => $is_experimental, 'supported' => $is_supported, 'allowed' => $is_allowed);
}
}
if(! count($themes)) {
notice( t('No themes found.'));
return;
}
/**
* Single theme
*/
if ($a->argc == 3){
$theme = $a->argv[2];
if(! is_dir("view/theme/$theme")){
notice( t("Item not found.") );
return;
}
if (x($_GET,"a") && $_GET['a']=="t"){
// Toggle theme status
toggle_theme($themes,$theme,$result);
$s = rebuild_theme_table($themes);
if($result)
info( sprintf('Theme %s enabled.',$theme));
else
info( sprintf('Theme %s disabled.',$theme));
set_config('system','allowed_themes',$s);
goaway($a->get_baseurl() . '/admin/themes' );
return; // NOTREACHED
}
// display theme details
require_once('library/markdown.php');
if (theme_status($themes,$theme)) {
$status="on"; $action= t("Disable");
} else {
$status="off"; $action= t("Enable");
}
$readme=Null;
if (is_file("view/$theme/README.md")){
$readme = file_get_contents("view/$theme/README.md");
$readme = Markdown($readme);
} else if (is_file("view/$theme/README")){
$readme = "<pre>". file_get_contents("view/$theme/README") ."</pre>";
}
$admin_form="";
$t = get_markup_template("admin_plugins_details.tpl");
return replace_macros($t, array(
'$title' => t('Administration'),
'$page' => t('Themes'),
'$toggle' => t('Toggle'),
'$settings' => t('Settings'),
'$baseurl' => $a->get_baseurl(),
'$plugin' => $theme,
'$status' => $status,
'$action' => $action,
'$info' => get_theme_info($theme),
'$function' => 'themes',
'$admin_form' => $admin_form,
'$readme' => $readme
));
}
/**
* List plugins
*/
$xthemes = array();
if($themes) {
foreach($themes as $th) {
$xthemes[] = array($th['name'],(($th['allowed']) ? "on" : "off"), get_theme_info($th['name']));
}
}
$t = get_markup_template("admin_plugins.tpl");
return replace_macros($t, array(
'$title' => t('Administration'),
'$page' => t('Themes'),
'$submit' => t('Submit'),
'$baseurl' => $a->get_baseurl(),
'$function' => 'themes',
'$plugins' => $xthemes,
'$experimental' => t('[Experimental]'),
'$unsupported' => t('[Unsupported]')
));
}
/**
* Logs admin page

View file

@ -49,6 +49,11 @@ function follow_init(&$a) {
goaway($_SESSION['return_url']);
}
}
// This just confuses things, remove it
if($ret['network'] === NETWORK_DIASPORA)
$ret['url'] = str_replace('?absolute=true','',$ret['url']);
// do we have enough information?

View file

@ -400,6 +400,8 @@ function item_post(&$a) {
$body = preg_replace('/\[\/code\]\s*\[code\]/ism',"\n",$body);
$body = scale_external_images($body,false);
/**
* Look for any tags and linkify them
*/
@ -753,7 +755,8 @@ function item_post(&$a) {
'source_link' => $datarray['author-link'],
'source_photo' => $datarray['author-avatar'],
'verb' => ACTIVITY_POST,
'otype' => 'item'
'otype' => 'item',
'parent' => $parent,
));
}

View file

@ -295,7 +295,7 @@ function notifications_content(&$a) {
}
$o .= replace_macros($notif_tpl,array(
'$notif_header' => t('Notifications'),
'$notif_header' => t('Network Notifications'),
'$tabs' => $tabs,
'$notif_content' => $notif_content,
));
@ -325,7 +325,7 @@ function notifications_content(&$a) {
}
$o .= replace_macros($notif_tpl,array(
'$notif_header' => t('System'),
'$notif_header' => t('System Notifications'),
'$tabs' => $tabs,
'$notif_content' => $notif_content,
));
@ -420,7 +420,7 @@ function notifications_content(&$a) {
}
$o .= replace_macros($notif_tpl,array(
'$notif_header' => t('Notifications'),
'$notif_header' => t('Personal Notifications'),
'$tabs' => $tabs,
'$notif_content' => $notif_content,
));
@ -501,7 +501,7 @@ function notifications_content(&$a) {
}
$o .= replace_macros($notif_tpl,array(
'$notif_header' => t('Notifications'),
'$notif_header' => t('Home Notifications'),
'$tabs' => $tabs,
'$notif_content' => $notif_content,
));

View file

@ -36,4 +36,36 @@ function notify_init(&$a) {
function notify_content(&$a) {
if(! local_user())
return login();
$notif_tpl = get_markup_template('notifications.tpl');
$not_tpl = get_markup_template('notify.tpl');
require_once('include/bbcode.php');
$r = q("SELECT * from notify where uid = %d and seen = 0 order by date desc",
intval(local_user())
);
if (count($r) > 0) {
foreach ($r as $it) {
$notif_content .= replace_macros($not_tpl,array(
'$item_link' => $a->get_baseurl().'/notify/view/'. $it['id'],
'$item_image' => $it['photo'],
'$item_text' => strip_tags(bbcode($it['msg'])),
'$item_when' => relative_date($it['date'])
));
}
} else {
$notif_content .= t('No more system notifications.');
}
$o .= replace_macros($notif_tpl,array(
'$notif_header' => t('System Notifications'),
'$tabs' => '', // $tabs,
'$notif_content' => $notif_content,
));
return $o;
}

View file

@ -12,13 +12,14 @@ function ping_init(&$a) {
$xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
if(local_user()){
$z = q("select * from notify where seen = 0 and uid = %d
order by date desc",
$firehose = intval(get_pconfig(local_user(),'system','notify_full'));
$z = q("select * from notify where uid = %d
order by seen asc, date desc limit 0, 50",
intval(local_user())
);
$tags = array();
$comments = array();
$likes = array();
@ -32,72 +33,48 @@ function ping_init(&$a) {
`pitem`.`author-name` as `pname`, `pitem`.`author-link` as `plink`
FROM `item` INNER JOIN `item` as `pitem` ON `pitem`.`id`=`item`.`parent`
WHERE `item`.`unseen` = 1 AND `item`.`visible` = 1 AND
`item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 0
`item`.`deleted` = 0 AND `item`.`uid` = %d
ORDER BY `item`.`created` DESC",
intval(local_user())
);
$network = count($r);
foreach ($r as $it) {
switch($it['verb']){
case ACTIVITY_TAG:
$obj = parse_xml_string($xmlhead.$it['object']);
$it['tname'] = $obj->content;
$tags[] = $it;
break;
case ACTIVITY_LIKE:
$likes[] = $it;
break;
case ACTIVITY_DISLIKE:
$dislikes[] = $it;
break;
case ACTIVITY_FRIEND:
$obj = parse_xml_string($xmlhead.$it['object']);
$it['fname'] = $obj->title;
$friends[] = $it;
break;
default:
if ($it['parent']!=$it['id']) {
$comments[] = $it;
} else {
$posts[] = $it;
}
if(count($r)) {
foreach ($r as $it) {
if($it['wall'])
$home ++;
else
$network ++;
switch($it['verb']){
case ACTIVITY_TAG:
$obj = parse_xml_string($xmlhead.$it['object']);
$it['tname'] = $obj->content;
$tags[] = $it;
break;
case ACTIVITY_LIKE:
$likes[] = $it;
break;
case ACTIVITY_DISLIKE:
$dislikes[] = $it;
break;
case ACTIVITY_FRIEND:
$obj = parse_xml_string($xmlhead.$it['object']);
$it['fname'] = $obj->title;
$friends[] = $it;
break;
default:
if ($it['parent']!=$it['id']) {
$comments[] = $it;
} else {
if(! $it['wall'])
$posts[] = $it;
}
}
}
}
$r = q("SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`,
`item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object`,
`pitem`.`author-name` as `pname`, `pitem`.`author-link` as `plink`
FROM `item` INNER JOIN `item` as `pitem` ON `pitem`.`id`=`item`.`parent`
WHERE `item`.`unseen` = 1 AND `item`.`visible` = 1 AND
`item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 1",
intval(local_user())
);
$home = count($r);
foreach ($r as $it) {
switch($it['verb']){
case ACTIVITY_TAG:
$obj = parse_xml_string($xmlhead.$it['object']);
$it['tname'] = $obj->content;
$tags[] = $it;
break;
case ACTIVITY_LIKE:
$likes[] = $it;
break;
case ACTIVITY_DISLIKE:
$dislikes[] = $it;
break;
case ACTIVITY_FRIEND:
$obj = parse_xml_string($xmlhead.$it['object']);
$it['fname'] = $obj->title;
$friends[] = $it;
break;
default:
if ($it['parent']!=$it['id']) $comments[] = $it;
}
}
$intros1 = q("SELECT `intro`.`id`, `intro`.`datetime`,
`fcontact`.`name`, `fcontact`.`url`, `fcontact`.`photo`
FROM `intro` LEFT JOIN `fcontact` ON `intro`.`fid` = `fcontact`.`id`
@ -122,24 +99,25 @@ function ping_init(&$a) {
intval(local_user()),
dbesc($myurl)
);
$mail = $mails[0]['total'];
if($mails)
$mail = $mails[0]['total'];
if ($a->config['register_policy'] == REGISTER_APPROVE && is_site_admin()){
$regs = q("SELECT `contact`.`name`, `contact`.`url`, `contact`.`micro`, `register`.`created`, COUNT(*) as `total` FROM `contact` RIGHT JOIN `register` ON `register`.`uid`=`contact`.`uid` WHERE `contact`.`self`=1");
$register = $regs[0]['total'];
if($regs)
$register = $regs[0]['total'];
} else {
$register = "0";
}
function xmlize($href, $name, $url, $photo, $date, $message){
$notsxml = '<note href="%s" name="%s" url="%s" photo="%s" date="%s">%s</note>';
function xmlize($href, $name, $url, $photo, $date, $seen, $message){
$notsxml = '<note href="%s" name="%s" url="%s" photo="%s" date="%s" seen="%s" >%s</note>';
return sprintf ( $notsxml,
xmlify($href), xmlify($name), xmlify($url), xmlify($photo), xmlify($date), xmlify($message)
);
xmlify($href), xmlify($name), xmlify($url), xmlify($photo), xmlify($date), xmlify($seen), xmlify($message)
);
}
echo "<intro>$intro</intro>
<mail>$mail</mail>
<net>$network</net>
@ -147,95 +125,100 @@ function ping_init(&$a) {
if ($register!=0) echo "<register>$register</register>";
$tot = $mail+$intro+$register+count($comments)+count($likes)+count($dislikes)+count($friends)+count($posts)+count($tags);
echo ' <notif count="'.$tot.'">';
require_once('include/bbcode.php');
$sysnotify = 0;
if(count($z)) {
foreach($z as $zz) {
echo xmlize($a->get_baseurl() . '/notify/' . $zz['id'], $zz['name'],$zz['url'],$zz['photo'],relative_date($zz['date']), bbcode($zz['msg']));
if($firehose) {
echo ' <notif count="'.$tot.'">';
}
else {
if(count($z)) {
foreach($z as $zz) {
if($zz['seen'] == 0)
$sysnotify ++;
}
}
echo ' <notif count="'. $sysnotify .'">';
if(count($z)) {
foreach($z as $zz) {
echo xmlize($a->get_baseurl() . '/notify/view/' . $zz['id'], $zz['name'],$zz['url'],$zz['photo'],relative_date($zz['date']), ($zz['seen'] ? 'notify-seen' : 'notify-unseen'), ($zz['seen'] ? '' : '&rarr; ') .strip_tags(bbcode($zz['msg'])));
}
}
}
if($firehose) {
if ($intro>0){
foreach ($intros as $i) {
echo xmlize( $a->get_baseurl().'/notifications/intros/'.$i['id'], $i['name'], $i['url'], $i['photo'], relative_date($i['datetime']), 'notify-unseen',t("{0} wants to be your friend") );
};
}
if ($mail>0){
foreach ($mails as $i) {
echo xmlize( $a->get_baseurl().'/message/'.$i['id'], $i['from-name'], $i['from-url'], $i['from-photo'], relative_date($i['created']), 'notify-unseen',t("{0} sent you a message") );
};
}
if ($register>0){
foreach ($regs as $i) {
echo xmlize( $a->get_baseurl().'/admin/users/', $i['name'], $i['url'], $i['micro'], relative_date($i['created']), 'notify-unseen',t("{0} requested registration") );
};
}
if (count($comments)){
foreach ($comments as $i) {
echo xmlize( $a->get_baseurl().'/display/'.$a->user['nickname']."/".$i['parent'], $i['author-name'], $i['author-link'], $i['author-avatar'], relative_date($i['created']), 'notify-unseen',sprintf( t("{0} commented %s's post"), $i['pname'] ) );
};
}
if (count($likes)){
foreach ($likes as $i) {
echo xmlize( $a->get_baseurl().'/display/'.$a->user['nickname']."/".$i['parent'], $i['author-name'], $i['author-link'], $i['author-avatar'], relative_date($i['created']), 'notify-unseen',sprintf( t("{0} liked %s's post"), $i['pname'] ) );
};
}
if (count($dislikes)){
foreach ($dislikes as $i) {
echo xmlize( $a->get_baseurl().'/display/'.$a->user['nickname']."/".$i['parent'], $i['author-name'], $i['author-link'], $i['author-avatar'], relative_date($i['created']), 'notify-unseen',sprintf( t("{0} disliked %s's post"), $i['pname'] ) );
};
}
if (count($friends)){
foreach ($friends as $i) {
echo xmlize($a->get_baseurl().'/display/'.$a->user['nickname']."/".$i['parent'],$i['author-name'],$i['author-link'], $i['author-avatar'], relative_date($i['created']), 'notify-unseen',sprintf( t("{0} is now friends with %s"), $i['fname'] ) );
};
}
if (count($posts)){
foreach ($posts as $i) {
echo xmlize( $a->get_baseurl().'/display/'.$a->user['nickname']."/".$i['parent'], $i['author-name'], $i['author-link'], $i['author-avatar'], relative_date($i['created']), 'notify-unseen',sprintf( t("{0} posted") ) );
};
}
if (count($tags)){
foreach ($tags as $i) {
echo xmlize( $a->get_baseurl().'/display/'.$a->user['nickname']."/".$i['parent'], $i['author-name'], $i['author-link'], $i['author-avatar'], relative_date($i['created']), 'notify-unseen',sprintf( t("{0} tagged %s's post with #%s"), $i['pname'], $i['tname'] ) );
};
}
/*
if ($intro>0){
foreach ($intros as $i) {
echo xmlize( $a->get_baseurl().'/notifications/intros/'.$i['id'], $i['name'], $i['url'], $i['photo'], relative_date($i['datetime']), t("{0} wants to be your friend") );
};
if (count($cit)){
foreach ($cit as $i) {
echo xmlize( $a->get_baseurl().'/display/'.$a->user['nickname']."/".$i['parent'], $i['author-name'], $i['author-link'], $i['author-avatar'], relative_date($i['created']), 'notify-unseen',t("{0} mentioned you in a post") );
};
}
}
if ($mail>0){
foreach ($mails as $i) {
echo xmlize( $a->get_baseurl().'/message/'.$i['id'], $i['from-name'], $i['from-url'], $i['from-photo'], relative_date($i['created']), t("{0} sent you a message") );
};
}
if ($register>0){
foreach ($regs as $i) {
echo xmlize( $a->get_baseurl().'/admin/users/', $i['name'], $i['url'], $i['micro'], relative_date($i['created']), t("{0} requested registration") );
};
}
if (count($comments)){
foreach ($comments as $i) {
echo xmlize( $a->get_baseurl().'/display/'.$a->user['nickname']."/".$i['parent'], $i['author-name'], $i['author-link'], $i['author-avatar'], relative_date($i['created']), sprintf( t("{0} commented %s's post"), $i['pname'] ) );
};
}
if (count($likes)){
foreach ($likes as $i) {
echo xmlize( $a->get_baseurl().'/display/'.$a->user['nickname']."/".$i['parent'], $i['author-name'], $i['author-link'], $i['author-avatar'], relative_date($i['created']), sprintf( t("{0} liked %s's post"), $i['pname'] ) );
};
}
if (count($dislikes)){
foreach ($dislikes as $i) {
echo xmlize( $a->get_baseurl().'/display/'.$a->user['nickname']."/".$i['parent'], $i['author-name'], $i['author-link'], $i['author-avatar'], relative_date($i['created']), sprintf( t("{0} disliked %s's post"), $i['pname'] ) );
};
}
if (count($friends)){
foreach ($friends as $i) {
echo xmlize($a->get_baseurl().'/display/'.$a->user['nickname']."/".$i['parent'],$i['author-name'],$i['author-link'], $i['author-avatar'], relative_date($i['created']), sprintf( t("{0} is now friends with %s"), $i['fname'] ) );
};
}
if (count($posts)){
foreach ($posts as $i) {
echo xmlize( $a->get_baseurl().'/display/'.$a->user['nickname']."/".$i['parent'], $i['author-name'], $i['author-link'], $i['author-avatar'], relative_date($i['created']), sprintf( t("{0} posted") ) );
};
}
if (count($tags)){
foreach ($tags as $i) {
echo xmlize( $a->get_baseurl().'/display/'.$a->user['nickname']."/".$i['parent'], $i['author-name'], $i['author-link'], $i['author-avatar'], relative_date($i['created']), sprintf( t("{0} tagged %s's post with #%s"), $i['pname'], $i['tname'] ) );
};
}
if (count($cit)){
foreach ($cit as $i) {
echo xmlize( $a->get_baseurl().'/display/'.$a->user['nickname']."/".$i['parent'], $i['author-name'], $i['author-link'], $i['author-avatar'], relative_date($i['created']), t("{0} mentioned you in a post") );
};
}
*/
echo " </notif>";
}
echo " <sysmsgs>";
if(x($_SESSION,'sysmsg')){
foreach ($_SESSION['sysmsg'] as $m){
echo "<notice>".xmlify($m)."</notice>";
}
unset($_SESSION['sysmsg']);
if(x($_SESSION,'sysmsg')){
foreach ($_SESSION['sysmsg'] as $m){
echo "<notice>".xmlify($m)."</notice>";
}
if(x($_SESSION,'sysmsg_info')){
foreach ($_SESSION['sysmsg_info'] as $m){
echo "<info>".xmlify($m)."</info>";
}
unset($_SESSION['sysmsg_info']);
unset($_SESSION['sysmsg']);
}
if(x($_SESSION,'sysmsg_info')){
foreach ($_SESSION['sysmsg_info'] as $m){
echo "<info>".xmlify($m)."</info>";
}
unset($_SESSION['sysmsg_info']);
}
echo " </sysmsgs>";
echo"</result>

View file

@ -210,7 +210,7 @@ function settings_post(&$a) {
}
}
$theme = ((x($_POST,'theme')) ? notags(trim($_POST['theme'])) : '');
$theme = ((x($_POST,'theme')) ? notags(trim($_POST['theme'])) : $a->user['theme']);
$username = ((x($_POST,'username')) ? notags(trim($_POST['username'])) : '');
$email = ((x($_POST,'email')) ? notags(trim($_POST['email'])) : '');
$timezone = ((x($_POST,'timezone')) ? notags(trim($_POST['timezone'])) : '');
@ -728,13 +728,23 @@ function settings_content(&$a) {
$default_theme = get_config('system','theme');
if(! $default_theme)
$default_theme = 'default';
$allowed_themes_str = get_config('system','allowed_themes');
$allowed_themes_raw = explode(',',$allowed_themes_str);
$allowed_themes = array();
if(count($allowed_themes_raw))
foreach($allowed_themes_raw as $x)
if(strlen(trim($x)))
$allowed_themes[] = trim($x);
$themes = array();
$files = glob('view/theme/*');
if($files) {
foreach($files as $file) {
$f = basename($file);
$is_experimental = file_exists($file . '/experimental');
if($allowed_themes) {
foreach($allowed_themes as $th) {
$f = $th;
$is_experimental = file_exists('view/theme/' . $th . '/experimental');
$unsupported = file_exists('view/theme/' . $th . '/unsupported');
if (!$is_experimental or ($is_experimental && (get_config('experimentals','exp_themes')==1 or get_config('experimentals','exp_themes')===false))){
$theme_name = (($is_experimental) ? sprintf("%s - \x28Experimental\x29", $f) : $f);
$themes[$f]=$theme_name;

View file

@ -1,6 +1,6 @@
<?php
define( 'UPDATE_VERSION' , 1123 );
define( 'UPDATE_VERSION' , 1126 );
/**
*
@ -1068,4 +1068,25 @@ function update_1121() {
function update_1122() {
q("ALTER TABLE `notify` ADD `hash` CHAR( 64 ) NOT NULL AFTER `id` ,
ADD INDEX ( `hash` ) ");
}
}
function update_1123() {
set_config('system','allowed_themes','dispy,quattro,testbubble,vier,darkbubble,darkzero,duepuntozero,greenzero,purplezero,quattro-green,slackr');
}
function update_1124() {
q("alter table item add index (`author-name`) ");
}
function update_1125() {
q("CREATE TABLE IF NOT EXISTS `notify-threads` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`notify-id` INT NOT NULL,
`master-parent-item` INT( 10 ) unsigned NOT NULL DEFAULT '0',
`parent-item` INT( 10 ) unsigned NOT NULL DEFAULT '0',
`receiver-uid` INT NOT NULL,
INDEX ( `master-parent-item` ),
INDEX ( `receiver-uid` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8");
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -15,6 +15,7 @@
<li class='admin link button $admin.site.2'><a href='$admin.site.0'>$admin.site.1</a></li>
<li class='admin link button $admin.users.2'><a href='$admin.users.0'>$admin.users.1</a><span id='pending-update' title='$h_pending'></span></li>
<li class='admin link button $admin.plugins.2'><a href='$admin.plugins.0'>$admin.plugins.1</a></li>
<li class='admin link button $admin.themes.2'><a href='$admin.themes.0'>$admin.themes.1</a></li>
</ul>
<ul class='admin linklist'>

View file

@ -4,8 +4,10 @@
<ul id='pluginslist'>
{{ for $plugins as $p }}
<li class='plugin $p.1'>
<a class='toggleplugin' href='$baseurl/admin/plugins/$p.0?a=t' title="{{if $p.1==on }}Disable{{ else }}Enable{{ endif }}" ><span class='icon $p.1'></span></a>
<a href='$baseurl/admin/plugins/$p.0'><span class='name'>$p.2.name</span></a> - <span class="version">$p.2.version</span>
<a class='toggleplugin' href='$baseurl/admin/$function/$p.0?a=t' title="{{if $p.1==on }}Disable{{ else }}Enable{{ endif }}" ><span class='icon $p.1'></span></a>
<a href='$baseurl/admin/$function/$p.0'><span class='name'>$p.2.name</span></a> - <span class="version">$p.2.version</span>
{{ if $p.2.experimental }} $experimental {{ endif }}{{ if $p.2.unsupported }} $unsupported {{ endif }}
<div class='desc'>$p.2.description</div>
</li>
{{ endfor }}

View file

@ -1,7 +1,7 @@
<div id='adminpage'>
<h1>$title - $page</h1>
<p><span class='toggleplugin icon $status'></span> $info.name - $info.version : <a href="$baseurl/admin/plugins/$plugin/?a=t">$action</a></p>
<p><span class='toggleplugin icon $status'></span> $info.name - $info.version : <a href="$baseurl/admin/$function/$plugin/?a=t">$action</a></p>
<p>$info.description</p>
<p class="author">
@ -13,7 +13,7 @@
{{ if $admin_form }}
<h3>$settings</h3>
<form method="post" action="$baseurl/admin/plugins/$plugin/">
<form method="post" action="$baseurl/admin/$function/$plugin/">
$admin_form
</form>
{{ endif }}

File diff suppressed because it is too large Load diff

View file

@ -34,13 +34,13 @@ $a->strings["Friend suggestion sent."] = "Kontaktvorschlag gesendet.";
$a->strings["Suggest Friends"] = "Kontakte vorschlagen";
$a->strings["Suggest a friend for %s"] = "Schlage %s einen Kontakt vor";
$a->strings["Event description and start time are required."] = "Ereignis Beschreibung und Startzeit sind erforderlich.";
$a->strings["l, F j"] = "l, F j";
$a->strings["Edit event"] = "Veranstaltung bearbeiten";
$a->strings["link to source"] = "Link zum Originalbeitrag";
$a->strings["Events"] = "Veranstaltungen";
$a->strings["Create New Event"] = "Neue Veranstaltung erstellen";
$a->strings["Previous"] = "Vorherige";
$a->strings["Next"] = "Nächste";
$a->strings["l, F j"] = "l, F j";
$a->strings["Edit event"] = "Veranstaltung bearbeiten";
$a->strings["link to source"] = "Link zum Originalbeitrag";
$a->strings["hour:minute"] = "Stunde:Minute";
$a->strings["Event details"] = "Veranstaltungsdetails";
$a->strings["Format is %s %s. Starting date and Description are required."] = "Format ist %s %s. Anfangsdatum und Beschreibung sind notwendig.";
@ -251,6 +251,7 @@ $a->strings["Welcome to %s"] = "Willkommen zu %s";
$a->strings["Invalid request identifier."] = "Invalid request identifier.";
$a->strings["Discard"] = "Verwerfen";
$a->strings["Ignore"] = "Ignorieren";
$a->strings["System"] = "System";
$a->strings["Network"] = "Netzwerk";
$a->strings["Personal"] = "Persönlich";
$a->strings["Home"] = "Pinnwand";
@ -282,15 +283,20 @@ $a->strings["%s is now friends with %s"] = "%s ist jetzt mit %s befreundet";
$a->strings["%s created a new post"] = "%s hat einen neuen Beitrag erstellt";
$a->strings["%s commented on %s's post"] = "%s hat %ss Beitrag kommentiert";
$a->strings["No more network notifications."] = "Keine weiteren Netzwerk-Benachrichtigungen.";
$a->strings["Network Notifications"] = "Netzwerk Benachrichtigungen";
$a->strings["No more system notifications."] = "Keine weiteren System Benachrichtigungen.";
$a->strings["System Notifications"] = "System Benachrichtigungen";
$a->strings["No more personal notifications."] = "Keine weiteren persönlichen Benachrichtigungen";
$a->strings["Personal Notifications"] = "Persönliche Benachrichtigungen";
$a->strings["No more home notifications."] = "Keine weiteren Pinnwand-Benachrichtigungen";
$a->strings["Home Notifications"] = "Pinnwand Benachrichtigungen";
$a->strings["Could not access contact record."] = "Konnte nicht auf die Kontaktdaten zugreifen.";
$a->strings["Could not locate selected profile."] = "Konnte das ausgewählte Profil nicht finden.";
$a->strings["Contact updated."] = "Kontakt aktualisiert.";
$a->strings["Contact has been blocked"] = "Kontakt wurde blockiert";
$a->strings["Contact has been unblocked"] = "Kontakt wurde wieder freigegeben";
$a->strings["Contact has been ignored"] = "Der Kontakt wurde ignoriert";
$a->strings["Contact has been unignored"] = "Kontakt wurde ignoriert";
$a->strings["Contact has been ignored"] = "Kontakt wurde ignoriert";
$a->strings["Contact has been unignored"] = "Kontakt wird nicht mehr ignoriert";
$a->strings["stopped following"] = "wird nicht mehr gefolgt";
$a->strings["Contact has been removed."] = "Kontakt wurde entfernt.";
$a->strings["You are mutual friends with %s"] = "Du hast mit %s eine beidseitige Freundschaft";
@ -328,17 +334,19 @@ $a->strings["Update now"] = "Jetzt aktualisieren";
$a->strings["Currently blocked"] = "Derzeit geblockt";
$a->strings["Currently ignored"] = "Derzeit ignoriert";
$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "Antworten/Likes auf deine öffentlichen Beiträge <strong>könnten</strong> weiterhin sichtbar sein";
$a->strings["Contacts"] = "Kontakte";
$a->strings["Show Unblocked Contacts"] = "Nicht geblockte Kontakte anzeigen";
$a->strings["Show Blocked Contacts"] = "Blockierte Kontakte anzeigen";
$a->strings["Show All Contacts"] = "Alle Kontakte anzeigen";
$a->strings["Search your contacts"] = "Suche in deinen Kontakten";
$a->strings["Finding: "] = "Funde: ";
$a->strings["Find"] = "Finde";
$a->strings["All Contacts"] = "Alle Kontakte";
$a->strings["Unblocked Contacts"] = "Nicht blockierte Kontakte";
$a->strings["Blocked Contacts"] = "Blockierte Kontakte";
$a->strings["Ignored Contacts"] = "Ignorierte Kontakte";
$a->strings["Hidden Contacts"] = "Verborgene Kontakte";
$a->strings["Mutual Friendship"] = "Beidseitige Freundschaft";
$a->strings["is a fan of yours"] = "ist ein Fan von dir";
$a->strings["you are a fan of"] = "du bist Fan von";
$a->strings["Edit contact"] = "Kontakt bearbeiten";
$a->strings["Contacts"] = "Kontakte";
$a->strings["Search your contacts"] = "Suche in deinen Kontakten";
$a->strings["Finding: "] = "Funde: ";
$a->strings["Find"] = "Finde";
$a->strings["No valid account found."] = "Kein gültiger Account gefunden.";
$a->strings["Password reset request issued. Check your email."] = "Zurücksetzen des Passworts eingeleitet. Bitte überprüfe deine E-Mail.";
$a->strings["Password reset requested at %s"] = "Anfrage zum Zurücksetzen des Passworts auf %s erhalten";
@ -365,7 +373,7 @@ $a->strings["Password update failed. Please try again."] = "Aktualisierung des P
$a->strings[" Please use a shorter name."] = " Bitte verwende einen kürzeren Namen.";
$a->strings[" Name too short."] = " Name ist zu kurz.";
$a->strings[" Not valid email."] = " Keine gültige E-Mail.";
$a->strings[" Cannot change to that email."] = " Cannot change to that email.";
$a->strings[" Cannot change to that email."] = "Ändern der E-Mail nicht möglich. ";
$a->strings["Settings updated."] = "Einstellungen aktualisiert.";
$a->strings["Account settings"] = "Account Einstellungen";
$a->strings["Connector settings"] = "Connector-Einstellungen";
@ -452,9 +460,9 @@ $a->strings["Notification Settings"] = "Benachrichtigungseinstellungen";
$a->strings["Send a notification email when:"] = "Benachrichtigungs-E-Mail senden wenn:";
$a->strings["You receive an introduction"] = "Du eine Kontaktanfrage erhältst";
$a->strings["Your introductions are confirmed"] = "Eine deiner Kontaktanfragen akzeptiert wurde";
$a->strings["Someone writes on your profile wall"] = "Jemand etwas auf deine Pinnwand schreibt";
$a->strings["Someone writes a followup comment"] = "Jemand auch einen Kommentar verfasst";
$a->strings["You receive a private message"] = "Du eine private Nachricht erhältst";
$a->strings["Someone writes on your profile wall"] = "Jemand schreibt etwas auf deine Pinnwand";
$a->strings["Someone writes a followup comment"] = "Jemand verfasst auch einen Kommentar";
$a->strings["You receive a private message"] = "Du erhältst eine private Nachricht";
$a->strings["You receive a friend suggestion"] = "Du eine Empfehlung erhältst";
$a->strings["You are tagged in a post"] = "Du wurdest in einem Beitrag erwähnt";
$a->strings["Advanced Page Settings"] = "Erweiterte Seiten-Einstellungen";
@ -485,16 +493,18 @@ $a->strings["Personal Notes"] = "Persönliche Notizen";
$a->strings["Save"] = "Speichern";
$a->strings["Welcome to Friendica"] = "Willkommen bei Friendica";
$a->strings["New Member Checklist"] = "Checkliste für neue Mitglieder";
$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page."] = "Wir möchten dir einige Tipps und Links anbieten, um deine Erfahrung mit Friendica so angenehm wie möglich zu machen. Klicke einfach einen Aspekt an, um weitere Informationen zu erhalten.";
$a->strings["On your <em>Settings</em> page - change your initial password. Also make a note of your Identity Address. This will be useful in making friends."] = "Ändere dein anfängliches Passwort auf der <em>Einstellungen</em> Seite. Bei dieser Gelegenheit solltest du dir die Adresse deines Profils merken, diese wird benötigt um mit Anderen in Kontakt zu treten.";
$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page. A link to this page will be visible from your home page for two weeks after your initial registration and then will quietly disappear."] = "Wir möchten Dir einige Tipps und Links anbieten, die Dir helfen könnten, den Einstieg angenehmer zu machen. Klicke auf ein Element, um die entsprechende Seite zu besuchen. Ein Link zu dieser Seite hier bleibt sichtbar über Deine Pinnwand für zwei Wochen nach dem Registrierungsdatum und wird dann verschwinden.";
$a->strings["On your <em>Settings</em> page - change your initial password. Also make a note of your Identity Address. This looks just like an email address - and will be useful in making friends on the free social web."] = "Ändere bitte unter <em>Einstellungen</em> Dein Passwort. Außerdem merke Dir Deine Indentifikations Adresse. Diese sieht aus wie eine E-Mail Adresse und wird benötig um Freunschaften mit anderen im Friendica Netzwerk zu schliessen.";
$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "Überprüfe die restlichen Einstellungen, insbesondere die Einstellungen zur Privatsphäre. Wenn du dein Profil nicht veröffentlichst ist das wie wenn niemand deine Telefonnummer kennt. Im Allgemeinen solltest du es veröffentlichen - außer all deine Freunde und potentiellen Freunde wissen wie man dich findet.";
$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Lade ein Profilbild hoch falls du es noch nicht getan hast. Studien haben gezeigt, dass es zehnmal wahrscheinlicher ist neue Freunde zu finden, wenn du ein Bild von dir selbst verwendest als wenn du dies nicht tust.";
$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "Richte die Verbindung zu Facebook ein, wenn du im Augenblick ein Facebook Konto hast und (optional) deine Facebook Freunde und Unterhaltungen importieren willst.";
$a->strings["<em>If</em> this is your own personal server, installing the Facebook addon may ease your transition to the free social web."] = "<em>Wenn</em> dies dein privater Server ist könnte die Installation des Facebook Connectors deinen Umzug ins freie Soziale Netz angenehmer gestalten.";
$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Gib deine E-Mail-Zugangsinformationen auf der Connector-Einstellungsseite ein, falls du E-Mails aus deinem Posteingang importieren und mit Freunden und Mailinglisten interagieren willlst.";
$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Editiere dein <strong>Standard</strong> Profil nach deinen Vorlieben. Überprüfe die Einstellungen zum Verbergen deiner Freundesliste vor unbekannten Betrachtern des Profils.";
$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Trage ein paar öffentliche Stichwörter in dein Standardprofil ein, die deine Interessen beschreiben. Eventuell sind wir in der Lage Leute zu finden, die deine Interessen teilen und können dir dann Kontakte vorschlagen.";
$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "Die Kontakte-Seite ist die Einstiegsseite, von der aus du Kontakte verwalten und dich mit Freunden in anderen Netzwerken verbinden kannst. Normalerweise gibst du dazu einfach ihre Adresse oder die URL der Seite im Kasten <em>Neuen Kontakt hinzufügen</em> ein.";
$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "Über die Verzeichnisseite kannst du andere Personen auf diesem Server oder anderen verteilten Seiten finden. Halte nach einem <em>Verbinden</em> oder <em>Folgen</em> Link auf deren Profilseiten Ausschau und gib deine eigene Profiladresse an falls du danach gefragt wirst.";
$a->strings["On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours."] = "Im seitlichen Bedienfeld der Kontakte-Seite gibt es diverse Werkzeuge, um neue Freunde zu finden. Wir können Menschen mit den gleichen Interessen finden, anhand von Namen oder Interessen suchen oder aber aufgrund vorhandener Kontakte neue Freunde vorschlagen.\nAuf einer brandneuen - soeben erstellten - Seite starten die Kontaktvorschläge innerhalb von 24 Stunden.";
$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Sobald du einige Freunde gefunden hast, organisiere sie in Gruppen zur privaten Kommunikation im Seitenmenü der Kontakte-Seite. Du kannst dann mit jeder dieser Gruppen von der Netzwerkseite aus privat interagieren.";
$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Unsere <strong>Hilfe</strong> Seiten können herangezogen werden, um weitere Einzelheiten zu andern Programm Features zu erhalten.";
$a->strings["Item not available."] = "Beitrag nicht verfügbar.";
@ -511,14 +521,13 @@ $a->strings["Unable to remove group."] = "Konnte die Gruppe nicht entfernen.";
$a->strings["Click on a contact to add or remove."] = "Klicke einen Kontakt an, um ihn hinzuzufügen oder zu entfernen";
$a->strings["Group Editor"] = "Gruppeneditor";
$a->strings["Members"] = "Mitglieder";
$a->strings["All Contacts"] = "Alle Kontakte";
$a->strings["Invalid profile identifier."] = "Ungültiger Profil-Bezeichner";
$a->strings["Profile Visibility Editor"] = "Editor für die Profil-Sichtbarkeit";
$a->strings["Profile"] = "Profil";
$a->strings["Visible To"] = "Sichtbar für";
$a->strings["All Contacts (with secure profile access)"] = "Alle Kontakte (mit gesichertem Profilzugriff)";
$a->strings["View Contacts"] = "Kontakte anzeigen";
$a->strings["No contacts."] = "Keine Kontakte.";
$a->strings["View Contacts"] = "Kontakte anzeigen";
$a->strings["An invitation is required."] = "Du benötigst eine Einladung.";
$a->strings["Invitation could not be verified."] = "Die Einladung konnte nicht überprüft werden.";
$a->strings["Invalid OpenID url"] = "Ungültige OpenID URL";
@ -531,7 +540,7 @@ $a->strings["Not a valid email address."] = "Keine gültige E-Mail-Adresse.";
$a->strings["Cannot use that email."] = "Konnte diese E-Mail-Adresse nicht verwenden.";
$a->strings["Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and must also begin with a letter."] = "Dein Spitzname darf nur aus Buchstaben und Zahlen (\"a-z\",\"0-9\", \"_\" und \"-\") bestehen, außerdem muss er mit einem Buchstaben beginnen.";
$a->strings["Nickname is already registered. Please choose another."] = "Dieser Spitzname ist bereits vergeben. Bitte wähle einen anderen.";
$a->strings["SERIOUS ERROR: Generation of security keys failed."] = "SERIOUS ERROR: Generation of security keys failed.";
$a->strings["SERIOUS ERROR: Generation of security keys failed."] = "FATALER FEHLER: Sicherheitsschlüssel konnten nicht erzeugt werden.";
$a->strings["An error occurred during registration. Please try again."] = "Wärend der Anmeldung ist ein Fehler aufgetreten. Bitte versuche es noch einmal.";
$a->strings["An error occurred creating your default profile. Please try again."] = "Bei der Erstellung des Standard-Profils ist ein Fehler aufgetreten. Bitte versuche es noch einmal.";
$a->strings["Registration details for %s"] = "Details der Registration von %s";
@ -614,6 +623,7 @@ $a->strings["No friends to display."] = "Keine Freunde zum Anzeigen.";
$a->strings["Site"] = "Seite";
$a->strings["Users"] = "Nutzer";
$a->strings["Plugins"] = "Plugins";
$a->strings["Themes"] = "Themen";
$a->strings["Logs"] = "Protokolle";
$a->strings["User registrations waiting for confirmation"] = "Nutzeranmeldungen die auf Bestätigung warten";
$a->strings["Administration"] = "Administration";
@ -685,6 +695,7 @@ $a->strings["Disable"] = "Ausschalten";
$a->strings["Enable"] = "Einschalten";
$a->strings["Toggle"] = "Umschalten";
$a->strings["Settings"] = "Einstellungen";
$a->strings["No themes found."] = "Keine Themen gefunden.";
$a->strings["Log settings updated."] = "Protokolleinstellungen aktualisiert.";
$a->strings["Clear"] = "löschen";
$a->strings["Debugging"] = "Protokoll führen";
@ -941,6 +952,16 @@ $a->strings["Blocked %s - Click to open/close"] = "%s blockiert - Zum Öffnen/Sc
$a->strings["Unblock Author"] = "Autor freischalten";
$a->strings["Block Author"] = "Autor blockieren";
$a->strings["blockem settings updated"] = "blockem Einstellungen aktualisiert";
$a->strings[":-)"] = ":-)";
$a->strings[":-("] = ":-(";
$a->strings["lol"] = "lol";
$a->strings["Quick Comment Settings"] = "Schnell-Kommentar Einstellungen";
$a->strings["Enter quick comments, one per line"] = "Gibt ein Schnell-Kommentar pro Zeile ein";
$a->strings["Quick Comment settings saved."] = "Schnell-Kommentare Einstellungen gespeichert";
$a->strings["Tile Server URL"] = "Tile Server URL";
$a->strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">public tile servers</a>"] = "Eine Liste <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">öffentlicher Tile Server</a>";
$a->strings["Default zoom"] = "Standard Zoom";
$a->strings["The default zoom level. (1:world, 18:highest)"] = "Standard Zoo,level (1: Welt; 18: höchstes)";
$a->strings["Editplain settings updated."] = "Editplain Einstellungen aktualisiert";
$a->strings["Editplain Settings"] = "Editplain Einstellungen";
$a->strings["Disable richtext status editor"] = "RichText Editor deaktivieren";
@ -967,6 +988,7 @@ $a->strings["Current StatusNet API is"] = "Derzeitige StatusNet-API-URL lautet";
$a->strings["Cancel StatusNet Connection"] = "Verbindung zum StatusNet Server abbrechen";
$a->strings["Currently connected to: "] = "Momentan verbunden mit: ";
$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen StatusNet Konto veröffentlicht werden. Du kannst das (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen.";
$a->strings["<strong>Note</strong>: Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "<strong>Hinweis</strong>: Aufgrund deiner Privatsphären Einstellungen (<em>Profil-Details vor unbekannten Betrachtern verbergen?</em>) wird der Link der eventuell an an deinen StatusNet Account weitergeleitete angehangen wird um auf den original Artikel zu verweisen den Betrachter auf eine leere Seite führen, auf der er darüber informiert wird, dass der Zugriff eingeschränkt wurde.";
$a->strings["Allow posting to StatusNet"] = "Veröffentlichung bei StatusNet erlauben";
$a->strings["Send public postings to StatusNet by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei StatusNet";
$a->strings["Clear OAuth configuration"] = "OAuth-Konfiguration löschen";
@ -987,11 +1009,18 @@ $a->strings["WordPress username"] = "WordPress-Benutzername";
$a->strings["WordPress password"] = "WordPress-Passwort";
$a->strings["WordPress API URL"] = "WordPress-API-URL";
$a->strings["Post to WordPress by default"] = "Standardmäßig auf WordPress veröffentlichen";
$a->strings["\"Show more\" Settings"] = "\"Mehr zeigen\" Einstellungen";
$a->strings["Enable Show More"] = "Aktiviere \"Mehr zeigen\"";
$a->strings["Cutting posts after how much characters"] = "Begrenze Beiträge nach der Anzahl der Buchstaben";
$a->strings["Show More Settings saved."] = "\"Mehr zeigen\" Einstellungen gesichert.";
$a->strings["Show More"] = "\"Mehr zeigen\"";
$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Diese Website benutzt <a href='http://www.piwik.org'>Piwik</a>, eine Open Source-Software zur statistischen Auswertung der Besucherzugriffe.";
$a->strings["If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = "Wenn Du nicht willst, dass Deine Besuche auf diese Weise gespeichert werden, kannst Du <a href='%s'>ein Cookie setzen</a>. Dann wird Piwik Dich auf dieser Website nicht mehr verfolgen (opt-out).";
$a->strings["Piwik Base URL"] = "Piwik Basis URL";
$a->strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "Absoluter Pfad zu deiner Piwik Installation (ohen Protokoll (http/s) und mit abschließendem Schrägstrich)";
$a->strings["Site ID"] = "Seiten ID";
$a->strings["Show opt-out cookie link?"] = "Link zum Setzen des Opt-Out Cookies anzeigen?";
$a->strings["Asynchronous tracking"] = "Asynchroned Tracken";
$a->strings["Post to Twitter"] = "Bei Twitter veröffentlichen";
$a->strings["Twitter settings updated."] = "Twitter Einstellungen aktualisiert.";
$a->strings["Twitter Posting Settings"] = "Twitter-Beitragseinstellungen";
@ -1000,6 +1029,7 @@ $a->strings["At this Friendica instance the Twitter plugin was enabled but you h
$a->strings["Log in with Twitter"] = "bei Twitter anmelden";
$a->strings["Copy the PIN from Twitter here"] = "Kopiere die Twitter-PIN hier her";
$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen Twitter Konto veröffentlicht werden. Du kannst dies (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen.";
$a->strings["<strong>Note</strong>: Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "<strong>Hinweis</strong>: Aufgrund deiner Privatsphären Einstellungen (<em>Profil-Details vor unbekannten Betrachtern verbergen?</em>) wird der Link der eventuell an an deinen Twitter Account weitergeleitete angehangen wird um auf den original Artikel zu verweisen den Betrachter auf eine leere Seite führen, auf der er darüber informiert wird, dass der Zugriff eingeschränkt wurde.";
$a->strings["Allow posting to Twitter"] = "Veröffentlichung bei Twitter erlauben";
$a->strings["Send public postings to Twitter by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei Twitter";
$a->strings["Consumer key"] = "Consumer Key";
@ -1170,6 +1200,7 @@ $a->strings["People directory"] = "Nutzerverzeichnis";
$a->strings["Conversations from your friends"] = "Unterhaltungen deiner Kontakte";
$a->strings["Friend Requests"] = "Kontaktanfragen";
$a->strings["See all notifications"] = "Alle Benachrichtigungen anzeigen";
$a->strings["Mark all system notifications seen"] = "Markiere alle System Benachrichtigungen als gelesen";
$a->strings["Private mail"] = "Private Email";
$a->strings["Manage"] = "Verwalten";
$a->strings["Manage other pages"] = "Andere Seiten verwalten";
@ -1214,6 +1245,7 @@ $a->strings["second"] = "Sekunde";
$a->strings["seconds"] = "Sekunden";
$a->strings["%1\$d %2\$s ago"] = "%1\$d %2\$s her";
$a->strings["From: "] = "Von: ";
$a->strings["$1 wrote:"] = "$1 geschrieben:";
$a->strings["Image/photo"] = "Bild/Foto";
$a->strings["Cannot locate DNS info for database server '%s'"] = "Kann die DNS Informationen für den Datenbanken Server '%s' nicht ermitteln.";
$a->strings["[no subject]"] = "[kein Betreff]";
@ -1225,19 +1257,33 @@ $a->strings["Thank You,"] = "Danke,";
$a->strings["%s Administrator"] = "der Administrator von %s";
$a->strings["New mail received at %s"] = "Neue Nachricht auf %s empfangen";
$a->strings["%s sent you a new private message at %s."] = "%s hat dir eine neue private Nachricht auf %s geschrieben.";
$a->strings["%s sent you %s."] = "%s hat Dir geschickt %s";
$a->strings["a private message"] = "eine private Nachricht";
$a->strings["Please visit %s to view and/or reply to your private messages."] = "Bitte besuche %s, um deine privaten Nachrichten anzusehen und/oder zu beantworten.";
$a->strings["%s commented on an item at %s"] = "%s kommentierte einen Beitrag auf %s";
$a->strings["%s commented on an item/conversation you have been following."] = "%s hat einen Beitrag kommentiert, dem du folgst.";
$a->strings["%s commented in %s."] = "%s wurde kommentiert in %s";
$a->strings["a watched conversation"] = "eine beobachtete Unterhaltung";
$a->strings["Please visit %s to view and/or reply to the conversation."] = "Bitte besuche %s, um die Konversation anzusehen und/oder zu kommentieren.";
$a->strings["%s posted to your profile wall at %s"] = "%s hat auf deine Pinnwand bei %s gepostet";
$a->strings["%s posted to %s"] = "%s schrieb an %s";
$a->strings["your profile wall."] = "Deine Pinnwand";
$a->strings["%s tagged you at %s"] = "%s hat dich auf %s erwähnt";
$a->strings["%s %s."] = "%s %s.";
$a->strings["tagged you"] = "erwähnte Dich";
$a->strings["%s tagged your post at %s"] = "%s hat deinen Beitrag auf %s getaggt";
$a->strings["%s tagged %s"] = "%s markierte %s";
$a->strings["your post"] = "Dein Beitrag";
$a->strings["Introduction received at %s"] = "Kontaktanfrage auf %s erhalten";
$a->strings["You've received an introduction from '%s' at %s"] = "Du hast eine Kontaktanfrage von '%s' auf %s erhalten";
$a->strings["You've received %s from %s."] = "Du hast %s von %s erhalten.";
$a->strings["an introduction"] = "eine Einführung";
$a->strings["You may visit their profile at %s"] = "Hier kannst du das Profil betrachten: %s";
$a->strings["Please visit %s to approve or reject the introduction."] = "Bitte besuche %s, um die Kontaktanfrage anzunehmen oder abzulehnen.";
$a->strings["Friend suggestion received at %s"] = "Kontaktvorschlag empfangen auf %s";
$a->strings["You've received a friend suggestion from '%s' at %s"] = "Du hast von '%s' einen Kontaktvorschlag erhalten auf %s";
$a->strings["You've received %s for %s from %s."] = "Du hast %s für %s von %s erhalten.";
$a->strings["a friend suggestion"] = "ein Freunde Vorschlag";
$a->strings["Name:"] = "Name:";
$a->strings["Photo:"] = "Foto:";
$a->strings["Please visit %s to approve or reject the suggestion."] = "Bitte besuche %s, um den Vorschlag zu akzeptieren oder abzulehnen.";

View file

@ -1,5 +1,5 @@
<h1>Notifications</h1>
<h1>$notif_header</h1>
{{ inc common_tabs.tpl }}{{ endinc }}

View file

View file

BIN
view/theme/darkzero-NS/border.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 B

BIN
view/theme/darkzero-NS/head.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 B

BIN
view/theme/darkzero-NS/shiny.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 362 B

View file

@ -0,0 +1,99 @@
@import url('../duepuntozero/style.css');
/* dark variation Fabio Comuni <fabrix.xm@gmail.com> */
a:link, a:visited { color: #99CCFF; text-decoration: none; }
a:hover {text-decoration: underline; }
input, select, textarea {
background-color: #222222;
color: #FFFFFF !important;
border: 1px solid #444444;
}
.openid { background-color: #222222;}
body { background-color: #222222; color: #cccccc; background-image: url(head.jpg); }
aside{ background-image: url(border.jpg); padding-bottom: 0px; }
section { background-color: #333333; background-image: url(border.jpg); }
.tabs { background-image: url(head.jpg); }
div.wall-item-content-wrapper.shiny { background-image: url('shiny.png'); }
nav #banner #logo-text a { color: #ffffff; }
.wall-item-content-wrapper { border: 1px solid #444444; }
.wall-item-tools { background-color: #444444; background-image: none;}
.comment-edit-wrapper{ background-color: #333333; }
.wall-item-content-wrapper.comment { background-color: #444444; border: 0px;}
.photo-top-album-name{ background-color: #333333; }
.photo-album-image-wrapper .caption { background-color: rgba(51, 51, 51, 0.8); color: #FFFFFF; }
.nav-selected.nav-link { color: #ffffff!important; border-bottom: 0px}
.nav-commlink, .nav-login-link {background-color: #b7bab3;}
.nav-commlink:link, .nav-commlink:visited,
.nav-login-link:link, .nav-login-link:visited{
color: #ffffff;
}
.fakelink, .fakelink:visited {
color: #99CCFF;
}
.wall-item-name-link {
color: #99CCFF;
}
.wall-item-photo-menu li a {
color: #CCCCCC; background-color: #333333;
}
.wall-item-photo-menu li a:hover {
background-color: #CCCCCC; color: #333333;
}
#page-footer { min-height: 1em;}
footer {
margin: 0px 10%;
display: block;
background-image: url('sectionend.jpg');
background-position: top left;
background-repeat: repeat-x;
height: 25px;
}
input#dfrn-url {
background-color: #222222;
color: #FFFFFF !important;
}
.pager_first a, .pager_last a, .pager_prev a, .pager_next a, .pager_n a, .pager_current {
color: #000088;
}
#jot-perms-icon {
float: left;
}
#jot-title {
background-color: #333333;
border: 1px solid #333333;
}
#jot-title::-webkit-input-placeholder{ color: #555555!important;}
#jot-title:-moz-placeholder{color: #555555!important;}
#jot-title:hover,
#jot-title:focus {
border: 1px solid #cccccc;
}
.wall-item-content {
max-height: 20000px;
overflow: none;
}
blockquote {
background: #ddd;
color: #000;
}

View file

@ -0,0 +1,57 @@
<?php
/*
* Name: Darkzero-NS
* Description: Darkzero theme with posts that do not scroll
* Version: 1.0
* Author: Mike Macgirvin <mike@macgirvin.com>
*/
$a->theme_info = array(
'extends' => 'duepuntozero',
);
$a->page['htmlhead'] .= <<< EOT
<script>
$(document).ready(function() {
$('.group-edit-icon').hover(
function() {
$(this).addClass('icon'); $(this).removeClass('iconspacer');},
function() {
$(this).removeClass('icon'); $(this).addClass('iconspacer');}
);
$('.sidebar-group-element').hover(
function() {
id = $(this).attr('id');
$('#edit-' + id).addClass('icon'); $('#edit-' + id).removeClass('iconspacer');},
function() {
id = $(this).attr('id');
$('#edit-' + id).removeClass('icon');$('#edit-' + id).addClass('iconspacer');}
);
$('.savedsearchdrop').hover(
function() {
$(this).addClass('drop'); $(this).addClass('icon'); $(this).removeClass('iconspacer');},
function() {
$(this).removeClass('drop'); $(this).removeClass('icon'); $(this).addClass('iconspacer');}
);
$('.savedsearchterm').hover(
function() {
id = $(this).attr('id');
$('#drop-' + id).addClass('icon'); $('#drop-' + id).addClass('drophide'); $('#drop-' + id).removeClass('iconspacer');},
function() {
id = $(this).attr('id');
$('#drop-' + id).removeClass('icon');$('#drop-' + id).removeClass('drophide'); $('#drop-' + id).addClass('iconspacer');}
);
});
</script>
EOT;

View file

View file

@ -88,3 +88,7 @@ input#dfrn-url {
#jot-title:focus {
border: 1px solid #cccccc;
}
blockquote {
background: #ddd;
color: #000;
}

View file

@ -1,4 +1,11 @@
<?php
/*
* Name: Darkzero
* Version: 1.0
* Author: Fabio Communi <fabrix.xm@gmail.com>
*/
$a->theme_info = array(
'extends' => 'duepuntozero',
);

View file

@ -39,8 +39,21 @@
<span id="mail-update" class="nav-ajax-left"></span>
{{ endif }}
{{ if $nav.manage }}<a id="nav-manage-link" class="nav-commlink $nav.manage.2 $sel.manage" href="$nav.manage.0" title="$nav.manage.3">$nav.manage.1</a>{{ endif }}
{{ if $nav.notifications }}
<a id="nav-notifications-linkmenu" class="nav-commlink" href="$nav.notifications.0" rel="#nav-notifications-menu" title="$nav.notifications.1">$nav.notifications.1</a>
<span id="notify-update" class="nav-ajax-left"></span>
<ul id="nav-notifications-menu" class="menu-popup">
<li id="nav-notifications-see-all"><a href="$nav.notifications.all.0">$nav.notifications.all.1</a></li>
<li id="nav-notifications-mark-all"><a href="#" onclick="notifyMarkAll(); return false;">$nav.notifications.mark.1</a></li>
<li class="empty">$emptynotifications</li>
</ul>
{{ endif }}
{{ if $nav.settings }}<a id="nav-settings-link" class="nav-link $nav.settings.2" href="$nav.settings.0" title="$nav.settings.3">$nav.settings.1</a>{{ endif }}
{{ if $nav.profiles }}<a id="nav-profiles-link" class="nav-link $nav.profiles.2" href="$nav.profiles.0" title="$nav.profiles.3" >$nav.profiles.1</a>{{ endif }}
@ -49,3 +62,7 @@
<span id="nav-end"></span>
<span id="banner">$banner</span>
</nav>
<ul id="nav-notifications-template" style="display:none;" rel="template">
<li class="{4}"><a href="{0}"><img src="{1}" height="24" width="24" alt="" />{2} <span class="notif-when">{3}</span></a></li>
</ul>

View file

@ -2967,3 +2967,73 @@ div.jGrowl div.info {
opacity: 1.0;
filter:alpha(opacity=100);
}
/* notifications popup menu */
.nav-notify {
display: none;
position: absolute;
font-size: 10px;
padding: 1px 3px;
top: 0px;
right: -10px;
min-width: 15px;
text-align: right;
}
.nav-notify.show {
display: block;
}
ul.menu-popup {
position: absolute;
display: none;
width: 10em;
margin: 0px;
padding: 0px;
list-style: none;
z-index: 100000;
top: 90px;
left: 400px;
}
#nav-notifications-menu {
width: 320px;
max-height: 400px;
overflow-y: scroll;overflow-style:scrollbar;
background-color:#FFFFFF;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius:5px;
border: 1px solid #888;
}
#nav-notifications-menu .contactname { font-weight: bold; font-size: 0.9em; }
#nav-notifications-menu img { float: left; margin-right: 5px; }
#nav-notifications-menu .notif-when { font-size: 0.8em; display: block; }
#nav-notifications-menu li {
padding: 7px 0px 7px 10px;
word-wrap:normal;
border-bottom: 1px solid #000;
}
#nav-notifications-menu li:hover {
}
#nav-notifications-menu a:hover {
text-decoration: underline;
}
.notif-item a {
color: #000000;
}
.notif-item a:hover {
text-decoration: underline;
}
.notif-image {
width: 32px;
height: 32px;
padding: 7px 7px 0px 0px;
}
.notify-seen {
background: #DDDDDD;
}

View file

View file

View file

View file

View file