diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php index 2f80a595..a4bf1abd 100644 --- a/plugins/calendar/calendar.php +++ b/plugins/calendar/calendar.php @@ -137,10 +137,12 @@ class calendar extends rcube_plugin $this->register_action('freebusy-times', array($this, 'freebusy_times')); $this->register_action('randomdata', array($this, 'generate_randomdata')); $this->register_action('print', array($this,'print_view')); - $this->register_action('mailimportevent', array($this, 'mail_import_event')); + $this->register_action('mailimportitip', array($this, 'mail_import_event')); $this->register_action('mailtoevent', array($this, 'mail_message2event')); $this->register_action('inlineui', array($this, 'get_inline_ui')); $this->register_action('check-recent', array($this, 'check_recent')); + $this->register_action('itip-status', array($this, 'event_itip_status')); + $this->register_action('itip-remove', array($this, 'event_itip_remove')); $this->add_hook('refresh', array($this, 'refresh')); // remove undo information... @@ -227,11 +229,7 @@ class calendar extends rcube_plugin { if (!$this->itip) { require_once($this->home . '/lib/calendar_itip.php'); - - $plugin = $this->rc->plugins->exec_hook('calendar_load_itip', - array('identity' => null)); - - $this->itip = new calendar_itip($this, $plugin['identity']); + $this->itip = new calendar_itip($this); } return $this->itip; @@ -858,63 +856,6 @@ class calendar extends rcube_plugin break; - case "rsvp-status": - $action = 'rsvp'; - $status = $event['fallback']; - $latest = false; - $html = html::div('rsvp-status', $status != 'CANCELLED' ? $this->gettext('acceptinvitation') : ''); - if (is_numeric($event['changed'])) - $event['changed'] = new DateTime('@'.$event['changed']); - $this->load_driver(); - if ($existing = $this->driver->get_event($event, true, false, true)) { - $latest = ($event['sequence'] && $existing['sequence'] == $event['sequence']) || (!$event['sequence'] && $existing['changed'] && $existing['changed'] >= $event['changed']); - $emails = $this->get_user_emails(); - foreach ($existing['attendees'] as $i => $attendee) { - if ($attendee['email'] && in_array(strtolower($attendee['email']), $emails)) { - $status = $attendee['status']; - break; - } - } - } - else { - // get a list of writeable calendars - $calendars = $this->driver->list_calendars(false, true); - $calendar_select = new html_select(array('name' => 'calendar', 'id' => 'calendar-saveto', 'is_escaped' => true)); - $numcals = 0; - foreach ($calendars as $calendar) { - if (!$calendar['readonly']) { - $calendar_select->add($calendar['name'], $calendar['id']); - $numcals++; - } - } - if ($numcals <= 1) - $calendar_select = null; - } - - if ($status == 'unknown' && !$this->rc->config->get('calendar_allow_itip_uninvited', true)) { - $html = html::div('rsvp-status', $this->gettext('notanattendee')); - $action = 'import'; - } - else if (in_array($status, array('ACCEPTED','TENTATIVE','DECLINED'))) { - $html = html::div('rsvp-status ' . strtolower($status), $this->gettext('youhave'.strtolower($status))); - if ($existing['sequence'] > $event['sequence'] || (!$event['sequence'] && $existing['changed'] && $existing['changed'] > $event['changed'])) { - $action = ''; // nothing to do here, outdated invitation - } - } - - $default_calendar = $calendar_select ? $this->get_default_calendar(true) : null; - $this->rc->output->command('plugin.update_event_rsvp_status', array( - 'uid' => $event['uid'], - 'id' => asciiwords($event['uid'], true), - 'saved' => $existing ? true : false, - 'latest' => $latest, - 'status' => $status, - 'action' => $action, - 'html' => $html, - 'select' => $calendar_select ? html::span('calendar-select', $this->gettext('saveincalendar') . ' ' . $calendar_select->show($this->rc->config->get('calendar_default_calendar', $default_calendar['id']))) : '', - )); - return; - case "rsvp": $ev = $this->driver->get_event($event); $ev['attendees'] = $event['attendees']; @@ -1749,6 +1690,8 @@ class calendar extends rcube_plugin $sent = -100; } + // TODO: send CANCEL message to remove attendees + return $sent; } @@ -1966,7 +1909,65 @@ class calendar extends rcube_plugin /**** Event invitation plugin hooks ****/ - + + /** + * Handler for calendar/itip-status requests + */ + function event_itip_status() + { + $data = get_input_value('data', RCUBE_INPUT_POST, true); + + // find local copy of the referenced event + $this->load_driver(); + $existing = $this->driver->get_event($data, true, false, true); + + $itip = $this->load_itip(); + $response = $itip->get_itip_status($data, $existing); + + // get a list of writeable calendars to save new events to + if (!$existing && $response['action'] == 'rsvp' || $response['action'] == 'import') { + $calendars = $this->driver->list_calendars(false, true); + $calendar_select = new html_select(array('name' => 'calendar', 'id' => 'itip-saveto', 'is_escaped' => true)); + $numcals = 0; + foreach ($calendars as $calendar) { + if (!$calendar['readonly']) { + $calendar_select->add($calendar['name'], $calendar['id']); + $numcals++; + } + } + if ($numcals <= 1) + $calendar_select = null; + } + + if ($calendar_select) { + $default_calendar = $this->get_default_calendar(true); + $response['select'] = html::span('folder-select', $this->gettext('saveincalendar') . ' ' . + $calendar_select->show($this->rc->config->get('calendar_default_calendar', $default_calendar['id']))); + } + + $this->rc->output->command('plugin.update_itip_object_status', $response); + } + + /** + * Handler for calendar/itip-remove requests + */ + function event_itip_remove() + { + $success = false; + + // search for event if only UID is given + if ($event = $this->driver->get_event(array('uid' => get_input_value('uid', RCUBE_INPUT_POST)), true)) { + $success = $this->driver->remove_event($event, true); + } + + if ($success) { + $this->rc->output->show_message('calendar.successremoval', 'confirmation'); + } + else { + $this->rc->output->show_message('calendar.errorsaving', 'error'); + } + } + /** * Handler for URLs that allow an invitee to respond on his invitation mail */ @@ -2079,13 +2080,13 @@ class calendar extends rcube_plugin $this->get_ical(); } + $this->load_itip(); $html = ''; foreach ($this->ics_parts as $mime_id) { $part = $this->message->mime_parts[$mime_id]; $charset = $part->ctype_parameters['charset'] ? $part->ctype_parameters['charset'] : RCMAIL_CHARSET; $events = $this->ical->import($this->message->get_part_content($mime_id), $charset); $title = $this->gettext('title'); - $date = rcube_utils::anytodatetime($this->message->headers->date); // successfully parsed events? if (empty($events)) @@ -2096,104 +2097,17 @@ class calendar extends rcube_plugin if ($event['_type'] != 'event') // skip non-event objects (#2928) continue; - // define buttons according to method - if ($this->ical->method == 'REPLY') { - $title = $this->gettext('itipreply'); - $buttons = html::tag('input', array( - 'type' => 'button', - 'class' => 'button', - 'onclick' => "rcube_calendar.add_event_from_mail('" . JQ($mime_id.':'.$idx) . "')", - 'value' => $this->gettext('updateattendeestatus'), - )); - } - else if ($this->ical->method == 'REQUEST') { - $emails = $this->get_user_emails(); - $title = $event['sequence'] > 0 ? $this->gettext('itipupdate') : $this->gettext('itipinvitation'); - - // add (hidden) buttons and activate them from asyncronous request - foreach (array('accepted','tentative','declined') as $method) { - $rsvp_buttons .= html::tag('input', array( - 'type' => 'button', - 'class' => "button $method", - 'onclick' => "rcube_calendar.add_event_from_mail('" . JQ($mime_id.':'.$idx) . "', '$method')", - 'value' => $this->gettext('itip' . $method), - )); - } - $import_button = html::tag('input', array( - 'type' => 'button', - 'class' => 'button', - 'onclick' => "rcube_calendar.add_event_from_mail('" . JQ($mime_id.':'.$idx) . "')", - 'value' => $this->gettext('importtocalendar'), - )); - - // check my status - $status = 'unknown'; - foreach ($event['attendees'] as $attendee) { - if ($attendee['email'] && in_array(strtolower($attendee['email']), $emails)) { - $status = strtoupper($attendee['status']); - break; - } - } + // get prepared inline UI for this event object + $html .= html::div('calendar-invitebox', + $this->itip->mail_itip_inline_ui( + $event, + $this->ical->method, + $mime_id.':'.$idx, + 'calendar', + rcube_utils::anytodatetime($this->message->headers->date) + ) + ); - $dom_id = asciiwords($event['uid'], true); - $buttons = html::div(array('id' => 'rsvp-'.$dom_id, 'style' => 'display:none'), $rsvp_buttons); - $buttons .= html::div(array('id' => 'import-'.$dom_id, 'style' => 'display:none'), $import_button); - $buttons_pre = html::div(array('id' => 'loading-'.$dom_id, 'class' => 'rsvp-status loading'), $this->gettext('loading')); - $changed = is_object($event['changed']) ? $event['changed'] : $date; - - $script = json_serialize(array( - 'uid' => $event['uid'], - 'changed' => $changed ? $changed->format('U') : 0, - 'sequence' => intval($event['sequence']), - 'fallback' => $status, - )); - - $this->rc->output->add_script("rcube_calendar.fetch_event_rsvp_status($script)", 'docready'); - } - else if ($this->ical->method == 'CANCEL') { - $title = $this->gettext('itipcancellation'); - - // create buttons to be activated from async request checking existence of this event in local calendars - $button_import = html::tag('input', array( - 'type' => 'button', - 'class' => 'button', - 'onclick' => "rcube_calendar.add_event_from_mail('" . JQ($mime_id.':'.$idx) . "')", - 'value' => $this->gettext('importtocalendar'), - )); - $button_remove = html::tag('input', array( - 'type' => 'button', - 'class' => 'button', - 'onclick' => "rcube_calendar.remove_event_from_mail('" . JQ($event['uid']) . "', '" . JQ($event['title']) . "')", - 'value' => $this->gettext('removefromcalendar'), - )); - - $dom_id = asciiwords($event['uid'], true); - $buttons = html::div(array('id' => 'rsvp-'.$dom_id, 'style' => 'display:none'), $button_remove); - $buttons .= html::div(array('id' => 'import-'.$dom_id, 'style' => 'display:none'), $button_import); - $buttons_pre = html::div(array('id' => 'loading-'.$dom_id, 'class' => 'rsvp-status loading'), $this->gettext('loading')); - $changed = is_object($event['changed']) ? $event['changed'] : $date; - - $script = json_serialize(array( - 'uid' => $event['uid'], - 'changed' => $changed ? $changed->format('U') : 0, - 'sequence' => intval($event['sequence']), - 'fallback' => 'CANCELLED', - )); - - $this->rc->output->add_script("rcube_calendar.fetch_event_rsvp_status($script)", 'docready'); - } - else { - $buttons = html::tag('input', array( - 'type' => 'button', - 'class' => 'button', - 'onclick' => "rcube_calendar.add_event_from_mail('" . JQ($mime_id.':'.$idx) . "')", - 'value' => $this->gettext('importtocalendar'), - )); - } - - // show event details with buttons - $html .= html::div('calendar-invitebox', $this->ui->event_details_table($event, $title) . $buttons_pre . html::div('rsvp-buttons', $buttons)); - // limit listing if ($idx >= 3) break; @@ -2243,10 +2157,19 @@ class calendar extends rcube_plugin // successfully parsed events? if (!empty($events) && ($event = $events[$index])) { // find writeable calendar to store event - $cal_id = !empty($_REQUEST['_calendar']) ? get_input_value('_calendar', RCUBE_INPUT_POST) : null; + $cal_id = !empty($_REQUEST['_folder']) ? get_input_value('_folder', RCUBE_INPUT_POST) : null; $calendars = $this->driver->list_calendars(false, true); $calendar = $calendars[$cal_id] ?: $this->get_default_calendar(true); + $metadata = array( + 'uid' => $event['uid'], + 'changed' => is_object($event['changed']) ? $event['changed']->format('U') : 0, + 'sequence' => intval($event['sequence']), + 'fallback' => strtoupper($status), + 'method' => $this->ical->method, + 'task' => 'calendar', + ); + // update my attendee status according to submitted method if (!empty($status)) { $organizer = null; @@ -2257,6 +2180,8 @@ class calendar extends rcube_plugin } else if ($attendee['email'] && in_array(strtolower($attendee['email']), $emails)) { $event['attendees'][$i]['status'] = strtoupper($status); + $metadata['attendee'] = $attendee['email']; + $metadata['rsvp'] = $attendee['rsvp'] || $attendee['role'] != 'NON-PARTICIPANT'; $reply_sender = $attendee['email']; } } @@ -2270,6 +2195,7 @@ class calendar extends rcube_plugin 'role' => 'OPT-PARTICIPANT', 'status' => strtoupper($status), ); + $metadata['attendee'] = $sender_identity['email']; } } @@ -2298,6 +2224,9 @@ class calendar extends rcube_plugin foreach ($event['attendees'] as $attendee) { if ($sender && ($attendee['email'] == $sender || $attendee['email'] == $sender_utf)) { $event_attendee = $attendee; + $metadata['fallback'] = $attendee['status']; + $metadata['attendee'] = $attendee['email']; + $metadata['rsvp'] = $attendee['rsvp'] || $attendee['role'] != 'NON-PARTICIPANT'; break; } } @@ -2325,7 +2254,7 @@ class calendar extends rcube_plugin else if ($event['sequence'] >= $existing['sequence'] || $event['changed'] >= $existing['changed']) { $event['id'] = $existing['id']; $event['calendar'] = $existing['calendar']; - if ($status == 'declined') // show me as free when declined (#1670) + if ($status == 'declined' || $event['status'] == 'CANCELLED') // show me as free when declined (#1670) $event['free_busy'] = 'free'; $success = $this->driver->edit_event($event); } @@ -2353,12 +2282,9 @@ class calendar extends rcube_plugin if ($success) { $message = $this->ical->method == 'REPLY' ? 'attendeupdateesuccess' : ($deleted ? 'successremoval' : 'importedsuccessfully'); $this->rc->output->command('display_message', $this->gettext(array('name' => $message, 'vars' => array('calendar' => $calendar['name']))), 'confirmation'); - $this->rc->output->command('plugin.fetch_event_rsvp_status', array( - 'uid' => $event['uid'], - 'changed' => is_object($event['changed']) ? $event['changed']->format('U') : 0, - 'sequence' => intval($event['sequence']), - 'fallback' => strtoupper($status), - )); + + $metadata['rsvp'] = intval($metadata['rsvp']); + $this->rc->output->command('plugin.fetch_itip_object_status', $metadata); $error_msg = null; } else if ($error_msg) @@ -2462,19 +2388,7 @@ class calendar extends rcube_plugin */ private function get_user_emails() { - $emails = array(); - $plugin = $this->rc->plugins->exec_hook('calendar_user_emails', array('emails' => $emails)); - $emails = array_map('strtolower', $plugin['emails']); - - if ($plugin['abort']) { - return $emails; - } - - $emails[] = $this->rc->user->get_username(); - foreach ($this->rc->user->list_identities() as $identity) - $emails[] = strtolower($identity['email']); - - return array_unique($emails); + return $this->lib->get_user_emails(); } diff --git a/plugins/calendar/calendar_base.js b/plugins/calendar/calendar_base.js index 33fe9e4d..adcbdb40 100644 --- a/plugins/calendar/calendar_base.js +++ b/plugins/calendar/calendar_base.js @@ -77,82 +77,12 @@ function rcube_calendar(settings) }; } -// static methods -rcube_calendar.add_event_from_mail = function(mime_id, status) -{ - // ask user to delete the declined event from the local calendar (#1670) - var del = false; - if (rcmail.env.rsvp_saved && status == 'declined') { - del = confirm(rcmail.gettext('calendar.declinedeleteconfirm')); - } - - var lock = rcmail.set_busy(true, 'calendar.savingdata'); - rcmail.http_post('calendar/mailimportevent', { - '_uid': rcmail.env.uid, - '_mbox': rcmail.env.mailbox, - '_part': mime_id, - '_calendar': $('#calendar-saveto').val(), - '_status': status, - '_del': del?1:0 - }, lock); - - return false; -}; - -rcube_calendar.remove_event_from_mail = function(uid, title) -{ - if (confirm(rcmail.gettext('calendar.deleteventconfirm'))) { - var lock = rcmail.set_busy(true, 'calendar.savingdata'); - rcmail.http_post('calendar/event', { - e:{ uid:uid }, - action: 'remove' - }, lock); - } -}; - -rcube_calendar.fetch_event_rsvp_status = function(event) -{ -/* - var id = event.uid.replace(rcmail.identifier_expr, ''); - $('#import-'+id+', #rsvp-'+id+', div.rsvp-status').hide(); - $('#loading-'+id).show(); -*/ - rcmail.http_post('calendar/event', { - e:event, - action:'rsvp-status' - }); -}; - /* calendar plugin initialization (for non-calendar tasks) */ window.rcmail && rcmail.addEventListener('init', function(evt) { if (rcmail.task != 'calendar') { var cal = new rcube_calendar($.extend(rcmail.env.calendar_settings, rcmail.env.libcal_settings)); - rcmail.addEventListener('plugin.update_event_rsvp_status', function(p){ - rcmail.env.rsvp_saved = p.saved; - - if (p.html) { - // append/replace rsvp status display - $('#loading-'+p.id).next('.rsvp-status').remove(); - $('#loading-'+p.id).hide().after(p.html); - } - else { - $('#loading-'+p.id).hide(); - } - - // enable/disable rsvp buttons - $('.rsvp-buttons input.button').prop('disabled', false) - .filter('.'+String(p.status).toLowerCase()).prop('disabled', p.latest); - - // show rsvp/import buttons with or without calendar selector - if (!p.select) - $('#rsvp-'+p.id+' .calendar-select').remove(); - $('#'+p.action+'-'+p.id).show().append(p.select); - }); - - rcmail.addEventListener('plugin.fetch_event_rsvp_status', rcube_calendar.fetch_event_rsvp_status); - // register create-from-mail command to message_commands array if (rcmail.env.task == 'mail') { rcmail.register_command('calendar-create-from-mail', function() { cal.create_from_mail() }); diff --git a/plugins/calendar/lib/calendar_itip.php b/plugins/calendar/lib/calendar_itip.php index 90110730..e1284424 100644 --- a/plugins/calendar/lib/calendar_itip.php +++ b/plugins/calendar/lib/calendar_itip.php @@ -1,5 +1,7 @@ . */ -class calendar_itip +class calendar_itip extends libcalendaring_itip { - private $rc; - private $cal; - private $sender; - private $itip_send = false; - - function __construct($cal, $identity = null) - { - $this->cal = $cal; - $this->rc = $cal->rc; - $this->sender = $identity ? $identity : $this->rc->user->get_identity(); - - $this->cal->add_hook('message_before_send', array($this, 'before_send_hook')); - $this->cal->add_hook('smtp_connect', array($this, 'smtp_connect_hook')); - } - - function set_sender_email($email) - { - if (!empty($email)) - $this->sender['email'] = $email; - } - /** - * Send an iTip mail message - * - * @param array Event object to send - * @param string iTip method (REQUEST|REPLY|CANCEL) - * @param array Hash array with recipient data (name, email) - * @param string Mail subject - * @param string Mail body text label - * @param object Mail_mime object with message data - * @return boolean True on success, false on failure + * Constructor to set text domain to calendar */ - public function send_itip_message($event, $method, $recipient, $subject, $bodytext, $message = null) + function __construct($plugin, $domain = 'calendar') { - if (!$this->sender['name']) - $this->sender['name'] = $this->sender['email']; - - if (!$message) - $message = $this->compose_itip_message($event, $method); - - $mailto = rcube_idn_to_ascii($recipient['email']); - - $headers = $message->headers(); - $headers['To'] = format_email_recipient($mailto, $recipient['name']); - $headers['Subject'] = $this->cal->gettext(array( - 'name' => $subject, - 'vars' => array('title' => $event['title'], 'name' => $this->sender['name']) - )); - - // compose a list of all event attendees - $attendees_list = array(); - foreach ((array)$event['attendees'] as $attendee) { - $attendees_list[] = ($attendee['name'] && $attendee['email']) ? - $attendee['name'] . ' <' . $attendee['email'] . '>' : - ($attendee['name'] ? $attendee['name'] : $attendee['email']); - } - - $mailbody = $this->cal->gettext(array( - 'name' => $bodytext, - 'vars' => array( - 'title' => $event['title'], - 'date' => $this->cal->lib->event_date_text($event, true), - 'attendees' => join(', ', $attendees_list), - 'sender' => $this->sender['name'], - 'organizer' => $this->sender['name'], - ) - )); - - // append links for direct invitation replies - if ($method == 'REQUEST' && ($token = $this->store_invitation($event, $recipient['email']))) { - $mailbody .= "\n\n" . $this->cal->gettext(array( - 'name' => 'invitationattendlinks', - 'vars' => array('url' => $this->cal->get_url(array('action' => 'attend', 't' => $token))), - )); - } - else if ($method == 'CANCEL') { - $this->cancel_itip_invitation($event); - } - - $message->headers($headers, true); - $message->setTXTBody(rcube_mime::format_flowed($mailbody, 79)); - - // finally send the message - $this->itip_send = true; - $sent = $this->rc->deliver_message($message, $headers['X-Sender'], $mailto, $smtp_error); - $this->itip_send = false; - - return $sent; + parent::__construct($plugin, $domain); } - /** - * Plugin hook triggered by rcube::deliver_message() before delivering a message. - * Here we can set the 'smtp_server' config option to '' in order to use - * PHP's mail() function for unauthenticated email sending. - */ - public function before_send_hook($p) - { - if ($this->itip_send && !$this->rc->user->ID && $this->rc->config->get('calendar_itip_smtp_server', null) === '') { - $this->rc->config->set('smtp_server', ''); - } - - return $p; - } - - /** - * Plugin hook to alter SMTP authentication. - * This is used if iTip messages are to be sent from an unauthenticated session - */ - public function smtp_connect_hook($p) - { - // replace smtp auth settings if we're not in an authenticated session - if ($this->itip_send && !$this->rc->user->ID) { - foreach (array('smtp_server', 'smtp_user', 'smtp_pass') as $prop) { - $p[$prop] = $this->rc->config->get("calendar_itip_$prop", $p[$prop]); - } - } - - return $p; - } - - /** - * Helper function to build a Mail_mime object to send an iTip message - * - * @param array Event object to send - * @param string iTip method (REQUEST|REPLY|CANCEL) - * @return object Mail_mime object with message data - */ - public function compose_itip_message($event, $method) - { - $from = rcube_idn_to_ascii($this->sender['email']); - $from_utf = rcube_idn_to_utf8($from); - $sender = format_email_recipient($from, $this->sender['name']); - - // truncate list attendees down to the recipient of the iTip Reply. - // constraints for a METHOD:REPLY according to RFC 5546 - if ($method == 'REPLY') { - $replying_attendee = null; $reply_attendees = array(); - foreach ($event['attendees'] as $attendee) { - if ($attendee['role'] == 'ORGANIZER') { - $reply_attendees[] = $attendee; - } - else if (strcasecmp($attedee['email'], $from) == 0 || strcasecmp($attendee['email'], $from_utf) == 0) { - $replying_attendee = $attendee; - } - } - if ($replying_attendee) { - $reply_attendees[] = $replying_attendee; - $event['attendees'] = $reply_attendees; - } - } - - // compose multipart message using PEAR:Mail_Mime - $message = new Mail_mime("\r\n"); - $message->setParam('text_encoding', 'quoted-printable'); - $message->setParam('head_encoding', 'quoted-printable'); - $message->setParam('head_charset', RCMAIL_CHARSET); - $message->setParam('text_charset', RCMAIL_CHARSET . ";\r\n format=flowed"); - $message->setContentType('multipart/alternative'); - - // compose common headers array - $headers = array( - 'From' => $sender, - 'Date' => $this->rc->user_date(), - 'Message-ID' => $this->rc->gen_message_id(), - 'X-Sender' => $from, - ); - if ($agent = $this->rc->config->get('useragent')) - $headers['User-Agent'] = $agent; - - $message->headers($headers); - - // attach ics file for this event - $ical = $this->cal->get_ical(); - $ics = $ical->export(array($event), $method, false, $method == 'REQUEST' ? array($this->cal->driver, 'get_attachment_body') : false); - $message->addAttachment($ics, 'text/calendar', 'event.ics', false, '8bit', '', RCMAIL_CHARSET . "; method=" . $method); - - return $message; - } - - /** * Find invitation record by token * @@ -259,9 +89,9 @@ class calendar_itip if ($organizer) { $status = strtolower($newstatus); if ($this->send_itip_message($invitation['event'], 'REPLY', $organizer, 'itipsubject' . $status, 'itipmailbody' . $status)) - $this->rc->output->command('display_message', $this->cal->gettext(array('name' => 'sentresponseto', 'vars' => array('mailto' => $organizer['name'] ? $organizer['name'] : $organizer['email']))), 'confirmation'); + $this->rc->output->command('display_message', $this->plugin->gettext(array('name' => 'sentresponseto', 'vars' => array('mailto' => $organizer['name'] ? $organizer['name'] : $organizer['email']))), 'confirmation'); else - $this->rc->output->command('display_message', $this->cal->gettext('itipresponseerror'), 'error'); + $this->rc->output->command('display_message', $this->plugin->gettext('itipresponseerror'), 'error'); } // update record in DB diff --git a/plugins/calendar/lib/calendar_ui.php b/plugins/calendar/lib/calendar_ui.php index 6150e653..b6c0e787 100644 --- a/plugins/calendar/lib/calendar_ui.php +++ b/plugins/calendar/lib/calendar_ui.php @@ -785,24 +785,6 @@ class calendar_ui return $table->show($attrib); } - /** - * Render event details in a table - */ - function event_details_table($event, $title) - { - $table = new html_table(array('cols' => 2, 'border' => 0, 'class' => 'calendar-eventdetails')); - $table->add('ititle', $title); - $table->add('title', Q($event['title'])); - $table->add('label', $this->cal->gettext('date')); - $table->add('location', Q($this->cal->lib->event_date_text($event))); - if ($event['location']) { - $table->add('label', $this->cal->gettext('location')); - $table->add('location', Q($event['location'])); - } - - return $table->show(); - } - /** * */ @@ -810,7 +792,7 @@ class calendar_ui { if ($this->cal->event) { return html::div($attrib, - $this->event_details_table($this->cal->event, $this->cal->gettext('itipinvitation')) . + $this->cal->load_itip()->itip_object_details_table($this->cal->event, $this->cal->gettext('itipinvitation')) . $this->cal->invitestatus ); } diff --git a/plugins/calendar/localization/bg_BG.inc b/plugins/calendar/localization/bg_BG.inc index 993fd5fc..9fa85940 100644 --- a/plugins/calendar/localization/bg_BG.inc +++ b/plugins/calendar/localization/bg_BG.inc @@ -1,7 +1,11 @@ CalDAV client application (e.g. Evolution or Mozilla Thunderbird) to fully synchronize this specific calendar with your computer or mobile device.'; + +// agenda view $labels['listrange'] = 'Оразмеряване към екран:'; $labels['listsections'] = 'Разделяне на:'; $labels['smartsections'] = 'Интелигентни секции'; @@ -82,26 +96,140 @@ $labels['nextmonth'] = 'Следващия месец'; $labels['weekofyear'] = 'Седмица'; $labels['pastevents'] = 'Минали'; $labels['futureevents'] = 'Бъдещи'; -$labels['showalarms'] = 'Показване на аларми'; + +// alarm/reminder settings +$labels['showalarms'] = 'Show reminders'; $labels['defaultalarmtype'] = 'Настройка за напомняне по подразбиране'; $labels['defaultalarmoffset'] = 'Време за напомняне по подразбиране'; + +// attendees $labels['attendee'] = 'Участник'; $labels['role'] = 'Роля'; +$labels['availability'] = 'Avail.'; $labels['confirmstate'] = 'Статус'; $labels['addattendee'] = 'Добавяне на участник'; $labels['roleorganizer'] = 'Организатор'; $labels['rolerequired'] = 'Задължителен'; $labels['roleoptional'] = 'По избор'; +$labels['rolechair'] = 'Chair'; +$labels['rolenonparticipant'] = 'Absent'; +$labels['cutypeindividual'] = 'Individual'; +$labels['cutypegroup'] = 'Group'; +$labels['cutyperesource'] = 'Resource'; +$labels['cutyperoom'] = 'Room'; $labels['availfree'] = 'Свободно'; $labels['availbusy'] = 'Заето'; $labels['availunknown'] = 'Неизвестно'; $labels['availtentative'] = 'Предварително'; $labels['availoutofoffice'] = 'Извън офиса'; +$labels['scheduletime'] = 'Find availability'; $labels['sendinvitations'] = 'Изпращане на покани'; $labels['sendnotifications'] = 'Известяване на участниците относно промените'; $labels['sendcancellation'] = 'Известяване на участниците относно отмяна на събития'; +$labels['onlyworkinghours'] = 'Find availability within my working hours'; +$labels['reqallattendees'] = 'Required/all participants'; +$labels['prevslot'] = 'Previous Slot'; +$labels['nextslot'] = 'Next Slot'; +$labels['noslotfound'] = 'Unable to find a free time slot'; +$labels['invitationsubject'] = 'You\'ve been invited to "$title"'; +$labels['invitationmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with all the event details which you can import to your calendar application."; +$labels['invitationattendlinks'] = "In case your email client doesn't support iTip requests you can use the following link to either accept or decline this invitation:\n\$url"; +$labels['eventupdatesubject'] = '"$title" has been updated'; +$labels['eventupdatesubjectempty'] = 'An event that concerns you has been updated'; +$labels['eventupdatemailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with the updated event details which you can import to your calendar application."; +$labels['eventcancelsubject'] = '"$title" has been canceled'; +$labels['eventcancelmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nThe event has been cancelled by \$organizer.\n\nPlease find attached an iCalendar file with the updated event details."; + +// invitation handling +$labels['itipmailbodyaccepted'] = "\$sender has accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; +$labels['itipmailbodytentative'] = "\$sender has tentatively accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; +$labels['itipmailbodydeclined'] = "\$sender has declined the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; +$labels['itipdeclineevent'] = 'Искате ли да отхвърлите поканата за това събитие?'; +$labels['declinedeleteconfirm'] = 'Do you also want to delete this declined event from your calendar?'; +$labels['notanattendee'] = 'You\'re not listed as an attendee of this event'; +$labels['eventcancelled'] = 'The event has been cancelled'; +$labels['saveincalendar'] = 'запазване в'; + +// event dialog tabs $labels['tabsummary'] = 'Заглавие'; +$labels['tabrecurrence'] = 'Recurrence'; +$labels['tabattendees'] = 'Участници'; +$labels['tabattachments'] = 'Прикрепени файлове'; +$labels['tabsharing'] = 'Споделяне'; + +// messages +$labels['deleteventconfirm'] = 'Наистина ли искате да премахнете това събитие?'; +$labels['deletecalendarconfirm'] = 'Наистина ли искате да премахнете този календар с всичките му събития?'; +$labels['deletecalendarconfirmrecursive'] = 'Do you really want to delete this calendar with all its events and sub-calendars?'; $labels['savingdata'] = 'Запазване на данни...'; +$labels['errorsaving'] = 'Неуспешно записването на промените.'; +$labels['operationfailed'] = 'The requested operation failed.'; +$labels['invalideventdates'] = 'Invalid dates entered! Please check your input.'; +$labels['invalidcalendarproperties'] = 'Invalid calendar properties! Please set a valid name.'; +$labels['searchnoresults'] = 'No events found in the selected calendars.'; +$labels['successremoval'] = 'The event has been deleted successfully.'; +$labels['successrestore'] = 'The event has been restored successfully.'; +$labels['errornotifying'] = 'Failed to send notifications to event participants'; +$labels['errorimportingevent'] = 'Failed to import the event'; +$labels['newerversionexists'] = 'A newer version of this event already exists! Aborted.'; +$labels['nowritecalendarfound'] = 'No calendar found to save the event'; +$labels['importedsuccessfully'] = 'The event was successfully added to \'$calendar\''; +$labels['attendeupdateesuccess'] = 'Successfully updated the participant\'s status'; +$labels['itipsendsuccess'] = 'Invitation sent to participants.'; +$labels['itipresponseerror'] = 'Failed to send the response to this event invitation'; +$labels['itipinvalidrequest'] = 'This invitation is no longer valid'; +$labels['sentresponseto'] = 'Successfully sent invitation response to $mailto'; +$labels['localchangeswarning'] = 'You are about to make changes that will only be reflected on your calendar and not be sent to the organizer of the event.'; +$labels['importsuccess'] = 'Successfully imported $nr events'; +$labels['importnone'] = 'No events found to be imported'; +$labels['importerror'] = 'An error occured while importing'; +$labels['aclnorights'] = 'You do not have administrator rights on this calendar.'; + +// recurrence form +$labels['repeat'] = 'Repeat'; +$labels['frequency'] = 'Repeat'; +$labels['never'] = 'never'; +$labels['daily'] = 'daily'; +$labels['weekly'] = 'weekly'; +$labels['monthly'] = 'monthly'; +$labels['yearly'] = 'annually'; +$labels['rdate'] = 'on dates'; +$labels['every'] = 'Every'; +$labels['days'] = 'day(s)'; +$labels['weeks'] = 'week(s)'; +$labels['months'] = 'month(s)'; +$labels['years'] = 'year(s) in:'; +$labels['bydays'] = 'On'; +$labels['untildate'] = 'the'; +$labels['each'] = 'Each'; +$labels['onevery'] = 'On every'; +$labels['onsamedate'] = 'On the same date'; +$labels['forever'] = 'forever'; $labels['recurrencend'] = 'до'; +$labels['forntimes'] = 'for $nr time(s)'; +$labels['first'] = 'first'; +$labels['second'] = 'second'; +$labels['third'] = 'third'; +$labels['fourth'] = 'fourth'; +$labels['last'] = 'last'; +$labels['dayofmonth'] = 'Day of month'; +$labels['addrdate'] = 'Add repeat date'; + +$labels['changeeventconfirm'] = 'Change event'; +$labels['removeeventconfirm'] = 'Remove event'; +$labels['changerecurringeventwarning'] = 'This is a recurring event. Would you like to edit the current event only, this and all future occurences, all occurences or save it as a new event?'; +$labels['removerecurringeventwarning'] = 'This is a recurring event. Would you like to remove the current event only, this and all future occurences or all occurences of this event?'; +$labels['currentevent'] = 'Current'; $labels['futurevents'] = 'Бъдещи'; +$labels['allevents'] = 'All'; +$labels['saveasnew'] = 'Save as new'; + +// birthdays calendar +$labels['birthdays'] = 'Birthdays'; +$labels['birthdayscalendar'] = 'Birthdays Calendar'; +$labels['displaybirthdayscalendar'] = 'Display birthdays calendar'; +$labels['birthdayscalendarsources'] = 'From these address books'; +$labels['birthdayeventtitle'] = '$name\'s Birthday'; +$labels['birthdayage'] = 'Age $age'; + ?> diff --git a/plugins/calendar/localization/cs_CZ.inc b/plugins/calendar/localization/cs_CZ.inc index fe882537..6623e7ef 100644 --- a/plugins/calendar/localization/cs_CZ.inc +++ b/plugins/calendar/localization/cs_CZ.inc @@ -1,7 +1,11 @@ CalDAV client application (e.g. Evolution or Mozilla Thunderbird) to fully synchronize this specific calendar with your computer or mobile device.'; + +// agenda view $labels['listrange'] = 'Rozsah k zobrazení:'; $labels['listsections'] = 'Rozdělit na:'; $labels['smartsections'] = 'Chytré sekce'; @@ -83,9 +96,13 @@ $labels['nextmonth'] = 'Příští měsíc'; $labels['weekofyear'] = 'Týden'; $labels['pastevents'] = 'Minulost'; $labels['futureevents'] = 'Budoucnost'; -$labels['showalarms'] = 'Zobrazit upozornění'; + +// alarm/reminder settings +$labels['showalarms'] = 'Show reminders'; $labels['defaultalarmtype'] = 'Výchozí nastavení připomenutí'; $labels['defaultalarmoffset'] = 'Výchozí čas připomenutí'; + +// attendees $labels['attendee'] = 'Účastník'; $labels['role'] = 'Role'; $labels['availability'] = 'Dost.'; @@ -94,6 +111,12 @@ $labels['addattendee'] = 'Přidat účastníka'; $labels['roleorganizer'] = 'Organizátor'; $labels['rolerequired'] = 'Povinný'; $labels['roleoptional'] = 'Nepovinný'; +$labels['rolechair'] = 'Chair'; +$labels['rolenonparticipant'] = 'Absent'; +$labels['cutypeindividual'] = 'Individual'; +$labels['cutypegroup'] = 'Group'; +$labels['cutyperesource'] = 'Prostředek'; +$labels['cutyperoom'] = 'Room'; $labels['availfree'] = 'volno'; $labels['availbusy'] = 'obsazeno'; $labels['availunknown'] = 'neznámý'; @@ -116,37 +139,28 @@ $labels['eventupdatesubjectempty'] = 'Událost, která se vás týká, byla aktu $labels['eventupdatemailbody'] = "*\$title*\n\nKdy: \$date\n\nPozváni: \$attendees\n\nPodrobnosti o aktualizované události najdete v přiloženém souboru typu iCalendar. Můžete si ho naimportovat do kalendářového programu."; $labels['eventcancelsubject'] = 'Událost "$title" byla zrušena'; $labels['eventcancelmailbody'] = "*\$title*\n\nKdy: \$date\n\nPozváni: \$attendees\n\nUdálost byla zrušena organizátorem (\$organizer).\n\nPodrobnosti najdete v přiloženém souboru ve formátu iCalendar."; -$labels['itipinvitation'] = 'Pozvání na událost'; -$labels['itipupdate'] = 'Aktualizace události'; -$labels['itipcancellation'] = 'Zrušeno:'; -$labels['itipreply'] = 'Odpověď na'; -$labels['itipaccepted'] = 'Potvrdit'; -$labels['itiptentative'] = 'Možná'; -$labels['itipdeclined'] = 'Odmítnout'; -$labels['itipsubjectaccepted'] = '$name potvrdil(a) účas na události "$title"'; -$labels['itipsubjecttentative'] = '$name nezávazně potvrdil(a) účast na události "$title"'; -$labels['itipsubjectdeclined'] = '$name odmítl(a) účast na události "$title"'; + +// invitation handling $labels['itipmailbodyaccepted'] = "\$sender přijal(a) pozvání na tuto událost:\n\n*\$title*\n\nKdy: \$date\n\nPozváni: \$attendees"; $labels['itipmailbodytentative'] = "\$sender nezávazně přijal(a) pozvání na tuto událost:\n\n*\$title*\n\nKdy: \$date\n\nPozváni: \$attendees"; $labels['itipmailbodydeclined'] = "\$sender odmítl(a) pozvání na tuto událost:\n\n*\$title*\n\nKdy: \$date\n\nPozváni: \$attendees"; $labels['itipdeclineevent'] = 'Opravdu chcete odmítnout pozvání na tuto událost?'; -$labels['importtocalendar'] = 'Uložit do kalendáře'; -$labels['removefromcalendar'] = 'Odstranit z kalendáře'; -$labels['updateattendeestatus'] = 'Aktualizovat stav účastníka'; -$labels['acceptinvitation'] = 'Chcete přijmout toto pozvání (potvrdit účast)?'; -$labels['youhaveaccepted'] = 'Přijal(a) jste toto pozvání'; -$labels['youhavetentative'] = 'Nezávazně jste přijal(a) toto pozvání'; -$labels['youhavedeclined'] = 'Odmítl(a) jste toto pozvání'; +$labels['declinedeleteconfirm'] = 'Do you also want to delete this declined event from your calendar?'; $labels['notanattendee'] = 'Nejste na seznamu účastníků této události'; $labels['eventcancelled'] = 'Tato událost byla zrušena'; $labels['saveincalendar'] = 'uložit do'; + +// event dialog tabs $labels['tabsummary'] = 'Souhrn'; $labels['tabrecurrence'] = 'Opakování'; $labels['tabattendees'] = 'Účastníci'; $labels['tabattachments'] = 'Přílohy'; $labels['tabsharing'] = 'Sdílení'; + +// messages $labels['deleteventconfirm'] = 'Opravdu chcete smazat tuto událost?'; $labels['deletecalendarconfirm'] = 'Opravdu chcete smazat tento kalendář se všemi událostmi?'; +$labels['deletecalendarconfirmrecursive'] = 'Do you really want to delete this calendar with all its events and sub-calendars?'; $labels['savingdata'] = 'Ukládám data...'; $labels['errorsaving'] = 'Nelze uložit změny.'; $labels['operationfailed'] = 'Požavovaná operace selhala.'; @@ -165,10 +179,13 @@ $labels['itipsendsuccess'] = 'Pozvánky byly rozeslány účastníkům.'; $labels['itipresponseerror'] = 'Nelze odeslat odpověď na tuto pozvánku'; $labels['itipinvalidrequest'] = 'Tato pozvánka již není platná'; $labels['sentresponseto'] = 'Odpověď na pozvánku byla úspěšně odeslána na adresu $mailto'; +$labels['localchangeswarning'] = 'You are about to make changes that will only be reflected on your calendar and not be sent to the organizer of the event.'; $labels['importsuccess'] = 'Úspěšně importováno $nr událostí'; $labels['importnone'] = 'Nebyly nalezeny žádné události k importu'; $labels['importerror'] = 'Při importu došlo k chybě'; $labels['aclnorights'] = 'Nemáte administrátorská práva k tomuto kalendáři.'; + +// recurrence form $labels['repeat'] = 'Opakování'; $labels['frequency'] = 'Opakovat'; $labels['never'] = 'nikdy'; @@ -176,11 +193,13 @@ $labels['daily'] = 'denně'; $labels['weekly'] = 'týdně'; $labels['monthly'] = 'měsíčně'; $labels['yearly'] = 'ročně'; +$labels['rdate'] = 'on dates'; $labels['every'] = 'Každý'; $labels['days'] = 'den (dny)'; $labels['weeks'] = 'týden (týdny)'; $labels['months'] = 'měsíc(e/ů)'; $labels['years'] = 'rok(y/ů) v:'; +$labels['bydays'] = 'On'; $labels['untildate'] = 'do'; $labels['each'] = 'Každý'; $labels['onevery'] = 'Vždy v'; @@ -194,6 +213,8 @@ $labels['third'] = 'třetí'; $labels['fourth'] = 'čtvrtý'; $labels['last'] = 'poslední'; $labels['dayofmonth'] = 'Den v měsíci'; +$labels['addrdate'] = 'Add repeat date'; + $labels['changeeventconfirm'] = 'Změnit událost'; $labels['removeeventconfirm'] = 'Odstranit událost'; $labels['changerecurringeventwarning'] = 'Toto je opakovaná událost. Chcete upravit jen toto konání, toto a všechna následující konání, úplně všechna konání nebo uložit událost jako novou?'; @@ -202,4 +223,13 @@ $labels['currentevent'] = 'Aktuální'; $labels['futurevents'] = 'Budoucí'; $labels['allevents'] = 'Všechny'; $labels['saveasnew'] = 'Uložit jako novou'; + +// birthdays calendar +$labels['birthdays'] = 'Birthdays'; +$labels['birthdayscalendar'] = 'Birthdays Calendar'; +$labels['displaybirthdayscalendar'] = 'Display birthdays calendar'; +$labels['birthdayscalendarsources'] = 'From these address books'; +$labels['birthdayeventtitle'] = '$name\'s Birthday'; +$labels['birthdayage'] = 'Age $age'; + ?> diff --git a/plugins/calendar/localization/de_CH.inc b/plugins/calendar/localization/de_CH.inc index 4860e4b9..08310a9b 100644 --- a/plugins/calendar/localization/de_CH.inc +++ b/plugins/calendar/localization/de_CH.inc @@ -1,7 +1,11 @@ CalDAV client application (e.g. Evolution or Mozilla Thunderbird) to fully synchronize this specific calendar with your computer or mobile device.'; + +// agenda view $labels['listrange'] = 'Angezeigter Bereich:'; $labels['listsections'] = 'Unterteilung:'; $labels['smartsections'] = 'Intelligent'; @@ -86,9 +96,13 @@ $labels['nextmonth'] = 'Nächsten Monat'; $labels['weekofyear'] = 'KW'; $labels['pastevents'] = 'Vergangene'; $labels['futureevents'] = 'Zukünftige'; -$labels['showalarms'] = 'Erinnerungen anzeigen'; + +// alarm/reminder settings +$labels['showalarms'] = 'Show reminders'; $labels['defaultalarmtype'] = 'Standard-Erinnerungseinstellung'; $labels['defaultalarmoffset'] = 'Standard-Erinnerungszeit'; + +// attendees $labels['attendee'] = 'Teilnehmer'; $labels['role'] = 'Rolle'; $labels['availability'] = 'Verfüg.'; @@ -97,6 +111,12 @@ $labels['addattendee'] = 'Hinzufügen'; $labels['roleorganizer'] = 'Organisator'; $labels['rolerequired'] = 'Erforderlich'; $labels['roleoptional'] = 'Optional'; +$labels['rolechair'] = 'Chair'; +$labels['rolenonparticipant'] = 'Absent'; +$labels['cutypeindividual'] = 'Individual'; +$labels['cutypegroup'] = 'Group'; +$labels['cutyperesource'] = 'Ressource'; +$labels['cutyperoom'] = 'Room'; $labels['availfree'] = 'Frei'; $labels['availbusy'] = 'Gebucht'; $labels['availunknown'] = 'Unbekannt'; @@ -119,37 +139,29 @@ $labels['eventupdatesubjectempty'] = 'Termin wurde aktualisiert'; $labels['eventupdatemailbody'] = "*\$title*\n\nWann: \$date\n\nTeilnehmer: \$attendees\n\nIm Anhang finden Sie eine iCalendar-Datei mit den aktualisiereten Termindaten. Diese können Sie in Ihre Kalenderanwendung importieren."; $labels['eventcancelsubject'] = '"$title" wurde abgesagt'; $labels['eventcancelmailbody'] = "*\$title*\n\nWann: \$date\n\nTeilnehmer: \$attendees\n\nDer Termin wurde von \$organizer abgesagt.\n\nIm Anhang finden Sie eine iCalendar-Datei mit den Termindaten."; -$labels['itipinvitation'] = 'Einladung zu'; -$labels['itipupdate'] = 'Aktialisiert:'; -$labels['itipcancellation'] = 'Abgesagt:'; -$labels['itipreply'] = 'Antwort zu'; -$labels['itipaccepted'] = 'Akzeptieren'; -$labels['itiptentative'] = 'Mit Vorbehalt'; -$labels['itipdeclined'] = 'Ablehnen'; -$labels['itipsubjectaccepted'] = 'Einladung zu "$title" wurde von $name angenommen'; -$labels['itipsubjecttentative'] = 'Einladung zu "$title" wurde von $name mit Vorbehalt angenommen'; -$labels['itipsubjectdeclined'] = 'Einladung zu "$title" wurde von $name abgelehnt'; + +// invitation handling $labels['itipmailbodyaccepted'] = "\$sender hat die Einladung zum folgenden Termin angenommen:\n\n*\$title*\n\nWann: \$date\n\nTeilnehmer: \$attendees"; $labels['itipmailbodytentative'] = "\$sender hat die Einladung mit Vorbehalt zum folgenden Termin angenommen:\n\n*\$title*\n\nWann: \$date\n\nTeilnehmer: \$attendees"; $labels['itipmailbodydeclined'] = "\$sender hat die Einladung zum folgenden Termin abgelehnt:\n\n*\$title*\n\nWann: \$date\n\nTeilnehmer: \$attendees"; $labels['itipdeclineevent'] = 'Möchten Sie die Einladung zu diesem Termin ablehnen?'; -$labels['importtocalendar'] = 'In Kalender übernehmen'; -$labels['removefromcalendar'] = 'Aus meinem Kalender löschen'; -$labels['updateattendeestatus'] = 'Teilnehmerstatus aktualisieren'; -$labels['acceptinvitation'] = 'Möchten Sie die Einladung zu diesem Termin annehmen?'; -$labels['youhaveaccepted'] = 'Sie haben die Einladung angenommen'; -$labels['youhavetentative'] = 'Sie haben die Einladung mit Vorbehalt angenommen'; -$labels['youhavedeclined'] = 'Sie haben die Einladung abgelehnt'; +$labels['declinedeleteconfirm'] = 'Do you also want to delete this declined event from your calendar?'; + $labels['notanattendee'] = 'Sie sind nicht in der Liste der Teilnehmer aufgeführt'; $labels['eventcancelled'] = 'Der Termin wurde vom Organisator abgesagt'; $labels['saveincalendar'] = 'speichern in'; + +// event dialog tabs $labels['tabsummary'] = 'Übersicht'; $labels['tabrecurrence'] = 'Wiederholung'; $labels['tabattendees'] = 'Teilnehmer'; $labels['tabattachments'] = 'Anhänge'; $labels['tabsharing'] = 'Freigabe'; + +// messages $labels['deleteventconfirm'] = 'Möchten Sie diesen Termin wirklich löschen?'; $labels['deletecalendarconfirm'] = 'Möchten Sie diesen Kalender mit allen Terminen wirklich löschen?'; +$labels['deletecalendarconfirmrecursive'] = 'Do you really want to delete this calendar with all its events and sub-calendars?'; $labels['savingdata'] = 'Speichere Daten...'; $labels['errorsaving'] = 'Fehler beim Speichern.'; $labels['operationfailed'] = 'Die Aktion ist fehlgeschlagen.'; @@ -168,10 +180,13 @@ $labels['itipsendsuccess'] = 'Einladung an Teilnehmer versendet.'; $labels['itipresponseerror'] = 'Die Antwort auf diese Einladung konnte nicht versendet werden'; $labels['itipinvalidrequest'] = 'Diese Einladung ist nicht mehr gültig'; $labels['sentresponseto'] = 'Antwort auf diese Einladung erfolgreich an $mailto gesendet'; +$labels['localchangeswarning'] = 'You are about to make changes that will only be reflected on your calendar and not be sent to the organizer of the event.'; $labels['importsuccess'] = 'Es wurden $nr Termine erfolgreich importiert'; $labels['importnone'] = 'Keine Termine zum Importieren gefunden'; $labels['importerror'] = 'Fehler beim Importieren'; $labels['aclnorights'] = 'Sie haben keine Administrator-Rechte für diesen Kalender.'; + +// recurrence form $labels['repeat'] = 'Wiederholung'; $labels['frequency'] = 'Wiederholung'; $labels['never'] = 'nie'; @@ -179,7 +194,7 @@ $labels['daily'] = 'täglich'; $labels['weekly'] = 'wöchentlich'; $labels['monthly'] = 'monatlich'; $labels['yearly'] = 'jährlich'; -$labels['rdate'] = 'per Datum'; +$labels['rdate'] = 'on dates'; $labels['every'] = 'Alle'; $labels['days'] = 'Tag(e)'; $labels['weeks'] = 'Woche(n)'; @@ -199,7 +214,8 @@ $labels['third'] = 'dritter'; $labels['fourth'] = 'vierter'; $labels['last'] = 'letzter'; $labels['dayofmonth'] = 'Tag des Montats'; -$labels['addrdate'] = 'Datum hinzufügen'; +$labels['addrdate'] = 'Add repeat date'; + $labels['changeeventconfirm'] = 'Termin ändern'; $labels['removeeventconfirm'] = 'Termin löschen'; $labels['changerecurringeventwarning'] = 'Dies ist eine Terminreihe. Möchten Sie nur den aktuellen, diesen und alle zukünftigen oder alle Termine bearbeiten oder die Änderungen als neuen Termin speichern?'; @@ -208,4 +224,13 @@ $labels['currentevent'] = 'Aktuellen'; $labels['futurevents'] = 'Zukünftige'; $labels['allevents'] = 'Alle'; $labels['saveasnew'] = 'Als neu speichern'; + +// birthdays calendar +$labels['birthdays'] = 'Birthdays'; +$labels['birthdayscalendar'] = 'Birthdays Calendar'; +$labels['displaybirthdayscalendar'] = 'Display birthdays calendar'; +$labels['birthdayscalendarsources'] = 'From these address books'; +$labels['birthdayeventtitle'] = '$name\'s Birthday'; +$labels['birthdayage'] = 'Age $age'; + ?> diff --git a/plugins/calendar/localization/de_DE.inc b/plugins/calendar/localization/de_DE.inc index 582df11b..1b61ee8f 100644 --- a/plugins/calendar/localization/de_DE.inc +++ b/plugins/calendar/localization/de_DE.inc @@ -1,18 +1,24 @@ CalDAV-Klienten (z.B. Evolution oder Mozilla Thunderbird) kopieren, um den Kalender in Gänze mit einem mobilen Gerät zu synchronisieren.'; + +// agenda view $labels['listrange'] = 'Angezeigter Bereich:'; $labels['listsections'] = 'Unterteilung:'; $labels['smartsections'] = 'Intelligent'; @@ -86,9 +96,13 @@ $labels['nextmonth'] = 'Nächsten Monat'; $labels['weekofyear'] = 'Woche'; $labels['pastevents'] = 'Vergangene'; $labels['futureevents'] = 'Zukünftige'; -$labels['showalarms'] = 'Erinnerungen anzeigen'; + +// alarm/reminder settings +$labels['showalarms'] = 'Show reminders'; $labels['defaultalarmtype'] = 'Standard-Erinnerungseinstellung'; $labels['defaultalarmoffset'] = 'Standard-Erinnerungszeit'; + +// attendees $labels['attendee'] = 'Teilnehmer'; $labels['role'] = 'Rolle'; $labels['availability'] = 'Verfüg.'; @@ -97,6 +111,12 @@ $labels['addattendee'] = 'Hinzufügen'; $labels['roleorganizer'] = 'Organisator'; $labels['rolerequired'] = 'Erforderlich'; $labels['roleoptional'] = 'Optional'; +$labels['rolechair'] = 'Stuhl'; +$labels['rolenonparticipant'] = 'Absent'; +$labels['cutypeindividual'] = 'Person'; +$labels['cutypegroup'] = 'Gruppe'; +$labels['cutyperesource'] = 'Ressource'; +$labels['cutyperoom'] = 'Raum'; $labels['availfree'] = 'Frei'; $labels['availbusy'] = 'Gebucht'; $labels['availunknown'] = 'Unbekannt'; @@ -119,37 +139,28 @@ $labels['eventupdatesubjectempty'] = 'Termin wurde aktualisiert'; $labels['eventupdatemailbody'] = "*\$title*\n\nWann: \$date\n\nTeilnehmer: \$attendees\n\nIm Anhang finden Sie eine iCalendar-Datei mit den aktualisiereten Termindaten. Diese können Sie in Ihre Kalenderanwendung importieren."; $labels['eventcancelsubject'] = '"$title" wurde abgesagt'; $labels['eventcancelmailbody'] = "*\$title*\n\nWann: \$date\n\nTeilnehmer: \$attendees\n\nDer Termin wurde von \$organizer abgesagt.\n\nIm Anhang finden Sie eine iCalendar-Datei mit den Termindaten."; -$labels['itipinvitation'] = 'Einladung zu'; -$labels['itipupdate'] = 'Aktialisiert:'; -$labels['itipcancellation'] = 'Abgesagt:'; -$labels['itipreply'] = 'Antwort zu'; -$labels['itipaccepted'] = 'Akzeptieren'; -$labels['itiptentative'] = 'Mit Vorbehalt'; -$labels['itipdeclined'] = 'Ablehnen'; -$labels['itipsubjectaccepted'] = 'Einladung zu "$title" wurde von $name angenommen'; -$labels['itipsubjecttentative'] = 'Einladung zu "$title" wurde von $name mit Vorbehalt angenommen'; -$labels['itipsubjectdeclined'] = 'Einladung zu "$title" wurde von $name abgelehnt'; + +// invitation handling $labels['itipmailbodyaccepted'] = "\$sender hat die Einladung zum folgenden Termin angenommen:\n\n*\$title*\n\nWann: \$date\n\nTeilnehmer: \$attendees"; $labels['itipmailbodytentative'] = "\$sender hat die Einladung mit Vorbehalt zum folgenden Termin angenommen:\n\n*\$title*\n\nWann: \$date\n\nTeilnehmer: \$attendees"; $labels['itipmailbodydeclined'] = "\$sender hat die Einladung zum folgenden Termin abgelehnt:\n\n*\$title*\n\nWann: \$date\n\nTeilnehmer: \$attendees"; $labels['itipdeclineevent'] = 'Möchten Sie die Einladung zu diesem Termin ablehnen?'; -$labels['importtocalendar'] = 'In Kalender übernehmen'; -$labels['removefromcalendar'] = 'Aus meinem Kalender löschen'; -$labels['updateattendeestatus'] = 'Teilnehmerstatus aktualisieren'; -$labels['acceptinvitation'] = 'Möchten Sie die Einladung zu diesem Termin annehmen?'; -$labels['youhaveaccepted'] = 'Sie haben die Einladung angenommen'; -$labels['youhavetentative'] = 'Sie haben die Einladung mit Vorbehalt angenommen'; -$labels['youhavedeclined'] = 'Sie haben die Einladung abgelehnt'; +$labels['declinedeleteconfirm'] = 'Soll der abgelehnte Termin zusätzlich aus dem Kalender gelöscht werden?'; $labels['notanattendee'] = 'Sie sind nicht in der Liste der Teilnehmer aufgeführt'; $labels['eventcancelled'] = 'Der Termin wurde vom Organisator abgesagt'; $labels['saveincalendar'] = 'speichern in'; + +// event dialog tabs $labels['tabsummary'] = 'Übersicht'; $labels['tabrecurrence'] = 'Wiederholung'; $labels['tabattendees'] = 'Teilnehmer'; $labels['tabattachments'] = 'Anhänge'; $labels['tabsharing'] = 'Freigabe'; + +// messages $labels['deleteventconfirm'] = 'Möchten Sie diesen Termin wirklich löschen?'; $labels['deletecalendarconfirm'] = 'Möchten Sie diesen Kalender mit allen Terminen wirklich löschen?'; +$labels['deletecalendarconfirmrecursive'] = 'Soll dieser Kalender wirklich mit allen Terminen und Unterkalendern gelöscht werden?'; $labels['savingdata'] = 'Speichere Daten...'; $labels['errorsaving'] = 'Fehler beim Speichern.'; $labels['operationfailed'] = 'Die Aktion ist fehlgeschlagen.'; @@ -168,10 +179,13 @@ $labels['itipsendsuccess'] = 'Einladung an Teilnehmer versendet.'; $labels['itipresponseerror'] = 'Die Antwort auf diese Einladung konnte nicht versendet werden'; $labels['itipinvalidrequest'] = 'Diese Einladung ist nicht mehr gültig.'; $labels['sentresponseto'] = 'Antwort auf diese Einladung erfolgreich an $mailto gesendet'; +$labels['localchangeswarning'] = 'Die auszuführenden Änderungen werden sich nur auf den persönlichen Kalender auswirken und nicht an den Organisator des Termins weitergeleitet.'; $labels['importsuccess'] = 'Es wurden $nr Termine erfolgreich importiert'; $labels['importnone'] = 'Keine Termine zum Importieren gefunden'; $labels['importerror'] = 'Fehler beim Importieren'; $labels['aclnorights'] = 'Der Zugriff auf diesen Kalender erfordert Administrator-Rechte.'; + +// recurrence form $labels['repeat'] = 'Wiederholung'; $labels['frequency'] = 'Wiederholung'; $labels['never'] = 'nie'; @@ -179,7 +193,7 @@ $labels['daily'] = 'täglich'; $labels['weekly'] = 'wöchentlich'; $labels['monthly'] = 'monatlich'; $labels['yearly'] = 'jährlich'; -$labels['rdate'] = 'per Datum'; +$labels['rdate'] = 'on dates'; $labels['every'] = 'Alle'; $labels['days'] = 'Tag(e)'; $labels['weeks'] = 'Woche(n)'; @@ -199,7 +213,8 @@ $labels['third'] = 'dritter'; $labels['fourth'] = 'vierter'; $labels['last'] = 'letzter'; $labels['dayofmonth'] = 'Tag des Montats'; -$labels['addrdate'] = 'Datum hinzufügen'; +$labels['addrdate'] = 'Add repeat date'; + $labels['changeeventconfirm'] = 'Termin ändern'; $labels['removeeventconfirm'] = 'Termin löschen'; $labels['changerecurringeventwarning'] = 'Dies ist eine Terminreihe. Möchten Sie nur den aktuellen, diesen und alle zukünftigen oder alle Termine bearbeiten oder die Änderungen als neuen Termin speichern?'; @@ -208,4 +223,13 @@ $labels['currentevent'] = 'Aktuellen'; $labels['futurevents'] = 'Zukünftige'; $labels['allevents'] = 'Alle'; $labels['saveasnew'] = 'Als neu speichern'; + +// birthdays calendar +$labels['birthdays'] = 'Geburtstage'; +$labels['birthdayscalendar'] = 'Geburtstags-Kalender'; +$labels['displaybirthdayscalendar'] = 'Geburtstags-Kalender anzeigen'; +$labels['birthdayscalendarsources'] = 'Für diese Adressbücher'; +$labels['birthdayeventtitle'] = '$names Geburtstag'; +$labels['birthdayage'] = 'Alter $age'; + ?> diff --git a/plugins/calendar/localization/en_US.inc b/plugins/calendar/localization/en_US.inc index 340ff2e6..990838ee 100644 --- a/plugins/calendar/localization/en_US.inc +++ b/plugins/calendar/localization/en_US.inc @@ -66,6 +66,7 @@ $labels['public'] = 'public'; $labels['private'] = 'private'; $labels['confidential'] = 'confidential'; $labels['alarms'] = 'Reminder'; +$labels['comment'] = 'Comment'; $labels['generated'] = 'generated at'; $labels['printdescriptions'] = 'Print descriptions'; $labels['parentcalendar'] = 'Insert inside'; @@ -140,32 +141,19 @@ $labels['eventupdatemailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$atten $labels['eventcancelsubject'] = '"$title" has been canceled'; $labels['eventcancelmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nThe event has been cancelled by \$organizer.\n\nPlease find attached an iCalendar file with the updated event details."; -// invitation handling -$labels['itipinvitation'] = 'Invitation to'; -$labels['itipupdate'] = 'Update of'; -$labels['itipcancellation'] = 'Cancelled:'; -$labels['itipreply'] = 'Reply to'; -$labels['itipaccepted'] = 'Accept'; -$labels['itiptentative'] = 'Maybe'; -$labels['itipdeclined'] = 'Decline'; -$labels['itipsubjectaccepted'] = '"$title" has been accepted by $name'; -$labels['itipsubjecttentative'] = '"$title" has been tentatively accepted by $name'; -$labels['itipsubjectdeclined'] = '"$title" has been declined by $name'; +// invitation handling (overrides labels from libcalendaring) +$labels['itipobjectnotfound'] = 'The event referred by this message was not found in your calendar.'; + $labels['itipmailbodyaccepted'] = "\$sender has accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; $labels['itipmailbodytentative'] = "\$sender has tentatively accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; $labels['itipmailbodydeclined'] = "\$sender has declined the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; $labels['itipdeclineevent'] = 'Do you want to decline your invitation to this event?'; $labels['declinedeleteconfirm'] = 'Do you also want to delete this declined event from your calendar?'; -$labels['importtocalendar'] = 'Save to my calendar'; -$labels['removefromcalendar'] = 'Remove from my calendar'; -$labels['updateattendeestatus'] = 'Update the participant\'s status'; -$labels['acceptinvitation'] = 'Do you accept this invitation?'; -$labels['youhaveaccepted'] = 'You have accepted this invitation'; -$labels['youhavetentative'] = 'You have tentatively accepted this invitation'; -$labels['youhavedeclined'] = 'You have declined this invitation'; + $labels['notanattendee'] = 'You\'re not listed as an attendee of this event'; $labels['eventcancelled'] = 'The event has been cancelled'; $labels['saveincalendar'] = 'save in'; +$labels['updatemycopy'] = 'Update in my calendar'; // event dialog tabs $labels['tabsummary'] = 'Summary'; @@ -175,6 +163,7 @@ $labels['tabattachments'] = 'Attachments'; $labels['tabsharing'] = 'Sharing'; // messages +$labels['deleteobjectconfirm'] = 'Do you really want to delete this event?'; $labels['deleteventconfirm'] = 'Do you really want to delete this event?'; $labels['deletecalendarconfirm'] = 'Do you really want to delete this calendar with all its events?'; $labels['deletecalendarconfirmrecursive'] = 'Do you really want to delete this calendar with all its events and sub-calendars?'; diff --git a/plugins/calendar/localization/es_ES.inc b/plugins/calendar/localization/es_ES.inc index 2a09b06e..47947a01 100644 --- a/plugins/calendar/localization/es_ES.inc +++ b/plugins/calendar/localization/es_ES.inc @@ -1,12 +1,252 @@ CalDAV client application (e.g. Evolution or Mozilla Thunderbird) to fully synchronize this specific calendar with your computer or mobile device.'; + +// agenda view +$labels['listrange'] = 'Range to display:'; +$labels['listsections'] = 'Divide into:'; +$labels['smartsections'] = 'Smart sections'; +$labels['until'] = 'until'; +$labels['today'] = 'Today'; +$labels['tomorrow'] = 'Tomorrow'; +$labels['thisweek'] = 'This week'; +$labels['nextweek'] = 'Next week'; +$labels['thismonth'] = 'This month'; +$labels['nextmonth'] = 'Next month'; +$labels['weekofyear'] = 'Week'; +$labels['pastevents'] = 'Past'; +$labels['futureevents'] = 'Future'; + +// alarm/reminder settings +$labels['showalarms'] = 'Show reminders'; +$labels['defaultalarmtype'] = 'Default reminder setting'; +$labels['defaultalarmoffset'] = 'Default reminder time'; + +// attendees +$labels['attendee'] = 'Participant'; $labels['role'] = 'Rol'; +$labels['availability'] = 'Avail.'; +$labels['confirmstate'] = 'Status'; +$labels['addattendee'] = 'Add participant'; +$labels['roleorganizer'] = 'Organizer'; $labels['rolerequired'] = 'Requerido'; $labels['roleoptional'] = 'Opcional'; +$labels['rolechair'] = 'Chair'; +$labels['rolenonparticipant'] = 'Absent'; +$labels['cutypeindividual'] = 'Individual'; +$labels['cutypegroup'] = 'Grupo'; +$labels['cutyperesource'] = 'Recurso'; +$labels['cutyperoom'] = 'Room'; +$labels['availfree'] = 'Free'; +$labels['availbusy'] = 'Busy'; +$labels['availunknown'] = 'Unknown'; +$labels['availtentative'] = 'Tentative'; +$labels['availoutofoffice'] = 'Out of Office'; +$labels['scheduletime'] = 'Find availability'; +$labels['sendinvitations'] = 'Send invitations'; +$labels['sendnotifications'] = 'Notify participants about modifications'; +$labels['sendcancellation'] = 'Notify participants about event cancellation'; +$labels['onlyworkinghours'] = 'Find availability within my working hours'; +$labels['reqallattendees'] = 'Required/all participants'; +$labels['prevslot'] = 'Previous Slot'; +$labels['nextslot'] = 'Next Slot'; +$labels['noslotfound'] = 'Unable to find a free time slot'; +$labels['invitationsubject'] = 'You\'ve been invited to "$title"'; +$labels['invitationmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with all the event details which you can import to your calendar application."; +$labels['invitationattendlinks'] = "In case your email client doesn't support iTip requests you can use the following link to either accept or decline this invitation:\n\$url"; +$labels['eventupdatesubject'] = '"$title" has been updated'; +$labels['eventupdatesubjectempty'] = 'An event that concerns you has been updated'; +$labels['eventupdatemailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with the updated event details which you can import to your calendar application."; +$labels['eventcancelsubject'] = '"$title" has been canceled'; +$labels['eventcancelmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nThe event has been cancelled by \$organizer.\n\nPlease find attached an iCalendar file with the updated event details."; + +// invitation handling +$labels['itipinvitation'] = 'Invitation to'; +$labels['itipupdate'] = 'Update of'; +$labels['itipcancellation'] = 'Cancelled:'; +$labels['itipreply'] = 'Reply to'; +$labels['itipaccepted'] = 'Accept'; +$labels['itiptentative'] = 'Maybe'; +$labels['itipdeclined'] = 'Decline'; +$labels['itipsubjectaccepted'] = '"$title" has been accepted by $name'; +$labels['itipsubjecttentative'] = '"$title" has been tentatively accepted by $name'; +$labels['itipsubjectdeclined'] = '"$title" has been declined by $name'; +$labels['itipmailbodyaccepted'] = "\$sender has accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; +$labels['itipmailbodytentative'] = "\$sender has tentatively accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; +$labels['itipmailbodydeclined'] = "\$sender has declined the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; +$labels['itipdeclineevent'] = 'Do you want to decline your invitation to this event?'; +$labels['declinedeleteconfirm'] = 'Do you also want to delete this declined event from your calendar?'; +$labels['importtocalendar'] = 'Save to my calendar'; +$labels['removefromcalendar'] = 'Remove from my calendar'; +$labels['updateattendeestatus'] = 'Update the participant\'s status'; +$labels['acceptinvitation'] = 'Do you accept this invitation?'; +$labels['youhaveaccepted'] = 'You have accepted this invitation'; +$labels['youhavetentative'] = 'You have tentatively accepted this invitation'; +$labels['youhavedeclined'] = 'You have declined this invitation'; +$labels['notanattendee'] = 'You\'re not listed as an attendee of this event'; +$labels['eventcancelled'] = 'The event has been cancelled'; +$labels['saveincalendar'] = 'save in'; + +// event dialog tabs +$labels['tabsummary'] = 'Summary'; +$labels['tabrecurrence'] = 'Recurrence'; +$labels['tabattendees'] = 'Participants'; +$labels['tabattachments'] = 'Attachments'; +$labels['tabsharing'] = 'Sharing'; + +// messages +$labels['deleteventconfirm'] = 'Do you really want to delete this event?'; +$labels['deletecalendarconfirm'] = 'Do you really want to delete this calendar with all its events?'; +$labels['deletecalendarconfirmrecursive'] = 'Do you really want to delete this calendar with all its events and sub-calendars?'; $labels['savingdata'] = 'Guardando datos...'; +$labels['errorsaving'] = 'Failed to save changes.'; +$labels['operationfailed'] = 'The requested operation failed.'; +$labels['invalideventdates'] = 'Invalid dates entered! Please check your input.'; +$labels['invalidcalendarproperties'] = 'Invalid calendar properties! Please set a valid name.'; +$labels['searchnoresults'] = 'No events found in the selected calendars.'; +$labels['successremoval'] = 'The event has been deleted successfully.'; +$labels['successrestore'] = 'The event has been restored successfully.'; +$labels['errornotifying'] = 'Failed to send notifications to event participants'; +$labels['errorimportingevent'] = 'Failed to import the event'; +$labels['newerversionexists'] = 'A newer version of this event already exists! Aborted.'; +$labels['nowritecalendarfound'] = 'No calendar found to save the event'; +$labels['importedsuccessfully'] = 'The event was successfully added to \'$calendar\''; +$labels['attendeupdateesuccess'] = 'Successfully updated the participant\'s status'; +$labels['itipsendsuccess'] = 'Invitation sent to participants.'; +$labels['itipresponseerror'] = 'Failed to send the response to this event invitation'; +$labels['itipinvalidrequest'] = 'This invitation is no longer valid'; +$labels['sentresponseto'] = 'Successfully sent invitation response to $mailto'; +$labels['localchangeswarning'] = 'You are about to make changes that will only be reflected on your calendar and not be sent to the organizer of the event.'; +$labels['importsuccess'] = 'Successfully imported $nr events'; +$labels['importnone'] = 'No events found to be imported'; +$labels['importerror'] = 'An error occured while importing'; +$labels['aclnorights'] = 'You do not have administrator rights on this calendar.'; + +// recurrence form +$labels['repeat'] = 'Repeat'; +$labels['frequency'] = 'Repeat'; +$labels['never'] = 'never'; +$labels['daily'] = 'daily'; +$labels['weekly'] = 'weekly'; +$labels['monthly'] = 'monthly'; +$labels['yearly'] = 'annually'; +$labels['rdate'] = 'on dates'; +$labels['every'] = 'Every'; +$labels['days'] = 'day(s)'; +$labels['weeks'] = 'week(s)'; +$labels['months'] = 'month(s)'; +$labels['years'] = 'year(s) in:'; +$labels['bydays'] = 'On'; +$labels['untildate'] = 'the'; +$labels['each'] = 'Each'; +$labels['onevery'] = 'On every'; +$labels['onsamedate'] = 'On the same date'; +$labels['forever'] = 'forever'; +$labels['recurrencend'] = 'until'; +$labels['forntimes'] = 'for $nr time(s)'; +$labels['first'] = 'first'; +$labels['second'] = 'second'; +$labels['third'] = 'third'; +$labels['fourth'] = 'fourth'; +$labels['last'] = 'last'; +$labels['dayofmonth'] = 'Day of month'; +$labels['addrdate'] = 'Add repeat date'; + +$labels['changeeventconfirm'] = 'Change event'; +$labels['removeeventconfirm'] = 'Remove event'; +$labels['changerecurringeventwarning'] = 'This is a recurring event. Would you like to edit the current event only, this and all future occurences, all occurences or save it as a new event?'; +$labels['removerecurringeventwarning'] = 'This is a recurring event. Would you like to remove the current event only, this and all future occurences or all occurences of this event?'; +$labels['currentevent'] = 'Current'; +$labels['futurevents'] = 'Future'; +$labels['allevents'] = 'All'; +$labels['saveasnew'] = 'Save as new'; + +// birthdays calendar +$labels['birthdays'] = 'Birthdays'; +$labels['birthdayscalendar'] = 'Birthdays Calendar'; +$labels['displaybirthdayscalendar'] = 'Display birthdays calendar'; +$labels['birthdayscalendarsources'] = 'From these address books'; +$labels['birthdayeventtitle'] = '$name\'s Birthday'; +$labels['birthdayage'] = 'Age $age'; + ?> diff --git a/plugins/calendar/localization/et_EE.inc b/plugins/calendar/localization/et_EE.inc index 6aab13a1..0c9a073d 100644 --- a/plugins/calendar/localization/et_EE.inc +++ b/plugins/calendar/localization/et_EE.inc @@ -1,5 +1,252 @@ CalDAV client application (e.g. Evolution or Mozilla Thunderbird) to fully synchronize this specific calendar with your computer or mobile device.'; + +// agenda view +$labels['listrange'] = 'Range to display:'; +$labels['listsections'] = 'Divide into:'; +$labels['smartsections'] = 'Smart sections'; +$labels['until'] = 'until'; +$labels['today'] = 'Today'; +$labels['tomorrow'] = 'Tomorrow'; +$labels['thisweek'] = 'This week'; +$labels['nextweek'] = 'Next week'; +$labels['thismonth'] = 'This month'; +$labels['nextmonth'] = 'Next month'; +$labels['weekofyear'] = 'Week'; +$labels['pastevents'] = 'Past'; +$labels['futureevents'] = 'Future'; + +// alarm/reminder settings +$labels['showalarms'] = 'Show reminders'; +$labels['defaultalarmtype'] = 'Default reminder setting'; +$labels['defaultalarmoffset'] = 'Default reminder time'; + +// attendees +$labels['attendee'] = 'Participant'; +$labels['role'] = 'Role'; +$labels['availability'] = 'Avail.'; +$labels['confirmstate'] = 'Status'; +$labels['addattendee'] = 'Add participant'; +$labels['roleorganizer'] = 'Organizer'; $labels['rolerequired'] = 'Kohustuslik'; +$labels['roleoptional'] = 'Optional'; +$labels['rolechair'] = 'Chair'; +$labels['rolenonparticipant'] = 'Absent'; +$labels['cutypeindividual'] = 'Individual'; +$labels['cutypegroup'] = 'Group'; +$labels['cutyperesource'] = 'Resource'; +$labels['cutyperoom'] = 'Room'; +$labels['availfree'] = 'Free'; +$labels['availbusy'] = 'Busy'; +$labels['availunknown'] = 'Unknown'; +$labels['availtentative'] = 'Tentative'; +$labels['availoutofoffice'] = 'Out of Office'; +$labels['scheduletime'] = 'Find availability'; +$labels['sendinvitations'] = 'Send invitations'; +$labels['sendnotifications'] = 'Notify participants about modifications'; +$labels['sendcancellation'] = 'Notify participants about event cancellation'; +$labels['onlyworkinghours'] = 'Find availability within my working hours'; +$labels['reqallattendees'] = 'Required/all participants'; +$labels['prevslot'] = 'Previous Slot'; +$labels['nextslot'] = 'Next Slot'; +$labels['noslotfound'] = 'Unable to find a free time slot'; +$labels['invitationsubject'] = 'You\'ve been invited to "$title"'; +$labels['invitationmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with all the event details which you can import to your calendar application."; +$labels['invitationattendlinks'] = "In case your email client doesn't support iTip requests you can use the following link to either accept or decline this invitation:\n\$url"; +$labels['eventupdatesubject'] = '"$title" has been updated'; +$labels['eventupdatesubjectempty'] = 'An event that concerns you has been updated'; +$labels['eventupdatemailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with the updated event details which you can import to your calendar application."; +$labels['eventcancelsubject'] = '"$title" has been canceled'; +$labels['eventcancelmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nThe event has been cancelled by \$organizer.\n\nPlease find attached an iCalendar file with the updated event details."; + +// invitation handling +$labels['itipinvitation'] = 'Invitation to'; +$labels['itipupdate'] = 'Update of'; +$labels['itipcancellation'] = 'Cancelled:'; +$labels['itipreply'] = 'Reply to'; +$labels['itipaccepted'] = 'Accept'; +$labels['itiptentative'] = 'Maybe'; +$labels['itipdeclined'] = 'Decline'; +$labels['itipsubjectaccepted'] = '"$title" has been accepted by $name'; +$labels['itipsubjecttentative'] = '"$title" has been tentatively accepted by $name'; +$labels['itipsubjectdeclined'] = '"$title" has been declined by $name'; +$labels['itipmailbodyaccepted'] = "\$sender has accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; +$labels['itipmailbodytentative'] = "\$sender has tentatively accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; +$labels['itipmailbodydeclined'] = "\$sender has declined the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; +$labels['itipdeclineevent'] = 'Do you want to decline your invitation to this event?'; +$labels['declinedeleteconfirm'] = 'Do you also want to delete this declined event from your calendar?'; +$labels['importtocalendar'] = 'Save to my calendar'; +$labels['removefromcalendar'] = 'Remove from my calendar'; +$labels['updateattendeestatus'] = 'Update the participant\'s status'; +$labels['acceptinvitation'] = 'Do you accept this invitation?'; +$labels['youhaveaccepted'] = 'You have accepted this invitation'; +$labels['youhavetentative'] = 'You have tentatively accepted this invitation'; +$labels['youhavedeclined'] = 'You have declined this invitation'; +$labels['notanattendee'] = 'You\'re not listed as an attendee of this event'; +$labels['eventcancelled'] = 'The event has been cancelled'; +$labels['saveincalendar'] = 'save in'; + +// event dialog tabs +$labels['tabsummary'] = 'Summary'; +$labels['tabrecurrence'] = 'Recurrence'; +$labels['tabattendees'] = 'Participants'; +$labels['tabattachments'] = 'Attachments'; +$labels['tabsharing'] = 'Sharing'; + +// messages +$labels['deleteventconfirm'] = 'Do you really want to delete this event?'; +$labels['deletecalendarconfirm'] = 'Do you really want to delete this calendar with all its events?'; +$labels['deletecalendarconfirmrecursive'] = 'Do you really want to delete this calendar with all its events and sub-calendars?'; +$labels['savingdata'] = 'Saving data...'; +$labels['errorsaving'] = 'Failed to save changes.'; +$labels['operationfailed'] = 'The requested operation failed.'; +$labels['invalideventdates'] = 'Invalid dates entered! Please check your input.'; +$labels['invalidcalendarproperties'] = 'Invalid calendar properties! Please set a valid name.'; +$labels['searchnoresults'] = 'No events found in the selected calendars.'; +$labels['successremoval'] = 'The event has been deleted successfully.'; +$labels['successrestore'] = 'The event has been restored successfully.'; +$labels['errornotifying'] = 'Failed to send notifications to event participants'; +$labels['errorimportingevent'] = 'Failed to import the event'; +$labels['newerversionexists'] = 'A newer version of this event already exists! Aborted.'; +$labels['nowritecalendarfound'] = 'No calendar found to save the event'; +$labels['importedsuccessfully'] = 'The event was successfully added to \'$calendar\''; +$labels['attendeupdateesuccess'] = 'Successfully updated the participant\'s status'; +$labels['itipsendsuccess'] = 'Invitation sent to participants.'; +$labels['itipresponseerror'] = 'Failed to send the response to this event invitation'; +$labels['itipinvalidrequest'] = 'This invitation is no longer valid'; +$labels['sentresponseto'] = 'Successfully sent invitation response to $mailto'; +$labels['localchangeswarning'] = 'You are about to make changes that will only be reflected on your calendar and not be sent to the organizer of the event.'; +$labels['importsuccess'] = 'Successfully imported $nr events'; +$labels['importnone'] = 'No events found to be imported'; +$labels['importerror'] = 'An error occured while importing'; +$labels['aclnorights'] = 'You do not have administrator rights on this calendar.'; + +// recurrence form +$labels['repeat'] = 'Repeat'; +$labels['frequency'] = 'Repeat'; +$labels['never'] = 'never'; +$labels['daily'] = 'daily'; +$labels['weekly'] = 'weekly'; +$labels['monthly'] = 'monthly'; +$labels['yearly'] = 'annually'; +$labels['rdate'] = 'on dates'; +$labels['every'] = 'Every'; +$labels['days'] = 'day(s)'; +$labels['weeks'] = 'week(s)'; +$labels['months'] = 'month(s)'; +$labels['years'] = 'year(s) in:'; +$labels['bydays'] = 'On'; +$labels['untildate'] = 'the'; +$labels['each'] = 'Each'; +$labels['onevery'] = 'On every'; +$labels['onsamedate'] = 'On the same date'; +$labels['forever'] = 'forever'; +$labels['recurrencend'] = 'until'; +$labels['forntimes'] = 'for $nr time(s)'; +$labels['first'] = 'first'; +$labels['second'] = 'second'; +$labels['third'] = 'third'; +$labels['fourth'] = 'fourth'; +$labels['last'] = 'last'; +$labels['dayofmonth'] = 'Day of month'; +$labels['addrdate'] = 'Add repeat date'; + +$labels['changeeventconfirm'] = 'Change event'; +$labels['removeeventconfirm'] = 'Remove event'; +$labels['changerecurringeventwarning'] = 'This is a recurring event. Would you like to edit the current event only, this and all future occurences, all occurences or save it as a new event?'; +$labels['removerecurringeventwarning'] = 'This is a recurring event. Would you like to remove the current event only, this and all future occurences or all occurences of this event?'; +$labels['currentevent'] = 'Current'; +$labels['futurevents'] = 'Future'; +$labels['allevents'] = 'All'; +$labels['saveasnew'] = 'Save as new'; + +// birthdays calendar +$labels['birthdays'] = 'Birthdays'; +$labels['birthdayscalendar'] = 'Birthdays Calendar'; +$labels['displaybirthdayscalendar'] = 'Display birthdays calendar'; +$labels['birthdayscalendarsources'] = 'From these address books'; +$labels['birthdayeventtitle'] = '$name\'s Birthday'; +$labels['birthdayage'] = 'Age $age'; + ?> diff --git a/plugins/calendar/localization/fr_FR.inc b/plugins/calendar/localization/fr_FR.inc index 37f8dd92..ed367aae 100644 --- a/plugins/calendar/localization/fr_FR.inc +++ b/plugins/calendar/localization/fr_FR.inc @@ -1,7 +1,11 @@ CalDAV pour synchroniser ce calendrier avec votre ordinateur ou votre smartphone.'; + +// agenda view $labels['listrange'] = 'Intervalle à afficher :'; $labels['listsections'] = 'Diviser en :'; $labels['smartsections'] = 'Section intelligente'; @@ -83,9 +96,13 @@ $labels['nextmonth'] = 'Mois prochain'; $labels['weekofyear'] = 'Semaine'; $labels['pastevents'] = 'Passé'; $labels['futureevents'] = 'Futur'; -$labels['showalarms'] = 'Afficher les alarmes'; + +// alarm/reminder settings +$labels['showalarms'] = 'Afficher les rappels'; $labels['defaultalarmtype'] = 'Paramètre de rappel par défaut'; $labels['defaultalarmoffset'] = 'Durée de rappel par défaut'; + +// attendees $labels['attendee'] = 'Participant'; $labels['role'] = 'Rôle'; $labels['availability'] = 'Dispo.'; @@ -94,6 +111,12 @@ $labels['addattendee'] = 'Ajouter participant'; $labels['roleorganizer'] = 'Organisateur'; $labels['rolerequired'] = 'Requis'; $labels['roleoptional'] = 'Optionel'; +$labels['rolechair'] = 'Chair'; +$labels['rolenonparticipant'] = 'Absent'; +$labels['cutypeindividual'] = 'Individual'; +$labels['cutypegroup'] = 'Groupe'; +$labels['cutyperesource'] = 'Ressource'; +$labels['cutyperoom'] = 'Room'; $labels['availfree'] = 'Disponible'; $labels['availbusy'] = 'Occupé'; $labels['availunknown'] = 'Inconnu'; @@ -108,7 +131,7 @@ $labels['reqallattendees'] = 'Demandé/tous'; $labels['prevslot'] = 'Créneau précédent'; $labels['nextslot'] = 'Créneau suivant'; $labels['noslotfound'] = 'Impossible de trouver un créneau disponible'; -$labels['invitationsubject'] = 'Vous avez invité à "$title"'; +$labels['invitationsubject'] = 'Vous avez été invité à "$title"'; $labels['invitationmailbody'] = "*\$title*\n\nQuand: \$date\n\nParticipants: \$attendees\n\nVous trouverez ci-joint un fichier iCalendar avec tous les détails de l'évènement que vous pourrez importer dans votre agenda électronique."; $labels['invitationattendlinks'] = "Dans le cas où votre application de messagerie ne gère pas les demandes \"iTip\". Vous pouvez utiliser ce lien pour accepter ou refuser l'invitation : \n\$url"; $labels['eventupdatesubject'] = '"$title" a été modifié'; @@ -116,37 +139,28 @@ $labels['eventupdatesubjectempty'] = 'Un évènement vous concernant a été mod $labels['eventupdatemailbody'] = "*\$title*\n\nQuand: \$date\n\nParticipants: \$attendees\n\nVous trouverez ci-joint un fichier iCalendar avec tous les modifications de l'évènement que vous pourrez importer dans votre agenda électronique."; $labels['eventcancelsubject'] = '"$title" a été annulé'; $labels['eventcancelmailbody'] = "*\$title*\n\nQuand: \$date\n\nParticipants: \$attendees\n\nL'évènement a été annulé par \$organizer.\n\nVous trouverez en pièce jointe un fichier iCalendar avec les modifications de l'évènement que vous pourrez importer dans votre agenda électronique."; -$labels['itipinvitation'] = 'Invitation à'; -$labels['itipupdate'] = 'Mise à jour de'; -$labels['itipcancellation'] = 'Annulation:'; -$labels['itipreply'] = 'Répondre à'; -$labels['itipaccepted'] = 'Accepter'; -$labels['itiptentative'] = 'Peut-être'; -$labels['itipdeclined'] = 'Refuser'; -$labels['itipsubjectaccepted'] = '"$title" a été accepté par $name'; -$labels['itipsubjecttentative'] = '"$title" a été accepté provisoirement par $name'; -$labels['itipsubjectdeclined'] = '"$title" a été refusé par $name'; + +// invitation handling $labels['itipmailbodyaccepted'] = "\$sender a accepté l'invitation à l'évènement suivant :\n\n*\$title*\n\nQuand: \$date\n\nParticipants: \$attendees"; $labels['itipmailbodytentative'] = "\$sender a accepté provisoirement l'invitation à l'évènement suivant :\n\n*\$title*\n\nQuand: \$date\n\nParticipants: \$attendees"; $labels['itipmailbodydeclined'] = "\$sender a refusé l'invitation à l'évènement suivant :\n\n*\$title*\n\nQuand: \$date\n\nParticipants: \$attendees"; $labels['itipdeclineevent'] = 'Voulez-vous refuser l\'invitation à cet évènement?'; -$labels['importtocalendar'] = 'Enregistrer mon agenda'; -$labels['removefromcalendar'] = 'Supprimer de mon agenda'; -$labels['updateattendeestatus'] = 'Modifier le statut des participants'; -$labels['acceptinvitation'] = 'Acceptez-vous cette invitation?'; -$labels['youhaveaccepted'] = 'Vous avez accepté cette invitation'; -$labels['youhavetentative'] = 'Vous avez accepté provisoirement cette invitation'; -$labels['youhavedeclined'] = 'Vous avez refusé cette invitation'; +$labels['declinedeleteconfirm'] = 'Voulez-vous aussi supprimer cet évènement annulé, de votre calendrier ?'; $labels['notanattendee'] = 'Vous n\'êtes pas dans la liste des participants à cet évènement'; $labels['eventcancelled'] = 'L\'évènement a été annulé'; $labels['saveincalendar'] = 'Enregistrer sous'; + +// event dialog tabs $labels['tabsummary'] = 'Résumé'; $labels['tabrecurrence'] = 'Récurrence'; $labels['tabattendees'] = 'Participants'; $labels['tabattachments'] = 'Pièces jointes'; $labels['tabsharing'] = 'Partage'; + +// messages $labels['deleteventconfirm'] = 'Voulez-vous vraiment supprimer cet évènement?'; $labels['deletecalendarconfirm'] = 'Voulez-vous vraiment supprimer cet agenda et tous ses évènements?'; +$labels['deletecalendarconfirmrecursive'] = 'Do you really want to delete this calendar with all its events and sub-calendars?'; $labels['savingdata'] = 'Enregistrer...'; $labels['errorsaving'] = 'Échec lors de l\'enregistrement des changements'; $labels['operationfailed'] = 'L\'opération demandée a échoué'; @@ -165,10 +179,13 @@ $labels['itipsendsuccess'] = 'Invitation envoyé aux participants.'; $labels['itipresponseerror'] = 'Échec de l\'envoi d\'une réponse à cette invitation.'; $labels['itipinvalidrequest'] = 'C\'est invitation n\'est plus valide.'; $labels['sentresponseto'] = 'La réponse à l\'invitation a été envoyé à $mailto'; +$labels['localchangeswarning'] = 'You are about to make changes that will only be reflected on your calendar and not be sent to the organizer of the event.'; $labels['importsuccess'] = '$nr évènements importés.'; $labels['importnone'] = 'Pas d\'évènements à importer'; $labels['importerror'] = 'Une erreur est arrivée lors de l\'import'; $labels['aclnorights'] = 'Vous n\'avez pas les droits d\'administration sur cet agenda.'; + +// recurrence form $labels['repeat'] = 'Répéter'; $labels['frequency'] = 'Répéter'; $labels['never'] = 'Jamais'; @@ -176,6 +193,7 @@ $labels['daily'] = 'Quotidienne'; $labels['weekly'] = 'Hebdomadaire'; $labels['monthly'] = 'Mensuelle'; $labels['yearly'] = 'Annuelle'; +$labels['rdate'] = 'on dates'; $labels['every'] = 'Tous les'; $labels['days'] = 'jour(s)'; $labels['weeks'] = 'semaine(s)'; @@ -195,6 +213,8 @@ $labels['third'] = 'troisième'; $labels['fourth'] = 'quatrième'; $labels['last'] = 'dernier'; $labels['dayofmonth'] = 'Jour du mois'; +$labels['addrdate'] = 'Add repeat date'; + $labels['changeeventconfirm'] = 'Modifier l\'évènement'; $labels['removeeventconfirm'] = 'Supprimer l\'évènement'; $labels['changerecurringeventwarning'] = 'Ceci est un évènement récurant. Voulez vous éditer seulement cette occurrence, celle-ci et toutes les suivantes, toutes les occurrences ou l\'enregistrer comme un nouvel évènement? '; @@ -203,4 +223,13 @@ $labels['currentevent'] = 'Cette occurrence'; $labels['futurevents'] = 'Cette occurrence et toutes les suivantes'; $labels['allevents'] = 'Toutes les occurrences'; $labels['saveasnew'] = 'Enregistrer comme un nouvel évènement'; + +// birthdays calendar +$labels['birthdays'] = 'Birthdays'; +$labels['birthdayscalendar'] = 'Birthdays Calendar'; +$labels['displaybirthdayscalendar'] = 'Display birthdays calendar'; +$labels['birthdayscalendarsources'] = 'From these address books'; +$labels['birthdayeventtitle'] = '$name\'s Birthday'; +$labels['birthdayage'] = 'Age $age'; + ?> diff --git a/plugins/calendar/localization/hu_HU.inc b/plugins/calendar/localization/hu_HU.inc index 9a8f780b..d34f7634 100644 --- a/plugins/calendar/localization/hu_HU.inc +++ b/plugins/calendar/localization/hu_HU.inc @@ -1,21 +1,252 @@ CalDAV client application (e.g. Evolution or Mozilla Thunderbird) to fully synchronize this specific calendar with your computer or mobile device.'; + +// agenda view +$labels['listrange'] = 'Range to display:'; +$labels['listsections'] = 'Divide into:'; +$labels['smartsections'] = 'Smart sections'; +$labels['until'] = 'until'; +$labels['today'] = 'Today'; +$labels['tomorrow'] = 'Tomorrow'; +$labels['thisweek'] = 'This week'; +$labels['nextweek'] = 'Next week'; +$labels['thismonth'] = 'This month'; +$labels['nextmonth'] = 'Next month'; +$labels['weekofyear'] = 'Week'; +$labels['pastevents'] = 'Past'; +$labels['futureevents'] = 'Future'; + +// alarm/reminder settings +$labels['showalarms'] = 'Show reminders'; +$labels['defaultalarmtype'] = 'Default reminder setting'; +$labels['defaultalarmoffset'] = 'Default reminder time'; + +// attendees +$labels['attendee'] = 'Participant'; +$labels['role'] = 'Role'; +$labels['availability'] = 'Avail.'; +$labels['confirmstate'] = 'Status'; +$labels['addattendee'] = 'Add participant'; +$labels['roleorganizer'] = 'Organizer'; +$labels['rolerequired'] = 'Required'; +$labels['roleoptional'] = 'Optional'; +$labels['rolechair'] = 'Chair'; +$labels['rolenonparticipant'] = 'Absent'; +$labels['cutypeindividual'] = 'Individual'; +$labels['cutypegroup'] = 'Group'; +$labels['cutyperesource'] = 'Resource'; +$labels['cutyperoom'] = 'Room'; +$labels['availfree'] = 'Free'; +$labels['availbusy'] = 'Busy'; +$labels['availunknown'] = 'Unknown'; +$labels['availtentative'] = 'Tentative'; +$labels['availoutofoffice'] = 'Out of Office'; +$labels['scheduletime'] = 'Find availability'; +$labels['sendinvitations'] = 'Send invitations'; +$labels['sendnotifications'] = 'Notify participants about modifications'; +$labels['sendcancellation'] = 'Notify participants about event cancellation'; +$labels['onlyworkinghours'] = 'Find availability within my working hours'; +$labels['reqallattendees'] = 'Required/all participants'; +$labels['prevslot'] = 'Previous Slot'; +$labels['nextslot'] = 'Next Slot'; +$labels['noslotfound'] = 'Unable to find a free time slot'; +$labels['invitationsubject'] = 'You\'ve been invited to "$title"'; +$labels['invitationmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with all the event details which you can import to your calendar application."; +$labels['invitationattendlinks'] = "In case your email client doesn't support iTip requests you can use the following link to either accept or decline this invitation:\n\$url"; +$labels['eventupdatesubject'] = '"$title" has been updated'; +$labels['eventupdatesubjectempty'] = 'An event that concerns you has been updated'; +$labels['eventupdatemailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with the updated event details which you can import to your calendar application."; +$labels['eventcancelsubject'] = '"$title" has been canceled'; +$labels['eventcancelmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nThe event has been cancelled by \$organizer.\n\nPlease find attached an iCalendar file with the updated event details."; + +// invitation handling +$labels['itipinvitation'] = 'Invitation to'; +$labels['itipupdate'] = 'Update of'; +$labels['itipcancellation'] = 'Cancelled:'; +$labels['itipreply'] = 'Reply to'; +$labels['itipaccepted'] = 'Accept'; +$labels['itiptentative'] = 'Maybe'; +$labels['itipdeclined'] = 'Decline'; +$labels['itipsubjectaccepted'] = '"$title" has been accepted by $name'; +$labels['itipsubjecttentative'] = '"$title" has been tentatively accepted by $name'; +$labels['itipsubjectdeclined'] = '"$title" has been declined by $name'; +$labels['itipmailbodyaccepted'] = "\$sender has accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; +$labels['itipmailbodytentative'] = "\$sender has tentatively accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; +$labels['itipmailbodydeclined'] = "\$sender has declined the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; +$labels['itipdeclineevent'] = 'Do you want to decline your invitation to this event?'; +$labels['declinedeleteconfirm'] = 'Do you also want to delete this declined event from your calendar?'; +$labels['importtocalendar'] = 'Save to my calendar'; +$labels['removefromcalendar'] = 'Remove from my calendar'; +$labels['updateattendeestatus'] = 'Update the participant\'s status'; +$labels['acceptinvitation'] = 'Do you accept this invitation?'; +$labels['youhaveaccepted'] = 'You have accepted this invitation'; +$labels['youhavetentative'] = 'You have tentatively accepted this invitation'; +$labels['youhavedeclined'] = 'You have declined this invitation'; +$labels['notanattendee'] = 'You\'re not listed as an attendee of this event'; +$labels['eventcancelled'] = 'The event has been cancelled'; +$labels['saveincalendar'] = 'save in'; + +// event dialog tabs $labels['tabsummary'] = 'Tárgy'; +$labels['tabrecurrence'] = 'Recurrence'; +$labels['tabattendees'] = 'Participants'; +$labels['tabattachments'] = 'Attachments'; +$labels['tabsharing'] = 'Sharing'; + +// messages +$labels['deleteventconfirm'] = 'Do you really want to delete this event?'; +$labels['deletecalendarconfirm'] = 'Do you really want to delete this calendar with all its events?'; +$labels['deletecalendarconfirmrecursive'] = 'Do you really want to delete this calendar with all its events and sub-calendars?'; +$labels['savingdata'] = 'Saving data...'; +$labels['errorsaving'] = 'Failed to save changes.'; +$labels['operationfailed'] = 'The requested operation failed.'; +$labels['invalideventdates'] = 'Invalid dates entered! Please check your input.'; +$labels['invalidcalendarproperties'] = 'Invalid calendar properties! Please set a valid name.'; +$labels['searchnoresults'] = 'No events found in the selected calendars.'; +$labels['successremoval'] = 'The event has been deleted successfully.'; +$labels['successrestore'] = 'The event has been restored successfully.'; +$labels['errornotifying'] = 'Failed to send notifications to event participants'; +$labels['errorimportingevent'] = 'Failed to import the event'; +$labels['newerversionexists'] = 'A newer version of this event already exists! Aborted.'; +$labels['nowritecalendarfound'] = 'No calendar found to save the event'; +$labels['importedsuccessfully'] = 'The event was successfully added to \'$calendar\''; +$labels['attendeupdateesuccess'] = 'Successfully updated the participant\'s status'; +$labels['itipsendsuccess'] = 'Invitation sent to participants.'; +$labels['itipresponseerror'] = 'Failed to send the response to this event invitation'; +$labels['itipinvalidrequest'] = 'This invitation is no longer valid'; +$labels['sentresponseto'] = 'Successfully sent invitation response to $mailto'; +$labels['localchangeswarning'] = 'You are about to make changes that will only be reflected on your calendar and not be sent to the organizer of the event.'; +$labels['importsuccess'] = 'Successfully imported $nr events'; +$labels['importnone'] = 'No events found to be imported'; +$labels['importerror'] = 'An error occured while importing'; +$labels['aclnorights'] = 'You do not have administrator rights on this calendar.'; + +// recurrence form +$labels['repeat'] = 'Repeat'; +$labels['frequency'] = 'Repeat'; +$labels['never'] = 'never'; +$labels['daily'] = 'daily'; +$labels['weekly'] = 'weekly'; +$labels['monthly'] = 'monthly'; +$labels['yearly'] = 'annually'; +$labels['rdate'] = 'on dates'; +$labels['every'] = 'Every'; +$labels['days'] = 'day(s)'; +$labels['weeks'] = 'week(s)'; +$labels['months'] = 'month(s)'; +$labels['years'] = 'year(s) in:'; +$labels['bydays'] = 'On'; +$labels['untildate'] = 'the'; +$labels['each'] = 'Each'; +$labels['onevery'] = 'On every'; +$labels['onsamedate'] = 'On the same date'; +$labels['forever'] = 'forever'; +$labels['recurrencend'] = 'until'; +$labels['forntimes'] = 'for $nr time(s)'; +$labels['first'] = 'first'; +$labels['second'] = 'second'; +$labels['third'] = 'third'; +$labels['fourth'] = 'fourth'; +$labels['last'] = 'last'; +$labels['dayofmonth'] = 'Day of month'; +$labels['addrdate'] = 'Add repeat date'; + +$labels['changeeventconfirm'] = 'Change event'; +$labels['removeeventconfirm'] = 'Remove event'; +$labels['changerecurringeventwarning'] = 'This is a recurring event. Would you like to edit the current event only, this and all future occurences, all occurences or save it as a new event?'; +$labels['removerecurringeventwarning'] = 'This is a recurring event. Would you like to remove the current event only, this and all future occurences or all occurences of this event?'; +$labels['currentevent'] = 'Current'; +$labels['futurevents'] = 'Future'; +$labels['allevents'] = 'All'; +$labels['saveasnew'] = 'Save as new'; + +// birthdays calendar +$labels['birthdays'] = 'Birthdays'; +$labels['birthdayscalendar'] = 'Birthdays Calendar'; +$labels['displaybirthdayscalendar'] = 'Display birthdays calendar'; +$labels['birthdayscalendarsources'] = 'From these address books'; +$labels['birthdayeventtitle'] = '$name\'s Birthday'; +$labels['birthdayage'] = 'Age $age'; + ?> diff --git a/plugins/calendar/localization/it_IT.inc b/plugins/calendar/localization/it_IT.inc index 303fe211..c38e4cc7 100644 --- a/plugins/calendar/localization/it_IT.inc +++ b/plugins/calendar/localization/it_IT.inc @@ -1,21 +1,235 @@ CalDAV (es. Evolution o Mozilla Thunderbird) per sincronizzare completamente questo specifico calendario con il proprio computer o dispositivo mobile.'; + +// agenda view +$labels['listrange'] = 'Intervallo da visualizzare:'; +$labels['listsections'] = 'Dividi in:'; +$labels['smartsections'] = 'Sezioni intelligenti'; +$labels['until'] = 'fino a'; +$labels['today'] = 'Oggi'; +$labels['tomorrow'] = 'Domani'; +$labels['thisweek'] = 'Questa settimana'; +$labels['nextweek'] = 'Prossima settimana'; +$labels['thismonth'] = 'Questo mese'; +$labels['nextmonth'] = 'Prossimo mese'; +$labels['weekofyear'] = 'Settimana'; +$labels['pastevents'] = 'Passato'; +$labels['futureevents'] = 'Futuro'; + +// alarm/reminder settings +$labels['showalarms'] = 'Mostra promemoria'; +$labels['defaultalarmtype'] = 'Impostazioni predefinite dei promemoria'; +$labels['defaultalarmoffset'] = 'Tempo predefinito per i promemoria'; + +// attendees +$labels['attendee'] = 'Partecipante'; +$labels['role'] = 'Ruolo'; +$labels['availability'] = 'Dispon.'; +$labels['confirmstate'] = 'Stato'; +$labels['addattendee'] = 'Aggiungi partecipante'; +$labels['roleorganizer'] = 'Organizzatore'; +$labels['rolerequired'] = 'Necessario'; +$labels['roleoptional'] = 'Facoltativo'; +$labels['rolechair'] = 'Presidente'; +$labels['rolenonparticipant'] = 'Assente'; +$labels['cutypeindividual'] = 'Individual'; +$labels['cutypegroup'] = 'Gruppo'; +$labels['cutyperesource'] = 'Risorsa'; +$labels['cutyperoom'] = 'Stanza'; +$labels['availfree'] = 'Libero'; +$labels['availbusy'] = 'Occupato'; +$labels['availunknown'] = 'Sconosciuto'; +$labels['availtentative'] = 'Provvisorio'; +$labels['availoutofoffice'] = 'Fuori sede'; +$labels['scheduletime'] = 'Trova disponibilità'; +$labels['sendinvitations'] = 'Manda inviti'; +$labels['sendnotifications'] = 'Notifica le modifiche ai partecipanti'; +$labels['sendcancellation'] = 'Notifica ai partecipanti la cancellazione dell\'evento'; +$labels['onlyworkinghours'] = 'Trova disponibilità durante le ore lavorative'; +$labels['reqallattendees'] = 'Necessario/tutti i partecipanti'; +$labels['prevslot'] = 'Spazio precedente'; +$labels['nextslot'] = 'Spazio successivo'; +$labels['noslotfound'] = 'Impossibile trovare uno spazio di tempo libero'; +$labels['invitationsubject'] = 'Sei stato invitato a "$title"'; +$labels['invitationmailbody'] = "*\$title*\n\nQuando: \$date\n\nInvitati: \$attendees\n\nIn allegato un file iCalendar con tutti i dettagli dell'evento, che puoi importare nella tua applicazione calendario."; +$labels['invitationattendlinks'] = "Se il tuo client di posta elettronica non supporta le richieste iTip, puoi seguire il seguente collegamento per accettare o rifiutare l'invito:\n\$url"; +$labels['eventupdatesubject'] = '"$title" è stato aggiornato'; +$labels['eventupdatesubjectempty'] = 'Un evento che ti riguarda è stato aggiornato'; +$labels['eventupdatemailbody'] = "*\$title*\n\nQuando: \$date\n\nInvitati: \$attendees\n\nIn allegato un file iCalendar con i dettagli aggiornati dell'evento che puoi importare nella tua applicazione calendario."; +$labels['eventcancelsubject'] = '"$title" è stato annullato'; +$labels['eventcancelmailbody'] = "*\$title*\n\nQuando: \$date\n\nInvitati: \$attendees\n\nL'evento è stato cancellato da \$organizer.\n\nIn allegato un file iCalendar con i dettagli aggiornati dell'evento ."; + +// invitation handling +$labels['itipmailbodyaccepted'] = "\$sender ha accettato l'invito al seguente evento:\n\n*\$title*\n\nQuando: \$date\n\nInvitati: \$attendees"; +$labels['itipmailbodytentative'] = "\$sender ha accettato con riserva l'invito al seguente evento:\n\n*\$title*\n\nQuando: \$date\n\nInvitati: \$attendees"; +$labels['itipmailbodydeclined'] = "\$sender ha rifiutato l'invito al seguente evento:\n\n*\$title*\n\nQuando: \$date\n\nInvitati: \$attendees"; +$labels['itipdeclineevent'] = 'Vuoi rifiutare l\'invito a questo evento?'; +$labels['declinedeleteconfirm'] = 'Vuoi anche cancellare dal calendario l\'evento rifiutato?'; +$labels['notanattendee'] = 'Non sei elencato tra i partecipanti a questo evento'; +$labels['eventcancelled'] = 'L\'evento è stato annullato'; +$labels['saveincalendar'] = 'salva in'; + +// event dialog tabs +$labels['tabsummary'] = 'Riepilogo'; +$labels['tabrecurrence'] = 'Ricorrenza'; +$labels['tabattendees'] = 'Partecipanti'; +$labels['tabattachments'] = 'Allegati'; +$labels['tabsharing'] = 'Condivisione'; + +// messages +$labels['deleteventconfirm'] = 'Cancellare davvero questo evento?'; +$labels['deletecalendarconfirm'] = 'Cancellare davvero questo calendario con tutti i suoi eventi?'; +$labels['deletecalendarconfirmrecursive'] = 'Vuoi veramente eliminare questo calendario con tutti i suoi eventi e i suoi sotto-calendari?'; +$labels['savingdata'] = 'Salvataggio dati...'; +$labels['errorsaving'] = 'Impossibile salvare le modifiche.'; +$labels['operationfailed'] = 'L\'operazione richiesta è fallita.'; +$labels['invalideventdates'] = 'Le date inserite non sono valide. Controllare l\'inserimento.'; +$labels['invalidcalendarproperties'] = 'Proprietà del calendario non valide. Impostare un nome valido.'; +$labels['searchnoresults'] = 'Nessun evento trovato nel calendario selezionato.'; +$labels['successremoval'] = 'L\'evento è stato cancellato correttamente.'; +$labels['successrestore'] = 'L\'evento è stato ripristinato correttamente.'; +$labels['errornotifying'] = 'Spedizione delle notifiche ai partecipanti dell\'evento fallita'; +$labels['errorimportingevent'] = 'Importazione evento fallita'; +$labels['newerversionexists'] = 'Esiste già una versione più recente di questo evento. Abortito.'; +$labels['nowritecalendarfound'] = 'Non c\'è nessun calendario dove salvare l\'evento'; +$labels['importedsuccessfully'] = 'Evento aggiunto correttamente a \'$calendar\''; +$labels['attendeupdateesuccess'] = 'Stato dei partecipanti aggiornato correttamente'; +$labels['itipsendsuccess'] = 'Invito spedito ai partecipanti.'; +$labels['itipresponseerror'] = 'Spedizione della risposta all\'invito fallita'; +$labels['itipinvalidrequest'] = 'Questo invito non è più valido'; +$labels['sentresponseto'] = 'Risposta all\'invito inviata correttamente a $mailto'; +$labels['localchangeswarning'] = 'Stai per fare dei cambiamenti che compariranno solo nel tuo calendario e non saranno spediti all\'organizzatore dell\'evento.'; +$labels['importsuccess'] = '$nr eventi importati correttamente'; +$labels['importnone'] = 'Nessun evento trovato da importare'; +$labels['importerror'] = 'Si è verificato un errore durante l\'importazione'; +$labels['aclnorights'] = 'Non hai i diritti di amministratore per questo calendario.'; + +// recurrence form +$labels['repeat'] = 'Ricorrenza'; +$labels['frequency'] = 'Frequenza'; +$labels['never'] = 'una volta'; +$labels['daily'] = 'quotidiana'; +$labels['weekly'] = 'settimanale'; +$labels['monthly'] = 'mensile'; +$labels['yearly'] = 'annuale'; +$labels['rdate'] = 'on dates'; +$labels['every'] = 'Ogni'; +$labels['days'] = 'giorno/i'; +$labels['weeks'] = 'settimana/e'; +$labels['months'] = 'mese/i'; +$labels['years'] = 'anno/i in:'; +$labels['bydays'] = 'Di'; +$labels['untildate'] = 'il'; +$labels['each'] = 'Nei giorni'; +$labels['onevery'] = 'Ogni'; +$labels['onsamedate'] = 'Alla stessa data'; +$labels['forever'] = 'per sempre'; +$labels['recurrencend'] = 'fino al'; +$labels['forntimes'] = 'per $nr volte'; +$labels['first'] = 'primo'; +$labels['second'] = 'secondo'; +$labels['third'] = 'terzo'; +$labels['fourth'] = 'quarto'; +$labels['last'] = 'ultimo'; +$labels['dayofmonth'] = 'Giorno del mese'; +$labels['addrdate'] = 'Add repeat date'; + +$labels['changeeventconfirm'] = 'Cambia evento'; +$labels['removeeventconfirm'] = 'Rimuovi evento'; +$labels['changerecurringeventwarning'] = 'This is a recurring event. Would you like to edit the current event only, this and all future occurences, all occurences or save it as a new event?'; +$labels['removerecurringeventwarning'] = 'This is a recurring event. Would you like to remove the current event only, this and all future occurences or all occurences of this event?'; +$labels['currentevent'] = 'Current'; +$labels['futurevents'] = 'Futuro'; +$labels['allevents'] = 'Tutto'; +$labels['saveasnew'] = 'Salva come nuovo'; + +// birthdays calendar +$labels['birthdays'] = 'Compleanni'; +$labels['birthdayscalendar'] = 'Calendario compleanni'; +$labels['displaybirthdayscalendar'] = 'Mostra il calendario compleanni'; +$labels['birthdayscalendarsources'] = 'Da queste rubriche'; +$labels['birthdayeventtitle'] = 'Compleanno di $name'; +$labels['birthdayage'] = 'Età: $age anni'; + ?> diff --git a/plugins/calendar/localization/ja_JP.inc b/plugins/calendar/localization/ja_JP.inc index 22928536..46351bd9 100644 --- a/plugins/calendar/localization/ja_JP.inc +++ b/plugins/calendar/localization/ja_JP.inc @@ -1,7 +1,11 @@ CalDAV client application (e.g. Evolution or Mozilla Thunderbird) to fully synchronize this specific calendar with your computer or mobile device.'; + +// agenda view $labels['listrange'] = '表示範囲:'; $labels['listsections'] = '分割:'; $labels['smartsections'] = 'スマートセクション'; @@ -83,9 +96,13 @@ $labels['nextmonth'] = '来月'; $labels['weekofyear'] = '週'; $labels['pastevents'] = '以前'; $labels['futureevents'] = '以降'; -$labels['showalarms'] = 'アラーム表示'; + +// alarm/reminder settings +$labels['showalarms'] = 'Show reminders'; $labels['defaultalarmtype'] = 'デフォルト通知設定'; $labels['defaultalarmoffset'] = 'デフォルト通知時間'; + +// attendees $labels['attendee'] = '参加者'; $labels['role'] = 'ロール'; $labels['availability'] = '利用可'; @@ -94,6 +111,12 @@ $labels['addattendee'] = '参加者追加'; $labels['roleorganizer'] = '編成者'; $labels['rolerequired'] = '要件'; $labels['roleoptional'] = 'オプション'; +$labels['rolechair'] = 'Chair'; +$labels['rolenonparticipant'] = 'Absent'; +$labels['cutypeindividual'] = 'Individual'; +$labels['cutypegroup'] = 'グループ'; +$labels['cutyperesource'] = 'リソース'; +$labels['cutyperoom'] = 'Room'; $labels['availfree'] = '空'; $labels['availbusy'] = 'ビジー'; $labels['availunknown'] = '不明'; @@ -116,37 +139,27 @@ $labels['eventupdatesubjectempty'] = 'あなたに関連するイベントが更 $labels['eventupdatemailbody'] = "*\$title*\n\nいつ: \$date\n\n招待者: \$attendees\n\nあなたのカレンダーアプリケーションにインポートできるアップデートされた全イベントの詳細が添付されたiカレンダーファイルを見つけてください。"; $labels['eventcancelsubject'] = '"$title" は変更されました'; $labels['eventcancelmailbody'] = "*\$title*\n\nいつ: \$date\n\n招待者: \$attendees\n\nイベントが \$organizer によってキャンセルされました。\n\n更新されたイベントの詳細とともに添付されたiカレンダーファイルを見つけてください。"; -$labels['itipinvitation'] = '招待する'; -$labels['itipupdate'] = '更新'; -$labels['itipcancellation'] = 'キャンセル'; -$labels['itipreply'] = '返信'; -$labels['itipaccepted'] = '承諾'; -$labels['itiptentative'] = 'たぶん'; -$labels['itipdeclined'] = '辞退'; -$labels['itipsubjectaccepted'] = '$name が "$title" を承諾しました'; -$labels['itipsubjecttentative'] = '$name が "$title" を仮承諾しました'; -$labels['itipsubjectdeclined'] = '$name が "$title" を辞退しました'; + +// invitation handling $labels['itipmailbodyaccepted'] = "\$sender は以下のイベントへの招待を承諾しました:\n\n*\$title*\n\nいつ: \$date\n\n招待者: \$attendees"; $labels['itipmailbodytentative'] = "\$sender は以下のイベントへの招待を仮承諾しました:\n\n*\$title*\n\nいつ: \$date\n\n招待者: \$attendees"; $labels['itipmailbodydeclined'] = "\$sender は以下のイベントへの招待を辞退しました:\n\n*\$title*\n\nいつ: \$date\n\n招待者: \$attendees"; $labels['itipdeclineevent'] = 'このイベントへの招待を辞退しますか?'; -$labels['importtocalendar'] = 'カレンダーに保存'; -$labels['removefromcalendar'] = 'カレンダーから削除'; -$labels['updateattendeestatus'] = '参加者の状況更新'; -$labels['acceptinvitation'] = 'この招待を承諾しますか?'; -$labels['youhaveaccepted'] = 'この招待を承諾しました'; -$labels['youhavetentative'] = 'この招待を仮承諾しました。'; -$labels['youhavedeclined'] = 'この招待を辞退しました。'; -$labels['notanattendee'] = 'このイベントの出席者として一覧にありません'; +$labels['declinedeleteconfirm'] = 'Do you also want to delete this declined event from your calendar?'; $labels['eventcancelled'] = 'このイベントはキャンセルされました'; $labels['saveincalendar'] = '保存'; + +// event dialog tabs $labels['tabsummary'] = '要約'; $labels['tabrecurrence'] = '繰返し'; $labels['tabattendees'] = '参加者'; $labels['tabattachments'] = '添付'; $labels['tabsharing'] = '共有'; + +// messages $labels['deleteventconfirm'] = '本当にこのイベントを削除しますか?'; $labels['deletecalendarconfirm'] = '本当にこのカレンダーを全イベントとともに削除しますか?'; +$labels['deletecalendarconfirmrecursive'] = 'Do you really want to delete this calendar with all its events and sub-calendars?'; $labels['savingdata'] = 'データを保存中…'; $labels['errorsaving'] = '変更が保存できませんでした。'; $labels['operationfailed'] = '要求された操作ができませんでした。'; @@ -165,10 +178,13 @@ $labels['itipsendsuccess'] = '出席者へ招待を送信しました。'; $labels['itipresponseerror'] = 'この招待の返信できませんでした'; $labels['itipinvalidrequest'] = 'この招待は間もなく無効になります'; $labels['sentresponseto'] = '$mailto への招待の返信しました'; +$labels['localchangeswarning'] = 'You are about to make changes that will only be reflected on your calendar and not be sent to the organizer of the event.'; $labels['importsuccess'] = '$nr イベントをインポートしました'; $labels['importnone'] = 'インポートされたイベントはありません'; $labels['importerror'] = 'インポート中にエラーが発生しました。'; $labels['aclnorights'] = 'このカレンダーの管理権限がありません。'; + +// recurrence form $labels['repeat'] = '繰返し'; $labels['frequency'] = '繰返し'; $labels['never'] = '繰返さない'; @@ -176,6 +192,7 @@ $labels['daily'] = '毎日'; $labels['weekly'] = '毎週'; $labels['monthly'] = '毎月'; $labels['yearly'] = '毎年'; +$labels['rdate'] = 'on dates'; $labels['every'] = 'いつでも'; $labels['days'] = '日(s)'; $labels['weeks'] = '週(s)'; @@ -195,6 +212,8 @@ $labels['third'] = '第3週'; $labels['fourth'] = '第4週'; $labels['last'] = '最終週'; $labels['dayofmonth'] = '日'; +$labels['addrdate'] = 'Add repeat date'; + $labels['changeeventconfirm'] = 'イベント変更'; $labels['removeeventconfirm'] = 'イベント削除'; $labels['changerecurringeventwarning'] = 'これは繰返しイベントです。現在のイベントのみ、このイベントと今後の全イベント、全イベント、編集したい、もしくは新しいイベントとして保存したい?'; @@ -203,4 +222,13 @@ $labels['currentevent'] = '現在'; $labels['futurevents'] = '今後'; $labels['allevents'] = '全て'; $labels['saveasnew'] = '新規保存'; + +// birthdays calendar +$labels['birthdays'] = 'Birthdays'; +$labels['birthdayscalendar'] = 'Birthdays Calendar'; +$labels['displaybirthdayscalendar'] = 'Display birthdays calendar'; +$labels['birthdayscalendarsources'] = 'From these address books'; +$labels['birthdayeventtitle'] = '$name\'s Birthday'; +$labels['birthdayage'] = 'Age $age'; + ?> diff --git a/plugins/calendar/localization/nl_NL.inc b/plugins/calendar/localization/nl_NL.inc index b3774086..8161b3ce 100644 --- a/plugins/calendar/localization/nl_NL.inc +++ b/plugins/calendar/localization/nl_NL.inc @@ -1,17 +1,24 @@ CalDAV client application (e.g. Evolution or Mozilla Thunderbird) to fully synchronize this specific calendar with your computer or mobile device.'; + +// agenda view +$labels['listrange'] = 'Range to display:'; +$labels['listsections'] = 'Verdeel in:'; +$labels['smartsections'] = 'Smart sections'; $labels['until'] = 'tot'; $labels['today'] = 'Vandaag'; $labels['tomorrow'] = 'Morgen'; @@ -75,7 +96,13 @@ $labels['nextmonth'] = 'Volgende maand'; $labels['weekofyear'] = 'Week'; $labels['pastevents'] = 'Verleden'; $labels['futureevents'] = 'Toekomst'; -$labels['showalarms'] = 'Alarmen tonen'; + +// alarm/reminder settings +$labels['showalarms'] = 'Show reminders'; +$labels['defaultalarmtype'] = 'Standaard herinnering instelling'; +$labels['defaultalarmoffset'] = 'Standaard herinnering tijd'; + +// attendees $labels['attendee'] = 'Deelnemer'; $labels['role'] = 'Rol'; $labels['availability'] = 'Beschikb.'; @@ -84,6 +111,12 @@ $labels['addattendee'] = 'Deelnemer toevoegen'; $labels['roleorganizer'] = 'Organisatie'; $labels['rolerequired'] = 'Verplicht'; $labels['roleoptional'] = 'Optioneel'; +$labels['rolechair'] = 'Chair'; +$labels['rolenonparticipant'] = 'Absent'; +$labels['cutypeindividual'] = 'Individual'; +$labels['cutypegroup'] = 'Groep'; +$labels['cutyperesource'] = 'Middel'; +$labels['cutyperoom'] = 'Room'; $labels['availfree'] = 'Vrij'; $labels['availbusy'] = 'Bezig'; $labels['availunknown'] = 'Onbekend'; @@ -91,26 +124,69 @@ $labels['availtentative'] = 'Misschien'; $labels['availoutofoffice'] = 'Niet Aanwezig'; $labels['scheduletime'] = 'Vind beschikbaarheid'; $labels['sendinvitations'] = 'Verzend uitnodigingen'; -$labels['itipinvitation'] = 'Uitnodiging voor'; -$labels['itipupdate'] = 'Update van'; -$labels['itipcancellation'] = 'Afgelast:'; -$labels['itipaccepted'] = 'Accepteer'; -$labels['itiptentative'] = 'Misschien'; -$labels['itipdeclined'] = 'Afwijzen'; -$labels['importtocalendar'] = 'Bewaar in mijn kalender'; -$labels['removefromcalendar'] = 'Verwijder van mijn kalender'; -$labels['updateattendeestatus'] = 'Update status van deelnemer'; -$labels['acceptinvitation'] = 'Accepteer je deze uitnodiging?'; -$labels['youhaveaccepted'] = 'Je hebt de uitnodiging geaccepteerd'; -$labels['youhavedeclined'] = 'Je hebt deze uitnodiging afgewezen'; +$labels['sendnotifications'] = 'Notify participants about modifications'; +$labels['sendcancellation'] = 'Notify participants about event cancellation'; +$labels['onlyworkinghours'] = 'Find availability within my working hours'; +$labels['reqallattendees'] = 'Required/all participants'; +$labels['prevslot'] = 'Previous Slot'; +$labels['nextslot'] = 'Next Slot'; +$labels['noslotfound'] = 'Unable to find a free time slot'; +$labels['invitationsubject'] = 'U bent uitgenodigd voor "$title"'; +$labels['invitationmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with all the event details which you can import to your calendar application."; +$labels['invitationattendlinks'] = "In case your email client doesn't support iTip requests you can use the following link to either accept or decline this invitation:\n\$url"; +$labels['eventupdatesubject'] = '"$title" is bijgewerkt'; +$labels['eventupdatesubjectempty'] = 'An event that concerns you has been updated'; +$labels['eventupdatemailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with the updated event details which you can import to your calendar application."; +$labels['eventcancelsubject'] = '"$title" is geannuleerd'; +$labels['eventcancelmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nThe event has been cancelled by \$organizer.\n\nPlease find attached an iCalendar file with the updated event details."; + +// invitation handling +$labels['itipmailbodyaccepted'] = "\$sender has accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; +$labels['itipmailbodytentative'] = "\$sender has tentatively accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; +$labels['itipmailbodydeclined'] = "\$sender has declined the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; +$labels['itipdeclineevent'] = 'Do you want to decline your invitation to this event?'; +$labels['declinedeleteconfirm'] = 'Do you also want to delete this declined event from your calendar?'; + +$labels['notanattendee'] = 'You\'re not listed as an attendee of this event'; $labels['eventcancelled'] = 'Dit evenement is afgelast'; $labels['saveincalendar'] = 'bewaar in'; + +// event dialog tabs $labels['tabsummary'] = 'Samenvatting'; $labels['tabrecurrence'] = 'Herhaling'; $labels['tabattendees'] = 'Deelnemers'; $labels['tabattachments'] = 'Toebehoren'; $labels['tabsharing'] = 'Delen'; + +// messages +$labels['deleteventconfirm'] = 'Do you really want to delete this event?'; +$labels['deletecalendarconfirm'] = 'Do you really want to delete this calendar with all its events?'; +$labels['deletecalendarconfirmrecursive'] = 'Do you really want to delete this calendar with all its events and sub-calendars?'; $labels['savingdata'] = 'Data wordt opgeslagen...'; +$labels['errorsaving'] = 'Failed to save changes.'; +$labels['operationfailed'] = 'The requested operation failed.'; +$labels['invalideventdates'] = 'Invalid dates entered! Please check your input.'; +$labels['invalidcalendarproperties'] = 'Invalid calendar properties! Please set a valid name.'; +$labels['searchnoresults'] = 'No events found in the selected calendars.'; +$labels['successremoval'] = 'The event has been deleted successfully.'; +$labels['successrestore'] = 'The event has been restored successfully.'; +$labels['errornotifying'] = 'Failed to send notifications to event participants'; +$labels['errorimportingevent'] = 'Failed to import the event'; +$labels['newerversionexists'] = 'A newer version of this event already exists! Aborted.'; +$labels['nowritecalendarfound'] = 'No calendar found to save the event'; +$labels['importedsuccessfully'] = 'The event was successfully added to \'$calendar\''; +$labels['attendeupdateesuccess'] = 'Successfully updated the participant\'s status'; +$labels['itipsendsuccess'] = 'Invitation sent to participants.'; +$labels['itipresponseerror'] = 'Failed to send the response to this event invitation'; +$labels['itipinvalidrequest'] = 'This invitation is no longer valid'; +$labels['sentresponseto'] = 'Successfully sent invitation response to $mailto'; +$labels['localchangeswarning'] = 'You are about to make changes that will only be reflected on your calendar and not be sent to the organizer of the event.'; +$labels['importsuccess'] = 'Successfully imported $nr events'; +$labels['importnone'] = 'No events found to be imported'; +$labels['importerror'] = 'An error occured while importing'; +$labels['aclnorights'] = 'You do not have administrator rights on this calendar.'; + +// recurrence form $labels['repeat'] = 'Herhaal'; $labels['frequency'] = 'Herhaal'; $labels['never'] = 'nooit'; @@ -118,10 +194,12 @@ $labels['daily'] = 'dagelijks'; $labels['weekly'] = 'weekelijks'; $labels['monthly'] = 'maandelijks'; $labels['yearly'] = 'jaarlijks'; +$labels['rdate'] = 'on dates'; $labels['every'] = 'Elke'; $labels['days'] = 'dag(en)'; $labels['weeks'] = 'week / weken'; $labels['months'] = 'maand(en)'; +$labels['years'] = 'year(s) in:'; $labels['bydays'] = 'Op'; $labels['untildate'] = 'de'; $labels['each'] = 'Elke'; @@ -136,10 +214,23 @@ $labels['third'] = 'derde'; $labels['fourth'] = 'vierde'; $labels['last'] = 'laatste'; $labels['dayofmonth'] = 'Dag van de maand'; +$labels['addrdate'] = 'Add repeat date'; + $labels['changeeventconfirm'] = 'Wijzig evenement'; $labels['removeeventconfirm'] = 'Verwijder evenement'; +$labels['changerecurringeventwarning'] = 'This is a recurring event. Would you like to edit the current event only, this and all future occurences, all occurences or save it as a new event?'; +$labels['removerecurringeventwarning'] = 'This is a recurring event. Would you like to remove the current event only, this and all future occurences or all occurences of this event?'; $labels['currentevent'] = 'Huidige'; $labels['futurevents'] = 'Toekomst'; $labels['allevents'] = 'Alle'; $labels['saveasnew'] = 'Bewaar als nieuw'; + +// birthdays calendar +$labels['birthdays'] = 'Birthdays'; +$labels['birthdayscalendar'] = 'Birthdays Calendar'; +$labels['displaybirthdayscalendar'] = 'Display birthdays calendar'; +$labels['birthdayscalendarsources'] = 'From these address books'; +$labels['birthdayeventtitle'] = '$name\'s Birthday'; +$labels['birthdayage'] = 'Age $age'; + ?> diff --git a/plugins/calendar/localization/pl_PL.inc b/plugins/calendar/localization/pl_PL.inc index ac647638..4d123723 100644 --- a/plugins/calendar/localization/pl_PL.inc +++ b/plugins/calendar/localization/pl_PL.inc @@ -1,22 +1,235 @@ CalDAV (np. Evolution lub Mozilla Thunderbird) aby zsynchronizować wybrany kalendarz z twoim komputerem lub urządzeniem przenośnym.'; + +// agenda view +$labels['listrange'] = 'Zakres do pokazania:'; +$labels['listsections'] = 'Podziel na:'; +$labels['smartsections'] = 'Inteligentne sekcje'; +$labels['until'] = 'dopóki'; $labels['today'] = 'Dzisiaj'; $labels['tomorrow'] = 'Jutro'; -$labels['showalarms'] = 'Pokaż alarmy'; +$labels['thisweek'] = 'Bieżący tydzień'; +$labels['nextweek'] = 'Następny tydzień'; +$labels['thismonth'] = 'Bieżący miesiąc'; +$labels['nextmonth'] = 'Następny miesiąc'; +$labels['weekofyear'] = 'Tydzień'; +$labels['pastevents'] = 'Przeszłe'; +$labels['futureevents'] = 'Przyszłe'; + +// alarm/reminder settings +$labels['showalarms'] = 'Show reminders'; +$labels['defaultalarmtype'] = 'Domyślne powiadomienie'; +$labels['defaultalarmoffset'] = 'Domyślny czas powiadomienia'; + +// attendees +$labels['attendee'] = 'Uczestnik'; $labels['role'] = 'Rola'; +$labels['availability'] = 'Dostępny'; +$labels['confirmstate'] = 'Status'; +$labels['addattendee'] = 'Dodaj uczestnika'; +$labels['roleorganizer'] = 'Organizator'; +$labels['rolerequired'] = 'Wymagany'; $labels['roleoptional'] = 'Opcjonalny'; +$labels['rolechair'] = 'Przewodniczący'; +$labels['rolenonparticipant'] = 'Absent'; +$labels['cutypeindividual'] = 'Osoba'; +$labels['cutypegroup'] = 'Grupa'; +$labels['cutyperesource'] = 'Zasób'; +$labels['cutyperoom'] = 'Pokój'; +$labels['availfree'] = 'Wolny'; +$labels['availbusy'] = 'Zajęty'; +$labels['availunknown'] = 'Nieznany'; +$labels['availtentative'] = 'Niepewny'; +$labels['availoutofoffice'] = 'Poza biurem'; +$labels['scheduletime'] = 'Sprawdź dostępność'; +$labels['sendinvitations'] = 'Wyślij zaproszenia'; +$labels['sendnotifications'] = 'Powiadom uczestników o zmianach'; +$labels['sendcancellation'] = 'Powiadom uczestników o anulowaniu zdarzenia'; +$labels['onlyworkinghours'] = 'Sprawdź dostępność w moich godzinach pracy'; +$labels['reqallattendees'] = 'Wymagany/wszyscy uczestnicy'; +$labels['prevslot'] = 'Poprzedni przedział'; +$labels['nextslot'] = 'Następny przedział'; +$labels['noslotfound'] = 'Nie znaleziono wolnego przedziału czasu'; +$labels['invitationsubject'] = 'Zostałeś zaproszony do "$title"'; +$labels['invitationmailbody'] = "*\$title*\n\nKiedy: \$date\n\nZaproszeni: \$attendees\n\nW załączeniu plik w formacie iCalendar ze szczegółami zdarzenia, który możesz zaimportować do twojej aplikacji kalendarza."; +$labels['invitationattendlinks'] = "W przypadku gdy klient poczty elektronicznej nie obsługuje rządań w formacie iTip, aby zaakceptować lub odrzucić to zaproszenie, można skorzystać z następującego linku:\n\$url "; +$labels['eventupdatesubject'] = '"$title" zostało zaktualizowane'; +$labels['eventupdatesubjectempty'] = 'Zdarzenie które cię dotyczy zostało zaktualizowane'; +$labels['eventupdatemailbody'] = "*\$title*\n\nKiedy: \$date\n\nZaproszeni: \$attendees\n\nW załączeniu plik w formacie iCalendar zawierający zaktualizowane szczegóły zdarzenia, które możesz zaimportować do swojej aplikacji kalendarza."; +$labels['eventcancelsubject'] = '"$title" zostało anulowane'; +$labels['eventcancelmailbody'] = "*\$title*\n\nKiedy: \$date\n\nZaproszeni: \$attendees\n\nZdarzenie zostało anulowane przez \$organizer.\n\nW załączeniu plik w formacie iCalendar ze zaktualizowanymi szczegółami zdarzenia."; + +// invitation handling +$labels['itipmailbodyaccepted'] = "\$sender zaakceptował zaproszenie do następującego zdarzenia:\n\n*\$title*\n\nKiedy: \$date\n\nZaproszeni: \$attendees"; +$labels['itipmailbodytentative'] = "\$sender warunkowo zaakceptował zaproszenie do następującego zdarzenia:\n\n*\$title*\n\nKiedy: \$date\n\nZaproszeni: \$attendees"; +$labels['itipmailbodydeclined'] = "\$sender odrzucił zaproszenie na następujące zdarzenie:\n\n*\$title*\n\nKiedy: \$date\n\nZaproszeni: \$attendees"; +$labels['itipdeclineevent'] = 'Czy chcesz odrzucić zaproszenie na to zdarzenie?'; +$labels['declinedeleteconfirm'] = 'Czy chcesz także usunąć to odrzucone zdarzenie ze swojego kalendarza?'; +$labels['notanattendee'] = 'Nie jesteś na liście uczestników tego zdarzenia'; +$labels['eventcancelled'] = 'Zdarzenie zostało anulowane'; +$labels['saveincalendar'] = 'zapisz w'; + +// event dialog tabs $labels['tabsummary'] = 'Podsumowanie'; +$labels['tabrecurrence'] = 'Powtarzalność'; +$labels['tabattendees'] = 'Uczestnicy'; $labels['tabattachments'] = 'Załączniki'; +$labels['tabsharing'] = 'Udostępnianie'; + +// messages +$labels['deleteventconfirm'] = 'Czy na pewno chcesz usunąć to zdarzenie?'; +$labels['deletecalendarconfirm'] = 'Czy na pewno chcesz usunąć ten kalendarz z wszystkimi zadaniami?'; +$labels['deletecalendarconfirmrecursive'] = 'Czy na pewno chcesz usunąć ten kalendarz ze wszystkimi zdarzeniami i pod-kalendarzami?'; $labels['savingdata'] = 'Zapisuję dane...'; +$labels['errorsaving'] = 'Błąd podczas zapisu danych.'; +$labels['operationfailed'] = 'Żądana operacja nie powiodła się.'; +$labels['invalideventdates'] = 'Błędna data! Proszę sprawdzić wprowadzone dane.'; +$labels['invalidcalendarproperties'] = 'Błędna właściwość kalendarza! Proszę podać poprawną nazwę.'; +$labels['searchnoresults'] = 'Nie znaleziono zdarzeń w wybranym kalendarzu.'; +$labels['successremoval'] = 'Zdarzenie zostało usunięte.'; +$labels['successrestore'] = 'Zdarzenie zostało przywrócone.'; +$labels['errornotifying'] = 'Nie udało się wysłać powiadomień do uczestników zdarzenia'; +$labels['errorimportingevent'] = 'Nie udało się zaimportować zdarzenia'; +$labels['newerversionexists'] = 'Istnieje nowsza wersja tego zdarzenia ! Przerwano.'; +$labels['nowritecalendarfound'] = 'Nie znaleziono kalendarza aby zapisać zdarzenie.'; +$labels['importedsuccessfully'] = 'Zdarzenie dodano do \'$calendar\''; +$labels['attendeupdateesuccess'] = 'Zaktualizowano status uczestnika.'; +$labels['itipsendsuccess'] = 'Wysłano zaproszenia do uczestników.'; +$labels['itipresponseerror'] = 'Nie udało się wysłać odpowiedzi na to zaproszenie.'; +$labels['itipinvalidrequest'] = 'To zaproszenie nie jest już aktualne.'; +$labels['sentresponseto'] = 'Wysłano odpowiedź na zaproszenie do $mailto.'; +$labels['localchangeswarning'] = 'Zamierzasz dokonać zmian, które mogą zostać wykonane tylko w twoim kalendarzu i nie zostaną wysłane do organizatora zdarzenia.'; +$labels['importsuccess'] = 'Zaimportowano $nr zdarzeń.'; +$labels['importnone'] = 'Nie znaleziono zdarzeń do zaimportowania.'; +$labels['importerror'] = 'Wystąpił błąd podczas importu.'; +$labels['aclnorights'] = 'Nie masz uprawnień administracyjnych dla tego kalendarza.'; + +// recurrence form +$labels['repeat'] = 'Powtórz'; +$labels['frequency'] = 'Powtórz'; +$labels['never'] = 'nigdy'; +$labels['daily'] = 'codziennie'; +$labels['weekly'] = 'cotygodniowo'; +$labels['monthly'] = 'miesięcznie'; +$labels['yearly'] = 'corocznie'; +$labels['rdate'] = 'on dates'; +$labels['every'] = 'Każdy'; +$labels['days'] = 'dnia'; +$labels['weeks'] = 'tygodnia'; +$labels['months'] = 'miesiąca'; +$labels['years'] = 'roku w:'; +$labels['bydays'] = 'W'; +$labels['untildate'] = 'do'; +$labels['each'] = 'Każdy'; +$labels['onevery'] = 'W każdy'; +$labels['onsamedate'] = 'W tej samej dacie'; +$labels['forever'] = 'zawsze'; +$labels['recurrencend'] = 'dopóki'; +$labels['forntimes'] = '$nr raz(y)'; +$labels['first'] = 'pierwszy'; +$labels['second'] = 'drugi'; +$labels['third'] = 'trzeci'; +$labels['fourth'] = 'czwarty'; +$labels['last'] = 'ostatni'; +$labels['dayofmonth'] = 'Dzień miesiąca'; +$labels['addrdate'] = 'Add repeat date'; + +$labels['changeeventconfirm'] = 'Zmień zdarzenie'; +$labels['removeeventconfirm'] = 'Usuń zdarzenie'; +$labels['changerecurringeventwarning'] = 'To jest zdarzenie powtarzalne. Czy chcesz zmienić bieżące zdarzenie, bieżące i przyszłe, wszystkie, a może zapisać je jako nowe zdarzenie?'; +$labels['removerecurringeventwarning'] = 'To jest zdarzenie powtarzalne. Czy chcesz usunąć tylko bieżące zdarzenie, bieżące i przyszłe, a może wszystkie wystąpienia?'; +$labels['currentevent'] = 'Bieżące'; +$labels['futurevents'] = 'Przyszłe'; $labels['allevents'] = 'Wszystkie'; +$labels['saveasnew'] = 'Zapisz jako nowe'; + +// birthdays calendar +$labels['birthdays'] = 'Birthdays'; +$labels['birthdayscalendar'] = 'Birthdays Calendar'; +$labels['displaybirthdayscalendar'] = 'Display birthdays calendar'; +$labels['birthdayscalendarsources'] = 'From these address books'; +$labels['birthdayeventtitle'] = '$name\'s Birthday'; +$labels['birthdayage'] = 'Age $age'; + ?> diff --git a/plugins/calendar/localization/pt_BR.inc b/plugins/calendar/localization/pt_BR.inc index df82b9eb..94b40ccb 100644 --- a/plugins/calendar/localization/pt_BR.inc +++ b/plugins/calendar/localization/pt_BR.inc @@ -1,7 +1,11 @@ CalDAV client application (e.g. Evolution or Mozilla Thunderbird) to fully synchronize this specific calendar with your computer or mobile device.'; + +// agenda view $labels['listrange'] = 'Intervalo para exibir:'; $labels['listsections'] = 'Dividir em:'; $labels['smartsections'] = 'Seções inteligentes'; @@ -83,9 +96,13 @@ $labels['nextmonth'] = 'Próximo mês'; $labels['weekofyear'] = 'Semana'; $labels['pastevents'] = 'Passado'; $labels['futureevents'] = 'Futuro'; -$labels['showalarms'] = 'Mostrar alarmes'; + +// alarm/reminder settings +$labels['showalarms'] = 'Show reminders'; $labels['defaultalarmtype'] = 'Configuração de lembrete padrão'; $labels['defaultalarmoffset'] = 'Horário padrão de lembrete'; + +// attendees $labels['attendee'] = 'Participante'; $labels['role'] = 'Papel'; $labels['availability'] = 'Disp.'; @@ -94,6 +111,12 @@ $labels['addattendee'] = 'Adicionar participante'; $labels['roleorganizer'] = 'Organizador'; $labels['rolerequired'] = 'Obrigatório'; $labels['roleoptional'] = 'Opcional'; +$labels['rolechair'] = 'Chair'; +$labels['rolenonparticipant'] = 'Absent'; +$labels['cutypeindividual'] = 'Individual'; +$labels['cutypegroup'] = 'Grupo'; +$labels['cutyperesource'] = 'Recurso'; +$labels['cutyperoom'] = 'Room'; $labels['availfree'] = 'Disponível'; $labels['availbusy'] = 'Ocupado'; $labels['availunknown'] = 'Desconhecido'; @@ -116,37 +139,28 @@ $labels['eventupdatesubjectempty'] = 'Um evento do seu interesse foi atualizado' $labels['eventupdatemailbody'] = "*\$title*\n\nQuando: \$date\n\nConvidados: \$attendees\n\nSegue em anexo um arquivo iCalendar com os detalhes atualizados do evento na qual você pode importar para sua aplicação de calendário."; $labels['eventcancelsubject'] = '"$title" foi cancelado'; $labels['eventcancelmailbody'] = "*\$title*\n\nQuando: \$date\n\nConvidados: \$attendees\n\nO evento foi cancelado por \$organizer.\n\nSegue em anexo um arquivo iCalendar com os detalhes atualizados do evento."; -$labels['itipinvitation'] = 'Convite para'; -$labels['itipupdate'] = 'Atualização de'; -$labels['itipcancellation'] = 'Cancelado:'; -$labels['itipreply'] = 'Responder para'; -$labels['itipaccepted'] = 'Aceitar'; -$labels['itiptentative'] = 'Talvez'; -$labels['itipdeclined'] = 'Rejeitar'; -$labels['itipsubjectaccepted'] = '"$title" foi aceito por $name'; -$labels['itipsubjecttentative'] = '"$title" foi aceito como tentativa por $name'; -$labels['itipsubjectdeclined'] = '"$title" foi recusado por $name'; + +// invitation handling $labels['itipmailbodyaccepted'] = "\$sender aceitou o convite para o seguinte evento:\n\n*\$title*\n\nQuando: \$date\n\nConvidados: \$attendees"; $labels['itipmailbodytentative'] = "\$sender aceitou como tentativa o convite para o seguinte evento:\n\n*\$title*\n\nQuando: \$date\n\nConvidados: \$attendees"; $labels['itipmailbodydeclined'] = "\$sender recusou o convite para o seguinte evento:\n\n*\$title*\n\nQuando: \$date\n\nConvidados: \$attendees"; $labels['itipdeclineevent'] = 'Você deseja recusar o convite para este evento?'; -$labels['importtocalendar'] = 'Salvar em meu calendário'; -$labels['removefromcalendar'] = 'Remover do meu calendário'; -$labels['updateattendeestatus'] = 'Atualizar o estado dos participantes'; -$labels['acceptinvitation'] = 'Você aceita este convite?'; -$labels['youhaveaccepted'] = 'Você aceitou este convite'; -$labels['youhavetentative'] = 'Você aceitou como tentativa este convite'; -$labels['youhavedeclined'] = 'Você recusou este convite'; +$labels['declinedeleteconfirm'] = 'Do you also want to delete this declined event from your calendar?'; $labels['notanattendee'] = 'Você não está listado como um participante deste evento'; $labels['eventcancelled'] = 'O evento foi cancelado'; $labels['saveincalendar'] = 'salvar em'; + +// event dialog tabs $labels['tabsummary'] = 'Sumário'; $labels['tabrecurrence'] = 'Repetição'; $labels['tabattendees'] = 'Participantes'; $labels['tabattachments'] = 'Anexos'; $labels['tabsharing'] = 'Compartilhamento'; + +// messages $labels['deleteventconfirm'] = 'Você realmente deseja remover este evento?'; $labels['deletecalendarconfirm'] = 'Você realmente deseja excluir este calendário com todos os seus eventos?'; +$labels['deletecalendarconfirmrecursive'] = 'Do you really want to delete this calendar with all its events and sub-calendars?'; $labels['savingdata'] = 'Salvando dados...'; $labels['errorsaving'] = 'Falha ao salvar as modificações.'; $labels['operationfailed'] = 'A operação requisitada falhou.'; @@ -165,10 +179,13 @@ $labels['itipsendsuccess'] = 'Convite enviado aos participantes.'; $labels['itipresponseerror'] = 'Falha ao enviar a resposta para este convite de evento'; $labels['itipinvalidrequest'] = 'Este convite não é mais válido'; $labels['sentresponseto'] = 'Resposta de convite enviada com sucesso para $mailto'; +$labels['localchangeswarning'] = 'You are about to make changes that will only be reflected on your calendar and not be sent to the organizer of the event.'; $labels['importsuccess'] = 'Importado com sucesso $nr eventos'; $labels['importnone'] = 'Não há eventos a serem importados'; $labels['importerror'] = 'Ocorreu um erro na importação'; $labels['aclnorights'] = 'Você não tem permissão de administrador neste calendário.'; + +// recurrence form $labels['repeat'] = 'Repetir'; $labels['frequency'] = 'Repetir'; $labels['never'] = 'nunca'; @@ -176,6 +193,7 @@ $labels['daily'] = 'diariamente'; $labels['weekly'] = 'semanalmente'; $labels['monthly'] = 'mensalmente'; $labels['yearly'] = 'anualmente'; +$labels['rdate'] = 'on dates'; $labels['every'] = 'À cada'; $labels['days'] = 'dia(s)'; $labels['weeks'] = 'semana(s)'; @@ -195,6 +213,8 @@ $labels['third'] = 'terceira'; $labels['fourth'] = 'quarta'; $labels['last'] = 'última'; $labels['dayofmonth'] = 'Dia do mês'; +$labels['addrdate'] = 'Add repeat date'; + $labels['changeeventconfirm'] = 'Trocar evento'; $labels['removeeventconfirm'] = 'Remover evento'; $labels['changerecurringeventwarning'] = 'Este é um evento com repetição. Você gostaria de editar o evento atual somente, estas e todas as futuras ocorrências ou salvar este como um novo evento?'; @@ -203,4 +223,13 @@ $labels['currentevent'] = 'Atual'; $labels['futurevents'] = 'Futuro'; $labels['allevents'] = 'Todos'; $labels['saveasnew'] = 'Salvar como novo'; + +// birthdays calendar +$labels['birthdays'] = 'Birthdays'; +$labels['birthdayscalendar'] = 'Birthdays Calendar'; +$labels['displaybirthdayscalendar'] = 'Display birthdays calendar'; +$labels['birthdayscalendarsources'] = 'From these address books'; +$labels['birthdayeventtitle'] = '$name\'s Birthday'; +$labels['birthdayage'] = 'Age $age'; + ?> diff --git a/plugins/calendar/localization/ru_RU.inc b/plugins/calendar/localization/ru_RU.inc index 7e109d8b..85ee2663 100644 --- a/plugins/calendar/localization/ru_RU.inc +++ b/plugins/calendar/localization/ru_RU.inc @@ -1,7 +1,11 @@ поддерживающий CalDAV (например, Evolution или Mozilla Thunderbird) для полной синхронизации данного календаря со своим компьютером или мобильным устройством.'; + +// agenda view $labels['listrange'] = 'Диапазон:'; $labels['listsections'] = 'Разделить на:'; $labels['smartsections'] = 'Умные секции'; @@ -83,9 +96,13 @@ $labels['nextmonth'] = 'Следующий месяц'; $labels['weekofyear'] = 'Неделя'; $labels['pastevents'] = 'Прошедшее'; $labels['futureevents'] = 'Будущее'; + +// alarm/reminder settings $labels['showalarms'] = 'Показывать напоминания'; $labels['defaultalarmtype'] = 'Настройки напоминания по умолчанию'; $labels['defaultalarmoffset'] = 'Время напоминания по умолчанию'; + +// attendees $labels['attendee'] = 'Участник'; $labels['role'] = 'Роль'; $labels['availability'] = 'Доступность'; @@ -94,6 +111,12 @@ $labels['addattendee'] = 'Добавить участника'; $labels['roleorganizer'] = 'Организатор'; $labels['rolerequired'] = 'Обязательный'; $labels['roleoptional'] = 'Необязательный'; +$labels['rolechair'] = 'Место'; +$labels['rolenonparticipant'] = 'Absent'; +$labels['cutypeindividual'] = 'Индивидуум'; +$labels['cutypegroup'] = 'Группа'; +$labels['cutyperesource'] = 'Ресурс'; +$labels['cutyperoom'] = 'Комната'; $labels['availfree'] = 'Свободен'; $labels['availbusy'] = 'Занят'; $labels['availunknown'] = 'Неизвестно'; @@ -116,37 +139,28 @@ $labels['eventupdatesubjectempty'] = 'Событие, которое касае $labels['eventupdatemailbody'] = "*\$title*\n\nКогда: \$date\n\nПриглашенные: \$attendees\n\nВо вложении вы найдёте файл iCalendar со всеми изменениями в событии, который Вы можете импортировать в Вашу программу-ежедневник."; $labels['eventcancelsubject'] = '"$title" было отменено'; $labels['eventcancelmailbody'] = "*\$title*\n\nКогда: \$date\n\nПриглашенные: \$attendees\n\nЭто событие отменено \$organizer.\n\nВо вложении вы найдёте файл iCalendar со всеми изменениями в событии."; -$labels['itipinvitation'] = 'Приглашение на'; -$labels['itipupdate'] = 'Обновление'; -$labels['itipcancellation'] = 'Отменённый:'; -$labels['itipreply'] = 'Ответить'; -$labels['itipaccepted'] = 'Принять'; -$labels['itiptentative'] = 'Может быть'; -$labels['itipdeclined'] = 'Отклонить'; -$labels['itipsubjectaccepted'] = '"$title" принято $name'; -$labels['itipsubjecttentative'] = '"$title" предварительно принято $name'; -$labels['itipsubjectdeclined'] = '"$title" отклонено $name'; + +// invitation handling $labels['itipmailbodyaccepted'] = "\$sender принял(а) приглашение на следующее событие:\n\n*\$title*\n\nКогда: \$date\n\nПриглашенные: \$attendees"; $labels['itipmailbodytentative'] = "\$sender предварительно принял(а) приглашение на следующее событие:\n\n*\$title*\n\nКогда: \$date\n\nПриглашенные: \$attendees"; $labels['itipmailbodydeclined'] = "\$sender отклонил(а) приглашение на следующее событие:\n\n*\$title*\n\nКогда: \$date\n\nПриглашенные: \$attendees"; $labels['itipdeclineevent'] = 'Вы хотите отклонить приглашение на это событие?'; -$labels['importtocalendar'] = 'Сохранить в мой календарь'; -$labels['removefromcalendar'] = 'Удалить из моего календаря'; -$labels['updateattendeestatus'] = 'Обновить статус участника'; -$labels['acceptinvitation'] = 'Вы принимаете это приглашение?'; -$labels['youhaveaccepted'] = 'Вы приняли это приглашение'; -$labels['youhavetentative'] = 'Вы предварительно приняли это приглашение'; -$labels['youhavedeclined'] = 'Вы отклонили это приглашение'; +$labels['declinedeleteconfirm'] = 'Хотите ли вы так же удалить это отклонённое событие из вашего календаря?'; $labels['notanattendee'] = 'Вы не в списке участников этого события'; $labels['eventcancelled'] = 'Это событие отменено'; $labels['saveincalendar'] = 'сохранить в'; + +// event dialog tabs $labels['tabsummary'] = 'Сводка'; $labels['tabrecurrence'] = 'Повторение'; $labels['tabattendees'] = 'Участники'; $labels['tabattachments'] = 'Вложения'; $labels['tabsharing'] = 'Совместное использование'; + +// messages $labels['deleteventconfirm'] = 'Вы действительно хотите удалить это событие?'; $labels['deletecalendarconfirm'] = 'Вы действительно хотите удалить этот календарь со всеми его событиями?'; +$labels['deletecalendarconfirmrecursive'] = 'Вы действительно хотите удалить этот календарь со всеми его событиями и вложенными календарями?'; $labels['savingdata'] = 'Сохранение данных...'; $labels['errorsaving'] = 'Ошибка сохранения изменений.'; $labels['operationfailed'] = 'Не удалось выполнить запрошенную операцию.'; @@ -165,10 +179,13 @@ $labels['itipsendsuccess'] = 'Приглашания отправлены уча $labels['itipresponseerror'] = 'Не удалось послать ответ на это приглашение'; $labels['itipinvalidrequest'] = 'Это приглашение больше не действительно'; $labels['sentresponseto'] = 'Успешно отправлен ответ на приглашение на $mailto'; +$labels['localchangeswarning'] = 'Вы собираетесь внести изменения, которые отразятся только на Вашем личном календаре и не будут отправлены организатору события.'; $labels['importsuccess'] = 'Успешно импортировано $nr событий'; $labels['importnone'] = 'Не найдено событий для импорта'; $labels['importerror'] = 'Ошибка при импорте'; $labels['aclnorights'] = 'Вы не имеете прав администратора для этого календаря.'; + +// recurrence form $labels['repeat'] = 'Повторить'; $labels['frequency'] = 'Повторить'; $labels['never'] = 'никогда'; @@ -176,6 +193,7 @@ $labels['daily'] = 'ежедневно'; $labels['weekly'] = 'еженедельно'; $labels['monthly'] = 'ежемесячно'; $labels['yearly'] = 'ежегодно'; +$labels['rdate'] = 'on dates'; $labels['every'] = 'Каждый(ую)'; $labels['days'] = 'день'; $labels['weeks'] = 'неделю'; @@ -195,6 +213,8 @@ $labels['third'] = 'третий(ую)'; $labels['fourth'] = 'четвертый(ую)'; $labels['last'] = 'последний(ую)'; $labels['dayofmonth'] = 'День месяца'; +$labels['addrdate'] = 'Add repeat date'; + $labels['changeeventconfirm'] = 'Изменить событие'; $labels['removeeventconfirm'] = 'Удалить событие'; $labels['changerecurringeventwarning'] = 'Это - повторяющееся событие. Хотели бы Вы редактировать только текущее событие, это и все будущие повторения, все события или сохранять его как новое событие?'; @@ -203,4 +223,13 @@ $labels['currentevent'] = 'Текущее'; $labels['futurevents'] = 'Будущие'; $labels['allevents'] = 'Все'; $labels['saveasnew'] = 'Сохранить как новое'; + +// birthdays calendar +$labels['birthdays'] = 'Дни рождения'; +$labels['birthdayscalendar'] = 'Календарь Дней Рождения'; +$labels['displaybirthdayscalendar'] = 'Показывать календарь Дней Рождения'; +$labels['birthdayscalendarsources'] = 'Из этих адресных книг'; +$labels['birthdayeventtitle'] = 'День рождения $name'; +$labels['birthdayage'] = 'Возраст $age'; + ?> diff --git a/plugins/calendar/skins/classic/calendar.css b/plugins/calendar/skins/classic/calendar.css index 26d93b4f..e9bde94b 100644 --- a/plugins/calendar/skins/classic/calendar.css +++ b/plugins/calendar/skins/classic/calendar.css @@ -1248,8 +1248,7 @@ div.calendar-invitebox td.label { } #event-rsvp .rsvp-buttons, -div.calendar-invitebox .rsvp-status, -div.calendar-invitebox .rsvp-buttons { +div.calendar-invitebox .itip-buttons div { margin-top: 0.5em; } @@ -1260,7 +1259,7 @@ div.calendar-invitebox select { margin-right: 0.5em; } -div.calendar-invitebox .calendar-select { +div.calendar-invitebox .folder-select { font-size: 11px; margin-left: 1em; } diff --git a/plugins/calendar/skins/larry/calendar.css b/plugins/calendar/skins/larry/calendar.css index c13905d7..c9e7a8cb 100644 --- a/plugins/calendar/skins/larry/calendar.css +++ b/plugins/calendar/skins/larry/calendar.css @@ -1436,8 +1436,7 @@ div.calendar-invitebox td.label { } #event-rsvp .rsvp-buttons, -div.calendar-invitebox .rsvp-status, -div.calendar-invitebox .rsvp-buttons { +div.calendar-invitebox .itip-buttons div { margin-top: 0.5em; } @@ -1447,20 +1446,31 @@ div.calendar-invitebox input.button { margin-right: 0.5em; } -div.calendar-invitebox .calendar-select { +div.calendar-invitebox .folder-select { font-weight: 10px; margin-left: 1em; } +div.calendar-invitebox .rsvp-status { + padding-left: 2px; +} + div.calendar-invitebox .rsvp-status.loading { color: #666; padding: 1px 0 2px 24px; background: url(images/loading_blue.gif) top left no-repeat; } +div.calendar-invitebox .rsvp-status.hint { + color: #666; + text-shadow: none; + font-style: italic; +} + div.calendar-invitebox .rsvp-status.declined, div.calendar-invitebox .rsvp-status.tentative, -div.calendar-invitebox .rsvp-status.accepted { +div.calendar-invitebox .rsvp-status.accepted, +div.calendar-invitebox .rsvp-status.delegated { padding: 0 0 1px 22px; background: url(images/attendee-status.gif) 2px -20px no-repeat; } @@ -1473,6 +1483,10 @@ div.calendar-invitebox .rsvp-status.tentative { background-position: 2px -60px; } +div.calendar-invitebox .rsvp-status.delegated { + background-position: 2px -160px; +} + /* iTIP attend reply page */ .calendaritipattend .centerbox { diff --git a/plugins/libcalendaring/lib/libcalendaring_itip.php b/plugins/libcalendaring/lib/libcalendaring_itip.php new file mode 100644 index 00000000..2fed51f9 --- /dev/null +++ b/plugins/libcalendaring/lib/libcalendaring_itip.php @@ -0,0 +1,524 @@ + + * + * Copyright (C) 2011-2014, Kolab Systems AG + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +class libcalendaring_itip +{ + protected $rc; + protected $lib; + protected $plugin; + protected $sender; + protected $domain; + protected $itip_send = false; + + function __construct($plugin, $domain = 'libcalendaring') + { + $this->plugin = $plugin; + $this->rc = rcube::get_instance(); + $this->lib = libcalendaring::get_instance(); + $this->domain = $domain; + + $hook = $this->rc->plugins->exec_hook('calendar_load_itip', + array('identity' => $this->rc->user->get_identity())); + $this->sender = $hook['identity']; + + $this->plugin->add_hook('message_before_send', array($this, 'before_send_hook')); + $this->plugin->add_hook('smtp_connect', array($this, 'smtp_connect_hook')); + } + + function set_sender_email($email) + { + if (!empty($email)) + $this->sender['email'] = $email; + } + + /** + * Wrapper for rcube_plugin::gettext() + * Checking for a label in different domains + * + * @see rcube::gettext() + */ + protected function gettext($p) + { + $label = is_array($p) ? $p['name'] : $p; + $domain = $this->domain; + if (!$this->rc->text_exists($label, $domain)) { + $domain = 'libcalendaring'; + } + return $this->rc->gettext($p, $domain); + } + + /** + * Send an iTip mail message + * + * @param array Event object to send + * @param string iTip method (REQUEST|REPLY|CANCEL) + * @param array Hash array with recipient data (name, email) + * @param string Mail subject + * @param string Mail body text label + * @param object Mail_mime object with message data + * @return boolean True on success, false on failure + */ + public function send_itip_message($event, $method, $recipient, $subject, $bodytext, $message = null) + { + if (!$this->sender['name']) + $this->sender['name'] = $this->sender['email']; + + if (!$message) + $message = $this->compose_itip_message($event, $method); + + $mailto = rcube_idn_to_ascii($recipient['email']); + + $headers = $message->headers(); + $headers['To'] = format_email_recipient($mailto, $recipient['name']); + $headers['Subject'] = $this->gettext(array( + 'name' => $subject, + 'vars' => array( + 'title' => $event['title'], + 'name' => $this->sender['name'] + ) + )); + + // compose a list of all event attendees + $attendees_list = array(); + foreach ((array)$event['attendees'] as $attendee) { + $attendees_list[] = ($attendee['name'] && $attendee['email']) ? + $attendee['name'] . ' <' . $attendee['email'] . '>' : + ($attendee['name'] ? $attendee['name'] : $attendee['email']); + } + + $mailbody = $this->gettext(array( + 'name' => $bodytext, + 'vars' => array( + 'title' => $event['title'], + 'date' => $this->lib->event_date_text($event, true), + 'attendees' => join(', ', $attendees_list), + 'sender' => $this->sender['name'], + 'organizer' => $this->sender['name'], + ) + )); + + // append links for direct invitation replies + if ($method == 'REQUEST' && ($token = $this->store_invitation($event, $recipient['email']))) { + $mailbody .= "\n\n" . $this->gettext(array( + 'name' => 'invitationattendlinks', + 'vars' => array('url' => $this->plugin->get_url(array('action' => 'attend', 't' => $token))), + )); + } + else if ($method == 'CANCEL') { + $this->cancel_itip_invitation($event); + } + + $message->headers($headers, true); + $message->setTXTBody(rcube_mime::format_flowed($mailbody, 79)); + + // finally send the message + $this->itip_send = true; + $sent = $this->rc->deliver_message($message, $headers['X-Sender'], $mailto, $smtp_error); + $this->itip_send = false; + + return $sent; + } + + /** + * Plugin hook triggered by rcube::deliver_message() before delivering a message. + * Here we can set the 'smtp_server' config option to '' in order to use + * PHP's mail() function for unauthenticated email sending. + */ + public function before_send_hook($p) + { + if ($this->itip_send && !$this->rc->user->ID && $this->rc->config->get('calendar_itip_smtp_server', null) === '') { + $this->rc->config->set('smtp_server', ''); + } + + return $p; + } + + /** + * Plugin hook to alter SMTP authentication. + * This is used if iTip messages are to be sent from an unauthenticated session + */ + public function smtp_connect_hook($p) + { + // replace smtp auth settings if we're not in an authenticated session + if ($this->itip_send && !$this->rc->user->ID) { + foreach (array('smtp_server', 'smtp_user', 'smtp_pass') as $prop) { + $p[$prop] = $this->rc->config->get("calendar_itip_$prop", $p[$prop]); + } + } + + return $p; + } + + /** + * Helper function to build a Mail_mime object to send an iTip message + * + * @param array Event object to send + * @param string iTip method (REQUEST|REPLY|CANCEL) + * @return object Mail_mime object with message data + */ + public function compose_itip_message($event, $method) + { + $from = rcube_idn_to_ascii($this->sender['email']); + $from_utf = rcube_idn_to_utf8($from); + $sender = format_email_recipient($from, $this->sender['name']); + + // truncate list attendees down to the recipient of the iTip Reply. + // constraints for a METHOD:REPLY according to RFC 5546 + if ($method == 'REPLY') { + $replying_attendee = null; $reply_attendees = array(); + foreach ($event['attendees'] as $attendee) { + if ($attendee['role'] == 'ORGANIZER') { + $reply_attendees[] = $attendee; + } + else if (strcasecmp($attedee['email'], $from) == 0 || strcasecmp($attendee['email'], $from_utf) == 0) { + $replying_attendee = $attendee; + } + } + if ($replying_attendee) { + $reply_attendees[] = $replying_attendee; + $event['attendees'] = $reply_attendees; + } + } + + // compose multipart message using PEAR:Mail_Mime + $message = new Mail_mime("\r\n"); + $message->setParam('text_encoding', 'quoted-printable'); + $message->setParam('head_encoding', 'quoted-printable'); + $message->setParam('head_charset', RCMAIL_CHARSET); + $message->setParam('text_charset', RCMAIL_CHARSET . ";\r\n format=flowed"); + $message->setContentType('multipart/alternative'); + + // compose common headers array + $headers = array( + 'From' => $sender, + 'Date' => $this->rc->user_date(), + 'Message-ID' => $this->rc->gen_message_id(), + 'X-Sender' => $from, + ); + if ($agent = $this->rc->config->get('useragent')) { + $headers['User-Agent'] = $agent; + } + + $message->headers($headers); + + // attach ics file for this event + $ical = $this->plugin->get_ical(); + $ics = $ical->export(array($event), $method, false, $method == 'REQUEST' && $this->plugin->driver ? array($this->plugin->driver, 'get_attachment_body') : false); + $message->addAttachment($ics, 'text/calendar', 'event.ics', false, '8bit', '', RCMAIL_CHARSET . "; method=" . $method); + + return $message; + } + + + /** + * Handler for calendar/itip-status requests + */ + public function get_itip_status($event, $existing = null) + { + $action = $event['rsvp'] ? 'rsvp' : ''; + $status = $event['fallback']; + $latest = false; + $html = ''; + + if (is_numeric($event['changed'])) + $event['changed'] = new DateTime('@'.$event['changed']); + + // check if the given itip object matches the last state + if ($existing) { + $latest = ($event['sequence'] && $existing['sequence'] == $event['sequence']) || + (!$event['sequence'] && $existing['changed'] && $existing['changed'] >= $event['changed']); + } + + // determine action for REQUEST + if ($event['method'] == 'REQUEST') { + $html = html::div('rsvp-status', $this->gettext('acceptinvitation')); + + if ($existing) { + $rsvp = $event['rsvp']; + $emails = $this->lib->get_user_emails(); + foreach ($existing['attendees'] as $i => $attendee) { + if ($attendee['email'] && in_array(strtolower($attendee['email']), $emails)) { + $status = strtoupper($attendee['status']); + break; + } + } + } + else { + $rsvp = $event['rsvp'] && $this->rc->config->get('calendar_allow_itip_uninvited', true); + } + + if ($status == 'unknown' && !$this->rc->config->get('calendar_allow_itip_uninvited', true)) { + $html = html::div('rsvp-status', $this->gettext('notanattendee')); + $action = 'import'; + } + else if (in_array($status, array('ACCEPTED','TENTATIVE','DECLINED','DELEGATED'))) { + $html = html::div('rsvp-status ' . strtolower($status), $this->gettext('youhave'.strtolower($status))); + + if ($existing && ($existing['sequence'] > $event['sequence'] || (!$event['sequence'] && $existing['changed'] && $existing['changed'] > $event['changed']))) { + $action = ''; // nothing to do here, outdated invitation + } + else if (!$existing && !$rsvp) { + $action = 'import'; + } + } + } + // determine action for REPLY + else if ($event['method'] == 'REPLY') { + // check whether the sender already is an attendee + if ($existing) { + $action = $this->rc->config->get('calendar_allow_itip_uninvited', true) ? 'accept' : ''; + $listed = false; + foreach ($existing['attendees'] as $attendee) { + if ($attendee['role'] != 'ORGANIZER' && strcasecmp($attendee['email'], $event['attendee']) == 0) { + if (in_array($status, array('ACCEPTED','TENTATIVE','DECLINED','DELEGATED'))) { + $html = html::div('rsvp-status ' . strtolower($status), $this->gettext('attendee'.strtolower($status))); + } + $action = $attendee['status'] == $status ? '' : 'update'; + $listed = true; + break; + } + } + + if (!$listed) { + $html = html::div('rsvp-status', $this->gettext('itipnewattendee')); + } + } + else { + $html = html::div('rsvp-status hint', $this->gettext('itipobjectnotfound')); + $action = ''; + } + } + else if ($event['method'] == 'CANCEL') { + if (!$existing) { + $html = html::div('rsvp-status hint', $this->gettext('itipobjectnotfound')); + $action = ''; + } + } + + return array( + 'uid' => $event['uid'], + 'id' => asciiwords($event['uid'], true), + 'saved' => $existing ? true : false, + 'latest' => $latest, + 'status' => $status, + 'action' => $action, + 'html' => $html, + ); + } + + /** + * Build inline UI elements for iTip messages + */ + public function mail_itip_inline_ui($event, $method, $mime_id, $task, $message_date = null) + { + $buttons = array(); + $dom_id = asciiwords($event['uid'], true); + $rsvp_status = 'unknown'; + + // pass some metadata about the event and trigger the asynchronous status check + $changed = is_object($event['changed']) ? $event['changed'] : $message_date; + $metadata = array( + 'uid' => $event['uid'], + 'changed' => $changed ? $changed->format('U') : 0, + 'sequence' => intval($event['sequence']), + 'method' => $method, + 'task' => $task, + ); + + // create buttons to be activated from async request checking existence of this event in local calendars + $buttons[] = html::div(array('id' => 'loading-'.$dom_id, 'class' => 'rsvp-status loading'), $this->gettext('loading')); + + // on iTip REPLY we have two options: + if ($method == 'REPLY') { + $title = $this->gettext('itipreply'); + + foreach ($event['attendees'] as $attendee) { + if (!empty($attendee['email']) && $attendee['role'] != 'ORGANIZER') { + $metadata['attendee'] = $attendee['email']; + $rsvp_status = strtoupper($attendee['status']); + break; + } + } + + // 1. update the attendee status on our copy + $update_button = html::tag('input', array( + 'type' => 'button', + 'class' => 'button', + 'onclick' => "rcube_libcalendaring.add_from_itip_mail('" . JQ($mime_id) . "', '$task')", + 'value' => $this->gettext('updateattendeestatus'), + )); + + // 2. accept or decline a new or delegate attendee + $accept_buttons = html::tag('input', array( + 'type' => 'button', + 'class' => "button accept", + 'onclick' => "rcube_libcalendaring.add_from_itip_mail('" . JQ($mime_id) . "', '$task')", + 'value' => $this->gettext('acceptattendee'), + )); + $accept_buttons .= html::tag('input', array( + 'type' => 'button', + 'class' => "button decline", + 'onclick' => "rcube_libcalendaring.decline_attendee_reply('" . JQ($mime_id) . "', '$task')", + 'value' => $this->gettext('declineattendee'), + )); + + $buttons[] = html::div(array('id' => 'update-'.$dom_id, 'style' => 'display:none'), $update_button); + $buttons[] = html::div(array('id' => 'accept-'.$dom_id, 'style' => 'display:none'), $accept_buttons); + } + // when receiving iTip REQUEST messages: + else if ($method == 'REQUEST') { + $emails = $this->lib->get_user_emails(); + $title = $event['sequence'] > 0 ? $this->gettext('itipupdate') : $this->gettext('itipinvitation'); + $metadata['rsvp'] = true; + + // 1. display RSVP buttons (if the user was invited) + foreach (array('accepted','tentative','declined') as $method) { + $rsvp_buttons .= html::tag('input', array( + 'type' => 'button', + 'class' => "button $method", + 'onclick' => "rcube_libcalendaring.add_from_itip_mail('" . JQ($mime_id) . "', '$task', '$method')", + 'value' => $this->gettext('itip' . $method), + )); + } + + // 2. Simply import the event without replying + $import_button = html::tag('input', array( + 'type' => 'button', + 'class' => 'button', + 'onclick' => "rcube_libcalendaring.add_from_itip_mail('" . JQ($mime_id) . "', '$task')", + 'value' => $this->gettext('importtocalendar'), + )); + + // check my status + foreach ($event['attendees'] as $attendee) { + if ($attendee['email'] && in_array(strtolower($attendee['email']), $emails)) { + $metadata['attendee'] = $attendee['email']; + $metadata['rsvp'] = $attendee['rsvp'] || $attendee['role'] != 'NON-PARTICIPANT'; + $rsvp_status = strtoupper($attendee['status']); + break; + } + } + + $buttons[] = html::div(array('id' => 'rsvp-'.$dom_id, 'class' => 'rsvp-buttons', 'style' => 'display:none'), $rsvp_buttons); + } + // for CANCEL messages, we can: + else if ($method == 'CANCEL') { + $title = $this->gettext('itipcancellation'); + + // 1. remove the event from our calendar + $button_remove = html::tag('input', array( + 'type' => 'button', + 'class' => 'button', + 'onclick' => "rcube_libcalendaring.remove_from_itip('" . JQ($event['uid']) . "', '$task', '" . JQ($event['title']) . "')", + 'value' => $this->gettext('removefromcalendar'), + )); + + // 2. update our copy with status=cancelled + /* TODO: implement CANCELLED status in calendar UI first + $button_update = html::tag('input', array( + 'type' => 'button', + 'class' => 'button', + 'onclick' => "rcube_libcalendaring.add_from_itip_mail('" . JQ($mime_id) . "')", + 'value' => $this->gettext('updatemycopy'), + )); + */ + + $buttons[] = html::div(array('id' => 'rsvp-'.$dom_id, 'style' => 'display:none'), $button_remove . $button_update); + + $rsvp_status = 'CANCELLED'; + $metadata['rsvp'] = true; + } + + // append generic import button + if ($import_button) { + $buttons[] = html::div(array('id' => 'import-'.$dom_id, 'style' => 'display:none'), $import_button); + } + + // TODO: add field for COMMENT on iTip replies + // TODO: add option/checkbox to delete this message after update + + // pass some metadata about the event and trigger the asynchronous status check + $metadata['fallback'] = $rsvp_status; + $metadata['rsvp'] = intval($metadata['rsvp']); + + $this->rc->output->add_script("rcube_libcalendaring.fetch_itip_object_status(" . json_serialize($metadata) . ")", 'docready'); + + // get localized texts from the right domain + $this->rc->output->command('add_label', 'itip.savingdata', $this->gettext('savingdata')); + $this->rc->output->command('add_label', 'itip.declinedeleteconfirm', $this->gettext('declinedeleteconfirm')); + $this->rc->output->command('add_label', 'itip.declinedeleteconfirm', $this->gettext('declinedeleteconfirm')); + + // show event details with buttons + return $this->itip_object_details_table($event, $title) . + html::div(array('class' => 'itip-buttons', 'id' => 'itip-buttons-' . asciiwords($metadata['uid'], true)), join('', $buttons)); + } + + /** + * Render event details in a table + */ + function itip_object_details_table($event, $title) + { + $table = new html_table(array('cols' => 2, 'border' => 0, 'class' => 'calendar-eventdetails')); + $table->add('ititle', $title); + $table->add('title', Q($event['title'])); + $table->add('label', $this->plugin->gettext('date'), $this->domain); + $table->add('date', Q($this->lib->event_date_text($event))); + if ($event['location']) { + $table->add('label', $this->plugin->gettext('location'), $this->domain); + $table->add('location', Q($event['location'])); + } + if ($event['comment']) { + $table->add('label', $this->plugin->gettext('comment'), $this->domain); + $table->add('location', Q($event['comment'])); + } + + return $table->show(); + } + + + /** + * Create iTIP invitation token for later replies via URL + * + * @param array Hash array with event properties + * @param string Attendee email address + * @return string Invitation token + */ + public function store_invitation($event, $attendee) + { + // empty stub + return false; + } + + /** + * Mark invitations for the given event as cancelled + * + * @param array Hash array with event properties + */ + public function cancel_itip_invitation($event) + { + // empty stub + return false; + } + +} diff --git a/plugins/libcalendaring/libcalendaring.js b/plugins/libcalendaring/libcalendaring.js index b69d6bd6..4acb9425 100644 --- a/plugins/libcalendaring/libcalendaring.js +++ b/plugins/libcalendaring/libcalendaring.js @@ -1,10 +1,9 @@ /** * Basic Javascript utilities for calendar-related plugins * - * @version @package_version@ * @author Thomas Bruederli * - * Copyright (C) 2012, Kolab Systems AG + * Copyright (C) 2012-2014, Kolab Systems AG * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as @@ -436,6 +435,88 @@ function rcube_libcalendaring(settings) }; } +////// static methods + +/** + * + */ +rcube_libcalendaring.add_from_itip_mail = function(mime_id, task, status) +{ + // ask user to delete the declined event from the local calendar (#1670) + var del = false; + if (rcmail.env.rsvp_saved && status == 'declined') { + del = confirm(rcmail.gettext('itip.declinedeleteconfirm')); + } + + rcmail.http_post(task + '/mailimportitip', { + '_uid': rcmail.env.uid, + '_mbox': rcmail.env.mailbox, + '_part': mime_id, + '_folder': $('#itip-saveto').val(), + '_status': status, + '_del': del?1:0 + }, rcmail.set_busy(true, 'itip.savingdata')); + + return false; +}; + +/** + * + */ +rcube_libcalendaring.remove_from_itip = function(uid, task, title) +{ + if (confirm(rcmail.gettext('itip.deleteobjectconfirm').replace('$title', title))) { + rcmail.http_post(task + '/itip-remove', + { uid: uid }, + rcmail.set_busy(true, 'itip.savingdata')); + } +}; + +/** + * + */ +rcube_libcalendaring.decline_attendee_reply = function(mime_id) +{ + // TODO: show dialog for entering a comment and send to server + + return false; +}; + +/** + * + */ +rcube_libcalendaring.fetch_itip_object_status = function(p) +{ + rcmail.http_post(p.task + '/itip-status', { data: p }); +}; + +/** + * + */ +rcube_libcalendaring.update_itip_object_status = function(p) +{ + rcmail.env.rsvp_saved = p.saved; + + // hide all elements first + $('#itip-buttons-'+p.id+' > div').hide(); + $('#rsvp-'+p.id+' .folder-select').remove(); + + if (p.html) { + // append/replace rsvp status display + $('#loading-'+p.id).next('.rsvp-status').remove(); + $('#loading-'+p.id).hide().after(p.html); + } + + // enable/disable rsvp buttons + if (p.action == 'rsvp') { + $('#rsvp-'+p.id+' input.button').prop('disabled', false) + .filter('.'+String(p.status||'unknown').toLowerCase()).prop('disabled', p.latest); + } + + // show rsvp/import buttons (with calendar selector) + $('#'+p.action+'-'+p.id).show().append(p.select); +}; + // extend jQuery (function($){ @@ -455,4 +536,7 @@ window.rcmail && rcmail.addEventListener('init', function(evt) { var libcal = new rcube_libcalendaring(rcmail.env.libcal_settings); rcmail.addEventListener('plugin.display_alarms', function(alarms){ libcal.display_alarms(alarms); }); } + + rcmail.addEventListener('plugin.update_itip_object_status', rcube_libcalendaring.update_itip_object_status); + rcmail.addEventListener('plugin.fetch_itip_object_status', rcube_libcalendaring.fetch_itip_object_status); }); diff --git a/plugins/libcalendaring/libcalendaring.php b/plugins/libcalendaring/libcalendaring.php index 88f5ed47..d33df671 100644 --- a/plugins/libcalendaring/libcalendaring.php +++ b/plugins/libcalendaring/libcalendaring.php @@ -113,7 +113,17 @@ class libcalendaring extends rcube_plugin require_once($self->home . '/libvcalendar.php'); return new libvcalendar(); } - + + /** + * Load iTip functions + */ + public static function get_itip($domain = 'libcalendaring') + { + $self = self::get_instance(); + require_once($self->home . '/lib/libcalendaring_itip.php'); + return new libcalendaring_itip($self, $domain); + } + /** * Shift dates into user's current timezone * @@ -304,6 +314,27 @@ class libcalendaring extends rcube_plugin return $html; } + /** + * Get a list of email addresses of the current user (from login and identities) + */ + public function get_user_emails() + { + $emails = array(); + $plugin = $this->rc->plugins->exec_hook('calendar_user_emails', array('emails' => $emails)); + $emails = array_map('strtolower', $plugin['emails']); + + if ($plugin['abort']) { + return $emails; + } + + $emails[] = $this->rc->user->get_username(); + foreach ($this->rc->user->list_identities() as $identity) { + $emails[] = strtolower($identity['email']); + } + + return array_unique($emails); + } + /********* Alarms handling *********/ diff --git a/plugins/libcalendaring/localization/bg_BG.inc b/plugins/libcalendaring/localization/bg_BG.inc index 2c46ab7a..9ba5d7a6 100644 --- a/plugins/libcalendaring/localization/bg_BG.inc +++ b/plugins/libcalendaring/localization/bg_BG.inc @@ -1,2 +1,49 @@ \ No newline at end of file diff --git a/plugins/libcalendaring/localization/ja_JP.inc b/plugins/libcalendaring/localization/ja_JP.inc index 60f9eaa7..b3d910d6 100644 --- a/plugins/libcalendaring/localization/ja_JP.inc +++ b/plugins/libcalendaring/localization/ja_JP.inc @@ -1,4 +1,7 @@