plugins/calendar plugins/libcalendaring

Thomas Brüderli bruederli at kolabsys.com
Wed Mar 19 15:33:10 CET 2014


 plugins/calendar/calendar.php                      |  280 +++--------
 plugins/calendar/calendar_base.js                  |   70 --
 plugins/calendar/lib/calendar_itip.php             |  186 -------
 plugins/calendar/lib/calendar_ui.php               |   20 
 plugins/calendar/localization/bg_BG.inc            |  132 +++++
 plugins/calendar/localization/cs_CZ.inc            |   68 +-
 plugins/calendar/localization/de_CH.inc            |   71 +-
 plugins/calendar/localization/de_DE.inc            |   74 +-
 plugins/calendar/localization/en_US.inc            |   25 -
 plugins/calendar/localization/es_ES.inc            |  240 +++++++++
 plugins/calendar/localization/et_EE.inc            |  247 +++++++++
 plugins/calendar/localization/fr_FR.inc            |   69 +-
 plugins/calendar/localization/hu_HU.inc            |  233 +++++++++
 plugins/calendar/localization/it_IT.inc            |  222 ++++++++
 plugins/calendar/localization/ja_JP.inc            |   68 +-
 plugins/calendar/localization/nl_NL.inc            |  123 ++++
 plugins/calendar/localization/pl_PL.inc            |  217 ++++++++
 plugins/calendar/localization/pt_BR.inc            |   67 +-
 plugins/calendar/localization/ru_RU.inc            |   65 +-
 plugins/calendar/skins/classic/calendar.css        |    5 
 plugins/calendar/skins/larry/calendar.css          |   22 
 plugins/libcalendaring/lib/libcalendaring_itip.php |  524 +++++++++++++++++++++
 plugins/libcalendaring/libcalendaring.js           |   88 +++
 plugins/libcalendaring/libcalendaring.php          |   33 +
 plugins/libcalendaring/localization/bg_BG.inc      |   47 +
 plugins/libcalendaring/localization/cs_CZ.inc      |   29 +
 plugins/libcalendaring/localization/de_CH.inc      |   32 +
 plugins/libcalendaring/localization/de_DE.inc      |   32 +
 plugins/libcalendaring/localization/en_US.inc      |   38 +
 plugins/libcalendaring/localization/fr_FR.inc      |   30 +
 plugins/libcalendaring/localization/it_IT.inc      |   28 +
 plugins/libcalendaring/localization/ja_JP.inc      |   29 +
 plugins/libcalendaring/localization/nl_NL.inc      |   31 +
 plugins/libcalendaring/localization/pl_PL.inc      |   29 +
 plugins/libcalendaring/localization/pt_BR.inc      |   28 +
 plugins/libcalendaring/localization/ru_RU.inc      |   29 +
 36 files changed, 2884 insertions(+), 647 deletions(-)

New commits:
commit 5d49b4850d923e79765de53d02ce4f4b436efcdc
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Wed Mar 19 15:32:37 2014 +0100

    Moved iTip functionality to libcalendaring for common use + improved inline UI for iTip messages and the options a user can select there

diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php
index 2f80a59..a4bf1ab 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;
-            }
-          }
-
-          $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,
-          ));
+        // 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)
+          )
+        );
 
-          $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 33fe9e4..adcbdb4 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 9011073..e128442 100644
--- a/plugins/calendar/lib/calendar_itip.php
+++ b/plugins/calendar/lib/calendar_itip.php
@@ -1,5 +1,7 @@
 <?php
 
