This commit is contained in:
zotlabs 2019-05-28 16:16:29 -07:00
commit 932b414063
21 changed files with 1763 additions and 1465 deletions

View File

@ -1,3 +1,59 @@
Hubzilla 4.2 (2019-??-??)
- Introduce Calendar app which deprecates Events and CalDAV apps and streamlines the featuresets
- Update mod cal to reflect changes in the calendar app
- Improve timezone detection for CalDAV calendars
- Add mention support to event description in channel calendar
- Update jgrowl library
- Do not try to oembed URLs without embed tags
- Optimise pdf oembed processing
- Add form security token to mod register
- Replace photo URL for gallery on clonned channel post sync
- Update justified gallery library
- Update bootstrap libraries
- Use "cache" flag for bbcode() on content destined for zot6
- Improve DB indexing
- Drop deprecated columns from channel the table
- Replace own image URL in clonned channel posts
- Improve DB update handling
- Improve item deletion when a contact was removed
- Zot6 compatibility for emoji reactions
- Add threaded comments support (disabled by default)
- Improve xmlify()/unxmlify() performance
- Update blueimp/jquery-file-uplad library
- Update sabre/vobject library
- Various doco updates
- Implement remove profile photo button (reset to default photo)
- Implement remove cover photo button
- Update the homeinstall script
- Add command line tool for photo thumbnails storage conversion
- Implement option to store photo thumbnails in filesystem instead of DB
Bugfixes
- Fix encoded URLs in code blocks
- Fix wiki headers not escaped
- Fix possible xchan protocol confusion in new_contact()
- Fix xchan_url not displayed if xchan_addr not available
- Fix suggestion ordering in mod directory
- Fix event attachment delivery to zot6
Addons
- pubcrawl: improve friendica compatibility by adding the nonstandard diaspora:guid field
- pubcrawl: initial suport for events
- pubcrawl: improve permalink detection
- flashcards: fix moving learn buttons if viewport sizes changes
- flashcards: Move card details to the bottom of a card
- upgrade_info: provide links to changelog
- photocache: do not save filename for cached photos
- pubcrawl: save local comment activitypub payload in iconfig to be used for relay
- flashcards: UI improvements in box settings
- pubcrawl: implement profile update messages
- pubcrawl: use URI instead of object for actor
- flashcards: fix jumping sync button
- pubcrawl: add threaded comments support
- pubcrawl: ignore target encoding errors
- pubcrawl: format photo items for activitypub
Hubzilla 4.0.3 (2019-04-26)
- Add attachments to zot6 event objects
- Add zot6 to federated transports

View File