+require_once realpath(__DIR__ . '/../../libcalendaring/lib/libcalendaring_itip.php');
+
 /**
  * iTIP functions for the Calendar plugin
  *
@@ -24,189 +26,17 @@
  * You should have received a copy of the GNU Affero General Public License
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
-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;
-  }
-
-  /**
-   * 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;
+    parent::__construct($plugin, $domain);
   }
 
   /**
-   * 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
    *
    * @param string Invitation 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 6150e65..b6c0e78 100644
--- a/plugins/calendar/lib/calendar_ui.php
+++ b/plugins/calendar/lib/calendar_ui.php
@@ -786,31 +786,13 @@ class calendar_ui
   }
 
   /**
-   * 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();
-  }
-
-  /**
    *
    */
   function event_invitebox($attrib = array())
   {
     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 993fd5f..9fa8594 100644
--- a/plugins/calendar/localization/bg_BG.inc
+++ b/plugins/calendar/localization/bg_BG.inc
@@ -1,7 +1,11 @@
 <?php
+
+$labels = array();
+
+// preferences
 $labels['default_view'] = 'Изглед по подразбиране';
 $labels['time_format'] = 'Формат на часовете';
-$labels['timeslots'] = 'Полета на час';
+$labels['timeslots'] = 'Time slots per hour';
 $labels['first_day'] = 'Първи ден от седмицата';
 $labels['first_hour'] = 'Първи час при показване';
 $labels['workinghours'] = 'Работни часове';
@@ -13,6 +17,8 @@ $labels['coloringmode0'] = 'Според календара';
 $labels['coloringmode1'] = 'Относно категорията';
 $labels['coloringmode2'] = 'Календар за очертание, категория за съдържание';
 $labels['coloringmode3'] = 'Категория за очертание, календар за съдържание';
+
+// calendar
 $labels['calendar'] = 'Календар';
 $labels['calendars'] = 'Календари';
 $labels['category'] = 'Категория';
@@ -40,7 +46,11 @@ $labels['description'] = 'Описание';
 $labels['all-day'] = 'цял ден';
 $labels['export'] = 'Извличане';
 $labels['exporttitle'] = 'Извличане към iCalendar';
+$labels['exportrange'] = 'Събития от';
+$labels['exportattachments'] = 'With attachments';
+$labels['customdate'] = 'Custom date';
 $labels['location'] = 'Местоположение';
+$labels['url'] = 'URL';
 $labels['date'] = 'Дата';
 $labels['start'] = 'Начало';
 $labels['end'] = 'Край';
@@ -62,6 +72,7 @@ $labels['parentcalendar'] = 'Внасяне вътре';
 $labels['searchearlierdates'] = '« Търсене за по- стари събития';
 $labels['searchlaterdates'] = 'Търсене за по- нови събития »';
 $labels['andnmore'] = '$nr повече...';
+$labels['togglerole'] = 'Click to toggle role';
 $labels['createfrommail'] = 'Запазване като събитие';
 $labels['importevents'] = 'Внасяне на събития';
 $labels['importrange'] = 'Събития от';
@@ -69,6 +80,9 @@ $labels['onemonthback'] = '1 месец назад';
 $labels['nmonthsback'] = '$nr месеца назад';
 $labels['showurl'] = 'Показване на URL на календара';
 $labels['showurldescription'] = 'Използвайте следния адрес, за да достъпвате (само за четене) вашия календар от други приложения. Можете да копирате и поставяте това във всеки календарен софтуер, поддържащ форматът iCal';
+$labels['caldavurldescription'] = 'Copy this address to a <a href="http://en.wikipedia.org/wiki/CalDAV" target="_blank">CalDAV</a> 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 fe88253..6623e7e 100644
--- a/plugins/calendar/localization/cs_CZ.inc
+++ b/plugins/calendar/localization/cs_CZ.inc
@@ -1,7 +1,11 @@
 <?php
+
+$labels = array();
+
+// preferences
 $labels['default_view'] = 'Výchozí pohled';
 $labels['time_format'] = 'Formát data';
-$labels['timeslots'] = 'Slotů na hodinu';
+$labels['timeslots'] = 'Time slots per hour';
 $labels['first_day'] = 'První den v týdnu';
 $labels['first_hour'] = 'První hodina k zobrazení';
 $labels['workinghours'] = 'Pracovní hodiny';
@@ -13,6 +17,8 @@ $labels['coloringmode0'] = 'Podle kalendáře';
 $labels['coloringmode1'] = 'Podle kategorie';
 $labels['coloringmode2'] = 'Kalendář pro orámování, kategorie pro obsah';
 $labels['coloringmode3'] = 'Kategorie pro orámování, kalendář pro obsah';
+
+// calendar
 $labels['calendar'] = 'Kalendář';
 $labels['calendars'] = 'Kalendáře';
 $labels['category'] = 'Kategorie';
@@ -40,7 +46,11 @@ $labels['description'] = 'Popis';
 $labels['all-day'] = 'celý den';
 $labels['export'] = 'Exportovat do ICS';
 $labels['exporttitle'] = 'Exportovat souhrn do ICS';
+$labels['exportrange'] = 'Události od';
+$labels['exportattachments'] = 'With attachments';
+$labels['customdate'] = 'Custom date';
 $labels['location'] = 'Místo';
+$labels['url'] = 'URL';
 $labels['date'] = 'Datum';
 $labels['start'] = 'Začátek';
 $labels['end'] = 'Konec';
@@ -70,6 +80,9 @@ $labels['onemonthback'] = '1 měsíc nazpátek';
 $labels['nmonthsback'] = '$nr měsíců nazpátek';
 $labels['showurl'] = 'Ukázat URL kalendáře';
 $labels['showurldescription'] = 'Tuto adresu použijte pro přístup (jen ke čtení) ke kalendáři z jiných aplikací. Můžete ji zkopírovat a vložit do jakéhokoli kalendářového softwaru, který podporuje formát iCal.';
+$labels['caldavurldescription'] = 'Copy this address to a <a href="http://en.wikipedia.org/wiki/CalDAV" target="_blank">CalDAV</a> 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 4860e4b..08310a9 100644
--- a/plugins/calendar/localization/de_CH.inc
+++ b/plugins/calendar/localization/de_CH.inc
@@ -1,7 +1,11 @@
 <?php
+
+$labels = array();
+
+// preferences
 $labels['default_view'] = 'Ansicht';
 $labels['time_format'] = 'Zeitformatierung';
-$labels['timeslots'] = 'Zeitraster pro Stunde';
+$labels['timeslots'] = 'Time slots per hour';
 $labels['first_day'] = 'Erster Wochentag';
 $labels['first_hour'] = 'Erste angezeigte Stunde';
 $labels['workinghours'] = 'Arbeitszeiten';
@@ -13,6 +17,8 @@ $labels['coloringmode0'] = 'Farbe des Kalenders';
 $labels['coloringmode1'] = 'Farbe der Kategorie';
 $labels['coloringmode2'] = 'Kalenderfarbe aussen, Kategoriefarbe innen';
 $labels['coloringmode3'] = 'Kategoriefarbe aussen, Kalenderfarbe innen';
+
+// calendar
 $labels['calendar'] = 'Kalender';
 $labels['calendars'] = 'Kalender';
 $labels['category'] = 'Kategorie';
@@ -41,9 +47,10 @@ $labels['all-day'] = 'ganztägig';
 $labels['export'] = 'Exportieren';
 $labels['exporttitle'] = 'Kalender als iCalendar exportieren';
 $labels['exportrange'] = 'Termine ab';
-$labels['exportattachments'] = 'Mit Anhängen';
-$labels['customdate'] = 'Eigenes Datum';
+$labels['exportattachments'] = 'With attachments';
+$labels['customdate'] = 'Custom date';
 $labels['location'] = 'Ort';
+$labels['url'] = 'URL';
 $labels['date'] = 'Datum';
 $labels['start'] = 'Beginn';
 $labels['end'] = 'Ende';
@@ -73,6 +80,9 @@ $labels['onemonthback'] = '1 Monat zurück';
 $labels['nmonthsback'] = '$nr Monate zurück';
 $labels['showurl'] = 'URL anzeigen';
 $labels['showurldescription'] = 'Über die folgende Adresse können Sie mit einem beliebigen Kalenderprogramm Ihren Kalender abrufen (nur lesend), sofern dieses das iCal-Format unterstützt.';
+$labels['caldavurldescription'] = 'Copy this address to a <a href="http://en.wikipedia.org/wiki/CalDAV" target="_blank">CalDAV</a> 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 582df11..1b61ee8 100644
--- a/plugins/calendar/localization/de_DE.inc
+++ b/plugins/calendar/localization/de_DE.inc
@@ -1,18 +1,24 @@
 <?php
-$labels['default_view'] = 'Ansicht';
+
+$labels = array();
+
+// preferences
+$labels['default_view'] = 'Standardansicht';
 $labels['time_format'] = 'Zeitformatierung';
-$labels['timeslots'] = 'Zeitraster pro Stunde';
+$labels['timeslots'] = 'Time slots per hour';
 $labels['first_day'] = 'Erster Wochentag';
 $labels['first_hour'] = 'Erste angezeigte Stunde';
 $labels['workinghours'] = 'Arbeitszeiten';
-$labels['add_category'] = 'Katgorie hinzufügen';
-$labels['remove_category'] = 'Katgorie entfernen';
+$labels['add_category'] = 'Kategorie hinzufügen';
+$labels['remove_category'] = 'Kategorie entfernen';
 $labels['defaultcalendar'] = 'Neue Termine erstellen in';
 $labels['eventcoloring'] = 'Färbung der Termine';
 $labels['coloringmode0'] = 'Farbe des Kalenders';
 $labels['coloringmode1'] = 'Farbe der Kategorie';
 $labels['coloringmode2'] = 'Kalenderfarbe außen, Kategoriefarbe innen';
 $labels['coloringmode3'] = 'Kategoriefarbe außen, Kalenderfarbe innen';
+
+// calendar
 $labels['calendar'] = 'Kalender';
 $labels['calendars'] = 'Kalender';
 $labels['category'] = 'Kategorie';
@@ -42,8 +48,9 @@ $labels['export'] = 'Exportieren';
 $labels['exporttitle'] = 'Kalender als iCalendar exportieren';
 $labels['exportrange'] = 'Termine ab';
 $labels['exportattachments'] = 'Mit Anhängen';
-$labels['customdate'] = 'Eigenes Datum';
+$labels['customdate'] = 'Benutzerdefiniertes Datum';
 $labels['location'] = 'Ort';
+$labels['url'] = 'URL';
 $labels['date'] = 'Datum';
 $labels['start'] = 'Beginn';
 $labels['end'] = 'Ende';
@@ -73,6 +80,9 @@ $labels['onemonthback'] = '1 Monat zurück';
 $labels['nmonthsback'] = '$nr Monate zurück';
 $labels['showurl'] = 'URL anzeigen';
 $labels['showurldescription'] = 'Über die folgende Adresse können Sie mit einem beliebigen Kalenderprogramm Ihren Kalender abrufen (nur lesend), sofern dieses das iCal-Format unterstützt.';
+$labels['caldavurldescription'] = 'Diese Adresse in einen <a href="http://en.wikipedia.org/wiki/CalDAV" target="_blank">CalDAV</a>-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 340ff2e..990838e 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 2a09b06..47947a0 100644
--- a/plugins/calendar/localization/es_ES.inc
+++ b/plugins/calendar/localization/es_ES.inc
@@ -1,12 +1,252 @@
 <?php
+
+$labels = array();
+
+// preferences
+$labels['default_view'] = 'Default view';
+$labels['time_format'] = 'Time format';
+$labels['timeslots'] = 'Time slots per hour';
+$labels['first_day'] = 'First weekday';
+$labels['first_hour'] = 'First hour to show';
+$labels['workinghours'] = 'Working hours';
+$labels['add_category'] = 'Add category';
+$labels['remove_category'] = 'Remove category';
+$labels['defaultcalendar'] = 'Create new events in';
+$labels['eventcoloring'] = 'Event coloring';
+$labels['coloringmode0'] = 'According to calendar';
+$labels['coloringmode1'] = 'According to category';
+$labels['coloringmode2'] = 'Calendar for outline, category for content';
+$labels['coloringmode3'] = 'Category for outline, calendar for content';
+
+// calendar
+$labels['calendar'] = 'Calendar';
 $labels['calendars'] = 'Calendarios';
+$labels['category'] = 'Category';
+$labels['categories'] = 'Categories';
+$labels['createcalendar'] = 'Create new calendar';
+$labels['editcalendar'] = 'Edit calendar properties';
 $labels['name'] = 'Nombre';
+$labels['color'] = 'Color';
+$labels['day'] = 'Day';
+$labels['week'] = 'Week';
+$labels['month'] = 'Month';
+$labels['agenda'] = 'Agenda';
+$labels['new'] = 'New';
+$labels['new_event'] = 'New event';
+$labels['edit_event'] = 'Edit event';
 $labels['edit'] = 'Editar';
 $labels['save'] = 'Guardar';
+$labels['remove'] = 'Remove';
 $labels['cancel'] = 'Cancelar';
+$labels['select'] = 'Select';
+$labels['print'] = 'Print';
+$labels['printtitle'] = 'Print calendars';
+$labels['title'] = 'Summary';
 $labels['description'] = 'Descripción';
+$labels['all-day'] = 'all-day';
+$labels['export'] = 'Export';
+$labels['exporttitle'] = 'Export to iCalendar';
+$labels['exportrange'] = 'Events from';
+$labels['exportattachments'] = 'With attachments';
+$labels['customdate'] = 'Custom date';
+$labels['location'] = 'Location';
+$labels['url'] = 'URL';
+$labels['date'] = 'Date';
+$labels['start'] = 'Start';
+$labels['end'] = 'End';
+$labels['selectdate'] = 'Choose date';
+$labels['freebusy'] = 'Show me as';
+$labels['free'] = 'Free';
+$labels['busy'] = 'Busy';
+$labels['outofoffice'] = 'Out of Office';
+$labels['tentative'] = 'Tentative';
+$labels['priority'] = 'Priority';
+$labels['sensitivity'] = 'Privacy';
+$labels['public'] = 'public';
+$labels['private'] = 'private';
+$labels['confidential'] = 'confidential';
+$labels['alarms'] = 'Reminder';
+$labels['generated'] = 'generated at';
+$labels['printdescriptions'] = 'Print descriptions';
+$labels['parentcalendar'] = 'Insert inside';
+$labels['searchearlierdates'] = '« Search for earlier events';
+$labels['searchlaterdates'] = 'Search for later events »';
+$labels['andnmore'] = '$nr more...';
+$labels['togglerole'] = 'Click to toggle role';
+$labels['createfrommail'] = 'Save as event';
+$labels['importevents'] = 'Import events';
+$labels['importrange'] = 'Events from';
+$labels['onemonthback'] = '1 month back';
+$labels['nmonthsback'] = '$nr months back';
+$labels['showurl'] = 'Show calendar URL';
+$labels['showurldescription'] = 'Use the following address to access (read only) your calendar from other applications. You can copy and paste this into any calendar software that supports the iCal format.';
+$labels['caldavurldescription'] = 'Copy this address to a <a href="http://en.wikipedia.org/wiki/CalDAV" target="_blank">CalDAV</a> 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 6aab13a..0c9a073 100644
--- a/plugins/calendar/localization/et_EE.inc
+++ b/plugins/calendar/localization/et_EE.inc
@@ -1,5 +1,252 @@
 <?php
+
+$labels = array();
+
+// preferences
+$labels['default_view'] = 'Default view';
+$labels['time_format'] = 'Time format';
+$labels['timeslots'] = 'Time slots per hour';
+$labels['first_day'] = 'First weekday';
+$labels['first_hour'] = 'First hour to show';
+$labels['workinghours'] = 'Working hours';
+$labels['add_category'] = 'Add category';
+$labels['remove_category'] = 'Remove category';
+$labels['defaultcalendar'] = 'Create new events in';
+$labels['eventcoloring'] = 'Event coloring';
+$labels['coloringmode0'] = 'According to calendar';
+$labels['coloringmode1'] = 'According to category';
+$labels['coloringmode2'] = 'Calendar for outline, category for content';
+$labels['coloringmode3'] = 'Category for outline, calendar for content';
+
+// calendar
+$labels['calendar'] = 'Calendar';
+$labels['calendars'] = 'Calendars';
+$labels['category'] = 'Category';
+$labels['categories'] = 'Categories';
+$labels['createcalendar'] = 'Create new calendar';
+$labels['editcalendar'] = 'Edit calendar properties';
 $labels['name'] = 'Nimi';
+$labels['color'] = 'Color';
+$labels['day'] = 'Day';
+$labels['week'] = 'Week';
+$labels['month'] = 'Month';
+$labels['agenda'] = 'Agenda';
+$labels['new'] = 'New';
+$labels['new_event'] = 'New event';
+$labels['edit_event'] = 'Edit event';
+$labels['edit'] = 'Edit';
 $labels['save'] = 'Salvesta';
+$labels['remove'] = 'Remove';
+$labels['cancel'] = 'Cancel';
+$labels['select'] = 'Select';
+$labels['print'] = 'Print';
+$labels['printtitle'] = 'Print calendars';
+$labels['title'] = 'Summary';
+$labels['description'] = 'Description';
+$labels['all-day'] = 'all-day';
+$labels['export'] = 'Export';
+$labels['exporttitle'] = 'Export to iCalendar';
+$labels['exportrange'] = 'Events from';
+$labels['exportattachments'] = 'With attachments';
+$labels['customdate'] = 'Custom date';
+$labels['location'] = 'Location';
+$labels['url'] = 'URL';
+$labels['date'] = 'Date';
+$labels['start'] = 'Start';
+$labels['end'] = 'End';
+$labels['selectdate'] = 'Choose date';
+$labels['freebusy'] = 'Show me as';
+$labels['free'] = 'Free';
+$labels['busy'] = 'Busy';
+$labels['outofoffice'] = 'Out of Office';
+$labels['tentative'] = 'Tentative';
+$labels['priority'] = 'Priority';
+$labels['sensitivity'] = 'Privacy';
+$labels['public'] = 'public';
+$labels['private'] = 'private';
+$labels['confidential'] = 'confidential';
+$labels['alarms'] = 'Reminder';
+$labels['generated'] = 'generated at';
+$labels['printdescriptions'] = 'Print descriptions';
+$labels['parentcalendar'] = 'Insert inside';
+$labels['searchearlierdates'] = '« Search for earlier events';
+$labels['searchlaterdates'] = 'Search for later events »';
+$labels['andnmore'] = '$nr more...';
+$labels['togglerole'] = 'Click to toggle role';
+$labels['createfrommail'] = 'Save as event';
+$labels['importevents'] = 'Import events';
+$labels['importrange'] = 'Events from';
+$labels['onemonthback'] = '1 month back';
+$labels['nmonthsback'] = '$nr months back';
+$labels['showurl'] = 'Show calendar URL';
+$labels['showurldescription'] = 'Use the following address to access (read only) your calendar from other applications. You can copy and paste this into any calendar software that supports the iCal format.';
+$labels['caldavurldescription'] = 'Copy this address to a <a href="http://en.wikipedia.org/wiki/CalDAV" target="_blank">CalDAV</a> 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 37f8dd9..ed367aa 100644
--- a/plugins/calendar/localization/fr_FR.inc
+++ b/plugins/calendar/localization/fr_FR.inc
@@ -1,7 +1,11 @@
 <?php
+
+$labels = array();
+
+// preferences
 $labels['default_view'] = 'Vue par défaut';
 $labels['time_format'] = 'Format de l\'heure';
-$labels['timeslots'] = 'Nombre d\'intervalle par heure';
+$labels['timeslots'] = 'Time slots per hour';
 $labels['first_day'] = 'Premier jour de la semaine';
 $labels['first_hour'] = 'Première heure à afficher';
 $labels['workinghours'] = 'Heures de travail';
@@ -13,6 +17,8 @@ $labels['coloringmode0'] = 'Selon l\'agenda';
 $labels['coloringmode1'] = 'Selon la catégorie';
 $labels['coloringmode2'] = 'Calendrier en contour, catégorie en contenu';
 $labels['coloringmode3'] = 'Catégorie en contour, calendrier en contenu';
+
+// calendar
 $labels['calendar'] = 'Agenda';
 $labels['calendars'] = 'Agendas';
 $labels['category'] = 'Catégorie';
@@ -40,7 +46,11 @@ $labels['description'] = 'Description';
 $labels['all-day'] = 'Toute la journée';
 $labels['export'] = 'Exporter';
 $labels['exporttitle'] = 'Exporter vers iCalendar';
+$labels['exportrange'] = 'Évènements depuis';
+$labels['exportattachments'] = 'With attachments';
+$labels['customdate'] = 'Custom date';
 $labels['location'] = 'Lieu';
+$labels['url'] = 'URL';
 $labels['date'] = 'Date';
 $labels['start'] = 'Début';
 $labels['end'] = 'Fin';
@@ -70,6 +80,9 @@ $labels['onemonthback'] = '1 mois précédent';
 $labels['nmonthsback'] = '$nr mois précédents';
 $labels['showurl'] = 'Afficher l\'URL de l\'agenda';
 $labels['showurldescription'] = 'Utilisez l\'adresse suivante pour accéder(lecture seule) à votre agenda depuis une autre application. Vous pouvez copier/coller celle-ci dans n\'importe quel agenda électronique gérant le format iCal.';
+$labels['caldavurldescription'] = 'Copiez cette adresse vers une application client (comme Evolution ou Mozilla Thunderbird) compatible <a href="http://fr.wikipedia.org/wiki/CalDAV" target="_blank">CalDAV</a> 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 9a8f780..d34f763 100644
--- a/plugins/calendar/localization/hu_HU.inc
+++ b/plugins/calendar/localization/hu_HU.inc
@@ -1,21 +1,252 @@
 <?php
+
+$labels = array();
+
+// preferences
 $labels['default_view'] = 'Alap nézet';
 $labels['time_format'] = 'Idõ formátum';
-$labels['timeslots'] = 'Idõrés óránként';
+$labels['timeslots'] = 'Time slots per hour';
 $labels['first_day'] = 'A hét elsõ napja';
+$labels['first_hour'] = 'First hour to show';
+$labels['workinghours'] = 'Working hours';
+$labels['add_category'] = 'Add category';
+$labels['remove_category'] = 'Remove category';
+$labels['defaultcalendar'] = 'Create new events in';
+$labels['eventcoloring'] = 'Event coloring';
+$labels['coloringmode0'] = 'According to calendar';
+$labels['coloringmode1'] = 'According to category';
+$labels['coloringmode2'] = 'Calendar for outline, category for content';
+$labels['coloringmode3'] = 'Category for outline, calendar for content';
+
+// calendar
 $labels['calendar'] = 'Naptár';
+$labels['calendars'] = 'Calendars';
 $labels['category'] = 'Kategória';
+$labels['categories'] = 'Categories';
+$labels['createcalendar'] = 'Create new calendar';
+$labels['editcalendar'] = 'Edit calendar properties';
+$labels['name'] = 'Name';
+$labels['color'] = 'Color';
 $labels['day'] = 'Nap';
 $labels['week'] = 'Hét';
 $labels['month'] = 'Hónap';
+$labels['agenda'] = 'Agenda';
+$labels['new'] = 'New';
 $labels['new_event'] = 'Új bejegyzés';
 $labels['edit_event'] = 'Bejegyzés szerkesztése';
+$labels['edit'] = 'Edit';
 $labels['save'] = 'Mentés';
 $labels['remove'] = 'Törlés';
 $labels['cancel'] = 'Mégse';
+$labels['select'] = 'Select';
+$labels['print'] = 'Print';
+$labels['printtitle'] = 'Print calendars';
 $labels['title'] = 'Tárgy';
 $labels['description'] = 'Leírás';
 $labels['all-day'] = 'Egész nap';
 $labels['export'] = 'Exportálás ICS formátumba';
+$labels['exporttitle'] = 'Export to iCalendar';
+$labels['exportrange'] = 'Events from';
+$labels['exportattachments'] = 'With attachments';
+$labels['customdate'] = 'Custom date';
+$labels['location'] = 'Location';
+$labels['url'] = 'URL';
+$labels['date'] = 'Date';
+$labels['start'] = 'Start';
+$labels['end'] = 'End';
+$labels['selectdate'] = 'Choose date';
+$labels['freebusy'] = 'Show me as';
+$labels['free'] = 'Free';
+$labels['busy'] = 'Busy';
+$labels['outofoffice'] = 'Out of Office';
+$labels['tentative'] = 'Tentative';
+$labels['priority'] = 'Priority';
+$labels['sensitivity'] = 'Privacy';
+$labels['public'] = 'public';
+$labels['private'] = 'private';
+$labels['confidential'] = 'confidential';
+$labels['alarms'] = 'Reminder';
+$labels['generated'] = 'generated at';
+$labels['printdescriptions'] = 'Print descriptions';
+$labels['parentcalendar'] = 'Insert inside';
+$labels['searchearlierdates'] = '« Search for earlier events';
+$labels['searchlaterdates'] = 'Search for later events »';
+$labels['andnmore'] = '$nr more...';
+$labels['togglerole'] = 'Click to toggle role';
+$labels['createfrommail'] = 'Save as event';
+$labels['importevents'] = 'Import events';
+$labels['importrange'] = 'Events from';
+$labels['onemonthback'] = '1 month back';
+$labels['nmonthsback'] = '$nr months back';
+$labels['showurl'] = 'Show calendar URL';
+$labels['showurldescription'] = 'Use the following address to access (read only) your calendar from other applications. You can copy and paste this into any calendar software that supports the iCal format.';
+$labels['caldavurldescription'] = 'Copy this address to a <a href="http://en.wikipedia.org/wiki/CalDAV" target="_blank">CalDAV</a> 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 303fe21..c38e4cc 100644
--- a/plugins/calendar/localization/it_IT.inc
+++ b/plugins/calendar/localization/it_IT.inc
@@ -1,21 +1,235 @@
 <?php
-$labels['default_view'] = 'Visualizzazine di default';
+
+$labels = array();
+
+// preferences
+$labels['default_view'] = 'Visualizzazione predefinita';
 $labels['time_format'] = 'Formato ora';
 $labels['timeslots'] = 'Timeslots per ora';
 $labels['first_day'] = 'Inizio settimana';
+$labels['first_hour'] = 'Prima ora da mostrare';
+$labels['workinghours'] = 'Orario lavorativo';
+$labels['add_category'] = 'Aggiungi categoria';
+$labels['remove_category'] = 'Rimuovi categoria';
+$labels['defaultcalendar'] = 'Crea nuovi eventi in';
+$labels['eventcoloring'] = 'Colorazione evento';
+$labels['coloringmode0'] = 'Secondo il calendario';
+$labels['coloringmode1'] = 'Secondo la categoria';
+$labels['coloringmode2'] = 'Calendar for outline, category for content';
+$labels['coloringmode3'] = 'Category for outline, calendar for content';
+
+// calendar
 $labels['calendar'] = 'Calendario';
+$labels['calendars'] = 'Calendari';
 $labels['category'] = 'Categoria';
+$labels['categories'] = 'Categorie';
+$labels['createcalendar'] = 'Crea nuovo calendario';
+$labels['editcalendar'] = 'Modifica proprietà calendario';
+$labels['name'] = 'Nome';
+$labels['color'] = 'Colore';
 $labels['day'] = 'Giorno';
 $labels['week'] = 'Settimana';
 $labels['month'] = 'Mese';
+$labels['agenda'] = 'Agenda';
+$labels['new'] = 'Nuovo';
 $labels['new_event'] = 'Nuovo evento';
 $labels['edit_event'] = 'Modifica evento';
+$labels['edit'] = 'Modifica';
 $labels['save'] = 'Salva';
 $labels['remove'] = 'Elimina';
 $labels['cancel'] = 'Annulla';
+$labels['select'] = 'Seleziona';
+$labels['print'] = 'Stampa';
+$labels['printtitle'] = 'Stampa calendari';
 $labels['title'] = 'Oggetto';
 $labels['description'] = 'Descrizione';
-$labels['all-day'] = 'Giorno intero';
-$labels['export'] = 'Esporta in ICS';
-$labels['tabsummary'] = 'Oggetto';
+$labels['all-day'] = 'Tutto il giorno';
+$labels['export'] = 'Esporta';
+$labels['exporttitle'] = 'Esporta come iCalendar';
+$labels['exportrange'] = 'Eventi di';
+$labels['exportattachments'] = 'Con allegati';
+$labels['customdate'] = 'Data personalizzata';
+$labels['location'] = 'Luogo';
+$labels['url'] = 'URL';
+$labels['date'] = 'Data';
+$labels['start'] = 'Inizio';
+$labels['end'] = 'Fine';
+$labels['selectdate'] = 'Scegliere la data';
+$labels['freebusy'] = 'Mostrami come';
+$labels['free'] = 'Libero';
+$labels['busy'] = 'Occupato';
+$labels['outofoffice'] = 'Fuori Ufficio';
+$labels['tentative'] = 'Provvisorio';
+$labels['priority'] = 'Priorità';
+$labels['sensitivity'] = 'Privacy';
+$labels['public'] = 'pubblico';
+$labels['private'] = 'privato';
+$labels['confidential'] = 'confidenziale';
+$labels['alarms'] = 'Promemoria';
+$labels['generated'] = 'generato il';
+$labels['printdescriptions'] = 'Stampa descrizioni';
+$labels['parentcalendar'] = 'Inserisci dentro';
+$labels['searchearlierdates'] = '« Cerca eventi precedenti';
+$labels['searchlaterdates'] = 'Cerca eventi successivi »';
+$labels['andnmore'] = 'Altri $nr...';
+$labels['togglerole'] = 'Fare clic per cambiare il ruolo';
+$labels['createfrommail'] = 'Salva come evento';
+$labels['importevents'] = 'Importa eventi';
+$labels['importrange'] = 'Eventi di';
+$labels['onemonthback'] = '1 mese prima';
+$labels['nmonthsback'] = '$nr mesi prima';
+$labels['showurl'] = 'Mostra URL calendario';
+$labels['showurldescription'] = 'Usare il seguente indirizzo per accedere (in sola lettura) al calendario da altre applicazioni. È possibile copiarlo e incollarlo in qualsiasi software che supporta il formato iCal.';
+$labels['caldavurldescription'] = 'Copiare questo indirizzo in un\'applicazione client <a href="http://en.wikipedia.org/wiki/CalDAV" target="_blank">CalDAV</a> (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 2292853..46351bd 100644
--- a/plugins/calendar/localization/ja_JP.inc
+++ b/plugins/calendar/localization/ja_JP.inc
@@ -1,7 +1,11 @@
 <?php
+
+$labels = array();
+
+// preferences
 $labels['default_view'] = 'デフォルトビュー';
 $labels['time_format'] = '時刻表示形式';
-$labels['timeslots'] = '1時間毎';
+$labels['timeslots'] = 'Time slots per hour';
 $labels['first_day'] = '最初の平日';
 $labels['first_hour'] = '最初の時間を表示';
 $labels['workinghours'] = '労働時間';
@@ -13,6 +17,8 @@ $labels['coloringmode0'] = 'カレンダーの説明';
 $labels['coloringmode1'] = 'カテゴリの説明';
 $labels['coloringmode2'] = 'アウトライン用カレンダー、コンテンツ用カテゴリ';
 $labels['coloringmode3'] = 'アウトライン用カレンダー、コンテンツ用カテゴリ';
+
+// calendar
 $labels['calendar'] = 'カレンダー';
 $labels['calendars'] = 'カレンダー';
 $labels['category'] = 'カテゴリ';
@@ -40,7 +46,11 @@ $labels['description'] = '説明';
 $labels['all-day'] = '全日';
 $labels['export'] = 'エクスポート';
 $labels['exporttitle'] = 'iカレンダーへエクスポート';
+$labels['exportrange'] = 'イベント元';
+$labels['exportattachments'] = 'With attachments';
+$labels['customdate'] = 'Custom date';
 $labels['location'] = '場所';
+$labels['url'] = 'URL';
 $labels['date'] = '期日';
 $labels['start'] = '開始';
 $labels['end'] = '終了';
@@ -70,6 +80,9 @@ $labels['onemonthback'] = '1 ヶ月戻る';
 $labels['nmonthsback'] = '$nr ヶ月戻る';
 $labels['showurl'] = 'カレンダーURL表示';
 $labels['showurldescription'] = '以下のアドレスを使用して他のアプリケーションからカレンダーにアクセス(読込のみ)できます。iCal形式をサポートしたカレンダーソフトウェアへコピーアンドペーストができます。';
+$labels['caldavurldescription'] = 'Copy this address to a <a href="http://en.wikipedia.org/wiki/CalDAV" target="_blank">CalDAV</a> 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 b377408..8161b3c 100644
--- a/plugins/calendar/localization/nl_NL.inc
+++ b/plugins/calendar/localization/nl_NL.inc
@@ -1,17 +1,24 @@
 <?php
+
+$labels = array();
+
+// preferences
 $labels['default_view'] = 'Standaard agenda';
 $labels['time_format'] = 'Tijdsformaat';
-$labels['timeslots'] = 'Timeslots per uur';
+$labels['timeslots'] = 'Time slots per hour';
 $labels['first_day'] = 'Eerste weekdag';
 $labels['first_hour'] = 'Eerste uur om weer te geven';
 $labels['workinghours'] = 'Werkuren';
 $labels['add_category'] = 'Categorie toevoegen';
 $labels['remove_category'] = 'Categorie verwijderen';
-$labels['eventcoloring'] = 'Evenement kleuren';
+$labels['defaultcalendar'] = 'Maak nieuwe afspraken in';
+$labels['eventcoloring'] = 'Kleuren van afspraken';
 $labels['coloringmode0'] = 'Volgens kalender';
 $labels['coloringmode1'] = 'Volgens categorie';
 $labels['coloringmode2'] = 'Kalender voor omtrek, categorie voor inhoud';
 $labels['coloringmode3'] = 'Categorie voor omtrek, kalender voor inhoud';
+
+// calendar
 $labels['calendar'] = 'Agenda';
 $labels['calendars'] = 'Kalenders';
 $labels['category'] = 'Categorie';
@@ -25,7 +32,7 @@ $labels['week'] = 'Week';
 $labels['month'] = 'Maand';
 $labels['agenda'] = 'Agenda';
 $labels['new'] = 'Nieuw';
-$labels['new_event'] = 'Nieuw evenement';
+$labels['new_event'] = 'Nieuwe afspraak';
 $labels['edit_event'] = 'Wijzig evenement';
 $labels['edit'] = 'Wijzig';
 $labels['save'] = 'Bewaar';
@@ -39,7 +46,11 @@ $labels['description'] = 'Beschrijving';
 $labels['all-day'] = 'hele dag';
 $labels['export'] = 'Exporteer naar ICS';
 $labels['exporttitle'] = 'Als iCalender exporteren';
+$labels['exportrange'] = 'Events from';
+$labels['exportattachments'] = 'With attachments';
+$labels['customdate'] = 'Custom date';
 $labels['location'] = 'Locatie';
+$labels['url'] = 'URL';
 $labels['date'] = 'Datum';
 $labels['start'] = 'Begin';
 $labels['end'] = 'Eind';
@@ -57,14 +68,24 @@ $labels['confidential'] = 'vertrouwelijk';
 $labels['alarms'] = 'Herinnering';
 $labels['generated'] = 'gegenereerd op';
 $labels['printdescriptions'] = 'Print beschrijvingen';
+$labels['parentcalendar'] = 'Insert inside';
 $labels['searchearlierdates'] = '« Zoek voor eerdere evenementen';
 $labels['searchlaterdates'] = 'Zoek voor latere evenementen »';
 $labels['andnmore'] = '$nr meer...';
+$labels['togglerole'] = 'Click to toggle role';
 $labels['createfrommail'] = 'Bewaar als evenement';
 $labels['importevents'] = 'Evenementen importeren';
+$labels['importrange'] = 'Events from';
 $labels['onemonthback'] = '1 maand terug';
 $labels['nmonthsback'] = '$nr maanden terug';
 $labels['showurl'] = 'Toon kalender URL';
+$labels['showurldescription'] = 'Use the following address to access (read only) your calendar from other applications. You can copy and paste this into any calendar software that supports the iCal format.';
+$labels['caldavurldescription'] = 'Copy this address to a <a href="http://en.wikipedia.org/wiki/CalDAV" target="_blank">CalDAV</a> 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 ac64763..4d12372 100644
--- a/plugins/calendar/localization/pl_PL.inc
+++ b/plugins/calendar/localization/pl_PL.inc
@@ -1,22 +1,235 @@
 <?php
+
+$labels = array();
+
+// preferences
+$labels['default_view'] = 'Domyślny widok';
+$labels['time_format'] = 'Format czasu';
+$labels['timeslots'] = 'Time slots per hour';
+$labels['first_day'] = 'Pierwszy dzień tygodnia';
+$labels['first_hour'] = 'Pierwsza godzina';
+$labels['workinghours'] = 'Godziny robocze';
+$labels['add_category'] = 'Dodaj kategoriÄ™';
+$labels['remove_category'] = 'Usuń kategorię';
+$labels['defaultcalendar'] = 'Twórz nowe zdarzenia w';
+$labels['eventcoloring'] = 'Kolor zdarzenia';
+$labels['coloringmode0'] = 'Zgodnie z kalendarzem';
+$labels['coloringmode1'] = 'Zgodnie z kategoriÄ…';
+$labels['coloringmode2'] = 'Kalendarz dla obramowania, kategoria dla środka';
+$labels['coloringmode3'] = 'Kategoria dla obramowania, kalendarz dla środka';
+
+// calendar
 $labels['calendar'] = 'Kalendarz';
 $labels['calendars'] = 'Kalendarze';
+$labels['category'] = 'Kategoria';
+$labels['categories'] = 'Kategorie';
+$labels['createcalendar'] = 'Utwórz nowy kalendarz';
+$labels['editcalendar'] = 'Edytuj właściwości kalendarza';
 $labels['name'] = 'Nazwa';
+$labels['color'] = 'Kolor';
+$labels['day'] = 'Dzień';
+$labels['week'] = 'Tydzień';
+$labels['month'] = 'MiesiÄ…c';
+$labels['agenda'] = 'Agenda';
+$labels['new'] = 'Nowy';
+$labels['new_event'] = 'Nowe zdarzenie';
+$labels['edit_event'] = 'Edytuj zdarzenie';
 $labels['edit'] = 'Edytuj';
 $labels['save'] = 'Zapisz';
 $labels['remove'] = 'Usuń';
 $labels['cancel'] = 'Anuluj';
+$labels['select'] = 'Wybierz';
+$labels['print'] = 'Drukuj';
+$labels['printtitle'] = 'Drukuj kalendarze';
 $labels['title'] = 'Podsumowanie';
 $labels['description'] = 'Opis';
-$labels['start'] = 'Start';
+$labels['all-day'] = 'cały dzień';
+$labels['export'] = 'Eksport';
+$labels['exporttitle'] = 'Eksport w formacie iCalendar';
+$labels['exportrange'] = 'Zdarzenia z';
+$labels['exportattachments'] = 'Z załącznikami';
+$labels['customdate'] = 'WÅ‚asna data';
+$labels['location'] = 'Położenie';
+$labels['url'] = 'Adres URL';
+$labels['date'] = 'Data';
+$labels['start'] = 'PoczÄ…tek';
+$labels['end'] = 'Koniec';
+$labels['selectdate'] = 'Wybierz datÄ™';
+$labels['freebusy'] = 'Pokaż mnie jako';
+$labels['free'] = 'Wolny';
+$labels['busy'] = 'Zajęty';
+$labels['outofoffice'] = 'Poza biurem';
+$labels['tentative'] = 'Niepewny';
+$labels['priority'] = 'Priorytet';
+$labels['sensitivity'] = 'Poufność';
+$labels['public'] = 'publiczny';
+$labels['private'] = 'prywatny';
+$labels['confidential'] = 'poufny';
 $labels['alarms'] = 'Przypomnienie';
+$labels['generated'] = 'wygenerowano';
+$labels['printdescriptions'] = 'Drukuj opisy';
+$labels['parentcalendar'] = 'Wstaw wewnÄ…trz';
+$labels['searchearlierdates'] = '« Szukaj wcześniejszych zdarzeń';
+$labels['searchlaterdates'] = 'Szukaj późniejszych zdarzeń »';
+$labels['andnmore'] = '$nr więcej...';
+$labels['togglerole'] = 'Kliknuj aby przestawić rolę';
+$labels['createfrommail'] = 'Zapisz jako zdarzenie';
+$labels['importevents'] = 'Importuj zdarzenia';
+$labels['importrange'] = 'Zdarzenia z';
+$labels['onemonthback'] = '1 miesiÄ…c wstecz';
+$labels['nmonthsback'] = '$nr miesięcy wstecz';
+$labels['showurl'] = 'Pokaż adres URL kalendarza';
+$labels['showurldescription'] = 'Używaj tego adresu aby dostać się do kalendarza z innych programów (w trybie tylko-do-odczytu). Możesz wkleić go do dowolnej aplikacji obsługującej format iCal.';
+$labels['caldavurldescription'] = 'Skopiuj ten adres do aplikacji obsługującej format <a href="http://en.wikipedia.org/wiki/CalDAV" target="_blank">CalDAV</a> (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 df82b9e..94b40cc 100644
--- a/plugins/calendar/localization/pt_BR.inc
+++ b/plugins/calendar/localization/pt_BR.inc
@@ -1,7 +1,11 @@
 <?php
+
+$labels = array();
+
+// preferences
 $labels['default_view'] = 'Visualização padrão';
 $labels['time_format'] = 'Formato da hora';
-$labels['timeslots'] = 'Alocações de tempo por hora';
+$labels['timeslots'] = 'Time slots per hour';
 $labels['first_day'] = 'Primeiro dia da semana';
 $labels['first_hour'] = 'Primeira hora a mostrar';
 $labels['workinghours'] = 'Horário de trabalho';
@@ -13,6 +17,8 @@ $labels['coloringmode0'] = 'De acordo com o calendário';
 $labels['coloringmode1'] = 'De acordo com a categoria';
 $labels['coloringmode2'] = 'Calendário para esboço, categoria para conteúdo';
 $labels['coloringmode3'] = 'Categoria para esboço, calendário para conteúdo';
+
+// calendar
 $labels['calendar'] = 'Calendário';
 $labels['calendars'] = 'Calendários';
 $labels['category'] = 'Categoria';
@@ -40,7 +46,11 @@ $labels['description'] = 'Descrição';
 $labels['all-day'] = 'dia todo';
 $labels['export'] = 'Exportar';
 $labels['exporttitle'] = 'Exportar para iCalendar';
+$labels['exportrange'] = 'Eventos de';
+$labels['exportattachments'] = 'With attachments';
+$labels['customdate'] = 'Custom date';
 $labels['location'] = 'Local';
+$labels['url'] = 'URL';
 $labels['date'] = 'Data';
 $labels['start'] = 'Início';
 $labels['end'] = 'Término';
@@ -70,6 +80,9 @@ $labels['onemonthback'] = '1 mês atrás';
 $labels['nmonthsback'] = '$nr meses atrás';
 $labels['showurl'] = 'Mostrar URL do calendário';
 $labels['showurldescription'] = 'Use o seguinte endereço para acessar (somente leitura) seu calendário em outras aplicações. Você pode copiar e colar este endereço em qualquer software de calendário que suporte o formato iCal.';
+$labels['caldavurldescription'] = 'Copy this address to a <a href="http://en.wikipedia.org/wiki/CalDAV" target="_blank">CalDAV</a> 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 7e109d8..85ee266 100644
--- a/plugins/calendar/localization/ru_RU.inc
+++ b/plugins/calendar/localization/ru_RU.inc
@@ -1,7 +1,11 @@
 <?php
+
+$labels = array();
+
+// preferences
 $labels['default_view'] = 'Вид по умолчанию';
 $labels['time_format'] = 'Формат времени';
-$labels['timeslots'] = 'Промежутков в часу';
+$labels['timeslots'] = 'Промежутков в час';
 $labels['first_day'] = 'Первый день недели';
 $labels['first_hour'] = 'Показывать начиная с';
 $labels['workinghours'] = 'Рабочие часы';
@@ -13,6 +17,8 @@ $labels['coloringmode0'] = 'Согласно цвета календаря';
 $labels['coloringmode1'] = 'Согласно цвета категории';
 $labels['coloringmode2'] = 'Цвет календаря для рамки, цвет категории для фона';
 $labels['coloringmode3'] = 'Цвет категории для рамки, цвет календаря для фона';
+
+// calendar
 $labels['calendar'] = 'Календарь';
 $labels['calendars'] = 'Календари';
 $labels['category'] = 'Категория';
@@ -40,7 +46,11 @@ $labels['description'] = 'Описание';
 $labels['all-day'] = 'весь день';
 $labels['export'] = 'Экспорт';
 $labels['exporttitle'] = 'Экспорт в iCalendar';
+$labels['exportrange'] = 'События начиная с';
+$labels['exportattachments'] = 'С вложениями';
+$labels['customdate'] = 'Специальная дата';
 $labels['location'] = 'Место';
+$labels['url'] = 'URL';
 $labels['date'] = 'Дата';
 $labels['start'] = 'Начало';
 $labels['end'] = 'Конец';
@@ -70,6 +80,9 @@ $labels['onemonthback'] = '1 месяц назад';
 $labels['nmonthsback'] = '$nr месяца(ев) назад';
 $labels['showurl'] = 'Показать URL календаря';
 $labels['showurldescription'] = 'Используйте следующий адрес для просмотра Вашего календаря из других приложений. Вы можете скопировать и вставить это в любое приложение которое поддерживает формат iCal.';
+$labels['caldavurldescription'] = 'Скопируйте этот адрес в клиент, <a href="http://en.wikipedia.org/wiki/CalDAV" target="_blank">поддерживающий CalDAV</a> (например, 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 26d93b4..e9bde94 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 c13905d..c9e7a8c 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 0000000..2fed51f
--- /dev/null
+++ b/plugins/libcalendaring/lib/libcalendaring_itip.php
@@ -0,0 +1,524 @@
+<?php
+
+/**
+ * iTIP functions for the calendar-based Roudncube plugins
+ *
+ * Class providing functionality to manage iTIP invitations
+ *
+ * @author Thomas Bruederli <bruederli at kolabsys.com>
+ *
+ * Copyright (C) 2011-2014, Kolab Systems AG <contact at kolabsys.com>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+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 b69d6bd..4acb942 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 <bruederli at kolabsys.com>
  *
- * Copyright (C) 2012, Kolab Systems AG <contact at kolabsys.com>
+ * Copyright (C) 2012-2014, Kolab Systems AG <contact at kolabsys.com>
  *
  * 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 88f5ed4..d33df67 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 2c46ab7..9ba5d7a 100644
--- a/plugins/libcalendaring/localization/bg_BG.inc
+++ b/plugins/libcalendaring/localization/bg_BG.inc
@@ -1,2 +1,49 @@
 <?php
+
+$labels = array();
+
+$labels['alarmemail'] = 'Send Email';
+$labels['alarmdisplay'] = 'Show message';
+$labels['alarmdisplayoption'] = 'Message';
 $labels['alarmemailoption'] = 'Електронна поща';
+$labels['alarmat'] = 'at $datetime';
+$labels['trigger@'] = 'on date';
+$labels['trigger-M'] = 'minutes before';
+$labels['trigger-H'] = 'hours before';
+$labels['trigger-D'] = 'days before';
+$labels['trigger+M'] = 'minutes after';
+$labels['trigger+H'] = 'hours after';
+$labels['trigger+D'] = 'days after';
+$labels['addalarm'] = 'add alarm';
+
+$labels['alarmtitle'] = 'Upcoming events';
+$labels['dismissall'] = 'Dismiss all';
+$labels['dismiss'] = 'Dismiss';
+$labels['snooze'] = 'Snooze';
+$labels['repeatinmin'] = 'Repeat in $min minutes';
+$labels['repeatinhr'] = 'Repeat in 1 hour';
+$labels['repeatinhrs'] = 'Repeat in $hrs hours';
+$labels['repeattomorrow'] = 'Repeat tomorrow';
+$labels['repeatinweek'] = 'Repeat in a week';
+
+$labels['showmore'] = 'Show more...';
+
+// itip related labels
+$labels['itipinvitation'] = 'Invitation to';
+$labels['itipupdate'] = 'Update of';
+$labels['itipcancellation'] = 'Отказано:';
+$labels['itipreply'] = 'Отговор на';
+$labels['itipaccepted'] = 'Приемане';
+$labels['itiptentative'] = 'Може би';
+$labels['itipdeclined'] = 'Отхвърляне';
+
+$labels['itipsubjectaccepted'] = '"$title" беше прието от $name';
+$labels['itipsubjectdeclined'] = '"$title" беше отхвърлено от $name';
+
+$labels['importtocalendar'] = 'Запазване в моя календар';
+$labels['removefromcalendar'] = 'Премахване от моя календар';
+$labels['updateattendeestatus'] = 'Подновяване на статусът на участника';
+$labels['acceptinvitation'] = 'Приемате ли тази покана?';
+$labels['youhaveaccepted'] = 'Вие сте приели тази покана';
+
+$labels['savingdata'] = 'Запазване на данни...';
\ No newline at end of file
diff --git a/plugins/libcalendaring/localization/cs_CZ.inc b/plugins/libcalendaring/localization/cs_CZ.inc
index aa6a04c..ca7f6ba 100644
--- a/plugins/libcalendaring/localization/cs_CZ.inc
+++ b/plugins/libcalendaring/localization/cs_CZ.inc
@@ -1,4 +1,7 @@
 <?php
+
+$labels = array();
+
 $labels['alarmemail'] = 'Poslat e-mail';
 $labels['alarmdisplay'] = 'Zobrazit zprávu';
 $labels['alarmdisplayoption'] = 'Zpráva';
@@ -12,6 +15,7 @@ $labels['trigger+M'] = 'minut po';
 $labels['trigger+H'] = 'hodin po';
 $labels['trigger+D'] = 'dnů po';
 $labels['addalarm'] = 'přidat upozornění';
+
 $labels['alarmtitle'] = 'Blížící se události';
 $labels['dismissall'] = 'Zrušit vše';
 $labels['dismiss'] = 'Zrušit';
@@ -21,4 +25,29 @@ $labels['repeatinhr'] = 'Zopakovat za 1 hodinu';
 $labels['repeatinhrs'] = 'Zopakovat za $hrs hodin';
 $labels['repeattomorrow'] = 'Zopakovat zítra';
 $labels['repeatinweek'] = 'Zopakovat za týden';
+
 $labels['showmore'] = 'Ukázat víc...';
+
+// itip related labels
+$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"';
+
+$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['notanattendee'] = 'Nejste na seznamu účastníků této události';
+
+$labels['savingdata'] = 'Ukládám data...';
\ No newline at end of file
diff --git a/plugins/libcalendaring/localization/de_CH.inc b/plugins/libcalendaring/localization/de_CH.inc
index 565cf8b..23d6992 100644
--- a/plugins/libcalendaring/localization/de_CH.inc
+++ b/plugins/libcalendaring/localization/de_CH.inc
@@ -1,4 +1,7 @@
 <?php
+
+$labels = array();
+
 $labels['alarmemail'] = 'E-Mail senden';
 $labels['alarmdisplay'] = 'Nachricht anzeigen';
 $labels['alarmdisplayoption'] = 'Nachricht';
@@ -12,6 +15,7 @@ $labels['trigger+M'] = 'Minuten danach';
 $labels['trigger+H'] = 'Stunden danach';
 $labels['trigger+D'] = 'Tage danach';
 $labels['addalarm'] = 'Erinnerung hinzufügen';
+
 $labels['alarmtitle'] = 'Anstehende Termine';
 $labels['dismissall'] = 'Alle ignorieren';
 $labels['dismiss'] = 'Ignorieren';
@@ -21,4 +25,32 @@ $labels['repeatinhr'] = 'Wiederholung in 1 Stunde';
 $labels['repeatinhrs'] = 'Wiederholung in $hrs Stunden';
 $labels['repeattomorrow'] = 'Wiederholung morgen';
 $labels['repeatinweek'] = 'Wiederholung in einer Woche';
+
 $labels['showmore'] = 'Mehr anzeigen...';
+
+// itip related labels
+$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';
+
+$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['notanattendee'] = 'Sie sind nicht in der Liste der Teilnehmer aufgeführt';
+
+$labels['deleteobjectconfirm'] = 'Möchten Sie dieses Objekt wirklich löschen?';
+$labels['declinedeleteconfirm'] = 'Soll das abgelehnte Objekt ebenfalls aus Ihrem Konto gelöscht werden?';
+
+$labels['savingdata'] = 'Speichere...';
diff --git a/plugins/libcalendaring/localization/de_DE.inc b/plugins/libcalendaring/localization/de_DE.inc
index 565cf8b..23d6992 100644
--- a/plugins/libcalendaring/localization/de_DE.inc
+++ b/plugins/libcalendaring/localization/de_DE.inc
@@ -1,4 +1,7 @@
 <?php
+
+$labels = array();
+
 $labels['alarmemail'] = 'E-Mail senden';
 $labels['alarmdisplay'] = 'Nachricht anzeigen';
 $labels['alarmdisplayoption'] = 'Nachricht';
@@ -12,6 +15,7 @@ $labels['trigger+M'] = 'Minuten danach';
 $labels['trigger+H'] = 'Stunden danach';
 $labels['trigger+D'] = 'Tage danach';
 $labels['addalarm'] = 'Erinnerung hinzufügen';
+
 $labels['alarmtitle'] = 'Anstehende Termine';
 $labels['dismissall'] = 'Alle ignorieren';
 $labels['dismiss'] = 'Ignorieren';
@@ -21,4 +25,32 @@ $labels['repeatinhr'] = 'Wiederholung in 1 Stunde';
 $labels['repeatinhrs'] = 'Wiederholung in $hrs Stunden';
 $labels['repeattomorrow'] = 'Wiederholung morgen';
 $labels['repeatinweek'] = 'Wiederholung in einer Woche';
+
 $labels['showmore'] = 'Mehr anzeigen...';
+
+// itip related labels
+$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';
+
+$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['notanattendee'] = 'Sie sind nicht in der Liste der Teilnehmer aufgeführt';
+
+$labels['deleteobjectconfirm'] = 'Möchten Sie dieses Objekt wirklich löschen?';
+$labels['declinedeleteconfirm'] = 'Soll das abgelehnte Objekt ebenfalls aus Ihrem Konto gelöscht werden?';
+
+$labels['savingdata'] = 'Speichere...';
diff --git a/plugins/libcalendaring/localization/en_US.inc b/plugins/libcalendaring/localization/en_US.inc
index 702aac5..ea0ad10 100644
--- a/plugins/libcalendaring/localization/en_US.inc
+++ b/plugins/libcalendaring/localization/en_US.inc
@@ -28,3 +28,41 @@ $labels['repeatinweek'] = 'Repeat in a week';
 
 $labels['showmore'] = 'Show more...';
 
+// itip related labels
+$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['itipobjectnotfound'] = 'The object referred by this message was not found in your account.';
+$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['itipnewattendee'] = 'This is a reply from a new participant';
+$labels['updateattendeestatus'] = 'Update the participant\'s status';
+$labels['acceptinvitation'] = 'Do you accept this invitation?';
+$labels['acceptattendee'] = 'Accept attendee';
+$labels['declineattendee'] = 'Decline attendee';
+$labels['youhaveaccepted'] = 'You have accepted this invitation';
+$labels['youhavetentative'] = 'You have tentatively accepted this invitation';
+$labels['youhavedeclined'] = 'You have declined this invitation';
+$labels['youhavedelegated'] = 'You have delegated this invitation';
+$labels['attendeeaccepted'] = 'Participant has accepted';
+$labels['attendeetentative'] = 'Participant has tentatively accepted';
+$labels['attendeedeclined'] = 'Participant has declined';
+$labels['attendeedelegated'] = 'Participant has delegated';
+$labels['notanattendee'] = 'You\'re not listed as an attendee of this object';
+
+$labels['importtocalendar'] = 'Save to my calendar';
+$labels['removefromcalendar'] = 'Remove from my calendar';
+$labels['updatemycopy'] = 'Update my copy';
+
+$labels['deleteobjectconfirm'] = 'Do you really want to delete this object?';
+$labels['declinedeleteconfirm'] = 'Do you also want to delete this declined object from your account?';
+
+$labels['savingdata'] = 'Saving data...';
+
diff --git a/plugins/libcalendaring/localization/fr_FR.inc b/plugins/libcalendaring/localization/fr_FR.inc
index e140901..10b1dc8 100644
--- a/plugins/libcalendaring/localization/fr_FR.inc
+++ b/plugins/libcalendaring/localization/fr_FR.inc
@@ -1,4 +1,7 @@
 <?php
+
+$labels = array();
+
 $labels['alarmemail'] = 'Envoyer un email';
 $labels['alarmdisplay'] = 'Voir le message';
 $labels['alarmdisplayoption'] = 'Message';
@@ -12,6 +15,7 @@ $labels['trigger+M'] = 'minutes après';
 $labels['trigger+H'] = 'heures après';
 $labels['trigger+D'] = 'jours après';
 $labels['addalarm'] = 'ajouter alarme';
+
 $labels['alarmtitle'] = 'Evénements à venir';
 $labels['dismissall'] = 'Tout supprimer';
 $labels['dismiss'] = 'Abandonner';
@@ -21,4 +25,30 @@ $labels['repeatinhr'] = 'Répéter dans 1 heure';
 $labels['repeatinhrs'] = 'Répéter dans $hrs heures';
 $labels['repeattomorrow'] = 'Répéter demain';
 $labels['repeatinweek'] = 'Répéter dans une semaine';
+
 $labels['showmore'] = 'Afficher plus...';
+
+// itip related labels
+$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';
+
+$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['notanattendee'] = 'Vous n\'êtes pas dans la liste des participants à cet évènement';
+
+$labels['savingdata'] = 'Enregistrer...';
+
diff --git a/plugins/libcalendaring/localization/it_IT.inc b/plugins/libcalendaring/localization/it_IT.inc
new file mode 100644
index 0000000..bd19f85
--- /dev/null
+++ b/plugins/libcalendaring/localization/it_IT.inc
@@ -0,0 +1,28 @@
+<?php
+
+$labels = array();
+
+// itip related labels
+$labels['itipinvitation'] = 'Invito a';
+$labels['itipupdate'] = 'Aggiornamento di';
+$labels['itipcancellation'] = 'Annullato:';
+$labels['itipreply'] = 'Rispondi a';
+$labels['itipaccepted'] = 'Accetta';
+$labels['itiptentative'] = 'Forse';
+$labels['itipdeclined'] = 'Rifiuta';
+
+$labels['itipsubjectaccepted'] = '"$title" è stato accettato da $name';
+$labels['itipsubjecttentative'] = '"$title" è stato accettato con riserva da $name';
+$labels['itipsubjectdeclined'] = '"$title" è stato rifiutato da $name';
+
+$labels['importtocalendar'] = 'Salva nel mio calendario';
+$labels['removefromcalendar'] = 'Rimuovi dal mio calendario';
+$labels['updateattendeestatus'] = 'Aggiorna lo stato dei partecipanti';
+$labels['acceptinvitation'] = 'Accetti questo invito?';
+$labels['youhaveaccepted'] = 'Hai accettato questo invito';
+$labels['youhavetentative'] = 'Hai accettato con riserva questo invito';
+$labels['youhavedeclined'] = 'Hai rifiutato questo invito';
+
+$labels['savingdata'] = 'Salvataggio dati...';
+
+?>
\ No newline at end of file
diff --git a/plugins/libcalendaring/localization/ja_JP.inc b/plugins/libcalendaring/localization/ja_JP.inc
index 60f9eaa..b3d910d 100644
--- a/plugins/libcalendaring/localization/ja_JP.inc
+++ b/plugins/libcalendaring/localization/ja_JP.inc
@@ -1,4 +1,7 @@
 <?php
+
+$labels = array();
+
 $labels['alarmemail'] = 'メール送信';
 $labels['alarmdisplay'] = 'メッセージ表示';
 $labels['alarmdisplayoption'] = 'メッセージ';
@@ -12,6 +15,7 @@ $labels['trigger+M'] = '分後';
 $labels['trigger+H'] = '時間後';
 $labels['trigger+D'] = '日後';
 $labels['addalarm'] = 'アラーム追加';
+
 $labels['alarmtitle'] = '今後のイベント';
 $labels['dismissall'] = '全て削除';
 $labels['dismiss'] = '削除';
@@ -21,4 +25,29 @@ $labels['repeatinhr'] = '1時間で繰返し';
 $labels['repeatinhrs'] = '$hrs で繰返し';
 $labels['repeattomorrow'] = '明日繰返し';
 $labels['repeatinweek'] = '1週間で繰返し';
+
 $labels['showmore'] = 'さらに表示…';
+
+// itip related labels
+$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" を辞退しました';
+
+$labels['importtocalendar'] = 'カレンダーに保存';
+$labels['removefromcalendar'] = 'カレンダーから削除';
+$labels['updateattendeestatus'] = '参加者の状況更新';
+$labels['acceptinvitation'] = 'この招待を承諾しますか?';
+$labels['youhaveaccepted'] = 'この招待を承諾しました';
+$labels['youhavetentative'] = 'この招待を仮承諾しました。';
+$labels['youhavedeclined'] = 'この招待を辞退しました。';
+$labels['notanattendee'] = 'このイベントの出席者として一覧にありません';
+
+$labels['savingdata'] = 'データを保存中…';
diff --git a/plugins/libcalendaring/localization/nl_NL.inc b/plugins/libcalendaring/localization/nl_NL.inc
index 41eb264..e54534b 100644
--- a/plugins/libcalendaring/localization/nl_NL.inc
+++ b/plugins/libcalendaring/localization/nl_NL.inc
@@ -1,4 +1,7 @@
 <?php
+
+$labels = array();
+
 $labels['alarmemail'] = 'Verzend E-mail';
 $labels['alarmdisplay'] = 'Bericht weergeven';
 $labels['alarmdisplayoption'] = 'Bericht';
@@ -12,11 +15,39 @@ $labels['trigger+M'] = 'minuten na';
 $labels['trigger+H'] = 'uren na';
 $labels['trigger+D'] = 'dagen na';
 $labels['addalarm'] = 'alarm toevoegen';
+
 $labels['alarmtitle'] = 'Aankomende evenementen';
+$labels['dismissall'] = 'Dismiss all';
+$labels['dismiss'] = 'Dismiss';
 $labels['snooze'] = 'Snooze';
 $labels['repeatinmin'] = 'Herhaal over $min minuten';
 $labels['repeatinhr'] = 'Herhaal over 1 uur';
 $labels['repeatinhrs'] = 'Herhaal over $hrs uur';
 $labels['repeattomorrow'] = 'Herhaal morgen';
 $labels['repeatinweek'] = 'Herhaal over een week';
+
 $labels['showmore'] = 'Toon meer...';
+
+// itip related labels
+$labels['itipinvitation'] = 'Uitnodiging voor';
+$labels['itipupdate'] = 'Update van';
+$labels['itipcancellation'] = 'Afgelast:';
+$labels['itipreply'] = 'Reply to';
+$labels['itipaccepted'] = 'Accepteer';
+$labels['itiptentative'] = 'Misschien';
+$labels['itipdeclined'] = 'Afwijzen';
+
+$labels['itipsubjectaccepted'] = '"$title" is geaccepteerd door $name';
+$labels['itipsubjecttentative'] = '"$title" has been tentatively accepted by $name';
+$labels['itipsubjectdeclined'] = '"$title" has been declined by $name';
+
+$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['youhavetentative'] = 'You have tentatively accepted this invitation';
+$labels['youhavedeclined'] = 'Je hebt deze uitnodiging afgewezen';
+$labels['notanattendee'] = 'You\'re not listed as an attendee of this event';
+
+$labels['savingdata'] = 'Data wordt opgeslagen...';
diff --git a/plugins/libcalendaring/localization/pl_PL.inc b/plugins/libcalendaring/localization/pl_PL.inc
index 73fe126..c8ccf8b 100644
--- a/plugins/libcalendaring/localization/pl_PL.inc
+++ b/plugins/libcalendaring/localization/pl_PL.inc
@@ -1,4 +1,7 @@
 <?php
+
+$labels = array();
+
 $labels['alarmemail'] = 'Wyślij e-mail';
 $labels['alarmdisplay'] = 'Pokaż wiadomość';
 $labels['alarmdisplayoption'] = 'Wiadomość';
@@ -12,6 +15,7 @@ $labels['trigger+M'] = 'minut po';
 $labels['trigger+H'] = 'godzin(y) po';
 $labels['trigger+D'] = 'dni po';
 $labels['addalarm'] = 'dodaj alarm';
+
 $labels['alarmtitle'] = 'NadchodzÄ…ce zdarzenia';
 $labels['dismissall'] = 'Odrzuć wszystkie';
 $labels['dismiss'] = 'Odrzuć';
@@ -21,4 +25,29 @@ $labels['repeatinhr'] = 'Powtórz po godzinie';
 $labels['repeatinhrs'] = 'Powtórz po $hrs godzinach';
 $labels['repeattomorrow'] = 'Powtórz jutro';
 $labels['repeatinweek'] = 'Powtórz za tydzień';
+
 $labels['showmore'] = 'Pokaż więcej...';
+
+// itip related labels
+$labels['itipinvitation'] = 'Zaproszenie do';
+$labels['itipupdate'] = 'Aktualizacja';
+$labels['itipcancellation'] = 'Anulowano:';
+$labels['itipreply'] = 'Odpowiedź do';
+$labels['itipaccepted'] = 'Akceptuj';
+$labels['itiptentative'] = 'Może';
+$labels['itipdeclined'] = 'Odrzuć';
+
+$labels['itipsubjectaccepted'] = '"$title" zostało zaakceptowane przez $name';
+$labels['itipsubjecttentative'] = '"$title" zostało warunkowo zaakceptowane przez $name';
+$labels['itipsubjectdeclined'] = '"$title" zostało odrzucone przez $name';
+
+$labels['importtocalendar'] = 'Zapisz w moim kalendarzu';
+$labels['removefromcalendar'] = 'Usuń z mojego kalendarza';
+$labels['updateattendeestatus'] = 'Zaktualizuj status uczestnika';
+$labels['acceptinvitation'] = 'Czy akceptujesz to zdarzenie?';
+$labels['youhaveaccepted'] = 'Zaakceptowałeś to zaproszenie';
+$labels['youhavetentative'] = 'Zaakceptowałeś to zdarzenie warunkowo';
+$labels['youhavedeclined'] = 'Odrzuciłeś to zdarzenie';
+$labels['notanattendee'] = 'Nie jesteś na liście uczestników tego zdarzenia';
+
+$labels['savingdata'] = 'ZapisujÄ™ dane...';
diff --git a/plugins/libcalendaring/localization/pt_BR.inc b/plugins/libcalendaring/localization/pt_BR.inc
index 481ebda..7791ad7 100644
--- a/plugins/libcalendaring/localization/pt_BR.inc
+++ b/plugins/libcalendaring/localization/pt_BR.inc
@@ -1,4 +1,7 @@
 <?php
+
+$labels = array();
+
 $labels['alarmemail'] = 'Enviar Email';
 $labels['alarmdisplay'] = 'Mostrar mensagem';
 $labels['alarmdisplayoption'] = 'Mensagem';
@@ -12,6 +15,7 @@ $labels['trigger+M'] = 'minutos depois';
 $labels['trigger+H'] = 'horas depois';
 $labels['trigger+D'] = 'dias depois';
 $labels['addalarm'] = 'adicionar alarme';
+
 $labels['alarmtitle'] = 'Próximos eventos';
 $labels['dismissall'] = 'Dispensar tudo';
 $labels['dismiss'] = 'Dispensar';
@@ -21,4 +25,28 @@ $labels['repeatinhr'] = 'Repetir em 1 hora';
 $labels['repeatinhrs'] = 'Repetir em $hrs horas';
 $labels['repeattomorrow'] = 'Repetir amanhã';
 $labels['repeatinweek'] = 'Repetir em uma semana';
+
 $labels['showmore'] = 'Mostrar mais...';
+
+// itip related labels
+$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';
+
+$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['savingdata'] = 'Salvando dados...';
\ No newline at end of file
diff --git a/plugins/libcalendaring/localization/ru_RU.inc b/plugins/libcalendaring/localization/ru_RU.inc
index a37e761..5b29f06 100644
--- a/plugins/libcalendaring/localization/ru_RU.inc
+++ b/plugins/libcalendaring/localization/ru_RU.inc
@@ -1,4 +1,7 @@
 <?php
+
+$labels = array();
+
 $labels['alarmemail'] = 'Послать e-mail';
 $labels['alarmdisplay'] = 'Показать сообщение';
 $labels['alarmdisplayoption'] = 'Сообщение';
@@ -12,6 +15,7 @@ $labels['trigger+M'] = 'минут после';
 $labels['trigger+H'] = 'часов после';
 $labels['trigger+D'] = 'дней после';
 $labels['addalarm'] = 'добавить уведомление';
+
 $labels['alarmtitle'] = 'Предстоящие события';
 $labels['dismissall'] = 'Отменить все';
 $labels['dismiss'] = 'Отменить';
@@ -21,4 +25,29 @@ $labels['repeatinhr'] = 'Повторить через 1 час';
 $labels['repeatinhrs'] = 'Повторить через $hrs часов';
 $labels['repeattomorrow'] = 'Повторить завтра';
 $labels['repeatinweek'] = 'Повторить через неделю';
+
 $labels['showmore'] = 'Показать больше...';
+
+// itip related labels
+$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';
+
+$labels['importtocalendar'] = 'Сохранить в мой календарь';
+$labels['removefromcalendar'] = 'Удалить из моего календаря';
+$labels['updateattendeestatus'] = 'Обновить статус участника';
+$labels['acceptinvitation'] = 'Вы принимаете это приглашение?';
+$labels['youhaveaccepted'] = 'Вы приняли это приглашение';
+$labels['youhavetentative'] = 'Вы предварительно приняли это приглашение';
+$labels['youhavedeclined'] = 'Вы отклонили это приглашение';
+
+$labels['savingdata'] = 'Сохранение данных...';
+





More information about the commits mailing list