@ -2766,7 +2766,7 @@ class Libzot {
$profile['description'] = $p[0]['pdesc'];
$profile['birthday'] = $p[0]['dob'];
if(($profile['birthday'] != '0000-00-00') && (($bd = z_birthday($p[0]['dob'],$e['channel_timezone'])) !== ''))
if(($profile['birthday'] != '0000-00-00') && (($bd = z_birthday($p[0]['dob'],'UTC')) !== ''))
$profile['next_birthday'] = $bd;
if($age = age($p[0]['dob'],$e['channel_timezone'],''))

View File

@ -84,6 +84,7 @@ class Cal extends \Zotlabs\Web\Controller {
'$module_url' => '/cal/' . $channel['channel_address'],
'$modparams' => 2,
'$lang' => \App::$language,
'$timezone' => date_default_timezone_get(),
'$first_day' => $first_day
));
@ -215,8 +216,8 @@ class Cal extends \Zotlabs\Web\Controller {
$sql_extra .= " and etype != 'birthday' ";
if (x($_GET,'id')){
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
from event left join item on resource_id = event_hash where resource_type = 'event' and event.uid = %d and event.id = %d $sql_extra limit 1",
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan, item.id as item_id
from event left join item on resource_id = event_hash where resource_type = 'event' and event.uid = %d and event.id = %d $sql_extra limit 1",
intval($channel['channel_id']),
intval($_GET['id'])
);
@ -227,12 +228,12 @@ class Cal extends \Zotlabs\Web\Controller {
// Noting this for now - it will need to be fixed here and in Friendica.
// Ultimately the finish date shouldn't be involved in the query.
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
from event left join item on event_hash = resource_id
where resource_type = 'event' and event.uid = %d and event.uid = item.uid $ignored
AND (( adjust = 0 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )
OR ( adjust = 1 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )) $sql_extra ",
intval($channel['channel_id']),
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan, item.id as item_id
from event left join item on event.event_hash = item.resource_id
where item.resource_type = 'event' and event.uid = %d and event.uid = item.uid $ignored
AND (( event.adjust = 0 AND ( event.dtend >= '%s' or event.nofinish = 1 ) AND event.dtstart <= '%s' )
OR ( event.adjust = 1 AND ( event.dtend >= '%s' or event.nofinish = 1 ) AND event.dtstart <= '%s' )) ",
intval(local_channel()),
dbesc($start),
dbesc($finish),
dbesc($adjust_start),
@ -266,16 +267,23 @@ class Cal extends \Zotlabs\Web\Controller {
if($r) {
foreach($r as $rr) {
$j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtstart'], 'j') : datetime_convert('UTC','UTC',$rr['dtstart'],'j'));
$d = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtstart'], $fmt) : datetime_convert('UTC','UTC',$rr['dtstart'],$fmt));
$tz = get_iconfig($rr, 'event', 'timezone');
if(! $tz)
$tz = 'UTC';
$rr['timezone'] = $tz;
$j = (($rr['adjust']) ? datetime_convert($tz,date_default_timezone_get(),$rr['dtstart'], 'j') : datetime_convert('UTC','UTC',$rr['dtstart'],'j'));
$d = (($rr['adjust']) ? datetime_convert($tz,date_default_timezone_get(),$rr['dtstart'], $fmt) : datetime_convert('UTC','UTC',$rr['dtstart'],$fmt));
$d = day_translate($d);
$start = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtstart'], 'c') : datetime_convert('UTC','UTC',$rr['dtstart'],'c'));
$start = (($rr['adjust']) ? datetime_convert($tz,date_default_timezone_get(),$rr['dtstart'], 'c') : datetime_convert('UTC','UTC',$rr['dtstart'],'c'));
if ($rr['nofinish']){
$end = null;
} else {
$end = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtend'], 'c') : datetime_convert('UTC','UTC',$rr['dtend'],'c'));
$end = (($rr['adjust']) ? datetime_convert($tz,date_default_timezone_get(),$rr['dtend'], 'c') : datetime_convert('UTC','UTC',$rr['dtend'],'c'));
}
@ -302,7 +310,7 @@ class Cal extends \Zotlabs\Web\Controller {
'start'=> $start,
'end' => $end,
'drop' => $drop,
'allDay' => false,
'allDay' => (($rr['adjust']) ? 0 : 1),
'title' => $title,
'j' => $j,

View File

@ -271,11 +271,17 @@ class Cdav extends Controller {
if(!cdav_perms($id[0],$calendars,true))
return;
$timezone = ((x($_POST,'timezone_select')) ? escape_tags(trim($_POST['timezone_select'])) : '');
$tz = (($timezone) ? $timezone : date_default_timezone_get());
$allday = $_REQUEST['allday'];
$title = $_REQUEST['title'];
$start = datetime_convert(App::$timezone, 'UTC', $_REQUEST['dtstart']);
$start = datetime_convert($tz, 'UTC', $_REQUEST['dtstart']);
$dtstart = new \DateTime($start);
if($_REQUEST['dtend']) {
$end = datetime_convert(App::$timezone, 'UTC', $_REQUEST['dtend']);
$end = datetime_convert($tz, 'UTC', $_REQUEST['dtend']);
$dtend = new \DateTime($end);
}
$description = $_REQUEST['description'];
@ -301,16 +307,23 @@ class Cdav extends Controller {
'DTSTART' => $dtstart
]
]);
if($dtend) {
$vcalendar->VEVENT->add('DTEND', $dtend);
$vcalendar->VEVENT->DTEND['TZID'] = App::$timezone;
if($allday)
$vcalendar->VEVENT->DTEND['VALUE'] = 'DATE';
else
$vcalendar->VEVENT->DTEND['TZID'] = $tz;
}
if($description)
$vcalendar->VEVENT->add('DESCRIPTION', $description);
if($location)
$vcalendar->VEVENT->add('LOCATION', $location);
$vcalendar->VEVENT->DTSTART['TZID'] = App::$timezone;
if($allday)
$vcalendar->VEVENT->DTSTART['VALUE'] = 'DATE';
else
$vcalendar->VEVENT->DTSTART['TZID'] = $tz;
$calendarData = $vcalendar->serialize();
@ -348,12 +361,17 @@ class Cdav extends Controller {
if(!cdav_perms($id[0],$calendars,true))
return;
$timezone = ((x($_POST,'timezone_select')) ? escape_tags(trim($_POST['timezone_select'])) : '');
$tz = (($timezone) ? $timezone : date_default_timezone_get());
$allday = $_REQUEST['allday'];
$uri = $_REQUEST['uri'];
$title = $_REQUEST['title'];
$start = datetime_convert(App::$timezone, 'UTC', $_REQUEST['dtstart']);
$start = datetime_convert($tz, 'UTC', $_REQUEST['dtstart']);
$dtstart = new \DateTime($start);
if($_REQUEST['dtend']) {
$end = datetime_convert(App::$timezone, 'UTC', $_REQUEST['dtend']);
$end = datetime_convert($tz, 'UTC', $_REQUEST['dtend']);
$dtend = new \DateTime($end);
}
$description = $_REQUEST['description'];
@ -365,12 +383,23 @@ class Cdav extends Controller {
if($title)
$vcalendar->VEVENT->SUMMARY = $title;
if($dtstart)
if($dtstart) {
$vcalendar->VEVENT->DTSTART = $dtstart;
if($dtend)
if($allday)
$vcalendar->VEVENT->DTSTART['VALUE'] = 'DATE';
else
$vcalendar->VEVENT->DTSTART['TZID'] = $tz;
}
if($dtend) {
$vcalendar->VEVENT->DTEND = $dtend;
if($allday)
$vcalendar->VEVENT->DTEND['VALUE'] = 'DATE';
else
$vcalendar->VEVENT->DTEND['TZID'] = $tz;
}
else
unset($vcalendar->VEVENT->DTEND);
if($description)
$vcalendar->VEVENT->DESCRIPTION = $description;
if($location)
@ -406,11 +435,16 @@ class Cdav extends Controller {
if(!cdav_perms($id[0],$calendars,true))
return;
$timezone = ((x($_POST,'timezone_select')) ? escape_tags(trim($_POST['timezone_select'])) : '');
$tz = (($timezone) ? $timezone : date_default_timezone_get());
$allday = $_REQUEST['allday'];
$uri = $_REQUEST['uri'];
$start = datetime_convert(App::$timezone, 'UTC', $_REQUEST['dtstart']);
$start = datetime_convert($tz, 'UTC', $_REQUEST['dtstart']);
$dtstart = new \DateTime($start);
if($_REQUEST['dtend']) {
$end = datetime_convert(App::$timezone, 'UTC', $_REQUEST['dtend']);
$end = datetime_convert($tz, 'UTC', $_REQUEST['dtend']);
$dtend = new \DateTime($end);
}
@ -420,13 +454,20 @@ class Cdav extends Controller {
if($dtstart) {
$vcalendar->VEVENT->DTSTART = $dtstart;
if($allday)
$vcalendar->VEVENT->DTSTART['VALUE'] = 'DATE';
else
$vcalendar->VEVENT->DTSTART['TZID'] = $tz;
}
if($dtend) {
$vcalendar->VEVENT->DTEND = $dtend;
if($allday)
$vcalendar->VEVENT->DTEND['VALUE'] = 'DATE';
else
$vcalendar->VEVENT->DTEND['TZID'] = $tz;
}
else {
else
unset($vcalendar->VEVENT->DTEND);
}
$calendarData = $vcalendar->serialize();
@ -915,8 +956,13 @@ class Cdav extends Controller {
xchan_query($r);
$r = fetch_post_tags($r,true);
$r[0]['dtstart'] = (($r[0]['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$r[0]['dtstart'], 'c') : datetime_convert('UTC','UTC',$r[0]['dtstart'],'c'));
$r[0]['dtend'] = (($r[0]['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$r[0]['dtend'], 'c') : datetime_convert('UTC','UTC',$r[0]['dtend'],'c'));
$tz = get_iconfig($r[0], 'event', 'timezone');
if(! $tz)
$tz = 'UTC';
$r[0]['timezone'] = $tz;
$r[0]['dtstart'] = (($r[0]['adjust']) ? datetime_convert('UTC', date_default_timezone_get(), $r[0]['dtstart'], 'c') : datetime_convert('UTC', 'UTC', $r[0]['dtstart'], 'c'));
$r[0]['dtend'] = (($r[0]['adjust']) ? datetime_convert('UTC', date_default_timezone_get(), $r[0]['dtend'], 'c') : datetime_convert('UTC', 'UTC' ,$r[0]['dtend'], 'c'));
$r[0]['plink'] = [$r[0]['plink'], t('Link to source')];
@ -984,9 +1030,11 @@ class Cdav extends Controller {
$first_day = feature_enabled(local_channel(), 'cal_first_day');
$first_day = (($first_day) ? $first_day : 0);
$title = ['title', t('Event title')];
$title = ['title', t('Event title') ];
$dtstart = ['dtstart', t('Start date and time')];
$dtend = ['dtend', t('End date and time')];
$timezone_select = ['timezone_select' , t('Timezone:'), date_default_timezone_get(), '', get_timezones()];
$description = ['description', t('Description')];
$location = ['location', t('Location')];
@ -1000,14 +1048,13 @@ class Cdav extends Controller {
//$acl = (($orig_event['event_xchan']) ? '' : populate_acl(((x($orig_event)) ? $orig_event : $perm_defaults), false, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_stream')));
$acl = populate_acl($perm_defaults, false, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_stream'));
//$permissions = ((x($orig_event)) ? $orig_event : $perm_defaults);
$permissions = $perm_defaults;
$permissions = (($resource_id) ? $resource : $perm_defaults);
$o .= replace_macros(get_markup_template('cdav_calendar.tpl'), [
'$sources' => $sources,
'$color' => $color,
'$lang' => App::$language,
'$timezone' => App::$timezone,
'$timezone' => date_default_timezone_get(),
'$first_day' => $first_day,
'$prev' => t('Previous'),
'$next' => t('Next'),
@ -1047,7 +1094,8 @@ class Cdav extends Controller {
'$categories_label' => t('Categories'),
'$resource' => json_encode($resource),
'$categories' => $categories
'$categories' => $categories,
'$timezone_select' => ((feature_enabled(local_channel(),'event_tz_select')) ? $timezone_select : '')
]);
return $o;
@ -1076,8 +1124,8 @@ class Cdav extends Controller {
$filters['comp-filters'][0]['time-range']['end'] = $end;
$uris = $caldavBackend->calendarQuery($id, $filters);
if($uris) {
$objects = $caldavBackend->getMultipleCalendarObjects($id, $uris);
foreach($objects as $object) {
@ -1096,30 +1144,33 @@ class Cdav extends Controller {
$dtend = (string)$vevent->DTEND;
$description = (string)$vevent->DESCRIPTION;
$location = (string)$vevent->LOCATION;
$timezone = (string)$vevent->DTSTART['TZID'];
$timezone_str = (string)$vevent->DTSTART['TZID'];
$rw = ((cdav_perms($id[0],$calendars,true)) ? true : false);
$editable = $rw ? true : false;
$recurrent = ((isset($vevent->{'RECURRENCE-ID'})) ? true : false);
if($recurrent) {
$editable = false;
$timezone = $recurrent_timezone;
$timezone_str = $recurrent_timezone;
}
$allDay = false;
// Try to get an usable olson format timezone
$timezone_obj = \Sabre\VObject\TimeZoneUtil::getTimeZone($timezone_str, $vcalendar);
$timezone = $timezone_obj->getName();
// allDay event rules
if(!strpos($dtstart, 'T') && !strpos($dtend, 'T'))
$allDay = true;
if(strpos($dtstart, 'T000000') && strpos($dtend, 'T000000'))
$allDay = true;
// If we got nothing fallback to UTC
if(! $timezone)
$timezone = 'UTC';
$allDay = (((string)$vevent->DTSTART['VALUE'] == 'DATE') ? true : false);
$events[] = [
'calendar_id' => $id,
'uri' => $object['uri'],
'title' => $title,
'start' => datetime_convert($timezone, $timezone, $dtstart, 'c'),
'end' => (($dtend) ? datetime_convert($timezone, $timezone, $dtend, 'c') : ''),
'timezone' => $timezone,
'start' => datetime_convert($timezone, date_default_timezone_get(), $dtstart, 'c'),
'end' => (($dtend) ? datetime_convert($timezone, date_default_timezone_get(), $dtend, 'c') : ''),
'description' => $description,
'location' => $location,
'allDay' => $allDay,

View File

@ -22,52 +22,20 @@ class Channel_calendar extends \Zotlabs\Web\Controller {
$xchan = ((x($_POST,'xchan')) ? dbesc($_POST['xchan']) : '');
$uid = local_channel();
$start_text = escape_tags($_REQUEST['dtstart']);
$finish_text = escape_tags($_REQUEST['dtend']);
$adjust = intval($_POST['adjust']);
$nofinish = intval($_POST['nofinish']);
$timezone = ((x($_POST,'timezone_select')) ? notags(trim($_POST['timezone_select'])) : '');
// only allow editing your own events.
if(($xchan) && ($xchan !== get_observer_hash()))
return;
$timezone = ((x($_POST,'timezone_select')) ? escape_tags(trim($_POST['timezone_select'])) : '');
$tz = (($timezone) ? $timezone : date_default_timezone_get());
$categories = escape_tags(trim($_POST['categories']));
// only allow editing your own events.
if(($xchan) && ($xchan !== get_observer_hash()))
return;
if($start_text) {
$start = $start_text;
}
else {
$start = sprintf('%d-%d-%d %d:%d:0',$startyear,$startmonth,$startday,$starthour,$startminute);
}
$adjust = intval($_POST['adjust']);
if($finish_text) {
$finish = $finish_text;
}
else {
$finish = sprintf('%d-%d-%d %d:%d:0',$finishyear,$finishmonth,$finishday,$finishhour,$finishminute);
}
if($nofinish) {
$finish = NULL_DATE;
}
if($adjust) {
$start = datetime_convert($tz,'UTC',$start);
if(! $nofinish)
$finish = datetime_convert($tz,'UTC',$finish);
}
else {
$start = datetime_convert('UTC','UTC',$start);
if(! $nofinish)
$finish = datetime_convert('UTC','UTC',$finish);
}
$start = (($adjust) ? datetime_convert($tz, 'UTC', escape_tags($_REQUEST['dtstart'])) : datetime_convert('UTC', 'UTC', escape_tags($_REQUEST['dtstart'])));
$finish = (($adjust) ? datetime_convert($tz, 'UTC', escape_tags($_REQUEST['dtend'])) : datetime_convert('UTC', 'UTC', escape_tags($_REQUEST['dtend'])));
$summary = escape_tags(trim($_POST['summary']));
$desc = escape_tags(trim($_POST['desc']));
@ -176,7 +144,7 @@ class Channel_calendar extends \Zotlabs\Web\Controller {
$datarray['location'] = $location;
$datarray['etype'] = $type;
$datarray['adjust'] = $adjust;
$datarray['nofinish'] = $nofinish;
$datarray['nofinish'] = 0;
$datarray['uid'] = local_channel();
$datarray['account'] = get_account_id();
$datarray['event_xchan'] = $channel['channel_hash'];
@ -188,6 +156,8 @@ class Channel_calendar extends \Zotlabs\Web\Controller {
$datarray['id'] = $event_id;
$datarray['created'] = $created;
$datarray['edited'] = $edited;
$datarray['timezone'] = $tz;
if(intval($_REQUEST['preview'])) {
$html = format_event_html($datarray);
@ -322,10 +292,9 @@ class Channel_calendar extends \Zotlabs\Web\Controller {
$start = datetime_convert('UTC','UTC',$start);
$finish = datetime_convert('UTC','UTC',$finish);
$adjust_start = datetime_convert('UTC', date_default_timezone_get(), $start);
$adjust_finish = datetime_convert('UTC', date_default_timezone_get(), $finish);
if (x($_GET,'id')){
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan, item.id as item_id
from event left join item on item.resource_id = event.event_hash
@ -357,13 +326,11 @@ class Channel_calendar extends \Zotlabs\Web\Controller {
dbesc($adjust_start),
dbesc($adjust_finish)
);
}
if($r && ! $export) {
xchan_query($r);
$r = fetch_post_tags($r,true);
$r = sort_by_date($r);
}
@ -373,17 +340,16 @@ class Channel_calendar extends \Zotlabs\Web\Controller {
foreach($r as $rr) {
$start = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtstart'], 'c') : datetime_convert('UTC','UTC',$rr['dtstart'],'c'));
$tz = get_iconfig($rr, 'event', 'timezone');
if(! $tz)
$tz = 'UTC';
$start = (($rr['adjust']) ? datetime_convert($tz, date_default_timezone_get(), $rr['dtstart'], 'c') : datetime_convert('UTC', 'UTC', $rr['dtstart'], 'c'));
if ($rr['nofinish']){
$end = null;
} else {
$end = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtend'], 'c') : datetime_convert('UTC','UTC',$rr['dtend'],'c'));
// give a fake end to birthdays so they get crammed into a
// single day on the calendar
if($rr['etype'] === 'birthday')
$end = null;
$end = (($rr['adjust']) ? datetime_convert($tz, date_default_timezone_get(), $rr['dtend'], 'c') : datetime_convert('UTC', 'UTC', $rr['dtend'], 'c'));
}
$catsenabled = feature_enabled(local_channel(),'categories');
@ -399,14 +365,6 @@ class Channel_calendar extends \Zotlabs\Web\Controller {
}
}
$allDay = false;
// allDay event rules
if(!strpos($start, 'T') && !strpos($end, 'T'))
$allDay = true;
if(strpos($start, 'T00:00:00') && strpos($end, 'T00:00:00'))
$allDay = true;
$edit = ((local_channel() && $rr['author_xchan'] == get_observer_hash()) ? array(z_root().'/events/'.$rr['event_hash'].'?expandform=1',t('Edit event'),'','') : false);
$drop = array(z_root().'/events/drop/'.$rr['event_hash'],t('Delete event'),'','');
@ -416,13 +374,14 @@ class Channel_calendar extends \Zotlabs\Web\Controller {
'rw' => true,
'id'=>$rr['id'],
'uri' => $rr['event_hash'],
'timezone' => $tz,
'start'=> $start,
'end' => $end,
'drop' => $drop,
'allDay' => $allDay,
'allDay' => (($rr['adjust']) ? 0 : 1),
'title' => htmlentities($rr['summary'], ENT_COMPAT, 'UTF-8', false),
'editable' => $edit ? true : false,
'item'=>$rr,
'item' => $rr,
'plink' => [$rr['plink'], t('Link to source')],
'description' => htmlentities($rr['description'], ENT_COMPAT, 'UTF-8', false),
'location' => htmlentities($rr['location'], ENT_COMPAT, 'UTF-8', false),

View File

@ -293,9 +293,9 @@ class Wiki extends Controller {
}
//$wikiheaderName = urldecode($wikiUrlName);
$wikiheaderName = NativeWiki::name_decode($wikiUrlName);
$wikiheaderName = escape_tags(NativeWiki::name_decode($wikiUrlName));
//$wikiheaderPage = urldecode($pageUrlName);
$wikiheaderPage = NativeWiki::name_decode($pageUrlName);
$wikiheaderPage = escape_tags(NativeWiki::name_decode($pageUrlName));
$renamePage = (($wikiheaderPage === 'Home') ? '' : t('Rename page'));
$sharePage = t('Share');
@ -373,13 +373,13 @@ class Wiki extends Controller {
$placeholder = t('Short description of your changes (optional)');
$zrl = urlencode( z_root() . '/wiki/' . argv(1) . '/' . NativeWiki::name_encode($wikiUrlName) . '/' . NativeWiki::name_encode($pageUrlName) );
$zrl = z_root() . '/wiki/' . argv(1) . '/' . NativeWiki::name_encode($wikiUrlName) . '/' . NativeWiki::name_encode($pageUrlName);
$o .= replace_macros(get_markup_template('wiki.tpl'),array(
'$wikiheaderName' => $wikiheaderName,
'$wikiheaderPage' => $wikiheaderPage,
'$renamePage' => $renamePage,
'$sharePage' => $sharePage,
'$shareLink' => '#^[zrl=' . $zrl . ']' . '[ ' . $owner['channel_name'] . ' ] ' . $wikiheaderName . ' - ' . $wikiheaderPage . '[/zrl]',
'$shareLink' => urlencode('#^[zrl=' . $zrl . ']' . '[ ' . $owner['channel_name'] . ' ] ' . $wikiheaderName . ' - ' . $wikiheaderPage . '[/zrl]'),
'$showPageControls' => $showPageControls,
'$editOrSourceLabel' => (($showPageControls) ? t('Edit') : t('Source')),
'$tools_label' => 'Page Tools',

View File

@ -509,7 +509,7 @@ abstract class PhotoDriver {
$arr['imgscale'] = $scale;
if(boolval(get_config('system','filesystem_storage_thumbnails', 0)) && $scale > 0) {
$channel = \App::get_channel();
$channel = channelx_by_n($arr['uid']);
$arr['os_storage'] = 1;
$arr['os_syspath'] = 'store/' . $channel['channel_address'] . '/' . $arr['os_path'] . '-' . $scale;
if(! $this->saveImage($arr['os_syspath']))

View File

@ -69,7 +69,7 @@ class Notifications {
'label' => t('New Events'),
'title' => t('New Events Notifications'),
'viewall' => [
'url' => 'events',
'url' => 'cdav/calendar',
'label' => t('View events')
],
'markall' => [

View File

@ -84,7 +84,8 @@ define ( 'DIRECTORY_FALLBACK_MASTER', 'https://zotadel.net');
$DIRECTORY_FALLBACK_SERVERS = array(
'https://zotadel.net',
'https://zotsite.net'
'https://zotsite.net',
'https://hub.netzgemeinde.eu'
);

View File

@ -516,13 +516,14 @@ function update_birthdays() {
'event_xchan' => $rr['xchan_hash'],
'dtstart' => datetime_convert('UTC', 'UTC', $rr['abook_dob']),
'dtend' => datetime_convert('UTC', 'UTC', $rr['abook_dob'] . ' + 1 day '),
'adjust' => intval(feature_enabled($rr['abook_channel'],'smart_birthdays')),
'adjust' => 0,
'summary' => sprintf( t('%1$s\'s birthday'), $rr['xchan_name']),
'description' => sprintf( t('Happy Birthday %1$s'), '[zrl=' . $rr['xchan_url'] . ']' . $rr['xchan_name'] . '[/zrl]'),
'etype' => 'birthday',
];
$z = event_store_event($ev);
if ($z) {
$item_id = event_store_item($ev, $z);
q("update abook set abook_dob = '%s' where abook_id = %d",

View File

@ -27,6 +27,7 @@ function format_event_html($ev) {
if(! ((is_array($ev)) && count($ev)))
return '';
$tz = (($ev['timezone']) ? $ev['timezone'] : 'UTC');
$bd_format = t('l F d, Y \@ g:i A') ; // Friday January 18, 2011 @ 8:01 AM
@ -39,7 +40,7 @@ function format_event_html($ev) {
$o .= '<div class="event-start"><span class="event-label">' . t('Starts:') . '</span>&nbsp;<span class="dtstart" title="'
. datetime_convert('UTC', 'UTC', $ev['dtstart'], (($ev['adjust']) ? ATOM_TIME : 'Y-m-d\TH:i:s' ))
. '" >'
. (($ev['adjust']) ? day_translate(datetime_convert('UTC', date_default_timezone_get(),
. (($ev['adjust']) ? day_translate(datetime_convert($tz, date_default_timezone_get(),
$ev['dtstart'] , $bd_format ))
: day_translate(datetime_convert('UTC', 'UTC',
$ev['dtstart'] , $bd_format)))
@ -49,7 +50,7 @@ function format_event_html($ev) {
$o .= '<div class="event-end" ><span class="event-label">' . t('Finishes:') . '</span>&nbsp;<span class="dtend" title="'
. datetime_convert('UTC','UTC',$ev['dtend'], (($ev['adjust']) ? ATOM_TIME : 'Y-m-d\TH:i:s' ))
. '" >'
. (($ev['adjust']) ? day_translate(datetime_convert('UTC', date_default_timezone_get(),
. (($ev['adjust']) ? day_translate(datetime_convert($tz, date_default_timezone_get(),
$ev['dtend'] , $bd_format ))
: day_translate(datetime_convert('UTC', 'UTC',
$ev['dtend'] , $bd_format )))
@ -75,17 +76,35 @@ function format_event_obj($jobject) {
//ensure compatibility with older items - this check can be removed at a later point
if(array_key_exists('description', $object)) {
$bd_format = t('l F d, Y \@ g:i A'); // Friday January 18, 2011 @ 8:01 AM
$tz = (($object['timezone']) ? $object['timezone'] : 'UTC');
$allday = (($object['adjust']) ? false : true);
$dtstart = new DateTime($object['dtstart']);
$dtend = new DateTime($object['dtend']);
$dtdiff = $dtstart->diff($dtend);
if($allday && ($dtdiff->days < 2))
$oneday = true;
if($allday && !$oneday) {
// Subtract one day from the end date so we can use the "first day - last day" format for display.
$dtend->modify('-1 day');
$object['dtend'] = datetime_convert('UTC', 'UTC', $dtend->format('Y-m-d H:i:s'));
}
$bd_format = (($allday) ? t('l F d, Y') : t('l F d, Y \@ g:i A')); // Friday January 18, 2011 @ 8:01 AM or Friday January 18, 2011 for allday events
$event['header'] = replace_macros(get_markup_template('event_item_header.tpl'),array(
'$title' => zidify_links(smilies(bbcode($object['title']))),
'$dtstart_label' => t('Starts:'),
'$dtstart_title' => datetime_convert('UTC', 'UTC', $object['dtstart'], (($object['adjust']) ? ATOM_TIME : 'Y-m-d\TH:i:s' )),
'$dtstart_dt' => (($object['adjust']) ? day_translate(datetime_convert('UTC', date_default_timezone_get(), $object['dtstart'] , $bd_format )) : day_translate(datetime_convert('UTC', 'UTC', $object['dtstart'] , $bd_format))),
'$dtstart_label' => t('Start:'),
'$dtstart_title' => datetime_convert($tz, date_default_timezone_get(), $object['dtstart'], (($object['adjust']) ? ATOM_TIME : 'Y-m-d\TH:i:s' )),
'$dtstart_dt' => (($object['adjust']) ? day_translate(datetime_convert($tz, date_default_timezone_get(), $object['dtstart'] , $bd_format )) : day_translate(datetime_convert('UTC', 'UTC', $object['dtstart'] , $bd_format))),
'$finish' => (($object['nofinish']) ? false : true),
'$dtend_label' => t('Finishes:'),
'$dtend_title' => datetime_convert('UTC','UTC',$object['dtend'], (($object['adjust']) ? ATOM_TIME : 'Y-m-d\TH:i:s' )),
'$dtend_dt' => (($object['adjust']) ? day_translate(datetime_convert('UTC', date_default_timezone_get(), $object['dtend'] , $bd_format )) : day_translate(datetime_convert('UTC', 'UTC', $object['dtend'] , $bd_format )))
'$dtend_label' => t('End:'),
'$dtend_title' => datetime_convert($tz, date_default_timezone_get(), $object['dtend'], (($object['adjust']) ? ATOM_TIME : 'Y-m-d\TH:i:s' )),
'$dtend_dt' => (($object['adjust']) ? day_translate(datetime_convert($tz, date_default_timezone_get(), $object['dtend'] , $bd_format )) : day_translate(datetime_convert('UTC', 'UTC', $object['dtend'] , $bd_format ))),
'$allday' => $allday,
'$oneday' => $oneday
));
$event['content'] = replace_macros(get_markup_template('event_item_content.tpl'),array(
@ -1042,6 +1061,7 @@ function event_store_item($arr, $event) {
'type' => ACTIVITY_OBJ_EVENT,
'id' => z_root() . '/event/' . $r[0]['resource_id'],
'title' => $arr['summary'],
'timezone' => $arr['timezone'],
'dtstart' => $arr['dtstart'],
'dtend' => $arr['dtend'],
'nofinish' => $arr['nofinish'],
@ -1107,6 +1127,8 @@ function event_store_item($arr, $event) {
}
$item_id = $r[0]['id'];
set_iconfig($item_id, 'event', 'timezone', $arr['timezone'], true);
/**
* @hooks event_updated
* Called when an event record is modified.
@ -1197,6 +1219,7 @@ function event_store_item($arr, $event) {
'type' => ACTIVITY_OBJ_EVENT,
'id' => z_root() . '/event/' . $event['event_hash'],
'title' => $arr['summary'],
'timezone' => $arr['timezone'],
'dtstart' => $arr['dtstart'],
'dtend' => $arr['dtend'],
'nofinish' => $arr['nofinish'],
@ -1223,6 +1246,7 @@ function event_store_item($arr, $event) {
// activities refer to the item message_id as the parent.
set_iconfig($item_arr, 'system','event_id',$event['event_hash'],true);
set_iconfig($item_arr, 'event','timezone',$arr['timezone'],true);
$res = item_store($item_arr);

View File

@ -87,6 +87,14 @@ function get_features($filtered = true, $level = (-1)) {
t('Default is Sunday'),
false,
get_config('feature_lock','cal_first_day')
],
[
'event_tz_select',
t('Event Timezone Selection'),
t('Allow event creation in timezones other than your own.'),
false,
get_config('feature_lock','event_tz_select'),
]
],
@ -282,22 +290,6 @@ function get_features($filtered = true, $level = (-1)) {
t('Default is Sunday'),
false,
get_config('feature_lock','events_cal_first_day')
],
[
'smart_birthdays',
t('Smart Birthdays'),
t('Make birthday events timezone aware in case your friends are scattered across the planet.'),
true,
get_config('feature_lock','smart_birthdays'),
],
[
'event_tz_select',
t('Event Timezone Selection'),
t('Allow event creation in timezones other than your own.'),
false,
get_config('feature_lock','event_tz_select'),
]
],

View File

@ -219,8 +219,7 @@ function html2bbcode($message)
$message = $doc->saveHTML();
// I'm removing something really disturbing
// Don't know exactly what it is
// I'm removing the UTF-8 encoding of a NO-BREAK SPACE codepoint
$message = str_replace(chr(194).chr(160), ' ', $message);
$message = str_replace("&nbsp;", " ", $message);

View File

@ -76,6 +76,8 @@ function markdown_to_bb($s, $use_zrl = false, $options = []) {
$s = html2bbcode($s);
$s = bb_code_protect($s);
// Convert everything that looks like a link to a link
if($use_zrl) {
if (strpos($s,'[/img]') !== false) {
@ -88,6 +90,8 @@ function markdown_to_bb($s, $use_zrl = false, $options = []) {
$s = preg_replace("/([^\]\=\{\/]|^)(https?\:\/\/)([a-zA-Z0-9\pL\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,\@\(\)]+)/ismu", '$1[url=$2$3]$2$3[/url]',$s);
}
$s = bb_code_unprotect($s);
// remove duplicate adjacent code tags
$s = preg_replace("/(\[code\])+(.*?)(\[\/code\])+/ism","[code]$2[/code]", $s);

View File

@ -4430,7 +4430,7 @@ function zotinfo($arr) {
$profile['description'] = $p[0]['pdesc'];
$profile['birthday'] = $p[0]['dob'];
if(($profile['birthday'] != '0000-00-00') && (($bd = z_birthday($p[0]['dob'],$e['channel_timezone'])) !== ''))
if(($profile['birthday'] != '0000-00-00') && (($bd = z_birthday($p[0]['dob'],'UTC')) !== ''))
$profile['next_birthday'] = $bd;
if($age = age($p[0]['dob'],$e['channel_timezone'],''))

File diff suppressed because it is too large Load Diff

View File

@ -92,6 +92,8 @@ App::$strings["Profile"] = "Perfil";
App::$strings["Click on a contact to add or remove."] = "Pulsar en un contacto para añadirlo o eliminarlo.";
App::$strings["Visible To"] = "Visible para";
App::$strings["All Connections"] = "Todas las conexiones";
App::$strings["Calendar entries imported."] = "Entradas de calendario importadas.";
App::$strings["No calendar entries found."] = "No se han encontrado entradas de calendario.";
App::$strings["INVALID EVENT DISMISSED!"] = "¡EVENTO NO VÁLIDO RECHAZADO!";
App::$strings["Summary: "] = "Resumen: ";
App::$strings["Unknown"] = "Desconocido";
@ -99,13 +101,11 @@ App::$strings["Date: "] = "Fecha: ";
App::$strings["Reason: "] = "Razón: ";
App::$strings["INVALID CARD DISMISSED!"] = "¡TARJETA NO VÁLIDA RECHAZADA!";
App::$strings["Name: "] = "Nombre: ";
App::$strings["CalDAV App"] = "App CalDav";
App::$strings["CalDAV capable calendar"] = "Calendario compatible con CalDAV";
App::$strings["CardDAV App"] = "App CarDav";
App::$strings["CalDAV capable addressbook"] = "Libreta de direcciones compatible con CalDav";
App::$strings["Link to source"] = "Enlace a la fuente";
App::$strings["Event title"] = "Título del evento";
App::$strings["Start date and time"] = "Fecha y hora de comienzo";
App::$strings["Example: YYYY-MM-DD HH:mm"] = "Ejemplo: YYYY-MM-DD HH:mm";
App::$strings["End date and time"] = "Fecha y hora de finalización";
App::$strings["Description"] = "Descripción";
App::$strings["Location"] = "Ubicación";
@ -120,9 +120,13 @@ App::$strings["List week"] = "Lista semanal";
App::$strings["List day"] = "Lista diaria";
App::$strings["More"] = "Más";
App::$strings["Less"] = "Menos";
App::$strings["Update"] = "Actualizar";
App::$strings["Select calendar"] = "Seleccionar un calendario";
App::$strings["Channel Calendars"] = "Calendarios del canal";
App::$strings["CalDAV Calendars"] = "Calendarios CalDAV";
App::$strings["Delete all"] = "Eliminar todos";
App::$strings["Sorry! Editing of recurrent events is not yet implemented."] = "¡Disculpas! La edición de eventos recurrentes aún no se ha implementado.";
App::$strings["Categories"] = "Temas";
App::$strings["Name"] = "Nombre";
App::$strings["Organisation"] = "Organización";
App::$strings["Title"] = "Título";
@ -137,7 +141,6 @@ App::$strings["Home"] = "Inicio";
App::$strings["Work"] = "Trabajo";
App::$strings["Add Contact"] = "Añadir un contacto";
App::$strings["Add Field"] = "Añadir un campo";
App::$strings["Update"] = "Actualizar";
App::$strings["P.O. Box"] = "Buzón de correos";
App::$strings["Additional"] = "Adicional";
App::$strings["Street"] = "Calle";
@ -237,8 +240,6 @@ App::$strings["Menu item deleted."] = "Este elemento del menú ha sido borrado";
App::$strings["Menu item could not be deleted."] = "Este elemento del menú no puede ser borrado.";
App::$strings["Edit Menu Element"] = "Editar elemento del menú";
App::$strings["Link text"] = "Texto del enlace";
App::$strings["Calendar entries imported."] = "Entradas de calendario importadas.";
App::$strings["No calendar entries found."] = "No se han encontrado entradas de calendario.";
App::$strings["Event can not end before it has started."] = "Un evento no puede terminar antes de que haya comenzado.";
App::$strings["Unable to generate preview."] = "No se puede crear la vista previa.";
App::$strings["Event title and start time are required."] = "Se requieren el título del evento y su hora de inicio.";
@ -359,7 +360,7 @@ App::$strings["Website URL"] = "Dirección del sitio web";
App::$strings["Please use SSL (https) URL if available."] = "Por favor, use SSL (https) si está disponible.";
App::$strings["Please select a default timezone for your website"] = "Por favor, selecciones el huso horario por defecto de su sitio web";
App::$strings["Site settings"] = "Ajustes del sitio";
App::$strings["PHP version 5.5 or greater is required."] = "Se requiere la versión 5.5, o superior, de PHP.";
App::$strings["PHP version 7.1 or greater is required."] = "Se requiere la versión 7.1 o superior de PHP.";
App::$strings["PHP version"] = "Versión de PHP";
App::$strings["Could not find a command line version of PHP in the web server PATH."] = "No se puede encontrar una versión en línea de comandos de PHP en la ruta del servidor web.";
App::$strings["If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron."] = "Si no tiene instalada la versión de línea de comandos de PHP en su servidor, no podrá realizar envíos en segundo plano mediante cron.";
@ -446,12 +447,16 @@ App::$strings["On"] = "Activado";
App::$strings["Lock feature %s"] = "Bloquear la funcionalidad %s";
App::$strings["Manage Additional Features"] = "Gestionar las funcionalidades";
App::$strings["Update has been marked successful"] = "La actualización ha sido marcada como exitosa";
App::$strings["Executing %s failed. Check system logs."] = "La ejecución de %s ha fallado. Mirar en los informes del sistema.";
App::$strings["Verification of update %s failed. Check system logs."] = "Error en la verificación de la actualización %s. Compruebe los registros del sistema.";
App::$strings["Update %s was successfully applied."] = "La actualización de %s se ha realizado exitosamente.";
App::$strings["Update %s did not return a status. Unknown if it succeeded."] = "La actualización de %s no ha devuelto ningún estado. No se sabe si ha tenido éxito.";
App::$strings["Verifying update %s did not return a status. Unknown if it succeeded."] = "La verificación de la actualización %s no devuelve un estado. Desconocido si tuvo éxito.";
App::$strings["Update %s does not contain a verification function."] = "La actualización %s no contiene una función de verificación.";
App::$strings["Update function %s could not be found."] = "No se encuentra la función de actualización de %s.";
App::$strings["Executing update procedure %s failed. Check system logs."] = "Error al ejecutar el procedimiento de actualización %s. Compruebe los registros del sistema.";
App::$strings["Update %s did not return a status. It cannot be determined if it was successful."] = "La actualización %s no devuelve un estado. No se puede determinar si tuvo éxito.";
App::$strings["Failed Updates"] = "Han fallado las actualizaciones";
App::$strings["Mark success (if update was manually applied)"] = "Marcar como exitosa (si la actualización se ha hecho manualmente)";
App::$strings["Attempt to verify this update if a verification procedure exists"] = "Intentar verificar esta actualización si existe un procedimiento de verificación.";
App::$strings["Attempt to execute this update step automatically"] = "Intentar ejecutar este paso de actualización automáticamente";
App::$strings["No failed updates."] = "No ha fallado ninguna actualización.";
App::$strings["%s account blocked/unblocked"] = array(
@ -805,7 +810,7 @@ App::$strings["Default file upload folder"] = "Carpeta por defecto de los ficher
App::$strings["Remove this channel."] = "Eliminar este canal.";
App::$strings["Additional Features"] = "Funcionalidades";
App::$strings["Events Settings"] = "Gestión de eventos";
App::$strings["CalDAV Settings"] = "Ajustes de CalDav";
App::$strings["Calendar Settings"] = "Ajustes del calendario";
App::$strings["Settings saved."] = "Configuración guardada.";
App::$strings["Settings saved. Reload page please."] = "Ajustes guardados. Recargue la página, por favor.";
App::$strings["Conversation Settings"] = "Ajustes de conversación";
@ -1685,8 +1690,8 @@ App::$strings["Invalid channel."] = "El canal no es válido.";
App::$strings["network"] = "red";
App::$strings["\$Projectname"] = "\$Projectname";
App::$strings["Welcome to %s"] = "Bienvenido a %s";
App::$strings["Permission Denied."] = "Permiso denegado";
App::$strings["File not found."] = "Fichero no encontrado.";
App::$strings["Permission Denied."] = "Permiso denegado";
App::$strings["Edit file permissions"] = "Modificar los permisos del fichero";
App::$strings["Set/edit permissions"] = "Establecer/editar los permisos";
App::$strings["Include all files and sub folders"] = "Incluir todos los ficheros y subcarpetas";
@ -1766,13 +1771,15 @@ App::$strings["Site Admin"] = "Administrador del sitio";
App::$strings["Report Bug"] = "Informe de errores";
App::$strings["Bookmarks"] = "Marcadores";
App::$strings["Chatrooms"] = "Salas de chat";
App::$strings["Content Filter"] = "Filtro de contenido";
App::$strings["Content Import"] = "Importación de contenidos";
App::$strings["Remote Diagnostics"] = "Diagnóstico remoto";
App::$strings["Suggest Channels"] = "Sugerir canales";
App::$strings["Login"] = "Iniciar sesión";
App::$strings["Stream"] = "Stream";
App::$strings["Wiki"] = "Wiki";
App::$strings["Channel Home"] = "Mi canal";
App::$strings["Events"] = "Eventos";
App::$strings["Calendar"] = "Calendario";
App::$strings["Directory"] = "Directorio";
App::$strings["Mail"] = "Correo";
App::$strings["Chat"] = "Chat";
@ -1787,7 +1794,6 @@ App::$strings["Profile Photo"] = "Foto del perfil";
App::$strings["Profiles"] = "Perfiles";
App::$strings["Notifications"] = "Notificaciones";
App::$strings["Order Apps"] = "Ordenar las apps";
App::$strings["CalDAV"] = "CalDAV";
App::$strings["CardDAV"] = "CardDAV";
App::$strings["Guest Access"] = "Acceso para invitados";
App::$strings["Notes"] = "Notas";
@ -1912,6 +1918,7 @@ App::$strings["edited a post dated %s"] = "ha editado una entrada fechada el %s"
App::$strings["edited a comment dated %s"] = "ha editado un comentario fechado el %s";
App::$strings["Wiki updated successfully"] = "El wiki se ha actualizado con éxito";
App::$strings["Wiki files deleted successfully"] = "Se han borrado con éxito los ficheros del wiki";
App::$strings["Source code of failed update: "] = "Código fuente de la actualización fallida: ";
App::$strings["Update Error at %s"] = "Error de actualización en %s";
App::$strings["Update %s failed. See error logs."] = "La actualización %s ha fallado. Mire el informe de errores.";
App::$strings["Private Message"] = "Mensaje Privado";
@ -1931,6 +1938,9 @@ App::$strings["Add Tag"] = "Añadir etiqueta";
App::$strings["Conversation Tools"] = "Herramientas de conversación";
App::$strings["like"] = "me gusta";
App::$strings["dislike"] = "no me gusta";
App::$strings["Reply on this comment"] = "Responder a este comentario";
App::$strings["reply"] = "responder";
App::$strings["Reply to"] = "Responder a ";
App::$strings["Share This"] = "Compartir esto";
App::$strings["share"] = "compartir";
App::$strings["Delivery Report"] = "Informe de transmisión";
@ -1950,6 +1960,7 @@ App::$strings["Attend"] = "Participar o asistir";
App::$strings["Attendance Options"] = "Opciones de participación o asistencia";
App::$strings["Vote"] = "Votar";
App::$strings["Voting Options"] = "Opciones de votación";
App::$strings["Go to previous comment"] = "Ir al comentario anterior";
App::$strings["Save Bookmarks"] = "Guardar en Marcadores";
App::$strings["Add to Calendar"] = "Añadir al calendario";
App::$strings["This is an unsaved preview"] = "Esta es una previsualización sin guardar";
@ -1972,7 +1983,6 @@ App::$strings["parent"] = "padre";
App::$strings["Collection"] = "Colección";
App::$strings["Principal"] = "Principal";
App::$strings["Addressbook"] = "Libreta de direcciones";
App::$strings["Calendar"] = "Calendario";
App::$strings["Schedule Inbox"] = "Programar bandeja de entrada";
App::$strings["Schedule Outbox"] = "Programar bandeja de salida";
App::$strings["Total"] = "Total";
@ -1988,11 +1998,11 @@ App::$strings["Forums"] = "Foros";
App::$strings["Select Channel"] = "Seleccionar un canal";
App::$strings["Read-write"] = "Lectura y escritura";
App::$strings["Read-only"] = "Sólo lectura";
App::$strings["My Calendars"] = "Mis calendarios";
App::$strings["Shared Calendars"] = "Calendarios compartidos";
App::$strings["Channel Calendar"] = "Calendario del canal";
App::$strings["Shared CalDAV Calendars"] = "Calendarios CalDAV compartidos";
App::$strings["Share this calendar"] = "Compartir este calendario";
App::$strings["Calendar name and color"] = "Nombre y color del calendario";
App::$strings["Create new calendar"] = "Crear un nuevo calendario";
App::$strings["Create new CalDAV calendar"] = "Crear un nuevo calendario CalDAV";
App::$strings["Calendar Name"] = "Nombre del calendario";
App::$strings["Calendar Tools"] = "Gestión de calendarios";
App::$strings["Import calendar"] = "Importar un calendario";
@ -2004,7 +2014,6 @@ App::$strings["Addressbook Name"] = "Nombre de la agenda";
App::$strings["Addressbook Tools"] = "Gestión de agendas de direcciones";
App::$strings["Import addressbook"] = "Importar una agenda de direcciones";
App::$strings["Select an addressbook to import to"] = "Seleccionar una agenda para importarla";
App::$strings["Categories"] = "Temas";
App::$strings["Everything"] = "Todo";
App::$strings["Events Tools"] = "Gestión de eventos";
App::$strings["Export Calendar"] = "Exportar el calendario";
@ -2507,11 +2516,11 @@ App::$strings["Approve subscription requests from Hubzilla contacts automaticall
App::$strings["Purge internal list of jabber addresses of contacts"] = "Purgar la lista interna de las direcciones de contactos de jabber";
App::$strings["Configuration Help"] = "Ayuda para los ajustes";
App::$strings["Jappixmini Settings"] = "Ajustes de Jappixmini";
App::$strings["Your channel has been upgraded to the latest \$Projectname version."] = "Su canal ha sido actualizado a la última versión de \$Projectname.";
App::$strings["To improve usability, we have converted some features into installable stand-alone apps."] = "Para mejorar la usabilidad, hemos convertido algunas características en aplicaciones independientes instalables.";
App::$strings["Please visit the \$Projectname"] = "Por favor visite el sitio web de \$Projectname";
App::$strings["app store"] = "aplicaciones disponibles";
App::$strings["and install possibly missing apps."] = "e instale las aplicaciones que posiblemente falten.";
App::$strings["Your channel has been upgraded to \$Projectname version"] = "Su canal ha sido actualizado a la versión \$Projectname";
App::$strings["Please have a look at the"] = "Por favor, eche un vistazo a la ";
App::$strings["git history"] = "historial del git";
App::$strings["change log"] = "lista de cambios";
App::$strings["for further infos."] = "para más información.";
App::$strings["Upgrade Info"] = "Información de actualización";
App::$strings["Do not show this again"] = "No mostrar esto de nuevo";
App::$strings["Access Denied"] = "Acceso denegado";
@ -2527,8 +2536,11 @@ App::$strings["Reputation \"cost\" to comment"] = "\"Coste\" de la reputación p
App::$strings["Reputation automatically recovers at this rate per hour until it reaches minimum_to_post"] = "La reputación se recupera automáticamente a esta tasa por hora hasta que alcanza el mínimo_a_post";
App::$strings["When minimum_to_moderate > reputation > minimum_to_post reputation recovers at this rate per hour"] = "Cuando el mínimo_a_moderar > reputación > mínimo_a_publicar la reputación se recupera a esta tasa por hora ";
App::$strings["Community Moderation Settings"] = "Configuración de la moderación de la comunidad";
App::$strings["Can moderate reputation on my channel."] = "Se puede moderar la reputación en mi canal.";
App::$strings["Channel Reputation"] = "Reputación del canal";
App::$strings["An Error has occurred."] = "Se ha producido un error.";
App::$strings["Upvote"] = "Votar a favor";
App::$strings["Downvote"] = "Votar en contra";
App::$strings["Can moderate reputation on my channel."] = "Se puede moderar la reputación en mi canal.";
App::$strings["Block Completely"] = "Bloquear completamente";
App::$strings["Superblock App"] = "App Superblock";
App::$strings["Block channels"] = "Bloquear canales";
@ -2555,6 +2567,16 @@ App::$strings["Logfile archive directory"] = "Directorio de los ficheros de info
App::$strings["Directory to store rotated logs"] = "Directorio para almacenar los informes rotados";
App::$strings["Logfile size in bytes before rotating"] = "Tamaño del fichero de informe en bytes antes de rotarlo";
App::$strings["Number of logfiles to retain"] = "Número de ficheros de informe que se deben retener";
App::$strings["No server specified"] = "No se ha especificado ningún servidor";
App::$strings["Posts imported"] = "Entradas importadas";
App::$strings["Files imported"] = "Ficheros importados";
App::$strings["This addon app copies existing content and file storage to a cloned/copied channel. Once the app is installed, visit the newly installed app. This will allow you to set the location of your original channel and an optional date range of files/conversations to copy."] = "Este complemento copia el contenido existente y el almacenamiento de ficheros en un canal clonado/copiado. Una vez instalada la aplicación, visite la aplicación recién instalada. Esto le permitirá establecer la ubicación de su canal original y un rango de fechas opcional de ficheros/conversaciones para copiar.";
App::$strings["This will import all your conversations and cloud files from a cloned channel on another server. This may take a while if you have lots of posts and or files."] = "Esto importará todas sus conversaciones y archivos de nube de un canal clonado en otro servidor. El proceso puede tardar un poco si tiene muchos mensajes y/o ficheros.";
App::$strings["Include posts"] = "Incluir entradas";
App::$strings["Conversations, Articles, Cards, and other posted content"] = "Conversaciones, artículos, fichas y otros contenidos publicados";
App::$strings["Include files"] = "Incluir ficheros";
App::$strings["Files, Photos and other cloud storage"] = "Archivos, fotos y otro tipo de almacenamiento en la nube";
App::$strings["Original Server base URL"] = "URL base del servidor original";
App::$strings["Friendica Photo Album Import"] = "Importar un álbum de fotos de Friendica";
App::$strings["This will import all your Friendica photo albums to this Red channel."] = "Esto importará todos sus álbumes de fotos de Friendica a este canal de Hubzilla.";
App::$strings["Friendica Server base URL"] = "URL base del servidor de Friendica";
@ -3142,6 +3164,7 @@ App::$strings["Thank you, this nickname is valid."] = "Gracias, este alias es v
App::$strings["A channel name is required."] = "Se requiere un nombre de canal";
App::$strings["This is a "] = "Esto es un ";
App::$strings[" channel name"] = "nombre de canal";
App::$strings["Back to reply"] = "Volver a la respuesta";
App::$strings["%d minutes"] = array(
0 => "%d minutos",
1 => "%d minutos",
@ -3340,6 +3363,8 @@ App::$strings["Dislike Posts"] = "Desagrado de publicaciones";
App::$strings["Ability to dislike posts/comments"] = "Capacidad de mostrar desacuerdo con el contenido de entradas y comentarios";
App::$strings["Star Posts"] = "Entradas destacadas";
App::$strings["Ability to mark special posts with a star indicator"] = "Capacidad de marcar entradas destacadas con un indicador de estrella";
App::$strings["Reply on comment"] = "Responder a los comentarios";
App::$strings["Ability to reply on selected comment"] = "Posibilidad de responder a los comentarios seleccionados";
App::$strings["Advanced Directory Search"] = "Búsqueda avanzada en el directorio";
App::$strings["Allows creation of complex directory search queries"] = "Permitir la creación de consultas complejas en las búsquedas en el directorio";
App::$strings["Editor"] = "Editor";
@ -3361,6 +3386,7 @@ App::$strings["Suppress Duplicate Posts/Comments"] = "Prevenir entradas o coment
App::$strings["Prevent posts with identical content to be published with less than two minutes in between submissions."] = "Prevenir que entradas con contenido idéntico se publiquen con menos de dos minutos de intervalo.";
App::$strings["Auto-save drafts of posts and comments"] = "Guardar automáticamente borradores de entradas y comentarios";
App::$strings["Automatically saves post and comment drafts in local browser storage to help prevent accidental loss of compositions"] = "Guarda automáticamente los borradores de comentarios y publicaciones en el almacenamiento del navegador local para ayudar a evitar la pérdida accidental de composiciones.";
App::$strings["Events"] = "Eventos";
App::$strings["Smart Birthdays"] = "Cumpleaños inteligentes";
App::$strings["Make birthday events timezone aware in case your friends are scattered across the planet."] = "Enlazar los eventos de cumpleaños con el huso horario en el caso de que sus amigos estén dispersos por el mundo.";
App::$strings["Event Timezone Selection"] = "Selección del huso horario del evento";
@ -3378,7 +3404,6 @@ App::$strings["Forum Filter"] = "Filtro de foro";
App::$strings["Ability to display only posts of a specific forum"] = "Posibilidad de mostrar sólo los mensajes de un foro específico";
App::$strings["Personal Posts Filter"] = "Filtro de entradas personales";
App::$strings["Ability to display only posts that you've interacted on"] = "Posibilidad de mostrar sólo los mensajes en los que usted haya interactuado";
App::$strings["Show friend and connection suggestions"] = "Mostrar sugerencias de amigos y conexiones";
App::$strings["Photo Location"] = "Ubicación de las fotos";
App::$strings["If location data is available on uploaded photos, link this to a map."] = "Si los datos de ubicación están disponibles en las fotos subidas, enlazar estas a un mapa.";
App::$strings["Advanced Profiles"] = "Perfiles avanzados";

View File

@ -1,13 +1,22 @@
Hola,
Soy el servidor web en {{$sitename}};
Disculpas, pero esto puede ser urgente.
Este es el servidor web en {{$sitename}};
Los desarrolladores de Hubzilla lanzaron una actualización {{$update}} recientemente,
pero cuando se intentaba instalar, alguna cosa ha ido terriblemente mal.
Los desarrolladores del proyecto han publicado recientemente una actualización {{$update}},
pero durante el intento de instalarlo automáticamente, algo salió terriblemente mal.
Esto requiere intervención humana tan pronto como sea posible.
Póngase en contacto con un desarrollador de proyectos si no sabe cómo
por sí mismo. Mi base se datos puede quedar inservible.
arréglelo por su cuenta. La configuración de la base de datos de su servidor web puede no ser válida.
El mensaje de error ha sido el siguiente: '{{$error}}'.
Puede intentar volver a aplicar esta actualización visitando
{{$baseurl}}/admin/dbsync
mientras estaba conectado a la cuenta de administración.
{{$source}}
Disculpe por cualquier inconveniente causado,
su servidor web en {{$siteurl}}

View File

@ -17,6 +17,8 @@ var resource = {{$resource}};
var default_view = resource !== null ? 'timeGridDay' : 'dayGridMonth';
var default_date = resource !== null ? new Date(resource.dtstart) : new Date();
var allday;
$(document).ready(function() {
var calendarEl = document.getElementById('calendar');
calendar = new FullCalendar.Calendar(calendarEl, {
@ -43,7 +45,6 @@ $(document).ready(function() {
dayNamesShort: aStr['dayNamesShort'],
allDayText: aStr['allday'],
defaultTimedEventDuration: '01:00:00',
snapDuration: '00:15:00',
dateClick: function(info) {
@ -53,8 +54,10 @@ $(document).ready(function() {
new_event = {};
}
allday = info.allDay;
var dtend = new Date(info.date.toUTCString());
if(info.view.type == 'dayGridMonth') {
if(allday) {
dtend.setDate(dtend.getDate() + 1);
}
else{
@ -76,12 +79,11 @@ $(document).ready(function() {
$('#event_submit').val('create_event').html('{{$create}}');
$('#event_delete').hide();
new_event = { id: new_event_id, title : 'New event', start: $('#id_dtstart').val(), end: $('#id_dtend').val(), editable: true, color: '#bbb' };
new_event = { id: new_event_id, title: 'New event', start: $('#id_dtstart').val(), end: $('#id_dtend').val(), allDay: info.allDay, editable: true, color: '#bbb' };
calendar.addEvent(new_event);
},
eventClick: function(info) {
eventClick: function(info) {
//reset categories
$('#id_categories').tagsinput('removeAll');
@ -131,6 +133,8 @@ $(document).ready(function() {
event_uri = event.extendedProps.uri;
$('#id_title').val(event.title);
$('#calendar_select').val(calendar_id).attr('disabled', true).trigger('change');
$('#id_timezone_select').val(event.extendedProps.timezone);
$('#id_location').val(event.extendedProps.location);
$('#id_categories').tagsinput('add', event.extendedProps.categories);
$('#id_dtstart').val(dtstart.toUTCString());
$('#id_dtend').val(dtend.toUTCString());
@ -179,11 +183,12 @@ $(document).ready(function() {
},
eventResize: function(info) {
console.log(info);
var event = info.event._def;
var dtstart = new Date(info.event._instance.range.start);
var dtend = new Date(info.event._instance.range.end);
$('#id_title').val(event.title);
$('#id_dtstart').val(dtstart.toUTCString());
$('#id_dtend').val(dtend.toUTCString());
@ -199,9 +204,10 @@ $(document).ready(function() {
'type': 'event',
'preview': 0,
'summary': event.title,
'timezone_select': event.extendedProps.timezone,
'dtstart': dtstart.toUTCString(),
'dtend': dtend.toUTCString(),
'adjust': event.extendedProps.item.adjust,
'adjust': event.allDay ? 0 : 1,
'categories': event.extendedProps.categories,
'desc': event.extendedProps.description,
'location': event.extendedProps.location,
@ -215,8 +221,10 @@ $(document).ready(function() {
'update': 'resize',
'id[]': event.extendedProps.calendar_id,
'uri': event.extendedProps.uri,
'timezone_select': event.extendedProps.timezone,
'dtstart': dtstart ? dtstart.toUTCString() : '',
'dtend': dtend ? dtend.toUTCString() : ''
'dtend': dtend ? dtend.toUTCString() : '',
'allday': event.allDay ? 1 : 0
})
.fail(function() {
info.revert();
@ -245,9 +253,10 @@ $(document).ready(function() {
'type': 'event',
'preview': 0,
'summary': event.title,
'timezone_select': event.extendedProps.timezone,
'dtstart': dtstart.toUTCString(),
'dtend': dtend.toUTCString(),
'adjust': event.extendedProps.item.adjust,
'adjust': event.allDay ? 0 : 1,
'categories': event.extendedProps.categories,
'desc': event.extendedProps.description,
'location': event.extendedProps.location,
@ -261,8 +270,10 @@ $(document).ready(function() {
'update': 'drop',
'id[]': event.extendedProps.calendar_id,
'uri': event.extendedProps.uri,
'timezone_select': event.extendedProps.timezone,
'dtstart': dtstart ? dtstart.toUTCString() : '',
'dtend': dtend ? dtend.toUTCString() : ''
'dtend': dtend ? dtend.toUTCString() : '',
'allday': event.allDay ? 1 : 0
})
.fail(function() {
info.revert();
@ -334,6 +345,7 @@ $(document).ready(function() {
$('#id_categories').tagsinput('add', '{{$categories}}'),
$('#id_description').val(resource.description);
$('#id_location').val(resource.location);
$('#id_timezone_select').val(resource.timezone);
if(event_xchan !== '{{$channel_hash}}')
$('#event_submit').hide();
@ -414,10 +426,11 @@ function on_submit() {
'xchan': event_xchan,
'type': 'event',
'preview': 0,
'timezone_select': $('#id_timezone_select').val(),
'summary': $('#id_title').val(),
'dtstart': $('#id_dtstart').val(),
'dtend': $('#id_dtend').val(),
'adjust': 0,
'adjust': allday ? 0 : 1,
'categories': $('#id_categories').val(),
'desc': $('#id_description').val(),
'location': $('#id_location').val(),
@ -439,12 +452,14 @@ function on_submit() {
$.post( 'cdav/calendar', {
'submit': $('#event_submit').val(),
'target': $('#calendar_select').val(),
'timezone_select': $('#id_timezone_select').val(),
'uri': event_uri,
'title': $('#id_title').val(),
'dtstart': $('#id_dtstart').val(),
'dtend': $('#id_dtend').val(),
'description': $('#id_description').val(),
'location': $('#id_location').val()
'location': $('#id_location').val(),
'allday': allday ? 1 : 0
})
.done(function() {
var parts = $('#calendar_select').val().split(':');
@ -569,6 +584,9 @@ function exportDate() {
{{/foreach}}
</optgroup>
</select>
{{if $timezone_select}}
{{include file="field_select_grouped.tpl" field=$timezone_select}}
{{/if}}
<div id="more_block" style="display: none;">
{{if $catsenabled}}
<div id="id_categories_wrapper" class="form-group">

View File

@ -52,6 +52,7 @@
header: false,
eventTextColor: 'white',
lang: '{{$lang}}',
timeZone: '{{$timezone}}',
firstDay: {{$first_day}},
eventLimit: 3,

View File

@ -1,6 +1,11 @@
<div class="event-item-title">
<h3><i class="fa fa-calendar"></i>&nbsp;{{$title}}</h3>
</div>
{{if $oneday && $allday}}
<span class="dtstart">{{$dtstart_dt}}</span>
{{else if $allday}}
<span class="dtstart">{{$dtstart_dt}}</span> &mdash; <span class="dtend">{{$dtend_dt}}</span>
{{else}}
<div class="event-item-start">
<span class="event-item-label">{{$dtstart_label}}</span>&nbsp;<span class="dtstart" title="{{$dtstart_title}}">{{$dtstart_dt}}</span>
</div>
@ -9,3 +14,4 @@
<span class="event-item-label">{{$dtend_label}}</span>&nbsp;<span class="dtend" title="{{$dtend_title}}">{{$dtend_dt}}</span>
</div>
{{/if}}
{{/if}}